@@ -88,9 +88,9 @@ zval * bdict::get_path(const std::string &key, size_t &pt) const {
8888 zval *subnode = zend_hash_str_find (_data, current_key.c_str (), current_key.length ());
8989 std::string class_name = zend_container::bnode_object_get_class_name (subnode);
9090 if (class_name == " bdict" ) {
91- return zend_container::bdict_fetch_object (Z_OBJ_P (subnode))->bdict_data ->get_path (key, pt);
91+ return zend_container::bdict_fetch_object (Z_OBJ_P (subnode))->bnode_data ->get_path (key, pt);
9292 } else if (class_name == " blist" ) {
93- return zend_container::blist_fetch_object (Z_OBJ_P (subnode))->blist_data ->get_path (key, pt);
93+ return zend_container::blist_fetch_object (Z_OBJ_P (subnode))->bnode_data ->get_path (key, pt);
9494 } else {
9595 return bitem::get_zval_bool (false );
9696 }
@@ -119,9 +119,9 @@ void bdict::set_path(const std::string &key, size_t &pt, zval *value) {
119119 return ;
120120 }
121121 } else if (sub_class_name == " bdict" ) {
122- zend_container::bdict_fetch_object (Z_OBJ_P (subnode))->bdict_data ->set_path (key, pt, value);
122+ zend_container::bdict_fetch_object (Z_OBJ_P (subnode))->bnode_data ->set_path (key, pt, value);
123123 } else if (sub_class_name == " blist" ) {
124- zend_container::blist_fetch_object (Z_OBJ_P (subnode))->blist_data ->set_path (key, pt, value);
124+ zend_container::blist_fetch_object (Z_OBJ_P (subnode))->bnode_data ->set_path (key, pt, value);
125125 }
126126 } else {
127127 if (pt >= key.length ()) {
@@ -135,15 +135,15 @@ void bdict::set_path(const std::string &key, size_t &pt, zval *value) {
135135 pt = backup_pt;
136136 if (bitem::is_ull (next_key)) {
137137 zend_object *zo = zend_container::blist_object_new (zend_container::blist_ce);
138- zend_container::blist_fetch_object (zo)->blist_data = new blist ();
139- zend_container::blist_fetch_object (zo)->blist_data ->set_path (key, pt, value);
138+ zend_container::blist_fetch_object (zo)->bnode_data = new blist ();
139+ zend_container::blist_fetch_object (zo)->bnode_data ->set_path (key, pt, value);
140140 zval *zv = new zval ();
141141 ZVAL_OBJ (zv, zo);
142142 zend_hash_str_add (_data, current_key.c_str (), current_key.length (), zv);
143143 } else {
144144 zend_object *zo = zend_container::bdict_object_new (zend_container::bdict_ce);
145- zend_container::bdict_fetch_object (zo)->bdict_data = new bdict ();
146- zend_container::bdict_fetch_object (zo)->bdict_data ->set_path (key, pt, value);
145+ zend_container::bdict_fetch_object (zo)->bnode_data = new bdict ();
146+ zend_container::bdict_fetch_object (zo)->bnode_data ->set_path (key, pt, value);
147147 zval *zv = new zval ();
148148 ZVAL_OBJ (zv, zo);
149149 zend_hash_str_add (_data, current_key.c_str (), current_key.length (), zv);
@@ -163,9 +163,9 @@ bool bdict::del_path(const std::string &key, size_t &pt) {
163163 zval *subnode = zend_hash_str_find (_data, current_key.c_str (), current_key.length ());
164164 std::string class_name = zend_container::bnode_object_get_class_name (subnode);
165165 if (class_name == " bdict" ) {
166- return zend_container::bdict_fetch_object (Z_OBJ_P (subnode))->bdict_data ->del_path (key, pt);
166+ return zend_container::bdict_fetch_object (Z_OBJ_P (subnode))->bnode_data ->del_path (key, pt);
167167 } else if (class_name == " blist" ) {
168- return zend_container::blist_fetch_object (Z_OBJ_P (subnode))->blist_data ->del_path (key, pt);
168+ return zend_container::blist_fetch_object (Z_OBJ_P (subnode))->bnode_data ->del_path (key, pt);
169169 } else {
170170 return false ;
171171 }
@@ -187,7 +187,7 @@ zval * bdict::parse(const std::string &ben, size_t &pt) {
187187 zend_object *zo = zend_container::bdict_object_new (zend_container::bdict_ce);
188188 ZVAL_OBJ (zv, zo);
189189 bdict_object *intern = zend_container::bdict_fetch_object (Z_OBJ_P (zv));
190- intern->bdict_data = new bdict ();
190+ intern->bnode_data = new bdict ();
191191 ++pt;
192192
193193 while (ben[pt] != ' e' ) {
@@ -199,16 +199,16 @@ zval * bdict::parse(const std::string &ben, size_t &pt) {
199199 pt += std::stoull (key_len);
200200 if (ben[pt] == ' d' ) {
201201 zval *bnode = bdict::parse (ben, pt);
202- zend_hash_str_add (intern->bdict_data ->_data , key.c_str (), key.length (), bnode);
202+ zend_hash_str_add (intern->bnode_data ->_data , key.c_str (), key.length (), bnode);
203203 } else if (ben[pt] == ' l' ) {
204204 zval *bnode = blist::parse (ben, pt);
205- zend_hash_str_add (intern->bdict_data ->_data , key.c_str (), key.length (), bnode);
205+ zend_hash_str_add (intern->bnode_data ->_data , key.c_str (), key.length (), bnode);
206206 } else if (isdigit (ben[pt])) {
207207 zval *bnode = bstr::parse (ben, pt);
208- zend_hash_str_add (intern->bdict_data ->_data , key.c_str (), key.length (), bnode);
208+ zend_hash_str_add (intern->bnode_data ->_data , key.c_str (), key.length (), bnode);
209209 } else if (ben[pt] == ' i' ) {
210210 zval *bnode = bint::parse (ben, pt);
211- zend_hash_str_add (intern->bdict_data ->_data , key.c_str (), key.length (), bnode);
211+ zend_hash_str_add (intern->bnode_data ->_data , key.c_str (), key.length (), bnode);
212212 } else {
213213 return bitem::throw_general_exception (" Error parsing bdict" );
214214 }
@@ -226,19 +226,10 @@ std::string bdict::encode() const {
226226 zend_ulong num_index;
227227 zend_hash_get_current_key (_data, &_str_index, &num_index);
228228 zval *value = zend_hash_get_current_data (_data);
229- std::string class_name = zend_container::bnode_object_get_class_name (value);
230229 std::string str_index (ZSTR_VAL (_str_index), ZSTR_LEN (_str_index));
231230
232- result += std::to_string (str_index.length ()) + " :" + str_index;
233- if (class_name == " bdict" ) {
234- result += (zend_container::bdict_fetch_object (Z_OBJ_P (value)))->bdict_data ->encode ();
235- } else if (class_name == " blist" ) {
236- result += (zend_container::blist_fetch_object (Z_OBJ_P (value)))->blist_data ->encode ();
237- } else if (class_name == " bstr" ) {
238- result += (zend_container::bstr_fetch_object (Z_OBJ_P (value)))->bstr_data ->encode ();
239- } else if (class_name == " bint" ) {
240- result += (zend_container::bint_fetch_object (Z_OBJ_P (value)))->bint_data ->encode ();
241- }
231+ result += std::to_string (str_index.length ()) + " :" + str_index
232+ + zend_container::bnode_fetch_object_data (Z_OBJ_P (value))->encode ();
242233 }
243234 return result + " e" ;
244235}
@@ -250,47 +241,20 @@ zval * bdict::to_array(const bool include_meta) const {
250241 for (zend_hash_internal_pointer_reset (_data);
251242 zend_hash_has_more_elements (_data) == SUCCESS;
252243 zend_hash_move_forward (_data)) {
253- zend_string *_str_index ;
244+ zend_string *str_index ;
254245 zend_ulong num_index;
255- zend_hash_get_current_key (_data, &_str_index , &num_index);
246+ zend_hash_get_current_key (_data, &str_index , &num_index);
256247 zval *value = zend_hash_get_current_data (_data);
257- std::string class_name = zend_container::bnode_object_get_class_name (value);
258- char *str_index = (char *)emalloc (ZSTR_LEN (_str_index) + 1 );
259- memcpy (str_index, ZSTR_VAL (_str_index), ZSTR_LEN (_str_index));
260- if (class_name == " bdict" ) {
261- bdict_object *bnode = zend_container::bdict_fetch_object (Z_OBJ_P (value));
262- zval *subarray = bnode->bdict_data ->to_array (include_meta);
263- add_assoc_zval_ex (zv, str_index, ZSTR_LEN (_str_index), subarray);
264- } else if (class_name == " blist" ) {
265- blist_object *bnode = zend_container::blist_fetch_object (Z_OBJ_P (value));
266- zval *subarray = bnode->blist_data ->to_array (include_meta);
267- add_assoc_zval_ex (zv, str_index, ZSTR_LEN (_str_index), subarray);
268- } else if (class_name == " bstr" ) {
269- bstr_object *bnode = zend_container::bstr_fetch_object (Z_OBJ_P (value));
270- zval *subarray = bnode->bstr_data ->to_array (include_meta);
271- add_assoc_zval_ex (zv, str_index, ZSTR_LEN (_str_index), subarray);
272- } else if (class_name == " bint" ) {
273- bint_object *bnode = zend_container::bint_fetch_object (Z_OBJ_P (value));
274- zval *subarray = bnode->bint_data ->to_array (include_meta);
275- add_assoc_zval_ex (zv, str_index, ZSTR_LEN (_str_index), subarray);
276- }
277- efree (str_index);
248+ zval *subarray = zend_container::bnode_fetch_object_data (Z_OBJ_P (value))->to_array (include_meta);
249+ zend_hash_add (Z_ARR_P (zv), str_index, subarray);
278250 }
279251
280252 if (include_meta) {
281- char *_type = estrdup (" _type" );
282- char *_type_data = estrdup (" bdict" );
283- char *_length = estrdup (" _length" );
284- char *_data = estrdup (" _data" );
285253 zval *zv_outer = new zval ();
286254 array_init (zv_outer);
287- add_assoc_string (zv_outer, _type, _type_data);
288- add_assoc_long (zv_outer, _length, length ());
289- add_assoc_zval (zv_outer, _data, zv);
290- efree (_type);
291- efree (_type_data);
292- efree (_length);
293- efree (_data);
255+ add_assoc_string (zv_outer, (char *)" _type" , (char *)" bdict" );
256+ add_assoc_long (zv_outer, (char *)" _length" , length ());
257+ add_assoc_zval (zv_outer, (char *)" _data" , zv);
294258 return zv_outer;
295259 }
296260 return zv;
@@ -299,11 +263,6 @@ zval * bdict::to_array(const bool include_meta) const {
299263zval * bdict::search (const std::string &needle, const long &mode, const std::string path) const {
300264 if (mode < 0 || mode > 1 )
301265 bitem::throw_general_exception (" Illegal search mode" );
302- bool modek = false , modev = false ;
303- if (mode == 0 )
304- modek = true ;
305- else
306- modev = true ;
307266
308267 zval *zv = new zval ();
309268 array_init (zv);
@@ -315,27 +274,15 @@ zval * bdict::search(const std::string &needle, const long &mode, const std::str
315274 zend_ulong num_index;
316275 zend_hash_get_current_key (_data, &_str_index, &num_index);
317276 zval *value = zend_hash_get_current_data (_data);
318- std::string class_name = zend_container::bnode_object_get_class_name (value);
319- std::string str_index (ZSTR_VAL (_str_index));
277+ std::string str_index (ZSTR_VAL (_str_index), ZSTR_LEN (_str_index));
320278 std::string current_path = (path == " " ? " " : path + " /" ) + bitem::escape_key (str_index);
321279
322- if (modek && str_index.find (needle) != std::string::npos) {
280+ if (mode == 0 && str_index.find (needle) != std::string::npos) {
323281 add_next_index_stringl (zv, current_path.c_str (), current_path.length ());
324282 }
325283
326- if (class_name == " bdict" ) {
327- zval *next_result = (zend_container::bdict_fetch_object (Z_OBJ_P (value)))->bdict_data ->search (needle, mode, current_path);
328- zend_hash_append_strings (Z_ARRVAL_P (zv), Z_ARRVAL_P (next_result));
329- } else if (class_name == " blist" ) {
330- zval *next_result = (zend_container::blist_fetch_object (Z_OBJ_P (value)))->blist_data ->search (needle, mode, current_path);
331- zend_hash_append_strings (Z_ARRVAL_P (zv), Z_ARRVAL_P (next_result));
332- } else if (modev && class_name == " bstr" ) {
333- if ((zend_container::bstr_fetch_object (Z_OBJ_P (value)))->bstr_data ->_value .find (needle) != std::string::npos)
334- add_next_index_stringl (zv, current_path.c_str (), current_path.length ());
335- } else if (modev && bitem::is_ll (needle) && class_name == " bint" ) {
336- if ((zend_container::bint_fetch_object (Z_OBJ_P (value)))->bint_data ->_value == std::stoll (needle))
337- add_next_index_stringl (zv, current_path.c_str (), current_path.length ());
338- }
284+ zval *next_result = zend_container::bnode_fetch_object_data (Z_OBJ_P (value))->search (needle, mode, current_path);
285+ zend_hash_append_strings (Z_ARRVAL_P (zv), Z_ARRVAL_P (next_result));
339286 }
340287
341288 return zv;
0 commit comments