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,1264 @@
1
+ /*
2
+ * dict.c: dictionary of reusable strings, just used to avoid allocation
3
+ * and freeing operations.
4
+ *
5
+ * Copyright (C) 2003-2012 Daniel Veillard.
6
+ *
7
+ * Permission to use, copy, modify, and distribute this software for any
8
+ * purpose with or without fee is hereby granted, provided that the above
9
+ * copyright notice and this permission notice appear in all copies.
10
+ *
11
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
12
+ * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
13
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE AUTHORS AND
14
+ * CONTRIBUTORS ACCEPT NO RESPONSIBILITY IN ANY CONCEIVABLE MANNER.
15
+ *
16
+ * Author: daniel@veillard.com
17
+ */
18
+
19
+ #define IN_LIBXML
20
+ #include "libxml.h"
21
+
22
+ #include <limits.h>
23
+ #include <stdlib.h>
24
+ #include <time.h>
25
+
26
+ #include "private/dict.h"
27
+ #include "private/threads.h"
28
+
29
+ /*
30
+ * Following http://www.ocert.org/advisories/ocert-2011-003.html
31
+ * it seems that having hash randomization might be a good idea
32
+ * when using XML with untrusted data
33
+ * Note1: that it works correctly only if compiled with WITH_BIG_KEY
34
+ * which is the default.
35
+ * Note2: the fast function used for a small dict won't protect very
36
+ * well but since the attack is based on growing a very big hash
37
+ * list we will use the BigKey algo as soon as the hash size grows
38
+ * over MIN_DICT_SIZE so this actually works
39
+ */
40
+ #if !defined(FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION)
41
+ #define DICT_RANDOMIZATION
42
+ #endif
43
+
44
+ #include <string.h>
45
+ #ifdef HAVE_STDINT_H
46
+ #include <stdint.h>
47
+ #else
48
+ #ifdef HAVE_INTTYPES_H
49
+ #include <inttypes.h>
50
+ #elif defined(_WIN32)
51
+ typedef unsigned __int32 uint32_t;
52
+ #endif
53
+ #endif
54
+ #include "libxml/tree.h"
55
+ #include "libxml/dict.h"
56
+ #include "libxml/xmlmemory.h"
57
+ #include "libxml/xmlerror.h"
58
+ #include "libxml/globals.h"
59
+
60
+ /* #define DEBUG_GROW */
61
+ /* #define DICT_DEBUG_PATTERNS */
62
+
63
+ #define MAX_HASH_LEN 3
64
+ #define MIN_DICT_SIZE 128
65
+ #define MAX_DICT_HASH 8 * 2048
66
+ #define WITH_BIG_KEY
67
+
68
+ #ifdef WITH_BIG_KEY
69
+ #define xmlDictComputeKey(dict, name, len) \
70
+ (((dict)->size == MIN_DICT_SIZE) ? \
71
+ xmlDictComputeFastKey(name, len, (dict)->seed) : \
72
+ xmlDictComputeBigKey(name, len, (dict)->seed))
73
+
74
+ #define xmlDictComputeQKey(dict, prefix, plen, name, len) \
75
+ (((prefix) == NULL) ? \
76
+ (xmlDictComputeKey(dict, name, len)) : \
77
+ (((dict)->size == MIN_DICT_SIZE) ? \
78
+ xmlDictComputeFastQKey(prefix, plen, name, len, (dict)->seed) : \
79
+ xmlDictComputeBigQKey(prefix, plen, name, len, (dict)->seed)))
80
+
81
+ #else /* !WITH_BIG_KEY */
82
+ #define xmlDictComputeKey(dict, name, len) \
83
+ xmlDictComputeFastKey(name, len, (dict)->seed)
84
+ #define xmlDictComputeQKey(dict, prefix, plen, name, len) \
85
+ xmlDictComputeFastQKey(prefix, plen, name, len, (dict)->seed)
86
+ #endif /* WITH_BIG_KEY */
87
+
88
+ /*
89
+ * An entry in the dictionary
90
+ */
91
+ typedef struct _xmlDictEntry xmlDictEntry;
92
+ typedef xmlDictEntry *xmlDictEntryPtr;
93
+ struct _xmlDictEntry {
94
+ struct _xmlDictEntry *next;
95
+ const xmlChar *name;
96
+ unsigned int len;
97
+ int valid;
98
+ unsigned long okey;
99
+ };
100
+
101
+ typedef struct _xmlDictStrings xmlDictStrings;
102
+ typedef xmlDictStrings *xmlDictStringsPtr;
103
+ struct _xmlDictStrings {
104
+ xmlDictStringsPtr next;
105
+ xmlChar *free;
106
+ xmlChar *end;
107
+ size_t size;
108
+ size_t nbStrings;
109
+ xmlChar array[1];
110
+ };
111
+ /*
112
+ * The entire dictionary
113
+ */
114
+ struct _xmlDict {
115
+ int ref_counter;
116
+
117
+ struct _xmlDictEntry *dict;
118
+ size_t size;
119
+ unsigned int nbElems;
120
+ xmlDictStringsPtr strings;
121
+
122
+ struct _xmlDict *subdict;
123
+ /* used for randomization */
124
+ int seed;
125
+ /* used to impose a limit on size */
126
+ size_t limit;
127
+ };
128
+
129
+ /*
130
+ * A mutex for modifying the reference counter for shared
131
+ * dictionaries.
132
+ */
133
+ static xmlMutex xmlDictMutex;
134
+
135
+ #ifdef DICT_RANDOMIZATION
136
+ #ifdef HAVE_RAND_R
137
+ /*
138
+ * Internal data for random function, protected by xmlDictMutex
139
+ */
140
+ static unsigned int rand_seed = 0;
141
+ #endif
142
+ #endif
143
+
144
+ /**
145
+ * xmlInitializeDict:
146
+ *
147
+ * DEPRECATED: Alias for xmlInitParser.
148
+ */
149
+ int xmlInitializeDict(void) {
150
+ xmlInitParser();
151
+ return(0);
152
+ }
153
+
154
+ /**
155
+ * __xmlInitializeDict:
156
+ *
157
+ * This function is not public
158
+ * Do the dictionary mutex initialization.
159
+ */
160
+ int __xmlInitializeDict(void) {
161
+ xmlInitMutex(&xmlDictMutex);
162
+
163
+ #ifdef DICT_RANDOMIZATION
164
+ #ifdef HAVE_RAND_R
165
+ rand_seed = time(NULL);
166
+ rand_r(& rand_seed);
167
+ #else
168
+ srand(time(NULL));
169
+ #endif
170
+ #endif
171
+ return(1);
172
+ }
173
+
174
+ #ifdef DICT_RANDOMIZATION
175
+ int __xmlRandom(void) {
176
+ int ret;
177
+
178
+ xmlMutexLock(&xmlDictMutex);
179
+ #ifdef HAVE_RAND_R
180
+ ret = rand_r(& rand_seed);
181
+ #else
182
+ ret = rand();
183
+ #endif
184
+ xmlMutexUnlock(&xmlDictMutex);
185
+ return(ret);
186
+ }
187
+ #endif
188
+
189
+ /**
190
+ * xmlDictCleanup:
191
+ *
192
+ * DEPRECATED: This function is a no-op. Call xmlCleanupParser
193
+ * to free global state but see the warnings there. xmlCleanupParser
194
+ * should be only called once at program exit. In most cases, you don't
195
+ * have call cleanup functions at all.
196
+ */
197
+ void
198
+ xmlDictCleanup(void) {
199
+ }
200
+
201
+ /**
202
+ * xmlCleanupDictInternal:
203
+ *
204
+ * Free the dictionary mutex.
205
+ */
206
+ void
207
+ xmlCleanupDictInternal(void) {
208
+ xmlCleanupMutex(&xmlDictMutex);
209
+ }
210
+
211
+ /*
212
+ * xmlDictAddString:
213
+ * @dict: the dictionary
214
+ * @name: the name of the userdata
215
+ * @len: the length of the name
216
+ *
217
+ * Add the string to the array[s]
218
+ *
219
+ * Returns the pointer of the local string, or NULL in case of error.
220
+ */
221
+ static const xmlChar *
222
+ xmlDictAddString(xmlDictPtr dict, const xmlChar *name, unsigned int namelen) {
223
+ xmlDictStringsPtr pool;
224
+ const xmlChar *ret;
225
+ size_t size = 0; /* + sizeof(_xmlDictStrings) == 1024 */
226
+ size_t limit = 0;
227
+
228
+ #ifdef DICT_DEBUG_PATTERNS
229
+ fprintf(stderr, "-");
230
+ #endif
231
+ pool = dict->strings;
232
+ while (pool != NULL) {
233
+ if ((size_t)(pool->end - pool->free) > namelen)
234
+ goto found_pool;
235
+ if (pool->size > size) size = pool->size;
236
+ limit += pool->size;
237
+ pool = pool->next;
238
+ }
239
+ /*
240
+ * Not found, need to allocate
241
+ */
242
+ if (pool == NULL) {
243
+ if ((dict->limit > 0) && (limit > dict->limit)) {
244
+ return(NULL);
245
+ }
246
+
247
+ if (size == 0) size = 1000;
248
+ else size *= 4; /* exponential growth */
249
+ if (size < 4 * namelen)
250
+ size = 4 * namelen; /* just in case ! */
251
+ pool = (xmlDictStringsPtr) xmlMalloc(sizeof(xmlDictStrings) + size);
252
+ if (pool == NULL)
253
+ return(NULL);
254
+ pool->size = size;
255
+ pool->nbStrings = 0;
256
+ pool->free = &pool->array[0];
257
+ pool->end = &pool->array[size];
258
+ pool->next = dict->strings;
259
+ dict->strings = pool;
260
+ #ifdef DICT_DEBUG_PATTERNS
261
+ fprintf(stderr, "+");
262
+ #endif
263
+ }
264
+ found_pool:
265
+ ret = pool->free;
266
+ memcpy(pool->free, name, namelen);
267
+ pool->free += namelen;
268
+ *(pool->free++) = 0;
269
+ pool->nbStrings++;
270
+ return(ret);
271
+ }
272
+
273
+ /*
274
+ * xmlDictAddQString:
275
+ * @dict: the dictionary
276
+ * @prefix: the prefix of the userdata
277
+ * @plen: the prefix length
278
+ * @name: the name of the userdata
279
+ * @len: the length of the name
280
+ *
281
+ * Add the QName to the array[s]
282
+ *
283
+ * Returns the pointer of the local string, or NULL in case of error.
284
+ */
285
+ static const xmlChar *
286
+ xmlDictAddQString(xmlDictPtr dict, const xmlChar *prefix, unsigned int plen,
287
+ const xmlChar *name, unsigned int namelen)
288
+ {
289
+ xmlDictStringsPtr pool;
290
+ const xmlChar *ret;
291
+ size_t size = 0; /* + sizeof(_xmlDictStrings) == 1024 */
292
+ size_t limit = 0;
293
+
294
+ if (prefix == NULL) return(xmlDictAddString(dict, name, namelen));
295
+
296
+ #ifdef DICT_DEBUG_PATTERNS
297
+ fprintf(stderr, "=");
298
+ #endif
299
+ pool = dict->strings;
300
+ while (pool != NULL) {
301
+ if ((size_t)(pool->end - pool->free) > namelen + plen + 1)
302
+ goto found_pool;
303
+ if (pool->size > size) size = pool->size;
304
+ limit += pool->size;
305
+ pool = pool->next;
306
+ }
307
+ /*
308
+ * Not found, need to allocate
309
+ */
310
+ if (pool == NULL) {
311
+ if ((dict->limit > 0) && (limit > dict->limit)) {
312
+ return(NULL);
313
+ }
314
+
315
+ if (size == 0) size = 1000;
316
+ else size *= 4; /* exponential growth */
317
+ if (size < 4 * (namelen + plen + 1))
318
+ size = 4 * (namelen + plen + 1); /* just in case ! */
319
+ pool = (xmlDictStringsPtr) xmlMalloc(sizeof(xmlDictStrings) + size);
320
+ if (pool == NULL)
321
+ return(NULL);
322
+ pool->size = size;
323
+ pool->nbStrings = 0;
324
+ pool->free = &pool->array[0];
325
+ pool->end = &pool->array[size];
326
+ pool->next = dict->strings;
327
+ dict->strings = pool;
328
+ #ifdef DICT_DEBUG_PATTERNS
329
+ fprintf(stderr, "+");
330
+ #endif
331
+ }
332
+ found_pool:
333
+ ret = pool->free;
334
+ memcpy(pool->free, prefix, plen);
335
+ pool->free += plen;
336
+ *(pool->free++) = ':';
337
+ memcpy(pool->free, name, namelen);
338
+ pool->free += namelen;
339
+ *(pool->free++) = 0;
340
+ pool->nbStrings++;
341
+ return(ret);
342
+ }
343
+
344
+ #ifdef WITH_BIG_KEY
345
+ /*
346
+ * xmlDictComputeBigKey:
347
+ *
348
+ * Calculate a hash key using a good hash function that works well for
349
+ * larger hash table sizes.
350
+ *
351
+ * Hash function by "One-at-a-Time Hash" see
352
+ * http://burtleburtle.net/bob/hash/doobs.html
353
+ */
354
+
355
+ #ifdef __clang__
356
+ ATTRIBUTE_NO_SANITIZE("unsigned-integer-overflow")
357
+ #endif
358
+ static uint32_t
359
+ xmlDictComputeBigKey(const xmlChar* data, int namelen, int seed) {
360
+ uint32_t hash;
361
+ int i;
362
+
363
+ if (namelen <= 0 || data == NULL) return(0);
364
+
365
+ hash = seed;
366
+
367
+ for (i = 0;i < namelen; i++) {
368
+ hash += data[i];
369
+ hash += (hash << 10);
370
+ hash ^= (hash >> 6);
371
+ }
372
+ hash += (hash << 3);
373
+ hash ^= (hash >> 11);
374
+ hash += (hash << 15);
375
+
376
+ return hash;
377
+ }
378
+
379
+ /*
380
+ * xmlDictComputeBigQKey:
381
+ *
382
+ * Calculate a hash key for two strings using a good hash function
383
+ * that works well for larger hash table sizes.
384
+ *
385
+ * Hash function by "One-at-a-Time Hash" see
386
+ * http://burtleburtle.net/bob/hash/doobs.html
387
+ *
388
+ * Neither of the two strings must be NULL.
389
+ */
390
+ #ifdef __clang__
391
+ ATTRIBUTE_NO_SANITIZE("unsigned-integer-overflow")
392
+ #endif
393
+ static unsigned long
394
+ xmlDictComputeBigQKey(const xmlChar *prefix, int plen,
395
+ const xmlChar *name, int len, int seed)
396
+ {
397
+ uint32_t hash;
398
+ int i;
399
+
400
+ hash = seed;
401
+
402
+ for (i = 0;i < plen; i++) {
403
+ hash += prefix[i];
404
+ hash += (hash << 10);
405
+ hash ^= (hash >> 6);
406
+ }
407
+ hash += ':';
408
+ hash += (hash << 10);
409
+ hash ^= (hash >> 6);
410
+
411
+ for (i = 0;i < len; i++) {
412
+ hash += name[i];
413
+ hash += (hash << 10);
414
+ hash ^= (hash >> 6);
415
+ }
416
+ hash += (hash << 3);
417
+ hash ^= (hash >> 11);
418
+ hash += (hash << 15);
419
+
420
+ return hash;
421
+ }
422
+ #endif /* WITH_BIG_KEY */
423
+
424
+ /*
425
+ * xmlDictComputeFastKey:
426
+ *
427
+ * Calculate a hash key using a fast hash function that works well
428
+ * for low hash table fill.
429
+ */
430
+ static unsigned long
431
+ xmlDictComputeFastKey(const xmlChar *name, int namelen, int seed) {
432
+ unsigned long value = seed;
433
+
434
+ if (name == NULL) return(0);
435
+ value += *name;
436
+ value <<= 5;
437
+ if (namelen > 10) {
438
+ value += name[namelen - 1];
439
+ namelen = 10;
440
+ }
441
+ switch (namelen) {
442
+ case 10: value += name[9];
443
+ /* Falls through. */
444
+ case 9: value += name[8];
445
+ /* Falls through. */
446
+ case 8: value += name[7];
447
+ /* Falls through. */
448
+ case 7: value += name[6];
449
+ /* Falls through. */
450
+ case 6: value += name[5];
451
+ /* Falls through. */
452
+ case 5: value += name[4];
453
+ /* Falls through. */
454
+ case 4: value += name[3];
455
+ /* Falls through. */
456
+ case 3: value += name[2];
457
+ /* Falls through. */
458
+ case 2: value += name[1];
459
+ /* Falls through. */
460
+ default: break;
461
+ }
462
+ return(value);
463
+ }
464
+
465
+ /*
466
+ * xmlDictComputeFastQKey:
467
+ *
468
+ * Calculate a hash key for two strings using a fast hash function
469
+ * that works well for low hash table fill.
470
+ *
471
+ * Neither of the two strings must be NULL.
472
+ */
473
+ static unsigned long
474
+ xmlDictComputeFastQKey(const xmlChar *prefix, int plen,
475
+ const xmlChar *name, int len, int seed)
476
+ {
477
+ unsigned long value = seed;
478
+
479
+ if (plen == 0)
480
+ value += 30 * ':';
481
+ else
482
+ value += 30 * (*prefix);
483
+
484
+ if (len > 10) {
485
+ int offset = len - (plen + 1 + 1);
486
+ if (offset < 0)
487
+ offset = len - (10 + 1);
488
+ value += name[offset];
489
+ len = 10;
490
+ if (plen > 10)
491
+ plen = 10;
492
+ }
493
+ switch (plen) {
494
+ case 10: value += prefix[9];
495
+ /* Falls through. */
496
+ case 9: value += prefix[8];
497
+ /* Falls through. */
498
+ case 8: value += prefix[7];
499
+ /* Falls through. */
500
+ case 7: value += prefix[6];
501
+ /* Falls through. */
502
+ case 6: value += prefix[5];
503
+ /* Falls through. */
504
+ case 5: value += prefix[4];
505
+ /* Falls through. */
506
+ case 4: value += prefix[3];
507
+ /* Falls through. */
508
+ case 3: value += prefix[2];
509
+ /* Falls through. */
510
+ case 2: value += prefix[1];
511
+ /* Falls through. */
512
+ case 1: value += prefix[0];
513
+ /* Falls through. */
514
+ default: break;
515
+ }
516
+ len -= plen;
517
+ if (len > 0) {
518
+ value += ':';
519
+ len--;
520
+ }
521
+ switch (len) {
522
+ case 10: value += name[9];
523
+ /* Falls through. */
524
+ case 9: value += name[8];
525
+ /* Falls through. */
526
+ case 8: value += name[7];
527
+ /* Falls through. */
528
+ case 7: value += name[6];
529
+ /* Falls through. */
530
+ case 6: value += name[5];
531
+ /* Falls through. */
532
+ case 5: value += name[4];
533
+ /* Falls through. */
534
+ case 4: value += name[3];
535
+ /* Falls through. */
536
+ case 3: value += name[2];
537
+ /* Falls through. */
538
+ case 2: value += name[1];
539
+ /* Falls through. */
540
+ case 1: value += name[0];
541
+ /* Falls through. */
542
+ default: break;
543
+ }
544
+ return(value);
545
+ }
546
+
547
+ /**
548
+ * xmlDictCreate:
549
+ *
550
+ * Create a new dictionary
551
+ *
552
+ * Returns the newly created dictionary, or NULL if an error occurred.
553
+ */
554
+ xmlDictPtr
555
+ xmlDictCreate(void) {
556
+ xmlDictPtr dict;
557
+
558
+ xmlInitParser();
559
+
560
+ #ifdef DICT_DEBUG_PATTERNS
561
+ fprintf(stderr, "C");
562
+ #endif
563
+
564
+ dict = xmlMalloc(sizeof(xmlDict));
565
+ if (dict) {
566
+ dict->ref_counter = 1;
567
+ dict->limit = 0;
568
+
569
+ dict->size = MIN_DICT_SIZE;
570
+ dict->nbElems = 0;
571
+ dict->dict = xmlMalloc(MIN_DICT_SIZE * sizeof(xmlDictEntry));
572
+ dict->strings = NULL;
573
+ dict->subdict = NULL;
574
+ if (dict->dict) {
575
+ memset(dict->dict, 0, MIN_DICT_SIZE * sizeof(xmlDictEntry));
576
+ #ifdef DICT_RANDOMIZATION
577
+ dict->seed = __xmlRandom();
578
+ #else
579
+ dict->seed = 0;
580
+ #endif
581
+ return(dict);
582
+ }
583
+ xmlFree(dict);
584
+ }
585
+ return(NULL);
586
+ }
587
+
588
+ /**
589
+ * xmlDictCreateSub:
590
+ * @sub: an existing dictionary
591
+ *
592
+ * Create a new dictionary, inheriting strings from the read-only
593
+ * dictionary @sub. On lookup, strings are first searched in the
594
+ * new dictionary, then in @sub, and if not found are created in the
595
+ * new dictionary.
596
+ *
597
+ * Returns the newly created dictionary, or NULL if an error occurred.
598
+ */
599
+ xmlDictPtr
600
+ xmlDictCreateSub(xmlDictPtr sub) {
601
+ xmlDictPtr dict = xmlDictCreate();
602
+
603
+ if ((dict != NULL) && (sub != NULL)) {
604
+ #ifdef DICT_DEBUG_PATTERNS
605
+ fprintf(stderr, "R");
606
+ #endif
607
+ dict->seed = sub->seed;
608
+ dict->subdict = sub;
609
+ xmlDictReference(dict->subdict);
610
+ }
611
+ return(dict);
612
+ }
613
+
614
+ /**
615
+ * xmlDictReference:
616
+ * @dict: the dictionary
617
+ *
618
+ * Increment the reference counter of a dictionary
619
+ *
620
+ * Returns 0 in case of success and -1 in case of error
621
+ */
622
+ int
623
+ xmlDictReference(xmlDictPtr dict) {
624
+ if (dict == NULL) return -1;
625
+ xmlMutexLock(&xmlDictMutex);
626
+ dict->ref_counter++;
627
+ xmlMutexUnlock(&xmlDictMutex);
628
+ return(0);
629
+ }
630
+
631
+ /**
632
+ * xmlDictGrow:
633
+ * @dict: the dictionary
634
+ * @size: the new size of the dictionary
635
+ *
636
+ * resize the dictionary
637
+ *
638
+ * Returns 0 in case of success, -1 in case of failure
639
+ */
640
+ static int
641
+ xmlDictGrow(xmlDictPtr dict, size_t size) {
642
+ unsigned long key, okey;
643
+ size_t oldsize, i;
644
+ xmlDictEntryPtr iter, next;
645
+ struct _xmlDictEntry *olddict;
646
+ #ifdef DEBUG_GROW
647
+ unsigned long nbElem = 0;
648
+ #endif
649
+ int ret = 0;
650
+ int keep_keys = 1;
651
+
652
+ if (dict == NULL)
653
+ return(-1);
654
+ if (size < 8)
655
+ return(-1);
656
+ if (size > 8 * 2048)
657
+ return(-1);
658
+
659
+ #ifdef DICT_DEBUG_PATTERNS
660
+ fprintf(stderr, "*");
661
+ #endif
662
+
663
+ oldsize = dict->size;
664
+ olddict = dict->dict;
665
+ if (olddict == NULL)
666
+ return(-1);
667
+ if (oldsize == MIN_DICT_SIZE)
668
+ keep_keys = 0;
669
+
670
+ dict->dict = xmlMalloc(size * sizeof(xmlDictEntry));
671
+ if (dict->dict == NULL) {
672
+ dict->dict = olddict;
673
+ return(-1);
674
+ }
675
+ memset(dict->dict, 0, size * sizeof(xmlDictEntry));
676
+ dict->size = size;
677
+
678
+ /* If the two loops are merged, there would be situations where
679
+ a new entry needs to allocated and data copied into it from
680
+ the main dict. It is nicer to run through the array twice, first
681
+ copying all the elements in the main array (less probability of
682
+ allocate) and then the rest, so we only free in the second loop.
683
+ */
684
+ for (i = 0; i < oldsize; i++) {
685
+ if (olddict[i].valid == 0)
686
+ continue;
687
+
688
+ if (keep_keys)
689
+ okey = olddict[i].okey;
690
+ else
691
+ okey = xmlDictComputeKey(dict, olddict[i].name, olddict[i].len);
692
+ key = okey % dict->size;
693
+
694
+ if (dict->dict[key].valid == 0) {
695
+ memcpy(&(dict->dict[key]), &(olddict[i]), sizeof(xmlDictEntry));
696
+ dict->dict[key].next = NULL;
697
+ dict->dict[key].okey = okey;
698
+ } else {
699
+ xmlDictEntryPtr entry;
700
+
701
+ entry = xmlMalloc(sizeof(xmlDictEntry));
702
+ if (entry != NULL) {
703
+ entry->name = olddict[i].name;
704
+ entry->len = olddict[i].len;
705
+ entry->okey = okey;
706
+ entry->next = dict->dict[key].next;
707
+ entry->valid = 1;
708
+ dict->dict[key].next = entry;
709
+ } else {
710
+ /*
711
+ * we don't have much ways to alert from here
712
+ * result is losing an entry and unicity guarantee
713
+ */
714
+ ret = -1;
715
+ }
716
+ }
717
+ #ifdef DEBUG_GROW
718
+ nbElem++;
719
+ #endif
720
+ }
721
+
722
+ for (i = 0; i < oldsize; i++) {
723
+ iter = olddict[i].next;
724
+ while (iter) {
725
+ next = iter->next;
726
+
727
+ /*
728
+ * put back the entry in the new dict
729
+ */
730
+
731
+ if (keep_keys)
732
+ okey = iter->okey;
733
+ else
734
+ okey = xmlDictComputeKey(dict, iter->name, iter->len);
735
+ key = okey % dict->size;
736
+ if (dict->dict[key].valid == 0) {
737
+ memcpy(&(dict->dict[key]), iter, sizeof(xmlDictEntry));
738
+ dict->dict[key].next = NULL;
739
+ dict->dict[key].valid = 1;
740
+ dict->dict[key].okey = okey;
741
+ xmlFree(iter);
742
+ } else {
743
+ iter->next = dict->dict[key].next;
744
+ iter->okey = okey;
745
+ dict->dict[key].next = iter;
746
+ }
747
+
748
+ #ifdef DEBUG_GROW
749
+ nbElem++;
750
+ #endif
751
+
752
+ iter = next;
753
+ }
754
+ }
755
+
756
+ xmlFree(olddict);
757
+
758
+ #ifdef DEBUG_GROW
759
+ xmlGenericError(xmlGenericErrorContext,
760
+ "xmlDictGrow : from %lu to %lu, %u elems\n", oldsize, size, nbElem);
761
+ #endif
762
+
763
+ return(ret);
764
+ }
765
+
766
+ /**
767
+ * xmlDictFree:
768
+ * @dict: the dictionary
769
+ *
770
+ * Free the hash @dict and its contents. The userdata is
771
+ * deallocated with @f if provided.
772
+ */
773
+ void
774
+ xmlDictFree(xmlDictPtr dict) {
775
+ size_t i;
776
+ xmlDictEntryPtr iter;
777
+ xmlDictEntryPtr next;
778
+ int inside_dict = 0;
779
+ xmlDictStringsPtr pool, nextp;
780
+
781
+ if (dict == NULL)
782
+ return;
783
+
784
+ /* decrement the counter, it may be shared by a parser and docs */
785
+ xmlMutexLock(&xmlDictMutex);
786
+ dict->ref_counter--;
787
+ if (dict->ref_counter > 0) {
788
+ xmlMutexUnlock(&xmlDictMutex);
789
+ return;
790
+ }
791
+
792
+ xmlMutexUnlock(&xmlDictMutex);
793
+
794
+ if (dict->subdict != NULL) {
795
+ xmlDictFree(dict->subdict);
796
+ }
797
+
798
+ if (dict->dict) {
799
+ for(i = 0; ((i < dict->size) && (dict->nbElems > 0)); i++) {
800
+ iter = &(dict->dict[i]);
801
+ if (iter->valid == 0)
802
+ continue;
803
+ inside_dict = 1;
804
+ while (iter) {
805
+ next = iter->next;
806
+ if (!inside_dict)
807
+ xmlFree(iter);
808
+ dict->nbElems--;
809
+ inside_dict = 0;
810
+ iter = next;
811
+ }
812
+ }
813
+ xmlFree(dict->dict);
814
+ }
815
+ pool = dict->strings;
816
+ while (pool != NULL) {
817
+ nextp = pool->next;
818
+ xmlFree(pool);
819
+ pool = nextp;
820
+ }
821
+ xmlFree(dict);
822
+ }
823
+
824
+ /**
825
+ * xmlDictLookup:
826
+ * @dict: the dictionary
827
+ * @name: the name of the userdata
828
+ * @len: the length of the name, if -1 it is recomputed
829
+ *
830
+ * Add the @name to the dictionary @dict if not present.
831
+ *
832
+ * Returns the internal copy of the name or NULL in case of internal error
833
+ */
834
+ const xmlChar *
835
+ xmlDictLookup(xmlDictPtr dict, const xmlChar *name, int len) {
836
+ unsigned long key, okey, nbi = 0;
837
+ xmlDictEntryPtr entry;
838
+ xmlDictEntryPtr insert;
839
+ const xmlChar *ret;
840
+ unsigned int l;
841
+
842
+ if ((dict == NULL) || (name == NULL))
843
+ return(NULL);
844
+
845
+ if (len < 0)
846
+ l = strlen((const char *) name);
847
+ else
848
+ l = len;
849
+
850
+ if (((dict->limit > 0) && (l >= dict->limit)) ||
851
+ (l > INT_MAX / 2))
852
+ return(NULL);
853
+
854
+ /*
855
+ * Check for duplicate and insertion location.
856
+ */
857
+ okey = xmlDictComputeKey(dict, name, l);
858
+ key = okey % dict->size;
859
+ if (dict->dict[key].valid == 0) {
860
+ insert = NULL;
861
+ } else {
862
+ for (insert = &(dict->dict[key]); insert->next != NULL;
863
+ insert = insert->next) {
864
+ #ifdef __GNUC__
865
+ if ((insert->okey == okey) && (insert->len == l)) {
866
+ if (!memcmp(insert->name, name, l))
867
+ return(insert->name);
868
+ }
869
+ #else
870
+ if ((insert->okey == okey) && (insert->len == l) &&
871
+ (!xmlStrncmp(insert->name, name, l)))
872
+ return(insert->name);
873
+ #endif
874
+ nbi++;
875
+ }
876
+ #ifdef __GNUC__
877
+ if ((insert->okey == okey) && (insert->len == l)) {
878
+ if (!memcmp(insert->name, name, l))
879
+ return(insert->name);
880
+ }
881
+ #else
882
+ if ((insert->okey == okey) && (insert->len == l) &&
883
+ (!xmlStrncmp(insert->name, name, l)))
884
+ return(insert->name);
885
+ #endif
886
+ }
887
+
888
+ if (dict->subdict) {
889
+ unsigned long skey;
890
+
891
+ /* we cannot always reuse the same okey for the subdict */
892
+ if (((dict->size == MIN_DICT_SIZE) &&
893
+ (dict->subdict->size != MIN_DICT_SIZE)) ||
894
+ ((dict->size != MIN_DICT_SIZE) &&
895
+ (dict->subdict->size == MIN_DICT_SIZE)))
896
+ skey = xmlDictComputeKey(dict->subdict, name, l);
897
+ else
898
+ skey = okey;
899
+
900
+ key = skey % dict->subdict->size;
901
+ if (dict->subdict->dict[key].valid != 0) {
902
+ xmlDictEntryPtr tmp;
903
+
904
+ for (tmp = &(dict->subdict->dict[key]); tmp->next != NULL;
905
+ tmp = tmp->next) {
906
+ #ifdef __GNUC__
907
+ if ((tmp->okey == skey) && (tmp->len == l)) {
908
+ if (!memcmp(tmp->name, name, l))
909
+ return(tmp->name);
910
+ }
911
+ #else
912
+ if ((tmp->okey == skey) && (tmp->len == l) &&
913
+ (!xmlStrncmp(tmp->name, name, l)))
914
+ return(tmp->name);
915
+ #endif
916
+ nbi++;
917
+ }
918
+ #ifdef __GNUC__
919
+ if ((tmp->okey == skey) && (tmp->len == l)) {
920
+ if (!memcmp(tmp->name, name, l))
921
+ return(tmp->name);
922
+ }
923
+ #else
924
+ if ((tmp->okey == skey) && (tmp->len == l) &&
925
+ (!xmlStrncmp(tmp->name, name, l)))
926
+ return(tmp->name);
927
+ #endif
928
+ }
929
+ key = okey % dict->size;
930
+ }
931
+
932
+ ret = xmlDictAddString(dict, name, l);
933
+ if (ret == NULL)
934
+ return(NULL);
935
+ if (insert == NULL) {
936
+ entry = &(dict->dict[key]);
937
+ } else {
938
+ entry = xmlMalloc(sizeof(xmlDictEntry));
939
+ if (entry == NULL)
940
+ return(NULL);
941
+ }
942
+ entry->name = ret;
943
+ entry->len = l;
944
+ entry->next = NULL;
945
+ entry->valid = 1;
946
+ entry->okey = okey;
947
+
948
+
949
+ if (insert != NULL)
950
+ insert->next = entry;
951
+
952
+ dict->nbElems++;
953
+
954
+ if ((nbi > MAX_HASH_LEN) &&
955
+ (dict->size <= ((MAX_DICT_HASH / 2) / MAX_HASH_LEN))) {
956
+ if (xmlDictGrow(dict, MAX_HASH_LEN * 2 * dict->size) != 0)
957
+ return(NULL);
958
+ }
959
+ /* Note that entry may have been freed at this point by xmlDictGrow */
960
+
961
+ return(ret);
962
+ }
963
+
964
+ /**
965
+ * xmlDictExists:
966
+ * @dict: the dictionary
967
+ * @name: the name of the userdata
968
+ * @len: the length of the name, if -1 it is recomputed
969
+ *
970
+ * Check if the @name exists in the dictionary @dict.
971
+ *
972
+ * Returns the internal copy of the name or NULL if not found.
973
+ */
974
+ const xmlChar *
975
+ xmlDictExists(xmlDictPtr dict, const xmlChar *name, int len) {
976
+ unsigned long key, okey;
977
+ xmlDictEntryPtr insert;
978
+ unsigned int l;
979
+
980
+ if ((dict == NULL) || (name == NULL))
981
+ return(NULL);
982
+
983
+ if (len < 0)
984
+ l = strlen((const char *) name);
985
+ else
986
+ l = len;
987
+ if (((dict->limit > 0) && (l >= dict->limit)) ||
988
+ (l > INT_MAX / 2))
989
+ return(NULL);
990
+
991
+ /*
992
+ * Check for duplicate and insertion location.
993
+ */
994
+ okey = xmlDictComputeKey(dict, name, l);
995
+ key = okey % dict->size;
996
+ if (dict->dict[key].valid == 0) {
997
+ insert = NULL;
998
+ } else {
999
+ for (insert = &(dict->dict[key]); insert->next != NULL;
1000
+ insert = insert->next) {
1001
+ #ifdef __GNUC__
1002
+ if ((insert->okey == okey) && (insert->len == l)) {
1003
+ if (!memcmp(insert->name, name, l))
1004
+ return(insert->name);
1005
+ }
1006
+ #else
1007
+ if ((insert->okey == okey) && (insert->len == l) &&
1008
+ (!xmlStrncmp(insert->name, name, l)))
1009
+ return(insert->name);
1010
+ #endif
1011
+ }
1012
+ #ifdef __GNUC__
1013
+ if ((insert->okey == okey) && (insert->len == l)) {
1014
+ if (!memcmp(insert->name, name, l))
1015
+ return(insert->name);
1016
+ }
1017
+ #else
1018
+ if ((insert->okey == okey) && (insert->len == l) &&
1019
+ (!xmlStrncmp(insert->name, name, l)))
1020
+ return(insert->name);
1021
+ #endif
1022
+ }
1023
+
1024
+ if (dict->subdict) {
1025
+ unsigned long skey;
1026
+
1027
+ /* we cannot always reuse the same okey for the subdict */
1028
+ if (((dict->size == MIN_DICT_SIZE) &&
1029
+ (dict->subdict->size != MIN_DICT_SIZE)) ||
1030
+ ((dict->size != MIN_DICT_SIZE) &&
1031
+ (dict->subdict->size == MIN_DICT_SIZE)))
1032
+ skey = xmlDictComputeKey(dict->subdict, name, l);
1033
+ else
1034
+ skey = okey;
1035
+
1036
+ key = skey % dict->subdict->size;
1037
+ if (dict->subdict->dict[key].valid != 0) {
1038
+ xmlDictEntryPtr tmp;
1039
+
1040
+ for (tmp = &(dict->subdict->dict[key]); tmp->next != NULL;
1041
+ tmp = tmp->next) {
1042
+ #ifdef __GNUC__
1043
+ if ((tmp->okey == skey) && (tmp->len == l)) {
1044
+ if (!memcmp(tmp->name, name, l))
1045
+ return(tmp->name);
1046
+ }
1047
+ #else
1048
+ if ((tmp->okey == skey) && (tmp->len == l) &&
1049
+ (!xmlStrncmp(tmp->name, name, l)))
1050
+ return(tmp->name);
1051
+ #endif
1052
+ }
1053
+ #ifdef __GNUC__
1054
+ if ((tmp->okey == skey) && (tmp->len == l)) {
1055
+ if (!memcmp(tmp->name, name, l))
1056
+ return(tmp->name);
1057
+ }
1058
+ #else
1059
+ if ((tmp->okey == skey) && (tmp->len == l) &&
1060
+ (!xmlStrncmp(tmp->name, name, l)))
1061
+ return(tmp->name);
1062
+ #endif
1063
+ }
1064
+ }
1065
+
1066
+ /* not found */
1067
+ return(NULL);
1068
+ }
1069
+
1070
+ /**
1071
+ * xmlDictQLookup:
1072
+ * @dict: the dictionary
1073
+ * @prefix: the prefix
1074
+ * @name: the name
1075
+ *
1076
+ * Add the QName @prefix:@name to the hash @dict if not present.
1077
+ *
1078
+ * Returns the internal copy of the QName or NULL in case of internal error
1079
+ */
1080
+ const xmlChar *
1081
+ xmlDictQLookup(xmlDictPtr dict, const xmlChar *prefix, const xmlChar *name) {
1082
+ unsigned long okey, key, nbi = 0;
1083
+ xmlDictEntryPtr entry;
1084
+ xmlDictEntryPtr insert;
1085
+ const xmlChar *ret;
1086
+ unsigned int len, plen, l;
1087
+
1088
+ if ((dict == NULL) || (name == NULL))
1089
+ return(NULL);
1090
+ if (prefix == NULL)
1091
+ return(xmlDictLookup(dict, name, -1));
1092
+
1093
+ l = len = strlen((const char *) name);
1094
+ plen = strlen((const char *) prefix);
1095
+ len += 1 + plen;
1096
+
1097
+ /*
1098
+ * Check for duplicate and insertion location.
1099
+ */
1100
+ okey = xmlDictComputeQKey(dict, prefix, plen, name, l);
1101
+ key = okey % dict->size;
1102
+ if (dict->dict[key].valid == 0) {
1103
+ insert = NULL;
1104
+ } else {
1105
+ for (insert = &(dict->dict[key]); insert->next != NULL;
1106
+ insert = insert->next) {
1107
+ if ((insert->okey == okey) && (insert->len == len) &&
1108
+ (xmlStrQEqual(prefix, name, insert->name)))
1109
+ return(insert->name);
1110
+ nbi++;
1111
+ }
1112
+ if ((insert->okey == okey) && (insert->len == len) &&
1113
+ (xmlStrQEqual(prefix, name, insert->name)))
1114
+ return(insert->name);
1115
+ }
1116
+
1117
+ if (dict->subdict) {
1118
+ unsigned long skey;
1119
+
1120
+ /* we cannot always reuse the same okey for the subdict */
1121
+ if (((dict->size == MIN_DICT_SIZE) &&
1122
+ (dict->subdict->size != MIN_DICT_SIZE)) ||
1123
+ ((dict->size != MIN_DICT_SIZE) &&
1124
+ (dict->subdict->size == MIN_DICT_SIZE)))
1125
+ skey = xmlDictComputeQKey(dict->subdict, prefix, plen, name, l);
1126
+ else
1127
+ skey = okey;
1128
+
1129
+ key = skey % dict->subdict->size;
1130
+ if (dict->subdict->dict[key].valid != 0) {
1131
+ xmlDictEntryPtr tmp;
1132
+ for (tmp = &(dict->subdict->dict[key]); tmp->next != NULL;
1133
+ tmp = tmp->next) {
1134
+ if ((tmp->okey == skey) && (tmp->len == len) &&
1135
+ (xmlStrQEqual(prefix, name, tmp->name)))
1136
+ return(tmp->name);
1137
+ nbi++;
1138
+ }
1139
+ if ((tmp->okey == skey) && (tmp->len == len) &&
1140
+ (xmlStrQEqual(prefix, name, tmp->name)))
1141
+ return(tmp->name);
1142
+ }
1143
+ key = okey % dict->size;
1144
+ }
1145
+
1146
+ ret = xmlDictAddQString(dict, prefix, plen, name, l);
1147
+ if (ret == NULL)
1148
+ return(NULL);
1149
+ if (insert == NULL) {
1150
+ entry = &(dict->dict[key]);
1151
+ } else {
1152
+ entry = xmlMalloc(sizeof(xmlDictEntry));
1153
+ if (entry == NULL)
1154
+ return(NULL);
1155
+ }
1156
+ entry->name = ret;
1157
+ entry->len = len;
1158
+ entry->next = NULL;
1159
+ entry->valid = 1;
1160
+ entry->okey = okey;
1161
+
1162
+ if (insert != NULL)
1163
+ insert->next = entry;
1164
+
1165
+ dict->nbElems++;
1166
+
1167
+ if ((nbi > MAX_HASH_LEN) &&
1168
+ (dict->size <= ((MAX_DICT_HASH / 2) / MAX_HASH_LEN)))
1169
+ xmlDictGrow(dict, MAX_HASH_LEN * 2 * dict->size);
1170
+ /* Note that entry may have been freed at this point by xmlDictGrow */
1171
+
1172
+ return(ret);
1173
+ }
1174
+
1175
+ /**
1176
+ * xmlDictOwns:
1177
+ * @dict: the dictionary
1178
+ * @str: the string
1179
+ *
1180
+ * check if a string is owned by the dictionary
1181
+ *
1182
+ * Returns 1 if true, 0 if false and -1 in case of error
1183
+ * -1 in case of error
1184
+ */
1185
+ int
1186
+ xmlDictOwns(xmlDictPtr dict, const xmlChar *str) {
1187
+ xmlDictStringsPtr pool;
1188
+
1189
+ if ((dict == NULL) || (str == NULL))
1190
+ return(-1);
1191
+ pool = dict->strings;
1192
+ while (pool != NULL) {
1193
+ if ((str >= &pool->array[0]) && (str <= pool->free))
1194
+ return(1);
1195
+ pool = pool->next;
1196
+ }
1197
+ if (dict->subdict)
1198
+ return(xmlDictOwns(dict->subdict, str));
1199
+ return(0);
1200
+ }
1201
+
1202
+ /**
1203
+ * xmlDictSize:
1204
+ * @dict: the dictionary
1205
+ *
1206
+ * Query the number of elements installed in the hash @dict.
1207
+ *
1208
+ * Returns the number of elements in the dictionary or
1209
+ * -1 in case of error
1210
+ */
1211
+ int
1212
+ xmlDictSize(xmlDictPtr dict) {
1213
+ if (dict == NULL)
1214
+ return(-1);
1215
+ if (dict->subdict)
1216
+ return(dict->nbElems + dict->subdict->nbElems);
1217
+ return(dict->nbElems);
1218
+ }
1219
+
1220
+ /**
1221
+ * xmlDictSetLimit:
1222
+ * @dict: the dictionary
1223
+ * @limit: the limit in bytes
1224
+ *
1225
+ * Set a size limit for the dictionary
1226
+ * Added in 2.9.0
1227
+ *
1228
+ * Returns the previous limit of the dictionary or 0
1229
+ */
1230
+ size_t
1231
+ xmlDictSetLimit(xmlDictPtr dict, size_t limit) {
1232
+ size_t ret;
1233
+
1234
+ if (dict == NULL)
1235
+ return(0);
1236
+ ret = dict->limit;
1237
+ dict->limit = limit;
1238
+ return(ret);
1239
+ }
1240
+
1241
+ /**
1242
+ * xmlDictGetUsage:
1243
+ * @dict: the dictionary
1244
+ *
1245
+ * Get how much memory is used by a dictionary for strings
1246
+ * Added in 2.9.0
1247
+ *
1248
+ * Returns the amount of strings allocated
1249
+ */
1250
+ size_t
1251
+ xmlDictGetUsage(xmlDictPtr dict) {
1252
+ xmlDictStringsPtr pool;
1253
+ size_t limit = 0;
1254
+
1255
+ if (dict == NULL)
1256
+ return(0);
1257
+ pool = dict->strings;
1258
+ while (pool != NULL) {
1259
+ limit += pool->size;
1260
+ pool = pool->next;
1261
+ }
1262
+ return(limit);
1263
+ }
1264
+