nokolexbor 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (486) hide show
  1. checksums.yaml +7 -0
  2. data/ext/nokolexbor/config.h +186 -0
  3. data/ext/nokolexbor/extconf.rb +131 -0
  4. data/ext/nokolexbor/libxml/HTMLparser.h +320 -0
  5. data/ext/nokolexbor/libxml/SAX2.h +173 -0
  6. data/ext/nokolexbor/libxml/chvalid.h +230 -0
  7. data/ext/nokolexbor/libxml/debugXML.h +217 -0
  8. data/ext/nokolexbor/libxml/dict.h +81 -0
  9. data/ext/nokolexbor/libxml/encoding.h +232 -0
  10. data/ext/nokolexbor/libxml/entities.h +153 -0
  11. data/ext/nokolexbor/libxml/globals.h +529 -0
  12. data/ext/nokolexbor/libxml/hash.h +236 -0
  13. data/ext/nokolexbor/libxml/list.h +137 -0
  14. data/ext/nokolexbor/libxml/parser.h +1264 -0
  15. data/ext/nokolexbor/libxml/parserInternals.h +641 -0
  16. data/ext/nokolexbor/libxml/pattern.h +100 -0
  17. data/ext/nokolexbor/libxml/threads.h +94 -0
  18. data/ext/nokolexbor/libxml/tree.h +1315 -0
  19. data/ext/nokolexbor/libxml/uri.h +94 -0
  20. data/ext/nokolexbor/libxml/valid.h +448 -0
  21. data/ext/nokolexbor/libxml/xmlIO.h +369 -0
  22. data/ext/nokolexbor/libxml/xmlautomata.h +146 -0
  23. data/ext/nokolexbor/libxml/xmlerror.h +919 -0
  24. data/ext/nokolexbor/libxml/xmlexports.h +79 -0
  25. data/ext/nokolexbor/libxml/xmlmemory.h +226 -0
  26. data/ext/nokolexbor/libxml/xmlregexp.h +222 -0
  27. data/ext/nokolexbor/libxml/xmlstring.h +140 -0
  28. data/ext/nokolexbor/libxml/xmlversion.h +526 -0
  29. data/ext/nokolexbor/libxml/xpath.h +575 -0
  30. data/ext/nokolexbor/libxml/xpathInternals.h +632 -0
  31. data/ext/nokolexbor/libxml/xpointer.h +137 -0
  32. data/ext/nokolexbor/libxml.h +76 -0
  33. data/ext/nokolexbor/memory.c +39 -0
  34. data/ext/nokolexbor/nl_document.c +51 -0
  35. data/ext/nokolexbor/nl_node.c +790 -0
  36. data/ext/nokolexbor/nl_node_set.c +368 -0
  37. data/ext/nokolexbor/nl_xpath_context.c +200 -0
  38. data/ext/nokolexbor/nokolexbor.c +63 -0
  39. data/ext/nokolexbor/nokolexbor.h +37 -0
  40. data/ext/nokolexbor/private/buf.h +70 -0
  41. data/ext/nokolexbor/private/dict.h +11 -0
  42. data/ext/nokolexbor/private/enc.h +17 -0
  43. data/ext/nokolexbor/private/error.h +21 -0
  44. data/ext/nokolexbor/private/globals.h +9 -0
  45. data/ext/nokolexbor/private/memory.h +9 -0
  46. data/ext/nokolexbor/private/parser.h +27 -0
  47. data/ext/nokolexbor/private/string.h +9 -0
  48. data/ext/nokolexbor/private/threads.h +50 -0
  49. data/ext/nokolexbor/private/tree.h +18 -0
  50. data/ext/nokolexbor/private/xpath.h +7 -0
  51. data/ext/nokolexbor/timsort.h +601 -0
  52. data/ext/nokolexbor/xml_SAX2.c +80 -0
  53. data/ext/nokolexbor/xml_buf.c +363 -0
  54. data/ext/nokolexbor/xml_chvalid.c +334 -0
  55. data/ext/nokolexbor/xml_dict.c +1264 -0
  56. data/ext/nokolexbor/xml_encoding.c +124 -0
  57. data/ext/nokolexbor/xml_error.c +134 -0
  58. data/ext/nokolexbor/xml_globals.c +1085 -0
  59. data/ext/nokolexbor/xml_hash.c +1141 -0
  60. data/ext/nokolexbor/xml_memory.c +203 -0
  61. data/ext/nokolexbor/xml_parser.c +127 -0
  62. data/ext/nokolexbor/xml_parserInternals.c +338 -0
  63. data/ext/nokolexbor/xml_pattern.c +2375 -0
  64. data/ext/nokolexbor/xml_string.c +1051 -0
  65. data/ext/nokolexbor/xml_threads.c +881 -0
  66. data/ext/nokolexbor/xml_tree.c +148 -0
  67. data/ext/nokolexbor/xml_xpath.c +14743 -0
  68. data/lib/nokolexbor/attribute.rb +18 -0
  69. data/lib/nokolexbor/document.rb +6 -0
  70. data/lib/nokolexbor/node.rb +264 -0
  71. data/lib/nokolexbor/node_set.rb +124 -0
  72. data/lib/nokolexbor/version.rb +5 -0
  73. data/lib/nokolexbor/xpath_context.rb +14 -0
  74. data/lib/nokolexbor.rb +17 -0
  75. data/patches/0001-lexbor-support-text-pseudo-element.patch +137 -0
  76. data/patches/0002-lexbor-match-id-class-case-sensitive.patch +22 -0
  77. data/patches/0003-lexbor-attach-template-content-to-self.patch +13 -0
  78. data/vendor/lexbor/CMakeLists.txt +331 -0
  79. data/vendor/lexbor/config.cmake +890 -0
  80. data/vendor/lexbor/feature.cmake +134 -0
  81. data/vendor/lexbor/source/lexbor/core/array.c +208 -0
  82. data/vendor/lexbor/source/lexbor/core/array.h +100 -0
  83. data/vendor/lexbor/source/lexbor/core/array_obj.c +216 -0
  84. data/vendor/lexbor/source/lexbor/core/array_obj.h +134 -0
  85. data/vendor/lexbor/source/lexbor/core/avl.c +442 -0
  86. data/vendor/lexbor/source/lexbor/core/avl.h +82 -0
  87. data/vendor/lexbor/source/lexbor/core/base.h +86 -0
  88. data/vendor/lexbor/source/lexbor/core/bst.c +468 -0
  89. data/vendor/lexbor/source/lexbor/core/bst.h +108 -0
  90. data/vendor/lexbor/source/lexbor/core/bst_map.c +238 -0
  91. data/vendor/lexbor/source/lexbor/core/bst_map.h +87 -0
  92. data/vendor/lexbor/source/lexbor/core/config.cmake +12 -0
  93. data/vendor/lexbor/source/lexbor/core/conv.c +203 -0
  94. data/vendor/lexbor/source/lexbor/core/conv.h +53 -0
  95. data/vendor/lexbor/source/lexbor/core/core.h +35 -0
  96. data/vendor/lexbor/source/lexbor/core/def.h +57 -0
  97. data/vendor/lexbor/source/lexbor/core/diyfp.c +153 -0
  98. data/vendor/lexbor/source/lexbor/core/diyfp.h +258 -0
  99. data/vendor/lexbor/source/lexbor/core/dobject.c +187 -0
  100. data/vendor/lexbor/source/lexbor/core/dobject.h +92 -0
  101. data/vendor/lexbor/source/lexbor/core/dtoa.c +404 -0
  102. data/vendor/lexbor/source/lexbor/core/dtoa.h +28 -0
  103. data/vendor/lexbor/source/lexbor/core/fs.h +60 -0
  104. data/vendor/lexbor/source/lexbor/core/hash.c +476 -0
  105. data/vendor/lexbor/source/lexbor/core/hash.h +218 -0
  106. data/vendor/lexbor/source/lexbor/core/in.c +267 -0
  107. data/vendor/lexbor/source/lexbor/core/in.h +172 -0
  108. data/vendor/lexbor/source/lexbor/core/lexbor.h +35 -0
  109. data/vendor/lexbor/source/lexbor/core/mem.c +228 -0
  110. data/vendor/lexbor/source/lexbor/core/mem.h +141 -0
  111. data/vendor/lexbor/source/lexbor/core/mraw.c +428 -0
  112. data/vendor/lexbor/source/lexbor/core/mraw.h +114 -0
  113. data/vendor/lexbor/source/lexbor/core/perf.h +45 -0
  114. data/vendor/lexbor/source/lexbor/core/plog.c +73 -0
  115. data/vendor/lexbor/source/lexbor/core/plog.h +102 -0
  116. data/vendor/lexbor/source/lexbor/core/print.c +168 -0
  117. data/vendor/lexbor/source/lexbor/core/print.h +39 -0
  118. data/vendor/lexbor/source/lexbor/core/sbst.h +59 -0
  119. data/vendor/lexbor/source/lexbor/core/serialize.c +27 -0
  120. data/vendor/lexbor/source/lexbor/core/serialize.h +32 -0
  121. data/vendor/lexbor/source/lexbor/core/shs.c +118 -0
  122. data/vendor/lexbor/source/lexbor/core/shs.h +82 -0
  123. data/vendor/lexbor/source/lexbor/core/str.c +617 -0
  124. data/vendor/lexbor/source/lexbor/core/str.h +247 -0
  125. data/vendor/lexbor/source/lexbor/core/str_res.h +369 -0
  126. data/vendor/lexbor/source/lexbor/core/strtod.c +326 -0
  127. data/vendor/lexbor/source/lexbor/core/strtod.h +28 -0
  128. data/vendor/lexbor/source/lexbor/core/types.h +39 -0
  129. data/vendor/lexbor/source/lexbor/core/utils.c +43 -0
  130. data/vendor/lexbor/source/lexbor/core/utils.h +36 -0
  131. data/vendor/lexbor/source/lexbor/css/base.h +44 -0
  132. data/vendor/lexbor/source/lexbor/css/config.cmake +2 -0
  133. data/vendor/lexbor/source/lexbor/css/css.h +25 -0
  134. data/vendor/lexbor/source/lexbor/css/log.c +336 -0
  135. data/vendor/lexbor/source/lexbor/css/log.h +103 -0
  136. data/vendor/lexbor/source/lexbor/css/node.h +29 -0
  137. data/vendor/lexbor/source/lexbor/css/parser.c +473 -0
  138. data/vendor/lexbor/source/lexbor/css/parser.h +368 -0
  139. data/vendor/lexbor/source/lexbor/css/selectors/base.h +48 -0
  140. data/vendor/lexbor/source/lexbor/css/selectors/pseudo.c +91 -0
  141. data/vendor/lexbor/source/lexbor/css/selectors/pseudo.h +66 -0
  142. data/vendor/lexbor/source/lexbor/css/selectors/pseudo_const.h +109 -0
  143. data/vendor/lexbor/source/lexbor/css/selectors/pseudo_res.h +302 -0
  144. data/vendor/lexbor/source/lexbor/css/selectors/pseudo_state.c +279 -0
  145. data/vendor/lexbor/source/lexbor/css/selectors/pseudo_state.h +85 -0
  146. data/vendor/lexbor/source/lexbor/css/selectors/selector.c +927 -0
  147. data/vendor/lexbor/source/lexbor/css/selectors/selector.h +200 -0
  148. data/vendor/lexbor/source/lexbor/css/selectors/selectors.c +340 -0
  149. data/vendor/lexbor/source/lexbor/css/selectors/selectors.h +137 -0
  150. data/vendor/lexbor/source/lexbor/css/selectors/state.c +1718 -0
  151. data/vendor/lexbor/source/lexbor/css/selectors/state.h +79 -0
  152. data/vendor/lexbor/source/lexbor/css/stylesheet.h +37 -0
  153. data/vendor/lexbor/source/lexbor/css/syntax/anb.c +443 -0
  154. data/vendor/lexbor/source/lexbor/css/syntax/anb.h +45 -0
  155. data/vendor/lexbor/source/lexbor/css/syntax/base.h +33 -0
  156. data/vendor/lexbor/source/lexbor/css/syntax/parser.c +9 -0
  157. data/vendor/lexbor/source/lexbor/css/syntax/parser.h +25 -0
  158. data/vendor/lexbor/source/lexbor/css/syntax/res.h +48 -0
  159. data/vendor/lexbor/source/lexbor/css/syntax/state.c +2603 -0
  160. data/vendor/lexbor/source/lexbor/css/syntax/state.h +140 -0
  161. data/vendor/lexbor/source/lexbor/css/syntax/state_res.h +273 -0
  162. data/vendor/lexbor/source/lexbor/css/syntax/syntax.c +67 -0
  163. data/vendor/lexbor/source/lexbor/css/syntax/token.c +618 -0
  164. data/vendor/lexbor/source/lexbor/css/syntax/token.h +298 -0
  165. data/vendor/lexbor/source/lexbor/css/syntax/token_res.h +68 -0
  166. data/vendor/lexbor/source/lexbor/css/syntax/tokenizer/error.c +30 -0
  167. data/vendor/lexbor/source/lexbor/css/syntax/tokenizer/error.h +58 -0
  168. data/vendor/lexbor/source/lexbor/css/syntax/tokenizer.c +278 -0
  169. data/vendor/lexbor/source/lexbor/css/syntax/tokenizer.h +121 -0
  170. data/vendor/lexbor/source/lexbor/dom/base.h +32 -0
  171. data/vendor/lexbor/source/lexbor/dom/collection.c +97 -0
  172. data/vendor/lexbor/source/lexbor/dom/collection.h +112 -0
  173. data/vendor/lexbor/source/lexbor/dom/config.cmake +3 -0
  174. data/vendor/lexbor/source/lexbor/dom/dom.h +29 -0
  175. data/vendor/lexbor/source/lexbor/dom/exception.c +18 -0
  176. data/vendor/lexbor/source/lexbor/dom/exception.h +73 -0
  177. data/vendor/lexbor/source/lexbor/dom/interface.c +110 -0
  178. data/vendor/lexbor/source/lexbor/dom/interface.h +88 -0
  179. data/vendor/lexbor/source/lexbor/dom/interfaces/attr.c +445 -0
  180. data/vendor/lexbor/source/lexbor/dom/interfaces/attr.h +152 -0
  181. data/vendor/lexbor/source/lexbor/dom/interfaces/attr_const.h +62 -0
  182. data/vendor/lexbor/source/lexbor/dom/interfaces/attr_res.h +143 -0
  183. data/vendor/lexbor/source/lexbor/dom/interfaces/cdata_section.c +55 -0
  184. data/vendor/lexbor/source/lexbor/dom/interfaces/cdata_section.h +38 -0
  185. data/vendor/lexbor/source/lexbor/dom/interfaces/character_data.c +110 -0
  186. data/vendor/lexbor/source/lexbor/dom/interfaces/character_data.h +51 -0
  187. data/vendor/lexbor/source/lexbor/dom/interfaces/comment.c +64 -0
  188. data/vendor/lexbor/source/lexbor/dom/interfaces/comment.h +42 -0
  189. data/vendor/lexbor/source/lexbor/dom/interfaces/document.c +536 -0
  190. data/vendor/lexbor/source/lexbor/dom/interfaces/document.h +243 -0
  191. data/vendor/lexbor/source/lexbor/dom/interfaces/document_fragment.c +36 -0
  192. data/vendor/lexbor/source/lexbor/dom/interfaces/document_fragment.h +36 -0
  193. data/vendor/lexbor/source/lexbor/dom/interfaces/document_type.c +125 -0
  194. data/vendor/lexbor/source/lexbor/dom/interfaces/document_type.h +108 -0
  195. data/vendor/lexbor/source/lexbor/dom/interfaces/element.c +1411 -0
  196. data/vendor/lexbor/source/lexbor/dom/interfaces/element.h +319 -0
  197. data/vendor/lexbor/source/lexbor/dom/interfaces/event_target.c +32 -0
  198. data/vendor/lexbor/source/lexbor/dom/interfaces/event_target.h +34 -0
  199. data/vendor/lexbor/source/lexbor/dom/interfaces/node.c +661 -0
  200. data/vendor/lexbor/source/lexbor/dom/interfaces/node.h +192 -0
  201. data/vendor/lexbor/source/lexbor/dom/interfaces/processing_instruction.c +87 -0
  202. data/vendor/lexbor/source/lexbor/dom/interfaces/processing_instruction.h +66 -0
  203. data/vendor/lexbor/source/lexbor/dom/interfaces/shadow_root.c +36 -0
  204. data/vendor/lexbor/source/lexbor/dom/interfaces/shadow_root.h +44 -0
  205. data/vendor/lexbor/source/lexbor/dom/interfaces/text.c +63 -0
  206. data/vendor/lexbor/source/lexbor/dom/interfaces/text.h +42 -0
  207. data/vendor/lexbor/source/lexbor/encoding/base.h +218 -0
  208. data/vendor/lexbor/source/lexbor/encoding/big5.c +42839 -0
  209. data/vendor/lexbor/source/lexbor/encoding/config.cmake +12 -0
  210. data/vendor/lexbor/source/lexbor/encoding/const.h +65 -0
  211. data/vendor/lexbor/source/lexbor/encoding/decode.c +3193 -0
  212. data/vendor/lexbor/source/lexbor/encoding/decode.h +370 -0
  213. data/vendor/lexbor/source/lexbor/encoding/encode.c +1931 -0
  214. data/vendor/lexbor/source/lexbor/encoding/encode.h +377 -0
  215. data/vendor/lexbor/source/lexbor/encoding/encoding.c +252 -0
  216. data/vendor/lexbor/source/lexbor/encoding/encoding.h +475 -0
  217. data/vendor/lexbor/source/lexbor/encoding/euc_kr.c +53883 -0
  218. data/vendor/lexbor/source/lexbor/encoding/gb18030.c +47905 -0
  219. data/vendor/lexbor/source/lexbor/encoding/iso_2022_jp_katakana.c +159 -0
  220. data/vendor/lexbor/source/lexbor/encoding/jis0208.c +22477 -0
  221. data/vendor/lexbor/source/lexbor/encoding/jis0212.c +15787 -0
  222. data/vendor/lexbor/source/lexbor/encoding/multi.h +53 -0
  223. data/vendor/lexbor/source/lexbor/encoding/range.c +71 -0
  224. data/vendor/lexbor/source/lexbor/encoding/range.h +34 -0
  225. data/vendor/lexbor/source/lexbor/encoding/res.c +222 -0
  226. data/vendor/lexbor/source/lexbor/encoding/res.h +34 -0
  227. data/vendor/lexbor/source/lexbor/encoding/single.c +13748 -0
  228. data/vendor/lexbor/source/lexbor/encoding/single.h +116 -0
  229. data/vendor/lexbor/source/lexbor/html/base.h +44 -0
  230. data/vendor/lexbor/source/lexbor/html/config.cmake +3 -0
  231. data/vendor/lexbor/source/lexbor/html/encoding.c +574 -0
  232. data/vendor/lexbor/source/lexbor/html/encoding.h +106 -0
  233. data/vendor/lexbor/source/lexbor/html/html.h +107 -0
  234. data/vendor/lexbor/source/lexbor/html/interface.c +165 -0
  235. data/vendor/lexbor/source/lexbor/html/interface.h +186 -0
  236. data/vendor/lexbor/source/lexbor/html/interface_res.h +4449 -0
  237. data/vendor/lexbor/source/lexbor/html/interfaces/anchor_element.c +36 -0
  238. data/vendor/lexbor/source/lexbor/html/interfaces/anchor_element.h +34 -0
  239. data/vendor/lexbor/source/lexbor/html/interfaces/area_element.c +36 -0
  240. data/vendor/lexbor/source/lexbor/html/interfaces/area_element.h +34 -0
  241. data/vendor/lexbor/source/lexbor/html/interfaces/audio_element.c +36 -0
  242. data/vendor/lexbor/source/lexbor/html/interfaces/audio_element.h +34 -0
  243. data/vendor/lexbor/source/lexbor/html/interfaces/base_element.c +36 -0
  244. data/vendor/lexbor/source/lexbor/html/interfaces/base_element.h +34 -0
  245. data/vendor/lexbor/source/lexbor/html/interfaces/body_element.c +36 -0
  246. data/vendor/lexbor/source/lexbor/html/interfaces/body_element.h +34 -0
  247. data/vendor/lexbor/source/lexbor/html/interfaces/br_element.c +36 -0
  248. data/vendor/lexbor/source/lexbor/html/interfaces/br_element.h +34 -0
  249. data/vendor/lexbor/source/lexbor/html/interfaces/button_element.c +36 -0
  250. data/vendor/lexbor/source/lexbor/html/interfaces/button_element.h +34 -0
  251. data/vendor/lexbor/source/lexbor/html/interfaces/canvas_element.c +36 -0
  252. data/vendor/lexbor/source/lexbor/html/interfaces/canvas_element.h +34 -0
  253. data/vendor/lexbor/source/lexbor/html/interfaces/d_list_element.c +36 -0
  254. data/vendor/lexbor/source/lexbor/html/interfaces/d_list_element.h +34 -0
  255. data/vendor/lexbor/source/lexbor/html/interfaces/data_element.c +36 -0
  256. data/vendor/lexbor/source/lexbor/html/interfaces/data_element.h +34 -0
  257. data/vendor/lexbor/source/lexbor/html/interfaces/data_list_element.c +36 -0
  258. data/vendor/lexbor/source/lexbor/html/interfaces/data_list_element.h +34 -0
  259. data/vendor/lexbor/source/lexbor/html/interfaces/details_element.c +36 -0
  260. data/vendor/lexbor/source/lexbor/html/interfaces/details_element.h +34 -0
  261. data/vendor/lexbor/source/lexbor/html/interfaces/dialog_element.c +36 -0
  262. data/vendor/lexbor/source/lexbor/html/interfaces/dialog_element.h +34 -0
  263. data/vendor/lexbor/source/lexbor/html/interfaces/directory_element.c +36 -0
  264. data/vendor/lexbor/source/lexbor/html/interfaces/directory_element.h +34 -0
  265. data/vendor/lexbor/source/lexbor/html/interfaces/div_element.c +36 -0
  266. data/vendor/lexbor/source/lexbor/html/interfaces/div_element.h +34 -0
  267. data/vendor/lexbor/source/lexbor/html/interfaces/document.c +444 -0
  268. data/vendor/lexbor/source/lexbor/html/interfaces/document.h +256 -0
  269. data/vendor/lexbor/source/lexbor/html/interfaces/element.c +64 -0
  270. data/vendor/lexbor/source/lexbor/html/interfaces/element.h +54 -0
  271. data/vendor/lexbor/source/lexbor/html/interfaces/embed_element.c +36 -0
  272. data/vendor/lexbor/source/lexbor/html/interfaces/embed_element.h +34 -0
  273. data/vendor/lexbor/source/lexbor/html/interfaces/field_set_element.c +36 -0
  274. data/vendor/lexbor/source/lexbor/html/interfaces/field_set_element.h +34 -0
  275. data/vendor/lexbor/source/lexbor/html/interfaces/font_element.c +36 -0
  276. data/vendor/lexbor/source/lexbor/html/interfaces/font_element.h +34 -0
  277. data/vendor/lexbor/source/lexbor/html/interfaces/form_element.c +36 -0
  278. data/vendor/lexbor/source/lexbor/html/interfaces/form_element.h +34 -0
  279. data/vendor/lexbor/source/lexbor/html/interfaces/frame_element.c +36 -0
  280. data/vendor/lexbor/source/lexbor/html/interfaces/frame_element.h +34 -0
  281. data/vendor/lexbor/source/lexbor/html/interfaces/frame_set_element.c +36 -0
  282. data/vendor/lexbor/source/lexbor/html/interfaces/frame_set_element.h +34 -0
  283. data/vendor/lexbor/source/lexbor/html/interfaces/head_element.c +36 -0
  284. data/vendor/lexbor/source/lexbor/html/interfaces/head_element.h +34 -0
  285. data/vendor/lexbor/source/lexbor/html/interfaces/heading_element.c +36 -0
  286. data/vendor/lexbor/source/lexbor/html/interfaces/heading_element.h +34 -0
  287. data/vendor/lexbor/source/lexbor/html/interfaces/hr_element.c +36 -0
  288. data/vendor/lexbor/source/lexbor/html/interfaces/hr_element.h +34 -0
  289. data/vendor/lexbor/source/lexbor/html/interfaces/html_element.c +36 -0
  290. data/vendor/lexbor/source/lexbor/html/interfaces/html_element.h +34 -0
  291. data/vendor/lexbor/source/lexbor/html/interfaces/iframe_element.c +36 -0
  292. data/vendor/lexbor/source/lexbor/html/interfaces/iframe_element.h +34 -0
  293. data/vendor/lexbor/source/lexbor/html/interfaces/image_element.c +36 -0
  294. data/vendor/lexbor/source/lexbor/html/interfaces/image_element.h +34 -0
  295. data/vendor/lexbor/source/lexbor/html/interfaces/input_element.c +36 -0
  296. data/vendor/lexbor/source/lexbor/html/interfaces/input_element.h +34 -0
  297. data/vendor/lexbor/source/lexbor/html/interfaces/label_element.c +36 -0
  298. data/vendor/lexbor/source/lexbor/html/interfaces/label_element.h +34 -0
  299. data/vendor/lexbor/source/lexbor/html/interfaces/legend_element.c +36 -0
  300. data/vendor/lexbor/source/lexbor/html/interfaces/legend_element.h +34 -0
  301. data/vendor/lexbor/source/lexbor/html/interfaces/li_element.c +36 -0
  302. data/vendor/lexbor/source/lexbor/html/interfaces/li_element.h +34 -0
  303. data/vendor/lexbor/source/lexbor/html/interfaces/link_element.c +36 -0
  304. data/vendor/lexbor/source/lexbor/html/interfaces/link_element.h +34 -0
  305. data/vendor/lexbor/source/lexbor/html/interfaces/map_element.c +36 -0
  306. data/vendor/lexbor/source/lexbor/html/interfaces/map_element.h +34 -0
  307. data/vendor/lexbor/source/lexbor/html/interfaces/marquee_element.c +36 -0
  308. data/vendor/lexbor/source/lexbor/html/interfaces/marquee_element.h +34 -0
  309. data/vendor/lexbor/source/lexbor/html/interfaces/media_element.c +36 -0
  310. data/vendor/lexbor/source/lexbor/html/interfaces/media_element.h +34 -0
  311. data/vendor/lexbor/source/lexbor/html/interfaces/menu_element.c +36 -0
  312. data/vendor/lexbor/source/lexbor/html/interfaces/menu_element.h +34 -0
  313. data/vendor/lexbor/source/lexbor/html/interfaces/meta_element.c +36 -0
  314. data/vendor/lexbor/source/lexbor/html/interfaces/meta_element.h +34 -0
  315. data/vendor/lexbor/source/lexbor/html/interfaces/meter_element.c +36 -0
  316. data/vendor/lexbor/source/lexbor/html/interfaces/meter_element.h +34 -0
  317. data/vendor/lexbor/source/lexbor/html/interfaces/mod_element.c +36 -0
  318. data/vendor/lexbor/source/lexbor/html/interfaces/mod_element.h +34 -0
  319. data/vendor/lexbor/source/lexbor/html/interfaces/o_list_element.c +36 -0
  320. data/vendor/lexbor/source/lexbor/html/interfaces/o_list_element.h +34 -0
  321. data/vendor/lexbor/source/lexbor/html/interfaces/object_element.c +36 -0
  322. data/vendor/lexbor/source/lexbor/html/interfaces/object_element.h +34 -0
  323. data/vendor/lexbor/source/lexbor/html/interfaces/opt_group_element.c +36 -0
  324. data/vendor/lexbor/source/lexbor/html/interfaces/opt_group_element.h +34 -0
  325. data/vendor/lexbor/source/lexbor/html/interfaces/option_element.c +36 -0
  326. data/vendor/lexbor/source/lexbor/html/interfaces/option_element.h +34 -0
  327. data/vendor/lexbor/source/lexbor/html/interfaces/output_element.c +36 -0
  328. data/vendor/lexbor/source/lexbor/html/interfaces/output_element.h +34 -0
  329. data/vendor/lexbor/source/lexbor/html/interfaces/paragraph_element.c +36 -0
  330. data/vendor/lexbor/source/lexbor/html/interfaces/paragraph_element.h +34 -0
  331. data/vendor/lexbor/source/lexbor/html/interfaces/param_element.c +36 -0
  332. data/vendor/lexbor/source/lexbor/html/interfaces/param_element.h +34 -0
  333. data/vendor/lexbor/source/lexbor/html/interfaces/picture_element.c +36 -0
  334. data/vendor/lexbor/source/lexbor/html/interfaces/picture_element.h +34 -0
  335. data/vendor/lexbor/source/lexbor/html/interfaces/pre_element.c +36 -0
  336. data/vendor/lexbor/source/lexbor/html/interfaces/pre_element.h +34 -0
  337. data/vendor/lexbor/source/lexbor/html/interfaces/progress_element.c +36 -0
  338. data/vendor/lexbor/source/lexbor/html/interfaces/progress_element.h +34 -0
  339. data/vendor/lexbor/source/lexbor/html/interfaces/quote_element.c +36 -0
  340. data/vendor/lexbor/source/lexbor/html/interfaces/quote_element.h +34 -0
  341. data/vendor/lexbor/source/lexbor/html/interfaces/script_element.c +36 -0
  342. data/vendor/lexbor/source/lexbor/html/interfaces/script_element.h +34 -0
  343. data/vendor/lexbor/source/lexbor/html/interfaces/select_element.c +36 -0
  344. data/vendor/lexbor/source/lexbor/html/interfaces/select_element.h +34 -0
  345. data/vendor/lexbor/source/lexbor/html/interfaces/slot_element.c +36 -0
  346. data/vendor/lexbor/source/lexbor/html/interfaces/slot_element.h +34 -0
  347. data/vendor/lexbor/source/lexbor/html/interfaces/source_element.c +36 -0
  348. data/vendor/lexbor/source/lexbor/html/interfaces/source_element.h +34 -0
  349. data/vendor/lexbor/source/lexbor/html/interfaces/span_element.c +36 -0
  350. data/vendor/lexbor/source/lexbor/html/interfaces/span_element.h +34 -0
  351. data/vendor/lexbor/source/lexbor/html/interfaces/style_element.c +36 -0
  352. data/vendor/lexbor/source/lexbor/html/interfaces/style_element.h +34 -0
  353. data/vendor/lexbor/source/lexbor/html/interfaces/table_caption_element.c +36 -0
  354. data/vendor/lexbor/source/lexbor/html/interfaces/table_caption_element.h +34 -0
  355. data/vendor/lexbor/source/lexbor/html/interfaces/table_cell_element.c +36 -0
  356. data/vendor/lexbor/source/lexbor/html/interfaces/table_cell_element.h +34 -0
  357. data/vendor/lexbor/source/lexbor/html/interfaces/table_col_element.c +36 -0
  358. data/vendor/lexbor/source/lexbor/html/interfaces/table_col_element.h +34 -0
  359. data/vendor/lexbor/source/lexbor/html/interfaces/table_element.c +36 -0
  360. data/vendor/lexbor/source/lexbor/html/interfaces/table_element.h +34 -0
  361. data/vendor/lexbor/source/lexbor/html/interfaces/table_row_element.c +36 -0
  362. data/vendor/lexbor/source/lexbor/html/interfaces/table_row_element.h +34 -0
  363. data/vendor/lexbor/source/lexbor/html/interfaces/table_section_element.c +36 -0
  364. data/vendor/lexbor/source/lexbor/html/interfaces/table_section_element.h +34 -0
  365. data/vendor/lexbor/source/lexbor/html/interfaces/template_element.c +46 -0
  366. data/vendor/lexbor/source/lexbor/html/interfaces/template_element.h +38 -0
  367. data/vendor/lexbor/source/lexbor/html/interfaces/text_area_element.c +36 -0
  368. data/vendor/lexbor/source/lexbor/html/interfaces/text_area_element.h +34 -0
  369. data/vendor/lexbor/source/lexbor/html/interfaces/time_element.c +36 -0
  370. data/vendor/lexbor/source/lexbor/html/interfaces/time_element.h +34 -0
  371. data/vendor/lexbor/source/lexbor/html/interfaces/title_element.c +133 -0
  372. data/vendor/lexbor/source/lexbor/html/interfaces/title_element.h +42 -0
  373. data/vendor/lexbor/source/lexbor/html/interfaces/track_element.c +36 -0
  374. data/vendor/lexbor/source/lexbor/html/interfaces/track_element.h +34 -0
  375. data/vendor/lexbor/source/lexbor/html/interfaces/u_list_element.c +36 -0
  376. data/vendor/lexbor/source/lexbor/html/interfaces/u_list_element.h +34 -0
  377. data/vendor/lexbor/source/lexbor/html/interfaces/unknown_element.c +36 -0
  378. data/vendor/lexbor/source/lexbor/html/interfaces/unknown_element.h +34 -0
  379. data/vendor/lexbor/source/lexbor/html/interfaces/video_element.c +36 -0
  380. data/vendor/lexbor/source/lexbor/html/interfaces/video_element.h +34 -0
  381. data/vendor/lexbor/source/lexbor/html/interfaces/window.c +36 -0
  382. data/vendor/lexbor/source/lexbor/html/interfaces/window.h +34 -0
  383. data/vendor/lexbor/source/lexbor/html/node.c +14 -0
  384. data/vendor/lexbor/source/lexbor/html/node.h +67 -0
  385. data/vendor/lexbor/source/lexbor/html/parser.c +469 -0
  386. data/vendor/lexbor/source/lexbor/html/parser.h +170 -0
  387. data/vendor/lexbor/source/lexbor/html/serialize.c +1510 -0
  388. data/vendor/lexbor/source/lexbor/html/serialize.h +93 -0
  389. data/vendor/lexbor/source/lexbor/html/tag.h +103 -0
  390. data/vendor/lexbor/source/lexbor/html/tag_res.h +2262 -0
  391. data/vendor/lexbor/source/lexbor/html/token.c +386 -0
  392. data/vendor/lexbor/source/lexbor/html/token.h +130 -0
  393. data/vendor/lexbor/source/lexbor/html/token_attr.c +44 -0
  394. data/vendor/lexbor/source/lexbor/html/token_attr.h +67 -0
  395. data/vendor/lexbor/source/lexbor/html/tokenizer/error.c +28 -0
  396. data/vendor/lexbor/source/lexbor/html/tokenizer/error.h +141 -0
  397. data/vendor/lexbor/source/lexbor/html/tokenizer/res.h +4956 -0
  398. data/vendor/lexbor/source/lexbor/html/tokenizer/state.c +2171 -0
  399. data/vendor/lexbor/source/lexbor/html/tokenizer/state.h +225 -0
  400. data/vendor/lexbor/source/lexbor/html/tokenizer/state_comment.c +489 -0
  401. data/vendor/lexbor/source/lexbor/html/tokenizer/state_comment.h +27 -0
  402. data/vendor/lexbor/source/lexbor/html/tokenizer/state_doctype.c +1654 -0
  403. data/vendor/lexbor/source/lexbor/html/tokenizer/state_doctype.h +27 -0
  404. data/vendor/lexbor/source/lexbor/html/tokenizer/state_rawtext.c +303 -0
  405. data/vendor/lexbor/source/lexbor/html/tokenizer/state_rawtext.h +32 -0
  406. data/vendor/lexbor/source/lexbor/html/tokenizer/state_rcdata.c +311 -0
  407. data/vendor/lexbor/source/lexbor/html/tokenizer/state_rcdata.h +32 -0
  408. data/vendor/lexbor/source/lexbor/html/tokenizer/state_script.c +1209 -0
  409. data/vendor/lexbor/source/lexbor/html/tokenizer/state_script.h +32 -0
  410. data/vendor/lexbor/source/lexbor/html/tokenizer.c +499 -0
  411. data/vendor/lexbor/source/lexbor/html/tokenizer.h +343 -0
  412. data/vendor/lexbor/source/lexbor/html/tree/active_formatting.c +241 -0
  413. data/vendor/lexbor/source/lexbor/html/tree/active_formatting.h +117 -0
  414. data/vendor/lexbor/source/lexbor/html/tree/error.c +26 -0
  415. data/vendor/lexbor/source/lexbor/html/tree/error.h +114 -0
  416. data/vendor/lexbor/source/lexbor/html/tree/insertion_mode/after_after_body.c +62 -0
  417. data/vendor/lexbor/source/lexbor/html/tree/insertion_mode/after_after_frameset.c +63 -0
  418. data/vendor/lexbor/source/lexbor/html/tree/insertion_mode/after_body.c +82 -0
  419. data/vendor/lexbor/source/lexbor/html/tree/insertion_mode/after_frameset.c +88 -0
  420. data/vendor/lexbor/source/lexbor/html/tree/insertion_mode/after_head.c +222 -0
  421. data/vendor/lexbor/source/lexbor/html/tree/insertion_mode/before_head.c +144 -0
  422. data/vendor/lexbor/source/lexbor/html/tree/insertion_mode/before_html.c +166 -0
  423. data/vendor/lexbor/source/lexbor/html/tree/insertion_mode/foreign_content.c +358 -0
  424. data/vendor/lexbor/source/lexbor/html/tree/insertion_mode/in_body.c +1974 -0
  425. data/vendor/lexbor/source/lexbor/html/tree/insertion_mode/in_caption.c +158 -0
  426. data/vendor/lexbor/source/lexbor/html/tree/insertion_mode/in_cell.c +187 -0
  427. data/vendor/lexbor/source/lexbor/html/tree/insertion_mode/in_column_group.c +194 -0
  428. data/vendor/lexbor/source/lexbor/html/tree/insertion_mode/in_frameset.c +149 -0
  429. data/vendor/lexbor/source/lexbor/html/tree/insertion_mode/in_head.c +374 -0
  430. data/vendor/lexbor/source/lexbor/html/tree/insertion_mode/in_head_noscript.c +121 -0
  431. data/vendor/lexbor/source/lexbor/html/tree/insertion_mode/in_row.c +211 -0
  432. data/vendor/lexbor/source/lexbor/html/tree/insertion_mode/in_select.c +341 -0
  433. data/vendor/lexbor/source/lexbor/html/tree/insertion_mode/in_select_in_table.c +115 -0
  434. data/vendor/lexbor/source/lexbor/html/tree/insertion_mode/in_table.c +451 -0
  435. data/vendor/lexbor/source/lexbor/html/tree/insertion_mode/in_table_body.c +208 -0
  436. data/vendor/lexbor/source/lexbor/html/tree/insertion_mode/in_table_text.c +127 -0
  437. data/vendor/lexbor/source/lexbor/html/tree/insertion_mode/in_template.c +189 -0
  438. data/vendor/lexbor/source/lexbor/html/tree/insertion_mode/initial.c +411 -0
  439. data/vendor/lexbor/source/lexbor/html/tree/insertion_mode/text.c +61 -0
  440. data/vendor/lexbor/source/lexbor/html/tree/insertion_mode.h +135 -0
  441. data/vendor/lexbor/source/lexbor/html/tree/open_elements.c +251 -0
  442. data/vendor/lexbor/source/lexbor/html/tree/open_elements.h +105 -0
  443. data/vendor/lexbor/source/lexbor/html/tree/template_insertion.c +10 -0
  444. data/vendor/lexbor/source/lexbor/html/tree/template_insertion.h +100 -0
  445. data/vendor/lexbor/source/lexbor/html/tree.c +1726 -0
  446. data/vendor/lexbor/source/lexbor/html/tree.h +431 -0
  447. data/vendor/lexbor/source/lexbor/html/tree_res.h +111 -0
  448. data/vendor/lexbor/source/lexbor/ns/base.h +32 -0
  449. data/vendor/lexbor/source/lexbor/ns/config.cmake +2 -0
  450. data/vendor/lexbor/source/lexbor/ns/const.h +37 -0
  451. data/vendor/lexbor/source/lexbor/ns/ns.c +154 -0
  452. data/vendor/lexbor/source/lexbor/ns/ns.h +66 -0
  453. data/vendor/lexbor/source/lexbor/ns/res.h +97 -0
  454. data/vendor/lexbor/source/lexbor/ports/posix/config.cmake +11 -0
  455. data/vendor/lexbor/source/lexbor/ports/posix/lexbor/core/fs.c +236 -0
  456. data/vendor/lexbor/source/lexbor/ports/posix/lexbor/core/memory.c +33 -0
  457. data/vendor/lexbor/source/lexbor/ports/posix/lexbor/core/perf.c +158 -0
  458. data/vendor/lexbor/source/lexbor/ports/windows_nt/config.cmake +18 -0
  459. data/vendor/lexbor/source/lexbor/ports/windows_nt/lexbor/core/fs.c +239 -0
  460. data/vendor/lexbor/source/lexbor/ports/windows_nt/lexbor/core/memory.c +33 -0
  461. data/vendor/lexbor/source/lexbor/ports/windows_nt/lexbor/core/perf.c +81 -0
  462. data/vendor/lexbor/source/lexbor/selectors/base.h +30 -0
  463. data/vendor/lexbor/source/lexbor/selectors/config.cmake +2 -0
  464. data/vendor/lexbor/source/lexbor/selectors/selectors.c +1591 -0
  465. data/vendor/lexbor/source/lexbor/selectors/selectors.h +71 -0
  466. data/vendor/lexbor/source/lexbor/tag/base.h +32 -0
  467. data/vendor/lexbor/source/lexbor/tag/config.cmake +2 -0
  468. data/vendor/lexbor/source/lexbor/tag/const.h +225 -0
  469. data/vendor/lexbor/source/lexbor/tag/res.h +562 -0
  470. data/vendor/lexbor/source/lexbor/tag/tag.c +144 -0
  471. data/vendor/lexbor/source/lexbor/tag/tag.h +123 -0
  472. data/vendor/lexbor/source/lexbor/utils/base.h +32 -0
  473. data/vendor/lexbor/source/lexbor/utils/config.cmake +2 -0
  474. data/vendor/lexbor/source/lexbor/utils/http.c +534 -0
  475. data/vendor/lexbor/source/lexbor/utils/http.h +90 -0
  476. data/vendor/lexbor/source/lexbor/utils/utils.h +15 -0
  477. data/vendor/lexbor/source/lexbor/utils/warc.c +817 -0
  478. data/vendor/lexbor/source/lexbor/utils/warc.h +126 -0
  479. data/vendor/lexbor/utils/lexbor/css/selectors/pseudo.py +231 -0
  480. data/vendor/lexbor/utils/lexbor/css/selectors/tmp/const.h +21 -0
  481. data/vendor/lexbor/utils/lexbor/css/selectors/tmp/res.h +26 -0
  482. data/vendor/lexbor/utils/lexbor/css/syntax/definitions.py +49 -0
  483. data/vendor/lexbor/utils/lexbor/css/syntax/token_res.py +54 -0
  484. data/vendor/lexbor/utils/lexbor/css/syntax/tokenizer_code_map.py +36 -0
  485. data/vendor/lexbor/version +1 -0
  486. metadata +542 -0
