File Coverage

src/xh_writer.c
Criterion Covered Total %
statement 45 54 83.3
branch 31 44 70.4
condition n/a
subroutine n/a
pod n/a
total 76 98 77.5


line stmt bran cond sub pod time code
1             #include "xh_config.h"
2             #include "xh_core.h"
3              
4             void
5 0           xh_writer_resize_buffer(xh_writer_t *writer, size_t inc)
6             {
7 0           (void) xh_writer_flush(writer);
8              
9 0           xh_perl_buffer_grow(&writer->main_buf, inc);
10 0           }
11              
12             SV *
13 41           xh_writer_flush_buffer(xh_writer_t *writer, xh_perl_buffer_t *buf)
14             {
15 41 100         if (writer->perl_obj != NULL) {
16 1           xh_writer_write_to_perl_obj(buf, writer->perl_obj);
17 1           return &PL_sv_undef;
18             }
19 40 100         else if (writer->perl_io != NULL) {
20 1           xh_writer_write_to_perl_io(buf, writer->perl_io);
21 1           return &PL_sv_undef;
22             }
23              
24 39           return xh_writer_write_to_perl_scalar(buf);
25             }
26              
27             #ifdef XH_HAVE_ENCODER
28             void
29 2           xh_writer_encode_buffer(xh_writer_t *writer, xh_perl_buffer_t *main_buf, xh_perl_buffer_t *enc_buf)
30             {
31             size_t len;
32              
33             /* 1 char -> 4 chars and '\0' */
34 2           len = (main_buf->cur - main_buf->start) * 4 + 1;
35              
36 2 50         if (len > (size_t) (enc_buf->end - enc_buf->cur)) {
37 0           xh_writer_flush_buffer(writer, enc_buf);
38              
39 0           xh_perl_buffer_grow(enc_buf, len);
40             }
41              
42 2           xh_encoder_encode_perl_buffer(writer->encoder, main_buf, enc_buf);
43 2           }
44             #endif
45              
46             SV *
47 41           xh_writer_flush(xh_writer_t *writer)
48             {
49             xh_perl_buffer_t *buf;
50              
51             #ifdef XH_HAVE_ENCODER
52 41 100         if (writer->encoder != NULL) {
53 2           xh_writer_encode_buffer(writer, &writer->main_buf, &writer->enc_buf);
54 2           buf = &writer->enc_buf;
55             }
56             else {
57 39           buf = &writer->main_buf;
58             }
59             #else
60             buf = &writer->main_buf;
61             #endif
62              
63 41           return xh_writer_flush_buffer(writer, buf);
64             }
65              
66             void
67 41           xh_writer_destroy(xh_writer_t *writer)
68             {
69 41 100         if (writer->perl_obj != NULL || writer->perl_io != NULL) {
    100          
70 2 50         if (writer->main_buf.scalar != NULL)
71 2           SvREFCNT_dec(writer->main_buf.scalar);
72             #ifdef XH_HAVE_ENCODER
73 2 50         if (writer->enc_buf.scalar != NULL)
74 0           SvREFCNT_dec(writer->enc_buf.scalar);
75             }
76 39 100         else if (writer->encoder != NULL) {
77 2 50         if (writer->main_buf.scalar != NULL)
78 2           SvREFCNT_dec(writer->main_buf.scalar);
79             #endif
80             }
81              
82             #ifdef XH_HAVE_ENCODER
83 41           xh_encoder_destroy(writer->encoder);
84             #endif
85 41           }
86              
87             void
88 41           xh_writer_init(xh_writer_t *writer, xh_char_t *encoding, void *output, size_t size, xh_uint_t indent, xh_bool_t trim)
89             {
90 41           writer->indent = indent;
91 41           writer->trim = trim;
92              
93 41           xh_perl_buffer_init(&writer->main_buf, size);
94              
95 41 100         if (encoding[0] != '\0' && xh_strcasecmp(encoding, XH_INTERNAL_ENCODING) != 0) {
    50          
96             #ifdef XH_HAVE_ENCODER
97 2           writer->encoder = xh_encoder_create(encoding, XH_CHAR_CAST XH_INTERNAL_ENCODING);
98 2 50         if (writer->encoder == NULL) {
99 0           croak("Can't create encoder for '%s'", encoding);
100             }
101              
102 2           xh_perl_buffer_init(&writer->enc_buf, size * 4);
103             #else
104             croak("Can't create encoder for '%s'", encoding);
105             #endif
106             }
107              
108 41 100         if (output != NULL) {
109             MAGIC *mg;
110 2           GV *gv = (GV *) output;
111 2 50         IO *io = GvIO(gv);
    50          
    0          
    50          
112              
113 2 50         if (!io)
114 0           croak("Can't use file handle as a PerlIO handle");
115              
116 2 100         if ((mg = SvTIED_mg(MUTABLE_SV(io), PERL_MAGIC_tiedscalar))) {
    100          
117             /* Tied handle */
118 1 50         writer->perl_obj = SvTIED_obj(MUTABLE_SV(io), mg);
119             }
120             else {
121             /* PerlIO handle */
122 1           writer->perl_io = IoOFP(io);
123             }
124             }
125 41           }