File Coverage

Parser.xs
Criterion Covered Total %
statement 28 35 80.0
branch 17 32 53.1
condition n/a
subroutine n/a
pod n/a
total 45 67 67.1


line stmt bran cond sub pod time code
1             /* vim: set expandtab sts=4: */
2             #include
3             #include
4             #include
5              
6             #include "ppport.h"
7              
8             #include "rdb_parser.h"
9              
10             MODULE = RedisDB::Parser PACKAGE = RedisDB::Parser::XS PREFIX = rdb_parser_
11             PROTOTYPES: DISABLE
12              
13             RDB_parser*
14             rdb_parser__new(master, error_class, utf8)
15             SV* master;
16             SV* error_class;
17             int utf8;
18             CODE:
19 4           RETVAL = rdb_parser__init(master, error_class, utf8);
20 4           RETVAL->thx = (IV)PERL_GET_THX;
21             OUTPUT:
22             RETVAL
23              
24             void
25             rdb_parser_DESTROY(parser)
26             RDB_parser *parser;
27             CODE:
28 4 50         if (parser->thx == (IV)PERL_GET_THX) {
29 4           rdb_parser__free(parser);
30             }
31              
32             SV*
33             rdb_parser_build_request(parser, ...)
34             RDB_parser *parser;
35             PREINIT:
36             int i;
37             STRLEN len;
38             char *pv;
39             SV *tmp;
40             CODE:
41 9           RETVAL = newSV(128);
42 9           sv_setpvf(RETVAL, "*%ld\r\n", items - 1L);
43 28 100         for (i = 1; i < items; i++) {
44 19 100         if (parser->utf8) {
45 4           tmp = sv_mortalcopy(ST(i));
46 4 100         pv = SvPVutf8(tmp, len);
47             }
48             else {
49 15 100         pv = SvPV(ST(i), len);
50             }
51 19           sv_catpvf(RETVAL, "$%ld\r\n", (long)len);
52 19           sv_catpvn(RETVAL, pv, len);
53 19           sv_catpvn(RETVAL, "\r\n", 2);
54             }
55             OUTPUT:
56             RETVAL
57              
58             int
59             rdb_parser_push_callback(parser, cb)
60             RDB_parser *parser;
61             SV* cb;
62             CODE:
63 27           SvREFCNT_inc(cb);
64 27           av_push(parser->callbacks, cb);
65 27           RETVAL = 1 + av_len(parser->callbacks);
66             OUTPUT:
67             RETVAL
68              
69             SV*
70             rdb_parser_set_default_callback(parser, cb)
71             RDB_parser *parser;
72             SV* cb;
73             CODE:
74 1 50         if (parser->default_cb != NULL)
75 0 0         SvSetSV(parser->default_cb, cb);
76             else
77 1           parser->default_cb = newSVsv(cb);
78 1           RETVAL = newSVsv(cb);
79             OUTPUT:
80             RETVAL
81              
82             void
83             rdb_parser_callbacks(parser)
84             RDB_parser *parser;
85             PREINIT:
86             int i, len;
87             SV **ptr;
88             PPCODE:
89 3           len = 1 + av_len(parser->callbacks);
90 3 50         if (GIMME_V != G_ARRAY) {
    50          
91 3 50         XPUSHs(sv_2mortal(newSViv(len)));
92             }
93             else {
94 0 0         EXTEND(SP, len);
    0          
95 0 0         for (i=0; i < len; i++) {
96 0           ptr = av_fetch(parser->callbacks, i, 0);
97 0 0         if (ptr == NULL) {
98 0           croak("Callback doesn't exist");
99             }
100 0           PUSHs(*ptr);
101             }
102             }
103              
104             void
105             rdb_parser_propagate_reply(parser, reply)
106             RDB_parser *parser;
107             SV *reply;
108             CODE:
109 1           rdb_parser__propagate_reply(parser, reply);
110              
111             int
112             rdb_parser_parse(parser, data)
113             RDB_parser *parser;
114             SV* data;
115             CODE:
116 30           sv_catsv(parser->buffer, data);
117 30           RETVAL = 0;
118 53 100         while (sv_len(parser->buffer) && rdb_parser__parse_reply(parser))
    100          
119 23           RETVAL++;
120             OUTPUT:
121             RETVAL