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