@@ -0,0 +1,1141 @@
1
+ /*
2
+ * hash.c: chained hash tables
3
+ *
4
+ * Reference: Your favorite introductory book on algorithms
5
+ *
6
+ * Copyright (C) 2000,2012 Bjorn Reese and Daniel Veillard.
7
+ *
8
+ * Permission to use, copy, modify, and distribute this software for any
9
+ * purpose with or without fee is hereby granted, provided that the above
10
+ * copyright notice and this permission notice appear in all copies.
11
+ *
12
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
13
+ * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
14
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE AUTHORS AND
15
+ * CONTRIBUTORS ACCEPT NO RESPONSIBILITY IN ANY CONCEIVABLE MANNER.
16
+ *
17
+ * Author: breese@users.sourceforge.net
18
+ */
19
+
20
+ #define IN_LIBXML
21
+ #include "libxml.h"
22
+
23
+ #include <string.h>
24
+ #include <stdlib.h>
25
+ #include <time.h>
26
+
27
+ /*
28
+ * Following http://www.ocert.org/advisories/ocert-2011-003.html
29
+ * it seems that having hash randomization might be a good idea
30
+ * when using XML with untrusted data
31
+ */
32
+ #if !defined(FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION)
33
+ #define HASH_RANDOMIZATION
34
+ #endif
35
+
36
+ #include "libxml/parser.h"
37
+ #include "libxml/hash.h"
38
+ #include "libxml/xmlmemory.h"
39
+ #include "libxml/xmlerror.h"
40
+ #include "libxml/globals.h"
41
+
42
+ #include "private/dict.h"
43
+
44
+ #define MAX_HASH_LEN 8
45
+
46
+ /* #define DEBUG_GROW */
47
+
48
+ /*
49
+ * A single entry in the hash table
50
+ */
51
+ typedef struct _xmlHashEntry xmlHashEntry;
52
+ typedef xmlHashEntry *xmlHashEntryPtr;
53
+ struct _xmlHashEntry {
54
+ struct _xmlHashEntry *next;
55
+ xmlChar *name;
56
+ xmlChar *name2;
57
+ xmlChar *name3;
58
+ void *payload;
59
+ int valid;
60
+ };
61
+
62
+ /*
63
+ * The entire hash table
64
+ */
65
+ struct _xmlHashTable {
66
+ struct _xmlHashEntry *table;
67
+ int size;
68
+ int nbElems;
69
+ xmlDictPtr dict;
70
+ #ifdef HASH_RANDOMIZATION
71
+ int random_seed;
72
+ #endif
73
+ };
74
+
75
+ /*
76
+ * xmlHashComputeKey:
77
+ * Calculate the hash key
78
+ */
79
+ #ifdef __clang__
80
+ ATTRIBUTE_NO_SANITIZE("unsigned-integer-overflow")
81
+ #endif
82
+ static unsigned long
83
+ xmlHashComputeKey(xmlHashTablePtr table, const xmlChar *name,
84
+ const xmlChar *name2, const xmlChar *name3) {
85
+ unsigned long value = 0L;
86
+ unsigned long ch;
87
+
88
+ #ifdef HASH_RANDOMIZATION
89
+ value = table->random_seed;
90
+ #endif
91
+ if (name != NULL) {
92
+ value += 30 * (*name);
93
+ while ((ch = *name++) != 0) {
94
+ value = value ^ ((value << 5) + (value >> 3) + ch);
95
+ }
96
+ }
97
+ value = value ^ ((value << 5) + (value >> 3));
98
+ if (name2 != NULL) {
99
+ while ((ch = *name2++) != 0) {
100
+ value = value ^ ((value << 5) + (value >> 3) + ch);
101
+ }
102
+ }
103
+ value = value ^ ((value << 5) + (value >> 3));
104
+ if (name3 != NULL) {
105
+ while ((ch = *name3++) != 0) {
106
+ value = value ^ ((value << 5) + (value >> 3) + ch);
107
+ }
108
+ }
109
+ return (value % table->size);
110
+ }
111
+
112
+ #ifdef __clang__
113
+ ATTRIBUTE_NO_SANITIZE("unsigned-integer-overflow")
114
+ #endif
115
+ static unsigned long
116
+ xmlHashComputeQKey(xmlHashTablePtr table,
117
+ const xmlChar *prefix, const xmlChar *name,
118
+ const xmlChar *prefix2, const xmlChar *name2,
119
+ const xmlChar *prefix3, const xmlChar *name3) {
120
+ unsigned long value = 0L;
121
+ unsigned long ch;
122
+
123
+ #ifdef HASH_RANDOMIZATION
124
+ value = table->random_seed;
125
+ #endif
126
+ if (prefix != NULL)
127
+ value += 30 * (*prefix);
128
+ else
129
+ value += 30 * (*name);
130
+
131
+ if (prefix != NULL) {
132
+ while ((ch = *prefix++) != 0) {
133
+ value = value ^ ((value << 5) + (value >> 3) + ch);
134
+ }
135
+ value = value ^ ((value << 5) + (value >> 3) + ':');
136
+ }
137
+ if (name != NULL) {
138
+ while ((ch = *name++) != 0) {
139
+ value = value ^ ((value << 5) + (value >> 3) + ch);
140
+ }
141
+ }
142
+ value = value ^ ((value << 5) + (value >> 3));
143
+ if (prefix2 != NULL) {
144
+ while ((ch = *prefix2++) != 0) {
145
+ value = value ^ ((value << 5) + (value >> 3) + ch);
146
+ }
147
+ value = value ^ ((value << 5) + (value >> 3) + ':');
148
+ }
149
+ if (name2 != NULL) {
150
+ while ((ch = *name2++) != 0) {
151
+ value = value ^ ((value << 5) + (value >> 3) + ch);
152
+ }
153
+ }
154
+ value = value ^ ((value << 5) + (value >> 3));
155
+ if (prefix3 != NULL) {
156
+ while ((ch = *prefix3++) != 0) {
157
+ value = value ^ ((value << 5) + (value >> 3) + ch);
158
+ }
159
+ value = value ^ ((value << 5) + (value >> 3) + ':');
160
+ }
161
+ if (name3 != NULL) {
162
+ while ((ch = *name3++) != 0) {
163
+ value = value ^ ((value << 5) + (value >> 3) + ch);
164
+ }
165
+ }
166
+ return (value % table->size);
167
+ }
168
+
169
+ /**
170
+ * xmlHashCreate:
171
+ * @size: the size of the hash table
172
+ *
173
+ * Create a new xmlHashTablePtr.
174
+ *
175
+ * Returns the newly created object, or NULL if an error occurred.
176
+ */
177
+ xmlHashTablePtr
178
+ xmlHashCreate(int size) {
179
+ xmlHashTablePtr table;
180
+
181
+ if (size <= 0)
182
+ size = 256;
183
+
184
+ table = xmlMalloc(sizeof(xmlHashTable));
185
+ if (table) {
186
+ table->dict = NULL;
187
+ table->size = size;
188
+ table->nbElems = 0;
189
+ table->table = xmlMalloc(size * sizeof(xmlHashEntry));
190
+ if (table->table) {
191
+ memset(table->table, 0, size * sizeof(xmlHashEntry));
192
+ #ifdef HASH_RANDOMIZATION
193
+ table->random_seed = __xmlRandom();
194
+ #endif
195
+ return(table);
196
+ }
197
+ xmlFree(table);
198
+ }
199
+ return(NULL);
200
+ }
201
+
202
+ /**
203
+ * xmlHashCreateDict:
204
+ * @size: the size of the hash table
205
+ * @dict: a dictionary to use for the hash
206
+ *
207
+ * Create a new xmlHashTablePtr which will use @dict as the internal dictionary
208
+ *
209
+ * Returns the newly created object, or NULL if an error occurred.
210
+ */
211
+ xmlHashTablePtr
212
+ xmlHashCreateDict(int size, xmlDictPtr dict) {
213
+ xmlHashTablePtr table;
214
+
215
+ table = xmlHashCreate(size);
216
+ if (table != NULL) {
217
+ table->dict = dict;
218
+ xmlDictReference(dict);
219
+ }
220
+ return(table);
221
+ }
222
+
223
+ /**
224
+ * xmlHashGrow:
225
+ * @table: the hash table
226
+ * @size: the new size of the hash table
227
+ *
228
+ * resize the hash table
229
+ *
230
+ * Returns 0 in case of success, -1 in case of failure
231
+ */
232
+ static int
233
+ xmlHashGrow(xmlHashTablePtr table, int size) {
234
+ unsigned long key;
235
+ int oldsize, i;
236
+ xmlHashEntryPtr iter, next;
237
+ struct _xmlHashEntry *oldtable;
238
+ #ifdef DEBUG_GROW
239
+ unsigned long nbElem = 0;
240
+ #endif
241
+
242
+ if (table == NULL)
243
+ return(-1);
244
+ if (size < 8)
245
+ return(-1);
246
+ if (size > 8 * 2048)
247
+ return(-1);
248
+
249
+ oldsize = table->size;
250
+ oldtable = table->table;
251
+ if (oldtable == NULL)
252
+ return(-1);
253
+
254
+ table->table = xmlMalloc(size * sizeof(xmlHashEntry));
255
+ if (table->table == NULL) {
256
+ table->table = oldtable;
257
+ return(-1);
258
+ }
259
+ memset(table->table, 0, size * sizeof(xmlHashEntry));
260
+ table->size = size;
261
+
262
+ /* If the two loops are merged, there would be situations where
263
+ a new entry needs to allocated and data copied into it from
264
+ the main table. So instead, we run through the array twice, first
265
+ copying all the elements in the main array (where we can't get
266
+ conflicts) and then the rest, so we only free (and don't allocate)
267
+ */
268
+ for (i = 0; i < oldsize; i++) {
269
+ if (oldtable[i].valid == 0)
270
+ continue;
271
+ key = xmlHashComputeKey(table, oldtable[i].name, oldtable[i].name2,
272
+ oldtable[i].name3);
273
+ memcpy(&(table->table[key]), &(oldtable[i]), sizeof(xmlHashEntry));
274
+ table->table[key].next = NULL;
275
+ }
276
+
277
+ for (i = 0; i < oldsize; i++) {
278
+ iter = oldtable[i].next;
279
+ while (iter) {
280
+ next = iter->next;
281
+
282
+ /*
283
+ * put back the entry in the new table
284
+ */
285
+
286
+ key = xmlHashComputeKey(table, iter->name, iter->name2,
287
+ iter->name3);
288
+ if (table->table[key].valid == 0) {
289
+ memcpy(&(table->table[key]), iter, sizeof(xmlHashEntry));
290
+ table->table[key].next = NULL;
291
+ xmlFree(iter);
292
+ } else {
293
+ iter->next = table->table[key].next;
294
+ table->table[key].next = iter;
295
+ }
296
+
297
+ #ifdef DEBUG_GROW
298
+ nbElem++;
299
+ #endif
300
+
301
+ iter = next;
302
+ }
303
+ }
304
+
305
+ xmlFree(oldtable);
306
+
307
+ #ifdef DEBUG_GROW
308
+ xmlGenericError(xmlGenericErrorContext,
309
+ "xmlHashGrow : from %d to %d, %d elems\n", oldsize, size, nbElem);
310
+ #endif
311
+
312
+ return(0);
313
+ }
314
+
315
+ /**
316
+ * xmlHashFree:
317
+ * @table: the hash table
318
+ * @f: the deallocator function for items in the hash
319
+ *
320
+ * Free the hash @table and its contents. The userdata is
321
+ * deallocated with @f if provided.
322
+ */
323
+ void
324
+ xmlHashFree(xmlHashTablePtr table, xmlHashDeallocator f) {
325
+ int i;
326
+ xmlHashEntryPtr iter;
327
+ xmlHashEntryPtr next;
328
+ int inside_table = 0;
329
+ int nbElems;
330
+
331
+ if (table == NULL)
332
+ return;
333
+ if (table->table) {
334
+ nbElems = table->nbElems;
335
+ for(i = 0; (i < table->size) && (nbElems > 0); i++) {
336
+ iter = &(table->table[i]);
337
+ if (iter->valid == 0)
338
+ continue;
339
+ inside_table = 1;
340
+ while (iter) {
341
+ next = iter->next;
342
+ if ((f != NULL) && (iter->payload != NULL))
343
+ f(iter->payload, iter->name);
344
+ if (table->dict == NULL) {
345
+ if (iter->name)
346
+ xmlFree(iter->name);
347
+ if (iter->name2)
348
+ xmlFree(iter->name2);
349
+ if (iter->name3)
350
+ xmlFree(iter->name3);
351
+ }
352
+ iter->payload = NULL;
353
+ if (!inside_table)
354
+ xmlFree(iter);
355
+ nbElems--;
356
+ inside_table = 0;
357
+ iter = next;
358
+ }
359
+ }
360
+ xmlFree(table->table);
361
+ }
362
+ if (table->dict)
363
+ xmlDictFree(table->dict);
364
+ xmlFree(table);
365
+ }
366
+
367
+ /**
368
+ * xmlHashDefaultDeallocator:
369
+ * @entry: the hash table entry
370
+ * @name: the entry's name
371
+ *
372
+ * Free a hash table entry with xmlFree.
373
+ */
374
+ void
375
+ xmlHashDefaultDeallocator(void *entry, const xmlChar *name ATTRIBUTE_UNUSED) {
376
+ xmlFree(entry);
377
+ }
378
+
379
+ /**
380
+ * xmlHashAddEntry:
381
+ * @table: the hash table
382
+ * @name: the name of the userdata
383
+ * @userdata: a pointer to the userdata
384
+ *
385
+ * Add the @userdata to the hash @table. This can later be retrieved
386
+ * by using the @name. Duplicate names generate errors.
387
+ *
388
+ * Returns 0 the addition succeeded and -1 in case of error.
389
+ */
390
+ int
391
+ xmlHashAddEntry(xmlHashTablePtr table, const xmlChar *name, void *userdata) {
392
+ return(xmlHashAddEntry3(table, name, NULL, NULL, userdata));
393
+ }
394
+
395
+ /**
396
+ * xmlHashAddEntry2:
397
+ * @table: the hash table
398
+ * @name: the name of the userdata
399
+ * @name2: a second name of the userdata
400
+ * @userdata: a pointer to the userdata
401
+ *
402
+ * Add the @userdata to the hash @table. This can later be retrieved
403
+ * by using the (@name, @name2) tuple. Duplicate tuples generate errors.
404
+ *
405
+ * Returns 0 the addition succeeded and -1 in case of error.
406
+ */
407
+ int
408
+ xmlHashAddEntry2(xmlHashTablePtr table, const xmlChar *name,
409
+ const xmlChar *name2, void *userdata) {
410
+ return(xmlHashAddEntry3(table, name, name2, NULL, userdata));
411
+ }
412
+
413
+ /**
414
+ * xmlHashUpdateEntry:
415
+ * @table: the hash table
416
+ * @name: the name of the userdata
417
+ * @userdata: a pointer to the userdata
418
+ * @f: the deallocator function for replaced item (if any)
419
+ *
420
+ * Add the @userdata to the hash @table. This can later be retrieved
421
+ * by using the @name. Existing entry for this @name will be removed
422
+ * and freed with @f if found.
423
+ *
424
+ * Returns 0 the addition succeeded and -1 in case of error.
425
+ */
426
+ int
427
+ xmlHashUpdateEntry(xmlHashTablePtr table, const xmlChar *name,
428
+ void *userdata, xmlHashDeallocator f) {
429
+ return(xmlHashUpdateEntry3(table, name, NULL, NULL, userdata, f));
430
+ }
431
+
432
+ /**
433
+ * xmlHashUpdateEntry2:
434
+ * @table: the hash table
435
+ * @name: the name of the userdata
436
+ * @name2: a second name of the userdata
437
+ * @userdata: a pointer to the userdata
438
+ * @f: the deallocator function for replaced item (if any)
439
+ *
440
+ * Add the @userdata to the hash @table. This can later be retrieved
441
+ * by using the (@name, @name2) tuple. Existing entry for this tuple will
442
+ * be removed and freed with @f if found.
443
+ *
444
+ * Returns 0 the addition succeeded and -1 in case of error.
445
+ */
446
+ int
447
+ xmlHashUpdateEntry2(xmlHashTablePtr table, const xmlChar *name,
448
+ const xmlChar *name2, void *userdata,
449
+ xmlHashDeallocator f) {
450
+ return(xmlHashUpdateEntry3(table, name, name2, NULL, userdata, f));
451
+ }
452
+
453
+ /**
454
+ * xmlHashLookup:
455
+ * @table: the hash table
456
+ * @name: the name of the userdata
457
+ *
458
+ * Find the userdata specified by the @name.
459
+ *
460
+ * Returns the pointer to the userdata
461
+ */
462
+ void *
463
+ xmlHashLookup(xmlHashTablePtr table, const xmlChar *name) {
464
+ return(xmlHashLookup3(table, name, NULL, NULL));
465
+ }
466
+
467
+ /**
468
+ * xmlHashLookup2:
469
+ * @table: the hash table
470
+ * @name: the name of the userdata
471
+ * @name2: a second name of the userdata
472
+ *
473
+ * Find the userdata specified by the (@name, @name2) tuple.
474
+ *
475
+ * Returns the pointer to the userdata
476
+ */
477
+ void *
478
+ xmlHashLookup2(xmlHashTablePtr table, const xmlChar *name,
479
+ const xmlChar *name2) {
480
+ return(xmlHashLookup3(table, name, name2, NULL));
481
+ }
482
+
483
+ /**
484
+ * xmlHashQLookup:
485
+ * @table: the hash table
486
+ * @prefix: the prefix of the userdata
487
+ * @name: the name of the userdata
488
+ *
489
+ * Find the userdata specified by the QName @prefix:@name/@name.
490
+ *
491
+ * Returns the pointer to the userdata
492
+ */
493
+ void *
494
+ xmlHashQLookup(xmlHashTablePtr table, const xmlChar *prefix,
495
+ const xmlChar *name) {
496
+ return(xmlHashQLookup3(table, prefix, name, NULL, NULL, NULL, NULL));
497
+ }
498
+
499
+ /**
500
+ * xmlHashQLookup2:
501
+ * @table: the hash table
502
+ * @prefix: the prefix of the userdata
503
+ * @name: the name of the userdata
504
+ * @prefix2: the second prefix of the userdata
505
+ * @name2: a second name of the userdata
506
+ *
507
+ * Find the userdata specified by the QNames tuple
508
+ *
509
+ * Returns the pointer to the userdata
510
+ */
511
+ void *
512
+ xmlHashQLookup2(xmlHashTablePtr table, const xmlChar *prefix,
513
+ const xmlChar *name, const xmlChar *prefix2,
514
+ const xmlChar *name2) {
515
+ return(xmlHashQLookup3(table, prefix, name, prefix2, name2, NULL, NULL));
516
+ }
517
+
518
+ /**
519
+ * xmlHashAddEntry3:
520
+ * @table: the hash table
521
+ * @name: the name of the userdata
522
+ * @name2: a second name of the userdata
523
+ * @name3: a third name of the userdata
524
+ * @userdata: a pointer to the userdata
525
+ *
526
+ * Add the @userdata to the hash @table. This can later be retrieved
527
+ * by using the tuple (@name, @name2, @name3). Duplicate entries generate
528
+ * errors.
529
+ *
530
+ * Returns 0 the addition succeeded and -1 in case of error.
531
+ */
532
+ int
533
+ xmlHashAddEntry3(xmlHashTablePtr table, const xmlChar *name,
534
+ const xmlChar *name2, const xmlChar *name3,
535
+ void *userdata) {
536
+ unsigned long key, len = 0;
537
+ xmlHashEntryPtr entry;
538
+ xmlHashEntryPtr insert;
539
+
540
+ if ((table == NULL) || (name == NULL))
541
+ return(-1);
542
+
543
+ /*
544
+ * If using a dict internalize if needed
545
+ */
546
+ if (table->dict) {
547
+ if (!xmlDictOwns(table->dict, name)) {
548
+ name = xmlDictLookup(table->dict, name, -1);
549
+ if (name == NULL)
550
+ return(-1);
551
+ }
552
+ if ((name2 != NULL) && (!xmlDictOwns(table->dict, name2))) {
553
+ name2 = xmlDictLookup(table->dict, name2, -1);
554
+ if (name2 == NULL)
555
+ return(-1);
556
+ }
557
+ if ((name3 != NULL) && (!xmlDictOwns(table->dict, name3))) {
558
+ name3 = xmlDictLookup(table->dict, name3, -1);
559
+ if (name3 == NULL)
560
+ return(-1);
561
+ }
562
+ }
563
+
564
+ /*
565
+ * Check for duplicate and insertion location.
566
+ */
567
+ key = xmlHashComputeKey(table, name, name2, name3);
568
+ if (table->table[key].valid == 0) {
569
+ insert = NULL;
570
+ } else {
571
+ if (table->dict) {
572
+ for (insert = &(table->table[key]); insert->next != NULL;
573
+ insert = insert->next) {
574
+ if ((insert->name == name) &&
575
+ (insert->name2 == name2) &&
576
+ (insert->name3 == name3))
577
+ return(-1);
578
+ len++;
579
+ }
580
+ if ((insert->name == name) &&
581
+ (insert->name2 == name2) &&
582
+ (insert->name3 == name3))
583
+ return(-1);
584
+ } else {
585
+ for (insert = &(table->table[key]); insert->next != NULL;
586
+ insert = insert->next) {
587
+ if ((xmlStrEqual(insert->name, name)) &&
588
+ (xmlStrEqual(insert->name2, name2)) &&
589
+ (xmlStrEqual(insert->name3, name3)))
590
+ return(-1);
591
+ len++;
592
+ }
593
+ if ((xmlStrEqual(insert->name, name)) &&
594
+ (xmlStrEqual(insert->name2, name2)) &&
595
+ (xmlStrEqual(insert->name3, name3)))
596
+ return(-1);
597
+ }
598
+ }
599
+
600
+ if (insert == NULL) {
601
+ entry = &(table->table[key]);
602
+ } else {
603
+ entry = xmlMalloc(sizeof(xmlHashEntry));
604
+ if (entry == NULL)
605
+ return(-1);
606
+ }
607
+
608
+ if (table->dict != NULL) {
609
+ entry->name = (xmlChar *) name;
610
+ entry->name2 = (xmlChar *) name2;
611
+ entry->name3 = (xmlChar *) name3;
612
+ } else {
613
+ entry->name = xmlStrdup(name);
614
+ entry->name2 = xmlStrdup(name2);
615
+ entry->name3 = xmlStrdup(name3);
616
+ }
617
+ entry->payload = userdata;
618
+ entry->next = NULL;
619
+ entry->valid = 1;
620
+
621
+
622
+ if (insert != NULL)
623
+ insert->next = entry;
624
+
625
+ table->nbElems++;
626
+
627
+ if (len > MAX_HASH_LEN)
628
+ xmlHashGrow(table, MAX_HASH_LEN * table->size);
629
+
630
+ return(0);
631
+ }
632
+
633
+ /**
634
+ * xmlHashUpdateEntry3:
635
+ * @table: the hash table
636
+ * @name: the name of the userdata
637
+ * @name2: a second name of the userdata
638
+ * @name3: a third name of the userdata
639
+ * @userdata: a pointer to the userdata
640
+ * @f: the deallocator function for replaced item (if any)
641
+ *
642
+ * Add the @userdata to the hash @table. This can later be retrieved
643
+ * by using the tuple (@name, @name2, @name3). Existing entry for this tuple
644
+ * will be removed and freed with @f if found.
645
+ *
646
+ * Returns 0 the addition succeeded and -1 in case of error.
647
+ */
648
+ int
649
+ xmlHashUpdateEntry3(xmlHashTablePtr table, const xmlChar *name,
650
+ const xmlChar *name2, const xmlChar *name3,
651
+ void *userdata, xmlHashDeallocator f) {
652
+ unsigned long key;
653
+ xmlHashEntryPtr entry;
654
+ xmlHashEntryPtr insert;
655
+
656
+ if ((table == NULL) || name == NULL)
657
+ return(-1);
658
+
659
+ /*
660
+ * If using a dict internalize if needed
661
+ */
662
+ if (table->dict) {
663
+ if (!xmlDictOwns(table->dict, name)) {
664
+ name = xmlDictLookup(table->dict, name, -1);
665
+ if (name == NULL)
666
+ return(-1);
667
+ }
668
+ if ((name2 != NULL) && (!xmlDictOwns(table->dict, name2))) {
669
+ name2 = xmlDictLookup(table->dict, name2, -1);
670
+ if (name2 == NULL)
671
+ return(-1);
672
+ }
673
+ if ((name3 != NULL) && (!xmlDictOwns(table->dict, name3))) {
674
+ name3 = xmlDictLookup(table->dict, name3, -1);
675
+ if (name3 == NULL)
676
+ return(-1);
677
+ }
678
+ }
679
+
680
+ /*
681
+ * Check for duplicate and insertion location.
682
+ */
683
+ key = xmlHashComputeKey(table, name, name2, name3);
684
+ if (table->table[key].valid == 0) {
685
+ insert = NULL;
686
+ } else {
687
+ if (table ->dict) {
688
+ for (insert = &(table->table[key]); insert->next != NULL;
689
+ insert = insert->next) {
690
+ if ((insert->name == name) &&
691
+ (insert->name2 == name2) &&
692
+ (insert->name3 == name3)) {
693
+ if (f)
694
+ f(insert->payload, insert->name);
695
+ insert->payload = userdata;
696
+ return(0);
697
+ }
698
+ }
699
+ if ((insert->name == name) &&
700
+ (insert->name2 == name2) &&
701
+ (insert->name3 == name3)) {
702
+ if (f)
703
+ f(insert->payload, insert->name);
704
+ insert->payload = userdata;
705
+ return(0);
706
+ }
707
+ } else {
708
+ for (insert = &(table->table[key]); insert->next != NULL;
709
+ insert = insert->next) {
710
+ if ((xmlStrEqual(insert->name, name)) &&
711
+ (xmlStrEqual(insert->name2, name2)) &&
712
+ (xmlStrEqual(insert->name3, name3))) {
713
+ if (f)
714
+ f(insert->payload, insert->name);
715
+ insert->payload = userdata;
716
+ return(0);
717
+ }
718
+ }
719
+ if ((xmlStrEqual(insert->name, name)) &&
720
+ (xmlStrEqual(insert->name2, name2)) &&
721
+ (xmlStrEqual(insert->name3, name3))) {
722
+ if (f)
723
+ f(insert->payload, insert->name);
724
+ insert->payload = userdata;
725
+ return(0);
726
+ }
727
+ }
728
+ }
729
+
730
+ if (insert == NULL) {
731
+ entry = &(table->table[key]);
732
+ } else {
733
+ entry = xmlMalloc(sizeof(xmlHashEntry));
734
+ if (entry == NULL)
735
+ return(-1);
736
+ }
737
+
738
+ if (table->dict != NULL) {
739
+ entry->name = (xmlChar *) name;
740
+ entry->name2 = (xmlChar *) name2;
741
+ entry->name3 = (xmlChar *) name3;
742
+ } else {
743
+ entry->name = xmlStrdup(name);
744
+ entry->name2 = xmlStrdup(name2);
745
+ entry->name3 = xmlStrdup(name3);
746
+ }
747
+ entry->payload = userdata;
748
+ entry->next = NULL;
749
+ entry->valid = 1;
750
+ table->nbElems++;
751
+
752
+
753
+ if (insert != NULL) {
754
+ insert->next = entry;
755
+ }
756
+ return(0);
757
+ }
758
+
759
+ /**
760
+ * xmlHashLookup3:
761
+ * @table: the hash table
762
+ * @name: the name of the userdata
763
+ * @name2: a second name of the userdata
764
+ * @name3: a third name of the userdata
765
+ *
766
+ * Find the userdata specified by the (@name, @name2, @name3) tuple.
767
+ *
768
+ * Returns the a pointer to the userdata
769
+ */
770
+ void *
771
+ xmlHashLookup3(xmlHashTablePtr table, const xmlChar *name,
772
+ const xmlChar *name2, const xmlChar *name3) {
773
+ unsigned long key;
774
+ xmlHashEntryPtr entry;
775
+
776
+ if (table == NULL)
777
+ return(NULL);
778
+ if (name == NULL)
779
+ return(NULL);
780
+ key = xmlHashComputeKey(table, name, name2, name3);
781
+ if (table->table[key].valid == 0)
782
+ return(NULL);
783
+ if (table->dict) {
784
+ for (entry = &(table->table[key]); entry != NULL; entry = entry->next) {
785
+ if ((entry->name == name) &&
786
+ (entry->name2 == name2) &&
787
+ (entry->name3 == name3))
788
+ return(entry->payload);
789
+ }
790
+ }
791
+ for (entry = &(table->table[key]); entry != NULL; entry = entry->next) {
792
+ if ((xmlStrEqual(entry->name, name)) &&
793
+ (xmlStrEqual(entry->name2, name2)) &&
794
+ (xmlStrEqual(entry->name3, name3)))
795
+ return(entry->payload);
796
+ }
797
+ return(NULL);
798
+ }
799
+
800
+ /**
801
+ * xmlHashQLookup3:
802
+ * @table: the hash table
803
+ * @prefix: the prefix of the userdata
804
+ * @name: the name of the userdata
805
+ * @prefix2: the second prefix of the userdata
806
+ * @name2: a second name of the userdata
807
+ * @prefix3: the third prefix of the userdata
808
+ * @name3: a third name of the userdata
809
+ *
810
+ * Find the userdata specified by the (@name, @name2, @name3) tuple.
811
+ *
812
+ * Returns the a pointer to the userdata
813
+ */
814
+ void *
815
+ xmlHashQLookup3(xmlHashTablePtr table,
816
+ const xmlChar *prefix, const xmlChar *name,
817
+ const xmlChar *prefix2, const xmlChar *name2,
818
+ const xmlChar *prefix3, const xmlChar *name3) {
819
+ unsigned long key;
820
+ xmlHashEntryPtr entry;
821
+
822
+ if (table == NULL)
823
+ return(NULL);
824
+ if (name == NULL)
825
+ return(NULL);
826
+ key = xmlHashComputeQKey(table, prefix, name, prefix2,
827
+ name2, prefix3, name3);
828
+ if (table->table[key].valid == 0)
829
+ return(NULL);
830
+ for (entry = &(table->table[key]); entry != NULL; entry = entry->next) {
831
+ if ((xmlStrQEqual(prefix, name, entry->name)) &&
832
+ (xmlStrQEqual(prefix2, name2, entry->name2)) &&
833
+ (xmlStrQEqual(prefix3, name3, entry->name3)))
834
+ return(entry->payload);
835
+ }
836
+ return(NULL);
837
+ }
838
+
839
+ typedef struct {
840
+ xmlHashScanner hashscanner;
841
+ void *data;
842
+ } stubData;
843
+
844
+ static void
845
+ stubHashScannerFull (void *payload, void *data, const xmlChar *name,
846
+ const xmlChar *name2 ATTRIBUTE_UNUSED,
847
+ const xmlChar *name3 ATTRIBUTE_UNUSED) {
848
+ stubData *stubdata = (stubData *) data;
849
+ stubdata->hashscanner (payload, stubdata->data, (xmlChar *) name);
850
+ }
851
+
852
+ /**
853
+ * xmlHashScan:
854
+ * @table: the hash table
855
+ * @f: the scanner function for items in the hash
856
+ * @data: extra data passed to f
857
+ *
858
+ * Scan the hash @table and applied @f to each value.
859
+ */
860
+ void
861
+ xmlHashScan(xmlHashTablePtr table, xmlHashScanner f, void *data) {
862
+ stubData stubdata;
863
+ stubdata.data = data;
864
+ stubdata.hashscanner = f;
865
+ xmlHashScanFull (table, stubHashScannerFull, &stubdata);
866
+ }
867
+
868
+ /**
869
+ * xmlHashScanFull:
870
+ * @table: the hash table
871
+ * @f: the scanner function for items in the hash
872
+ * @data: extra data passed to f
873
+ *
874
+ * Scan the hash @table and applied @f to each value.
875
+ */
876
+ void
877
+ xmlHashScanFull(xmlHashTablePtr table, xmlHashScannerFull f, void *data) {
878
+ int i, nb;
879
+ xmlHashEntryPtr iter;
880
+ xmlHashEntryPtr next;
881
+
882
+ if (table == NULL)
883
+ return;
884
+ if (f == NULL)
885
+ return;
886
+
887
+ if (table->table) {
888
+ for(i = 0; i < table->size; i++) {
889
+ if (table->table[i].valid == 0)
890
+ continue;
891
+ iter = &(table->table[i]);
892
+ while (iter) {
893
+ next = iter->next;
894
+ nb = table->nbElems;
895
+ if ((f != NULL) && (iter->payload != NULL))
896
+ f(iter->payload, data, iter->name,
897
+ iter->name2, iter->name3);
898
+ if (nb != table->nbElems) {
899
+ /* table was modified by the callback, be careful */
900
+ if (iter == &(table->table[i])) {
901
+ if (table->table[i].valid == 0)
902
+ iter = NULL;
903
+ if (table->table[i].next != next)
904
+ iter = &(table->table[i]);
905
+ } else
906
+ iter = next;
907
+ } else
908
+ iter = next;
909
+ }
910
+ }
911
+ }
912
+ }
913
+
914
+ /**
915
+ * xmlHashScan3:
916
+ * @table: the hash table
917
+ * @name: the name of the userdata or NULL
918
+ * @name2: a second name of the userdata or NULL
919
+ * @name3: a third name of the userdata or NULL
920
+ * @f: the scanner function for items in the hash
921
+ * @data: extra data passed to f
922
+ *
923
+ * Scan the hash @table and applied @f to each value matching
924
+ * (@name, @name2, @name3) tuple. If one of the names is null,
925
+ * the comparison is considered to match.
926
+ */
927
+ void
928
+ xmlHashScan3(xmlHashTablePtr table, const xmlChar *name,
929
+ const xmlChar *name2, const xmlChar *name3,
930
+ xmlHashScanner f, void *data) {
931
+ stubData stubdata;
932
+ stubdata.data = data;
933
+ stubdata.hashscanner = f;
934
+ xmlHashScanFull3(table, name, name2, name3, stubHashScannerFull,
935
+ &stubdata);
936
+ }
937
+
938
+ /**
939
+ * xmlHashScanFull3:
940
+ * @table: the hash table
941
+ * @name: the name of the userdata or NULL
942
+ * @name2: a second name of the userdata or NULL
943
+ * @name3: a third name of the userdata or NULL
944
+ * @f: the scanner function for items in the hash
945
+ * @data: extra data passed to f
946
+ *
947
+ * Scan the hash @table and applied @f to each value matching
948
+ * (@name, @name2, @name3) tuple. If one of the names is null,
949
+ * the comparison is considered to match.
950
+ */
951
+ void
952
+ xmlHashScanFull3(xmlHashTablePtr table, const xmlChar *name,
953
+ const xmlChar *name2, const xmlChar *name3,
954
+ xmlHashScannerFull f, void *data) {
955
+ int i;
956
+ xmlHashEntryPtr iter;
957
+ xmlHashEntryPtr next;
958
+
959
+ if (table == NULL)
960
+ return;
961
+ if (f == NULL)
962
+ return;
963
+
964
+ if (table->table) {
965
+ for(i = 0; i < table->size; i++) {
966
+ if (table->table[i].valid == 0)
967
+ continue;
968
+ iter = &(table->table[i]);
969
+ while (iter) {
970
+ next = iter->next;
971
+ if (((name == NULL) || (xmlStrEqual(name, iter->name))) &&
972
+ ((name2 == NULL) || (xmlStrEqual(name2, iter->name2))) &&
973
+ ((name3 == NULL) || (xmlStrEqual(name3, iter->name3))) &&
974
+ (iter->payload != NULL)) {
975
+ f(iter->payload, data, iter->name,
976
+ iter->name2, iter->name3);
977
+ }
978
+ iter = next;
979
+ }
980
+ }
981
+ }
982
+ }
983
+
984
+ /**
985
+ * xmlHashCopy:
986
+ * @table: the hash table
987
+ * @f: the copier function for items in the hash
988
+ *
989
+ * Scan the hash @table and applied @f to each value.
990
+ *
991
+ * Returns the new table or NULL in case of error.
992
+ */
993
+ xmlHashTablePtr
994
+ xmlHashCopy(xmlHashTablePtr table, xmlHashCopier f) {
995
+ int i;
996
+ xmlHashEntryPtr iter;
997
+ xmlHashEntryPtr next;
998
+ xmlHashTablePtr ret;
999
+
1000
+ if (table == NULL)
1001
+ return(NULL);
1002
+ if (f == NULL)
1003
+ return(NULL);
1004
+
1005
+ ret = xmlHashCreate(table->size);
1006
+ if (ret == NULL)
1007
+ return(NULL);
1008
+
1009
+ if (table->table) {
1010
+ for(i = 0; i < table->size; i++) {
1011
+ if (table->table[i].valid == 0)
1012
+ continue;
1013
+ iter = &(table->table[i]);
1014
+ while (iter) {
1015
+ next = iter->next;
1016
+ xmlHashAddEntry3(ret, iter->name, iter->name2,
1017
+ iter->name3, f(iter->payload, iter->name));
1018
+ iter = next;
1019
+ }
1020
+ }
1021
+ }
1022
+ ret->nbElems = table->nbElems;
1023
+ return(ret);
1024
+ }
1025
+
1026
+ /**
1027
+ * xmlHashSize:
1028
+ * @table: the hash table
1029
+ *
1030
+ * Query the number of elements installed in the hash @table.
1031
+ *
1032
+ * Returns the number of elements in the hash table or
1033
+ * -1 in case of error
1034
+ */
1035
+ int
1036
+ xmlHashSize(xmlHashTablePtr table) {
1037
+ if (table == NULL)
1038
+ return(-1);
1039
+ return(table->nbElems);
1040
+ }
1041
+
1042
+ /**
1043
+ * xmlHashRemoveEntry:
1044
+ * @table: the hash table
1045
+ * @name: the name of the userdata
1046
+ * @f: the deallocator function for removed item (if any)
1047
+ *
1048
+ * Find the userdata specified by the @name and remove
1049
+ * it from the hash @table. Existing userdata for this tuple will be removed
1050
+ * and freed with @f.
1051
+ *
1052
+ * Returns 0 if the removal succeeded and -1 in case of error or not found.
1053
+ */
1054
+ int xmlHashRemoveEntry(xmlHashTablePtr table, const xmlChar *name,
1055
+ xmlHashDeallocator f) {
1056
+ return(xmlHashRemoveEntry3(table, name, NULL, NULL, f));
1057
+ }
1058
+
1059
+ /**
1060
+ * xmlHashRemoveEntry2:
1061
+ * @table: the hash table
1062
+ * @name: the name of the userdata
1063
+ * @name2: a second name of the userdata
1064
+ * @f: the deallocator function for removed item (if any)
1065
+ *
1066
+ * Find the userdata specified by the (@name, @name2) tuple and remove
1067
+ * it from the hash @table. Existing userdata for this tuple will be removed
1068
+ * and freed with @f.
1069
+ *
1070
+ * Returns 0 if the removal succeeded and -1 in case of error or not found.
1071
+ */
1072
+ int
1073
+ xmlHashRemoveEntry2(xmlHashTablePtr table, const xmlChar *name,
1074
+ const xmlChar *name2, xmlHashDeallocator f) {
1075
+ return(xmlHashRemoveEntry3(table, name, name2, NULL, f));
1076
+ }
1077
+
1078
+ /**
1079
+ * xmlHashRemoveEntry3:
1080
+ * @table: the hash table
1081
+ * @name: the name of the userdata
1082
+ * @name2: a second name of the userdata
1083
+ * @name3: a third name of the userdata
1084
+ * @f: the deallocator function for removed item (if any)
1085
+ *
1086
+ * Find the userdata specified by the (@name, @name2, @name3) tuple and remove
1087
+ * it from the hash @table. Existing userdata for this tuple will be removed
1088
+ * and freed with @f.
1089
+ *
1090
+ * Returns 0 if the removal succeeded and -1 in case of error or not found.
1091
+ */
1092
+ int
1093
+ xmlHashRemoveEntry3(xmlHashTablePtr table, const xmlChar *name,
1094
+ const xmlChar *name2, const xmlChar *name3, xmlHashDeallocator f) {
1095
+ unsigned long key;
1096
+ xmlHashEntryPtr entry;
1097
+ xmlHashEntryPtr prev = NULL;
1098
+
1099
+ if (table == NULL || name == NULL)
1100
+ return(-1);
1101
+
1102
+ key = xmlHashComputeKey(table, name, name2, name3);
1103
+ if (table->table[key].valid == 0) {
1104
+ return(-1);
1105
+ } else {
1106
+ for (entry = &(table->table[key]); entry != NULL; entry = entry->next) {
1107
+ if (xmlStrEqual(entry->name, name) &&
1108
+ xmlStrEqual(entry->name2, name2) &&
1109
+ xmlStrEqual(entry->name3, name3)) {
1110
+ if ((f != NULL) && (entry->payload != NULL))
1111
+ f(entry->payload, entry->name);
1112
+ entry->payload = NULL;
1113
+ if (table->dict == NULL) {
1114
+ if(entry->name)
1115
+ xmlFree(entry->name);
1116
+ if(entry->name2)
1117
+ xmlFree(entry->name2);
1118
+ if(entry->name3)
1119
+ xmlFree(entry->name3);
1120
+ }
1121
+ if(prev) {
1122
+ prev->next = entry->next;
1123
+ xmlFree(entry);
1124
+ } else {
1125
+ if (entry->next == NULL) {
1126
+ entry->valid = 0;
1127
+ } else {
1128
+ entry = entry->next;
1129
+ memcpy(&(table->table[key]), entry, sizeof(xmlHashEntry));
1130
+ xmlFree(entry);
1131
+ }
1132
+ }
1133
+ table->nbElems--;
1134
+ return(0);
1135
+ }
1136
+ prev = entry;
1137
+ }
1138
+ return(-1);
1139
+ }
1140
+ }
1141
+