/* Copyright 1996 Acorn Computers Ltd * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /* bsearch.c: extraced from sort.c */ /* Copyright (C) Codemist Ltd., 1988 */ #include <stddef.h> #include <stdlib.h> #define Compar_(a, b) (compar(a, b)) void *__bsearch(const void *key, const void *base, size_t nmemb, size_t size, int (*compar)(const void *, const void *)) { /* Binary search for given key in a sorted array (starting at base). */ /* Comparisons are performed using the given function, and the array has */ /* nmemb items in it, each of size bytes. */ int midn, c; void *midp; for (;;) { if (nmemb==0) return NULL; /* not found at all. */ else if (nmemb==1) /* If there is only one item left in the array it is the only one that */ /* needs to be looked at. */ { if (Compar_(key, base)==0) return (void *)base; else return NULL; } midn = nmemb>>1; /* index of middle item */ /* I have to cast bast to (char *) here so that the addition will be */ /* performed using natural machine arithmetic. */ midp = (char *)base + midn * size; c = Compar_(key, midp); if (c==0) return midp; /* item found (by accident) */ else if (c<0) nmemb = midn; /* key is to left of midpoint */ else /* key is to the right */ { base = (char *)midp + size; /* exclude the midpoint */ nmemb = nmemb - midn - 1; } continue; } } /* end of bsearch.c */