Bell 32V development
authorTom London <tbl@research.uucp>
Mon, 11 Dec 1978 00:37:24 +0000 (19:37 -0500)
committerTom London <tbl@research.uucp>
Mon, 11 Dec 1978 00:37:24 +0000 (19:37 -0500)
Work on file usr/src/cmd/look.c

Co-Authored-By: John Reiser <jfr@research.uucp>
Synthesized-from: 32v

usr/src/cmd/look.c [new file with mode: 0644]

diff --git a/usr/src/cmd/look.c b/usr/src/cmd/look.c
new file mode 100644 (file)
index 0000000..b2a9980
--- /dev/null
@@ -0,0 +1,162 @@
+#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++;
+       }
+}