[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.18 and 1.23

version 1.18, 2004/09/05 08:08:41 version 1.23, 2004/09/12 01:53:11
Line 1 
Line 1 
 /* $OpenXM: OpenXM/src/kan96xx/Kan/stackmachine.c,v 1.17 2004/09/05 01:15:47 takayama Exp $ */  /* $OpenXM: OpenXM/src/kan96xx/Kan/stackmachine.c,v 1.22 2004/09/12 01:32:08 takayama Exp $ */
 /*   stackmachin.c */  /*   stackmachin.c */
   
 #include <stdio.h>  #include <stdio.h>
Line 83  int UserCtrlC = 0;
Line 83  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 218  int putUserDictionary(str,h0,h1,ob,dic)
Line 221  int putUserDictionary(str,h0,h1,ob,dic)
   }    }
   r = x;    r = x;
   if (Strict2) {    if (Strict2) {
     switch((dic[x]).attr) {      switch(((dic[x]).attr) & (PROTECT | ABSOLUTE_PROTECT)) {
     case PROTECT:      case PROTECT:
       r = -PROTECT;   /* Protected, but we rewrite it. */        r = -PROTECT;   /* Protected, but we rewrite it. */
       break;        break;
Line 226  int putUserDictionary(str,h0,h1,ob,dic)
Line 229  int putUserDictionary(str,h0,h1,ob,dic)
       r = -ABSOLUTE_PROTECT;  /* Protected and we do not rewrite it. */        r = -ABSOLUTE_PROTECT;  /* Protected and we do not rewrite it. */
       return(r);        return(r);
     default:      default:
       (dic[x]).attr = 0;        /* (dic[x]).attr = 0; */ /* It is not necesarry, I think. */
       break;        break;
     }      }
   }    }
