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