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
|
|
|
|
|
|
} |