File Coverage

xs/Unpacker.xs
Criterion Covered Total %
statement 19 31 61.2
branch 3 6 50.0
condition n/a
subroutine n/a
pod n/a
total 22 37 59.4


line stmt bran cond sub pod time code
1             MODULE = MsgPack::Raw PACKAGE = MsgPack::Raw::Unpacker
2              
3             Unpacker
4             new (class)
5             SV *class
6              
7             PREINIT:
8             msgpack_raw_unpacker *self;
9              
10             CODE:
11 6           Newxz (self, 1, msgpack_raw_unpacker);
12 6 50         if (!msgpack_unpacker_init (&self->unpacker, MSGPACK_UNPACKER_INIT_BUFFER_SIZE))
13             {
14 0           Safefree (self);
15 0           croak ("Could not allocate msgpack unpacker");
16             }
17              
18 6           RETVAL = self;
19              
20             OUTPUT: RETVAL
21              
22             void
23             DESTROY (self)
24             Unpacker self
25              
26             CODE:
27 6           msgpack_unpacker_destroy (&self->unpacker);
28 6           Safefree (self);
29              
30             void
31             feed (self, buffer)
32             Unpacker self
33             SV *buffer
34              
35             PREINIT:
36             const char *b;
37             STRLEN size;
38              
39             CODE:
40 14           b = SvPV (buffer, size);
41              
42 14 50         if (!msgpack_unpacker_reserve_buffer (&self->unpacker, size))
43 0           croak ("feed: out of memory");
44              
45 14           memcpy (msgpack_unpacker_buffer (&self->unpacker), b, size);
46 14           msgpack_unpacker_buffer_consumed (&self->unpacker, size);
47              
48             void
49             next (self)
50             Unpacker self
51              
52             PREINIT:
53             msgpack_unpacked u;
54             msgpack_unpack_return ret;
55              
56             PPCODE:
57 21           msgpack_unpacked_init (&u);
58 21           ret = msgpack_unpacker_next (&self->unpacker, &u);
59 21           switch (ret)
60             {
61 14           case MSGPACK_UNPACK_SUCCESS:
62 14 50         mXPUSHs (decode_msgpack (&u.data));
63 14           msgpack_unpacked_destroy (&u);
64 14           XSRETURN (1);
65             break;
66              
67 7           case MSGPACK_UNPACK_CONTINUE:
68 7           msgpack_unpacked_destroy (&u);
69 7           XSRETURN_UNDEF;
70             break;
71              
72 0           case MSGPACK_UNPACK_PARSE_ERROR:
73 0           msgpack_unpacked_destroy (&u);
74 0           croak ("unpack: parse error");
75             break;
76              
77 0           case MSGPACK_UNPACK_NOMEM_ERROR:
78 0           msgpack_unpacked_destroy (&u);
79 0           croak ("unpack: oom");
80             break;
81              
82 0           default:
83 0           msgpack_unpacked_destroy (&u);
84 0           croak ("unpack: unknown error");
85             break;
86             }
87