nokogiri 1.14.2 → 1.16.6

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.

Potentially problematic release.


This version of nokogiri might be problematic. Click here for more details.

Files changed (85) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +19 -15
  3. data/README.md +4 -1
  4. data/dependencies.yml +9 -8
  5. data/ext/nokogiri/extconf.rb +69 -26
  6. data/ext/nokogiri/html4_document.c +1 -2
  7. data/ext/nokogiri/html4_element_description.c +19 -14
  8. data/ext/nokogiri/html4_sax_parser_context.c +10 -16
  9. data/ext/nokogiri/html4_sax_push_parser.c +3 -3
  10. data/ext/nokogiri/nokogiri.c +46 -24
  11. data/ext/nokogiri/nokogiri.h +23 -5
  12. data/ext/nokogiri/test_global_handlers.c +1 -1
  13. data/ext/nokogiri/xml_attr.c +1 -1
  14. data/ext/nokogiri/xml_cdata.c +30 -17
  15. data/ext/nokogiri/xml_comment.c +1 -1
  16. data/ext/nokogiri/xml_document.c +113 -25
  17. data/ext/nokogiri/xml_document_fragment.c +1 -1
  18. data/ext/nokogiri/xml_dtd.c +1 -1
  19. data/ext/nokogiri/xml_element_content.c +32 -29
  20. data/ext/nokogiri/xml_element_decl.c +5 -5
  21. data/ext/nokogiri/xml_encoding_handler.c +12 -4
  22. data/ext/nokogiri/xml_entity_reference.c +1 -1
  23. data/ext/nokogiri/xml_namespace.c +11 -16
  24. data/ext/nokogiri/xml_node.c +13 -16
  25. data/ext/nokogiri/xml_node_set.c +125 -105
  26. data/ext/nokogiri/xml_processing_instruction.c +1 -1
  27. data/ext/nokogiri/xml_reader.c +61 -74
  28. data/ext/nokogiri/xml_relax_ng.c +66 -79
  29. data/ext/nokogiri/xml_sax_parser.c +24 -5
  30. data/ext/nokogiri/xml_sax_parser_context.c +50 -25
  31. data/ext/nokogiri/xml_sax_push_parser.c +30 -9
  32. data/ext/nokogiri/xml_schema.c +94 -115
  33. data/ext/nokogiri/xml_syntax_error.c +3 -3
  34. data/ext/nokogiri/xml_text.c +26 -13
  35. data/ext/nokogiri/xml_xpath_context.c +153 -83
  36. data/ext/nokogiri/xslt_stylesheet.c +111 -53
  37. data/gumbo-parser/Makefile +18 -0
  38. data/gumbo-parser/src/error.c +8 -4
  39. data/gumbo-parser/src/foreign_attrs.c +13 -14
  40. data/gumbo-parser/src/foreign_attrs.gperf +1 -1
  41. data/gumbo-parser/src/parser.c +21 -5
  42. data/gumbo-parser/src/tokenizer.c +1 -0
  43. data/lib/nokogiri/css/parser_extras.rb +1 -1
  44. data/lib/nokogiri/css/xpath_visitor.rb +3 -23
  45. data/lib/nokogiri/extension.rb +1 -1
  46. data/lib/nokogiri/html4/document.rb +1 -1
  47. data/lib/nokogiri/html4/document_fragment.rb +1 -1
  48. data/lib/nokogiri/html4/element_description_defaults.rb +1821 -353
  49. data/lib/nokogiri/html4/encoding_reader.rb +1 -1
  50. data/lib/nokogiri/html5/document_fragment.rb +1 -1
  51. data/lib/nokogiri/html5/node.rb +5 -0
  52. data/lib/nokogiri/html5.rb +0 -63
  53. data/lib/nokogiri/jruby/nokogiri_jars.rb +9 -9
  54. data/lib/nokogiri/version/constant.rb +1 -1
  55. data/lib/nokogiri/version/info.rb +6 -5
  56. data/lib/nokogiri/xml/attr.rb +2 -2
  57. data/lib/nokogiri/xml/attribute_decl.rb +4 -2
  58. data/lib/nokogiri/xml/document.rb +4 -5
  59. data/lib/nokogiri/xml/document_fragment.rb +3 -3
  60. data/lib/nokogiri/xml/element_content.rb +10 -2
  61. data/lib/nokogiri/xml/element_decl.rb +4 -2
  62. data/lib/nokogiri/xml/entity_decl.rb +4 -2
  63. data/lib/nokogiri/xml/namespace.rb +1 -2
  64. data/lib/nokogiri/xml/node/save_options.rb +8 -0
  65. data/lib/nokogiri/xml/node.rb +53 -37
  66. data/lib/nokogiri/xml/node_set.rb +3 -3
  67. data/lib/nokogiri/xml/pp/node.rb +23 -12
  68. data/lib/nokogiri/xml/reader.rb +10 -9
  69. data/lib/nokogiri/xml/sax/document.rb +1 -1
  70. data/lib/nokogiri/xml/searchable.rb +21 -13
  71. data/lib/nokogiri/xml/syntax_error.rb +1 -1
  72. data/lib/nokogiri/xml.rb +1 -1
  73. data/lib/nokogiri/xslt/stylesheet.rb +29 -7
  74. data/lib/nokogiri/xslt.rb +74 -4
  75. data/lib/nokogiri.rb +13 -5
  76. data/lib/xsd/xmlparser/nokogiri.rb +1 -1
  77. data/patches/libxml2/0010-update-config.guess-and-config.sub-for-libxml2.patch +224 -0
  78. data/patches/libxml2/0011-rip-out-libxml2-s-libc_single_threaded-support.patch +30 -0
  79. data/patches/libxslt/0001-update-config.guess-and-config.sub-for-libxslt.patch +224 -0
  80. data/ports/archives/libxml2-2.12.8.tar.xz +0 -0
  81. data/ports/archives/libxslt-1.1.39.tar.xz +0 -0
  82. metadata +16 -12
  83. data/patches/libxslt/0001-update-automake-files-for-arm64.patch +0 -3037
  84. data/ports/archives/libxml2-2.10.3.tar.xz +0 -0
  85. data/ports/archives/libxslt-1.1.37.tar.xz +0 -0
