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