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