1*48299Sbostic /*-
2*48299Sbostic * %sccs.include.proprietary.c%
3*48299Sbostic */
4*48299Sbostic
512300Stut #ifndef lint
6*48299Sbostic static char sccsid[] = "@(#)mkey2.c 4.3 (Berkeley) 04/18/91";
7*48299Sbostic #endif /* not lint */
812300Stut
912300Stut #include <stdio.h>
1012300Stut #include <ctype.h>
1112300Stut #define MAXLINE 500
1212300Stut
1312300Stut static int eof = 0;
1412300Stut static long lp, lim;
1512300Stut static int alph, used, prevc;
1612300Stut static char *p, key[20];
1712300Stut
dofile(f,name)1812300Stut dofile(f, name)
1912300Stut FILE *f;
2012300Stut char *name;
2112300Stut {
2212300Stut /* read file f & spit out keys & ptrs */
2312300Stut
2412300Stut char line[MAXLINE], *s;
2534097Sbostic extern int keycount;
2612300Stut int c;
2712300Stut long grec();
2812300Stut extern int wholefile;
2912300Stut alph=used=prevc=eof=0;
3012300Stut
3112300Stut lp=0;
3212300Stut if (wholefile==0)
3312300Stut while (lim = grec(line,f))
3412300Stut {
3512300Stut # if D1
3612300Stut fprintf(stderr, "line: /%s",line);
3712300Stut # endif
3812300Stut used=alph=0;
3912300Stut p = key;
4012300Stut for(s=line; (c= *s) && (used<keycount); s++)
4112300Stut chkey(c, name);
4212300Stut lp += lim;
4312300Stut if (used) putchar('\n');
4412300Stut }
4512300Stut else
4612300Stut {
4712300Stut p=key;
4812300Stut used=alph=0;
4912300Stut while ( (c=getc(f)) != EOF && used<keycount)
5012300Stut chkey (c, name);
5112300Stut if (used) putchar('\n');
5212300Stut }
5312300Stut fclose(f);
5412300Stut }
5512300Stut
outkey(ky,lead,trail)5612300Stut outkey( ky, lead, trail)
5712300Stut char *ky;
5812300Stut {
5934097Sbostic extern int minlen;
6012300Stut int n;
6112300Stut n = strlen(ky);
6212300Stut if (n<minlen) return (0);
6312300Stut if (n<3)
6412300Stut {
6512300Stut if (trail == '.') return(0);
6612300Stut if (mindex(".%,!#$%&'();+:*", lead)!=0) return(0);
6712300Stut }
6812300Stut if (isdigit(ky[0]))
6912300Stut if (ky[0] != '1' || ky[1] != '9' || n!= 4) return(0);
7012300Stut if (common(ky))
7112300Stut return(0);
7212300Stut return(1);
7312300Stut }
7412300Stut
7512300Stut long
grec(s,f)7612300Stut grec (s, f)
7712300Stut char *s;
7812300Stut FILE *f;
7912300Stut {
8012300Stut char tm[200];
8112300Stut int curtype = 0;
8212300Stut long len = 0L, tlen = 0L;
8312300Stut extern int wholefile;
8434097Sbostic extern char *iglist;
8534097Sbostic
8612300Stut if (eof) return(0);
8712300Stut *s = 0;
8812300Stut while (fgets(tm, 200, f))
8912300Stut {
9012300Stut tlen += strlen(tm);
9112300Stut if (tm[0] == '%' || tm[0] == '.')
9212300Stut curtype = tm[1];
9312300Stut if (tlen < MAXLINE && mindex(iglist,curtype)==0)
9412300Stut strcat(s, tm);
9512300Stut len = tlen;
9612300Stut if (wholefile==0 && tm[0] == '\n')
9712300Stut return(len);
9812300Stut if (wholefile>0 && len >= MAXLINE)
9912300Stut {
10012300Stut fseek (f, 0L, 2);
10112300Stut return(ftell(f));
10212300Stut }
10312300Stut }
10412300Stut eof=1;
10512300Stut return(s[0] ? len : 0L);
10612300Stut }
10712300Stut
10812300Stut char *
trimnl(ln)10912300Stut trimnl(ln)
11012300Stut char *ln;
11112300Stut {
11212300Stut register char *p = ln;
11312300Stut while (*p) p++;
11412300Stut p--;
11512300Stut if (*p == '\n') *p=0;
11612300Stut return(ln);
11712300Stut }
11812300Stut
chkey(c,name)11912300Stut chkey (c, name)
12012300Stut {
12134097Sbostic extern int labels;
12234097Sbostic extern int wholefile;
12334097Sbostic
12412300Stut if (isalpha(c) || isdigit(c))
12512300Stut {
12612300Stut if (alph++ < 6)
12712300Stut *p++ = c;
12812300Stut }
12912300Stut else
13012300Stut {
13112300Stut *p = 0;
13212300Stut for(p=key; *p; p++)
13312300Stut *p |= 040;
13412300Stut if (outkey(p=key,prevc,c))
13512300Stut {
13612300Stut if (used==0)
13712300Stut {
13812300Stut if (labels)
13912300Stut {
14012300Stut if (wholefile==0)
14112300Stut printf("%s:%ld,%ld\t", name, lp, lim);
14212300Stut else
14312300Stut printf("%s\t", name);
14412300Stut }
14512300Stut }
14612300Stut else
14712300Stut putchar(' ');
14812300Stut fputs(key, stdout);
14912300Stut used++;
15012300Stut }
15112300Stut prevc=c;
15212300Stut alph=0;
15312300Stut }
15412300Stut }
155