nokogiri 1.14.2 → 1.16.5

Sign up to get free protection for your applications and to get access to all the features.
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.7.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,