123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426 |
- /* LIBDGL -- a Directed Graph Library implementation
- * Copyright (C) 2002 Roberto Micarelli
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- */
- /* best view tabstop=4
- */
- #include <stdio.h>
- #include <string.h>
- #include <stdlib.h>
- #include "type.h"
- #include "tree.h"
- /*
- * AVL Support for data type dglTreeNode_s
- * alloc
- * cancel
- * compare
- * add
- */
- dglTreeNode_s *dglTreeNodeAlloc()
- {
- dglTreeNode_s *pNode = (dglTreeNode_s *) malloc(sizeof(dglTreeNode_s));
- if (pNode)
- memset(pNode, 0, sizeof(dglTreeNode_s));
- return pNode;
- }
- void dglTreeNodeCancel(void *pvNode, void *pvParam)
- {
- if (((dglTreeNode_s *) pvNode)->pv)
- free(((dglTreeNode_s *) pvNode)->pv);
- if (((dglTreeNode_s *) pvNode)->pv2)
- free(((dglTreeNode_s *) pvNode)->pv2);
- free(pvNode);
- }
- int dglTreeNodeCompare(const void *pvNodeA, const void *pvNodeB,
- void *pvParam)
- {
- if (((dglTreeNode_s *) pvNodeA)->nKey < ((dglTreeNode_s *) pvNodeB)->nKey)
- return -1;
- else if (((dglTreeNode_s *) pvNodeA)->nKey >
- ((dglTreeNode_s *) pvNodeB)->nKey)
- return 1;
- else
- return 0;
- }
- dglTreeNode_s *dglTreeNodeAdd(void *pavl, dglInt32_t nKey)
- {
- dglTreeNode_s *pnode;
- void **ppvret;
- if ((pnode = dglTreeNodeAlloc()) == NULL)
- return NULL;
- pnode->nKey = nKey;
- ppvret = avl_probe(pavl, pnode);
- if (*ppvret != pnode) {
- free(pnode);
- pnode = *ppvret;
- }
- return pnode;
- }
- /*
- * AVL Support for data type dglTreeNode2_s
- * alloc
- * cancel
- * compare
- * add
- */
- dglTreeNode2_s *dglTreeNode2Alloc()
- {
- dglTreeNode2_s *pNode2 =
- (dglTreeNode2_s *) malloc(sizeof(dglTreeNode2_s));
- if (pNode2)
- memset(pNode2, 0, sizeof(dglTreeNode2_s));
- return pNode2;
- }
- void dglTreeNode2Cancel(void *pvNode2, void *pvParam)
- {
- if (((dglTreeNode2_s *) pvNode2)->pv)
- free(((dglTreeNode2_s *) pvNode2)->pv);
- if (((dglTreeNode2_s *) pvNode2)->pv2)
- free(((dglTreeNode2_s *) pvNode2)->pv2);
- if (((dglTreeNode2_s *) pvNode2)->pv3)
- free(((dglTreeNode2_s *) pvNode2)->pv3);
- free(pvNode2);
- }
- int dglTreeNode2Compare(const void *pvNode2A, const void *pvNode2B,
- void *pvParam)
- {
- if (((dglTreeNode2_s *) pvNode2A)->nKey <
- ((dglTreeNode2_s *) pvNode2B)->nKey)
- return -1;
- else if (((dglTreeNode2_s *) pvNode2A)->nKey >
- ((dglTreeNode2_s *) pvNode2B)->nKey)
- return 1;
- else
- return 0;
- }
- dglTreeNode2_s *dglTreeNode2Add(void *pavl, dglInt32_t nKey)
- {
- dglTreeNode2_s *pnode;
- void **ppvret;
- if ((pnode = dglTreeNode2Alloc()) == NULL)
- return NULL;
- pnode->nKey = nKey;
- ppvret = avl_probe(pavl, pnode);
- if (*ppvret != pnode) {
- free(pnode);
- pnode = *ppvret;
- }
- return pnode;
- }
- /*
- * AVL Support for data type dglTreeEdge_s
- * alloc
- * cancel
- * compare
- * add
- */
- dglTreeEdge_s *dglTreeEdgeAlloc()
- {
- dglTreeEdge_s *pEdge = (dglTreeEdge_s *) malloc(sizeof(dglTreeEdge_s));
- if (pEdge)
- memset(pEdge, 0, sizeof(dglTreeEdge_s));
- return pEdge;
- }
- void dglTreeEdgeCancel(void *pvEdge, void *pvParam)
- {
- if (((dglTreeEdge_s *) pvEdge)->pv)
- free(((dglTreeEdge_s *) pvEdge)->pv);
- free(pvEdge);
- }
- int dglTreeEdgeCompare(const void *pvEdgeA, const void *pvEdgeB,
- void *pvParam)
- {
- if (((dglTreeEdge_s *) pvEdgeA)->nKey < ((dglTreeEdge_s *) pvEdgeB)->nKey)
- return -1;
- else if (((dglTreeEdge_s *) pvEdgeA)->nKey >
- ((dglTreeEdge_s *) pvEdgeB)->nKey)
- return 1;
- else
- return 0;
- }
- dglTreeEdge_s *dglTreeEdgeAdd(void *pavl, dglInt32_t nKey)
- {
- dglTreeEdge_s *pedge;
- void **ppvret;
- if ((pedge = dglTreeEdgeAlloc()) == NULL)
- return NULL;
- pedge->nKey = nKey;
- ppvret = avl_probe(pavl, pedge);
- if (*ppvret != pedge) {
- free(pedge);
- pedge = *ppvret;
- }
- return pedge;
- }
- /*
- * AVL Support for data type dglTreeTouchI32_s
- * alloc
- * cancel
- * compare
- * add
- */
- dglTreeTouchI32_s *dglTreeTouchI32Alloc()
- {
- dglTreeTouchI32_s *pTouchI32 =
- (dglTreeTouchI32_s *) malloc(sizeof(dglTreeTouchI32_s));
- pTouchI32->nKey = 0;
- return pTouchI32;
- }
- void dglTreeTouchI32Cancel(void *pvTouchI32, void *pvParam)
- {
- free(pvTouchI32);
- }
- int dglTreeTouchI32Compare(const void *pvTouchI32A, const void *pvTouchI32B,
- void *pvParam)
- {
- if (((dglTreeTouchI32_s *) pvTouchI32A)->nKey <
- ((dglTreeTouchI32_s *) pvTouchI32B)->nKey)
- return -1;
- else if (((dglTreeTouchI32_s *) pvTouchI32A)->nKey >
- ((dglTreeTouchI32_s *) pvTouchI32B)->nKey)
- return 1;
- else
- return 0;
- }
- dglTreeTouchI32_s *dglTreeTouchI32Add(void *pavl, dglInt32_t nKey)
- {
- dglTreeTouchI32_s *pnode;
- void **ppvret;
- if ((pnode = dglTreeTouchI32Alloc()) == NULL)
- return NULL;
- pnode->nKey = nKey;
- ppvret = avl_probe(pavl, pnode);
- if (*ppvret != pnode) {
- free(pnode);
- pnode = *ppvret;
- }
- return pnode;
- }
- /*
- * AVL Support for data type dglTreePredist_s
- * alloc
- * cancel
- * compare
- * add
- */
- dglTreePredist_s *dglTreePredistAlloc()
- {
- dglTreePredist_s *pPredist =
- (dglTreePredist_s *) malloc(sizeof(dglTreePredist_s));
- if (pPredist)
- memset(pPredist, 0, sizeof(dglTreePredist_s));
- return pPredist;
- }
- void dglTreePredistCancel(void *pvPredist, void *pvParam)
- {
- free(pvPredist);
- }
- int dglTreePredistCompare(const void *pvPredistA, const void *pvPredistB,
- void *pvParam)
- {
- if (((dglTreePredist_s *) pvPredistA)->nKey <
- ((dglTreePredist_s *) pvPredistB)->nKey)
- return -1;
- else if (((dglTreePredist_s *) pvPredistA)->nKey >
- ((dglTreePredist_s *) pvPredistB)->nKey)
- return 1;
- else
- return 0;
- }
- dglTreePredist_s *dglTreePredistAdd(void *pavl, dglInt32_t nKey)
- {
- dglTreePredist_s *pnode;
- void **ppvret;
- if ((pnode = dglTreePredistAlloc()) == NULL)
- return NULL;
- pnode->nKey = nKey;
- ppvret = avl_probe(pavl, pnode);
- if (*ppvret != pnode) {
- free(pnode);
- pnode = *ppvret;
- }
- return pnode;
- }
- /*
- * AVL Support for data type dglTreeNodePri32_s
- * alloc
- * cancel
- * compare
- * add
- */
- dglTreeNodePri32_s *dglTreeNodePri32Alloc()
- {
- dglTreeNodePri32_s *pNodePri32 =
- (dglTreeNodePri32_s *) malloc(sizeof(dglTreeNodePri32_s));
- if (pNodePri32)
- memset(pNodePri32, 0, sizeof(dglTreeNodePri32_s));
- return pNodePri32;
- }
- void dglTreeNodePri32Cancel(void *pvNodePri32, void *pvParam)
- {
- free(pvNodePri32);
- }
- int dglTreeNodePri32Compare(const void *pvNodePri32A,
- const void *pvNodePri32B, void *pvParam)
- {
- if (((dglTreeNodePri32_s *) pvNodePri32A)->nKey <
- ((dglTreeNodePri32_s *) pvNodePri32B)->nKey)
- return -1;
- else if (((dglTreeNodePri32_s *) pvNodePri32A)->nKey >
- ((dglTreeNodePri32_s *) pvNodePri32B)->nKey)
- return 1;
- else
- return 0;
- }
- dglTreeNodePri32_s *dglTreeNodePri32Add(void *pavl, dglInt32_t nKey)
- {
- dglTreeNodePri32_s *pnode;
- void **ppvret;
- if ((pnode = dglTreeNodePri32Alloc()) == NULL)
- return NULL;
- pnode->nKey = nKey;
- ppvret = avl_probe(pavl, pnode);
- if (*ppvret != pnode) {
- free(pnode);
- pnode = *ppvret;
- }
- return pnode;
- }
- /*
- * AVL Support for data type dglTreeEdgePri32_s
- * alloc
- * cancel
- * compare
- * add
- */
- dglTreeEdgePri32_s *dglTreeEdgePri32Alloc()
- {
- dglTreeEdgePri32_s *pEdgePri32 =
- (dglTreeEdgePri32_s *) malloc(sizeof(dglTreeEdgePri32_s));
- if (pEdgePri32)
- memset(pEdgePri32, 0, sizeof(dglTreeEdgePri32_s));
- return pEdgePri32;
- }
- void dglTreeEdgePri32Cancel(void *pvEdgePri32, void *pvParam)
- {
- if (((dglTreeEdgePri32_s *) pvEdgePri32)->pnData) {
- free(((dglTreeEdgePri32_s *) pvEdgePri32)->pnData);
- }
- free(pvEdgePri32);
- }
- int dglTreeEdgePri32Compare(const void *pvEdgePri32A,
- const void *pvEdgePri32B, void *pvParam)
- {
- if (((dglTreeEdgePri32_s *) pvEdgePri32A)->nKey <
- ((dglTreeEdgePri32_s *) pvEdgePri32B)->nKey)
- return -1;
- else if (((dglTreeEdgePri32_s *) pvEdgePri32A)->nKey >
- ((dglTreeEdgePri32_s *) pvEdgePri32B)->nKey)
- return 1;
- else
- return 0;
- }
- dglTreeEdgePri32_s *dglTreeEdgePri32Add(void *pavl, dglInt32_t nKey)
- {
- dglTreeEdgePri32_s *pnode;
- void **ppvret;
- if ((pnode = dglTreeEdgePri32Alloc()) == NULL)
- return NULL;
- pnode->nKey = nKey;
- ppvret = avl_probe(pavl, pnode);
- if (*ppvret != pnode) {
- free(pnode);
- pnode = *ppvret;
- }
- return pnode;
- }
- /*
- * Our AVL allocator
- */
- static void *_tree_malloc(struct libavl_allocator *allocator,
- size_t libavl_size)
- {
- return malloc(libavl_size);
- }
- static void _tree_free(struct libavl_allocator *allocator, void *libavl_block)
- {
- free(libavl_block);
- }
- static struct libavl_allocator _tree_allocator = {
- _tree_malloc, _tree_free
- };
- void *dglTreeGetAllocator()
- {
- return &_tree_allocator;
- }
|