| version 1.4, 2000/02/02 03:30:48 |
version 1.7, 2001/05/04 01:06:25 |
|
|
| /* $OpenXM: OpenXM/src/kan96xx/Kan/stackmachine.c,v 1.3 2000/01/21 01:08:12 takayama Exp $ */ |
/* $OpenXM: OpenXM/src/kan96xx/Kan/stackmachine.c,v 1.6 2001/01/27 05:48:46 takayama Exp $ */ |
| /* stackmachin.c */ |
/* stackmachin.c */ |
| |
|
| #include <stdio.h> |
#include <stdio.h> |
|
|
| /* #define OPERAND_STACK_SIZE 2000 */ |
/* #define OPERAND_STACK_SIZE 2000 */ |
| #define OPERAND_STACK_SIZE 30000 |
#define OPERAND_STACK_SIZE 30000 |
| #define SYSTEM_DICTIONARY_SIZE 200 |
#define SYSTEM_DICTIONARY_SIZE 200 |
| #define USER_DICTIONARY_SIZE 1223 |
/* #define USER_DICTIONARY_SIZE 1223, 3581 */ |
| |
#define USER_DICTIONARY_SIZE 27449 |
| /* The value of USER_DICTIONARY_SIZE must be prime number, because of hashing |
/* The value of USER_DICTIONARY_SIZE must be prime number, because of hashing |
| method */ |
method */ |
| #define ARGV_WORK_MAX (AGLIMIT+100) |
#define ARGV_WORK_MAX (AGLIMIT+100) |
| Line 91 struct object * newObject() |
|
| Line 92 struct object * newObject() |
|
| } |
} |
| |
|
| struct object newObjectArray(size) |
struct object newObjectArray(size) |
| int size; |
int size; |
| { |
{ |
| struct object rob; |
struct object rob; |
| struct object *op; |
struct object *op; |
|
|
| } |
} |
| |
|
| isNullObject(obj) |
isNullObject(obj) |
| struct object obj; |
struct object obj; |
| { |
{ |
| if (obj.tag == 0) return(1); |
if (obj.tag == 0) return(1); |
| else return(0); |
else return(0); |
| } |
} |
| |
|
| int putSystemDictionary(str,ob) |
int putSystemDictionary(str,ob) |
| char *str; /* key */ |
char *str; /* key */ |
| struct object ob; /* value */ |
struct object ob; /* value */ |
| { |
{ |
| int i; |
int i; |
| int j; |
int j; |
| Line 127 struct object ob; /* value */ |
|
| Line 128 struct object ob; /* value */ |
|
| /*printf("Add %d %s\n",i,str);*/ |
/*printf("Add %d %s\n",i,str);*/ |
| if (strcmp(str,(SystemDictionary[i]).key) > 0) { |
if (strcmp(str,(SystemDictionary[i]).key) > 0) { |
| for (j=Sdp-1; j>=i+1; j--) { |
for (j=Sdp-1; j>=i+1; j--) { |
| (SystemDictionary[j+1]).key = (SystemDictionary[j]).key; |
(SystemDictionary[j+1]).key = (SystemDictionary[j]).key; |
| (SystemDictionary[j+1]).obj = (SystemDictionary[j]).obj; |
(SystemDictionary[j+1]).obj = (SystemDictionary[j]).obj; |
| } |
} |
| (SystemDictionary[i+1]).key = str; |
(SystemDictionary[i+1]).key = str; |
| (SystemDictionary[i+1]).obj = ob; |
(SystemDictionary[i+1]).obj = ob; |
| Line 168 int findSystemDictionary(str) |
|
| Line 169 int findSystemDictionary(str) |
|
| return(0); |
return(0); |
| } else if (first == last) { |
} else if (first == last) { |
| if (strcmp(str,(SystemDictionary[first]).key) == 0) { |
if (strcmp(str,(SystemDictionary[first]).key) == 0) { |
| return((SystemDictionary[first]).obj.lc.ival); |
return((SystemDictionary[first]).obj.lc.ival); |
| }else { |
}else { |
| return(0); |
return(0); |
| } |
} |
| } else if (last - first == 1) { /* This case is necessary */ |
} else if (last - first == 1) { /* This case is necessary */ |
| if (strcmp(str,(SystemDictionary[first]).key) == 0) { |
if (strcmp(str,(SystemDictionary[first]).key) == 0) { |
| return((SystemDictionary[first]).obj.lc.ival); |
return((SystemDictionary[first]).obj.lc.ival); |
| }else if (strcmp(str,(SystemDictionary[last]).key) == 0) { |
}else if (strcmp(str,(SystemDictionary[last]).key) == 0) { |
| return((SystemDictionary[last]).obj.lc.ival); |
return((SystemDictionary[last]).obj.lc.ival); |
| }else return(0); |
}else return(0); |
| } |
} |
| |
|
| Line 193 int findSystemDictionary(str) |
|
| Line 194 int findSystemDictionary(str) |
|
| } |
} |
| |
|
| int putUserDictionary(str,h0,h1,ob,dic) |
int putUserDictionary(str,h0,h1,ob,dic) |
| char *str; /* key */ |
char *str; /* key */ |
| int h0,h1; /* Hash values of the key */ |
int h0,h1; /* Hash values of the key */ |
| struct object ob; /* value */ |
struct object ob; /* value */ |
| struct dictionary *dic; |
struct dictionary *dic; |
| { |
{ |
| int x,r; |
int x,r; |
| extern int Strict2; |
extern int Strict2; |
| Line 241 struct object KputUserDictionary(char *str,struct obje |
|
| Line 242 struct object KputUserDictionary(char *str,struct obje |
|
| } |
} |
| |
|
| struct object findUserDictionary(str,h0,h1,cp) |
struct object findUserDictionary(str,h0,h1,cp) |
| /* returns NoObject, if there is no item. */ |
/* returns NoObject, if there is no item. */ |
| char *str; /* key */ |
char *str; /* key */ |
| int h0,h1; /* The hashing values of the key. */ |
int h0,h1; /* The hashing values of the key. */ |
| struct context *cp; |
struct context *cp; |
| { |
{ |
| int x; |
int x; |
| struct dictionary *dic; |
struct dictionary *dic; |
| Line 270 struct object KfindUserDictionary(char *str) { |
|
| Line 271 struct object KfindUserDictionary(char *str) { |
|
| } |
} |
| |
|
| int putUserDictionary2(str,h0,h1,attr,dic) |
int putUserDictionary2(str,h0,h1,attr,dic) |
| char *str; /* key */ |
char *str; /* key */ |
| int h0,h1; /* Hash values of the key */ |
int h0,h1; /* Hash values of the key */ |
| int attr; /* attribute field */ |
int attr; /* attribute field */ |
| struct dictionary *dic; |
struct dictionary *dic; |
| { |
{ |
| int x; |
int x; |
| int i; |
int i; |
| Line 301 struct dictionary *dic; |
|
| Line 302 struct dictionary *dic; |
|
| |
|
| |
|
| int putPrimitiveFunction(str,number) |
int putPrimitiveFunction(str,number) |
| char *str; |
char *str; |
| int number; |
int number; |
| { |
{ |
| struct object ob; |
struct object ob; |
| ob.tag = Soperator; |
ob.tag = Soperator; |
|
|
| } |
} |
| |
|
| struct tokens lookupTokens(t) |
struct tokens lookupTokens(t) |
| struct tokens t; |
struct tokens t; |
| { |
{ |
| struct object *left; |
struct object *left; |
| struct object *right; |
struct object *right; |
| Line 327 struct tokens t; |
|
| Line 328 struct tokens t; |
|
| } |
} |
| |
|
| struct object lookupLiteralString(s) |
struct object lookupLiteralString(s) |
| char *s; /* s must be a literal string */ |
char *s; /* s must be a literal string */ |
| { |
{ |
| struct object ob; |
struct object ob; |
| ob.tag = Slist; |
ob.tag = Slist; |
| Line 341 char *s; /* s must be a literal string */ |
|
| Line 342 char *s; /* s must be a literal string */ |
|
| |
|
| |
|
| int hash0(str) |
int hash0(str) |
| char *str; |
char *str; |
| { |
{ |
| int h=0; |
int h=0; |
| while (*str != '\0') { |
while (*str != '\0') { |
|
|
| } |
} |
| |
|
| int hash1(str) |
int hash1(str) |
| char *str; |
char *str; |
| { |
{ |
| return(8-(str[0]%8)); |
return(8-(str[0]%8)); |
| } |
} |
| Line 366 void hashInitialize(struct dictionary *dic) |
|
| Line 367 void hashInitialize(struct dictionary *dic) |
|
| } |
} |
| |
|
| static isInteger(str) |
static isInteger(str) |
| char *str; |
char *str; |
| { |
{ |
| int i; |
int i; |
| int n; |
int n; |
|
|
| } |
} |
| |
|
| static strToInteger(str) |
static strToInteger(str) |
| char *str; |
char *str; |
| { |
{ |
| int i; |
int i; |
| int n; |
int n; |
|
|
| } |
} |
| |
|
| static power(s,i) |
static power(s,i) |
| int s; |
int s; |
| int i; |
int i; |
| { |
{ |
| if (i == 0) return 1; |
if (i == 0) return 1; |
| else return( s*power(s,i-1) ); |
else return( s*power(s,i-1) ); |
| } |
} |
| |
|
| int Kpush(ob) |
int Kpush(ob) |
| struct object ob; |
struct object ob; |
| { |
{ |
| OperandStack[Osp++] = ob; |
OperandStack[Osp++] = ob; |
| if (Osp >= OspMax) { |
if (Osp >= OspMax) { |
| Line 437 struct object Kpop() |
|
| Line 438 struct object Kpop() |
|
| } |
} |
| |
|
| struct object peek(k) |
struct object peek(k) |
| int k; |
int k; |
| { |
{ |
| if ((Osp-k-1) < 0) { |
if ((Osp-k-1) < 0) { |
| return( NullObject ); |
return( NullObject ); |
| Line 586 void contextControl(actionOfContextControl ctl) { |
|
| Line 587 void contextControl(actionOfContextControl ctl) { |
|
| |
|
| |
|
| int isLiteral(str) |
int isLiteral(str) |
| char *str; |
char *str; |
| { |
{ |
| if (strlen(str) <2) return(0); |
if (strlen(str) <2) return(0); |
| else { |
else { |
| Line 611 void printOperandStack() { |
|
| Line 612 void printOperandStack() { |
|
| |
|
| |
|
| static initSystemDictionary() |
static initSystemDictionary() |
| { |
{ |
| StandardStack.ostack = StandardStackA; |
StandardStack.ostack = StandardStackA; |
| StandardStack.sp = StandardStackP; |
StandardStack.sp = StandardStackP; |
| StandardStack.size = OPERAND_STACK_SIZE; |
StandardStack.size = OPERAND_STACK_SIZE; |
| Line 626 static initSystemDictionary() |
|
| Line 627 static initSystemDictionary() |
|
| |
|
| KdefinePrimitiveFunctions(); |
KdefinePrimitiveFunctions(); |
| |
|
| } |
} |
| |
|
| struct object showSystemDictionary(int f) { |
struct object showSystemDictionary(int f) { |
| int i; |
int i; |
| Line 677 int showUserDictionary() |
|
| Line 678 int showUserDictionary() |
|
| for (i=0; i<USER_DICTIONARY_SIZE; i++) { |
for (i=0; i<USER_DICTIONARY_SIZE; i++) { |
| if ((dic[i]).key != EMPTY) { |
if ((dic[i]).key != EMPTY) { |
| if (strlen((dic[i]).key) >maxl) |
if (strlen((dic[i]).key) >maxl) |
| maxl = strlen((dic[i]).key); |
maxl = strlen((dic[i]).key); |
| } |
} |
| } |
} |
| maxl += 3; |
maxl += 3; |
| Line 688 int showUserDictionary() |
|
| Line 689 int showUserDictionary() |
|
| if ((dic[i]).key != EMPTY) { |
if ((dic[i]).key != EMPTY) { |
| fprintf(Fstack,format,(dic[i]).key); |
fprintf(Fstack,format,(dic[i]).key); |
| /*{ char *sss; int ii,h0,h1; |
/*{ char *sss; int ii,h0,h1; |
| sss = dic[i].key; |
sss = dic[i].key; |
| h0 = dic[i].h0; |
h0 = dic[i].h0; |
| h1 = dic[i].h1; |
h1 = dic[i].h1; |
| for (ii=0; ii<strlen(sss); ii++) fprintf(Fstack,"%x ",sss[ii]); |
for (ii=0; ii<strlen(sss); ii++) fprintf(Fstack,"%x ",sss[ii]); |
| fprintf(Fstack,": h0=%d, h1=%d, %d\n",h0,h1,i); |
fprintf(Fstack,": h0=%d, h1=%d, %d\n",h0,h1,i); |
| }*/ |
}*/ |
| if (j % nl == nl-1) fprintf(Fstack,"\n"); |
if (j % nl == nl-1) fprintf(Fstack,"\n"); |
| j++; |
j++; |
| } |
} |
| Line 703 int showUserDictionary() |
|
| Line 704 int showUserDictionary() |
|
| |
|
| |
|
| static struct object executableStringToExecutableArray(s) |
static struct object executableStringToExecutableArray(s) |
| char *s; |
char *s; |
| { |
{ |
| struct tokens *tokenArray; |
struct tokens *tokenArray; |
| struct object ob; |
struct object ob; |
|
|
| if ( ((ob.lc.tokenArray)[i]).kind == EXECUTABLE_STRING) { |
if ( ((ob.lc.tokenArray)[i]).kind == EXECUTABLE_STRING) { |
| ((ob.lc.tokenArray)[i]).kind = EXECUTABLE_ARRAY; |
((ob.lc.tokenArray)[i]).kind = EXECUTABLE_ARRAY; |
| ((ob.lc.tokenArray)[i]).object = |
((ob.lc.tokenArray)[i]).object = |
| executableStringToExecutableArray(((ob.lc.tokenArray)[i]).token); |
executableStringToExecutableArray(((ob.lc.tokenArray)[i]).token); |
| } |
} |
| } |
} |
| return(ob); |
return(ob); |
| Line 766 void scanner() { |
|
| Line 767 void scanner() { |
|
| if (StartAFile) { |
if (StartAFile) { |
| tmp2 = StartFile; |
tmp2 = StartFile; |
| StartFile = (char *)sGC_malloc(sizeof(char)*(strlen(StartFile)+ |
StartFile = (char *)sGC_malloc(sizeof(char)*(strlen(StartFile)+ |
| 40)); |
40)); |
| sprintf(StartFile,"$%s$ run\n",tmp2); |
sprintf(StartFile,"$%s$ run\n",tmp2); |
| token.kind = EXECUTABLE_STRING; |
token.kind = EXECUTABLE_STRING; |
| token.token = StartFile; |
token.token = StartFile; |
| executeToken(token); /* execute startup commands */ |
executeToken(token); /* execute startup commands */ |
| token.kind = ID; |
token.kind = ID; |
| token.token = "exec"; |
token.token = "exec"; |
| token = lookupTokens(token); /* set hashing values */ |
token = lookupTokens(token); /* set hashing values */ |
| tmp = findSystemDictionary(token.token); |
tmp = findSystemDictionary(token.token); |
| ob.tag = Soperator; |
ob.tag = Soperator; |
| ob.lc.ival = tmp; |
ob.lc.ival = tmp; |
| executePrimitive(ob); /* exec */ |
executePrimitive(ob); /* exec */ |
| } |
} |
| |
|
| if (StartAString) { |
if (StartAString) { |
| token.kind = EXECUTABLE_STRING; |
token.kind = EXECUTABLE_STRING; |
| token.token = StartString; |
token.token = StartString; |
| executeToken(token); /* execute startup commands */ |
executeToken(token); /* execute startup commands */ |
| token.kind = ID; |
token.kind = ID; |
| token.token = "exec"; |
token.token = "exec"; |
| token = lookupTokens(token); /* set hashing values */ |
token = lookupTokens(token); /* set hashing values */ |
| tmp = findSystemDictionary(token.token); |
tmp = findSystemDictionary(token.token); |
| ob.tag = Soperator; |
ob.tag = Soperator; |
| ob.lc.ival = tmp; |
ob.lc.ival = tmp; |
| executePrimitive(ob); /* exec */ |
executePrimitive(ob); /* exec */ |
| } |
} |
| |
|
| |
|
| for (;;) { |
for (;;) { |
| if (jval=setjmp(EnvOfStackMachine)) { |
if (jval=setjmp(EnvOfStackMachine)) { |
| /* *** The following does not work properly. **** |
/* *** The following does not work properly. **** |
| if (jval == 2) { |
if (jval == 2) { |
| if (ErrorMessageMode == 1 || ErrorMessageMode == 2) { |
if (ErrorMessageMode == 1 || ErrorMessageMode == 2) { |
| pushErrorStack(KnewErrorPacket(SerialCurrent,-1,"User interrupt by ctrl-C.")); |
pushErrorStack(KnewErrorPacket(SerialCurrent,-1,"User interrupt by ctrl-C.")); |
| } |
} |
| } |
} |
| **** */ |
**** */ |
| if (DebugStack >= 1) { |
if (DebugStack >= 1) { |
| fprintf(Fstack,"\nscanner> "); |
fprintf(Fstack,"\nscanner> "); |
| } |
} |
| KSexecuteString(" ctrlC-hook "); /* Execute User Defined functions. */ |
KSexecuteString(" ctrlC-hook "); /* Execute User Defined functions. */ |
| continue ; |
continue ; |
| } else { } |
} else { } |
| if (DebugStack >= 1) { printOperandStack(); } |
if (DebugStack >= 1) { printOperandStack(); } |
| token = getokenSM(GET); |
token = getokenSM(GET); |
| Line 818 void scanner() { |
|
| Line 819 void scanner() { |
|
| |
|
| |
|
| void ctrlC(sig) |
void ctrlC(sig) |
| int sig; |
int sig; |
| { |
{ |
| extern void ctrlC(); |
extern void ctrlC(); |
| extern int ErrorMessageMode; |
extern int ErrorMessageMode; |
|
|
| } |
} |
| |
|
| int executeToken(token) |
int executeToken(token) |
| struct tokens token; |
struct tokens token; |
| { |
{ |
| struct object ob; |
struct object ob; |
| int primitive; |
int primitive; |
| Line 884 struct tokens token; |
|
| Line 885 struct tokens token; |
|
| if (GotoP) { /* for goto */ |
if (GotoP) { /* for goto */ |
| if (token.kind == ID && isLiteral(token.token)) { |
if (token.kind == ID && isLiteral(token.token)) { |
| if (strcmp(&((token.token)[1]),GotoLabel) == 0) { |
if (strcmp(&((token.token)[1]),GotoLabel) == 0) { |
| GotoP = 0; |
GotoP = 0; |
| return(0); /* normal exit */ |
return(0); /* normal exit */ |
| } |
} |
| } |
} |
| return(0); /* normal exit */ |
return(0); /* normal exit */ |
| Line 907 struct tokens token; |
|
| Line 908 struct tokens token; |
|
| strcpy(ob.lc.str, &((token.token)[1])); |
strcpy(ob.lc.str, &((token.token)[1])); |
| |
|
| if (token.object.tag != Slist) { |
if (token.object.tag != Slist) { |
| fprintf(Fstack,"\n%%Warning: The hashing values for the <<%s>> are not set.\n",token.token); |
fprintf(Fstack,"\n%%Warning: The hashing values for the <<%s>> are not set.\n",token.token); |
| token.object = lookupLiteralString(token.token); |
token.object = lookupLiteralString(token.token); |
| } |
} |
| ob.rc.op = token.object.lc.op; |
ob.rc.op = token.object.lc.op; |
| Kpush(ob); |
Kpush(ob); |
| Line 919 struct tokens token; |
|
| Line 920 struct tokens token; |
|
| Kpush(ob); |
Kpush(ob); |
| } else { |
} else { |
| if (token.object.tag != Slist) { |
if (token.object.tag != Slist) { |
| fprintf(Fstack,"\n%%Warning: The hashing values for the <<%s>> are not set.\n",token.token); |
fprintf(Fstack,"\n%%Warning: The hashing values for the <<%s>> are not set.\n",token.token); |
| token = lookupTokens(token); |
token = lookupTokens(token); |
| } |
} |
| h0 = ((token.object.lc.op)->lc).ival; |
h0 = ((token.object.lc.op)->lc).ival; |
| h1 = ((token.object.lc.op)->rc).ival; |
h1 = ((token.object.lc.op)->rc).ival; |
| ob=findUserDictionary(token.token,h0,h1,CurrentContextp); |
ob=findUserDictionary(token.token,h0,h1,CurrentContextp); |
| primitive = ((token.object.rc.op)->lc).ival; |
primitive = ((token.object.rc.op)->lc).ival; |
| if (ob.tag >= 0) { |
if (ob.tag >= 0) { |
| /* there is a definition in the user dictionary */ |
/* there is a definition in the user dictionary */ |
| if (ob.tag == SexecutableArray) { |
if (ob.tag == SexecutableArray) { |
| tokenArray = ob.lc.tokenArray; |
tokenArray = ob.lc.tokenArray; |
| size = ob.rc.ival; |
size = ob.rc.ival; |
| for (i=0; i<size; i++) { |
for (i=0; i<size; i++) { |
| status = executeToken(tokenArray[i]); |
status = executeToken(tokenArray[i]); |
| if (status != 0) return(status); |
if (status != 0) return(status); |
| } |
} |
| }else { |
}else { |
| Kpush(ob); |
Kpush(ob); |
| } |
} |
| } else if (primitive) { |
} else if (primitive) { |
| /* system operator */ |
/* system operator */ |
| ob.tag = Soperator; |
ob.tag = Soperator; |
| ob.lc.ival = primitive; |
ob.lc.ival = primitive; |
| return(executePrimitive(ob)); |
return(executePrimitive(ob)); |
| } else { |
} else { |
| if (WarningMessageMode == 1 || WarningMessageMode == 2) { |
if (WarningMessageMode == 1 || WarningMessageMode == 2) { |
| char tmpc[1024]; |
char tmpc[1024]; |
| if (strlen(token.token) < 900) { |
if (strlen(token.token) < 900) { |
| sprintf(tmpc,"\n%%Warning: The identifier <<%s>> is not in the system dictionary\n%% nor in the user dictionaries. Push NullObject.\n",token.token); |
sprintf(tmpc,"\n%%Warning: The identifier <<%s>> is not in the system dictionary\n%% nor in the user dictionaries. Push NullObject.\n",token.token); |
| }else {strcpy(tmpc,"Warning: identifier is not in the dictionaries.");} |
}else {strcpy(tmpc,"Warning: identifier is not in the dictionaries.");} |
| pushErrorStack(KnewErrorPacket(SerialCurrent,-1,tmpc)); |
pushErrorStack(KnewErrorPacket(SerialCurrent,-1,tmpc)); |
| } |
} |
| if (WarningMessageMode != 1) { |
if (WarningMessageMode != 1) { |
| fprintf(Fstack,"\n%%Warning: The identifier <<%s>> is not in the system dictionary\n%% nor in the user dictionaries. Push NullObject.\n",token.token); |
fprintf(Fstack,"\n%%Warning: The identifier <<%s>> is not in the system dictionary\n%% nor in the user dictionaries. Push NullObject.\n",token.token); |
| /*fprintf(Fstack,"(%d,%d)\n",h0,h1);*/ |
/*fprintf(Fstack,"(%d,%d)\n",h0,h1);*/ |
| } |
} |
| if (Strict) { |
if (Strict) { |
| errorStackmachine("Warning: identifier is not in the dictionaries"); |
errorStackmachine("Warning: identifier is not in the dictionaries"); |
| } |
} |
| Kpush(NullObject); |
Kpush(NullObject); |
| } |
} |
| } |
} |
| } else if (token.kind == EXECUTABLE_STRING) { |
} else if (token.kind == EXECUTABLE_STRING) { |
| Line 984 struct tokens token; |
|
| Line 985 struct tokens token; |
|
| |
|
| |
|
| errorStackmachine(str) |
errorStackmachine(str) |
| char *str; |
char *str; |
| { |
{ |
| int i,j,k; |
int i,j,k; |
| static char *u="Usage:"; |
static char *u="Usage:"; |
|
|
| if (i==6) { |
if (i==6) { |
| fprintf(stderr,"ERROR(sm): \n"); |
fprintf(stderr,"ERROR(sm): \n"); |
| while (str[i] != '\0' && str[i] != ' ') { |
while (str[i] != '\0' && str[i] != ' ') { |
| i++; |
i++; |
| } |
} |
| if (str[i] == ' ') { |
if (str[i] == ' ') { |
| fprintf(stderr," %s\n",&(str[i+1])); |
fprintf(stderr," %s\n",&(str[i+1])); |
| k = 0; |
k = 0; |
| if (i-6 > 1022) message = (char *)sGC_malloc(sizeof(char)*i); |
if (i-6 > 1022) message = (char *)sGC_malloc(sizeof(char)*i); |
| for (j=6; j<i ; j++) { |
for (j=6; j<i ; j++) { |
| message[k] = str[j]; |
message[k] = str[j]; |
| message[k+1] = '\0'; |
message[k+1] = '\0'; |
| k++; |
k++; |
| } |
} |
| Kusage2(stderr,message); |
Kusage2(stderr,message); |
| }else{ |
}else{ |
| Kusage2(stderr,&(str[6])); |
Kusage2(stderr,&(str[6])); |
| } |
} |
| }else { |
}else { |
| fprintf(stderr,"ERROR(sm): "); |
fprintf(stderr,"ERROR(sm): "); |
|
|
| } |
} |
| |
|
| warningStackmachine(str) |
warningStackmachine(str) |
| char *str; |
char *str; |
| { |
{ |
| extern int WarningMessageMode; |
extern int WarningMessageMode; |
| extern int Strict; |
extern int Strict; |
|
|
| you have to reset the jump buffer by setjmp(EnvOfStackMachine). |
you have to reset the jump buffer by setjmp(EnvOfStackMachine). |
| cf. kxx/memo1.txt, kxx/stdserver00.c 1998, 2/6 */ |
cf. kxx/memo1.txt, kxx/stdserver00.c 1998, 2/6 */ |
| KSexecuteString(s) |
KSexecuteString(s) |
| char *s; |
char *s; |
| { |
{ |
| struct tokens token; |
struct tokens token; |
| struct object ob; |
struct object ob; |
|
|
| if (jval = setjmp(EnvOfStackMachine)) { |
if (jval = setjmp(EnvOfStackMachine)) { |
| *EnvOfStackMachine = *saved_EnvOfStackMachine; |
*EnvOfStackMachine = *saved_EnvOfStackMachine; |
| if (jval == 2) { |
if (jval == 2) { |
| if (ErrorMessageMode == 1 || ErrorMessageMode == 2) { |
if (ErrorMessageMode == 1 || ErrorMessageMode == 2) { |
| pushErrorStack(KnewErrorPacket(SerialCurrent,-1,"User interrupt by ctrl-C.")); |
pushErrorStack(KnewErrorPacket(SerialCurrent,-1,"User interrupt by ctrl-C.")); |
| } |
} |
| } |
} |
| recursive--; |
recursive--; |
| if (localCatchCtrlC) { signal(SIGINT, sigfunc); } |
if (localCatchCtrlC) { signal(SIGINT, sigfunc); } |
|
|
| }else{ |
}else{ |
| if (recursive == 0) { |
if (recursive == 0) { |
| if (jval=setjmp(EnvOfStackMachine)) { |
if (jval=setjmp(EnvOfStackMachine)) { |
| if (jval == 2) { |
if (jval == 2) { |
| if (ErrorMessageMode == 1 || ErrorMessageMode == 2) { |
if (ErrorMessageMode == 1 || ErrorMessageMode == 2) { |
| pushErrorStack(KnewErrorPacket(SerialCurrent,-1,"User interrupt by ctrl-C.")); |
pushErrorStack(KnewErrorPacket(SerialCurrent,-1,"User interrupt by ctrl-C.")); |
| } |
} |
| } |
} |
| recursive = 0; |
recursive = 0; |
| if (localCatchCtrlC) { signal(SIGINT, sigfunc); } |
if (localCatchCtrlC) { signal(SIGINT, sigfunc); } |
| return(-1); |
return(-1); |
| }else { } |
}else { } |
| } |
} |
| } |
} |
| Line 1133 KSdefineMacros() { |
|
| Line 1134 KSdefineMacros() { |
|
| if (StandardMacros && (strlen(SMacros))) { |
if (StandardMacros && (strlen(SMacros))) { |
| token.kind = EXECUTABLE_STRING; |
token.kind = EXECUTABLE_STRING; |
| token.token = SMacros; |
token.token = SMacros; |
| executeToken(token); /* execute startup commands */ |
executeToken(token); /* execute startup commands */ |
| token.kind = ID; |
token.kind = ID; |
| token.token = "exec"; |
token.token = "exec"; |
| token = lookupTokens(token); /* no use */ |
token = lookupTokens(token); /* no use */ |
| tmp = findSystemDictionary(token.token); |
tmp = findSystemDictionary(token.token); |
| ob.tag = Soperator; |
ob.tag = Soperator; |
| ob.lc.ival = tmp; |
ob.lc.ival = tmp; |
| executePrimitive(ob); /* exec */ |
executePrimitive(ob); /* exec */ |
| } |
} |
| return(0); |
return(0); |
| |
|
| Line 1158 void KSstart() { |
|
| Line 1159 void KSstart() { |
|
| /* The following line may cause a core dump, if you do not setjmp properly |
/* The following line may cause a core dump, if you do not setjmp properly |
| after calling KSstart().*/ |
after calling KSstart().*/ |
| /* |
/* |
| if (setjmp(EnvOfStackMachine)) { |
if (setjmp(EnvOfStackMachine)) { |
| fprintf(stderr,"KSstart(): An error or interrupt in reading macros, files and command strings.\n"); |
fprintf(stderr,"KSstart(): An error or interrupt in reading macros, files and command strings.\n"); |
| exit(10); |
exit(10); |
| } else { } */ |
} else { } */ |
| |
|
| /* setup quiet mode or not */ |
/* setup quiet mode or not */ |
| token.kind = EXECUTABLE_STRING; |
token.kind = EXECUTABLE_STRING; |
| Line 1192 struct object KSpop() { |
|
| Line 1193 struct object KSpop() { |
|
| } |
} |
| |
|
| void KSpush(ob) |
void KSpush(ob) |
| struct object ob; |
struct object ob; |
| { |
{ |
| Kpush(ob); |
Kpush(ob); |
| } |
} |