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 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.2
33
+ ### Release 1.5.3
34
34
 
35
- - Added support for Date.
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
- xml = ALLOCA_N(char, len);
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
- return ox_parse(xml, ox_obj_callbacks, 0, 0, StrictEffort);
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
- xml = ALLOCA_N(char, len);
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
- return ox_parse(xml, ox_gen_callbacks, 0, 0, StrictEffort);
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
- xml = ALLOCA_N(char, len);
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
- return load(xml, argc - 1, argv + 1, self);
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 *path;
432
- char *xml;
433
- FILE *f;
434
- unsigned long len;
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
- xml = ALLOCA_N(char, len + 1);
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
- return load(xml, argc - 1, argv + 1, self);
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
@@ -1,5 +1,5 @@
1
1
 
2
2
  module Ox
3
3
  # Current version of the module.
4
- VERSION = '1.5.2'
4
+ VERSION = '1.5.3'
5
5
  end
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
- require 'ox'
7
-
8
- def name_it()
9
- begin
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
- name_it()
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.2
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-15 00:00:00.000000000 Z
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.15
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
-