eacts.c 7# # include "mcons.c" # include "ccmn.c" # define SKIP 0 # define COLLECT 1 # define SKIP2 2 int cross 1; int order 1; char mone -1; coll() { cs = COLLECT; temp[t1].beg = &line[l]; return; } save() { extern wspace(); line[l] = '\0'; temp[t1].ct = &line[l] - temp[t1].beg; temp[t1].term = c; if((c == ' ' || c == '\t') && cflag) { gch[++fl] = mone; flag[fl] = &wspace; } else { sav1(); } return; } sav1() { extern only; struct tempent *ptr; int a,tt,val; ptr = &temp[t1]; val = search(ptr->beg,ptr->ct,&itab,0); if(cflag && c == '(' && level == 0 && hlevel == 0) csym(); cs = SKIP; if(xsw) { switch(val) { case 0: if((!level&&!hlevel)||(c == '(')||xtrn || ssw) { search(ptr->beg,ptr->ct,&xtab,1); goto yes; } else { if(search(ptr->beg,ptr->ct,&xtab,0)) goto yes; } goto no; case 1: break; case 2: xtrn = 1; goto no; case 3: if(hlevel) type = 1; if(!level&&!hlevel) ssw = 1; goto no; case 4: if(hlevel) type = 1; goto no; case 5: goto no; } } if(hlevel && (val == 4 || val == 3)) type = 1; if(!val == !only) goto yes; no: *(ptr->beg + ptr->ct) = ptr->term; return(0); yes: tt = t1; while(tt) if(comp(ptr->beg,temp[--tt].beg)) goto no; t1++; return(1); } out() { auto i,ct; if(cs == COLLECT) save(); ct = t1; while(ct--) temp[ct].beg[temp[ct].ct] = temp[ct].term; while(t1--) { /*printf("t1 = %d beg = %d ct = %d\n",t1,temp[t1].beg,temp[t1].ct); /* DEBUG */ switch(order) { case 1: if(utmp) i = 0; else i = dfile(temp[t1].beg); if((ct = temp[t1].ct) >= 8) { ct = 8; *curf = -1; } else { *curf = '\t'; } put(i,temp[t1].beg,ct); if(!single) put(i, curf, curfl); else put(i, curf, 1); if(cross) put(i,curs,cursl); conf(lno,4,lbuf); put(i,lbuf,5); break; case 2: i = dfile(curf+1); put(i,curf+1,curfl-1); if(cross) put(i,curs,cursl); else { conf(lno,4,lbuf); put(i,lbuf,5); } if((ct = temp[t1].ct) >= 8) { put(i,temp[t1].beg,8); put(i,&mone,1); } else { put(i,temp[t1].beg,ct); put(i,"\t",1); } if(cross) { conf(lno,4,lbuf); put(i,lbuf,5); } break; case 3: i = dfile(curs); put(i,curs,cursl); if((ct = temp[t1].ct) >= 8) { put(i,temp[t1].beg,8); *curf = -1; } else { put(i,temp[t1].beg,ct); *curf = '\t'; } put(i,curf,curfl); conf(lno,4,lbuf); put(i,lbuf,5); } if(!nocont) put(i,line,l + 1); } t1 = 0; l = -1; lno++; cs = SKIP; return; } asym() { int i; char *p; if(cs == COLLECT) { if(cross) { p = temp[t1].beg; cursl = &line[l] - p; cursl = cursl>8?8:cursl; i = -1; while(++i < cursl) curs[i] = *p++; if(cursl < 8) curs[cursl++] = '\t'; else curs[cursl++] = -1; } save(); } cs = SKIP; } asw() { switch(gch[fl]) { case 0: if(cs == COLLECT) save(); cs = SKIP; flag[++fl] = &asw; gch[fl] = c; return(1); case '\'': if(c == '\\') { gch[fl] = c; return(1); } break; case '"': gch[fl] = '\''; if(c == '\\') { flag[++fl] = &asw; gch[fl] = c; return(1); } return(1); case '<': if(c == '\n') out(); if(c == '\\') { flag[++fl] = &asw; gch[fl] = c; return(1); } if(c != '>') return(1); break; case '/': if(c != '\n') return(1); case '\\': if(c == '\n') out(); } fl--; return(1); } csw() { if(cs == COLLECT) save(); switch(gch[fl]) { case 0: if(c == '*') if(line[l - 1] != '/') return(1); gch[++fl] = c; flag[fl] = &csw; return(1); case '*': if(c == '\n') out(); if(c == '/' && line[l - 1] == '*') break; return(1); case '\'': case '"': if(c == gch[fl]) break; if(c == '\\') { gch[++fl] = c; flag[fl] = &csw; } return(1); case '\\': break; } fl--; return(1); } incl() { /* printf("incl: l = %d hl = %d dl = %d\n",level,hlevel,dlevel);/*DEBUG*/ if(cs == COLLECT) save(); if(hlevel) { hlevel = 0; level++; } else { dlevel++; } cs = SKIP; } decl() { /* printf("decl: l = %d hl = %d dl = %d\n",level,hlevel,dlevel);/*DEBUG*/ if(cs == COLLECT) save(); cs = SKIP; if(dlevel) { dlevel--; return; } if(--level > 0) return; curs[0] = '_'; curs[1] = '\t'; cursl = 2; level = 0; return; } csym() { int i; char *p; /* printf("csym: l = %d hl = %d dl = %d\n",level,hlevel,dlevel);/*DEBUG*/ /* printf("%s\n", temp[t1].beg); /*DEBUG */ p = temp[t1].beg; if(cs == COLLECT && level == 0) { if(cross) { cursl = temp[t1].ct; cursl = cursl>8?8:cursl; i = -1; while(++i < cursl) curs[i] = *p++; if(cursl < 8) curs[cursl++] = '\t'; else curs[cursl++] = -1; } hlevel = 1; } cs = SKIP; } dfile(a) char *a; { if(*a < 'c') return(0); if(*a < 'h') return(1); if(*a < 'r') return(2); return(3); } sk2() { cs = SKIP2; } sk() { cs = SKIP; } tabs() { if(l == 0) l = -1; } search(symbol,length,params,install) char *symbol; int length; struct htab *params; int install; { char *sp,*p; static int curb,*hptr,hsiz,nsym,ssiz; static char *symt; auto h,i,j,k; if(hptr != params->hptr) { hptr = params->hptr; hsiz = params->hsiz; symt = params->symt; ssiz = params->ssiz; curb = params->curb; nsym = params->nsym; } symbol[length] = '\0'; sp = symbol; i = length; h = 1; while(i--) h =* *sp++; if(h == 0100000) { h = 1; } else { h = h<0?(-h)%hsiz:h%hsiz; } if(h == 0) h++; /* printf("%s %d\n",symbol,h); /*DEBUG*/ while((p = &symt[hptr[h]]) > symt) { j = length + 2; sp = symbol; while(--j) { if(*p++ != *sp++) goto no; } return(*p); no: h = (h + h)%hsiz; } if(install) { if(++nsym >= hsiz) { printf("Too many symbols.\n"); dexit(); } hptr[h] = curb; length++; if((curb + length) >= ssiz) { printf("Too many characters in symbols.\n"); dexit(); } while(length--) symt[curb++] = *symbol++; symt[curb++] = install; params->curb = curb; params->nsym = nsym; } return(0); } conf(n,width,buf) char *buf; { auto i,a; i = width; while(i--) buf[i] = ' '; buf[(a = n/10)?conf(a,--width,buf):--width] = n%10 + '0'; return(++width); } comp(a,b) char *a; char *b; { a--; b--; while(*++a == *++b) if(*a == '\0') return(1); return(0); } semi() { if(cs == COLLECT) save(); if(only) return; xtrn = 0; if(!level) { ssw = 0; if(!type) { hlevel = 0; curs[0] = '_'; curs[1] = '\t'; cursl = 2; } type = 0; } cs = SKIP; } wspace() { if(c == ' ' || c == '\t') return(1); sav1(); fl--; return(0); } =asym . .. r0 r1 r2 r3 r4 r5 sp pc csw mov movb cmp cmpb bit bitb bic bicb bis bisb add sub br bne beq bge blt bgt ble bpl bmi bhi blos bvc bvs bhis bec bcc blo bcs bes jbr jne jeq jge jlt jgt jle jpl jmi jhi jlos jvc jvs jhis jec jcc jlo jcs jes clr clrb com comb inc incb dec decb neg negb adc adcb sbc sbcb tst tstb ror rorb rol rolb asr asrb asl aslb jmp swab jsr rts sys clc clv clz cln sec sev sez sen cfcc setf setd seti setl clrf negf absf tstf movf movif movfi movof movfo addf subf mulf divf cmpf modf movie movei ldfps stfps fr0 fr1 fr2 fr3 fr4 fr5 als alsc mpy mul div ash ashc dvd xor sxt mark sob .byte .even .if .endif .globl .text .data .bss .comm atable skip collect save skip2 sk cont coll save out asym agobl csym cgobl incl decl sk2 sk collect/'/agobl; collect/"/agobl; collect/</agobl; collect/\//agobl; collect/\\/agobl; collect/:/asym; collect/a/cont; collect/b/cont; collect/c/cont; collect/d/cont; collect/e/cont; collect/f/cont; collect/g/cont; collect/h/cont; collect/i/cont; collect/j/cont; collect/k/cont; collect/l/cont; collect/m/cont; collect/n/cont; collect/o/cont; collect/p/cont; collect/q/cont; collect/r/cont; collect/s/cont; collect/t/cont; collect/u/cont; collect/v/cont; collect/w/cont; collect/x/cont; collect/y/cont; collect/z/cont; collect/A/cont; collect/B/cont; collect/C/cont; collect/D/cont; collect/E/cont; collect/F/cont; collect/G/cont; collect/H/cont; collect/I/cont; collect/J/cont; collect/K/cont; collect/L/cont; collect/M/cont; collect/N/cont; collect/O/cont; collect/P/cont; collect/Q/cont; collect/R/cont; collect/S/cont; collect/T/cont; collect/U/cont; collect/V/cont; collect/W/cont; collect/X/cont; collect/Y/cont; collect/Z/cont; collect/1/cont; collect/2/cont; collect/3/cont; collect/4/cont; collect/5/cont; collect/6/cont; collect/7/cont; collect/8/cont; collect/9/cont; collect/0/cont; collect/./cont; collect/_/cont; collect/ /out; skip/'/agobl; skip/"/agobl; skip/</agobl; skip/\//agobl; skip/\\/agobl; skip/ /out; skip/./coll; skip/_/coll; skip/a/coll; skip/b/coll; skip/c/coll; skip/d/coll; skip/e/coll; skip/f/coll; skip/g/coll; skip/h/coll; skip/i/coll; skip/j/coll; skip/k/coll; skip/l/coll; skip/m/coll; skip/n/coll; skip/o/coll; skip/p/coll; skip/q/coll; skip/r/coll; skip/s/coll; skip/t/coll; skip/u/coll; skip/v/coll; skip/w/coll; skip/x/coll; skip/y/coll; skip/z/coll; skip/A/coll; skip/B/coll; skip/C/coll; skip/D/coll; skip/E/coll; skip/F/coll; skip/G/coll; skip/H/coll; skip/I/coll; skip/J/coll; skip/K/coll; skip/L/coll; skip/M/coll; skip/N/coll; skip/O/coll; skip/P/coll; skip/Q/coll; skip/R/coll; skip/S/coll; skip/T/coll; skip/U/coll; skip/V/coll; skip/W/coll; skip/X/coll; skip/Y/coll; skip/Z/coll; skip/0/sk2; skip/1/sk2; skip/2/sk2; skip/3/sk2; skip/4/sk2; skip/5/sk2; skip/6/sk2; skip/7/sk2; skip/8/sk2; skip/9/sk2; skip2/a/cont; skip2/b/cont; skip2/c/cont; skip2/d/cont; skip2/e/cont; skip2/f/cont; skip2/g/cont; skip2/h/cont; skip2/i/cont; skip2/j/cont; skip2/k/cont; skip2/l/cont; skip2/m/cont; skip2/n/cont; skip2/o/cont; skip2/p/cont; skip2/q/cont; skip2/r/cont; skip2/s/cont; skip2/t/cont; skip2/u/cont; skip2/v/cont; skip2/w/cont; skip2/x/cont; skip2/y/cont; skip2/z/cont; skip2/A/cont; skip2/B/cont; skip2/C/cont; skip2/D/cont; skip2/E/cont; skip2/F/cont; skip2/G/cont; skip2/H/cont; skip2/I/cont; skip2/J/cont; skip2/K/cont; skip2/L/cont; skip2/M/cont; skip2/N/cont; skip2/O/cont; skip2/P/cont; skip2/Q/cont; skip2/R/cont; skip2/S/cont; skip2/T/cont; skip2/U/cont; skip2/V/cont; skip2/W/cont; skip2/X/cont; skip2/Y/cont; skip2/Z/cont; skip2/0/cont; skip2/1/cont; skip2/2/cont; skip2/3/cont; skip2/4/cont; skip2/5/cont; skip2/6/cont; skip2/7/cont; skip2/8/cont; skip2/9/cont; skip2/ /out; skip2/\//agobl; ccmn.c uint nocont; struct tempent { char *beg; int ct; char term; } temp[30]; char lbuf[5]; int cflag; int t1; int level; int hlevel; int dlevel; int xtrn; int tp[5]; struct { int cl[NUMC]; } tab[NUMS]; int coll(); int save(); int out(); int asym(); int asw(); int csym(); int csw(); int incl(); int decl(); int sk2(); int sk(); int tabs(); int semi(); char line[132]; int l; int lno; char c; int cursl; char curs[9]; int curfl; char curf[10]; int usw; int xsw; int only; int cross; int file; int cs; int (*flag[8])(); int fl; char gch[8]; struct htab { int hsiz; int ssiz; int nsym; int curb; int *hptr; char *symt; }; struct htab itab; struct htab xtab; int ipsp[PTRI]; char issp[CHARI]; int xpsp[PTRX]; char xssp[CHARX]; int ib1[259]; int ib2[259]; char *ibuf; char *ibuf1; char *ibuf2; char mone; int single; int order; int ssw; int type; char *utmp; 3crpost.c /*int mbuf[1024]; /*INSTR*/ int ig 100; int esw; int initf 1; char ssp[270]; char *sym[9] {ssp, ssp + 30, ssp + 60, ssp + 90, ssp + 120, ssp + 150, ssp + 180, ssp + 210, ssp + 240 }; main(argc, argv) char *argv[]; { auto f,fct,file,i; if(argc < 2) { printf("Usage: crpost [-d] file1 file2 ...\n"); exit(); } if(*argv[1] == '-') { if(argv[1][1] == 'E') { fct = argv[1][2] - '0'; esw = 1; goto on; } fct = argv[1][1] - '0'; if((fct < 1) || (fct > 9)) { printf("-d: 0 < d < 10\n"); exit(); } if(argv[1][2] == 'x') { ig = fct-1; } on: argv++; argc--; } else { fct = 3; } f = 0; while(++f < argc) { file = open(argv[f], 0); edf(file, fct); close(file); } flsh(1); exit(); } int lno 1; edf(file, fct) { auto i,j,l; extern lno,etext; char brk,*buf,bufsp[150],line[150]; char extern *sym[]; /* monitor(&main,&etext,&mbuf,1024); /*INSTR*/ for(i = 0; i < fct; i++) *sym[i] = 0200; fields: l = -1; buf = &bufsp; for(i = 0; i < fct; ++i) { buf--; swt: switch(*++buf = get(file)) { default: if(esw && *buf >= 'A' && *buf <= 'Z' && i == 0) *buf =| 040; goto swt; case -1: *buf = ' '; case '\t': if(i == ig) continue; brk = *buf; *buf = '\0'; buf = &bufsp; if(comp(buf, sym[i])) { if(esw && i == 0) { line[0] = line[1] = '\t'; l = 1; goto rest; } line[++l] = '\t'; continue; } else { copy(buf, sym[i]); l =+ copy(buf, &line[++l]); line[--l] = brk; if(l < 8 && esw && i == 0) line[++l] = '\t'; j = i; while(++j < fct) *sym[j] = 0200; continue; } case '\n': lno++; brk = *buf; *buf = '\0'; buf = &bufsp; if(comp(buf, sym[i])) { goto fields; } else { copy(buf, sym[i]); l =+ copy(buf, &line[++l]); line[--l] = '\n'; j = i; while(++j < fct) *sym[j] = 0; goto out; } case '\0': goto fexit; } } rest: while((line[++l] = get(file)) != '\n') if(line[l] == '\0') goto fexit; lno++; out: if(*line != '\t') { put(1,"\n",1); lno++; } put(1,line,++l); goto fields; fexit: /* monitor(0); /*INSTR*/ return(0); } copy(a, b) char *a,*b; { char *c; b--; c = --a; while(*++b = *++a); return(a - c); } comp(a, b) char *a, *b; { /* printf("comp: %s %s\n",a,b); /*DEBUG*/ a--; b--; while(*++a == *++b) { if(*a == '\0') return(1); } return(0); } char buf[512]; int nread 1; get(ifile) int ifile; { char static *ibuf; if(--nread){ return(*ibuf++); } if(nread = read(ifile,buf,512)){ if(nread < 0)goto err; ibuf = buf; return(*ibuf++); } nread = 1; return(0); err: nread = 1; printf("read error\n"); return(0); } int optr; char bsp[512]; char *obuf bsp; int nflush; put(fil, string, n) char *string; { register int i; register char *o; /*printf("%d %c %d\n",fil,*string,n);/*DEBUG*/ string--; if((i = optr + n - 512) >= 0) { n =- i; o = &obuf[optr] -1; while(--n >= 0) *++o = *++string; optr = 512; flsh(fil); n = i; } o = &obuf[optr] - 1; optr =+ n; while(--n >= 0) { *++o = *++string; } return(0); } flsh(fil) { if(optr <= 0) return(optr); nflush++; if(write(fil, obuf, optr) != optr) return(-1); optr = 0; return(0); } tcsym auto 5 break 5 case 5 char 4 continue 5 default 5 do 5 double 4 else 5 extern 2 float 4 for 5 goto 5 if 5 int 4 long 4 register 5 return 5 static 5 struct 3 switch 5 while 5 ctable skip collect save skip2 sk cont coll save out asym agobl csym cgobl incl decl sk2 sk tab semi collect/\;/semi; collect/_/cont; collect/{/incl; collect/}/decl; collect/'/cgobl; collect/\\/cgobl; collect/"/cgobl; collect/a/cont; collect/b/cont; collect/c/cont; collect/d/cont; collect/e/cont; collect/f/cont; collect/g/cont; collect/h/cont; collect/i/cont; collect/j/cont; collect/k/cont; collect/l/cont; collect/m/cont; collect/n/cont; collect/o/cont; collect/p/cont; collect/q/cont; collect/r/cont; collect/s/cont; collect/t/cont; collect/u/cont; collect/v/cont; collect/w/cont; collect/x/cont; collect/y/cont; collect/z/cont; collect/A/cont; collect/B/cont; collect/C/cont; collect/D/cont; collect/E/cont; collect/F/cont; collect/G/cont; collect/H/cont; collect/I/cont; collect/J/cont; collect/K/cont; collect/L/cont; collect/M/cont; collect/N/cont; collect/O/cont; collect/P/cont; collect/Q/cont; collect/R/cont; collect/S/cont; collect/T/cont; collect/U/cont; collect/V/cont; collect/W/cont; collect/X/cont; collect/Y/cont; collect/Z/cont; collect/1/cont; collect/2/cont; collect/3/cont; collect/4/cont; collect/5/cont; collect/6/cont; collect/7/cont; collect/8/cont; collect/9/cont; collect/0/cont; collect/ /out; skip/\;/semi; skip/_/coll; skip/ /tab; skip/{/incl; skip/}/decl; skip/*/cgobl; skip/'/cgobl; skip/"/cgobl; skip/\\/cgobl; skip/ /out; skip/1/sk2; skip/2/sk2; skip/3/sk2; skip/4/sk2; skip/5/sk2; skip/6/sk2; skip/7/sk2; skip/8/sk2; skip/9/sk2; skip/0/sk2; skip/a/coll; skip/b/coll; skip/c/coll; skip/d/coll; skip/e/coll; skip/f/coll; skip/g/coll; skip/h/coll; skip/i/coll; skip/j/coll; skip/k/coll; skip/l/coll; skip/m/coll; skip/n/coll; skip/o/coll; skip/p/coll; skip/q/coll; skip/r/coll; skip/s/coll; skip/t/coll; skip/u/coll; skip/v/coll; skip/w/coll; skip/x/coll; skip/y/coll; skip/z/coll; skip/A/coll; skip/B/coll; skip/C/coll; skip/D/coll; skip/E/coll; skip/F/coll; skip/G/coll; skip/H/coll; skip/I/coll; skip/J/coll; skip/K/coll; skip/L/coll; skip/M/coll; skip/N/coll; skip/O/coll; skip/P/coll; skip/Q/coll; skip/R/coll; skip/S/coll; skip/T/coll; skip/U/coll; skip/V/coll; skip/W/coll; skip/X/coll; skip/Y/coll; skip/Z/coll; skip2/{/incl; skip2/}/decl; skip2/a/cont; skip2/b/cont; skip2/c/cont; skip2/d/cont; skip2/e/cont; skip2/f/cont; skip2/g/cont; skip2/h/cont; skip2/i/cont; skip2/j/cont; skip2/k/cont; skip2/l/cont; skip2/m/cont; skip2/n/cont; skip2/o/cont; skip2/p/cont; skip2/q/cont; skip2/r/cont; skip2/s/cont; skip2/t/cont; skip2/u/cont; skip2/v/cont; skip2/w/cont; skip2/x/cont; skip2/y/cont; skip2/z/cont; skip2/A/cont; skip2/B/cont; skip2/C/cont; skip2/D/cont; skip2/E/cont; skip2/F/cont; skip2/G/cont; skip2/H/cont; skip2/I/cont; skip2/J/cont; skip2/K/cont; skip2/L/cont; skip2/M/cont; skip2/N/cont; skip2/O/cont; skip2/P/cont; skip2/Q/cont; skip2/R/cont; skip2/S/cont; skip2/T/cont; skip2/U/cont; skip2/V/cont; skip2/W/cont; skip2/X/cont; skip2/Y/cont; skip2/Z/cont; skip2/1/cont; skip2/2/cont; skip2/3/cont; skip2/4/cont; skip2/5/cont; skip2/6/cont; skip2/7/cont; skip2/8/cont; skip2/9/cont; skip2/0/cont; skip2/./cont; skip2/ /out; /dr.c # # include "mcons.c" # include "ccmn.c" /*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] {"/usr/tmp/crt0a", "/usr/tmp/crt1a", "/usr/tmp/crt2a", "/usr/tmp/crt3a", "/usr/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 [-acilonstux123] file1 ...\n"); exit(); } lbuf[4] = '\t'; if(*argv[1] == '-') { j = flags(argv); argv =+ j; argc =- j; } if(argc == 2) single = 1; 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] = "-d"; 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 = "/bin/upost"; av[0] = "upost"; i = 0; } else { fn = "/bin/crpost"; av[0] = "crpost"; av[1] = cross? "-4x": "-3"; if(single) av[1][1]--; 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(gtty(fi, b) != -1) { close(fi); compile(); goto on; } 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(); } on: 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][13]++; close(tp[4]); tmp[0][13] = tmp[4][13]; tmp[1][13] = tmp[4][13]; tmp[2][13] = tmp[4][13]; tmp[3][13] = tmp[4][13]; 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) { pexec(v[0],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 'n': /* No context */ nocont = 1; lbuf[4] = '\n'; 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; } ecmn.h "int single; int dlineno; int san; int count; int page; struct { char *beg; int ct; char term; } temp[30]; int pn; int word; int hsw; int t1; int level; int hlevel; int dlevel; int xtrn; int tp[2]; struct { int cl[NUMC]; } tab[NUMS]; int coll(); int save(); int out(); int error(); int hyphen(); int hyp1(); int hyp2(); int pno(); int error(); char line[300]; int l; int lno; char c; int cursl; char curs[9]; int curfl; char curf[10]; int usw; int xsw; int only; int cross; int file; int cs; int (*flag[8])(); int fl; char gch[8]; struct htab { int hsiz; int ssiz; int nsym; int curb; int *hptr; char *symt; }; struct htab itab; int ipsp[PTRI]; char issp[CHARI]; int ib1[259]; char *ibuf; char *ibuf1; char mone; int order; int ssw; int type; char *utmp; int lflag; econs.h j# define NUMA 14 # define NUMC 128 # define NUMS 3 # define SIZA 8 # define SIZC 2 # define SIZS 8 # define PTRI 509 # define CHARI 4000 # define PTRX 5147 # define CHARX 40000 # define CONT 0 # define COLL 1 # define SAVE 2 # define OUT 3 # define EGOBL 4 # define SHARP 5 # define PNO 6 # define SKIP 0 # define COLLECT 1 # define SKIP2 2 #define CREATC 0644 esym the of and to a in that is was he for it with as his on be at by i this had not are but from or have an they which one you were her all she there would their we him been has when who will more no if out so said what up its about into than them can only other new some could time these two may then do first any my now such like our over man me even most made after also did many before must through back years where much your way well down should because each just those people mr how too little state good very make world still own see men work long get here between both life being under never day same another know while last might us great old year off come since against go came right used take three etable skip collect save skip2 cont coll save out egobl hyphen pno bslash skip/\\/bslash; skip//pno; skip/ /out; skip/a/coll; skip/b/coll; skip/c/coll; skip/d/coll; skip/e/coll; skip/f/coll; skip/g/coll; skip/h/coll; skip/i/coll; skip/j/coll; skip/k/coll; skip/l/coll; skip/m/coll; skip/n/coll; skip/o/coll; skip/p/coll; skip/q/coll; skip/r/coll; skip/s/coll; skip/t/coll; skip/u/coll; skip/v/coll; skip/w/coll; skip/x/coll; skip/y/coll; skip/z/coll; skip/A/coll; skip/B/coll; skip/C/coll; skip/D/coll; skip/E/coll; skip/F/coll; skip/G/coll; skip/H/coll; skip/I/coll; skip/J/coll; skip/K/coll; skip/L/coll; skip/M/coll; skip/N/coll; skip/O/coll; skip/P/coll; skip/Q/coll; skip/R/coll; skip/S/coll; skip/T/coll; skip/U/coll; skip/V/coll; skip/W/coll; skip/X/coll; skip/Y/coll; skip/Z/coll; collect/\\/bslash; collect/'/cont; collect/-/hyphen; collect/ /out; collect/a/cont; collect/b/cont; collect/c/cont; collect/d/cont; collect/e/cont; collect/f/cont; collect/g/cont; collect/h/cont; collect/i/cont; collect/j/cont; collect/k/cont; collect/l/cont; collect/m/cont; collect/n/cont; collect/o/cont; collect/p/cont; collect/q/cont; collect/r/cont; collect/s/cont; collect/t/cont; collect/u/cont; collect/v/cont; collect/w/cont; collect/x/cont; collect/y/cont; collect/z/cont; collect/A/cont; collect/B/cont; collect/C/cont; collect/D/cont; collect/E/cont; collect/F/cont; collect/G/cont; collect/H/cont; collect/I/cont; collect/J/cont; collect/K/cont; collect/L/cont; collect/M/cont; collect/N/cont; collect/O/cont; collect/P/cont; collect/Q/cont; collect/R/cont; collect/S/cont; collect/T/cont; collect/U/cont; collect/V/cont; collect/W/cont; collect/X/cont; collect/Y/cont; collect/Z/cont; skip2/ /out; skip2/(/egobl; skip2/a/coll; skip2/b/coll; skip2/c/coll; skip2/d/coll; skip2/e/coll; skip2/f/coll; skip2/g/coll; skip2/h/coll; skip2/i/coll; skip2/j/coll; skip2/k/coll; skip2/l/coll; skip2/m/coll; skip2/n/coll; skip2/o/coll; skip2/p/coll; skip2/q/coll; skip2/r/coll; skip2/s/coll; skip2/t/coll; skip2/u/coll; skip2/v/coll; skip2/w/coll; skip2/x/coll; skip2/y/coll; skip2/z/coll; skip2/A/coll; skip2/B/coll; skip2/C/coll; skip2/D/coll; skip2/E/coll; skip2/F/coll; skip2/G/coll; skip2/H/coll; skip2/I/coll; skip2/J/coll; skip2/K/coll; skip2/L/coll; skip2/M/coll; skip2/N/coll; skip2/O/coll; skip2/P/coll; skip2/Q/coll; skip2/R/coll; skip2/S/coll; skip2/T/coll; skip2/U/coll; skip2/V/coll; skip2/W/coll; skip2/X/coll; skip2/Y/coll; skip2/Z/coll; pind0.c # # include "econs.h" # include "ecmn.h" /*int mbuf[1024]; /*INSTR*/ /*int tbuf[12]; /*INSTR*/ int (*acts[])() {0, &coll, &save, &out, &gobble2, &hyphen, &pno, &bslash }; char *tmp[2] {"/tmp/crt0a", "/tmp/crt1a" }; char *ignonl "/usr/lib/eign"; char *gtab "/usr/lib/etab"; 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(*argv[1] == '-') { j = flags(argv); argv =+ j; argc =- j; } if(argc == 2) single = 1; init(); i = 0; if(argc == 1) { *ibuf1 = 0; curfl = 2; curf[0] = '_'; curf[1] = '\t'; curf[2] = '\0'; goto pipe; } while(++i < argc) { curs[4] = '\t'; if(fopen(argv[i],ibuf1) < 0) { printf("Can't open %s\n",argv[i]); dexit(); } curfl = 0; while((curf[curfl] = *argv[i]++) != 0 && curfl <=8) if(curf[curfl++] == '/') curfl = 0; curf[curfl++] = '\t'; if(curfl == 8) curf[8] = -1; curf[9] = '\0'; pipe: ibuf = ibuf1; lno = 1; driver(); close(file); } flsh(0); close(tp[0]); /* monitor(0); /*INSTR*/ /* dexit(); /*INSTR*/ /* times(tbuf); /*INSTR*/ /* tm1 = tbuf[0]/6; /*INSTR*/ /* tm2 = tbuf[1]/6; /*INSTR*/ /* printf("Prep: %d %d\n", tm1, tm2); /*INSTR*/ /* exit(); /*DEBUG*/ if(count) { fn = "/bin/sort"; av[0] = "sort"; av[1] = "-u"; } else { fn = "/bin/sort"; av[0] = "sort"; av[1] = "-f"; } av[2] = tmp[0]; av[3] = "-o"; av[4] = tmp[0]; av[5] = 0; callsys(fn, av); /* times(tbuf); /*INSTR*/ /* tm1 = tbuf[3]/6; /*INSTR*/ /* tm2 = tbuf[5]/6; /*INSTR*/ /* printf("Sort: %d %d\n", tm1, tm2); /*INSTR*/ if(usw) { fn = "/usr/bin/upost"; av[0] = "upost"; i = 0; } else if(count) { fn = "count"; av[0] = "count"; i = 0; } else { fn = "/usr/bin/crpost"; av[0] = "crpost"; if(single) av[1] = "-E2"; else av[1] = "-E3"; i = 1; } av[++i] = tmp[0]; av[++i] = 0; callsys(fn,av); /* times(tbuf); /*INSTR*/ /* tm1 = tbuf[3]/6 - tm1; /*INSTR*/ /* tm2 = tbuf[5]/6 - tm2; /*INSTR*/ /* printf("Post: %d %d\n", tm1, tm2); /*INSTR*/ dexit(); } driver() { auto p; top: l = -1; while((c = line[++l] = getc(ibuf)) != -1) { /* printf("driver: c = %o l = %d\n",c,l); /*DEBUG*/ if(l >= 299) { lflag++; l--; } if(c & 0200) { printf("Illegal character: %o line %d\n",c,lno); dexit(); } if(l == 0 && (c == '.' || c == '\'')) { while((c = getc(ibuf)) != '\n') if(c == -1) return; lno++; l = -1; continue; } 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 dexit(); ibuf1 = &ib1; 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; see lem\n"); dexit(); } close(fi); if(signal(1,1) != 1) signal(1,&dexit); if(signal(2,1) != 1) signal(2,&dexit); if(signal(3,1) != 1) signal(3,&dexit); if(!utmp) { while((tp[1] = creat(tmp[1],0)) < 0) tmp[1][9]++; close(tp[1]); tmp[0][9] = tmp[1][9]; } tp[0] = creat(tmp[0],CREATC); if(count) return; itab.hptr = &ipsp; itab.symt = &issp; itab.hsiz = PTRI; itab.ssiz = CHARI; itab.nsym = 0; itab.curb = 1; if((fi = open(ignonl,0)) < 0) { printf("Cannot open ignore/only file.\n"); 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.\n"); dexit(); } if(read(fi,itab.symt,b[2]) < b[2]) { printf("Cannot read ignor/only file.\n"); dexit(); } close(fi); } else { close(fi); compile(); } return; } dexit() { extern nflush; /* printf("nflush = %d\n",nflush); /*DEBUG*/ if(tp[0] > 0 && utmp == 0) { unlink(tmp[0]); unlink(tmp[1]); } exit(); } callsys(f,v) char f[],*v[]; { int t,status,i; if((t = fork()) == 0) { for(i = 1; i <= 12; i++) signal(i,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; extern ctout(); char *ap; j = 1; ap = argv[1]; while(*++ap != '\0') { switch(*ap) { default: printf("Unrecognized flag: %c\n",*ap); dexit(); case 's': gtab = "/usr/lem/sanskrit/stab"; san = 1; continue; case 'c': count = 1; acts[OUT] = ctout; continue; case 'd': dlineno = 1; continue; case 'i': /* Ignore file */ if(!xx) { xx = 1; only = 0; ignonl = argv[++j]; } continue; case 'o': /*only file*/ if(!xx) { xx = 1; only = 1; ignonl = argv[++j]; } continue; case 'p': page = 1; continue; case 't': utmp = argv[++j]; tmp[0] = argv[j]; continue; case 'u': /* Unique symbols only */ usw = 1; continue; case 'w': /* Word list only */ word = 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.\n"); dexit(); } } } } close(ibuf1); return; } hind1.c # # include "econs.h" # include "ecmn.h" # define SKIP 0 # define COLLECT 1 # define SKIP2 2 char mone -1; int tlno 1; coll() { cs = COLLECT; temp[t1].beg = &line[l]; return; } save() { extern only; char *pt1,*pt2,cbuf[30]; int a,tt,val; if(cs != COLLECT) { cs = SKIP; return; } cs = SKIP; line[l] = '\0'; temp[t1].ct = &line[l] - temp[t1].beg; if(!count) if(temp[t1].ct == 1) goto no; pt1 = temp[t1].beg-1; pt2 = cbuf-1; while(*++pt2 = *++pt1) if(*pt2 >= 'A' && *pt2 <= 'Z') *pt2 =| 040; if(count) goto yes; val = search(cbuf,temp[t1].ct,&itab,0); if(!val == !only) goto yes; no: line[l] = c; return(0); yes: if(count == 0) { tt = t1; while(tt) if(comp(temp[t1].beg,temp[--tt].beg)) goto no; } temp[t1++].term = c; return(1); } out() { auto i,ct,t2; char *b,*e; if(lflag) { printf("line too long: %s, line %d\n", curf, lno); lflag = 0; } if(cs == COLLECT) save(); t2 = 0; while(t2 < t1) { temp[t2].beg[temp[t2].ct] = temp[t2].term; t2++; } t2 = t1 - 1; while(t1--) { /*printf("t1 = %d beg = %o ct = %d\n",t1,temp[t1].beg,temp[t1].ct); /* DEBUG */ ct = temp[t1].ct; temp[t1].beg[ct] = temp[t1].term; if(ct > 15) ct = 15; put(temp[t1].beg, ct); put("\t",1); if(!page) { if(!single) put(curf,curfl); if(!dlineno) { conf(lno,4,curs); put(curs,4); } } else { conf(pn,4,curs); put(curs,4); } if(word == 0) { put("\t",1); if(t1 >= 1) b = temp[t1-1].beg; else b = line; if(t2 > t1) e = temp[t1+1].beg + temp[t1+1].ct; else e = &line[l]; /*printf("e = %o b = %o\n",e,b); /*DEBUG*/ put(b,e-b); } put("\n",1); } t1 = 0; l = -1; lno =+ tlno; tlno = 1; cs = SKIP; return; } ctout() { register int i, ct; register char *t2; if(lflag) { printf("line too long: %s, line %d\n", curf, lno); lflag = 0; } if(cs == COLLECT) save(); while(t1--) { ct = temp[t1].ct; t2 = temp[t1].beg - 1; /* printf("out: %s %d\n", temp[t1].beg, ct); /*DEBUG*/ while(*++t2) if(*t2 >= 'A' && *t2 <= 'Z') *t2 =| 040; *t2 = '\n'; put(temp[t1].beg, ct + 1); } t1 = 0; l = -1; lno =+ tlno; tlno = 1; cs = SKIP; return; } search(symbol,length,params,install) char *symbol; int length; struct htab *params; int install; { char *sp,*p; static int *hptr,hsiz,nsym; static char *ssiz; static int curb; static char *symt; auto h,i,j,k; if(hptr != params->hptr) { hptr = params->hptr; hsiz = params->hsiz; symt = params->symt; ssiz = params->ssiz; curb = params->curb; nsym = params->nsym; } symbol[length] = '\0'; /*printf("ssiz = %d; nsym = %d; %s\n", ssiz, nsym, symbol);/*DEBUG*/ sp = symbol; i = length; h = 1; while(i--) h =* *sp++; if(h == 0100000) { h = 1; } else { h = h<0?(-h)%hsiz:h%hsiz; } if(h == 0) h++; /* printf("%s %d\n",symbol,h); /*DEBUG*/ while((p = &symt[hptr[h]]) > symt) { j = length + 2; sp = symbol; while(--j) { if(*p++ != *sp++) goto no; } return(*p); no: h = (h + h)%hsiz; } if(install) { if(++nsym >= hsiz) { printf("Too many symbols in ignore/only file.\n"); dexit(); } hptr[h] = curb; length++; if((curb + length) >= ssiz) { printf("i/o file too big; ssiz = %d\n", ssiz); dexit(); } while(length--) symt[curb++] = *symbol++; symt[curb++] = install; params->curb = curb; params->nsym = nsym; } return(0); } conf(n,width,buf) char *buf; { auto i,a; i = width; while(i--) buf[i] = ' '; buf[(a = n/10)?conf(a,--width,buf):--width] = n%10 + '0'; return(++width); } comp(a,b) char *a; char *b; { a--; b--; while(*++a == *++b) if(*a == '\0') return(1); return(0); } hyphen() { /* printf("hyphen\n"); /*DEBUG*/ if(gch[fl] == 0) flag[++fl] = &hyp1; return(1); } hyp1() { char tc; /* printf("hyp1 c = %o\n",c); /*DEBUG*/ if(c != '\n') { fl--; l--; tc = c; c = '-'; save(); c = tc; l++; return(0); } else { l =- 2; flag[fl] = &hyp2; hsw = 1; return(1); } } hyp2() { extern (*acts[]) (); /* printf("hyp2 c = %o l = %d\n",c,l); /*DEBUG*/ if(hsw && (tab[2].cl[c] == 0)) { l--; if(c == 3) pno(); if(c == '\n') tlno++; return(1); } hsw = 0; if(tab[cs].cl[c]) { line[l] = '\n'; (*acts[OUT])(); fl--; return(0); } return(1); } pno() { extern (*acts[])(); if(flag[fl] != &pno) { flag[++fl] = &pno; pn = 0; return(1); } if(c == '\n') { fl--; (*acts[OUT])(); return(1); } pn = pn*10 + c - '0'; return(1); } gobble2() { static ct2; if(cs == COLLECT) save(); if(flag[fl] != gobble2) { ct2 = 1; flag[++fl] = gobble2; return(1); } if(ct2--) return(1); fl--; cs = SKIP; return(1); } bslash() { if(cs == COLLECT) save(); cs = SKIP2; return(1); } error() { printf("Error: %c %o\n", c, cs); dexit(); } }ind2.c int optr; char obuf[512]; int nflush; put(string,n) char *string; { extern utmp; int i; char *o; /*printf("%c %d\n",*string,n);/*DEBUG*/ string--; if((i = optr + n - 512) >= 0) { n =- i; o = &obuf[optr] -1; while(--n >= 0) *++o = *++string; optr = 512; flsh(1); n = i; } o = &obuf[optr] - 1; optr =+ n; while(--n >= 0) { *++o = *++string; } return(0); } flsh(fil) { extern tp[],utmp; if(optr <= 0) return(optr); nflush++; if(write(tp[0],obuf,optr) != optr) return(-1); optr = 0; return(0); } nmake.c v # # include "mcons.c" char ib1[518]; char *ibuf &ib1; struct htab ( int hsiz; int ssiz; int nsym; int curb; int *hptr; char *symt; ); struct htab itab; struct htab xtab; int ipsp[PTRI]; char issp[CHARI]; search(symbol,length,params,install) char *symbol; int length; struct htab *params; int install; { char *sp,*p; int curb,*hptr,hsiz,nsym,ssiz; char *symt; auto h,i,j,k; hptr = params->hptr; hsiz = params->hsiz; symt = params->symt; ssiz = params->ssiz; curb = params->curb; nsym = params->nsym; symbol[length] = '\0'; sp = symbol; i = length; h = 1; while(i--) h =* *sp++; if(h == 0100000)h = 1; h = h<0?(-h)%hsiz:h%hsiz; if(h == 0) h++; /* printf("%s %d\n",symbol,h); /*DEBUG*/ while((p = &symt[hptr[h]]) > symt) { j = length + 1; sp = symbol; while(j--) { if(*p++ != *sp++) goto no; } return(*p); no: h = (h + h)%hsiz; } if(install) { if(++nsym >= hsiz) err("too many","symbols"); hptr[h] = curb; length++; if((curb + length) >= ssiz) err("too many","chars"); while(length--) symt[curb++] = *symbol++; symt[curb++] = install; params->curb = curb; params->nsym = nsym; } return(0); } main(argc,argv) char **argv; { auto ifile,ofile,i,c,error,val; char t[20]; if(argc != 3)exit(); ifile = fopen(argv[1],ibuf); if(ifile < 0)err("open",argv[1]); ofile = creat(argv[2],0644); if(ofile < 0)err("creat",argv[2]); xtab.hptr = &ipsp; xtab.symt = &issp; xtab.hsiz = PTRI; xtab.ssiz = CHARI; xtab.nsym = 0; xtab.curb = 1; i = xtab.hsiz; while(i)xtab.hptr[--i] = 0; i = -1; while((t[++i] = getc(ibuf)) >= 0){ if(t[i] == '\n'){ i = search(t,i,&xtab,1); i = -1; } else { if(t[i] == '\t') { val = gen(); search(t,i,&xtab,val); i = -1; } } } /* printf("collisions = %d\nsymbols = %d\n",ncol,nsym); /*INSTR*/ i = 0100200; error = write(ofile,&i,2); if(error < 0)err("write",argv[2]); i = 2*xtab.hsiz; error = write(ofile,&i,2); if(error < 0)err("write",argv[2]); error = write(ofile,&xtab.ssiz,2); if(error < 0)err("write",argv[2]); error = write(ofile,xtab.hptr,i); if(error < 0)err("write",argv[2]); error = write(ofile,xtab.symt,xtab.ssiz); if(error < 0)err("write",argv[2]); return; } err(a,b) char *a,*b; { printf("%s %s\n",a,b); exit(); } gen() { auto i,v; v = 0; while((i = getc(ibuf)) != -1) { if(i == '\n') break; v = v*10 + (i - '0'); } return(v); } mcons.c # define NUMA 14 # define NUMC 128 # define NUMS 3 # define SIZA 8 # define SIZC 2 # define SIZS 8 # define PTRI 509 # define CHARI 4000 # define PTRX 509 # define CHARX 4000 # define CONT 1 # define COLL 2 # define SAVE 3 # define OUT 4 # define ASYM 5 # define ASW 6 # define CSYM 7 # define CSW 8 # define INCL 9 # define DECL 10 # define SK2 11 # define SK 12 # define TABS 13 # define SEMI 14 # define SHARP 15 # define SKIP 0 # define COLLECT 1 # define SKIP2 2 #define CREATC 0644 tmtab.c {# include "econs.h" struct { int cl[NUMC]; }tab[NUMS]; char state[NUMS][8]; char class[NUMC][8]; char act[NUMA][8]; char def[NUMS][8]; char temp[8]; char *st[NUMS]; char *df[NUMS]; char *cl[NUMC]; char *ac[NUMA]; int t1; int t2; main(argc,argv) char **argv; { extern fin; char fl,nlfl,c,bfl,fo,brk; int cs,ca,cc,i,j,cd; if(argc != 3) { printf("Usage: mtab input output\n"); exit(); } if((fo = creat(argv[2],0644)) < 0) { printf("Output file.\n"); exit(); } if((fin = open(argv[1],0)) < 0) { printf("Input file.\n"); exit(); } nlfl = 1; i = -1; while(brk = rword()) { switch (brk) { case '\n': if(nlfl) { move(temp,state[++i]); st[i] = &state[i]; } else { move(temp,def[i]); df[i] = &def[i]; nlfl = 1; } continue; case ' ': if(nlfl) { move(temp,state[++i]); st[i] = &state[i]; nlfl = 0; } else { error(7); } continue; } } i = 128; while(--i) { class[i][0] = i; class[i][1] = '\0'; cl[i] = &class[i]; } cl[0] = &class[0]; bfl = nlfl = 0; t1 = 0; t2 = -1; while(c = getchar()) { switch(c) { default: if(t1 >= NUMA) error(4); bfl = nlfl = 0; act[t1][++t2<8?t2:7] = c; continue; case '\n': if(nlfl) break; nlfl = 1; case ' ': if(bfl) continue; bfl = 1; act[t1][++t2<8?t2:7] = '\0'; ac[t1] = &act[t1]; t1++; t2 = -1; continue; } break; } if(c == '\0') exit(); i = -1; while(++i < NUMS) { if(df[i]) { cd = find(ac,df[i],NUMA); j = -1; while(++j < NUMC) tab[i].cl[j] = cd; } } fl = 0; i = -1; while(c = getchar()) { switch(c) { case '\\': temp[++i] = getchar(); continue; case '\n': if(fl != 1) continue; default: temp[++i] = c; continue; case '/': temp[++i] = '\0'; i = -1; switch(fl) { case 0: cs = find(st,temp,NUMS); fl = 1; continue; case 1: cc = find(cl,temp,NUMC); fl = 2; continue; default: error(1); } case ';': if(fl != 2) error(2); temp[++i] = '\0'; i = -1; ca = find(ac,temp,NUMA); /*printf("%o %o %o\n",cs,cc,ca); /*DEBUG*/ tab[cs].cl[cc] = ca; fl = 0; continue; } } i = -1; while(++i < NUMS) write(fo,tab[i].cl,256); } error(a) { printf("Error %d\n",a); exit(); } find(a, b, c) char *a[]; char b[]; int c; { int i,j; /* printf("%s\n",b); /*DEBUG*/ i = -1; while(++i < c) { /* printf(" %s\n",a[i]); /*DEBUG*/ j = 0; while(b[j] == a[i][j]) { if(b[j] == '\0') goto found; j++; } } found: return(i); } rword() { char c; int ct; ct = -1; while(c = getchar()) { switch(c) { default: temp[++ct] = c; continue; case '\n': if(ct == -1) return('\0'); case ' ': temp[++ct] = '\0'; return(c); } } } move(a,b) char *a; char *b; { while((*b++ = *a++) != '\0'); return; } put.c int bct[4]; int optr[4]; char bsp[2048]; char *obuf[4] {bsp, bsp + 512, bsp + 1024, bsp + 1536 }; int nflush; put(fil,string,n) char *string; { extern utmp; int i; char *o; /*printf("%d %c %d\n",fil,*string,n);/*DEBUG*/ string--; if((i = optr[fil] + n - 512) >= 0) { n =- i; o = &obuf[fil][optr[fil]] -1; while(--n >= 0) *++o = *++string; optr[fil] = 512; flsh(fil); n = i; } o = &obuf[fil][optr[fil]] - 1; optr[fil] =+ n; while(--n >= 0) { *++o = *++string; } return(0); } flsh(fil) { extern tp[],utmp; if(optr[fil] <= 0) return(optr[fil]); nflush++; if(write(tp[fil],obuf[fil],optr[fil]) != optr[fil]) return(-1); optr[fil] = 0; return(0); } /upost.c /*int mbuf[1024]; /*INSTR*/ int psw 1; int initf 1; main(argc, argv) char *argv[]; { auto f,fct,file; if(argc < 2) { printf("Usage: cpost [-d] file1 file2 ...\n"); exit(); } if(*argv[1] == '-') { fct = argv[1][1] - '0'; if((fct < 1) || (fct > 9)) { printf("-d: 0 < d < 10\n"); exit(); } argv++; argc--; } else { fct = 1; } f = 0; while(++f < argc) { file = open(argv[f], 0); edl(file, fct); close(file); psw = 0; } flsh(0); exit(); } int lno 1; edl(file) { auto t,l; char static buf[20],fld[20],line[200]; char c; field: t = -1; while(((buf[++t] = get(file)) != '\t') && (buf[t] != -1)) if(buf[t] == '\0') goto done; if((c = buf[t]) == -1) c = ' '; buf[t] = '\0'; if(comp(buf,fld)) { lno++; goto junk; } else { if(lno == 0) { put(0,line,++l); } l = copy(buf,line); copy(buf,fld); line[--l] = c; lno = 0; goto fill; } fill: while((line[++l] = get(file)) != '\n') { if(line[l] == -1) line[l] = ' '; if(line[l] == '\0') goto done; } goto field; junk: while((*line = get(file)) != '\n') if(*line == '\0') goto done; goto field; done: if(lno == 0) put(0,line,++l); lno = 1; return(0); } gfld(file, buf) char *buf; { char c; buf--; while(*++buf = get(file)) { if((*buf == '\t') || (*buf == '\n')) { c = *buf; *buf = '\0'; return(c); } else { continue; } } return('\0'); } copy(a, b) char *a,*b; { char *c; b--; c = --a; while(*++b = *++a); return(a - c); } comp(a, b) char *a, *b; { /* printf("comp: %s %s\n",a,b); /*DEBUG*/ a--; b--; while(*++a == *++b) { if(*a == '\0') return(1); } return(0); } char buf[512]; int nread 1; get(ifile) int ifile; { char static *ibuf; if(--nread){ return(*ibuf++); } if(nread = read(ifile,buf,512)){ if(nread < 0)goto err; ibuf = buf; return(*ibuf++); } nread = 1; return(0); err: nread = 1; printf("read error\n"); return(0); } int tp[1] 1; int optr[4]; char bsp[512]; char *obuf[1] bsp; int nflush; put(fil,string,n) char *string; { int i; char *o; /*printf("%d %c %d\n",fil,*string,n);/*DEBUG*/ string--; if((i = optr[fil] + n - 512) >= 0) { n =- i; o = &obuf[fil][optr[fil]] -1; while(--n >= 0) *++o = *++string; optr[fil] = 512; flsh(fil); n = i; } o = &obuf[fil][optr[fil]] - 1; optr[fil] =+ n; while(--n >= 0) { *++o = *++string; } return(0); } flsh(fil) { extern tp[]; if(optr[fil] <= 0) return(optr[fil]); nflush++; if(write(tp[fil],obuf[fil],optr[fil]) != optr[fil]) return(-1); optr[fil] = 0; return(0); } *