[BACK]Return to stackmachine.c CVS log [TXT][DIR] Up to [local] / OpenXM / src / kan96xx / Kan

Diff for /OpenXM/src/kan96xx/Kan/stackmachine.c between version 1.10 and 1.19

version 1.10, 2002/11/04 10:53:56 version 1.19, 2004/09/11 12:13:41
Line 1 
Line 1 
 /* $OpenXM: OpenXM/src/kan96xx/Kan/stackmachine.c,v 1.9 2002/02/24 10:27:18 takayama Exp $ */  /* $OpenXM: OpenXM/src/kan96xx/Kan/stackmachine.c,v 1.18 2004/09/05 08:08:41 takayama Exp $ */
 /*   stackmachin.c */  /*   stackmachin.c */
   
 #include <stdio.h>  #include <stdio.h>
Line 54  struct context *PrimitiveContextp = &StandardContext;
Line 54  struct context *PrimitiveContextp = &StandardContext;
   
 static struct object ObjTmp; /* for poor compiler */  static struct object ObjTmp; /* for poor compiler */
   
   int Calling_ctrlC_hook = 0;
   
 int StandardMacros = 1;  int StandardMacros = 1;
 int StartAFile = 0;  int StartAFile = 0;
 char *StartFile;  char *StartFile;
