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