File Coverage

xs/writer.xs
Criterion Covered Total %
statement 23 26 88.4
branch 12 18 66.6
condition n/a
subroutine n/a
pod n/a
total 35 44 79.5


line stmt bran cond sub pod time code
1             MODULE = PDF::Make PACKAGE = PDF::Make::Writer
2             PROTOTYPES: ENABLE
3              
4             pdfmake_writer_xs_t *
5             new(class)
6             char *class
7             CODE:
8 15           Newxz(RETVAL, 1, pdfmake_writer_xs_t);
9 15 50         if (pdfmake_buf_init(&RETVAL->buf) != PDFMAKE_OK) {
10 0           Safefree(RETVAL);
11 0           croak("PDF::Make::Writer::new: buffer init failed");
12             }
13             OUTPUT:
14             RETVAL
15              
16             SV *
17             write(self, obj_sv)
18             pdfmake_writer_xs_t *self
19             SV *obj_sv
20             CODE:
21             /* For now, accept a simple scalar and serialize it.
22             * Full object support requires Object::Proto integration in later phases.
23             * This is a placeholder that demonstrates the binding works. */
24 122 100         if (!SvOK(obj_sv)) {
25             /* undef -> null */
26 3           pdfmake_obj_t obj = pdfmake_null();
27 3           pdfmake_write_obj(&self->buf, NULL, &obj);
28             }
29 119 100         else if (SvIOK(obj_sv)) {
30             /* Integer */
31 113           pdfmake_obj_t obj = pdfmake_int(SvIV(obj_sv));
32 113           pdfmake_write_obj(&self->buf, NULL, &obj);
33             }
34 6 100         else if (SvNOK(obj_sv)) {
35             /* Float */
36 4           pdfmake_obj_t obj = pdfmake_real(SvNV(obj_sv));
37 4           pdfmake_write_obj(&self->buf, NULL, &obj);
38             }
39 2 50         else if (SvPOK(obj_sv)) {
40             /* String - emit as literal string for now */
41             STRLEN len;
42 2           const char *str = SvPV(obj_sv, len);
43             /* Placeholder: write as raw bytes. Full implementation needs arena. */
44 2           pdfmake_buf_append(&self->buf, (const uint8_t *)str, len);
45             }
46             else {
47 0           croak("PDF::Make::Writer::write: unsupported object type");
48             }
49             /* Return self for chaining */
50 122           RETVAL = SvREFCNT_inc(ST(0));
51             OUTPUT:
52             RETVAL
53              
54             SV *
55             to_bytes(self)
56             pdfmake_writer_xs_t *self
57             CODE:
58 12           RETVAL = newSVpvn((char *)self->buf.data, self->buf.len);
59 12           pdfmake_buf_clear(&self->buf);
60             OUTPUT:
61             RETVAL
62              
63             UV
64             len(self)
65             pdfmake_writer_xs_t *self
66             CODE:
67 5 50         RETVAL = self->buf.len;
68             OUTPUT:
69             RETVAL
70              
71             void *
72             buf(self)
73             pdfmake_writer_xs_t *self
74             CODE:
75 1 50         RETVAL = self->buf.data;
76             OUTPUT:
77             RETVAL
78              
79             void
80             DESTROY(self)
81             pdfmake_writer_xs_t *self
82             CODE:
83 15           pdfmake_buf_free(&self->buf);
84 15           Safefree(self);
85              
86             BOOT:
87             {
88 90           HV *stash = gv_stashpv("PDF::Make::Writer", GV_ADD);
89 90 50         PDFMAKE_REGISTER_GETTER(stash, "len", pdfmake_writer_xs_t, buf.len, PDFMAKE_FIELD_UV);
    50          
90             }