libxml-ruby 5.0.6 → 6.0.0

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.
Files changed (131) hide show
  1. checksums.yaml +4 -4
  2. data/{HISTORY → CHANGELOG.md} +875 -930
  3. data/LICENSE +20 -20
  4. data/README.md +67 -0
  5. data/Rakefile +13 -34
  6. data/ext/libxml/extconf.rb +34 -20
  7. data/ext/libxml/libxml.c +2 -14
  8. data/ext/libxml/ruby_libxml.h +1 -1
  9. data/ext/libxml/ruby_xml_attr.c +27 -22
  10. data/ext/libxml/ruby_xml_attr.h +1 -0
  11. data/ext/libxml/ruby_xml_attr_decl.c +19 -12
  12. data/ext/libxml/ruby_xml_attributes.c +18 -9
  13. data/ext/libxml/ruby_xml_document.c +111 -98
  14. data/ext/libxml/ruby_xml_document.h +1 -0
  15. data/ext/libxml/ruby_xml_dtd.c +49 -19
  16. data/ext/libxml/ruby_xml_dtd.h +1 -0
  17. data/ext/libxml/ruby_xml_html_parser.c +1 -1
  18. data/ext/libxml/ruby_xml_html_parser_context.c +19 -6
  19. data/ext/libxml/ruby_xml_html_parser_context.h +1 -0
  20. data/ext/libxml/ruby_xml_input_cbg.c +45 -17
  21. data/ext/libxml/ruby_xml_io.c +3 -1
  22. data/ext/libxml/ruby_xml_namespace.c +20 -12
  23. data/ext/libxml/ruby_xml_namespace.h +1 -0
  24. data/ext/libxml/ruby_xml_namespaces.c +40 -20
  25. data/ext/libxml/ruby_xml_node.c +71 -32
  26. data/ext/libxml/ruby_xml_node.h +2 -0
  27. data/ext/libxml/ruby_xml_parser.c +1 -1
  28. data/ext/libxml/ruby_xml_parser_context.c +54 -47
  29. data/ext/libxml/ruby_xml_parser_context.h +1 -0
  30. data/ext/libxml/ruby_xml_reader.c +25 -15
  31. data/ext/libxml/ruby_xml_registry.c +31 -0
  32. data/ext/libxml/ruby_xml_registry.h +22 -0
  33. data/ext/libxml/ruby_xml_relaxng.c +21 -5
  34. data/ext/libxml/ruby_xml_relaxng.h +1 -0
  35. data/ext/libxml/ruby_xml_sax_parser.c +1 -1
  36. data/ext/libxml/ruby_xml_schema.c +18 -11
  37. data/ext/libxml/ruby_xml_schema.h +1 -0
  38. data/ext/libxml/ruby_xml_schema_attribute.c +7 -7
  39. data/ext/libxml/ruby_xml_schema_element.c +8 -8
  40. data/ext/libxml/ruby_xml_schema_facet.c +7 -7
  41. data/ext/libxml/ruby_xml_schema_type.c +12 -19
  42. data/ext/libxml/ruby_xml_version.h +4 -4
  43. data/ext/libxml/ruby_xml_writer.c +18 -6
  44. data/ext/libxml/ruby_xml_xpath.c +2 -2
  45. data/ext/libxml/ruby_xml_xpath.h +1 -1
  46. data/ext/libxml/ruby_xml_xpath_context.c +72 -26
  47. data/ext/libxml/ruby_xml_xpath_expression.c +11 -5
  48. data/ext/libxml/ruby_xml_xpath_expression.h +1 -0
  49. data/ext/libxml/ruby_xml_xpath_object.c +69 -54
  50. data/ext/libxml/ruby_xml_xpath_object.h +3 -1
  51. data/ext/vc/libxml_ruby/libxml_ruby.vcxproj +271 -0
  52. data/ext/xcode/libxml-ruby.xcodeproj/project.pbxproj +633 -0
  53. data/ext/xcode/libxml-ruby.xcodeproj/project.xcworkspace/contents.xcworkspacedata +7 -0
  54. data/ext/xcode/libxml-ruby.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +8 -0
  55. data/ext/xcode/libxml-ruby.xcodeproj/xcshareddata/xcschemes/libxml-ruby.xcscheme +80 -0
  56. data/lib/libxml/document.rb +0 -29
  57. data/lib/libxml/error.rb +30 -3
  58. data/lib/libxml/html_parser.rb +0 -16
  59. data/lib/libxml/node.rb +1 -3
  60. data/lib/libxml/parser.rb +0 -8
  61. data/lib/libxml/schema/attribute.rb +27 -19
  62. data/lib/libxml/schema/element.rb +20 -0
  63. data/lib/libxml/schema/type.rb +44 -21
  64. data/lib/libxml/schema.rb +47 -47
  65. data/lib/libxml-ruby.rb +30 -30
  66. data/libxml-ruby.gemspec +12 -16
  67. data/test/c14n/result/1-1-without-comments/example-1 +3 -3
  68. data/test/c14n/result/1-1-without-comments/example-2 +10 -10
  69. data/test/c14n/result/1-1-without-comments/example-3 +13 -13
  70. data/test/c14n/result/1-1-without-comments/example-4 +8 -8
  71. data/test/c14n/result/1-1-without-comments/example-5 +2 -2
  72. data/test/c14n/result/with-comments/example-1 +5 -5
  73. data/test/c14n/result/with-comments/example-2 +10 -10
  74. data/test/c14n/result/with-comments/example-3 +13 -13
  75. data/test/c14n/result/with-comments/example-4 +8 -8
  76. data/test/c14n/result/with-comments/example-5 +3 -3
  77. data/test/c14n/result/without-comments/example-1 +3 -3
  78. data/test/c14n/result/without-comments/example-2 +10 -10
  79. data/test/c14n/result/without-comments/example-3 +13 -13
  80. data/test/c14n/result/without-comments/example-4 +8 -8
  81. data/test/c14n/result/without-comments/example-5 +2 -2
  82. data/test/test_attr.rb +179 -180
  83. data/test/test_attr_decl.rb +131 -131
  84. data/test/test_attributes.rb +135 -135
  85. data/test/test_canonicalize.rb +122 -120
  86. data/test/test_document.rb +2 -4
  87. data/test/test_dtd.rb +12 -4
  88. data/test/test_encoding_sax.rb +114 -114
  89. data/test/test_error.rb +1 -1
  90. data/test/test_html_parser.rb +6 -2
  91. data/test/test_html_parser_context.rb +22 -22
  92. data/test/test_input_callbacks.rb +36 -0
  93. data/test/test_namespace.rb +1 -1
  94. data/test/test_namespaces.rb +200 -200
  95. data/test/test_node.rb +16 -0
  96. data/test/test_node_cdata.rb +50 -50
  97. data/test/test_node_comment.rb +32 -32
  98. data/test/test_node_copy.rb +40 -40
  99. data/test/test_node_edit.rb +176 -158
  100. data/test/test_node_pi.rb +37 -37
  101. data/test/test_node_text.rb +69 -69
  102. data/test/test_node_xlink.rb +28 -28
  103. data/test/test_parser.rb +5 -41
  104. data/test/test_parser_context.rb +198 -198
  105. data/test/test_properties.rb +38 -38
  106. data/test/test_reader.rb +55 -6
  107. data/test/test_relaxng.rb +59 -53
  108. data/test/test_sax_parser.rb +345 -345
  109. data/test/test_schema.rb +28 -0
  110. data/test/test_traversal.rb +152 -152
  111. data/test/test_writer.rb +0 -31
  112. data/test/test_xinclude.rb +20 -20
  113. data/test/test_xml.rb +3 -7
  114. data/test/test_xpath.rb +244 -244
  115. data/test/test_xpath_context.rb +87 -87
  116. data/test/test_xpath_expression.rb +37 -37
  117. metadata +32 -25
  118. data/README.rdoc +0 -208
  119. data/ext/libxml/extconf.h +0 -4
  120. data/ext/libxml/ruby_xml_cbg.c +0 -85
  121. data/lib/libxml/hpricot.rb +0 -78
  122. data/lib/libxml.rb +0 -5
  123. data/lib/xml/libxml.rb +0 -10
  124. data/lib/xml.rb +0 -14
  125. data/script/benchmark/depixelate +0 -634
  126. data/script/benchmark/hamlet.xml +0 -9055
  127. data/script/benchmark/parsecount +0 -170
  128. data/script/benchmark/sock_entries.xml +0 -507
  129. data/script/benchmark/throughput +0 -41
  130. data/script/test +0 -6
  131. data/test/test_deprecated_require.rb +0 -12
