Annotation of OpenXM/src/k097/d.c, Revision 1.1
1.1 ! maekawa 1: /* simple.c, 1996, 1/1 --- 1/5 */
! 2: #include <stdio.h>
! 3: #include <ctype.h>
! 4: #include <setjmp.h>
! 5: #include <stdlib.h>
! 6: #include "d.h"
! 7: #include "simple.tab.h"
! 8:
! 9:
! 10: jmp_buf KCenvOfParser;
! 11:
! 12: int DebugMode = 1;
! 13: extern int K00_verbose;
! 14:
! 15: static FILE *outfile = stdout;
! 16: int Linenumber = 0;
! 17: objectp Inop = (objectp) NULL; /* Input stream */
! 18: int Saki = 0; /* Look a head */
! 19:
! 20: #define SSIZE 10
! 21: objectp InopStack[SSIZE];
! 22: int LinenumberStack[SSIZE];
! 23: int SakiStack[SSIZE];
! 24: int Stackp = 0;
! 25:
! 26: int Mydebug = 1;
! 27: int Replace = 0;
! 28: int Debug2 = 0;
! 29: /* If you need to check only the lexical analizer,
! 30: change main2() ---> main()
! 31: main() ----> main2()
! 32: */
! 33:
! 34: int Interactive = 1;
! 35:
! 36: main2(int argc, char *argv[]) {
! 37: FILE *f;
! 38: FILE *outf;
! 39: char name[1024];
! 40: int n;
! 41: int i;
! 42: if (argc < 2) {
! 43: repl(stdin,stdout);
! 44: }else{
! 45: for (i=1; i<argc; i++) {
! 46: fprintf(stderr,"Input file=%s\n",argv[i]);
! 47: f = fopen(argv[i],"r");
! 48: if (f == (FILE *)NULL) {
! 49: fprintf(stderr,"Error: No file %s\n",argv[i]);
! 50: exit(10);
! 51: }
! 52: strcpy(name,argv[i]);
! 53: n = strlen(name);
! 54: name[n] = '.'; name[n+1] = 't'; name[n+2]='\0';
! 55: outf = fopen(name,"w");
! 56: if (f == (FILE *)NULL) {
! 57: fprintf(stderr,"Error: failed to open the file %s\n",name);
! 58: exit(10);
! 59: }
! 60: fprintf(stderr,"Output file=%s\n",name);
! 61: repl(f,outf);
! 62: }
! 63: }
! 64: }
! 65:
! 66: repl(FILE *inFile,FILE *outFile) {
! 67: int c;
! 68: int t;
! 69: Inop = newObject_d();
! 70: Inop->tag = Sfile;
! 71: Inop->lc.file = inFile;
! 72: Inop->rc.sbuf = newStringBuf((char *)NULL);
! 73:
! 74: outfile = outFile;
! 75: while ( (c = KClex()) != EOF) {
! 76: if (Mydebug) {
! 77: if ( c > ' ' && c < 0x7f ) {
! 78: printf("\nKClex returns --- %x [ %c ].",c,c);
! 79: }else{
! 80: switch(c) {
! 81: case ID: printf("\nKClex returns --- ID.[%s]",
! 82: KClval->lc.str); break;
! 83: case QUOTE: printf("\nKClex returns --- QUOTE. [%s]",
! 84: KClval->lc.str); break;
! 85: case SINGLEQUOTE: printf("\nKClex returns --- SINGLEQUOTE.[%x]",
! 86: KClval->lc.ival); break;
! 87: /*case NUMBER: printf("\nKClex returns --- NUMBER.[%d]",
! 88: KClval->lc.ival); break;*/
! 89: case NUMBER: printf("\nKClex returns --- NUMBER.[%s]",
! 90: KClval->lc.str); break;
! 91:
! 92: case CLASS: printf("\nKClex returns --- CLASS."); break;
! 93: case SUPER: printf("\nKClex returns --- SUPER."); break;
! 94: case OPERATOR: printf("\nKClex returns --- OPERATOR."); break;
! 95: case FINAL: printf("\nKClex returns --- FINAL."); break;
! 96: case EXTENDS: printf("\nKClex returns --- EXTENDS."); break;
! 97: case INCETANCEVARIABLE:
! 98: printf("\nKClex returns --- INCETANCEVARIABLE."); break;
! 99: case MODULE: printf("\nKClex returns --- MODULE."); break;
! 100: case SM1: printf("\nKClex returns --- SM1."); break;
! 101: case PRINT: printf("\nKClex returns --- PRINT."); break;
! 102: case LOCAL: printf("\nKClex returns --- LOCAL."); break;
! 103: case DEF: printf("\nKClex returns --- DEF."); break;
! 104: case BREAK: printf("\nKClex returns --- BREAK."); break;
! 105: case CASE: printf("\nKClex returns --- CASE."); break;
! 106: case CHAR: printf("\nKClex returns --- CHAR."); break;
! 107: case CONST: printf("\nKClex returns --- CONST."); break;
! 108: case CONTINUE: printf("\nKClex returns --- CONTINUE."); break;
! 109: case DEFAULT: printf("\nKClex returns --- DEFAULT."); break;
! 110: case DO: printf("\nKClex returns --- DO."); break;
! 111: case DOUBLE: printf("\nKClex returns --- DOUBLE."); break;
! 112: case ELSE: printf("\nKClex returns --- ELSE."); break;
! 113: case ENUM: printf("\nKClex returns --- ENUM."); break;
! 114: case EXTERN: printf("\nKClex returns --- EXTERN."); break;
! 115: case FLOAT: printf("\nKClex returns --- FLOAT."); break;
! 116: case FOR: printf("\nKClex returns --- FOR."); break;
! 117: case GOTO: printf("\nKClex returns --- GOTO."); break;
! 118: case IF: printf("\nKClex returns --- IF."); break;
! 119: case INT: printf("\nKClex returns --- INT."); break;
! 120: case LONG: printf("\nKClex returns --- LONG."); break;
! 121: case REGISTER: printf("\nKClex returns --- REGISTER."); break;
! 122: case RETURN: printf("\nKClex returns --- RETURN."); break;
! 123: case SHORT: printf("\nKClex returns --- SHORT."); break;
! 124: case SIGNED: printf("\nKClex returns --- SIGNED."); break;
! 125: case SIZEOF: printf("\nKClex returns --- SIZEOF."); break;
! 126: case STATIC: printf("\nKClex returns --- STATIC."); break;
! 127: case STRUCT: printf("\nKClex returns --- SWITCH."); break;
! 128: case TYPEDEF: printf("\nKClex returns --- TYPEDEF."); break;
! 129: case UNION: printf("\nKClex returns --- UNION."); break;
! 130: case UNSIGNED: printf("\nKClex returns --- UNSIGNED."); break;
! 131: case VOLATILE: printf("\nKClex returns --- VOLATILE."); break;
! 132: case VOID: printf("\nKClex returns --- VOID."); break;
! 133: case WHILE: printf("\nKClex returns --- WHILE."); break;
! 134:
! 135: case EQUAL: printf("\nKClex returns --- ==."); break;
! 136: case LESSEQUAL: printf("\nKClex returns --- <=."); break;
! 137: case LEFTSHIFT: printf("\nKClex returns --- <<."); break;
! 138: case GREATEREQUAL: printf("\nKClex returns --- >=."); break;
! 139: case RIGHTSHIFT: printf("\nKClex returns --- >>."); break;
! 140: case AND: printf("\nKClex returns --- &&."); break;
! 141: case OR: printf("\nKClex returns --- ||."); break;
! 142: case NOTEQUAL: printf("\nKClex returns --- !=."); break;
! 143: case PUT: printf("\nKClex returns --- :=."); break;
! 144: case INCREMENT: printf("\nKClex returns --- ++."); break;
! 145: case DECREMENT: printf("\nKClex returns --- --."); break;
! 146: case MEMBER: printf("\nKClex returns --- ->."); break;
! 147: case RESIDUEPUT: printf("\nKClex returns --- %=."); break;
! 148: case NEGATEPUT: printf("\nKClex returns --- ^=."); break;
! 149: case MULTPUT: printf("\nKClex returns --- *=."); break;
! 150:
! 151: default:
! 152: printf("\nKClex returns --- %x(%d)[%c].",c,c,c);
! 153: }
! 154: }
! 155: printf(" line=%d.\n",Linenumber);
! 156: }
! 157: }
! 158: }
! 159:
! 160: /* --------------------------------------------------------- */
! 161: objectp newObject_d() {
! 162: objectp obj;
! 163: obj = (objectp) mymalloc(sizeof(struct Object));
! 164: if (obj == (objectp) NULL) {
! 165: fprintf(stderr,"Error: No more memory in newObject_d().\n");
! 166: exit(10);
! 167: }
! 168: obj->tag = Snull;
! 169: return(obj);
! 170: }
! 171:
! 172: char *newString(int size) {
! 173: char *str;
! 174: if (size <= 0) size=1;
! 175: str = (char *)mymalloc(sizeof(char)*size);
! 176: if (str == (char *)NULL) {
! 177: fprintf(stderr,"Error: No more memory in newObject_d().\n");
! 178: exit(10);
! 179: }
! 180: return(str);
! 181: }
! 182:
! 183: void printObject_d(FILE *fp,objectp op)
! 184: {
! 185: if (op == (objectp) NULL) {
! 186: fprintf(fp," <null objectp> ");
! 187: return;
! 188: }
! 189: switch(op->tag) {
! 190: case Sinteger:
! 191: fprintf(fp,"%d",op->lc.ival);
! 192: return;
! 193: break;
! 194: case Sstring:
! 195: fprintf(fp,"%s",op->lc.str);
! 196: return;
! 197: break;
! 198: case CLASSNAME_CONTEXT:
! 199: K00fprintContext(fp,K00objectToContext(op));
! 200: return;
! 201: break;
! 202: default:
! 203: fprintf(stderr,"printObject_d(): Sorry. Not implemented.");
! 204: break;
! 205: }
! 206: }
! 207:
! 208: void printObjectSymbol(objectp op)
! 209: {
! 210: static char tmp[1024];
! 211: if (op == (objectp) NULL) {
! 212: printf(" <null objectp> ");
! 213: return;
! 214: }
! 215: switch(op->tag) {
! 216: case Sinteger:
! 217: sprintf(tmp,"%d",op->lc.ival);
! 218: pkkan(tmp);
! 219: return; break;
! 220: case Sstring:
! 221: pkkan(op->lc.str);
! 222: return; break;
! 223: default:
! 224: fprintf(stderr,"(printObjectSymbol(): Sorry. Not implemented.)");
! 225: break;
! 226: }
! 227: }
! 228:
! 229: void printTens(objectp op)
! 230: {
! 231: static char tmp[1024];
! 232: int n;
! 233: int i;
! 234: if (op == (objectp) NULL) {
! 235: printf(" <null objectp> ");
! 236: return;
! 237: }
! 238: switch(op->tag) {
! 239: case Sstring:
! 240: n = strlen(op->lc.str);
! 241: if (n > 1022) {
! 242: fprintf(stderr,"printTens(): Too long string. ");
! 243: return;
! 244: }
! 245: tmp[0] = '1';
! 246: for (i=1; i<=n; i++) tmp[i] = '0';
! 247: tmp[n+1] = 0;
! 248: pkkan(tmp);
! 249: return; break;
! 250: default:
! 251: fprintf(stderr,"(printTens(): Sorry. Not implemented.)");
! 252: break;
! 253: }
! 254: }
! 255:
! 256: char *objectSymbolToString(objectp op)
! 257: {
! 258: static char tmp[1024];
! 259: char *r = (char *)NULL;
! 260: if (op == (objectp) NULL) {
! 261: printf(" <null objectp> ");
! 262: return (r);
! 263: }
! 264: switch(op->tag) {
! 265: case Sinteger:
! 266: sprintf(tmp,"%d",op->lc.ival);
! 267: r = (char *)GC_malloc(sizeof(char)*(strlen(tmp)+2));
! 268: strcpy(r,tmp);
! 269: break;
! 270: case Sstring:
! 271: r = (char *)GC_malloc(sizeof(char)*(strlen(op->lc.str)+2));
! 272: strcpy(r,op->lc.str);
! 273: break;
! 274: default:
! 275: fprintf(stderr,"(objectSymbolToString(): Sorry. Not implemented.)");
! 276: break;
! 277: }
! 278: return(r);
! 279: }
! 280:
! 281: objectp ooAdd(objectp a,objectp b)
! 282: {
! 283: objectp r;
! 284: if (a == (objectp)NULL || b == (objectp)NULL) return((objectp) NULL);
! 285: if (a->tag == Sinteger && b->tag == Sinteger) {
! 286: r = newObject_d();
! 287: r->tag = Sinteger;
! 288: r->lc.ival = a->lc.ival + b->lc.ival;
! 289: return(r);
! 290: }else{
! 291: fprintf(stderr,"ooAdd(): Sorry. Not implemented.");
! 292: return((objectp)NULL);
! 293: }
! 294: }
! 295:
! 296: objectp ooMult(objectp a,objectp b)
! 297: {
! 298: objectp r;
! 299: if (a == (objectp)NULL || b == (objectp)NULL) return((objectp) NULL);
! 300: if (a->tag == Sinteger && b->tag == Sinteger) {
! 301: r = newObject_d();
! 302: r->tag = Sinteger;
! 303: r->lc.ival = a->lc.ival * b->lc.ival;
! 304: return(r);
! 305: }else{
! 306: fprintf(stderr,"ooMult(): Sorry. Not implemented.");
! 307: return((objectp)NULL);
! 308: }
! 309: }
! 310:
! 311: /* ------------------------------------------- */
! 312:
! 313: int KClex() {
! 314: extern int Saki; /* Saki-yomi */
! 315: int d;
! 316: int state = 0;
! 317: int i;
! 318: static char nametmp[1024];
! 319: char *name = nametmp;
! 320: char *str;
! 321: KClval = (objectp) NULL;
! 322: while (1) {
! 323: switch( state ) {
! 324: case 0:
! 325: /* printf(" <%x> ",Saki); */
! 326: if (Saki == EOF) {
! 327: return(Saki);
! 328: }
! 329: if (Saki <= ' ') {
! 330: if (Saki == '\n') ++Linenumber;
! 331: if (Replace) putchar0(Saki);
! 332: Saki = fsgetc(Inop); break;
! 333: }
! 334: if ( Saki == '\"' ) {
! 335: str = readstring();
! 336: /* if (Mydebug) printf("[string: %s]",str); */
! 337:
! 338: KClval = newObject_d();
! 339: KClval->tag = Sstring;
! 340: KClval->lc.str = newString(strlen(str)+1);
! 341: strcpy(KClval->lc.str,str);
! 342:
! 343: Saki = fsgetc(Inop);
! 344: return(QUOTE);
! 345: break;
! 346: }
! 347: if (Saki == '\'' ) {
! 348: d = readchar();
! 349: Saki = fsgetc(Inop);
! 350:
! 351: KClval = newObject_d();
! 352: KClval->tag = Sinteger;
! 353: KClval->lc.ival = d;
! 354:
! 355: return(SINGLEQUOTE);
! 356: }
! 357: /* single */
! 358: if ( Saki == '(' || Saki == ')' || Saki == ';' ||
! 359: Saki == '{' || Saki == '}' || Saki == ',' ||
! 360: Saki == '[' || Saki == ']' || Saki == '~' ||
! 361: Saki == '?' || Saki == '.') {
! 362: d = Saki; Saki = fsgetc(Inop);
! 363: if (Replace) putchar0(d);
! 364: return(d);
! 365: }
! 366:
! 367: /* single or combination =, == */
! 368: if ( Saki == '=') {
! 369: state = 51; Saki = fsgetc(Inop); break;
! 370: } else if ( Saki == '<' ) {
! 371: state = 52; Saki = fsgetc(Inop); break;
! 372: } else if ( Saki == '>' ) {
! 373: state = 53; Saki = fsgetc(Inop); break;
! 374: } else if ( Saki == '/' ) {
! 375: state = 54; Saki = fsgetc(Inop); break;
! 376: } else if ( Saki == '&' ) {
! 377: state = 55; Saki = fsgetc(Inop); break;
! 378: } else if ( Saki == '|' ) {
! 379: state = 56; Saki = fsgetc(Inop); break;
! 380: } else if ( Saki == '!' ) {
! 381: state = 57; Saki = fsgetc(Inop); break;
! 382: } else if ( Saki == ':' ) {
! 383: state = 58; Saki = fsgetc(Inop); break;
! 384: } else if ( Saki == '+' ) {
! 385: state = 59; Saki = fsgetc(Inop); break;
! 386: } else if ( Saki == '-' ) {
! 387: state = 60; Saki = fsgetc(Inop); break;
! 388: } else if ( Saki == '%' ) {
! 389: state = 61; Saki = fsgetc(Inop); break;
! 390: } else if ( Saki == '^' ) {
! 391: state = 62; Saki = fsgetc(Inop); break;
! 392: } else if ( Saki == '*' ) {
! 393: state = 63; Saki = fsgetc(Inop); break;
! 394: } else ;
! 395:
! 396:
! 397: /* else : Identifier or function names. */
! 398: name[0] = Saki; i=1; name[i] = '\0';
! 399: Saki = fsgetc(Inop);
! 400: if (isdigit(name[0])) {
! 401: /*while (isdigit(Saki) || isalpha(Saki) || Saki=='.') */
! 402: while (isdigit(Saki) || isalpha(Saki)) {
! 403: name[i++] = Saki; name[i] = '\0';
! 404: Saki = fsgetc(Inop);
! 405: }
! 406: }else{
! 407: while (isdigit(Saki) || isalpha(Saki) || (Saki=='_') ||
! 408: ( Saki>= 256)) {
! 409: name[i++] = Saki; name[i] = '\0';
! 410: Saki = fsgetc(Inop);
! 411: }
! 412: }
! 413: /*if (Mydebug) printf("identifier string=[%s]",name);*/
! 414: if (isdigit(name[0])) {
! 415: /****************************
! 416: /**case : machine integer.
! 417: KClval = newObject_d();
! 418: KClval->tag = Sinteger;
! 419: sscanf(name,"%d",&(KClval->lc.ival));*************/
! 420: /* Other cases. */
! 421: KClval = newObject_d();
! 422: KClval->tag = Sstring;
! 423: KClval->lc.str = newString(strlen(name)+1);
! 424: strcpy(KClval->lc.str,name);
! 425: return(NUMBER);
! 426: break;
! 427: } /* else : Identifier case.*/
! 428:
! 429: if (d = isReserved(name)) {
! 430: if (Replace) printf0(name);
! 431: return(d);
! 432: } else {
! 433: if (Replace) {
! 434: if (shouldReplace(name))
! 435: printf1(name); /* do your own replacement in printf1*/
! 436: else
! 437: printf0(name);
! 438: }
! 439: KClval = newObject_d();
! 440: KClval->tag = Sstring;
! 441: KClval->lc.str = newString(strlen(name)+1);
! 442: strcpy(KClval->lc.str,name);
! 443: return(ID);
! 444: }
! 445: break;
! 446:
! 447: case 51:
! 448: if (Replace) putchar0('=');
! 449: if ( Saki == '=') {
! 450: if (Replace) putchar0('=');
! 451: Saki = fsgetc(Inop);state = 0;return(EQUAL); /* == */
! 452: }else{
! 453: state = 0;return('=');
! 454: }
! 455: break;
! 456: case 52: /* 52 --- 60 tmporary return values */
! 457: if (Replace) putchar0('<');
! 458: if ( Saki == '=') {
! 459: if (Replace) putchar0('=');
! 460: Saki = fsgetc(Inop);state = 0;return(LESSEQUAL); /* <= */
! 461: } else if ( Saki == '<') {
! 462: if (Replace) putchar0('<');
! 463: Saki = fsgetc(Inop);state = 0;return(LEFTSHIFT); /* << */
! 464: }else{
! 465: state = 0;return('<');
! 466: }
! 467: break;
! 468: case 53:
! 469: if (Replace) putchar0('>');
! 470: if ( Saki == '=') {
! 471: if (Replace) putchar0('=');
! 472: Saki = fsgetc(Inop);state = 0;return(GREATEREQUAL); /* >= */
! 473: } else if ( Saki == '>') {
! 474: if (Replace) putchar0('>');
! 475: Saki = fsgetc(Inop);state = 0;return(RIGHTSHIFT); /* >> */
! 476: }else{
! 477: state = 0;return('>');
! 478: }
! 479: break;
! 480: case 54:
! 481: if ( Saki == '*') {
! 482: readcomment();
! 483: Saki = fsgetc(Inop);state = 0;break; /* clike-comment */
! 484: }else{
! 485: if (Replace) putchar0('/');
! 486: state = 0;return('/');
! 487: }
! 488: break;
! 489: case 55:
! 490: if (Replace) putchar0('&');
! 491: if ( Saki == '&') {
! 492: if (Replace) putchar0('&');
! 493: Saki = fsgetc(Inop);state = 0;return(AND); /* && */
! 494: }else{
! 495: state = 0;return('&');
! 496: }
! 497: break;
! 498: case 56:
! 499: if (Replace) putchar0('|');
! 500: if ( Saki == '|') {
! 501: if (Replace) putchar0('|');
! 502: Saki = fsgetc(Inop);state = 0;return(OR); /* || */
! 503: }else{
! 504: state = 0;return('|');
! 505: }
! 506: break;
! 507: case 57:
! 508: if (Replace) putchar0('!');
! 509: if ( Saki == '=') {
! 510: if (Replace) putchar0('=');
! 511: Saki = fsgetc(Inop);state = 0;return(NOTEQUAL); /* != */
! 512: }else{
! 513: state = 0;return('!');
! 514: }
! 515: break;
! 516: case 58:
! 517: if (Replace) putchar0(':');
! 518: if ( Saki == '=') {
! 519: if (Replace) putchar0('=');
! 520: Saki = fsgetc(Inop);state = 0;return(PUT); /* := */
! 521: }else{
! 522: state = 0;return(':');
! 523: }
! 524: break;
! 525: case 59:
! 526: if (Replace) putchar0('+');
! 527: if ( Saki == '+') {
! 528: if (Replace) putchar0('+');
! 529: Saki = fsgetc(Inop);state = 0;return(INCREMENT); /* ++ */
! 530: }else{
! 531: state = 0;return('+');
! 532: }
! 533: break;
! 534: case 60:
! 535: if (Replace) putchar0('-');
! 536: if ( Saki == '-') {
! 537: if (Replace) putchar0('-');
! 538: Saki = fsgetc(Inop);state = 0;return(DECREMENT); /* -- */
! 539: }else if (Saki == '>') {
! 540: if (Replace) putchar0('>');
! 541: Saki = fsgetc(Inop);state = 0;return(MEMBER); /* -> */
! 542: }else{
! 543: state = 0;return('-');
! 544: }
! 545: break;
! 546: case 61:
! 547: if (Replace) putchar0('%');
! 548: if ( Saki == '=') {
! 549: if (Replace) putchar0('=');
! 550: Saki = fsgetc(Inop);state = 0;return(RESIDUEPUT); /* %= */
! 551: }else{
! 552: state = 0;return('%');
! 553: }
! 554: break;
! 555: case 62:
! 556: if (Replace) putchar0('^');
! 557: if ( Saki == '=') {
! 558: if (Replace) putchar0('=');
! 559: Saki = fsgetc(Inop);state = 0;return(NEGATEPUT); /* ^= */
! 560: }else{
! 561: state = 0;return('^');
! 562: }
! 563: break;
! 564: case 63:
! 565: if (Replace) putchar0('*');
! 566: if ( Saki == '=') {
! 567: if (Replace) putchar0('=');
! 568: Saki = fsgetc(Inop);state = 0;return(MULTPUT); /* *= */
! 569: }else{
! 570: state = 0;return('*');
! 571: }
! 572: break;
! 573:
! 574:
! 575: default:
! 576: fprintf(stderr,"%d: Error in KClex().\n",Linenumber);
! 577: }
! 578: }
! 579:
! 580: }
! 581:
! 582: KCerror(char *s) /* You need this function. Otherwise, you get core. */
! 583: {
! 584: K00recoverFromError();
! 585: fprintf(stderr,"\nSyntax Error in the line %d:%s\n",Linenumber,s);
! 586: showStringBuff(Inop); return ;
! 587: longjmp(KCenvOfParser,2);
! 588: exit(1);
! 589: }
! 590:
! 591: readcomment() {
! 592: int c;
! 593: while (1) {
! 594: c = fsgetc(Inop);
! 595: if (c == EOF) {
! 596: fprintf(stderr,"%d: Unexpected end of file in a comment.\n",Linenumber);
! 597: fsungetc(c,Inop); /* should change */
! 598: return;
! 599: }
! 600: if (c == '*') {
! 601: c = fsgetc(Inop);
! 602: if (c == '/') return;
! 603: }
! 604: }
! 605: }
! 606:
! 607:
! 608: char *readstring() {
! 609: static char strtmp[1024]; /* temporary */
! 610: static int size = 1024;
! 611: static char *str = strtmp;
! 612: int i=0;
! 613: int c;
! 614: static char *strwork;
! 615:
! 616:
! 617: if (Replace) putchar0('\"'); /* output " */
! 618: while (1) {
! 619: c = fsgetc(Inop);
! 620: if (Replace) putchar0(c);
! 621: if (c == '\"') {
! 622: str[i] = '\0';
! 623: return(str);
! 624: }
! 625: if (c == EOF) {
! 626: fprintf(stderr,"%d: Unexpected end of file in the string.\n",Linenumber);
! 627: fsungetc(c,Inop); /* should change */
! 628: str[i]= '\0';
! 629: return(str);
! 630: }
! 631: if (c == '\\') {
! 632: c = fsgetc(Inop);
! 633: if (Replace) {
! 634: putchar0(c);
! 635: }
! 636: if (c == EOF) {
! 637: fprintf(stderr,"%d: Unexpected end of file in the escape sequence.\n",Linenumber);
! 638: fsungetc(c,Inop); /* should change */
! 639: str[i]= '\0';
! 640: return(str);
! 641: }
! 642: }
! 643:
! 644: str[i++] = c;
! 645: if (i >= size-10) {
! 646: size = size*2;
! 647: strwork = newString(size);
! 648: strcpy(strwork,str);
! 649: str = strwork;
! 650: }
! 651: }
! 652: }
! 653:
! 654:
! 655: readchar() {
! 656: int c;
! 657: if (Replace) putchar0('\'');
! 658: c = fsgetc(Inop); /* 'c.' '\.c' */
! 659: if (Replace) putchar0(c);
! 660: if ( c == '\\') {
! 661: c = fsgetc(Inop); /* '\c.' */
! 662: if (Replace) putchar0(c);
! 663: if (c == EOF) {
! 664: fprintf(stderr,"%d: Unexpected end of file in the escape sequence.\n",Linenumber);
! 665: fsungetc(c,Inop); /* should change */
! 666: return(-1);
! 667: }
! 668: if (fsgetc(Inop) != '\'') {
! 669: fprintf(stderr,"%d: Error in single quote string (escape seq)\n",Linenumber);
! 670: return(c);
! 671: }
! 672: if (Replace) putchar0('\'');
! 673: return(c);
! 674: }
! 675:
! 676: if (fsgetc(Inop) != '\'') {
! 677: fprintf(stderr,"%d: Error in single quote string\n",Linenumber);
! 678: }
! 679: if (Replace) putchar0('\'');
! 680: return(c);
! 681: }
! 682:
! 683: putchar0(c)
! 684: int c;
! 685: {
! 686: if (c > 0) fputc(c,outfile);
! 687: }
! 688:
! 689: printf0(s)
! 690: char *s;
! 691: {
! 692: int i = 0;
! 693: while (s[i] != '\0') putchar0(s[i++]);
! 694: }
! 695:
! 696: printf1(s)
! 697: char *s;
! 698: {
! 699: int i = 0;
! 700: /* putchar0('K'); */ /* do your own replacement */
! 701: while (s[i] != '\0') putchar0(s[i++]);
! 702: }
! 703:
! 704: isReserved(s)
! 705: char *s;
! 706: {
! 707: char *r[] = {"auto","break","case","char","const","continue",
! 708: "default","do","double","else","enum","extern",
! 709: "float","for","goto","if","int","long","register",
! 710: "return","short","signed","sizeof","static","struct",
! 711: "switch","typedef","union","unsigned","volatile",
! 712: "void","while",
! 713: "print","module","local","def","sm1","load","Test","special",
! 714: "class","super","operator","final","extends",
! 715: "incetanceVariable","this","new","startOfThisClass",
! 716: "sizeOfThisClass","PSfor","OutputPrompt"};
! 717:
! 718: int val[]= {AUTO, BREAK, CASE, CHAR, CONST, CONTINUE, DEFAULT, DO, DOUBLE,
! 719: ELSE, ENUM,
! 720: EXTERN, FLOAT, FOR, GOTO, IF, INT, LONG, REGISTER,
! 721: RETURN, SHORT, SIGNED, SIZEOF, STATIC, STRUCT, SWITCH,
! 722: TYPEDEF, UNION,
! 723: UNSIGNED, VOLATILE, VOID, WHILE,
! 724: PRINT,MODULE,LOCAL,DEF,SM1,LOAD,TEST,SPECIAL,
! 725: CLASS,SUPER,OPERATOR,FINAL,EXTENDS,INCETANCEVARIABLE,
! 726: THIS, NEW, STARTOFTHISCLASS, SIZEOFTHISCLASS,PSFOR,PROMPT};
! 727: int n = 52; /* Length of the list above */
! 728: /* You have to change simple.y, too. */
! 729:
! 730: int i;
! 731: for (i=0; i<n; i++) {
! 732: if (strcmp(r[i],s) == 0) {
! 733: if (Debug2) printf("\nReserved word: %s ---\n",s);
! 734: return(val[i]);
! 735: }
! 736: }
! 737: return(0);
! 738:
! 739: }
! 740:
! 741: shouldReplace(s)
! 742: char *s;
! 743: {
! 744: char *r[] = {"dummy"};
! 745: int n = 1;
! 746: int i;
! 747: for (i=0; i<n; i++) {
! 748: if (strcmp(r[i],s) == 0) {
! 749: /* printf("\n--- %s ---\n",s); */
! 750: return(1);
! 751: }
! 752: }
! 753: return(1); /* change to 0. */
! 754: }
! 755:
! 756: /* --------------------------- protection of symbols ------------------ */
! 757: #include "Stable/sm1symbol.h"
! 758: int ips(objectp op) {
! 759: return(isProtectedSymbol(op->lc.str));
! 760: }
! 761: int isProtectedSymbol(char *s)
! 762: {
! 763:
! 764: static char **sn = SymbolTableOfsm1;
! 765: int size = SizeOfSymbolTableOfsm1;
! 766: int start = 0;
! 767: int end = size-1;
! 768: int r;
! 769:
! 770: while (1) {
! 771: /* binary search */
! 772: if (start>end) break;
! 773: r = strcmp(s,sn[start+(end-start)/2]);
! 774: if (r == 0) {
! 775: fprintf(stderr,"Warning: Protected symbol %s is used as user variable.\n",s);
! 776: return(0);
! 777: }
! 778: if (r > 0) {
! 779: start = start + (end-start)/2 + 1;
! 780: } else if ( r < 0) {
! 781: end = start + (end-start)/2-1;
! 782: }
! 783: }
! 784: return(0);
! 785: }
! 786:
! 787: /* ------------------ read from file ------------------- */
! 788: struct stringBuf *newStringBuf(char *initstr)
! 789: {
! 790: #define INITSIZE 1024
! 791: struct stringBuf *stringBuf;
! 792: int limit;
! 793: stringBuf = mymalloc(sizeof(struct stringBuf));
! 794: if (stringBuf == (struct stringBuf *)NULL) {
! 795: fprintf(stderr,"No memory\n"); exit(10);
! 796: }
! 797: if (initstr == (char *)NULL) limit = INITSIZE;
! 798: else limit = strlen(initstr)+11;
! 799: stringBuf->str = mymalloc(sizeof(char)*limit);
! 800: stringBuf->ptr = 0;
! 801: stringBuf->limit = limit;
! 802: if (stringBuf->str == (char *)NULL) {
! 803: fprintf(stderr,"No memory\n"); exit(10);
! 804: }
! 805: if (initstr != (char *)NULL) {
! 806: strcpy(stringBuf->str,initstr);
! 807: } else (stringBuf->str)[0] = '\0';
! 808: return(stringBuf);
! 809: }
! 810:
! 811: void doublingStringBuf(struct stringBuf *obuf)
! 812: {
! 813: char *t;
! 814: t = mymalloc(sizeof(char)*(obuf->limit)*2);
! 815: if (t == (char *)NULL) {
! 816: fprintf(stderr,"No memory\n"); exit(10);
! 817: }
! 818: strcpy(t,obuf->str);
! 819: obuf->str = t;
! 820: obuf->limit *= 2;
! 821: }
! 822:
! 823: void readlineFromFile(FILE *fp,struct stringBuf *obuf)
! 824: {
! 825: int c;
! 826: obuf->ptr = 0; (obuf->str)[obuf->ptr]='\0';
! 827: while (1) {
! 828: c = fgetc(fp);
! 829: /* for debug.
! 830: if (c<' ') printf(" %x(%x) ",c,(int) fp); else printf(" <%c>(%x) ",c,(int) fp); fflush(NULL);
! 831: if (c == EOF) {
! 832: printf("Stackp=%d ",Stackp);
! 833: printf("File=%x\n",(int) fp); fflush(NULL);
! 834: }
! 835: */
! 836: if (c == EOF) {
! 837: (obuf->str)[obuf->ptr]='\0';
! 838: obuf->ptr = 0;
! 839: return;
! 840: }
! 841: (obuf->str)[(obuf->ptr)++] = c;
! 842: (obuf->str)[obuf->ptr] = '\0';
! 843: if (c == '\n') {
! 844: obuf->ptr = 0;
! 845: return;
! 846: }
! 847: if (obuf->ptr > obuf->limit - 5) doublingStringBuf(obuf);
! 848: }
! 849: }
! 850:
! 851: static int popFile() {
! 852: if (Inop->tag == Sfile) {
! 853: if (Inop->lc.file != stdin) {
! 854: fclose(Inop->lc.file);
! 855: /* sendKan(10); output In[n]= */
! 856: }
! 857: }
! 858: /* fprintf(stderr,"popFile(), Stackp=%d\n",Stackp); fflush(NULL); */
! 859: if (Stackp <= 1) return(EOF);
! 860: Stackp--;
! 861: Linenumber = LinenumberStack[Stackp];
! 862: Inop = InopStack[Stackp];
! 863: if (Inop == (objectp) NULL) {
! 864: fprintf(stderr,"popFile: Inop==NULL\n"); fflush(stdout); /* was fflush(NULL); */
! 865: return(EOF);
! 866: }
! 867: if (Inop->tag == Sfile) {
! 868: if (Inop->lc.file != stdin) {
! 869: Interactive = 0;
! 870: }else{
! 871: Interactive = 1;
! 872: }
! 873: }
! 874: /* Saki = SakiStack[Stackp]; */
! 875: Saki = '\n';
! 876: return(Saki);
! 877: }
! 878:
! 879: int fsgetc(objectp op) {
! 880: struct stringBuf *obuf;
! 881: char *str;
! 882: int ptr;
! 883: if (op->tag == Sfile) {
! 884: /* return(fgetc(op->lc.file)); non-buffered reading */
! 885: obuf = op->rc.sbuf;
! 886: str = obuf->str;
! 887: ptr = obuf->ptr;
! 888: if (str[ptr] == '\0') {
! 889: readlineFromFile(op->lc.file,obuf);
! 890: str = obuf->str;
! 891: ptr = obuf->ptr;
! 892: }
! 893: if (str[ptr] == '\0') {
! 894: return(popFile());
! 895: } else return( str[(obuf->ptr)++] );
! 896: }else if (op->tag == Slist) {
! 897: obuf = op->lc.sbuf;
! 898: str = obuf->str;
! 899: ptr = obuf->ptr;
! 900: if (str[ptr] == '\0') {
! 901: return(popFile());
! 902: } else return(str[(obuf->ptr)++]);
! 903: }else {
! 904: fprintf(stderr,"unknown tag?\n");
! 905: }
! 906: return(EOF);
! 907: }
! 908:
! 909: int fsungetc(int c,objectp op) {
! 910: fprintf(stderr,"Sorry. fsungetc has not yet implemented.\n");
! 911: }
! 912:
! 913: void clearInop() {
! 914: Saki = '\0';
! 915: Inop = (objectp) NULL;
! 916: Stackp = 0;
! 917: }
! 918:
! 919: static void pushOld() {
! 920: LinenumberStack[Stackp]=Linenumber;
! 921: InopStack[Stackp] = Inop;
! 922: SakiStack[Stackp] = Saki;
! 923: /* fprintf(stderr,"pushOld, Stackp=%d, fp=%x\n",Stackp,(int)(Inop->lc.file)); fflush(NULL); */
! 924: Stackp++;
! 925: if (Stackp >= SSIZE) {
! 926: fprintf(stderr,"Stackp overflow.\n");
! 927: exit(10);
! 928: }
! 929: }
! 930:
! 931: void parseAfile(FILE *fp) {
! 932: int c;
! 933:
! 934: pushOld();
! 935:
! 936: Linenumber = 0;
! 937: Inop = newObject_d();
! 938: Inop->tag = Sfile;
! 939: Inop->lc.file = fp;
! 940: Inop->rc.sbuf = newStringBuf((char *)NULL);
! 941: if (fp != stdin) {
! 942: Interactive = 0;
! 943: }
! 944:
! 945: }
! 946:
! 947: void parseAstring(char *s)
! 948: {
! 949: int c;
! 950: int prevLineNumber;
! 951: objectp prevInop;
! 952: int prevSaki;
! 953:
! 954: pushOld();
! 955:
! 956: Linenumber = 0;
! 957: Inop = newObject_d();
! 958: Inop->tag = Slist;
! 959: Inop->lc.sbuf = newStringBuf(s);
! 960:
! 961: }
! 962:
! 963: void loadFile(objectp op)
! 964: {
! 965: FILE *fp;
! 966: char fname[1024];
! 967: if (op->tag != Sstring) {
! 968: fprintf(stderr,"File name must be given as an argment of load.\n");
! 969: return;
! 970: }
! 971: if (strlen(op->lc.str) > 1000) {
! 972: fprintf(stderr,"Too long file name.\n");
! 973: return;
! 974: }
! 975: fp = fopen(op->lc.str,"r");
! 976: if (fp == (FILE *)NULL) {
! 977: strcpy(fname,getLOAD_K_PATH());
! 978: strcat(fname,op->lc.str);
! 979: fp = fopen(fname,"r");
! 980: if (fp == (FILE *)NULL) {
! 981: strcpy(fname,LOAD_K_PATH);
! 982: strcat(fname,op->lc.str);
! 983: fp = fopen(fname,"r");
! 984: if (fp == (FILE *)NULL) {
! 985: fprintf(stderr,"Cannot open the file <<%s>> for loading in the current directory nor the library directories %s and %s.\n",op->lc.str,getLOAD_K_PATH(),LOAD_K_PATH);
! 986: return;
! 987: }
! 988: }
! 989: }
! 990: if (K00_verbose) fprintf(stderr,"Reading the file <<%s>>... ",op->lc.str);
! 991: parseAfile(fp);
! 992: if (K00_verbose) fprintf(stderr,"\nClosed the file <<%s>>.\n",op->lc.str);
! 993: }
! 994:
! 995: void loadFileWithCpp(objectp op)
! 996: {
! 997: FILE *fp;
! 998: char fname[1024];
! 999: objectp ob;
! 1000: if (op->tag != Sstring) {
! 1001: fprintf(stderr,"File name must be given as an argment of load.\n");
! 1002: return;
! 1003: }
! 1004: if (strlen(op->lc.str) > 900) {
! 1005: fprintf(stderr,"Too long file name.\n");
! 1006: return;
! 1007: }
! 1008: system("/bin/rm -f k00.cppload.tmp");
! 1009: strcpy(fname,"/lib/cpp -P -lang-c++ <");
! 1010: strcat(fname,op->lc.str);
! 1011: strcat(fname," >k00.cppload.tmp");
! 1012: system(fname);
! 1013: ob = newObject_d();
! 1014: ob->tag = Sstring;
! 1015: ob->lc.str = "k00.cppload.tmp";
! 1016: loadFile(ob);
! 1017: }
! 1018:
! 1019: void showStringBuff(objectp op)
! 1020: {
! 1021: struct stringBuf *sb;
! 1022: int i;
! 1023: int start;
! 1024: int ptr;
! 1025: if (op->tag == Sfile) {
! 1026: sb = op->rc.sbuf;
! 1027: }else if (op->tag == Slist) {
! 1028: sb = op->lc.sbuf;
! 1029: }else fprintf(stderr,"Unknown tag.\n");
! 1030: ptr = sb->ptr;
! 1031: if (K00_verbose) {
! 1032: fprintf(stderr,"stringBuff ptr = %d, ",ptr);
! 1033: fprintf(stderr,"sb[ptr] = %x,%d",(sb->str)[ptr],(sb->str)[ptr]);
! 1034: fprintf(stderr,"Saki(yomi) = %x \n",Saki,Saki);
! 1035: }
! 1036: if (ptr == 0 && Saki == -1) {
! 1037: fprintf(stderr," ; was expected.\n");
! 1038: }
! 1039: start = (ptr-20<0?0:ptr-20);
! 1040: fprintf(stderr,"The error occured when the system is reading the line: ");
! 1041: for (i=start; i<ptr+20 && (sb->str)[i] >= ' '; i++) {
! 1042: fprintf(stderr,"%c",(sb->str)[i]);
! 1043: if (i==ptr-1) fprintf(stderr,"<<error>> \n");
! 1044: }
! 1045: fprintf(stderr,"\n");
! 1046: }
! 1047:
! 1048: char *getLOAD_K_PATH() {
! 1049: char *p;
! 1050: char *p2;
! 1051: p = getenv("LOAD_K_PATH");
! 1052: if (p == NULL) {
! 1053: return("/usr/local/lib/kxx97/yacc/");
! 1054: }else{
! 1055: if (strlen(p) == 0) return(p);
! 1056: if (p[strlen(p)-1] == '/') return(p);
! 1057: /* Add / */
! 1058: p2 = (char *) malloc(sizeof(char)*(strlen(p)+3));
! 1059: if (p2 == NULL) { fprintf(stderr,"No more memory.\n"); exit(10); }
! 1060: strcpy(p2,p); strcat(p2,"/");
! 1061: return(p2);
! 1062: }
! 1063: }
! 1064:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>