ox 2.10.0 → 2.10.1
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 +4 -0
- data/README.md +3 -2
- data/ext/ox/attr.h +10 -10
- data/ext/ox/base64.h +3 -3
- data/ext/ox/buf.h +10 -10
- data/ext/ox/builder.c +7 -7
- data/ext/ox/cache.c +6 -6
- data/ext/ox/cache.h +4 -4
- data/ext/ox/cache8.c +5 -5
- data/ext/ox/cache8.h +4 -4
- data/ext/ox/dump.c +25 -25
- data/ext/ox/encode.h +26 -0
- data/ext/ox/err.h +4 -4
- data/ext/ox/gen_load.c +5 -5
- data/ext/ox/hash_load.c +3 -3
- data/ext/ox/helper.h +10 -10
- data/ext/ox/obj_load.c +18 -18
- data/ext/ox/ox.c +36 -36
- data/ext/ox/ox.h +12 -12
- data/ext/ox/parse.c +15 -15
- data/ext/ox/sax.c +6 -6
- data/ext/ox/sax.h +9 -9
- data/ext/ox/sax_as.c +4 -4
- data/ext/ox/sax_buf.h +7 -7
- data/ext/ox/sax_has.h +4 -4
- data/ext/ox/sax_hint.c +6 -6
- data/ext/ox/sax_hint.h +5 -5
- data/ext/ox/sax_stack.h +10 -10
- data/ext/ox/special.h +3 -3
- data/ext/ox/type.h +3 -3
- data/lib/ox/element.rb +117 -1
- data/lib/ox/version.rb +1 -1
- metadata +4 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f6e57cf5b8fbaa41d750b25f77a81d329f58465115db0c628dd97ba4b0bf97b3
|
4
|
+
data.tar.gz: df2f0ba360c0c6f5ea0ac23496ce133a8008c78c5a2a7e3a9078b7138ee957b9
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2dbff602131c14cde1d7b754165fee62867f5b27956c01de1a52a119f651bcaa8457e92c900cc2a121f74cfdcfbadbeec74a9f144e450f1b24805bd0167e3d14
|
7
|
+
data.tar.gz: 40392d27cec2d85d4df7deae4870da0da2fabf3a96b761a4f8e95d0813b99763c5dd7cdb76a4c8a139ccf613868a04d7ded091fa68db1e89fdfa5ee49b118a6e
|
data/CHANGELOG.md
CHANGED
data/README.md
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
# Ox gem
|
2
2
|
A fast XML parser and Object marshaller as a Ruby gem.
|
3
3
|
|
4
|
-
[](http://travis-ci.org/ohler55/ox) [](https://tidelift.com/subscription/pkg/rubygems-ox?utm_source=rubygems-ox&utm_medium=referral&utm_campaign=readme)
|
5
5
|
|
6
6
|
## Installation
|
7
7
|
gem install ox
|
@@ -20,8 +20,9 @@ A fast XML parser and Object marshaller as a Ruby gem.
|
|
20
20
|
|
21
21
|
[Follow @peterohler on Twitter](http://twitter.com/#!/peterohler) for announcements and news about the Ox gem.
|
22
22
|
|
23
|
-
##
|
23
|
+
## Support
|
24
24
|
|
25
|
+
[Get supported Ox with a Tidelift Subscription.](https://tidelift.com/subscription/pkg/rubygems-ox?utm_source=rubygems-ox&utm_medium=referral&utm_campaign=readme)
|
25
26
|
|
26
27
|
## Links of Interest
|
27
28
|
|
data/ext/ox/attr.h
CHANGED
@@ -3,20 +3,20 @@
|
|
3
3
|
* All rights reserved.
|
4
4
|
*/
|
5
5
|
|
6
|
-
#ifndef
|
7
|
-
#define
|
6
|
+
#ifndef OX_ATTR_H
|
7
|
+
#define OX_ATTR_H
|
8
8
|
|
9
9
|
#include "ox.h"
|
10
10
|
|
11
11
|
#define ATTR_STACK_INC 8
|
12
12
|
|
13
|
-
typedef struct
|
13
|
+
typedef struct _attr {
|
14
14
|
const char *name;
|
15
15
|
const char *value;
|
16
16
|
} *Attr;
|
17
17
|
|
18
|
-
typedef struct
|
19
|
-
struct
|
18
|
+
typedef struct _attrStack {
|
19
|
+
struct _attr base[ATTR_STACK_INC];
|
20
20
|
Attr head; /* current stack */
|
21
21
|
Attr end; /* stack end */
|
22
22
|
Attr tail; /* pointer to one past last element name on stack */
|
@@ -25,7 +25,7 @@ typedef struct _AttrStack {
|
|
25
25
|
inline static void
|
26
26
|
attr_stack_init(AttrStack stack) {
|
27
27
|
stack->head = stack->base;
|
28
|
-
stack->end = stack->base + sizeof(stack->base) / sizeof(struct
|
28
|
+
stack->end = stack->base + sizeof(stack->base) / sizeof(struct _attr);
|
29
29
|
stack->tail = stack->head;
|
30
30
|
stack->head->name = 0;
|
31
31
|
}
|
@@ -50,10 +50,10 @@ attr_stack_push(AttrStack stack, const char *name, const char *value) {
|
|
50
50
|
size_t toff = stack->tail - stack->head;
|
51
51
|
|
52
52
|
if (stack->base == stack->head) {
|
53
|
-
stack->head = ALLOC_N(struct
|
54
|
-
memcpy(stack->head, stack->base, sizeof(struct
|
53
|
+
stack->head = ALLOC_N(struct _attr, len + ATTR_STACK_INC);
|
54
|
+
memcpy(stack->head, stack->base, sizeof(struct _attr) * len);
|
55
55
|
} else {
|
56
|
-
REALLOC_N(stack->head, struct
|
56
|
+
REALLOC_N(stack->head, struct _attr, len + ATTR_STACK_INC);
|
57
57
|
}
|
58
58
|
stack->tail = stack->head + toff;
|
59
59
|
stack->end = stack->head + len + ATTR_STACK_INC;
|
@@ -81,4 +81,4 @@ attr_stack_pop(AttrStack stack) {
|
|
81
81
|
return 0;
|
82
82
|
}
|
83
83
|
|
84
|
-
#endif /*
|
84
|
+
#endif /* OX_ATTR_H */
|
data/ext/ox/base64.h
CHANGED
@@ -3,8 +3,8 @@
|
|
3
3
|
* All rights reserved.
|
4
4
|
*/
|
5
5
|
|
6
|
-
#ifndef
|
7
|
-
#define
|
6
|
+
#ifndef BASE64_H
|
7
|
+
#define BASE64_H
|
8
8
|
|
9
9
|
typedef unsigned char uchar;
|
10
10
|
|
@@ -15,4 +15,4 @@ extern unsigned long b64_orig_size(const char *text);
|
|
15
15
|
extern void to_base64(const uchar *src, int len, char *b64);
|
16
16
|
extern void from_base64(const char *b64, uchar *str);
|
17
17
|
|
18
|
-
#endif /*
|
18
|
+
#endif /* BASE64_H */
|
data/ext/ox/buf.h
CHANGED
@@ -1,21 +1,21 @@
|
|
1
1
|
/* buf.h
|
2
2
|
* Copyright (c) 2014, Peter Ohler
|
3
3
|
* All rights reserved.
|
4
|
-
*
|
4
|
+
*
|
5
5
|
* Redistribution and use in source and binary forms, with or without
|
6
6
|
* modification, are permitted provided that the following conditions are met:
|
7
|
-
*
|
7
|
+
*
|
8
8
|
* - Redistributions of source code must retain the above copyright notice, this
|
9
9
|
* list of conditions and the following disclaimer.
|
10
|
-
*
|
10
|
+
*
|
11
11
|
* - Redistributions in binary form must reproduce the above copyright notice,
|
12
12
|
* this list of conditions and the following disclaimer in the documentation
|
13
13
|
* and/or other materials provided with the distribution.
|
14
|
-
*
|
14
|
+
*
|
15
15
|
* - Neither the name of Peter Ohler nor the names of its contributors may be
|
16
16
|
* used to endorse or promote products derived from this software without
|
17
17
|
* specific prior written permission.
|
18
|
-
*
|
18
|
+
*
|
19
19
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
20
20
|
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
21
21
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
@@ -28,13 +28,13 @@
|
|
28
28
|
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
29
29
|
*/
|
30
30
|
|
31
|
-
#ifndef
|
32
|
-
#define
|
31
|
+
#ifndef OX_BUF_H
|
32
|
+
#define OX_BUF_H
|
33
33
|
|
34
34
|
#include <stdbool.h>
|
35
35
|
#include <unistd.h>
|
36
36
|
|
37
|
-
typedef struct
|
37
|
+
typedef struct _buf {
|
38
38
|
char *head;
|
39
39
|
char *end;
|
40
40
|
char *tail;
|
@@ -108,7 +108,7 @@ buf_append_string(Buf buf, const char *s, size_t slen) {
|
|
108
108
|
}
|
109
109
|
buf->tail += slen;
|
110
110
|
}
|
111
|
-
|
111
|
+
|
112
112
|
inline static void
|
113
113
|
buf_append(Buf buf, char c) {
|
114
114
|
if (buf->err) {
|
@@ -157,4 +157,4 @@ buf_finish(Buf buf) {
|
|
157
157
|
}
|
158
158
|
}
|
159
159
|
|
160
|
-
#endif /*
|
160
|
+
#endif /* OX_BUF_H */
|
data/ext/ox/builder.c
CHANGED
@@ -14,7 +14,7 @@
|
|
14
14
|
|
15
15
|
#define MAX_DEPTH 128
|
16
16
|
|
17
|
-
typedef struct
|
17
|
+
typedef struct _element {
|
18
18
|
char *name;
|
19
19
|
char buf[64];
|
20
20
|
int len;
|
@@ -22,13 +22,13 @@ typedef struct _Element {
|
|
22
22
|
bool non_text_child;
|
23
23
|
} *Element;
|
24
24
|
|
25
|
-
typedef struct
|
26
|
-
struct
|
25
|
+
typedef struct _builder {
|
26
|
+
struct _buf buf;
|
27
27
|
int indent;
|
28
28
|
char encoding[64];
|
29
29
|
int depth;
|
30
30
|
FILE *file;
|
31
|
-
struct
|
31
|
+
struct _element stack[MAX_DEPTH];
|
32
32
|
long line;
|
33
33
|
long col;
|
34
34
|
long pos;
|
@@ -348,7 +348,7 @@ to_s(Builder b) {
|
|
348
348
|
*/
|
349
349
|
static VALUE
|
350
350
|
builder_new(int argc, VALUE *argv, VALUE self) {
|
351
|
-
Builder b = ALLOC(struct
|
351
|
+
Builder b = ALLOC(struct _builder);
|
352
352
|
int indent = ox_default_options.indent;
|
353
353
|
long buf_size = 0;
|
354
354
|
|
@@ -403,7 +403,7 @@ builder_new(int argc, VALUE *argv, VALUE self) {
|
|
403
403
|
*/
|
404
404
|
static VALUE
|
405
405
|
builder_file(int argc, VALUE *argv, VALUE self) {
|
406
|
-
Builder b = ALLOC(struct
|
406
|
+
Builder b = ALLOC(struct _builder);
|
407
407
|
int indent = ox_default_options.indent;
|
408
408
|
long buf_size = 0;
|
409
409
|
FILE *f;
|
@@ -465,7 +465,7 @@ builder_file(int argc, VALUE *argv, VALUE self) {
|
|
465
465
|
*/
|
466
466
|
static VALUE
|
467
467
|
builder_io(int argc, VALUE *argv, VALUE self) {
|
468
|
-
Builder b = ALLOC(struct
|
468
|
+
Builder b = ALLOC(struct _builder);
|
469
469
|
int indent = ox_default_options.indent;
|
470
470
|
long buf_size = 0;
|
471
471
|
int fd;
|
data/ext/ox/cache.c
CHANGED
@@ -13,13 +13,13 @@
|
|
13
13
|
|
14
14
|
#include "cache.h"
|
15
15
|
|
16
|
-
struct
|
16
|
+
struct _cache {
|
17
17
|
/* The key is a length byte followed by the key as a string. If the key is longer than 254 characters then the
|
18
18
|
length is 255. The key can be for a premature value and in that case the length byte is greater than the length
|
19
19
|
of the key. */
|
20
20
|
char *key;
|
21
21
|
VALUE value;
|
22
|
-
struct
|
22
|
+
struct _cache *slots[16];
|
23
23
|
};
|
24
24
|
|
25
25
|
static void slot_print(Cache cache, unsigned int depth);
|
@@ -36,7 +36,7 @@ static char* form_key(const char *s) {
|
|
36
36
|
|
37
37
|
void
|
38
38
|
ox_cache_new(Cache *cache) {
|
39
|
-
*cache = ALLOC(struct
|
39
|
+
*cache = ALLOC(struct _cache);
|
40
40
|
(*cache)->key = 0;
|
41
41
|
(*cache)->value = Qundef;
|
42
42
|
memset((*cache)->slots, 0, sizeof((*cache)->slots));
|
@@ -63,7 +63,7 @@ ox_cache_get(Cache cache, const char *key, VALUE **slot, const char **keyp) {
|
|
63
63
|
int depth = (int)(k - (unsigned char*)key + 1);
|
64
64
|
|
65
65
|
cache = *cp;
|
66
|
-
|
66
|
+
|
67
67
|
if ('\0' == *(k + 1)) { /* exact match */
|
68
68
|
if (0 == cache->key) { /* nothing in this spot so take it */
|
69
69
|
cache->key = form_key(key);
|
@@ -73,7 +73,7 @@ ox_cache_get(Cache cache, const char *key, VALUE **slot, const char **keyp) {
|
|
73
73
|
} else { /* have to move the current premature key/value deeper */
|
74
74
|
unsigned char *ck = (unsigned char*)(cache->key + depth + 1);
|
75
75
|
Cache orig = *cp;
|
76
|
-
|
76
|
+
|
77
77
|
cp = (*cp)->slots + (*ck >> 4);
|
78
78
|
ox_cache_new(cp);
|
79
79
|
cp = (*cp)->slots + (*ck & 0x0F);
|
@@ -90,7 +90,7 @@ ox_cache_get(Cache cache, const char *key, VALUE **slot, const char **keyp) {
|
|
90
90
|
} else {
|
91
91
|
unsigned char *ck = (unsigned char*)(cache->key + depth + 1);
|
92
92
|
Cache orig = *cp;
|
93
|
-
|
93
|
+
|
94
94
|
cp = (*cp)->slots + (*ck >> 4);
|
95
95
|
ox_cache_new(cp);
|
96
96
|
cp = (*cp)->slots + (*ck & 0x0F);
|
data/ext/ox/cache.h
CHANGED
@@ -3,12 +3,12 @@
|
|
3
3
|
* All rights reserved.
|
4
4
|
*/
|
5
5
|
|
6
|
-
#ifndef
|
7
|
-
#define
|
6
|
+
#ifndef OX_CACHE_H
|
7
|
+
#define OX_CACHE_H
|
8
8
|
|
9
9
|
#include "ruby.h"
|
10
10
|
|
11
|
-
typedef struct
|
11
|
+
typedef struct _cache *Cache;
|
12
12
|
|
13
13
|
extern void ox_cache_new(Cache *cache);
|
14
14
|
|
@@ -16,4 +16,4 @@ extern VALUE ox_cache_get(Cache cache, const char *key, VALUE **slot, const c
|
|
16
16
|
|
17
17
|
extern void ox_cache_print(Cache cache);
|
18
18
|
|
19
|
-
#endif /*
|
19
|
+
#endif /* OX_CACHE_H */
|
data/ext/ox/cache8.c
CHANGED
@@ -18,11 +18,11 @@
|
|
18
18
|
#define DEPTH 16
|
19
19
|
|
20
20
|
typedef union {
|
21
|
-
struct
|
21
|
+
struct _cache8 *child;
|
22
22
|
slot_t value;
|
23
23
|
} Bucket;
|
24
24
|
|
25
|
-
struct
|
25
|
+
struct _cache8 {
|
26
26
|
Bucket buckets[SLOT_CNT];
|
27
27
|
};
|
28
28
|
|
@@ -33,8 +33,8 @@ void
|
|
33
33
|
ox_cache8_new(Cache8 *cache) {
|
34
34
|
Bucket *b;
|
35
35
|
int i;
|
36
|
-
|
37
|
-
*cache = ALLOC(struct
|
36
|
+
|
37
|
+
*cache = ALLOC(struct _cache8);
|
38
38
|
for (i = SLOT_CNT, b = (*cache)->buckets; 0 < i; i--, b++) {
|
39
39
|
b->value = 0;
|
40
40
|
}
|
@@ -66,7 +66,7 @@ ox_cache8_get(Cache8 cache, sid_t key, slot_t **slot) {
|
|
66
66
|
int i;
|
67
67
|
sid_t k8 = (sid_t)key;
|
68
68
|
sid_t k;
|
69
|
-
|
69
|
+
|
70
70
|
for (i = 64 - BITS; 0 < i; i -= BITS) {
|
71
71
|
k = (k8 >> i) & MASK;
|
72
72
|
b = cache->buckets + k;
|
data/ext/ox/cache8.h
CHANGED
@@ -3,13 +3,13 @@
|
|
3
3
|
* All rights reserved.
|
4
4
|
*/
|
5
5
|
|
6
|
-
#ifndef
|
7
|
-
#define
|
6
|
+
#ifndef OX_CACHE8_H
|
7
|
+
#define OX_CACHE8_H
|
8
8
|
|
9
9
|
#include "ruby.h"
|
10
10
|
#include "stdint.h"
|
11
11
|
|
12
|
-
typedef struct
|
12
|
+
typedef struct _cache8 *Cache8;
|
13
13
|
typedef uint64_t slot_t;
|
14
14
|
typedef uint64_t sid_t;
|
15
15
|
|
@@ -20,4 +20,4 @@ extern slot_t ox_cache8_get(Cache8 cache, sid_t key, slot_t **slot);
|
|
20
20
|
|
21
21
|
//extern void ox_cache8_print(Cache8 cache);
|
22
22
|
|
23
|
-
#endif /*
|
23
|
+
#endif /* OX_CACHE8_H */
|
data/ext/ox/dump.c
CHANGED
@@ -18,24 +18,24 @@
|
|
18
18
|
|
19
19
|
typedef unsigned long ulong;
|
20
20
|
|
21
|
-
typedef struct
|
21
|
+
typedef struct _str {
|
22
22
|
const char *str;
|
23
23
|
size_t len;
|
24
24
|
} *Str;
|
25
25
|
|
26
|
-
typedef struct
|
27
|
-
struct
|
28
|
-
struct
|
26
|
+
typedef struct _element {
|
27
|
+
struct _str clas;
|
28
|
+
struct _str attr;
|
29
29
|
unsigned long id;
|
30
30
|
int indent; /* < 0 indicates no \n */
|
31
31
|
int closed;
|
32
32
|
char type;
|
33
33
|
} *Element;
|
34
34
|
|
35
|
-
typedef struct
|
36
|
-
void (*w_start)(struct
|
37
|
-
void (*w_end)(struct
|
38
|
-
void (*w_time)(struct
|
35
|
+
typedef struct _out {
|
36
|
+
void (*w_start)(struct _out *out, Element e);
|
37
|
+
void (*w_end)(struct _out *out, Element e);
|
38
|
+
void (*w_time)(struct _out *out, VALUE obj);
|
39
39
|
char *buf;
|
40
40
|
char *end;
|
41
41
|
char *cur;
|
@@ -235,7 +235,7 @@ check_circular(Out out, VALUE obj, Element e) {
|
|
235
235
|
slot_t *slot;
|
236
236
|
slot_t id;
|
237
237
|
int result;
|
238
|
-
|
238
|
+
|
239
239
|
if (0 == (id = ox_cache8_get(out->circ_cache, obj, &slot))) {
|
240
240
|
out->circ_cnt++;
|
241
241
|
id = out->circ_cnt;
|
@@ -256,7 +256,7 @@ static void
|
|
256
256
|
grow(Out out, size_t len) {
|
257
257
|
size_t size = out->end - out->buf;
|
258
258
|
long pos = out->cur - out->buf;
|
259
|
-
|
259
|
+
|
260
260
|
size *= 2;
|
261
261
|
if (size <= len * 2 + pos) {
|
262
262
|
size += len;
|
@@ -297,7 +297,7 @@ dump_start(Out out, Element e) {
|
|
297
297
|
char buf[32];
|
298
298
|
char *end = buf + sizeof(buf) - 1;
|
299
299
|
const char *s = ulong2str(e->id, end);
|
300
|
-
|
300
|
+
|
301
301
|
fill_attr(out, 'i', s, end - s);
|
302
302
|
}
|
303
303
|
if (e->closed) {
|
@@ -341,7 +341,7 @@ dump_value(Out out, const char *value, size_t size) {
|
|
341
341
|
inline static void
|
342
342
|
dump_str_value(Out out, const char *value, size_t size, const char *table) {
|
343
343
|
size_t xsize = xml_str_len((const uchar*)value, size, table);
|
344
|
-
|
344
|
+
|
345
345
|
if (out->end - out->cur <= (long)xsize) {
|
346
346
|
grow(out, xsize);
|
347
347
|
}
|
@@ -591,7 +591,7 @@ dump_first_obj(VALUE obj, Out out) {
|
|
591
591
|
|
592
592
|
static void
|
593
593
|
dump_obj(ID aid, VALUE obj, int depth, Out out) {
|
594
|
-
struct
|
594
|
+
struct _element e;
|
595
595
|
VALUE prev_obj = out->obj;
|
596
596
|
char value_buf[64];
|
597
597
|
int cnt;
|
@@ -660,7 +660,7 @@ dump_obj(ID aid, VALUE obj, int depth, Out out) {
|
|
660
660
|
out->w_start(out, &e);
|
661
661
|
if (0 < cnt) {
|
662
662
|
unsigned int od = out->depth;
|
663
|
-
|
663
|
+
|
664
664
|
out->depth = depth + 1;
|
665
665
|
rb_hash_foreach(obj, dump_hash, (VALUE)out);
|
666
666
|
out->depth = od;
|
@@ -938,7 +938,7 @@ dump_obj(ID aid, VALUE obj, int depth, Out out) {
|
|
938
938
|
case T_BIGNUM:
|
939
939
|
{
|
940
940
|
volatile VALUE rs = rb_big2str(obj, 10);
|
941
|
-
|
941
|
+
|
942
942
|
e.type = BignumCode;
|
943
943
|
out->w_start(out, &e);
|
944
944
|
dump_value(out, StringValuePtr(rs), RSTRING_LEN(rs));
|
@@ -1018,7 +1018,7 @@ static int
|
|
1018
1018
|
dump_hash(VALUE key, VALUE value, Out out) {
|
1019
1019
|
dump_obj(0, key, out->depth, out);
|
1020
1020
|
dump_obj(0, value, out->depth, out);
|
1021
|
-
|
1021
|
+
|
1022
1022
|
return ST_CONTINUE;
|
1023
1023
|
}
|
1024
1024
|
|
@@ -1069,7 +1069,7 @@ dump_gen_element(VALUE obj, int depth, Out out) {
|
|
1069
1069
|
long nlen = RSTRING_LEN(rname);
|
1070
1070
|
size_t size;
|
1071
1071
|
int indent;
|
1072
|
-
|
1072
|
+
|
1073
1073
|
if (0 > out->indent) {
|
1074
1074
|
indent = -1;
|
1075
1075
|
} else if (0 == out->indent) {
|
@@ -1093,7 +1093,7 @@ dump_gen_element(VALUE obj, int depth, Out out) {
|
|
1093
1093
|
}
|
1094
1094
|
if (Qnil != nodes && 0 < RARRAY_LEN(nodes)) {
|
1095
1095
|
int do_indent;
|
1096
|
-
|
1096
|
+
|
1097
1097
|
*out->cur++ = '>';
|
1098
1098
|
do_indent = dump_gen_nodes(nodes, depth, out);
|
1099
1099
|
if (out->end - out->cur <= (long)size) {
|
@@ -1122,7 +1122,7 @@ dump_gen_instruct(VALUE obj, int depth, Out out) {
|
|
1122
1122
|
long nlen = RSTRING_LEN(rname);
|
1123
1123
|
long clen = 0;
|
1124
1124
|
size_t size;
|
1125
|
-
|
1125
|
+
|
1126
1126
|
if (T_STRING == rb_type(rcontent)) {
|
1127
1127
|
content = StringValuePtr(rcontent);
|
1128
1128
|
clen = RSTRING_LEN(rcontent);
|
@@ -1150,7 +1150,7 @@ static int
|
|
1150
1150
|
dump_gen_nodes(VALUE obj, int depth, Out out) {
|
1151
1151
|
long cnt = RARRAY_LEN(obj);
|
1152
1152
|
int indent_needed = 1;
|
1153
|
-
|
1153
|
+
|
1154
1154
|
if (0 < cnt) {
|
1155
1155
|
const VALUE *np = RARRAY_PTR(obj);
|
1156
1156
|
VALUE clas;
|
@@ -1176,7 +1176,7 @@ dump_gen_nodes(VALUE obj, int depth, Out out) {
|
|
1176
1176
|
} else if (ox_cdata_clas == clas) {
|
1177
1177
|
dump_gen_val_node(*np, d2, "<![CDATA[", 9, "]]>", 3, out);
|
1178
1178
|
} else if (ox_doctype_clas == clas) {
|
1179
|
-
dump_gen_val_node(*np, d2, "<!DOCTYPE ", 10, "
|
1179
|
+
dump_gen_val_node(*np, d2, "<!DOCTYPE ", 10, ">", 1, out);
|
1180
1180
|
} else {
|
1181
1181
|
rb_raise(rb_eTypeError, "Unexpected class, %s, while dumping generic XML\n", rb_class2name(clas));
|
1182
1182
|
}
|
@@ -1295,17 +1295,17 @@ dump_obj_to_xml(VALUE obj, Options copts, Out out) {
|
|
1295
1295
|
|
1296
1296
|
char*
|
1297
1297
|
ox_write_obj_to_str(VALUE obj, Options copts) {
|
1298
|
-
struct
|
1299
|
-
|
1298
|
+
struct _out out;
|
1299
|
+
|
1300
1300
|
dump_obj_to_xml(obj, copts, &out);
|
1301
1301
|
return out.buf;
|
1302
1302
|
}
|
1303
1303
|
|
1304
1304
|
void
|
1305
1305
|
ox_write_obj_to_file(VALUE obj, const char *path, Options copts) {
|
1306
|
-
struct
|
1306
|
+
struct _out out;
|
1307
1307
|
size_t size;
|
1308
|
-
FILE *f;
|
1308
|
+
FILE *f;
|
1309
1309
|
|
1310
1310
|
dump_obj_to_xml(obj, copts, &out);
|
1311
1311
|
size = out.cur - out.buf;
|