[BACK]Return to nullstackmachine.c CVS log [TXT][DIR] Up to [local] / OpenXM / src / kxx

Annotation of OpenXM/src/kxx/nullstackmachine.c, Revision 1.1

1.1     ! maekawa     1: #include <stdio.h>
        !             2: #include "ox_kan.h"
        !             3: #include "serversm.h"
        !             4: #include <setjmp.h>
        !             5: jmp_buf EnvOfStackMachine;  /* dummy data. */
        !             6:
        !             7: int SerialCurrent = -1;
        !             8: int Quiet = 0;
        !             9:
        !            10: void *GC_malloc(n) {
        !            11:   return((void *)malloc(n));
        !            12: }
        !            13:
        !            14: /* internal use. */
        !            15: int Sm1_popInt();
        !            16:
        !            17: Sm1_start() {
        !            18:   fprintf(stderr,"nullstackmachine: sleep, pstack\n");
        !            19: }
        !            20:
        !            21: int nullCmoGetInt32(ox_stream ostream)
        !            22: {
        !            23:   char d[4];
        !            24:   int i;
        !            25:   for (i=0; i<4; i++) {
        !            26:     d[i] = fp2fgetc(ostream);
        !            27:   }
        !            28:   return(ntohl(* ( (int *)d)));
        !            29: }
        !            30:
        !            31: /*  server stack machine */
        !            32: static CMO_Object *LocalStack[200];
        !            33: static int Stackp = 0;
        !            34: void Sm1_pushToLocalStack(CMO_Object *op) {
        !            35:   if (Stackp < 200) {
        !            36:     LocalStack[Stackp++] = op;
        !            37:   }else{
        !            38:     fprintf(stderr,"Stack Overflow.\n");
        !            39:   }
        !            40: }
        !            41: CMO_Object *Sm1_popFromLocalStack() {
        !            42:   fprintf(stderr,"Stackp=%d\n",Stackp);
        !            43:   if (Stackp <= 0) {
        !            44:     fprintf(stderr,"Stack underflow.\n");
        !            45:     return(NULL);
        !            46:   }
        !            47:   Stackp--;
        !            48:   return(LocalStack[Stackp]);
        !            49: }
        !            50:
        !            51: CMO_Object *CMO_new_string(char *s) {
        !            52:   CMO_string_object *op;
        !            53:   int i;
        !            54:   op = (CMO_string_object *)mymalloc(sizeof(CMO_string_object)+strlen(s));
        !            55:   op->tag = htonl(CMO_STRING);
        !            56:   op->size = htonl(strlen(s)+1);
        !            57:   for (i=0; i< strlen(s); i++) {
        !            58:     (op->data)[i] = s[i];
        !            59:     (op->data)[i+1] = '\0';
        !            60:   }
        !            61:   return( (CMO_Object *)op);
        !            62: }
        !            63: CMO_Object *CMO_new_int32(int k) {
        !            64:   CMO_int32_object *op;
        !            65:   int i;
        !            66:   op = (CMO_int32_object *)mymalloc(sizeof(CMO_int32_object));
        !            67:   op->tag = htonl(CMO_INT32);
        !            68:   op->n = k;
        !            69:   return( (CMO_Object *)op);
        !            70: }
        !            71: void printCMO_object(FILE *fp,CMO_Object *op)
        !            72: {
        !            73:   int n,i;
        !            74:   if (op == NULL) {
        !            75:     fprintf(fp,"null");
        !            76:   }else{
        !            77:     switch(ntohl(op->tag)) {
        !            78:     case CMO_INT32:
        !            79:       fprintf(fp,"%d",((CMO_int32_object *)op)->n);
        !            80:       break;
        !            81:     case CMO_STRING:
        !            82:       n = ntohl(((CMO_string_object *)op)->size);
        !            83:       fprintf(stderr,"n=%d :"); fflush(NULL);
        !            84:       for (i=0; i<n; i++) {
        !            85:        fprintf(fp,"%c",((CMO_string_object *)op)->data[i]);
        !            86:       }
        !            87:       break;
        !            88:     default:
        !            89:       fprintf(fp,"Unknown object: tag=%d ",ntohl(op->tag));
        !            90:       break;
        !            91:     }
        !            92:   }
        !            93: }
        !            94:
        !            95: void *Sm1_mathcap(void) {
        !            96:   int n,i;
        !            97:   struct mathCap *mathcap;
        !            98:   mathcap = (struct mathCap *) malloc(sizeof(struct mathCap));
        !            99:   strcpy(mathcap->name,"nullserver00 Version=0.1");
        !           100:   mathcap->version = 199901160;
        !           101:   mathcap->cmo[0] = CMO_ERROR2;
        !           102:   mathcap->cmo[1] = CMO_NULL;
        !           103:   mathcap->cmo[2] = CMO_INT32;
        !           104:   mathcap->cmo[3] = CMO_STRING;
        !           105:   mathcap->cmo[4] = CMO_LIST;
        !           106:   mathcap->n =  5;
        !           107:   return((void *)mathcap);
        !           108: }
        !           109: int Sm1_setMathCap(ox_stream os) {
        !           110:   fprintf(stderr,"setMathCap is not implemented.\n");
        !           111:   return(-1);
        !           112: }
        !           113: void Sm1_pops(void) {
        !           114:   int n;
        !           115:   n = Sm1_popInt32();
        !           116:   Stackp -= n;
        !           117:   if (Stackp < 0) Stackp = 0;
        !           118: }
        !           119: int Sm1_executeStringByLocalParser(void) {
        !           120:   char *s;
        !           121:   CMO_Object *op;
        !           122:   int i;
        !           123:   s = Sm1_popString();
        !           124:   if (s != NULL) {
        !           125:     if (strcmp(s,"sleep") == 0) {
        !           126:       while (1) {
        !           127:        fprintf(stderr,"Sleeping...  "); fflush(NULL);
        !           128:        sleep(10);
        !           129:       }
        !           130:     }else if (strcmp(s,"pstack") == 0) {
        !           131:       fprintf(stderr,"pstack -------------- Stackp = %d\n",Stackp);
        !           132:       for (i=Stackp-1; i>=0; i--) {
        !           133:        printCMO_object(stdout,LocalStack[i]); fprintf(stderr,"\n");
        !           134:       }
        !           135:       fprintf(stderr,"\n--------------------\n");
        !           136:     }else{
        !           137:       fprintf(stderr,"Unknown operator: %s\n",s);
        !           138:     }
        !           139:   }else {
        !           140:     fprintf(stderr,"nullstackmachine.c: pop the null string.");
        !           141:   }
        !           142:   /* Sm1_pushToLocalStack(CMO_new_string(s)); */
        !           143:   return(0);
        !           144: }
        !           145: char *Sm1_popString() {
        !           146:   CMO_Object *op;
        !           147:   CMO_string_object *sop;
        !           148:   char *c;
        !           149:   op = Sm1_popFromLocalStack();
        !           150:   if (op != NULL) {
        !           151:     switch(ntohl(op->tag)) {
        !           152:     case CMO_INT32:
        !           153:       c = (char *)malloc(30);
        !           154:       sprintf(c,"%d",((CMO_int32_object *)op)->n);
        !           155:       return(c);
        !           156:       break;
        !           157:     case CMO_STRING:
        !           158:       sop = (CMO_string_object *)op;
        !           159:       return(sop->data);
        !           160:       break;
        !           161:     default:
        !           162:       fprintf(stderr,"tag error \n");
        !           163:       return(NULL);
        !           164:     }
        !           165:   }else{
        !           166:     return(NULL);
        !           167:   }
        !           168: }
        !           169:
        !           170: int Sm1_popInt32() {
        !           171:   CMO_Object *op;
        !           172:   CMO_int32_object *sop;
        !           173:   op = Sm1_popFromLocalStack();
        !           174:   if (op != NULL) {
        !           175:     if (op->tag != htonl(CMO_INT32)) {
        !           176:       fprintf(stderr,"Object on the stack is not CMO_INT32. \n");
        !           177:       return(0);
        !           178:     }
        !           179:     sop = (CMO_int32_object *)op;
        !           180:     return(sop->n);
        !           181:   }else{
        !           182:     return(0);
        !           183:   }
        !           184: }
        !           185:
        !           186:
        !           187: int Sm1_setName(void)
        !           188: {
        !           189:   char *s;
        !           190:   s = Sm1_popString();
        !           191:   if (s != NULL) fprintf(stderr,"setName %s\n",s);
        !           192:   return(-1);
        !           193: }
        !           194:
        !           195: int Sm1_evalName(void)
        !           196: {
        !           197:   char *s;
        !           198:   s = Sm1_popString();
        !           199:   if (s != NULL) fprintf(stderr,"evalName : %s");
        !           200:   return(-1);
        !           201: }
        !           202:
        !           203: static int isData(FILE2 *fp)
        !           204: {
        !           205:   if (fp->readpos < fp->readsize) return(1);
        !           206:   else {
        !           207:     return(oxSocketSelect0(fp->fd,0));
        !           208:   }
        !           209: }
        !           210:
        !           211: int Sm1_pushCMO(ox_stream ostream) /* old one went to junk.c */
        !           212: {
        !           213:   int size;
        !           214:   char data[1000];
        !           215:   int i;
        !           216:   int c,n;
        !           217:   if (ostream == NULL || ostream->initialized != 1) {
        !           218:     fprintf(stderr,"pushCMO,  ostream is not initialized or null.\n");
        !           219:     return(-1);
        !           220:   }
        !           221:   /* Read data from ostream */
        !           222:   fprintf(stderr,"----------- CMO data from stream -----------------\n");fflush(NULL);
        !           223:   if (isData(ostream) || oxSocketSelect0(ostream->fd,-1)) {
        !           224:     c = nullCmoGetInt32(ostream);
        !           225:     fprintf(stderr,"cmo tag=%d : ",c);
        !           226:     switch(c) {
        !           227:     case CMO_ERROR2: fprintf(stderr,"CMO_ERROR2 ;"); break;
        !           228:     case CMO_ERROR: fprintf(stderr,"CMO_ERROR ;"); break;
        !           229:     case CMO_INT32: fprintf(stderr,"CMO_INT32 ;"); break;
        !           230:     case CMO_STRING: fprintf(stderr,"CMO_STRING ;"); break;
        !           231:     default: fprintf(stderr,"Unknown"); break;
        !           232:     }
        !           233:     switch(c) {
        !           234:     case CMO_ERROR:
        !           235:       break;
        !           236:     case CMO_INT32:
        !           237:       n = nullCmoGetInt32(ostream);
        !           238:       fprintf(stderr,"%d",n);
        !           239:       Sm1_pushToLocalStack(CMO_new_int32(n));
        !           240:       break;
        !           241:     case CMO_STRING:
        !           242:       n = nullCmoGetInt32(ostream);
        !           243:       fprintf(stderr,"size=%d ",n);
        !           244:       if (n > 1000-2) {
        !           245:        fprintf(stderr," size is too large. \n");
        !           246:       }else{
        !           247:        for (i=0; i<n; i++) {
        !           248:          data[i] = fp2fgetc(ostream);
        !           249:          data[i+1] = '\0';
        !           250:        }
        !           251:        fprintf(stderr," string=%s ",data);
        !           252:        Sm1_pushToLocalStack(CMO_new_string(data));
        !           253:       }
        !           254:       break;
        !           255:     default:
        !           256:       do {
        !           257:        if ((c = fp2fgetc(ostream)) == EOF) {
        !           258:          fprintf(stderr,"pushCMOFromStrem: Select returns 0, but there is no data or unexpected EOF.\n");
        !           259:          return(-1);
        !           260:        }
        !           261:        fprintf(stderr,"%2x ",c);
        !           262:       }while(isData(ostream));
        !           263:     }
        !           264:   }
        !           265:   fprintf(stderr,"\n-------------------------------------------------\n"); fflush(NULL);
        !           266:   return(0);
        !           267: }
        !           268:
        !           269: int Sm1_popCMO(ox_stream os,int serial)
        !           270: {
        !           271:   FILE *fp2;
        !           272:   extern int errno;
        !           273:   int c;
        !           274:   int p;
        !           275:   char data[1000];
        !           276:
        !           277:   fp2 = fopen("ex1.cmo","r");
        !           278:   if (fp2 == NULL) {
        !           279:     fprintf(stderr,"popCMO : file ex1.cmo is not found.\n");
        !           280:     return(-1);
        !           281:   }
        !           282:   p = 0;
        !           283:   while ((c=fgetc(fp2)) != EOF) {
        !           284:     data[p] = c; p++;
        !           285:     if (p >= 1000) {fp2write(os,data,1000); p=0;}
        !           286:     fprintf(stderr," %2x ",c);
        !           287:   }
        !           288:   if (p>0) { fp2write(os,data,p); }
        !           289:   fp2fflush(os);
        !           290:
        !           291:   return(0);
        !           292: }
        !           293:
        !           294: int Sm1_pushError2(int serial,int no,char *s)
        !           295: {
        !           296:   fprintf(stderr,"Sm1_pushError2 : [%d,%d,%s] \n",serial,no,s);
        !           297: }
        !           298:
        !           299:
        !           300: /* These are dummy.  It is defined in stackmachine.c */
        !           301: unlockCtrlCForOx() { ; }
        !           302: restoreLockCtrlCForOx() { ; }
        !           303:

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