99
1010typedef struct {
1111 long php_only ;
12+ zend_bool assoc ;
1213 zend_object object ;
1314} php_msgpack_base_t ;
1415
@@ -18,6 +19,7 @@ typedef struct {
1819 long offset ;
1920 msgpack_unpack_t mp ;
2021 long php_only ;
22+ zend_bool assoc ;
2123 zend_bool finished ;
2224 int error ;
2325 zend_object object ;
@@ -175,13 +177,15 @@ static void php_msgpack_unpacker_free(zend_object *object) /* {{{ */ {
175177/* MessagePack */
176178static ZEND_METHOD (msgpack , __construct ) /* {{{ */ {
177179 zend_bool php_only = MSGPACK_G (php_only );
180+ zend_bool assoc = MSGPACK_G (assoc );
178181 php_msgpack_base_t * base = Z_MSGPACK_BASE_P (getThis ());
179182
180183 if (zend_parse_parameters (ZEND_NUM_ARGS (), "|b" , & php_only ) == FAILURE ) {
181184 return ;
182185 }
183186
184187 base -> php_only = php_only ;
188+ base -> assoc = assoc ;
185189}
186190/* }}} */
187191
@@ -198,6 +202,9 @@ static ZEND_METHOD(msgpack, setOption) /* {{{ */ {
198202 case MSGPACK_CLASS_OPT_PHPONLY :
199203 base -> php_only = i_zend_is_true (value );
200204 break ;
205+ case MSGPACK_CLASS_OPT_ASSOC :
206+ base -> assoc = i_zend_is_true (value );
207+ break ;
201208 default :
202209 MSGPACK_WARNING ("[msgpack] (MessagePack::setOption) "
203210 "error setting msgpack option" );
@@ -213,17 +220,20 @@ static ZEND_METHOD(msgpack, pack) /* {{{ */ {
213220 zval * parameter ;
214221 smart_str buf = {0 };
215222 int php_only = MSGPACK_G (php_only );
223+ zend_bool assoc = MSGPACK_G (assoc );
216224 php_msgpack_base_t * base = Z_MSGPACK_BASE_P (getThis ());
217225
218226 if (zend_parse_parameters (ZEND_NUM_ARGS (), "z" , & parameter ) == FAILURE ) {
219227 return ;
220228 }
221229
222230 MSGPACK_G (php_only ) = base -> php_only ;
231+ MSGPACK_G (assoc ) = base -> assoc ;
223232
224233 php_msgpack_serialize (& buf , parameter );
225234
226235 MSGPACK_G (php_only ) = php_only ;
236+ MSGPACK_G (assoc ) = assoc ;
227237 if (buf .s ) {
228238 smart_str_0 (& buf );
229239 ZVAL_STR (return_value , buf .s );
@@ -238,6 +248,7 @@ static ZEND_METHOD(msgpack, unpack) /* {{{ */ {
238248 zend_string * str ;
239249 zval * object = NULL ;
240250 zend_bool php_only = MSGPACK_G (php_only );
251+ zend_bool assoc = MSGPACK_G (assoc );
241252 php_msgpack_base_t * base = Z_MSGPACK_BASE_P (getThis ());
242253
243254 if (zend_parse_parameters (ZEND_NUM_ARGS (), "S|z" , & str , & object ) == FAILURE ) {
@@ -249,6 +260,7 @@ static ZEND_METHOD(msgpack, unpack) /* {{{ */ {
249260 }
250261
251262 MSGPACK_G (php_only ) = base -> php_only ;
263+ MSGPACK_G (assoc ) = base -> assoc ;
252264
253265 if (object == NULL ) {
254266 php_msgpack_unserialize (return_value , ZSTR_VAL (str ), ZSTR_LEN (str ));
@@ -263,6 +275,7 @@ static ZEND_METHOD(msgpack, unpack) /* {{{ */ {
263275 }
264276
265277 MSGPACK_G (php_only ) = php_only ;
278+ MSGPACK_G (assoc ) = assoc ;
266279}
267280/* }}} */
268281
@@ -283,13 +296,15 @@ static ZEND_METHOD(msgpack, unpacker) /* {{{ */ {
283296/* MessagePackUnpacker */
284297static ZEND_METHOD (msgpack_unpacker , __construct ) /* {{{ */ {
285298 zend_bool php_only = MSGPACK_G (php_only );
299+ zend_bool assoc = MSGPACK_G (assoc );
286300 php_msgpack_unpacker_t * unpacker = Z_MSGPACK_UNPACKER_P (getThis ());
287301
288302 if (zend_parse_parameters (ZEND_NUM_ARGS (), "|b" , & php_only ) == FAILURE ) {
289303 return ;
290304 }
291305
292306 unpacker -> php_only = php_only ;
307+ unpacker -> assoc = assoc ;
293308
294309 unpacker -> buffer .s = NULL ;
295310 unpacker -> buffer .a = 0 ;
@@ -322,6 +337,9 @@ static ZEND_METHOD(msgpack_unpacker, setOption) /* {{{ */ {
322337 case MSGPACK_CLASS_OPT_PHPONLY :
323338 unpacker -> php_only = i_zend_is_true (value );
324339 break ;
340+ case MSGPACK_CLASS_OPT_ASSOC :
341+ unpacker -> assoc = i_zend_is_true (value );
342+ break ;
325343 default :
326344 MSGPACK_WARNING ("[msgpack] (MessagePackUnpacker::setOption) "
327345 "error setting msgpack option" );
@@ -356,6 +374,7 @@ static ZEND_METHOD(msgpack_unpacker, execute) /* {{{ */ {
356374 size_t len , off ;
357375 zend_string * str = NULL ;
358376 int ret , error_display = MSGPACK_G (error_display ), php_only = MSGPACK_G (php_only );
377+ zend_bool assoc = MSGPACK_G (assoc );
359378 zval * offset = NULL ;
360379 php_msgpack_unpacker_t * unpacker = Z_MSGPACK_UNPACKER_P (getThis ());
361380
@@ -392,11 +411,13 @@ static ZEND_METHOD(msgpack_unpacker, execute) /* {{{ */ {
392411
393412 MSGPACK_G (error_display ) = 0 ;
394413 MSGPACK_G (php_only ) = unpacker -> php_only ;
414+ MSGPACK_G (assoc ) = unpacker -> assoc ;
395415
396416 ret = msgpack_unserialize_execute (& unpacker -> mp , data , len , & off );
397417
398418 MSGPACK_G (error_display ) = error_display ;
399419 MSGPACK_G (php_only ) = php_only ;
420+ MSGPACK_G (assoc ) = assoc ;
400421
401422 if (str != NULL ) {
402423 if (offset != NULL ) {
@@ -490,6 +511,7 @@ void msgpack_init_class() /* {{{ */ {
490511 msgpack_handlers .free_obj = php_msgpack_base_free ;
491512
492513 zend_declare_class_constant_long (msgpack_ce , ZEND_STRS ("OPT_PHPONLY" ) - 1 , MSGPACK_CLASS_OPT_PHPONLY );
514+ zend_declare_class_constant_long (msgpack_ce , ZEND_STRS ("OPT_ASSOC" ) - 1 , MSGPACK_CLASS_OPT_ASSOC );
493515
494516 /* unpacker */
495517 INIT_CLASS_ENTRY (ce , "MessagePackUnpacker" , msgpack_unpacker_methods );
0 commit comments