xref: /ext-ds/src/php/objects/php_queue.c (revision 8595b29f)
1 #include "../iterators/php_queue_iterator.h"
2 #include "../handlers/php_queue_handlers.h"
3 #include "../classes/php_queue_ce.h"
4 
5 #include "php_queue.h"
6 
php_ds_queue_create_object_ex(ds_queue_t * queue)7 zend_object *php_ds_queue_create_object_ex(ds_queue_t *queue)
8 {
9 #if PHP_VERSION_ID < 70300
10     php_ds_queue_t *obj = ecalloc(1, sizeof(php_ds_queue_t) + zend_object_properties_size(php_ds_queue_ce));
11 #else
12     php_ds_queue_t *obj = zend_object_alloc(sizeof(php_ds_queue_t), php_ds_queue_ce);
13 #endif
14     zend_object_std_init(&obj->std, php_ds_queue_ce);
15     obj->std.handlers = &php_queue_handlers;
16     obj->queue = queue;
17 
18     return &obj->std;
19 }
20 
php_ds_queue_create_object(zend_class_entry * ce)21 zend_object *php_ds_queue_create_object(zend_class_entry *ce)
22 {
23     return php_ds_queue_create_object_ex(ds_queue());
24 }
25 
php_ds_queue_create_clone(ds_queue_t * queue)26 zend_object *php_ds_queue_create_clone(ds_queue_t *queue)
27 {
28     return php_ds_queue_create_object_ex(ds_queue_clone(queue));
29 }
30 
php_ds_queue_serialize(zval * object,unsigned char ** buffer,size_t * length,zend_serialize_data * data)31 int php_ds_queue_serialize(zval *object, unsigned char **buffer, size_t *length, zend_serialize_data *data)
32 {
33     ds_queue_t *queue = Z_DS_QUEUE_P(object);
34 
35     php_serialize_data_t serialize_data = (php_serialize_data_t) data;
36     PHP_VAR_SERIALIZE_INIT(serialize_data);
37 
38     if (QUEUE_SIZE(queue) == 0) {
39         SERIALIZE_SET_ZSTR(ZSTR_EMPTY_ALLOC());
40 
41     } else {
42 
43         zval *value;
44         smart_str buf = {0};
45 
46         DS_DEQUE_FOREACH(queue->deque, value) {
47             php_var_serialize(&buf, value, &serialize_data);
48         }
49         DS_DEQUE_FOREACH_END();
50 
51         smart_str_0(&buf);
52         SERIALIZE_SET_ZSTR(buf.s);
53         zend_string_release(buf.s);
54     }
55 
56     PHP_VAR_SERIALIZE_DESTROY(serialize_data);
57     return SUCCESS;
58 }
59 
php_ds_queue_unserialize(zval * object,zend_class_entry * ce,const unsigned char * buffer,size_t length,zend_unserialize_data * data)60 int php_ds_queue_unserialize(zval *object, zend_class_entry *ce, const unsigned char *buffer, size_t length, zend_unserialize_data *data)
61 {
62     ds_queue_t *queue = ds_queue();
63 
64     php_unserialize_data_t unserialize_data = (php_unserialize_data_t) data;
65 
66     const unsigned char *pos = buffer;
67     const unsigned char *end = buffer + length;
68 
69     PHP_VAR_UNSERIALIZE_INIT(unserialize_data);
70 
71     while (pos != end) {
72         zval *value = var_tmp_var(&unserialize_data);
73 
74         if ( ! php_var_unserialize(value, &pos, end, &unserialize_data)) {
75             goto error;
76         }
77 
78         ds_queue_push_one(queue, value);
79     }
80 
81     ZVAL_DS_QUEUE(object, queue);
82     PHP_VAR_UNSERIALIZE_DESTROY(unserialize_data);
83     return SUCCESS;
84 
85 error:
86     ds_queue_free(queue);
87     PHP_VAR_UNSERIALIZE_DESTROY(unserialize_data);
88     UNSERIALIZE_ERROR();
89     return FAILURE;
90 }
91