update.c 1.7 KB

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