tree.c 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426
  1. /* LIBDGL -- a Directed Graph Library implementation
  2. * Copyright (C) 2002 Roberto Micarelli
  3. *
  4. * This program is free software; you can redistribute it and/or modify
  5. * it under the terms of the GNU General Public License as published by
  6. * the Free Software Foundation; either version 2 of the License, or
  7. * (at your option) any later version.
  8. *
  9. * This program is distributed in the hope that it will be useful,
  10. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  12. * GNU General Public License for more details.
  13. *
  14. * You should have received a copy of the GNU General Public License
  15. * along with this program; if not, write to the Free Software
  16. * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  17. */
  18. /* best view tabstop=4
  19. */
  20. #include <stdio.h>
  21. #include <string.h>
  22. #include <stdlib.h>
  23. #include "type.h"
  24. #include "tree.h"
  25. /*
  26. * AVL Support for data type dglTreeNode_s
  27. * alloc
  28. * cancel
  29. * compare
  30. * add
  31. */
  32. dglTreeNode_s *dglTreeNodeAlloc()
  33. {
  34. dglTreeNode_s *pNode = (dglTreeNode_s *) malloc(sizeof(dglTreeNode_s));
  35. if (pNode)
  36. memset(pNode, 0, sizeof(dglTreeNode_s));
  37. return pNode;
  38. }
  39. void dglTreeNodeCancel(void *pvNode, void *pvParam)
  40. {
  41. if (((dglTreeNode_s *) pvNode)->pv)
  42. free(((dglTreeNode_s *) pvNode)->pv);
  43. if (((dglTreeNode_s *) pvNode)->pv2)
  44. free(((dglTreeNode_s *) pvNode)->pv2);
  45. free(pvNode);
  46. }
  47. int dglTreeNodeCompare(const void *pvNodeA, const void *pvNodeB,
  48. void *pvParam)
  49. {
  50. if (((dglTreeNode_s *) pvNodeA)->nKey < ((dglTreeNode_s *) pvNodeB)->nKey)
  51. return -1;
  52. else if (((dglTreeNode_s *) pvNodeA)->nKey >
  53. ((dglTreeNode_s *) pvNodeB)->nKey)
  54. return 1;
  55. else
  56. return 0;
  57. }
  58. dglTreeNode_s *dglTreeNodeAdd(void *pavl, dglInt32_t nKey)
  59. {
  60. dglTreeNode_s *pnode;
  61. void **ppvret;
  62. if ((pnode = dglTreeNodeAlloc()) == NULL)
  63. return NULL;
  64. pnode->nKey = nKey;
  65. ppvret = avl_probe(pavl, pnode);
  66. if (*ppvret != pnode) {
  67. free(pnode);
  68. pnode = *ppvret;
  69. }
  70. return pnode;
  71. }
  72. /*
  73. * AVL Support for data type dglTreeNode2_s
  74. * alloc
  75. * cancel
  76. * compare
  77. * add
  78. */
  79. dglTreeNode2_s *dglTreeNode2Alloc()
  80. {
  81. dglTreeNode2_s *pNode2 =
  82. (dglTreeNode2_s *) malloc(sizeof(dglTreeNode2_s));
  83. if (pNode2)
  84. memset(pNode2, 0, sizeof(dglTreeNode2_s));
  85. return pNode2;
  86. }
  87. void dglTreeNode2Cancel(void *pvNode2, void *pvParam)
  88. {
  89. if (((dglTreeNode2_s *) pvNode2)->pv)
  90. free(((dglTreeNode2_s *) pvNode2)->pv);
  91. if (((dglTreeNode2_s *) pvNode2)->pv2)
  92. free(((dglTreeNode2_s *) pvNode2)->pv2);
  93. if (((dglTreeNode2_s *) pvNode2)->pv3)
  94. free(((dglTreeNode2_s *) pvNode2)->pv3);
  95. free(pvNode2);
  96. }
  97. int dglTreeNode2Compare(const void *pvNode2A, const void *pvNode2B,
  98. void *pvParam)
  99. {
  100. if (((dglTreeNode2_s *) pvNode2A)->nKey <
  101. ((dglTreeNode2_s *) pvNode2B)->nKey)
  102. return -1;
  103. else if (((dglTreeNode2_s *) pvNode2A)->nKey >
  104. ((dglTreeNode2_s *) pvNode2B)->nKey)
  105. return 1;
  106. else
  107. return 0;
  108. }
  109. dglTreeNode2_s *dglTreeNode2Add(void *pavl, dglInt32_t nKey)
  110. {
  111. dglTreeNode2_s *pnode;
  112. void **ppvret;
  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. * AVL Support for data type dglTreeEdge_s
  125. * alloc
  126. * cancel
  127. * compare
  128. * add
  129. */
  130. dglTreeEdge_s *dglTreeEdgeAlloc()
  131. {
  132. dglTreeEdge_s *pEdge = (dglTreeEdge_s *) malloc(sizeof(dglTreeEdge_s));
  133. if (pEdge)
  134. memset(pEdge, 0, sizeof(dglTreeEdge_s));
  135. return pEdge;
  136. }
  137. void dglTreeEdgeCancel(void *pvEdge, void *pvParam)
  138. {
  139. if (((dglTreeEdge_s *) pvEdge)->pv)
  140. free(((dglTreeEdge_s *) pvEdge)->pv);
  141. free(pvEdge);
  142. }
  143. int dglTreeEdgeCompare(const void *pvEdgeA, const void *pvEdgeB,
  144. void *pvParam)
  145. {
  146. if (((dglTreeEdge_s *) pvEdgeA)->nKey < ((dglTreeEdge_s *) pvEdgeB)->nKey)
  147. return -1;
  148. else if (((dglTreeEdge_s *) pvEdgeA)->nKey >
  149. ((dglTreeEdge_s *) pvEdgeB)->nKey)
  150. return 1;
  151. else
  152. return 0;
  153. }
  154. dglTreeEdge_s *dglTreeEdgeAdd(void *pavl, dglInt32_t nKey)
  155. {
  156. dglTreeEdge_s *pedge;
  157. void **ppvret;
  158. if ((pedge = dglTreeEdgeAlloc()) == NULL)
  159. return NULL;
  160. pedge->nKey = nKey;
  161. ppvret = avl_probe(pavl, pedge);
  162. if (*ppvret != pedge) {
  163. free(pedge);
  164. pedge = *ppvret;
  165. }
  166. return pedge;
  167. }
  168. /*
  169. * AVL Support for data type dglTreeTouchI32_s
  170. * alloc
  171. * cancel
  172. * compare
  173. * add
  174. */
  175. dglTreeTouchI32_s *dglTreeTouchI32Alloc()
  176. {
  177. dglTreeTouchI32_s *pTouchI32 =
  178. (dglTreeTouchI32_s *) malloc(sizeof(dglTreeTouchI32_s));
  179. pTouchI32->nKey = 0;
  180. return pTouchI32;
  181. }
  182. void dglTreeTouchI32Cancel(void *pvTouchI32, void *pvParam)
  183. {
  184. free(pvTouchI32);
  185. }
  186. int dglTreeTouchI32Compare(const void *pvTouchI32A, const void *pvTouchI32B,
  187. void *pvParam)
  188. {
  189. if (((dglTreeTouchI32_s *) pvTouchI32A)->nKey <
  190. ((dglTreeTouchI32_s *) pvTouchI32B)->nKey)
  191. return -1;
  192. else if (((dglTreeTouchI32_s *) pvTouchI32A)->nKey >
  193. ((dglTreeTouchI32_s *) pvTouchI32B)->nKey)
  194. return 1;
  195. else
  196. return 0;
  197. }
  198. dglTreeTouchI32_s *dglTreeTouchI32Add(void *pavl, dglInt32_t nKey)
  199. {
  200. dglTreeTouchI32_s *pnode;
  201. void **ppvret;
  202. if ((pnode = dglTreeTouchI32Alloc()) == NULL)
  203. return NULL;
  204. pnode->nKey = nKey;
  205. ppvret = avl_probe(pavl, pnode);
  206. if (*ppvret != pnode) {
  207. free(pnode);
  208. pnode = *ppvret;
  209. }
  210. return pnode;
  211. }
  212. /*
  213. * AVL Support for data type dglTreePredist_s
  214. * alloc
  215. * cancel
  216. * compare
  217. * add
  218. */
  219. dglTreePredist_s *dglTreePredistAlloc()
  220. {
  221. dglTreePredist_s *pPredist =
  222. (dglTreePredist_s *) malloc(sizeof(dglTreePredist_s));
  223. if (pPredist)
  224. memset(pPredist, 0, sizeof(dglTreePredist_s));
  225. return pPredist;
  226. }
  227. void dglTreePredistCancel(void *pvPredist, void *pvParam)
  228. {
  229. free(pvPredist);
  230. }
  231. int dglTreePredistCompare(const void *pvPredistA, const void *pvPredistB,
  232. void *pvParam)
  233. {
  234. if (((dglTreePredist_s *) pvPredistA)->nKey <
  235. ((dglTreePredist_s *) pvPredistB)->nKey)
  236. return -1;
  237. else if (((dglTreePredist_s *) pvPredistA)->nKey >
  238. ((dglTreePredist_s *) pvPredistB)->nKey)
  239. return 1;
  240. else
  241. return 0;
  242. }
  243. dglTreePredist_s *dglTreePredistAdd(void *pavl, dglInt32_t nKey)
  244. {
  245. dglTreePredist_s *pnode;
  246. void **ppvret;
  247. if ((pnode = dglTreePredistAlloc()) == NULL)
  248. return NULL;
  249. pnode->nKey = nKey;
  250. ppvret = avl_probe(pavl, pnode);
  251. if (*ppvret != pnode) {
  252. free(pnode);
  253. pnode = *ppvret;
  254. }
  255. return pnode;
  256. }
  257. /*
  258. * AVL Support for data type dglTreeNodePri32_s
  259. * alloc
  260. * cancel
  261. * compare
  262. * add
  263. */
  264. dglTreeNodePri32_s *dglTreeNodePri32Alloc()
  265. {
  266. dglTreeNodePri32_s *pNodePri32 =
  267. (dglTreeNodePri32_s *) malloc(sizeof(dglTreeNodePri32_s));
  268. if (pNodePri32)
  269. memset(pNodePri32, 0, sizeof(dglTreeNodePri32_s));
  270. return pNodePri32;
  271. }
  272. void dglTreeNodePri32Cancel(void *pvNodePri32, void *pvParam)
  273. {
  274. free(pvNodePri32);
  275. }
  276. int dglTreeNodePri32Compare(const void *pvNodePri32A,
  277. const void *pvNodePri32B, void *pvParam)
  278. {
  279. if (((dglTreeNodePri32_s *) pvNodePri32A)->nKey <
  280. ((dglTreeNodePri32_s *) pvNodePri32B)->nKey)
  281. return -1;
  282. else if (((dglTreeNodePri32_s *) pvNodePri32A)->nKey >
  283. ((dglTreeNodePri32_s *) pvNodePri32B)->nKey)
  284. return 1;
  285. else
  286. return 0;
  287. }
  288. dglTreeNodePri32_s *dglTreeNodePri32Add(void *pavl, dglInt32_t nKey)
  289. {
  290. dglTreeNodePri32_s *pnode;
  291. void **ppvret;
  292. if ((pnode = dglTreeNodePri32Alloc()) == NULL)
  293. return NULL;
  294. pnode->nKey = nKey;
  295. ppvret = avl_probe(pavl, pnode);
  296. if (*ppvret != pnode) {
  297. free(pnode);
  298. pnode = *ppvret;
  299. }
  300. return pnode;
  301. }
  302. /*
  303. * AVL Support for data type dglTreeEdgePri32_s
  304. * alloc
  305. * cancel
  306. * compare
  307. * add
  308. */
  309. dglTreeEdgePri32_s *dglTreeEdgePri32Alloc()
  310. {
  311. dglTreeEdgePri32_s *pEdgePri32 =
  312. (dglTreeEdgePri32_s *) malloc(sizeof(dglTreeEdgePri32_s));
  313. if (pEdgePri32)
  314. memset(pEdgePri32, 0, sizeof(dglTreeEdgePri32_s));
  315. return pEdgePri32;
  316. }
  317. void dglTreeEdgePri32Cancel(void *pvEdgePri32, void *pvParam)
  318. {
  319. if (((dglTreeEdgePri32_s *) pvEdgePri32)->pnData) {
  320. free(((dglTreeEdgePri32_s *) pvEdgePri32)->pnData);
  321. }
  322. free(pvEdgePri32);
  323. }
  324. int dglTreeEdgePri32Compare(const void *pvEdgePri32A,
  325. const void *pvEdgePri32B, void *pvParam)
  326. {
  327. if (((dglTreeEdgePri32_s *) pvEdgePri32A)->nKey <
  328. ((dglTreeEdgePri32_s *) pvEdgePri32B)->nKey)
  329. return -1;
  330. else if (((dglTreeEdgePri32_s *) pvEdgePri32A)->nKey >
  331. ((dglTreeEdgePri32_s *) pvEdgePri32B)->nKey)
  332. return 1;
  333. else
  334. return 0;
  335. }
  336. dglTreeEdgePri32_s *dglTreeEdgePri32Add(void *pavl, dglInt32_t nKey)
  337. {
  338. dglTreeEdgePri32_s *pnode;
  339. void **ppvret;
  340. if ((pnode = dglTreeEdgePri32Alloc()) == NULL)
  341. return NULL;
  342. pnode->nKey = nKey;
  343. ppvret = avl_probe(pavl, pnode);
  344. if (*ppvret != pnode) {
  345. free(pnode);
  346. pnode = *ppvret;
  347. }
  348. return pnode;
  349. }
  350. /*
  351. * Our AVL allocator
  352. */
  353. static void *_tree_malloc(struct libavl_allocator *allocator,
  354. size_t libavl_size)
  355. {
  356. return malloc(libavl_size);
  357. }
  358. static void _tree_free(struct libavl_allocator *allocator, void *libavl_block)
  359. {
  360. free(libavl_block);
  361. }
  362. static struct libavl_allocator _tree_allocator = {
  363. _tree_malloc, _tree_free
  364. };
  365. void *dglTreeGetAllocator()
  366. {
  367. return &_tree_allocator;
  368. }