640 number_to_scaled_string is duplicated in several commands
[unleashed.git] / usr / src / cmd / look / look.c
blobd0b77a7cc55ed2726b6c2dacb513b7747ef7d004
1 /*
2 * Copyright 2005 Sun Microsystems, Inc. All rights reserved.
3 * Use is subject to license terms.
4 */
6 /* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */
7 /* All Rights Reserved */
9 /*
10 * Copyright (c) 1980 Regents of the University of California.
11 * All rights reserved. The Berkeley software License Agreement
12 * specifies the terms and conditions for redistribution.
15 #pragma ident "%Z%%M% %I% %E% SMI"
17 #include <stdio.h>
18 #include <ctype.h>
19 #include <string.h>
21 FILE *dfile;
22 char *filenam = "/usr/share/lib/dict/words";
24 int fold;
25 int dict;
26 int tab;
27 #define WORDSIZE 257
28 char entry[WORDSIZE];
29 char word[WORDSIZE];
30 char key[WORDSIZE];
32 int compare(char *, char *);
33 void canon(char *, char *);
34 int getword(char *);
36 int
37 main(int argc, char **argv)
39 int c;
40 long top,bot,mid;
41 char *wstring, *ptr;
43 while(argc>=2 && *argv[1]=='-') {
44 for(;;) {
45 switch(*++argv[1]) {
46 case 'd':
47 dict++;
48 continue;
49 case 'f':
50 fold++;
51 continue;
52 case 't':
53 tab = argv[1][1];
54 if(tab)
55 ++argv[1];
56 continue;
57 case 0:
58 break;
59 default:
60 continue;
62 break;
64 argc --;
65 argv++;
67 if(argc<=1)
68 return (1);
69 if(argc==2) {
70 fold++;
71 dict++;
72 } else
73 filenam = argv[2];
74 dfile = fopen(filenam,"r");
75 if(dfile==NULL) {
76 fprintf(stderr,"look: can't open %s\n",filenam);
77 exit(2);
79 wstring = strdup(argv[1]);
80 if (tab != NULL) {
81 if ((ptr = strchr(wstring, tab)) != NULL) {
82 *++ptr = '\0';
85 canon(wstring,key);
86 bot = 0;
87 fseek(dfile,0L,2);
88 top = ftell(dfile);
89 for(;;) {
90 mid = (top+bot)/2;
91 fseek(dfile,mid,0);
92 do {
93 c = getc(dfile);
94 mid++;
95 } while(c!=EOF && c!='\n');
96 if(!getword(entry))
97 break;
98 canon(entry,word);
99 switch(compare(key,word)) {
100 case -2:
101 case -1:
102 case 0:
103 if(top<=mid)
104 break;
105 top = mid;
106 continue;
107 case 1:
108 case 2:
109 bot = mid;
110 continue;
112 break;
114 fseek(dfile,bot,0);
115 while(ftell(dfile)<top) {
116 if(!getword(entry))
117 return (0);
118 canon(entry,word);
119 switch(compare(key,word)) {
120 case -2:
121 return (0);
122 case -1:
123 case 0:
124 puts(entry);
125 break;
126 case 1:
127 case 2:
128 continue;
130 break;
132 while(getword(entry)) {
133 canon(entry,word);
134 switch(compare(key,word)) {
135 case -1:
136 case 0:
137 puts(entry);
138 continue;
140 break;
142 return (0);
146 compare(char *s, char *t)
148 for(;*s==*t;s++,t++)
149 if(*s==0)
150 return(0);
151 return(*s==0? -1:
152 *t==0? 1:
153 *s<*t? -2:
158 getword(char *w)
160 int c;
161 int avail = WORDSIZE - 1;
163 while(avail--) {
164 c = getc(dfile);
165 if(c==EOF)
166 return(0);
167 if(c=='\n')
168 break;
169 *w++ = c;
171 while (c != '\n')
172 c = getc(dfile);
173 *w = 0;
174 return(1);
177 void
178 canon(char *old, char *new)
180 int c;
181 int avail = WORDSIZE - 1;
183 for(;;) {
184 *new = c = *old++;
185 if(c==0) {
186 *new = 0;
187 break;
189 if(dict) {
190 if(!isalnum(c))
191 continue;
193 if(fold) {
194 if(isupper(c))
195 *new += 'a' - 'A';
197 new++;
198 avail--;
199 if (avail <= 0) {
200 *new = 0;
201 break;