@@ -20,7 +20,7 @@ new (int argc, VALUE *argv, VALUE klass)
20
20
 
21
21
  rb_scan_args(argc, argv, "2*", &document, &name, &rest);
22
22
 
23
- Data_Get_Struct(document, xmlDoc, xml_doc);
23
+ xml_doc = noko_xml_document_unwrap(document);
24
24
 
25
25
  node = xmlNewReference(
26
26
  xml_doc,
@@ -42,7 +42,6 @@ _xml_namespace_dealloc(void *ptr)
42
42
  xmlFree(ns);
43
43
  }
44
44
 
45
- #ifdef HAVE_RB_GC_LOCATION
46
45
  static void
47
46
  _xml_namespace_update_references(void *ptr)
48
47
  {
@@ -51,26 +50,22 @@ _xml_namespace_update_references(void *ptr)
51
50
  ns->_private = (void *)rb_gc_location((VALUE)ns->_private);
52
51
  }
53
52
  }
54
- #else
55
- # define _xml_namespace_update_references 0
56
- #endif
57
53
 
58
54
  static const rb_data_type_t nokogiri_xml_namespace_type_with_dealloc = {
59
- "Nokogiri/XMLNamespace/WithDealloc",
60
- {0, _xml_namespace_dealloc, 0, _xml_namespace_update_references},
61
- 0, 0,
62
- #ifdef RUBY_TYPED_FREE_IMMEDIATELY
63
- RUBY_TYPED_FREE_IMMEDIATELY,
64
- #endif
55
+ .wrap_struct_name = "Nokogiri::XML::Namespace#with_dealloc",
56
+ .function = {
57
+ .dfree = _xml_namespace_dealloc,
58
+ .dcompact = _xml_namespace_update_references,
59
+ },
60
+ .flags = RUBY_TYPED_FREE_IMMEDIATELY | RUBY_TYPED_WB_PROTECTED,
65
61
  };
66
62
 
67
63
  static const rb_data_type_t nokogiri_xml_namespace_type_without_dealloc = {
68
- "Nokogiri/XMLNamespace/WithoutDealloc",
69
- {0, 0, 0, _xml_namespace_update_references},
70
- 0, 0,
71
- #ifdef RUBY_TYPED_FREE_IMMEDIATELY
72
- RUBY_TYPED_FREE_IMMEDIATELY,
73
- #endif
64
+ .wrap_struct_name = "Nokogiri::XML::Namespace#without_dealloc",
65
+ .function = {
66
+ .dcompact = _xml_namespace_update_references,
67
+ },
68
+ .flags = RUBY_TYPED_FREE_IMMEDIATELY | RUBY_TYPED_WB_PROTECTED,
74
69
  };
75
70
 
