BSD 4_4 release
[unix-history] / usr / src / old / pcc / cc / cc.c
index 279473f..7666319 100644 (file)
@@ -1,4 +1,4 @@
-static char sccsid[] = "@(#)cc.c 4.6 %G%";
+static char sccsid[] = "@(#)cc.c 4.21 6/30/90";
 /*
  * cc - front end for C compiler
  */
 /*
  * cc - front end for C compiler
  */
@@ -6,23 +6,25 @@ static        char sccsid[] = "@(#)cc.c 4.6 %G%";
 #include <stdio.h>
 #include <ctype.h>
 #include <signal.h>
 #include <stdio.h>
 #include <ctype.h>
 #include <signal.h>
-#include <dir.h>
+#include <sys/dir.h>
+#include "pathnames.h"
 
 
-char   *cpp = "/lib/cpp";
-char   *ccom = "/lib/ccom";
-char   *c2 = "/lib/c2";
-char   *as = "/bin/as";
-char   *ld = "/bin/ld";
-char   *crt0 = "/lib/crt0.o";
+char   *cpp = _PATH_CPP;
+char   *ccom = _PATH_CCOM;
+char   *sccom = _PATH_SCCOM;
+char   *c2 = _PATH_C2;
+char   *as = _PATH_AS;
+char   *ld = _PATH_LD;
+char   *crt0 = _PATH_CRT0;
 
 
-char   tmp0[30];               /* big enough for /tmp/ctm%05.5d */
+char   tmp0[MAXPATHLEN];
 char   *tmp1, *tmp2, *tmp3, *tmp4, *tmp5;
 char   *outfile;
 char   *savestr(), *strspl(), *setsuf();
 int    idexit();
 char   **av, **clist, **llist, **plist;
 int    cflag, eflag, oflag, pflag, sflag, wflag, Rflag, exflag, proflag;
 char   *tmp1, *tmp2, *tmp3, *tmp4, *tmp5;
 char   *outfile;
 char   *savestr(), *strspl(), *setsuf();
 int    idexit();
 char   **av, **clist, **llist, **plist;
 int    cflag, eflag, oflag, pflag, sflag, wflag, Rflag, exflag, proflag;
-int    gflag, Gflag;
+int    fflag, gflag, Gflag, Mflag, debug;
 char   *dflag;
 int    exfail;
 char   *chpass;
 char   *dflag;
 int    exfail;
 char   *chpass;
