File Coverage

buffer.c
Criterion Covered Total %
statement 59 59 100.0
branch 13 18 72.2
condition n/a
subroutine n/a
pod n/a
total 72 77 93.5


line stmt bran cond sub pod time code
1             #define PERL_NO_GET_CONTEXT
2             #include "EXTERN.h"
3             #include "perl.h"
4             #include "XSUB.h"
5              
6             #include
7             #include
8              
9             #include "buffer.h"
10              
11 2140           void buf_init(pTHX_ Buffer *b) {
12 2140           b->sv = sv_2mortal(newSVpvn("", 0));
13 2140 50         SvGROW(b->sv, 256);
    50          
14 2140           b->ptr = SvPVX(b->sv);
15 2140           b->len = 0;
16 2140           b->cap = SvLEN(b->sv) - 1;
17 2140           }
18              
19 1682963           void buf_grow(pTHX_ Buffer *b, STRLEN need) {
20 1682963 100         if (b->len + need > b->cap) {
21 2174 50         STRLEN newcap = b->cap ? b->cap : 256;
22 4423 100         while (b->len + need > newcap) newcap *= 2;
23 2174 50         SvGROW(b->sv, newcap + 1);
    50          
24 2174           b->ptr = SvPVX(b->sv);
25 2174           b->cap = SvLEN(b->sv) - 1;
26             }
27 1682963           }
28              
29 509800           void buf_append(pTHX_ Buffer *b, const char *data, STRLEN len) {
30 509800           buf_grow(aTHX_ b, len);
31 509800           memcpy(b->ptr + b->len, data, len);
32 509800           b->len += len;
33 509800           }
34              
35 77521           void buf_byte(pTHX_ Buffer *b, uint8_t v) {
36 77521           buf_grow(aTHX_ b, 1);
37 77521           b->ptr[b->len++] = (char)v;
38 77521           }
39              
40 67144           void buf_le16(pTHX_ Buffer *b, uint16_t v) {
41 67144           buf_grow(aTHX_ b, 2);
42 67144           b->ptr[b->len++] = (char)(v & 0xff);
43 67144           b->ptr[b->len++] = (char)((v >> 8) & 0xff);
44 67144           }
45              
46 313971           void buf_le32(pTHX_ Buffer *b, uint32_t v) {
47 313971           buf_grow(aTHX_ b, 4);
48 313971           b->ptr[b->len++] = (char)(v & 0xff);
49 313971           b->ptr[b->len++] = (char)((v >> 8) & 0xff);
50 313971           b->ptr[b->len++] = (char)((v >> 16) & 0xff);
51 313971           b->ptr[b->len++] = (char)((v >> 24) & 0xff);
52 313971           }
53              
54 194730           void buf_le64(pTHX_ Buffer *b, uint64_t v) {
55             int i;
56 194730           buf_grow(aTHX_ b, 8);
57 1752570 100         for (i = 0; i < 8; i++) b->ptr[b->len++] = (char)((v >> (i * 8)) & 0xff);
58 194730           }
59              
60 15           void buf_lefloat(pTHX_ Buffer *b, float f) {
61             uint32_t v;
62 15           memcpy(&v, &f, 4);
63 15           buf_le32(aTHX_ b, v);
64 15           }
65              
66 43581           void buf_ledouble(pTHX_ Buffer *b, double d) {
67             uint64_t v;
68 43581           memcpy(&v, &d, 8);
69 43581           buf_le64(aTHX_ b, v);
70 43581           }
71              
72 519568           void buf_varint(pTHX_ Buffer *b, UV n) {
73 519568           buf_grow(aTHX_ b, 10);
74 605859 100         while (n >= 0x80) {
75 86291           b->ptr[b->len++] = (char)((n & 0x7f) | 0x80);
76 86291           n >>= 7;
77             }
78 519568           b->ptr[b->len++] = (char)n;
79 519568           }
80              
81 509783           void buf_string(pTHX_ Buffer *b, const char *s, STRLEN len) {
82 509783           buf_varint(aTHX_ b, len);
83 509783           buf_append(aTHX_ b, s, len);
84 509783           }