bsearch.c 522 B

12345678910111213141516171819
  1. #include <stdlib.h>
  2. // Do not use register a5; callback function might need it.
  3. register long __tbl asm ("a5");
  4. __ATTR_LIB_C__ void *bsearch(const void *key, const void *bptr, short n, short w, compare_t cmp_func)
  5. {
  6. unsigned short left=0,right=n-1,index;
  7. short rcmp;
  8. void *rptr;
  9. do
  10. {
  11. index=(left+right)>>1;
  12. if((rcmp=cmp_func(key,rptr=(char*)bptr+(long)index*(unsigned short)w))>0) left=index+1;
  13. else if(rcmp<0) right=index-1;
  14. else return rptr;
  15. } while(left<=right);
  16. return 0;
  17. }