|
|
1.1 ! root 1: #include <stdio.h> ! 2: #include <ctype.h> ! 3: extern char *ggets(), *fgets(), *strchr(); ! 4: ! 5: #define DICT "/s5/hanks/hanks2" ! 6: ! 7: char *filename = DICT; ! 8: FILE *dfile; ! 9: ! 10: int exact; ! 11: int iflag; ! 12: int acomp(); ! 13: int (*compare)() = acomp; ! 14: char *strchr(); ! 15: int tab = 0374; ! 16: char entry[250]; ! 17: char word[250]; ! 18: char key[50]; ! 19: ! 20: main(argc,argv) ! 21: char **argv; ! 22: { ! 23: char *arg; ! 24: while(argc>=2 && *argv[1]=='-') { ! 25: for(arg=argv[1];;arg++) { ! 26: switch(arg[1]) { ! 27: case 'i': ! 28: iflag++; ! 29: continue; ! 30: case 'x': ! 31: exact++; ! 32: continue; ! 33: case 0: ! 34: break; ! 35: default: ! 36: fprintf(stderr,"namelook: bad option %s\n",arg); ! 37: return(2); ! 38: } ! 39: break; ! 40: } ! 41: argc --; ! 42: argv++; ! 43: } ! 44: if(!iflag) { ! 45: if(argc<2) ! 46: iflag++; ! 47: else { ! 48: canon(argv[1],key); ! 49: argv++; ! 50: argc--; ! 51: } ! 52: } ! 53: if(argc>=2) ! 54: filename = argv[1]; ! 55: dfile = fopen(filename,"r"); ! 56: if(dfile==NULL) { ! 57: fprintf(stderr,"namelook: can't open %s\n",filename); ! 58: return(2); ! 59: } ! 60: if(!iflag) { ! 61: if(locate(key,entry)==0) ! 62: return(1); ! 63: } ! 64: do { ! 65: if(iflag) { ! 66: if(ggets(entry,sizeof entry,stdin)==0) ! 67: return(0); ! 68: canon(entry,key); ! 69: if(locate(key,entry)==0) ! 70: continue; ! 71: } ! 72: put(entry,dfile,stdout); ! 73: while(getword(entry)) { ! 74: canon(entry,word); ! 75: switch((*compare)(key,word)) { ! 76: case -1: ! 77: if(exact) ! 78: break; ! 79: case 0: ! 80: put(entry,dfile,stdout); ! 81: continue; ! 82: } ! 83: break; ! 84: } ! 85: } while(iflag); ! 86: return(0); ! 87: ! 88: } ! 89: ! 90: locate(key,entry) ! 91: char *key,*entry; ! 92: { ! 93: long top,bot,mid; ! 94: register c; ! 95: bot = 0; ! 96: fseek(dfile,0L,2); ! 97: top = ftell(dfile); ! 98: for(;;) { ! 99: mid = (top+bot)/2; ! 100: fseek(dfile,mid,0); ! 101: do { ! 102: c = getc(dfile); ! 103: mid++; ! 104: } while(c!=EOF && c!='\n'); ! 105: /*printf("%ld %ld %ld\n",bot,mid,top);*/ ! 106: if(!getword(entry)) ! 107: break; ! 108: canon(entry,word); ! 109: switch((*compare)(key,word)) { ! 110: case -2: ! 111: case -1: ! 112: case 0: ! 113: if(top<=mid) ! 114: break; ! 115: top = mid; ! 116: continue; ! 117: case 1: ! 118: case 2: ! 119: bot = mid; ! 120: continue; ! 121: } ! 122: break; ! 123: } ! 124: fseek(dfile,bot,0); ! 125: while(getword(entry)) { ! 126: canon(entry,word); ! 127: switch((*compare)(key,word)) { ! 128: case -2: ! 129: return(0); ! 130: case -1: ! 131: if(exact) ! 132: return(0); ! 133: case 0: ! 134: return(1); ! 135: case 1: ! 136: case 2: ! 137: continue; ! 138: } ! 139: } ! 140: return(0); ! 141: } ! 142: ! 143: /* acomp(s,t) returns -2 if s strictly precedes t ! 144: -1 if s is a prefix of t ! 145: 0 if s is the same as t ! 146: 1 if t is a prefix of s ! 147: 2 if t strictly precedes s ! 148: */ ! 149: ! 150: acomp(s,t) ! 151: register char *s,*t; ! 152: { ! 153: /*printf("<%s %s\n", s,t);*/ ! 154: for(;*s==*t;s++,t++) ! 155: if(*s==0) ! 156: return(0); ! 157: return(*s==0? -1: ! 158: *t==0? 1: ! 159: *s<*t? -2: ! 160: 2); ! 161: } ! 162: ! 163: getword(w) ! 164: char *w; ! 165: { ! 166: register c; ! 167: for(;;) { ! 168: c = getc(dfile); ! 169: if(c==EOF) ! 170: return(0); ! 171: if(c=='\n') ! 172: break; ! 173: *w++ = c; ! 174: } ! 175: *w = 0; ! 176: return(1); ! 177: } ! 178: ! 179: put(entry, ifile, ofile) ! 180: char *entry; ! 181: FILE *ofile, *ifile; ! 182: { ! 183: char *p = strchr(entry+1, '%'); ! 184: fprintf(ofile,"%s\n", p? p: entry); ! 185: fflush(ofile); ! 186: } ! 187: ! 188: canon(old,new) ! 189: unsigned char *old,*new; ! 190: { ! 191: register c; ! 192: unsigned char *savo = old, *savn = new; ! 193: for(;;) { ! 194: *new = c = *old++; ! 195: if(c==0 || c==' ' && *old=='%') ! 196: break; ! 197: if(!isalpha(c)) ! 198: continue; ! 199: if(isupper(c)) ! 200: *new += 'a' - 'A'; ! 201: new++; ! 202: } ! 203: *new = 0; ! 204: /*printf(">%s %s\n",savo,savn);*/ ! 205: } ! 206: ! 207: char * ! 208: ggets(s,n,f) ! 209: char *s; ! 210: FILE *f; ! 211: { ! 212: char *p = fgets(s,n,f); ! 213: char *q; ! 214: if(p && (q=strchr(s,'\n'))) ! 215: *q = 0; ! 216: return p; ! 217: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.