1 /*
2  * Tree functions
3  *
4  * Copyright (C) 2006-2021, Joachim Metz <joachim.metz@gmail.com>
5  *
6  * Refer to AUTHORS for acknowledgements.
7  *
8  * This program is free software: you can redistribute it and/or modify
9  * it under the terms of the GNU Lesser General Public License as published by
10  * the Free Software Foundation, either version 3 of the License, or
11  * (at your option) any later version.
12  *
13  * This program is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16  * GNU General Public License for more details.
17  *
18  * You should have received a copy of the GNU Lesser General Public License
19  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
20  */
21 
22 #if !defined( _LIBCDATA_TREE_NODE_H )
23 #define _LIBCDATA_TREE_NODE_H
24 
25 #include <common.h>
26 #include <types.h>
27 
28 #include "libcdata_extern.h"
29 #include "libcdata_libcerror.h"
30 #include "libcdata_libcthreads.h"
31 #include "libcdata_types.h"
32 
33 #if defined( __cplusplus )
34 extern "C" {
35 #endif
36 
37 typedef struct libcdata_internal_tree_node libcdata_internal_tree_node_t;
38 
39 struct libcdata_internal_tree_node
40 {
41 	/* The parent node
42 	 */
43 	libcdata_tree_node_t *parent_node;
44 
45 	/* The previous node
46 	 */
47 	libcdata_tree_node_t *previous_node;
48 
49 	/* The next node
50 	 */
51 	libcdata_tree_node_t *next_node;
52 
53 	/* The first sub node
54 	 */
55 	libcdata_tree_node_t *first_sub_node;
56 
57 	/* The last sub node
58 	 */
59 	libcdata_tree_node_t *last_sub_node;
60 
61 	/* The number of sub nodes
62 	 */
63 	int number_of_sub_nodes;
64 
65 	/* The node value
66 	 */
67 	intptr_t *value;
68 
69 #if defined( HAVE_MULTI_THREAD_SUPPORT ) && !defined( HAVE_LOCAL_LIBCDATA )
70 	/* The read/write lock
71 	 */
72 	libcthreads_read_write_lock_t *read_write_lock;
73 #endif
74 };
75 
76 LIBCDATA_EXTERN \
77 int libcdata_tree_node_initialize(
78      libcdata_tree_node_t **node,
79      libcerror_error_t **error );
80 
81 LIBCDATA_EXTERN \
82 int libcdata_tree_node_free(
83      libcdata_tree_node_t **node,
84      int (*value_free_function)(
85             intptr_t **value,
86             libcerror_error_t **error ),
87      libcerror_error_t **error );
88 
89 LIBCDATA_EXTERN \
90 int libcdata_tree_node_empty(
91      libcdata_tree_node_t *node,
92      int (*value_free_function)(
93             intptr_t **value,
94             libcerror_error_t **error ),
95      libcerror_error_t **error );
96 
97 LIBCDATA_EXTERN \
98 int libcdata_tree_node_clone(
99      libcdata_tree_node_t **destination_node,
100      libcdata_tree_node_t *source_node,
101      int (*value_free_function)(
102             intptr_t **value,
103             libcerror_error_t **error ),
104      int (*value_clone_function)(
105             intptr_t **destination_value,
106             intptr_t *source_value,
107             libcerror_error_t **error ),
108      libcerror_error_t **error );
109 
110 LIBCDATA_EXTERN \
111 int libcdata_tree_node_get_value(
112      libcdata_tree_node_t *node,
113      intptr_t **value,
114      libcerror_error_t **error );
115 
116 LIBCDATA_EXTERN \
117 int libcdata_tree_node_set_value(
118      libcdata_tree_node_t *node,
119      intptr_t *value,
120      libcerror_error_t **error );
121 
122 LIBCDATA_EXTERN \
123 int libcdata_tree_node_get_parent_node(
124      libcdata_tree_node_t *node,
125      libcdata_tree_node_t **parent_node,
126      libcerror_error_t **error );
127 
128 LIBCDATA_EXTERN \
129 int libcdata_tree_node_set_parent_node(
130      libcdata_tree_node_t *node,
131      libcdata_tree_node_t *parent_node,
132      libcerror_error_t **error );
133 
134 LIBCDATA_EXTERN \
135 int libcdata_tree_node_get_previous_node(
136      libcdata_tree_node_t *node,
137      libcdata_tree_node_t **previous_node,
138      libcerror_error_t **error );
139 
140 LIBCDATA_EXTERN \
141 int libcdata_tree_node_set_previous_node(
142      libcdata_tree_node_t *node,
143      libcdata_tree_node_t *previous_node,
144      libcerror_error_t **error );
145 
146 LIBCDATA_EXTERN \
147 int libcdata_tree_node_get_next_node(
148      libcdata_tree_node_t *node,
149      libcdata_tree_node_t **next_node,
150      libcerror_error_t **error );
151 
152 LIBCDATA_EXTERN \
153 int libcdata_tree_node_set_next_node(
154      libcdata_tree_node_t *node,
155      libcdata_tree_node_t *next_node,
156      libcerror_error_t **error );
157 
158 LIBCDATA_EXTERN \
159 int libcdata_tree_node_get_nodes(
160      libcdata_tree_node_t *node,
161      libcdata_tree_node_t **parent_node,
162      libcdata_tree_node_t **previous_node,
163      libcdata_tree_node_t **next_node,
164      libcerror_error_t **error );
165 
166 LIBCDATA_EXTERN \
167 int libcdata_tree_node_set_nodes(
168      libcdata_tree_node_t *node,
169      libcdata_tree_node_t *parent_node,
170      libcdata_tree_node_t *previous_node,
171      libcdata_tree_node_t *next_node,
172      libcerror_error_t **error );
173 
174 LIBCDATA_EXTERN \
175 int libcdata_tree_node_get_first_sub_node(
176      libcdata_tree_node_t *node,
177      libcdata_tree_node_t **first_sub_node,
178      libcerror_error_t **error );
179 
180 int libcdata_internal_tree_node_set_first_sub_node(
181      libcdata_internal_tree_node_t *internal_node,
182      libcdata_tree_node_t *first_sub_node,
183      libcerror_error_t **error );
184 
185 LIBCDATA_EXTERN \
186 int libcdata_tree_node_get_last_sub_node(
187      libcdata_tree_node_t *node,
188      libcdata_tree_node_t **last_sub_node,
189      libcerror_error_t **error );
190 
191 int libcdata_internal_tree_node_set_last_sub_node(
192      libcdata_internal_tree_node_t *internal_node,
193      libcdata_tree_node_t *last_sub_node,
194      libcerror_error_t **error );
195 
196 int libcdata_tree_node_get_sub_nodes(
197      libcdata_tree_node_t *node,
198      libcdata_tree_node_t **first_sub_node,
199      libcdata_tree_node_t **last_sub_node,
200      libcerror_error_t **error );
201 
202 int libcdata_tree_node_set_sub_nodes(
203      libcdata_tree_node_t *node,
204      libcdata_tree_node_t *first_sub_node,
205      libcdata_tree_node_t *last_sub_node,
206      libcerror_error_t **error );
207 
208 int libcdata_internal_tree_node_append_node(
209      libcdata_internal_tree_node_t *internal_node,
210      libcdata_tree_node_t *node_to_append,
211      libcerror_error_t **error );
212 
213 LIBCDATA_EXTERN \
214 int libcdata_tree_node_append_node(
215      libcdata_tree_node_t *node,
216      libcdata_tree_node_t *node_to_append,
217      libcerror_error_t **error );
218 
219 LIBCDATA_EXTERN \
220 int libcdata_tree_node_append_value(
221      libcdata_tree_node_t *node,
222      intptr_t *value,
223      libcerror_error_t **error );
224 
225 int libcdata_internal_tree_node_insert_node_find_sub_node(
226      libcdata_internal_tree_node_t *internal_node,
227      intptr_t *value_to_insert,
228      int (*value_compare_function)(
229             intptr_t *first_value,
230             intptr_t *second_value,
231             libcerror_error_t **error ),
232      uint8_t insert_flags,
233      int *sub_node_index,
234      libcdata_tree_node_t **sub_node,
235      libcerror_error_t **error );
236 
237 int libcdata_internal_tree_node_insert_node_before_sub_node(
238      libcdata_internal_tree_node_t *internal_node,
239      libcdata_tree_node_t *sub_node,
240      libcdata_tree_node_t *node_to_insert,
241      libcerror_error_t **error );
242 
243 LIBCDATA_EXTERN \
244 int libcdata_tree_node_insert_node(
245      libcdata_tree_node_t *node,
246      libcdata_tree_node_t *node_to_insert,
247      int (*value_compare_function)(
248             intptr_t *first_value,
249             intptr_t *second_value,
250             libcerror_error_t **error ),
251      uint8_t insert_flags,
252      libcerror_error_t **error );
253 
254 LIBCDATA_EXTERN \
255 int libcdata_tree_node_insert_value(
256      libcdata_tree_node_t *node,
257      intptr_t *value,
258      int (*value_compare_function)(
259             intptr_t *first_value,
260             intptr_t *second_value,
261             libcerror_error_t **error ),
262      uint8_t insert_flags,
263      libcerror_error_t **error );
264 
265 LIBCDATA_EXTERN \
266 int libcdata_tree_node_replace_node(
267      libcdata_tree_node_t *node,
268      libcdata_tree_node_t *replacement_node,
269      libcerror_error_t **error );
270 
271 LIBCDATA_EXTERN \
272 int libcdata_tree_node_remove_node(
273      libcdata_tree_node_t *node,
274      libcdata_tree_node_t *sub_node_to_remove,
275      libcerror_error_t **error );
276 
277 LIBCDATA_EXTERN \
278 int libcdata_tree_node_get_number_of_sub_nodes(
279      libcdata_tree_node_t *node,
280      int *number_of_sub_nodes,
281      libcerror_error_t **error );
282 
283 LIBCDATA_EXTERN \
284 int libcdata_tree_node_get_sub_node_by_index(
285      libcdata_tree_node_t *node,
286      int sub_node_index,
287      libcdata_tree_node_t **sub_node,
288      libcerror_error_t **error );
289 
290 LIBCDATA_EXTERN \
291 int libcdata_tree_node_get_leaf_node_list(
292      libcdata_tree_node_t *node,
293      libcdata_list_t **leaf_node_list,
294      libcerror_error_t **error );
295 
296 #if defined( __cplusplus )
297 }
298 #endif
299 
300 #endif /* !defined( _LIBCDATA_TREE_NODE_H ) */
301 
302