Annotation of researchv10dc/cmd/icon/src/tran/itran.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * Main program that controls the translation of Icon programs.
                      3:  */
                      4: 
                      5: #include "itran.h"
                      6: #include "sym.h"
                      7: #include "tree.h"
                      8: #include "../h/version.h"
                      9: #include "token.h"
                     10: #include "tstats.h"
                     11: 
                     12: #ifdef TranStats
                     13: /* int TokCount[TokSize]; */
                     14: #endif TranStats
                     15: 
                     16: 
                     17: 
                     18: #define MaxFiles 64            /* maximum number of file names */
                     19: #define MaxName  40            /* maximum length of file name */
                     20: 
                     21: int fatalerrs  = 0;            /* total number of fatal errors */
                     22: int warnings   = 0;            /* total number of warnings */
                     23: int nocode     = 0;            /* non-zero to suppress code generation */
                     24: int inline     = 1;            /* current input line number */
                     25: int incol      = 0;            /* current input column number */
                     26: int peekc      = 0;            /* one-character look ahead */
                     27: int implicit   = LOCAL;        /* implicit scope for undeclared identifiers */
                     28: int silence    = 0;            /* don't be silent (default) */
                     29: int trace      = 0;            /* initial setting of &trace */
                     30: 
                     31: FILE *infile;                  /* current input file */
                     32: FILE *codefile;                /* current ucode output file */
                     33: FILE *globfile;                /* current global table output file */
                     34: char codename[MaxName];        /* name of ucode output file */
                     35: char globname[MaxName];        /* name of global table output file */
                     36: 
                     37: char *filelist[MaxFiles];      /* list of input file names */
                     38: char **filep;                  /* pointer to current input file name */
                     39: 
                     40: main(argc,argv)
                     41: int argc;
                     42: char **argv;
                     43:    {
                     44:    int aval;
                     45:    int mflag = 0;              /* m4 preprocessed */
                     46:    char *progname;
                     47:    static char mname[80];      /* m4 command string */
                     48:    register char **fp;         /* indexes filelist while scanning args */
                     49:    char *maknam();
                     50: #ifndef MSDOS
                     51:    extern FILE *popen();
                     52: #endif MSDOS
                     53: 
                     54:    progname = "itran";
                     55:    filep = fp = filelist;
                     56:    while (--argc) {
                     57:       if (**++argv == '-') {    /* argument starts with a '-' */
                     58:         switch ((*argv)[1]) {
                     59:            case '\0':          /* read standard input */
                     60:               *fp++ = *argv;
                     61:               continue;
                     62:            case 'm':           /* process with m4 */
                     63:                mflag++;
                     64:                continue;
                     65:            case 'u':           /* tell ilink to note undeclared identifiers*/
                     66:                implicit = 0;
                     67:                continue;
                     68:            case 't':           /* tell ilink to turn on tracing */
                     69:                trace++;
                     70:                continue;
                     71:            case 's':           /* don't produce informative messages */
                     72:                silence++;
                     73:                continue;
                     74:            case 'D':           /* debug flag for ilink, ignored by itran */
                     75:                continue;
                     76: #ifdef VMS
                     77:            case 'r':
                     78: #endif VMS
                     79:            case 'S':
                     80:               if ((*argv)[3] == 'h') { /* change hash table size */
                     81:                  aval = atoi(&(*argv)[4]);
                     82:                  if (aval <= 0)
                     83:                     goto badarg;
                     84:                  switch ((*argv)[2]) {
                     85:                     case 'i': ihsize = aval; continue;
                     86:                     case 'g': ghsize = aval; continue;
                     87:                     case 'c': chsize = aval; continue;
                     88:                     case 'l': lhsize = aval; continue;
                     89:                     case 'f': continue;
                     90:                     }
                     91:                  }
                     92:               else {                   /* change symbol table size */
                     93:                  aval = atoi(&(*argv)[3]);
                     94:                  if (aval <= 0)
                     95:                     goto badarg;
                     96:                  switch ((*argv)[2]) {
                     97:                     case 'c': csize = aval; continue;
                     98:                     case 'i': isize = aval; continue;
                     99:                     case 'g': gsize = aval; continue;
                    100:                     case 'l': lsize = aval; continue;
                    101:                     case 's': ssize = aval; continue;
                    102:                     case 't': tsize = aval; continue;
                    103:                     case 'f': continue;
                    104:                     case 'r': continue;
                    105:                     case 'L': continue;
                    106:                     case 'C': continue;
                    107:                     }
                    108:                  }
                    109:            default:
                    110:            badarg:
                    111:               fprintf(stderr, "bad argument: %s\n", *argv);
                    112:               continue;
                    113:            }
                    114:         }
                    115:       else     /* argument doesn't start with a '-', assume it's a file */
                    116:         *fp++ = *argv;
                    117:       }
                    118:    *fp++ = 0;  /* terminate list of files with a NULL */
                    119:    /*
                    120:     * Process each input file in turn. If m4 processing is to be done (mflag
                    121:     *  is set), a pipe is opened to m4 with the current file name, otherwise,
                    122:     *  the input file is opened.  infile is the file pointer for the current
                    123:     *  input file and filep is the name of the file.
                    124:     */
                    125:    for ( ; *filep; filep++) {
                    126:       inline = 1;
                    127:       if (!mflag) {
                    128:         if (*filep[0] == '-')
                    129:            infile = stdin;
                    130:         else
                    131: #ifndef VMS
                    132: #ifndef MSDOS
                    133:            infile = fopen(*filep, "r");
                    134: #else MSDOS
                    135:         /*
                    136:         *  Under MSDOS, if no extension provided then append ".icn".
                    137:         */
                    138:         {
                    139:            char   *cp, lastch = 0;
                    140: 
                    141:            cp = *filep;
                    142:            while( *cp )
                    143:            {
                    144:                if ( *cp == '.'  ||
                    145:                     *cp == '\\' ||
                    146:                     *cp == '/'  ||
                    147:                     *cp == ':'  )
                    148:                   lastch = *cp;
                    149:               cp++;
                    150:            }
                    151:            if ( lastch != '.' )
                    152:            {
                    153:               strcpy( mname, *filep );
                    154:               strcat( mname, ".icn" );
                    155:               *filep = mname;
                    156:            }
                    157:            infile = fopen( *filep, "r" );
                    158:         }
                    159: #endif MSDOS
                    160: #else VMS
                    161:         /*
                    162:         *  Under VMS, if no extension provided then append ".icn".
                    163:         */
                    164:         {
                    165:            char   *cp, lastch = 0;
                    166: 
                    167:            cp = *filep;
                    168:            while( *cp )
                    169:            {
                    170:                if ( *cp == '.'  ||  *cp == ']'  ||  *cp == ':' )
                    171:                   lastch = *cp;
                    172:               cp++;
                    173:            }
                    174:            if ( lastch != '.' )
                    175:            {
                    176:               strcpy( mname, *filep );
                    177:               strcat( mname, ".icn" );
                    178:               *filep = mname;
                    179:            }
                    180:            infile = fopen( *filep, "r" );
                    181:         }
                    182: #endif VMS
                    183:         }
                    184:       else {
                    185: #ifndef VMS
                    186: #ifndef MSDOS
                    187:         strcpy(mname, "m4 ");
                    188:         strcat(mname, *filep);
                    189:         infile = popen(mname, "r");
                    190: #else MSDOS
                    191:         fprintf(stderr, "-m option not supported\n");
                    192:         exit(ErrorExit);
                    193: #endif MSDOS
                    194: #else VMS
                    195:         fprintf(stderr, "-m option not supported\n");
                    196:         exit(ErrorExit);
                    197: #endif VMS
                    198:         }
                    199:       if (*filep[0] == '-')
                    200:         *filep = "stdin";
                    201:       if (infile == NULL) {
                    202:         fprintf(stderr, "%s: cannot open %s\n", progname, *filep);
                    203:         fatalerrs++;
                    204:         continue;
                    205:         }
                    206: 
                    207:       if (!silence)
                    208:         fprintf(stderr, "%s:\n", *filep);
                    209: 
                    210:       /*
                    211:        * Form names for the .u1 and .u2 files and open them.
                    212:        */
                    213:       maknam(codename, *filep, ".u1");
                    214:       maknam(globname, *filep, ".u2");
                    215:       codefile = fopen(codename, "w");
                    216:       if (codefile == NULL) {
                    217:         fprintf(stderr, "%s: cannot create %s\n", progname, codename);
                    218:         fatalerrs++;
                    219:         continue;
                    220:         }
                    221:       globfile = fopen(globname, "w");
                    222:       if (globfile == NULL) {
                    223:         fprintf(stderr, "%s: cannot create %s\n", progname, globname);
                    224:         fatalerrs++;
                    225:         continue;
                    226:         }
                    227: 
                    228:       fprintf(globfile,"version\t%s\n",UVersion);               /* ucode serial number */
                    229:       meminit();       /* Initialize data structures */
                    230: 
                    231:       yyparse();       /* Parse the input */
                    232: 
                    233:       /*
                    234:        * Close the input file and the .u1 and .u2 files.
                    235:        */
                    236:       if (!mflag)
                    237:         fclose(infile);
                    238: #ifndef VMS
                    239: #ifndef MSDOS
                    240:       else {
                    241:         if (pclose(infile) != 0) {
                    242:            fprintf(stderr, "%s: m4 terminated abnormally\n", progname);
                    243:            fatalerrs++;
                    244:            }
                    245:         }
                    246: #endif MSDOS
                    247: #endif VMS
                    248:       fclose(codefile);
                    249:       fclose(globfile);
                    250:       }
                    251: 
                    252:    /*
                    253:     * Produce information about errors and warnings and be correct about it.
                    254:     */
                    255:    if (fatalerrs == 1)
                    256:       fprintf(stderr, "1 error; ");
                    257:    else if (fatalerrs > 1)
                    258:       fprintf(stderr, "%d errors; ", fatalerrs);
                    259:    else if (!silence)
                    260:       fprintf(stderr, "No errors; ");
                    261:    if (warnings == 1)
                    262:       fprintf(stderr, "1 warning\n");
                    263:    else if (warnings > 1)
                    264:       fprintf(stderr, "%d warnings\n", warnings);
                    265:    else if (!silence)
                    266:       fprintf(stderr, "no warnings\n");
                    267:    else if (fatalerrs > 0)
                    268:       fprintf(stderr, "\n");
                    269:    if (fatalerrs > 0)
                    270:       exit(ErrorExit);
                    271: #ifdef TranStats
                    272:    tokdump();
                    273: #endif TranStats
                    274:    exit(NormalExit);
                    275:    }
                    276: 
                    277: /*
                    278:  * maknam - makes a file name from prefix and suffix.
                    279:  *
                    280:  * Uses only the last file specification if name is a path,
                    281:  * replaces suffix of name with suffix argument.
                    282:  */
                    283: 
                    284: char *maknam(dest, name, suffix)
                    285: char *dest, *name, *suffix;
                    286:    {
                    287:    register char *d, *pre, *suf;
                    288:    char *mark;
                    289: 
                    290:    d = dest;
                    291:    pre = name;
                    292:    suf = suffix;
                    293:    mark = pre;
                    294:    while (*pre)                /* find last delimiter */
                    295: #ifndef VMS
                    296: #ifndef MSDOS
                    297:       if (*pre++ == '/')
                    298:         mark = pre;
                    299: #else MSDOS
                    300:       if (*pre == ':' || *pre == '/' || *pre == '\\')
                    301:         mark = ++pre;
                    302:       else
                    303:         ++pre;
                    304: #endif MSDOS
                    305: #else VMS
                    306:       if (*pre == ']'  ||  *pre == ':' )
                    307:         mark = ++pre;
                    308:       else
                    309:         ++pre;
                    310: #endif VMS
                    311:    pre = mark;
                    312:    mark = 0;
                    313:    while (*d = *pre++)         /* copy from last slash into dest */
                    314:       if (*d++ == '.')          /*   look for last dot, too */
                    315:         mark = d - 1;
                    316:    if (mark)                   /* if no dot, just append suffix */
                    317:       d = mark;
                    318:    while (*d++ = *suf++) ;     /* copy suffix into dest */
                    319:    return dest;
                    320:    }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.