static VALUE Unpacker_reset(VALUE self) { UNPACKER(self, uk); msgpack_unpacker_reset(uk); return Qnil; }
msgpack_unpack_return msgpack_unpacker_next(msgpack_unpacker* mpac, msgpack_unpacked* result) { int ret; ret = unpacker_next(mpac, result); if (ret == MSGPACK_UNPACK_SUCCESS) { msgpack_unpacker_reset(mpac); } return ret; }
msgpack_unpack_return msgpack_unpacker_next_with_size(msgpack_unpacker* mpac, msgpack_unpacked* result, size_t *p_bytes) { int ret; ret = unpacker_next(mpac, result); if (ret == MSGPACK_UNPACK_SUCCESS || ret == MSGPACK_UNPACK_CONTINUE) { *p_bytes = mpac->parsed; } if (ret == MSGPACK_UNPACK_SUCCESS) { msgpack_unpacker_reset(mpac); } return ret; }
VALUE MessagePack_unpack(int argc, VALUE* argv) { VALUE src; switch(argc) { case 1: src = argv[0]; break; default: rb_raise(rb_eArgError, "wrong number of arguments (%d for 1)", argc); } VALUE io = Qnil; if(rb_type(src) != T_STRING) { io = src; src = Qnil; } // TODO create an instance if io is set for thread safety? //VALUE self = Unpacker_alloc(cMessagePack_Unpacker); //UNPACKER(self, uk); msgpack_unpacker_reset(s_unpacker); msgpack_buffer_reset_io(UNPACKER_BUFFER_(s_unpacker)); if(io != Qnil) { MessagePack_Buffer_initialize(UNPACKER_BUFFER_(s_unpacker), io, Qnil); } if(src != Qnil) { /* prefer reference than copying; see MessagePack_Unpacker_module_init */ msgpack_buffer_append_string(UNPACKER_BUFFER_(s_unpacker), src); } int r = msgpack_unpacker_read(s_unpacker, 0); if(r < 0) { raise_unpacker_error(r); } /* raise if extra bytes follow */ if(msgpack_buffer_top_readable_size(UNPACKER_BUFFER_(s_unpacker)) > 0) { rb_raise(eMalformedFormatError, "extra bytes follow after a deserialized object"); } return msgpack_unpacker_get_last_object(s_unpacker); }
bool msgpack_unpacker_next(msgpack_unpacker* mpac, msgpack_unpacked* result) { if(result->zone != NULL) { msgpack_zone_free(result->zone); } int ret = msgpack_unpacker_execute(mpac); if(ret <= 0) { result->zone = NULL; memset(&result->data, 0, sizeof(msgpack_object)); return false; } result->zone = msgpack_unpacker_release_zone(mpac); result->data = msgpack_unpacker_data(mpac); msgpack_unpacker_reset(mpac); return true; }
msgpack_unpack_return msgpack_unpacker_next(msgpack_unpacker* mpac, msgpack_unpacked* result) { msgpack_unpacked_destroy(result); int ret = msgpack_unpacker_execute(mpac); if(ret < 0) { result->zone = NULL; memset(&result->data, 0, sizeof(msgpack_object)); return MSGPACK_UNPACK_PARSE_ERROR; } if(ret == 0) { return MSGPACK_UNPACK_CONTINUE; } result->zone = msgpack_unpacker_release_zone(mpac); result->data = msgpack_unpacker_data(mpac); msgpack_unpacker_reset(mpac); return MSGPACK_UNPACK_SUCCESS; }