[comp.os.minix] bsearch

tholm@uvicctr.UUCP (Terrence W. Holm) (08/26/88)

EFTH MINIX report #30  - August 1988 -  bsearch(3)


There follows an implementation of bsearch(3) for
Minix. Please consider this public domain software.

A "man" page is included.


----------------------------------------------------------
echo x - bsearch.3
gres '^X' '' > bsearch.3 << '/'
XSUBROUTINES
X    bsearch(3)    	- in core binary search
X
XINVOCATION
X    char *bsearch( key, base, count, width, keycmp )
X      char *key;
X      char *base;
X      unsigned int count;
X      unsigned int width;
X      int  (*keycmp)();
X
XEXPLANATION
X    Performs a binary search for a given <key> within a sorted
X    table. The table contains <count> entries of size <width>
X    and starts at <base>.
X
X    Entries are compared using keycmp( key, entry ), each argument
X    is a (char *), the function returns an int < 0, = 0 or > 0
X    according to the order of the two arguments.
X
XRESULTS
X    Bsearch(3) returns a pointer to the matching entry, if found,
X    otherwise NULL is returned.
/
echo x - bsearch.c
gres '^X' '' > bsearch.c << '/'
X/*  bsearch(3)
X *
X *  Author: Terrence Holm          Aug. 1988
X *
X *
X *  Performs a binary search for a given <key> within a sorted
X *  table. The table contains <count> entries of size <width>
X *  and starts at <base>.
X *
X *  Entries are compared using keycmp( key, entry ), each argument
X *  is a (char *), the function returns an int < 0, = 0 or > 0
X *  according to the order of the two arguments.
X *
X *  Bsearch(3) returns a pointer to the matching entry, if found,
X *  otherwise NULL is returned.
X */
X
X#define  NULL	(char *) 0
X
X
Xchar *bsearch( key, base, count, width, keycmp )
X  char *key;
X  char *base;
X  unsigned int count;
X  unsigned int width;
X  int  (*keycmp)();
X
X  {
X  char *mid_point;
X  int  cmp;
X
X  while ( count > 0 )
X    {
X    mid_point = base + width * (count >> 1);
X
X    cmp = keycmp( key, mid_point );
X
X    if ( cmp == 0 )
X	return( mid_point );
X
X    if ( cmp < 0 )
X	count >>= 1;
X    else
X	{
X	base  = mid_point + width;
X	count = (count - 1) >> 1;
X	}
X    }
X
X  return( NULL );
X  }
/
----------------------------------------------------------

		Edwin L. Froese
		  uw-beaver!ubc-cs!mprg!handel!froese

		Terrence W. Holm
		  uw-beaver!uvicctr!tholm