find.c 797 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. #include <stdlib.h>
  2. #include <string.h>
  3. #include "global.h"
  4. static int bsearch_cat(int cat)
  5. {
  6. int mid, lo, hi;
  7. /* tests */
  8. if (vstat.rcat < 1)
  9. return -1;
  10. lo = 0;
  11. hi = vstat.rcat - 1;
  12. if (hi == 0 || Values[lo].cat > cat || Values[hi].cat < cat)
  13. return -1;
  14. if (Values[hi].cat == cat)
  15. return hi;
  16. if (Values[lo].cat == cat)
  17. return lo;
  18. /* bsearch */
  19. while (lo < hi) {
  20. mid = (lo + hi) / 2;
  21. if (Values[mid].cat == cat)
  22. return mid;
  23. if (Values[mid].cat > cat) {
  24. hi = mid;
  25. }
  26. else {
  27. lo = mid;
  28. }
  29. }
  30. return -1;
  31. }
  32. /* returns index to array of values, mark as used if requested */
  33. int find_cat(int cat, int used)
  34. {
  35. int i;
  36. i = bsearch_cat(cat);
  37. if (i >= 0 && used)
  38. Values[i].used = 1;
  39. return (i);
  40. }