nokogiri 1.5.10 → 1.12.5

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 (328) hide show
  1. checksums.yaml +7 -0
  2. data/Gemfile +3 -0
  3. data/LICENSE-DEPENDENCIES.md +1903 -0
  4. data/LICENSE.md +9 -0
  5. data/README.md +278 -0
  6. data/bin/nokogiri +50 -10
  7. data/dependencies.yml +74 -0
  8. data/ext/nokogiri/depend +38 -358
  9. data/ext/nokogiri/extconf.rb +944 -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 +305 -201
  25. data/ext/nokogiri/xml_document_fragment.c +13 -15
  26. data/ext/nokogiri/xml_dtd.c +54 -48
  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 +30 -19
  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 +808 -503
  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 +198 -186
  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 +162 -98
  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 +4886 -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/css/node.rb +1 -50
  92. data/lib/nokogiri/css/parser.rb +317 -286
  93. data/lib/nokogiri/css/parser.y +57 -43
  94. data/lib/nokogiri/css/parser_extras.rb +39 -36
  95. data/lib/nokogiri/css/syntax_error.rb +2 -1
  96. data/lib/nokogiri/css/tokenizer.rb +105 -103
  97. data/lib/nokogiri/css/tokenizer.rex +5 -5
  98. data/lib/nokogiri/css/xpath_visitor.rb +137 -48
  99. data/lib/nokogiri/css.rb +15 -14
  100. data/lib/nokogiri/decorators/slop.rb +13 -5
  101. data/lib/nokogiri/extension.rb +31 -0
  102. data/lib/nokogiri/gumbo.rb +14 -0
  103. data/lib/nokogiri/html.rb +32 -27
  104. data/lib/nokogiri/{html → html4}/builder.rb +3 -2
  105. data/lib/nokogiri/{html → html4}/document.rb +118 -50
  106. data/lib/nokogiri/{html → html4}/document_fragment.rb +20 -11
  107. data/lib/nokogiri/{html → html4}/element_description.rb +2 -1
  108. data/lib/nokogiri/{html → html4}/element_description_defaults.rb +2 -1
  109. data/lib/nokogiri/{html → html4}/entity_lookup.rb +2 -1
  110. data/lib/nokogiri/{html → html4}/sax/parser.rb +22 -14
  111. data/lib/nokogiri/html4/sax/parser_context.rb +19 -0
  112. data/lib/nokogiri/html4/sax/push_parser.rb +37 -0
  113. data/lib/nokogiri/html4.rb +40 -0
  114. data/lib/nokogiri/html5/document.rb +74 -0
  115. data/lib/nokogiri/html5/document_fragment.rb +80 -0
  116. data/lib/nokogiri/html5/node.rb +93 -0
  117. data/lib/nokogiri/html5.rb +473 -0
  118. data/lib/nokogiri/jruby/dependencies.rb +20 -0
  119. data/lib/nokogiri/syntax_error.rb +1 -0
  120. data/lib/nokogiri/version/constant.rb +5 -0
  121. data/lib/nokogiri/version/info.rb +215 -0
  122. data/lib/nokogiri/version.rb +3 -91
  123. data/lib/nokogiri/xml/attr.rb +1 -0
  124. data/lib/nokogiri/xml/attribute_decl.rb +1 -0
  125. data/lib/nokogiri/xml/builder.rb +75 -33
  126. data/lib/nokogiri/xml/cdata.rb +1 -0
  127. data/lib/nokogiri/xml/character_data.rb +1 -0
  128. data/lib/nokogiri/xml/document.rb +157 -54
  129. data/lib/nokogiri/xml/document_fragment.rb +55 -8
  130. data/lib/nokogiri/xml/dtd.rb +15 -4
  131. data/lib/nokogiri/xml/element_content.rb +1 -0
  132. data/lib/nokogiri/xml/element_decl.rb +1 -0
  133. data/lib/nokogiri/xml/entity_decl.rb +1 -0
  134. data/lib/nokogiri/xml/entity_reference.rb +19 -0
  135. data/lib/nokogiri/xml/namespace.rb +1 -0
  136. data/lib/nokogiri/xml/node/save_options.rb +2 -1
  137. data/lib/nokogiri/xml/node.rb +712 -431
  138. data/lib/nokogiri/xml/node_set.rb +140 -123
  139. data/lib/nokogiri/xml/notation.rb +1 -0
  140. data/lib/nokogiri/xml/parse_options.rb +31 -0
  141. data/lib/nokogiri/xml/pp/character_data.rb +1 -0
  142. data/lib/nokogiri/xml/pp/node.rb +1 -0
  143. data/lib/nokogiri/xml/pp.rb +3 -2
  144. data/lib/nokogiri/xml/processing_instruction.rb +1 -0
  145. data/lib/nokogiri/xml/reader.rb +9 -12
  146. data/lib/nokogiri/xml/relax_ng.rb +7 -2
  147. data/lib/nokogiri/xml/sax/document.rb +25 -30
  148. data/lib/nokogiri/xml/sax/parser.rb +8 -8
  149. data/lib/nokogiri/xml/sax/parser_context.rb +1 -0
  150. data/lib/nokogiri/xml/sax/push_parser.rb +1 -0
  151. data/lib/nokogiri/xml/sax.rb +5 -4
  152. data/lib/nokogiri/xml/schema.rb +13 -4
  153. data/lib/nokogiri/xml/searchable.rb +239 -0
  154. data/lib/nokogiri/xml/syntax_error.rb +25 -1
  155. data/lib/nokogiri/xml/text.rb +1 -0
  156. data/lib/nokogiri/xml/xpath/syntax_error.rb +2 -1
  157. data/lib/nokogiri/xml/xpath.rb +4 -5
  158. data/lib/nokogiri/xml/xpath_context.rb +1 -0
  159. data/lib/nokogiri/xml.rb +37 -35
  160. data/lib/nokogiri/xslt/stylesheet.rb +2 -1
  161. data/lib/nokogiri/xslt.rb +17 -16
  162. data/lib/nokogiri.rb +55 -58
  163. data/lib/xsd/xmlparser/nokogiri.rb +1 -0
  164. data/patches/libxml2/0001-Remove-script-macro-support.patch +40 -0
  165. data/patches/libxml2/0002-Update-entities-to-remove-handling-of-ssi.patch +44 -0
  166. data/patches/libxml2/0003-libxml2.la-is-in-top_builddir.patch +25 -0
  167. data/patches/libxml2/0004-use-glibc-strlen.patch +53 -0
  168. data/patches/libxml2/0005-avoid-isnan-isinf.patch +81 -0
  169. data/patches/libxml2/0006-update-automake-files-for-arm64.patch +2511 -0
  170. data/patches/libxml2/0007-Fix-XPath-recursion-limit.patch +31 -0
  171. data/patches/libxslt/0001-update-automake-files-for-arm64.patch +2511 -0
  172. data/patches/libxslt/0002-Fix-xml2-config-check-in-configure-script.patch +19 -0
  173. data/ports/archives/libxml2-2.9.12.tar.gz +0 -0
  174. data/ports/archives/libxslt-1.1.34.tar.gz +0 -0
  175. metadata +307 -459
  176. data/.autotest +0 -26
  177. data/.gemtest +0 -0
  178. data/CHANGELOG.ja.rdoc +0 -785
  179. data/CHANGELOG.rdoc +0 -783
  180. data/C_CODING_STYLE.rdoc +0 -33
  181. data/Manifest.txt +0 -303
  182. data/README.ja.rdoc +0 -106
  183. data/README.rdoc +0 -175
  184. data/ROADMAP.md +0 -90
  185. data/Rakefile +0 -228
  186. data/STANDARD_RESPONSES.md +0 -47
  187. data/Y_U_NO_GEMSPEC.md +0 -155
  188. data/build_all +0 -105
  189. data/ext/nokogiri/html_document.c +0 -170
  190. data/ext/nokogiri/html_document.h +0 -10
  191. data/ext/nokogiri/html_element_description.c +0 -279
  192. data/ext/nokogiri/html_element_description.h +0 -10
  193. data/ext/nokogiri/html_entity_lookup.c +0 -32
  194. data/ext/nokogiri/html_entity_lookup.h +0 -8
  195. data/ext/nokogiri/html_sax_parser_context.c +0 -116
  196. data/ext/nokogiri/html_sax_parser_context.h +0 -11
  197. data/ext/nokogiri/html_sax_push_parser.c +0 -87
  198. data/ext/nokogiri/html_sax_push_parser.h +0 -9
  199. data/ext/nokogiri/xml_attr.h +0 -9
  200. data/ext/nokogiri/xml_attribute_decl.h +0 -9
  201. data/ext/nokogiri/xml_cdata.h +0 -9
  202. data/ext/nokogiri/xml_comment.h +0 -9
  203. data/ext/nokogiri/xml_document.h +0 -23
  204. data/ext/nokogiri/xml_document_fragment.h +0 -10
  205. data/ext/nokogiri/xml_dtd.h +0 -10
  206. data/ext/nokogiri/xml_element_content.h +0 -10
  207. data/ext/nokogiri/xml_element_decl.h +0 -9
  208. data/ext/nokogiri/xml_encoding_handler.h +0 -8
  209. data/ext/nokogiri/xml_entity_decl.h +0 -10
  210. data/ext/nokogiri/xml_entity_reference.h +0 -9
  211. data/ext/nokogiri/xml_io.c +0 -56
  212. data/ext/nokogiri/xml_io.h +0 -11
  213. data/ext/nokogiri/xml_libxml2_hacks.c +0 -112
  214. data/ext/nokogiri/xml_libxml2_hacks.h +0 -12
  215. data/ext/nokogiri/xml_namespace.h +0 -13
  216. data/ext/nokogiri/xml_node.h +0 -13
  217. data/ext/nokogiri/xml_node_set.h +0 -14
  218. data/ext/nokogiri/xml_processing_instruction.h +0 -9
  219. data/ext/nokogiri/xml_reader.h +0 -10
  220. data/ext/nokogiri/xml_relax_ng.h +0 -9
  221. data/ext/nokogiri/xml_sax_parser.h +0 -39
  222. data/ext/nokogiri/xml_sax_parser_context.h +0 -10
  223. data/ext/nokogiri/xml_sax_push_parser.h +0 -9
  224. data/ext/nokogiri/xml_schema.h +0 -9
  225. data/ext/nokogiri/xml_syntax_error.h +0 -13
  226. data/ext/nokogiri/xml_text.h +0 -9
  227. data/ext/nokogiri/xml_xpath_context.h +0 -10
  228. data/ext/nokogiri/xslt_stylesheet.h +0 -14
  229. data/lib/nokogiri/html/sax/parser_context.rb +0 -16
  230. data/lib/nokogiri/html/sax/push_parser.rb +0 -16
  231. data/tasks/cross_compile.rb +0 -150
  232. data/tasks/nokogiri.org.rb +0 -24
  233. data/tasks/test.rb +0 -95
  234. data/test/css/test_nthiness.rb +0 -159
  235. data/test/css/test_parser.rb +0 -341
  236. data/test/css/test_tokenizer.rb +0 -198
  237. data/test/css/test_xpath_visitor.rb +0 -91
  238. data/test/decorators/test_slop.rb +0 -16
  239. data/test/files/2ch.html +0 -108
  240. data/test/files/address_book.rlx +0 -12
  241. data/test/files/address_book.xml +0 -10
  242. data/test/files/bar/bar.xsd +0 -4
  243. data/test/files/dont_hurt_em_why.xml +0 -422
  244. data/test/files/encoding.html +0 -82
  245. data/test/files/encoding.xhtml +0 -84
  246. data/test/files/exslt.xml +0 -8
  247. data/test/files/exslt.xslt +0 -35
  248. data/test/files/foo/foo.xsd +0 -4
  249. data/test/files/metacharset.html +0 -10
  250. data/test/files/noencoding.html +0 -47
  251. data/test/files/po.xml +0 -32
  252. data/test/files/po.xsd +0 -66
  253. data/test/files/shift_jis.html +0 -10
  254. data/test/files/shift_jis.xml +0 -5
  255. data/test/files/snuggles.xml +0 -3
  256. data/test/files/staff.dtd +0 -10
  257. data/test/files/staff.xml +0 -59
  258. data/test/files/staff.xslt +0 -32
  259. data/test/files/test_document_url/bar.xml +0 -2
  260. data/test/files/test_document_url/document.dtd +0 -4
  261. data/test/files/test_document_url/document.xml +0 -6
  262. data/test/files/tlm.html +0 -850
  263. data/test/files/to_be_xincluded.xml +0 -2
  264. data/test/files/valid_bar.xml +0 -2
  265. data/test/files/xinclude.xml +0 -4
  266. data/test/helper.rb +0 -154
  267. data/test/html/sax/test_parser.rb +0 -141
  268. data/test/html/sax/test_parser_context.rb +0 -46
  269. data/test/html/test_builder.rb +0 -164
  270. data/test/html/test_document.rb +0 -552
  271. data/test/html/test_document_encoding.rb +0 -138
  272. data/test/html/test_document_fragment.rb +0 -261
  273. data/test/html/test_element_description.rb +0 -105
  274. data/test/html/test_named_characters.rb +0 -14
  275. data/test/html/test_node.rb +0 -196
  276. data/test/html/test_node_encoding.rb +0 -27
  277. data/test/namespaces/test_additional_namespaces_in_builder_doc.rb +0 -14
  278. data/test/namespaces/test_namespaces_in_builder_doc.rb +0 -75
  279. data/test/namespaces/test_namespaces_in_created_doc.rb +0 -75
  280. data/test/namespaces/test_namespaces_in_parsed_doc.rb +0 -66
  281. data/test/test_convert_xpath.rb +0 -135
  282. data/test/test_css_cache.rb +0 -45
  283. data/test/test_encoding_handler.rb +0 -46
  284. data/test/test_memory_leak.rb +0 -156
  285. data/test/test_nokogiri.rb +0 -132
  286. data/test/test_reader.rb +0 -555
  287. data/test/test_soap4r_sax.rb +0 -52
  288. data/test/test_xslt_transforms.rb +0 -254
  289. data/test/xml/node/test_save_options.rb +0 -28
  290. data/test/xml/node/test_subclass.rb +0 -44
  291. data/test/xml/sax/test_parser.rb +0 -366
  292. data/test/xml/sax/test_parser_context.rb +0 -106
  293. data/test/xml/sax/test_push_parser.rb +0 -157
  294. data/test/xml/test_attr.rb +0 -64
  295. data/test/xml/test_attribute_decl.rb +0 -86
  296. data/test/xml/test_builder.rb +0 -306
  297. data/test/xml/test_c14n.rb +0 -151
  298. data/test/xml/test_cdata.rb +0 -48
  299. data/test/xml/test_comment.rb +0 -29
  300. data/test/xml/test_document.rb +0 -828
  301. data/test/xml/test_document_encoding.rb +0 -28
  302. data/test/xml/test_document_fragment.rb +0 -223
  303. data/test/xml/test_dtd.rb +0 -103
  304. data/test/xml/test_dtd_encoding.rb +0 -33
  305. data/test/xml/test_element_content.rb +0 -56
  306. data/test/xml/test_element_decl.rb +0 -73
  307. data/test/xml/test_entity_decl.rb +0 -122
  308. data/test/xml/test_entity_reference.rb +0 -245
  309. data/test/xml/test_namespace.rb +0 -95
  310. data/test/xml/test_node.rb +0 -1137
  311. data/test/xml/test_node_attributes.rb +0 -96
  312. data/test/xml/test_node_encoding.rb +0 -107
  313. data/test/xml/test_node_inheritance.rb +0 -32
  314. data/test/xml/test_node_reparenting.rb +0 -374
  315. data/test/xml/test_node_set.rb +0 -755
  316. data/test/xml/test_parse_options.rb +0 -64
  317. data/test/xml/test_processing_instruction.rb +0 -30
  318. data/test/xml/test_reader_encoding.rb +0 -142
  319. data/test/xml/test_relax_ng.rb +0 -60
  320. data/test/xml/test_schema.rb +0 -103
  321. data/test/xml/test_syntax_error.rb +0 -12
  322. data/test/xml/test_text.rb +0 -45
  323. data/test/xml/test_unparented_node.rb +0 -422
  324. data/test/xml/test_xinclude.rb +0 -83
  325. data/test/xml/test_xpath.rb +0 -295
  326. data/test/xslt/test_custom_functions.rb +0 -133
  327. data/test/xslt/test_exception_handling.rb +0 -37
  328. 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);
