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