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

Diff for /OpenXM/src/kan96xx/Kan/primitive.c between version 1.11 and 1.14

version 1.11, 2003/12/05 23:14:14 version 1.14, 2004/09/12 08:55:36
Line 1 
Line 1 
 /* $OpenXM: OpenXM/src/kan96xx/Kan/primitive.c,v 1.10 2003/12/05 13:51:31 takayama Exp $ */  /* $OpenXM: OpenXM/src/kan96xx/Kan/primitive.c,v 1.13 2004/09/12 02:37:57 takayama Exp $ */
 /*   primitive.c */  /*   primitive.c */
 /*  The functions in this module were in stackmachine.c */  /*  The functions in this module were in stackmachine.c */
   
Line 424  int executePrimitive(ob) 
Line 424  int executePrimitive(ob) 
   int size;    int size;
   int i,j,k,n;    int i,j,k,n;
   int status;    int status;
     int infixOn;
     struct tokens infixToken;
   struct tokens *tokenArray;    struct tokens *tokenArray;
   struct tokens token;    struct tokens token;
   FILE *fp;    FILE *fp;
Line 442  int executePrimitive(ob) 
Line 444  int executePrimitive(ob) 
   extern TimerOn;    extern TimerOn;
   extern SecureMode;    extern SecureMode;
   
     infixOn = 0;
   
   if (DebugStack >= 2) {    if (DebugStack >= 2) {
     fprintf(Fstack,"In execute %d\n",ob.lc.ival); printOperandStack();      fprintf(Fstack,"In execute %d\n",ob.lc.ival); printOperandStack();
   }    }
Line 596  int executePrimitive(ob) 
Line 600  int executePrimitive(ob) 
     /* ob2               ob1 get     */      /* ob2               ob1 get     */
     ob1 = Kpop();      ob1 = Kpop();
     ob2 = Kpop();      ob2 = Kpop();
     switch(ob2.tag) {      Kpush(Kget(ob2,ob1));
     case Sarray: break;  
     default: errorStackmachine("Usage:get");  
     }  
     switch(ob1.tag) {  
     case Sinteger: break;  
     default: errorStackmachine("Usage:get");  
     }  
     i =ob1.lc.ival;  
     size = getoaSize(ob2);  
     if ((0 <= i) && (i<size)) {  
       Kpush(getoa(ob2,i));  
     }else{  
       errorStackmachine("Index is out of bound. (get)\n");  
     }  
     break;      break;
   
   case Sput:    case Sput:
Line 754  int executePrimitive(ob) 
Line 744  int executePrimitive(ob) 
       errorStackmachine("Usage:loop");        errorStackmachine("Usage:loop");
       break;        break;
     }      }
     tokenArray = ob1.lc.tokenArray;  
     size = ob1.rc.ival;  
     i = 0;  
     while (1) {      while (1) {
       token = tokenArray[i];        status = executeExecutableArray(ob1,(char *)NULL);
       /***printf("[token %d]%s\n",i,token.token);*/        if ((status & STATUS_BREAK) || GotoP) break;
       i++;  
       if (i >= size) {  
         i=0;  
       }  
       status = executeToken(token);  
       if (status || GotoP) break;  
       /* here, do not return 1. Do not propagate exit signal outside of the        /* here, do not return 1. Do not propagate exit signal outside of the
          loop. */           loop. */
     }      }
Line 803  int executePrimitive(ob) 
Line 784  int executePrimitive(ob) 
         */          */
         for ( ; i<=lim; i += inc) {          for ( ; i<=lim; i += inc) {
           Kpush(KpoInteger(i));            Kpush(KpoInteger(i));
           tokenArray = ob1.lc.tokenArray;            status = executeExecutableArray(ob1,(char *)NULL);
           size = ob1.rc.ival;            if ((status & STATUS_BREAK) || GotoP) goto xyz;
           for (j=0; j<size; j++) {                  }
             status = executeToken(tokenArray[j]);  
             if (status || GotoP) goto xyz;  
           }  
         }  
       }else{        }else{
         /*          /*
           if (lim > i) errorStackmachine("The initial value must not be less than limit value (for).\n");            if (lim > i) errorStackmachine("The initial value must not be less than limit value (for).\n");
         */          */
         for ( ; i>=lim; i += inc) {          for ( ; i>=lim; i += inc) {
           Kpush(KpoInteger(i));            Kpush(KpoInteger(i));
           tokenArray = ob1.lc.tokenArray;            status = executeExecutableArray(ob1,(char *)NULL);
           size = ob1.rc.ival;            if ((status & STATUS_BREAK) || GotoP) goto xyz;
           for (j=0; j<size; j++) {  
             status = executeToken(tokenArray[j]);  
             if (status || GotoP) goto xyz;  
           }  
         }          }
       }        }
     xyz:  ;      xyz:  ;