76
71
  /*
@@ -28,7 +28,6 @@ _xml_node_mark(void *ptr)
28
28
  }
29
29
  }
30
30
 
31
- #ifdef HAVE_RB_GC_LOCATION
32
31
  static void
33
32
  _xml_node_update_references(void *ptr)
34
33
  {
@@ -38,17 +37,14 @@ _xml_node_update_references(void *ptr)
38
37
  node->_private = (void *)rb_gc_location((VALUE)node->_private);
39
38
  }
40
39
  }
41
- #else
42
- # define _xml_node_update_references 0
43
- #endif
44
40
 
45
41
  static const rb_data_type_t nokogiri_node_type = {
46
- "Nokogiri/XMLNode",
47
- {_xml_node_mark, 0, 0, _xml_node_update_references},
48
- 0, 0,
49
- #ifdef RUBY_TYPED_FREE_IMMEDIATELY
50
- RUBY_TYPED_FREE_IMMEDIATELY,
51
- #endif
42
+ .wrap_struct_name = "Nokogiri::XML::Node",
43
+ .function = {
44
+ .dmark = _xml_node_mark,
45
+ .dcompact = _xml_node_update_references,
46
+ },
47
+ .flags = RUBY_TYPED_FREE_IMMEDIATELY,
52
48
  };
53
49
 
54
50
  static void
@@ -350,7 +346,7 @@ ok:
350
346
 
351
347
  xmlUnlinkNode(original_reparentee);
352
348
 
353
- if (prf != xmlAddPrevSibling && prf != xmlAddNextSibling
349
+ if (prf != xmlAddPrevSibling && prf != xmlAddNextSibling && prf != xmlAddChild
354
350
  && reparentee->type == XML_TEXT_NODE && pivot->next && pivot->next->type == XML_TEXT_NODE) {
355
351
  /*
356
352
  * libxml merges text nodes in a right-to-left fashion, meaning that if
@@ -961,7 +957,7 @@ internal_subset(VALUE self)
961
957
  * - +new_parent_doc+
962
958
  * The new node's parent Document. Defaults to the this node's document.
963
959
  *
964
- * [Returns] The new Nokgiri::XML::Node
960
+ * [Returns] The new Nokogiri::XML::Node
965
961
  */
966
962
  static VALUE
967
963
  duplicate_node(int argc, VALUE *argv, VALUE self)
@@ -984,7 +980,7 @@ duplicate_node(int argc, VALUE *argv, VALUE self)
984
980
  if (n_args < 2) {
985
981
  new_parent_doc = node->doc;
986
982
  } else {
987
- Data_Get_Struct(r_new_parent_doc, xmlDoc, new_parent_doc);
983
+ new_parent_doc = noko_xml_document_unwrap(r_new_parent_doc);
988
984
  }
989
985
 
990
986
  dup = xmlDocCopyNode(node, new_parent_doc, level);
@@ -2058,8 +2054,7 @@ rb_xml_node_new(int argc, VALUE *argv, VALUE klass)
2058
2054
  rb_raise(rb_eArgError, "document must be a Nokogiri::XML::Node");
2059
2055
  }
2060
2056
  if (!rb_obj_is_kind_of(rb_document_node, cNokogiriXmlDocument)) {
2061
- // TODO: deprecate allowing Node
2062
- NOKO_WARN_DEPRECATION("Passing a Node as the second parameter to Node.new is deprecated. Please pass a Document instead, or prefer an alternative constructor like Node#add_child. This will become an error in a future release of Nokogiri.");
2057
+ NOKO_WARN_DEPRECATION("Passing a Node as the second parameter to Node.new is deprecated. Please pass a Document instead, or prefer an alternative constructor like Node#add_child. This will become an error in Nokogiri v1.17.0."); // TODO: deprecated in v1.13.0, remove in v1.17.0
2063
2058
  }
2064
2059
  Noko_Node_Get_Struct(rb_document_node, xmlNode, c_document_node);
2065
2060
 
@@ -2138,7 +2133,7 @@ process_xincludes(VALUE self, VALUE options)
2138
2133
  xmlSetStructuredErrorFunc(NULL, NULL);
2139
2134
 
