=================================================================== RCS file: /home/cvs/OpenXM/src/kan96xx/Kan/stackmachine.c,v retrieving revision 1.16 retrieving revision 1.32 diff -u -p -r1.16 -r1.32 --- OpenXM/src/kan96xx/Kan/stackmachine.c 2004/09/05 00:51:17 1.16 +++ OpenXM/src/kan96xx/Kan/stackmachine.c 2005/07/03 11:08:54 1.32 @@ -1,7 +1,9 @@ -/* $OpenXM: OpenXM/src/kan96xx/Kan/stackmachine.c,v 1.15 2004/09/04 11:25:58 takayama Exp $ */ +/* $OpenXM: OpenXM/src/kan96xx/Kan/stackmachine.c,v 1.31 2005/06/16 05:07:23 takayama Exp $ */ /* stackmachin.c */ #include +#include +#include #include "datatype.h" #include "stackm.h" #include "extern.h" @@ -52,7 +54,7 @@ struct context *CurrentContextp = &StandardContext; struct context *PrimitiveContextp = &StandardContext; -static struct object ObjTmp; /* for poor compiler */ +static struct object ObjTmp = OINIT; /* for poor compiler */ int Calling_ctrlC_hook = 0; @@ -74,6 +76,7 @@ static strToInteger(char *); static power(int s,int i); static void pstack(void); static struct object executableStringToExecutableArray(char *str); +static int isThereExecutableArrayOnStack(int n); extern int SerialCurrent; extern int QuoteMode; @@ -83,6 +86,9 @@ int UserCtrlC = 0; int OXlock = 0; int OXlockSaved = 0; +char *UD_str; +int UD_attr; + struct object * newObject() { struct object *r; @@ -91,13 +97,14 @@ struct object * newObject() r->tag = 0; (r->lc).ival = 0; (r->rc).ival = 0; + r->attr = NULL; return(r); } struct object newObjectArray(size) int size; { - struct object rob; + struct object rob = OINIT; struct object *op; if (size < 0) return(NullObject); if (size > 0) { @@ -218,7 +225,7 @@ int putUserDictionary(str,h0,h1,ob,dic) } r = x; if (Strict2) { - switch((dic[x]).attr) { + switch(((dic[x]).attr) & (PROTECT | ABSOLUTE_PROTECT)) { case PROTECT: r = -PROTECT; /* Protected, but we rewrite it. */ break; @@ -226,7 +233,7 @@ int putUserDictionary(str,h0,h1,ob,dic) r = -ABSOLUTE_PROTECT; /* Protected and we do not rewrite it. */ return(r); default: - (dic[x]).attr = 0; + /* (dic[x]).attr = 0; */ /* It is not necesarry, I think. */ break; } } @@ -249,14 +256,19 @@ struct object findUserDictionary(str,h0,h1,cp) char *str; /* key */ int h0,h1; /* The hashing values of the key. */ struct context *cp; + /* Set char *UD_str, int UD_attr (attributes) */ { int x; struct dictionary *dic; + extern char *UD_str; + extern int UD_attr; + UD_str = NULL; UD_attr = -1; dic = cp->userDictionary; x = h0; while (1) { if ((dic[x]).key == EMPTY) { break; } if (strcmp((dic[x]).key,str) == 0) { + UD_str = (dic[x]).key; UD_attr = (dic[x]).attr; return( (dic[x]).obj ); } x = (x+h1) % USER_DICTIONARY_SIZE; @@ -287,6 +299,12 @@ int putUserDictionary2(str,h0,h1,attr,dic) } return(0); } + if (OR_ATTR_FOR_ALL_WORDS & attr) { + for (i=0; i=0; i--) { @@ -637,7 +681,7 @@ struct object showSystemDictionary(int f) { int maxl; char format[1000]; int nl; - struct object rob; + struct object rob = OINIT; rob = NullObject; if (f != 0) { rob = newObjectArray(Sdp); @@ -710,7 +754,7 @@ static struct object executableStringToExecutableArray char *s; { struct tokens *tokenArray; - struct object ob; + struct object ob = OINIT; int i; int size; tokenArray = decomposeToTokens(s,&size); @@ -729,14 +773,17 @@ static struct object executableStringToExecutableArray /**************** stack machine **************************/ void scanner() { struct tokens token; - struct object ob; + struct object ob = OINIT; extern int Quiet; extern void ctrlC(); - int tmp; + int tmp, status; char *tmp2; extern int ErrorMessageMode; int jval; extern int InSendmsg2; + int infixOn = 0; + struct tokens infixToken; + extern int RestrictedMode, RestrictedMode_saved; getokenSM(INIT); initSystemDictionary(); @@ -754,14 +801,14 @@ void scanner() { } /* setup quiet mode or not */ - token.kind = EXECUTABLE_STRING; + token.kind = EXECUTABLE_STRING; token.tflag = 0; if (Quiet) { token.token = " /@@@.quiet 1 def "; }else { token.token = " /@@@.quiet 0 def "; } executeToken(token); /* execute startup commands */ - token.kind = ID; + token.kind = ID; token.tflag = 0; token.token = "exec"; token = lookupTokens(token); /* set hashing values */ tmp = findSystemDictionary(token.token); @@ -777,10 +824,10 @@ void scanner() { StartFile = (char *)sGC_malloc(sizeof(char)*(strlen(StartFile)+ 40)); sprintf(StartFile,"$%s$ run\n",tmp2); - token.kind = EXECUTABLE_STRING; + token.kind = EXECUTABLE_STRING; token.tflag = 0; token.token = StartFile; executeToken(token); /* execute startup commands */ - token.kind = ID; + token.kind = ID; token.tflag = 0; token.token = "exec"; token = lookupTokens(token); /* set hashing values */ tmp = findSystemDictionary(token.token); @@ -790,10 +837,10 @@ void scanner() { } if (StartAString) { - token.kind = EXECUTABLE_STRING; + token.kind = EXECUTABLE_STRING; token.tflag = 0; token.token = StartString; executeToken(token); /* execute startup commands */ - token.kind = ID; + token.kind = ID; token.tflag = 0; token.token = "exec"; token = lookupTokens(token); /* set hashing values */ tmp = findSystemDictionary(token.token); @@ -820,18 +867,27 @@ void scanner() { fprintf(Fstack,"\nscanner> "); } if (!Calling_ctrlC_hook) { /* to avoid recursive call of ctrlC-hook. */ - Calling_ctrlC_hook = 1; + Calling_ctrlC_hook = 1; RestrictedMode = 0; KSexecuteString(" ctrlC-hook "); /* Execute User Defined functions. */ + RestrictedMode = RestrictedMode_saved; } Calling_ctrlC_hook = 0; KSexecuteString(" (Computation is interrupted.) "); /* move to ctrlC-hook? */ InSendmsg2 = 0; + infixOn = 0; continue ; } else { } if (DebugStack >= 1) { printOperandStack(); } - token = getokenSM(GET); - if ((tmp=executeToken(token)) < 0) break; - /***if (tmp == 1) fprintf(stderr," --- exit --- \n");*/ + token = getokenSM(GET); + if ((status=executeToken(token)) < 0) break; + /***if (status == 1) fprintf(stderr," --- exit --- \n");*/ + /* fprintf(stderr,"token.token=%s, status=%d, infixOn=%d\n",token.token,status,infixOn); */ + if (status & STATUS_INFIX) { + infixOn = 1; infixToken = token; infixToken.tflag |= NO_DELAY; + }else if (infixOn) { + infixOn = 0; + if ((status=executeToken(infixToken)) < 0) break; + } } } @@ -844,9 +900,11 @@ void ctrlC(sig) extern int SGClock; extern int UserCtrlC; extern int OXlock; + extern int RestrictedMode, RestrictedMode_saved; signal(sig,SIG_IGN); /* see 133p */ + RestrictedMode = RestrictedMode_saved; cancelAlarm(); if (sig == SIGALRM) { fprintf(stderr,"ctrlC by SIGALRM\n"); @@ -901,16 +959,18 @@ void ctrlC(sig) int executeToken(token) struct tokens token; { - struct object ob; + struct object ob = OINIT; int primitive; int size; int status; - struct tokens *tokenArray; int i,h0,h1; extern int WarningMessageMode; extern int Strict; extern int InSendmsg2; + extern int RestrictedMode, RestrictedMode_saved; + int localRestrictedMode_saved; + localRestrictedMode_saved = 0; if (GotoP) { /* for goto */ if (token.kind == ID && isLiteral(token.token)) { if (strcmp(&((token.token)[1]),GotoLabel) == 0) { @@ -956,19 +1016,32 @@ int executeToken(token) h1 = ((token.object.lc.op)->rc).ival; ob=findUserDictionary(token.token,h0,h1,CurrentContextp); primitive = ((token.object.rc.op)->lc).ival; + if (!(token.tflag & NO_DELAY)) { + if ((ob.tag >= 0) && (UD_attr & ATTR_INFIX)) { + return STATUS_INFIX; + } + } if (ob.tag >= 0) { /* there is a definition in the user dictionary */ if (ob.tag == SexecutableArray) { - tracePushName(token.token); - tokenArray = ob.lc.tokenArray; - size = ob.rc.ival; - for (i=0; i TRACE_MSG_SIZE) { - /* fprintf(stderr,"p=%d, TraceNameStackp=%d, strlen(t)=%d, t=%s\n",p,TraceNameStackp,strlen(t),t); */ + }else if ((strlen(t) + p) > (TRACE_MSG_SIZE-10)) { + /* fprintf(stderr,"p=%d, TraceNameStackp=%d, strlen(t)=%d, t=%s\n",p,TraceNameStackp,strlen(t),t); */ strcpy(&(s[p])," ..."); break; } @@ -1576,4 +1654,46 @@ char *traceShowStack(void) { } while (t != (char *)NULL); fprintf(stderr,"%s\n",s); return s; +} + +/* + if (fname != NULL) fname is pushed to the trace stack. + */ +int executeExecutableArray(struct object ob,char *fname,int withGotoP) { + struct tokens *tokenArray; + int size,i; + int status; + int infixOn; + struct tokens infixToken; + extern int GotoP; + + infixOn = 0; + if (ob.tag != SexecutableArray) errorStackmachine("Error (executeTokenArray): the argument is not a token array."); + + if (fname != NULL) tracePushName(fname); + tokenArray = ob.lc.tokenArray; + size = ob.rc.ival; + for (i=0; i