home *** CD-ROM | disk | FTP | other *** search
- #include <stdio.h>
- #include <ctype.h>
-
- FILE *dfile;
- char *filenam = "/usr/dict/words";
-
- int fold;
- int dict;
- int tab;
- char entry[250];
- char word[250];
- char key[50];
-
- main(argc,argv)
- char **argv;
- {
- register c;
- long top,bot,mid;
- while(argc>=2 && *argv[1]=='-') {
- for(;;) {
- switch(*++argv[1]) {
- case 'd':
- dict++;
- continue;
- case 'f':
- fold++;
- continue;
- case 't':
- tab = argv[1][1];
- if(tab)
- ++argv[1];
- continue;
- case 0:
- break;
- default:
- continue;
- }
- break;
- }
- argc --;
- argv++;
- }
- if(argc<=1)
- return;
- if(argc==2) {
- fold++;
- dict++;
- } else
- filenam = argv[2];
- dfile = fopen(filenam,"r");
- if(dfile==NULL) {
- fprintf(stderr,"look: can't open %s\n",filenam);
- exit(2);
- }
- canon(argv[1],key);
- bot = 0;
- fseek(dfile,0L,2);
- top = ftell(dfile);
- for(;;) {
- mid = (top+bot)/2;
- fseek(dfile,mid,0);
- do {
- c = getc(dfile);
- mid++;
- } while(c!=EOF && c!='\n');
- if(!getword(entry))
- break;
- canon(entry,word);
- switch(compare(key,word)) {
- case -2:
- case -1:
- case 0:
- if(top<=mid)
- break;
- top = mid;
- continue;
- case 1:
- case 2:
- bot = mid;
- continue;
- }
- break;
- }
- fseek(dfile,bot,0);
- while(ftell(dfile)<top) {
- if(!getword(entry))
- return;
- canon(entry,word);
- switch(compare(key,word)) {
- case -2:
- return;
- case -1:
- case 0:
- puts(entry,stdout);
- break;
- case 1:
- case 2:
- continue;
- }
- break;
- }
- while(getword(entry)) {
- canon(entry,word);
- switch(compare(key,word)) {
- case -1:
- case 0:
- puts(entry,stdout);
- continue;
- }
- break;
- }
- }
-
- compare(s,t)
- register char *s,*t;
- {
- for(;*s==*t;s++,t++)
- if(*s==0)
- return(0);
- return(*s==0? -1:
- *t==0? 1:
- *s<*t? -2:
- 2);
- }
-
- getword(w)
- char *w;
- {
- register c;
- for(;;) {
- c = getc(dfile);
- if(c==EOF)
- return(0);
- if(c=='\n')
- break;
- *w++ = c;
- }
- *w = 0;
- return(1);
- }
-
- canon(old,new)
- char *old,*new;
- {
- register c;
- for(;;) {
- *new = c = *old++;
- if(c==0||c==tab) {
- *new = 0;
- break;
- }
- if(dict) {
- if(!isalnum(c))
- continue;
- }
- if(fold) {
- if(isupper(c))
- *new += 'a' - 'A';
- }
- new++;
- }
- }
-