Line 74  static void pstack(void);
Line 76  static void pstack(void);
 static struct object executableStringToExecutableArray(char *str);  static struct object executableStringToExecutableArray(char *str);
   
 extern int SerialCurrent;  extern int SerialCurrent;
   extern int QuoteMode;
   
 int SGClock = 0;  int SGClock = 0;
 int UserCtrlC = 0;  int UserCtrlC = 0;
 int OXlock = 0;  int OXlock = 0;
 int OXlockSaved = 0;  int OXlockSaved = 0;
   
   char *UD_str;
   int  UD_attr;
   
 struct object * newObject()  struct object * newObject()
 {  {
   struct object *r;    struct object *r;
Line 246  struct object findUserDictionary(str,h0,h1,cp)   
Line 252  struct object findUserDictionary(str,h0,h1,cp)   
      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;
            /* Set char *UD_str, int UD_attr (attributes) */
 {  {
   int x;    int x;
   struct dictionary *dic;    struct dictionary *dic;
     extern char *UD_str;
     extern int UD_attr;
     UD_str = NULL; UD_attr = -1;
   dic = cp->userDictionary;    dic = cp->userDictionary;
   x = h0;    x = h0;
   while (1) {    while (1) {
     if ((dic[x]).key == EMPTY) { break; }      if ((dic[x]).key == EMPTY) { break; }
     if (strcmp((dic[x]).key,str) == 0) {      if (strcmp((dic[x]).key,str) == 0) {
             UD_str = (dic[x]).key; UD_attr = (dic[x]).attr;
       return( (dic[x]).obj );        return( (dic[x]).obj );
     }      }
     x = (x+h1) % USER_DICTIONARY_SIZE;      x = (x+h1) % USER_DICTIONARY_SIZE;
Line 346  int hash0(str)
Line 357  int hash0(str)
 {  {
   int h=0;    int h=0;
   while (*str != '\0') {    while (*str != '\0') {
     h = ((h*128)+(*str)) % USER_DICTIONARY_SIZE;      h = ((h*128)+((unsigned char)(*str))) % USER_DICTIONARY_SIZE;
     str++;      str++;
   }    }
   return(h);    return(h);
Line 355  int hash0(str)
Line 366  int hash0(str)
 int hash1(str)  int hash1(str)
      char *str;       char *str;
 {  {
   return(8-(str[0]%8));    return(8-((unsigned char)(str[0])%8));
 }  }
   
 void hashInitialize(struct dictionary *dic)  void hashInitialize(struct dictionary *dic)
Line 733  void scanner() {
Line 744  void scanner() {
   char *tmp2;    char *tmp2;
   extern int ErrorMessageMode;    extern int ErrorMessageMode;
   int jval;    int jval;
     extern int InSendmsg2;
   getokenSM(INIT);    getokenSM(INIT);
   initSystemDictionary();    initSystemDictionary();
   
Line 815  void scanner() {
Line 827  void scanner() {
       if (DebugStack >= 1) {        if (DebugStack >= 1) {
         fprintf(Fstack,"\nscanner> ");          fprintf(Fstack,"\nscanner> ");
       }        }
       KSexecuteString(" ctrlC-hook "); /* Execute User Defined functions. */        if (!Calling_ctrlC_hook) { /* to avoid recursive call of ctrlC-hook. */
       KSexecuteString(" (Computation is interrupted.) ");          Calling_ctrlC_hook = 1;
           KSexecuteString(" ctrlC-hook "); /* Execute User Defined functions. */
         }
         Calling_ctrlC_hook = 0;
         KSexecuteString(" (Computation is interrupted.) "); /* move to ctrlC-hook? */
         InSendmsg2 = 0;
       continue ;        continue ;
     } else {  }      } else {  }
     if (DebugStack >= 1) { printOperandStack(); }      if (DebugStack >= 1) { printOperandStack(); }
Line 835  void ctrlC(sig)
Line 852  void ctrlC(sig)
   extern int SGClock;    extern int SGClock;
   extern int UserCtrlC;    extern int UserCtrlC;
   extern int OXlock;    extern int OXlock;
   
   signal(sig,SIG_IGN);    signal(sig,SIG_IGN);
   /* see 133p */    /* see 133p */
   cancelAlarm();    cancelAlarm();
Line 863  void ctrlC(sig)
Line 880  void ctrlC(sig)
     return;      return;
   }    }
   if (ErrorMessageMode != 1) {    if (ErrorMessageMode != 1) {
       (void *) traceShowStack();
     fprintf(Fstack,"User interruption by ctrl-C. We are in the top-level.\n");      fprintf(Fstack,"User interruption by ctrl-C. We are in the top-level.\n");
     fprintf(Fstack,"Type in quit in order to exit sm1.\n");      fprintf(Fstack,"Type in quit in order to exit sm1.\n");
   }    }
     traceClearStack();
   if (GotoP) {    if (GotoP) {
     fprintf(Fstack,"The interpreter was looking for the label <<%s>>. It is also aborted.\n",GotoLabel);      fprintf(Fstack,"The interpreter was looking for the label <<%s>>. It is also aborted.\n",GotoLabel);
     GotoP = 0;      GotoP = 0;
Line 898  int executeToken(token)
Line 917  int executeToken(token)
   int i,h0,h1;    int i,h0,h1;
   extern int WarningMessageMode;    extern int WarningMessageMode;
   extern int Strict;    extern int Strict;
     extern int InSendmsg2;
   
   if (GotoP) { /* for goto */    if (GotoP) { /* for goto */
     if (token.kind == ID && isLiteral(token.token)) {      if (token.kind == ID && isLiteral(token.token)) {
Line 947  int executeToken(token)
Line 967  int executeToken(token)
       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) {
             tracePushName(token.token);
           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) {
                 tracePopName(); return(status);
                           }
           }            }
             tracePopName();
         }else {          }else {
           Kpush(ob);            Kpush(ob);
         }          }
       } else if (primitive) {        } else if (primitive) {
           tracePushName(token.token);
         /* system operator */          /* system operator */
         ob.tag = Soperator;          ob.tag = Soperator;
         ob.lc.ival = primitive;          ob.lc.ival = primitive;
         return(executePrimitive(ob));          status = executePrimitive(ob);
           tracePopName();
           return(status);
       } else {        } else {
           if (QuoteMode) {
             if (InSendmsg2) return(DO_QUOTE);
             else {
               Kpush(KpoString(token.token));
               return(0); /* normal exit.*/
             }
                   }
         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) {
Line 1043  errorStackmachine(str)
Line 1077  errorStackmachine(str)
       fprintf(stderr,str);        fprintf(stderr,str);
     }      }
     fprintf(stderr,"\n");      fprintf(stderr,"\n");
       (void) traceShowStack();
   }    }
     traceClearStack();
   if (GotoP) {    if (GotoP) {
     fprintf(Fstack,"The interpreter was looking for the label <<%s>>. It is also aborted.\n",GotoLabel);      fprintf(Fstack,"The interpreter was looking for the label <<%s>>. It is also aborted.\n",GotoLabel);
     GotoP = 0;      GotoP = 0;
Line 1114  KSexecuteString(s)
Line 1150  KSexecuteString(s)
       }        }
       recursive--;        recursive--;
       if (localCatchCtrlC) { signal(SIGINT, sigfunc); }        if (localCatchCtrlC) { signal(SIGINT, sigfunc); }
         if (!Calling_ctrlC_hook) {
           Calling_ctrlC_hook = 1;
           KSexecuteString(" ctrlC-hook "); /* Execute User Defined functions. */
         }
         Calling_ctrlC_hook = 0;
         KSexecuteString(" (Computation is interrupted.) "); /* move to ctrlC-hook?*/
       return(-1);        return(-1);
     }else{ }      }else{ }
   }else{    }else{
Line 1130  KSexecuteString(s)
Line 1172  KSexecuteString(s)
         }          }
         recursive = 0;          recursive = 0;
         if (localCatchCtrlC) { signal(SIGINT, sigfunc); }          if (localCatchCtrlC) { signal(SIGINT, sigfunc); }
           if (!Calling_ctrlC_hook) {
             Calling_ctrlC_hook = 1;
             KSexecuteString(" ctrlC-hook "); /* Execute User Defined functions. */
           }
           Calling_ctrlC_hook = 0;
           Calling_ctrlC_hook = 0;
                   KSexecuteString(" (Computation is interrupted.) ");
         return(-1);          return(-1);
       }else { }        }else { }
     }      }
