|
|
researchv10 Norman
#
# include "stdio.h"
# include "ctype.h"
# include "streams.h"
# define nexttry ((high+low)/2)
/* alpha_seek(stream, word, s_size, fold)
seeks the first line in stream that is at least word.
assumes that stream is a sorted file of lines. (last char must be \n)
if fold, assumes that word is lowercase and folds stream to lowercase.
s_size = size of stream
returns 1 if word = line, 0 o.w.
*/
int alpha_seek(stream, word, s_size, fold)
FILE *stream;
char *word;
long int s_size;
int fold;
{
long int high, low, mid; /* point to beginning of a line in stream */
int ans; /* line(low) < word <= line(high) */
char line[maxstr];
/* initialize low (return if first line >= word) */
low= 0L;
pos(low);
getline(stream, line);
if (fold) foldline(line);
ans= strcmp(line,word);
if ( ans >= 0)
{
pos(low);
return(ans==0);
}
/* initialize high to "line" after last line */
high= s_size;
mid= nextline(stream, nexttry );
while (mid < high )
{
getline(stream,line);
if (fold) foldline(line);
if (strcmp(line,word) < 0) low= mid;
else high= mid;
mid= nextline(stream, nexttry );
}
/* linear search from low to high */
low= nextline(stream,low);
for(;;)
{
if (low>=high) break;
getline(stream,line);
if (fold) foldline(line);
ans=strcmp(line,word);
if (ans>=0) break;
low= ftell(stream);
}
pos(low);
if (low==high) return(0);
else return(ans==0);
}
/* foldline(p): change all uppercase to lowercase in string p
*/
foldline(p)
char *p;
{
for (; *p!=NULL; p++)
{
if (isupper(*p)) *p = tolower(*p);
}
}
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.