Annotation of 43BSD/contrib/icon/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 "token.h"
                      9: 
                     10: #define MAXFILES 64            /* maximum number of file names */
                     11: #define MAXNAME  40            /* maximum length of file name */
                     12: 
                     13: int fatalerrs  = 0;            /* total number of fatal errors */
                     14: int warnings   = 0;            /* total number of warnings */
                     15: int nocode     = 0;            /* non-zero to suppress code generation */
                     16: int inline     = 1;            /* current input line number */
                     17: int incol      = 0;            /* current input column number */
                     18: int peekc      = 0;            /* one-character look ahead */
                     19: int implicit   = LOCAL;        /* implicit scope for undeclared identifiers */
                     20: int silence    = 0;            /* don't be silent (default) */
                     21: int trace      = 0;            /* initial setting of &trace */
                     22: 
                     23: FILE *infile;                  /* current input file */
                     24: FILE *codefile;                /* current ucode output file */
                     25: FILE *globfile;                /* current global table output file */
                     26: char inbuf[BUFSIZ];            /* buffers for above files */
                     27: char codebuf[BUFSIZ];          /*   to avoid automatic */
                     28: char globbuf[BUFSIZ];          /*   allocation by i/o system */
                     29: char codename[MAXNAME];        /* name of ucode output file */
                     30: char globname[MAXNAME];        /* name of global table output file */
                     31: 
                     32: char *filelist[MAXFILES];      /* list of input file names */
                     33: char **filep;                  /* pointer to current input file name */
                     34: 
                     35: main(argc,argv)
                     36: int argc;
                     37: char **argv;
                     38:    {
                     39:    int aval;
                     40:    int mflag = 0;              /* m4 preprocessed */
                     41:    char *progname;
                     42:    static char mname[80];      /* m4 command string */
                     43:    register char **fp;         /* indexes filelist while scanning args */
                     44:    char *maknam();
                     45:    extern FILE *popen();
                     46: 
                     47:    progname = argv[0];
                     48:    filep = fp = filelist;
                     49:    while (--argc) {
                     50:       if (**++argv == '-') {   /* argument starts with a '-' */
                     51:          switch ((*argv)[1]) {
                     52:             case '\0':         /* read standard input */
                     53:                *fp++ = *argv;
                     54:                continue;
                     55:             case 'm':          /* process with m4 */
                     56:                 mflag++;
                     57:                 continue;
                     58:             case 'u':          /* tell ilink to note undeclared identifiers*/
                     59:                 implicit = 0;
                     60:                 continue;
                     61:             case 't':          /* tell ilink to turn on tracing */
                     62:                 trace++;
                     63:                 continue;
                     64:             case 's':          /* don't produce informative messages */
                     65:                 silence++;
                     66:                 continue;
                     67:             case 'D':          /* debug flag for ilink, ignored by itran */
                     68:                 continue;
                     69:             case 'S':
                     70:                if ((*argv)[3] == 'h') { /* change hash table size */
                     71:                   aval = atoi(&(*argv)[4]);
                     72:                   if (aval <= 0)
                     73:                      goto badarg;
                     74:                   switch ((*argv)[2]) {
                     75:                      case 'i': ihsize = aval; continue;
                     76:                      case 'g': ghsize = aval; continue;
                     77:                      case 'c': chsize = aval; continue;
                     78:                      case 'l': lhsize = aval; continue;
                     79:                      case 'f': continue;
                     80:                      }
                     81:                   }
                     82:                else {                  /* change symbol table size */
                     83:                   aval = atoi(&(*argv)[3]);
                     84:                   if (aval <= 0)
                     85:                      goto badarg;
                     86:                   switch ((*argv)[2]) {
                     87:                      case 'c': csize = aval; continue;
                     88:                      case 'i': isize = aval; continue;
                     89:                      case 'g': gsize = aval; continue;
                     90:                      case 'l': lsize = aval; continue;
                     91:                      case 's': ssize = aval; continue;
                     92:                      case 't': tsize = aval; continue;
                     93:                      case 'f': continue;
                     94:                      case 'r': continue;
                     95:                      case 'L': continue;
                     96:                      case 'C': continue;
                     97:                      }
                     98:                   }
                     99:             default:
                    100:             badarg:
                    101:                fprintf(stderr, "bad argument: %s\n", *argv);
                    102:                continue;
                    103:             }
                    104:          }
                    105:       else     /* argument doesn't start with a '-', assume it's a file */
                    106:          *fp++ = *argv;
                    107:       }
                    108:    *fp++ = 0;  /* terminate list of files with a NULL */
                    109:    /*
                    110:     * Process each input file in turn. If m4 processing is to be done (mflag
                    111:     *  is set), a pipe is opened to m4 with the current file name, otherwise,
                    112:     *  the input file is opened.  infile is the file pointer for the current
                    113:     *  input file and filep is the name of the file.
                    114:     */
                    115:    for ( ; *filep; filep++) {
                    116:       inline = 1;
                    117:       if (!mflag) {
                    118:          if (*filep[0] == '-')
                    119:             infile = stdin;
                    120:          else
                    121:             infile = fopen(*filep, "r");
                    122:          }
                    123:       else {
                    124:          strcpy(mname, "m4 ");
                    125:          strcat(mname, *filep);
                    126:          infile = popen(mname, "r");
                    127:          }
                    128:       if (*filep[0] == '-')
                    129:          *filep = "stdin";
                    130:       if (infile == NULL) {
                    131:          fprintf(stderr, "%s: cannot open %s\n", progname, *filep);
                    132:          fatalerrs++;
                    133:          continue;
                    134:          }
                    135:       setbuf(infile, inbuf);
                    136: 
                    137:       if (!silence)
                    138:          fprintf(stderr, "%s:\n", *filep);
                    139: 
                    140:       /*
                    141:        * Form names for the .u1 and .u2 files and open them.
                    142:        */
                    143:       maknam(codename, *filep, ".u1");
                    144:       maknam(globname, *filep, ".u2");
                    145:       codefile = fopen(codename, "w");
                    146:       if (codefile == NULL) {
                    147:          fprintf(stderr, "%s: cannot create %s\n", progname, codename);
                    148:          fatalerrs++;
                    149:          continue;
                    150:          }
                    151:       setbuf(codefile, codebuf);
                    152:       globfile = fopen(globname, "w");
                    153:       if (globfile == NULL) {
                    154:          fprintf(stderr, "%s: cannot create %s\n", progname, globname);
                    155:          fatalerrs++;
                    156:          continue;
                    157:          }
                    158:       setbuf(globfile, globbuf);
                    159: 
                    160:       meminit();       /* Initialize data structures */
                    161: 
                    162:       yyparse();       /* Parse the input */
                    163: 
                    164:       /*
                    165:        * Close the input file and the .u1 and .u2 files.
                    166:        */
                    167:       if (!mflag)
                    168:          fclose(infile);
                    169:       else {
                    170:          if (pclose(infile) != 0) {
                    171:             fprintf(stderr, "%s: m4 terminated abnormally\n", progname);
                    172:             fatalerrs++;
                    173:             }
                    174:          }
                    175:       fclose(codefile);
                    176:       fclose(globfile);
                    177:       }
                    178: 
                    179:    /*
                    180:     * Produce information about errors and warnings and be correct about it.
                    181:     */
                    182:    if (fatalerrs == 1)
                    183:       fprintf(stderr, "1 error; ");
                    184:    else if (fatalerrs > 1)
                    185:       fprintf(stderr, "%d errors; ", fatalerrs);
                    186:    else if (!silence)
                    187:       fprintf(stderr, "No errors; ");
                    188:    if (warnings == 1)
                    189:       fprintf(stderr, "1 warning\n");
                    190:    else if (warnings > 1)
                    191:       fprintf(stderr, "%d warnings\n", warnings);
                    192:    else if (!silence)
                    193:       fprintf(stderr, "no warnings\n");
                    194:    else if (fatalerrs > 0)
                    195:       fprintf(stderr, "\n");
                    196:    if (fatalerrs > 0)
                    197:       exit(1);
                    198:    exit(0);
                    199:    }
                    200: 
                    201: /*
                    202:  * maknam - makes a file name from prefix and suffix.
                    203:  *
                    204:  * Uses only the last file specification if name is a path,
                    205:  * replaces suffix of name with suffix argument.
                    206:  */
                    207: 
                    208: char *maknam(dest, name, suffix)
                    209: char *dest, *name, *suffix;
                    210:    {
                    211:    register char *d, *pre, *suf;
                    212:    char *mark;
                    213: 
                    214:    d = dest;
                    215:    pre = name;
                    216:    suf = suffix;
                    217:    mark = pre;
                    218:    while (*pre)                /* find last slash */
                    219:       if (*pre++ == '/')
                    220:          mark = pre;
                    221:    pre = mark;
                    222:    mark = 0;
                    223:    while (*d = *pre++)         /* copy from last slash into dest */
                    224:       if (*d++ == '.')         /*   look for last dot, too */
                    225:          mark = d - 1;
                    226:    if (mark)                   /* if no dot, just append suffix */
                    227:       d = mark;
                    228:    while (*d++ = *suf++) ;     /* copy suffix into dest */
                    229:    return (dest);
                    230:    }

unix.superglobalmegacorp.com

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