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

1.1       root        1: #include <stdio.h>
                      2: #include "../h/config.h"
                      3: #include "../h/paths.h"
                      4: #define MaxArgs 30
                      5: #define PathSize 100   /* maximum length of a fully qualified file name */
                      6: #ifndef Itran
                      7: #define Itran TranPath
                      8: #endif
                      9: #ifndef Ilink
                     10: #define Ilink LinkPath
                     11: #endif
                     12: #ifndef Iconx
                     13: #define Iconx IconxPath
                     14: #endif Iconx
                     15: 
                     16: 
                     17: char **rfiles;
                     18: 
                     19: 
                     20: main(argc,argv,envp)
                     21: int argc; char **argv, **envp;
                     22:    {
                     23:    char **tfiles;
                     24:    char **lfiles;
                     25:    char **execlist;
                     26:    char *tflags[MaxArgs];
                     27:    char *lflags[MaxArgs];
                     28:    char **xargs;
                     29:    int ntf, nlf, nrf, ntflags, nlflags, cflag, quiet;
                     30:    char **arg;
                     31:    char *base, *getbase();
                     32:    char *u1, *u2, *xfile;
                     33:    char *rindex(), *mkname();
                     34:    char cmd[PathSize];
                     35:    
                     36:    ntf = nlf = nrf = ntflags = nlflags = cflag = quiet = 0;
                     37:    xargs = NULL;
                     38:    rfiles = (char **)calloc(2*(argc+10), sizeof(char **));
                     39:    tfiles = (char **)calloc(argc+10, sizeof(char **));
                     40:    lfiles = (char **)calloc(argc+10, sizeof(char **));
                     41:    execlist = (char **)calloc(2*(argc+10), sizeof(char **));
                     42: 
                     43:    tflags[ntflags++] = "itran";
                     44:    lflags[nlflags++] = "ilink";
                     45:    lflags[nlflags++] = "-i";
                     46:    lflags[nlflags++] = Iconx;
                     47:    xfile = "";
                     48:    
                     49:    for (arg = &argv[1]; arg <= &argv[argc-1]; arg++) {
                     50:       if ((*arg)[0] == '-') switch ((*arg)[1]) {
                     51:          case '\0': /* "-" */
                     52:             tfiles[ntf++] = *arg;
                     53:             lfiles[nlf++] = rfiles[nrf++]
                     54:               = "stdin.u1";
                     55:             rfiles[nrf++] = "stdin.u2";
                     56:             break;
                     57:          case 's':
                     58:             tflags[ntflags++] = "-s";
                     59:             quiet++;
                     60:             break;
                     61:          case 'o':
                     62:             lfiles[nlf++] = "-o";
                     63:             xfile = lfiles[nlf++] = *++arg;
                     64:             break;
                     65:          case 'x':
                     66:             xargs = arg++;
                     67:             goto argsdone;
                     68:          case 'c':
                     69:             cflag++;
                     70:             break;
                     71:          default:
                     72:             lflags[nlflags++] = tflags[ntflags++] = *arg;
                     73:             break;
                     74:             }
                     75:       else if (suffix(*arg,".icn")) {
                     76:          tfiles[ntf++] = *arg;
                     77:          base = getbase(*arg,".icn");
                     78:          u1 = mkname(base,".u1");
                     79:          u2 = mkname(base,".u2");
                     80:          lfiles[nlf++] = rfiles[nrf++] = u1;
                     81:          rfiles[nrf++] = u2;
                     82:          }
                     83:       else if (suffix(*arg,".u1")) {
                     84:          lfiles[nlf++] = *arg;
                     85:          }
                     86:       else {
                     87:          fprintf(stderr,"icont: bad argument '%s'\n",*arg);
                     88:          exit(ErrorExit);
                     89:          }
                     90:       }
                     91: argsdone:
                     92:    if (nlf == 0)
                     93:       usage("icont");
                     94:    if (!xfile[0])
                     95:       xfile = getbase(lfiles[0],".u1");
                     96:    
                     97:    if (ntf != 0) {
                     98:       tflags[ntflags] = NULL;
                     99:       tfiles[ntf] = NULL;
                    100:       lcat(execlist,tflags,tfiles);
                    101:       runit(Itran,execlist,envp);
                    102:       }
                    103:    if (cflag) {
                    104:       exit(NormalExit);
                    105:       }
                    106:    if (!quiet)
                    107:       fprintf(stderr,"Linking:\n");
                    108:    execlist[0] = 0;
                    109:    lflags[nlflags] = NULL;
                    110:    lfiles[nlf] = NULL;
                    111:    lcat(execlist,lflags,lfiles);
                    112:    runit(Ilink,execlist,envp);
                    113:    rmfiles();
                    114:    chmod(xfile,0755);
                    115:    if (xargs) {
                    116:       if (!quiet)
                    117:          fprintf(stderr,"Executing:\n");
                    118:       xargs[0] = xfile;
                    119:       execlist[0] = "iconx";
                    120:       execlist[1] = 0;
                    121:       lcat(execlist,xargs,0);
                    122:       execv(Iconx,execlist);
                    123:       }
                    124:    exit(NormalExit);
                    125:    }
                    126: 
                    127: 
                    128: runit(c,a,e)
                    129: char *c; char **a, **e;
                    130:    {
                    131:    int rc;
                    132:    if ((rc = docmd(c,a,e)) != 0) {
                    133:       rmfiles();
                    134:       exit(ErrorExit);
                    135:       }
                    136:    }
                    137: 
                    138: rmfiles()
                    139:    {
                    140:    char **p;
                    141:    for (p = rfiles;  *p;  p++)
                    142: #ifndef VMS
                    143:       unlink(*p);
                    144: #else
                    145:       delete(*p);
                    146: #endif
                    147:    }
                    148: 
                    149: 
                    150: suffix(name,suf)
                    151: char *name,*suf;
                    152:    {
                    153:    char *rindex(), *x;
                    154: 
                    155:    if (x = rindex(name,'.'))
                    156:       return !strcmp(suf,x);
                    157:    else
                    158:       return 0;
                    159:    }
                    160: 
                    161: 
                    162: char *
                    163: mkname(name,suf)
                    164: char *name,*suf;
                    165:    {
                    166:    char *p, *malloc();
                    167:    
                    168:    p = malloc(PathSize);
                    169:    strcpy(p,name);
                    170:    strcat(p,suf);
                    171:    return p;
                    172:    }
                    173: 
                    174: 
                    175: char *
                    176: getbase(name,suf)
                    177: char *name,*suf;
                    178:    {
                    179:    char *f,*e, *rindex(), *p, *malloc();
                    180:    
                    181:    if (f = rindex(name,'/'))
                    182:       f++;
                    183: #ifdef VMS
                    184:    else if ((f = rindex(name,']')) || (f = rindex(name,':')))
                    185:       f++;
                    186: #endif VMS
                    187:    else
                    188:       f = name;
                    189:    e = rindex(f,'.');
                    190:    p = malloc(PathSize);
                    191:    strncpy(p,f,e-f);
                    192:    return p;
                    193:    }
                    194: 
                    195: 
                    196: lcat(c,a,b)
                    197: int c[],a[],b[];
                    198:    {
                    199:    int cp,p;
                    200:    
                    201:    cp = p = 0;
                    202:    while (c[cp])
                    203:       cp++;
                    204:    while (c[cp] = a[p++])
                    205:       cp++;
                    206:    p = 0;
                    207:    if (b)
                    208:       while (c[cp++] = b[p++]);
                    209:    }
                    210: 
                    211: 
                    212: usage(p)
                    213: char *p;
                    214:    {
                    215:    fprintf(stderr,"usage: %s [-c] [-m] [-t] [-u] file ... [-x args]\n",p);
                    216:    exit(ErrorExit);
                    217:    }
                    218: 
                    219: 
                    220: docmd(cmd,argv,envp)
                    221: char *cmd, **argv, **envp;
                    222:    {
                    223:    int rc, stat;
                    224:    rc = Fork();
                    225:    if (rc == -1) {
                    226:       fprintf(stderr,"No more processes\n");
                    227:       return 255;
                    228:       }
                    229:    if (rc == 0) {
                    230:       execve(cmd,argv,envp);
                    231:       fprintf(stderr,"exec failed on %s\n",cmd);
                    232:       _exit(ErrorExit);
                    233:       }
                    234:    while (rc != wait(&stat));
                    235: #ifndef VMS
                    236:    return ((stat>>8) & 0xff);
                    237: #else VMS
                    238:    return (!(stat&1));
                    239: #endif VMS
                    240:    }
                    241: 
                    242: 
                    243: plist(title,list)
                    244: char *title, **list;
                    245:    {
                    246:    char **p;
                    247:    printf("\n%s\n",title);
                    248:    for (p = list; *p; p++)
                    249:       printf("'%s'\n",*p);
                    250:    }

unix.superglobalmegacorp.com

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