00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080 # include <stdio.h>
00081 # include <signal.h>
00082 # include <a.out.h>
00083 # include <sys/file.h>
00084 # include <sys/types.h>
00085 # include <sys/stat.h>
00086 # include "../parm.h"
00087 # include "mesg.h"
00088
00089 # ifdef malloc
00090 # undef malloc
00091 # undef free
00092 # endif
00093
00094 # define DEBUG DEBUG
00095
00096
00097 char *ppname;
00098 char *rcname;
00099 char *optname;
00100 char *RICoptname;
00101 char *RICfiltername;
00102 char *cgname;
00103
00104
00105 char *rctmp0name;
00106 char *rctmp1name;
00107 char *rctmp2name;
00108 char *rctmp3name;
00109 char *rctmp4name;
00110
00111
00112
00113
00114 boolean aflag;
00115 boolean oflag;
00116 boolean Oflag;
00117 boolean OOflag;
00118 boolean OOOflag;
00119 boolean Sflag;
00120 boolean cflag;
00121 boolean rflag;
00122 boolean pflag;
00123 boolean Pflag;
00124 boolean Gflag;
00125 boolean CGflag;
00126 boolean Cflag;
00127 boolean fflag;
00128 boolean Fflag;
00129 boolean Rflag;
00130 boolean Xflag;
00131 boolean xflag;
00132 boolean uflag;
00133 boolean Vflag;
00134
00135 boolean take_next= FALSE;
00136 char *lppflags = "";
00137 char *lpmnflags = "BDidaMpLPTVNfFRhx";
00138
00139 char *lprtflags = "IUOGcSArlCXOu";
00140
00141 char appflags[100];
00142 char apmnflags[100];
00143
00144 char *objfiles[MAXNOBJFILES];
00145
00146 int nobjfiles = 0;
00147
00148 char *libraries[MAXNLIBRARIES];
00149 int nlibraries = 0;
00150
00151 char * malloc();
00152
00153 int intr_handler();
00154
00155
00156 void add_objfile(ofile)
00157 char * ofile;
00158 {
00159 char * nfn = malloc(strlen(ofile)+1);
00160 int i;
00161 boolean duplicate = FALSE;
00162
00163 if (nobjfiles >= MAXNOBJFILES) {
00164 fprintf(stderr, "Too many object files\n");
00165 exit(1);
00166 }
00167 strcpy(nfn,ofile);
00168 for (i = 0; i < nobjfiles; i++) {
00169 if (strcmp(nfn, objfiles[i]) == 0) {
00170
00171
00172
00173
00174
00175 duplicate = TRUE;
00176 }
00177 }
00178 if (!duplicate) {
00179 objfiles[nobjfiles++] = nfn;
00180 }
00181 }
00182
00183
00184 char Rcname[15] = "";
00185
00186
00187 char * codefilename;
00188
00189
00190 char * main_out_fname;
00191
00192 char * outfilename();
00193 char * mktemp();
00194
00195 boolean dloadflag = FALSE;
00196
00197
00198 main(argc,argv)
00199 int argc;
00200 char **argv;
00201 { int argf;
00202
00203 int status;
00204 extern exit();
00205 boolean compile_only = FALSE;
00206 int argn;
00207
00208
00209 signal(SIGQUIT, exit);
00210
00211
00212 signal(SIGINT, intr_handler);
00213
00214 ppname = PPNAME;
00215 rcname = RCNAME;
00216 optname = OPTNAME;
00217 cgname = CGNAME;
00218 RICoptname = RICOPTNAME;
00219 RICfiltername = RICFILTERNAME;
00220
00221 argf = -1;
00222
00223 # ifndef VAX
00224
00225 Gflag = TRUE;
00226 CGflag = TRUE;
00227 # endif
00228
00229 strcpy(appflags, "-");
00230 strcpy(apmnflags, "-");
00231 for (argn = 1; argn < argc; argn++) {
00232 if (take_next) {
00233 int al = strlen(argv[argn]);
00234 if (strcmp(argv[argn]+al-2,".o")==0 ||
00235 strcmp(argv[argn]+al-2,".r")==0) {
00236 fprintf(stderr,"Questionable -o usage: Might overwrite %s.\n",
00237 argv[argn]);
00238 goto usage;
00239 } else {
00240 add_objfile(argv[argn]);
00241 take_next = FALSE;
00242 }
00243 } else if ( argv[argn][0] == '-' ) {
00244 char *flagp;
00245 char *farg = "0";
00246 switch( argv[argn][1] ) {
00247
00248 case 'l' :
00249 if (nlibraries >= MAXNLIBRARIES) {
00250 fprintf(stderr, "Too many libraries\n");
00251 exit(1);
00252 }
00253 libraries[nlibraries++] = argv[argn];
00254 break;
00255
00256 case 'o' :
00257 oflag = TRUE;
00258 add_objfile(argv[argn]);
00259 take_next = TRUE;
00260 break;
00261
00262 default:
00263
00264 for (flagp = &(argv[argn][1]); *flagp != 0; flagp++) {
00265 farg[0] = *flagp;
00266 if ( index(lppflags, *flagp) != 0 ) {
00267 strcat(appflags, farg);
00268 } else if ( index(lpmnflags, *flagp) != 0 ) {
00269 strcat(apmnflags, farg);
00270 } else if ( index(lprtflags, *flagp) == 0 ) {
00271 fprintf(stderr, "Bad flag: %c\n", *flagp);
00272 }
00273 switch ( *flagp ) {
00274 case 'd' :
00275 dloadflag = TRUE;
00276
00277 case 'i' :
00278
00279 if ( strcmp(Rcname, "") == 0 )
00280 strcpy(Rcname, "Rc");
00281 compile_only = TRUE;
00282 break;
00283 case 'I':
00284 if (Gflag) {
00285 strcpy(Rcname, "rc.x");
00286 } else {
00287 strcpy(Rcname, "Grc.x");
00288 }
00289 break;
00290 case 'C':
00291 Cflag = TRUE;
00292 break;
00293 case 'U':
00294 strcpy(Rcname, "Rc");
00295 break;
00296 case 'a':
00297 aflag = TRUE;
00298 break;
00299 case 'A':
00300 Sflag = TRUE;
00301 # ifdef VAX
00302 CGflag = TRUE;
00303 Gflag = TRUE;
00304 # else
00305 CGflag = FALSE;
00306 Gflag = FALSE;
00307 # endif
00308 break;
00309 case 'O':
00310 if (OOflag) {
00311 OOOflag = TRUE;
00312 } else if (Oflag) {
00313 OOflag = TRUE;
00314 } else {
00315 Oflag = TRUE;
00316 }
00317 break;
00318 case 'c':
00319 if (nobjfiles != 0) {
00320 fprintf(stderr, "Warning: .o files ignored with -c\n");
00321 }
00322 cflag = TRUE;
00323 break;
00324 case 'X':
00325 Xflag = TRUE;
00326 break;
00327 case 'S':
00328 Sflag = TRUE;
00329 break;
00330 case 'r':
00331 rflag = TRUE;
00332 break;
00333 case 'p':
00334 pflag = TRUE;
00335 break;
00336 case 'P':
00337 Pflag = TRUE;
00338 break;
00339 case 'G':
00340 Gflag = TRUE;
00341 CGflag = FALSE;
00342 compile_only = TRUE;
00343 break;
00344 case 'f':
00345 fflag = TRUE;
00346 break;
00347 case 'F':
00348 fflag = TRUE;
00349 Fflag = TRUE;
00350 break;
00351 case 'R':
00352 Rflag = TRUE;
00353 break;
00354 case 'u':
00355 uflag = TRUE;
00356 break;
00357 case 'x':
00358 xflag = TRUE;
00359 break;
00360 case 'V':
00361 Vflag = TRUE;
00362 break;
00363 }
00364 }
00365 }
00366 } else {
00367
00368 int arg_len = strlen(argv[argn]);
00369 if (argv[argn][arg_len-1] == 'o'
00370 && argv[argn][arg_len-2] == '.') {
00371 if (cflag) {
00372 fprintf(stderr, "Warning: .o files ignored with -c\n");
00373 }
00374 add_objfile(argv[argn]);
00375 } else {
00376 if (argf == -1) {
00377 argf = argn;
00378 } else {
00379 fprintf(stderr, "One source file at a time, please!\n");
00380 goto usage;
00381 }
00382 }
00383 }
00384 }
00385
00386 if (argf == -1) {
00387 fprintf(stderr, "No Russell source file\n");
00388 goto usage;
00389 }
00390
00391 if (cflag && Gflag && !CGflag) {
00392 fprintf(stderr, "Warning: -G suppresses -c\n");
00393 cflag = FALSE;
00394 }
00395
00396
00397 if (Xflag && cflag) {
00398 fprintf(stderr, "Warning: -X suppresses -c\n");
00399 cflag = FALSE;
00400 }
00401
00402 # ifdef RT
00403 # ifndef GEN_C
00404
00405 if (CGflag) {
00406 if (!Fflag) {
00407 strcat(apmnflags, "F");
00408 }
00409 Fflag = TRUE;
00410 }
00411 # endif
00412 # endif
00413
00414 # ifdef GEN_C
00415
00416 if (CGflag) {
00417 if (!Fflag) {
00418 strcat(apmnflags, "f");
00419 }
00420 }
00421 # endif
00422
00423 if (Gflag) {
00424 strcat(apmnflags, "G");
00425 if (Rcname[0] != 'R') {
00426
00427 strcpy(Rcname, "Grc.x");
00428 }
00429 }
00430
00431
00432 if (Xflag) {
00433 strcat(apmnflags, "X");
00434 }
00435
00436 if (cflag) {
00437 strcat(apmnflags, "c");
00438 }
00439
00440 if (Oflag) {
00441 strcat(apmnflags, "O");
00442 }
00443
00444 if (OOflag) {
00445 if (!Gflag) {
00446 fprintf(stderr, "-OO was ignored - works only in conjunction with intermediate code generator\n");
00447 } else if (OOOflag) {
00448 strcat(apmnflags, "OO");
00449 } else {
00450 strcat(apmnflags, "O");
00451 }
00452 }
00453
00454
00455 rctmp0name = mktemp("/tmp/rctmp0XXXXXX");
00456 rctmp1name = mktemp("/tmp/rctmp1XXXXXX");
00457 rctmp2name = mktemp("/tmp/rctmp2XXXXXX");
00458 if (Gflag & Oflag) {
00459 rctmp4name = mktemp("/tmp/rctmp4XXXXXX");
00460 }
00461 if (OOflag) {
00462 rctmp3name = mktemp("/tmp/rctmp3XXXXXX");
00463 }
00464
00465
00466 unlink(OBJFILELIST);
00467
00468
00469 if (OOflag || Oflag && ! Gflag) {
00470 codefilename = rctmp1name;
00471 } else {
00472 codefilename = outfilename(argv[argf], (Gflag? 'G' : 's'));
00473 }
00474
00475
00476 if (Oflag & Gflag) {
00477 main_out_fname = rctmp4name;
00478 } else {
00479 main_out_fname = codefilename;
00480 }
00481
00482 if (pflag) {
00483
00484 if( rfork() == 0 ) {
00485 fclose(stdout);
00486 if( fopen( rctmp0name, "w" ) == NULL ) {
00487 fprintf(stderr, "Cannot create %s\n", rctmp0name);
00488 exit(1);
00489 }
00490 execl(ppname, "cpp", appflags, argv[argf], 0 );
00491
00492
00493 fprintf(stderr, "Can't exec preprocessor\n");
00494 exit(1);
00495 }
00496
00497
00498 wait( &status );
00499 if( status != 0 ) {
00500 fprintf(stderr, "Compilation terminated after preprocessing.\n");
00501 printstatus(status);
00502 rmfiles();
00503 exit(1);
00504 }
00505 }
00506
00507
00508 if( rfork() == 0 ) {
00509 char fullrcname[150];
00510
00511 if (uflag) {
00512 fullrcname[0] = '\0';
00513 } else {
00514 strcpy(fullrcname, rcname);
00515 }
00516 if (Rcname[0] == 0)
00517 strcat(fullrcname, "rc.x");
00518 else
00519 strcat(fullrcname, Rcname);
00520 # if vax
00521 if(dloadflag) {
00522
00523 int rcdescr;
00524 long magic_n;
00525
00526 if ((rcdescr = open(fullrcname,0)) == -1 ||
00527 read(rcdescr, &magic_n, sizeof (long)) <= 0) {
00528 fprintf(stderr,"Can't read %s\n", fullrcname);
00529 rmfiles();
00530 exit(1);
00531 }
00532 if (magic_n != ZMAGIC && magic_n != NMAGIC) {
00533 fprintf (stderr,"Can't generate demand loadable file from old format a.out file\n");
00534 }
00535 close(rcdescr);
00536 }
00537 # endif
00538 if (cflag && OOflag) {
00539 execl(fullrcname, "Rc", argv[argf],
00540 apmnflags, pflag? rctmp0name : argv[argf],
00541 main_out_fname,
00542 rctmp2name, rctmp3name, 0 );
00543 } else if (cflag) {
00544 execl(fullrcname, "Rc", argv[argf],
00545 apmnflags, pflag? rctmp0name : argv[argf],
00546 main_out_fname,
00547 rctmp2name, 0 );
00548 } else if (OOflag) {
00549 execl(fullrcname, "Rc", argv[argf],
00550 apmnflags, pflag? rctmp0name : argv[argf],
00551 main_out_fname,
00552 rctmp3name, 0 );
00553 } else {
00554 execl(fullrcname, "Rc", argv[argf],
00555 apmnflags, pflag? rctmp0name : argv[argf],
00556 main_out_fname, 0 );
00557 }
00558
00559
00560 fprintf(stderr, "Can't exec %s\n", fullrcname);
00561 rmfiles();
00562 exit(1);
00563 }
00564
00565
00566 wait( &status );
00567 if( status != 0 ) {
00568 fprintf(stderr, "Compilation terminated prematurely.\n");
00569 printstatus(status);
00570 rmfiles();
00571 exit(1);
00572 }
00573
00574
00575 {
00576 # define MAXFILELEN 100
00577 FILE * objfilelist = fopen(OBJFILELIST, "r");
00578 char namebuf[MAXFILELEN+1];
00579 int len;
00580 int retcode;
00581
00582 if (objfilelist != NULL) {
00583 while (!feof(objfilelist)) {
00584 retcode = (int) fgets(namebuf, MAXFILELEN, objfilelist);
00585
00586 {
00587 len = strlen(namebuf);
00588 if (namebuf[len-1] == '\n') {
00589 namebuf[--len] = 0;
00590 }
00591 }
00592 if (retcode != NULL && len != 0) {
00593 add_objfile(namebuf);
00594 }
00595 }
00596 }
00597 }
00598
00599 if (Oflag && !Gflag) {
00600
00601 if( rfork() == 0 ) {
00602 char * optfilename = outfilename(argv[argf], 's');
00603
00604 if( freopen( optfilename, "w", stdout ) == NULL ) {
00605 fprintf(stderr, "Cannot create %s\n", optfilename);
00606 exit(1);
00607 }
00608 execl("/bin/awk", "awk", "-f", OPTNAME,
00609 codefilename, 0);
00610
00611
00612 fprintf(stderr, "Can't exec /bin/awk\n");
00613 exit(1);
00614 }
00615
00616
00617 wait( &status );
00618 if( status != 0 ) {
00619 fprintf(stderr, "Optimization failed\n");
00620 printstatus(status);
00621 rmfiles();
00622 exit(1);
00623 }
00624 }
00625
00626 if (Oflag && Gflag) {
00627
00628 if( rfork() == 0 ) {
00629 if( freopen( codefilename, "w", stdout ) == NULL ) {
00630 fprintf(stderr, "Cannot create %s\n", codefilename);
00631 exit(1);
00632 }
00633 if( freopen( main_out_fname, "r", stdin ) == NULL ) {
00634 fprintf(stderr, "Cannot create %s\n", main_out_fname);
00635 exit(1);
00636 }
00637 execl(RICfiltername, "RICfilter", 0);
00638
00639
00640 fprintf(stderr, "Can't exec %s\n", RICfiltername);
00641 exit(1);
00642 }
00643
00644
00645 wait( &status );
00646 if( status != 0 ) {
00647 fprintf(stderr, "Local RIC optimization failed\n");
00648 printstatus(status);
00649 rmfiles();
00650 exit(1);
00651 }
00652 }
00653
00654 if (OOflag) {
00655
00656 if( rfork() == 0 ) {
00657 char * optfilename = outfilename(argv[argf], 'G');
00658
00659 execl(RICoptname, "RICopt", (Vflag? "-verbose" : "-"),
00660 codefilename, optfilename, rctmp3name,
00661 cflag? rctmp4name : "/dev/null", 0);
00662
00663
00664 fprintf(stderr, "Can't exec %s\n", RICoptname);
00665 exit(1);
00666 }
00667
00668
00669 wait( &status );
00670 if( status != 0 ) {
00671 fprintf(stderr, "Optimization failed\n");
00672 printstatus(status);
00673 rmfiles();
00674 exit(1);
00675 }
00676 }
00677
00678 if (compile_only) {
00679 rmfiles();
00680 exit(0);
00681 }
00682
00683 if (CGflag) {
00684 char * gf_name;
00685 char * global_ar_name();
00686
00687 if (xflag && !cflag) {
00688
00689
00690
00691
00692
00693
00694
00695
00696 gf_name = global_ar_name(argv[argf]);
00697 } else {
00698 gf_name = "global_ar";
00699 }
00700
00701 if( rfork() == 0 ) {
00702 if (Oflag) {
00703 execl(cgname, cgname,
00704 (xflag? "-Ox" : "-O"),
00705 outfilename(argv[argf], 'G'),
00706 # ifndef RT
00707 outfilename(argv[argf], 's'),
00708 # endif
00709 # ifdef GEN_C
00710 gf_name,
00711 # endif
00712 0);
00713 } else if (xflag) {
00714 execl(cgname, cgname,
00715 "-x",
00716 outfilename(argv[argf], 'G'),
00717 # ifndef RT
00718 outfilename(argv[argf], 's'),
00719 # endif
00720 # ifdef GEN_C
00721 gf_name,
00722 # endif
00723 0);
00724 } else {
00725 execl(cgname, cgname,
00726 outfilename(argv[argf], 'G'),
00727 # ifndef RT
00728 outfilename(argv[argf], 's'),
00729 # endif
00730 # ifdef GEN_C
00731 gf_name,
00732 # endif
00733 0);
00734 }
00735
00736
00737 fprintf(stderr, "Can't exec %s\n", cgname);
00738 rmfiles();
00739 exit(1);
00740 }
00741
00742
00743 wait( &status );
00744 if( status != 0 ) {
00745 fprintf(stderr, "Final code generation failed\n");
00746 printstatus(status);
00747 rmfiles();
00748 exit(1);
00749 }
00750 }
00751
00752 if (!Sflag) {
00753
00754 if (rfork() == 0) {
00755 execl("/bin/as", "as", "-o", outfilename(argv[argf], 'o'),
00756 outfilename(argv[argf], 's'), 0);
00757 fprintf(stderr, "Can't exec /bin/as\n");
00758 rmfiles();
00759 exit(1);
00760 }
00761 wait(&status);
00762 if (status != 0) {
00763 fprintf(stderr, "Assembly failed\n");
00764 printstatus(status);
00765 rmfiles();
00766 exit(1);
00767 }
00768
00769 if (!cflag && !Xflag) {
00770 char * ld_argv[MAXNOBJFILES + 10];
00771 int ld_argc = 0;
00772 int i;
00773
00774
00775 add_objfile(outfilename(argv[argf], 'o'));
00776 if (!rflag) {
00777 # ifdef RT
00778 add_objfile(strcat(RROOT, "/rt_runtime/rrt0.o"));
00779 # else
00780 add_objfile(strcat(RROOT, "/runtime/rrt0.o"));
00781 # endif
00782
00783 if (nlibraries >= MAXNLIBRARIES) {
00784 fprintf(stderr, "Too many libraries\n");
00785 exit(1);
00786 }
00787 if (Pflag) {
00788 libraries[nlibraries++] = "/usr/lib/libc_p.a";
00789 } else {
00790 libraries[nlibraries++] = "/lib/libc.a";
00791 }
00792 }
00793
00794
00795 ld_argv[ld_argc++] = "ld";
00796 if (rflag) {
00797
00798 ld_argv[ld_argc++] = "-r";
00799 } else {
00800 ld_argv[ld_argc++] = "-e";
00801 ld_argv[ld_argc++] = "start";
00802 if (Pflag) {
00803 ld_argv[ld_argc++] = "/lib/gcrt0.o";
00804 } else {
00805 ld_argv[ld_argc++] = "/lib/crt0.o";
00806 }
00807 }
00808 for (i = 0; i < nobjfiles; i++) {
00809 ld_argv[ld_argc++] = objfiles[i];
00810 }
00811 for (i = 0; i < nlibraries; i++) {
00812 ld_argv[ld_argc++] = libraries[i];
00813 }
00814 ld_argv[ld_argc++] = 0;
00815
00816 if (rfork() == 0) {
00817 execv("/bin/ld", ld_argv);
00818 fprintf(stderr, "Can't exec /bin/ld\n");
00819 rmfiles();
00820 exit(1);
00821 }
00822 wait(&status);
00823 if (status != 0 && (!rflag )) {
00824 fprintf(stderr, "Linking failed\n");
00825 printstatus(status);
00826 }
00827 } else if (cflag) {
00828
00829 FILE * rctmp2 = fopen(rctmp2name,"r");
00830 FILE * ofile = fopen(outfilename(argv[argf], 'o'), "r+");
00831 long strsize;
00832 struct exec header;
00833 extern char * etext;
00834 char c;
00835 # if defined(SUN) && defined(EXTRA_MAGIC)
00836 struct extra_sections es;
00837 unsigned long es_start;
00838
00839 unsigned long es_length;
00840 # endif
00841
00842 if (ofile == NULL) {
00843 fprintf(stderr, "Can't open %s\n",
00844 outfilename(argv[argf], 'o'));
00845 rmfiles();
00846 exit(1);
00847 }
00848 if (rctmp2 == NULL) {
00849 fprintf(stderr, "Can't open %s\n", rctmp2);
00850 rmfiles();
00851 exit(1);
00852 }
00853 fread(&header, sizeof (struct exec), 1, ofile);
00854 fseek(ofile, N_STROFF(header), 0);
00855 fread(&strsize, sizeof (long), 1, ofile);
00856 fseek(ofile, N_STROFF(header) + strsize, 0);
00857
00858 # if defined(SUN) && defined(EXTRA_MAGIC)
00859
00860 es_start = ftell(ofile);
00861 fseek(ofile, sizeof (struct extra_sections) + sizeof(int), 1);
00862 # endif
00863
00864 if (OOflag) {
00865
00866 struct stat buf;
00867 FILE * rctmp4 = fopen(rctmp4name,"r");
00868 int count;
00869
00870 if (rctmp4 == NULL) {
00871 fprintf(stderr, "Optimizer failed to write flow info\n");
00872 putw(0, ofile);
00873 } else {
00874 fstat(fileno(rctmp4), &buf);
00875 putw(buf.st_size, ofile);
00876 count = 0;
00877 while (c = getc(rctmp4), !feof(rctmp4)) {
00878 putc(c, ofile); count ++;
00879 }
00880 if (count != buf.st_size) {
00881 fprintf(stderr, "Stat returned incorrect size for %s\n",
00882 rctmp4name);
00883 abort(count, buf.st_size);
00884 }
00885 }
00886 } else {
00887 putw(0, ofile);
00888 }
00889
00890 while (c = getc(rctmp2), !feof(rctmp2)) {
00891 putc(c, ofile);
00892 }
00893 # if defined(SUN) && defined(EXTRA_MAGIC)
00894
00895 es_length = ftell(ofile) - es_start
00896 - sizeof (struct extra_sections)
00897 - sizeof(int);
00898 fseek(ofile, es_start, 0);
00899 es.extra_magic = EXTRA_MAGIC;
00900 es.extra_nsects = 1;
00901 if (!fwrite(&es, sizeof (struct extra_sections), 1, ofile)) {
00902 fprintf(stderr, "Couldnt write extra sections hdr\n");
00903 }
00904 putw(es_length, ofile);
00905 # endif
00906
00907 fclose(ofile);
00908 fclose(rctmp2);
00909 }
00910 }
00911
00912 if (Cflag) {
00913 if (!Gflag || CGflag) {
00914 unlink(outfilename(argv[argf],'G'));
00915 }
00916 if (!Sflag) {
00917 unlink(outfilename(argv[argf],'s'));
00918 }
00919 # ifdef GEN_C
00920 unlink(outfilename(argv[argf],'c'));
00921 # endif
00922 unlink(OBJFILELIST);
00923 }
00924 rmfiles();
00925 exit(0);
00926
00927 usage:
00928 fprintf(stderr, "Usage: rc [-%s%s%s] filename\n",
00929 lppflags, lpmnflags, lprtflags);
00930 exit(1);
00931 }
00932
00933
00934
00935
00936
00937 char *outfilename(str, x)
00938 char *str;
00939 char x;
00940 {
00941 register char *p, *q;
00942 char * result;
00943
00944 result = (char *)malloc(strlen(str) + 4);
00945 p = str; q = result;
00946 while( *p )
00947 *q++ = *p++;
00948 q--;
00949 if( (q[-1] == '.') && (q[0] == 'r') ) {
00950 *q++ = x;
00951 *q++ = 0;
00952 } else {
00953 sprintf(result, "a.%c", x);
00954 }
00955 return(result);
00956 }
00957
00958
00959
00960
00961
00962
00963 char * global_ar_name(s)
00964 char *s;
00965 {
00966 register char * result = (char *)malloc(strlen(s) + 20);
00967 register char * buf = (char *)malloc(strlen(s) + 1);
00968 int len = strlen(s);
00969
00970 strcpy(buf,s);
00971 if (buf[len-1] == 'r' && buf[len-2] == '.') {
00972 buf[len-2] = '\0';
00973 }
00974 sprintf(result, "%s_ar_save_loc", buf);
00975 free(buf);
00976 return(result);
00977 }
00978
00979
00980
00981
00982
00983
00984
00985 printstatus(s)
00986 unsigned s;
00987 { unsigned e = s & 0177;
00988
00989 if ( mesg[e] != 0 ) {
00990 fprintf(stderr, "Reason: %s", mesg[e]);
00991 if ( s & 0200 )
00992 fprintf(stderr, " -- Core was dumped\n");
00993 else
00994 fprintf(stderr, "\n");
00995 }
00996 }
00997
00998
00999
01000
01001
01002
01003
01004 rfork()
01005 { register int forkcode;
01006 forkcode = fork();
01007 if (forkcode == -1) {
01008 fprintf(stderr, "Can't fork!!!\n");
01009 exit(1);
01010 }
01011 return(forkcode);
01012 }
01013
01014
01015
01016
01017 rmfiles()
01018 {
01019 unlink(rctmp0name);
01020 unlink(rctmp1name);
01021 unlink(rctmp2name);
01022 if (OOflag) {
01023 unlink(rctmp3name);
01024 }
01025 if (Oflag & Gflag) {
01026 unlink(rctmp4name);
01027 }
01028 }
01029
01030
01031
01032
01033 intr_handler()
01034 {
01035 rmfiles();
01036 exit(1);
01037 }