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