|
|
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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.