pete@wlbr.EATON.COM (Pete Lyall) (08/13/88)
New 'CC' driver for the C Compiler - Kreider, Lyall, Dickhaus This is the enhanced CC driver for the Coco3 using Level II. I also have a slightly newer version that handles abbreviated '-l' declarations (-l=gfxlib instead of -l=/r/lib/gfxlib.l), but it only supports the single pass compiler. If someone wants to add those hacks to this, let me know, and I'll mail them the other source so that they can retrofit this two-pass compiler version. #! /bin/sh # This is a shell archive, meaning: # 1. Remove everything above the #! /bin/sh line. # 2. Save the resulting text in a file. # 3. Execute the file with /bin/sh (not csh) to create the files: # cc.c # cc.h # cc.uue # ccdevice.a # readme # This archive created: Fri Aug 12 14:26:04 1988 export PATH; PATH=/bin:$PATH if test -f 'cc.c' then echo shar: will not over-write existing file "'cc.c'" else cat << \SHAR_EOF > 'cc.c' /* ** driver for the C compiler */ /* ** 01-23-85 Added -b and -t options. Enabled /nl. ** ??-??-?? Added -O option to stop compilation after optimization. ** Prevent optimization of ".a" files. ** 02-15-85 Fix naming conventions if -O is used. ** ??-??-?? ll option for lex lib ** 07-30-86 P option for special debug and z for debug ** 03-24-87 don't optimize ".o" files, but accept as ".a" ** 03-12-88 Added two pass (CoCo) compiler support. Bill Dickhaus */ #include "cc.h" #include <module.h> cleanup() { if (childid) kill(childid, 2); if (newopath) { close(1); dup(newopath); } if (thisfilp) unlink(thisfilp); if (lasfilp) unlink(lasfilp); } trap(code) int code; { cleanup(); exit(code); } /*page*/ main(argc, argv) int argc; char **argv; { char **emp; int suffix, j, m, deltmpflg; register char *p; j = 0; while ((--argc > 0) && (++j < 100)) { if (*(p = *++argv) == '-') { while (*++p) { switch (*p) { case 'a' : /* stop at asm (no .r) (D) */ aflag = TRUE; break; case 'b' : /* use different "cstart" */ bflag = TRUE; if (*(p + 1) != '=') break; strcpy(mainline, (p + 2)); goto saver; case 'c' : /* include comments (C) */ cflag = TRUE; break; case 'd' : /* make identifier (define) (C) */ if (*(p + 1) == '\0') goto saver; *--p = '-'; *(p + 1) = 'D'; macarray[maccnt++] = p; goto saver; case 'e' : /* set edition number */ emp = &edition; goto emcommon; case 'f' : /* set outfile path (L) */ if (*++p != '=') goto saver; strcpy(objname, (p + 1)); if (objname[0] == '\0') goto saver; ++fflag; suffix = findsuff(objname); if (suffix == 'c' || suffix == 'r') error("Suffix '.%c' not allowed for output", suffix); goto saver; /*page*/ case 'l' : /* specify a library (L) */ if (*(p + 1) == 'l') { llflg++; goto saver; } else if (*(p + 1) != '=') goto saver; if (libcnt == 4) error("Too many libraries"); *--p = '-'; libarray[libcnt++] = p; goto saver; case 'm' : /* set memory size */ emp = &xtramem; *p &= 0x5f; emcommon: if ((*(p + 1))) { *--p = '-'; *emp = p; } goto saver; case 'M' : /* ask linker for link map (L) */ mflag = TRUE; break; case 'n' : /* give module a name (L) */ *--p = '-'; modname = p; goto saver; case 'o' : /* no optimizer (O) */ oflag = FALSE; break; case 'O' : /* stop after optimization */ o2flg = TRUE; break; case 'P' : p2flg = TRUE; /* fall to set pflag too */ case 'p' : /* add profiler (C) */ pflag = TRUE; break; case 'q' : /* use quiet mode */ qflag = TRUE; freopen("c.errors", "w", stderr); break; case 'r' : /* stop at .r (no link) */ rflag = TRUE; if (*++p != '=') goto saver; strcpy(rlib, (p + 1)); if (rlib[0] == '\0') goto saver; strcat(rlib, "/"); goto saver; /*page*/ case 's' : /* no stack checking (C) */ sflag = TRUE; break; case 'S' : /* ask linker for symbol table (L) */ s2flg = TRUE; break; case 't' : /* use transendental library */ tflag = TRUE; break; case 'T' : /* use alternate (or NO) tmpdir*/ if (*(p + 1) != '=') { tmpdir = FALSE; break; } else { strcpy(tmpname, (p + 2)); strcat(tmpname,"/"); } goto saver; case 'w' : /* waste the compile for error check */ nullflag = TRUE; break; case 'x' : /* use the work dir for main library */ xflag = TRUE; break; case 'z' : zflag = TRUE; break; default : error("unknown flag : -%c\n", *p); } /* end of switch */ } /* end of inner while */ saver: continue; } /* end of if */ else { switch (suffix = findsuff(*argv)) { case 'r' : rsufflg = 1; case 'a' : case 'c' : case 'o' : suffarray[filcnt] = suffix; namarray[filcnt] = *argv; ++filcnt; break; default : error("%s : no recognised suffix", *argv); } /* end of switch */ } /* end of else */ } /* end of outer while */ /*page*/ /* command line now parsed, start real work */ logo(); /* identify us */ if (filcnt == 0) { fprintf(stderr, "no files!\n"); exit (0); } if ((aflag + rflag) > 1) error("incompatible flags"); if (fflag) if (filcnt >1) if (aflag || rflag) error("%s : output name not applicable", objname); if (fflag == 0) strcpy(objname, ((filcnt == 1) ? namarray[0] : "output")); if((tmpdir) && (*tmpname == '\0')) for(loopcnt=0;loopcnt<sizeof(tmproot)/sizeof(char *);loopcnt++) if(access(tmproot[loopcnt],0x83) == 0) { strcpy(tmpname, tmproot[loopcnt]); strcat(tmpname,"/"); break; } strcat(tmpname, tmptail); mktemp(tmpname); strcat(tmpname, ".m"); /* add a suffix for chgsuff */ intercept(trap); dummy(); for (j = 0; j < filcnt; ++j) /* for each file on cmd line */ { fprintf(stderr, "'%s'\n", namarray[j]); if (suffarray[j] == 'c') { deltmpflg = 1; /* is C prog so prep and compile it */ strcpy(destfile, tmpname); chgsuff(destfile, 'm'); frkprmp = parmbuf; if (cflag) splcat("-l"); /* wants comments */ if (edition) splcat(edition); /* explicit edition number */ for (m = 0; m < maccnt; ) splcat(macarray[m++]); /* tack on "defines" */ splcat(namarray[j]); /* and now the file name */ newopath = dup(1); close(1); if ((creat(destfile, 3)) != 1) error("can't create temporary file for '%s'", namarray[j]); trmcat(); thisfilp = 0; lasfilp = destfile; runit("c.prep", 1); close(1); dup(newopath); close(newopath); newopath = 0; /*page*/ /* now compile it */ if (TWOPASS) { strcpy(srcfile, destfile); frkprmp = parmbuf; thisfilp = srcfile; splcat(srcfile); if (sflag) splcat("-s"); /* no stack checking */ strcpy(destfile, tmpname); chgsuff(destfile, 'a'); strcpy(ofn, "-o="); strcat(ofn, destfile); splcat(ofn); if (pflag) splcat("-p"); /* profiler code */ trmcat(); lasfilp = destfile; runit("c.pass1", 0); unlink(srcfile); } strcpy(srcfile, destfile); frkprmp = parmbuf; thisfilp = srcfile; splcat(srcfile); if (sflag) splcat("-s"); /* no stack checking */ if (nullflag) { if (!TWOPASS) splcat("-n"); /* waste the output */ strcpy(destfile, "/nil"); deltmpflg = 0; } else { if (aflag) { if (fflag) strcpy(destfile, objname); /* explicit obj name */ else { strcpy(destfile, namarray[j]); chgsuff(destfile, 'a'); } } else chgsuff(destfile, 'i'); } strcpy(ofn, "-o="); strcat(ofn, destfile); splcat(ofn); if (pflag) splcat("-p"); /* wants profiler code */ trmcat(); lasfilp = destfile; if (TWOPASS) runit("c.pass2", 0); else runit("c.comp", 0); unlink(srcfile); } else deltmpflg = 0; /*page*/ /* now assemble and perhaps optimize it */ if (aflag || nullflag || (suffarray[j] == 'r')) lasfilp = 0; /* is .r so no work to do */ else { /* don't optimize ".a" or ".o" files */ if ((suffarray[j] == 'a') || (suffarray[j] == 'o')) { strcpy(srcfile, namarray[j]); thisfilp = 0; } else { strcpy(srcfile, destfile); thisfilp = srcfile; if (oflag) { frkprmp = parmbuf; /* yes, optimize it */ splcat(srcfile); if ((filcnt == 1) && (o2flg == 0)) { strcpy(destfile, tmpname); chgsuff(destfile, 'm'); } else { if (fflag && o2flg) strcpy(destfile, objname); else { chgsuff(namarray[j], 'o'); strcpy(destfile, namarray[j]); } } splcat(destfile); trmcat(); lasfilp = destfile; runit("c.opt", 0); if (deltmpflg) unlink(srcfile); strcpy(srcfile, destfile); thisfilp = srcfile; } } if (o2flg == 0) { frkprmp = parmbuf; splcat(srcfile); if ((filcnt == 1) && (rflag == 0)) { strcpy(destfile, tmpname); chgsuff(destfile, 'r'); } else { if (fflag && rflag) { strcpy(destfile, rlib); strcat(destfile, objname); } else { chgsuff(namarray[j], 'r'); strcpy(destfile, rlib); strcat(destfile, namarray[j]); } } strcpy(ofn, "-o="); strcat(ofn, destfile); splcat(ofn); trmcat(); lasfilp = destfile; runit(ASSEMBLER, 0); if (deltmpflg) unlink(srcfile); } } } /* end of for each file */ if (nullflag || aflag || rflag || o2flg) exit (0); /*page*/ /* now link all together */ frkprmp = parmbuf; if ((p = chkccdev()) == 0) error("Cannot find default system drive"); if (bflag) strcpy(ofn, mainline); /* use cstart.r or whatever */ else strcat(strcat(strcpy(ofn, p), "/lib/"), mainline); /* global */ splcat(ofn); if ((filcnt == 1) && (suffarray[0] != 'r')) splcat(thisfilp = destfile); else for (thisfilp = 0, j = 0; j < filcnt; ++j) splcat(namarray[j]); strcpy(ofn, "-o="); if (fflag == 0) chgsuff(objname, 0); strcat(ofn, objname); splcat(ofn); for (j = 0; j < libcnt; j++) splcat(libarray[j]); if (llflg) { strcat(strcat(strcpy(ofn, "-l="), p), "/lib/lexlib.l"); splcat(ofn); } if (p2flg) { strcat(strcat(strcpy(ofn, "-l="), p), "/lib/dbg.l"); splcat(ofn); } strcpy(ofn, "-l="); if (xflag == 0) strcat(strcat(ofn, p), "/lib/"); strcat(ofn, (tflag) ? "clibt.l" : "clib.l"); splcat(ofn); if (modname) splcat(modname); if (xtramem) splcat(xtramem); if (edition) splcat(edition); if (mflag) splcat("-m"); if (s2flg) splcat("-s"); trmcat(); lasfilp = 0; runit(LINKER, 0); cleanup(); } /*page*/ runit(cmd, code) char *cmd; int code; { /* fprintf(stderr, " %-6s:\n", cmd); */ fprintf(stderr, " %-6s: %s", cmd, parmbuf); if (zflag) return; if ((childid = os9fork(cmd, frkprmsiz, parmbuf, 1, 1, 0)) < 0) error("cannot execute %s", cmd); wait(&childstat); childid = 0; if (childstat > code) trap(childstat); } chkccdev() { char *s, c; register char *p; struct mod_exec *q; struct mod_config *r; if ((q = modlink("ccdevice", 4, 0)) != -1) { strcpy(devnam1, (char *)q + q->m_data); munlink(q); return (devnam1); } else { if ((r = modlink("Init", 0x0c, 0)) != -1) { s = (char *)r + r->m_sysdrive; p = devnam1; while ((c = *s++) > 0) *p++ = c; *p++ = (c & 0x7f); *p = 0; munlink(r); return (devnam1); } } return (0); } error(format, arg) char *format, *arg; { logo(); /* print logo if not done yet */ fprintf(stderr, format, arg); putc('\n', stderr); trap(0); } chgsuff(s, c) char *s, c; { register char *p = s; while(*p++) ; if (*(p - 3) != '.') return; if (c == '\0') *(p - 3) = 0; else *(p - 2) = c; } findsuff(p) register char *p; { int j; char c; j = 0; while (c = *p++) if (c == '/') j = 0; else j++; if (j <= 29 && j > 2 && *(p - 3) == '.') return (*(p - 2) | 0x40); else return (0); } splcat(s) char *s; { register char *p = s; *frkprmp++ = 0x20; while (*frkprmp++ = *p++) ; --frkprmp; } trmcat() { *frkprmp++ = '\n'; *frkprmp = '\0'; frkprmsiz = frkprmp - parmbuf; } dummy() { } logo() { if (hello == 0) fprintf(stderr, "\n cc version %d.%d.%d\n", VERSION, MAJREV, MINREV); } SHAR_EOF fi # end of overwriting check if test -f 'cc.h' then echo shar: will not over-write existing file "'cc.h'" else cat << \SHAR_EOF > 'cc.h' #include <stdio.h> #define VERSION 2 #define MAJREV 2 #define MINREV 1 #define TWOPASS TRUE /* change to FALSE for one pass compiler */ #define ASSEMBLER "rma" /* change to "c.asm" if not dev pak */ #define LINKER "rlink" /* change to "c.link" if not dev pak */ direct int aflag = FALSE, bflag = FALSE, cflag = FALSE, fflag = FALSE, llflg = FALSE, mflag = FALSE, oflag = TRUE, o2flg = FALSE, pflag = FALSE, p2flg = FALSE, qflag = FALSE, rflag = FALSE, sflag = FALSE, s2flg = FALSE, tflag = FALSE, xflag = FALSE, zflag = FALSE, tmpdir = TRUE, childid = 0, childstat = 0, filcnt = 0, hello = FALSE, libcnt = 0, maccnt = 0, newopath = 0, nullflag = FALSE, rsufflg = FALSE, loopcnt; direct char *thisfilp = 0, *lasfilp = 0; direct int frkprmsiz = 0; direct char *frkprmp = 0; char *tmproot[] = { "/R", "/R0", "/DD/TMP"} ; char tmptail[] = "ctmp.XXXXXX"; char tmpname[64] = ""; char rlib[60] = ""; char mainline[20] = "cstart.r"; char *libarray[4], *namarray[100], suffarray[100], *macarray[100], ofn[60], *xtramem, *modname, *edition, destfile[60], srcfile[60], objname[60], parmbuf[256], devnam1[20]; SHAR_EOF fi # end of overwriting check if test -f 'cc.uue' then echo shar: will not over-write existing file "'cc.uue'" else cat << \SHAR_EOF > 'cc.uue' begin 764 cc MA\T@4@ -$8%: !D+IV/C J:@I\ P'R;X.30@-$!/7Z? 6B;[KN0SA#")!J<T M$#&-'="NH2<$C=CN8C/) $&NH2<"C<Q/$:/D)P2GP"#W[F+LH2<',(W_J!<! M"^RA)P4PQ!<! C)D-1"OR0)^$*_) C[, 'MR0)Z,<D"0##DIH#FR0)[P1TG M5($-)U"!("<$@2PF!*: (/"!(B<$@2<F'J^A;,D">S0"IH"!#2<$H>0F]C4$ M;Q^!#2<BIH @PC ?KZ$P 6S) GN!#2<,@2 G"($L)P2F@"#P;Q\@I##) CXT M$.S) GHT!C'$C0H7 /)OXF_B%QT ,*D&IZ^I H@0[ZD"?!#OJ0**S/^"'T$T M$##KK.$B*JRI HHD"JRI H@E'J^I HHY*BHJ*B!35$%#2R!/5D521DQ/5R J M*BHJ#3",Y,;/- 2& A". &00/XQOXA<<J.RI GRCJ0**.>RI HJCJ0*(.300 M,*LPBS00[*$PR^R$XV+MA!"LY";Q,F0Y-$#,_[@7_X/<)2<.S "- ;<)30& M%QN,,F3<,2<3S !- 87&@\R8MPQ- 87&8DR8MPW)PG<-S0&%QER,F+<.2<= MW#DT!A<992 2-$#,_[H7_S@7_ZKL9#0&%QP9,F(UP#1 S/^J%_\B,G9/7^UD M%@-7KN@0, *OZ!#NA.;$P2T0)@+@%@+-YL0='P$6 B', '= 18"O<P =T# MYD'!/1 F K T0,P N/A- 8PJ0#/-! 7%R@6 <7, '=!18"D^9!$"<!N<P M+>?"S !$YT'<+\, =TO@P !6$DPJ0/"%@"E,*D$RJ]H,&H6 + S0>;$P3T0 M)@&'-$#, 'CX30&,*D%1#00%Q;3,F3FJ05$$"<!:]P'PP !W0<PJ05$-! 7 M#/XR8NUF$(, 8R<*[&80@P!R$"8!1^QF- 8PC0W -! 7#'X6 37F0<%L)@K< M"<, =T)%@$GYD'!/1 F 1_<+1"# 0F"S"-#;@T$!<,4C)BS MY\+<+<, M =TM@P !6$DPJ0*.,(OOA!8 \#"I!,:O:.;$3\1?Y\0@ C(6YD$0)P#9S M MY\+O^ @6 ,[, '="Q8!FLP +>?"[ZD$R!8 ND]?W0T6 8?, '=#Q8!?\P M =T3S !W1$6 7+, '=%3"I 0@T$#"-#5 T$#"-#4$T$!<08S)F%@%3S ! MW1<S0>;$P3T0)@!P-$#, 'CX30&,*D DS00%Q6\,F3FJ0"3)U8PC0T5-! P MJ0"3($/, '=&18!%LP =T;%@$.S !W1T6 0;F0<$])P=/7]TC%@#Y-$#, M +CX30&,*D 4S00%Q5Q,F0PC0S2-! PJ0!3-! 7%50R9#!J%@#:S !W3,6 M ,?, '='Q8 O\P =TA%@"WYL0=- 8PC0RA-! 7"QDR9!8 I(P 81 G_=B, M &(0)_W9C !C$"?]](P 9! G_?6, &40)_X1C !F$"?^%8P ;! G_FB, &T0 M)_ZHC !-$"?^PXP ;A G_L2, &\0)_[)C !/$"?^R8P 4! G_LJ, ' 0)_[( MC !Q$"?^R8P <A G_N&, ',0)_\/C !3$"?_$(P =! G_Q&, %00)_\2C !W M$"?_0HP >! G_T., 'H0)_]$%O]),T'FQ! F_2L6 &HR%A8 9>SX$#0&%PJW M,F+M9A\!(#O, '=-=PI,*D#7C"+[&;GA-PI6$DPJ0*6,(OL^!#MA-PIPP ! MW2D@+.SX$#0&,(T+M300%PH9,F0@&HP <B? C !A)\", &,0)_^YC !O$"?_ MLB#4[&[#___M;B\/[&3# 'M9!"# &00+?R1%PK@W"DF&C"-"XDT$#"I 0@T M$!<.SS)D3U\T!A<8=C)BW '3%Q"# $O"S"-"W T$!<)KS)BW <G(=PI$(, M 2\9W $F!-P7)Q$PJ05$-! PC0M>-! 7"8HR9-P')B'<*1"# $F!NRI I8@ M!C"-"V$?$#0&,*D%1#00%Q-_,F3<(Q G &/FJ0!3$"8 6T]?($W, (,T!MP_ M6$DPJ0!!,(OLA#0&%Q4(,F3M?B8LW#]823"I $$PB^R$- 8PJ0!3-! 7$S@R M9#"-"PXT$#"I %,T$!<3&S)D( _</\, =T_W#\0@P #+:DPJ0!'-! PJ0!3 M-! 7$ODR9#"I %,T$!<-KC)B,(T*TC00,*D 4S00%Q+=,F0PC?M0-! 7%T8R M8A<)M4]?[606!47L9%A),*D"EC"+[(0T!C"-"J$T$#"I 0@T$!<-G3)F[&0P MJ0->,(OFA,%C$"8"T<P >WD,*D 4S00,*D$S#00%Q*/,F3, &TT!C"I!,PT M$!<(GC)D,*D%@)\]W 4G"S"-"E8T$!<(]3)B[*D$RB<+[*D$RC0&%PCD,F)/ M7^UB(!OL8L, >UB@P !6$DPJ0/",(OLA#0&%PC#,F+L8A"3+RW>[&1823"I M I8PB^R$- 87"*DR8LP 30&%Q/N,F+=,<P 30&%Q1?,F+, ,T!C"I!,PT M$!<3WS)D$(, 2<9[&1823"I I8PB^R$- 8PC0G(-! 7![\R9!<(B4]?W3<P MJ03,GSG, $T!C"-"= T$!<&CC)DS !- 87% DR8MPQ- 87$X,R8MPQ- 87 M$_<R8D]?W3$PJ03,-! PJ04(-! 7$8LR9#"I!8"?/3"I!0B?-S"I!0@T$!<' M_S)BW!DG"S"-"8 T$!<'\#)B,*D 4S00,*D$S#00%Q%4,F3, &$T!C"I!,PT M$!<'8S)D,(T)5S00,*D$BC00%Q$S,F0PJ03,-! PJ02*-! 7$18R9#"I!(HT M$!<'HC)BW!$G"S"-"2HT$!<'DS)B%P>X,*D$S)\Y3U\T!C"-"14T$!<%PC)D M,*D%"#00%Q*U,F(PJ03,-! PJ04(-! 7$-0R9#"I!8"?/3"I!0B?-S"I!0@T M$!<'2#)BW!DG"S"-"-LT$!<'.3)BW#,G)" +,(T(S300%P<H,F(PC0C%-! P MJ03,-! 7$(PR9$]?[>0@1]P!)S/<!R<1,*D%1#00,*D$S#00%Q!M("SL9%A) M,*D"EC"+[(0T!C"I!,PT$!<05#)DS !A( /, &DT!C"I!,PT$!<&7C)D,(T( M;#00,*D$BC00%Q N,F0PJ03,-! PJ02*-! 7$!$R9#"I!(HT$!<&G3)BW!$G M"S"-"#\T$!<&CC)B%P:S,*D$S)\Y3U\T!C"-""H@"$]?- 8PC0@H-! 7!+,R M9#"I!0@T$!<1IC)B( 1/7^WDW $F$MPS)@[L9#"I UXPB^:$P7(F!T]?W3D6 M AWL9#"I UXPB^:$P6$G#NQD,*D#7C"+YH3!;R8@[&1823"I I8PB^R$- 8P MJ04(-! 7#WXR9$]?W3<6 .4PJ03,-! PJ04(-! 7#V8R9#"I!0B?-]P-$"< MR#"I!8"?/3"I!0@T$!<%U#)BW"D0@P !)B7<#R8A,*D 4S00,*D$S#00%P\L M,F3, &TT!C"I!,PT$!<%.R _W <G#-P/)P@PJ05$-! @)LP ;S0&[&9823"I M I8PB^R$- 87!1,R9.QD6$DPJ0*6,(OLA#0&,*D$S#00%P[;,F0PJ03,-! 7 M!5LR8A<%@#"I!,R?.4]?- 8PC0<&-! 7 XHR9.SD)PLPJ04(-! 7$'DR8C"I M!,PT$#"I!0@T$!<.F#)D,*D%")\WW \0)@#V,*D%@)\],*D%"#00%P4&,F+< M*1"# $F)MP7)B(PJ0!3-! PJ03,-! 7#EXR9,P <C0&,*D$S#00%P1M%@!A MW <G'=P7)QDPJ0"3-! PJ03,-! 7#C0R9#"I!40T$" WS !R- ;L9EA),*D" MEC"+[(0T!A<$,S)D,*D DS00,*D$S#00%PX#,F3L9%A),*D"EC"+[(0T!C"I M!,PT$!<-WC)D,(T&,S00,*D$BC00%PW9,F0PJ03,-! PJ02*-! 7#;PR9#"I M!(HT$!<$2#)B%P1M,*D$S)\Y3U\T!C"-!?TT$!<"=S)D[.0G"S"I!0@T$!</ M9C)B[&3# 'M9.QD$),I$"WZLMPS)@S< 28(W!<F!-P/)PE/7S0&%Q(%,F(P MJ06 GST7 JX? ^]^)@LPC06O-! 7 SDR8MP#)Q$PJ0#/-! PJ02*-! 7#3X@ M)3"I ,\T$#"-!:HT$#1 ,*D$BC00%PTE,F0T!A<-$C)D- 87#0LR9#"I!(HT M$!<#ES)BW"D0@P !)A?FJ0->P7(G#S"I!,R?-S00%P-Z,F(@*4]?W3=/7R 8 M[&1823"I I8PB^R$- 87 UTR8NQDPP ![63L9!"3*2W?,(T%/#00,*D$BC00 M%PRS,F3<!R8/3U\T!C"I!40T$!<"OS)D,*D%1#00,*D$BC00%PR#,F0PJ02* M-! 7 P\R8D]?(!CL9%A),*D"CC"+[(0T!A<"^#)B[&3# 'M9.QD$),M+=_< M"2<R,(T$VS00-$ PC03/-! PJ02*-! 7#$(R9#0&%PPO,F0T!A<,*#)D,*D$ MBC00%P*T,F+<$R<R,(T$MS00-$ PC02K-! PJ02*-! 7# PR9#0&%POY,F0T M!A<+\C)D,*D$BC00%P)^,F(PC020-! PJ02*-! 7"^(R9-P?)AHPC01_-! T M0#"I!(HT$!<+OS)D- 87"[@R9-P=)P8PC01G( 0PC01I'Q T!C"I!(HT$!<+ MFS)D,*D$BC00%P(G,F+LJ03()POLJ03(- 87 A8R8NRI!,8G"^RI!,8T!A<" M!3)B[*D$RB<+[*D$RC0&%P'T,F+<"R<+,(T$&S00%P'E,F+<&R<+,(T$#S00 M%P'6,F(7 ?M/7]TY3U\T!C"- _PT$(T(,F07\U,6 CXT0,S_L!?RTS"I!8 T M$.QF- 8PC0/@-! PJ0$(-! 7!?4R:-PA)P(UP$]?- ;, $T!LP 30&,*D% M@#00W#LT!NQN- 87#O(R;-TE+ _L9#0&,(T#K300%P"Y,F0PJ0 G-! 7#I@R M8D]?W27<)Q"C9A O -;<)Q8 RC1 S/^O%_)9,GE/7S0&S $- 8PC0.$-! 7 M#8<R9NUB$(/__R<7[&*N8N,)- 8PJ0: -! 7"GTR9.QB($A/7S0&S ,- 8P MC0-:-! 7#50R9NWD$(/__R<[[.2NY..($.UE,ZD&@" $YF3GP*YE, &O9>8? MYV0N\.9D3\1_Y\!/7^?$[.0T!A<-0C)B,*D&@!\0( )/7S)G-< T0,S_MA?Q MOQ< ]>QF- ;L9C0&,*D!"#00%P3F,F8PJ0$(-!#, TT!A<'+3)D3U\T!A?R M4C)B-< T0,S_P!?QANYDYL F_.9=P2XG C7 YF<F!D]?YUT@!.9GYUXUP#1 MS/^]%_%@[F0R?4]?( OFY,$O)_;L8<, >UAYL#GY";M[&$0@P =+A7L81"# M (O#>9=P2XF!^9>'<I ( )/7S)C-< T0,S_P!?Q&NYDS @GCTP 9\]YQ_F MP)X], &?/><?)O3</</__]T]-< T0,S_OA?P\,P #9X], &?/><?3U_GN0 ] M,*D%@#00W#VCX=T[-< T0,S_P!?PR37 -$#,_[(7\+_<*R8@S !- ;, (T M!LP C0&,(T!\#00,*D!"#00%P/8,FHUP"]2 "]2, O1$0O5$U0 %-U9F9I M>" G+B5C)R!N;W0@86QL;W=E9"!F;W(@;W5T<'5T %1O;R!M86YY(&QI8G)A M<FEE<P!C+F5R<F]R<P!W "\ +P!U;FMN;W=N(&9L86<@.B M)6,- "5S(#H@ M;F\@<F5C;V=N:7-E9"!S=69F:7@ ;F\@9FEL97,A#0!I;F-O;7!A=&EB;&4@ M9FQA9W, )7,@.B!O=71P=70@;F%M92!N;W0@87!P;&EC86)L90!O=71P=70 M+P N;0 G)7,G#0 M; !C86XG="!C<F5A=&4@=&5M<&]R87)Y(&9I;&4@9F]R M("<E<R< 8RYP<F5P "US "UO/0 M< !C+G!A<W,Q "US "UN "]N:6P +6\] M "UP &,N<&%S<S( 8RYC;VUP &,N;W!T "UO/0!R;6$ 0V%N;F]T(&9I;F0@ M9&5F875L="!S>7-T96T@9')I=F4 +VQI8B\ +6\] "UL/0 O;&EB+VQE>&QI M8BYL "UL/0 O;&EB+V1B9RYL "UL/0 O;&EB+P!C;&EB="YL &-L:6(N; M M;0 M<P!R;&EN:P @(" E+39S.B @)7, 8V%N;F]T(&5X96-U=&4@)7, 8V-D M979I8V4 26YI= -(&-C('9E<G-I;VX@)60N)60N)60- #1 ,ZD [NQ&3\0# M$"< :#---$ PJ0&^K.$BZ\P R.VI HP6 %8UP#1 [F@F!(W1'P/O?B=&[&3M M2*YFY@'!*R<(KF;F L$K)@;L1LH#(![L1C0&YO@(P7(G!^;X",%D)@7, $@ M \P JK@ZN#M1NQ"XTOM1.W$'S UP$]?-< T0.YD,GQ/7^WDKFKF 1T? 2 > MKFKF L$K)@7, <@",P !" #S #[>0@%3!D%@!HKWXG#(P >"?9C K)^8@ MZ^;X"AT? 18 7.SDR@$@/.SDR@(T!C1 %PAB,F3M8A"#__\G%LP C0&3U\T M!C0&[&@T!A<(AC)H($7LY,H"- 8T0!<'UB +[.3*@30&-$ 7""HR9.UB("<R M',P R^VI HQ/7R <C !R$"?_G8P 81 G_YR, '<GPHP 9"?*(-OL8C)D-< T M0$]?- ;L:#0&[&@T!A8 2S1 [&8T!NQF- 87_QPR9!\#$8/__R8$3U\@-4]? M("0T0.QH- 87 V R8NQF- ;L9C0&%_[T,F0? ^]^+ 1/7R /[&@T!NQH- 8T M0!?^@S)F-< T0.YDYL G',%8)O@S7S1 S %I\!:)OLU0!<)6#1&%P2W,F3L M9#7 -$ S9C"I /OL9" (-$ S:*YD[&:OJ0:4,(T"+B 0-$#L9.VI!I0S:.QF M,(T"*#1&-!"-!S)F-< R:#GN9#)X( FN;NR!KVZM^ KFP"?JP24F]5^&?>WD MYV?G8N; P2TF!.=GYL#!,"<"QB#G9N9?%P&M[6/FP,$N)@OG8N; %P&>[>3F MP,%C)[@T0,%F)S;!92<RP6<G+L%%)RK!1R<FP6PG0\%S)V'!9"=YP6\0)P$9 MP7@0)P#+P5@0)P#%P74G=C5 ((+L930&,.@2[&1M9B8#S &-!;,?0#M:.9? M3S0&%P.](!LT0*[H$NP"- ;LA#0&, 2OZ!;FP.]F- 87 X,R:!\#%@"LC6\? M S1 %P0N,F)M9"<'$*-B(@+M8A< R!8 DHU/-'9-*A! 4(( [>3&+>? ( 2- M/#1VS %[6*G9#"I .,U!B =;.2CA"3ZXX$T!.9A;6,F!5TG!FQCRS#GP&]A M-01J82;ARS#GP&_$,F0@/3.I!I:NZ!+L@:_H$CG$(.=GC>TT1L0/- 2&,,$) M+P2&-ZMLJ^"GP.SD1%9$5D161%;MY";@;\2N8HT3,F(U0(TL-4 6_H_FA*;" MIX#GQ#1 K.$E\CF-J31&Q ?+,.? [.1$5D161%;MY";N(,@T0!<#6#)B0%"" M .-G[6=M:R8+C1X@!^; )PRM^ [L9(, >UD*O!M:R<"C08YYFRM^!#L:8, M >UI*O(Y;^)OXC-?,*D!OB 7[.182>WD6$E82>/DZ\") (, ,.WDYL2FA80( M)N,UAJZI!I0T%A< $#)D.:ZI!I3G@*^I!I1OA#DT0.YF[$:$@,0BP0(F.(& M)P<T0!<!G#)B[$;$!"<LS !- 8P9^Q(-!;F1\1 )P47!08@ Q<$Z#)F$(/_ M_R8YYD?*(.='S/__-<"$ 28)-$ 7 *GMX2;NKL3F9>> K\2L1"0,YD?$0"</ MYF7!#28)-$ 7 (CMX2;-[&0UP#1 [F;F9#1&%_]XYFGG81?_<3)D-< T0#"I M .[&$#0$-!"-"C40, UJY";T-<0T0.YD$"?_D^Q&$"?_C<0")P@T0(T7,F(@ M D]?- ;L2#0&%P1(,F)/7^U&-<8T0.YD$"?_9NQ&Q"+! A F_UR$@"8'-$ 7 M , R8C1 C00R8C7 -$#N9#)\ID:$ 28C[,00HT0G'$]?- 8T0!< CS)B[ (T M!NR$- ;L2#0&%P0?,FCLQ*-"[6(0)P!>[$:$ 1 G %;$0"<M[$(@(30&[,0T M!NQ(- 87 ^8R9NWD$(/__R<H[&*CY.UB[,3CY.W$[&(FV2 E[&(T!NQ"- ;L M2#0&%P.B,F80HV(G#^9'RB#G1^Q$[<3,__\@$*9&B@&G1NQ"[<3C2^U$3U\R M9#7 ,*D"@$]?[83M CDT0.YDYD?%P"8?,NC@,.3L2#063U\T!A<!^<9 IF8G M L: ,N@FZD?G1Z9&BH"G1L0,)CGL2R8%S $ [4OL0B81[$LT!A<$0S)B[4(0 M@___)P3&"" +,$JO0LP >U+Q@3J1^='[$+C2^U$[<0UP.9C,*D [<%D)Q#! M;R<,P7@G",%8)P0P'N<!'Q Y,(T Q\0.0!/7S1&[F@@$$]?-$;N:&UF*@9L MY*-F[6;L9C0&S *%P"$RS#GP.QF- ;, H7 +[M9B[D;>0G!,8MY\!OQ.QH M- 87 0R9#7 -$#N9#1 -$ 7 $(R8N/A'P$@".;$IH*GP.>$-! 1H^$E\>QD M-< T0.YFKF2-%A\!( 8T0.YFKF3FP.> )OKL9#7 KF+F@";\,!\?$#DT0.YD MYL F_#-?'S"C9#7 ;ZD&H#"- $"OJ0:A(!0PC0!/KZD&H6^I!J!M8BH$;*D& MH(, "8&-1#LX6Z$KF(T$*VY!J'LY.UB'Q!MJ0:@)P1 4(( [>$Y@P )PHT M!C)^;^1O82 N-0;MY,P +18 :H, "?Q- 8R?F_D;V%-*@A 4(( 8V'M8NQF M*@A 4(( 8V'M9H8!3&AC:6(J^:?D[&9O9F]GHV(D!N-B'/X@ AH!:6=I9F1B M9F-JY";H[6)M82<([&9 4(( [6:N9.QF[62O9JYB[&0R9CGMJ0*,-"00/PPU M)! _"#DT8*9IYF<G-,$!)S+! B<4P04G$,$&)R;!#B<@P0\G&<;0( 40/XTD M!35@%@-7K_@*KFKO D]?-> 0KFRN:A _C35@%@-(-&"F:>9G)TC! B="P0,G M0,$$)S?!"B=(P0LG-,$,)T#!#2<PP0\G*,$0)R3!$2<>P10G%\$5)Q/!&2</ MP1HG$,$;)QS&T#5@%@+T$*YN[FRN:B ,'XFF:ZYL$*YN[N@0$#^.-6 6 N"N M8J9E$#^$)0,0/X\6 M&N8N9E$#^%%@+'IF4@ H8"KF(0/Y 6 KFF8Q _@A E M J<?B4\YKF*F91^)Q"3*"Q _@R1.P=HF)J9EA8 F((0'KF(0/X0E%S1"C@ M,X3& A _CC5")"LT!! _CS4$%@)GKF*F9>9G$#^#)?(@%,':)NP0/X<EYZYB MIF7F9Q _@R7L'XE/.:YBIF40/X00)0(W'XE/.:9C$#^/%@(T-" 0KF@G#J9E MKF80/XHD!34@%@(6'R UH#0@$*YH)_6F9:YF$#^,(.4T0.QJ)@C. ". @ M-!"# $G)1"# (G%,;W3^VI HS,__\PJ0* [83M C7 IF7& A _C27E( FF M9<8%$#^-)=H?,.-H[:D"@A\#'Q#I9ZEF*\@? >VI H"F91 _B"6[,*D"@#7 M-&"N9J9I2$A(2*IK$#\ 'S U8! E 80Y-&"N9J9I2$A(2*IK$#\!(.8T0.YD M$#\"-4 6 6_LJ0)^- ;L9!"CJ0:C)28T($]?$#\'XV80/P<?(#4@) ;,__\R M8CGMJ0)^XZD&HZ/D[:D&HS)B[*D&HS0&HV3MJ0:C[*D"?J/A- 9/KN2G@*RI M GXE^#6&[&+CJ0*()2$0HZD"BB0:- :NJ0*(3ZSD) 2G@"#X[*D"B#40KZD" MB#G,__\Y[&(T(! _!R0%S/__-: ?(#4@[:D"?D]?[:D&HSFF8^9E$#\(%@## M3U\0/P00)0"QKF(G!.<!;X0?B4\YIF/F91 _#18 I#/D,JD _ZY"$*Y$IDE( M2$A(JDOF3>Y&$#\%$#\&-&"N9A"N:.YJIFVJ;^;H$1 _ S5@$"4 91^)3SDT M(! _##4@'XE/.30@$#\,'R UH#0@( \T((WO[7XG!\;6-2 6 #H0KF00/QPD M#,'0)N\?(!"^ $OM*4]?-: T0!\CKF2OJ0:E,(T "! _"35 %@ 5'S)/- :M MN0:E,F([3^VI HS,__\Y)?5/7SD7 @7^33L8A _!CD /P M 0 $ M ']$'(0=1!Y8W1M<"Y86%A86%@ M M M &-S=&%R="YR )Q #Z !D IL M> 0 ( 0 !& ( M M M M 0$! 0$! 0$!$1$1$1$! M 0$! 0$! 0$! 0$! 0$! 0$P(" @(" @(" @(" @(" @2$A(2$A(2$A(2" @ M(" @("!"0D)"0D(" @(" @(" @(" @(" @(" @(" B @(" @($1$1$1$1 0$ G! 0$! 0$! 0$! 0$! 0$! 0$(" @( $ P!% $, 00 8V, WFPX end SHAR_EOF fi # end of overwriting check if test -f 'ccdevice.a' then echo shar: will not over-write existing file "'ccdevice.a'" else cat << \SHAR_EOF > 'ccdevice.a' * * cc1, cc2 and c.prep call defdrive() to determine the "system" device * for pathlists to the DEFS and LIB directories. The technique used is * to link to the "Init" module and determine the name of the booted device. * Unfortunately, this is not always the correct device. Systems that have * a hard disk usually boot from the floppy drive (/D0) and change execution * and data directories to the hard disk (/H0). This leaves defdrive() * referring to /D0 instead of /H0 unless the "Init" module has been changed. * * Edition 3 and later of cc1, cc2 and c.prep will attempt to link to * a data module called "ccdevice" and extract the default system drive * string from there. If no "ccdevice" module is in memory, they will * use defdrive() as before to obtain the string. The following assembly * code, when assembled and linked, can be loaded into memory (Level II * systems) or merged to the end of cc1, cc2 and c.prep each (Level I * systems) to override the call to defdrive(). * * To assemble and link: * * c.asm ccdevice.a -o=ccdevice.r * c.link ccdevice.r -f=ccdevice * * To merge with cc1 (others similar): * * merge /h0/cmds/cc1 ccdevice >xxx * attr xxx pe e * del -x cc1 * copy xxx /h0/cmds/cc1 * del xxx * psect ccdevice_a,$40,$81,1,0,ccdev ccdev fcc "/D0" Device name here fcb 0 Must have this zero byte endsect SHAR_EOF fi # end of overwriting check if test -f 'readme' then echo shar: will not over-write existing file "'readme'" else cat << \SHAR_EOF > 'readme' CC replaces the standard CC1 compiler driver program. CC was originally written by Carl Kreider with additions by Pete Lyall. I have added the ability to use the two pass CoCo version of the C compiler. I've also added support of the -r=pathname option generated by the MAKE utility from the CoCo OS9 LII Developers Pak. This version of CC uses a ramdisk, if it is installed, for all the temporary files, making it much faster. It also supports additional compiler options like auto-inclusion of the CLIBT.L library, stop after optimization (before assembly) and many others. Also included is a data module, "ccdevice", that causes the compiler to use the device name in the module (default is D0) as the default location of compiler files (LIB and DEFS directories). Included in this archive are the following files: cc.h Header file for cc.c, three defines in this file may need to be changed before compilation, see notes below. cc.c C source code for cc. cc Compiled, executable version, set up for the two pass compiler, the rma assembler, and rlink linker. ccdevice.a Source code for the ccdevice data module. Directions for assembly are included in the source code. This module must be loaded or merged with another module (I merged it with cc). readme This file. The following defines can be changed in cc.h: #define TWOPASS TRUE /* change to FALSE for one pass compiler */ #define ASSEMBLER "rma" /* change to c.asm if you don't have the dev pak */ #define LINKER "rlink" /* change to c.link if you don't have the dev pak */ WARNING! The programs c.pass2, c.opt and rma do not return any kind of error condition after disk errors. This can cause some rather strange results if you don't make your ram disk big enough to hold each temporary file. The compile may seem to be continuing normally, but almost always fails in the link step. Make sure you have plenty of free space for the temporary files on you ram disk. Bill Dickhaus [70325,523] SHAR_EOF fi # end of overwriting check # End of shell archive exit 0 -- Pete Lyall (OS9 Users Group VP)| DELPHI: OS9UGVP | Eaton Corp.(818)-706-5693 Compuserve: 76703,4230 (OS9 Sysop) OS9 (home): (805)-985-0632 (24hr./1200 baud) Internet: pete@wlbr.eaton.com UUCP: {scgvax,jplgodo,voder}!wlbr!pete