home *** CD-ROM | disk | FTP | other *** search
- # include <stdio.h>
- # include "prep.h"
- # define SKIP 0
- # define COLLECT 1
- # define SKIP2 2
-
- int tlno = 1;
-
- coll()
- {
- cs = COLLECT;
- temp[t1].beg = &line[l];
- return;
- }
-
- save()
- {
- extern only;
- char *pt1,*pt2,cbuf[30];
- int val;
-
- if(cs != COLLECT) {
- cs = SKIP;
- return;
- }
- cs = SKIP;
- line[l] = '\0';
- temp[t1].ct = &line[l] - temp[t1].beg;
- pt1 = temp[t1].beg-1;
- pt2 = cbuf-1;
-
- wdnum++;
- while(*++pt2 = *++pt1)
- if(*pt2 >= 'A' && *pt2 <= 'Z')
- *pt2 |= 040;
-
- if(igflg){
- val = search(cbuf,temp[t1].ct,&itab,0);
- if(!val == !only) goto yes;
-
- line[l] = c;
- return;
- }
- yes:
- temp[t1++].wdno = wdnum;
- line[l] = c;
- return;
- }
-
- ctout()
- {
- register int ct;
- register char *t2;
- int t3;
- long xxx;
-
- if(lflag) {
- fprintf(stderr, "line too long: line %d\n",lno);
- lflag = 0;
- }
- if(cs == COLLECT) save();
-
- t3 = t1;
- t1 = -1;
- while(++t1 < t3) {
- if(wdflg){
- xxx = temp[t1].wdno;
- conf(xxx, WIDTH, num);
- put(num,WIDTH+1);
- }
- ct = temp[t1].ct;
- t2 = temp[t1].beg - 1;
- /* fprintf(stderr, "out: %s %d\n", temp[t1].beg, ct); /*DEBUG*/
- while(ct--)
- if(*++t2 >= 'A' && *t2 <= 'Z')
- *t2 |= 040;
-
- ct = temp[t1].ct;
- while(*--t2 == '\'' && san == 0)
- ct--;
-
- put(temp[t1].beg, ct);
- put("\n", 1);
- }
- t1 = 0;
- l = -1;
- lno += tlno;
- tlno = 1;
- cs = SKIP;
- return;
- }
-
- conf(n,width,buf)
- long n;
- char *buf;
- {
- long a;
- auto i;
-
- i = width;
- while(i--) buf[i] = ' ';
-
- a = n/10;
- if(a)
- width = conf(a, --width, buf);
- else
- width--;
- buf[width] = n%10 + '0';
-
- return(++width);
- }
-
- hyphen()
- {
- /* fprintf(stderr, "hyphen\n"); /*DEBUG*/
- flag[++fl] = hyp1;
- return(1);
- }
-
- hyp1()
- {
- /* fprintf(stderr, "hyp1 c = %o\n",c); /*DEBUG*/
- if(c != '\n') {
- fl--;
- l--;
- save();
- l++;
- punc();
- return(0);
- } else {
- l -= 2;
- flag[fl] = hyp2;
- hsw = 1;
- return(1);
- }
- }
-
- hyp2()
- {
- extern (*acts[])();
- /* fprintf(stderr, "hyp2 c = %o l = %d\n",c,l); /*DEBUG*/
- if(hsw && (tab[2][c] == 0)) {
- l--;
- if(c == '\n') tlno++;
- return(1);
- }
- hsw = 0;
- if(c == '\n'){
- l--;
- return(1);
- }
- if(tab[cs][c]) {
- line[l] = '\n';
- (*acts[OUT])();
- fl--;
- return(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);
- }
-
- bsp()
- {
- flag[++fl] = bsp1;
- return(1);
- }
-
- bsp1()
- {
- fl--;
- if(c == '"') return(1);
-
- line[--l] = c;
- return(0);
- }
-
- punc()
- {
-
- if(cs == COLLECT)
- save();
- if(puncfl) {
- temp[t1].beg = &line[l];
- temp[t1].ct = 1;
- temp[t1++].wdno = 0;
- }
- }
-
- search(symbol,length,params,install)
- char *symbol;
- int length;
- struct htab *params;
- int install;
- {
- char *sp,*p;
- static int *hptr,hsiz,nsym;
- static int ssiz;
- static int curb;
- static char *symt;
- auto h,i,j;
-
- 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';
- /*fprintf(stderr, "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++;
- /* fprintf(stderr, "%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++;
- if(h >= hsiz) h -= hsiz;
- }
- if(install) {
- if(++nsym >= hsiz) {
- fprintf(stderr, "Too many symbols in ignore/only file.\n");
- exit(1);
- }
-
- hptr[h] = curb;
- length++;
- if((curb + length) >= ssiz) {
- fprintf(stderr, "i/o file too big; ssiz = %d\n", ssiz);
- exit(1);
- }
-
- while(length--)
- symt[curb++] = *symbol++;
- symt[curb++] = install;
- params->curb = curb;
- params->nsym = nsym;
- }
- return(0);
- }
-