Skip to content

Commit 189c8e5

Browse files
committed
Merge branch 'dev'
2 parents 514319d + f89d811 commit 189c8e5

File tree

15 files changed

+179
-275
lines changed

15 files changed

+179
-275
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
.vscode/
12
autom4te.cache/
23
build/
34
include/

.gitlab-ci.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,15 @@ image: php:latest
33
before_script:
44
- export NO_INTERACTION=1
55
- apt-get -y update
6-
- apt-get -y install autoconf build-essential gcc g++
6+
- apt-get -y install autoconf build-essential gcc g++ valgrind
77

88
build:
99
stage: build
1010
script:
1111
- phpize
1212
- ./configure --enable-bencode
1313
- make -j$(nproc)
14-
- make test
14+
- make test TESTS="-m"
1515
artifacts:
1616
name: "${CI_BUILD_NAME}_${CI_BUILD_REF_NAME}"
1717
expire_in: 2 weeks

.travis.yml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ addons:
1212
- build-essential
1313
- gcc-5
1414
- g++-5
15+
- valgrind
1516

1617
php:
1718
- '7.1'
@@ -25,4 +26,4 @@ script:
2526
- phpize
2627
- ./configure --enable-bencode
2728
- make -j$(nproc)
28-
- make test
29+
- make test TESTS="-m"

bdict.cc

Lines changed: 28 additions & 81 deletions
Original file line numberDiff line numberDiff line change
@@ -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 {
299263
zval * 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

Comments
 (0)