|
|
1.1 ! root 1: # include <stdio.h> ! 2: # include <ctype.h> ! 3: # include <assert.h> ! 4: char *dictdir = "/usr/dict/w7full"; ! 5: extern char *ggets(), *fgets(), *strchr(), *getenv(); ! 6: int debug=0; ! 7: ! 8: main(argc,argv) ! 9: char *argv[]; ! 10: { ! 11: char ln[100]; ! 12: char *dict = getenv("W7DIR"); ! 13: if(dict==0) ! 14: dict = dictdir; ! 15: assert( chdir(dict) == NULL); ! 16: argc--; argv++; ! 17: while (argc>0 && argv[0][0]=='-') { ! 18: switch (argv[0][1]) ! 19: { ! 20: case 'd': debug++; break; ! 21: } ! 22: argc--; argv++; ! 23: } ! 24: if (argc<=0) { ! 25: while (ggets(ln,sizeof ln,stdin)) ! 26: lookup(ln); ! 27: } ! 28: while (argc-- >0) ! 29: lookup(*argv++); ! 30: } ! 31: ! 32: lcase (s) ! 33: char *s; ! 34: { ! 35: for (; *s; s++) ! 36: if (isupper(*s)) ! 37: *s = tolower(*s); ! 38: } ! 39: ! 40: FILE *desc[26]; ! 41: ! 42: lookup (wd) ! 43: char *wd; ! 44: { ! 45: int ilet, yet, ks; ! 46: char fn[10], dbuff[300], wdb[50], xbuff[300]; ! 47: FILE *fd; ! 48: while(*wd && isascii(*wd) && isspace(*wd)) ! 49: wd++; ! 50: if(*wd == 0) ! 51: return; ! 52: scnobl(wdb, wd); wd=wdb; ! 53: lcase(wd); ! 54: ccut(wd); ! 55: ilet = *wd; ! 56: assert (ilet>='a' && ilet <= 'z'); ! 57: sprintf(fn, "D%c", ilet); ! 58: if (desc[ilet-'a']==0) ! 59: desc[ilet-'a'] = fd = fopen(fn, "r"); ! 60: else ! 61: fd = desc[ilet-'a']; ! 62: if (fd==NULL) { ! 63: fprintf(stderr, "Too many files open: %s\n", wd); ! 64: return; ! 65: } ! 66: binpos (fd, wd); ! 67: yet=0; ! 68: while (fgets(dbuff, 300, fd)) { ! 69: if (dbuff[0]=='F' && dbuff[1]==';') { ! 70: scnobl(xbuff, dbuff+2); ! 71: lcase(xbuff); ! 72: ccut(xbuff); ! 73: ks = scomp(xbuff, wd); ! 74: if(debug)fprintf(stderr, "xbuff %s wd %s ks %d\n",xbuff,wd,ks); ! 75: if (ks>0) ! 76: break; ! 77: if (ks==0) yet=1; ! 78: } ! 79: if (yet>0) dump(dbuff); ! 80: } ! 81: } ! 82: ! 83: dump(s) ! 84: char *s; ! 85: { ! 86: char *p; ! 87: if (isupper(s[0]) && s[1]==';') ! 88: s++; ! 89: for(p=s; *p; p++) ! 90: if (*p==';') ! 91: *p=' '; ! 92: fputs(s,stdout); ! 93: } ! 94: ! 95: scomp( dl, wd) ! 96: char *dl, *wd; ! 97: { ! 98: int n, k; ! 99: char t1[100], t2[100]; ! 100: scnobl(t1, dl); ! 101: dl=t1; ! 102: scnobl(t2, wd); ! 103: wd=t2; ! 104: n = strlen(wd); ! 105: k = strncmp(dl, wd,n); ! 106: if (k==0 && (dl[n]==0 || dl[n]==';')) ! 107: return(0); ! 108: return(k==0? 1: k); ! 109: } ! 110: ! 111: scnobl(s, t) ! 112: char *s, *t; ! 113: { ! 114: while (*t) { ! 115: if (*t!=' ') ! 116: *s++ = *t; ! 117: t++; ! 118: } ! 119: *s=0; ! 120: } ! 121: ! 122: binpos(f, word) ! 123: char *word; ! 124: FILE *f; ! 125: { ! 126: long top, bot, mid; ! 127: int k, c, oc, ooc; ! 128: char line[100]; ! 129: bot=0; ! 130: fseek(f, 0L, 2); ! 131: top = ftell(f); ! 132: for (;;) { ! 133: mid = (top+bot)/2; ! 134: fseek(f, mid, 0); ! 135: oc=getc(f); ! 136: c=getc(f); ! 137: mid+=2; ! 138: do { ! 139: ooc=oc; ! 140: oc=c; ! 141: c = getc(f); ! 142: mid++; ! 143: } while (c!=EOF && ( c!='F' || oc!='\n' || ooc=='#')); ! 144: if (fgets(line, 50, f)==NULL) ! 145: break; ! 146: lcase(line); ! 147: if (debug) fprintf(stderr, " bot %ld mid %ld top %ld line %s", bot,mid,top,line); ! 148: ccut(line+1); ! 149: k = scomp(word, line+1); ! 150: if(debug) fprintf(stderr, " k %d\n",k); ! 151: if (k<=0) { ! 152: if (top<=mid) ! 153: break; ! 154: top = mid; ! 155: continue; ! 156: } else { ! 157: bot= mid; ! 158: continue; ! 159: } ! 160: } ! 161: fseek(f, bot, 0); ! 162: if (bot!=0) ! 163: while ( (c=getc(f)) != '\n' && c!= EOF); ! 164: } ! 165: ! 166: ccut(s) ! 167: char *s; ! 168: { ! 169: char x[100], *p, *y; ! 170: y=s; ! 171: for(p=x; *s && *s!=';'; s++) ! 172: if (!strchr("-'^`{}:,.~", *s)) ! 173: *p++ = *s; ! 174: *p=0; ! 175: strcpy(y, x); ! 176: } ! 177: ! 178: char * ! 179: ggets(s,n,f) ! 180: char *s; ! 181: FILE *f; ! 182: { ! 183: char *p = fgets(s,n,f); ! 184: char *q; ! 185: if(p && (q=strchr(s,'\n'))) ! 186: *q = 0; ! 187: return p; ! 188: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.