|
|
1.1 ! root 1: #include <stdio.h> ! 2: #include <ctype.h> ! 3: ! 4: #define DICT "/usr/dict/words" ! 5: ! 6: char *filename = DICT; ! 7: FILE *dfile; ! 8: ! 9: int fold; ! 10: int direc; ! 11: int exact; ! 12: int iflag; ! 13: int rev = 1; /*-1 for reverse-ordered file, not implemented*/ ! 14: int acomp(); ! 15: int ncomp(); ! 16: int (*compare)() = acomp; ! 17: int tab; ! 18: char entry[250]; ! 19: char word[250]; ! 20: char key[50]; ! 21: ! 22: main(argc,argv) ! 23: char **argv; ! 24: { ! 25: char *arg; ! 26: while(argc>=2 && *argv[1]=='-') { ! 27: for(arg=argv[1];;arg++) { ! 28: switch(arg[1]) { ! 29: case 'd': ! 30: direc++; ! 31: continue; ! 32: case 'f': ! 33: fold++; ! 34: continue; ! 35: case 'i': ! 36: iflag++; ! 37: continue; ! 38: case 'n': ! 39: compare = ncomp; ! 40: continue; ! 41: case 't': ! 42: tab = arg[2]; ! 43: if(tab) ! 44: ++arg; ! 45: continue; ! 46: case 'x': ! 47: exact++; ! 48: continue; ! 49: case 0: ! 50: break; ! 51: default: ! 52: fprintf(stderr,"look: bad option %s\n",arg); ! 53: return(2); ! 54: } ! 55: break; ! 56: } ! 57: argc --; ! 58: argv++; ! 59: } ! 60: if(!iflag) { ! 61: if(argc<2) ! 62: iflag++; ! 63: else { ! 64: canon(argv[1],key); ! 65: argv++; ! 66: argc--; ! 67: } ! 68: } ! 69: if(argc>=2) ! 70: filename = argv[1]; ! 71: else { ! 72: direc++; ! 73: fold++; ! 74: } ! 75: dfile = fopen(filename,"r"); ! 76: if(dfile==NULL) { ! 77: fprintf(stderr,"look: can't open %s\n",filename); ! 78: return(2); ! 79: } ! 80: if(!iflag) { ! 81: if(locate(key,entry)==0) ! 82: return(1); ! 83: } ! 84: do { ! 85: if(iflag) { ! 86: if(gets(entry)==0) ! 87: return(0); ! 88: canon(entry,key); ! 89: if(locate(key,entry)==0) ! 90: continue; ! 91: } ! 92: puts(entry,stdout); ! 93: while(getword(entry)) { ! 94: canon(entry,word); ! 95: switch((*compare)(key,word)) { ! 96: case -1: ! 97: if(exact) ! 98: break; ! 99: case 0: ! 100: puts(entry,stdout); ! 101: continue; ! 102: } ! 103: break; ! 104: } ! 105: } while(iflag); ! 106: return(0); ! 107: ! 108: } ! 109: ! 110: locate(key,entry) ! 111: char *key; ! 112: { ! 113: long top,bot,mid; ! 114: register c; ! 115: bot = 0; ! 116: fseek(dfile,0L,2); ! 117: top = ftell(dfile); ! 118: for(;;) { ! 119: mid = (top+bot)/2; ! 120: fseek(dfile,mid,0); ! 121: do { ! 122: c = getc(dfile); ! 123: mid++; ! 124: } while(c!=EOF && c!='\n'); ! 125: if(!getword(entry)) ! 126: break; ! 127: canon(entry,word); ! 128: switch((*compare)(key,word)) { ! 129: case -2: ! 130: case -1: ! 131: case 0: ! 132: if(top<=mid) ! 133: break; ! 134: top = mid; ! 135: continue; ! 136: case 1: ! 137: case 2: ! 138: bot = mid; ! 139: continue; ! 140: } ! 141: break; ! 142: } ! 143: fseek(dfile,bot,0); ! 144: while(getword(entry)) { ! 145: canon(entry,word); ! 146: switch((*compare)(key,word)) { ! 147: case -2: ! 148: return(0); ! 149: case -1: ! 150: if(exact) ! 151: return(0); ! 152: case 0: ! 153: return(1); ! 154: case 1: ! 155: case 2: ! 156: continue; ! 157: } ! 158: } ! 159: return(0); ! 160: } ! 161: ! 162: /* acomp(s,t) returns -2 if s strictly precedes t ! 163: -1 if s is a prefix of t ! 164: 0 if s is the same as t ! 165: 1 if t is a prefix of s ! 166: 2 if t strictly precedes s ! 167: */ ! 168: ! 169: acomp(s,t) ! 170: register char *s,*t; ! 171: { ! 172: for(;*s==*t;s++,t++) ! 173: if(*s==0) ! 174: return(0); ! 175: return(*s==0? -1: ! 176: *t==0? 1: ! 177: *s<*t? -2: ! 178: 2); ! 179: } ! 180: ! 181: getword(w) ! 182: char *w; ! 183: { ! 184: register c; ! 185: for(;;) { ! 186: c = getc(dfile); ! 187: if(c==EOF) ! 188: return(0); ! 189: if(c=='\n') ! 190: break; ! 191: *w++ = c; ! 192: } ! 193: *w = 0; ! 194: return(1); ! 195: } ! 196: ! 197: canon(old,new) ! 198: char *old,*new; ! 199: { ! 200: register c; ! 201: /* printf(">%s\n",old); */ ! 202: for(;;) { ! 203: *new = c = *old++; ! 204: if(c==0||c==tab) { ! 205: *new = 0; ! 206: break; ! 207: } ! 208: if(direc) { ! 209: if(!isalnum(c)) ! 210: continue; ! 211: } ! 212: if(fold) { ! 213: if(isupper(c)) ! 214: *new += 'a' - 'A'; ! 215: } ! 216: new++; ! 217: } ! 218: } ! 219: ! 220: ncomp(s,t) ! 221: register char *s, *t; ! 222: { ! 223: char *is, *it, *js, *jt; ! 224: int a, b; ! 225: int ssgn, tsgn; ! 226: while(isspace(*s)) ! 227: s++; ! 228: while(isspace(*t)) ! 229: t++; ! 230: ssgn = tsgn = -2*rev; ! 231: if(*s == '-') { ! 232: s++; ! 233: ssgn = -ssgn; ! 234: } ! 235: if(*t == '-') { ! 236: t++; ! 237: tsgn = -tsgn; ! 238: } ! 239: for(is = s; isdigit(*is); is++) ; ! 240: for(it = t; isdigit(*it); it++) ; ! 241: js = is; ! 242: jt = it; ! 243: a = 0; ! 244: if(ssgn==tsgn) ! 245: while(it>t && is>s) ! 246: if(b = *--it - *--is) ! 247: a = b; ! 248: while(is > s) ! 249: if(*--is != '0') ! 250: return(-ssgn); ! 251: while(it > t) ! 252: if(*--it != '0') ! 253: return(tsgn); ! 254: if(a) return(sgn(a)*ssgn); ! 255: if(*(s=js) == '.') ! 256: s++; ! 257: if(*(t=jt) == '.') ! 258: t++; ! 259: if(ssgn==tsgn) ! 260: while(isdigit(*s) && isdigit(*t)) ! 261: if(a = *t++ - *s++) ! 262: return(sgn(a)*ssgn); ! 263: while(isdigit(*s)) ! 264: if(*s++ != '0') ! 265: return(-ssgn); ! 266: while(isdigit(*t)) ! 267: if(*t++ != '0') ! 268: return(tsgn); ! 269: return(0); ! 270: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.