add onyx code
[unix-history] / usr / src / usr.bin / look / look.c
CommitLineData
027304e0
BJ
1static char *sccsid = "@(#)look.c 4.1 (Berkeley) %G%";
2#include <stdio.h>
3#include <ctype.h>
4
5FILE *dfile;
6char *filenam = "/usr/dict/words";
7
8int fold;
9int dict;
10int tab;
11char entry[250];
12char word[250];
13char key[50];
14
15main(argc,argv)
16char **argv;
17{
18 register c;
19 long top,bot,mid;
20 while(argc>=2 && *argv[1]=='-') {
21 for(;;) {
22 switch(*++argv[1]) {
23 case 'd':
24 dict++;
25 continue;
26 case 'f':
27 fold++;
28 continue;
29 case 't':
30 tab = argv[1][1];
31 if(tab)
32 ++argv[1];
33 continue;
34 case 0:
35 break;
36 default:
37 continue;
38 }
39 break;
40 }
41 argc --;
42 argv++;
43 }
44 if(argc<=1)
45 return;
46 if(argc==2) {
47 fold++;
48 dict++;
49 } else
50 filenam = argv[2];
51 dfile = fopen(filenam,"r");
52 if(dfile==NULL) {
53 fprintf(stderr,"look: can't open %s\n",filenam);
54 exit(2);
55 }
56 canon(argv[1],key);
57 bot = 0;
58 fseek(dfile,0L,2);
59 top = ftell(dfile);
60 for(;;) {
61 mid = (top+bot)/2;
62 fseek(dfile,mid,0);
63 do {
64 c = getc(dfile);
65 mid++;
66 } while(c!=EOF && c!='\n');
67 if(!getword(entry))
68 break;
69 canon(entry,word);
70 switch(compare(key,word)) {
71 case -2:
72 case -1:
73 case 0:
74 if(top<=mid)
75 break;
76 top = mid;
77 continue;
78 case 1:
79 case 2:
80 bot = mid;
81 continue;
82 }
83 break;
84 }
85 fseek(dfile,bot,0);
86 while(ftell(dfile)<top) {
87 if(!getword(entry))
88 return;
89 canon(entry,word);
90 switch(compare(key,word)) {
91 case -2:
92 return;
93 case -1:
94 case 0:
95 puts(entry,stdout);
96 break;
97 case 1:
98 case 2:
99 continue;
100 }
101 break;
102 }
103 while(getword(entry)) {
104 canon(entry,word);
105 switch(compare(key,word)) {
106 case -1:
107 case 0:
108 puts(entry,stdout);
109 continue;
110 }
111 break;
112 }
113}
114
115compare(s,t)
116register char *s,*t;
117{
118 for(;*s==*t;s++,t++)
119 if(*s==0)
120 return(0);
121 return(*s==0? -1:
122 *t==0? 1:
123 *s<*t? -2:
124 2);
125}
126
127getword(w)
128char *w;
129{
130 register c;
131 for(;;) {
132 c = getc(dfile);
133 if(c==EOF)
134 return(0);
135 if(c=='\n')
136 break;
137 *w++ = c;
138 }
139 *w = 0;
140 return(1);
141}
142
143canon(old,new)
144char *old,*new;
145{
146 register c;
147 for(;;) {
148 *new = c = *old++;
149 if(c==0||c==tab) {
150 *new = 0;
151 break;
152 }
153 if(dict) {
154 if(!isalnum(c))
155 continue;
156 }
157 if(fold) {
158 if(isupper(c))
159 *new += 'a' - 'A';
160 }
161 new++;
162 }
163}