Annotation of OpenXM/src/kan96xx/Kan/primitive.c, Revision 1.1
1.1 ! maekawa 1: /* primitive.c */
! 2: /* The functions in this module were in stackmachine.c */
! 3:
! 4: #include <stdio.h>
! 5: #include "datatype.h"
! 6: #include "stackm.h"
! 7: #include "extern.h"
! 8: #include "gradedset.h"
! 9: #include "kclass.h"
! 10: #include <sys/types.h>
! 11: #include <sys/times.h>
! 12:
! 13: int PrintDollar = 1; /* flag for printObject() */
! 14: int PrintComma = 1; /* flag for printObject() */
! 15: #define OB_ARRAY_MAX (AGLIMIT+100)
! 16:
! 17: extern int GotoP;
! 18: extern char *GotoLabel;
! 19: extern int Osp;
! 20: extern int Sdp;
! 21: extern int ClassTypes[]; /* kclass.c */
! 22: extern struct context *PrimitiveContextp;
! 23: extern struct context *CurrentContextp;
! 24: extern struct dictionary *SystemDictionary;
! 25:
! 26: static char *operatorType(int i);
! 27:
! 28: static char *operatorType(type)
! 29: int type;
! 30: { int i;
! 31: for (i=0; i<Sdp; i++) {
! 32: if (type == (SystemDictionary[i]).obj.lc.ival) {
! 33: return((SystemDictionary[i]).key);
! 34: }
! 35: }
! 36: return("Unknown operator");
! 37: }
! 38:
! 39: /****** primitive functions *****************************************
! 40: the values must be greater than 1. 0 is used for special purposes.*/
! 41: #define Sadd 1
! 42: #define Ssub 2
! 43: #define Smult 3
! 44: #define Sset_up_ring 4
! 45: #define Soptions 6
! 46: #define Sgroebner 7
! 47: #define Sdef 8
! 48: #define Spop 9
! 49: #define Sput 10
! 50: #define Sprint 11
! 51: #define Spstack 12
! 52: #define Sshow_ring 13
! 53: #define Sshow_systemdictionary 15
! 54: #define Slength 16
! 55: #define Sfor 17
! 56: #define Sroll 18
! 57: #define Squit 19
! 58: #define Stest 20 /* this is used for test of new function*/
! 59: #define Sfileopen 23
! 60: #define Sclosefile 24
! 61: #define Sidiv 25
! 62: #define Sdup 26
! 63: #define Smap 27
! 64: #define Sreduction 28
! 65: #define Sreplace 29
! 66: #define SleftBrace 30 /* primitive [ */
! 67: #define SrightBrace 31 /* primitive ] */
! 68: #define Srun 32 /* run from a file */
! 69: #define Sloop 33
! 70: #define Saload 34
! 71: #define Sifelse 35
! 72: #define Sequal 36
! 73: #define Sexec 37
! 74: #define Sset 38
! 75: #define Sget 41
! 76: #define Scopy 43
! 77: #define Sindex 44
! 78: #define Ssystem 45
! 79: #define Sset_order_by_matrix 50
! 80: #define Sshow_user_dictionary 54
! 81: #define Selimination_order 55
! 82: #define Sswitch_function 58
! 83: #define Sprint_switch_status 59
! 84: #define Scat_n 62
! 85: #define Sless 63
! 86: #define Sgreater 64
! 87: #define Swritestring 66
! 88: #define Sset_timer 67
! 89: #define Sspol 68
! 90: #define Susage 69
! 91: #define Sto_records 70
! 92: #define Scoefficients 71
! 93: #define Ssystem_variable 72
! 94: #define Sdata_conversion 73
! 95: #define Sdegree 74
! 96: #define Sinit 75
! 97: #define Sload 76
! 98: #define Seval 77
! 99: #define Shomogenize 78
! 100: #define Sprincipal 79
! 101: #define Spushfile 80
! 102: #define Sdiv 81
! 103: #define Sgoto 82
! 104: #define Sextension 83
! 105: #define Snewstack 84
! 106: #define Ssetstack 85
! 107: #define Sstdstack 86
! 108: #define Slc 87
! 109: #define Src 88
! 110: #define Sgbext 89
! 111: #define Snewcontext 90
! 112: #define Ssetcontext 91
! 113: #define Ssupercontext 92
! 114: #define Ssendmsg 93
! 115: #define Serror 94
! 116: #define Smpzext 95
! 117: #define Ssendmsg2 96
! 118: #define Sprimmsg 97
! 119: #define Ssupmsg2 98
! 120: #define Scclass 99
! 121: #define Scoeff2 100
! 122: /***********************************************/
! 123: void printObject(ob,nl,fp)
! 124: struct object ob;
! 125: int nl;
! 126: FILE *fp;
! 127: /* print the object on the top of the stack. */
! 128: {
! 129:
! 130: int size;
! 131: int i;
! 132: struct tokens *ta;
! 133:
! 134: if (VerboseStack >= 2) {
! 135: /*fprintf(fp,"@@@");*/
! 136: switch (ob.tag) {
! 137: case 0:
! 138: fprintf(fp,"<null> "); /* null object */
! 139: break;
! 140: case Sinteger:
! 141: fprintf(fp,"<integer> ");
! 142: break;
! 143: case Sstring:
! 144: fprintf(fp,"<literal-string> ");
! 145: break;
! 146: case Soperator:
! 147: fprintf(fp,"<operator> ");
! 148: break;
! 149: case Sdollar:
! 150: fprintf(fp,"<string(dollar)> ");
! 151: break;
! 152: case SexecutableArray:
! 153: fprintf(fp,"<executable array> ");
! 154: break;
! 155: case Sarray:
! 156: fprintf(fp,"<array> ");
! 157: break;
! 158: case SleftBraceTag:
! 159: fprintf(fp,"<leftBraceTag> ");
! 160: break;
! 161: case SrightBraceTag:
! 162: fprintf(fp,"<rightBraceTag> ");
! 163: break;
! 164: case Spoly:
! 165: fprintf(fp,"<poly> ");
! 166: break;
! 167: case SarrayOfPOLY:
! 168: fprintf(fp,"<arrayOfPOLY> ");
! 169: break;
! 170: case SmatrixOfPOLY:
! 171: fprintf(fp,"<matrixOfPOLY> ");
! 172: break;
! 173: case Slist:
! 174: fprintf(fp,"<list> ");
! 175: break;
! 176: case Sfile:
! 177: fprintf(fp,"<file> ");
! 178: break;
! 179: case Sring:
! 180: fprintf(fp,"<ring> ");
! 181: break;
! 182: case SuniversalNumber:
! 183: fprintf(fp,"<universalNumber> ");
! 184: break;
! 185: case Sclass:
! 186: fprintf(fp,"<class> ");
! 187: break;
! 188: case SrationalFunction:
! 189: fprintf(fp,"<rationalFunction> ");
! 190: break;
! 191: case Sdouble:
! 192: fprintf(fp,"<double> ");
! 193: break;
! 194: default:
! 195: fprintf(fp,"<Unknown object tag. %d >",ob.tag);
! 196: break;
! 197: }
! 198: }
! 199: switch (ob.tag) {
! 200: case 0:
! 201: fprintf(fp,"%%[null]"); /* null object */
! 202: break;
! 203: case Sinteger:
! 204: fprintf(fp,"%d",ob.lc.ival);
! 205: break;
! 206: case Sstring:
! 207: fprintf(fp,"%s",ob.lc.str);
! 208: break;
! 209: case Soperator:
! 210: fprintf(fp,"%s %%[operator] ",operatorType(ob.lc.ival));
! 211: break;
! 212: case Sdollar:
! 213: if (PrintDollar == 2) {
! 214: fprintf(fp,"(%s)",ob.lc.str);
! 215: } else if (PrintDollar == 0 ) {
! 216: fprintf(fp,"%s",ob.lc.str);
! 217: } else {
! 218: fprintf(fp,"$%s$",ob.lc.str);
! 219: }
! 220: break;
! 221: case SexecutableArray:
! 222: size = ob.rc.ival;
! 223: ta = ob.lc.tokenArray;
! 224: fprintf(fp,"{ ");
! 225: for (i=0; i<size; i++) {
! 226: switch ((ta[i]).kind) {
! 227: case ID:
! 228: fprintf(fp,"<<ID>>%s ",(ta[i]).token);
! 229: break;
! 230: case EXECUTABLE_STRING:
! 231: fprintf(fp,"<<EXECUTABLE_STRING>>{%s} ",(ta[i]).token);
! 232: break;
! 233: case EXECUTABLE_ARRAY:
! 234: printObject((ta[i]).object,nl,fp);
! 235: break;
! 236: case DOLLAR:
! 237: fprintf(fp,"<<STRING(DOLLAR)>>%s ",(ta[i]).token);
! 238: break;
! 239: default:
! 240: fprintf(fp,"Unknown token type\n");
! 241: break;
! 242: }
! 243: }
! 244: fprintf(fp," }");
! 245: break;
! 246: case Sarray:
! 247: printObjectArray(ob,0,fp);
! 248: break;
! 249: case SleftBraceTag:
! 250: fprintf(fp,"[ ");
! 251: break;
! 252: case SrightBraceTag:
! 253: fprintf(fp,"] ");
! 254: break;
! 255: case Spoly:
! 256: fprintf(fp,"%s",KPOLYToString(ob.lc.poly));
! 257: break;
! 258: case SarrayOfPOLY:
! 259: fprintf(fp,"Sorry! The object arrayOfPOLY cannot be printed.");
! 260: break;
! 261: case SmatrixOfPOLY:
! 262: fprintf(fp,"Sorry! The object matrixOfPOLY cannot be printed.");
! 263: break;
! 264: case Slist:
! 265: printObjectList(&ob);
! 266: break;
! 267: case Sfile:
! 268: fprintf(fp,"Name=%s, FILE *=%x ",ob.lc.str,(int) ob.rc.file);
! 269: break;
! 270: case Sring:
! 271: fprintf(fp,"Ring."); KshowRing(KopRingp(ob));
! 272: break;
! 273: case SuniversalNumber:
! 274: fprintf(fp,"%s",coeffToString(ob.lc.universalNumber));
! 275: break;
! 276: case SrationalFunction:
! 277: fprintf(fp,"("); printObject(*(Knumerator(ob)),nl,fp);
! 278: fprintf(fp,")/(");printObject(*(Kdenominator(ob)),nl,fp);
! 279: fprintf(fp,")");
! 280: break;
! 281: case Sclass:
! 282: /* fprintf(fp,"Class: "); */
! 283: fprintClass(fp,ob);
! 284: break;
! 285: case Sdouble:
! 286: fprintf(fp,"%f",KopDouble(ob));
! 287: break;
! 288: default:
! 289: fprintf(fp,"[Unknown object tag.]");
! 290: break;
! 291: }
! 292: if (nl) fprintf(fp,"\n");
! 293: }
! 294:
! 295: void printObjectArray(ob,nl,fp)
! 296: struct object ob;
! 297: int nl;
! 298: FILE *fp;
! 299: {
! 300: int size;
! 301: int i;
! 302: size = ob.lc.ival;
! 303: fprintf(fp,"[ ");
! 304: for (i=0; i<size; i++) {
! 305: if (PrintComma && (i != 0)) {
! 306: fprintf(fp," , ");
! 307: }else{
! 308: fprintf(fp," ");
! 309: }
! 310: printObject((ob.rc.op)[i],0,fp);
! 311: }
! 312: fprintf(fp," ] ");
! 313: if (nl) fprintf(fp,"\n");
! 314: }
! 315:
! 316: void KdefinePrimitiveFunctions() {
! 317: /* It is recommended to sort the follows for performance */
! 318: putPrimitiveFunction("mul",Smult);
! 319: putPrimitiveFunction("add",Sadd);
! 320: putPrimitiveFunction("sub",Ssub);
! 321: putPrimitiveFunction("lt",Sless);
! 322: putPrimitiveFunction("set",Sset);
! 323: putPrimitiveFunction("eq",Sequal);
! 324: putPrimitiveFunction("gt",Sgreater);
! 325: putPrimitiveFunction("QUIT",Squit);
! 326: putPrimitiveFunction("[",SleftBrace);
! 327: putPrimitiveFunction("]",SrightBrace);
! 328: putPrimitiveFunction("bye",Squit);
! 329: putPrimitiveFunction("length",Slength);
! 330: putPrimitiveFunction("for",Sfor);
! 331: putPrimitiveFunction("roll",Sroll);
! 332: putPrimitiveFunction("cat_n",Scat_n);
! 333: putPrimitiveFunction("coefficients",Scoefficients);
! 334: putPrimitiveFunction("copy",Scopy);
! 335: putPrimitiveFunction("data_conversion",Sdata_conversion);
! 336: putPrimitiveFunction("aload",Saload);
! 337: putPrimitiveFunction("def",Sdef);
! 338: putPrimitiveFunction("degree",Sdegree);
! 339: putPrimitiveFunction("elimination_order",Selimination_order);
! 340: putPrimitiveFunction("exec",Sexec);
! 341: putPrimitiveFunction("exit",Squit);
! 342: putPrimitiveFunction("get",Sget);
! 343: putPrimitiveFunction("groebner",Sgroebner);
! 344: putPrimitiveFunction("ifelse",Sifelse);
! 345: putPrimitiveFunction("index",Sindex);
! 346: putPrimitiveFunction("dup",Sdup);
! 347: putPrimitiveFunction("init",Sinit);
! 348: putPrimitiveFunction("loop",Sloop);
! 349: putPrimitiveFunction("options",Soptions);
! 350: putPrimitiveFunction("pop",Spop);
! 351: putPrimitiveFunction("put",Sput);
! 352: putPrimitiveFunction("print",Sprint);
! 353: putPrimitiveFunction("pstack",Spstack);
! 354: putPrimitiveFunction("print_switch_status",Sprint_switch_status);
! 355: putPrimitiveFunction("quit",Squit);
! 356: putPrimitiveFunction("file",Sfileopen);
! 357: putPrimitiveFunction("closefile",Sclosefile);
! 358: putPrimitiveFunction("idiv",Sidiv);
! 359: putPrimitiveFunction("reduction",Sreduction);
! 360: putPrimitiveFunction("replace",Sreplace);
! 361: putPrimitiveFunction("run",Srun);
! 362: putPrimitiveFunction("set_order_by_matrix",Sset_order_by_matrix);
! 363: putPrimitiveFunction("set_timer",Sset_timer);
! 364: putPrimitiveFunction("set_up_ring@",Sset_up_ring);
! 365: putPrimitiveFunction("show_ring",Sshow_ring);
! 366: putPrimitiveFunction("show_systemdictionary",Sshow_systemdictionary);
! 367: putPrimitiveFunction("show_user_dictionary",Sshow_user_dictionary);
! 368: putPrimitiveFunction("spol",Sspol);
! 369: putPrimitiveFunction("switch_function",Sswitch_function);
! 370: putPrimitiveFunction("system",Ssystem);
! 371: putPrimitiveFunction("system_variable",Ssystem_variable);
! 372: putPrimitiveFunction("test",Stest);
! 373: putPrimitiveFunction("map",Smap);
! 374: putPrimitiveFunction("to_records",Sto_records);
! 375: putPrimitiveFunction("Usage",Susage);
! 376: putPrimitiveFunction("load",Sload);
! 377: putPrimitiveFunction("writestring",Swritestring);
! 378: putPrimitiveFunction("eval",Seval);
! 379: putPrimitiveFunction("homogenize",Shomogenize);
! 380: putPrimitiveFunction("principal",Sprincipal);
! 381: putPrimitiveFunction("pushfile",Spushfile);
! 382: putPrimitiveFunction("div",Sdiv);
! 383: putPrimitiveFunction("goto",Sgoto);
! 384: putPrimitiveFunction("extension",Sextension);
! 385: putPrimitiveFunction("newstack",Snewstack);
! 386: putPrimitiveFunction("setstack",Ssetstack);
! 387: putPrimitiveFunction("stdstack",Sstdstack);
! 388: putPrimitiveFunction("lc",Slc);
! 389: putPrimitiveFunction("rc",Src);
! 390: putPrimitiveFunction("gbext",Sgbext);
! 391: putPrimitiveFunction("newcontext",Snewcontext);
! 392: putPrimitiveFunction("setcontext",Ssetcontext);
! 393: putPrimitiveFunction("supercontext",Ssupercontext);
! 394: putPrimitiveFunction("sendmsg",Ssendmsg);
! 395: putPrimitiveFunction("error",Serror);
! 396: putPrimitiveFunction("mpzext",Smpzext);
! 397: putPrimitiveFunction("sendmsg2",Ssendmsg2);
! 398: putPrimitiveFunction("primmsg",Sprimmsg);
! 399: putPrimitiveFunction("supmsg2",Ssupmsg2);
! 400: putPrimitiveFunction("cclass",Scclass);
! 401: putPrimitiveFunction("coeff",Scoeff2);
! 402: }
! 403:
! 404: int executePrimitive(ob)
! 405: struct object ob;
! 406: {
! 407: struct object ob1;
! 408: struct object ob2;
! 409: struct object ob3;
! 410: struct object ob4;
! 411: struct object ob5;
! 412: struct object rob;
! 413: struct object obArray[OB_ARRAY_MAX];
! 414: struct object obArray2[OB_ARRAY_MAX];
! 415: int size;
! 416: int i,j,k,n;
! 417: int status;
! 418: struct tokens *tokenArray;
! 419: struct tokens token;
! 420: FILE *fp;
! 421: char *fname;
! 422: int rank;
! 423: struct object oMat;
! 424: static int timerStart = 1;
! 425: static struct tms before, after;
! 426: static time_t before_real, after_real;
! 427: struct object oInput;
! 428: char *str;
! 429: int ccflag = 0;
! 430: extern int KeepInput;
! 431: extern int History;
! 432: extern struct ring *CurrentRingp;
! 433: extern TimerOn;
! 434:
! 435: if (DebugStack >= 2) {
! 436: fprintf(Fstack,"In execute %d\n",ob.lc.ival); printOperandStack();
! 437: }
! 438:
! 439: if (GotoP) return(0);
! 440: switch (ob.lc.ival) {
! 441: /* Postscript primitives :stack */
! 442: case Sgoto:
! 443: ob1 = Kpop();
! 444: if (ob1.tag != Sstring) {
! 445: if (DebugStack>=2) printObject(ob1,0,Fstack);
! 446: errorStackmachine("Usage:goto");
! 447: }
! 448: GotoLabel = ob1.lc.str;
! 449: GotoP = 1;
! 450: break;
! 451: case Spop:
! 452: ob1 = Kpop();
! 453: break;
! 454:
! 455: case Sdup:
! 456: ob1 = Kpop();
! 457: Kpush(ob1); Kpush(ob1);
! 458: break;
! 459: case Scopy: /* copy values. cf. dup */
! 460: ob1 = Kpop();
! 461: switch(ob1.tag) {
! 462: case Sinteger: break;
! 463: default: errorStackmachine("Usage:copy");
! 464: }
! 465: size = ob1.lc.ival;
! 466: k = 0;
! 467: for (i=size-1; i>=0; i--) {
! 468: ob2 = peek(i+k);
! 469: switch(ob2.tag) {
! 470: case Sdollar: /* copy by value */
! 471: str = (char *)sGC_malloc(strlen(ob2.lc.str)+3);
! 472: if (str == (char *)NULL) errorStackmachine("No memory (copy)");
! 473: strcpy(str,ob2.lc.str);
! 474: Kpush(KpoString(str));
! 475: break;
! 476: case Spoly:
! 477: errorStackmachine("no pCopy (copy)");
! 478: break;
! 479: case Sarray:
! 480: n = ob2.lc.ival;
! 481: ob3 = newObjectArray(n);
! 482: for (j=0; j<n; j++) {
! 483: putoa(ob3,j,getoa(ob2,j));
! 484: }
! 485: Kpush(ob3);
! 486: break;
! 487: default:
! 488: Kpush(ob2);
! 489: break;
! 490: }
! 491: k++;
! 492: }
! 493: break;
! 494: case Sroll:
! 495: ob1 = Kpop();
! 496: ob2 = Kpop();
! 497: switch(ob1.tag) {
! 498: case Sinteger:
! 499: j = ob1.lc.ival;
! 500: break;
! 501: default: errorStackmachine("Usage:roll");
! 502: }
! 503: switch(ob2.tag) {
! 504: case Sinteger:
! 505: n = ob2.lc.ival;
! 506: break;
! 507: default: errorStackmachine("Usage:roll");
! 508: }
! 509: for (i=0; i<n; i++) {
! 510: if (i < OB_ARRAY_MAX) {
! 511: obArray[i] = Kpop();
! 512: }else{
! 513: errorStackmachine("exceeded OB_ARRAY_MAX (roll)\n");
! 514: }
! 515: }
! 516: for (i=0; i<n; i++) {
! 517: k = (j-1)%n;
! 518: k = (k>=0?k: k+n);
! 519: Kpush(obArray[k]);
! 520: j--;
! 521: }
! 522: break;
! 523: case Spstack:
! 524: printOperandStack();
! 525: break;
! 526:
! 527: /* Postscript primitives :arithmetic */
! 528: case Sadd:
! 529: ob1 = Kpop();
! 530: ob2 = Kpop();
! 531: rob = KooAdd(ob1,ob2);
! 532: Kpush(rob);
! 533: break;
! 534: case Ssub:
! 535: ob2 = Kpop();
! 536: ob1 = Kpop();
! 537: rob = KooSub(ob1,ob2);
! 538: Kpush(rob);
! 539: break;
! 540: case Smult:
! 541: ob2 = Kpop();
! 542: ob1 = Kpop();
! 543: rob = KooMult(ob1,ob2);
! 544: Kpush(rob);
! 545: break;
! 546: case Sidiv:
! 547: ob2 = Kpop(); ob1 = Kpop();
! 548: rob = KooDiv(ob1,ob2);
! 549: Kpush(rob);
! 550: break;
! 551:
! 552: case Sdiv:
! 553: ob2 = Kpop(); ob1 = Kpop();
! 554: rob = KooDiv2(ob1,ob2);
! 555: Kpush(rob);
! 556: break;
! 557:
! 558: /* Postscript primitives :array */
! 559: case SleftBrace:
! 560: rob.tag = SleftBraceTag;
! 561: Kpush(rob);
! 562: break;
! 563:
! 564: case SrightBrace:
! 565: size = 0;
! 566: ob1 = peek(size);
! 567: while (!(Osp-size-1 < 0)) { /* while the stack is not underflow */
! 568: if (ob1.tag == SleftBraceTag) {
! 569: rob = newObjectArray(size);
! 570: for (i=0; i<size; i++) {
! 571: (rob.rc.op)[i] = peek(size-1-i);
! 572: }
! 573: for (i=0; i<size+1; i++) {
! 574: Kpop();
! 575: }
! 576: break;
! 577: }
! 578: size++;
! 579: ob1 = peek(size);
! 580: }
! 581: Kpush(rob);
! 582: break;
! 583:
! 584: case Sget:
! 585: /* [a_0 ... a_{n-1}] i get a_i */
! 586: /* ob2 ob1 get */
! 587: ob1 = Kpop();
! 588: ob2 = Kpop();
! 589: switch(ob2.tag) {
! 590: case Sarray: break;
! 591: default: errorStackmachine("Usage:get");
! 592: }
! 593: switch(ob1.tag) {
! 594: case Sinteger: break;
! 595: default: errorStackmachine("Usage:get");
! 596: }
! 597: i =ob1.lc.ival;
! 598: size = getoaSize(ob2);
! 599: if ((0 <= i) && (i<size)) {
! 600: Kpush(getoa(ob2,i));
! 601: }else{
! 602: errorStackmachine("Index is out of bound. (get)\n");
! 603: }
! 604: break;
! 605:
! 606: case Sput:
! 607: /* [a_0 ... a_{n-1}] index any put */
! 608: /* ob3 ob2 ob1 put */
! 609: /* Or; [[a_00 ....] [a_10 ....] ....] [1 0] any put. MultiIndex. */
! 610: ob1 = Kpop(); ob2 = Kpop(); ob3 = Kpop();
! 611: switch(ob2.tag) {
! 612: case Sinteger:
! 613: switch(ob3.tag) {
! 614: case Sarray:
! 615: i = ob2.lc.ival;
! 616: size = getoaSize(ob3);
! 617: if ((0 <= i) && (i<size)) {
! 618: getoa(ob3,i) = ob1;
! 619: }else{
! 620: errorStackmachine("Index is out of bound. (put)\n");
! 621: }
! 622: break;
! 623: case Sdollar:
! 624: i = ob2.lc.ival;
! 625: size = strlen(ob3.lc.str);
! 626: if ((0 <= i) && (i<size)) {
! 627: if (ob1.tag == Sdollar) {
! 628: (ob3.lc.str)[i] = (ob1.lc.str)[0];
! 629: }else{
! 630: (ob3.lc.str)[i] = ob1.lc.ival;
! 631: }
! 632: }else{
! 633: errorStackmachine("Index is out of bound. (put)\n");
! 634: }
! 635: break;
! 636: default: errorStackmachine("Usage:put");
! 637: }
! 638: break;
! 639: case Sarray:
! 640: ob5 = ob3;
! 641: n = getoaSize(ob2);
! 642: for (i=0; i<n; i++) {
! 643: if (ob5.tag != Sarray)
! 644: errorStackmachine("Object pointed by the multi-index is not array (put)\n");
! 645: ob4 = getoa(ob2,i);
! 646: if (ob4.tag != Sinteger)
! 647: errorStackmachine("Index has to be an integer. (put)\n");
! 648: k = ob4.lc.ival;
! 649: size = getoaSize(ob5);
! 650: if ((0 <= k) && (k<size)) {
! 651: if (i == n-1) {
! 652: getoa(ob5,k) = ob1;
! 653: }else{
! 654: ob5 = getoa(ob5,k);
! 655: }
! 656: }else{
! 657: errorStackmachine("Index is out of bound for the multi-index. (put)\n");
! 658: }
! 659: }
! 660: break;
! 661: default: errorStackmachine("Usage:put");
! 662: }
! 663: break;
! 664:
! 665: case Sindex:
! 666: ob1 = Kpop();
! 667: switch(ob1.tag) {
! 668: case Sinteger: break;
! 669: default: errorStackmachine("Usage:index");
! 670: }
! 671: size = ob1.lc.ival;
! 672: Kpush(peek(size-1));
! 673: break;
! 674:
! 675: case Saload:
! 676: /* [a1 a2 ... an] aload a1 a2 ... an [a1 ... an] */
! 677: ob1 = Kpop();
! 678: switch(ob1.tag) {
! 679: case Sarray: break;
! 680: default:
! 681: errorStackmachine("Usage:aload");
! 682: }
! 683: size = getoaSize(ob1);
! 684: for (i=0; i<size; i++) {
! 685: Kpush(getoa(ob1,i));
! 686: }
! 687: Kpush(ob1);
! 688:
! 689: break;
! 690:
! 691: case Slength:
! 692: /* [a_0 ... a_{n-1}] length n */
! 693: /* ob1 length rob */
! 694: ob1 = Kpop();
! 695: switch(ob1.tag) {
! 696: case Sarray:
! 697: size = getoaSize(ob1);
! 698: Kpush(KpoInteger(size));
! 699: break;
! 700: case Sdollar:
! 701: Kpush(KpoInteger(strlen(ob1.lc.str)));
! 702: break;
! 703: case Spoly:
! 704: Kpush(KpoInteger(KpolyLength(KopPOLY(ob1))));
! 705: break;
! 706: default: errorStackmachine("Usage:length");
! 707: }
! 708: break;
! 709:
! 710: /* Postscript primitives :relation */
! 711: case Sequal:
! 712: /* obj1 obj2 == bool */
! 713: ob2 = Kpop();
! 714: ob1 = Kpop();
! 715: if(KooEqualQ(ob1,ob2)) {
! 716: Kpush(KpoInteger(1));
! 717: }else{
! 718: Kpush(KpoInteger(0));
! 719: }
! 720: break;
! 721:
! 722: case Sless:
! 723: /* obj1 obj2 < bool */
! 724: ob2 = Kpop();
! 725: ob1 = Kpop();
! 726: Kpush(KooLess(ob1,ob2));
! 727: break;
! 728:
! 729: case Sgreater:
! 730: /* obj1 obj2 < bool */
! 731: ob2 = Kpop();
! 732: ob1 = Kpop();
! 733: Kpush(KooGreater(ob1,ob2));
! 734: break;
! 735:
! 736:
! 737: /* Postscript primitives :controle */
! 738: case Sloop:
! 739: /* { .... exit .....} loop */
! 740: ob1 = Kpop();
! 741: switch(ob1.tag) {
! 742: case SexecutableArray: break;
! 743: default:
! 744: errorStackmachine("Usage:loop");
! 745: break;
! 746: }
! 747: tokenArray = ob1.lc.tokenArray;
! 748: size = ob1.rc.ival;
! 749: i = 0;
! 750: while (1) {
! 751: token = tokenArray[i];
! 752: /***printf("[token %d]%s\n",i,token.token);*/
! 753: i++;
! 754: if (i >= size) {
! 755: i=0;
! 756: }
! 757: status = executeToken(token);
! 758: if (status || GotoP) break;
! 759: /* here, do not return 1. Do not propagate exit signal outside of the
! 760: loop. */
! 761: }
! 762: break;
! 763:
! 764: case Sfor:
! 765: /* init inc limit { } for */
! 766: /* ob4 ob3 ob2 ob1 */
! 767: ob1 =Kpop(); ob2 = Kpop(); ob3 = Kpop(); ob4 = Kpop();
! 768: switch(ob1.tag) {
! 769: case SexecutableArray: break;
! 770: default: errorStackmachine("Usage:for");
! 771: }
! 772: switch(ob2.tag) {
! 773: case Sinteger: break;
! 774: default:
! 775: errorStackmachine("Usage:for The 3rd argument must be integer.");
! 776: }
! 777: switch(ob3.tag) {
! 778: case Sinteger: break;
! 779: default: errorStackmachine("Usage:for The 2nd argument must be integer.");
! 780: }
! 781: switch(ob4.tag) {
! 782: case Sinteger: break;
! 783: default: errorStackmachine("Usage:for The 1st argument must be integer.");
! 784: }
! 785: {
! 786: int i,lim,inc,j;
! 787: i = ob4.lc.ival;
! 788: lim = ob2.lc.ival;
! 789: inc = ob3.lc.ival;
! 790: if (inc > 0) {
! 791: /*
! 792: if (lim < i) errorStackmachine("The initial value must not be greater than limit value (for).\n");
! 793: */
! 794: for ( ; i<=lim; i += inc) {
! 795: Kpush(KpoInteger(i));
! 796: tokenArray = ob1.lc.tokenArray;
! 797: size = ob1.rc.ival;
! 798: for (j=0; j<size; j++) {
! 799: status = executeToken(tokenArray[j]);
! 800: if (status || GotoP) goto xyz;
! 801: }
! 802: }
! 803: }else{
! 804: /*
! 805: if (lim > i) errorStackmachine("The initial value must not be less than limit value (for).\n");
! 806: */
! 807: for ( ; i>=lim; i += inc) {
! 808: Kpush(KpoInteger(i));
! 809: tokenArray = ob1.lc.tokenArray;
! 810: size = ob1.rc.ival;
! 811: for (j=0; j<size; j++) {
! 812: status = executeToken(tokenArray[j]);
! 813: if (status || GotoP) goto xyz;
! 814: }
! 815: }
! 816: }
! 817: xyz: ;
! 818: }
! 819: break;
! 820:
! 821: case Smap:
! 822: ob2 = Kpop(); ob1 = Kpop();
! 823: switch(ob1.tag) {
! 824: case Sarray: break;
! 825: default:
! 826: errorStackmachine("Usage:map The 1st argument must be an array.");
! 827: break;
! 828: }
! 829: switch(ob2.tag) {
! 830: case SexecutableArray: break;
! 831: default:
! 832: errorStackmachine("Usage:map The 2nd argument must be an executable array.");
! 833: break;
! 834: }
! 835: { int osize,size;
! 836: int i,j;
! 837: osize = getoaSize(ob1);
! 838:
! 839: /*KSexecuteString("[");*/
! 840: rob.tag = SleftBraceTag;
! 841: Kpush(rob);
! 842:
! 843: for (i=0; i<osize; i++) {
! 844: Kpush(getoa(ob1,i));
! 845: tokenArray = ob2.lc.tokenArray;
! 846: size = ob2.rc.ival;
! 847: for (j=0; j<size; j++) {
! 848: status = executeToken(tokenArray[j]);
! 849: if (status) goto foor;
! 850: }
! 851: }
! 852: foor: ;
! 853: /*KSexecuteString("]");*/
! 854: {
! 855: size = 0;
! 856: ob1 = peek(size);
! 857: while (!(Osp-size-1 < 0)) { /* while the stack is not underflow */
! 858: if (ob1.tag == SleftBraceTag) {
! 859: rob = newObjectArray(size);
! 860: for (i=0; i<size; i++) {
! 861: (rob.rc.op)[i] = peek(size-1-i);
! 862: }
! 863: for (i=0; i<size+1; i++) {
! 864: Kpop();
! 865: }
! 866: break;
! 867: }
! 868: size++;
! 869: ob1 = peek(size);
! 870: }
! 871: Kpush(rob);
! 872: }
! 873: }
! 874: break;
! 875:
! 876:
! 877: case Sifelse:
! 878: /* bool { } { } ifelse */
! 879: ob1 = Kpop();
! 880: ob2 = Kpop();
! 881: ob3 = Kpop();
! 882: switch (ob1.tag) {
! 883: case SexecutableArray: break;
! 884: default: errorStackmachine("Usage:ifelse");
! 885: }
! 886: switch (ob2.tag) {
! 887: case SexecutableArray: break;
! 888: default: errorStackmachine("Usage:ifelse");
! 889: }
! 890: switch (ob3.tag) {
! 891: case Sinteger: break;
! 892: default: errorStackmachine("Usage:ifelse");
! 893: }
! 894: if (ob3.lc.ival) {
! 895: /* execute ob2 */
! 896: ob1 = ob2;
! 897: }
! 898: /* execute ob1 */
! 899: tokenArray = ob1.lc.tokenArray;
! 900: size = ob1.rc.ival;
! 901: for (i=0; i<size; i++) {
! 902: token = tokenArray[i];
! 903: status = executeToken(token);
! 904: if (status != 0) return(status);
! 905: }
! 906:
! 907: break;
! 908:
! 909: case Sexec:
! 910: /* { .........} exec */
! 911: ob1 = Kpop();
! 912: switch(ob1.tag) {
! 913: case SexecutableArray: break;
! 914: default: errorStackmachine("Usage:exec");
! 915: }
! 916: tokenArray = ob1.lc.tokenArray;
! 917: size = ob1.rc.ival;
! 918: for (i=0; i<size; i++) {
! 919: token = tokenArray[i];
! 920: /***printf("[token %d]%s\n",i,token.token);*/
! 921: status = executeToken(token);
! 922: if (status != 0) break;
! 923: }
! 924: break;
! 925:
! 926: /* Postscript primitives :dictionary */
! 927: case Sdef:
! 928: ob2 = Kpop();
! 929: ob1 = Kpop();
! 930: /* type check */
! 931: switch(ob1.tag) {
! 932: case Sstring: break;
! 933: default:
! 934: errorStackmachine("Usage:def");
! 935: break;
! 936: }
! 937: k=putUserDictionary(ob1.lc.str,(ob1.rc.op->lc).ival,
! 938: (ob1.rc.op->rc).ival,ob2,
! 939: CurrentContextp->userDictionary);
! 940: if (k < 0) {
! 941: str = (char *)sGC_malloc(sizeof(char)*(strlen(ob1.lc.str) + 256));
! 942: if (str == (char *)NULL) {
! 943: errorStackmachine("No memory.\n");
! 944: }
! 945: if (k == -PROTECT) {
! 946: sprintf(str,"You rewrited the protected symbol %s.\n",ob1.lc.str);
! 947: /* cf. [(chattr) num sym] extension */
! 948: warningStackmachine(str);
! 949: } else if (k == -ABSOLUTE_PROTECT) {
! 950: sprintf(str,"You cannot rewrite the protected symbol %s.\n",ob1.lc.str);
! 951: errorStackmachine(str);
! 952: } else errorStackmachine("Unknown return value of putUserDictioanry\n");
! 953: }
! 954: break;
! 955:
! 956: case Sload:
! 957: ob1 = Kpop();
! 958: switch(ob1.tag) {
! 959: case Sstring: break;
! 960: default: errorStackmachine("Usage:load");
! 961: }
! 962: ob1 = findUserDictionary(ob1.lc.str,
! 963: (ob1.rc.op->lc).ival,
! 964: (ob1.rc.op->rc).ival,
! 965: CurrentContextp);
! 966: if (ob1.tag == -1) Kpush(NullObject);
! 967: else Kpush(ob1);
! 968:
! 969: break;
! 970:
! 971: case Sset:
! 972: ob1 = Kpop();
! 973: ob2 = Kpop();
! 974: switch(ob1.tag) {
! 975: case Sstring: break;
! 976: default: errorStackmachine("Usage:set");
! 977: }
! 978: k= putUserDictionary(ob1.lc.str,(ob1.rc.op->lc).ival,
! 979: (ob1.rc.op->rc).ival,ob2,
! 980: CurrentContextp->userDictionary);
! 981: if (k < 0) {
! 982: str = (char *)sGC_malloc(sizeof(char)*(strlen(ob1.lc.str) + 256));
! 983: if (str == (char *)NULL) {
! 984: errorStackmachine("No memory.\n");
! 985: }
! 986: if (k == -PROTECT) {
! 987: sprintf(str,"You rewrited the protected symbol %s. \n",ob1.lc.str);
! 988: warningStackmachine(str);
! 989: } else if (k == -ABSOLUTE_PROTECT) {
! 990: sprintf(str,"You cannot rewrite the protected symbol %s.\n",ob1.lc.str);
! 991: errorStackmachine(str);
! 992: } else errorStackmachine("Unknown return value of putUserDictioanry\n");
! 993: }
! 994: break;
! 995:
! 996:
! 997: case Sshow_systemdictionary:
! 998: fprintf(Fstack,"------------- system dictionary -------------------\n");
! 999: showSystemDictionary(0);
! 1000: break;
! 1001:
! 1002: case Sshow_user_dictionary:
! 1003: showUserDictionary();
! 1004: break;
! 1005:
! 1006:
! 1007:
! 1008: /* Postscript primitives : convert */
! 1009: case Sdata_conversion:
! 1010: ob2 = Kpop();
! 1011: ob1 = Kpop();
! 1012: switch(ob2.tag) {
! 1013: case Sdollar:
! 1014: if (ob1.tag != Sclass) {
! 1015: rob = KdataConversion(ob1,ob2.lc.str);
! 1016: }else{
! 1017: rob = KclassDataConversion(ob1,ob2);
! 1018: }
! 1019: break;
! 1020: case Sarray:
! 1021: rob = KclassDataConversion(ob1,ob2); break;
! 1022: default: errorStackmachine("Usage:data_conversion");
! 1023: }
! 1024: Kpush(rob);
! 1025: break;
! 1026:
! 1027:
! 1028: /* Postscript ptimitives :file */
! 1029: case Srun:
! 1030: ob1 = Kpop();
! 1031: switch(ob1.tag) {
! 1032: case Sdollar: break;
! 1033: case Sstring: break;
! 1034: default:
! 1035: errorStackmachine("Usage:run");
! 1036: break;
! 1037: }
! 1038: getokenSM(OPEN,ob1.lc.str); /* open the file, $filename$ run */
! 1039: break;
! 1040:
! 1041: case Sprint:
! 1042: ob1 = Kpop();
! 1043: printObject(ob1,0,Fstack);
! 1044: break;
! 1045:
! 1046: case Sfileopen: /* filename mode file descripter */
! 1047: /* ob2 ob1 */
! 1048: ob1 = Kpop();
! 1049: ob2 = Kpop();
! 1050: switch(ob1.tag) {
! 1051: case Sdollar: break;
! 1052: default: errorStackmachine("Usage:file");
! 1053: }
! 1054: switch(ob2.tag) {
! 1055: case Sinteger: break;
! 1056: case Sdollar: break;
! 1057: default:errorStackmachine("Usage:file");
! 1058: }
! 1059: rob = NullObject;
! 1060: if (ob2.tag == Sdollar) {
! 1061: if (strcmp(ob2.lc.str,"%stdin") == 0) {
! 1062: rob.tag = Sfile; rob.lc.str="%stdin"; rob.rc.file = stdin;
! 1063: }else if (strcmp(ob2.lc.str,"%stdout") == 0) {
! 1064: rob.tag = Sfile; rob.lc.str="%stdout"; rob.rc.file = stdout;
! 1065: }else if (strcmp(ob2.lc.str,"%stderr") == 0) {
! 1066: rob.tag = Sfile; rob.lc.str="%stderr"; rob.rc.file = stderr;
! 1067: }else if ( (rob.rc.file = fopen(ob2.lc.str,ob1.lc.str)) != (FILE *)NULL) {
! 1068: rob.tag = Sfile; rob.lc.str = ob2.lc.str;
! 1069: }else {
! 1070: errorStackmachine("I cannot open the file.");
! 1071: }
! 1072: }else {
! 1073: rob.rc.file = fdopen(ob2.lc.ival,ob1.lc.str);
! 1074: if ( rob.rc.file != (FILE *)NULL) {
! 1075: rob.tag = Sfile; rob.lc.ival = ob2.lc.ival;
! 1076: }else{
! 1077: errorStackmachine("I cannot fdopen the given fd.");
! 1078: }
! 1079: }
! 1080:
! 1081: Kpush(rob);
! 1082: break;
! 1083:
! 1084:
! 1085: case Swritestring:
! 1086: /* file string writestring
! 1087: ob2 ob1
! 1088: */
! 1089: ob1 = Kpop();
! 1090: ob2 = Kpop();
! 1091: switch(ob2.tag) {
! 1092: case Sfile: break;
! 1093: default: errorStackmachine("Usage:writestring");
! 1094: }
! 1095: switch(ob1.tag) {
! 1096: case Sdollar: break;
! 1097: default: errorStackmachine("Usage:writestring");
! 1098: }
! 1099: fprintf(ob2.rc.file,"%s",ob1.lc.str);
! 1100: break;
! 1101:
! 1102: case Sclosefile:
! 1103: ob1 = Kpop();
! 1104: switch(ob1.tag) {
! 1105: case Sfile: break;
! 1106: default: errorStackmachine("Usage:closefile");
! 1107: }
! 1108: if (fclose(ob1.rc.file) == EOF) {
! 1109: errorStackmachine("I couldn't close the file.\n");
! 1110: }
! 1111: break;
! 1112:
! 1113: case Spushfile: /* filename pushfile string */
! 1114: /* ob2 */
! 1115: ob2 = Kpop();
! 1116: switch(ob2.tag) {
! 1117: case Sdollar: break;
! 1118: default:errorStackmachine("Usage:pushfile");
! 1119: }
! 1120: rob = NullObject;
! 1121: if (strcmp(ob2.lc.str,"%stdin") == 0) {
! 1122: ob1.tag = Sfile; ob1.lc.str="%stdin"; ob1.rc.file = stdin;
! 1123: }else if (strcmp(ob2.lc.str,"%stdout") == 0) {
! 1124: ob1.tag = Sfile; ob1.lc.str="%stdout"; ob1.rc.file = stdout;
! 1125: }else if (strcmp(ob2.lc.str,"%stderr") == 0) {
! 1126: ob1.tag = Sfile; ob1.lc.str="%stderr"; ob1.rc.file = stderr;
! 1127: }else if ( (ob1.rc.file = fopen(ob2.lc.str,"r")) != (FILE *)NULL) {
! 1128: ob1.tag = Sfile; ob1.lc.str = ob2.lc.str;
! 1129: }else {
! 1130: if (ob1.rc.file == (FILE *)NULL) {
! 1131: char fname2[1024];
! 1132: strcpy(fname2,getLOAD_SM1_PATH());
! 1133: strcat(fname2,ob2.lc.str);
! 1134: ob1.rc.file = fopen(fname2,"r");
! 1135: if (ob1.rc.file == (FILE *)NULL) {
! 1136: strcpy(fname2,LOAD_SM1_PATH);
! 1137: strcat(fname2,ob2.lc.str);
! 1138: ob1.rc.file = fopen(fname2,"r");
! 1139: if (ob1.rc.file == (FILE *)NULL) {
! 1140: fprintf(stderr,"Warning: Cannot open the file <<%s>> for loading in the current directory nor the library directories %s and %s.\n",ob2.lc.str,getLOAD_SM1_PATH(),LOAD_SM1_PATH);
! 1141: errorStackmachine("I cannot open the file.");
! 1142: }
! 1143: }
! 1144: }
! 1145: }
! 1146:
! 1147: /* read the strings
! 1148: */
! 1149: n = 256; j=0;
! 1150: rob.tag = Sdollar; rob.lc.str = (char *) sGC_malloc(sizeof(char)*n);
! 1151: if (rob.lc.str == (char *)NULL) errorStackmachine("No more memory.");
! 1152: while ((i = fgetc(ob1.rc.file)) != EOF) {
! 1153: if (j >= n-1) {
! 1154: n = 2*n;
! 1155: if (n <= 0) errorStackmachine("Too large file to put on the stack.");
! 1156: str = (char *)sGC_malloc(sizeof(char)*n);
! 1157: if (str == (char *)NULL) errorStackmachine("No more memory.");
! 1158: for (k=0; k< n/2; k++) str[k] = (rob.lc.str)[k];
! 1159: rob.lc.str = str;
! 1160: }
! 1161: (rob.lc.str)[j] = i; (rob.lc.str)[j+1] = '\0';
! 1162: j++;
! 1163: }
! 1164:
! 1165: fclose(ob1.rc.file);
! 1166: Kpush(rob);
! 1167: break;
! 1168:
! 1169: /* Postscript primitives :misc */
! 1170: case Squit:
! 1171: Kclose(); stackmachine_close();
! 1172: exit(0);
! 1173: break;
! 1174:
! 1175: case Ssystem:
! 1176: ob1 = Kpop();
! 1177: switch(ob1.tag) {
! 1178: case Sdollar: break;
! 1179: case Sstring: break;
! 1180: default: errorStackmachine("Usage:system");
! 1181: }
! 1182: system( ob1.lc.str );
! 1183: break;
! 1184:
! 1185: case Scat_n:
! 1186: ob1 = Kpop();
! 1187: switch(ob1.tag) {
! 1188: case Sinteger: break;
! 1189: default: errorStackmachine("Usage:cat_n");
! 1190: }
! 1191: size = ob1.lc.ival;
! 1192: k = 0;
! 1193: for (i=size-1; i>=0; i--) {
! 1194: ob2 = peek(i);
! 1195: switch(ob2.tag) {
! 1196: case Sdollar: break;
! 1197: default: errorStackmachine("Usage:cat_n");
! 1198: }
! 1199: k += strlen(ob2.lc.str);
! 1200: }
! 1201: ob1.tag = Sdollar;
! 1202: ob1.lc.str = (char *)sGC_malloc(sizeof(char)*(k+1));
! 1203: if (ob1.lc.str == (char *)NULL) {
! 1204: errorStackmachine("No more memory.\n");
! 1205: }
! 1206: /* concatnate */
! 1207: k = 0;
! 1208: for (i=size-1; i>=0; i--) {
! 1209: ob2 = peek(i);
! 1210: strcpy(&((ob1.lc.str)[k]),ob2.lc.str);
! 1211: k = strlen(ob1.lc.str);
! 1212: }
! 1213: /* clear the arguments */
! 1214: for (i=size-1; i>=0; i--) {
! 1215: ob2 = Kpop();
! 1216: }
! 1217: Kpush(ob1);
! 1218: break;
! 1219:
! 1220: case Sset_timer:
! 1221: /* 118p */
! 1222: if (timerStart) {
! 1223: before_real = time(&before_real);
! 1224: times(&before);
! 1225: timerStart = 0; TimerOn = 1;
! 1226: }else{
! 1227: times(&after);
! 1228: after_real = time(&after_real);
! 1229: if (TimerOn) {
! 1230: printf("User time: %f seconds, System time: %f seconds, Real time: %d s\n",
! 1231: ((double)(after.tms_utime - before.tms_utime)) /100.0,
! 1232: ((double)(after.tms_stime - before.tms_stime)) /100.0,
! 1233: (int) (after_real-before_real));
! 1234: /* In cases of Solaris and Linux, the unit of tms_utime seems to
! 1235: be given 0.01 seconds. */
! 1236:
! 1237: }
! 1238: timerStart = 1; TimerOn = 0;
! 1239: }
! 1240: break;
! 1241:
! 1242: case Susage:
! 1243: ob1 = Kpop();
! 1244: Kusage(ob1);
! 1245: break;
! 1246:
! 1247: case Sto_records:
! 1248: ob1 = Kpop();
! 1249: switch(ob1.tag) {
! 1250: case Sdollar: break;
! 1251: default: errorStackmachine("Usage:to_records");
! 1252: }
! 1253: ob2 = KtoRecords(ob1);
! 1254: size = getoaSize(ob2);
! 1255: for (i=0; i<size; i++) {
! 1256: Kpush(getoa(ob2,i));
! 1257: }
! 1258: rob.tag = Sinteger;
! 1259: rob.lc.ival = size;
! 1260: Kpush(rob);
! 1261: break;
! 1262:
! 1263: case Ssystem_variable:
! 1264: ob1 = Kpop();
! 1265: switch(ob1.tag) {
! 1266: case Sarray: break;
! 1267: default: errorStackmachine("Usage:system_variable");
! 1268: }
! 1269: Kpush(KsystemVariable(ob1));
! 1270: break;
! 1271:
! 1272: /* kan primitives :kan :ring */
! 1273: case Sset_order_by_matrix:
! 1274: ob1 = Kpop();
! 1275: KsetOrderByObjArray(ob1);
! 1276: break;
! 1277: case Sset_up_ring:
! 1278: ob5 = Kpop(); ob4=Kpop(); ob3=Kpop(); ob2=Kpop(); ob1=Kpop();
! 1279: KsetUpRing(ob1,ob2,ob3,ob4,ob5);
! 1280: break;
! 1281: case Sshow_ring:
! 1282: KshowRing(CurrentRingp);
! 1283: break;
! 1284: case Sswitch_function:
! 1285: ob1 = Kpop();
! 1286: ob2 = Kpop();
! 1287: ob3 = KswitchFunction(ob2,ob1);
! 1288: if (!isNullObject(ob3)) {
! 1289: Kpush(ob3);
! 1290: }
! 1291: break;
! 1292: case Sprint_switch_status:
! 1293: KprintSwitchStatus();
! 1294: break;
! 1295: case Sreplace:
! 1296: ob2 = Kpop();
! 1297: ob1 = Kpop();
! 1298: Kpush(KoReplace(ob1,ob2));
! 1299: break;
! 1300:
! 1301: case Scoefficients:
! 1302: ob2 = Kpop();
! 1303: ob1 = Kpop();
! 1304: Kpush(Kparts(ob1,ob2));
! 1305: break;
! 1306:
! 1307: case Scoeff2:
! 1308: ob2 = Kpop();
! 1309: ob1 = Kpop();
! 1310: Kpush(Kparts2(ob1,ob2));
! 1311: break;
! 1312:
! 1313: case Sdegree:
! 1314: ob2 = Kpop();
! 1315: ob1 = Kpop();
! 1316: Kpush(Kdegree(ob1,ob2));
! 1317: break;
! 1318: case Sspol:
! 1319: ob2 = Kpop();
! 1320: ob1 = Kpop();
! 1321: Kpush(Ksp(ob1,ob2));
! 1322: break;
! 1323:
! 1324: case Seval:
! 1325: ob1 = Kpop();
! 1326: Kpush(Keval(ob1));
! 1327: break;
! 1328:
! 1329: case Sreduction:
! 1330: ob2 = Kpop();
! 1331: ob1 = Kpop();
! 1332: Kpush(Kreduction(ob1,ob2));
! 1333: break;
! 1334:
! 1335: case Sgroebner :
! 1336: ob1 = Kpop();
! 1337: Kpush(Kgroebner(ob1));
! 1338: break;
! 1339:
! 1340: case Shomogenize :
! 1341: ob1 = Kpop();
! 1342: Kpush(homogenizeObject(ob1,&i));
! 1343: break;
! 1344:
! 1345: case Sprincipal :
! 1346: ob1 = Kpop();
! 1347: Kpush(oPrincipalPart(ob1));
! 1348: break;
! 1349:
! 1350: case Sinit:
! 1351: ob2 = Kpop();
! 1352: if (ob2.tag != Sarray) {
! 1353: Kpush(Khead(ob2));
! 1354: }else{
! 1355: ob1 = Kpop();
! 1356: Kpush(oInitW(ob1,ob2));
! 1357: }
! 1358: break;
! 1359:
! 1360: case Sextension:
! 1361: ob1 = Kpop();
! 1362: Kpush(Kextension(ob1));
! 1363: break;
! 1364:
! 1365: case Sgbext:
! 1366: ob1 = Kpop();
! 1367: Kpush(KgbExtension(ob1));
! 1368: break;
! 1369:
! 1370: case Snewstack:
! 1371: ob1 = Kpop();
! 1372: switch(ob1.tag) {
! 1373: case Sinteger:
! 1374: Kpush(newOperandStack(ob1.lc.ival));
! 1375: break;
! 1376: default:
! 1377: errorStackmachine("Usage:newstack");
! 1378: break;
! 1379: }
! 1380: break;
! 1381:
! 1382: case Ssetstack:
! 1383: ob1 = Kpop();
! 1384: switch(ob1.tag) {
! 1385: case Sclass:
! 1386: setOperandStack(ob1);
! 1387: break;
! 1388: default:
! 1389: errorStackmachine("Usage:setstack");
! 1390: break;
! 1391: }
! 1392: break;
! 1393:
! 1394: case Sstdstack:
! 1395: stdOperandStack();
! 1396: break;
! 1397:
! 1398: case Slc:
! 1399: ob1 = Kpop();
! 1400: switch (ob1.tag) {
! 1401: case Sclass:
! 1402: Kpush(KpoInteger(ob1.lc.ival));
! 1403: break;
! 1404: default:
! 1405: errorStackmachine("Usage:lc");
! 1406: break;
! 1407: }
! 1408: break;
! 1409:
! 1410: case Src:
! 1411: ob1 = Kpop();
! 1412: switch (ob1.tag) {
! 1413: case Sclass:
! 1414: if (ClassTypes[ob1.lc.ival] == CLASS_OBJ) {
! 1415: Kpush(*(ob1.rc.op));
! 1416: }else{
! 1417: warningStackmachine("<<obj rc >> works only for a class object with CLASS_OBJ attribute.\n");
! 1418: Kpush(ob1);
! 1419: }
! 1420: break;
! 1421: default:
! 1422: errorStackmachine("Usage:rc");
! 1423: break;
! 1424: }
! 1425: break;
! 1426:
! 1427: case Snewcontext:
! 1428: ob1 = Kpop();
! 1429: ob2 = Kpop();
! 1430: switch(ob1.tag) {
! 1431: case Sclass:
! 1432: if (ob2.tag == Sdollar) {
! 1433: Kpush(KnewContext(ob1,KopString(ob2)));
! 1434: }else errorStackmachine("Usage:newcontext");
! 1435: break;
! 1436: default:
! 1437: errorStackmachine("Usage:newcontext");
! 1438: break;
! 1439: }
! 1440: break;
! 1441:
! 1442: case Ssetcontext:
! 1443: ob1 = Kpop();
! 1444: switch(ob1.tag) {
! 1445: case Sclass:
! 1446: KsetContext(ob1);
! 1447: break;
! 1448: default:
! 1449: errorStackmachine("Usage:setcontext");
! 1450: break;
! 1451: }
! 1452: break;
! 1453:
! 1454: case Ssupercontext:
! 1455: ob1 = Kpop();
! 1456: switch(ob1.tag) {
! 1457: case Sclass:
! 1458: Kpush(getSuperContext(ob1));
! 1459: break;
! 1460: default:
! 1461: errorStackmachine("Usage:supercontext");
! 1462: break;
! 1463: }
! 1464: break;
! 1465:
! 1466: case Ssendmsg:
! 1467: /* ob2 { .........} sendmsg */
! 1468: /* cf. debug/kobj.sm1 */
! 1469: ob1 = Kpop();
! 1470: ob2 = Kpop();
! 1471: switch(ob1.tag) {
! 1472: case SexecutableArray: break;
! 1473: default: errorStackmachine("Usage:sendmsg");
! 1474: }
! 1475: ccflag = 0;
! 1476: if (ob2.tag == Sarray ) {
! 1477: if (getoaSize(ob2) >= 1) {
! 1478: ob3 = getoa(ob2,0);
! 1479: if (ectag(ob3) == CLASSNAME_CONTEXT) {
! 1480: contextControl(CCPUSH); ccflag = 1; /* push the current context. */
! 1481: CurrentContextp = (struct context *)ecbody(ob3);
! 1482: }
! 1483: }
! 1484: }
! 1485: if (!ccflag) {
! 1486: contextControl(CCPUSH); ccflag = 1;
! 1487: CurrentContextp = PrimitiveContextp;
! 1488: }
! 1489: /* normal exec. */
! 1490: Kpush(ob2);
! 1491: tokenArray = ob1.lc.tokenArray;
! 1492: size = ob1.rc.ival;
! 1493: for (i=0; i<size; i++) {
! 1494: token = tokenArray[i];
! 1495: status = executeToken(token);
! 1496: if (status != 0) break;
! 1497: }
! 1498: if (ccflag) {
! 1499: contextControl(CCPOP); ccflag = 0; /* recover the Current context. */
! 1500: }
! 1501:
! 1502: break;
! 1503: case Ssendmsg2:
! 1504: /* ob2 ob4 { .........} sendmsg2 */
! 1505: /* Context is determined by ob2 or ob1 */
! 1506: ob1 = Kpop();
! 1507: ob4 = Kpop();
! 1508: ob2 = Kpop();
! 1509: switch(ob1.tag) {
! 1510: case SexecutableArray: break;
! 1511: default: errorStackmachine("Usage:sendmsg2");
! 1512: }
! 1513: ccflag = 0;
! 1514: if (ob2.tag == Sarray ) {
! 1515: if (getoaSize(ob2) >= 1) {
! 1516: ob3 = getoa(ob2,0);
! 1517: if (ectag(ob3) == CLASSNAME_CONTEXT) {
! 1518: contextControl(CCPUSH); ccflag = 1; /* push the current context. */
! 1519: CurrentContextp = (struct context *)ecbody(ob3);
! 1520: }
! 1521: }
! 1522: }
! 1523: if (!ccflag && ob4.tag == Sarray) {
! 1524: if (getoaSize(ob4) >= 1) {
! 1525: ob3 = getoa(ob4,0);
! 1526: if (ectag(ob3) == CLASSNAME_CONTEXT) {
! 1527: contextControl(CCPUSH); ccflag = 1; /* push the current context. */
! 1528: CurrentContextp = (struct context *)ecbody(ob3);
! 1529: }
! 1530: }
! 1531: }
! 1532: if (!ccflag) {
! 1533: contextControl(CCPUSH); ccflag = 1;
! 1534: CurrentContextp = PrimitiveContextp;
! 1535: }
! 1536: /* normal exec. */
! 1537: Kpush(ob2); Kpush(ob4);
! 1538: tokenArray = ob1.lc.tokenArray;
! 1539: size = ob1.rc.ival;
! 1540: for (i=0; i<size; i++) {
! 1541: token = tokenArray[i];
! 1542: status = executeToken(token);
! 1543: if (status != 0) break;
! 1544: }
! 1545: if (ccflag) {
! 1546: contextControl(CCPOP); ccflag = 0;
! 1547: /* recover the Current context. */
! 1548: /* Note that it is not recovered in case of error. */
! 1549: }
! 1550:
! 1551: break;
! 1552: case Sprimmsg:
! 1553: /* { .........} primmsg */
! 1554: /* Context is PrimitiveContext. */
! 1555: ob1 = Kpop();
! 1556: switch(ob1.tag) {
! 1557: case SexecutableArray: break;
! 1558: default: errorStackmachine("Usage:primmsg");
! 1559: }
! 1560: contextControl(CCPUSH); ccflag = 1;
! 1561: CurrentContextp = PrimitiveContextp;
! 1562: /* normal exec. */
! 1563: tokenArray = ob1.lc.tokenArray;
! 1564: size = ob1.rc.ival;
! 1565: for (i=0; i<size; i++) {
! 1566: token = tokenArray[i];
! 1567: status = executeToken(token);
! 1568: if (status != 0) break;
! 1569: }
! 1570:
! 1571: contextControl(CCPOP); /* recover the Current context. */
! 1572: break;
! 1573:
! 1574: case Ssupmsg2:
! 1575: /* ob2 ob4 { .........} supmsg2 */
! 1576: /* Context is super class of ob2 */
! 1577: ob1 = Kpop();
! 1578: ob4 = Kpop();
! 1579: ob2 = Kpop();
! 1580: switch(ob1.tag) {
! 1581: case SexecutableArray: break;
! 1582: default: errorStackmachine("Usage:supmsg2");
! 1583: }
! 1584: ccflag = 0;
! 1585: if (ob2.tag == Sarray ) {
! 1586: if (getoaSize(ob2) >= 1) {
! 1587: ob3 = getoa(ob2,0);
! 1588: if (ectag(ob3) == CLASSNAME_CONTEXT) {
! 1589: if (((struct context *)ecbody(ob3))->super == NULL) {
! 1590: errorStackmachine("supmsg2: SuperClass is NIL.");
! 1591: }
! 1592: contextControl(CCPUSH); ccflag = 1; /* push the current context. */
! 1593: CurrentContextp = ((struct context *)ecbody(ob3))->super;
! 1594: }
! 1595: }
! 1596: }
! 1597: if (!ccflag && (ob4.tag == Sarray) ) {
! 1598: if (getoaSize(ob4) >= 1) {
! 1599: ob3 = getoa(ob4,0);
! 1600: if (ectag(ob3) == CLASSNAME_CONTEXT) {
! 1601: if (((struct context *)ecbody(ob3))->super == NULL) {
! 1602: errorStackmachine("supmsg2: SuperClass is NIL.");
! 1603: }
! 1604: contextControl(CCPUSH); ccflag = 1; /* push the current context. */
! 1605: CurrentContextp = ((struct context *)ecbody(ob3))->super;
! 1606: }
! 1607: }
! 1608: }
! 1609: if (!ccflag) {
! 1610: contextControl(CCPUSH); ccflag = 1;
! 1611: CurrentContextp = PrimitiveContextp;
! 1612: }
! 1613: /* normal exec. */
! 1614: Kpush(ob2); Kpush(ob4);
! 1615: tokenArray = ob1.lc.tokenArray;
! 1616: size = ob1.rc.ival;
! 1617: for (i=0; i<size; i++) {
! 1618: token = tokenArray[i];
! 1619: status = executeToken(token);
! 1620: if (status != 0) break;
! 1621: }
! 1622: if (ccflag) {
! 1623: contextControl(CCPOP); ccflag = 0; /* recover the Current context. */
! 1624: }
! 1625:
! 1626: break;
! 1627:
! 1628: case Serror:
! 1629: ob1 = peek(0);
! 1630: if (ob1.tag == Sdollar) {
! 1631: /* compose error message */
! 1632: ob = Kpop();
! 1633: str = (char *) sGC_malloc(sizeof(char)*(strlen("error operator : ")+
! 1634: strlen(KopString(ob1))+ 10));
! 1635: if (str == NULL) errorStackmachine("No more memory.");
! 1636: strcpy(str,"error operator : ");
! 1637: strcat(str,KopString(ob1));
! 1638: errorStackmachine(str);
! 1639: }else{
! 1640: errorStackmachine("error operator.");
! 1641: }
! 1642: break;
! 1643: case Smpzext:
! 1644: ob1 = Kpop();
! 1645: Kpush(KmpzExtension(ob1));
! 1646: break;
! 1647:
! 1648: case Scclass:
! 1649: ob3 = Kpop();
! 1650: ob2 = Kpop();
! 1651: ob1 = Kpop();
! 1652: /* [class-tag super-obj] size [class-tag] cclass */
! 1653: Kpush(KcreateClassIncetance(ob1,ob2,ob3));
! 1654: break;
! 1655:
! 1656: case Stest:
! 1657: /* test is used for a test of a new function. */
! 1658: ob2 = Kpop();
! 1659: ob1 = Kpop();
! 1660: Kpush(hilberto(ob1,ob2));
! 1661: /*
! 1662: {
! 1663: ob1 = Kpop();
! 1664: Kpush(test(ob1));
! 1665:
! 1666: }
! 1667: */
! 1668: break;
! 1669:
! 1670:
! 1671: default:
! 1672: errorStackmachine("Unknown Soperator type. \n");
! 1673: }
! 1674: return(0); /* normal exit */
! 1675: }
! 1676:
! 1677:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>