@@ -57,7 +59,6 @@ main(argc, argv)
                                switch (getsuf(outfile)) {
 
                                case 'c':
                                switch (getsuf(outfile)) {
 
                                case 'c':
-                               case 'o':
                                        error("-o would overwrite %s",
                                            outfile);
                                        exit(8);
                                        error("-o would overwrite %s",
                                            outfile);
                                        exit(8);
@@ -72,9 +73,12 @@ main(argc, argv)
                        continue;
                case 'p':
                        proflag++;
                        continue;
                case 'p':
                        proflag++;
-                       crt0 = "/lib/mcrt0.o";
+                       crt0 = _PATH_MCRT0;
                        if (argv[i][2] == 'g')
                        if (argv[i][2] == 'g')
-                               crt0 = "/usr/lib/gcrt0.o";
+                               crt0 = _PATH_GCRT0;
+                       continue;
+               case 'f':
+                       fflag++;
                        continue;
                case 'g':
                        if (argv[i][2] == 'o') {
                        continue;
                case 'g':
                        if (argv[i][2] == 'o') {
@@ -97,12 +101,20 @@ main(argc, argv)
                case 'c':
                        cflag++;
                        continue;
                case 'c':
                        cflag++;
                        continue;
+               case 'M':
+                       exflag++;
+                       pflag++;
+                       Mflag++;
+                       /* and fall through */
                case 'D':
                case 'I':
                case 'U':
                case 'C':
                        plist[np++] = argv[i];
                        continue;
                case 'D':
                case 'I':
                case 'U':
                case 'C':
                        plist[np++] = argv[i];
                        continue;
+               case 'L':
+                       llist[nl++] = argv[i];
+                       continue;
                case 't':
                        if (chpass)
                                error("-t overwrites earlier option", 0);
                case 't':
                        if (chpass)
                                error("-t overwrites earlier option", 0);
@@ -115,9 +127,13 @@ main(argc, argv)
                                error("-B overwrites earlier option", 0);
                        npassname = argv[i]+2;
                        if (npassname[0]==0)
                                error("-B overwrites earlier option", 0);
                        npassname = argv[i]+2;
                        if (npassname[0]==0)
-                               npassname = "/usr/c/o";
+                               error("-B requires an argument", 0);
                        continue;
                case 'd':
                        continue;
                case 'd':
+                       if (argv[i][2] == '\0') {
+                               debug++;
+                               continue;
+                       }
                        dflag = argv[i];
                        continue;
                }
                        dflag = argv[i];
                        continue;
                }
@@ -141,13 +157,16 @@ main(argc, argv)
        if (npassname && chpass ==0)
                chpass = "012p";
        if (chpass && npassname==0)
        if (npassname && chpass ==0)
                chpass = "012p";
        if (chpass && npassname==0)
-               npassname = "/usr/new";
+               npassname = _PATH_USRNEW;
        if (chpass)
        for (t=chpass; *t; t++) {
                switch (*t) {
 
                case '0':
        if (chpass)
        for (t=chpass; *t; t++) {
                switch (*t) {
 
                case '0':
-                       ccom = strspl(npassname, "ccom");
+                       if (fflag)
+                               sccom = strspl(npassname, "sccom");
+                       else
+                               ccom = strspl(npassname, "ccom");
                        continue;
                case '2':
                        c2 = strspl(npassname, "c2");
                        continue;
                case '2':
                        c2 = strspl(npassname, "c2");
@@ -163,8 +182,10 @@ main(argc, argv)
                signal(SIGINT, idexit);
        if (signal(SIGTERM, SIG_IGN) != SIG_IGN)
                signal(SIGTERM, idexit);
                signal(SIGINT, idexit);
        if (signal(SIGTERM, SIG_IGN) != SIG_IGN)
                signal(SIGTERM, idexit);
+       if (signal(SIGHUP, SIG_IGN) != SIG_IGN)
+               signal(SIGHUP, idexit);
        if (pflag==0)
        if (pflag==0)
-               sprintf(tmp0, "/tmp/ctm%05.5d", getpid());
+               (void)sprintf(tmp0, "%s/ctm%05.5d", _PATH_TMP, getpid());
        tmp1 = strspl(tmp0, "1");
        tmp2 = strspl(tmp0, "2");
        tmp3 = strspl(tmp0, "3");
        tmp1 = strspl(tmp0, "1");
        tmp2 = strspl(tmp0, "2");
        tmp3 = strspl(tmp0, "3");
@@ -173,33 +194,43 @@ main(argc, argv)
        if (oflag)
                tmp5 = strspl(tmp0, "5");
        for (i=0; i<nc; i++) {
        if (oflag)
                tmp5 = strspl(tmp0, "5");
        for (i=0; i<nc; i++) {
-               if (nc > 1) {
+               if (nc > 1 && !Mflag) {
                        printf("%s:\n", clist[i]);
                        fflush(stdout);
                }
                        printf("%s:\n", clist[i]);
                        fflush(stdout);
                }
-               if (getsuf(clist[i]) == 's') {
+               if (!Mflag && getsuf(clist[i]) == 's') {
                        assource = clist[i];
                        goto assemble;
                } else
                        assource = tmp3;
                if (pflag)
                        tmp4 = setsuf(clist[i], 'i');
                        assource = clist[i];
                        goto assemble;
                } else
                        assource = tmp3;
                if (pflag)
                        tmp4 = setsuf(clist[i], 'i');
-               av[0] = "cpp"; av[1] = clist[i]; av[2] = exflag ? "-" : tmp4;
-               na = 3;
+               av[0] = "cpp"; av[1] = clist[i];
+               na = 2;
+               if (!exflag)
+                       av[na++] = tmp4;
                for (j = 0; j < np; j++)
                        av[na++] = plist[j];
                av[na++] = 0;
                if (callsys(cpp, av)) {
                        exfail++;
                        eflag++;
                for (j = 0; j < np; j++)
                        av[na++] = plist[j];
                av[na++] = 0;
                if (callsys(cpp, av)) {
                        exfail++;
                        eflag++;
+                       cflag++;
+                       continue;
                }
                }
-               if (pflag || exfail) {
+               if (pflag) {
                        cflag++;
                        continue;
                }
                        cflag++;
                        continue;
                }
-               if (sflag)
-                       assource = tmp3 = setsuf(clist[i], 's');
-               av[0] = "ccom"; av[1] = tmp4; av[2] = oflag?tmp5:tmp3; na = 3;
+               if (sflag) {
+                       if (nc==1 && outfile)
+                               tmp3 = outfile;
+                       else
+                               tmp3 = setsuf(clist[i], 's');
+                       assource = tmp3;
+               }
+               av[0] = fflag ? "sccom" : "ccom";
+               av[1] = tmp4; av[2] = oflag?tmp5:tmp3; na = 3;
                if (proflag)
                        av[na++] = "-XP";
                if (gflag) {
                if (proflag)
                        av[na++] = "-XP";
                if (gflag) {
@@ -210,7 +241,7 @@ main(argc, argv)
                if (wflag)
                        av[na++] = "-w";
                av[na] = 0;
                if (wflag)
                        av[na++] = "-w";
                av[na] = 0;
-               if (callsys(ccom, av)) {
+               if (callsys(fflag ? sccom : ccom, av)) {
                        cflag++;
                        eflag++;
                        continue;
                        cflag++;
                        eflag++;
                        continue;
@@ -227,7 +258,11 @@ main(argc, argv)
                        continue;
        assemble:
                cunlink(tmp1); cunlink(tmp2); cunlink(tmp4);
                        continue;
        assemble:
                cunlink(tmp1); cunlink(tmp2); cunlink(tmp4);
-               av[0] = "as"; av[1] = "-o"; av[2] = setsuf(clist[i], 'o');
+               av[0] = "as"; av[1] = "-o";
+               if (cflag && nc==1 && outfile)
+                       av[2] = outfile;
+               else
+                       av[2] = setsuf(clist[i], 'o');
                na = 3;
                if (Rflag)
                        av[na++] = "-R";
                na = 3;
                if (Rflag)
                        av[na++] = "-R";
@@ -251,8 +286,6 @@ nocom:
                }
                while (i < nl)
                        av[na++] = llist[i++];
                }
                while (i < nl)
                        av[na++] = llist[i++];
-               if (gflag || Gflag)
-                       av[na++] = "-lg";
                if (proflag)
                        av[na++] = "-lc_p";
                else
                if (proflag)
                        av[na++] = "-lc_p";
                else
@@ -337,7 +370,14 @@ callsys(f, v)
        char *f, **v;
 {
        int t, status;
        char *f, **v;
 {
        int t, status;
+       char **cpp;
 
 
+       if (debug) {
+               fprintf(stderr, "%s:", f);
+               for (cpp = v; *cpp != 0; cpp++)
+                       fprintf(stderr, " %s", *cpp);
+               fprintf(stderr, "\n");
+       }
        t = vfork();
        if (t == -1) {
                printf("No more processes\n");
        t = vfork();
        if (t == -1) {
                printf("No more processes\n");