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, available;
CODE:
b = SvPV (buffer, size);
available = msgpack_unpacker_buffer_capacity (&self->unpacker);
if (size > available)
{
STRLEN extra = size-available;
msgpack_unpacker_reserve_buffer (&self->unpacker, extra);
}
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 1.648 second using v1.01-cache-2.11-cpan-5511b514fd6 )