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

Annotation of OpenXM/src/k097/d.c, Revision 1.1.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>