ox 1.5.2 → 1.5.3
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of ox might be problematic. Click here for more details.
- data/README.md +2 -4
- data/ext/ox/ox.c +51 -16
- data/lib/ox/version.rb +1 -1
- data/test/bug3.rb +13 -13
- metadata +3 -5
- data/test/bug4.rb +0 -60
- data/test/sax_example.rb +0 -37
data/README.md
CHANGED
@@ -30,11 +30,9 @@ A fast XML parser and Object marshaller as a Ruby gem.
|
|
30
30
|
|
31
31
|
## <a name="release">Release Notes</a>
|
32
32
|
|
33
|
-
### Release 1.5.
|
33
|
+
### Release 1.5.3
|
34
34
|
|
35
|
-
-
|
36
|
-
|
37
|
-
- Exception encoding and decoding support improved.
|
35
|
+
- Backed off on using the stack for allocation as very large XML files are too large for many stacks.
|
38
36
|
|
39
37
|
## <a name="description">Description</a>
|
40
38
|
|
data/ext/ox/ox.c
CHANGED
@@ -36,6 +36,9 @@
|
|
36
36
|
#include "ruby.h"
|
37
37
|
#include "ox.h"
|
38
38
|
|
39
|
+
// maximum to allocate on the stack, arbitrary limit
|
40
|
+
#define SMALL_XML 65536
|
41
|
+
|
39
42
|
typedef struct _YesNoOpt {
|
40
43
|
VALUE sym;
|
41
44
|
char *attr;
|
@@ -289,14 +292,22 @@ static VALUE
|
|
289
292
|
to_obj(VALUE self, VALUE ruby_xml) {
|
290
293
|
char *xml;
|
291
294
|
size_t len;
|
295
|
+
VALUE obj;
|
292
296
|
|
293
297
|
Check_Type(ruby_xml, T_STRING);
|
294
298
|
// the xml string gets modified so make a copy of it
|
295
299
|
len = RSTRING_LEN(ruby_xml) + 1;
|
296
|
-
|
300
|
+
if (SMALL_XML < len) {
|
301
|
+
xml = ALLOC_N(char, len);
|
302
|
+
} else {
|
303
|
+
xml = ALLOCA_N(char, len);
|
304
|
+
}
|
297
305
|
strcpy(xml, StringValuePtr(ruby_xml));
|
298
|
-
|
299
|
-
|
306
|
+
obj = ox_parse(xml, ox_obj_callbacks, 0, 0, StrictEffort);
|
307
|
+
if (SMALL_XML < len) {
|
308
|
+
xfree(xml);
|
309
|
+
}
|
310
|
+
return obj;
|
300
311
|
}
|
301
312
|
|
302
313
|
/* call-seq: parse(xml) => Ox::Document or Ox::Element
|
@@ -310,14 +321,22 @@ static VALUE
|
|
310
321
|
to_gen(VALUE self, VALUE ruby_xml) {
|
311
322
|
char *xml;
|
312
323
|
size_t len;
|
324
|
+
VALUE obj;
|
313
325
|
|
314
326
|
Check_Type(ruby_xml, T_STRING);
|
315
327
|
// the xml string gets modified so make a copy of it
|
316
328
|
len = RSTRING_LEN(ruby_xml) + 1;
|
317
|
-
|
329
|
+
if (SMALL_XML < len) {
|
330
|
+
xml = ALLOC_N(char, len);
|
331
|
+
} else {
|
332
|
+
xml = ALLOCA_N(char, len);
|
333
|
+
}
|
318
334
|
strcpy(xml, StringValuePtr(ruby_xml));
|
319
|
-
|
320
|
-
|
335
|
+
obj = ox_parse(xml, ox_gen_callbacks, 0, 0, StrictEffort);
|
336
|
+
if (SMALL_XML < len) {
|
337
|
+
xfree(xml);
|
338
|
+
}
|
339
|
+
return obj;
|
321
340
|
}
|
322
341
|
|
323
342
|
static VALUE
|
@@ -399,14 +418,22 @@ static VALUE
|
|
399
418
|
load_str(int argc, VALUE *argv, VALUE self) {
|
400
419
|
char *xml;
|
401
420
|
size_t len;
|
421
|
+
VALUE obj;
|
402
422
|
|
403
423
|
Check_Type(*argv, T_STRING);
|
404
424
|
// the xml string gets modified so make a copy of it
|
405
425
|
len = RSTRING_LEN(*argv) + 1;
|
406
|
-
|
426
|
+
if (SMALL_XML < len) {
|
427
|
+
xml = ALLOC_N(char, len);
|
428
|
+
} else {
|
429
|
+
xml = ALLOCA_N(char, len);
|
430
|
+
}
|
407
431
|
strcpy(xml, StringValuePtr(*argv));
|
408
|
-
|
409
|
-
|
432
|
+
obj = load(xml, argc - 1, argv + 1, self);
|
433
|
+
if (SMALL_XML < len) {
|
434
|
+
xfree(xml);
|
435
|
+
}
|
436
|
+
return obj;
|
410
437
|
}
|
411
438
|
|
412
439
|
/* call-seq: load_file(file_path, xml, options) => Ox::Document or Ox::Element or Object
|
@@ -428,10 +455,11 @@ load_str(int argc, VALUE *argv, VALUE self) {
|
|
428
455
|
*/
|
429
456
|
static VALUE
|
430
457
|
load_file(int argc, VALUE *argv, VALUE self) {
|
431
|
-
char
|
432
|
-
char
|
433
|
-
FILE
|
434
|
-
|
458
|
+
char *path;
|
459
|
+
char *xml;
|
460
|
+
FILE *f;
|
461
|
+
size_t len;
|
462
|
+
VALUE obj;
|
435
463
|
|
436
464
|
Check_Type(*argv, T_STRING);
|
437
465
|
path = StringValuePtr(*argv);
|
@@ -440,7 +468,11 @@ load_file(int argc, VALUE *argv, VALUE self) {
|
|
440
468
|
}
|
441
469
|
fseek(f, 0, SEEK_END);
|
442
470
|
len = ftell(f);
|
443
|
-
|
471
|
+
if (SMALL_XML < len) {
|
472
|
+
xml = ALLOC_N(char, len + 1);
|
473
|
+
} else {
|
474
|
+
xml = ALLOCA_N(char, len + 1);
|
475
|
+
}
|
444
476
|
fseek(f, 0, SEEK_SET);
|
445
477
|
if (len != fread(xml, 1, len, f)) {
|
446
478
|
fclose(f);
|
@@ -448,8 +480,11 @@ load_file(int argc, VALUE *argv, VALUE self) {
|
|
448
480
|
}
|
449
481
|
fclose(f);
|
450
482
|
xml[len] = '\0';
|
451
|
-
|
452
|
-
|
483
|
+
obj = load(xml, argc - 1, argv + 1, self);
|
484
|
+
if (SMALL_XML < len) {
|
485
|
+
xfree(xml);
|
486
|
+
}
|
487
|
+
return obj;
|
453
488
|
}
|
454
489
|
|
455
490
|
/* call-seq: sax_parse(handler, io, options)
|
data/lib/ox/version.rb
CHANGED
data/test/bug3.rb
CHANGED
@@ -2,20 +2,20 @@
|
|
2
2
|
|
3
3
|
$: << '../lib'
|
4
4
|
$: << '../ext'
|
5
|
+
$: << '../../pod/modules/pod/cfg/lib'
|
6
|
+
$: << '../../pod/modules/pod/core/lib'
|
7
|
+
$: << '../../pod/modules/pod/esb/lib'
|
5
8
|
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
"x".foo
|
11
|
-
rescue Exception => e
|
12
|
-
#puts e.message
|
13
|
-
xml = Ox.dump(e, effort: :tolerant)
|
14
|
-
puts xml
|
15
|
-
o = Ox.load(xml, mode: :object)
|
16
|
-
puts o.message
|
17
|
-
puts Ox.dump(e)
|
9
|
+
if __FILE__ == $0
|
10
|
+
if (i = ARGV.index('-I'))
|
11
|
+
x,path = ARGV.slice!(i, 2)
|
12
|
+
$: << path
|
18
13
|
end
|
19
14
|
end
|
20
15
|
|
21
|
-
|
16
|
+
require 'ox'
|
17
|
+
require 'pod/cfg'
|
18
|
+
|
19
|
+
x = Ox.load_file('fail.xml', :mode => :object, :effort => :strict)
|
20
|
+
|
21
|
+
puts "return is a #{x.class}"
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ox
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.5.
|
4
|
+
version: 1.5.3
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-03-
|
12
|
+
date: 2012-03-21 00:00:00.000000000 Z
|
13
13
|
dependencies: []
|
14
14
|
description: ! "A fast XML parser and object serializer that uses only standard C
|
15
15
|
lib.\n \nOptimized XML (Ox), as the name implies was written to provide
|
@@ -54,7 +54,6 @@ files:
|
|
54
54
|
- test/bug1.rb
|
55
55
|
- test/bug2.rb
|
56
56
|
- test/bug3.rb
|
57
|
-
- test/bug4.rb
|
58
57
|
- test/cache16_test.rb
|
59
58
|
- test/cache8_test.rb
|
60
59
|
- test/cache_test.rb
|
@@ -95,7 +94,6 @@ files:
|
|
95
94
|
- test/sample/shape.rb
|
96
95
|
- test/sample/text.rb
|
97
96
|
- test/sample.rb
|
98
|
-
- test/sax_example.rb
|
99
97
|
- test/sax_test.rb
|
100
98
|
- test/test.rb
|
101
99
|
- test/Sample.graffle
|
@@ -124,7 +122,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
124
122
|
version: '0'
|
125
123
|
requirements: []
|
126
124
|
rubyforge_project: ox
|
127
|
-
rubygems_version: 1.8.
|
125
|
+
rubygems_version: 1.8.11
|
128
126
|
signing_key:
|
129
127
|
specification_version: 3
|
130
128
|
summary: A fast XML parser and object serializer.
|
data/test/bug4.rb
DELETED
@@ -1,60 +0,0 @@
|
|
1
|
-
#!/usr/bin/env ruby -wW1
|
2
|
-
# encoding: UTF-8
|
3
|
-
|
4
|
-
$: << File.join(File.dirname(__FILE__), "../lib")
|
5
|
-
$: << File.join(File.dirname(__FILE__), "../ext")
|
6
|
-
|
7
|
-
require 'stringio'
|
8
|
-
require 'ox'
|
9
|
-
|
10
|
-
x1 = %(<?xml version="1.0" encoding="ISO-8859-1" ?><tag key="value">Français</tag>).encode("ISO-8859-1")
|
11
|
-
# => "<?xml version=\"1.0\" encoding=\"ISO-8859-1\" ?><tag key=\"value\">Fran\xE7ais</tag>"
|
12
|
-
x1.encoding
|
13
|
-
# => #<Encoding:ISO-8859-1>
|
14
|
-
|
15
|
-
x2 = %(<?xml version="1.0" encoding="UTF-8" ?><tag key="value">Français</tag>)
|
16
|
-
# => "<?xml version=\"1.0\" encoding=\"UTF-8\" ?><tag key=\"value\">Fran\xC3\xA7ais</tag>"
|
17
|
-
x2.encoding
|
18
|
-
# => #<Encoding:UTF-8>
|
19
|
-
|
20
|
-
class OH < ::Ox::Sax
|
21
|
-
def start_element(name)
|
22
|
-
puts "EL: #{name} (#{name.encoding})"
|
23
|
-
end
|
24
|
-
|
25
|
-
def end_element(name)
|
26
|
-
end
|
27
|
-
|
28
|
-
def attr(key, value)
|
29
|
-
puts "AT: #{key} => #{value} (#{key.encoding} => #{value.encoding})"
|
30
|
-
end
|
31
|
-
|
32
|
-
def text(value)
|
33
|
-
puts "TX: #{value} (#{value.encoding})"
|
34
|
-
end
|
35
|
-
end
|
36
|
-
|
37
|
-
::Ox.sax_parse OH.new, StringIO.new(x1)
|
38
|
-
# => AT: version => 1.0 (US-ASCII => ASCII-8BIT)
|
39
|
-
# AT: encoding => ISO-8859-1 (US-ASCII => ISO-8859-1)
|
40
|
-
# EL: tag (US-ASCII)
|
41
|
-
# AT: key => value (US-ASCII => ISO-8859-1)
|
42
|
-
# TX: Fran�ais (ISO-8859-1)
|
43
|
-
|
44
|
-
puts
|
45
|
-
|
46
|
-
::Ox.sax_parse OH.new, StringIO.new(x2)
|
47
|
-
# => AT: version => 1.0 (US-ASCII => ASCII-8BIT)
|
48
|
-
# AT: encoding => UTF-8 (US-ASCII => UTF-8)
|
49
|
-
# EL: tag (US-ASCII)
|
50
|
-
# AT: key => value (US-ASCII => UTF-8)
|
51
|
-
# TX: Français (UTF-8)
|
52
|
-
|
53
|
-
puts
|
54
|
-
x3 = %(<?xml version="1.0" encoding="ISO-8859-1" ?><tag Português="Español">Français</tag>).encode("ISO-8859-1")
|
55
|
-
::Ox.sax_parse OH.new, StringIO.new(x3)
|
56
|
-
|
57
|
-
puts
|
58
|
-
x4 = %(<?xml version="1.0" encoding="UTF-8" ?><tag Português="Español">Français</tag>)
|
59
|
-
::Ox.sax_parse OH.new, StringIO.new(x4)
|
60
|
-
|
data/test/sax_example.rb
DELETED
@@ -1,37 +0,0 @@
|
|
1
|
-
#!/usr/bin/env ruby -wW1
|
2
|
-
|
3
|
-
$: << '../lib'
|
4
|
-
$: << '../ext'
|
5
|
-
|
6
|
-
require 'stringio'
|
7
|
-
require 'ox'
|
8
|
-
|
9
|
-
class Sample < ::Ox::Sax
|
10
|
-
def start_element(name); puts "start: #{name}"; end
|
11
|
-
def end_element(name); puts "end: #{name}"; end
|
12
|
-
def attr(name, value); puts " #{name} => #{value}"; end
|
13
|
-
def text(value); puts "text #{value}"; end
|
14
|
-
end
|
15
|
-
|
16
|
-
io = StringIO.new(%{
|
17
|
-
<top name="sample">
|
18
|
-
<middle name="second">
|
19
|
-
<bottom name="third"/>
|
20
|
-
</middle>
|
21
|
-
</top>
|
22
|
-
})
|
23
|
-
|
24
|
-
handler = Sample.new()
|
25
|
-
Ox.sax_parse(handler, io)
|
26
|
-
|
27
|
-
# outputs
|
28
|
-
# start: top
|
29
|
-
# name => sample
|
30
|
-
# start: middle
|
31
|
-
# name => second
|
32
|
-
# start: bottom
|
33
|
-
# name => third
|
34
|
-
# end: bottom
|
35
|
-
# end: middle
|
36
|
-
# end: top
|
37
|
-
|