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