ox 2.14.17 → 2.14.18
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 +4 -4
- data/CHANGELOG.md +6 -0
- data/ext/ox/hash_load.c +45 -13
- data/ext/ox/ox.h +1 -1
- data/ext/ox/parse.c +1 -1
- data/ext/ox/sax.c +8 -8
- data/ext/ox/sax_buf.c +1 -1
- data/ext/ox/slotcache.c +2 -2
- data/lib/ox/version.rb +1 -1
- metadata +4 -24
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: fd178b1fd415d3a97ef3b60e73896d52fd3eea1e9ef7a32dd0de316e00a21542
|
4
|
+
data.tar.gz: f9813bab8a071e6ba9efa07a92c228d3ea783a29503cfc763e72e73220899fe8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1a7cfc1bfbe0693f52f66f662d4f0f8eeabe20bc50ddefb854abde16e1f1e1c8236b64a2c1ebd51d6de18a697f588ff4d60f854e7b50b383db14ad6eed57ae92
|
7
|
+
data.tar.gz: ae9344f3607e94721eafda29f7255be6a36a0340dd4de3b03d249e616126ec340f5c9485f855ba342f33c951d7153c1b47e0b95aaada4e1936741f2b6755452c
|
data/CHANGELOG.md
CHANGED
data/ext/ox/hash_load.c
CHANGED
@@ -93,14 +93,26 @@ static void add_str(PInfo pi, VALUE s) {
|
|
93
93
|
}
|
94
94
|
|
95
95
|
static void add_text(PInfo pi, char *text, int closed) {
|
96
|
-
|
96
|
+
VALUE s = rb_str_new2(text);
|
97
|
+
if (0 != pi->options->rb_enc) {
|
98
|
+
rb_enc_associate(s, pi->options->rb_enc);
|
99
|
+
}
|
100
|
+
add_str(pi, s);
|
97
101
|
}
|
98
102
|
|
99
103
|
static void add_cdata(PInfo pi, const char *text, size_t len) {
|
100
|
-
|
104
|
+
VALUE s = rb_str_new2(text);
|
105
|
+
if (0 != pi->options->rb_enc) {
|
106
|
+
rb_enc_associate(s, pi->options->rb_enc);
|
107
|
+
}
|
108
|
+
add_str(pi, s);
|
101
109
|
}
|
102
110
|
|
103
111
|
static void add_element(PInfo pi, const char *ename, Attr attrs, int hasChildren) {
|
112
|
+
VALUE s = rb_str_new2(ename);
|
113
|
+
if (0 != pi->options->rb_enc) {
|
114
|
+
rb_enc_associate(s, pi->options->rb_enc);
|
115
|
+
}
|
104
116
|
if (helper_stack_empty(&pi->helpers)) {
|
105
117
|
create_top(pi);
|
106
118
|
}
|
@@ -111,12 +123,14 @@ static void add_element(PInfo pi, const char *ename, Attr attrs, int hasChildren
|
|
111
123
|
volatile VALUE a;
|
112
124
|
|
113
125
|
for (; 0 != attrs->name; attrs++) {
|
126
|
+
key = rb_str_new2(attrs->name);
|
127
|
+
if (0 != pi->options->rb_enc) {
|
128
|
+
rb_enc_associate(key, pi->options->rb_enc);
|
129
|
+
}
|
114
130
|
if (Qnil != pi->options->attr_key_mod) {
|
115
|
-
key = rb_funcall(pi->options->attr_key_mod, ox_call_id, 1,
|
131
|
+
key = rb_funcall(pi->options->attr_key_mod, ox_call_id, 1, key);
|
116
132
|
} else if (Yes == pi->options->sym_keys) {
|
117
|
-
key = rb_id2sym(
|
118
|
-
} else {
|
119
|
-
key = rb_str_new2(attrs->name);
|
133
|
+
key = rb_id2sym(rb_intern_str(key));
|
120
134
|
}
|
121
135
|
val = rb_str_new2(attrs->value);
|
122
136
|
if (0 != pi->options->rb_enc) {
|
@@ -127,17 +141,21 @@ static void add_element(PInfo pi, const char *ename, Attr attrs, int hasChildren
|
|
127
141
|
a = rb_ary_new();
|
128
142
|
rb_ary_push(a, h);
|
129
143
|
mark_value(pi, a);
|
130
|
-
helper_stack_push(&pi->helpers,
|
144
|
+
helper_stack_push(&pi->helpers, rb_intern_str(s), a, ArrayCode);
|
131
145
|
} else {
|
132
|
-
helper_stack_push(&pi->helpers,
|
146
|
+
helper_stack_push(&pi->helpers, rb_intern_str(s), Qnil, NoCode);
|
133
147
|
}
|
134
148
|
}
|
135
149
|
|
136
150
|
static void add_element_no_attrs(PInfo pi, const char *ename, Attr attrs, int hasChildren) {
|
151
|
+
VALUE s = rb_str_new2(ename);
|
152
|
+
if (0 != pi->options->rb_enc) {
|
153
|
+
rb_enc_associate(s, pi->options->rb_enc);
|
154
|
+
}
|
137
155
|
if (helper_stack_empty(&pi->helpers)) {
|
138
156
|
create_top(pi);
|
139
157
|
}
|
140
|
-
helper_stack_push(&pi->helpers,
|
158
|
+
helper_stack_push(&pi->helpers, rb_intern_str(s), Qnil, NoCode);
|
141
159
|
}
|
142
160
|
|
143
161
|
static int umark_hash_cb(VALUE key, VALUE value, VALUE x) {
|
@@ -224,8 +242,22 @@ static void finish(PInfo pi) {
|
|
224
242
|
xfree(pi->marked);
|
225
243
|
}
|
226
244
|
|
245
|
+
static void set_encoding_from_instruct(PInfo pi, Attr attrs) {
|
246
|
+
for (; 0 != attrs->name; attrs++) {
|
247
|
+
if (0 == strcmp("encoding", attrs->name)) {
|
248
|
+
pi->options->rb_enc = rb_enc_find(attrs->value);
|
249
|
+
}
|
250
|
+
}
|
251
|
+
}
|
252
|
+
|
253
|
+
static void instruct(PInfo pi, const char *target, Attr attrs, const char *content) {
|
254
|
+
if (0 == strcmp("xml", target)) {
|
255
|
+
set_encoding_from_instruct(pi, attrs);
|
256
|
+
}
|
257
|
+
}
|
258
|
+
|
227
259
|
struct _parseCallbacks _ox_hash_callbacks = {
|
228
|
-
|
260
|
+
instruct,
|
229
261
|
NULL,
|
230
262
|
NULL,
|
231
263
|
NULL,
|
@@ -238,7 +270,7 @@ struct _parseCallbacks _ox_hash_callbacks = {
|
|
238
270
|
ParseCallbacks ox_hash_callbacks = &_ox_hash_callbacks;
|
239
271
|
|
240
272
|
struct _parseCallbacks _ox_hash_cdata_callbacks = {
|
241
|
-
|
273
|
+
instruct,
|
242
274
|
NULL,
|
243
275
|
NULL,
|
244
276
|
add_cdata,
|
@@ -251,7 +283,7 @@ struct _parseCallbacks _ox_hash_cdata_callbacks = {
|
|
251
283
|
ParseCallbacks ox_hash_cdata_callbacks = &_ox_hash_cdata_callbacks;
|
252
284
|
|
253
285
|
struct _parseCallbacks _ox_hash_no_attrs_callbacks = {
|
254
|
-
|
286
|
+
instruct,
|
255
287
|
NULL,
|
256
288
|
NULL,
|
257
289
|
NULL,
|
@@ -264,7 +296,7 @@ struct _parseCallbacks _ox_hash_no_attrs_callbacks = {
|
|
264
296
|
ParseCallbacks ox_hash_no_attrs_callbacks = &_ox_hash_no_attrs_callbacks;
|
265
297
|
|
266
298
|
struct _parseCallbacks _ox_hash_no_attrs_cdata_callbacks = {
|
267
|
-
|
299
|
+
instruct,
|
268
300
|
NULL,
|
269
301
|
NULL,
|
270
302
|
add_cdata,
|
data/ext/ox/ox.h
CHANGED
@@ -146,7 +146,7 @@ struct _pInfo {
|
|
146
146
|
VALUE *marked;
|
147
147
|
int mark_size; // allocated size
|
148
148
|
int mark_cnt;
|
149
|
-
char last;
|
149
|
+
char last; // last character read, rarely set
|
150
150
|
};
|
151
151
|
|
152
152
|
extern VALUE ox_parse(char *xml, size_t len, ParseCallbacks pcb, char **endp, Options options, Err err);
|
data/ext/ox/parse.c
CHANGED
@@ -167,7 +167,7 @@ ox_parse(char *xml, size_t len, ParseCallbacks pcb, char **endp, Options options
|
|
167
167
|
helper_stack_cleanup(&pi.helpers);
|
168
168
|
return Qnil;
|
169
169
|
}
|
170
|
-
pi.s++;
|
170
|
+
pi.s++; // past <
|
171
171
|
switch (*pi.s) {
|
172
172
|
case '?': // processing instruction
|
173
173
|
pi.s++;
|
data/ext/ox/sax.c
CHANGED
@@ -1219,7 +1219,7 @@ static char read_attrs(SaxDrive dr, char c, char termc, char term2, int is_xml,
|
|
1219
1219
|
c = buf_next_non_white(&dr->buf);
|
1220
1220
|
}
|
1221
1221
|
if ('=' != c) {
|
1222
|
-
|
1222
|
+
// TBD allow in smart mode
|
1223
1223
|
if (eq_req) {
|
1224
1224
|
dr->err = 1;
|
1225
1225
|
return c;
|
@@ -1328,7 +1328,7 @@ static char read_quoted_value(SaxDrive dr, bool inst) {
|
|
1328
1328
|
dr->buf.str = dr->buf.tail - 1;
|
1329
1329
|
// TBD if smart or html then no error
|
1330
1330
|
if (!(dr->options.smart && ox_hints_html() != dr->options.hints)) {
|
1331
|
-
|
1331
|
+
ox_sax_drive_error(dr, WRONG_CHAR "attribute value not in quotes");
|
1332
1332
|
}
|
1333
1333
|
while ('\0' != (c = buf_get(&dr->buf))) {
|
1334
1334
|
switch (c) {
|
@@ -1341,12 +1341,12 @@ static char read_quoted_value(SaxDrive dr, bool inst) {
|
|
1341
1341
|
*(dr->buf.tail - 1) = '\0'; /* terminate value */
|
1342
1342
|
// dr->buf.tail is in the correct position, one after the word terminator
|
1343
1343
|
return c;
|
1344
|
-
case '?':
|
1345
|
-
|
1346
|
-
|
1347
|
-
|
1348
|
-
|
1349
|
-
|
1344
|
+
case '?':
|
1345
|
+
if (inst) {
|
1346
|
+
*(dr->buf.tail - 1) = '\0'; /* terminate value */
|
1347
|
+
return c;
|
1348
|
+
}
|
1349
|
+
break;
|
1350
1350
|
default: break;
|
1351
1351
|
}
|
1352
1352
|
}
|
data/ext/ox/sax_buf.c
CHANGED
@@ -79,7 +79,7 @@ int ox_sax_buf_read(Buf buf) {
|
|
79
79
|
} else {
|
80
80
|
shift = buf->pro - buf->head - 1; // leave one character so we cab backup one
|
81
81
|
}
|
82
|
-
if (0 >= shift) {
|
82
|
+
if (0 >= shift) { /* no space left so allocate more */
|
83
83
|
char *old = buf->head;
|
84
84
|
size_t size = buf->end - buf->head + BUF_PAD;
|
85
85
|
|
data/ext/ox/slotcache.c
CHANGED
@@ -82,8 +82,8 @@ slot_cache_get(SlotCache cache, const char *key, VALUE **slot, const char **keyp
|
|
82
82
|
orig->key = form_key(key);
|
83
83
|
orig->value = Qundef;
|
84
84
|
}
|
85
|
-
} else {
|
86
|
-
if (0 != cache->key) {
|
85
|
+
} else { /* not exact match but on the path */
|
86
|
+
if (0 != cache->key) { /* there is a key/value here already */
|
87
87
|
if (depth == *cache->key || (255 <= depth && 0 == strncmp(cache->key, key, depth) &&
|
88
88
|
'\0' == cache->key[depth])) { /* key belongs here */
|
89
89
|
continue;
|
data/lib/ox/version.rb
CHANGED
metadata
CHANGED
@@ -1,35 +1,15 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ox
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.14.
|
4
|
+
version: 2.14.18
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Peter Ohler
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
12
|
-
dependencies:
|
13
|
-
- !ruby/object:Gem::Dependency
|
14
|
-
name: rake-compiler
|
15
|
-
requirement: !ruby/object:Gem::Requirement
|
16
|
-
requirements:
|
17
|
-
- - ">="
|
18
|
-
- !ruby/object:Gem::Version
|
19
|
-
version: '1.2'
|
20
|
-
- - "<"
|
21
|
-
- !ruby/object:Gem::Version
|
22
|
-
version: '2.0'
|
23
|
-
type: :development
|
24
|
-
prerelease: false
|
25
|
-
version_requirements: !ruby/object:Gem::Requirement
|
26
|
-
requirements:
|
27
|
-
- - ">="
|
28
|
-
- !ruby/object:Gem::Version
|
29
|
-
version: '1.2'
|
30
|
-
- - "<"
|
31
|
-
- !ruby/object:Gem::Version
|
32
|
-
version: '2.0'
|
11
|
+
date: 2024-03-21 00:00:00.000000000 Z
|
12
|
+
dependencies: []
|
33
13
|
description: "A fast XML parser and object serializer that uses only standard C lib.\n\nOptimized
|
34
14
|
XML (Ox), as the name implies was written to provide speed optimized\nXML handling.
|
35
15
|
It was designed to be an alternative to Nokogiri and other Ruby\nXML parsers for
|
@@ -125,7 +105,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
125
105
|
- !ruby/object:Gem::Version
|
126
106
|
version: '0'
|
127
107
|
requirements: []
|
128
|
-
rubygems_version: 3.4.
|
108
|
+
rubygems_version: 3.4.10
|
129
109
|
signing_key:
|
130
110
|
specification_version: 4
|
131
111
|
summary: A fast XML parser and object serializer.
|