|
|
1.1 ! root 1: head 1.4; ! 2: access ; ! 3: symbols ; ! 4: locks bin:1.4; ! 5: comment @ * @; ! 6: ! 7: ! 8: 1.4 ! 9: date 91.02.16.09.49.54; author bin; state Exp; ! 10: branches ; ! 11: next 1.3; ! 12: ! 13: 1.3 ! 14: date 90.11.06.01.07.38; author bin; state Exp; ! 15: branches ; ! 16: next 1.2; ! 17: ! 18: 1.2 ! 19: date 90.09.19.17.13.12; author bin; state Exp; ! 20: branches ; ! 21: next 1.1; ! 22: ! 23: 1.1 ! 24: date 90.09.19.17.08.46; author bin; state Exp; ! 25: branches ; ! 26: next ; ! 27: ! 28: ! 29: desc ! 30: @steve 9/19/90 ! 31: Initial MWC RCS revision. ! 32: Corresponds to COHERENT V3.0.0 object. ! 33: @ ! 34: ! 35: ! 36: 1.4 ! 37: log ! 38: @steve 2/16/91 ! 39: At epstein's request, cc now passes "-w" switch to ld. ! 40: This is undocumented "watch" option giving verbose ld output. ! 41: @ ! 42: text ! 43: @/* ! 44: * cc.c ! 45: * 11/3/90 ! 46: * CC command. ! 47: * Compile, assemble and link edit C programs. ! 48: * A lot of grunge. ! 49: * Revised by rec may1987 to incorporate all ! 50: * coherent and gemdos revisions to date. ! 51: * ! 52: * Defining VeryVflag will produce very verbose output under -VSTAT ! 53: * option ! 54: * ! 55: * C compiler/loader switch map. ! 56: * *7 marks a version seven documented option. ! 57: * *7d marks a defunct version seven option. ! 58: * *7c marks a changed version seven option. ! 59: * *u marks an option unrecognized by cc, ie passed to linker ! 60: * with no interpretation or processing. ! 61: * ! 62: *7c Bstring use string to find compiler passes ! 63: * A run in auto edit mode ! 64: *7 Dname[=value] preprocessor: #define ! 65: *7 E run preprocessor to stdout ! 66: *7 Ipathname preprocessor: #include search directory ! 67: * K keep intermediate files in name.[P012so] ! 68: * L loader: directive for >64K file sizes ! 69: * Mstring use string as cross-compiler prefix ! 70: * N[01ab2sdlrt]string rename pass with string ! 71: *7 O run object code optimiser ! 72: *7d P put preprocessor output into name.i; use -Kqp ! 73: * Q be quiet, make no messages ! 74: *7 S make assembly language output in name.s ! 75: *7 Uname preprocessor: #undef ! 76: * V be verbose, report everything ! 77: * Vvariant enable variant ! 78: * X loader: remove c generated local symbols ! 79: * Z (GEMDOS) floppy change prompts for phases ! 80: *7 c compile but do not load ! 81: * d loader: define common space ! 82: *7 e name loader: entry point specification ! 83: *7c f fake floating point operations ! 84: *7u i loader: separate i and d spaces ! 85: * k[system] loader: bind as kernel process ! 86: *7c lname loader: library specification ! 87: *7u n loader: shared instruction space ! 88: *7 o name loader: output file name ! 89: *7 p generate code to profile function calls ! 90: * q[p012s] quit after specified pass ! 91: * r loader: retain relocation in output ! 92: * s loader: strip symbol table ! 93: *7c t[p012adlrt] take specified passes from -Bdirectory ! 94: *7 u name loader: enter name into symbol table ! 95: * w loader: watch ! 96: * x loader: remove local symbols from symbol table ! 97: */ ! 98: #if GEMDOS ! 99: #ifndef VERS ! 100: #define VERS "2.1" ! 101: #endif ! 102: #endif ! 103: ! 104: #include <stdio.h> ! 105: #include <ctype.h> ! 106: #include <signal.h> ! 107: #include <path.h> ! 108: #include <errno.h> ! 109: #include "mch.h" ! 110: #undef NONE ! 111: #include "var.h" ! 112: #include "varmch.h" ! 113: ! 114: #ifndef VeryVflag ! 115: #define VeryVflag 0 ! 116: #endif ! 117: ! 118: #ifndef PREFIX ! 119: #define PREFIX "" ! 120: #endif ! 121: ! 122: /* ! 123: ** Pass information. ! 124: */ ! 125: #define NONE -1 ! 126: #define CPP 0 /* Pass index numbers */ ! 127: #define CC0 1 ! 128: #define CC1 2 ! 129: #define CC2 3 ! 130: #define CC3 4 ! 131: #define CC4 5 /* Output writer postprocessor */ ! 132: #define AS 6 ! 133: #define LD 7 ! 134: #define LD2 8 /* Loader postprocessor */ ! 135: #define ED 9 ! 136: #define LIB 10 ! 137: #define CRT 11 ! 138: #define TMP 12 ! 139: #define ALL 13 ! 140: ! 141: #define P_TAKE 1 /* Take pass from backup directory */ ! 142: #define P_BACK 2 /* Backup directory specified */ ! 143: #define P_LIB 4 /* Take pass from LIBPATH */ ! 144: #define P_BIN 8 /* Take pass from BIN */ ! 145: ! 146: #define PTMP 16 /* Pass name buffer size */ ! 147: ! 148: char dnul[] = ""; /* Global null string */ ! 149: char dmch[PTMP] = PREFIX; /* Cross compiler prefix */ ! 150: ! 151: struct pass { ! 152: char p_flag; /* Flags */ ! 153: char p_psn; /* Pass short name */ ! 154: char p_pln[PTMP]; /* Pass long name */ ! 155: char p_pfs[4]; /* Pass output file suffix */ ! 156: char *p_ifn; /* Input file name */ ! 157: char *p_ofn; /* Output file name */ ! 158: char *p_sfn; /* Scratch file name */ ! 159: char *p_dir; /* Path lookup or backup string */ ! 160: char *p_mch; /* Machine prefix name */ ! 161: } pass[] = { ! 162: { P_LIB, 'p', "cpp", "i", NULL, NULL, NULL, NULL, dmch }, ! 163: { P_LIB, '0', "cc0", "0", NULL, NULL, NULL, NULL, dmch }, ! 164: { P_LIB, '1', "cc1", "1", NULL, NULL, NULL, NULL, dmch }, ! 165: { P_LIB, '2', "cc2", "o", NULL, NULL, NULL, NULL, dmch }, ! 166: { P_LIB, '3', "cc3", "s", NULL, NULL, NULL, NULL, dmch }, ! 167: { P_LIB, '4', "cc4", "o", NULL, NULL, NULL, NULL, dmch }, ! 168: { P_BIN, 's', "as", "o", NULL, NULL, NULL, NULL, dmch }, ! 169: { P_BIN, 'd', "ld", "", NULL, NULL, NULL, NULL, dnul }, ! 170: { P_BIN, 'x', "ld2", "", NULL, NULL, NULL, NULL, dnul }, ! 171: { P_BIN, 'e', "me", "", NULL, NULL, NULL, NULL, dnul }, ! 172: { P_LIB, 'l', "lib", "a", NULL, NULL, NULL, NULL, dmch }, ! 173: { P_LIB, 'r', "crts0.o", "", NULL, NULL, NULL, NULL, dmch }, ! 174: { 0, 't', "cc", "", NULL, NULL, NULL, NULL, dnul } ! 175: }; ! 176: ! 177: /* ! 178: ** Option and argument information. ! 179: */ ! 180: #define CCOPT 0x001 /* Argument flags in argf[] */ ! 181: #define PPOPT 0x002 /* Also in option table, at least */ ! 182: #define LDOPT 0x004 /* those that fit in a byte */ ! 183: #define LD2OPT 0x008 ! 184: #define CCLIB 0x010 ! 185: #define LDLIB 0x020 ! 186: #define CCARG 0x040 ! 187: #define ASARG 0x080 ! 188: #define MARG 0x100 ! 189: #define LDARG 0x200 ! 190: ! 191: #define FLAG_c 1 /* -c flag */ ! 192: #define FLAG_O 2 /* -O flag */ ! 193: #define FLAG_f 4 /* -f flag */ ! 194: #define FLAG_K 010 /* -K or -VKEEP flag */ ! 195: #define VS 020 /* Turn on strict messages */ ! 196: #define VDB 040 /* Turn on debugging */ ! 197: #define FLAG_A 0100 /* Auto edit mode */ ! 198: #define FLAG_Z 0200 /* Floppy change prompts */ ! 199: #define FLAG_V 0400 /* Verbose flag */ ! 200: ! 201: #define FLAG_GEMAPP 01000 /* Gem application compile */ ! 202: #define FLAG_GEMACC 02000 /* Gem accessory compile */ ! 203: ! 204: struct option { /* option table */ ! 205: char o_kind; ! 206: char o_flag; ! 207: char *o_name; ! 208: int o_bits; ! 209: } option[] = { ! 210: /* Strict */ ! 211: { 0, CCOPT, "VSUREG", VSUREG }, ! 212: { 0, CCOPT, "VSUVAR", VSUVAR }, ! 213: { 0, CCOPT, "VSNREG", VSNREG }, ! 214: { 0, CCOPT, "VSRTVC", VSRTVC }, ! 215: { 0, CCOPT, "VSMEMB", VSMEMB }, ! 216: { 0, CCOPT, "VSBOOK", VSBOOK }, ! 217: { 0, CCOPT, "VSLCON", VSLCON }, ! 218: { 0, CCOPT, "VSPVAL", VSPVAL }, ! 219: { 0, CCOPT, "VSCCON", VSCCON }, ! 220: /* Debug */ ! 221: { 0, CCOPT, "VDEBUG", VDEBUG }, ! 222: { 0, CCOPT, "VDLINE", VLINES }, ! 223: { 0, CCOPT, "VDTYPE", VTYPES }, ! 224: { 0, CCOPT, "VDSYMB", VDSYMB }, ! 225: { 0, CCOPT, "VDCALL", VCALLS }, ! 226: /* Miscellaneous */ ! 227: { 0, CCOPT, "VSTAT", VSTAT }, ! 228: { 0, CCOPT, "VSINU", VSINU }, ! 229: { 0, CCOPT, "VPEEP", VPEEP }, ! 230: { 0, CCOPT, "VCOMM", VCOMM }, ! 231: { 0, CCOPT, "VQUIET", VQUIET }, ! 232: { 0, CCOPT, "VPSTR", VPSTR }, ! 233: { 0, CCOPT, "VROM", VROM }, ! 234: { 0, CCOPT, "VASM", VASM }, ! 235: { 0, CCOPT, "VPROF", VPROF }, ! 236: { 0, CCOPT, "VALIEN", VALIEN }, ! 237: { 0, CCOPT, "VNOOPT", VNOOPT }, ! 238: { 0, CCOPT, "VCHASM", VCHASM }, ! 239: { 0, CCOPT, "VCPP", VCPP }, ! 240: { 0, CCOPT, "VCPPE", VCPPE }, ! 241: { 0, CCOPT, "VTPROF", VTPROF }, ! 242: { 0, CCOPT, "V3GRAPH", V3GRAPH }, ! 243: #if 1 ! 244: /* Intel flags */ ! 245: { 0, CCOPT, "VSMALL", VSMALL }, ! 246: { 0, CCOPT, "VLARGE", VLARGE }, ! 247: { 0, CCOPT, "V8087", V8087 }, ! 248: { 0, CCOPT, "VRAM", VRAM }, ! 249: { 0, CCOPT, "VOMF", VOMF }, ! 250: { 0, CCOPT, "V80186", V80186 }, ! 251: { 0, CCOPT, "V80287", V80287 }, ! 252: { 0, CCOPT, "VALIGN", VALIGN }, ! 253: { 0, CCOPT, "VEMU87", VEMU87 }, ! 254: #endif ! 255: /* Motorola and Gemdos flags */ ! 256: { 12, CCOPT, "VGEMACC", FLAG_GEMACC }, ! 257: { 12, CCOPT, "VGEMAPP", FLAG_GEMAPP }, ! 258: { 12, CCOPT, "VGEM", FLAG_GEMAPP }, ! 259: { 10, CCOPT, "VSPLIM", VSPLIM }, ! 260: { 10, CCOPT, "VNOTRAPS", VNOTRAPS }, ! 261: /* More miscellaneous flags */ ! 262: { 2, CCOPT, "VDB", VDB }, ! 263: { 2, CCOPT, "VS", VS }, ! 264: { 12, CCOPT, "A", FLAG_A }, ! 265: { 12, CCOPT, "Z", FLAG_Z }, ! 266: { 12, CCOPT, "c", FLAG_c }, ! 267: { 10, CCOPT, "S", VASM }, ! 268: { 2, CCOPT, "O", FLAG_O }, ! 269: { 0, CCOPT, "E", VCPPE }, ! 270: { 12, CCOPT, "f", FLAG_f }, ! 271: { 12, CCOPT, "VFLOAT", FLAG_f }, ! 272: { 0, CCOPT, "p", VPROF }, ! 273: { 12, CCOPT, "VKEEP", FLAG_K }, ! 274: { 12, CCOPT, "K", FLAG_K }, ! 275: { 0, CCOPT, "Q", VQUIET }, ! 276: { 12, CCOPT, "V", FLAG_V }, ! 277: { 12, CCOPT, "v", FLAG_V }, ! 278: /* Preprocessor options */ ! 279: { 3, PPOPT, "D" }, ! 280: { 3, PPOPT, "I" }, ! 281: { 3, PPOPT, "U" }, ! 282: /* Loader options */ ! 283: { 4, LDOPT, "d" }, ! 284: { 4, LDOPT, "i" }, ! 285: { 4, LDOPT, "n" }, ! 286: { 5, LDOPT, "o" }, ! 287: { 4, LDOPT, "r" }, ! 288: { 4, LDOPT, "s" }, ! 289: { 4, LDOPT, "w" }, ! 290: { 4, LDOPT, "x" }, ! 291: { 4, LDOPT, "X" }, ! 292: #if 0 ! 293: { 4, LDOPT, "L" }, ! 294: #endif ! 295: { 5, LDOPT, "e" }, ! 296: { 5, LDOPT, "k" }, ! 297: { 5, LDOPT, "u" }, ! 298: /* C dispatcher options */ ! 299: { 6, CCOPT, "q" }, ! 300: { 7, CCOPT, "t" }, ! 301: { 7, CCOPT, "B" }, ! 302: { 7, CCOPT, "M" }, ! 303: { 7, CCOPT, "N" }, ! 304: { 8, CCLIB, "l" }, ! 305: ! 306: { -1, -1, "" } ! 307: }; ! 308: ! 309: int ccvariant = 0; /* Variant template */ ! 310: VARIANT variant; /* Binary variant template */ ! 311: char vstr[2*VMAXIM/VGRANU + 1]; /* Ascii variant string */ ! 312: char vstr2[2*VMAXIM/VGRANU + 1]; /* Ascii variant string for .m */ ! 313: ! 314: /* ! 315: ** Compiler parameters and flags ! 316: */ ! 317: #define NCMDA 128 /* Size of argument pointer buffer */ ! 318: #define NCMDB 1024 /* Size of argument buffer */ ! 319: #define NTMP L_tmpnam /* Temp file buffer size, from stdio.h */ ! 320: #define MAGIC 127 /* Exit status mask */ ! 321: #define NSLEEP 10 /* # of sleeps */ ! 322: #define DELAY 5 /* Sleep delay, seconds */ ! 323: ! 324: int nldob; /* Number of objects created */ ! 325: int nfile; /* Number of files to compile or assemble */ ! 326: int nname; /* Number of file name arguments */ ! 327: int ndota; ! 328: int ndotc; ! 329: int ndotm; ! 330: int ndoto; ! 331: int ndots; ! 332: int partial; /* Partial link specified */ ! 333: ! 334: #define cflag ((ccvariant&FLAG_c)!=0) ! 335: #define pflag isvariant(VPROF) ! 336: #define fflag ((ccvariant&FLAG_f)!=0) ! 337: #define Kflag ((ccvariant&FLAG_K)!=0) ! 338: #define Oflag ((ccvariant&FLAG_O)!=0) ! 339: #define Sflag isvariant(VASM) ! 340: #define Eflag isvariant(VCPPE) ! 341: #define Vflag ((ccvariant&FLAG_V)!=0) ! 342: #define Qflag isvariant(VQUIET) ! 343: #define Aflag ((ccvariant&FLAG_A)!=0) ! 344: #define Zflag ((ccvariant&FLAG_Z)!=0) ! 345: #define GEMAPPflag ((ccvariant&FLAG_GEMAPP)!=0) ! 346: #define GEMACCflag ((ccvariant&FLAG_GEMACC)!=0) ! 347: ! 348: int qpass = NONE; /* Quit after this pass */ ! 349: int nload; /* No load phase */ ! 350: char *outf; /* Output file */ ! 351: char *doutf; /* Default output file stem */ ! 352: char *dpath = DEFPATH; ! 353: char *dlibpath = DEFLIBPATH; ! 354: int xstat; /* Exit status */ ! 355: ! 356: char *cmda[NCMDA]; /* Argument pointer buffer */ ! 357: char cmdb[NCMDB]; /* Argument buffer */ ! 358: char newo[NTMP]; /* New object to be removed */ ! 359: char tmp[7][NTMP]; /* Intermediate filenames */ ! 360: char istmp[7]; /* Truth about their temporariness */ ! 361: int argf[NCMDA]; /* Argument flags */ ! 362: char optb[NCMDB]; /* Option rewrite buffer */ ! 363: char *optp = &optb[0]; /* Option rewrite position */ ! 364: ! 365: char *makepass(); ! 366: char *makelib(); ! 367: int cleanup(); ! 368: char *getenv(); ! 369: char *tempnam(); ! 370: char *path(); ! 371: ! 372: main(argc, argv) ! 373: char *argv[]; ! 374: { ! 375: register char *p; ! 376: register struct option *op; ! 377: int i, narg, c; ! 378: ! 379: #if COHERENT ! 380: if (signal(SIGINT, SIG_IGN) != SIG_IGN) ! 381: signal(SIGINT, cleanup); ! 382: #endif ! 383: setbuf(stdout, NULL); ! 384: setbuf(stderr, NULL); ! 385: setvariant(VSUVAR); ! 386: setvariant(VSMEMB); ! 387: setvariant(VSLCON); ! 388: setvariant(VSPVAL); ! 389: setvariant(VPEEP); ! 390: setvariant(VCOMM); ! 391: setvariant(V80186); ! 392: ! 393: if (p = getenv("PATH")) dpath = p; ! 394: if (p = getenv("LIBPATH")) dlibpath = p; ! 395: if (p = getenv("EDITOR")) strcpy(pass[ED].p_pln, p); ! 396: ! 397: for (i=1; i<argc; i+=narg) { ! 398: narg = 1; ! 399: p = argv[i]; ! 400: if (*p++ == '-') { ! 401: static char tppopt[64] = "-"; ! 402: static char tldopt[64] = "-"; ! 403: char *tpp = &tppopt[1]; ! 404: char *tlp = &tldopt[1]; ! 405: ! 406: if (*p == '\0') { ! 407: badopt: ! 408: whatopt(argv[i]); ! 409: continue; ! 410: } ! 411: while (*p != '\0') { ! 412: for (op = &option[0]; ; op += 1) ! 413: if (op->o_name[0] == '\0') ! 414: goto badopt; ! 415: else if (opeq(op->o_name, p)) ! 416: break; ! 417: if (VeryVflag && Vflag) ! 418: printf("Option: -%s\n", op->o_name); ! 419: argf[i] |= op->o_flag; ! 420: switch (op->o_kind) { ! 421: case 0: ! 422: chgvariant(op->o_bits); ! 423: p += strlen(op->o_name); ! 424: continue; ! 425: case 10: ! 426: setvariant(op->o_bits); ! 427: p += strlen(op->o_name); ! 428: continue; ! 429: case 2: ! 430: ccvariant ^= op->o_bits; ! 431: p += strlen(op->o_name); ! 432: /* Set strict */ ! 433: if ((ccvariant&VS) != 0) { ! 434: for (op = &option[0];; op += 1) ! 435: if (op->o_name[1]=='S') ! 436: break; ! 437: while (op->o_name[1]=='S') { ! 438: setvariant(op->o_bits); ! 439: op += 1; ! 440: } ! 441: } ! 442: /* Set debug */ ! 443: if ((ccvariant&VDB) != 0) { ! 444: for (op = &option[0];; op += 1) ! 445: if (op->o_name[1]=='D') ! 446: break; ! 447: while (op->o_name[1]=='D') { ! 448: setvariant(op->o_bits); ! 449: op += 1; ! 450: } ! 451: } ! 452: continue; ! 453: case 12: ! 454: ccvariant |= op->o_bits; ! 455: p += strlen(op->o_name); ! 456: continue; ! 457: case 3: ! 458: while (*tpp++ = *p) ! 459: p++; ! 460: continue; ! 461: case 5: ! 462: if (*p == 'o') { ! 463: outf = argv[i+narg]; ! 464: } ! 465: if (*p == 'u') ! 466: ndoto += 1; ! 467: if (i+narg >= argc) ! 468: missingname(); ! 469: argf[i+narg++] = LDOPT; ! 470: /* Fall through */ ! 471: case 4: ! 472: if (*p == 'r') ! 473: ++partial; ! 474: strcpy(tlp, op->o_name); ! 475: tlp += strlen(op->o_name); ! 476: p += strlen(op->o_name); ! 477: continue; ! 478: case 6: ! 479: if ((c = p[1]) == '\0' ! 480: || (c = getpsn(c)) < CPP) ! 481: goto badopt; ! 482: qpass = c; ! 483: p += 2; ! 484: continue; ! 485: case 7: ! 486: c = p[0]; ! 487: getpass(c, p+1); ! 488: p = dnul; ! 489: continue; ! 490: case 8: ! 491: p = dnul; ! 492: continue; ! 493: default: ! 494: cfatal("options"); ! 495: } ! 496: } ! 497: if (((unsigned)argf[i]-1)&((unsigned)argf[i])) { ! 498: strcpy(optp, argv[i]); ! 499: argv[i] = optp; ! 500: optp += strlen(optp)+1; ! 501: strcpy(optp, tppopt); ! 502: optp += strlen(optp)+1; ! 503: strcpy(optp, tldopt); ! 504: optp += strlen(optp)+1; ! 505: } ! 506: } else { ! 507: while (*p) p+=1; ! 508: c = *--p; ! 509: if (*--p != '.') c = 0; ! 510: if (c >= 'A' && c <= 'Z') ! 511: c |= 'a'-'A'; ! 512: switch (c) { ! 513: case 'h': ! 514: case 'c': ! 515: if (doutf == NULL) doutf = argv[i]; ! 516: ndotc += 1; ! 517: argf[i] = CCARG; ! 518: if (VeryVflag && Vflag) ! 519: printf("cc file: %s\n", argv[i]); ! 520: break; ! 521: case 's': ! 522: if (doutf == NULL) doutf = argv[i]; ! 523: ndots += 1; ! 524: argf[i] = ASARG; ! 525: if (VeryVflag && Vflag) ! 526: printf("as file: %s\n", argv[i]); ! 527: break; ! 528: case 'm': ! 529: if (doutf == NULL) doutf = argv[i]; ! 530: ndotm += 1; ! 531: argf[i] = MARG; ! 532: if (VeryVflag && Vflag) ! 533: printf("m file: %s\n", argv[i]); ! 534: break; ! 535: case 'o': ! 536: if (doutf == NULL) doutf = argv[i]; ! 537: ndoto += 1; ! 538: argf[i] = LDARG; ! 539: if (VeryVflag && Vflag) ! 540: printf("ld file: %s\n", argv[i]); ! 541: break; ! 542: case 'a': ! 543: default: ! 544: ndota += 1; ! 545: argf[i] = LDLIB; ! 546: if (VeryVflag && Vflag) ! 547: printf("library: %s\n", argv[i]); ! 548: break; ! 549: } ! 550: } ! 551: } ! 552: #if GEMDOS ! 553: if (Vflag) { ! 554: fprintf(stderr, "Mark Williams C for the Atart ST, %s\n", VERS); ! 555: fprintf(stderr, "Copyright 1984-1987, Mark Williams Co., Chicago\n"); ! 556: } ! 557: #endif ! 558: resolve(); ! 559: compile(argc, argv); ! 560: if (nload==0 && runld(argc, argv)==0) { ! 561: if (Kflag==0 && nldob==1 && newo[0]!=0) ! 562: rm(newo); ! 563: } ! 564: exit(xstat); ! 565: } ! 566: ! 567: /* ! 568: * Resolve remaining ambiguities. ! 569: * Initialize variant arguments and files. ! 570: */ ! 571: resolve() ! 572: { ! 573: register int i; ! 574: extern char *index(); ! 575: ! 576: for (i = CPP; i < ALL; i += 1) { ! 577: if (pass[i].p_flag & P_BACK) ! 578: ; ! 579: else if (pass[i].p_flag & P_LIB) ! 580: pass[i].p_dir = dlibpath; ! 581: else if (pass[i].p_flag & P_BIN) ! 582: pass[i].p_dir = dpath; ! 583: strcpy(cmdb, pass[i].p_mch); ! 584: strcat(cmdb, pass[i].p_pln); ! 585: #if GEMDOS ! 586: if (i <= ED && index(pass[i].p_pln, '.') == NULL) ! 587: strcat(cmdb, i==ED ? ".tos" : ".prg"); ! 588: #endif ! 589: if (strlen(cmdb) > PTMP-1) ! 590: cfatal("pass name \"%s\" is too long", cmdb); ! 591: strcpy(pass[i].p_pln, cmdb); ! 592: } ! 593: #if 1 ! 594: if (isvariant(VOMF)) { ! 595: clrvariant(VCOMM); ! 596: if (isvariant(VLARGE) && isvariant(VSMALL)) ! 597: cfatal("invalid model specification"); ! 598: if (notvariant(VLARGE) && notvariant(VSMALL)) ! 599: setvariant(VSMALL); ! 600: } else { ! 601: clrvariant(VLARGE); ! 602: setvariant(VSMALL); ! 603: } ! 604: #endif ! 605: if (GEMAPPflag && GEMACCflag) ! 606: cfatal("specify VGEMAPP or VGEMACC, not both"); ! 607: if (GEMAPPflag) getpass('N', "rcrtsg.o"); ! 608: if (GEMACCflag) getpass('N', "rcrtsd.o"); ! 609: if (pflag) getpass('N', "rmcrts0.o"); ! 610: if (Eflag) setvariant(VCPP); ! 611: if (qpass == NONE) { ! 612: if (isvariant(VCPP)) ! 613: qpass = CPP; ! 614: else if (Sflag) ! 615: qpass = CC3; ! 616: else if (cflag) ! 617: qpass = AS; ! 618: else ! 619: qpass = LD; ! 620: } else if (qpass == CPP) ! 621: setvariant(VCPP); ! 622: if (VeryVflag && Vflag) ! 623: printf("quit pass is %s\n", pass[qpass].p_pln); ! 624: makvariant(vstr); ! 625: if (ndotm != 0 && notvariant(VCPP) && notvariant(VCPPE)) { ! 626: setvariant(VCPP); ! 627: setvariant(VCPPE); ! 628: makvariant(vstr2); ! 629: clrvariant(VCPP); ! 630: clrvariant(VCPPE); ! 631: } ! 632: nfile = ndotc + ndots + ndotm; ! 633: nname = nfile + ndoto + ndota; ! 634: if (nname == 0) { ! 635: fprintf(stderr, ! 636: "Usage: cc [ -o output ] [ options ] file [ ... ]\n"); ! 637: exit(1); ! 638: } ! 639: if (qpass < LD) ! 640: ++nload; ! 641: if (Aflag) ! 642: maketempfile(6); ! 643: if ( ! Eflag) { ! 644: chkofile(); ! 645: if (Kflag) { ! 646: pass[CPP].p_ofn = pass[CC0].p_ifn = tmp[0]; ! 647: pass[CC0].p_ofn = pass[CC1].p_ifn = tmp[1]; ! 648: pass[CC1].p_ofn = pass[CC2].p_ifn = tmp[2]; ! 649: if ( ! Sflag) { ! 650: pass[CC2].p_sfn = tmp[3]; ! 651: pass[CC2].p_ofn = tmp[5]; ! 652: } else { ! 653: pass[CC3].p_ifn = pass[CC2].p_ofn = tmp[3]; ! 654: pass[CC3].p_ofn = tmp[5]; ! 655: } ! 656: } else { ! 657: pass[CPP].p_ofn = pass[CC0].p_ifn = tmp[0]; ! 658: pass[CC0].p_ofn = pass[CC1].p_ifn = tmp[1]; ! 659: pass[CC1].p_ofn = pass[CC2].p_ifn = tmp[0]; ! 660: if ( ! Sflag) { ! 661: pass[CC2].p_sfn = tmp[1]; ! 662: pass[CC2].p_ofn = tmp[5]; ! 663: } else { ! 664: pass[CC3].p_ifn = pass[CC2].p_ofn = tmp[1]; ! 665: pass[CC3].p_ofn = tmp[5]; ! 666: } ! 667: maketempfile(0); ! 668: maketempfile(1); ! 669: } ! 670: pass[AS].p_ofn = tmp[5]; ! 671: } ! 672: } ! 673: ! 674: maketempfile(i) int i; ! 675: { ! 676: char *p; ! 677: strcpy(tmp[i], p = tempnam(pass[TMP].p_dir, pass[TMP].p_pln)); ! 678: free(p); ! 679: ++istmp[i]; ! 680: } ! 681: ! 682: /* ! 683: ** Compilation. ! 684: */ ! 685: compile(argc, argv) ! 686: char *argv[]; ! 687: { ! 688: register char *p1; ! 689: register c, i, err; ! 690: ! 691: err = 0; ! 692: for (i=1; i<argc; ++i) { ! 693: if ((c = (argf[i] & (CCARG | ASARG | MARG))) == 0) ! 694: continue; ! 695: p1 = argv[i]; ! 696: if (err) { ! 697: err = 0; ! 698: if (runme(p1)) { ! 699: ++nload; ! 700: } else { ! 701: --i; ! 702: xstat = 0; ! 703: } ! 704: continue; ! 705: } ! 706: if (nfile > 1 && Qflag == 0) ! 707: printf("%s:\n", p1); ! 708: setfiles(c, p1); ! 709: if (c == CCARG) { ! 710: if (runpp(argc, argv, vstr)) { ! 711: if (Aflag) { ! 712: ++err; --i; ! 713: } else ! 714: ++nload; ! 715: continue; ! 716: } ! 717: if (qpass <= CC0) ! 718: continue; ! 719: if (runcc(CC1)) { ! 720: ++nload; ! 721: continue; ! 722: } ! 723: if (qpass <= CC1) ! 724: continue; ! 725: if (runcc(CC2)) { ! 726: ++nload; ! 727: continue; ! 728: } ! 729: if (qpass <= CC2) ! 730: continue; ! 731: if (Sflag) { ! 732: if (runcc(CC3)) { ! 733: ++nload; ! 734: continue; ! 735: } ! 736: if (qpass <= CC3) ! 737: continue; ! 738: } ! 739: } else if (c == ASARG && qpass>=AS) { ! 740: if (runas()) { ! 741: if (Aflag) { ! 742: ++err; --i; ! 743: } else ! 744: ++nload; ! 745: continue; ! 746: } ! 747: if (qpass <= AS) ! 748: continue; ! 749: } else if (c == MARG) { ! 750: if (runpp(argc, argv, vstr2)) { ! 751: if (Aflag) { ! 752: ++err; --i; ! 753: } else ! 754: ++nload; ! 755: continue; ! 756: } ! 757: if (qpass < AS) ! 758: continue; ! 759: if (runas()) { ! 760: if (Aflag) { ! 761: ++err; --i; ! 762: } else ! 763: ++nload; ! 764: continue; ! 765: } ! 766: if (qpass == AS) ! 767: continue; ! 768: } ! 769: makeft(p1, p1, "o"); ! 770: } ! 771: cleanup(0); ! 772: } ! 773: ! 774: runpp(argc, argv, var) ! 775: register char *argv[]; ! 776: char var[]; ! 777: { ! 778: register char **cp; ! 779: register int i; ! 780: char *p1; ! 781: ! 782: cp = cmda; ! 783: p1 = cmdb; ! 784: p1 = makepass(CC0, *cp++ = p1, AEXEC); ! 785: *cp++ = var; ! 786: *cp++ = pass[CPP].p_ifn; ! 787: if (qpass < CC0) ! 788: *cp++ = Kflag ? pass[CPP].p_ofn : "-"; ! 789: else ! 790: *cp++ = pass[CC0].p_ofn; ! 791: for (i=1; i<argc; ++i) { ! 792: if ((argf[i]&PPOPT) != 0) { ! 793: *cp++ = argv[i]; ! 794: if ((argf[i]&~PPOPT) != 0) ! 795: cp[-1] += strlen(cp[-1])+1; ! 796: } ! 797: } ! 798: *cp = 0; ! 799: return (run(Aflag)); ! 800: } ! 801: ! 802: runcc(pn) ! 803: { ! 804: register char **cp; ! 805: ! 806: cp = cmda; ! 807: makepass(pn, *cp++ = cmdb, AEXEC); ! 808: *cp++ = vstr; ! 809: *cp++ = pass[pn].p_ifn; ! 810: *cp++ = pass[pn].p_ofn; ! 811: if (pn == CC2) ! 812: *cp++ = pass[CC2].p_sfn; ! 813: *cp = 0; ! 814: return (run(0)); ! 815: } ! 816: ! 817: runas() ! 818: { ! 819: register char **cp; ! 820: ! 821: cp = cmda; ! 822: makepass(AS, *cp++ = cmdb, AEXEC); ! 823: *cp++ = "-gx"; ! 824: *cp++ = "-o"; ! 825: *cp++ = pass[AS].p_ofn; ! 826: *cp++ = pass[AS].p_ifn; ! 827: *cp = 0; ! 828: return (run(Aflag)); ! 829: } ! 830: ! 831: runme(fn) ! 832: char *fn; ! 833: { ! 834: register char **cp; ! 835: ! 836: cp = cmda; ! 837: makepass(ED, *cp++ = cmdb, AEXEC); ! 838: *cp++ = fn; ! 839: *cp++ = "-e"; ! 840: *cp++ = tmp[6]; ! 841: *cp = 0; ! 842: return (run(0)); ! 843: } ! 844: runld(argc, argv) ! 845: char *argv[]; ! 846: { ! 847: char *p1; ! 848: register char *p2; ! 849: register char **cp; ! 850: char **cp1; ! 851: register char **cp2; ! 852: int i; ! 853: static char buff[32]; ! 854: ! 855: cp = cmda; ! 856: p1 = makepass(LD, *cp++ = cmdb, AEXEC); ! 857: *cp++ = "-X"; ! 858: if (outf == NULL) { ! 859: *cp++ = "-o"; ! 860: if (partial || doutf == NULL) { ! 861: #if COHERENT ! 862: *cp++ = "l.out"; ! 863: #endif ! 864: #if GEMDOS ! 865: *cp++ = "l.prg"; ! 866: #endif ! 867: } else { ! 868: basename(doutf, buff); ! 869: #if GEMDOS ! 870: strcat(buff, ".prg"); ! 871: #endif ! 872: *cp++ = buff; ! 873: } ! 874: } ! 875: for (i=1; i<argc; ++i) { ! 876: if ((argf[i]&LDOPT)!=0) { ! 877: *cp++ = argv[i]; ! 878: if ((argf[i]&~LDOPT)!=0) { ! 879: cp[-1] += strlen(cp[-1])+1; ! 880: cp[-1] += strlen(cp[-1])+1; ! 881: } ! 882: } ! 883: } ! 884: cp1 = cp; ! 885: p1 = makepass(CRT, *cp++ = p1, AREAD); ! 886: if (fflag) { ! 887: *cp++ = "-u"; ! 888: *cp++ = "_dtefg_"; ! 889: } ! 890: for (i=1; i<argc; ++i) { ! 891: p2 = argv[i]; ! 892: if ((argf[i]&CCLIB)!=0) { ! 893: while (*p2++ != 'l'); ! 894: p1 = makelib(LIB, *cp++ = p1, p2); ! 895: } else if ((argf[i]&(CCARG|ASARG|MARG|LDARG))!=0) { ! 896: for (cp2=cp1; cp2<cp; ++cp2) ! 897: if (strcmp(*cp2, p2) == 0) ! 898: break; ! 899: if (cp2 == cp) { ! 900: *cp++ = p2; ! 901: ++nldob; ! 902: } ! 903: } else if ((argf[i]&LDLIB)!=0) { ! 904: *cp++ = p2; ! 905: } ! 906: } ! 907: if ( ! partial && (GEMAPPflag || GEMACCflag)) { ! 908: p1 = makelib(LIB, *cp++ = p1, "aes"); ! 909: p1 = makelib(LIB, *cp++ = p1, "vdi"); ! 910: } ! 911: p1 = makelib(LIB, *cp++ = p1, "c"); ! 912: *cp = 0; ! 913: return (run(0)); ! 914: } ! 915: ! 916: basename(in, out) ! 917: char *in, *out; ! 918: { ! 919: register char *ip = in, *op = out; ! 920: register int c; ! 921: ! 922: while (*ip++) ! 923: ; ! 924: ip -= 2; ! 925: while (ip >= in && *ip != PATHSEP) ! 926: --ip; ! 927: while ((c = *++ip) && c != '.') ! 928: *op++ = c; ! 929: *op = '\0'; ! 930: } ! 931: ! 932: run(catch_errors) int catch_errors; ! 933: { ! 934: int new_fd; ! 935: int saved_fd; ! 936: int s; ! 937: extern char **environ; ! 938: ! 939: if (Vflag) { ! 940: char *cp, **cpp; ! 941: cpp = cmda; ! 942: while ((cp = *cpp) != NULL) { ! 943: if (cpp != cmda) ! 944: putchar(' '); ! 945: printf("%s", cp); ! 946: ++cpp; ! 947: } ! 948: putchar('\n'); ! 949: fflush(stdout); ! 950: } ! 951: if (catch_errors) { ! 952: fflush(stdout); ! 953: saved_fd = dup(1); ! 954: if ((new_fd = creat(tmp[6], 0644)) < 0) ! 955: cfatal("%s: %s", tmp[6], sys_errlist[errno]); ! 956: if (dup2(new_fd, 1) < 0) ! 957: cfatal("dup2 failed"); ! 958: } ! 959: #if COHERENT ! 960: { ! 961: int nsleep; ! 962: int status; ! 963: int pid; ! 964: nsleep = NSLEEP; ! 965: while ((pid=fork())<0 && nsleep--) ! 966: sleep(DELAY); ! 967: if (pid < 0) ! 968: cfatal("can't fork"); ! 969: if (pid == 0) { ! 970: execve(cmda[0], cmda, environ); ! 971: exit(MAGIC); ! 972: } ! 973: while (wait(&status) != pid) ! 974: ; ! 975: if ((s = status&0177)!=0 && s!=SIGINT) { ! 976: extern char *signame[]; ! 977: ! 978: fprintf(stderr, "cc: %s ", cmda[0]); ! 979: if (s==SIGSYS && (status&0200)==0) ! 980: fprintf(stderr, "exec failed"); ! 981: else ! 982: fprintf(stderr, signame[s]); ! 983: if ((status&0200) != 0) ! 984: fprintf(stderr, " -- core dumped"); ! 985: fprintf(stderr, "\n"); ! 986: } else if ((s = (status>>8)&0377) == MAGIC) ! 987: cfatal("cannot execute %s", cmda[0]); ! 988: } ! 989: #else ! 990: if (s = execve(cmda[0], cmda, environ)) ! 991: if (s < 0) ! 992: perror(cmda[0]); ! 993: #endif ! 994: if (catch_errors) { ! 995: fflush(stdout); ! 996: if (dup2(saved_fd, 1) < 0) ! 997: cfatal("dup2 failed"); ! 998: if (close(new_fd) < 0) ! 999: /* cfatal("error on close") */ ; ! 1000: } ! 1001: if (s != 0) ! 1002: xstat = 1; ! 1003: return (s); ! 1004: } ! 1005: ! 1006: /* ! 1007: ** Option processing. ! 1008: */ ! 1009: ! 1010: /* ! 1011: * Compare option name to argument. ! 1012: */ ! 1013: opeq(op, ap) ! 1014: register char *op, *ap; ! 1015: { ! 1016: while (*op!=0) ! 1017: if (*op++ != *ap++) ! 1018: return (0); ! 1019: return (1); ! 1020: } ! 1021: ! 1022: ! 1023: /* ! 1024: * Get short pass name. ! 1025: * translate single character code into pass index number. ! 1026: */ ! 1027: getpsn(c) ! 1028: register int c; ! 1029: { ! 1030: register int pn; ! 1031: ! 1032: for (pn = CPP; pn < ALL; pn += 1) ! 1033: if (pass[pn].p_psn == c) ! 1034: return (pn); ! 1035: return (NONE); ! 1036: } ! 1037: ! 1038: /* ! 1039: * Process -t*, -B*, -M* options. ! 1040: * -t* sets take flag for specified passes. ! 1041: * -B* copies prefix string for flagged passes ! 1042: * or for all machine dependent passes if none flagged. ! 1043: * -M* copies machine string for machine dependent passes. ! 1044: * -N* renames a pass, such as crts0.o. ! 1045: */ ! 1046: getpass(c, cp) ! 1047: register int c; ! 1048: register char *cp; ! 1049: { ! 1050: if (c == 't') { /* Take passes from backup */ ! 1051: if (*cp != 0) ! 1052: while ((c = *cp++) != 0) ! 1053: if ((c = getpsn(c)) >= CPP) { ! 1054: pass[c].p_flag |= P_TAKE; ! 1055: pass[c].p_dir = dnul; ! 1056: if (Vflag) ! 1057: passrpt(c); ! 1058: } else { ! 1059: badpsn(cp[-1]); ! 1060: } ! 1061: else ! 1062: getpass('t', "01234"); ! 1063: } else if (c == 'B') { /* Get backup string */ ! 1064: for (c = CPP; c < ALL; c += 1) { ! 1065: if ((pass[c].p_flag&P_TAKE) != 0) { ! 1066: pass[c].p_flag ^= P_TAKE; ! 1067: pass[c].p_flag |= P_BACK; ! 1068: pass[c].p_dir = cp; ! 1069: if (Vflag) ! 1070: passrpt(c); ! 1071: } ! 1072: } ! 1073: } else if (c == 'M') { /* Machine prefix string */ ! 1074: if (strlen(cp) > PTMP-1) ! 1075: toolong(cp); ! 1076: strcpy(dmch, cp); ! 1077: if (Vflag) ! 1078: printf("Prefix: %s\n", dmch); ! 1079: } else if (c == 'N') { /* New pass name */ ! 1080: if ((c = getpsn(*cp++)) >= CPP) { ! 1081: if (strlen(cp) > PTMP-1) ! 1082: toolong(cp); ! 1083: if (Vflag) ! 1084: printf("Rename: %s to %s\n", pass[c].p_pln, cp); ! 1085: strcpy(pass[c].p_pln, cp); ! 1086: } else ! 1087: badpsn(cp[-1]); ! 1088: } ! 1089: } ! 1090: ! 1091: passrpt(c) ! 1092: register int c; ! 1093: { ! 1094: printf("Use: {%s}%s%s\n", pass[c].p_dir, pass[c].p_mch, pass[c].p_pln); ! 1095: } ! 1096: ! 1097: missingname() ! 1098: { ! 1099: fprintf(stderr, "cc: missing name in -o, -e or -u\n"); ! 1100: exit(1); ! 1101: } ! 1102: ! 1103: badoutput() ! 1104: { ! 1105: fprintf(stderr, "cc: improbable name in -o: %s\n", outf); ! 1106: exit(1); ! 1107: } ! 1108: ! 1109: toomany() ! 1110: { ! 1111: fprintf(stderr, "cc: too many files for -o option\n"); ! 1112: exit(1); ! 1113: } ! 1114: ! 1115: badpsn(c) ! 1116: { ! 1117: fprintf(stderr, "cc: unknown short path name: %c\n", c); ! 1118: exit(1); ! 1119: } ! 1120: ! 1121: toolong(cp) ! 1122: char *cp; ! 1123: { ! 1124: fprintf(stderr, "cc: name, prefix, or directory too long: %s\n", cp); ! 1125: exit(1); ! 1126: } ! 1127: ! 1128: /* ! 1129: * Check specified output file name, ! 1130: * or construct name from first file ! 1131: * name seen. ! 1132: */ ! 1133: chkofile() ! 1134: { ! 1135: register char *fn; ! 1136: register char c; ! 1137: ! 1138: if ((fn = outf) == NULL) ! 1139: return; ! 1140: if (fn[0] == '-') ! 1141: badoutput(); ! 1142: if (nname > 1 && qpass < LD) ! 1143: toomany(); ! 1144: while (*fn != 0) ! 1145: ++fn; ! 1146: while (*fn != '.' && fn > outf) ! 1147: --fn; ! 1148: if (*fn++ == '.' && (c = *fn++) && *fn == '\0') { ! 1149: if (c == 'c' ! 1150: || c == 'h' ! 1151: || c == 'm' ! 1152: || (c != 'o' && cflag) ! 1153: || (c == 'o' && !cflag) ! 1154: || (c != 's' && Sflag) ! 1155: || (c == 's' && !Sflag)) ! 1156: badoutput(); ! 1157: } else { ! 1158: if (Sflag || cflag) ! 1159: badoutput(); ! 1160: } ! 1161: } ! 1162: ! 1163: whatopt(s) ! 1164: char *s; ! 1165: { ! 1166: fprintf(stderr, "cc: unrecognized option: %s\n", s); ! 1167: exit(1); ! 1168: } ! 1169: ! 1170: cfatal(s) ! 1171: char *s; ! 1172: { ! 1173: fprintf(stderr, "cc: fatal error: %r\n", &s); ! 1174: cleanup(0); ! 1175: exit(1); ! 1176: } ! 1177: ! 1178: /* ! 1179: ** Intermediate file processing. ! 1180: */ ! 1181: /* ! 1182: * Given cp -> `name.[chms]' rewrite ultimate destination and intermediates ! 1183: * if necessary. ! 1184: */ ! 1185: setfiles(c, cp) ! 1186: int c; ! 1187: register char *cp; ! 1188: { ! 1189: register char *ip; ! 1190: ! 1191: ip = cp; ! 1192: if (qpass < LD && outf != NULL) ! 1193: cp = outf; ! 1194: if (c == CCARG) { ! 1195: pass[CPP].p_ifn = ip; ! 1196: if (Eflag) ! 1197: return; ! 1198: if (Kflag) { ! 1199: makeft(pass[CPP].p_ofn, cp, "i"); ! 1200: makeft(pass[CC0].p_ofn, cp, "0"); ! 1201: makeft(pass[CC1].p_ofn, cp, "1"); ! 1202: if ( ! Sflag) ! 1203: makeft(pass[CC2].p_sfn, cp, "2"); ! 1204: else ! 1205: makeft(pass[CC2].p_ofn, cp, "2"); ! 1206: } ! 1207: } else if (c == MARG) { ! 1208: pass[CPP].p_ifn = ip; ! 1209: if (Kflag) ! 1210: makeft(pass[CC0].p_ofn, cp, "s"); ! 1211: pass[AS].p_ifn = pass[CC0].p_ofn; ! 1212: } else if (c == ASARG) ! 1213: pass[AS].p_ifn = ip; ! 1214: makeft(tmp[5], cp, Sflag ? "s" : "o"); ! 1215: if (!Sflag && newo[0] == 0 && access(tmp[5], 0) < 0) ! 1216: strcpy(newo, tmp[5]); ! 1217: } ! 1218: ! 1219: /* ! 1220: * Unlink a file. ! 1221: * If `-V' echo the rm. ! 1222: */ ! 1223: rm(s) ! 1224: register char *s; ! 1225: { ! 1226: if (Vflag) ! 1227: printf("rm %s\n", s); ! 1228: unlink(s); ! 1229: } ! 1230: ! 1231: /* ! 1232: * Cleanup after yourself if ! 1233: * the user hits interrupt during a compile (sig == SIGINT), ! 1234: * or when all compiles have completed (sig == 0). ! 1235: */ ! 1236: cleanup(sig) ! 1237: { ! 1238: register int i; ! 1239: ! 1240: #if COHERENT ! 1241: if (sig == SIGINT) ! 1242: signal(SIGINT, SIG_IGN); ! 1243: #endif ! 1244: for (i = 0; i < 7; i += 1) ! 1245: if (istmp[i]) ! 1246: rm(tmp[i]); ! 1247: #if COHERENT ! 1248: if (sig == SIGINT && nldob==1 && newo[0]!=0) ! 1249: rm(newo); ! 1250: if (sig == SIGINT) ! 1251: exit(1); ! 1252: #endif ! 1253: } ! 1254: ! 1255: /* ! 1256: ** Name construction. ! 1257: */ ! 1258: char * ! 1259: ccpath(cp, p, n, mode) register char *cp; char *p, *n; int mode; ! 1260: { ! 1261: register char *pn; ! 1262: if (VeryVflag && Vflag) ! 1263: printf("search %s for %s\n", p, n); ! 1264: while ((pn = path(p, n, mode)) == NULL) { ! 1265: if (Zflag) { /* Disk swap dialog flag */ ! 1266: fprintf(stderr, "Insert %s's disk in a free drive and press <Return>\n", n); ! 1267: gets(cp); ! 1268: continue; ! 1269: } ! 1270: pn = n; ! 1271: break; ! 1272: } ! 1273: while (*cp++ = *pn++) ; ! 1274: return cp; ! 1275: } ! 1276: ! 1277: char * ! 1278: makepass(pn, cp, mode) ! 1279: int pn; ! 1280: register char *cp; ! 1281: int mode; ! 1282: { ! 1283: return ccpath(cp, pass[pn].p_dir, pass[pn].p_pln, mode); ! 1284: } ! 1285: ! 1286: char * ! 1287: makelib(pn, cp, lp) ! 1288: int pn; ! 1289: char *cp; ! 1290: char *lp; ! 1291: { ! 1292: strcpy(cp, pass[pn].p_pln); ! 1293: strcat(cp, lp); ! 1294: strcat(cp, ".a"); ! 1295: return ccpath(cp, pass[pn].p_dir, cp, AREAD); ! 1296: } ! 1297: ! 1298: makeft(op, ip, ft) ! 1299: char *op, *ip, *ft; ! 1300: { ! 1301: register char *ep, *tp; ! 1302: register c; ! 1303: char *dp; ! 1304: ! 1305: ep = ip; ! 1306: tp = op; ! 1307: dp = NULL; ! 1308: while ((c = *ep++) != '\0') { ! 1309: if (c == PATHSEP && ip != outf) { ! 1310: tp = op; ! 1311: dp = NULL; ! 1312: } else { ! 1313: if (c == '.') ! 1314: dp = tp; ! 1315: *tp++ = c; ! 1316: } ! 1317: } ! 1318: if (ip == outf) ! 1319: return; ! 1320: if (dp != NULL) ! 1321: tp = dp; ! 1322: *tp++ = '.'; ! 1323: ep = ft; ! 1324: while (*tp++ = *ep++) ! 1325: ; ! 1326: } ! 1327: @ ! 1328: ! 1329: ! 1330: 1.3 ! 1331: log ! 1332: @steve 11/5/90 ! 1333: Added "setvariant(V80186);" to default variant settings at ! 1334: beginning of main(). The generated compiler then generates ! 1335: the 80186 instructions which are not 8086 instructions by ! 1336: default, making the code both smaller and slightly faster. ! 1337: @ ! 1338: text ! 1339: @d53 1 ! 1340: d247 1 ! 1341: @ ! 1342: ! 1343: ! 1344: 1.2 ! 1345: log ! 1346: @steve 9/19/90 ! 1347: Corrected bug in -VS or -VDB option parsing ("p" was bumped by length of ! 1348: "op->o_name" after clobbering "op" rather than before). ! 1349: This corresponds to COHERENT V3.1.0 object. ! 1350: @ ! 1351: text ! 1352: @d2 2 ! 1353: d347 1 ! 1354: @ ! 1355: ! 1356: ! 1357: 1.1 ! 1358: log ! 1359: @Initial revision ! 1360: @ ! 1361: text ! 1362: @d384 1 ! 1363: a404 1 ! 1364: p += strlen(op->o_name); ! 1365: @
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.