update.c 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <grass/btree.h>
  5. static void *store(const void *, int);
  6. int btree_update(BTREE * B,
  7. const void *key, int keylen, const void *data, int datalen)
  8. {
  9. int p = 0;
  10. int q;
  11. int N;
  12. int (*cmp) ();
  13. int dir;
  14. /* first node is special case */
  15. N = B->N;
  16. if (N == 0) {
  17. N = B->N = 1;
  18. B->node[N].key = store(key, keylen);
  19. B->node[N].data = store(data, datalen);
  20. B->node[N].left = 0;
  21. B->node[N].right = 0;
  22. if (B->node[N].key && B->node[N].data)
  23. return 1;
  24. else
  25. return 0;
  26. }
  27. cmp = B->cmp;
  28. q = 1;
  29. while (q > 0) {
  30. p = q;
  31. dir = (*cmp) (B->node[q].key, key);
  32. if (dir == 0) {
  33. free(B->node[q].data);
  34. return ((B->node[q].data = store(data, datalen))) ? 1 : 0;
  35. }
  36. if (dir > 0)
  37. q = B->node[q].left; /* go left */
  38. else
  39. q = B->node[q].right; /* go right */
  40. }
  41. /* new node */
  42. B->N++;
  43. N = B->N;
  44. /* grow the tree? */
  45. if (N >= B->tlen) {
  46. B->node =
  47. (BTREE_NODE *) realloc(B->node,
  48. sizeof(BTREE_NODE) * (B->tlen += B->incr));
  49. if (B->node == NULL)
  50. return 0;
  51. }
  52. /* add node to tree */
  53. B->node[N].key = store(key, keylen);
  54. B->node[N].data = store(data, datalen);
  55. B->node[N].left = 0;
  56. if (dir > 0) {
  57. B->node[N].right = -p; /* create thread */
  58. B->node[p].left = N; /* insert left */
  59. }
  60. else {
  61. B->node[N].right = B->node[p].right; /* copy right link/thread */
  62. B->node[p].right = N; /* add right */
  63. }
  64. return 1;
  65. }
  66. static void *store(const void *s, int n)
  67. {
  68. void *b;
  69. if (n <= 0)
  70. return NULL;
  71. b = malloc(n);
  72. if (b == NULL)
  73. return b;
  74. memcpy(b, s, n);
  75. return b;
  76. }