nokogiri 1.12.5 → 1.14.3

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


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

Files changed (156) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +41 -0
  3. data/LICENSE-DEPENDENCIES.md +830 -509
  4. data/LICENSE.md +1 -1
  5. data/README.md +23 -14
  6. data/bin/nokogiri +63 -50
  7. data/dependencies.yml +33 -66
  8. data/ext/nokogiri/extconf.rb +159 -63
  9. data/ext/nokogiri/gumbo.c +21 -11
  10. data/ext/nokogiri/html4_document.c +2 -2
  11. data/ext/nokogiri/html4_element_description.c +1 -1
  12. data/ext/nokogiri/html4_entity_lookup.c +2 -2
  13. data/ext/nokogiri/html4_sax_parser_context.c +3 -9
  14. data/ext/nokogiri/html4_sax_push_parser.c +1 -1
  15. data/ext/nokogiri/nokogiri.c +38 -51
  16. data/ext/nokogiri/nokogiri.h +26 -14
  17. data/ext/nokogiri/test_global_handlers.c +1 -1
  18. data/ext/nokogiri/xml_attr.c +3 -3
  19. data/ext/nokogiri/xml_attribute_decl.c +5 -5
  20. data/ext/nokogiri/xml_cdata.c +3 -3
  21. data/ext/nokogiri/xml_comment.c +1 -1
  22. data/ext/nokogiri/xml_document.c +53 -44
  23. data/ext/nokogiri/xml_document_fragment.c +1 -3
  24. data/ext/nokogiri/xml_dtd.c +11 -11
  25. data/ext/nokogiri/xml_element_content.c +3 -3
  26. data/ext/nokogiri/xml_element_decl.c +5 -5
  27. data/ext/nokogiri/xml_encoding_handler.c +28 -14
  28. data/ext/nokogiri/xml_entity_decl.c +6 -6
  29. data/ext/nokogiri/xml_entity_reference.c +1 -1
  30. data/ext/nokogiri/xml_namespace.c +80 -14
  31. data/ext/nokogiri/xml_node.c +982 -396
  32. data/ext/nokogiri/xml_node_set.c +4 -6
  33. data/ext/nokogiri/xml_processing_instruction.c +1 -1
  34. data/ext/nokogiri/xml_reader.c +133 -32
  35. data/ext/nokogiri/xml_relax_ng.c +1 -3
  36. data/ext/nokogiri/xml_sax_parser.c +23 -17
  37. data/ext/nokogiri/xml_sax_parser_context.c +11 -9
  38. data/ext/nokogiri/xml_sax_push_parser.c +1 -3
  39. data/ext/nokogiri/xml_schema.c +4 -6
  40. data/ext/nokogiri/xml_syntax_error.c +1 -1
  41. data/ext/nokogiri/xml_text.c +2 -2
  42. data/ext/nokogiri/xml_xpath_context.c +144 -114
  43. data/ext/nokogiri/xslt_stylesheet.c +122 -23
  44. data/gumbo-parser/Makefile +10 -0
  45. data/gumbo-parser/src/attribute.h +1 -1
  46. data/gumbo-parser/src/error.c +2 -2
  47. data/gumbo-parser/src/error.h +1 -1
  48. data/gumbo-parser/src/foreign_attrs.c +2 -2
  49. data/gumbo-parser/src/{gumbo.h → nokogiri_gumbo.h} +1 -0
  50. data/gumbo-parser/src/parser.c +8 -16
  51. data/gumbo-parser/src/replacement.h +1 -1
  52. data/gumbo-parser/src/string_buffer.h +1 -1
  53. data/gumbo-parser/src/string_piece.c +1 -1
  54. data/gumbo-parser/src/svg_attrs.c +2 -2
  55. data/gumbo-parser/src/svg_tags.c +2 -2
  56. data/gumbo-parser/src/tag.c +2 -1
  57. data/gumbo-parser/src/tag_lookup.c +7 -7
  58. data/gumbo-parser/src/tag_lookup.gperf +1 -0
  59. data/gumbo-parser/src/tag_lookup.h +1 -1
  60. data/gumbo-parser/src/token_buffer.h +1 -1
  61. data/gumbo-parser/src/tokenizer.c +1 -1
  62. data/gumbo-parser/src/tokenizer.h +1 -1
  63. data/gumbo-parser/src/utf8.c +1 -1
  64. data/gumbo-parser/src/utf8.h +1 -1
  65. data/gumbo-parser/src/util.c +1 -3
  66. data/gumbo-parser/src/util.h +4 -0
  67. data/gumbo-parser/src/vector.h +1 -1
  68. data/lib/nokogiri/class_resolver.rb +67 -0
  69. data/lib/nokogiri/css/node.rb +9 -8
  70. data/lib/nokogiri/css/parser.rb +360 -341
  71. data/lib/nokogiri/css/parser.y +249 -244
  72. data/lib/nokogiri/css/parser_extras.rb +22 -20
  73. data/lib/nokogiri/css/syntax_error.rb +1 -0
  74. data/lib/nokogiri/css/tokenizer.rb +4 -3
  75. data/lib/nokogiri/css/tokenizer.rex +3 -2
  76. data/lib/nokogiri/css/xpath_visitor.rb +184 -85
  77. data/lib/nokogiri/css.rb +44 -6
  78. data/lib/nokogiri/decorators/slop.rb +8 -7
  79. data/lib/nokogiri/encoding_handler.rb +57 -0
  80. data/lib/nokogiri/extension.rb +4 -3
  81. data/lib/nokogiri/gumbo.rb +1 -0
  82. data/lib/nokogiri/html.rb +16 -10
  83. data/lib/nokogiri/html4/builder.rb +1 -0
  84. data/lib/nokogiri/html4/document.rb +56 -164
  85. data/lib/nokogiri/html4/document_fragment.rb +11 -7
  86. data/lib/nokogiri/html4/element_description.rb +1 -0
  87. data/lib/nokogiri/html4/element_description_defaults.rb +432 -532
  88. data/lib/nokogiri/html4/encoding_reader.rb +121 -0
  89. data/lib/nokogiri/html4/entity_lookup.rb +2 -1
  90. data/lib/nokogiri/html4/sax/parser.rb +5 -2
  91. data/lib/nokogiri/html4/sax/parser_context.rb +1 -0
  92. data/lib/nokogiri/html4/sax/push_parser.rb +7 -7
  93. data/lib/nokogiri/html4.rb +12 -5
  94. data/lib/nokogiri/html5/document.rb +126 -32
  95. data/lib/nokogiri/html5/document_fragment.rb +14 -4
  96. data/lib/nokogiri/html5/node.rb +12 -7
  97. data/lib/nokogiri/html5.rb +138 -222
  98. data/lib/nokogiri/jruby/dependencies.rb +2 -19
  99. data/lib/nokogiri/jruby/nokogiri_jars.rb +43 -0
  100. data/lib/nokogiri/syntax_error.rb +1 -0
  101. data/lib/nokogiri/version/constant.rb +2 -1
  102. data/lib/nokogiri/version/info.rb +32 -24
  103. data/lib/nokogiri/version.rb +1 -0
  104. data/lib/nokogiri/xml/attr.rb +54 -3
  105. data/lib/nokogiri/xml/attribute_decl.rb +2 -1
  106. data/lib/nokogiri/xml/builder.rb +35 -33
  107. data/lib/nokogiri/xml/cdata.rb +2 -1
  108. data/lib/nokogiri/xml/character_data.rb +1 -0
  109. data/lib/nokogiri/xml/document.rb +232 -143
  110. data/lib/nokogiri/xml/document_fragment.rb +88 -42
  111. data/lib/nokogiri/xml/dtd.rb +3 -2
  112. data/lib/nokogiri/xml/element_content.rb +1 -0
  113. data/lib/nokogiri/xml/element_decl.rb +2 -1
  114. data/lib/nokogiri/xml/entity_decl.rb +3 -2
  115. data/lib/nokogiri/xml/entity_reference.rb +1 -0
  116. data/lib/nokogiri/xml/namespace.rb +44 -0
  117. data/lib/nokogiri/xml/node/save_options.rb +14 -8
  118. data/lib/nokogiri/xml/node.rb +708 -383
  119. data/lib/nokogiri/xml/node_set.rb +134 -59
  120. data/lib/nokogiri/xml/notation.rb +12 -0
  121. data/lib/nokogiri/xml/parse_options.rb +140 -56
  122. data/lib/nokogiri/xml/pp/character_data.rb +8 -6
  123. data/lib/nokogiri/xml/pp/node.rb +26 -26
  124. data/lib/nokogiri/xml/pp.rb +1 -0
  125. data/lib/nokogiri/xml/processing_instruction.rb +3 -1
  126. data/lib/nokogiri/xml/reader.rb +20 -24
  127. data/lib/nokogiri/xml/relax_ng.rb +1 -0
  128. data/lib/nokogiri/xml/sax/document.rb +20 -19
  129. data/lib/nokogiri/xml/sax/parser.rb +38 -36
  130. data/lib/nokogiri/xml/sax/parser_context.rb +7 -3
  131. data/lib/nokogiri/xml/sax/push_parser.rb +5 -5
  132. data/lib/nokogiri/xml/sax.rb +1 -0
  133. data/lib/nokogiri/xml/schema.rb +7 -6
  134. data/lib/nokogiri/xml/searchable.rb +93 -62
  135. data/lib/nokogiri/xml/syntax_error.rb +5 -4
  136. data/lib/nokogiri/xml/text.rb +1 -0
  137. data/lib/nokogiri/xml/xpath/syntax_error.rb +2 -1
  138. data/lib/nokogiri/xml/xpath.rb +12 -0
  139. data/lib/nokogiri/xml/xpath_context.rb +2 -3
  140. data/lib/nokogiri/xml.rb +4 -3
  141. data/lib/nokogiri/xslt/stylesheet.rb +1 -0
  142. data/lib/nokogiri/xslt.rb +21 -13
  143. data/lib/nokogiri.rb +22 -27
  144. data/lib/xsd/xmlparser/nokogiri.rb +28 -25
  145. data/patches/libxml2/0009-allow-wildcard-namespaces.patch +77 -0
  146. data/patches/libxslt/0001-update-automake-files-for-arm64.patch +2445 -1919
  147. data/ports/archives/libxml2-2.10.4.tar.xz +0 -0
  148. data/ports/archives/libxslt-1.1.37.tar.xz +0 -0
  149. metadata +20 -171
  150. data/patches/libxml2/0004-use-glibc-strlen.patch +0 -53
  151. data/patches/libxml2/0005-avoid-isnan-isinf.patch +0 -81
  152. data/patches/libxml2/0006-update-automake-files-for-arm64.patch +0 -2511
  153. data/patches/libxml2/0007-Fix-XPath-recursion-limit.patch +0 -31
  154. data/patches/libxslt/0002-Fix-xml2-config-check-in-configure-script.patch +0 -19
  155. data/ports/archives/libxml2-2.9.12.tar.gz +0 -0
  156. data/ports/archives/libxslt-1.1.34.tar.gz +0 -0
