📄 cc.c
字号:
case posix: plist[np++] = "-DPOSIX" ; break; case bsd: break; } if (cflag && outfile) /*RAP004*/ fprintf(stderr,"cc: warning: -o ignored when -c or -S used\n"); if (gflag || Gflag) { if (oflag) fprintf(stderr, "cc: warning: -g disables -O\n"); oflag = 0; } if (npassname && chpass ==0) chpass = "012p"; if (chpass && npassname==0) npassname = "/usr/new"; if (chpass) for (t=chpass; *t; t++) { switch (*t) { case '0': ccom = strspl(npassname, "ccom"); continue; case '2': c2 = strspl(npassname, "c2"); continue; case 'a': as = strspl(npassname, "as"); continue; case 'l': ld = strspl(npassname, "ld"); continue; case 'p': cpp = strspl(npassname, "cpp"); continue; } } if (nc==0) goto nocom; if (signal(SIGINT, SIG_IGN) != SIG_IGN) 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) sprintf(tmp0, "/tmp/ctm%05.5d", getpid()); tmp1 = strspl(tmp0, "1"); tmp2 = strspl(tmp0, "2"); tmp3 = strspl(tmp0, "3"); if (pflag==0) tmp4 = strspl(tmp0, "4"); if (oflag) tmp5 = strspl(tmp0, "5"); for (i=0; i<nc; i++) { if (nc > 1 && !makedepend) { printf("%s:\n", clist[i]); fflush(stdout); } if (getsuf(clist[i]) == 's') { 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; for (j = 0; j < np; j++) av[na++] = plist[j]; av[na++] = 0; if (callsys(cpp, av)) { cflag++; eflag++; continue; } if (pflag || exfail) { cflag++; continue; } if (sflag) assource = tmp3 = setsuf(clist[i], 's'); av[0] = "ccom"; av[1] = tmp4; av[2] = oflag?tmp5:tmp3; na = 3; if (bswitch) /* jpm: cld 153 */ { av[na++] = "-XS"; } if (proflag) av[na++] = "-XP"; if (gflag) { av[na++] = "-Xg"; } else if (Gflag) { av[na++] = "-XG"; } if (wflag) av[na++] = "-w"; if (fflag) /* pass fflag to the */ av[na++] = "-f"; /* compiler lvp009 */ /* * If -Mx flag set we must pass this off to the * compiler proper. We do not need to carry * the suffix after -M because the flag indicates * the type of float instruction the user wants * and is internal to the compiler. */ if ( Mflag ) /* slr001 */ av[na++] = "-M"; /* slr001 */ av[na] = 0; if (callsys(ccom, av)) { cflag++; eflag++; continue; } if (oflag) { av[0] = "c2"; av[1] = tmp5; av[2] = tmp3; av[3] = 0; if (callsys(c2, av)) { unlink(tmp3); tmp3 = assource = tmp5; } else unlink(tmp5); } if (sflag) continue; assemble: cunlink(tmp1); cunlink(tmp2); cunlink(tmp4); av[0] = "as"; av[1] = "-o"; av[2] = setsuf(clist[i], 'o'); na = 3; if (Jflag) /*lrm015*/ av[na++] = "-J"; if (Rflag) av[na++] = "-R"; if (dflag) av[na++] = dflag; av[na++] = assource; av[na] = 0; if (callsys(as, av) > 1) { cflag++; eflag++; continue; } }nocom: if (cflag==0 && nl!=0) { i = 0; av[0] = "ld"; av[1] = "-X"; av[2] = crt0; na = 3; if (Yflag) /* pass Yflag through */ switch (mode) { /* if present jlr011 */ case sys_v: av[na++] = "-YSYSTEM_FIVE"; break; case posix: av[na++] = "-YPOSIX"; break; case bsd: av[na++] = "-YBSD"; break; } if (outfile) { av[na++] = "-o"; av[na++] = outfile; } while (i < nl) av[na++] = llist[i++]; if (gflag || Gflag) av[na++] = "-lg"; if (proflag) { if (mode == sys_v) av[na++] = "-lcV_p" ; /* DLB007 */ if (mode == posix) av[na++] = "-lcP_p" ; av[na++] = "-lc_p"; } else if (!bflag) { /* * If bflag is set then don't pass the -lc * flag to the loader. * * If Mflag is set use the GFLOAT libraries. * * If mode == sys_v or posix use the System V or * POSIX libraries in addition to the regular * libraries. (DLB007) */ if (mode == sys_v) av[na++] = Mflag ? "-lcVg" : "-lcV" ; if (mode == posix) av[na++] = Mflag ? "-lcPg" : "-lcP" ; av[na++] = Mflag ? "-lcg" : "-lc" ; /* DLB005 */ } av[na++] = 0; eflag |= callsys(ld, av); if (nc==1 && nxo==1 && eflag==0) unlink(setsuf(clist[0], 'o')); } dexit();}voididexit(){ eflag = 100; dexit();}dexit(){ if (!pflag) { cunlink(tmp1); cunlink(tmp2); if (sflag==0) cunlink(tmp3); cunlink(tmp4); cunlink(tmp5); } exit(eflag);}error(s, x) char *s, *x;{ FILE *diag = exflag ? stderr : stdout; fprintf(diag, "cc: "); fprintf(diag, s, x); putc('\n', diag); exfail++; cflag++; eflag++;}getsuf(as)char as[];{ register int c; register char *s; register int t; s = as; c = 0; while (t = *s++) if (t=='/') c = 0; else c++; s -= 3; if (c <= MAXNAMLEN && c > 2 && *s++ == '.') return (*s); return (0);}char *setsuf(as, ch) char *as;{ register char *s, *s1; s = s1 = savestr(as); while (*s) if (*s++ == '/') s1 = s; s[-1] = ch; return (s1);}callsys(f, v) char *f, **v;{ int t, status; if (vflag) /* jpm */ { printf("%s", f ); for (t = 1; v[t] != 0; t++) printf(" %s", v[t]); printf("\n"); } t = vfork(); if (t == -1) { printf("No more processes\n"); return (100); } if (t == 0) { execv(f, v); printf("Can't find %s\n", f); fflush(stdout); _exit(100); } while (t != wait(&status)) ; if ((t=(status&0377)) != 0 && t!=14) { if (t!=2) { printf("Fatal error in %s\n", f); eflag = 8; } dexit(); } return ((status>>8) & 0377);}nodup(l, os) char **l, *os;{ register char *t, *s; register int c; s = os; if (getsuf(s) != 'o') return (1); while (t = *l++) { while (c = *s++) if (c != *t++) break; if (*t==0 && c==0) return (0); s = os; } return (1);}#define NSAVETAB 1024char *savetab;int saveleft;char *savestr(cp) register char *cp;{ register int len; len = strlen(cp) + 1; if (len > saveleft) { saveleft = NSAVETAB; if (len > saveleft) saveleft = len; savetab = (char *)malloc(saveleft); if (savetab == 0) { fprintf(stderr, "ran out of memory (savestr)\n"); exit(1); } } strncpy(savetab, cp, len); cp = savetab; savetab += len; saveleft -= len; return (cp);}char *strspl(left, right) char *left, *right;{ char buf[BUFSIZ]; strcpy(buf, left); strcat(buf, right); return (savestr(buf));}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -