1 #ifndef lint
2 static char sccsid[] = "@(#)alpha.seek.c 2.3 05/27/93";
3 #endif not lint
4 #
5
6 # include "stdio.h"
7 # include "ctype.h"
8 # include "streams.h"
9 # define nexttry ((high+low)/2)
10
11 /* alpha_seek(stream, word, s_size, fold)
12 seeks the first line in stream that is at least word.
13 assumes that stream is a sorted file of lines. (last char must be \n)
14 if fold, assumes that word is lowercase and folds stream to lowercase.
15 s_size = size of stream
16 returns 1 if word = line, 0 o.w.
17 */
alpha_seek(stream,word,s_size,fold)18 int alpha_seek(stream, word, s_size, fold)
19 FILE *stream;
20 char *word;
21 long int s_size;
22 int fold;
23 { long int high, low, mid; /* point to beginning of a line in stream */
24 int ans; /* line(low) < word <= line(high) */
25 char line[maxstr];
26
27
28 /* initialize low (return if first line >= word) */
29 low= 0L;
30 pos(low); getline(stream, line);
31 if (fold) foldline(line);
32 ans= strcmp(line,word);
33
34 if ( ans >= 0)
35 { pos(low); return(ans==0); }
36
37 /* initialize high to "line" after last line */
38 high= s_size;
39
40 mid= nextline(stream, nexttry );
41 while (mid < high )
42 { getline(stream,line);
43 if (fold) foldline(line);
44 if (strcmp(line,word) < 0) low= mid;
45 else high= mid;
46 mid= nextline(stream, nexttry );
47 }
48
49 /* linear search from low to high */
50 low= nextline(stream,low);
51 for(;;)
52 { if (low>=high) break;
53
54 getline(stream,line);
55 if (fold) foldline(line);
56 ans=strcmp(line,word);
57
58 if (ans>=0) break;
59 low= ftell(stream);
60 }
61
62 pos(low);
63 if (low==high) return(0);
64 else return(ans==0);
65 }
66
67
68 /* foldline(p): change all uppercase to lowercase in string p
69 */
foldline(p)70 foldline(p)
71 char *p;
72 { for (; *p!=NULL; p++)
73 { if (isupper(*p)) *p = tolower(*p);
74 }
75 }
76