nokogiri 1.8.5 → 1.13.9

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