xref: /original-bsd/usr.bin/look/look.c (revision 5fb3de76)
1 static char *sccsid = "@(#)look.c	4.1 (Berkeley) 10/01/80";
2 #include <stdio.h>
3 #include <ctype.h>
4 
5 FILE *dfile;
6 char *filenam  = "/usr/dict/words";
7 
8 int fold;
9 int dict;
10 int tab;
11 char entry[250];
12 char word[250];
13 char key[50];
14 
15 main(argc,argv)
16 char **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 
115 compare(s,t)
116 register 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 
127 getword(w)
128 char *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 
143 canon(old,new)
144 char *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 }
164