2140
2135
  if (rcode < 0) {
2141
- xmlErrorPtr error;
2136
+ xmlErrorConstPtr error;
2142
2137
 
2143
2138
  error = xmlGetLastError();
2144
2139
  if (error) {
@@ -2174,6 +2169,8 @@ in_context(VALUE self, VALUE _str, VALUE _options)
2174
2169
 
2175
2170
  /* Twiddle global variable because of a bug in libxml2.
2176
2171
  * http://git.gnome.org/browse/libxml2/commit/?id=e20fb5a72c83cbfc8e4a8aa3943c6be8febadab7
2172
+ *
2173
+ * TODO: this is fixed, and HTML_PARSE_NOIMPLIED is defined, in libxml2 2.7.7
2177
2174
  */
2178
2175
  #ifndef HTML_PARSE_NOIMPLIED
2179
2176
  htmlHandleOmittedElem(0);
@@ -39,8 +39,9 @@ ruby_object_get(xmlNodePtr c_node)
39
39
 
40
40
 
41
41
  static void
42
- mark(xmlNodeSetPtr node_set)
42
+ xml_node_set_mark(void *data)
43
43
  {
44
+ xmlNodeSetPtr node_set = data;
44
45
  VALUE rb_node;
45
46
  int jnode;
46
47
 
@@ -52,6 +53,37 @@ mark(xmlNodeSetPtr node_set)
52
53
  }
53
54
  }
54
55
 
56
+ static void
57
+ xml_node_set_deallocate(void *data)
58
+ {
59
+ xmlNodeSetPtr node_set = data;
60
+ /*
61
+ * For reasons outlined in xml_namespace.c, here we reproduce xmlXPathFreeNodeSet() except for the
62
+ * offending call to xmlXPathNodeSetFreeNs().
63
+ */
64
+ if (node_set->nodeTab != NULL) {
65
+ xmlFree(node_set->nodeTab);
66
+ }
67
+
68
+ xmlFree(node_set);
69
+ }
70
+
71
+
72
+ static VALUE
73
+ xml_node_set_allocate(VALUE klass)
74
+ {
75
+ return noko_xml_node_set_wrap(xmlXPathNodeSetCreate(NULL), Qnil);
76
+ }
77
+
78
+ static const rb_data_type_t xml_node_set_type = {
79
+ .wrap_struct_name = "Nokogiri::XML::NodeSet",
80
+ .function = {
81
+ .dmark = xml_node_set_mark,
82
+ .dfree = xml_node_set_deallocate,
83
+ },
84
+ .flags = RUBY_TYPED_FREE_IMMEDIATELY,
85
+ };
86
+
55
87
  static void
56
88
  xpath_node_set_del(xmlNodeSetPtr cur, xmlNodePtr val)
57
89
  {
@@ -81,28 +113,6 @@ xpath_node_set_del(xmlNodeSetPtr cur, xmlNodePtr val)
81
113
  }
82
114
 
83
115
 
84
- static void
85
- deallocate(xmlNodeSetPtr node_set)
86
- {
87
- /*
88
- * For reasons outlined in xml_namespace.c, here we reproduce xmlXPathFreeNodeSet() except for the
89
- * offending call to xmlXPathNodeSetFreeNs().
90
- */
91
- if (node_set->nodeTab != NULL) {
92
- xmlFree(node_set->nodeTab);
93
- }
94
-
95
- xmlFree(node_set);
96
- }
97
-
98
-
99
- static VALUE
100
- allocate(VALUE klass)
101
- {
102
- return noko_xml_node_set_wrap(xmlXPathNodeSetCreate(NULL), Qnil);
103
- }
104
-
105
-
106
116
  /*
107
117
  * call-seq:
108
118
  * dup
@@ -111,16 +121,16 @@ allocate(VALUE klass)
111
121
  * duplicated (similar to how Array and other Enumerable classes work).
112
122
  */
113
123
  static VALUE
114
- duplicate(VALUE self)
124
+ duplicate(VALUE rb_self)
115
125
  {
116
- xmlNodeSetPtr node_set;
126
+ xmlNodeSetPtr c_self;
117
127
  xmlNodeSetPtr dupl;
118
128
 
119
- Data_Get_Struct(self, xmlNodeSet, node_set);
129
+ TypedData_Get_Struct(rb_self, xmlNodeSet, &xml_node_set_type, c_self);
120
130
 
121
- dupl = xmlXPathNodeSetMerge(NULL, node_set);
131
+ dupl = xmlXPathNodeSetMerge(NULL, c_self);
122
132
 
123
- return noko_xml_node_set_wrap(dupl, rb_iv_get(self, "@document"));
133
+ return noko_xml_node_set_wrap(dupl, rb_iv_get(rb_self, "@document"));
124
134
  }
125
135
 
126
136
  /*
@@ -130,13 +140,13 @@ duplicate(VALUE self)
130
140
  * Get the length of the node set
131
141
  */
132
142
  static VALUE
133
- length(VALUE self)
143
+ length(VALUE rb_self)
134
144
  {
135
- xmlNodeSetPtr node_set;
145
+ xmlNodeSetPtr c_self;
136
146
 
137
- Data_Get_Struct(self, xmlNodeSet, node_set);
147
+ TypedData_Get_Struct(rb_self, xmlNodeSet, &xml_node_set_type, c_self);
138
148
 
139
- return node_set ? INT2NUM(node_set->nodeNr) : INT2NUM(0);
149
+ return c_self ? INT2NUM(c_self->nodeNr) : INT2NUM(0);
140
150
  }
141
151
 
142
152
  /*
@@ -146,19 +156,19 @@ length(VALUE self)
146
156
  * Append +node+ to the NodeSet.
147
157
  */
148
158
  static VALUE
149
- push(VALUE self, VALUE rb_node)
159
+ push(VALUE rb_self, VALUE rb_node)
150
160
  {
151
- xmlNodeSetPtr node_set;
161
+ xmlNodeSetPtr c_self;
152
162
  xmlNodePtr node;
153
163
 
154
164
  Check_Node_Set_Node_Type(rb_node);
155
165
 
156
- Data_Get_Struct(self, xmlNodeSet, node_set);
166
+ TypedData_Get_Struct(rb_self, xmlNodeSet, &xml_node_set_type, c_self);
157
167
  Noko_Node_Get_Struct(rb_node, xmlNode, node);
158
168
 
159
- xmlXPathNodeSetAdd(node_set, node);
169
+ xmlXPathNodeSetAdd(c_self, node);
160
170
 
161
- return self;
171
+ return rb_self;
162
172
  }
163
173
 
164
174
  /*
@@ -169,18 +179,18 @@ push(VALUE self, VALUE rb_node)
169
179
  * if found, otherwise returns nil.
170
180
  */
171
181
  static VALUE
172
- delete (VALUE self, VALUE rb_node)
182
+ delete (VALUE rb_self, VALUE rb_node)
173
183
  {
174
- xmlNodeSetPtr node_set;
184
+ xmlNodeSetPtr c_self;
175
185
  xmlNodePtr node;
176
186
 
177
187
  Check_Node_Set_Node_Type(rb_node);
178
188
 
179
- Data_Get_Struct(self, xmlNodeSet, node_set);
189
+ TypedData_Get_Struct(rb_self, xmlNodeSet, &xml_node_set_type, c_self);
180
190
  Noko_Node_Get_Struct(rb_node, xmlNode, node);
181
191
 
182
- if (xmlXPathNodeSetContains(node_set, node)) {
183
- xpath_node_set_del(node_set, node);
192
+ if (xmlXPathNodeSetContains(c_self, node)) {
193
+ xpath_node_set_del(c_self, node);
184
194
  return rb_node;
185
195
  }
186
196
  return Qnil ;
@@ -194,20 +204,20 @@ delete (VALUE self, VALUE rb_node)
194
204
  * Set Intersection — Returns a new NodeSet containing nodes common to the two NodeSets.
195
205
  */
196
206
  static VALUE
197
- intersection(VALUE self, VALUE rb_other)
207
+ intersection(VALUE rb_self, VALUE rb_other)
198
208
  {
199
- xmlNodeSetPtr node_set, other ;
209
+ xmlNodeSetPtr c_self, c_other ;
200
210
  xmlNodeSetPtr intersection;
201
211
 
202
212
  if (!rb_obj_is_kind_of(rb_other, cNokogiriXmlNodeSet)) {
203
213
  rb_raise(rb_eArgError, "node_set must be a Nokogiri::XML::NodeSet");
204
214
  }
205
215
 
206
- Data_Get_Struct(self, xmlNodeSet, node_set);
207
- Data_Get_Struct(rb_other, xmlNodeSet, other);
216
+ TypedData_Get_Struct(rb_self, xmlNodeSet, &xml_node_set_type, c_self);
217
+ TypedData_Get_Struct(rb_other, xmlNodeSet, &xml_node_set_type, c_other);
208
218
 
209
- intersection = xmlXPathIntersection(node_set, other);
210
- return noko_xml_node_set_wrap(intersection, rb_iv_get(self, "@document"));
219
+ intersection = xmlXPathIntersection(c_self, c_other);
220
+ return noko_xml_node_set_wrap(intersection, rb_iv_get(rb_self, "@document"));
211
221
  }
212
222
 
213
223
 
@@ -218,17 +228,17 @@ intersection(VALUE self, VALUE rb_other)
218
228
  * Returns true if any member of node set equals +node+.
219
229
  */
220
230
  static VALUE
221
- include_eh(VALUE self, VALUE rb_node)
231
+ include_eh(VALUE rb_self, VALUE rb_node)
222
232
  {
223
- xmlNodeSetPtr node_set;
233
+ xmlNodeSetPtr c_self;
224
234
  xmlNodePtr node;
225
235
 
226
236
  Check_Node_Set_Node_Type(rb_node);
227
237
 
228
- Data_Get_Struct(self, xmlNodeSet, node_set);
238
+ TypedData_Get_Struct(rb_self, xmlNodeSet, &xml_node_set_type, c_self);
229
239
  Noko_Node_Get_Struct(rb_node, xmlNode, node);
230
240
 
231
- return (xmlXPathNodeSetContains(node_set, node) ? Qtrue : Qfalse);
241
+ return (xmlXPathNodeSetContains(c_self, node) ? Qtrue : Qfalse);
232
242
  }
233
243
 
234
244
 
@@ -240,22 +250,22 @@ include_eh(VALUE self, VALUE rb_node)
240
250
  * set.
241
251
  */
242
252
  static VALUE
243
- rb_xml_node_set_union(VALUE rb_node_set, VALUE rb_other)
253
+ rb_xml_node_set_union(VALUE rb_self, VALUE rb_other)
244
254
  {
245
- xmlNodeSetPtr c_node_set, c_other;
255
+ xmlNodeSetPtr c_self, c_other;
246
256
  xmlNodeSetPtr c_new_node_set;
247
257
 
248
258
  if (!rb_obj_is_kind_of(rb_other, cNokogiriXmlNodeSet)) {
249
259
  rb_raise(rb_eArgError, "node_set must be a Nokogiri::XML::NodeSet");
250
260
  }
251
261
 
252
- Data_Get_Struct(rb_node_set, xmlNodeSet, c_node_set);
253
- Data_Get_Struct(rb_other, xmlNodeSet, c_other);
262
+ TypedData_Get_Struct(rb_self, xmlNodeSet, &xml_node_set_type, c_self);
263
+ TypedData_Get_Struct(rb_other, xmlNodeSet, &xml_node_set_type, c_other);
254
264
 
255
- c_new_node_set = xmlXPathNodeSetMerge(NULL, c_node_set);
265
+ c_new_node_set = xmlXPathNodeSetMerge(NULL, c_self);
256
266
  c_new_node_set = xmlXPathNodeSetMerge(c_new_node_set, c_other);
257
267
 
258
- return noko_xml_node_set_wrap(c_new_node_set, rb_iv_get(rb_node_set, "@document"));
268
+ return noko_xml_node_set_wrap(c_new_node_set, rb_iv_get(rb_self, "@document"));
259
269
  }
260
270
 
261
271
  /*
@@ -266,9 +276,9 @@ rb_xml_node_set_union(VALUE rb_node_set, VALUE rb_other)
266
276
  * each item that also appears in +node_set+
267
277
  */
268
278
  static VALUE
269
- minus(VALUE self, VALUE rb_other)
279
+ minus(VALUE rb_self, VALUE rb_other)
270
280
  {
271
- xmlNodeSetPtr node_set, other;
281
+ xmlNodeSetPtr c_self, c_other;
272
282
  xmlNodeSetPtr new;
273
283
  int j ;
274
284
 
@@ -276,55 +286,55 @@ minus(VALUE self, VALUE rb_other)
276
286
  rb_raise(rb_eArgError, "node_set must be a Nokogiri::XML::NodeSet");
277
287
  }
278
288
 
279
- Data_Get_Struct(self, xmlNodeSet, node_set);
280
- Data_Get_Struct(rb_other, xmlNodeSet, other);
289
+ TypedData_Get_Struct(rb_self, xmlNodeSet, &xml_node_set_type, c_self);
290
+ TypedData_Get_Struct(rb_other, xmlNodeSet, &xml_node_set_type, c_other);
281
291
 
282
- new = xmlXPathNodeSetMerge(NULL, node_set);
283
- for (j = 0 ; j < other->nodeNr ; ++j) {
284
- xpath_node_set_del(new, other->nodeTab[j]);
292
+ new = xmlXPathNodeSetMerge(NULL, c_self);
293
+ for (j = 0 ; j < c_other->nodeNr ; ++j) {
294
+ xpath_node_set_del(new, c_other->nodeTab[j]);
285
295
  }
286
296
 
287
- return noko_xml_node_set_wrap(new, rb_iv_get(self, "@document"));
297
+ return noko_xml_node_set_wrap(new, rb_iv_get(rb_self, "@document"));
288
298
  }
289
299
 
290
300
 
291
301
  static VALUE
292
- index_at(VALUE self, long offset)
302
+ index_at(VALUE rb_self, long offset)
293
303
  {
294
- xmlNodeSetPtr node_set;
304
+ xmlNodeSetPtr c_self;
295
305
 
296
- Data_Get_Struct(self, xmlNodeSet, node_set);
306
+ TypedData_Get_Struct(rb_self, xmlNodeSet, &xml_node_set_type, c_self);
297
307
 
298
- if (offset >= node_set->nodeNr || abs((int)offset) > node_set->nodeNr) {
308
+ if (offset >= c_self->nodeNr || abs((int)offset) > c_self->nodeNr) {
299
309
  return Qnil;
300
310
  }
301
311
 
302
- if (offset < 0) { offset += node_set->nodeNr ; }
312
+ if (offset < 0) { offset += c_self->nodeNr ; }
303
313
 
304
- return noko_xml_node_wrap_node_set_result(node_set->nodeTab[offset], self);
314
+ return noko_xml_node_wrap_node_set_result(c_self->nodeTab[offset], rb_self);
305
315
  }
306
316
 
307
317
  static VALUE
308
- subseq(VALUE self, long beg, long len)
318
+ subseq(VALUE rb_self, long beg, long len)
309
319
  {
310
320
  long j;
311
- xmlNodeSetPtr node_set;
321
+ xmlNodeSetPtr c_self;
312
322
  xmlNodeSetPtr new_set ;
313
323
 
314
- Data_Get_Struct(self, xmlNodeSet, node_set);
324
+ TypedData_Get_Struct(rb_self, xmlNodeSet, &xml_node_set_type, c_self);
315
325
 
316
- if (beg > node_set->nodeNr) { return Qnil ; }
326
+ if (beg > c_self->nodeNr) { return Qnil ; }
317
327
  if (beg < 0 || len < 0) { return Qnil ; }
318
328
 
319
- if ((beg + len) > node_set->nodeNr) {
320
- len = node_set->nodeNr - beg ;
329
+ if ((beg + len) > c_self->nodeNr) {
330
+ len = c_self->nodeNr - beg ;
321
331
  }
322
332
 
323
333
  new_set = xmlXPathNodeSetCreate(NULL);
324
334
  for (j = beg ; j < beg + len ; ++j) {
325
- xmlXPathNodeSetAddUnique(new_set, node_set->nodeTab[j]);
335
+ xmlXPathNodeSetAddUnique(new_set, c_self->nodeTab[j]);
326
336
  }
327
- return noko_xml_node_set_wrap(new_set, rb_iv_get(self, "@document"));
337
+ return noko_xml_node_set_wrap(new_set, rb_iv_get(rb_self, "@document"));
328
338
  }
329
339
 
330
340
  /*
@@ -343,21 +353,21 @@ subseq(VALUE self, long beg, long len)
343
353
  * nil if the +index+ (or +start+) are out of range.
344
354
  */
345
355
  static VALUE
346
- slice(int argc, VALUE *argv, VALUE self)
356
+ slice(int argc, VALUE *argv, VALUE rb_self)
347
357
  {
348
358
  VALUE arg ;
349
359
  long beg, len ;
350
- xmlNodeSetPtr node_set;
360
+ xmlNodeSetPtr c_self;
351
361
 
352
- Data_Get_Struct(self, xmlNodeSet, node_set);
362
+ TypedData_Get_Struct(rb_self, xmlNodeSet, &xml_node_set_type, c_self);
353
363
 
354
364
  if (argc == 2) {
355
365
  beg = NUM2LONG(argv[0]);
356
366
  len = NUM2LONG(argv[1]);
357
367
  if (beg < 0) {
358
- beg += node_set->nodeNr ;
368
+ beg += c_self->nodeNr ;
359
369
  }
360
- return subseq(self, beg, len);
370
+ return subseq(rb_self, beg, len);
361
371
  }
362
372
 
363
373
  if (argc != 1) {
@@ -366,20 +376,20 @@ slice(int argc, VALUE *argv, VALUE self)
366
376
  arg = argv[0];
367
377
 
368
378
  if (FIXNUM_P(arg)) {
369
- return index_at(self, FIX2LONG(arg));
379
+ return index_at(rb_self, FIX2LONG(arg));
370
380
  }
371
381
 
372
382
  /* if arg is Range */
373
- switch (rb_range_beg_len(arg, &beg, &len, (long)node_set->nodeNr, 0)) {
383
+ switch (rb_range_beg_len(arg, &beg, &len, (long)c_self->nodeNr, 0)) {
374
384
  case Qfalse:
375
385
  break;
376
386
  case Qnil:
377
387
  return Qnil;
378
388
  default:
379
- return subseq(self, beg, len);
389
+ return subseq(rb_self, beg, len);
380
390
  }
381
391
 
382
- return index_at(self, NUM2LONG(arg));
392
+ return index_at(rb_self, NUM2LONG(arg));
383
393
  }
384
394
 
385
395
 
@@ -390,17 +400,17 @@ slice(int argc, VALUE *argv, VALUE self)
390
400
  * Return this list as an Array
391
401
  */
392
402
  static VALUE
393
- to_array(VALUE self)
403
+ to_array(VALUE rb_self)
394
404
  {
395
- xmlNodeSetPtr node_set ;
405
+ xmlNodeSetPtr c_self ;
396
406
  VALUE list;
397
407
  int i;
398
408
 
399
- Data_Get_Struct(self, xmlNodeSet, node_set);
409
+ TypedData_Get_Struct(rb_self, xmlNodeSet, &xml_node_set_type, c_self);
400
410
 
401
- list = rb_ary_new2(node_set->nodeNr);
402
- for (i = 0; i < node_set->nodeNr; i++) {
403
- VALUE elt = noko_xml_node_wrap_node_set_result(node_set->nodeTab[i], self);
411
+ list = rb_ary_new2(c_self->nodeNr);
412
+ for (i = 0; i < c_self->nodeNr; i++) {
413
+ VALUE elt = noko_xml_node_wrap_node_set_result(c_self->nodeTab[i], rb_self);
404
414
  rb_ary_push(list, elt);
405
415
  }
406
416
 
@@ -414,25 +424,25 @@ to_array(VALUE self)
414
424
  * Unlink this NodeSet and all Node objects it contains from their current context.
415
425
  */
416
426
  static VALUE
417
- unlink_nodeset(VALUE self)
427
+ unlink_nodeset(VALUE rb_self)
418
428
  {
419
- xmlNodeSetPtr node_set;
429
+ xmlNodeSetPtr c_self;
420
430
  int j, nodeNr ;
421
431
 
422
- Data_Get_Struct(self, xmlNodeSet, node_set);
432
+ TypedData_Get_Struct(rb_self, xmlNodeSet, &xml_node_set_type, c_self);
423
433
 
424
- nodeNr = node_set->nodeNr ;
434
+ nodeNr = c_self->nodeNr ;
425
435
  for (j = 0 ; j < nodeNr ; j++) {
426
- if (! NOKOGIRI_NAMESPACE_EH(node_set->nodeTab[j])) {
436
+ if (! NOKOGIRI_NAMESPACE_EH(c_self->nodeTab[j])) {
427
437
  VALUE node ;
428
438
  xmlNodePtr node_ptr;
429
- node = noko_xml_node_wrap(Qnil, node_set->nodeTab[j]);
439
+ node = noko_xml_node_wrap(Qnil, c_self->nodeTab[j]);
430
440
  rb_funcall(node, rb_intern("unlink"), 0); /* modifies the C struct out from under the object */
431
441
  Noko_Node_Get_Struct(node, xmlNode, node_ptr);
432
- node_set->nodeTab[j] = node_ptr ;
442
+ c_self->nodeTab[j] = node_ptr ;
433
443
  }
434
444
  }
435
- return self ;
445
+ return rb_self ;
436
446
  }
437
447
 
438
448
 
@@ -446,7 +456,7 @@ noko_xml_node_set_wrap(xmlNodeSetPtr c_node_set, VALUE document)
446
456
  c_node_set = xmlXPathNodeSetCreate(NULL);
447
457
  }
448
458
 
449
- rb_node_set = Data_Wrap_Struct(cNokogiriXmlNodeSet, mark, deallocate, c_node_set);
459
+ rb_node_set = TypedData_Wrap_Struct(cNokogiriXmlNodeSet, &xml_node_set_type, c_node_set);
450
460
 
451
461
  if (!NIL_P(document)) {
452
462
  rb_iv_set(rb_node_set, "@document", document);
@@ -461,6 +471,7 @@ noko_xml_node_set_wrap(xmlNodeSetPtr c_node_set, VALUE document)
461
471
  return rb_node_set ;
462
472
  }
463
473
 
474
+
464
475
  VALUE
465
476
  noko_xml_node_wrap_node_set_result(xmlNodePtr node, VALUE node_set)
466
477
  {
@@ -472,12 +483,21 @@ noko_xml_node_wrap_node_set_result(xmlNodePtr node, VALUE node_set)
472
483
  }
473
484
 
474
485
 
486
+ xmlNodeSetPtr
487
+ noko_xml_node_set_unwrap(VALUE rb_node_set)
488
+ {
489
+ xmlNodeSetPtr c_node_set;
490
+ TypedData_Get_Struct(rb_node_set, xmlNodeSet, &xml_node_set_type, c_node_set);
491
+ return c_node_set;
492
+ }
493
+
494
+
475
495
  void
476
496
  noko_init_xml_node_set(void)
477
497
  {
478
498
  cNokogiriXmlNodeSet = rb_define_class_under(mNokogiriXml, "NodeSet", rb_cObject);
479
499
 
480
- rb_define_alloc_func(cNokogiriXmlNodeSet, allocate);
500
+ rb_define_alloc_func(cNokogiriXmlNodeSet, xml_node_set_allocate);
481
501
 
482
502
  rb_define_method(cNokogiriXmlNodeSet, "length", length, 0);
483
503
  rb_define_method(cNokogiriXmlNodeSet, "[]", slice, -1);
@@ -22,7 +22,7 @@ new (int argc, VALUE *argv, VALUE klass)
22
22
 
23
23
  rb_scan_args(argc, argv, "3*", &document, &name, &content, &rest);
24
24
 
25
- Data_Get_Struct(document, xmlDoc, xml_doc);
25
+ xml_doc = noko_xml_document_unwrap(document);
26
26
 
27
27
  node = xmlNewDocPI(
28
28
  xml_doc,