home *** CD-ROM | disk | FTP | other *** search
/ ftp.mactech.com 2010 / ftp.mactech.com.tar / ftp.mactech.com / online / source / c / compilers / C_Interp.sit.hqx / C_Interp / File.c < prev    next >
C/C++ Source or Header  |  1992-05-04  |  3KB  |  142 lines

  1. /*
  2.     Terminal 2.2
  3.     "File.c"
  4. */
  5.  
  6. #include "Compatibility.h"
  7. #include "File.h"
  8. #include "Interp.h"
  9.  
  10. /* ----- Static data --------------------------------------------------- */
  11.  
  12. static jmp_buf env;
  13. int        ScriptRef;            /* Script file reference */
  14. static short ScriptUnget;        /* Script file unget buffer */
  15. static Byte *ScriptBuffer;        /* Script file buffer */
  16. static long ScriptEob;            /* Size of script file buffer */
  17. static long ScriptMark;            /* Next position in script file buffer */
  18. extern INTRINSIC Intrinsics[];    /* Script intrinsic functions */
  19.  
  20.  
  21.  
  22. /* ----- Get text file name and execute script ------------------------- */
  23.  
  24. #define SCRIPTSIZE    512                /* Script file buffer size */
  25. #define SCRIPTMAX    16384    /* Memory size for script */
  26.  
  27. static Boolean Script(void)
  28. {
  29.     register short err;
  30.     register Boolean quit = FALSE;
  31.  
  32.     ScriptBuffer = 0;
  33.     if (!(ScriptBuffer = (Byte *)malloc(SCRIPTSIZE + SCRIPTMAX))) {
  34.         err = Mem_Error();
  35.         goto done;
  36.     }
  37.     ScriptUnget = -1;            /* No unget character yet */
  38.     ScriptMark = ScriptEob = SCRIPTSIZE;    /* Buffer is still empty */
  39.  
  40.     if (setjmp(env) == 0) {
  41.         SI_Load(Intrinsics, ScriptBuffer + SCRIPTSIZE, SCRIPTMAX);
  42.         close(ScriptRef);        /* Script file no longer needed */
  43.         err = SI_Interpret();    /* Call main() in script */
  44.     } else {                    /* Come here after error */
  45.         err = 1;                /* Always restore settings if error */
  46.         Sys_Beep(1);
  47.     }
  48.     /*
  49.         The script main() can return the following values:
  50.             0    : Don't restore saved settings, continue application
  51.             1    : Restore saved settings, continue application
  52.             256    : Don't restore saved settings, quit application
  53.             257    : Restore saved settings, quit application
  54.     */
  55.     if (err == 1 || err == 257) {    /* Restore settings */
  56.     }
  57.     if (err == 256 || err == 257)    /* Quit application */
  58.         quit = TRUE;
  59.     err = noErr;
  60.  
  61. done:
  62.     if (ScriptBuffer)
  63.         free((char *)ScriptBuffer);
  64.     if (ScriptRef)
  65.         close(ScriptRef);
  66.     if (err) {
  67.         Sys_Beep(1);
  68.     }
  69.     return quit;
  70. }
  71.  
  72. static Boolean ScriptFlag = 0;
  73.  
  74. Boolean RunScript(
  75.     Byte *name
  76.     )
  77. {
  78.     register short err;
  79.     register Byte *n;
  80.     register Boolean quit = FALSE;
  81.  
  82.     if (name) {
  83.         ScriptRef = open((char *)name, 0);
  84.     }
  85.     else {
  86.         printf("File name? ");
  87.         gets((char *)name);
  88.         ScriptRef = open((char *)name, 0);
  89.     }
  90.     quit = Script();
  91.  
  92.     return quit;
  93. }
  94.  
  95.  
  96. /* ----- Functions called by interpreter ------------------------------- */
  97.  
  98. void SI_Error(
  99.     register short erno,
  100.     register Byte *s,
  101.     register short line)
  102. {
  103.     register Byte message[256];
  104.  
  105.     /*erno += 2;*/
  106.     if (*s) {
  107.         printf("ERROR #%d: Line %d: %s\n", erno, line, s);
  108.     } else
  109.         printf("ERROR #%d: Line %d\n", erno, line);
  110.  
  111.     longjmp(env, 0);    /* Return to Script(), ignore link chain */
  112. }
  113.  
  114. Byte SI_GetSource(void)
  115. {
  116.     register Byte c;
  117.     if (ScriptUnget >= 0) {            /* The was a previous unget */
  118.         c = ScriptUnget;            /* So use the unget buffer */
  119.         ScriptUnget = -1;            /* Unget buffer is empty now */
  120.         return c;
  121.     }
  122.     if (ScriptMark < ScriptEob) {        /* Can still use buffer */
  123.         c = ScriptBuffer[ScriptMark++];
  124.         return c;
  125.     }
  126.     if (ScriptEob < SCRIPTSIZE)        /* Was last (partial) buffer */
  127.         return -1;                    /* EOF */
  128.     ScriptEob = SCRIPTSIZE;            /* Read next buffer from file */
  129.     ScriptEob = read(ScriptRef, (char *)ScriptBuffer, ScriptEob);
  130.     if (ScriptEob > 0) {            /* Ok, at least one character */
  131.         ScriptMark = 0;
  132.         return SI_GetSource();
  133.     }
  134.     return -1;                        /* Error or end of file */
  135. }
  136.  
  137. void SI_UngetSource(register Byte c)
  138. {
  139.     ScriptUnget = c;                /* That's easy */
  140. }
  141.  
  142.