Annotation of 43BSD/contrib/icon/bin/icont.c, revision 1.1

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

unix.superglobalmegacorp.com

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