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