439
- }
440
- else{
441
- node = Nokogiri_wrap_xml_node(Qnil, _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);
442
515
  }
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,12 +525,13 @@ 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
536
  VALUE mode;
466
537
  VALUE incl_ns;
@@ -471,7 +542,7 @@ static VALUE canonicalize(int argc, VALUE* argv, VALUE self)
471
542
  xmlDocPtr doc;
472
543
  xmlOutputBufferPtr buf;
473
544
  xmlC14NIsVisibleCallback cb = NULL;
474
- void * ctx = NULL;
545
+ void *ctx = NULL;
475
546
 
476
547
  VALUE rb_cStringIO;
477
548
  VALUE io;
@@ -484,93 +555,126 @@ static VALUE canonicalize(int argc, VALUE* argv, VALUE self)
484
555
  io = rb_class_new_instance(0, 0, rb_cStringIO);
485
556
  buf = xmlAllocOutputBuffer(NULL);
486
557
 
487
- buf->writecallback = (xmlOutputWriteCallback)io_write_callback;
488
- buf->closecallback = (xmlOutputCloseCallback)io_close_callback;
558
+ buf->writecallback = (xmlOutputWriteCallback)noko_io_write;
559
+ buf->closecallback = (xmlOutputCloseCallback)noko_io_close;
489
560
  buf->context = (void *)io;
