home *** CD-ROM | disk | FTP | other *** search
- #
- # include "../mcons.h"
- # include "../ccmn.h"
- /*int mbuf[1024]; /*INSTR*/
- /*int tbuf[36]; /*INSTR*/
-
- int (*acts[])() {0,
- &coll,
- &save,
- &out,
- &asym,
- &asw,
- &csym,
- &csw,
- &incl,
- &decl,
- &sk2,
- &sk,
- &tabs,
- &semi
- };
-
- char *tmp[5] {"/tmp/crt0a",
- "/tmp/crt1a",
- "/tmp/crt2a",
- "/tmp/crt3a",
- "/tmp/crt4a"
- };
-
- char *ignonl "/usr/lib/aign";
- char *gtab "/usr/lib/atab";
-
- main(argc,argv)
- char *argv[];
- {
- auto i,j,tm1,tm2,tm3;
- char *fn,*av[8];
- /* extern etext; /*INSTR*/
-
- /* monitor(&main,&etext,&mbuf,1024); /*INSTR*/
- if(argc < 2) {
- printf("Usage: cref [-aceilosux] file1 ...\n");
- exit();
- }
-
- lbuf[4] = '\t';
- if(*argv[1] == '-') {
- j = flags(argv);
- argv =+ j;
- argc =- j;
- }
-
- init();
-
- i = 0;
- while(++i < argc) {
- curs[0] = '_';
- curs[1] = '\t';
- curs[4] = '\t';
- cursl = 2;
-
- if(fopen(argv[i],ibuf1) < 0) {
- printf("Can't open %s\n",argv[i]);
- dexit();
- }
- ibuf = ibuf1;
-
- curf[0] = '\t';
- curfl = 1;
- while((curf[curfl] = *argv[i]++) != 0 && curfl <= 8)
- if(curf[curfl++] == '/') curfl = 1;
-
- curf[curfl++] = '\t';
- if(curfl == 10) curf[9] = -1;
- /* printf("%s %d\n",curf,curfl);/*DEBUG*/
-
- lno = 1;
-
- driver();
-
- close(file);
- }
- for(j = 0; j < 4;) {
- flsh(j,0);
- close(tp[j++]);
- }
-
- /* monitor(0); /*INSTR*/
- /* dexit(); /*INSTR*/
-
- /* times(tbuf); /*INSTR*/
- /* tm1 = tbuf[15]/6; /*INSTR*/
- /* tm2 = tbuf[19]/6; /*INSTR*/
- /* tm3 = tbuf[23]/6; /*INSTR*/
- /* printf("Prep: %d %d %d\n",tm1,tm2,tm3); /*INSTR*/
-
- if(utmp) exit();
- fn = "/bin/sort";
- av[0] = "sort";
- av[1] = "-a";
- av[3] = "-o";
- av[5] = 0;
- for(i = 0; i < 4; i++) {
- av[4] = av[2] = tmp[i];
- callsys(fn,av);
- if(utmp) break;
- }
-
- /* times(tbuf); /*INSTR*/
- /* tm1 = tbuf[27]/6; /*INSTR*/
- /* tm2 = tbuf[31]/6; /*INSTR*/
- /* tm3 = tbuf[35]/6; /*INSTR*/
- /* printf("Sort: %d %d %d\n",tm1,tm2,tm3); /*INSTR*/
-
- if(usw) {
- fn = "/usr/bin/upost";
- av[0] = "upost";
- i = 0;
- } else {
- fn = "/usr/bin/crpost";
- av[0] = "crpost";
- av[1] = cross? "-4x": "-3";
- i = 1;
- }
- j = -1;
- while(++j < 4) {
- av[++i] = tmp[j];
- if(utmp) break;
- }
- av[++i] = 0;
-
- callsys(fn,av);
-
- /* times(tbuf); /*INSTR*/
- /* tm1 = tbuf[27]/6 - tm1; /*INSTR*/
- /* tm2 = tbuf[31]/6 - tm2; /*INSTR*/
- /* tm3 = tbuf[35]/6 - tm3; /*INSTR*/
- /* printf("Post: %d %d %d\n",tm1,tm2,tm3); /*INSTR*/
-
- dexit();
- }
-
- driver()
- {
- auto p;
-
- top:
- l = -1;
- while((c = line[++l] = getc(ibuf)) != -1) {
- if(l >= 131) {
- printf("Line too long: %d %s\n",lno,curf);
- dexit();
- }
-
- if(c & 0200) {
- printf("Illegal character: %o line %d\n",c,lno);
- dexit();
- }
-
- if(fl) {
- if((*flag[fl])())
- continue;
- }
-
- /*printf("cs = %d cc = %c ca = %d\n",cs,c,tab[cs].cl[c]); /*DEBUG*/
-
- if(p = tab[cs].cl[c])
- (*acts[p])();
- continue;
- }
- if(ibuf == ibuf1) return;
- ibuf = ibuf1;
- goto top;
-
- }
-
- init()
- {
- int b[3];
- auto fi,i;
- extern coll(),save(),out(),asym(),asw(),csym(),csw();
- extern incl(),decl(),sk(),sk2();
- extern dexit();
-
- ibuf1 = &ib1;
- ibuf2 = &ib2;
-
- xtab.hptr = &xpsp;
- xtab.symt = &xssp;
- xtab.hsiz = PTRX;
- xtab.ssiz = CHARX;
- xtab.nsym = 0;
- xtab.curb = 1;
-
- itab.hptr = &ipsp;
- itab.symt = &issp;
- itab.hsiz = PTRI;
- itab.ssiz = CHARI;
- itab.nsym = 0;
- itab.curb = 1;
-
- if((fi = open(gtab,0)) < 0) {
- printf("Cannot open grammar table; see lem\n");
- dexit();
- }
-
- i = -1;
- while(++i < NUMS)
- if(read(fi,tab[i].cl,256) < 256) {
- printf("Bad grammar table.\n");
- dexit();
- }
-
- close(fi);
-
-
- if((fi = open(ignonl,0)) < 0) {
- printf("Cannot open ignore/only file: %s\n",ignonl);
- dexit();
- }
- if((read(fi,b,6) == 6) && (b[0] == 0100200)) {
- if(read(fi,itab.hptr,b[1]) < b[1]) {
- printf("Cannot read ignore/only file: %s\n",ignonl);
- dexit();
- }
- if(read(fi,itab.symt,b[2]) < b[2]) {
- printf("Cannot read ignore/only file: %s\n",ignonl);
- dexit();
- }
- close(fi);
- } else {
- close(fi);
- compile();
- }
-
- if((signal(1,1) & 1) == 0) signal(1,&dexit);
- if((signal(2,1) & 1) == 0) signal(2,&dexit);
- if((signal(3,1) & 1) == 0) signal(3,&dexit);
- /* signal(4,&dexit);
- signal(5,&dexit);
- signal(6,&dexit);
- signal(7,&dexit);
- signal(8,&dexit);
- signal(10,&dexit);
- signal(11,&dexit);
- signal(12,&dexit);
- */
- if(utmp == 0) {
- while((tp[4] = creat(tmp[4],0)) < 0)
- tmp[4][9]++;
- close(tp[4]);
- tmp[0][9] = tmp[4][9];
- tmp[1][9] = tmp[4][9];
- tmp[2][9] = tmp[4][9];
- tmp[3][9] = tmp[4][9];
- tp[0] = creat(tmp[0],CREATC);
- tp[1] = creat(tmp[1],CREATC);
- tp[2] = creat(tmp[2],CREATC);
- tp[3] = creat(tmp[3],CREATC);
- } else {
- if((tp[0] = creat(utmp,CREATC)) < 0) {
- printf("Can't create user's temp file.\n");
- exit();
- }
- }
-
- return;
- }
-
- error(a)
- {
- printf("Error %d\n",a);
- dexit();
- }
-
- dexit()
- {
- extern nflush;
-
- /* printf("nflush = %d\n",nflush); /*DEBUG*/
- if(tp[0] > 0 && utmp == 0) {
- unlink(tmp[0]);
- unlink(tmp[1]);
- unlink(tmp[2]);
- unlink(tmp[3]);
- unlink(tmp[4]);
- }
- exit();
- }
-
- callsys(f,v)
- char f[],*v[];
- {
- int t,status,i;
-
- if((t = fork()) == 0) {
- execv(f,v);
- printf("Can't find %s\n",f);
- exit(1);
- } else {
- if(t == -1) {
- printf("Try again\n");
- return(1);
- }
- }
-
- while(t != wait(&status));
- /* printf("Status = %o, %s\n",status,f); /*DEBUG*/
- if((t = (status & 0377)) != 0) {
- if(t != 2) {
- printf("Fatal error in %s\n",f);
- printf("t = %d\n",t);
- }
- dexit();
- }
- return((status>>8) & 0377);
- }
-
- flags(argv)
- char *argv[];
- {
- int j,xx;
- char *ap;
-
- j = 1;
- ap = argv[1];
- while(*++ap != '\0') {
- switch(*ap) {
-
- default:
- printf("Unrecognized flag: %c\n",*ap);
- dexit();
-
- case '1': /* Symbol first */
- order = 1;
- continue;
-
- case '2': /* Current file first */
- order = 2;
- continue;
-
- case '3': /* Current symbol first */
- order = 3;
- continue;
-
- case 'a': /* Assembler */
- cflag = 0;
- continue;
-
- case 'c': /* C */
- gtab = "/usr/lib/ctab";
- if(!xx)
- ignonl = "/usr/lib/cign";
- cflag = 1;
- continue;
-
- case 'e': /* English */
- gtab = "/usr/lib/etab";
- if(!xx)
- ignonl = "/usr/lib/eign";
- continue;
-
- case 'i': /* Ignore file */
- if(!xx) {
- xx = 1;
- only = 0;
- ignonl = argv[++j];
- }
- continue;
-
- case 'l': /* Line numbers in col. 3 */
- cross = 0;
- continue;
-
- case 'o': /* Only file */
- if(!xx) {
- xx = 1;
- only = 1;
- ignonl = argv[++j];
- }
- continue;
-
- case 's': /* Symbols in col. 3 */
- cross = 1;
- continue;
-
- case 't':
- utmp = argv[++j];
- tmp[0] = argv[j];
- continue;
-
- case 'u': /* Unique symbols only */
- usw = 1;
- continue;
-
- case 'x': /* C externals */
- xsw = 1;
- gtab = "/usr/lib/ctab";
- if(!xx)
- ignonl = "/usr/lib/cign";
- cflag = 1;
- continue;
- }
- }
- return(j);
- }
-
-
- compile()
- {
- char buf[40],*b;
- int i,v;
-
- fopen(ignonl,ibuf1);
-
- b = buf - 1;
- while((*++b = getc(ibuf1)) != -1) {
- if(*b == '\n') {
- *b = '\0';
- search(buf,b - buf,&itab,1);
- b = buf - 1;
- } else {
- if(*b == '\t') {
- v = 0;
- while((i = getc(ibuf1)) != -1) {
- if(i == '\n') break;
- v = v*10 + (i - '0');
- }
- search(buf,b - buf,&itab,v);
- b = buf - 1;
- } else {
- if((b - buf) > 39) {
- printf("Ignore/only symbol too long");
- dexit();
- }
- }
- }
- }
- close(ibuf1);
- return;
- }
-