Line 852  int executePrimitive(ob) 
Line 825  int executePrimitive(ob) 
   
     for (i=0; i<osize; i++) {      for (i=0; i<osize; i++) {
       Kpush(getoa(ob1,i));        Kpush(getoa(ob1,i));
       tokenArray = ob2.lc.tokenArray;        status = executeExecutableArray(ob2,(char *)NULL);
       size = ob2.rc.ival;        if ((status & STATUS_BREAK) || GotoP) goto foor;
       for (j=0; j<size; j++) {  
         status = executeToken(tokenArray[j]);  
         if (status) goto foor;  
       }  
     }      }
     foor: ;      foor: ;
     /*KSexecuteString("]");*/      /*KSexecuteString("]");*/
Line 906  int executePrimitive(ob) 
Line 875  int executePrimitive(ob) 
       ob1 = ob2;        ob1 = ob2;
     }      }
     /* execute ob1 */      /* execute ob1 */
     tokenArray = ob1.lc.tokenArray;      status = executeExecutableArray(ob1,(char *)NULL);
     size = ob1.rc.ival;      if (status & STATUS_BREAK) return(status);
     for (i=0; i<size; i++) {  
       token = tokenArray[i];  
       status = executeToken(token);  
       if (status != 0) return(status);  
     }  
   
     break;      break;
   
   case Sexec:    case Sexec:
Line 923  int executePrimitive(ob) 
Line 887  int executePrimitive(ob) 
     case SexecutableArray: break;      case SexecutableArray: break;
     default: errorStackmachine("Usage:exec");      default: errorStackmachine("Usage:exec");
     }      }
     tokenArray = ob1.lc.tokenArray;          status = executeExecutableArray(ob1,(char *)NULL);
     size = ob1.rc.ival;  
     for (i=0; i<size; i++) {  
       token = tokenArray[i];  
       /***printf("[token %d]%s\n",i,token.token);*/  
       status = executeToken(token);  
       if (status != 0) break;  
     }  
     break;      break;
   
     /* Postscript primitives :dictionary */      /* Postscript primitives :dictionary */
Line 1510  int executePrimitive(ob) 
Line 1467  int executePrimitive(ob) 
     }      }
     /* normal exec. */      /* normal exec. */
     Kpush(ob2);      Kpush(ob2);
     tokenArray = ob1.lc.tokenArray;      status = executeExecutableArray(ob1,(char *)NULL);
     size = ob1.rc.ival;  
     for (i=0; i<size; i++) {  
       token = tokenArray[i];  
       status = executeToken(token);  
       if (status != 0) break;  
     }  
     if (ccflag) {      if (ccflag) {
       contextControl(CCPOP); ccflag = 0; /* recover the Current context. */        contextControl(CCPOP); ccflag = 0; /* recover the Current context. */
     }      }
   
     break;      break;
   case Ssendmsg2:    case Ssendmsg2:
     /* ob2 ob4 { .........} sendmsg2 */      /* ob2 ob4 { .........} sendmsg2 */
