+#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++;
+ }
+}