@@ -88,13 +88,11 @@ deallocate(xmlNodeSetPtr node_set)
88
88
  * For reasons outlined in xml_namespace.c, here we reproduce xmlXPathFreeNodeSet() except for the
89
89
  * offending call to xmlXPathNodeSetFreeNs().
90
90
  */
91
- NOKOGIRI_DEBUG_START(node_set) ;
92
91
  if (node_set->nodeTab != NULL) {
93
92
  xmlFree(node_set->nodeTab);
94
93
  }
95
94
 
96
95
  xmlFree(node_set);
97
- NOKOGIRI_DEBUG_END(node_set) ;
98
96
  }
99
97
 
100
98
 
@@ -156,7 +154,7 @@ push(VALUE self, VALUE rb_node)
156
154
  Check_Node_Set_Node_Type(rb_node);
157
155
 
158
156
  Data_Get_Struct(self, xmlNodeSet, node_set);
159
- Data_Get_Struct(rb_node, xmlNode, node);
157
+ Noko_Node_Get_Struct(rb_node, xmlNode, node);
160
158
 
161
159
  xmlXPathNodeSetAdd(node_set, node);
162
160
 
@@ -179,7 +177,7 @@ delete (VALUE self, VALUE rb_node)
179
177
  Check_Node_Set_Node_Type(rb_node);