Line 1557  int executePrimitive(ob) 
Line 1509  int executePrimitive(ob) 
     }      }
     /* normal exec. */      /* normal exec. */
     Kpush(ob2); Kpush(ob4);      Kpush(ob2); Kpush(ob4);
   
       /* We cannot use executeExecutableArray(ob1,(char *)NULL) because of
          the quote mode. Think about it later. */
     tokenArray = ob1.lc.tokenArray;      tokenArray = ob1.lc.tokenArray;
     size = ob1.rc.ival;      size = ob1.rc.ival;
     for (i=0; i<size; i++) {      for (i=0; i<size; i++) {
Line 1564  int executePrimitive(ob) 
Line 1519  int executePrimitive(ob) 
       InSendmsg2 = 1;        InSendmsg2 = 1;
       status = executeToken(token);        status = executeToken(token);
       InSendmsg2 = 0;        InSendmsg2 = 0;
       if (QuoteMode && (status==DO_QUOTE)) {  
         if (status & STATUS_INFIX) {
                   if (status & DO_QUOTE) errorStackmachine("infix op with DO_QUOTE\n");
           if (i == size-1) errorStackmachine("infix operator at the end(sendmsg2).\n");
           infixOn = 1; infixToken = tokenArray[i];
           infixToken.tflag |= NO_DELAY; continue;
         }else if (infixOn) {
           infixOn = 0; status = executeToken(infixToken);
           if (status & STATUS_BREAK) break;
         }
   
         if (QuoteMode && (status & DO_QUOTE)) {
         /* generate tree object, for kan/k0 */          /* generate tree object, for kan/k0 */
         struct object qob;          struct object qob;
         struct object qattr;          struct object qattr;
Line 1592  int executePrimitive(ob) 
Line 1558  int executePrimitive(ob) 
         putoa(qob,2,ob4);  /* Argument */          putoa(qob,2,ob4);  /* Argument */
         qob = KpoTree(qob);          qob = KpoTree(qob);
         Kpush(qob);          Kpush(qob);
       } else if (status != 0) break;        } else if (status & STATUS_BREAK) break;
   
     }      }
     if (ccflag) {      if (ccflag) {
       contextControl(CCPOP); ccflag = 0;        contextControl(CCPOP); ccflag = 0;
Line 1612  int executePrimitive(ob) 
Line 1579  int executePrimitive(ob) 
     contextControl(CCPUSH); ccflag = 1;      contextControl(CCPUSH); ccflag = 1;
     CurrentContextp = PrimitiveContextp;      CurrentContextp = PrimitiveContextp;
     /* normal exec. */      /* normal exec. */
     tokenArray = ob1.lc.tokenArray;      status = executeExecutableArray(ob1,(char *)NULL);
     size = ob1.rc.ival;  
     for (i=0; i<size; i++) {  
       token = tokenArray[i];  
       status = executeToken(token);  
       if (status != 0) break;  
     }  
   
     contextControl(CCPOP); /* recover the Current context. */      contextControl(CCPOP); /* recover the Current context. */
     break;      break;
   
Line 1664  int executePrimitive(ob) 
Line 1624  int executePrimitive(ob) 
     }      }
     /* normal exec. */      /* normal exec. */
     Kpush(ob2); Kpush(ob4);      Kpush(ob2); Kpush(ob4);
     tokenArray = ob1.lc.tokenArray;      status = executeExecutableArray(ob1,(char *)NULL);
     size = ob1.rc.ival;  
     for (i=0; i<size; i++) {  
       token = tokenArray[i];  
       status = executeToken(token);  
       if (status != 0) break;  
     }  
     if (ccflag) {      if (ccflag) {
       contextControl(CCPOP); ccflag = 0; /* recover the Current context. */        contextControl(CCPOP); ccflag = 0; /* recover the Current context. */
     }      }
Line 1738  int executePrimitive(ob) 
Line 1692  int executePrimitive(ob) 
       errorStackmachine("Usage:tlimit");        errorStackmachine("Usage:tlimit");
       break;        break;
     }      }
     tokenArray = ob1.lc.tokenArray;  
     size = ob1.rc.ival;  
         n = ob2.lc.ival;          n = ob2.lc.ival;
     i = 0;  
         if (n > 0) {          if (n > 0) {
           signal(SIGALRM,ctrlC); alarm((unsigned int) n);            signal(SIGALRM,ctrlC); alarm((unsigned int) n);
           for (i=0; i<size; i++) {        status = executeExecutableArray(ob1,(char *)NULL);
                 token = tokenArray[i];  
                 status = executeToken(token);  
           }  
           cancelAlarm();            cancelAlarm();
         }else{          }else{
       before_real = time(&before_real);        before_real = time(&before_real);
       times(&before);        times(&before);
           for (i=0; i<size; i++) {        status = executeExecutableArray(ob1,(char *)NULL);
                 token = tokenArray[i];  
                 status = executeToken(token);  
           }  
       times(&after);        times(&after);
       after_real = time(&after_real);        after_real = time(&after_real);
           ob1 = newObjectArray(3);            ob1 = newObjectArray(3);

Legend:
Removed from v.1.11  
changed lines
  Added in v.1.14

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