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 >
Wrap
C/C++ Source or Header
|
1992-05-04
|
3KB
|
142 lines
/*
Terminal 2.2
"File.c"
*/
#include "Compatibility.h"
#include "File.h"
#include "Interp.h"
/* ----- Static data --------------------------------------------------- */
static jmp_buf env;
int ScriptRef; /* Script file reference */
static short ScriptUnget; /* Script file unget buffer */
static Byte *ScriptBuffer; /* Script file buffer */
static long ScriptEob; /* Size of script file buffer */
static long ScriptMark; /* Next position in script file buffer */
extern INTRINSIC Intrinsics[]; /* Script intrinsic functions */
/* ----- Get text file name and execute script ------------------------- */
#define SCRIPTSIZE 512 /* Script file buffer size */
#define SCRIPTMAX 16384 /* Memory size for script */
static Boolean Script(void)
{
register short err;
register Boolean quit = FALSE;
ScriptBuffer = 0;
if (!(ScriptBuffer = (Byte *)malloc(SCRIPTSIZE + SCRIPTMAX))) {
err = Mem_Error();
goto done;
}
ScriptUnget = -1; /* No unget character yet */
ScriptMark = ScriptEob = SCRIPTSIZE; /* Buffer is still empty */
if (setjmp(env) == 0) {
SI_Load(Intrinsics, ScriptBuffer + SCRIPTSIZE, SCRIPTMAX);
close(ScriptRef); /* Script file no longer needed */
err = SI_Interpret(); /* Call main() in script */
} else { /* Come here after error */
err = 1; /* Always restore settings if error */
Sys_Beep(1);
}
/*
The script main() can return the following values:
0 : Don't restore saved settings, continue application
1 : Restore saved settings, continue application
256 : Don't restore saved settings, quit application
257 : Restore saved settings, quit application
*/
if (err == 1 || err == 257) { /* Restore settings */
}
if (err == 256 || err == 257) /* Quit application */
quit = TRUE;
err = noErr;
done:
if (ScriptBuffer)
free((char *)ScriptBuffer);
if (ScriptRef)
close(ScriptRef);
if (err) {
Sys_Beep(1);
}
return quit;
}
static Boolean ScriptFlag = 0;
Boolean RunScript(
Byte *name
)
{
register short err;
register Byte *n;
register Boolean quit = FALSE;
if (name) {
ScriptRef = open((char *)name, 0);
}
else {
printf("File name? ");
gets((char *)name);
ScriptRef = open((char *)name, 0);
}
quit = Script();
return quit;
}
/* ----- Functions called by interpreter ------------------------------- */
void SI_Error(
register short erno,
register Byte *s,
register short line)
{
register Byte message[256];
/*erno += 2;*/
if (*s) {
printf("ERROR #%d: Line %d: %s\n", erno, line, s);
} else
printf("ERROR #%d: Line %d\n", erno, line);
longjmp(env, 0); /* Return to Script(), ignore link chain */
}
Byte SI_GetSource(void)
{
register Byte c;
if (ScriptUnget >= 0) { /* The was a previous unget */
c = ScriptUnget; /* So use the unget buffer */
ScriptUnget = -1; /* Unget buffer is empty now */
return c;
}
if (ScriptMark < ScriptEob) { /* Can still use buffer */
c = ScriptBuffer[ScriptMark++];
return c;
}
if (ScriptEob < SCRIPTSIZE) /* Was last (partial) buffer */
return -1; /* EOF */
ScriptEob = SCRIPTSIZE; /* Read next buffer from file */
ScriptEob = read(ScriptRef, (char *)ScriptBuffer, ScriptEob);
if (ScriptEob > 0) { /* Ok, at least one character */
ScriptMark = 0;
return SI_GetSource();
}
return -1; /* Error or end of file */
}
void SI_UngetSource(register Byte c)
{
ScriptUnget = c; /* That's easy */
}