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