|
|
1.1 ! root 1: typedef unsigned char u_char; ! 2: typedef unsigned short u_short; ! 3: typedef unsigned int u_int; ! 4: typedef unsigned long u_long; ! 5: typedef struct _physadr { int r[1]; } *physadr; ! 6: typedef int daddr_t; ! 7: typedef char * caddr_t; ! 8: typedef u_short ino_t; ! 9: typedef int swblk_t; ! 10: typedef int size_t; ! 11: typedef int time_t; ! 12: typedef int label_t[14]; ! 13: typedef short dev_t; ! 14: typedef int off_t; ! 15: typedef long portid_t; ! 16: typedef struct fd_set { int fds_bits[1]; } fd_set; ! 17: extern struct _iobuf { ! 18: int _cnt; ! 19: unsigned char *_ptr; ! 20: unsigned char *_base; ! 21: short _flag; ! 22: char _file; ! 23: } _iob[20]; ! 24: struct _iobuf *fopen(); ! 25: struct _iobuf *fdopen(); ! 26: struct _iobuf *freopen(); ! 27: long ftell(); ! 28: char *fgets(); ! 29: extern char _ctype[]; ! 30: typedef int (*SIG_TYP)(); ! 31: SIG_TYP signal(); ! 32: struct dir ! 33: { ! 34: ino_t d_ino; ! 35: char d_name[14]; ! 36: }; ! 37: struct vtimes { ! 38: int vm_utime; ! 39: int vm_stime; ! 40: ! 41: unsigned vm_idsrss; ! 42: unsigned vm_ixrss; ! 43: int vm_maxrss; ! 44: int vm_majflt; ! 45: int vm_minflt; ! 46: int vm_nswap; ! 47: int vm_inblk; ! 48: int vm_oublk; ! 49: }; ! 50: struct timeb ! 51: { ! 52: time_t time; ! 53: unsigned short millitm; ! 54: short timezone; ! 55: short dstflag; ! 56: }; ! 57: struct vtimes newv, oldv; ! 58: struct timeb newt, oldt; ! 59: char *cpp = "/lib/cpp"; ! 60: char *ccom = "/usr/pjw/comp/vcc/comp.sv"; ! 61: char *c2 = "/lib/c2"; ! 62: char *as = "/bin/as"; ! 63: char *ld = "/bin/ld"; ! 64: char *crt0 = "/lib/crt0.o"; ! 65: char tmp0[30]; ! 66: char *tmp1, *tmp2, *tmp3, *tmp4, *tmp5; ! 67: char *outfile; ! 68: char *savestr(), *strspl(), *setsuf(); ! 69: int idexit(); ! 70: char **av, **clist, **llist, **plist; ! 71: int cflag, eflag, gflag, oflag, pflag, sflag, wflag, Rflag, exflag, proflag; ! 72: int vflag; ! 73: char *dflag; ! 74: int exfail; ! 75: char *chpass; ! 76: char *npassname; ! 77: extern int optind; ! 78: extern int opterr; ! 79: extern char *optarg; ! 80: extern int optopt; ! 81: int nc, nl, np, nxo, na; ! 82: main(argc, argv) ! 83: char **argv; ! 84: { ! 85: char *t; ! 86: char *assource; ! 87: int i, j, c; ! 88: ! 89: av = (char **)calloc(argc+10, sizeof (char **)); ! 90: clist = (char **)calloc(argc, sizeof (char **)); ! 91: llist = (char **)calloc(argc, sizeof (char **)); ! 92: plist = (char **)calloc(argc, sizeof (char **)); ! 93: opterr = 0; ! 94: while (optind<argc) switch (c = getopt(argc, argv, "vsSo:ROPgwEpPcD:I:U:C:t:B:l:d:")) { ! 95: case 'v': ! 96: vflag++; ! 97: continue; ! 98: case 'S': ! 99: sflag++; ! 100: cflag++; ! 101: continue; ! 102: case 'l': ! 103: llist[nl++] = strspl("-l", optarg); ! 104: continue; ! 105: case 'o': ! 106: outfile = optarg; ! 107: switch (getsuf(outfile)) { ! 108: case 'c': ! 109: case 'o': ! 110: error("-o would overwrite %s", outfile); ! 111: exit(8); ! 112: } ! 113: continue; ! 114: case 'R': ! 115: Rflag++; ! 116: continue; ! 117: case 'O': ! 118: oflag++; ! 119: continue; ! 120: case 'p': ! 121: proflag++; ! 122: continue; ! 123: case 'g': ! 124: gflag++; ! 125: continue; ! 126: case 'w': ! 127: wflag++; ! 128: continue; ! 129: case 'E': ! 130: exflag++; ! 131: case 'P': ! 132: pflag++; ! 133: t = strspl("-", "x"); ! 134: t[1] = optopt; ! 135: plist[np++] = t; ! 136: case 'c': ! 137: cflag++; ! 138: continue; ! 139: case 'D': ! 140: case 'I': ! 141: case 'U': ! 142: case 'C': ! 143: plist[np] = strspl("-X", optarg); ! 144: plist[np++][1] = c; ! 145: continue; ! 146: case 't': ! 147: if (chpass) ! 148: error("-t overwrites earlier option", 0); ! 149: chpass = optarg; ! 150: if (chpass[0]==0) ! 151: chpass = "012p"; ! 152: continue; ! 153: case 'B': ! 154: if (npassname) ! 155: error("-B overwrites earlier option", 0); ! 156: npassname = optarg; ! 157: if (npassname[0]==0) ! 158: npassname = "/usr/c/o"; ! 159: continue; ! 160: case 'd': ! 161: dflag = strspl("-d", optarg); ! 162: continue; ! 163: case '?': ! 164: case 's': ! 165: t = strspl("-", "x"); ! 166: t[1] = optopt; ! 167: llist[nl++] = t; ! 168: continue; ! 169: case (-1): ! 170: t = argv[optind]; ! 171: optind++; ! 172: c = getsuf(t); ! 173: if (c=='c' || c=='s' || c=='i' || exflag) { ! 174: clist[nc++] = t; ! 175: t = setsuf(t, 'o'); ! 176: } ! 177: if (nodup(llist, t)) { ! 178: llist[nl++] = t; ! 179: if (getsuf(t)=='o') ! 180: nxo++; ! 181: } ! 182: } ! 183: if (gflag) { ! 184: if (oflag) ! 185: fprintf((&_iob[2]), "cc: warning: -g disables -O\n"); ! 186: oflag = 0; ! 187: } ! 188: if (npassname && chpass ==0) ! 189: chpass = "012p"; ! 190: if (chpass && npassname==0) ! 191: npassname = "/usr/new"; ! 192: if (chpass) ! 193: for (t=chpass; *t; t++) { ! 194: switch (*t) { ! 195: case '0': ! 196: ccom = strspl(npassname, "ccom"); ! 197: continue; ! 198: case '2': ! 199: c2 = strspl(npassname, "c2"); ! 200: continue; ! 201: case 'p': ! 202: cpp = strspl(npassname, "cpp"); ! 203: continue; ! 204: } ! 205: } ! 206: if (proflag) ! 207: crt0 = "/lib/mcrt0.o"; ! 208: if (nc==0) ! 209: goto nocom; ! 210: if (signal(2 , (int (*)())1) != (int (*)())1) ! 211: (void)signal(2 , idexit); ! 212: if (signal(15 , (int (*)())1) != (int (*)())1) ! 213: (void)signal(15 , idexit); ! 214: if (pflag==0) ! 215: sprintf(tmp0, "/tmp/ctm%05.5d", getpid()); ! 216: tmp1 = strspl(tmp0, "1"); ! 217: tmp2 = strspl(tmp0, "2"); ! 218: tmp3 = strspl(tmp0, "3"); ! 219: if (pflag==0) ! 220: tmp4 = strspl(tmp0, "4"); ! 221: if (oflag) ! 222: tmp5 = strspl(tmp0, "5"); ! 223: for (i=0; i<nc; i++) { ! 224: int suffix = getsuf(clist[i]); ! 225: if (nc > 1) { ! 226: printf("%s:\n", clist[i]); ! 227: fflush((&_iob[1])); ! 228: } ! 229: if (suffix == 's') { ! 230: assource = clist[i]; ! 231: goto assemble; ! 232: } else ! 233: assource = tmp3; ! 234: if (suffix == 'i') ! 235: goto compile; ! 236: if (pflag) ! 237: tmp4 = setsuf(clist[i], 'i'); ! 238: av[0] = "cpp"; ! 239: av[1] = clist[i]; ! 240: av[2] = exflag ? "-" : tmp4; ! 241: na = 3; ! 242: for (j = 0; j < np; j++) ! 243: av[na++] = plist[j]; ! 244: av[na++] = 0; ! 245: switch (callsys(cpp, av)) { ! 246: case 0: ! 247: break; ! 248: default: ! 249: if (callsys("/lib/cpre",av)) { ! 250: exfail++; ! 251: exflag++; ! 252: } ! 253: } ! 254: if (pflag || exfail) { ! 255: cflag++; ! 256: continue; ! 257: } ! 258: if (sflag) ! 259: assource = tmp3 = setsuf(clist[i], 's'); ! 260: compile: ! 261: av[0] = "ccom"; ! 262: av[1] = suffix=='i'? clist[i]: tmp4; ! 263: av[2] = oflag? tmp5:tmp3; ! 264: na = 3; ! 265: if (proflag) ! 266: av[na++] = "-XP"; ! 267: if (gflag) ! 268: av[na++] = "-Xg"; ! 269: if (wflag) ! 270: av[na++] = "-w"; ! 271: av[na] = 0; ! 272: if (callsys(ccom, av)) { ! 273: cflag++; ! 274: eflag++; ! 275: continue; ! 276: } ! 277: if (oflag) { ! 278: av[0] = "c2"; av[1] = tmp5; av[2] = tmp3; av[3] = 0; ! 279: if (callsys(c2, av)) { ! 280: unlink(tmp3); ! 281: tmp3 = assource = tmp5; ! 282: } else ! 283: unlink(tmp5); ! 284: } ! 285: if (sflag) ! 286: continue; ! 287: assemble: ! 288: if (tmp1) unlink(tmp1); if (tmp2) unlink(tmp2); if (tmp4) unlink(tmp4); ! 289: av[0] = "as"; av[1] = "-o"; av[2] = setsuf(clist[i], 'o'); ! 290: na = 3; ! 291: if (Rflag) ! 292: av[na++] = "-R"; ! 293: if (dflag) ! 294: av[na++] = dflag; ! 295: av[na++] = assource; ! 296: av[na] = 0; ! 297: if (callsys(as, av) > 1) { ! 298: cflag++; ! 299: eflag++; ! 300: continue; ! 301: } ! 302: } ! 303: nocom: ! 304: if (cflag==0 && nl!=0) { ! 305: i = 0; ! 306: av[0] = "ld"; av[1] = "-X"; av[2] = crt0; na = 3; ! 307: if (outfile) { ! 308: av[na++] = "-o"; ! 309: av[na++] = outfile; ! 310: } ! 311: while (i < nl) ! 312: av[na++] = llist[i++]; ! 313: if (gflag) ! 314: av[na++] = "-lg"; ! 315: av[na++] = "-lc"; ! 316: av[na++] = 0; ! 317: eflag |= callsys(ld, av); ! 318: if (nc==1 && nxo==1 && eflag==0) ! 319: unlink(setsuf(clist[0], 'o')); ! 320: } ! 321: dexit(); ! 322: } ! 323: idexit() ! 324: { ! 325: eflag = 100; ! 326: dexit(); ! 327: } ! 328: dexit() ! 329: { ! 330: if (!pflag) { ! 331: if (tmp1) unlink(tmp1); ! 332: if (tmp2) unlink(tmp2); ! 333: if (sflag==0) ! 334: if (tmp3) unlink(tmp3); ! 335: if (tmp4) unlink(tmp4); ! 336: if (tmp5) unlink(tmp5); ! 337: } ! 338: exit(eflag); ! 339: } ! 340: error(s, x) ! 341: char *s, *x; ! 342: { ! 343: struct _iobuf *diag = exflag ? (&_iob[2]) : (&_iob[1]); ! 344: fprintf(diag, "cc: "); ! 345: fprintf(diag, s, x); ! 346: (--( diag)->_cnt>=0? ((int)(*( diag)->_ptr++=(unsigned)('\n'))):_flsbuf((unsigned)('\n'), diag)); ! 347: exfail++; ! 348: cflag++; ! 349: eflag++; ! 350: } ! 351: getsuf(as) ! 352: char as[]; ! 353: { ! 354: register int c; ! 355: register char *s; ! 356: register int t; ! 357: s = as; ! 358: c = 0; ! 359: while (t = *s++) ! 360: if (t=='/') ! 361: c = 0; ! 362: else ! 363: c++; ! 364: s -= 3; ! 365: if (c <= 14 && c > 2 && *s++ == '.') ! 366: return (*s); ! 367: return (0); ! 368: } ! 369: char * ! 370: setsuf(as, ch) ! 371: char *as; ! 372: { ! 373: register char *s, *s1; ! 374: s = s1 = savestr(as); ! 375: while (*s) ! 376: if (*s++ == '/') ! 377: s1 = s; ! 378: s[-1] = ch; ! 379: return (s1); ! 380: } ! 381: callsys(f, v) ! 382: char *f, **v; ! 383: { ! 384: int t, status; ! 385: register char **vp; ! 386: if(vflag) { ! 387: vp = v; ! 388: fprintf((&_iob[2]),"+ "); ! 389: while (*vp) ! 390: fprintf((&_iob[2]),"%s ",*vp++); ! 391: fprintf((&_iob[2]), "\n"); ! 392: } ! 393: ftime(&oldt); ! 394: vtimes(0, &oldv); ! 395: t = vfork(); ! 396: if (t == -1) { ! 397: printf("No more processes\n"); ! 398: return (100); ! 399: } ! 400: if (t == 0) { ! 401: execv(f, v); ! 402: printf("Can't find %s\n", f); ! 403: fflush((&_iob[1])); ! 404: _exit(100); ! 405: } ! 406: while (t != wait(&status)) ! 407: ; ! 408: ftime(&newt); ! 409: vtimes(0, &newv); ! 410: printf("%s\n", f); ! 411: printf("real %g user %g sys %g ", newt.time - oldt.time ! 412: + newt.millitm / 1000. - oldt.millitm / 1000., ! 413: (newv.vm_utime - oldv.vm_utime) / 60., ! 414: (newv.vm_stime - oldv.vm_stime) / 60.); ! 415: printf("reads %d writes %d\n", newv.vm_inblk - oldv.vm_inblk, ! 416: newv.vm_oublk - oldv.vm_oublk); ! 417: if ((t=(status&0377)) != 0 && t!=14) { ! 418: if (t!=2) { ! 419: printf("Fatal error in %s\n", f); ! 420: eflag = 8; ! 421: } ! 422: dexit(); ! 423: } ! 424: return ((status>>8) & 0377); ! 425: } ! 426: nodup(l, os) ! 427: char **l, *os; ! 428: { ! 429: register char *t, *s; ! 430: register int c; ! 431: s = os; ! 432: if (getsuf(s) != 'o') ! 433: return (1); ! 434: while (t = *l++) { ! 435: while (c = *s++) ! 436: if (c != *t++) ! 437: break; ! 438: if (*t==0 && c==0) ! 439: return (0); ! 440: s = os; ! 441: } ! 442: return (1); ! 443: } ! 444: char *savetab; ! 445: int saveleft; ! 446: char * ! 447: savestr(cp) ! 448: register char *cp; ! 449: { ! 450: register int len; ! 451: len = strlen(cp) + 1; ! 452: if (len > saveleft) { ! 453: saveleft = 1024; ! 454: if (len > saveleft) ! 455: saveleft = len; ! 456: savetab = (char *)malloc(saveleft); ! 457: if (savetab == 0) { ! 458: fprintf((&_iob[2]), "ran out of memory (savestr)\n"); ! 459: exit(1); ! 460: } ! 461: } ! 462: strncpy(savetab, cp, len); ! 463: cp = savetab; ! 464: savetab += len; ! 465: saveleft -= len; ! 466: return (cp); ! 467: } ! 468: char * ! 469: strspl(left, right) ! 470: char *left, *right; ! 471: { ! 472: char buf[1024]; ! 473: strcpy(buf, left); ! 474: strcat(buf, right); ! 475: return (savestr(buf)); ! 476: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.