|
|
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,"namelook1: 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,"namelook1: 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: for(;;) { ! 102: mid++; ! 103: if(getc(dfile)!='%') ! 104: continue; ! 105: mid++; ! 106: if(getc(dfile)!='8') ! 107: continue; ! 108: break; ! 109: } ! 110: /*printf("%ld %ld %ld\n",bot,mid,top);*/ ! 111: if(!getword(entry)) ! 112: break; ! 113: canon(entry,word); ! 114: switch((*compare)(key,word)) { ! 115: case -2: ! 116: case -1: ! 117: case 0: ! 118: if(top<=mid) ! 119: break; ! 120: top = mid; ! 121: continue; ! 122: case 1: ! 123: case 2: ! 124: bot = mid; ! 125: continue; ! 126: } ! 127: break; ! 128: } ! 129: fseek(dfile,bot,0); ! 130: while(getword(entry)) { ! 131: canon(entry,word); ! 132: switch((*compare)(key,word)) { ! 133: case -2: ! 134: return(0); ! 135: case -1: ! 136: if(exact) ! 137: return(0); ! 138: case 0: ! 139: return(1); ! 140: case 1: ! 141: case 2: ! 142: for(;;) { ! 143: c = getc(dfile); ! 144: if(c==EOF) ! 145: return 0; ! 146: if(c!='%') ! 147: continue; ! 148: if(getc(dfile)!='8') ! 149: continue; ! 150: getc(dfile); ! 151: break; ! 152: } ! 153: continue; ! 154: } ! 155: } ! 156: return(0); ! 157: } ! 158: ! 159: /* acomp(s,t) returns -2 if s strictly precedes t ! 160: -1 if s is a prefix of t ! 161: 0 if s is the same as t ! 162: 1 if t is a prefix of s ! 163: 2 if t strictly precedes s ! 164: */ ! 165: ! 166: acomp(s,t) ! 167: register char *s,*t; ! 168: { ! 169: /*printf("<%s %s\n", s,t);*/ ! 170: for(;*s==*t;s++,t++) ! 171: if(*s==0) ! 172: return(0); ! 173: return(*s==0? -1: ! 174: *t==0? 1: ! 175: *s<*t? -2: ! 176: 2); ! 177: } ! 178: ! 179: getword(w) ! 180: char *w; ! 181: { ! 182: register c; ! 183: for(;;) { ! 184: c = getc(dfile); ! 185: if(c==EOF) ! 186: return(0); ! 187: if(c=='\n') ! 188: break; ! 189: *w++ = c; ! 190: } ! 191: *w = 0; ! 192: return(1); ! 193: } ! 194: ! 195: put(entry, ifile, ofile) ! 196: char *entry; ! 197: FILE *ofile, *ifile; ! 198: { ! 199: char buffer[200]; ! 200: int i; ! 201: fprintf(ofile, "%s\n", entry); ! 202: for(i=0; i<2; ) { ! 203: fgets(buffer,sizeof(buffer)-1,ifile); ! 204: fputs(buffer, ofile); ! 205: i = *buffer=='\n'? i+1: 0; ! 206: } ! 207: fflush(ofile); ! 208: } ! 209: ! 210: canon(old,new) ! 211: char *old,*new; ! 212: { ! 213: register c; ! 214: char *savo = old, *savn = new; ! 215: for(;;) { ! 216: *new = c = *old++; ! 217: if(c==0 || c==' ' && *old=='%') ! 218: break; ! 219: if(!isalpha(c)) ! 220: continue; ! 221: if(isupper(c)) ! 222: *new += 'a' - 'A'; ! 223: new++; ! 224: } ! 225: *new = 0; ! 226: /*printf(">%s %s\n",savo,savn);*/ ! 227: } ! 228: ! 229: char * ! 230: ggets(s,n,f) ! 231: char *s; ! 232: FILE *f; ! 233: { ! 234: char *p = fgets(s,n,f); ! 235: char *q; ! 236: if(p && (q=strchr(s,'\n'))) ! 237: *q = 0; ! 238: return p; ! 239: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.