ox-bundlecachetest 2.14.23
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/CHANGELOG.md +751 -0
- data/LICENSE +21 -0
- data/README.md +351 -0
- data/ext/ox/attr.h +78 -0
- data/ext/ox/base64.c +105 -0
- data/ext/ox/base64.h +18 -0
- data/ext/ox/buf.h +162 -0
- data/ext/ox/builder.c +948 -0
- data/ext/ox/cache.c +351 -0
- data/ext/ox/cache.h +21 -0
- data/ext/ox/cache8.c +106 -0
- data/ext/ox/cache8.h +23 -0
- data/ext/ox/dump.c +1260 -0
- data/ext/ox/err.c +46 -0
- data/ext/ox/err.h +36 -0
- data/ext/ox/extconf.rb +47 -0
- data/ext/ox/gen_load.c +342 -0
- data/ext/ox/hash_load.c +309 -0
- data/ext/ox/helper.h +84 -0
- data/ext/ox/intern.c +157 -0
- data/ext/ox/intern.h +25 -0
- data/ext/ox/obj_load.c +809 -0
- data/ext/ox/ox.c +1649 -0
- data/ext/ox/ox.h +245 -0
- data/ext/ox/parse.c +1197 -0
- data/ext/ox/sax.c +1570 -0
- data/ext/ox/sax.h +69 -0
- data/ext/ox/sax_as.c +270 -0
- data/ext/ox/sax_buf.c +209 -0
- data/ext/ox/sax_buf.h +204 -0
- data/ext/ox/sax_hint.c +207 -0
- data/ext/ox/sax_hint.h +40 -0
- data/ext/ox/sax_stack.h +113 -0
- data/ext/ox/slotcache.c +158 -0
- data/ext/ox/slotcache.h +19 -0
- data/ext/ox/special.c +390 -0
- data/ext/ox/special.h +14 -0
- data/ext/ox/type.h +39 -0
- data/lib/ox/bag.rb +103 -0
- data/lib/ox/cdata.rb +10 -0
- data/lib/ox/comment.rb +11 -0
- data/lib/ox/doctype.rb +11 -0
- data/lib/ox/document.rb +28 -0
- data/lib/ox/element.rb +464 -0
- data/lib/ox/error.rb +25 -0
- data/lib/ox/hasattrs.rb +54 -0
- data/lib/ox/instruct.rb +34 -0
- data/lib/ox/node.rb +23 -0
- data/lib/ox/raw.rb +12 -0
- data/lib/ox/sax.rb +97 -0
- data/lib/ox/version.rb +4 -0
- data/lib/ox/xmlrpc_adapter.rb +33 -0
- data/lib/ox.rb +79 -0
- metadata +128 -0
data/ext/ox/sax_buf.h
ADDED
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
/* sax_buf.h
|
|
2
|
+
* Copyright (c) 2011, Peter Ohler
|
|
3
|
+
* All rights reserved.
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
#ifndef OX_SAX_BUF_H
|
|
7
|
+
#define OX_SAX_BUF_H
|
|
8
|
+
|
|
9
|
+
#include <stdio.h>
|
|
10
|
+
|
|
11
|
+
typedef struct _buf {
|
|
12
|
+
char base[0x00001000];
|
|
13
|
+
char *head;
|
|
14
|
+
char *end;
|
|
15
|
+
char *tail;
|
|
16
|
+
char *read_end; /* one past last character read */
|
|
17
|
+
char *pro; /* protection start, buffer can not slide past this point */
|
|
18
|
+
char *str; /* start of current string being read */
|
|
19
|
+
off_t pos;
|
|
20
|
+
off_t line;
|
|
21
|
+
off_t col;
|
|
22
|
+
off_t pro_pos;
|
|
23
|
+
off_t pro_line;
|
|
24
|
+
off_t pro_col;
|
|
25
|
+
int (*read_func)(struct _buf *buf);
|
|
26
|
+
union {
|
|
27
|
+
int fd;
|
|
28
|
+
VALUE io;
|
|
29
|
+
const char *str;
|
|
30
|
+
} in;
|
|
31
|
+
struct _saxDrive *dr;
|
|
32
|
+
} *Buf;
|
|
33
|
+
|
|
34
|
+
typedef struct _checkPt {
|
|
35
|
+
off_t pro_dif;
|
|
36
|
+
off_t pos;
|
|
37
|
+
off_t line;
|
|
38
|
+
off_t col;
|
|
39
|
+
char c;
|
|
40
|
+
} *CheckPt;
|
|
41
|
+
|
|
42
|
+
#define CHECK_PT_INIT {-1, 0, 0, 0, '\0'}
|
|
43
|
+
|
|
44
|
+
extern void ox_sax_buf_init(Buf buf, VALUE io);
|
|
45
|
+
extern int ox_sax_buf_read(Buf buf);
|
|
46
|
+
|
|
47
|
+
static inline char buf_get(Buf buf) {
|
|
48
|
+
// printf("*** drive get from '%s' from start: %ld buf: %p from read_end: %ld\n", buf->tail, buf->tail -
|
|
49
|
+
// buf->head, buf->head, buf->read_end - buf->tail);
|
|
50
|
+
if (buf->read_end <= buf->tail) {
|
|
51
|
+
if (0 != ox_sax_buf_read(buf)) {
|
|
52
|
+
return '\0';
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
if ('\n' == *buf->tail) {
|
|
56
|
+
buf->line++;
|
|
57
|
+
buf->col = 0;
|
|
58
|
+
} else {
|
|
59
|
+
buf->col++;
|
|
60
|
+
}
|
|
61
|
+
buf->pos++;
|
|
62
|
+
|
|
63
|
+
return *buf->tail++;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
static inline void buf_backup(Buf buf) {
|
|
67
|
+
buf->tail--;
|
|
68
|
+
buf->col--;
|
|
69
|
+
buf->pos--;
|
|
70
|
+
if (0 >= buf->col) {
|
|
71
|
+
buf->line--;
|
|
72
|
+
// allow col to be negative since we never backup twice in a row
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
static inline void buf_protect(Buf buf) {
|
|
77
|
+
buf->pro = buf->tail;
|
|
78
|
+
buf->str = buf->tail; // can't have str before pro
|
|
79
|
+
buf->pro_pos = buf->pos;
|
|
80
|
+
buf->pro_line = buf->line;
|
|
81
|
+
buf->pro_col = buf->col;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
static inline void buf_reset(Buf buf) {
|
|
85
|
+
buf->tail = buf->pro;
|
|
86
|
+
buf->pos = buf->pro_pos;
|
|
87
|
+
buf->line = buf->pro_line;
|
|
88
|
+
buf->col = buf->pro_col;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
/* Starts by reading a character so it is safe to use with an empty or
|
|
92
|
+
* compacted buffer.
|
|
93
|
+
*/
|
|
94
|
+
static inline char buf_next_non_white(Buf buf) {
|
|
95
|
+
char c;
|
|
96
|
+
|
|
97
|
+
while ('\0' != (c = buf_get(buf))) {
|
|
98
|
+
switch (c) {
|
|
99
|
+
case ' ':
|
|
100
|
+
case '\t':
|
|
101
|
+
case '\f':
|
|
102
|
+
case '\n':
|
|
103
|
+
case '\r': break;
|
|
104
|
+
default: return c;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
return '\0';
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
/* Starts by reading a character so it is safe to use with an empty or
|
|
111
|
+
* compacted buffer.
|
|
112
|
+
*/
|
|
113
|
+
static inline char buf_next_white(Buf buf) {
|
|
114
|
+
char c;
|
|
115
|
+
|
|
116
|
+
while ('\0' != (c = buf_get(buf))) {
|
|
117
|
+
switch (c) {
|
|
118
|
+
case ' ':
|
|
119
|
+
case '\t':
|
|
120
|
+
case '\f':
|
|
121
|
+
case '\n':
|
|
122
|
+
case '\r':
|
|
123
|
+
case '\0': return c;
|
|
124
|
+
default: break;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
return '\0';
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
static inline void buf_cleanup(Buf buf) {
|
|
131
|
+
if (buf->base != buf->head && 0 != buf->head) {
|
|
132
|
+
xfree(buf->head);
|
|
133
|
+
buf->head = 0;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
static inline int is_white(char c) {
|
|
138
|
+
switch (c) {
|
|
139
|
+
case ' ':
|
|
140
|
+
case '\t':
|
|
141
|
+
case '\f':
|
|
142
|
+
case '\n':
|
|
143
|
+
case '\r': return 1;
|
|
144
|
+
default: break;
|
|
145
|
+
}
|
|
146
|
+
return 0;
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
static inline void buf_checkpoint(Buf buf, CheckPt cp) {
|
|
150
|
+
cp->pro_dif = (int)(buf->tail - buf->pro);
|
|
151
|
+
cp->pos = buf->pos;
|
|
152
|
+
cp->line = buf->line;
|
|
153
|
+
cp->col = buf->col;
|
|
154
|
+
cp->c = *(buf->tail - 1);
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
static inline int buf_checkset(CheckPt cp) {
|
|
158
|
+
return (0 <= cp->pro_dif);
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
static inline char buf_checkback(Buf buf, CheckPt cp) {
|
|
162
|
+
buf->tail = buf->pro + cp->pro_dif;
|
|
163
|
+
buf->pos = cp->pos;
|
|
164
|
+
buf->line = cp->line;
|
|
165
|
+
buf->col = cp->col;
|
|
166
|
+
return cp->c;
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
static inline void buf_collapse_return(char *str) {
|
|
170
|
+
char *s = str;
|
|
171
|
+
char *back = str;
|
|
172
|
+
|
|
173
|
+
for (; '\0' != *s; s++) {
|
|
174
|
+
if (back != str && '\n' == *s && '\r' == *(back - 1)) {
|
|
175
|
+
*(back - 1) = '\n';
|
|
176
|
+
} else {
|
|
177
|
+
*back++ = *s;
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
*back = '\0';
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
static inline void buf_collapse_white(char *str) {
|
|
184
|
+
char *s = str;
|
|
185
|
+
char *back = str;
|
|
186
|
+
|
|
187
|
+
for (; '\0' != *s; s++) {
|
|
188
|
+
switch (*s) {
|
|
189
|
+
case ' ':
|
|
190
|
+
case '\t':
|
|
191
|
+
case '\f':
|
|
192
|
+
case '\n':
|
|
193
|
+
case '\r':
|
|
194
|
+
if (back == str || ' ' != *(back - 1)) {
|
|
195
|
+
*back++ = ' ';
|
|
196
|
+
}
|
|
197
|
+
break;
|
|
198
|
+
default: *back++ = *s; break;
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
*back = '\0';
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
#endif /* OX_SAX_BUF_H */
|
data/ext/ox/sax_hint.c
ADDED
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
/* hint.c
|
|
2
|
+
* Copyright (c) 2011, Peter Ohler
|
|
3
|
+
* All rights reserved.
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
#include "sax_hint.h"
|
|
7
|
+
|
|
8
|
+
#include <ruby.h>
|
|
9
|
+
#include <stdbool.h>
|
|
10
|
+
#include <stdio.h>
|
|
11
|
+
#include <string.h>
|
|
12
|
+
|
|
13
|
+
static const char *audio_video_0[] = {"audio", "video", 0};
|
|
14
|
+
static const char *colgroup_0[] = {"colgroup", 0};
|
|
15
|
+
static const char *details_0[] = {"details", 0};
|
|
16
|
+
static const char *dl_0[] = {"dl", 0};
|
|
17
|
+
static const char *dt_th_0[] = {"dt", "th", 0};
|
|
18
|
+
static const char *fieldset_0[] = {"fieldset", 0};
|
|
19
|
+
static const char *figure_0[] = {"figure", 0};
|
|
20
|
+
static const char *frameset_0[] = {"frameset", 0};
|
|
21
|
+
static const char *head_0[] = {"head", 0};
|
|
22
|
+
static const char *html_0[] = {"html", 0};
|
|
23
|
+
static const char *map_0[] = {"map", 0};
|
|
24
|
+
static const char *ol_ul_menu_0[] = {"ol", "ul", "menu", 0};
|
|
25
|
+
static const char *optgroup_select_datalist_0[] = {"optgroup", "select", "datalist", 0};
|
|
26
|
+
static const char *ruby_0[] = {"ruby", 0};
|
|
27
|
+
static const char *table_0[] = {"table", 0};
|
|
28
|
+
static const char *tr_0[] = {"tr", 0};
|
|
29
|
+
|
|
30
|
+
static struct _hint html_hint_array[] = {
|
|
31
|
+
{"!--", false, false, false, ActiveOverlay, NULL}, // comment
|
|
32
|
+
{"a", false, false, false, ActiveOverlay, NULL},
|
|
33
|
+
{"abbr", false, false, false, ActiveOverlay, NULL},
|
|
34
|
+
{"acronym", false, false, false, ActiveOverlay, NULL},
|
|
35
|
+
{"address", false, false, false, ActiveOverlay, NULL},
|
|
36
|
+
{"applet", false, false, false, ActiveOverlay, NULL},
|
|
37
|
+
{"area", true, false, false, ActiveOverlay, map_0},
|
|
38
|
+
{"article", false, false, false, ActiveOverlay, NULL},
|
|
39
|
+
{"aside", false, false, false, ActiveOverlay, NULL},
|
|
40
|
+
{"audio", false, false, false, ActiveOverlay, NULL},
|
|
41
|
+
{"b", false, false, false, ActiveOverlay, NULL},
|
|
42
|
+
{"base", true, false, false, ActiveOverlay, head_0},
|
|
43
|
+
{"basefont", true, false, false, ActiveOverlay, head_0},
|
|
44
|
+
{"bdi", false, false, false, ActiveOverlay, NULL},
|
|
45
|
+
{"bdo", false, true, false, ActiveOverlay, NULL},
|
|
46
|
+
{"big", false, false, false, ActiveOverlay, NULL},
|
|
47
|
+
{"blockquote", false, false, false, ActiveOverlay, NULL},
|
|
48
|
+
{"body", false, false, false, ActiveOverlay, html_0},
|
|
49
|
+
{"br", true, false, false, ActiveOverlay, NULL},
|
|
50
|
+
{"button", false, false, false, ActiveOverlay, NULL},
|
|
51
|
+
{"canvas", false, false, false, ActiveOverlay, NULL},
|
|
52
|
+
{"caption", false, false, false, ActiveOverlay, table_0},
|
|
53
|
+
{"center", false, false, false, ActiveOverlay, NULL},
|
|
54
|
+
{"cite", false, false, false, ActiveOverlay, NULL},
|
|
55
|
+
{"code", false, false, false, ActiveOverlay, NULL},
|
|
56
|
+
{"col", true, false, false, ActiveOverlay, colgroup_0},
|
|
57
|
+
{"colgroup", false, false, false, ActiveOverlay, NULL},
|
|
58
|
+
{"command", true, false, false, ActiveOverlay, NULL},
|
|
59
|
+
{"datalist", false, false, false, ActiveOverlay, NULL},
|
|
60
|
+
{"dd", false, false, false, ActiveOverlay, dl_0},
|
|
61
|
+
{"del", false, false, false, ActiveOverlay, NULL},
|
|
62
|
+
{"details", false, false, false, ActiveOverlay, NULL},
|
|
63
|
+
{"dfn", false, false, false, ActiveOverlay, NULL},
|
|
64
|
+
{"dialog", false, false, false, ActiveOverlay, dt_th_0},
|
|
65
|
+
{"dir", false, false, false, ActiveOverlay, NULL},
|
|
66
|
+
{"div", false, true, false, ActiveOverlay, NULL},
|
|
67
|
+
{"dl", false, false, false, ActiveOverlay, NULL},
|
|
68
|
+
{"dt", false, true, false, ActiveOverlay, dl_0},
|
|
69
|
+
{"em", false, false, false, ActiveOverlay, NULL},
|
|
70
|
+
{"embed", true, false, false, ActiveOverlay, NULL},
|
|
71
|
+
{"fieldset", false, false, false, ActiveOverlay, NULL},
|
|
72
|
+
{"figcaption", false, false, false, ActiveOverlay, figure_0},
|
|
73
|
+
{"figure", false, false, false, ActiveOverlay, NULL},
|
|
74
|
+
{"font", false, true, false, ActiveOverlay, NULL},
|
|
75
|
+
{"footer", false, false, false, ActiveOverlay, NULL},
|
|
76
|
+
{"form", false, false, false, ActiveOverlay, NULL},
|
|
77
|
+
{"frame", true, false, false, ActiveOverlay, frameset_0},
|
|
78
|
+
{"frameset", false, false, false, ActiveOverlay, NULL},
|
|
79
|
+
{"h1", false, false, false, ActiveOverlay, NULL},
|
|
80
|
+
{"h2", false, false, false, ActiveOverlay, NULL},
|
|
81
|
+
{"h3", false, false, false, ActiveOverlay, NULL},
|
|
82
|
+
{"h4", false, false, false, ActiveOverlay, NULL},
|
|
83
|
+
{"h5", false, false, false, ActiveOverlay, NULL},
|
|
84
|
+
{"h6", false, false, false, ActiveOverlay, NULL},
|
|
85
|
+
{"head", false, false, false, ActiveOverlay, html_0},
|
|
86
|
+
{"header", false, false, false, ActiveOverlay, NULL},
|
|
87
|
+
{"hgroup", false, false, false, ActiveOverlay, NULL},
|
|
88
|
+
{"hr", true, false, false, ActiveOverlay, NULL},
|
|
89
|
+
{"html", false, false, false, ActiveOverlay, NULL},
|
|
90
|
+
{"i", false, false, false, ActiveOverlay, NULL},
|
|
91
|
+
{"iframe", true, false, false, ActiveOverlay, NULL},
|
|
92
|
+
{"img", true, false, false, ActiveOverlay, NULL},
|
|
93
|
+
{"input", true, false, false, ActiveOverlay, NULL}, // somewhere under a form_0
|
|
94
|
+
{"ins", false, false, false, ActiveOverlay, NULL},
|
|
95
|
+
{"kbd", false, false, false, ActiveOverlay, NULL},
|
|
96
|
+
{"keygen", true, false, false, ActiveOverlay, NULL},
|
|
97
|
+
{"label", false, false, false, ActiveOverlay, NULL}, // somewhere under a form_0
|
|
98
|
+
{"legend", false, false, false, ActiveOverlay, fieldset_0},
|
|
99
|
+
{"li", false, false, false, ActiveOverlay, ol_ul_menu_0},
|
|
100
|
+
{"link", true, false, false, ActiveOverlay, head_0},
|
|
101
|
+
{"map", false, false, false, ActiveOverlay, NULL},
|
|
102
|
+
{"mark", false, false, false, ActiveOverlay, NULL},
|
|
103
|
+
{"menu", false, false, false, ActiveOverlay, NULL},
|
|
104
|
+
{"meta", true, false, false, ActiveOverlay, head_0},
|
|
105
|
+
{"meter", false, false, false, ActiveOverlay, NULL},
|
|
106
|
+
{"nav", false, false, false, ActiveOverlay, NULL},
|
|
107
|
+
{"noframes", false, false, false, ActiveOverlay, NULL},
|
|
108
|
+
{"noscript", false, false, false, ActiveOverlay, NULL},
|
|
109
|
+
{"object", false, false, false, ActiveOverlay, NULL},
|
|
110
|
+
{"ol", false, true, false, ActiveOverlay, NULL},
|
|
111
|
+
{"optgroup", false, false, false, ActiveOverlay, NULL},
|
|
112
|
+
{"option", false, false, false, ActiveOverlay, optgroup_select_datalist_0},
|
|
113
|
+
{"output", false, false, false, ActiveOverlay, NULL},
|
|
114
|
+
{"p", false, false, false, ActiveOverlay, NULL},
|
|
115
|
+
{"param", true, false, false, ActiveOverlay, NULL},
|
|
116
|
+
{"pre", false, false, false, ActiveOverlay, NULL},
|
|
117
|
+
{"progress", false, false, false, ActiveOverlay, NULL},
|
|
118
|
+
{"q", false, false, false, ActiveOverlay, NULL},
|
|
119
|
+
{"rp", false, false, false, ActiveOverlay, ruby_0},
|
|
120
|
+
{"rt", false, false, false, ActiveOverlay, ruby_0},
|
|
121
|
+
{"ruby", false, false, false, ActiveOverlay, NULL},
|
|
122
|
+
{"s", false, false, false, ActiveOverlay, NULL},
|
|
123
|
+
{"samp", false, false, false, ActiveOverlay, NULL},
|
|
124
|
+
{"script", false, false, true, ActiveOverlay, NULL},
|
|
125
|
+
{"section", false, true, false, ActiveOverlay, NULL},
|
|
126
|
+
{"select", false, false, false, ActiveOverlay, NULL},
|
|
127
|
+
{"small", false, false, false, ActiveOverlay, NULL},
|
|
128
|
+
{"source", false, false, false, ActiveOverlay, audio_video_0},
|
|
129
|
+
{"span", false, true, false, ActiveOverlay, NULL},
|
|
130
|
+
{"strike", false, false, false, ActiveOverlay, NULL},
|
|
131
|
+
{"strong", false, false, false, ActiveOverlay, NULL},
|
|
132
|
+
{"style", false, false, false, ActiveOverlay, NULL},
|
|
133
|
+
{"sub", false, false, false, ActiveOverlay, NULL},
|
|
134
|
+
{"summary", false, false, false, ActiveOverlay, details_0},
|
|
135
|
+
{"sup", false, false, false, ActiveOverlay, NULL},
|
|
136
|
+
{"table", false, false, false, ActiveOverlay, NULL},
|
|
137
|
+
{"tbody", false, false, false, ActiveOverlay, table_0},
|
|
138
|
+
{"td", false, false, false, ActiveOverlay, tr_0},
|
|
139
|
+
{"textarea", false, false, false, ActiveOverlay, NULL},
|
|
140
|
+
{"tfoot", false, false, false, ActiveOverlay, table_0},
|
|
141
|
+
{"th", false, false, false, ActiveOverlay, tr_0},
|
|
142
|
+
{"thead", false, false, false, ActiveOverlay, table_0},
|
|
143
|
+
{"time", false, false, false, ActiveOverlay, NULL},
|
|
144
|
+
{"title", false, false, false, ActiveOverlay, head_0},
|
|
145
|
+
{"tr", false, false, false, ActiveOverlay, table_0},
|
|
146
|
+
{"track", true, false, false, ActiveOverlay, audio_video_0},
|
|
147
|
+
{"tt", false, false, false, ActiveOverlay, NULL},
|
|
148
|
+
{"u", false, false, false, ActiveOverlay, NULL},
|
|
149
|
+
{"ul", false, false, false, ActiveOverlay, NULL},
|
|
150
|
+
{"var", false, false, false, ActiveOverlay, NULL},
|
|
151
|
+
{"video", false, false, false, ActiveOverlay, NULL},
|
|
152
|
+
{"wbr", true, false, false, ActiveOverlay, NULL},
|
|
153
|
+
};
|
|
154
|
+
static struct _hints html_hints = {"HTML", html_hint_array, sizeof(html_hint_array) / sizeof(*html_hint_array)};
|
|
155
|
+
|
|
156
|
+
Hints ox_hints_html(void) {
|
|
157
|
+
return &html_hints;
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
Hints ox_hints_dup(Hints h) {
|
|
161
|
+
Hints nh = ALLOC(struct _hints);
|
|
162
|
+
|
|
163
|
+
nh->hints = ALLOC_N(struct _hint, h->size);
|
|
164
|
+
memcpy(nh->hints, h->hints, sizeof(struct _hint) * h->size);
|
|
165
|
+
nh->size = h->size;
|
|
166
|
+
nh->name = h->name;
|
|
167
|
+
|
|
168
|
+
return nh;
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
void ox_hints_destroy(Hints h) {
|
|
172
|
+
if (NULL != h && &html_hints != h) {
|
|
173
|
+
xfree(h->hints);
|
|
174
|
+
xfree(h);
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
Hint ox_hint_find(Hints hints, const char *name) {
|
|
179
|
+
if (0 != hints) {
|
|
180
|
+
Hint lo = hints->hints;
|
|
181
|
+
Hint hi = hints->hints + hints->size - 1;
|
|
182
|
+
Hint mid;
|
|
183
|
+
int res;
|
|
184
|
+
|
|
185
|
+
if (0 == (res = strcasecmp(name, lo->name))) {
|
|
186
|
+
return lo;
|
|
187
|
+
} else if (0 > res) {
|
|
188
|
+
return 0;
|
|
189
|
+
}
|
|
190
|
+
if (0 == (res = strcasecmp(name, hi->name))) {
|
|
191
|
+
return hi;
|
|
192
|
+
} else if (0 < res) {
|
|
193
|
+
return 0;
|
|
194
|
+
}
|
|
195
|
+
while (1 < hi - lo) {
|
|
196
|
+
mid = lo + (hi - lo) / 2;
|
|
197
|
+
if (0 == (res = strcasecmp(name, mid->name))) {
|
|
198
|
+
return mid;
|
|
199
|
+
} else if (0 < res) {
|
|
200
|
+
lo = mid;
|
|
201
|
+
} else {
|
|
202
|
+
hi = mid;
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
return 0;
|
|
207
|
+
}
|
data/ext/ox/sax_hint.h
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/* hint.h
|
|
2
|
+
* Copyright (c) 2011, Peter Ohler
|
|
3
|
+
* All rights reserved.
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
#ifndef OX_HINT_H
|
|
7
|
+
#define OX_HINT_H
|
|
8
|
+
|
|
9
|
+
#include <stdbool.h>
|
|
10
|
+
|
|
11
|
+
typedef enum {
|
|
12
|
+
ActiveOverlay = 0,
|
|
13
|
+
InactiveOverlay = 'i',
|
|
14
|
+
BlockOverlay = 'b',
|
|
15
|
+
OffOverlay = 'o',
|
|
16
|
+
AbortOverlay = 'a',
|
|
17
|
+
NestOverlay = 'n', // nest flag is ignored
|
|
18
|
+
} Overlay;
|
|
19
|
+
|
|
20
|
+
typedef struct _hint {
|
|
21
|
+
const char *name;
|
|
22
|
+
char empty; // must be closed or close auto it, not error
|
|
23
|
+
char nest; // nesting allowed
|
|
24
|
+
char jump; // jump to end <script> ... </script>
|
|
25
|
+
char overlay; // Overlay
|
|
26
|
+
const char **parents;
|
|
27
|
+
} *Hint;
|
|
28
|
+
|
|
29
|
+
typedef struct _hints {
|
|
30
|
+
const char *name;
|
|
31
|
+
Hint hints; // array of hints
|
|
32
|
+
int size;
|
|
33
|
+
} *Hints;
|
|
34
|
+
|
|
35
|
+
extern Hints ox_hints_html(void);
|
|
36
|
+
extern Hint ox_hint_find(Hints hints, const char *name);
|
|
37
|
+
extern Hints ox_hints_dup(Hints h);
|
|
38
|
+
extern void ox_hints_destroy(Hints h);
|
|
39
|
+
|
|
40
|
+
#endif /* OX_HINT_H */
|
data/ext/ox/sax_stack.h
ADDED
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
/* sax_stack.h
|
|
2
|
+
* Copyright (c) 2011, Peter Ohler
|
|
3
|
+
* All rights reserved.
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
#ifndef OX_SAX_STACK_H
|
|
7
|
+
#define OX_SAX_STACK_H
|
|
8
|
+
|
|
9
|
+
#include <stdlib.h>
|
|
10
|
+
|
|
11
|
+
#include "intern.h"
|
|
12
|
+
#include "sax_hint.h"
|
|
13
|
+
|
|
14
|
+
#define STACK_INC 32
|
|
15
|
+
#define NV_BUF_MAX 64
|
|
16
|
+
|
|
17
|
+
typedef struct _nv {
|
|
18
|
+
char name_buf[NV_BUF_MAX];
|
|
19
|
+
const char *name;
|
|
20
|
+
VALUE val;
|
|
21
|
+
int childCnt;
|
|
22
|
+
Hint hint;
|
|
23
|
+
} *Nv;
|
|
24
|
+
|
|
25
|
+
typedef struct _nStack {
|
|
26
|
+
struct _nv base[STACK_INC];
|
|
27
|
+
Nv head; /* current stack */
|
|
28
|
+
Nv end; /* stack end */
|
|
29
|
+
Nv tail; /* pointer to one past last element name on stack */
|
|
30
|
+
} *NStack;
|
|
31
|
+
|
|
32
|
+
inline static void stack_init(NStack stack) {
|
|
33
|
+
stack->head = stack->base;
|
|
34
|
+
stack->end = stack->base + sizeof(stack->base) / sizeof(struct _nv);
|
|
35
|
+
stack->tail = stack->head;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
inline static int stack_empty(NStack stack) {
|
|
39
|
+
return (stack->head == stack->tail);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
inline static void stack_cleanup(NStack stack) {
|
|
43
|
+
if (stack->base != stack->head) {
|
|
44
|
+
xfree(stack->head);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
inline static void stack_push(NStack stack, const char *name, size_t nlen, VALUE val, Hint hint) {
|
|
49
|
+
if (stack->end <= stack->tail) {
|
|
50
|
+
size_t len = stack->end - stack->head;
|
|
51
|
+
size_t toff = stack->tail - stack->head;
|
|
52
|
+
|
|
53
|
+
if (stack->base == stack->head) {
|
|
54
|
+
stack->head = ALLOC_N(struct _nv, len + STACK_INC);
|
|
55
|
+
memcpy(stack->head, stack->base, sizeof(struct _nv) * len);
|
|
56
|
+
} else {
|
|
57
|
+
REALLOC_N(stack->head, struct _nv, len + STACK_INC);
|
|
58
|
+
}
|
|
59
|
+
stack->tail = stack->head + toff;
|
|
60
|
+
stack->end = stack->head + len + STACK_INC;
|
|
61
|
+
}
|
|
62
|
+
if (NV_BUF_MAX <= nlen) {
|
|
63
|
+
stack->tail->name = ox_strndup(name, nlen);
|
|
64
|
+
} else {
|
|
65
|
+
strncpy(stack->tail->name_buf, name, nlen);
|
|
66
|
+
stack->tail->name_buf[nlen] = '\0';
|
|
67
|
+
stack->tail->name = NULL;
|
|
68
|
+
}
|
|
69
|
+
stack->tail->val = val;
|
|
70
|
+
stack->tail->hint = hint;
|
|
71
|
+
stack->tail->childCnt = 0;
|
|
72
|
+
stack->tail++;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
inline static Nv stack_peek(NStack stack) {
|
|
76
|
+
if (stack->head < stack->tail) {
|
|
77
|
+
return stack->tail - 1;
|
|
78
|
+
}
|
|
79
|
+
return NULL;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
inline static Nv stack_pop(NStack stack) {
|
|
83
|
+
if (stack->head < stack->tail) {
|
|
84
|
+
stack->tail--;
|
|
85
|
+
if (NULL != stack->tail->name) {
|
|
86
|
+
xfree((char *)(stack->tail->name));
|
|
87
|
+
}
|
|
88
|
+
return stack->tail;
|
|
89
|
+
}
|
|
90
|
+
return NULL;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
inline static const char *nv_name(Nv nv) {
|
|
94
|
+
if (NULL == nv->name) {
|
|
95
|
+
return nv->name_buf;
|
|
96
|
+
}
|
|
97
|
+
return nv->name;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
inline static int nv_same_name(Nv nv, const char *name, bool smart) {
|
|
101
|
+
if (smart) {
|
|
102
|
+
if (NULL == nv->name) {
|
|
103
|
+
return (0 == strcasecmp(name, nv->name_buf));
|
|
104
|
+
}
|
|
105
|
+
return (0 == strcasecmp(name, nv->name));
|
|
106
|
+
}
|
|
107
|
+
if (NULL == nv->name) {
|
|
108
|
+
return (0 == strcmp(name, nv->name_buf));
|
|
109
|
+
}
|
|
110
|
+
return (0 == strcmp(name, nv->name));
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
#endif /* OX_SAX_STACK_H */
|