GRASS 8 Programmer's Manual 8.6.0dev(2026)-1878fdfec5
Loading...
Searching...
No Matches
tree.c
Go to the documentation of this file.
1/* LIBDGL -- a Directed Graph Library implementation
2 * SPDX-FileCopyrightText: 2002 Roberto Micarelli
3 * SPDX-FileCopyrightText: GRASS Development Team
4 * SPDX-License-Identifier: GPL-2.0-or-later
5 */
6
7/* best view tabstop=4
8 */
9#include <stdio.h>
10#include <string.h>
11#include <stdlib.h>
12
13#include <grass/gis.h>
14#include "type.h"
15#include "tree.h"
16
17/*
18 * AVL Support for data type dglTreeNode_s
19 * alloc
20 * cancel
21 * compare
22 * add
23 */
25{
27
28 if (pNode)
29 memset(pNode, 0, sizeof(dglTreeNode_s));
30 return pNode;
31}
32
34{
35 if (((dglTreeNode_s *)pvNode)->pv)
36 free(((dglTreeNode_s *)pvNode)->pv);
37 if (((dglTreeNode_s *)pvNode)->pv2)
38 free(((dglTreeNode_s *)pvNode)->pv2);
39 free(pvNode);
40}
41
42int dglTreeNodeCompare(const void *pvNodeA, const void *pvNodeB,
43 void *pvParam G_UNUSED)
44{
45 if (((dglTreeNode_s *)pvNodeA)->nKey < ((dglTreeNode_s *)pvNodeB)->nKey)
46 return -1;
47 else if (((dglTreeNode_s *)pvNodeA)->nKey >
48 ((dglTreeNode_s *)pvNodeB)->nKey)
49 return 1;
50 else
51 return 0;
52}
53
55{
56 dglTreeNode_s *pnode;
57 void **ppvret;
58
59 if ((pnode = dglTreeNodeAlloc()) == NULL)
60 return NULL;
61 pnode->nKey = nKey;
62 ppvret = avl_probe(pavl, pnode);
63 if (*ppvret != pnode) {
64 free(pnode);
65 pnode = *ppvret;
66 }
67 return pnode;
68}
69
70/*
71 * AVL Support for data type dglTreeNode2_s
72 * alloc
73 * cancel
74 * compare
75 * add
76 */
84
86{
87 if (((dglTreeNode2_s *)pvNode2)->pv)
88 free(((dglTreeNode2_s *)pvNode2)->pv);
89 if (((dglTreeNode2_s *)pvNode2)->pv2)
90 free(((dglTreeNode2_s *)pvNode2)->pv2);
91 if (((dglTreeNode2_s *)pvNode2)->pv3)
92 free(((dglTreeNode2_s *)pvNode2)->pv3);
94}
95
96int dglTreeNode2Compare(const void *pvNode2A, const void *pvNode2B,
97 void *pvParam G_UNUSED)
98{
99 if (((dglTreeNode2_s *)pvNode2A)->nKey < ((dglTreeNode2_s *)pvNode2B)->nKey)
100 return -1;
101 else if (((dglTreeNode2_s *)pvNode2A)->nKey >
102 ((dglTreeNode2_s *)pvNode2B)->nKey)
103 return 1;
104 else
105 return 0;
106}
107
109{
110 dglTreeNode2_s *pnode;
111 void **ppvret;
112
113 if ((pnode = dglTreeNode2Alloc()) == NULL)
114 return NULL;
115 pnode->nKey = nKey;
116 ppvret = avl_probe(pavl, pnode);
117 if (*ppvret != pnode) {
118 free(pnode);
119 pnode = *ppvret;
120 }
121 return pnode;
122}
123
124/*
125 * AVL Support for data type dglTreeEdge_s
126 * alloc
127 * cancel
128 * compare
129 * add
130 */
132{
134
135 if (pEdge)
136 memset(pEdge, 0, sizeof(dglTreeEdge_s));
137 return pEdge;
138}
139
141{
142 if (((dglTreeEdge_s *)pvEdge)->pv)
143 free(((dglTreeEdge_s *)pvEdge)->pv);
144 free(pvEdge);
145}
146
147int dglTreeEdgeCompare(const void *pvEdgeA, const void *pvEdgeB,
148 void *pvParam G_UNUSED)
149{
150 if (((dglTreeEdge_s *)pvEdgeA)->nKey < ((dglTreeEdge_s *)pvEdgeB)->nKey)
151 return -1;
152 else if (((dglTreeEdge_s *)pvEdgeA)->nKey >
153 ((dglTreeEdge_s *)pvEdgeB)->nKey)
154 return 1;
155 else
156 return 0;
157}
158
160{
162 void **ppvret;
163
164 if ((pedge = dglTreeEdgeAlloc()) == NULL)
165 return NULL;
166 pedge->nKey = nKey;
168 if (*ppvret != pedge) {
169 free(pedge);
170 pedge = *ppvret;
171 }
172 return pedge;
173}
174
175/*
176 * AVL Support for data type dglTreeTouchI32_s
177 * alloc
178 * cancel
179 * compare
180 * add
181 */
189
194
195int dglTreeTouchI32Compare(const void *pvTouchI32A, const void *pvTouchI32B,
196 void *pvParam G_UNUSED)
197{
198 if (((dglTreeTouchI32_s *)pvTouchI32A)->nKey <
200 return -1;
201 else if (((dglTreeTouchI32_s *)pvTouchI32A)->nKey >
203 return 1;
204 else
205 return 0;
206}
207
209{
210 dglTreeTouchI32_s *pnode;
211 void **ppvret;
212
213 if ((pnode = dglTreeTouchI32Alloc()) == NULL)
214 return NULL;
215 pnode->nKey = nKey;
216 ppvret = avl_probe(pavl, pnode);
217 if (*ppvret != pnode) {
218 free(pnode);
219 pnode = *ppvret;
220 }
221 return pnode;
222}
223
224/*
225 * AVL Support for data type dglTreePredist_s
226 * alloc
227 * cancel
228 * compare
229 * add
230 */
239
240void dglTreePredistCancel(void *pvPredist, void *pvParam G_UNUSED)
241{
242 free(pvPredist);
243}
244
245int dglTreePredistCompare(const void *pvPredistA, const void *pvPredistB,
246 void *pvParam G_UNUSED)
247{
248 if (((dglTreePredist_s *)pvPredistA)->nKey <
249 ((dglTreePredist_s *)pvPredistB)->nKey)
250 return -1;
251 else if (((dglTreePredist_s *)pvPredistA)->nKey >
252 ((dglTreePredist_s *)pvPredistB)->nKey)
253 return 1;
254 else
255 return 0;
256}
257
259{
260 dglTreePredist_s *pnode;
261 void **ppvret;
262
263 if ((pnode = dglTreePredistAlloc()) == NULL)
264 return NULL;
265 pnode->nKey = nKey;
266 ppvret = avl_probe(pavl, pnode);
267 if (*ppvret != pnode) {
268 free(pnode);
269 pnode = *ppvret;
270 }
271 return pnode;
272}
273
274/*
275 * AVL Support for data type dglTreeNodePri32_s
276 * alloc
277 * cancel
278 * compare
279 * add
280 */
289
294
296 void *pvParam G_UNUSED)
297{
298 if (((dglTreeNodePri32_s *)pvNodePri32A)->nKey <
300 return -1;
301 else if (((dglTreeNodePri32_s *)pvNodePri32A)->nKey >
303 return 1;
304 else
305 return 0;
306}
307
309{
310 dglTreeNodePri32_s *pnode;
311 void **ppvret;
312
313 if ((pnode = dglTreeNodePri32Alloc()) == NULL)
314 return NULL;
315 pnode->nKey = nKey;
316 ppvret = avl_probe(pavl, pnode);
317 if (*ppvret != pnode) {
318 free(pnode);
319 pnode = *ppvret;
320 }
321 return pnode;
322}
323
324/*
325 * AVL Support for data type dglTreeEdgePri32_s
326 * alloc
327 * cancel
328 * compare
329 * add
330 */
339
341{
342 if (((dglTreeEdgePri32_s *)pvEdgePri32)->pnData) {
343 free(((dglTreeEdgePri32_s *)pvEdgePri32)->pnData);
344 }
346}
347
349 void *pvParam G_UNUSED)
350{
351 if (((dglTreeEdgePri32_s *)pvEdgePri32A)->nKey <
353 return -1;
354 else if (((dglTreeEdgePri32_s *)pvEdgePri32A)->nKey >
356 return 1;
357 else
358 return 0;
359}
360
362{
363 dglTreeEdgePri32_s *pnode;
364 void **ppvret;
365
366 if ((pnode = dglTreeEdgePri32Alloc()) == NULL)
367 return NULL;
368 pnode->nKey = nKey;
369 ppvret = avl_probe(pavl, pnode);
370 if (*ppvret != pnode) {
371 free(pnode);
372 pnode = *ppvret;
373 }
374 return pnode;
375}
376
377/*
378 * Our AVL allocator
379 */
380static void *_tree_malloc(struct libavl_allocator *allocator G_UNUSED,
381 size_t libavl_size)
382{
383 return malloc(libavl_size);
384}
385
386static void _tree_free(struct libavl_allocator *allocator G_UNUSED,
387 void *libavl_block)
388{
390}
391
392static struct libavl_allocator _tree_allocator = {_tree_malloc, _tree_free};
393
395{
396 return &_tree_allocator;
397}
#define NULL
Definition ccmath.h:32
#define G_UNUSED
A macro for an attribute, if attached to a variable, indicating that the variable is not used.
Definition gis.h:43
void * malloc(unsigned)
void free(void *)
dglInt32_t nKey
Definition tree.h:136
long nKey
Definition tree.h:63
dglInt32_t nKey
Definition tree.h:122
long nKey
Definition tree.h:49
dglInt32_t nKey
Definition tree.h:105
dglInt32_t nKey
Definition tree.h:92
dglTreeNode_s * dglTreeNodeAdd(void *pavl, dglInt32_t nKey)
Definition tree.c:54
void dglTreePredistCancel(void *pvPredist, void *pvParam)
Definition tree.c:240
int dglTreeTouchI32Compare(const void *pvTouchI32A, const void *pvTouchI32B, void *pvParam)
Definition tree.c:195
void dglTreeEdgePri32Cancel(void *pvEdgePri32, void *pvParam)
Definition tree.c:340
dglTreeEdgePri32_s * dglTreeEdgePri32Alloc(void)
Definition tree.c:331
void dglTreeEdgeCancel(void *pvEdge, void *pvParam)
Definition tree.c:140
int dglTreePredistCompare(const void *pvPredistA, const void *pvPredistB, void *pvParam)
Definition tree.c:245
int dglTreeNodeCompare(const void *pvNodeA, const void *pvNodeB, void *pvParam)
Definition tree.c:42
dglTreeNode2_s * dglTreeNode2Alloc(void)
Definition tree.c:77
dglTreeEdge_s * dglTreeEdgeAlloc(void)
Definition tree.c:131
dglTreeEdge_s * dglTreeEdgeAdd(void *pavl, dglInt32_t nKey)
Definition tree.c:159
dglTreePredist_s * dglTreePredistAdd(void *pavl, dglInt32_t nKey)
Definition tree.c:258
dglTreeNode2_s * dglTreeNode2Add(void *pavl, dglInt32_t nKey)
Definition tree.c:108
int dglTreeNode2Compare(const void *pvNode2A, const void *pvNode2B, void *pvParam)
Definition tree.c:96
dglTreeEdgePri32_s * dglTreeEdgePri32Add(void *pavl, dglInt32_t nKey)
Definition tree.c:361
void * dglTreeGetAllocator(void)
Definition tree.c:394
void dglTreeNodePri32Cancel(void *pvNodePri32, void *pvParam)
Definition tree.c:290
void dglTreeNodeCancel(void *pvNode, void *pvParam)
Definition tree.c:33
dglTreeTouchI32_s * dglTreeTouchI32Alloc(void)
Definition tree.c:182
void dglTreeNode2Cancel(void *pvNode2, void *pvParam)
Definition tree.c:85
dglTreePredist_s * dglTreePredistAlloc(void)
Definition tree.c:231
dglTreeTouchI32_s * dglTreeTouchI32Add(void *pavl, dglInt32_t nKey)
Definition tree.c:208
int dglTreeEdgeCompare(const void *pvEdgeA, const void *pvEdgeB, void *pvParam)
Definition tree.c:147
dglTreeNodePri32_s * dglTreeNodePri32Alloc(void)
Definition tree.c:281
dglTreeNode_s * dglTreeNodeAlloc(void)
Definition tree.c:24
dglTreeNodePri32_s * dglTreeNodePri32Add(void *pavl, dglInt32_t nKey)
Definition tree.c:308
int dglTreeEdgePri32Compare(const void *pvEdgePri32A, const void *pvEdgePri32B, void *pvParam)
Definition tree.c:348
void dglTreeTouchI32Cancel(void *pvTouchI32, void *pvParam)
Definition tree.c:190
int dglTreeNodePri32Compare(const void *pvNodePri32A, const void *pvNodePri32B, void *pvParam)
Definition tree.c:295
#define avl_probe
Definition tree.h:22
long dglInt32_t
Definition type.h:24