1/*
2 * Copyright 2005 Sun Microsystems, Inc.  All rights reserved.
3 * Use is subject to license terms.
4 */
5
6/*	Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T	*/
7/*	  All Rights Reserved  	*/
8
9/*
10 * Copyright (c) 1980 Regents of the University of California.
11 * All rights reserved. The Berkeley software License Agreement
12 * specifies the terms and conditions for redistribution.
13 */
14
15#pragma ident	"%Z%%M%	%I%	%E% SMI"
16
17#include <stdio.h>
18#include <ctype.h>
19#define	MAXLINE 500
20
21static int eof = 0;
22static long lp, lim;
23static int alph, used, prevc;
24static char *p, key[20];
25
26extern int common();
27extern char *mindex();
28
29static void chkey(int, char *);
30static long grec(char *, FILE *);
31
32void
33dofile(FILE *f, char *name)
34{
35	/* read file f & spit out keys & ptrs */
36
37	char line[MAXLINE], *s;
38	extern int minlen, keycount, labels;
39	int c;
40	extern int wholefile;
41	extern char *iglist;
42	alph = used = prevc = eof = 0;
43
44	lp = 0;
45	if (wholefile == 0) {
46		while (lim = grec(line, f)) {
47#if D1
48			fprintf(stderr, "line: /%s", line);
49#endif
50			used = alph = 0;
51			p = key;
52			for (s = line; (c = *s) && (used < keycount); s++)
53				chkey(c, name);
54			lp += lim;
55			if (used) putchar('\n');
56		}
57	} else {
58		p = key;
59		used = alph = 0;
60		while ((c = getc(f)) != EOF && used < keycount)
61			chkey(c, name);
62		if (used) putchar('\n');
63	}
64	fclose(f);
65}
66
67static int
68outkey(char *ky, int lead, int trail)
69{
70	int n;
71	extern int minlen;
72	n = strlen(ky);
73	if (n < minlen)
74		return (0);
75	if (n < 3) {
76		if (trail == '.')
77			return (0);
78		if (mindex(".%,!#$%&'();+:*", lead) != 0)
79			return (0);
80	}
81	if (isdigit(ky[0]))
82		/* Allow years 1000 - 2099 */
83		if (!(ky[0] == '1' || (ky[0] == '2' && ky[1] == '0')) || n != 4)
84			return (0);
85	if (common(ky))
86		return (0);
87	return (1);
88}
89
90static long
91grec(char *s, FILE *f)
92{
93	char tm[200];
94	int curtype = 0;
95	long len = 0L, tlen = 0L;
96	extern int wholefile;
97	extern char *iglist;
98	if (eof)
99		return (0);
100	*s = 0;
101	while (fgets(tm, 200, f)) {
102		tlen += strlen(tm);
103		if (tm[0] == '%' || tm[0] == '.')
104			curtype = tm[1];
105		if (tlen < MAXLINE && mindex(iglist, curtype) == 0)
106			strcat(s, tm);
107		len = tlen;
108		if (wholefile == 0 && tm[0] == '\n')
109			return (len);
110		if (wholefile > 0 && len >= MAXLINE) {
111			fseek(f, 0L, 2);
112			return (ftell(f));
113		}
114	}
115	eof = 1;
116	return (s[0] ? len : 0L);
117}
118
119char *
120trimnl(char *ln)
121{
122	char *p = ln;
123	while (*p) p++;
124	p--;
125	if (*p == '\n') *p = 0;
126	return (ln);
127}
128
129static void
130chkey(int c, char *name)
131{
132	extern int labels;
133	extern int wholefile;
134	if (isalpha(c) || isdigit(c)) {
135		if (alph++ < 6)
136			*p++ = c;
137	} else {
138		*p = 0;
139		for (p = key; *p; p++)
140			*p |= 040;
141		if (outkey(p = key, prevc, c)) {
142			if (used == 0) {
143				if (labels) {
144					if (wholefile == 0)
145						printf("%s:%ld,%ld\t", name,
146						    lp, lim);
147					else
148						printf("%s\t", name);
149				}
150			} else
151				putchar(' ');
152			fputs(key, stdout);
153			used++;
154		}
155		prevc = c;
156		alph = 0;
157	}
158}
159