1 /* 2 * List functions 3 * 4 * Copyright (C) 2006-2020, 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_LIST_H ) 23 #define _LIBCDATA_LIST_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_list libcdata_internal_list_t; 38 39 struct libcdata_internal_list 40 { 41 /* The number of elements 42 */ 43 int number_of_elements; 44 45 /* The first element 46 */ 47 libcdata_list_element_t *first_element; 48 49 /* The last element 50 */ 51 libcdata_list_element_t *last_element; 52 53 #if defined( HAVE_MULTI_THREAD_SUPPORT ) && !defined( HAVE_LOCAL_LIBCDATA ) 54 /* The read/write lock 55 */ 56 libcthreads_read_write_lock_t *read_write_lock; 57 #endif 58 }; 59 60 LIBCDATA_EXTERN \ 61 int libcdata_list_initialize( 62 libcdata_list_t **list, 63 libcerror_error_t **error ); 64 65 LIBCDATA_EXTERN \ 66 int libcdata_list_free( 67 libcdata_list_t **list, 68 int (*value_free_function)( 69 intptr_t **value, 70 libcerror_error_t **error ), 71 libcerror_error_t **error ); 72 73 LIBCDATA_EXTERN \ 74 int libcdata_list_empty( 75 libcdata_list_t *list, 76 int (*value_free_function)( 77 intptr_t **value, 78 libcerror_error_t **error ), 79 libcerror_error_t **error ); 80 81 LIBCDATA_EXTERN \ 82 int libcdata_list_clone( 83 libcdata_list_t **destination_list, 84 libcdata_list_t *source_list, 85 int (*value_free_function)( 86 intptr_t **value, 87 libcerror_error_t **error ), 88 int (*value_clone_function)( 89 intptr_t **destination_value, 90 intptr_t *source_value, 91 libcerror_error_t **error ), 92 libcerror_error_t **error ); 93 94 LIBCDATA_EXTERN \ 95 int libcdata_list_get_number_of_elements( 96 libcdata_list_t *list, 97 int *number_of_elements, 98 libcerror_error_t **error ); 99 100 LIBCDATA_EXTERN \ 101 int libcdata_list_get_first_element( 102 libcdata_list_t *list, 103 libcdata_list_element_t **element, 104 libcerror_error_t **error ); 105 106 int libcdata_internal_list_set_first_element( 107 libcdata_internal_list_t *internal_list, 108 libcdata_list_element_t *element, 109 libcerror_error_t **error ); 110 111 LIBCDATA_EXTERN \ 112 int libcdata_list_get_last_element( 113 libcdata_list_t *list, 114 libcdata_list_element_t **element, 115 libcerror_error_t **error ); 116 117 int libcdata_internal_list_set_last_element( 118 libcdata_internal_list_t *internal_list, 119 libcdata_list_element_t *element, 120 libcerror_error_t **error ); 121 122 LIBCDATA_EXTERN \ 123 int libcdata_list_get_element_by_index( 124 libcdata_list_t *list, 125 int element_index, 126 libcdata_list_element_t **element, 127 libcerror_error_t **error ); 128 129 LIBCDATA_EXTERN \ 130 int libcdata_list_get_value_by_index( 131 libcdata_list_t *list, 132 int element_index, 133 intptr_t **value, 134 libcerror_error_t **error ); 135 136 LIBCDATA_EXTERN \ 137 int libcdata_list_prepend_element( 138 libcdata_list_t *list, 139 libcdata_list_element_t *element, 140 libcerror_error_t **error ); 141 142 LIBCDATA_EXTERN \ 143 int libcdata_list_prepend_value( 144 libcdata_list_t *list, 145 intptr_t *value, 146 libcerror_error_t **error ); 147 148 LIBCDATA_EXTERN \ 149 int libcdata_list_append_element( 150 libcdata_list_t *list, 151 libcdata_list_element_t *element, 152 libcerror_error_t **error ); 153 154 LIBCDATA_EXTERN \ 155 int libcdata_list_append_value( 156 libcdata_list_t *list, 157 intptr_t *value, 158 libcerror_error_t **error ); 159 160 int libcdata_internal_list_insert_element_find_element( 161 libcdata_internal_list_t *internal_list, 162 intptr_t *value_to_insert, 163 int (*value_compare_function)( 164 intptr_t *first_value, 165 intptr_t *second_value, 166 libcerror_error_t **error ), 167 uint8_t insert_flags, 168 int *element_index, 169 libcdata_list_element_t **element, 170 libcerror_error_t **error ); 171 172 int libcdata_internal_list_insert_element_before_element( 173 libcdata_internal_list_t *internal_list, 174 libcdata_list_element_t *list_element, 175 libcdata_list_element_t *element_to_insert, 176 libcerror_error_t **error ); 177 178 LIBCDATA_EXTERN \ 179 int libcdata_list_insert_element( 180 libcdata_list_t *list, 181 libcdata_list_element_t *element_to_insert, 182 int (*value_compare_function)( 183 intptr_t *first, 184 intptr_t *second, 185 libcerror_error_t **error ), 186 uint8_t insert_flags, 187 libcerror_error_t **error ); 188 189 LIBCDATA_EXTERN \ 190 int libcdata_list_insert_value( 191 libcdata_list_t *list, 192 intptr_t *value, 193 int (*value_compare_function)( 194 intptr_t *first, 195 intptr_t *second, 196 libcerror_error_t **error ), 197 uint8_t insert_flags, 198 libcerror_error_t **error ); 199 200 LIBCDATA_EXTERN \ 201 int libcdata_list_remove_element( 202 libcdata_list_t *list, 203 libcdata_list_element_t *element_to_remove, 204 libcerror_error_t **error ); 205 206 #if defined( __cplusplus ) 207 } 208 #endif 209 210 #endif /* !defined( _LIBCDATA_LIST_H ) */ 211 212