1 
2 #ifndef MSGPACK_UNPACK_H
3 #define MSGPACK_UNPACK_H
4 
5 #include "ext/standard/php_var.h"
6 
7 #define MSGPACK_EMBED_STACK_SIZE 1024
8 
9 #include "msgpack/unpack_define.h"
10 
11 typedef enum
12 {
13     MSGPACK_UNPACK_SUCCESS     =  2,
14     MSGPACK_UNPACK_EXTRA_BYTES =  1,
15     MSGPACK_UNPACK_CONTINUE    =  0,
16     MSGPACK_UNPACK_PARSE_ERROR = -1,
17     MSGPACK_UNPACK_NOMEM_ERROR = -2
18 } msgpack_unpack_return;
19 
20 typedef struct _msgpack_unserialize_data {
21        void *first;
22        void *last;
23        void *first_dtor;
24        void *last_dtor;
25        HashTable *allowed_classes;
26 } msgpack_unserialize_data_t;
27 
28 typedef struct {
29     zval *retval;
30     const char *eof;
31     int type;
32     unsigned int count;
33     long deps;
34     long stack[MSGPACK_EMBED_STACK_SIZE];
35     msgpack_unserialize_data_t var_hash;
36 } msgpack_unserialize_data;
37 
38 void msgpack_unserialize_var_init(msgpack_unserialize_data_t *var_hashx);
39 void msgpack_unserialize_var_destroy(msgpack_unserialize_data_t *var_hashx, zend_bool err);
40 
41 void msgpack_unserialize_init(msgpack_unserialize_data *unpack);
42 
43 int msgpack_unserialize_uint8(
44     msgpack_unserialize_data *unpack, uint8_t data, zval **obj);
45 int msgpack_unserialize_uint16(
46     msgpack_unserialize_data *unpack, uint16_t data, zval **obj);
47 int msgpack_unserialize_uint32(
48     msgpack_unserialize_data *unpack, uint32_t data, zval **obj);
49 int msgpack_unserialize_uint64(
50     msgpack_unserialize_data *unpack, uint64_t data, zval **obj);
51 int msgpack_unserialize_int8(
52     msgpack_unserialize_data *unpack, int8_t data, zval **obj);
53 int msgpack_unserialize_int16(
54     msgpack_unserialize_data *unpack, int16_t data, zval **obj);
55 int msgpack_unserialize_int32(
56     msgpack_unserialize_data *unpack, int32_t data, zval **obj);
57 int msgpack_unserialize_int64(
58     msgpack_unserialize_data *unpack, int64_t data, zval **obj);
59 int msgpack_unserialize_float(
60     msgpack_unserialize_data *unpack, float data, zval **obj);
61 int msgpack_unserialize_double(
62     msgpack_unserialize_data *unpack, double data, zval **obj);
63 int msgpack_unserialize_nil(msgpack_unserialize_data *unpack, zval **obj);
64 int msgpack_unserialize_true(msgpack_unserialize_data *unpack, zval **obj);
65 int msgpack_unserialize_false(msgpack_unserialize_data *unpack, zval **obj);
66 int msgpack_unserialize_str(
67     msgpack_unserialize_data *unpack, const char* base, const char* data,
68     unsigned int len, zval **obj);
69 int msgpack_unserialize_ext(
70     msgpack_unserialize_data *unpack, const char* base, const char* data,
71     unsigned int len, zval **obj);
72 int msgpack_unserialize_array(
73     msgpack_unserialize_data *unpack, unsigned int count, zval **obj);
74 int msgpack_unserialize_array_item(
75     msgpack_unserialize_data *unpack, zval **container, zval *obj);
76 int msgpack_unserialize_map(
77     msgpack_unserialize_data *unpack, unsigned int count, zval **obj);
78 int msgpack_unserialize_map_item(
79     msgpack_unserialize_data *unpack, zval **container, zval *key, zval *val);
80 
81 /* template functions */
82 #define msgpack_unpack_struct(name)    struct template ## name
83 #define msgpack_unpack_func(ret, name) ret template ## name
84 #define msgpack_unpack_callback(name)  template_callback ## name
85 
86 #define msgpack_unpack_object zval*
87 #define unpack_user           msgpack_unserialize_data
88 #define msgpack_unpack_user   msgpack_unserialize_data
89 
90 struct template_context;
91 typedef struct template_context msgpack_unpack_t;
92 
93 static void template_init(msgpack_unpack_t* unpack);
94 static msgpack_unpack_object template_data(msgpack_unpack_t* unpack);
95 static int template_execute(
96     msgpack_unpack_t* unpack, const char* data, size_t len, size_t* off);
97 
template_callback_root(unpack_user * user)98 static inline msgpack_unpack_object template_callback_root(unpack_user* user)
99 {
100     msgpack_unserialize_init(user);
101     return NULL;
102 }
103 
104 #define template_callback_uint8(user, data, obj) \
105     msgpack_unserialize_uint8(user, data, obj)
106 #define template_callback_uint16(user, data, obj) \
107     msgpack_unserialize_uint16(user, data, obj)
108 #define template_callback_uint32(user, data, obj) \
109     msgpack_unserialize_uint32(user, data, obj)
110 #define template_callback_uint64(user, data, obj) \
111     msgpack_unserialize_uint64(user, data, obj)
112 #define template_callback_int8(user, data, obj) \
113     msgpack_unserialize_int8(user, data, obj)
114 #define template_callback_int16(user, data, obj) \
115     msgpack_unserialize_int16(user, data, obj)
116 #define template_callback_int32(user, data, obj) \
117     msgpack_unserialize_int32(user, data, obj)
118 #define template_callback_int64(user, data, obj) \
119     msgpack_unserialize_int64(user, data, obj)
120 #define template_callback_float(user, data, obj) \
121     msgpack_unserialize_float(user, data, obj)
122 #define template_callback_double(user, data, obj) \
123     msgpack_unserialize_double(user, data, obj)
124 #define template_callback_nil(user, obj) \
125     msgpack_unserialize_nil(user, obj)
126 #define template_callback_true(user, obj) \
127     msgpack_unserialize_true(user, obj)
128 #define template_callback_false(user, obj) \
129     msgpack_unserialize_false(user, obj)
130 #define template_callback_ext(user, base, data, len, obj) \
131     msgpack_unserialize_ext(user, base, data, len, obj)
132 #define template_callback_raw template_callback_str
133 #define template_callback_bin template_callback_str
134 #define template_callback_str(user, base, data, len, obj)  \
135         msgpack_unserialize_str(user, base, data, len, obj)
136 #define template_callback_array(user, count, obj) \
137     msgpack_unserialize_array(user, count, obj)
138 #define template_callback_array_item(user, container, obj) \
139     msgpack_unserialize_array_item(user, container, obj)
140 #define template_callback_map(user, count, obj) \
141     msgpack_unserialize_map(user, count, obj)
142 #define template_callback_map_item(user, container, key, val) \
143     msgpack_unserialize_map_item(user, container, key, val)
144 
145 #include "msgpack/unpack_template.h"
146 
147 #endif
148