Line 249  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 732  void scanner() {
Line 740  void scanner() {
   struct object ob;    struct object ob;
   extern int Quiet;    extern int Quiet;
   extern void ctrlC();    extern void ctrlC();
   int tmp;    int tmp, status;
   char *tmp2;    char *tmp2;
   extern int ErrorMessageMode;    extern int ErrorMessageMode;
   int jval;    int jval;
   extern int InSendmsg2;    extern int InSendmsg2;
     int infixOn = 0;
     struct tokens infixToken;
   getokenSM(INIT);    getokenSM(INIT);
   initSystemDictionary();    initSystemDictionary();
   
Line 754  void scanner() {
Line 764  void scanner() {
   }    }
   
   /* setup quiet mode or not */    /* setup quiet mode or not */
   token.kind = EXECUTABLE_STRING;    token.kind = EXECUTABLE_STRING; token.tflag = 0;
   if (Quiet) {    if (Quiet) {
     token.token = " /@@@.quiet 1 def ";      token.token = " /@@@.quiet 1 def ";
   }else {    }else {
     token.token = " /@@@.quiet 0 def ";      token.token = " /@@@.quiet 0 def ";
   }    }
   executeToken(token); /* execute startup commands */    executeToken(token); /* execute startup commands */
   token.kind = ID;    token.kind = ID; token.tflag = 0;
   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);
Line 777  void scanner() {
Line 787  void scanner() {
     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.tflag = 0;
     token.token = StartFile;      token.token = StartFile;
     executeToken(token);    /* execute startup commands */      executeToken(token);    /* execute startup commands */
     token.kind = ID;      token.kind = ID; token.tflag = 0;
     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);
Line 790  void scanner() {
Line 800  void scanner() {
   }    }
   
   if (StartAString) {    if (StartAString) {
     token.kind = EXECUTABLE_STRING;      token.kind = EXECUTABLE_STRING;  token.tflag = 0;
     token.token = StartString;      token.token = StartString;
     executeToken(token);    /* execute startup commands */      executeToken(token);    /* execute startup commands */
     token.kind = ID;      token.kind = ID; token.tflag = 0;
     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);
Line 826  void scanner() {
Line 836  void scanner() {
       Calling_ctrlC_hook = 0;        Calling_ctrlC_hook = 0;
       KSexecuteString(" (Computation is interrupted.) "); /* move to ctrlC-hook? */        KSexecuteString(" (Computation is interrupted.) "); /* move to ctrlC-hook? */
       InSendmsg2 = 0;        InSendmsg2 = 0;
         infixOn = 0;
       continue ;        continue ;
     } else {  }      } else {  }
     if (DebugStack >= 1) { printOperandStack(); }      if (DebugStack >= 1) { printOperandStack(); }
     token = getokenSM(GET);      token = getokenSM(GET);
     if ((tmp=executeToken(token)) < 0) break;      if ((status=executeToken(token)) < 0) break;
     /***if (tmp == 1) fprintf(stderr," --- exit --- \n");*/      /***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;
       }
   }    }
 }  }
   
Line 907  int executeToken(token)
Line 925  int executeToken(token)
   int status;    int status;
   struct tokens *tokenArray;    struct tokens *tokenArray;
   int i,h0,h1;    int i,h0,h1;
     int infixOn;
     struct tokens infixToken;
   extern int WarningMessageMode;    extern int WarningMessageMode;
   extern int Strict;    extern int Strict;
   extern int InSendmsg2;    extern int InSendmsg2;
   
     infixOn = 0;
   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) {
Line 956  int executeToken(token)
Line 977  int executeToken(token)
       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 (!(token.tflag & NO_DELAY)) {
           if ((ob.tag >= 0) && (UD_attr & ATTR_INFIX)) {
             tracePopName(); return STATUS_INFIX;
           }
         }
       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) {
Line 964  int executeToken(token)
Line 990  int executeToken(token)
           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) {              if ((status & STATUS_BREAK) || (status < 0)) {
               tracePopName(); return(status);                tracePopName(); return(status);
                         }                          }
   
               if (status & STATUS_INFIX) {
                 if (i == size-1) errorStackmachine("Infix operator at the end of an executable array.");
                 infixOn = 1; infixToken = tokenArray[i];
                 infixToken.tflag |= NO_DELAY;
                 continue;
               }else if (infixOn) {
                 infixOn = 0;
                 status = executeToken(infixToken);
                 if ((status & STATUS_BREAK) || (status < 0)) {
                   tracePopName(); return(status);
                 }
               }
           }            }
           tracePopName();            tracePopName();
         }else {          }else {
Line 1178  KSexecuteString(s)
Line 1217  KSexecuteString(s)
   
   recursive++;    recursive++;
   token.token = s;    token.token = s;
   token.kind = EXECUTABLE_STRING;    token.kind = EXECUTABLE_STRING; token.tflag = 0;
   executeToken(token);    executeToken(token);
   token.kind = ID;    token.kind = ID; token.tflag = 0;
   token.token = "exec";    token.token = "exec";
   token = lookupTokens(token); /* no use */    token = lookupTokens(token); /* no use */
   tmp = findSystemDictionary(token.token);    tmp = findSystemDictionary(token.token);
Line 1199  KSdefineMacros() {
Line 1238  KSdefineMacros() {
   struct object ob;    struct object ob;
   
   if (StandardMacros && (strlen(SMacros))) {    if (StandardMacros && (strlen(SMacros))) {
     token.kind = EXECUTABLE_STRING;      token.kind = EXECUTABLE_STRING; token.tflag = 0;
     token.token = SMacros;      token.token = SMacros;
     executeToken(token);    /* execute startup commands */      executeToken(token);    /* execute startup commands */
     token.kind = ID;      token.kind = ID; token.tflag = 0;
     token.token = "exec";      token.token = "exec";
     token = lookupTokens(token); /* no use */      token = lookupTokens(token); /* no use */
     tmp = findSystemDictionary(token.token);      tmp = findSystemDictionary(token.token);
Line 1232  void KSstart() {
Line 1271  void KSstart() {
     } else {  }  */      } else {  }  */
   
   /* setup quiet mode or not */    /* setup quiet mode or not */
   token.kind = EXECUTABLE_STRING;    token.kind = EXECUTABLE_STRING; token.tflag = 0;
   if (Quiet) {    if (Quiet) {
     token.token = " /@@@.quiet 1 def ";      token.token = " /@@@.quiet 1 def ";
   }else {    }else {
     token.token = " /@@@.quiet 0 def ";      token.token = " /@@@.quiet 0 def ";
   }    }
   executeToken(token); /* execute startup commands */    executeToken(token); /* execute startup commands */
   token.kind = ID;    token.kind = ID; token.tflag = 0;
   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);

Legend:
Removed from v.1.18  
changed lines
  Added in v.1.23

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