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
21 static int eof = 0;
22 static long lp, lim;
23 static int alph, used, prevc;
24 static char *p, key[20];
25
26 extern int common();
27 extern char *mindex();
28
29 static void chkey(int, char *);
30 static long grec(char *, FILE *);
31
32 void
dofile(FILE * f,char * name)33 dofile(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
67 static int
outkey(char * ky,int lead,int trail)68 outkey(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
90 static long
grec(char * s,FILE * f)91 grec(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
119 char *
trimnl(char * ln)120 trimnl(char *ln)
121 {
122 char *p = ln;
123 while (*p) p++;
124 p--;
125 if (*p == '\n') *p = 0;
126 return (ln);
127 }
128
129 static void
chkey(int c,char * name)130 chkey(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