| 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_ */ |