data/LICENSE CHANGED
@@ -1,21 +1,21 @@
1
- Copyright (c) 2008-2013 Charlie Savage and contributors
2
- Copyright (c) 2002-2007 Sean Chittenden and contributors
3
- Copyright (c) 2001 Wai-Sun "Squidster" Chia
4
-
5
- Permission is hereby granted, free of charge, to any person obtaining a copy of
6
- this software and associated documentation files (the "Software"), to deal in
7
- the Software without restriction, including without limitation the rights to
8
- use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
9
- of the Software, and to permit persons to whom the Software is furnished to do
10
- so, subject to the following conditions:
11
-
12
- The above copyright notice and this permission notice shall be included in all
13
- copies or substantial portions of the Software.
14
-
15
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
1
+ Copyright (c) 2008-2013 Charlie Savage and contributors
2
+ Copyright (c) 2002-2007 Sean Chittenden and contributors
3
+ Copyright (c) 2001 Wai-Sun "Squidster" Chia
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy of
6
+ this software and associated documentation files (the "Software"), to deal in
7
+ the Software without restriction, including without limitation the rights to
8
+ use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
9
+ of the Software, and to permit persons to whom the Software is furnished to do
10
+ so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
21
  SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,67 @@
1
+ # LibXML Ruby
2
+
3
+ ## Overview
4
+ The libxml gem provides Ruby language bindings for GNOME's Libxml2
5
+ XML toolkit. It is free software, released under the MIT License.
6
+
7
+ libxml-ruby let's you:
8
+
9
+ * Read xml files
10
+ * Write xml files
11
+ * Search xml files using XPath
12
+ * Validate XML files
13
+
14
+ Full documentation is available at [xml4r.github.io/libxml-ruby](https://xml4r.github.io/libxml-ruby/) including a getting started guide.
15
+
16
+ ## Requirements
17
+
18
+ libxml-ruby requires Ruby 3.2 or higher.
19
+
20
+ ## Installation
21
+ The easiest way to install libxml-ruby is via RubyGems. To install:
22
+
23
+ ```
24
+ gem install libxml-ruby
25
+ ```
26
+
27
+ If the extension compile process cannot find libxml2, you may need to indicate
28
+ the location of the libxml2 configuration utility as it is used to find the
29
+ required header and include files. (If you need to indicate a location for the
30
+ libxml2 library or header files different than reported by `xml2-config`,
31
+ see the additional configuration options.)
32
+
33
+ This may be done with RubyGems:
34
+
35
+ ```
36
+ gem install libxml-ruby -- --with-xml2-config=/path/to/xml2-config
37
+ ```
38
+
39
+ Or bundler:
40
+
41
+ ```
42
+ bundle config build.libxml-ruby --with-xml2-config=/path/to/xml2-config
43
+ bundle install
44
+ ```
45
+
46
+ Full documentation is available at [xml4r.github.io/libxml-ruby](https://xml4r.github.io/libxml-ruby/) including a [getting started](https://xml4r.github.io/libxml-ruby/getting_started/) guide.
47
+
48
+ ## Tests
49
+
50
+ To run tests you first need to build the shared library:
51
+
52
+ ```
53
+ rake compile
54
+ ```
55
+
56
+ Once you have built the shared library, you can then run tests using rake:
57
+
58
+ ```
59
+ rake test
60
+ ```
61
+
62
+ ## Support
63
+ If you have any questions about using libxml-ruby, please report an issue
64
+ on [GitHub](https://github.com/xml4r/libxml-ruby/issues).
65
+
66
+ ## License
67
+ See [LICENSE](LICENSE) for license information.
data/Rakefile CHANGED
@@ -21,25 +21,6 @@ Rake::ExtensionTask.new do |ext|
21
21
  ext.name = SO_NAME
22
22
  ext.ext_dir = "ext/libxml"
23
23
  ext.lib_dir = "lib/#{RUBY_VERSION.sub(/\.\d+$/, '')}"
24
- if RUBY_PLATFORM.match(/mingw/)
25
- ext.config_options <<
26
- if (dir = ENV['WINDOWS_XML2_INCLUDE'])
27
- "--with-xml2-include=#{dir}"
28
- else
29
- case RUBY_PLATFORM
30
- when 'i386-mingw32'
31
- '--with-xml2-include=C:/msys64/mingw32/include/libxml2'
32
- when 'x64-mingw32'
33
- '--with-xml2-include=C:/msys64/mingw64/include/libxml2'
34
- when 'x64-mingw-ucrt'
35
- '--with-xml2-include=C:/msys64/ucrt64/include/libxml2'
36
- else
37
- raise "Unknown Windows Ruby, please set ENV['WINDOWS_XML2_INCLUDE']"
38
- end
39
- end
40
- else
41
- ext.config_options << '--with-xml2-include=/usr/include/libxml2'
42
- end
43
24
  end
44
25
 
45
26
  # Setup generic gem
@@ -49,21 +30,20 @@ Gem::PackageTask.new(spec) do |pkg|
49
30
  end
50
31
 
51
32
  # Setup Windows Gem
52
- if RUBY_PLATFORM.match(/mswin|mingw/)
53
- binaries = (FileList['lib/**/*.so',
54
- 'lib/**/*dll'])
33
+ if RUBY_PLATFORM.match(/mingw/)
34
+ binaries = (FileList['lib/**/*.so'])
55
35
 
56
36
  # Windows specification
57
- win_spec = spec.clone
58
- win_spec.platform = Gem::Platform::CURRENT
59
- win_spec.files += binaries.to_a
60
- win_spec.instance_variable_set(:@cache_file, nil)
37
+ mingw_spec = spec.clone
38
+ mingw_spec.platform = Gem::Platform::CURRENT
39
+ mingw_spec.files += binaries.to_a
40
+ mingw_spec.instance_variable_set(:@cache_file, nil)
61
41
 
62
42
  # Unset extensions
63
- win_spec.extensions = nil
43
+ mingw_spec.extensions = nil
64
44
 
65
45
  # Rake task to build the windows package
66
- Gem::PackageTask.new(win_spec) do |pkg|
46
+ Gem::PackageTask.new(mingw_spec) do |pkg|
67
47
  pkg.package_dir = 'pkg'
68
48
  pkg.need_tar = false
69
49
  end
@@ -74,20 +54,19 @@ desc 'Generate rdoc documentation'
74
54
  RDoc::Task.new("rdoc") do |rdoc|
75
55
  rdoc.rdoc_dir = 'rdoc'
76
56
  rdoc.title = 'LibXML'
77
- rdoc.generator = 'hanna'
57
+ rdoc.generator = 'aliki'
78
58
 
79
59
  # Show source inline with line numbers
80
60
  rdoc.options << '--line-numbers'
81
61
  rdoc.options << '--charset=utf-8'
82
62
  # Make the readme file the start page for the generated html
83
- rdoc.main = 'README.rdoc'
84
- rdoc.rdoc_files.include('doc/*.rdoc',
85
- 'ext/**/libxml.c',
63
+ rdoc.main = 'README.md'
64
+ rdoc.rdoc_files.include('ext/**/libxml.c',
86
65
  'ext/**/ruby_xml.c',
87
66
  'ext/**/*.c',
88
67
  'lib/**/*.rb',
89
- 'README.rdoc',
90
- 'HISTORY',
68
+ 'README.md',
69
+ 'CHANGELOG.md',
91
70
  'LICENSE')
92
71
  end
93
72
 
@@ -23,32 +23,46 @@ if xc
23
23
  end
24
24
  else
25
25
  dir_config('xml2')
26
+ pkg_config('libxml-2.0')
26
27
  end
27
28
 
28
- found_header = find_header('libxml/xmlversion.h',
29
- '/opt/include/libxml2',
30
- '/opt/local/include/libxml2',
31
- '/opt/homebrew/opt/libxml2/include/libxml2',
32
- '/usr/local/include/libxml2',
33
- '/usr/include/libxml2',
34
- '/usr/local/include',
35
- '/usr/local/opt/libxml2/include/libxml2')
29
+ include_dirs = []
30
+ lib_dirs = []
31
+
32
+ if (msystem_prefix = ENV['MSYSTEM_PREFIX']) && !msystem_prefix.empty?
33
+ include_dirs.concat([
34
+ "#{msystem_prefix}/include/libxml2",
35
+ "#{msystem_prefix}/include"
36
+ ])
37
+ lib_dirs << "#{msystem_prefix}/lib"
38
+ end
39
+
40
+ include_dirs.concat([
41
+ '/opt/include/libxml2',
42
+ '/opt/local/include/libxml2',
43
+ '/opt/homebrew/opt/libxml2/include/libxml2',
44
+ '/usr/local/include/libxml2',
45
+ '/usr/include/libxml2',
46
+ '/usr/local/include',
47
+ '/usr/local/opt/libxml2/include/libxml2'
48
+ ])
49
+
50
+ lib_dirs.concat([
51
+ '/opt/lib',
52
+ '/opt/local/lib',
53
+ '/opt/homebrew/opt/libxml2/lib',
54
+ '/usr/lib',
55
+ '/usr/local/lib',
56
+ '/usr/local/opt/libxml2/lib'
57
+ ])
58
+
59
+ found_header = find_header('libxml/xmlversion.h', *include_dirs)
36
60
 
37
61
  found_lib = find_library('xml2', 'xmlParseDoc',
38
- '/opt/lib',
39
- '/opt/local/lib',
40
- '/opt/homebrew/opt/libxml2/lib',
41
- '/usr/lib',
42
- '/usr/local/lib',
43
- '/usr/local/opt/libxml2/lib')
62
+ *lib_dirs)
44
63
 
45
64
  found_lib ||= find_library('libxml2', 'xmlParseDoc',
46
- '/opt/lib',
47
- '/opt/local/lib',
48
- '/opt/homebrew/opt/libxml2/lib',
49
- '/usr/lib',
50
- '/usr/local/lib',
51
- '/usr/local/opt/libxml2/lib')
65
+ *lib_dirs)
52
66
 
53
67
  if !found_header || !found_lib
54
68
  crash(<<~EOL)
data/ext/libxml/libxml.c CHANGED
@@ -9,18 +9,6 @@
9
9
 
10
10
  VALUE mLibXML;
11
11
 
12
- static void rxml_init_memory(void)
13
- {
14
- /* Disable for now - broke attributes.
15
- xmlGcMemSetup(
16
- (xmlFreeFunc)ruby_xfree,
17
- (xmlMallocFunc)ruby_xmalloc,
18
- (xmlMallocFunc)ruby_xmalloc,
19
- (xmlReallocFunc)ruby_xrealloc,
20
- (xmlStrdupFunc)ruby_strdup
21
- );*/
22
- }
23
-
24
12
  void Init_libxml_ruby(void)
25
13
  {
26
14
  /* The libxml gem provides Ruby language bindings for GNOME's Libxml2
@@ -40,12 +28,12 @@ void Init_libxml_ruby(void)
40
28
  * copyright and distribution information.
41
29
  */
42
30
 
43
- // Seutp for threading. http://xmlsoft.org/threads.html
31
+ // Setup for threading. http://xmlsoft.org/threads.html
44
32
  xmlInitParser();
45
33
 
46
34
  mLibXML = rb_define_module("LibXML");
47
35
 
48
- rxml_init_memory();
36
+ rxml_init_registry();
49
37
  rxml_init_xml();
50
38
  rxml_init_io();
51
39
  rxml_init_error();
@@ -24,7 +24,6 @@
24
24
  #include "ruby_xml_html_parser_options.h"
25
25
  #include "ruby_xml_html_parser_context.h"
26
26
  #include "ruby_xml_reader.h"
27
- #include "ruby_xml_writer.h"
28
27
  #include "ruby_xml_sax2_handler.h"
29
28
  #include "ruby_xml_sax_parser.h"
30
29
  #include "ruby_xml_writer.h"
@@ -37,6 +36,7 @@
37
36
  #include "ruby_xml_dtd.h"
38
37
  #include "ruby_xml_schema.h"
39
38
  #include "ruby_xml_relaxng.h"
39
+ #include "ruby_xml_registry.h"
40
40
 
41
41
  extern VALUE mLibXML;
42
42
 
@@ -32,22 +32,29 @@
32
32
 
33
33
  VALUE cXMLAttr;
34
34
 
35
- void rxml_attr_mark(xmlAttrPtr xattr)
35
+ static void rxml_attr_mark(void *data)
36
36
  {
37
+ xmlAttrPtr xattr = (xmlAttrPtr) data;
37
38
  /* This can happen if Ruby does a GC run after creating the
38
39
  new attribute but before initializing it. */
39
40
  if (xattr != NULL)
40
41
  rxml_node_mark((xmlNodePtr) xattr);
41
42
  }
42
43
 
44
+ const rb_data_type_t rxml_attr_type = {
45
+ "LibXML::XML::Attr",
46
+ {rxml_attr_mark, NULL, 0},
47
+ &rxml_node_data_type, 0, RUBY_TYPED_FREE_IMMEDIATELY
48
+ };
49
+
43
50
  VALUE rxml_attr_wrap(xmlAttrPtr xattr)
44
51
  {
45
- return Data_Wrap_Struct(cXMLAttr, rxml_attr_mark, NULL, xattr);
52
+ return TypedData_Wrap_Struct(cXMLAttr, &rxml_attr_type, xattr);
46
53
  }
47
54
 
48
55
  static VALUE rxml_attr_alloc(VALUE klass)
49
56
  {
50
- return Data_Wrap_Struct(klass, rxml_attr_mark, NULL, NULL);
57
+ return TypedData_Wrap_Struct(klass, &rxml_attr_type, NULL);
51
58
  }
52
59
 
53
60
  /*
@@ -78,7 +85,7 @@ static VALUE rxml_attr_initialize(int argc, VALUE *argv, VALUE self)
78
85
  Check_Type(name, T_STRING);
79
86
  Check_Type(value, T_STRING);
80
87
 
81
- Data_Get_Struct(node, xmlNode, xnode);
88
+ TypedData_Get_Struct(node, xmlNode, &rxml_node_data_type, xnode);
82
89
 
83
90
  if (xnode->type != XML_ELEMENT_NODE)
84
91
  rb_raise(rb_eArgError, "Attributes can only be created on element nodes.");
@@ -90,14 +97,14 @@ static VALUE rxml_attr_initialize(int argc, VALUE *argv, VALUE self)
90
97
  else
91
98
  {
92
99
  xmlNsPtr xns;
93
- Data_Get_Struct(ns, xmlNs, xns);
100
+ TypedData_Get_Struct(ns, xmlNs, &rxml_namespace_type, xns);
94
101
  xattr = xmlNewNsProp(xnode, xns, (xmlChar*)StringValuePtr(name), (xmlChar*)StringValuePtr(value));
95
102
  }
96
103
 
97
104
  if (!xattr)
98
105
  rb_raise(rb_eRuntimeError, "Could not create attribute.");
99
106
 
100
- DATA_PTR( self) = xattr;
107
+ RTYPEDDATA_DATA( self) = xattr;
101
108
  return self;
102
109
  }
103
110
 
@@ -110,7 +117,7 @@ static VALUE rxml_attr_initialize(int argc, VALUE *argv, VALUE self)
110
117
  static VALUE rxml_attr_child_get(VALUE self)
111
118
  {
112
119
  xmlAttrPtr xattr;
113
- Data_Get_Struct(self, xmlAttr, xattr);
120
+ TypedData_Get_Struct(self, xmlAttr, &rxml_attr_type, xattr);
114
121
  if (xattr->children == NULL)
115
122
  return Qnil;
116
123
  else
@@ -129,11 +136,11 @@ static VALUE rxml_attr_child_get(VALUE self)
129
136
  static VALUE rxml_attr_doc_get(VALUE self)
130
137
  {
131
138
  xmlAttrPtr xattr;
132
- Data_Get_Struct(self, xmlAttr, xattr);
139
+ TypedData_Get_Struct(self, xmlAttr, &rxml_attr_type, xattr);
133
140
  if (xattr->doc == NULL)
134
141
  return Qnil;
135
142
  else
136
- return rxml_document_wrap(xattr->doc);
143
+ return rxml_registry_lookup(xattr->doc);
137
144
  }
138
145
 
139
146
  /*
@@ -145,7 +152,7 @@ static VALUE rxml_attr_doc_get(VALUE self)
145
152
  static VALUE rxml_attr_last_get(VALUE self)
146
153
  {
147
154
  xmlAttrPtr xattr;
148
- Data_Get_Struct(self, xmlAttr, xattr);
155
+ TypedData_Get_Struct(self, xmlAttr, &rxml_attr_type, xattr);
149
156
  if (xattr->last == NULL)
150
157
  return Qnil;
151
158
  else
@@ -161,7 +168,7 @@ static VALUE rxml_attr_last_get(VALUE self)
161
168
  static VALUE rxml_attr_name_get(VALUE self)
162
169
  {
163
170
  xmlAttrPtr xattr;
164
- Data_Get_Struct(self, xmlAttr, xattr);
171
+ TypedData_Get_Struct(self, xmlAttr, &rxml_attr_type, xattr);
165
172
 
166
173
  if (xattr->name == NULL)
167
174
  return Qnil;
@@ -178,7 +185,7 @@ static VALUE rxml_attr_name_get(VALUE self)
178
185
  static VALUE rxml_attr_next_get(VALUE self)
179
186
  {
180
187
  xmlAttrPtr xattr;
181
- Data_Get_Struct(self, xmlAttr, xattr);
188
+ TypedData_Get_Struct(self, xmlAttr, &rxml_attr_type, xattr);
182
189
  if (xattr->next == NULL)
183
190
  return Qnil;
184
191
  else
@@ -194,7 +201,7 @@ static VALUE rxml_attr_next_get(VALUE self)
194
201
  static VALUE rxml_attr_node_type(VALUE self)
195
202
  {
196
203
  xmlAttrPtr xattr;
197
- Data_Get_Struct(self, xmlAttr, xattr);
204
+ TypedData_Get_Struct(self, xmlAttr, &rxml_attr_type, xattr);
198
205
  return INT2NUM(xattr->type);
199
206
  }
200
207
 
@@ -207,7 +214,7 @@ static VALUE rxml_attr_node_type(VALUE self)
207
214
  static VALUE rxml_attr_ns_get(VALUE self)
208
215
  {
209
216
  xmlAttrPtr xattr;
210
- Data_Get_Struct(self, xmlAttr, xattr);
217
+ TypedData_Get_Struct(self, xmlAttr, &rxml_attr_type, xattr);
211
218
  if (xattr->ns == NULL)
212
219
  return Qnil;
213
220
  else
@@ -223,7 +230,7 @@ static VALUE rxml_attr_ns_get(VALUE self)
223
230
  static VALUE rxml_attr_parent_get(VALUE self)
224
231
  {
225
232
  xmlAttrPtr xattr;
226
- Data_Get_Struct(self, xmlAttr, xattr);
233
+ TypedData_Get_Struct(self, xmlAttr, &rxml_attr_type, xattr);
227
234
  if (xattr->parent == NULL)
228
235
  return Qnil;
229
236
  else
@@ -239,7 +246,7 @@ static VALUE rxml_attr_parent_get(VALUE self)
239
246
  static VALUE rxml_attr_prev_get(VALUE self)
240
247
  {
241
248
  xmlAttrPtr xattr;
242
- Data_Get_Struct(self, xmlAttr, xattr);
249
+ TypedData_Get_Struct(self, xmlAttr, &rxml_attr_type, xattr);
243
250
  if (xattr->prev == NULL)
244
251
  return Qnil;
245
252
  else
@@ -258,12 +265,10 @@ static VALUE rxml_attr_prev_get(VALUE self)
258
265
  static VALUE rxml_attr_remove_ex(VALUE self)
259
266
  {
260
267
  xmlAttrPtr xattr;
261
- Data_Get_Struct(self, xmlAttr, xattr);
268
+ TypedData_Get_Struct(self, xmlAttr, &rxml_attr_type, xattr);
262
269
  xmlRemoveProp(xattr);
263
270
 
264
- RDATA(self)->data = NULL;
265
- RDATA(self)->dfree = NULL;
266
- RDATA(self)->dmark = NULL;
271
+ RTYPEDDATA_DATA(self) = NULL;
267
272
 
268
273
  return Qnil;
269
274
  }
@@ -280,7 +285,7 @@ VALUE rxml_attr_value_get(VALUE self)
280
285
  xmlChar *value;
281
286
  VALUE result = Qnil;
282
287
 
283
- Data_Get_Struct(self, xmlAttr, xattr);
288
+ TypedData_Get_Struct(self, xmlAttr, &rxml_attr_type, xattr);
284
289
  value = xmlNodeGetContent((xmlNodePtr)xattr);
285
290
 
286
291
  if (value != NULL)
@@ -302,7 +307,7 @@ VALUE rxml_attr_value_set(VALUE self, VALUE val)
302
307
  xmlAttrPtr xattr;
303
308
 
304
309
  Check_Type(val, T_STRING);
305
- Data_Get_Struct(self, xmlAttr, xattr);
310
+ TypedData_Get_Struct(self, xmlAttr, &rxml_attr_type, xattr);
306
311
 
307
312
  if (xattr->ns)
308
313
  xmlSetNsProp(xattr->parent, xattr->ns, xattr->name,
@@ -4,6 +4,7 @@
4
4
  #define __RXML_ATTR__
5
5
 
6
6
  extern VALUE cXMLAttr;
7
+ extern const rb_data_type_t rxml_attr_type;
7
8
 
8
9
  void rxml_init_attr(void);
9
10
  VALUE rxml_attr_wrap(xmlAttrPtr xattr);
@@ -13,14 +13,21 @@
13
13
 
14
14
  VALUE cXMLAttrDecl;
15
15
 
16
- void rxml_attr_decl_mark(xmlAttributePtr xattr)
16
+ static void rxml_attr_decl_mark(void *data)
17
17
  {
18
- rxml_node_mark((xmlNodePtr) xattr);
18
+ xmlAttributePtr xattr = (xmlAttributePtr)data;
19
+ rxml_node_mark((xmlNodePtr)xattr);
19
20
  }
20
21
 
22
+ static const rb_data_type_t rxml_attr_decl_type = {
23
+ "LibXML::XML::AttrDecl",
24
+ {rxml_attr_decl_mark, NULL, 0},
25
+ &rxml_attr_type, 0, RUBY_TYPED_FREE_IMMEDIATELY
26
+ };
27
+
21
28
  VALUE rxml_attr_decl_wrap(xmlAttributePtr xattr)
22
29
  {
23
- return Data_Wrap_Struct(cXMLAttrDecl, rxml_attr_decl_mark, NULL, xattr);
30
+ return TypedData_Wrap_Struct(cXMLAttrDecl, &rxml_attr_decl_type, xattr);
24
31
  }
25
32
 
26
33
  /*
@@ -32,11 +39,11 @@ VALUE rxml_attr_decl_wrap(xmlAttributePtr xattr)
32
39
  static VALUE rxml_attr_decl_doc_get(VALUE self)
33
40
  {
34
41
  xmlAttributePtr xattr;
35
- Data_Get_Struct(self, xmlAttribute, xattr);
42
+ TypedData_Get_Struct(self, xmlAttribute, &rxml_attr_decl_type, xattr);
36
43
  if (xattr->doc == NULL)
37
44
  return Qnil;
38
45
  else
39
- return rxml_document_wrap(xattr->doc);
46
+ return rxml_registry_lookup(xattr->doc);
40
47
  }
41
48
 
42
49
 
@@ -49,7 +56,7 @@ static VALUE rxml_attr_decl_doc_get(VALUE self)
49
56
  static VALUE rxml_attr_decl_name_get(VALUE self)
50
57
  {
51
58
  xmlAttributePtr xattr;
52
- Data_Get_Struct(self, xmlAttribute, xattr);
59
+ TypedData_Get_Struct(self, xmlAttribute, &rxml_attr_decl_type, xattr);
53
60
 
54
61
  if (xattr->name == NULL)
55
62
  return Qnil;
@@ -66,7 +73,7 @@ static VALUE rxml_attr_decl_name_get(VALUE self)
66
73
  static VALUE rxml_attr_decl_next_get(VALUE self)
67
74
  {
68
75
  xmlAttributePtr xattr;
69
- Data_Get_Struct(self, xmlAttribute, xattr);
76
+ TypedData_Get_Struct(self, xmlAttribute, &rxml_attr_decl_type, xattr);
70
77
  if (xattr->next == NULL)
71
78
  return Qnil;
72
79
  else
@@ -81,8 +88,8 @@ static VALUE rxml_attr_decl_next_get(VALUE self)
81
88
  */
82
89
  static VALUE rxml_attr_decl_node_type(VALUE self)
83
90
  {
84
- xmlAttrPtr xattr;
85
- Data_Get_Struct(self, xmlAttr, xattr);
91
+ xmlAttributePtr xattr;
92
+ TypedData_Get_Struct(self, xmlAttribute, &rxml_attr_decl_type, xattr);
86
93
  return INT2NUM(xattr->type);
87
94
  }
88
95
 
@@ -96,7 +103,7 @@ static VALUE rxml_attr_decl_node_type(VALUE self)
96
103
  static VALUE rxml_attr_decl_parent_get(VALUE self)
97
104
  {
98
105
  xmlAttributePtr xattr;
99
- Data_Get_Struct(self, xmlAttribute, xattr);
106
+ TypedData_Get_Struct(self, xmlAttribute, &rxml_attr_decl_type, xattr);
100
107
 
101
108
  if (xattr->parent == NULL)
102
109
  return Qnil;
@@ -114,7 +121,7 @@ static VALUE rxml_attr_decl_parent_get(VALUE self)
114
121
  static VALUE rxml_attr_decl_prev_get(VALUE self)
115
122
  {
116
123
  xmlAttributePtr xattr;
117
- Data_Get_Struct(self, xmlAttribute, xattr);
124
+ TypedData_Get_Struct(self, xmlAttribute, &rxml_attr_decl_type, xattr);
118
125
 
119
126
  if (xattr->prev == NULL)
120
127
  return Qnil;
@@ -132,7 +139,7 @@ VALUE rxml_attr_decl_value_get(VALUE self)
132
139
  {
133
140
  xmlAttributePtr xattr;
134
141
 
135
- Data_Get_Struct(self, xmlAttribute, xattr);
142
+ TypedData_Get_Struct(self, xmlAttribute, &rxml_attr_decl_type, xattr);
136
143
 
137
144
  if (xattr->defaultValue)
138
145
  return rxml_new_cstr(xattr->defaultValue, NULL);
@@ -32,17 +32,26 @@
32
32
 
33
33
  VALUE cXMLAttributes;
34
34
 
35
- void rxml_attributes_mark(xmlNodePtr xnode)
35
+ void rxml_attributes_mark(void *data)
36
36
  {
37
- rxml_node_mark(xnode);
37
+ rxml_node_mark((xmlNodePtr)data);
38
38
  }
39
39
 
40
+ static const rb_data_type_t rxml_attributes_data_type = {
41
+ .wrap_struct_name = "LibXML::XML::Attributes",
42
+ .function = {
43
+ .dmark = rxml_attributes_mark,
44
+ .dfree = NULL,
45
+ },
46
+ .flags = RUBY_TYPED_FREE_IMMEDIATELY,
47
+ };
48
+
40
49
  /*
41
50
  * Creates a new attributes instance. Not exposed to ruby.
42
51
  */
43
52
  VALUE rxml_attributes_new(xmlNodePtr xnode)
44
53
  {
45
- return Data_Wrap_Struct(cXMLAttributes, rxml_attributes_mark, NULL, xnode);
54
+ return TypedData_Wrap_Struct(cXMLAttributes, &rxml_attributes_data_type, xnode);
46
55
  }
47
56
 
48
57
  /*
@@ -56,7 +65,7 @@ VALUE rxml_attributes_new(xmlNodePtr xnode)
56
65
  VALUE rxml_attributes_node_get(VALUE self)
57
66
  {
58
67
  xmlNodePtr xnode;
59
- Data_Get_Struct(self, xmlNode, xnode);
68
+ TypedData_Get_Struct(self, xmlNode, &rxml_attributes_data_type, xnode);
60
69
  return rxml_node_wrap(xnode);
61
70
  }
62
71
 
@@ -80,7 +89,7 @@ static VALUE rxml_attributes_get_attribute(VALUE self, VALUE name)
80
89
 
81
90
  name = rb_obj_as_string(name);
82
91
 
83
- Data_Get_Struct(self, xmlNode, xnode);
92
+ TypedData_Get_Struct(self, xmlNode, &rxml_attributes_data_type, xnode);
84
93
 
85
94
  xattr = xmlHasProp(xnode, (xmlChar*) StringValuePtr(name));
86
95
 
@@ -114,7 +123,7 @@ static VALUE rxml_attributes_get_attribute_ns(VALUE self, VALUE namespace,
114
123
 
115
124
  name = rb_obj_as_string(name);
116
125
 
117
- Data_Get_Struct(self, xmlNode, xnode);
126
+ TypedData_Get_Struct(self, xmlNode, &rxml_attributes_data_type, xnode);
118
127
 
119
128
  xattr = xmlHasNsProp(xnode, (xmlChar*) StringValuePtr(name),
120
129
  (xmlChar*) StringValuePtr(namespace));
@@ -191,7 +200,7 @@ static VALUE rxml_attributes_each(VALUE self)
191
200
  {
192
201
  xmlNodePtr xnode;
193
202
  xmlAttrPtr xattr;
194
- Data_Get_Struct(self, xmlNode, xnode);
203
+ TypedData_Get_Struct(self, xmlNode, &rxml_attributes_data_type, xnode);
195
204
 
196
205
  xattr = xnode->properties;
197
206
 
@@ -222,7 +231,7 @@ static VALUE rxml_attributes_length(VALUE self)
222
231
  int length = 0;
223
232
  xmlNodePtr xnode;
224
233
  xmlAttrPtr xattr;
225
- Data_Get_Struct(self, xmlNode, xnode);
234
+ TypedData_Get_Struct(self, xmlNode, &rxml_attributes_data_type, xnode);
226
235
 
227
236
  xattr = xnode->properties;
228
237
 
@@ -246,7 +255,7 @@ static VALUE rxml_attributes_length(VALUE self)
246
255
  static VALUE rxml_attributes_first(VALUE self)
247
256
  {
248
257
  xmlNodePtr xnode;
249
- Data_Get_Struct(self, xmlNode, xnode);
258
+ TypedData_Get_Struct(self, xmlNode, &rxml_attributes_data_type, xnode);
250
259
 
251
260
  if (xnode->type == XML_ELEMENT_NODE)
252
261
  {