File Coverage

houdini/houdini_js_e.c
Criterion Covered Total %
statement 16 21 76.1
branch 12 22 54.5
condition n/a
subroutine n/a
pod n/a
total 28 43 65.1


line stmt bran cond sub pod time code
1             #include
2             #include
3             #include
4              
5             #include "houdini.h"
6              
7             static const char JS_ESCAPE[] = {
8             0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0,
9             0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
10             0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1,
11             0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
12             0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
13             0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,
14             0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
15             0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
16             0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
17             0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
18             0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
19             0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
20             0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
21             0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
22             0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
23             0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
24             };
25              
26             int
27 4           houdini_escape_js(gh_buf *ob, const uint8_t *src, size_t size)
28             {
29             size_t i = 0, org, ch;
30              
31 8 50         while (i < size) {
32             org = i;
33 41 100         while (i < size && JS_ESCAPE[src[i]] == 0)
    100          
34 33           i++;
35              
36 8 50         if (likely(i > org)) {
37 8 100         if (unlikely(org == 0)) {
38 4 100         if (i >= size)
39             return 0;
40              
41 2           gh_buf_grow(ob, HOUDINI_ESCAPED_SIZE(size));
42             }
43              
44 6           gh_buf_put(ob, src + org, i - org);
45             }
46              
47             /* escaping */
48 6 100         if (i >= size)
49             break;
50              
51 4           ch = src[i];
52            
53 4           switch (ch) {
54             case '/':
55             /*
56             * Escape only if preceded by a lt
57             */
58 0 0         if (i && src[i - 1] == '<')
    0          
59 0           gh_buf_putc(ob, '\\');
60              
61 0           gh_buf_putc(ob, ch);
62 0           break;
63              
64             case '\r':
65             /*
66             * Escape as \n, and skip the next \n if it's there
67             */
68 0 0         if (i + 1 < size && src[i + 1] == '\n') i++;
    0          
69              
70             case '\n':
71             /*
72             * Escape actually as '\','n', not as '\', '\n'
73             */
74             ch = 'n';
75              
76             default:
77             /*
78             * Normal escaping
79             */
80 4           gh_buf_putc(ob, '\\');
81 4           gh_buf_putc(ob, ch);
82 4           break;
83             }
84              
85 4           i++;
86             }
87              
88             return 1;
89             }
90