MsgPack-Raw
view release on metacpan or search on metacpan
xs/Unpacker.xs view on Meta::CPAN
MODULE = MsgPack::Raw PACKAGE = MsgPack::Raw::Unpacker
Unpacker
new (class)
SV *class
PREINIT:
msgpack_raw_unpacker *self;
CODE:
Newxz (self, 1, msgpack_raw_unpacker);
if (!msgpack_unpacker_init (&self->unpacker, MSGPACK_UNPACKER_INIT_BUFFER_SIZE))
{
Safefree (self);
croak ("Could not allocate msgpack unpacker");
}
RETVAL = self;
OUTPUT: RETVAL
void
DESTROY (self)
Unpacker self
CODE:
msgpack_unpacker_destroy (&self->unpacker);
Safefree (self);
void
feed (self, buffer)
Unpacker self
SV *buffer
PREINIT:
const char *b;
STRLEN size;
CODE:
b = SvPV (buffer, size);
if (!msgpack_unpacker_reserve_buffer (&self->unpacker, size))
croak ("feed: out of memory");
memcpy (msgpack_unpacker_buffer (&self->unpacker), b, size);
msgpack_unpacker_buffer_consumed (&self->unpacker, size);
void
next (self)
Unpacker self
PREINIT:
msgpack_unpacked u;
msgpack_unpack_return ret;
PPCODE:
msgpack_unpacked_init (&u);
ret = msgpack_unpacker_next (&self->unpacker, &u);
switch (ret)
{
case MSGPACK_UNPACK_SUCCESS:
mXPUSHs (decode_msgpack (&u.data));
msgpack_unpacked_destroy (&u);
XSRETURN (1);
break;
case MSGPACK_UNPACK_CONTINUE:
msgpack_unpacked_destroy (&u);
XSRETURN_UNDEF;
break;
case MSGPACK_UNPACK_PARSE_ERROR:
msgpack_unpacked_destroy (&u);
croak ("unpack: parse error");
break;
case MSGPACK_UNPACK_NOMEM_ERROR:
msgpack_unpacked_destroy (&u);
croak ("unpack: oom");
break;
default:
msgpack_unpacked_destroy (&u);
croak ("unpack: unknown error");
break;
}
( run in 0.466 second using v1.01-cache-2.11-cpan-4e7a2411597 )