# include "stdio.h" # include "ctype.h" # include "mkey.h" static int eof = 0; static long lp, lim; static int alph, used, prevc; static char *p, key[100]; extern int minlen, keycount, labels, wholefile; extern char *iglist; void dofile(FILE *f, char *name) { /* read file f & spit out keys & ptrs */ char line[MAXLINE], *s; int c; 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); } int outkey(char *ky, int lead, int trail) { int n; 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])) if (ky[0] != '1' || (ky[1] != '9' && ky[1] != '8') || n != 4) return 0; if (common(ky)) return 0; return 1; } long grec(char *s, FILE *f) { char tm[MAXLINE]; int curtype = 0; long len = 0L, tlen = 0L; extern int wholefile; int lineno = 0; if (eof) return 0; *s = 0; while (fgets(tm, MAXLINE, f)) { int i, allblank = 1; int tmlen = strlen(tm); lineno++; if (tmlen == MAXLINE - 1 && tm[MAXLINE - 2] != '\n') { fprintf(stderr, "mkey: line %d too long\n", lineno); exit(1); } tlen += tmlen; if (tm[0] == '%' || tm[0] == '.') curtype = tm[1]; if (tlen < MAXLINE && mindex(iglist, curtype) == 0) strcat(s, tm); len = tlen; for (i = 0; allblank && tm[i] != '\n'; i++) if (!isspace(tm[i])) allblank = 0; if (wholefile == 0 && allblank && len > 0) return len; if (wholefile > 0 && len >= MAXLINE) { fseek(f, 0L, 2); return ftell(f); } } eof = 1; return s[0] ? len : 0L; } void chkey(int c, char *name) { if ((isalpha(c) || isdigit(c)) && prevc != '\\') { if (alph++ < 6) *p++ = c; } else { *p = 0; for (p = key; *p; p++) if (isupper(*p)) *p = _tolower(*p); 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); if (ferror(stdout)) err("error writing out keys"); used++; } prevc = c; alph = 0; } }