490
561
 
491
- if(rb_block_given_p()) {
562
+ if (rb_block_given_p()) {
492
563
  cb = block_caller;
493
564
  ctx = (void *)rb_block_proc();
494
565
  }
495
566
 
496
- if(NIL_P(incl_ns)){
567
+ if (NIL_P(incl_ns)) {
497
568
  ns = NULL;
498
- }
499
- else{
569
+ } else {
570
+ Check_Type(incl_ns, T_ARRAY);
500
571
  ns_len = RARRAY_LEN(incl_ns);
501
- ns = calloc((size_t)ns_len+1, sizeof(xmlChar *));
572
+ ns = calloc((size_t)ns_len + 1, sizeof(xmlChar *));
502
573
  for (i = 0 ; i < ns_len ; i++) {
503
574
  VALUE entry = rb_ary_entry(incl_ns, i);
504
- const char * ptr = StringValuePtr(entry);
505
- ns[i] = (xmlChar*) ptr;
575
+ ns[i] = (xmlChar *)StringValueCStr(entry);
506
576
  }
507
577
  }
508
578
 
509
579
 
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);
580
+ xmlC14NExecute(doc, cb, ctx,
581
+ (int)(NIL_P(mode) ? 0 : NUM2INT(mode)),
582
+ ns,
583
+ (int) RTEST(with_comments),
584
+ buf);
515
585
 
516
586
  xmlOutputBufferClose(buf);
517
587
 
518
588
  return rb_funcall(io, rb_intern("string"), 0);
519
589
  }
