nokogiri 1.8.5 → 1.13.6

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