180
178
 
181
179
  Data_Get_Struct(self, xmlNodeSet, node_set);
182
- Data_Get_Struct(rb_node, xmlNode, node);
180
+ Noko_Node_Get_Struct(rb_node, xmlNode, node);
183
181
 
184
182
  if (xmlXPathNodeSetContains(node_set, node)) {
185
183
  xpath_node_set_del(node_set, node);
@@ -228,7 +226,7 @@ include_eh(VALUE self, VALUE rb_node)
228
226
  Check_Node_Set_Node_Type(rb_node);
229
227
 
230
228
  Data_Get_Struct(self, xmlNodeSet, node_set);
231
- Data_Get_Struct(rb_node, xmlNode, node);
229
+ Noko_Node_Get_Struct(rb_node, xmlNode, node);
232
230
 
233
231
  return (xmlXPathNodeSetContains(node_set, node) ? Qtrue : Qfalse);
234
232
  }
@@ -430,7 +428,7 @@ unlink_nodeset(VALUE self)
430
428
  xmlNodePtr node_ptr;
431
429
  node = noko_xml_node_wrap(Qnil, node_set->nodeTab[j]);
432
430
  rb_funcall(node, rb_intern("unlink"), 0); /* modifies the C struct out from under the object */
433
- Data_Get_Struct(node, xmlNode, node_ptr);
431
+ Noko_Node_Get_Struct(node, xmlNode, node_ptr);
434
432
  node_set->nodeTab[j] = node_ptr ;
435
433
  }
436
434
  }
@@ -41,7 +41,7 @@ new (int argc, VALUE *argv, VALUE klass)
41
41
  }
42
42
 
43
43
  void