520
590
 
521
- VALUE cNokogiriXmlDocument ;
522
- void init_xml_document()
591
+ VALUE
592
+ noko_xml_document_wrap_with_init_args(VALUE klass, xmlDocPtr c_document, int argc, VALUE *argv)
523
593
  {
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);
594
+ VALUE rb_document;
595
+ nokogiriTuplePtr tuple;
527
596
 
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);
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 ;
609
+
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);
613
+
614
+ rb_obj_call_init(rb_document, argc, argv);
615
+
616
+ return rb_document ;
549
617
  }
550
618
 
551
619
 
552
- /* this takes klass as a param because it's used for HtmlDocument, too. */
553
- VALUE Nokogiri_wrap_xml_document(VALUE klass, xmlDocPtr doc)
620
+ /* deprecated. use noko_xml_document_wrap() instead. */
621
+ VALUE
622
+ Nokogiri_wrap_xml_document(VALUE klass, xmlDocPtr doc)
554
623
  {
555
- nokogiriTuplePtr tuple = (nokogiriTuplePtr)malloc(sizeof(nokogiriTuple));
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
- VALUE rb_doc = Data_Wrap_Struct(
558
- klass ? klass : cNokogiriXmlDocument,
559
- 0,
560
- dealloc,
561
- doc
562
- );
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);
632
+ }
563
633
 
564
- VALUE cache = rb_ary_new();
565
- rb_iv_set(rb_doc, "@decorators", Qnil);
566
- rb_iv_set(rb_doc, "@node_cache", cache);
567
634
 
568
- tuple->doc = rb_doc;
569
- tuple->unlinkedNodes = st_init_numtable_with_size(128);
570
- tuple->node_cache = cache;
571
- doc->_private = tuple ;
635
+ void
636
+ noko_xml_document_pin_node(xmlNodePtr node)
637
+ {
638
+ xmlDocPtr doc;
639
+ nokogiriTuplePtr tuple;
572
640
 
573
- rb_obj_call_init(rb_doc, 0, NULL);
641
+ doc = node->doc;
642
+ tuple = (nokogiriTuplePtr)doc->_private;
643
+ st_insert(tuple->unlinkedNodes, (st_data_t)node, (st_data_t)node);
644
+ }
574
645
 
575
- return rb_doc ;
646
+
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
+ }
655
+
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
  }