File Coverage

src/xh_writer.h
Criterion Covered Total %
statement 30 30 100.0
branch 5 10 50.0
condition n/a
subroutine n/a
pod n/a
total 35 40 87.5


line stmt bran cond sub pod time code
1             #ifndef _XH_WRITER_H_
2             #define _XH_WRITER_H_
3              
4             #include "xh_config.h"
5             #include "xh_core.h"
6              
7             #define XH_WRITER_RESIZE_BUFFER(w, b, l) \
8             if (((l) + 1) > (size_t) (b->end - b->cur)) { \
9             xh_writer_resize_buffer(w, (l) + 1); \
10             }
11              
12             typedef struct _xh_writer_t xh_writer_t;
13             struct _xh_writer_t {
14             #ifdef XH_HAVE_ENCODER
15             xh_encoder_t *encoder;
16             xh_perl_buffer_t enc_buf;
17             #endif
18             PerlIO *perl_io;
19             SV *perl_obj;
20             xh_perl_buffer_t main_buf;
21             xh_int_t indent;
22             xh_int_t indent_count;
23             xh_bool_t trim;
24             };
25              
26             SV *xh_writer_flush_buffer(xh_writer_t *writer, xh_perl_buffer_t *buf);
27             SV *xh_writer_flush(xh_writer_t *writer);
28             void xh_writer_resize_buffer(xh_writer_t *writer, size_t inc);
29             void xh_writer_destroy(xh_writer_t *writer);
30             void xh_writer_init(xh_writer_t *writer, xh_char_t *encoding, void *output, size_t size, xh_uint_t indent, xh_bool_t trim);
31              
32             XH_INLINE void
33 1           xh_writer_write_to_perl_obj(xh_perl_buffer_t *buf, SV *perl_obj)
34             {
35 1           size_t len = buf->cur - buf->start;
36              
37 1 50         if (len > 0) {
38 1           dSP;
39              
40 1           *buf->cur = '\0';
41 1           SvCUR_set(buf->scalar, len);
42              
43 1           ENTER;
44 1           SAVETMPS;
45              
46 1 50         PUSHMARK(SP);
47 1 50         EXTEND(SP, 2);
48 1           PUSHs((SV *) perl_obj);
49 1           PUSHs(buf->scalar);
50 1           PUTBACK;
51              
52 1           call_method("PRINT", G_DISCARD);
53              
54 1 50         FREETMPS;
55 1           LEAVE;
56              
57 1           buf->cur = buf->start;
58             }
59 1           }
60              
61             XH_INLINE void
62 1           xh_writer_write_to_perl_io(xh_perl_buffer_t *buf, PerlIO *perl_io)
63             {
64 1           size_t len = buf->cur - buf->start;
65              
66 1 50         if (len > 0) {
67 1           *buf->cur = '\0';
68 1           SvCUR_set(buf->scalar, len);
69              
70 1           PerlIO_write(perl_io, buf->start, len);
71              
72 1           buf->cur = buf->start;
73             }
74 1           }
75              
76             XH_INLINE SV *
77 39           xh_writer_write_to_perl_scalar(xh_perl_buffer_t *buf)
78             {
79 39           *buf->cur = '\0';
80 39           SvCUR_set(buf->scalar, buf->cur - buf->start);
81              
82 39           return buf->scalar;
83             }
84              
85             #endif /* _XH_WRITER_H_ */