php-internal-docs 8.4.8
Unofficial docs for php/php-src
Loading...
Searching...
No Matches
bst_map.c
Go to the documentation of this file.
1/*
2 * Copyright (C) 2018 Alexander Borisov
3 *
4 * Author: Alexander Borisov <borisov@lexbor.com>
5 */
6
8#include "lexbor/core/utils.h"
9
10
13{
14 return lexbor_calloc(1, sizeof(lexbor_bst_map_t));
15}
16
19{
21
22 if (bst_map == NULL) {
24 }
25
26 if (size == 0) {
28 }
29
30 /* bst */
31 bst_map->bst = lexbor_bst_create();
32 status = lexbor_bst_init(bst_map->bst, size);
33 if (status) {
34 return status;
35 }
36
37 /* dobject */
38 bst_map->entries = lexbor_dobject_create();
41 if (status) {
42 return status;
43 }
44
45 /* mraw */
46 bst_map->mraw = lexbor_mraw_create();
47 status = lexbor_mraw_init(bst_map->mraw, (size * 6));
48 if (status) {
49 return status;
50 }
51
52 return LXB_STATUS_OK;
53}
54
55void
62
64lexbor_bst_map_destroy(lexbor_bst_map_t *bst_map, bool self_destroy)
65{
66 if (bst_map == NULL) {
67 return NULL;
68 }
69
70 bst_map->bst = lexbor_bst_destroy(bst_map->bst, true);
71 bst_map->mraw = lexbor_mraw_destroy(bst_map->mraw, true);
72 bst_map->entries = lexbor_dobject_destroy(bst_map->entries, true);
73
74 if (self_destroy) {
75 return lexbor_free(bst_map);
76 }
77
78 return bst_map;
79}
80
83 const lxb_char_t *key, size_t key_len)
84{
86 lexbor_bst_entry_t *bst_entry;
87
88 size_t hash_id = lexbor_utils_hash_hash(key, key_len);
89
90 bst_entry = lexbor_bst_search(bst_map->bst, scope, hash_id);
91 if (bst_entry == NULL) {
92 return NULL;
93 }
94
95 do {
96 entry = bst_entry->value;
97
98 if (entry->str.length == key_len &&
100 {
101 return entry;
102 }
103
104 bst_entry = bst_entry->next;
105 }
106 while (bst_entry != NULL);
107
108 return NULL;
109}
110
114 const lxb_char_t *key, size_t key_len, void *value)
115{
117
118 entry = lexbor_bst_map_insert_not_exists(bst_map, scope, key, key_len);
119 if (entry == NULL) {
120 return NULL;
121 }
122
123 entry->value = value;
124
125 return entry;
126}
127
131 const lxb_char_t *key, size_t key_len)
132{
134 lexbor_bst_entry_t *bst_entry;
135
136 size_t hash_id = lexbor_utils_hash_hash(key, key_len);
137
138 bst_entry = lexbor_bst_insert_not_exists(bst_map->bst, scope, hash_id);
139 if (bst_entry == NULL) {
140 return NULL;
141 }
142
143 if (bst_entry->value == NULL) {
144 goto new_entry;
145 }
146
147 do {
148 entry = bst_entry->value;
149
150 if (entry->str.length == key_len &&
152 {
153 return entry;
154 }
155
156 if (bst_entry->next == NULL) {
157 bst_entry->next = lexbor_bst_entry_make(bst_map->bst, hash_id);
158 bst_entry = bst_entry->next;
159
160 if (bst_entry == NULL) {
161 return NULL;
162 }
163
164 goto new_entry;
165 }
166
167 bst_entry = bst_entry->next;
168 }
169 while (1);
170
171 return NULL;
172
173new_entry:
174
175 entry = lexbor_dobject_calloc(bst_map->entries);
176 if (entry == NULL) {
177 return NULL;
178 }
179
180 lexbor_str_init(&entry->str, bst_map->mraw, key_len);
181 if (entry->str.data == NULL) {
182 lexbor_dobject_free(bst_map->entries, entry);
183
184 return NULL;
185 }
186
187 lexbor_str_append(&entry->str, bst_map->mraw, key, key_len);
188
189 bst_entry->value = entry;
190
191 return entry;
192}
193
194void *
196 const lxb_char_t *key, size_t key_len)
197{
199 lexbor_bst_entry_t *bst_entry;
200
201 size_t hash_id = lexbor_utils_hash_hash(key, key_len);
202
203 bst_entry = lexbor_bst_search(bst_map->bst, *scope, hash_id);
204 if (bst_entry == NULL) {
205 return NULL;
206 }
207
208 do {
209 entry = bst_entry->value;
210
211 if (entry->str.length == key_len &&
213 {
214 void *value = entry->value;
215
216 lexbor_bst_remove_by_pointer(bst_map->bst, bst_entry, scope);
217
218 lexbor_str_destroy(&entry->str, bst_map->mraw, false);
219 lexbor_dobject_free(bst_map->entries, entry);
220
221 return value;
222 }
223
224 bst_entry = bst_entry->next;
225 }
226 while (bst_entry != NULL);
227
228 return NULL;
229}
230
231/*
232 * No inline functions.
233 */
236{
237 return lexbor_bst_map_mraw(bst_map);
238}
void * lexbor_bst_remove_by_pointer(lexbor_bst_t *bst, lexbor_bst_entry_t *entry, lexbor_bst_entry_t **root)
Definition bst.c:287
lexbor_bst_t * lexbor_bst_create(void)
Definition bst.c:12
lxb_status_t lexbor_bst_init(lexbor_bst_t *bst, size_t size)
Definition bst.c:18
lexbor_bst_entry_t * lexbor_bst_entry_make(lexbor_bst_t *bst, size_t size)
Definition bst.c:71
lexbor_bst_entry_t * lexbor_bst_search(lexbor_bst_t *bst, lexbor_bst_entry_t *scope, size_t size)
Definition bst.c:188
lexbor_bst_t * lexbor_bst_destroy(lexbor_bst_t *bst, bool self_destroy)
Definition bst.c:55
void lexbor_bst_clean(lexbor_bst_t *bst)
Definition bst.c:44
lexbor_bst_entry_t * lexbor_bst_insert_not_exists(lexbor_bst_t *bst, lexbor_bst_entry_t **scope, size_t size)
Definition bst.c:145
struct lexbor_bst_entry lexbor_bst_entry_t
Definition bst.h:24
void lexbor_bst_map_clean(lexbor_bst_map_t *bst_map)
Definition bst_map.c:56
lexbor_bst_map_entry_t * lexbor_bst_map_insert_not_exists(lexbor_bst_map_t *bst_map, lexbor_bst_entry_t **scope, const lxb_char_t *key, size_t key_len)
Definition bst_map.c:129
lxb_status_t lexbor_bst_map_init(lexbor_bst_map_t *bst_map, size_t size)
Definition bst_map.c:18
lexbor_bst_map_entry_t * lexbor_bst_map_search(lexbor_bst_map_t *bst_map, lexbor_bst_entry_t *scope, const lxb_char_t *key, size_t key_len)
Definition bst_map.c:82
lexbor_bst_map_t * lexbor_bst_map_destroy(lexbor_bst_map_t *bst_map, bool self_destroy)
Definition bst_map.c:64
lexbor_bst_map_entry_t * lexbor_bst_map_insert(lexbor_bst_map_t *bst_map, lexbor_bst_entry_t **scope, const lxb_char_t *key, size_t key_len, void *value)
Definition bst_map.c:112
void * lexbor_bst_map_remove(lexbor_bst_map_t *bst_map, lexbor_bst_entry_t **scope, const lxb_char_t *key, size_t key_len)
Definition bst_map.c:195
lexbor_mraw_t * lexbor_bst_map_mraw_noi(lexbor_bst_map_t *bst_map)
Definition bst_map.c:235
lexbor_bst_map_t * lexbor_bst_map_create(void)
Definition bst_map.c:12
lxb_inline lexbor_mraw_t * lexbor_bst_map_mraw(lexbor_bst_map_t *bst_map)
Definition bst_map.h:70
@ LXB_STATUS_ERROR_OBJECT_IS_NULL
Definition base.h:52
@ LXB_STATUS_ERROR_WRONG_ARGS
Definition base.h:58
@ LXB_STATUS_OK
Definition base.h:49
DNS_STATUS status
Definition dns_win32.c:49
void * lexbor_dobject_calloc(lexbor_dobject_t *dobject)
Definition dobject.c:123
lxb_status_t lexbor_dobject_init(lexbor_dobject_t *dobject, size_t chunk_size, size_t struct_size)
Definition dobject.c:22
void lexbor_dobject_clean(lexbor_dobject_t *dobject)
Definition dobject.c:64
lexbor_dobject_t * lexbor_dobject_destroy(lexbor_dobject_t *dobject, bool destroy_self)
Definition dobject.c:75
void * lexbor_dobject_free(lexbor_dobject_t *dobject, void *data)
Definition dobject.c:135
lexbor_dobject_t * lexbor_dobject_create(void)
Definition dobject.c:16
new_type size
Definition ffi.c:4365
#define NULL
Definition gdcache.h:45
LXB_API void * lexbor_free(void *dst)
Definition memory.c:33
LXB_API void * lexbor_calloc(size_t num, size_t size)
Definition memory.c:27
lexbor_mraw_t * lexbor_mraw_create(void)
Definition mraw.c:32
void lexbor_mraw_clean(lexbor_mraw_t *mraw)
Definition mraw.c:76
lxb_status_t lexbor_mraw_init(lexbor_mraw_t *mraw, size_t chunk_size)
Definition mraw.c:38
lexbor_mraw_t * lexbor_mraw_destroy(lexbor_mraw_t *mraw, bool destroy_self)
Definition mraw.c:87
unsigned char key[REFLECTION_KEY_LEN]
lxb_char_t * lexbor_str_append(lexbor_str_t *str, lexbor_mraw_t *mraw, const lxb_char_t *buff, size_t length)
Definition str.c:131
bool lexbor_str_data_cmp(const lxb_char_t *first, const lxb_char_t *sec)
Definition str.c:530
lxb_char_t * lexbor_str_init(lexbor_str_t *str, lexbor_mraw_t *mraw, size_t size)
Definition str.c:22
lexbor_str_t * lexbor_str_destroy(lexbor_str_t *str, lexbor_mraw_t *mraw, bool destroy_obj)
Definition str.c:76
void * value
Definition bst.h:31
lexbor_bst_entry_t * next
Definition bst.h:35
Definition bst_map.h:20
lexbor_str_t str
Definition bst_map.h:21
void * value
Definition bst_map.h:22
lexbor_mraw_t * mraw
Definition bst_map.h:28
lexbor_bst_t * bst
Definition bst_map.h:27
lexbor_dobject_t * entries
Definition bst_map.h:29
lxb_char_t * data
Definition str.h:47
size_t length
Definition str.h:48
unsigned int lxb_status_t
Definition types.h:28
unsigned char lxb_char_t
Definition types.h:27
size_t lexbor_utils_hash_hash(const lxb_char_t *key, size_t key_size)
Definition utils.c:28
value
new_op_array scope