xref: /csrg-svn/old/refer/mkey/mkey2.c (revision 12300)
1*12300Stut #ifndef lint
2*12300Stut static char *sccsid = "@(#)mkey2.c	4.1 (Berkeley) 05/06/83";
3*12300Stut #endif
4*12300Stut 
5*12300Stut #include <stdio.h>
6*12300Stut #include <ctype.h>
7*12300Stut #define MAXLINE 500
8*12300Stut 
9*12300Stut static int eof = 0;
10*12300Stut static long lp, lim;
11*12300Stut static int alph, used, prevc;
12*12300Stut static char *p, key[20];
13*12300Stut 
14*12300Stut dofile(f, name)
15*12300Stut FILE *f;
16*12300Stut char *name;
17*12300Stut {
18*12300Stut 	/* read file f & spit out keys & ptrs */
19*12300Stut 
20*12300Stut 	char line[MAXLINE], *s;
21*12300Stut 	extern int minlen, keycount, labels;
22*12300Stut 	int c;
23*12300Stut 	long grec();
24*12300Stut 	extern int wholefile;
25*12300Stut 	extern char *iglist;
26*12300Stut 	alph=used=prevc=eof=0;
27*12300Stut 
28*12300Stut 	lp=0;
29*12300Stut 	if (wholefile==0)
30*12300Stut 		while (lim = grec(line,f))
31*12300Stut 		{
32*12300Stut # if D1
33*12300Stut 			fprintf(stderr, "line: /%s",line);
34*12300Stut # endif
35*12300Stut 			used=alph=0;
36*12300Stut 			p = key;
37*12300Stut 			for(s=line; (c= *s) && (used<keycount); s++)
38*12300Stut 				chkey(c, name);
39*12300Stut 			lp += lim;
40*12300Stut 			if (used) putchar('\n');
41*12300Stut 		}
42*12300Stut 	else
43*12300Stut 	{
44*12300Stut 		p=key;
45*12300Stut 		used=alph=0;
46*12300Stut 		while ( (c=getc(f)) != EOF && used<keycount)
47*12300Stut 			chkey (c, name);
48*12300Stut 		if (used) putchar('\n');
49*12300Stut 	}
50*12300Stut 	fclose(f);
51*12300Stut }
52*12300Stut 
53*12300Stut outkey( ky, lead, trail)
54*12300Stut char *ky;
55*12300Stut {
56*12300Stut 	int n;
57*12300Stut 	n = strlen(ky);
58*12300Stut 	if (n<minlen) return (0);
59*12300Stut 	if (n<3)
60*12300Stut 	{
61*12300Stut 		if (trail == '.') return(0);
62*12300Stut 		if (mindex(".%,!#$%&'();+:*", lead)!=0) return(0);
63*12300Stut 	}
64*12300Stut 	if (isdigit(ky[0]))
65*12300Stut 		if (ky[0] != '1' || ky[1] != '9' || n!= 4) return(0);
66*12300Stut 	if (common(ky))
67*12300Stut 		return(0);
68*12300Stut 	return(1);
69*12300Stut }
70*12300Stut 
71*12300Stut long
72*12300Stut grec (s, f)
73*12300Stut char *s;
74*12300Stut FILE *f;
75*12300Stut {
76*12300Stut 	char tm[200];
77*12300Stut 	int curtype = 0;
78*12300Stut 	long len = 0L, tlen = 0L;
79*12300Stut 	extern int wholefile;
80*12300Stut 	if (eof) return(0);
81*12300Stut 	*s = 0;
82*12300Stut 	while (fgets(tm, 200, f))
83*12300Stut 	{
84*12300Stut 		tlen += strlen(tm);
85*12300Stut 		if (tm[0] == '%' || tm[0] == '.')
86*12300Stut 			curtype = tm[1];
87*12300Stut 		if (tlen < MAXLINE && mindex(iglist,curtype)==0)
88*12300Stut 			strcat(s, tm);
89*12300Stut 		len = tlen;
90*12300Stut 		if (wholefile==0 && tm[0] == '\n')
91*12300Stut 			return(len);
92*12300Stut 		if (wholefile>0 && len >= MAXLINE)
93*12300Stut 		{
94*12300Stut 			fseek (f, 0L, 2);
95*12300Stut 			return(ftell(f));
96*12300Stut 		}
97*12300Stut 	}
98*12300Stut 	eof=1;
99*12300Stut 	return(s[0] ? len : 0L);
100*12300Stut }
101*12300Stut 
102*12300Stut char *
103*12300Stut trimnl(ln)
104*12300Stut char *ln;
105*12300Stut {
106*12300Stut 	register char *p = ln;
107*12300Stut 	while (*p) p++;
108*12300Stut 	p--;
109*12300Stut 	if (*p == '\n') *p=0;
110*12300Stut 	return(ln);
111*12300Stut }
112*12300Stut 
113*12300Stut chkey (c, name)
114*12300Stut {
115*12300Stut 	if (isalpha(c) || isdigit(c))
116*12300Stut 	{
117*12300Stut 		if (alph++ < 6)
118*12300Stut 			*p++ = c;
119*12300Stut 	}
120*12300Stut 	else
121*12300Stut 	{
122*12300Stut 		*p = 0;
123*12300Stut 		for(p=key; *p; p++)
124*12300Stut 			*p |= 040;
125*12300Stut 		if (outkey(p=key,prevc,c))
126*12300Stut 		{
127*12300Stut 			if (used==0)
128*12300Stut 			{
129*12300Stut 				if (labels)
130*12300Stut 				{
131*12300Stut 					if (wholefile==0)
132*12300Stut 						printf("%s:%ld,%ld\t", name, lp, lim);
133*12300Stut 					else
134*12300Stut 						printf("%s\t", name);
135*12300Stut 				}
136*12300Stut 			}
137*12300Stut 			else
138*12300Stut 				putchar(' ');
139*12300Stut 			fputs(key, stdout);
140*12300Stut 			used++;
141*12300Stut 		}
142*12300Stut 		prevc=c;
143*12300Stut 		alph=0;
144*12300Stut 	}
145*12300Stut }
146