xref: /csrg-svn/old/refer/mkey/mkey2.c (revision 48299)
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