Line 1480  struct object KSdupErrors() {
Line 1529  struct object KSdupErrors() {
 void cancelAlarm() {  void cancelAlarm() {
   alarm((unsigned int) 0);    alarm((unsigned int) 0);
   signal(SIGALRM,SIG_DFL);    signal(SIGALRM,SIG_DFL);
   }
   
   /* back-trace */
   #define TraceNameStackSize 3000
   char *TraceNameStack[TraceNameStackSize];
   int TraceNameStackp = 0;
   void tracePushName(char *s) {
     char *t;
     /*
     t = (char *)sGC_malloc(strlen(s)+1);
     if (t == NULL) {
       fprintf(stderr,"No more memory.\n"); return;
     }
     strcpy(t,s);
     */
     t = s;
     TraceNameStack[TraceNameStackp++] = t;
     if (TraceNameStackp >= TraceNameStackSize) {
       fprintf(stderr,"Warning: TraceNameStack overflow. Clearing the stack.\n");
       TraceNameStackp = 0;
     }
   }
   void traceClearStack(void) {
     TraceNameStackp = 0;
   }
   char *tracePopName(void) {
     if (TraceNameStackp <= 0) return (char *) NULL;
     return TraceNameStack[--TraceNameStackp];
   }
   #define TRACE_MSG_SIZE 320
   char *traceShowStack(void) {
     char *s;
     char *t;
     int p;
     s = (char *) sGC_malloc(TRACE_MSG_SIZE);
     if (s == NULL) {
       fprintf(stderr,"No more memory.\n"); return NULL;
     }
     sprintf(s,"Trace: ");
     p = strlen(s);
     do {
       t = tracePopName();
       if (t == NULL) {
         s[p] = ';'; s[p+1] = 0;
         break;
       }else if ((strlen(t) + p -10) > TRACE_MSG_SIZE) {
             /*      fprintf(stderr,"p=%d, TraceNameStackp=%d, strlen(t)=%d, t=%s\n",p,TraceNameStackp,strlen(t),t); */
         strcpy(&(s[p])," ...");
         break;
       }
       strcpy(&(s[p]),t); p += strlen(t);
       strcpy(&(s[p]),"<-"); p += 2;
     } while (t != (char *)NULL);
     fprintf(stderr,"%s\n",s);
     return s;
 }  }

Legend:
Removed from v.1.10  
changed lines
  Added in v.1.19

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>