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