/* * Copyright 2005 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ /* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */ /* All Rights Reserved */ /* * Copyright (c) 1980 Regents of the University of California. * All rights reserved. The Berkeley software License Agreement * specifies the terms and conditions for redistribution. */ #pragma ident "%Z%%M% %I% %E% SMI" #include #include #define MAXLINE 500 static int eof = 0; static long lp, lim; static int alph, used, prevc; static char *p, key[20]; extern int common(); extern char *mindex(); static void chkey(int, char *); static long grec(char *, FILE *); void dofile(FILE *f, char *name) { /* read file f & spit out keys & ptrs */ char line[MAXLINE], *s; extern int minlen, keycount, labels; int c; extern int wholefile; extern char *iglist; alph = used = prevc = eof = 0; lp = 0; if (wholefile == 0) { while (lim = grec(line, f)) { #if D1 fprintf(stderr, "line: /%s", line); #endif used = alph = 0; p = key; for (s = line; (c = *s) && (used < keycount); s++) chkey(c, name); lp += lim; if (used) putchar('\n'); } } else { p = key; used = alph = 0; while ((c = getc(f)) != EOF && used < keycount) chkey(c, name); if (used) putchar('\n'); } fclose(f); } static int outkey(char *ky, int lead, int trail) { int n; extern int minlen; n = strlen(ky); if (n < minlen) return (0); if (n < 3) { if (trail == '.') return (0); if (mindex(".%,!#$%&'();+:*", lead) != 0) return (0); } if (isdigit(ky[0])) /* Allow years 1000 - 2099 */ if (!(ky[0] == '1' || (ky[0] == '2' && ky[1] == '0')) || n != 4) return (0); if (common(ky)) return (0); return (1); } static long grec(char *s, FILE *f) { char tm[200]; int curtype = 0; long len = 0L, tlen = 0L; extern int wholefile; extern char *iglist; if (eof) return (0); *s = 0; while (fgets(tm, 200, f)) { tlen += strlen(tm); if (tm[0] == '%' || tm[0] == '.') curtype = tm[1]; if (tlen < MAXLINE && mindex(iglist, curtype) == 0) strcat(s, tm); len = tlen; if (wholefile == 0 && tm[0] == '\n') return (len); if (wholefile > 0 && len >= MAXLINE) { fseek(f, 0L, 2); return (ftell(f)); } } eof = 1; return (s[0] ? len : 0L); } char * trimnl(char *ln) { char *p = ln; while (*p) p++; p--; if (*p == '\n') *p = 0; return (ln); } static void chkey(int c, char *name) { extern int labels; extern int wholefile; if (isalpha(c) || isdigit(c)) { if (alph++ < 6) *p++ = c; } else { *p = 0; for (p = key; *p; p++) *p |= 040; if (outkey(p = key, prevc, c)) { if (used == 0) { if (labels) { if (wholefile == 0) printf("%s:%ld,%ld\t", name, lp, lim); else printf("%s\t", name); } } else putchar(' '); fputs(key, stdout); used++; } prevc = c; alph = 0; } }