44
- noko_init_xml_processing_instruction()
44
+ noko_init_xml_processing_instruction(void)
45
45
  {
46
46
  assert(cNokogiriXmlNode);
47
47
  /*
@@ -5,9 +5,7 @@ VALUE cNokogiriXmlReader;
5
5
  static void
6
6
  dealloc(xmlTextReaderPtr reader)
7
7
  {
8
- NOKOGIRI_DEBUG_START(reader);
9
8
  xmlFreeTextReader(reader);
10
- NOKOGIRI_DEBUG_END(reader);
11
9
  }
12
10
 
13
11
  static int
@@ -31,6 +29,7 @@ has_attributes(xmlTextReaderPtr reader)
31
29
  return (0);
32
30
  }
33
31
 
32
+ // TODO: merge this function into the `namespaces` method implementation
34
33
  static void
35
34
  Nokogiri_xml_node_namespaces(xmlNodePtr node, VALUE attr_hash)
36
35
  {
@@ -125,32 +124,47 @@ attributes_eh(VALUE self)
125
124
  * Get a hash of namespaces for this Node
126
125
  */
127
126
  static VALUE
128
- namespaces(VALUE self)
127
+ rb_xml_reader_namespaces(VALUE rb_reader)
129
128
  {
130
- xmlTextReaderPtr reader;
131
- xmlNodePtr ptr;
132
- VALUE attr ;
133
-
134
- Data_Get_Struct(self, xmlTextReader, reader);
129
+ VALUE rb_namespaces = rb_hash_new() ;
130
+ xmlTextReaderPtr c_reader;
131
+ xmlNodePtr c_node;
132
+ VALUE rb_errors;
135
133
 
136
- attr = rb_hash_new() ;
134
+ Data_Get_Struct(rb_reader, xmlTextReader, c_reader);
137
135
 
138
- if (! has_attributes(reader)) {
139
- return attr ;
136
+ if (! has_attributes(c_reader)) {
137
+ return rb_namespaces ;
140
138
  }
141
139
 
142
- ptr = xmlTextReaderExpand(reader);
143
- if (ptr == NULL) { return Qnil; }
140
+ rb_errors = rb_funcall(rb_reader, rb_intern("errors"), 0);
144
141
 
145
- Nokogiri_xml_node_namespaces(ptr, attr);
142
+ xmlSetStructuredErrorFunc((void *)rb_errors, Nokogiri_error_array_pusher);
143
+ c_node = xmlTextReaderExpand(c_reader);
144
+ xmlSetStructuredErrorFunc(NULL, NULL);
146
145
 
147
- return attr ;
146
+ if (c_node == NULL) {
147
+ if (RARRAY_LEN(rb_errors) > 0) {
148
+ VALUE rb_error = rb_ary_entry(rb_errors, 0);
149
+ VALUE exception_message = rb_funcall(rb_error, rb_intern("to_s"), 0);
150
+ rb_exc_raise(rb_class_new_instance(1, &exception_message, cNokogiriXmlSyntaxError));
151
+ }
152
+ return Qnil;
153
+ }
154
+
155
+ Nokogiri_xml_node_namespaces(c_node, rb_namespaces);
156
+
157
+ return rb_namespaces ;
148
158
  }
149
159
 
150
160
  /*
151
- * @overload attribute_nodes()
152
- * Get the attributes of the current node as an Array of Attr
153
- * @return [Array<Nokogiri::XML::Attr>]
161
+ :call-seq: attribute_nodes() → Array<Nokogiri::XML::Attr>
162
+
163
+ Get the attributes of the current node as an Array of XML:Attr
164
+
165
+ ⚠ This method is deprecated and unsafe to use. It will be removed in a future version of Nokogiri.
166
+
167
+ See related: #attribute_hash, #attributes
154
168
  */
155
169
  static VALUE
156
170
  rb_xml_reader_attribute_nodes(VALUE rb_reader)
@@ -160,6 +174,10 @@ rb_xml_reader_attribute_nodes(VALUE rb_reader)
160
174
  VALUE attr_nodes;
161
175
  int j;
162
176
 
177
+ // TODO: deprecated, remove in Nokogiri v1.15, see https://github.com/sparklemotion/nokogiri/issues/2598
178
+ // After removal, we can also remove all the "node_has_a_document" special handling from xml_node.c
179
+ NOKO_WARN_DEPRECATION("Reader#attribute_nodes is deprecated and will be removed in a future version of Nokogiri. Please use Reader#attribute_hash instead.");
180
+
163
181
  Data_Get_Struct(rb_reader, xmlTextReader, c_reader);
164
182
 
165
183
  if (! has_attributes(c_reader)) {
@@ -181,6 +199,62 @@ rb_xml_reader_attribute_nodes(VALUE rb_reader)
181
199
  return attr_nodes;
182
200
  }
183
201
 
202
+ /*
203
+ :call-seq: attribute_hash() → Hash<String ⇒ String>
204
+
205
+ Get the attributes of the current node as a Hash of names and values.
206
+
207
+ See related: #attributes and #namespaces
208
+ */
209
+ static VALUE
210
+ rb_xml_reader_attribute_hash(VALUE rb_reader)
211
+ {
212
+ VALUE rb_attributes = rb_hash_new();
213
+ xmlTextReaderPtr c_reader;
214
+ xmlNodePtr c_node;
215
+ xmlAttrPtr c_property;
216
+ VALUE rb_errors;
217
+
218
+ Data_Get_Struct(rb_reader, xmlTextReader, c_reader);
219
+
220
+ if (!has_attributes(c_reader)) {
221
+ return rb_attributes;
222
+ }
223
+
224
+ rb_errors = rb_funcall(rb_reader, rb_intern("errors"), 0);
225
+
226
+ xmlSetStructuredErrorFunc((void *)rb_errors, Nokogiri_error_array_pusher);
227
+ c_node = xmlTextReaderExpand(c_reader);
228
+ xmlSetStructuredErrorFunc(NULL, NULL);
229
+
230
+ if (c_node == NULL) {
231
+ if (RARRAY_LEN(rb_errors) > 0) {
232
+ VALUE rb_error = rb_ary_entry(rb_errors, 0);
233
+ VALUE exception_message = rb_funcall(rb_error, rb_intern("to_s"), 0);
234
+ rb_exc_raise(rb_class_new_instance(1, &exception_message, cNokogiriXmlSyntaxError));
235
+ }
236
+ return Qnil;
237
+ }
238
+
239
+ c_property = c_node->properties;
240
+ while (c_property != NULL) {
241
+ VALUE rb_name = NOKOGIRI_STR_NEW2(c_property->name);
242
+ VALUE rb_value = Qnil;
243
+ xmlChar *c_value = xmlNodeGetContent((xmlNode *)c_property);
244
+
245
+ if (c_value) {
246
+ rb_value = NOKOGIRI_STR_NEW2(c_value);
247
+ xmlFree(c_value);
248
+ }
249
+
250
+ rb_hash_aset(rb_attributes, rb_name, rb_value);
251
+
252
+ c_property = c_property->next;
253
+ }
254
+
255
+ return rb_attributes;
256
+ }
257
+
184
258
  /*
185
259
  * call-seq:
186
260
  * attribute_at(index)
@@ -252,7 +326,7 @@ attribute_count(VALUE self)
252
326
  count = xmlTextReaderAttributeCount(reader);
253
327
  if (count == -1) { return Qnil; }
254
328
 
255
- return INT2NUM((long)count);
329
+ return INT2NUM(count);
256
330
  }
257
331
 
258
332
  /*
@@ -271,7 +345,7 @@ depth(VALUE self)
271
345
  depth = xmlTextReaderDepth(reader);
272
346
  if (depth == -1) { return Qnil; }
273
347
 
274
- return INT2NUM((long)depth);
348
+ return INT2NUM(depth);
275
349
  }
276
350
 
277
351
  /*
@@ -414,16 +488,23 @@ name(VALUE self)
414
488
  * Get the xml:base of the node
415
489
  */
416
490
  static VALUE
417
- base_uri(VALUE self)
491
+ rb_xml_reader_base_uri(VALUE rb_reader)
418
492
  {
419
- xmlTextReaderPtr reader;
420
- const char *base_uri;
493
+ VALUE rb_base_uri;
494
+ xmlTextReaderPtr c_reader;
495
+ xmlChar *c_base_uri;
421
496
 
422
- Data_Get_Struct(self, xmlTextReader, reader);
423
- base_uri = (const char *)xmlTextReaderBaseUri(reader);
424
- if (base_uri == NULL) { return Qnil; }
497
+ Data_Get_Struct(rb_reader, xmlTextReader, c_reader);
498
+
499
+ c_base_uri = xmlTextReaderBaseUri(c_reader);
500
+ if (c_base_uri == NULL) {
501
+ return Qnil;
502
+ }
425
503
 
426
- return NOKOGIRI_STR_NEW2(base_uri);
504
+ rb_base_uri = NOKOGIRI_STR_NEW2(c_base_uri);
505
+ xmlFree(c_base_uri);
506
+
507
+ return rb_base_uri;
427
508
  }
428
509
 
429
510
  /*
@@ -437,7 +518,7 @@ state(VALUE self)
437
518
  {
438
519
  xmlTextReaderPtr reader;
439
520
  Data_Get_Struct(self, xmlTextReader, reader);
440
- return INT2NUM((long)xmlTextReaderReadState(reader));
521
+ return INT2NUM(xmlTextReaderReadState(reader));
441
522
  }
442
523
 
443
524
  /*
@@ -451,7 +532,7 @@ node_type(VALUE self)
451
532
  {
452
533
  xmlTextReaderPtr reader;
453
534
  Data_Get_Struct(self, xmlTextReader, reader);
454
- return INT2NUM((long)xmlTextReaderNodeType(reader));
535
+ return INT2NUM(xmlTextReaderNodeType(reader));
455
536
  }
456
537
 
457
538
  /*
@@ -652,8 +733,26 @@ empty_element_p(VALUE self)
652
733
  return Qfalse;
653
734
  }
654
735
 
736
+ static VALUE
737
+ rb_xml_reader_encoding(VALUE rb_reader)
738
+ {
739
+ xmlTextReaderPtr c_reader;
740
+ const char *parser_encoding;
741
+ VALUE constructor_encoding;
742
+
743
+ constructor_encoding = rb_iv_get(rb_reader, "@encoding");
744
+ if (RTEST(constructor_encoding)) {
745
+ return constructor_encoding;
746
+ }
747
+
748
+ Data_Get_Struct(rb_reader, xmlTextReader, c_reader);
749
+ parser_encoding = (const char *)xmlTextReaderConstEncoding(c_reader);
750
+ if (parser_encoding == NULL) { return Qnil; }
751
+ return NOKOGIRI_STR_NEW2(parser_encoding);
752
+ }
753
+
655
754
  void
656
- noko_init_xml_reader()
755
+ noko_init_xml_reader(void)
657
756
  {
658
757
  /*
659
758
  * The Reader parser allows you to effectively pull parse an XML document.
@@ -671,17 +770,19 @@ noko_init_xml_reader()
671
770
  rb_define_method(cNokogiriXmlReader, "attribute_at", attribute_at, 1);
672
771
  rb_define_method(cNokogiriXmlReader, "attribute_count", attribute_count, 0);
673
772
  rb_define_method(cNokogiriXmlReader, "attribute_nodes", rb_xml_reader_attribute_nodes, 0);
773
+ rb_define_method(cNokogiriXmlReader, "attribute_hash", rb_xml_reader_attribute_hash, 0);
674
774
  rb_define_method(cNokogiriXmlReader, "attributes?", attributes_eh, 0);
675
- rb_define_method(cNokogiriXmlReader, "base_uri", base_uri, 0);
775
+ rb_define_method(cNokogiriXmlReader, "base_uri", rb_xml_reader_base_uri, 0);
676
776
  rb_define_method(cNokogiriXmlReader, "default?", default_eh, 0);
677
777
  rb_define_method(cNokogiriXmlReader, "depth", depth, 0);
678
778
  rb_define_method(cNokogiriXmlReader, "empty_element?", empty_element_p, 0);
779
+ rb_define_method(cNokogiriXmlReader, "encoding", rb_xml_reader_encoding, 0);
679
780
  rb_define_method(cNokogiriXmlReader, "inner_xml", inner_xml, 0);
680
781
  rb_define_method(cNokogiriXmlReader, "lang", lang, 0);
681
782
  rb_define_method(cNokogiriXmlReader, "local_name", local_name, 0);
682
783
  rb_define_method(cNokogiriXmlReader, "name", name, 0);
683
784
  rb_define_method(cNokogiriXmlReader, "namespace_uri", namespace_uri, 0);
684
- rb_define_method(cNokogiriXmlReader, "namespaces", namespaces, 0);
785
+ rb_define_method(cNokogiriXmlReader, "namespaces", rb_xml_reader_namespaces, 0);
685
786
  rb_define_method(cNokogiriXmlReader, "node_type", node_type, 0);
686
787
  rb_define_method(cNokogiriXmlReader, "outer_xml", outer_xml, 0);
687
788
  rb_define_method(cNokogiriXmlReader, "prefix", prefix, 0);
@@ -5,9 +5,7 @@ VALUE cNokogiriXmlRelaxNG;
5
5
  static void
6
6
  dealloc(xmlRelaxNGPtr schema)
7
7
  {
8
- NOKOGIRI_DEBUG_START(schema);
9
8
  xmlRelaxNGFree(schema);
10
- NOKOGIRI_DEBUG_END(schema);
11
9
  }
12
10
 
13
11
  /*
@@ -173,7 +171,7 @@ from_document(int argc, VALUE *argv, VALUE klass)
173
171
  }
174
172
 
175
173
  void
176
- noko_init_xml_relax_ng()
174
+ noko_init_xml_relax_ng(void)
177
175
  {
178
176
  assert(cNokogiriXmlSchema);
179
177
  cNokogiriXmlRelaxNG = rb_define_class_under(mNokogiriXml, "RelaxNG", cNokogiriXmlSchema);
@@ -195,40 +195,48 @@ comment_func(void *ctx, const xmlChar *value)
195
195
  rb_funcall(doc, id_comment, 1, str);
196
196
  }
197
197
 
198
+ PRINTFLIKE_DECL(2, 3)
198
199
  static void
199
200
  warning_func(void *ctx, const char *msg, ...)
200
201
  {
201
202
  VALUE self = NOKOGIRI_SAX_SELF(ctx);
202
203
  VALUE doc = rb_iv_get(self, "@document");
203
- char *message;
204
- VALUE ruby_message;
204
+ VALUE rb_message;
205
205
 
206
+ #ifdef TRUFFLERUBY_NOKOGIRI_SYSTEM_LIBRARIES
207
+ /* It is not currently possible to pass var args from native
208
+ functions to sulong, so we work around the issue here. */
209
+ rb_message = rb_sprintf("warning_func: %s", msg);
210
+ #else
206
211
  va_list args;
207
212
  va_start(args, msg);
208
- vasprintf(&message, msg, args);
213
+ rb_message = rb_vsprintf(msg, args);
209
214
  va_end(args);
215
+ #endif
210
216
 
211
- ruby_message = NOKOGIRI_STR_NEW2(message);
212
- free(message);
213
- rb_funcall(doc, id_warning, 1, ruby_message);
217
+ rb_funcall(doc, id_warning, 1, rb_message);
214
218
  }
215
219
 
220
+ PRINTFLIKE_DECL(2, 3)
216
221
  static void
217
222
  error_func(void *ctx, const char *msg, ...)
218
223
  {
219
224
  VALUE self = NOKOGIRI_SAX_SELF(ctx);
220
225
  VALUE doc = rb_iv_get(self, "@document");
221
- char *message;
222
- VALUE ruby_message;
226
+ VALUE rb_message;
223
227
 
228
+ #ifdef TRUFFLERUBY_NOKOGIRI_SYSTEM_LIBRARIES
229
+ /* It is not currently possible to pass var args from native
230
+ functions to sulong, so we work around the issue here. */
231
+ rb_message = rb_sprintf("error_func: %s", msg);
232
+ #else
224
233
  va_list args;
225
234
  va_start(args, msg);
226
- vasprintf(&message, msg, args);
235
+ rb_message = rb_vsprintf(msg, args);
227
236
  va_end(args);
237
+ #endif
228
238
 
229
- ruby_message = NOKOGIRI_STR_NEW2(message);
230
- free(message);
231
- rb_funcall(doc, id_error, 1, ruby_message);
239
+ rb_funcall(doc, id_error, 1, rb_message);
232
240
  }
233
241
 
234
242
  static void
@@ -260,15 +268,13 @@ processing_instruction(void *ctx, const xmlChar *name, const xmlChar *content)
260
268
  static void
261
269
  deallocate(xmlSAXHandlerPtr handler)
262
270
  {
263
- NOKOGIRI_DEBUG_START(handler);
264
- free(handler);
265
- NOKOGIRI_DEBUG_END(handler);
271
+ ruby_xfree(handler);
266
272
  }
267
273
 
268
274
  static VALUE
269
275
  allocate(VALUE klass)
270
276
  {
271
- xmlSAXHandlerPtr handler = calloc((size_t)1, sizeof(xmlSAXHandler));
277
+ xmlSAXHandlerPtr handler = ruby_xcalloc((size_t)1, sizeof(xmlSAXHandler));
272
278
 
273
279
  handler->startDocument = start_document;
274
280
  handler->endDocument = end_document;
@@ -288,7 +294,7 @@ allocate(VALUE klass)
288
294
  }
289
295
 
290
296
  void
291
- noko_init_xml_sax_parser()
297
+ noko_init_xml_sax_parser(void)
292
298
  {
293
299
  cNokogiriXmlSaxParser = rb_define_class_under(mNokogiriXmlSax, "Parser", rb_cObject);
294
300
 
@@ -2,16 +2,13 @@
2
2
 
3
3
  VALUE cNokogiriXmlSaxParserContext ;
4
4
 
5
+ static ID id_read;
6
+
5
7
  static void
6
8
  deallocate(xmlParserCtxtPtr ctxt)
7
9
  {
8
- NOKOGIRI_DEBUG_START(ctxt);
9
-
10
10
  ctxt->sax = NULL;
11
-
12
11
  xmlFreeParserCtxt(ctxt);
13
-
14
- NOKOGIRI_DEBUG_END(ctxt);
15
12
  }
16
13
 
17
14
  /*
@@ -26,6 +23,10 @@ parse_io(VALUE klass, VALUE io, VALUE encoding)
26
23
  xmlParserCtxtPtr ctxt;
27
24
  xmlCharEncoding enc = (xmlCharEncoding)NUM2INT(encoding);
28
25
 
26
+ if (!rb_respond_to(io, id_read)) {
27
+ rb_raise(rb_eTypeError, "argument expected to respond to :read");
28
+ }
29
+
29
30
  ctxt = xmlCreateIOParserCtxt(NULL, NULL,
30
31
  (xmlInputReadCallback)noko_io_read,
31
32
  (xmlInputCloseCallback)noko_io_close,
@@ -62,9 +63,8 @@ parse_memory(VALUE klass, VALUE data)
62
63
  {
63
64
  xmlParserCtxtPtr ctxt;
64
65
 
65
- if (NIL_P(data)) {
66
- rb_raise(rb_eArgError, "data cannot be nil");
67
- }
66
+ Check_Type(data, T_STRING);
67
+
68
68
  if (!(int)RSTRING_LEN(data)) {
69
69
  rb_raise(rb_eRuntimeError, "data cannot be empty");
70
70
  }
@@ -261,7 +261,7 @@ get_recovery(VALUE self)
261
261
  }
262
262
 
263
263
  void
264
- noko_init_xml_sax_parser_context()
264
+ noko_init_xml_sax_parser_context(void)
265
265
  {
266
266
  cNokogiriXmlSaxParserContext = rb_define_class_under(mNokogiriXmlSax, "ParserContext", rb_cObject);
267
267
 
@@ -278,4 +278,6 @@ noko_init_xml_sax_parser_context()
278
278
  rb_define_method(cNokogiriXmlSaxParserContext, "recovery", get_recovery, 0);
279
279
  rb_define_method(cNokogiriXmlSaxParserContext, "line", line, 0);
280
280
  rb_define_method(cNokogiriXmlSaxParserContext, "column", column, 0);
281
+
282
+ id_read = rb_intern("read");
281
283
  }
@@ -5,12 +5,10 @@ VALUE cNokogiriXmlSaxPushParser ;
5
5
  static void
6
6
  deallocate(xmlParserCtxtPtr ctx)
7
7
  {
8
- NOKOGIRI_DEBUG_START(ctx);
9
8
  if (ctx != NULL) {
10
9
  NOKOGIRI_SAX_TUPLE_DESTROY(ctx->userData);
11
10
  xmlFreeParserCtxt(ctx);
12
11
  }
13
- NOKOGIRI_DEBUG_END(ctx);
14
12
  }
15
13
 
16
14
  static VALUE
@@ -152,7 +150,7 @@ set_replace_entities(VALUE self, VALUE value)
152
150
  }
153
151
 
154
152
  void
155
- noko_init_xml_sax_push_parser()
153
+ noko_init_xml_sax_push_parser(void)
156
154
  {
157
155
  cNokogiriXmlSaxPushParser = rb_define_class_under(mNokogiriXmlSax, "PushParser", rb_cObject);
158
156
 
@@ -5,9 +5,7 @@ VALUE cNokogiriXmlSchema;
5
5
  static void
6
6
  dealloc(xmlSchemaPtr schema)
7
7
  {
8
- NOKOGIRI_DEBUG_START(schema);
9
8
  xmlSchemaFree(schema);
10
- NOKOGIRI_DEBUG_END(schema);
11
9
  }
12
10
 
13
11
  /*
@@ -25,7 +23,7 @@ validate_document(VALUE self, VALUE document)
25
23
  VALUE errors;
26
24
 
27
25
  Data_Get_Struct(self, xmlSchema, schema);
28
- Data_Get_Struct(document, xmlDoc, doc);
26
+ Noko_Node_Get_Struct(document, xmlDoc, doc);
29
27
 
30
28
  errors = rb_ary_new();
31
29
 
@@ -179,7 +177,7 @@ has_blank_nodes_p(VALUE cache)
179
177
  for (i = 0; i < RARRAY_LEN(cache); i++) {
180
178
  xmlNodePtr node;
181
179
  VALUE element = rb_ary_entry(cache, i);
182
- Data_Get_Struct(element, xmlNode, node);
180
+ Noko_Node_Get_Struct(element, xmlNode, node);
183
181
  if (xmlIsBlankNode(node)) {
184
182
  return 1;
185
183
  }
@@ -210,7 +208,7 @@ from_document(int argc, VALUE *argv, VALUE klass)
210
208
 
211
209
  scanned_args = rb_scan_args(argc, argv, "11", &document, &parse_options);
212
210
 
213
- Data_Get_Struct(document, xmlDoc, doc);
211
+ Noko_Node_Get_Struct(document, xmlDoc, doc);
214
212
  doc = doc->doc; /* In case someone passes us a node. ugh. */
215
213
 
216
214
  if (scanned_args == 1) {
@@ -270,7 +268,7 @@ from_document(int argc, VALUE *argv, VALUE klass)
270
268
  }
271
269
 
272
270
  void
273
- noko_init_xml_schema()
271
+ noko_init_xml_schema(void)
274
272
  {
275
273
  cNokogiriXmlSchema = rb_define_class_under(mNokogiriXml, "Schema", rb_cObject);
276
274
 
@@ -75,7 +75,7 @@ Nokogiri_wrap_xml_syntax_error(xmlErrorPtr error)
75
75
  }
76
76
 
77
77
  void
78
- noko_init_xml_syntax_error()
78
+ noko_init_xml_syntax_error(void)
79
79
  {
80
80
  assert(cNokogiriSyntaxError);
81
81
  /*
@@ -20,7 +20,7 @@ new (int argc, VALUE *argv, VALUE klass)
20
20
 
21
21
  rb_scan_args(argc, argv, "2*", &string, &document, &rest);
22
22
 
23
- Data_Get_Struct(document, xmlDoc, doc);
23
+ Noko_Node_Get_Struct(document, xmlDoc, doc);
24
24
 
25
25
  node = xmlNewText((xmlChar *)StringValueCStr(string));
26
26
  node->doc = doc->doc;
@@ -36,7 +36,7 @@ new (int argc, VALUE *argv, VALUE klass)
36
36
  }
37
37
 
38
38
  void
39
- noko_init_xml_text()
39
+ noko_init_xml_text(void)
40
40
  {
41
41
  assert(cNokogiriXmlCharacterData);
42
42
  /*