[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.23 and 1.24

version 1.23, 2004/09/12 01:53:11 version 1.24, 2004/09/12 08:55:36
Line 1 
Line 1 
 /* $OpenXM: OpenXM/src/kan96xx/Kan/stackmachine.c,v 1.22 2004/09/12 01:32:08 takayama Exp $ */  /* $OpenXM: OpenXM/src/kan96xx/Kan/stackmachine.c,v 1.23 2004/09/12 01:53:11 takayama Exp $ */
 /*   stackmachin.c */  /*   stackmachin.c */
   
 #include <stdio.h>  #include <stdio.h>
Line 923  int executeToken(token)
Line 923  int executeToken(token)
   int primitive;    int primitive;
   int size;    int size;
   int status;    int status;
   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 979  int executeToken(token)
Line 975  int executeToken(token)
       primitive = ((token.object.rc.op)->lc).ival;        primitive = ((token.object.rc.op)->lc).ival;
       if (!(token.tflag & NO_DELAY)) {        if (!(token.tflag & NO_DELAY)) {
         if ((ob.tag >= 0) && (UD_attr & ATTR_INFIX)) {          if ((ob.tag >= 0) && (UD_attr & ATTR_INFIX)) {
           tracePopName(); return STATUS_INFIX;            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) {
           tracePushName(token.token);            status = executeExecutableArray(ob,token.token);
           tokenArray = ob.lc.tokenArray;            if ((status & STATUS_BREAK) || (status < 0)) return status;
           size = ob.rc.ival;  
           for (i=0; i<size; i++) {  
             status = executeToken(tokenArray[i]);  
             if ((status & STATUS_BREAK) || (status < 0)) {  
               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();  
         }else {          }else {
           Kpush(ob);            Kpush(ob);
         }          }
Line 1615  char *traceShowStack(void) {
Line 1590  char *traceShowStack(void) {
   } while (t != (char *)NULL);    } while (t != (char *)NULL);
   fprintf(stderr,"%s\n",s);    fprintf(stderr,"%s\n",s);
   return s;    return s;
   }
   
   /*
     if (fname != NULL) fname is pushed to the trace stack.
    */
   int executeExecutableArray(struct object ob,char *fname) {
     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<size; i++) {
       status = executeToken(tokenArray[i]);
       if ((status & STATUS_BREAK) || (status < 0) || GotoP) {
         if (fname != NULL) 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) || GotoP) {
           if (fname != NULL) tracePopName();
           return(status);
         }
       }
     }
     if (fname != NULL) tracePopName();
     return(0); /* normal exit */
 }  }

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

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