nokogiri 1.5.10 → 1.13.0

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 (334) hide show
  1. checksums.yaml +7 -0
  2. data/Gemfile +5 -0
  3. data/LICENSE-DEPENDENCIES.md +1903 -0
  4. data/LICENSE.md +9 -0
  5. data/README.md +280 -0
  6. data/bin/nokogiri +84 -31
  7. data/dependencies.yml +73 -0
  8. data/ext/nokogiri/depend +38 -358
  9. data/ext/nokogiri/extconf.rb +956 -100
  10. data/ext/nokogiri/gumbo.c +584 -0
  11. data/ext/nokogiri/html4_document.c +166 -0
  12. data/ext/nokogiri/html4_element_description.c +294 -0
  13. data/ext/nokogiri/html4_entity_lookup.c +37 -0
  14. data/ext/nokogiri/html4_sax_parser_context.c +120 -0
  15. data/ext/nokogiri/html4_sax_push_parser.c +95 -0
  16. data/ext/nokogiri/libxml2_backwards_compat.c +121 -0
  17. data/ext/nokogiri/nokogiri.c +232 -87
  18. data/ext/nokogiri/nokogiri.h +188 -129
  19. data/ext/nokogiri/test_global_handlers.c +40 -0
  20. data/ext/nokogiri/xml_attr.c +49 -40
  21. data/ext/nokogiri/xml_attribute_decl.c +18 -18
  22. data/ext/nokogiri/xml_cdata.c +24 -23
  23. data/ext/nokogiri/xml_comment.c +29 -21
  24. data/ext/nokogiri/xml_document.c +327 -223
  25. data/ext/nokogiri/xml_document_fragment.c +12 -16
  26. data/ext/nokogiri/xml_dtd.c +56 -50
  27. data/ext/nokogiri/xml_element_content.c +31 -26
  28. data/ext/nokogiri/xml_element_decl.c +22 -22
  29. data/ext/nokogiri/xml_encoding_handler.c +45 -20
  30. data/ext/nokogiri/xml_entity_decl.c +32 -30
  31. data/ext/nokogiri/xml_entity_reference.c +16 -18
  32. data/ext/nokogiri/xml_namespace.c +74 -32
  33. data/ext/nokogiri/xml_node.c +1290 -680
  34. data/ext/nokogiri/xml_node_set.c +239 -208
  35. data/ext/nokogiri/xml_processing_instruction.c +17 -19
  36. data/ext/nokogiri/xml_reader.c +227 -189
  37. data/ext/nokogiri/xml_relax_ng.c +52 -28
  38. data/ext/nokogiri/xml_sax_parser.c +123 -125
  39. data/ext/nokogiri/xml_sax_parser_context.c +138 -79
  40. data/ext/nokogiri/xml_sax_push_parser.c +88 -35
  41. data/ext/nokogiri/xml_schema.c +112 -33
  42. data/ext/nokogiri/xml_syntax_error.c +50 -23
  43. data/ext/nokogiri/xml_text.c +14 -18
  44. data/ext/nokogiri/xml_xpath_context.c +227 -140
  45. data/ext/nokogiri/xslt_stylesheet.c +162 -168
  46. data/gumbo-parser/CHANGES.md +63 -0
  47. data/gumbo-parser/Makefile +101 -0
  48. data/gumbo-parser/THANKS +27 -0
  49. data/gumbo-parser/src/Makefile +34 -0
  50. data/gumbo-parser/src/README.md +41 -0
  51. data/gumbo-parser/src/ascii.c +75 -0
  52. data/gumbo-parser/src/ascii.h +115 -0
  53. data/gumbo-parser/src/attribute.c +42 -0
  54. data/gumbo-parser/src/attribute.h +17 -0
  55. data/gumbo-parser/src/char_ref.c +22225 -0
  56. data/gumbo-parser/src/char_ref.h +29 -0
  57. data/gumbo-parser/src/char_ref.rl +2154 -0
  58. data/gumbo-parser/src/error.c +626 -0
  59. data/gumbo-parser/src/error.h +148 -0
  60. data/gumbo-parser/src/foreign_attrs.c +104 -0
  61. data/gumbo-parser/src/foreign_attrs.gperf +27 -0
  62. data/gumbo-parser/src/gumbo.h +943 -0
  63. data/gumbo-parser/src/insertion_mode.h +33 -0
  64. data/gumbo-parser/src/macros.h +91 -0
  65. data/gumbo-parser/src/parser.c +4875 -0
  66. data/gumbo-parser/src/parser.h +41 -0
  67. data/gumbo-parser/src/replacement.h +33 -0
  68. data/gumbo-parser/src/string_buffer.c +103 -0
  69. data/gumbo-parser/src/string_buffer.h +68 -0
  70. data/gumbo-parser/src/string_piece.c +48 -0
  71. data/gumbo-parser/src/svg_attrs.c +174 -0
  72. data/gumbo-parser/src/svg_attrs.gperf +77 -0
  73. data/gumbo-parser/src/svg_tags.c +137 -0
  74. data/gumbo-parser/src/svg_tags.gperf +55 -0
  75. data/gumbo-parser/src/tag.c +222 -0
  76. data/gumbo-parser/src/tag_lookup.c +382 -0
  77. data/gumbo-parser/src/tag_lookup.gperf +169 -0
  78. data/gumbo-parser/src/tag_lookup.h +13 -0
  79. data/gumbo-parser/src/token_buffer.c +79 -0
  80. data/gumbo-parser/src/token_buffer.h +71 -0
  81. data/gumbo-parser/src/token_type.h +17 -0
  82. data/gumbo-parser/src/tokenizer.c +3463 -0
  83. data/gumbo-parser/src/tokenizer.h +112 -0
  84. data/gumbo-parser/src/tokenizer_states.h +339 -0
  85. data/gumbo-parser/src/utf8.c +245 -0
  86. data/gumbo-parser/src/utf8.h +164 -0
  87. data/gumbo-parser/src/util.c +68 -0
  88. data/gumbo-parser/src/util.h +30 -0
  89. data/gumbo-parser/src/vector.c +111 -0
  90. data/gumbo-parser/src/vector.h +45 -0
  91. data/lib/nokogiri/class_resolver.rb +67 -0
  92. data/lib/nokogiri/css/node.rb +10 -58
  93. data/lib/nokogiri/css/parser.rb +327 -288
  94. data/lib/nokogiri/css/parser.y +67 -45
  95. data/lib/nokogiri/css/parser_extras.rb +52 -49
  96. data/lib/nokogiri/css/syntax_error.rb +3 -1
  97. data/lib/nokogiri/css/tokenizer.rb +107 -104
  98. data/lib/nokogiri/css/tokenizer.rex +7 -6
  99. data/lib/nokogiri/css/xpath_visitor.rb +263 -75
  100. data/lib/nokogiri/css.rb +50 -17
  101. data/lib/nokogiri/decorators/slop.rb +17 -8
  102. data/lib/nokogiri/extension.rb +31 -0
  103. data/lib/nokogiri/gumbo.rb +15 -0
  104. data/lib/nokogiri/html.rb +38 -27
  105. data/lib/nokogiri/{html → html4}/builder.rb +4 -2
  106. data/lib/nokogiri/html4/document.rb +331 -0
  107. data/lib/nokogiri/html4/document_fragment.rb +54 -0
  108. data/lib/nokogiri/{html → html4}/element_description.rb +3 -1
  109. data/lib/nokogiri/html4/element_description_defaults.rb +578 -0
  110. data/lib/nokogiri/{html → html4}/entity_lookup.rb +4 -2
  111. data/lib/nokogiri/{html → html4}/sax/parser.rb +24 -15
  112. data/lib/nokogiri/html4/sax/parser_context.rb +20 -0
  113. data/lib/nokogiri/html4/sax/push_parser.rb +37 -0
  114. data/lib/nokogiri/html4.rb +46 -0
  115. data/lib/nokogiri/html5/document.rb +88 -0
  116. data/lib/nokogiri/html5/document_fragment.rb +83 -0
  117. data/lib/nokogiri/html5/node.rb +96 -0
  118. data/lib/nokogiri/html5.rb +477 -0
  119. data/lib/nokogiri/jruby/dependencies.rb +21 -0
  120. data/lib/nokogiri/syntax_error.rb +2 -0
  121. data/lib/nokogiri/version/constant.rb +6 -0
  122. data/lib/nokogiri/version/info.rb +221 -0
  123. data/lib/nokogiri/version.rb +3 -90
  124. data/lib/nokogiri/xml/attr.rb +6 -3
  125. data/lib/nokogiri/xml/attribute_decl.rb +3 -1
  126. data/lib/nokogiri/xml/builder.rb +96 -54
  127. data/lib/nokogiri/xml/cdata.rb +3 -1
  128. data/lib/nokogiri/xml/character_data.rb +2 -0
  129. data/lib/nokogiri/xml/document.rb +234 -95
  130. data/lib/nokogiri/xml/document_fragment.rb +86 -36
  131. data/lib/nokogiri/xml/dtd.rb +16 -4
  132. data/lib/nokogiri/xml/element_content.rb +2 -0
  133. data/lib/nokogiri/xml/element_decl.rb +3 -1
  134. data/lib/nokogiri/xml/entity_decl.rb +4 -2
  135. data/lib/nokogiri/xml/entity_reference.rb +20 -0
  136. data/lib/nokogiri/xml/namespace.rb +3 -0
  137. data/lib/nokogiri/xml/node/save_options.rb +8 -4
  138. data/lib/nokogiri/xml/node.rb +947 -502
  139. data/lib/nokogiri/xml/node_set.rb +168 -159
  140. data/lib/nokogiri/xml/notation.rb +13 -0
  141. data/lib/nokogiri/xml/parse_options.rb +40 -5
  142. data/lib/nokogiri/xml/pp/character_data.rb +9 -6
  143. data/lib/nokogiri/xml/pp/node.rb +25 -26
  144. data/lib/nokogiri/xml/pp.rb +4 -2
  145. data/lib/nokogiri/xml/processing_instruction.rb +3 -1
  146. data/lib/nokogiri/xml/reader.rb +23 -28
  147. data/lib/nokogiri/xml/relax_ng.rb +8 -2
  148. data/lib/nokogiri/xml/sax/document.rb +45 -49
  149. data/lib/nokogiri/xml/sax/parser.rb +43 -41
  150. data/lib/nokogiri/xml/sax/parser_context.rb +8 -3
  151. data/lib/nokogiri/xml/sax/push_parser.rb +6 -5
  152. data/lib/nokogiri/xml/sax.rb +6 -4
  153. data/lib/nokogiri/xml/schema.rb +19 -9
  154. data/lib/nokogiri/xml/searchable.rb +259 -0
  155. data/lib/nokogiri/xml/syntax_error.rb +25 -1
  156. data/lib/nokogiri/xml/text.rb +2 -0
  157. data/lib/nokogiri/xml/xpath/syntax_error.rb +4 -2
  158. data/lib/nokogiri/xml/xpath.rb +15 -4
  159. data/lib/nokogiri/xml/xpath_context.rb +3 -3
  160. data/lib/nokogiri/xml.rb +38 -36
  161. data/lib/nokogiri/xslt/stylesheet.rb +3 -1
  162. data/lib/nokogiri/xslt.rb +18 -16
  163. data/lib/nokogiri.rb +69 -69
  164. data/lib/xsd/xmlparser/nokogiri.rb +26 -24
  165. data/patches/libxml2/0001-Remove-script-macro-support.patch +40 -0
  166. data/patches/libxml2/0002-Update-entities-to-remove-handling-of-ssi.patch +44 -0
  167. data/patches/libxml2/0003-libxml2.la-is-in-top_builddir.patch +25 -0
  168. data/patches/libxml2/0004-use-glibc-strlen.patch +53 -0
  169. data/patches/libxml2/0005-avoid-isnan-isinf.patch +81 -0
  170. data/patches/libxml2/0006-update-automake-files-for-arm64.patch +2511 -0
  171. data/patches/libxml2/0007-Fix-XPath-recursion-limit.patch +31 -0
  172. data/patches/libxml2/0008-htmlParseComment-handle-abruptly-closed-comments.patch +61 -0
  173. data/patches/libxml2/0009-allow-wildcard-namespaces.patch +77 -0
  174. data/patches/libxslt/0001-update-automake-files-for-arm64.patch +2511 -0
  175. data/patches/libxslt/0002-Fix-xml2-config-check-in-configure-script.patch +19 -0
  176. data/ports/archives/libxml2-2.9.12.tar.gz +0 -0
  177. data/ports/archives/libxslt-1.1.34.tar.gz +0 -0
  178. metadata +382 -460
  179. data/.autotest +0 -26
  180. data/.gemtest +0 -0
  181. data/CHANGELOG.ja.rdoc +0 -785
  182. data/CHANGELOG.rdoc +0 -783
  183. data/C_CODING_STYLE.rdoc +0 -33
  184. data/Manifest.txt +0 -303
  185. data/README.ja.rdoc +0 -106
  186. data/README.rdoc +0 -175
  187. data/ROADMAP.md +0 -90
  188. data/Rakefile +0 -228
  189. data/STANDARD_RESPONSES.md +0 -47
  190. data/Y_U_NO_GEMSPEC.md +0 -155
  191. data/build_all +0 -105
  192. data/ext/nokogiri/html_document.c +0 -170
  193. data/ext/nokogiri/html_document.h +0 -10
  194. data/ext/nokogiri/html_element_description.c +0 -279
  195. data/ext/nokogiri/html_element_description.h +0 -10
  196. data/ext/nokogiri/html_entity_lookup.c +0 -32
  197. data/ext/nokogiri/html_entity_lookup.h +0 -8
  198. data/ext/nokogiri/html_sax_parser_context.c +0 -116
  199. data/ext/nokogiri/html_sax_parser_context.h +0 -11
  200. data/ext/nokogiri/html_sax_push_parser.c +0 -87
  201. data/ext/nokogiri/html_sax_push_parser.h +0 -9
  202. data/ext/nokogiri/xml_attr.h +0 -9
  203. data/ext/nokogiri/xml_attribute_decl.h +0 -9
  204. data/ext/nokogiri/xml_cdata.h +0 -9
  205. data/ext/nokogiri/xml_comment.h +0 -9
  206. data/ext/nokogiri/xml_document.h +0 -23
  207. data/ext/nokogiri/xml_document_fragment.h +0 -10
  208. data/ext/nokogiri/xml_dtd.h +0 -10
  209. data/ext/nokogiri/xml_element_content.h +0 -10
  210. data/ext/nokogiri/xml_element_decl.h +0 -9
  211. data/ext/nokogiri/xml_encoding_handler.h +0 -8
  212. data/ext/nokogiri/xml_entity_decl.h +0 -10
  213. data/ext/nokogiri/xml_entity_reference.h +0 -9
  214. data/ext/nokogiri/xml_io.c +0 -56
  215. data/ext/nokogiri/xml_io.h +0 -11
  216. data/ext/nokogiri/xml_libxml2_hacks.c +0 -112
  217. data/ext/nokogiri/xml_libxml2_hacks.h +0 -12
  218. data/ext/nokogiri/xml_namespace.h +0 -13
  219. data/ext/nokogiri/xml_node.h +0 -13
  220. data/ext/nokogiri/xml_node_set.h +0 -14
  221. data/ext/nokogiri/xml_processing_instruction.h +0 -9
  222. data/ext/nokogiri/xml_reader.h +0 -10
  223. data/ext/nokogiri/xml_relax_ng.h +0 -9
  224. data/ext/nokogiri/xml_sax_parser.h +0 -39
  225. data/ext/nokogiri/xml_sax_parser_context.h +0 -10
  226. data/ext/nokogiri/xml_sax_push_parser.h +0 -9
  227. data/ext/nokogiri/xml_schema.h +0 -9
  228. data/ext/nokogiri/xml_syntax_error.h +0 -13
  229. data/ext/nokogiri/xml_text.h +0 -9
  230. data/ext/nokogiri/xml_xpath_context.h +0 -10
  231. data/ext/nokogiri/xslt_stylesheet.h +0 -14
  232. data/lib/nokogiri/html/document.rb +0 -254
  233. data/lib/nokogiri/html/document_fragment.rb +0 -41
  234. data/lib/nokogiri/html/element_description_defaults.rb +0 -671
  235. data/lib/nokogiri/html/sax/parser_context.rb +0 -16
  236. data/lib/nokogiri/html/sax/push_parser.rb +0 -16
  237. data/tasks/cross_compile.rb +0 -150
  238. data/tasks/nokogiri.org.rb +0 -24
  239. data/tasks/test.rb +0 -95
  240. data/test/css/test_nthiness.rb +0 -159
  241. data/test/css/test_parser.rb +0 -341
  242. data/test/css/test_tokenizer.rb +0 -198
  243. data/test/css/test_xpath_visitor.rb +0 -91
  244. data/test/decorators/test_slop.rb +0 -16
  245. data/test/files/2ch.html +0 -108
  246. data/test/files/address_book.rlx +0 -12
  247. data/test/files/address_book.xml +0 -10
  248. data/test/files/bar/bar.xsd +0 -4
  249. data/test/files/dont_hurt_em_why.xml +0 -422
  250. data/test/files/encoding.html +0 -82
  251. data/test/files/encoding.xhtml +0 -84
  252. data/test/files/exslt.xml +0 -8
  253. data/test/files/exslt.xslt +0 -35
  254. data/test/files/foo/foo.xsd +0 -4
  255. data/test/files/metacharset.html +0 -10
  256. data/test/files/noencoding.html +0 -47
  257. data/test/files/po.xml +0 -32
  258. data/test/files/po.xsd +0 -66
  259. data/test/files/shift_jis.html +0 -10
  260. data/test/files/shift_jis.xml +0 -5
  261. data/test/files/snuggles.xml +0 -3
  262. data/test/files/staff.dtd +0 -10
  263. data/test/files/staff.xml +0 -59
  264. data/test/files/staff.xslt +0 -32
  265. data/test/files/test_document_url/bar.xml +0 -2
  266. data/test/files/test_document_url/document.dtd +0 -4
  267. data/test/files/test_document_url/document.xml +0 -6
  268. data/test/files/tlm.html +0 -850
  269. data/test/files/to_be_xincluded.xml +0 -2
  270. data/test/files/valid_bar.xml +0 -2
  271. data/test/files/xinclude.xml +0 -4
  272. data/test/helper.rb +0 -154
  273. data/test/html/sax/test_parser.rb +0 -141
  274. data/test/html/sax/test_parser_context.rb +0 -46
  275. data/test/html/test_builder.rb +0 -164
  276. data/test/html/test_document.rb +0 -552
  277. data/test/html/test_document_encoding.rb +0 -138
  278. data/test/html/test_document_fragment.rb +0 -261
  279. data/test/html/test_element_description.rb +0 -105
  280. data/test/html/test_named_characters.rb +0 -14
  281. data/test/html/test_node.rb +0 -196
  282. data/test/html/test_node_encoding.rb +0 -27
  283. data/test/namespaces/test_additional_namespaces_in_builder_doc.rb +0 -14
  284. data/test/namespaces/test_namespaces_in_builder_doc.rb +0 -75
  285. data/test/namespaces/test_namespaces_in_created_doc.rb +0 -75
  286. data/test/namespaces/test_namespaces_in_parsed_doc.rb +0 -66
  287. data/test/test_convert_xpath.rb +0 -135
  288. data/test/test_css_cache.rb +0 -45
  289. data/test/test_encoding_handler.rb +0 -46
  290. data/test/test_memory_leak.rb +0 -156
  291. data/test/test_nokogiri.rb +0 -132
  292. data/test/test_reader.rb +0 -555
  293. data/test/test_soap4r_sax.rb +0 -52
  294. data/test/test_xslt_transforms.rb +0 -254
  295. data/test/xml/node/test_save_options.rb +0 -28
  296. data/test/xml/node/test_subclass.rb +0 -44
  297. data/test/xml/sax/test_parser.rb +0 -366
  298. data/test/xml/sax/test_parser_context.rb +0 -106
  299. data/test/xml/sax/test_push_parser.rb +0 -157
  300. data/test/xml/test_attr.rb +0 -64
  301. data/test/xml/test_attribute_decl.rb +0 -86
  302. data/test/xml/test_builder.rb +0 -306
  303. data/test/xml/test_c14n.rb +0 -151
  304. data/test/xml/test_cdata.rb +0 -48
  305. data/test/xml/test_comment.rb +0 -29
  306. data/test/xml/test_document.rb +0 -828
  307. data/test/xml/test_document_encoding.rb +0 -28
  308. data/test/xml/test_document_fragment.rb +0 -223
  309. data/test/xml/test_dtd.rb +0 -103
  310. data/test/xml/test_dtd_encoding.rb +0 -33
  311. data/test/xml/test_element_content.rb +0 -56
  312. data/test/xml/test_element_decl.rb +0 -73
  313. data/test/xml/test_entity_decl.rb +0 -122
  314. data/test/xml/test_entity_reference.rb +0 -245
  315. data/test/xml/test_namespace.rb +0 -95
  316. data/test/xml/test_node.rb +0 -1137
  317. data/test/xml/test_node_attributes.rb +0 -96
  318. data/test/xml/test_node_encoding.rb +0 -107
  319. data/test/xml/test_node_inheritance.rb +0 -32
  320. data/test/xml/test_node_reparenting.rb +0 -374
  321. data/test/xml/test_node_set.rb +0 -755
  322. data/test/xml/test_parse_options.rb +0 -64
  323. data/test/xml/test_processing_instruction.rb +0 -30
  324. data/test/xml/test_reader_encoding.rb +0 -142
  325. data/test/xml/test_relax_ng.rb +0 -60
  326. data/test/xml/test_schema.rb +0 -103
  327. data/test/xml/test_syntax_error.rb +0 -12
  328. data/test/xml/test_text.rb +0 -45
  329. data/test/xml/test_unparented_node.rb +0 -422
  330. data/test/xml/test_xinclude.rb +0 -83
  331. data/test/xml/test_xpath.rb +0 -295
  332. data/test/xslt/test_custom_functions.rb +0 -133
  333. data/test/xslt/test_exception_handling.rb +0 -37
  334. data/test_all +0 -81
