bsearch.c
上传用户:nvosite88
上传日期:2007-01-17
资源大小:4983k
文件大小:2k
源码类别:

VxWorks

开发平台:

C/C++

  1. /* bsearch.c - bsearch routine for the stdlib ANSI library */
  2. /* Copyright 1992-1993 Wind River Systems, Inc. */
  3. /*
  4. modification history
  5. --------------------
  6. 01c,08feb93,jdi  documentation cleanup for 5.1.
  7. 01b,20sep92,smb  documentation additions.
  8. 01a,19jul92,smb  written and documented
  9. */
  10. /*
  11. DESCRIPTION
  12. INCLUDE FILE: stdlib.h
  13. SEE ALSO: American National Standard X3.159-1989
  14. NOMANUAL
  15. */
  16. #include "vxWorks.h"
  17. #include "stdlib.h"
  18. /******************************************************************************
  19. *
  20. * bsearch - perform a binary search (ANSI)
  21. *
  22. * This routine searches an array of <nmemb> objects, the initial element of
  23. * which is pointed to by <base0>, for an element that matches the object
  24. * pointed to by <key>.  The <size> of each element of the array is specified
  25. * by <size>.
  26. *
  27. * The comparison function pointed to by <compar> is called with two arguments
  28. * that point to the <key> object and to an array element, in that order.  The
  29. * function shall return an integer less than, equal to, or greater than zero if
  30. * the <key> object is considered, respectively, to be less than, to match, or
  31. * to be greater than the array element.  The array shall consist of all the
  32. * elements that compare greater than the <key> object, in that order.
  33. *
  34. * INCLUDE FILES: stdlib.h
  35. *
  36. * RETURNS:
  37. * A pointer to a matching element of the array, or a NULL pointer
  38. * if no match is found.  If two elements compare as equal, which element 
  39. * is matched is unspecified.
  40. */
  41. void * bsearch
  42.     (
  43.     FAST const void * key, /* element to match */
  44.     const void * base0, /* initial element in array */
  45.     size_t nmemb, /* array to search */
  46.     FAST size_t size, /* size of array element */
  47.     FAST int (*compar) (const void *, const void *)  /* comparison function */
  48.     )
  49.     {
  50.     FAST const char *     base = base0;
  51.     FAST const void *     p;
  52.     FAST int              lim;
  53.     FAST int              cmp;
  54.     for (lim = nmemb; lim != 0; lim >>= 1) 
  55. {
  56.      p = base + (lim >> 1) * size;
  57.      cmp = (*compar)(key, p);
  58.      if (cmp == 0)
  59.          return (CHAR_FROM_CONST (p));
  60.      if (cmp > 0) 
  61.     { /* key > p: move right */
  62.          base = (CHAR_FROM_CONST (p) + size);
  63.          lim--;
  64.          } 
  65.         }
  66.     return (NULL);
  67.     }