Annotation of researchv10no/cmd/prefer/pref/alpha.seek.c, revision 1.1.1.1

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

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.