@@ -1,29 +1,71 @@
1
- #include <xml_document.h>
1
+ #include <nokogiri.h>
2
2
 
3
- static int dealloc_node_i(xmlNodePtr key, xmlNodePtr node, xmlDocPtr doc)
3
+ VALUE cNokogiriXmlDocument ;
4
+
5
+ static int
6
+ dealloc_node_i2(xmlNodePtr key, xmlNodePtr node, xmlDocPtr doc)
4
7
  {
5
- switch(node->type) {
6
- case XML_ATTRIBUTE_NODE:
7
- xmlFreePropList((xmlAttrPtr)node);
8
- break;
9
- case XML_NAMESPACE_DECL:
10
- xmlFree(node);
11
- break;
12
- default:
13
- if(node->parent == NULL) {
14
- xmlAddChild((xmlNodePtr)doc, node);
15
- }
8
+ switch (node->type) {
9
+ case XML_ATTRIBUTE_NODE:
10
+ xmlFreePropList((xmlAttrPtr)node);
11
+ break;
12
+ case XML_NAMESPACE_DECL:
13
+ xmlFreeNs((xmlNsPtr)node);
14
+ break;
15
+ case XML_DTD_NODE:
16
+ xmlFreeDtd((xmlDtdPtr)node);
17
+ break;
18
+ default:
19
+ if (node->parent == NULL) {
20
+ xmlAddChild((xmlNodePtr)doc, node);
21
+ }
16
22
  }
17
23
  return ST_CONTINUE;
18
24
  }
19
25
 
20
- static void dealloc(xmlDocPtr doc)
26
+ static int
27
+ dealloc_node_i(st_data_t key, st_data_t node, st_data_t doc)
28
+ {
29
+ return dealloc_node_i2((xmlNodePtr)key, (xmlNodePtr)node, (xmlDocPtr)doc);
30
+ }
31
+
32
+ static void
33
+ remove_private(xmlNodePtr node)
34
+ {
35
+ xmlNodePtr child;
36
+
37
+ for (child = node->children; child; child = child->next) {
38
+ remove_private(child);
39
+ }
40
+
41
+ if ((node->type == XML_ELEMENT_NODE ||
42
+ node->type == XML_XINCLUDE_START ||
43
+ node->type == XML_XINCLUDE_END) &&
44
+ node->properties) {
45
+ for (child = (xmlNodePtr)node->properties; child; child = child->next) {
46
+ remove_private(child);
47
+ }
48
+ }
49
+
50
+ node->_private = NULL;
51
+ }
52
+
53
+ static void
54
+ mark(xmlDocPtr doc)
55
+ {
56
+ nokogiriTuplePtr tuple = (nokogiriTuplePtr)doc->_private;
57
+ if (tuple) {
58
+ rb_gc_mark(tuple->doc);
59
+ rb_gc_mark(tuple->node_cache);
60
+ }
61
+ }
62
+
63
+ static void
64
+ dealloc(xmlDocPtr doc)
21
65
  {
22
- xmlDeregisterNodeFunc func;
23
66
  st_table *node_hash;
24
67
 
25
68
  NOKOGIRI_DEBUG_START(doc);
26
- func = xmlDeregisterNodeDefault(NULL);
27
69
 
28
70
  node_hash = DOC_UNLINKED_NODE_HASH(doc);
29
71
 
@@ -31,22 +73,32 @@ static void dealloc(xmlDocPtr doc)
31
73
  st_free_table(node_hash);
32
74
 
33
75
  free(doc->_private);
34
- doc->_private = NULL;
76
+
77
+ /* When both Nokogiri and libxml-ruby are loaded, make sure that all nodes
78
+ * have their _private pointers cleared. This is to avoid libxml-ruby's
79
+ * xmlDeregisterNode callback from accessing VALUE pointers from ruby's GC
80
+ * free context, which can result in segfaults.
81
+ */
82
+ if (xmlDeregisterNodeDefaultValue) {
83
+ remove_private((xmlNodePtr)doc);
84
+ }
85
+
35
86
  xmlFreeDoc(doc);
36
87
 
37
- xmlDeregisterNodeDefault(func);
38
88
  NOKOGIRI_DEBUG_END(doc);
39
89
  }
40
90
 
41
- static void recursively_remove_namespaces_from_node(xmlNodePtr node)
91
+ static void
92
+ recursively_remove_namespaces_from_node(xmlNodePtr node)
42
93
  {
43
94
  xmlNodePtr child ;
44
95
  xmlAttrPtr property ;
45
96
 
46
97
  xmlSetNs(node, NULL);
47
98
 
48
- for (child = node->children ; child ; child = child->next)
99
+ for (child = node->children ; child ; child = child->next) {
49
100
  recursively_remove_namespaces_from_node(child);
101
+ }
50
102
 
51
103
  if (((node->type == XML_ELEMENT_NODE) ||
52
104
  (node->type == XML_XINCLUDE_START) ||
@@ -59,7 +111,7 @@ static void recursively_remove_namespaces_from_node(xmlNodePtr node)
59
111
  if (node->type == XML_ELEMENT_NODE && node->properties != NULL) {
60
112
  property = node->properties ;
61
113
  while (property != NULL) {
62
- if (property->ns) property->ns = NULL ;
114
+ if (property->ns) { property->ns = NULL ; }
63
115
  property = property->next ;
64
116
  }
65
117
  }
@@ -71,12 +123,13 @@ static void recursively_remove_namespaces_from_node(xmlNodePtr node)
71
123
  *
72
124
  * Get the url name for this document.
73
125
  */
74
- static VALUE url(VALUE self)
126
+ static VALUE
127
+ url(VALUE self)
75
128
  {
76
129
  xmlDocPtr doc;
77
130
  Data_Get_Struct(self, xmlDoc, doc);
78
131
 
79
- if(doc->URL) return NOKOGIRI_STR_NEW2(doc->URL);
132
+ if (doc->URL) { return NOKOGIRI_STR_NEW2(doc->URL); }
80
133
 
81
134
  return Qnil;
82
135
  }
@@ -87,42 +140,42 @@ static VALUE url(VALUE self)
87
140
  *
88
141
  * Set the root element on this document
89
142
  */
90
- static VALUE set_root(VALUE self, VALUE root)
143
+ static VALUE
144
+ rb_xml_document_root_set(VALUE self, VALUE rb_new_root)
91
145
  {
92
- xmlDocPtr doc;
93
- xmlNodePtr new_root;
94
- xmlNodePtr old_root;
146
+ xmlDocPtr c_document;
147
+ xmlNodePtr c_new_root = NULL, c_current_root;
95
148
 
96
- Data_Get_Struct(self, xmlDoc, doc);
97
-
98
- old_root = NULL;
99
-
100
- if(NIL_P(root)) {
101
- old_root = xmlDocGetRootElement(doc);
102
-
103
- if(old_root) {
104
- xmlUnlinkNode(old_root);
105
- nokogiri_root_node(old_root);
106
- }
149
+ Data_Get_Struct(self, xmlDoc, c_document);
107
150
 
108
- return root;
151
+ c_current_root = xmlDocGetRootElement(c_document);
152
+ if (c_current_root) {
153
+ xmlUnlinkNode(c_current_root);
154
+ noko_xml_document_pin_node(c_current_root);
109
155
  }
110
156
 
111
- Data_Get_Struct(root, xmlNode, new_root);
157
+ if (!NIL_P(rb_new_root)) {
158
+ if (!rb_obj_is_kind_of(rb_new_root, cNokogiriXmlNode)) {
159
+ rb_raise(rb_eArgError,
160
+ "expected Nokogiri::XML::Node but received %"PRIsVALUE,
161
+ rb_obj_class(rb_new_root));
162
+ }
112
163
 
164
+ Data_Get_Struct(rb_new_root, xmlNode, c_new_root);
113
165
 
114
- /* If the new root's document is not the same as the current document,
115
- * then we need to dup the node in to this document. */
116
- if(new_root->doc != doc) {
117
- old_root = xmlDocGetRootElement(doc);
118
- if (!(new_root = xmlDocCopyNode(new_root, doc, 1))) {
119
- rb_raise(rb_eRuntimeError, "Could not reparent node (xmlDocCopyNode)");
166
+ /* If the new root's document is not the same as the current document,
167
+ * then we need to dup the node in to this document. */
168
+ if (c_new_root->doc != c_document) {
169
+ c_new_root = xmlDocCopyNode(c_new_root, c_document, 1);
170
+ if (!c_new_root) {
171
+ rb_raise(rb_eRuntimeError, "Could not reparent node (xmlDocCopyNode)");
172
+ }
120
173
  }
121
174
  }
122
175
 
123
- xmlDocSetRootElement(doc, new_root);
124
- if(old_root) nokogiri_root_node(old_root);
125
- return root;
176
+ xmlDocSetRootElement(c_document, c_new_root);
177
+
178
+ return rb_new_root;
126
179
  }
127
180
 
128
181
  /*
@@ -131,17 +184,20 @@ static VALUE set_root(VALUE self, VALUE root)
131
184
  *
132
185
  * Get the root node for this document.
133
186
  */
134
- static VALUE root(VALUE self)
187
+ static VALUE
188
+ rb_xml_document_root(VALUE self)
135
189
  {
136
- xmlDocPtr doc;
137
- xmlNodePtr root;
190
+ xmlDocPtr c_document;
191
+ xmlNodePtr c_root;
138
192
 
139
- Data_Get_Struct(self, xmlDoc, doc);
193
+ Data_Get_Struct(self, xmlDoc, c_document);
140
194
 
141
- root = xmlDocGetRootElement(doc);
195
+ c_root = xmlDocGetRootElement(c_document);
196
+ if (!c_root) {
197
+ return Qnil;
198
+ }
142
199
 
143
- if(!root) return Qnil;
144
- return Nokogiri_wrap_xml_node(Qnil, root) ;
200
+ return noko_xml_node_wrap(Qnil, c_root) ;
145
201
  }
146
202
 
147
203
  /*
@@ -150,15 +206,17 @@ static VALUE root(VALUE self)
150
206
  *
151
207
  * Set the encoding string for this Document
152
208
  */
153
- static VALUE set_encoding(VALUE self, VALUE encoding)
209
+ static VALUE
210
+ set_encoding(VALUE self, VALUE encoding)
154
211
  {
155
212
  xmlDocPtr doc;
156
213
  Data_Get_Struct(self, xmlDoc, doc);
157
214
 
158
- if (doc->encoding)
159
- free((char *) doc->encoding); /* this may produce a gcc cast warning */
215
+ if (doc->encoding) {
216
+ xmlFree(DISCARD_CONST_QUAL_XMLCHAR(doc->encoding));
217
+ }
160
218
 
161
- doc->encoding = xmlStrdup((xmlChar *)StringValuePtr(encoding));
219
+ doc->encoding = xmlStrdup((xmlChar *)StringValueCStr(encoding));
162
220
 
163
221
  return encoding;
164
222
  }
@@ -169,12 +227,13 @@ static VALUE set_encoding(VALUE self, VALUE encoding)
169
227
  *
170
228
  * Get the encoding for this Document
171
229
  */
172
- static VALUE encoding(VALUE self)
230
+ static VALUE
231
+ encoding(VALUE self)
173
232
  {
174
233
  xmlDocPtr doc;
175
234
  Data_Get_Struct(self, xmlDoc, doc);
176
235
 
177
- if(!doc->encoding) return Qnil;
236
+ if (!doc->encoding) { return Qnil; }
178
237
  return NOKOGIRI_STR_NEW2(doc->encoding);
179
238
  }
180
239
 
@@ -184,12 +243,13 @@ static VALUE encoding(VALUE self)
184
243
  *
185
244
  * Get the XML version for this Document
186
245
  */
187
- static VALUE version(VALUE self)
246
+ static VALUE
247
+ version(VALUE self)
188
248
  {
189
249
  xmlDocPtr doc;
190
250
  Data_Get_Struct(self, xmlDoc, doc);
191
251
 
192
- if(!doc->version) return Qnil;
252
+ if (!doc->version) { return Qnil; }
193
253
  return NOKOGIRI_STR_NEW2(doc->version);
194
254
  }
195
255
 
@@ -199,14 +259,15 @@ static VALUE version(VALUE self)
199
259
  *
200
260
  * Create a new document from an IO object
201
261
  */
202
- static VALUE read_io( VALUE klass,
203
- VALUE io,
204
- VALUE url,
205
- VALUE encoding,
206
- VALUE options )
262
+ static VALUE
263
+ read_io(VALUE klass,
264
+ VALUE io,
265
+ VALUE url,
266
+ VALUE encoding,
267
+ VALUE options)
207
268
  {
208
- const char * c_url = NIL_P(url) ? NULL : StringValuePtr(url);
209
- const char * c_enc = NIL_P(encoding) ? NULL : StringValuePtr(encoding);
269
+ const char *c_url = NIL_P(url) ? NULL : StringValueCStr(url);
270
+ const char *c_enc = NIL_P(encoding) ? NULL : StringValueCStr(encoding);
210
271
  VALUE error_list = rb_ary_new();
211
272
  VALUE document;
212
273
  xmlDocPtr doc;
@@ -215,30 +276,31 @@ static VALUE read_io( VALUE klass,
215
276
  xmlSetStructuredErrorFunc((void *)error_list, Nokogiri_error_array_pusher);
216
277
 
217
278
  doc = xmlReadIO(
218
- (xmlInputReadCallback)io_read_callback,
219
- (xmlInputCloseCallback)io_close_callback,
220
- (void *)io,
221
- c_url,
222
- c_enc,
223
- (int)NUM2INT(options)
224
- );
279
+ (xmlInputReadCallback)noko_io_read,
280
+ (xmlInputCloseCallback)noko_io_close,
281
+ (void *)io,
282
+ c_url,
283
+ c_enc,
284
+ (int)NUM2INT(options)
285
+ );
225
286
  xmlSetStructuredErrorFunc(NULL, NULL);
226
287
 
227
- if(doc == NULL) {
288
+ if (doc == NULL) {
228
289
  xmlErrorPtr error;
229
290
 
230
291
  xmlFreeDoc(doc);
231
292
 
232
293
  error = xmlGetLastError();
233
- if(error)
234
- rb_exc_raise(Nokogiri_wrap_xml_syntax_error((VALUE)NULL, error));
235
- else
294
+ if (error) {
295
+ rb_exc_raise(Nokogiri_wrap_xml_syntax_error(error));
296
+ } else {
236
297
  rb_raise(rb_eRuntimeError, "Could not parse document");
298
+ }
237
299
 
238
300
  return Qnil;
239
301
  }
240
302
 
241
- document = Nokogiri_wrap_xml_document(klass, doc);
303
+ document = noko_xml_document_wrap(klass, doc);
242
304
  rb_iv_set(document, "@errors", error_list);
243
305
  return document;
244
306
  }
@@ -249,15 +311,16 @@ static VALUE read_io( VALUE klass,
249
311
  *
250
312
  * Create a new document from a String
251
313
  */
252
- static VALUE read_memory( VALUE klass,
253
- VALUE string,
254
- VALUE url,
255
- VALUE encoding,
256
- VALUE options )
314
+ static VALUE
315
+ read_memory(VALUE klass,
316
+ VALUE string,
317
+ VALUE url,
318
+ VALUE encoding,
319
+ VALUE options)
257
320
  {
258
- const char * c_buffer = StringValuePtr(string);
259
- const char * c_url = NIL_P(url) ? NULL : StringValuePtr(url);
260
- const char * c_enc = NIL_P(encoding) ? NULL : StringValuePtr(encoding);
321
+ const char *c_buffer = StringValuePtr(string);
322
+ const char *c_url = NIL_P(url) ? NULL : StringValueCStr(url);
323
+ const char *c_enc = NIL_P(encoding) ? NULL : StringValueCStr(encoding);
261
324
  int len = (int)RSTRING_LEN(string);
262
325
  VALUE error_list = rb_ary_new();
263
326
  VALUE document;
@@ -268,21 +331,22 @@ static VALUE read_memory( VALUE klass,
268
331
  doc = xmlReadMemory(c_buffer, len, c_url, c_enc, (int)NUM2INT(options));
269
332
  xmlSetStructuredErrorFunc(NULL, NULL);
270
333
 
271
- if(doc == NULL) {
334
+ if (doc == NULL) {
272
335
  xmlErrorPtr error;
273
336
 
274
337
  xmlFreeDoc(doc);
275
338
 
276
339
  error = xmlGetLastError();
277
- if(error)
278
- rb_exc_raise(Nokogiri_wrap_xml_syntax_error((VALUE)NULL, error));
279
- else
340
+ if (error) {
341
+ rb_exc_raise(Nokogiri_wrap_xml_syntax_error(error));
342
+ } else {
280
343
  rb_raise(rb_eRuntimeError, "Could not parse document");
344
+ }
281
345
 
282
346
  return Qnil;
283
347
  }
284
348
 
285
- document = Nokogiri_wrap_xml_document(klass, doc);
349
+ document = noko_xml_document_wrap(klass, doc);
286
350
  rb_iv_set(document, "@errors", error_list);
287
351
  return document;
288
352
  }
@@ -294,21 +358,27 @@ static VALUE read_memory( VALUE klass,
294
358
  * Copy this Document. An optional depth may be passed in, but it defaults
295
359
  * to a deep copy. 0 is a shallow copy, 1 is a deep copy.
296
360
  */
297
- static VALUE duplicate_node(int argc, VALUE *argv, VALUE self)
361
+ static VALUE
362
+ duplicate_document(int argc, VALUE *argv, VALUE self)
298
363
  {
299
364
  xmlDocPtr doc, dup;
365
+ VALUE copy;
300
366
  VALUE level;
301
367
 
302
- if(rb_scan_args(argc, argv, "01", &level) == 0)
368
+ if (rb_scan_args(argc, argv, "01", &level) == 0) {
303
369
  level = INT2NUM((long)1);
370
+ }
304
371
 
305
372
  Data_Get_Struct(self, xmlDoc, doc);
306
373
 
307
374
  dup = xmlCopyDoc(doc, (int)NUM2INT(level));
308
- if(dup == NULL) return Qnil;
375
+
376
+ if (dup == NULL) { return Qnil; }
309
377
 
310
378
  dup->type = doc->type;
311
- return Nokogiri_wrap_xml_document(rb_obj_class(self), dup);
379
+ copy = noko_xml_document_wrap(rb_obj_class(self), dup);
380
+ rb_iv_set(copy, "@errors", rb_iv_get(self, "@errors"));
381
+ return copy ;
312
382
  }
313
383
 
314
384
  /*
@@ -317,18 +387,18 @@ static VALUE duplicate_node(int argc, VALUE *argv, VALUE self)
317
387
  *
318
388
  * Create a new document with +version+ (defaults to "1.0")
319
389
  */
320
- static VALUE new(int argc, VALUE *argv, VALUE klass)
390
+ static VALUE
391
+ new (int argc, VALUE *argv, VALUE klass)
321
392
  {
322
393
  xmlDocPtr doc;
323
394
  VALUE version, rest, rb_doc ;
324
395
 
325
396
  rb_scan_args(argc, argv, "0*", &rest);
326
397
  version = rb_ary_entry(rest, (long)0);
327
- if (NIL_P(version)) version = rb_str_new2("1.0");
398
+ if (NIL_P(version)) { version = rb_str_new2("1.0"); }
328
399
 
329
- doc = xmlNewDoc((xmlChar *)StringValuePtr(version));
330
- rb_doc = Nokogiri_wrap_xml_document(klass, doc);
331
- rb_obj_call_init(rb_doc, argc, argv);
400
+ doc = xmlNewDoc((xmlChar *)StringValueCStr(version));
401
+ rb_doc = noko_xml_document_wrap_with_init_args(klass, doc, argc, argv);
332
402
  return rb_doc ;
333
403
  }
334
404
 
@@ -354,13 +424,13 @@ static VALUE new(int argc, VALUE *argv, VALUE klass)
354
424
  * </bicycle>
355
425
  * </root>
356
426
  * EOXML
357
- *
427
+ *
358
428
  * doc.xpath("//tire").to_s # => ""
359
429
  * doc.xpath("//part:tire", "part" => "http://general-motors.com/").to_s # => "<part:tire>Michelin Model XGV</part:tire>"
360
430
  * doc.xpath("//part:tire", "part" => "http://schwinn.com/").to_s # => "<part:tire>I'm a bicycle tire!</part:tire>"
361
- *
431
+ *
362
432
  * doc.remove_namespaces!
363
- *
433
+ *
364
434
  * doc.xpath("//tire").to_s # => "<tire>Michelin Model XGV</tire><tire>I'm a bicycle tire!</tire>"
365
435
  * doc.xpath("//part:tire", "part" => "http://general-motors.com/").to_s # => ""
366
436
  * doc.xpath("//part:tire", "part" => "http://schwinn.com/").to_s # => ""
@@ -369,7 +439,8 @@ static VALUE new(int argc, VALUE *argv, VALUE klass)
369
439
  * please direct your browser to
370
440
  * http://tenderlovemaking.com/2009/04/23/namespaces-in-xml.html
371
441
  */
372
- VALUE remove_namespaces_bang(VALUE self)
442
+ static VALUE
443
+ remove_namespaces_bang(VALUE self)
373
444
  {
374
445
  xmlDocPtr doc ;
375
446
  Data_Get_Struct(self, xmlDoc, doc);
@@ -389,7 +460,8 @@ VALUE remove_namespaces_bang(VALUE self)
389
460
  * +external_id+, +system_id+, and +content+ set the External ID, System ID,
390
461
  * and content respectively. All of these parameters are optional.
391
462
  */
392
- static VALUE create_entity(int argc, VALUE *argv, VALUE self)
463
+ static VALUE
464
+ create_entity(int argc, VALUE *argv, VALUE self)
393
465
  {
394
466
  VALUE name;
395
467
  VALUE type;
@@ -402,52 +474,50 @@ static VALUE create_entity(int argc, VALUE *argv, VALUE self)
402
474
  Data_Get_Struct(self, xmlDoc, doc);
403
475
 
404
476
  rb_scan_args(argc, argv, "14", &name, &type, &external_id, &system_id,
405
- &content);
477
+ &content);
406
478
 
407
479
  xmlResetLastError();
408
480
  ptr = xmlAddDocEntity(
409
- doc,
410
- (xmlChar *)(NIL_P(name) ? NULL : StringValuePtr(name)),
411
- (int) (NIL_P(type) ? XML_INTERNAL_GENERAL_ENTITY : NUM2INT(type)),
412
- (xmlChar *)(NIL_P(external_id) ? NULL : StringValuePtr(external_id)),
413
- (xmlChar *)(NIL_P(system_id) ? NULL : StringValuePtr(system_id)),
414
- (xmlChar *)(NIL_P(content) ? NULL : StringValuePtr(content))
415
- );
416
-
417
- if(NULL == ptr) {
481
+ doc,
482
+ (xmlChar *)(NIL_P(name) ? NULL : StringValueCStr(name)),
483
+ (int)(NIL_P(type) ? XML_INTERNAL_GENERAL_ENTITY : NUM2INT(type)),
484
+ (xmlChar *)(NIL_P(external_id) ? NULL : StringValueCStr(external_id)),
485
+ (xmlChar *)(NIL_P(system_id) ? NULL : StringValueCStr(system_id)),
486
+ (xmlChar *)(NIL_P(content) ? NULL : StringValueCStr(content))
487
+ );
488
+
489
+ if (NULL == ptr) {
418
490
  xmlErrorPtr error = xmlGetLastError();
419
- if(error)
420
- rb_exc_raise(Nokogiri_wrap_xml_syntax_error((VALUE)NULL, error));
421
- else
491
+ if (error) {
492
+ rb_exc_raise(Nokogiri_wrap_xml_syntax_error(error));
493
+ } else {
422
494
  rb_raise(rb_eRuntimeError, "Could not create entity");
495
+ }
423
496
 
424
497
  return Qnil;
425
498
  }
426
499
 
427
- return Nokogiri_wrap_xml_node(cNokogiriXmlEntityDecl, (xmlNodePtr)ptr);
500
+ return noko_xml_node_wrap(cNokogiriXmlEntityDecl, (xmlNodePtr)ptr);
428
501
  }
429
502
 
430
- static int block_caller(void * ctx, xmlNodePtr _node, xmlNodePtr _parent)
503
+ static int
504
+ block_caller(void *ctx, xmlNodePtr c_node, xmlNodePtr c_parent_node)
431
505
  {
432
- VALUE block;
433
- VALUE node;
434
- VALUE parent;
506
+ VALUE block = (VALUE)ctx;
507
+ VALUE rb_node;
508
+ VALUE rb_parent_node;
435
509
  VALUE ret;
436
510
 
437
- if(_node->type == XML_NAMESPACE_DECL){
438
- node = Nokogiri_wrap_xml_namespace(_parent->doc, (xmlNsPtr) _node);
511
+ if (c_node->type == XML_NAMESPACE_DECL) {
512
+ rb_node = noko_xml_namespace_wrap((xmlNsPtr)c_node, c_parent_node->doc);
513
+ } else {
514
+ rb_node = noko_xml_node_wrap(Qnil, c_node);
439
515
  }
440
- else{
441
- node = Nokogiri_wrap_xml_node(Qnil, _node);
442
- }
443
- parent = _parent ? Nokogiri_wrap_xml_node(Qnil, _parent) : Qnil;
444
- block = (VALUE)ctx;
445
-
446
- ret = rb_funcall(block, rb_intern("call"), 2, node, parent);
516
+ rb_parent_node = c_parent_node ? noko_xml_node_wrap(Qnil, c_parent_node) : Qnil;
447
517
 
448
- if(Qfalse == ret || Qnil == ret) return 0;
518
+ ret = rb_funcall(block, rb_intern("call"), 2, rb_node, rb_parent_node);
449
519
 
450
- return 1;
520
+ return (Qfalse == ret || Qnil == ret) ? 0 : 1;
451
521
  }
452
522
 
453
523
  /* call-seq:
@@ -455,122 +525,156 @@ static int block_caller(void * ctx, xmlNodePtr _node, xmlNodePtr _parent)
455
525
  * doc.canonicalize { |obj, parent| ... }
456
526
  *
457
527
  * Canonicalize a document and return the results. Takes an optional block
458
- * that takes two parameters: the +obj+ and that node's +parent+.
528
+ * that takes two parameters: the +obj+ and that node's +parent+.
459
529
  * The +obj+ will be either a Nokogiri::XML::Node, or a Nokogiri::XML::Namespace
460
- * The block must return a non-nil, non-false value if the +obj+ passed in
530
+ * The block must return a non-nil, non-false value if the +obj+ passed in
461
531
  * should be included in the canonicalized document.
462
532
  */
463
- static VALUE canonicalize(int argc, VALUE* argv, VALUE self)
533
+ static VALUE
534
+ rb_xml_document_canonicalize(int argc, VALUE *argv, VALUE self)
464
535
  {
465
- VALUE mode;
466
- VALUE incl_ns;
467
- VALUE with_comments;
468
- xmlChar **ns;
469
- long ns_len, i;
536
+ VALUE rb_mode;
537
+ VALUE rb_namespaces;
538
+ VALUE rb_comments_p;
539
+ xmlChar **c_namespaces;
470
540
 
471
- xmlDocPtr doc;
472
- xmlOutputBufferPtr buf;
473
- xmlC14NIsVisibleCallback cb = NULL;
474
- void * ctx = NULL;
541
+ xmlDocPtr c_doc;
542
+ xmlOutputBufferPtr c_obuf;
543
+ xmlC14NIsVisibleCallback c_callback_wrapper = NULL;
544
+ void *rb_callback = NULL;
475
545
 
476
546
  VALUE rb_cStringIO;
477
- VALUE io;
547
+ VALUE rb_io;
478
548
 
479
- rb_scan_args(argc, argv, "03", &mode, &incl_ns, &with_comments);
549
+ rb_scan_args(argc, argv, "03", &rb_mode, &rb_namespaces, &rb_comments_p);
550
+ if (!NIL_P(rb_mode)) { Check_Type(rb_mode, T_FIXNUM); }
551
+ if (!NIL_P(rb_namespaces)) { Check_Type(rb_namespaces, T_ARRAY); }
480
552
 
481
- Data_Get_Struct(self, xmlDoc, doc);
553
+ Data_Get_Struct(self, xmlDoc, c_doc);
482
554
 
483
555
  rb_cStringIO = rb_const_get_at(rb_cObject, rb_intern("StringIO"));
484
- io = rb_class_new_instance(0, 0, rb_cStringIO);
485
- buf = xmlAllocOutputBuffer(NULL);
556
+ rb_io = rb_class_new_instance(0, 0, rb_cStringIO);
557
+ c_obuf = xmlAllocOutputBuffer(NULL);
486
558
 
487
- buf->writecallback = (xmlOutputWriteCallback)io_write_callback;
488
- buf->closecallback = (xmlOutputCloseCallback)io_close_callback;
489
- buf->context = (void *)io;
559
+ c_obuf->writecallback = (xmlOutputWriteCallback)noko_io_write;
560
+ c_obuf->closecallback = (xmlOutputCloseCallback)noko_io_close;
561
+ c_obuf->context = (void *)rb_io;
490
562
 
491
- if(rb_block_given_p()) {
492
- cb = block_caller;
493
- ctx = (void *)rb_block_proc();
563
+ if (rb_block_given_p()) {
564
+ c_callback_wrapper = block_caller;
565
+ rb_callback = (void *)rb_block_proc();
494
566
  }
495
567
 
496
- if(NIL_P(incl_ns)){
497
- ns = NULL;
498
- }
499
- else{
500
- ns_len = RARRAY_LEN(incl_ns);
501
- ns = calloc((size_t)ns_len+1, sizeof(xmlChar *));
502
- for (i = 0 ; i < ns_len ; i++) {
503
- VALUE entry = rb_ary_entry(incl_ns, i);
504
- const char * ptr = StringValuePtr(entry);
505
- ns[i] = (xmlChar*) ptr;
568
+ if (NIL_P(rb_namespaces)) {
569
+ c_namespaces = NULL;
570
+ } else {
571
+ long ns_len = RARRAY_LEN(rb_namespaces);
572
+ c_namespaces = calloc((size_t)ns_len + 1, sizeof(xmlChar *));
573
+ for (int j = 0 ; j < ns_len ; j++) {
574
+ VALUE entry = rb_ary_entry(rb_namespaces, j);
575
+ c_namespaces[j] = (xmlChar *)StringValueCStr(entry);
506
576
  }
507
577
  }
508
578
 
579
+ xmlC14NExecute(c_doc, c_callback_wrapper, rb_callback,
580
+ (int)(NIL_P(rb_mode) ? 0 : NUM2INT(rb_mode)),
581
+ c_namespaces,
582
+ (int)RTEST(rb_comments_p),
583
+ c_obuf);
584
+
585
+ free(c_namespaces);
586
+ xmlOutputBufferClose(c_obuf);
587
+
588
+ return rb_funcall(rb_io, rb_intern("string"), 0);
589
+ }
590
+
591
+ VALUE
592
+ noko_xml_document_wrap_with_init_args(VALUE klass, xmlDocPtr c_document, int argc, VALUE *argv)
593
+ {
594
+ VALUE rb_document;
595
+ nokogiriTuplePtr tuple;
596
+
597
+ if (!klass) {
598
+ klass = cNokogiriXmlDocument;
599
+ }
600
+
601
+ rb_document = Data_Wrap_Struct(klass, mark, dealloc, c_document);
602
+
603
+ tuple = (nokogiriTuplePtr)malloc(sizeof(nokogiriTuple));
604
+ tuple->doc = rb_document;
605
+ tuple->unlinkedNodes = st_init_numtable_with_size(128);
606
+ tuple->node_cache = rb_ary_new();
509
607
 
510
- xmlC14NExecute(doc, cb, ctx,
511
- (int) (NIL_P(mode) ? 0 : NUM2INT(mode)),
512
- ns,
513
- (int) (NIL_P(with_comments) ? 0 : 1),
514
- buf);
608
+ c_document->_private = tuple ;
515
609
 
516
- xmlOutputBufferClose(buf);
610
+ rb_iv_set(rb_document, "@decorators", Qnil);
611
+ rb_iv_set(rb_document, "@errors", Qnil);
612
+ rb_iv_set(rb_document, "@node_cache", tuple->node_cache);
517
613
 
518
- return rb_funcall(io, rb_intern("string"), 0);
614
+ rb_obj_call_init(rb_document, argc, argv);
615
+
616
+ return rb_document ;
519
617
  }
520
618
 
521
- VALUE cNokogiriXmlDocument ;
522
- void init_xml_document()
619
+
620
+ /* deprecated. use noko_xml_document_wrap() instead. */
621
+ VALUE
622
+ Nokogiri_wrap_xml_document(VALUE klass, xmlDocPtr doc)
523
623
  {
524
- VALUE nokogiri = rb_define_module("Nokogiri");
525
- VALUE xml = rb_define_module_under(nokogiri, "XML");
526
- VALUE node = rb_define_class_under(xml, "Node", rb_cObject);
624
+ /* TODO: deprecate this method in v2.0 */
625
+ return noko_xml_document_wrap_with_init_args(klass, doc, 0, NULL);
626
+ }
527
627
 
528
- /*
529
- * Nokogiri::XML::Document wraps an xml document.
530
- */
531
- VALUE klass = rb_define_class_under(xml, "Document", node);
532
-
533
- cNokogiriXmlDocument = klass;
534
-
535
- rb_define_singleton_method(klass, "read_memory", read_memory, 4);
536
- rb_define_singleton_method(klass, "read_io", read_io, 4);
537
- rb_define_singleton_method(klass, "new", new, -1);
538
-
539
- rb_define_method(klass, "root", root, 0);
540
- rb_define_method(klass, "root=", set_root, 1);
541
- rb_define_method(klass, "encoding", encoding, 0);
542
- rb_define_method(klass, "encoding=", set_encoding, 1);
543
- rb_define_method(klass, "version", version, 0);
544
- rb_define_method(klass, "canonicalize", canonicalize, -1);
545
- rb_define_method(klass, "dup", duplicate_node, -1);
546
- rb_define_method(klass, "url", url, 0);
547
- rb_define_method(klass, "create_entity", create_entity, -1);
548
- rb_define_method(klass, "remove_namespaces!", remove_namespaces_bang, 0);
628
+ VALUE
629
+ noko_xml_document_wrap(VALUE klass, xmlDocPtr doc)
630
+ {
631
+ return noko_xml_document_wrap_with_init_args(klass, doc, 0, NULL);
549
632
  }
550
633
 
551
634
 
552
- /* this takes klass as a param because it's used for HtmlDocument, too. */
553
- VALUE Nokogiri_wrap_xml_document(VALUE klass, xmlDocPtr doc)
635
+ void
636
+ noko_xml_document_pin_node(xmlNodePtr node)
554
637
  {
555
- nokogiriTuplePtr tuple = (nokogiriTuplePtr)malloc(sizeof(nokogiriTuple));
638
+ xmlDocPtr doc;
639
+ nokogiriTuplePtr tuple;
556
640
 
557
- VALUE rb_doc = Data_Wrap_Struct(
558
- klass ? klass : cNokogiriXmlDocument,
559
- 0,
560
- dealloc,
561
- doc
562
- );
641
+ doc = node->doc;
642
+ tuple = (nokogiriTuplePtr)doc->_private;
643
+ st_insert(tuple->unlinkedNodes, (st_data_t)node, (st_data_t)node);
644
+ }
563
645
 
564
- VALUE cache = rb_ary_new();
565
- rb_iv_set(rb_doc, "@decorators", Qnil);
566
- rb_iv_set(rb_doc, "@node_cache", cache);
567
646
 
568
- tuple->doc = rb_doc;
569
- tuple->unlinkedNodes = st_init_numtable_with_size(128);
570
- tuple->node_cache = cache;
571
- doc->_private = tuple ;
647
+ void
648
+ noko_xml_document_pin_namespace(xmlNsPtr ns, xmlDocPtr doc)
649
+ {
650
+ nokogiriTuplePtr tuple;
572
651
 
573
- rb_obj_call_init(rb_doc, 0, NULL);
652
+ tuple = (nokogiriTuplePtr)doc->_private;
653
+ st_insert(tuple->unlinkedNodes, (st_data_t)ns, (st_data_t)ns);
654
+ }
574
655
 
575
- return rb_doc ;
656
+
657
+ void
658
+ noko_init_xml_document()
659
+ {
660
+ assert(cNokogiriXmlNode);
661
+ /*
662
+ * Nokogiri::XML::Document wraps an xml document.
663
+ */
664
+ cNokogiriXmlDocument = rb_define_class_under(mNokogiriXml, "Document", cNokogiriXmlNode);
665
+
666
+ rb_define_singleton_method(cNokogiriXmlDocument, "read_memory", read_memory, 4);
667
+ rb_define_singleton_method(cNokogiriXmlDocument, "read_io", read_io, 4);
668
+ rb_define_singleton_method(cNokogiriXmlDocument, "new", new, -1);
669
+
670
+ rb_define_method(cNokogiriXmlDocument, "root", rb_xml_document_root, 0);
671
+ rb_define_method(cNokogiriXmlDocument, "root=", rb_xml_document_root_set, 1);
672
+ rb_define_method(cNokogiriXmlDocument, "encoding", encoding, 0);
673
+ rb_define_method(cNokogiriXmlDocument, "encoding=", set_encoding, 1);
674
+ rb_define_method(cNokogiriXmlDocument, "version", version, 0);
675
+ rb_define_method(cNokogiriXmlDocument, "canonicalize", rb_xml_document_canonicalize, -1);
676
+ rb_define_method(cNokogiriXmlDocument, "dup", duplicate_document, -1);
677
+ rb_define_method(cNokogiriXmlDocument, "url", url, 0);
678
+ rb_define_method(cNokogiriXmlDocument, "create_entity", create_entity, -1);
679
+ rb_define_method(cNokogiriXmlDocument, "remove_namespaces!", remove_namespaces_bang, 0);
576
680
  }