date and time created 83/06/06 11:37:07 by garrison
authorGary M. Levin <garrison@ucbvax.Berkeley.EDU>
Tue, 7 Jun 1983 02:37:07 +0000 (18:37 -0800)
committerGary M. Levin <garrison@ucbvax.Berkeley.EDU>
Tue, 7 Jun 1983 02:37:07 +0000 (18:37 -0800)
SCCS-vsn: contrib/bib/src/alpha.seek.c 1.1

usr/src/contrib/bib/src/alpha.seek.c [new file with mode: 0644]

diff --git a/usr/src/contrib/bib/src/alpha.seek.c b/usr/src/contrib/bib/src/alpha.seek.c
new file mode 100644 (file)
index 0000000..410360e
--- /dev/null
@@ -0,0 +1,72 @@
+#
+
+# 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);
+    }
+}