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,476 @@
1
+ /*
2
+ * Copyright (C) 2019 Alexander Borisov
3
+ *
4
+ * Author: Alexander Borisov <borisov@lexbor.com>
5
+ */
6
+
7
+ #define LEXBOR_HASH_EXTERN
8
+ #include "lexbor/core/hash.h"
9
+ #undef LEXBOR_HASH_EXTERN
10
+
11
+ #include "lexbor/core/str.h"
12
+
13
+ #define LEXBOR_STR_RES_MAP_LOWERCASE
14
+ #define LEXBOR_STR_RES_MAP_UPPERCASE
15
+ #include "lexbor/core/str_res.h"
16
+
17
+
18
+ /* Insert variable. */
19
+ const lexbor_hash_insert_t lexbor_hash_insert_var = {
20
+ .hash = lexbor_hash_make_id,
21
+ .copy = lexbor_hash_copy,
22
+ .cmp = lexbor_str_data_ncmp
23
+ };
24
+
25
+ const lexbor_hash_insert_t lexbor_hash_insert_lower_var = {
26
+ .hash = lexbor_hash_make_id_lower,
27
+ .copy = lexbor_hash_copy_lower,
28
+ .cmp = lexbor_str_data_nlocmp_right
29
+ };
30
+
31
+ const lexbor_hash_insert_t lexbor_hash_insert_upper_var = {
32
+ .hash = lexbor_hash_make_id_upper,
33
+ .copy = lexbor_hash_copy_upper,
34
+ .cmp = lexbor_str_data_nupcmp_right
35
+ };
36
+
37
+ LXB_API const lexbor_hash_insert_t
38
+ *lexbor_hash_insert_raw = &lexbor_hash_insert_var;
39
+
40
+ LXB_API const lexbor_hash_insert_t
41
+ *lexbor_hash_insert_lower = &lexbor_hash_insert_lower_var;
42
+
43
+ LXB_API const lexbor_hash_insert_t
44
+ *lexbor_hash_insert_upper = &lexbor_hash_insert_upper_var;
45
+
46
+ /* Search variable. */
47
+ const lexbor_hash_search_t lexbor_hash_search_var = {
48
+ .hash = lexbor_hash_make_id,
49
+ .cmp = lexbor_str_data_ncmp
50
+ };
51
+
52
+ const lexbor_hash_search_t lexbor_hash_search_lower_var = {
53
+ .hash = lexbor_hash_make_id_lower,
54
+ .cmp = lexbor_str_data_nlocmp_right
55
+ };
56
+
57
+ const lexbor_hash_search_t lexbor_hash_search_upper_var = {
58
+ .hash = lexbor_hash_make_id_upper,
59
+ .cmp = lexbor_str_data_nupcmp_right
60
+ };
61
+
62
+ LXB_API const lexbor_hash_search_t
63
+ *lexbor_hash_search_raw = &lexbor_hash_search_var;
64
+
65
+ LXB_API const lexbor_hash_search_t
66
+ *lexbor_hash_search_lower = &lexbor_hash_search_lower_var;
67
+
68
+ LXB_API const lexbor_hash_search_t
69
+ *lexbor_hash_search_upper = &lexbor_hash_search_upper_var;
70
+
71
+
72
+ lxb_inline lexbor_hash_entry_t **
73
+ lexbor_hash_table_create(lexbor_hash_t *hash)
74
+ {
75
+ return lexbor_calloc(hash->table_size, sizeof(lexbor_hash_entry_t *));
76
+ }
77
+
78
+ lxb_inline void
79
+ lexbor_hash_table_clean(lexbor_hash_t *hash)
80
+ {
81
+ memset(hash->table, 0, sizeof(lexbor_hash_t *) * hash->table_size);
82
+ }
83
+
84
+ lxb_inline lexbor_hash_entry_t **
85
+ lexbor_hash_table_destroy(lexbor_hash_t *hash)
86
+ {
87
+ if (hash->table != NULL) {
88
+ return lexbor_free(hash->table);
89
+ }
90
+
91
+ return NULL;
92
+ }
93
+
94
+ lxb_inline lexbor_hash_entry_t *
95
+ _lexbor_hash_entry_create(lexbor_hash_t *hash, const lexbor_hash_copy_f copy_func,
96
+ const lxb_char_t *key, size_t length)
97
+ {
98
+ lexbor_hash_entry_t *entry = lexbor_dobject_calloc(hash->entries);
99
+ if (entry == NULL) {
100
+ return NULL;
101
+ }
102
+
103
+ entry->length = length;
104
+
105
+ if (copy_func(hash, entry, key, length) != LXB_STATUS_OK) {
106
+ lexbor_dobject_free(hash->entries, entry);
107
+ return NULL;
108
+ }
109
+
110
+ return entry;
111
+ }
112
+
113
+ lexbor_hash_t *
114
+ lexbor_hash_create(void)
115
+ {
116
+ return lexbor_calloc(1, sizeof(lexbor_hash_t));
117
+ }
118
+
119
+ lxb_status_t
120
+ lexbor_hash_init(lexbor_hash_t *hash, size_t table_size, size_t struct_size)
121
+ {
122
+ lxb_status_t status;
123
+ size_t chunk_size;
124
+
125
+ if (hash == NULL) {
126
+ return LXB_STATUS_ERROR_OBJECT_IS_NULL;
127
+ }
128
+
129
+ if (table_size < LEXBOR_HASH_TABLE_MIN_SIZE) {
130
+ table_size = LEXBOR_HASH_TABLE_MIN_SIZE;
131
+ }
132
+
133
+ chunk_size = table_size / 2;
134
+
135
+ hash->table_size = table_size;
136
+
137
+ hash->entries = lexbor_dobject_create();
138
+ status = lexbor_dobject_init(hash->entries, chunk_size, struct_size);
139
+ if (status != LXB_STATUS_OK) {
140
+ return status;
141
+ }
142
+
143
+ hash->mraw = lexbor_mraw_create();
144
+ status = lexbor_mraw_init(hash->mraw, chunk_size * 12);
145
+ if (status != LXB_STATUS_OK) {
146
+ return status;
147
+ }
148
+
149
+ hash->table = lexbor_hash_table_create(hash);
150
+ if (hash->table == NULL) {
151
+ return LXB_STATUS_ERROR_MEMORY_ALLOCATION;
152
+ }
153
+
154
+ hash->struct_size = struct_size;
155
+
156
+ return LXB_STATUS_OK;
157
+ }
158
+
159
+ void
160
+ lexbor_hash_clean(lexbor_hash_t *hash)
161
+ {
162
+ lexbor_dobject_clean(hash->entries);
163
+ lexbor_mraw_clean(hash->mraw);
164
+ lexbor_hash_table_clean(hash);
165
+ }
166
+
167
+ lexbor_hash_t *
168
+ lexbor_hash_destroy(lexbor_hash_t *hash, bool destroy_obj)
169
+ {
170
+ if (hash == NULL) {
171
+ return NULL;
172
+ }
173
+
174
+ hash->entries = lexbor_dobject_destroy(hash->entries, true);
175
+ hash->mraw = lexbor_mraw_destroy(hash->mraw, true);
176
+ hash->table = lexbor_hash_table_destroy(hash);
177
+
178
+ if (destroy_obj) {
179
+ return lexbor_free(hash);
180
+ }
181
+
182
+ return hash;
183
+ }
184
+
185
+ void *
186
+ lexbor_hash_insert(lexbor_hash_t *hash, const lexbor_hash_insert_t *insert,
187
+ const lxb_char_t *key, size_t length)
188
+ {
189
+ lxb_char_t *str;
190
+ uint32_t hash_id, table_idx;
191
+ lexbor_hash_entry_t *entry;
192
+
193
+ hash_id = insert->hash(key, length);
194
+ table_idx = hash_id % hash->table_size;
195
+
196
+ entry = hash->table[table_idx];
197
+
198
+ if (entry == NULL) {
199
+ entry = _lexbor_hash_entry_create(hash, insert->copy, key, length);
200
+ hash->table[table_idx] = entry;
201
+
202
+ return entry;
203
+ }
204
+
205
+ do {
206
+ str = lexbor_hash_entry_str(entry);
207
+
208
+ if (entry->length == length && insert->cmp(str, key, length)) {
209
+ return entry;
210
+ }
211
+
212
+ if (entry->next == NULL) {
213
+ break;
214
+ }
215
+
216
+ entry = entry->next;
217
+ }
218
+ while (1);
219
+
220
+ entry->next = _lexbor_hash_entry_create(hash, insert->copy, key, length);
221
+
222
+ return entry->next;
223
+ }
224
+
225
+ void *
226
+ lexbor_hash_insert_by_entry(lexbor_hash_t *hash, lexbor_hash_entry_t *entry,
227
+ const lexbor_hash_search_t *search,
228
+ const lxb_char_t *key, size_t length)
229
+ {
230
+ lxb_char_t *str;
231
+ uint32_t hash_id, table_idx;
232
+ lexbor_hash_entry_t *item;
233
+
234
+ hash_id = search->hash(key, length);
235
+ table_idx = hash_id % hash->table_size;
236
+
237
+ item = hash->table[table_idx];
238
+
239
+ if (item == NULL) {
240
+ hash->table[table_idx] = entry;
241
+
242
+ return entry;
243
+ }
244
+
245
+ do {
246
+ str = lexbor_hash_entry_str(item);
247
+
248
+ if (item->length == length && search->cmp(str, key, length)) {
249
+ return item;
250
+ }
251
+
252
+ if (item->next == NULL) {
253
+ break;
254
+ }
255
+
256
+ item = item->next;
257
+ }
258
+ while (1);
259
+
260
+ item->next = entry;
261
+
262
+ return entry;
263
+ }
264
+
265
+ void
266
+ lexbor_hash_remove(lexbor_hash_t *hash, const lexbor_hash_search_t *search,
267
+ const lxb_char_t *key, size_t length)
268
+ {
269
+ lexbor_hash_remove_by_hash_id(hash, search->hash(key, length),
270
+ key, length, search->cmp);
271
+ }
272
+
273
+ void *
274
+ lexbor_hash_search(lexbor_hash_t *hash, const lexbor_hash_search_t *search,
275
+ const lxb_char_t *key, size_t length)
276
+ {
277
+ return lexbor_hash_search_by_hash_id(hash, search->hash(key, length),
278
+ key, length, search->cmp);
279
+ }
280
+
281
+ void
282
+ lexbor_hash_remove_by_hash_id(lexbor_hash_t *hash, uint32_t hash_id,
283
+ const lxb_char_t *key, size_t length,
284
+ const lexbor_hash_cmp_f cmp_func)
285
+ {
286
+ uint32_t table_idx;
287
+ lxb_char_t *str;
288
+ lexbor_hash_entry_t *entry, *prev;
289
+
290
+ table_idx = hash_id % hash->table_size;
291
+ entry = hash->table[table_idx];
292
+ prev = NULL;
293
+
294
+ while (entry != NULL) {
295
+ str = lexbor_hash_entry_str(entry);
296
+
297
+ if (entry->length == length && cmp_func(str, key, length)) {
298
+ if (prev == NULL) {
299
+ hash->table[table_idx] = entry->next;
300
+ }
301
+ else {
302
+ prev->next = entry->next;
303
+ }
304
+
305
+ if (length > LEXBOR_HASH_SHORT_SIZE) {
306
+ lexbor_mraw_free(hash->mraw, entry->u.long_str);
307
+ }
308
+
309
+ lexbor_dobject_free(hash->entries, entry);
310
+
311
+ return;
312
+ }
313
+
314
+ prev = entry;
315
+ entry = entry->next;
316
+ }
317
+ }
318
+
319
+ void *
320
+ lexbor_hash_search_by_hash_id(lexbor_hash_t *hash, uint32_t hash_id,
321
+ const lxb_char_t *key, size_t length,
322
+ const lexbor_hash_cmp_f cmp_func)
323
+ {
324
+ lxb_char_t *str;
325
+ lexbor_hash_entry_t *entry;
326
+
327
+ entry = hash->table[ hash_id % hash->table_size ];
328
+
329
+ while (entry != NULL) {
330
+ str = lexbor_hash_entry_str(entry);
331
+
332
+ if (entry->length == length && cmp_func(str, key, length)) {
333
+ return entry;
334
+ }
335
+
336
+ entry = entry->next;
337
+ }
338
+
339
+ return NULL;
340
+ }
341
+
342
+ uint32_t
343
+ lexbor_hash_make_id(const lxb_char_t *key, size_t length)
344
+ {
345
+ size_t i;
346
+ uint32_t hash_id;
347
+
348
+ for (i = hash_id = 0; i < length; i++) {
349
+ hash_id += key[i];
350
+ hash_id += (hash_id << 10);
351
+ hash_id ^= (hash_id >> 6);
352
+ }
353
+
354
+ hash_id += (hash_id << 3);
355
+ hash_id ^= (hash_id >> 11);
356
+ hash_id += (hash_id << 15);
357
+
358
+ return hash_id;
359
+ }
360
+
361
+ uint32_t
362
+ lexbor_hash_make_id_lower(const lxb_char_t *key, size_t length)
363
+ {
364
+ size_t i;
365
+ uint32_t hash_id;
366
+
367
+ for (i = hash_id = 0; i < length; i++) {
368
+ hash_id += lexbor_str_res_map_lowercase[ key[i] ];
369
+ hash_id += (hash_id << 10);
370
+ hash_id ^= (hash_id >> 6);
371
+ }
372
+
373
+ hash_id += (hash_id << 3);
374
+ hash_id ^= (hash_id >> 11);
375
+ hash_id += (hash_id << 15);
376
+
377
+ return hash_id;
378
+ }
379
+
380
+ uint32_t
381
+ lexbor_hash_make_id_upper(const lxb_char_t *key, size_t length)
382
+ {
383
+ size_t i;
384
+ uint32_t hash_id;
385
+
386
+ for (i = hash_id = 0; i < length; i++) {
387
+ hash_id += lexbor_str_res_map_uppercase[ key[i] ];
388
+ hash_id += (hash_id << 10);
389
+ hash_id ^= (hash_id >> 6);
390
+ }
391
+
392
+ hash_id += (hash_id << 3);
393
+ hash_id ^= (hash_id >> 11);
394
+ hash_id += (hash_id << 15);
395
+
396
+ return hash_id;
397
+ }
398
+
399
+ lxb_status_t
400
+ lexbor_hash_copy(lexbor_hash_t *hash, lexbor_hash_entry_t *entry,
401
+ const lxb_char_t *key, size_t length)
402
+ {
403
+ lxb_char_t *to;
404
+
405
+ if (length <= LEXBOR_HASH_SHORT_SIZE) {
406
+ to = entry->u.short_str;
407
+ }
408
+ else {
409
+ entry->u.long_str = lexbor_mraw_alloc(hash->mraw, length + 1);
410
+ if (entry->u.long_str == NULL) {
411
+ return LXB_STATUS_ERROR_MEMORY_ALLOCATION;
412
+ }
413
+
414
+ to = entry->u.long_str;
415
+ }
416
+
417
+ memcpy(to, key, length);
418
+
419
+ to[length] = '\0';
420
+
421
+ return LXB_STATUS_OK;
422
+ }
423
+
424
+ lxb_status_t
425
+ lexbor_hash_copy_lower(lexbor_hash_t *hash, lexbor_hash_entry_t *entry,
426
+ const lxb_char_t *key, size_t length)
427
+ {
428
+ lxb_char_t *to;
429
+
430
+ if (length <= LEXBOR_HASH_SHORT_SIZE) {
431
+ to = entry->u.short_str;
432
+ }
433
+ else {
434
+ entry->u.long_str = lexbor_mraw_alloc(hash->mraw, length + 1);
435
+ if (entry->u.long_str == NULL) {
436
+ return LXB_STATUS_ERROR_MEMORY_ALLOCATION;
437
+ }
438
+
439
+ to = entry->u.long_str;
440
+ }
441
+
442
+ for (size_t i = 0; i < length; i++) {
443
+ to[i] = lexbor_str_res_map_lowercase[ key[i] ];
444
+ }
445
+
446
+ to[length] = '\0';
447
+
448
+ return LXB_STATUS_OK;
449
+ }
450
+
451
+ lxb_status_t
452
+ lexbor_hash_copy_upper(lexbor_hash_t *hash, lexbor_hash_entry_t *entry,
453
+ const lxb_char_t *key, size_t length)
454
+ {
455
+ lxb_char_t *to;
456
+
457
+ if (length <= LEXBOR_HASH_SHORT_SIZE) {
458
+ to = entry->u.short_str;
459
+ }
460
+ else {
461
+ entry->u.long_str = lexbor_mraw_alloc(hash->mraw, length + 1);
462
+ if (entry->u.long_str == NULL) {
463
+ return LXB_STATUS_ERROR_MEMORY_ALLOCATION;
464
+ }
465
+
466
+ to = entry->u.long_str;
467
+ }
468
+
469
+ for (size_t i = 0; i < length; i++) {
470
+ to[i] = lexbor_str_res_map_uppercase[ key[i] ];
471
+ }
472
+
473
+ to[length] = '\0';
474
+
475
+ return LXB_STATUS_OK;
476
+ }
@@ -0,0 +1,218 @@
1
+ /*
2
+ * Copyright (C) 2019 Alexander Borisov
3
+ *
4
+ * Author: Alexander Borisov <borisov@lexbor.com>
5
+ */
6
+
7
+ #ifndef LEXBOR_HASH_H
8
+ #define LEXBOR_HASH_H
9
+
10
+ #ifdef __cplusplus
11
+ extern "C" {
12
+ #endif
13
+
14
+ #include "lexbor/core/dobject.h"
15
+ #include "lexbor/core/mraw.h"
16
+
17
+
18
+ #define LEXBOR_HASH_SHORT_SIZE 16
19
+ #define LEXBOR_HASH_TABLE_MIN_SIZE 32
20
+
21
+
22
+ typedef struct lexbor_hash_search lexbor_hash_search_t;
23
+ typedef struct lexbor_hash_insert lexbor_hash_insert_t;
24
+
25
+ #ifndef LEXBOR_HASH_EXTERN
26
+ LXB_EXTERN const lexbor_hash_insert_t *lexbor_hash_insert_raw;
27
+ LXB_EXTERN const lexbor_hash_insert_t *lexbor_hash_insert_lower;
28
+ LXB_EXTERN const lexbor_hash_insert_t *lexbor_hash_insert_upper;
29
+
30
+ LXB_EXTERN const lexbor_hash_search_t *lexbor_hash_search_raw;
31
+ LXB_EXTERN const lexbor_hash_search_t *lexbor_hash_search_lower;
32
+ LXB_EXTERN const lexbor_hash_search_t *lexbor_hash_search_upper;
33
+ #endif
34
+
35
+ /*
36
+ * FIXME:
37
+ * It is necessary to add the rebuild of a hash table
38
+ * and optimize collisions.
39
+ */
40
+
41
+ typedef struct lexbor_hash lexbor_hash_t;
42
+ typedef struct lexbor_hash_entry lexbor_hash_entry_t;
43
+
44
+ typedef uint32_t
45
+ (*lexbor_hash_id_f)(const lxb_char_t *key, size_t size);
46
+
47
+ typedef lxb_status_t
48
+ (*lexbor_hash_copy_f)(lexbor_hash_t *hash, lexbor_hash_entry_t *entry,
49
+ const lxb_char_t *key, size_t size);
50
+
51
+ typedef bool
52
+ (*lexbor_hash_cmp_f)(const lxb_char_t *first,
53
+ const lxb_char_t *second, size_t size);
54
+
55
+ struct lexbor_hash_entry {
56
+ union {
57
+ lxb_char_t *long_str;
58
+ lxb_char_t short_str[LEXBOR_HASH_SHORT_SIZE + 1];
59
+ } u;
60
+
61
+ size_t length;
62
+
63
+ lexbor_hash_entry_t *next;
64
+ };
65
+
66
+ struct lexbor_hash {
67
+ lexbor_dobject_t *entries;
68
+ lexbor_mraw_t *mraw;
69
+
70
+ lexbor_hash_entry_t **table;
71
+ size_t table_size;
72
+
73
+ size_t struct_size;
74
+ };
75
+
76
+ struct lexbor_hash_insert {
77
+ lexbor_hash_id_f hash; /* For generate a hash id. */
78
+ lexbor_hash_cmp_f cmp; /* For compare key. */
79
+ lexbor_hash_copy_f copy; /* For copy key. */
80
+ };
81
+
82
+ struct lexbor_hash_search {
83
+ lexbor_hash_id_f hash; /* For generate a hash id. */
84
+ lexbor_hash_cmp_f cmp; /* For compare key. */
85
+ };
86
+
87
+
88
+ LXB_API lexbor_hash_t *
89
+ lexbor_hash_create(void);
90
+
91
+ LXB_API lxb_status_t
92
+ lexbor_hash_init(lexbor_hash_t *hash, size_t table_size, size_t struct_size);
93
+
94
+ LXB_API void
95
+ lexbor_hash_clean(lexbor_hash_t *hash);
96
+
97
+ LXB_API lexbor_hash_t *
98
+ lexbor_hash_destroy(lexbor_hash_t *hash, bool destroy_obj);
99
+
100
+
101
+ LXB_API void *
102
+ lexbor_hash_insert(lexbor_hash_t *hash, const lexbor_hash_insert_t *insert,
103
+ const lxb_char_t *key, size_t length);
104
+
105
+ LXB_API void *
106
+ lexbor_hash_insert_by_entry(lexbor_hash_t *hash, lexbor_hash_entry_t *entry,
107
+ const lexbor_hash_search_t *search,
108
+ const lxb_char_t *key, size_t length);
109
+
110
+ LXB_API void
111
+ lexbor_hash_remove(lexbor_hash_t *hash, const lexbor_hash_search_t *search,
112
+ const lxb_char_t *key, size_t length);
113
+
114
+ LXB_API void *
115
+ lexbor_hash_search(lexbor_hash_t *hash, const lexbor_hash_search_t *search,
116
+ const lxb_char_t *key, size_t length);
117
+
118
+ LXB_API void
119
+ lexbor_hash_remove_by_hash_id(lexbor_hash_t *hash, uint32_t hash_id,
120
+ const lxb_char_t *key, size_t length,
121
+ const lexbor_hash_cmp_f cmp_func);
122
+
123
+ LXB_API void *
124
+ lexbor_hash_search_by_hash_id(lexbor_hash_t *hash, uint32_t hash_id,
125
+ const lxb_char_t *key, size_t length,
126
+ const lexbor_hash_cmp_f cmp_func);
127
+
128
+
129
+ LXB_API uint32_t
130
+ lexbor_hash_make_id(const lxb_char_t *key, size_t length);
131
+
132
+ LXB_API uint32_t
133
+ lexbor_hash_make_id_lower(const lxb_char_t *key, size_t length);
134
+
135
+ LXB_API uint32_t
136
+ lexbor_hash_make_id_upper(const lxb_char_t *key, size_t length);
137
+
138
+ LXB_API lxb_status_t
139
+ lexbor_hash_copy(lexbor_hash_t *hash, lexbor_hash_entry_t *entry,
140
+ const lxb_char_t *key, size_t length);
141
+
142
+ LXB_API lxb_status_t
143
+ lexbor_hash_copy_lower(lexbor_hash_t *hash, lexbor_hash_entry_t *entry,
144
+ const lxb_char_t *key, size_t length);
145
+
146
+ LXB_API lxb_status_t
147
+ lexbor_hash_copy_upper(lexbor_hash_t *hash, lexbor_hash_entry_t *entry,
148
+ const lxb_char_t *key, size_t length);
149
+
150
+
151
+ /*
152
+ * Inline functions
153
+ */
154
+ lxb_inline lexbor_mraw_t *
155
+ lexbor_hash_mraw(const lexbor_hash_t *hash)
156
+ {
157
+ return hash->mraw;
158
+ }
159
+
160
+ lxb_inline lxb_char_t *
161
+ lexbor_hash_entry_str(const lexbor_hash_entry_t *entry)
162
+ {
163
+ if (entry->length <= LEXBOR_HASH_SHORT_SIZE) {
164
+ return (lxb_char_t *) entry->u.short_str;
165
+ }
166
+
167
+ return entry->u.long_str;
168
+ }
169
+
170
+ lxb_inline lxb_char_t *
171
+ lexbor_hash_entry_str_set(lexbor_hash_entry_t *entry,
172
+ lxb_char_t *data, size_t length)
173
+ {
174
+ entry->length = length;
175
+
176
+ if (length <= LEXBOR_HASH_SHORT_SIZE) {
177
+ memcpy(entry->u.short_str, data, length);
178
+ return (lxb_char_t *) entry->u.short_str;
179
+ }
180
+
181
+ entry->u.long_str = data;
182
+ return entry->u.long_str;
183
+ }
184
+
185
+ lxb_inline void
186
+ lexbor_hash_entry_str_free(lexbor_hash_t *hash, lexbor_hash_entry_t *entry)
187
+ {
188
+ if (entry->length > LEXBOR_HASH_SHORT_SIZE) {
189
+ lexbor_mraw_free(hash->mraw, entry->u.long_str);
190
+ }
191
+
192
+ entry->length = 0;
193
+ }
194
+
195
+ lxb_inline lexbor_hash_entry_t *
196
+ lexbor_hash_entry_create(lexbor_hash_t *hash)
197
+ {
198
+ return (lexbor_hash_entry_t *) lexbor_dobject_calloc(hash->entries);
199
+ }
200
+
201
+ lxb_inline lexbor_hash_entry_t *
202
+ lexbor_hash_entry_destroy(lexbor_hash_t *hash, lexbor_hash_entry_t *entry)
203
+ {
204
+ return (lexbor_hash_entry_t *) lexbor_dobject_free(hash->entries, entry);
205
+ }
206
+
207
+ lxb_inline size_t
208
+ lexbor_hash_entries_count(lexbor_hash_t *hash)
209
+ {
210
+ return lexbor_dobject_allocated(hash->entries);
211
+ }
212
+
213
+
214
+ #ifdef __cplusplus
215
+ } /* extern "C" */
216
+ #endif
217
+
218
+ #endif /* LEXBOR_HASH_H */