1 /* libcomps - C alternative to yum.comps library
2  * Copyright (C) 2013 Jindrich Luza
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  * any later version.
8  *
9  * This program is distributed in the hope that it will be useful, but
10  * 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  Free Software
16  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301,
17  * USA
18  */
19 
20 #ifndef COMPS_RADIX_H
21 #define COMPS_RADIX_H
22 
23 #include <stdlib.h>
24 #include <string.h>
25 #include "comps_hslist.h"
26 
27 typedef struct {
28     char * key;
29     unsigned is_leaf;
30     COMPS_HSList * subnodes;
31     void * data;
32     void (**data_destructor)(void*);
33 } COMPS_RTreeData;
34 
35 typedef struct {
36     COMPS_HSList *  subnodes;
37     void* (*data_constructor)(void*);
38     void* (*data_cloner)(void*);
39     void (*data_destructor)(void*);
40 } COMPS_RTree;
41 
42 typedef struct {
43     char * key;
44     void * data;
45 } COMPS_RTreePair;
46 
47 COMPS_RTreeData * __comps_rtree_data_create(COMPS_RTree *rt, char *key,
48                                                    unsigned int keylen,
49                                                    void *data);
50 COMPS_HSList* __comps_rtree_all(COMPS_RTree * rt, char pairorkey);
51 
52 void comps_rtree_data_destroy(COMPS_RTreeData * rtd);
53 void comps_rtree_data_destroy_v(void * rtd);
54 
55 COMPS_RTreeData * comps_rtree_data_create(COMPS_RTree *rt, char * key,
56                                           void * data);
57 COMPS_RTreeData * comps_rtree_data_create_n(COMPS_RTree *rt, char * key,
58                                             size_t keylen, void * data);
59 
60 COMPS_RTree * comps_rtree_create(void* (*data_constructor)(void*),
61                                  void* (*data_cloner)(void*),
62                                  void (*data_destructor)(void*));
63 void comps_rtree_destroy(COMPS_RTree * rt);
64 
65 void comps_rtree_set(COMPS_RTree *rt, char *key, void *data);
66 void comps_rtree_set_n(COMPS_RTree * rt, char * key,
67                        size_t keylen, void * data);
68 
69 void* comps_rtree_get(COMPS_RTree * rt, const char * key);
70 void comps_rtree_unset(COMPS_RTree * rt, const char * key);
71 void comps_rtree_clear(COMPS_RTree * rt);
72 
73 void comps_rtree_values_walk(COMPS_RTree *rt, void* udata,
74                                                void (*walk_f)(void*, void*));
75 COMPS_HSList * comps_rtree_values(COMPS_RTree *rt);
76 COMPS_HSList* comps_rtree_keys(COMPS_RTree * rt);
77 COMPS_HSList* comps_rtree_pairs(COMPS_RTree * rt);
78 COMPS_RTree * comps_rtree_clone(COMPS_RTree * rt);
79 COMPS_RTree* comps_rtree_union(COMPS_RTree *rt1, COMPS_RTree *rt2);
80 void comps_rtree_unite(COMPS_RTree *rt1, COMPS_RTree *rt2);
81 COMPS_RTree* comps_rtree_union(COMPS_RTree *rt1, COMPS_RTree *rt2);
82 
83 COMPS_RTreePair * comps_rtree_pair_create(char * key, void * data,
84                                           void (*data_destructor(void*)));
85 void comps_rtree_pair_destroy(COMPS_RTreePair * pair);
86 void comps_rtree_pair_destroy_v(void * pair);
87 
88 void comps_rtree_print(COMPS_HSList * hl, unsigned  deep);
89 #endif
90