leptris 1.9.201.0-arm-linux → 1.9.201.2-arm-linux

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 (1535) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +23 -0
  3. data/Rakefile +52 -12
  4. data/ext/leptris/native/extconf.rb +85 -0
  5. data/ext/leptris/native/native.c +1 -1
  6. data/lib/leptris/version.rb +1 -1
  7. data/lib/leptris/xml/ffi.rb +13 -0
  8. data/lib/leptris/xml/native.so +0 -0
  9. data/vendor-src/libleptris/CHANGELOG.md +8080 -0
  10. data/vendor-src/libleptris/CLAUDE.md +150 -0
  11. data/vendor-src/libleptris/CMakeLists.txt +379 -0
  12. data/vendor-src/libleptris/CMakePresets.json +61 -0
  13. data/vendor-src/libleptris/CODE_OF_CONDUCT.md +132 -0
  14. data/vendor-src/libleptris/CONTEXT.md +49 -0
  15. data/vendor-src/libleptris/LICENSE.md +33 -0
  16. data/vendor-src/libleptris/README.adoc +1197 -0
  17. data/vendor-src/libleptris/TODO.assemble/README.md +16 -0
  18. data/vendor-src/libleptris/TODO.bindings/01-mutation-construction.md +18 -0
  19. data/vendor-src/libleptris/TODO.bindings/02-incremental-iterparse.md +15 -0
  20. data/vendor-src/libleptris/TODO.bindings/03-compiled-xpath.md +15 -0
  21. data/vendor-src/libleptris/TODO.bindings/04-pull-stax-api.md +14 -0
  22. data/vendor-src/libleptris/TODO.bindings/05-per-parse-options.md +17 -0
  23. data/vendor-src/libleptris/TODO.bindings/06-serialize-encoding-guarantees.md +14 -0
  24. data/vendor-src/libleptris/TODO.bindings/README.md +36 -0
  25. data/vendor-src/libleptris/TODO.concurrency/01-thread-safe-errors.md +19 -0
  26. data/vendor-src/libleptris/TODO.concurrency/02-export-surface-gate.md +24 -0
  27. data/vendor-src/libleptris/TODO.concurrency/03-mixed-nodeset-batch.md +14 -0
  28. data/vendor-src/libleptris/TODO.concurrency/04-canonical-status-message.md +13 -0
  29. data/vendor-src/libleptris/TODO.concurrency/05-windows-dll-name.md +10 -0
  30. data/vendor-src/libleptris/TODO.concurrency/06-exslt-pack.md +26 -0
  31. data/vendor-src/libleptris/TODO.concurrency/07-ns-set-pairs.md +11 -0
  32. data/vendor-src/libleptris/TODO.concurrency/08-threading-contract.md +45 -0
  33. data/vendor-src/libleptris/TODO.engine/01-file-sources.md +11 -0
  34. data/vendor-src/libleptris/TODO.engine/02-compiled-contexts.md +10 -0
  35. data/vendor-src/libleptris/TODO.engine/03-rust-publish.md +9 -0
  36. data/vendor-src/libleptris/TODO.engine/04-ruby-release-input.md +8 -0
  37. data/vendor-src/libleptris/TODO.engine/05-todo-md-refresh.md +7 -0
  38. data/vendor-src/libleptris/TODO.engine/README.md +16 -0
  39. data/vendor-src/libleptris/TODO.hygiene/README.md +15 -0
  40. data/vendor-src/libleptris/TODO.max-perf/00-INDEX.md +22 -0
  41. data/vendor-src/libleptris/TODO.max-perf/1-simd-html-scanner.md +15 -0
  42. data/vendor-src/libleptris/TODO.max-perf/10-moxml-plan-followups.md +9 -0
  43. data/vendor-src/libleptris/TODO.max-perf/2-compiled-dispatch-tokenizer.md +8 -0
  44. data/vendor-src/libleptris/TODO.max-perf/3-iterparse-fixed-cost.md +5 -0
  45. data/vendor-src/libleptris/TODO.max-perf/4-compact-node-micro-opts.md +17 -0
  46. data/vendor-src/libleptris/TODO.max-perf/5-xslt-bench-profiling-rounds.md +13 -0
  47. data/vendor-src/libleptris/TODO.max-perf/6-language-tails.md +9 -0
  48. data/vendor-src/libleptris/TODO.max-perf/7-validate-bindings.md +6 -0
  49. data/vendor-src/libleptris/TODO.max-perf/8-native-xml-diff-consumer.md +5 -0
  50. data/vendor-src/libleptris/TODO.max-perf/9-prebuilt-gem-matrix.md +14 -0
  51. data/vendor-src/libleptris/TODO.md +33 -0
  52. data/vendor-src/libleptris/TODO.transform/README.md +39 -0
  53. data/vendor-src/libleptris/TODO.validate/README.md +32 -0
  54. data/vendor-src/libleptris/TODO.xpath2/README.md +91 -0
  55. data/vendor-src/libleptris/TODO.xslt-full/01-xpath-fn-sequences.md +27 -0
  56. data/vendor-src/libleptris/TODO.xslt-full/02-xpath-fn-regex.md +13 -0
  57. data/vendor-src/libleptris/TODO.xslt-full/03-xpath-fn-math.md +10 -0
  58. data/vendor-src/libleptris/TODO.xslt-full/04-xpath-fn-strings-qname-uri.md +97 -0
  59. data/vendor-src/libleptris/TODO.xslt-full/05-xpath-fn-dates.md +30 -0
  60. data/vendor-src/libleptris/TODO.xslt-full/06-xpath-grammar-3x.md +83 -0
  61. data/vendor-src/libleptris/TODO.xslt-full/07-xpath-function-items.md +124 -0
  62. data/vendor-src/libleptris/TODO.xslt-full/08-xpath-maps-arrays.md +79 -0
  63. data/vendor-src/libleptris/TODO.xslt-full/09-xslt-noop-fillins.md +35 -0
  64. data/vendor-src/libleptris/TODO.xslt-full/10-xslt-tunnel-params.md +9 -0
  65. data/vendor-src/libleptris/TODO.xslt-full/11-xquery-core.md +119 -0
  66. data/vendor-src/libleptris/TODO.xslt-full/12-xquery-31.md +65 -0
  67. data/vendor-src/libleptris/TODO.xslt-full/13-perf-inprocess.md +425 -0
  68. data/vendor-src/libleptris/TODO.xslt-full/14-html-mode.md +803 -0
  69. data/vendor-src/libleptris/TODO.xslt-full/15-binding-entries.md +19 -0
  70. data/vendor-src/libleptris/TODO.xslt-full/16-schematron.md +156 -0
  71. data/vendor-src/libleptris/TODO.xslt-full/17-xml-diff.md +52 -0
  72. data/vendor-src/libleptris/TODO.xslt-full/18-compact-nodes.md +278 -0
  73. data/vendor-src/libleptris/TODO.xslt-full/README.md +26 -0
  74. data/vendor-src/libleptris/TODO.xslt-full/REMAINING.md +163 -0
  75. data/vendor-src/libleptris/TODO.xslt-full/legacy-v19/00-triage.md +171 -0
  76. data/vendor-src/libleptris/TODO.xslt-full/legacy-v19/01-fragment-nodes.md +19 -0
  77. data/vendor-src/libleptris/TODO.xslt-full/legacy-v19/02-root-node-semantics.md +34 -0
  78. data/vendor-src/libleptris/TODO.xslt-full/legacy-v19/03-crashes.md +15 -0
  79. data/vendor-src/libleptris/TODO.xslt-full/legacy-v19/04-namespaces.md +14 -0
  80. data/vendor-src/libleptris/TODO.xslt-full/legacy-v19/05-number-attrset-sort.md +13 -0
  81. data/vendor-src/libleptris/TODO.xslt-full/legacy-v19/06-document-chains.md +10 -0
  82. data/vendor-src/libleptris/TODO.xslt-full/legacy-v19/07-charef-serializer.md +9 -0
  83. data/vendor-src/libleptris/TODO.xslt-full/legacy-v19/08-perf-gate.md +8 -0
  84. data/vendor-src/libleptris/TODO.xslt-full/legacy-v19/09-release.md +14 -0
  85. data/vendor-src/libleptris/VALIDATION.md +151 -0
  86. data/vendor-src/libleptris/benchmarks/CMakeLists.txt +259 -0
  87. data/vendor-src/libleptris/benchmarks/README.adoc +228 -0
  88. data/vendor-src/libleptris/benchmarks/README.md +212 -0
  89. data/vendor-src/libleptris/benchmarks/common/benchmark.c +252 -0
  90. data/vendor-src/libleptris/benchmarks/common/benchmark.h +77 -0
  91. data/vendor-src/libleptris/benchmarks/common/test_data.c +415 -0
  92. data/vendor-src/libleptris/benchmarks/common/test_data.h +18 -0
  93. data/vendor-src/libleptris/benchmarks/comprehensive/CMakeLists.txt +184 -0
  94. data/vendor-src/libleptris/benchmarks/comprehensive/benchmark_decomp.cpp +110 -0
  95. data/vendor-src/libleptris/benchmarks/comprehensive/benchmark_first_access.cpp +261 -0
  96. data/vendor-src/libleptris/benchmarks/comprehensive/benchmark_many_attrs.cpp +150 -0
  97. data/vendor-src/libleptris/benchmarks/comprehensive/benchmark_memory.cpp +185 -0
  98. data/vendor-src/libleptris/benchmarks/comprehensive/benchmark_parse.cpp +270 -0
  99. data/vendor-src/libleptris/benchmarks/comprehensive/benchmark_parse_ops.cpp +392 -0
  100. data/vendor-src/libleptris/benchmarks/comprehensive/benchmark_sax.c +106 -0
  101. data/vendor-src/libleptris/benchmarks/comprehensive/benchmark_write.cpp +351 -0
  102. data/vendor-src/libleptris/benchmarks/data/attrs.xml +303 -0
  103. data/vendor-src/libleptris/benchmarks/data/cdata_test.xml +13 -0
  104. data/vendor-src/libleptris/benchmarks/data/comment_test.xml +15 -0
  105. data/vendor-src/libleptris/benchmarks/data/deep.xml +205 -0
  106. data/vendor-src/libleptris/benchmarks/data/generate_attrs.rb +22 -0
  107. data/vendor-src/libleptris/benchmarks/data/generate_deep.rb +25 -0
  108. data/vendor-src/libleptris/benchmarks/data/generate_large.rb +33 -0
  109. data/vendor-src/libleptris/benchmarks/data/generate_wide.rb +18 -0
  110. data/vendor-src/libleptris/benchmarks/data/large.xml +21003 -0
  111. data/vendor-src/libleptris/benchmarks/data/large_workflow.xml +4003 -0
  112. data/vendor-src/libleptris/benchmarks/data/medium.xml +67 -0
  113. data/vendor-src/libleptris/benchmarks/data/medium_workflow.xml +353 -0
  114. data/vendor-src/libleptris/benchmarks/data/pi_test.xml +9 -0
  115. data/vendor-src/libleptris/benchmarks/data/small.xml +10 -0
  116. data/vendor-src/libleptris/benchmarks/data/small_workflow.xml +36 -0
  117. data/vendor-src/libleptris/benchmarks/data/wide.xml +5003 -0
  118. data/vendor-src/libleptris/benchmarks/dom/bench_document_lifecycle.c +69 -0
  119. data/vendor-src/libleptris/benchmarks/dom/bench_leptris.c +184 -0
  120. data/vendor-src/libleptris/benchmarks/dom/bench_libxml2.c +176 -0
  121. data/vendor-src/libleptris/benchmarks/dom/bench_text_borrowed.c +74 -0
  122. data/vendor-src/libleptris/benchmarks/dom/dom_benchmark_v2.cpp +314 -0
  123. data/vendor-src/libleptris/benchmarks/fixtures/large.xml +4003 -0
  124. data/vendor-src/libleptris/benchmarks/fixtures/large_catalog.xml +50003 -0
  125. data/vendor-src/libleptris/benchmarks/fixtures/libxml2/eve.xml +6 -0
  126. data/vendor-src/libleptris/benchmarks/fixtures/libxml2/slashdot.rdf +66 -0
  127. data/vendor-src/libleptris/benchmarks/fixtures/libxml2/wap.xml +27 -0
  128. data/vendor-src/libleptris/benchmarks/fixtures/libxml2_svg/4rects.xml +11 -0
  129. data/vendor-src/libleptris/benchmarks/fixtures/libxml2_svg/a-valid.xml +10 -0
  130. data/vendor-src/libleptris/benchmarks/fixtures/libxml2_svg/a-wf.xml +9 -0
  131. data/vendor-src/libleptris/benchmarks/fixtures/libxml2_svg/bike.xml +41 -0
  132. data/vendor-src/libleptris/benchmarks/fixtures/libxml2_svg/circle.xml +11 -0
  133. data/vendor-src/libleptris/benchmarks/fixtures/libxml2_svg/defs.xml +14 -0
  134. data/vendor-src/libleptris/benchmarks/fixtures/libxml2_svg/desc.xml +14 -0
  135. data/vendor-src/libleptris/benchmarks/fixtures/libxml2_svg/ellipse.xml +10 -0
  136. data/vendor-src/libleptris/benchmarks/fixtures/libxml2_svg/flower2.xml +44 -0
  137. data/vendor-src/libleptris/benchmarks/fixtures/libxml2_svg/gradient.xml +16 -0
  138. data/vendor-src/libleptris/benchmarks/fixtures/libxml2_svg/group01.xml +15 -0
  139. data/vendor-src/libleptris/benchmarks/fixtures/libxml2_svg/group02.xml +13 -0
  140. data/vendor-src/libleptris/benchmarks/fixtures/libxml2_svg/group03.xml +13 -0
  141. data/vendor-src/libleptris/benchmarks/fixtures/libxml2_svg/image-valid.xml +11 -0
  142. data/vendor-src/libleptris/benchmarks/fixtures/libxml2_svg/image-wf.xml +11 -0
  143. data/vendor-src/libleptris/benchmarks/fixtures/libxml2_svg/lin-gradient.xml +16 -0
  144. data/vendor-src/libleptris/benchmarks/fixtures/libxml2_svg/marker.xml +28 -0
  145. data/vendor-src/libleptris/benchmarks/fixtures/libxml2_svg/mask.xml +13 -0
  146. data/vendor-src/libleptris/benchmarks/fixtures/libxml2_svg/mathswitch.xml +32 -0
  147. data/vendor-src/libleptris/benchmarks/fixtures/libxml2_svg/parentns.xml +12 -0
  148. data/vendor-src/libleptris/benchmarks/fixtures/libxml2_svg/path01.xml +5 -0
  149. data/vendor-src/libleptris/benchmarks/fixtures/libxml2_svg/path02.xml +10 -0
  150. data/vendor-src/libleptris/benchmarks/fixtures/libxml2_svg/patternfill.xml +12 -0
  151. data/vendor-src/libleptris/benchmarks/fixtures/libxml2_svg/polyline.xml +9 -0
  152. data/vendor-src/libleptris/benchmarks/fixtures/libxml2_svg/private.xml +19 -0
  153. data/vendor-src/libleptris/benchmarks/fixtures/libxml2_svg/rad-gradient.xml +17 -0
  154. data/vendor-src/libleptris/benchmarks/fixtures/libxml2_svg/rectangle.xml +10 -0
  155. data/vendor-src/libleptris/benchmarks/fixtures/libxml2_svg/richdesc.xml +12 -0
  156. data/vendor-src/libleptris/benchmarks/fixtures/libxml2_svg/script.xml +13 -0
  157. data/vendor-src/libleptris/benchmarks/fixtures/libxml2_svg/structure01.xml +10 -0
  158. data/vendor-src/libleptris/benchmarks/fixtures/libxml2_svg/style.xml +11 -0
  159. data/vendor-src/libleptris/benchmarks/fixtures/libxml2_svg/switch.xml +21 -0
  160. data/vendor-src/libleptris/benchmarks/fixtures/libxml2_svg/symbol-use.xml +28 -0
  161. data/vendor-src/libleptris/benchmarks/fixtures/libxml2_svg/template.xml +9 -0
  162. data/vendor-src/libleptris/benchmarks/fixtures/libxml2_svg/text01.xml +12 -0
  163. data/vendor-src/libleptris/benchmarks/fixtures/libxml2_svg/text02.xml +17 -0
  164. data/vendor-src/libleptris/benchmarks/fixtures/libxml2_svg/text03.xml +8 -0
  165. data/vendor-src/libleptris/benchmarks/fixtures/libxml2_svg/toap01.xml +10 -0
  166. data/vendor-src/libleptris/benchmarks/fixtures/libxml2_svg/toap02.xml +33 -0
  167. data/vendor-src/libleptris/benchmarks/fixtures/libxml2_svg/transform.xml +26 -0
  168. data/vendor-src/libleptris/benchmarks/fixtures/libxml2_svg/trivial.xml +6 -0
  169. data/vendor-src/libleptris/benchmarks/fixtures/libxml2_svg/twin-gradients.xml +19 -0
  170. data/vendor-src/libleptris/benchmarks/fixtures/libxml2_svg/v-template.xml +9 -0
  171. data/vendor-src/libleptris/benchmarks/fixtures/libxml2_svg/viewport-nest.xml +13 -0
  172. data/vendor-src/libleptris/benchmarks/fixtures/libxml2_svg/viewport-transform.xml +46 -0
  173. data/vendor-src/libleptris/benchmarks/fixtures/libxml2_svg/viewport.xml +11 -0
  174. data/vendor-src/libleptris/benchmarks/fixtures/libxml2_svg/wf-template.xml +7 -0
  175. data/vendor-src/libleptris/benchmarks/fixtures/libxml2_xsdtest.xml +5286 -0
  176. data/vendor-src/libleptris/benchmarks/fixtures/medium.xml +403 -0
  177. data/vendor-src/libleptris/benchmarks/fixtures/medium_catalog.xml +3003 -0
  178. data/vendor-src/libleptris/benchmarks/fixtures/pugixml/empty.xml +0 -0
  179. data/vendor-src/libleptris/benchmarks/fixtures/pugixml/large.xml +1 -0
  180. data/vendor-src/libleptris/benchmarks/fixtures/pugixml/latintest_latin1.xml +1 -0
  181. data/vendor-src/libleptris/benchmarks/fixtures/pugixml/latintest_utf8.xml +1 -0
  182. data/vendor-src/libleptris/benchmarks/fixtures/pugixml/multiline.xml +3 -0
  183. data/vendor-src/libleptris/benchmarks/fixtures/pugixml/small.xml +1 -0
  184. data/vendor-src/libleptris/benchmarks/fixtures/pugixml/truncation.xml +19 -0
  185. data/vendor-src/libleptris/benchmarks/fixtures/pugixml/utftest_utf16_be.xml +0 -0
  186. data/vendor-src/libleptris/benchmarks/fixtures/pugixml/utftest_utf16_be_bom.xml +0 -0
  187. data/vendor-src/libleptris/benchmarks/fixtures/pugixml/utftest_utf16_be_clean.xml +0 -0
  188. data/vendor-src/libleptris/benchmarks/fixtures/pugixml/utftest_utf16_be_nodecl.xml +0 -0
  189. data/vendor-src/libleptris/benchmarks/fixtures/pugixml/utftest_utf16_le.xml +0 -0
  190. data/vendor-src/libleptris/benchmarks/fixtures/pugixml/utftest_utf16_le_bom.xml +0 -0
  191. data/vendor-src/libleptris/benchmarks/fixtures/pugixml/utftest_utf16_le_clean.xml +0 -0
  192. data/vendor-src/libleptris/benchmarks/fixtures/pugixml/utftest_utf16_le_nodecl.xml +0 -0
  193. data/vendor-src/libleptris/benchmarks/fixtures/pugixml/utftest_utf32_be.xml +0 -0
  194. data/vendor-src/libleptris/benchmarks/fixtures/pugixml/utftest_utf32_be_bom.xml +0 -0
  195. data/vendor-src/libleptris/benchmarks/fixtures/pugixml/utftest_utf32_be_clean.xml +0 -0
  196. data/vendor-src/libleptris/benchmarks/fixtures/pugixml/utftest_utf32_be_nodecl.xml +0 -0
  197. data/vendor-src/libleptris/benchmarks/fixtures/pugixml/utftest_utf32_le.xml +0 -0
  198. data/vendor-src/libleptris/benchmarks/fixtures/pugixml/utftest_utf32_le_bom.xml +0 -0
  199. data/vendor-src/libleptris/benchmarks/fixtures/pugixml/utftest_utf32_le_clean.xml +0 -0
  200. data/vendor-src/libleptris/benchmarks/fixtures/pugixml/utftest_utf32_le_nodecl.xml +0 -0
  201. data/vendor-src/libleptris/benchmarks/fixtures/pugixml/utftest_utf8.xml +87 -0
  202. data/vendor-src/libleptris/benchmarks/fixtures/pugixml/utftest_utf8_bom.xml +87 -0
  203. data/vendor-src/libleptris/benchmarks/fixtures/pugixml/utftest_utf8_clean.xml +84 -0
  204. data/vendor-src/libleptris/benchmarks/fixtures/pugixml/utftest_utf8_nodecl.xml +86 -0
  205. data/vendor-src/libleptris/benchmarks/fixtures/pugixml//321/202/320/265/321/201/321/202.xml +1 -0
  206. data/vendor-src/libleptris/benchmarks/fixtures/pugixml_tests/empty.xml +0 -0
  207. data/vendor-src/libleptris/benchmarks/fixtures/pugixml_tests/large.xml +1 -0
  208. data/vendor-src/libleptris/benchmarks/fixtures/pugixml_tests/latintest_latin1.xml +1 -0
  209. data/vendor-src/libleptris/benchmarks/fixtures/pugixml_tests/latintest_utf8.xml +1 -0
  210. data/vendor-src/libleptris/benchmarks/fixtures/pugixml_tests/multiline.xml +3 -0
  211. data/vendor-src/libleptris/benchmarks/fixtures/pugixml_tests/small.xml +1 -0
  212. data/vendor-src/libleptris/benchmarks/fixtures/pugixml_tests/truncation.xml +19 -0
  213. data/vendor-src/libleptris/benchmarks/fixtures/pugixml_tests/utftest_utf16_be.xml +0 -0
  214. data/vendor-src/libleptris/benchmarks/fixtures/pugixml_tests/utftest_utf16_be_bom.xml +0 -0
  215. data/vendor-src/libleptris/benchmarks/fixtures/pugixml_tests/utftest_utf16_be_clean.xml +0 -0
  216. data/vendor-src/libleptris/benchmarks/fixtures/pugixml_tests/utftest_utf16_be_nodecl.xml +0 -0
  217. data/vendor-src/libleptris/benchmarks/fixtures/pugixml_tests/utftest_utf16_le.xml +0 -0
  218. data/vendor-src/libleptris/benchmarks/fixtures/pugixml_tests/utftest_utf16_le_bom.xml +0 -0
  219. data/vendor-src/libleptris/benchmarks/fixtures/pugixml_tests/utftest_utf16_le_clean.xml +0 -0
  220. data/vendor-src/libleptris/benchmarks/fixtures/pugixml_tests/utftest_utf16_le_nodecl.xml +0 -0
  221. data/vendor-src/libleptris/benchmarks/fixtures/pugixml_tests/utftest_utf32_be.xml +0 -0
  222. data/vendor-src/libleptris/benchmarks/fixtures/pugixml_tests/utftest_utf32_be_bom.xml +0 -0
  223. data/vendor-src/libleptris/benchmarks/fixtures/pugixml_tests/utftest_utf32_be_clean.xml +0 -0
  224. data/vendor-src/libleptris/benchmarks/fixtures/pugixml_tests/utftest_utf32_be_nodecl.xml +0 -0
  225. data/vendor-src/libleptris/benchmarks/fixtures/pugixml_tests/utftest_utf32_le.xml +0 -0
  226. data/vendor-src/libleptris/benchmarks/fixtures/pugixml_tests/utftest_utf32_le_bom.xml +0 -0
  227. data/vendor-src/libleptris/benchmarks/fixtures/pugixml_tests/utftest_utf32_le_clean.xml +0 -0
  228. data/vendor-src/libleptris/benchmarks/fixtures/pugixml_tests/utftest_utf32_le_nodecl.xml +0 -0
  229. data/vendor-src/libleptris/benchmarks/fixtures/pugixml_tests/utftest_utf8.xml +87 -0
  230. data/vendor-src/libleptris/benchmarks/fixtures/pugixml_tests/utftest_utf8_bom.xml +87 -0
  231. data/vendor-src/libleptris/benchmarks/fixtures/pugixml_tests/utftest_utf8_clean.xml +84 -0
  232. data/vendor-src/libleptris/benchmarks/fixtures/pugixml_tests/utftest_utf8_nodecl.xml +86 -0
  233. data/vendor-src/libleptris/benchmarks/fixtures/pugixml_tests//321/202/320/265/321/201/321/202.xml +1 -0
  234. data/vendor-src/libleptris/benchmarks/fixtures/small.xml +38 -0
  235. data/vendor-src/libleptris/benchmarks/html/bench_html_parse.c +111 -0
  236. data/vendor-src/libleptris/benchmarks/html/gen_nokogiri_reference.rb +112 -0
  237. data/vendor-src/libleptris/benchmarks/html/nokogiri_html_parse.rb +64 -0
  238. data/vendor-src/libleptris/benchmarks/matrix/README.md +71 -0
  239. data/vendor-src/libleptris/benchmarks/matrix/bench2html.rb +316 -0
  240. data/vendor-src/libleptris/benchmarks/matrix/bench_matrix.cpp +724 -0
  241. data/vendor-src/libleptris/benchmarks/modification/bench_leptris_modify.c +211 -0
  242. data/vendor-src/libleptris/benchmarks/modification/bench_node_creation.c +130 -0
  243. data/vendor-src/libleptris/benchmarks/results/BENCHMARK_REPORT.md +226 -0
  244. data/vendor-src/libleptris/benchmarks/results/baseline_report.md +219 -0
  245. data/vendor-src/libleptris/benchmarks/results/benchmark_20251223_134550.json +13 -0
  246. data/vendor-src/libleptris/benchmarks/results/benchmark_20260129_225844.json +13 -0
  247. data/vendor-src/libleptris/benchmarks/results/leptris_dom_output.txt +24 -0
  248. data/vendor-src/libleptris/benchmarks/results/leptris_modify.json +36 -0
  249. data/vendor-src/libleptris/benchmarks/results/leptris_modify_optimized.json +36 -0
  250. data/vendor-src/libleptris/benchmarks/results/leptris_modify_session1.json +36 -0
  251. data/vendor-src/libleptris/benchmarks/results/leptris_modify_session2.json +36 -0
  252. data/vendor-src/libleptris/benchmarks/results/leptris_serialize.json +34 -0
  253. data/vendor-src/libleptris/benchmarks/results/leptris_xpath_output.txt +24 -0
  254. data/vendor-src/libleptris/benchmarks/results/libxml2_dom_output.txt +24 -0
  255. data/vendor-src/libleptris/benchmarks/results/libxml2_xpath_output.txt +24 -0
  256. data/vendor-src/libleptris/benchmarks/results/phase16_session2.json +21 -0
  257. data/vendor-src/libleptris/benchmarks/results/phase17.5_session1.json +30 -0
  258. data/vendor-src/libleptris/benchmarks/results/phase17_session1.json +30 -0
  259. data/vendor-src/libleptris/benchmarks/results/pugixml_dom_output.txt +51 -0
  260. data/vendor-src/libleptris/benchmarks/results/xpath_axes_leptris.json +318 -0
  261. data/vendor-src/libleptris/benchmarks/results/xpath_axes_libxml2.json +318 -0
  262. data/vendor-src/libleptris/benchmarks/results/xpath_functions_leptris.json +222 -0
  263. data/vendor-src/libleptris/benchmarks/results/xpath_functions_libxml2.json +222 -0
  264. data/vendor-src/libleptris/benchmarks/sax/bench_iterparse.c +115 -0
  265. data/vendor-src/libleptris/benchmarks/sax/bench_leptris.c +124 -0
  266. data/vendor-src/libleptris/benchmarks/sax/bench_libxml2.c +115 -0
  267. data/vendor-src/libleptris/benchmarks/serialization/bench_leptris_serialize.c +198 -0
  268. data/vendor-src/libleptris/benchmarks/src/benchmark_base.h +175 -0
  269. data/vendor-src/libleptris/benchmarks/twins/mutation_leptris.c +37 -0
  270. data/vendor-src/libleptris/benchmarks/twins/mutation_pugixml.cpp +28 -0
  271. data/vendor-src/libleptris/benchmarks/twins/parse_leptris.c +35 -0
  272. data/vendor-src/libleptris/benchmarks/twins/parse_pugixml.cpp +35 -0
  273. data/vendor-src/libleptris/benchmarks/utils.c +171 -0
  274. data/vendor-src/libleptris/benchmarks/utils.h +70 -0
  275. data/vendor-src/libleptris/benchmarks/workflows/bench_dom_modify.c +325 -0
  276. data/vendor-src/libleptris/benchmarks/workflows/bench_end_to_end.c +529 -0
  277. data/vendor-src/libleptris/benchmarks/xpath/bench_axes.c +411 -0
  278. data/vendor-src/libleptris/benchmarks/xpath/bench_axes_libxml2.c +108 -0
  279. data/vendor-src/libleptris/benchmarks/xpath/bench_diagnostic.c +431 -0
  280. data/vendor-src/libleptris/benchmarks/xpath/bench_functions.c +271 -0
  281. data/vendor-src/libleptris/benchmarks/xpath/bench_functions_libxml2.c +123 -0
  282. data/vendor-src/libleptris/benchmarks/xpath/bench_leptris.c +78 -0
  283. data/vendor-src/libleptris/benchmarks/xpath/bench_libxml2.c +98 -0
  284. data/vendor-src/libleptris/benchmarks/xpath/bench_pugixml.cpp +117 -0
  285. data/vendor-src/libleptris/benchmarks/xpath/bench_scalar_eval.c +86 -0
  286. data/vendor-src/libleptris/benchmarks/xpath/bench_scalar_eval_libxml2.c +70 -0
  287. data/vendor-src/libleptris/benchmarks/xpath/bench_xslt_transform.c +48 -0
  288. data/vendor-src/libleptris/benchmarks/xslt/bench_dispatch.c +52 -0
  289. data/vendor-src/libleptris/benchmarks/xslt/bench_dispatch_heavy.c +82 -0
  290. data/vendor-src/libleptris/benchmarks/xslt/bench_dispatch_pred.c +34 -0
  291. data/vendor-src/libleptris/benchmarks/xslt/bench_subtree_copy.c +55 -0
  292. data/vendor-src/libleptris/benchmarks/xslt/bench_valueof.c +46 -0
  293. data/vendor-src/libleptris/benchmarks/xslt/heavy_lxml.py +48 -0
  294. data/vendor-src/libleptris/benchmarks/xslt/scorecard_lxml.py +169 -0
  295. data/vendor-src/libleptris/bindings/ruby/leptris.gemspec +22 -0
  296. data/vendor-src/libleptris/bindings/ruby/lib/leptris/document.rb +60 -0
  297. data/vendor-src/libleptris/bindings/ruby/lib/leptris/element.rb +86 -0
  298. data/vendor-src/libleptris/bindings/ruby/lib/leptris/error.rb +6 -0
  299. data/vendor-src/libleptris/bindings/ruby/lib/leptris/node.rb +73 -0
  300. data/vendor-src/libleptris/bindings/ruby/lib/leptris/sax.rb +189 -0
  301. data/vendor-src/libleptris/bindings/ruby/lib/leptris/xpath.rb +44 -0
  302. data/vendor-src/libleptris/bindings/ruby/lib/leptris.rb +137 -0
  303. data/vendor-src/libleptris/bindings/ruby/spec/leptris_spec.rb +113 -0
  304. data/vendor-src/libleptris/bindings/ruby/spec/sax_spec.rb +141 -0
  305. data/vendor-src/libleptris/bindings/ruby/spec/spec_helper.rb +7 -0
  306. data/vendor-src/libleptris/bindings/ruby/test_full.rb +21 -0
  307. data/vendor-src/libleptris/bindings/rust/Cargo.lock +7 -0
  308. data/vendor-src/libleptris/bindings/rust/Cargo.toml +13 -0
  309. data/vendor-src/libleptris/bindings/rust/README.md +61 -0
  310. data/vendor-src/libleptris/bindings/rust/build.rs +74 -0
  311. data/vendor-src/libleptris/bindings/rust/src/ffi.rs +204 -0
  312. data/vendor-src/libleptris/bindings/rust/src/lib.rs +580 -0
  313. data/vendor-src/libleptris/bindings/rust/tests/integration.rs +156 -0
  314. data/vendor-src/libleptris/cli/ARCHITECTURE_REVIEW.md +514 -0
  315. data/vendor-src/libleptris/cli/CLI_ARCHITECTURE.md +851 -0
  316. data/vendor-src/libleptris/cli/CMakeLists.txt +46 -0
  317. data/vendor-src/libleptris/cli/cli.c +115 -0
  318. data/vendor-src/libleptris/cli/cli.h +232 -0
  319. data/vendor-src/libleptris/cli/commands/diff.c +208 -0
  320. data/vendor-src/libleptris/cli/commands/format.c +379 -0
  321. data/vendor-src/libleptris/cli/commands/parse.c +343 -0
  322. data/vendor-src/libleptris/cli/commands/validate.c +284 -0
  323. data/vendor-src/libleptris/cli/commands/version.c +49 -0
  324. data/vendor-src/libleptris/cli/commands/xpath.c +428 -0
  325. data/vendor-src/libleptris/cli/commands/xquery.c +188 -0
  326. data/vendor-src/libleptris/cli/completion/leptris.bash +86 -0
  327. data/vendor-src/libleptris/cli/completion/leptris.zsh +74 -0
  328. data/vendor-src/libleptris/cli/error.c +394 -0
  329. data/vendor-src/libleptris/cli/error.h +360 -0
  330. data/vendor-src/libleptris/cli/leptris +0 -0
  331. data/vendor-src/libleptris/cli/main.c +127 -0
  332. data/vendor-src/libleptris/cli/man/leptris-format.1.adoc +226 -0
  333. data/vendor-src/libleptris/cli/man/leptris-parse.1.adoc +213 -0
  334. data/vendor-src/libleptris/cli/man/leptris-xpath.1.adoc +479 -0
  335. data/vendor-src/libleptris/cli/man/leptris.1.adoc +192 -0
  336. data/vendor-src/libleptris/cli/options.c +451 -0
  337. data/vendor-src/libleptris/cli/options.h +378 -0
  338. data/vendor-src/libleptris/cli/output.c +841 -0
  339. data/vendor-src/libleptris/cli/output.h +361 -0
  340. data/vendor-src/libleptris/cmake/FindUtf8proc.cmake +56 -0
  341. data/vendor-src/libleptris/cmake/leptris-config.cmake.in +14 -0
  342. data/vendor-src/libleptris/cmake/leptris.pc.in +11 -0
  343. data/vendor-src/libleptris/cmake/modules/AdocMan.cmake +132 -0
  344. data/vendor-src/libleptris/docs/ARCHITECTURE_REVIEW.md +280 -0
  345. data/vendor-src/libleptris/docs/Doxyfile +47 -0
  346. data/vendor-src/libleptris/docs/FFI.md +165 -0
  347. data/vendor-src/libleptris/docs/README.md +47 -0
  348. data/vendor-src/libleptris/docs/ROADMAP-SAXON-PARITY.md +194 -0
  349. data/vendor-src/libleptris/docs/guide/building.md +199 -0
  350. data/vendor-src/libleptris/docs/guide/getting-started.md +134 -0
  351. data/vendor-src/libleptris/docs/guide/parsing.md +315 -0
  352. data/vendor-src/libleptris/docs/guide/xpath-queries.md +444 -0
  353. data/vendor-src/libleptris/examples/c/CMakeLists.txt +58 -0
  354. data/vendor-src/libleptris/examples/c/README.md +345 -0
  355. data/vendor-src/libleptris/examples/c/basic_example.c +80 -0
  356. data/vendor-src/libleptris/examples/c/dom_traversal_example.c +58 -0
  357. data/vendor-src/libleptris/examples/c/error_handling_example.c +121 -0
  358. data/vendor-src/libleptris/examples/c/namespace_example.c +49 -0
  359. data/vendor-src/libleptris/examples/c/xpath_example.c +74 -0
  360. data/vendor-src/libleptris/ports/leptris/portfile.cmake +41 -0
  361. data/vendor-src/libleptris/ports/leptris/usage +28 -0
  362. data/vendor-src/libleptris/scripts/check_dll_exports.py +54 -0
  363. data/vendor-src/libleptris/scripts/check_export_surface.py +84 -0
  364. data/vendor-src/libleptris/scripts/check_ffi_mirrors.py +163 -0
  365. data/vendor-src/libleptris/scripts/check_formatting.sh +30 -0
  366. data/vendor-src/libleptris/scripts/check_shared_exports.sh +120 -0
  367. data/vendor-src/libleptris/scripts/check_trailing_whitespace.sh +18 -0
  368. data/vendor-src/libleptris/scripts/gen-api-docs.sh +31 -0
  369. data/vendor-src/libleptris/scripts/run_static_analysis.sh +16 -0
  370. data/vendor-src/libleptris/scripts/validate.sh +199 -0
  371. data/vendor-src/libleptris/scripts/xslt_triage.sh +72 -0
  372. data/vendor-src/libleptris/src/CMakeLists.txt +597 -0
  373. data/vendor-src/libleptris/src/include/leptris/descriptor.h +178 -0
  374. data/vendor-src/libleptris/src/include/leptris/dom/document.h +213 -0
  375. data/vendor-src/libleptris/src/include/leptris/dom/element.h +435 -0
  376. data/vendor-src/libleptris/src/include/leptris/dom/serialize.h +133 -0
  377. data/vendor-src/libleptris/src/include/leptris/dtd.h +178 -0
  378. data/vendor-src/libleptris/src/include/leptris/error.h +97 -0
  379. data/vendor-src/libleptris/src/include/leptris/sax/sax.h +584 -0
  380. data/vendor-src/libleptris/src/include/leptris/types.h +386 -0
  381. data/vendor-src/libleptris/src/include/leptris/xpath/xpath.h +250 -0
  382. data/vendor-src/libleptris/src/include/leptris/xquery/xquery.h +80 -0
  383. data/vendor-src/libleptris/src/include/leptris.h +3701 -0
  384. data/vendor-src/libleptris/src/leptris/chartype.h +124 -0
  385. data/vendor-src/libleptris/src/leptris/common/chartype.c +90 -0
  386. data/vendor-src/libleptris/src/leptris/common/chartype.h +44 -0
  387. data/vendor-src/libleptris/src/leptris/common/cpu.c +40 -0
  388. data/vendor-src/libleptris/src/leptris/common/cpu.h +63 -0
  389. data/vendor-src/libleptris/src/leptris/common/entities.c +329 -0
  390. data/vendor-src/libleptris/src/leptris/common/entities.h +79 -0
  391. data/vendor-src/libleptris/src/leptris/common/format_number.c +273 -0
  392. data/vendor-src/libleptris/src/leptris/common/format_number.h +29 -0
  393. data/vendor-src/libleptris/src/leptris/common/port.h +171 -0
  394. data/vendor-src/libleptris/src/leptris/common/simd_text.c +237 -0
  395. data/vendor-src/libleptris/src/leptris/common/simd_text.h +104 -0
  396. data/vendor-src/libleptris/src/leptris/common/simd_text_avx2.c +105 -0
  397. data/vendor-src/libleptris/src/leptris/common/simd_text_neon.c +280 -0
  398. data/vendor-src/libleptris/src/leptris/common/string_view.c +204 -0
  399. data/vendor-src/libleptris/src/leptris/common/string_view.h +68 -0
  400. data/vendor-src/libleptris/src/leptris/common/types_internal.h +31 -0
  401. data/vendor-src/libleptris/src/leptris/core.c +201 -0
  402. data/vendor-src/libleptris/src/leptris/descriptor/plan.c +527 -0
  403. data/vendor-src/libleptris/src/leptris/diff/diff.c +491 -0
  404. data/vendor-src/libleptris/src/leptris/dom/cdata.c +47 -0
  405. data/vendor-src/libleptris/src/leptris/dom/cdata.h +73 -0
  406. data/vendor-src/libleptris/src/leptris/dom/comment.c +48 -0
  407. data/vendor-src/libleptris/src/leptris/dom/comment.h +74 -0
  408. data/vendor-src/libleptris/src/leptris/dom/compact.c +397 -0
  409. data/vendor-src/libleptris/src/leptris/dom/compact.h +307 -0
  410. data/vendor-src/libleptris/src/leptris/dom/diag.c +58 -0
  411. data/vendor-src/libleptris/src/leptris/dom/diag.h +75 -0
  412. data/vendor-src/libleptris/src/leptris/dom/digest.c +255 -0
  413. data/vendor-src/libleptris/src/leptris/dom/doctype.c +137 -0
  414. data/vendor-src/libleptris/src/leptris/dom/doctype.h +52 -0
  415. data/vendor-src/libleptris/src/leptris/dom/document_node.c +13 -0
  416. data/vendor-src/libleptris/src/leptris/dom/document_node.h +21 -0
  417. data/vendor-src/libleptris/src/leptris/dom/edges.h +60 -0
  418. data/vendor-src/libleptris/src/leptris/dom/element.c +1114 -0
  419. data/vendor-src/libleptris/src/leptris/dom/element.h +1109 -0
  420. data/vendor-src/libleptris/src/leptris/dom/element_index.c +444 -0
  421. data/vendor-src/libleptris/src/leptris/dom/element_index.h +135 -0
  422. data/vendor-src/libleptris/src/leptris/dom/element_modify.c +2185 -0
  423. data/vendor-src/libleptris/src/leptris/dom/element_query.c +1468 -0
  424. data/vendor-src/libleptris/src/leptris/dom/entity_ref.c +57 -0
  425. data/vendor-src/libleptris/src/leptris/dom/entity_ref.h +70 -0
  426. data/vendor-src/libleptris/src/leptris/dom/node.c +420 -0
  427. data/vendor-src/libleptris/src/leptris/dom/node.h +170 -0
  428. data/vendor-src/libleptris/src/leptris/dom/node_public.c +937 -0
  429. data/vendor-src/libleptris/src/leptris/dom/node_vtable.c +138 -0
  430. data/vendor-src/libleptris/src/leptris/dom/pi.c +70 -0
  431. data/vendor-src/libleptris/src/leptris/dom/pi.h +80 -0
  432. data/vendor-src/libleptris/src/leptris/dom/root_doc_map.c +310 -0
  433. data/vendor-src/libleptris/src/leptris/dom/root_doc_map.h +30 -0
  434. data/vendor-src/libleptris/src/leptris/dom/text.c +157 -0
  435. data/vendor-src/libleptris/src/leptris/dom/text.h +119 -0
  436. data/vendor-src/libleptris/src/leptris/dtd/content_check.c +300 -0
  437. data/vendor-src/libleptris/src/leptris/dtd/model.c +533 -0
  438. data/vendor-src/libleptris/src/leptris/dtd/model.h +354 -0
  439. data/vendor-src/libleptris/src/leptris/dtd/parser.c +827 -0
  440. data/vendor-src/libleptris/src/leptris/dtd/resolver.c +354 -0
  441. data/vendor-src/libleptris/src/leptris/dtd/validator.c +668 -0
  442. data/vendor-src/libleptris/src/leptris/encoding/encoders.c +346 -0
  443. data/vendor-src/libleptris/src/leptris/encoding/encoders.h +61 -0
  444. data/vendor-src/libleptris/src/leptris/encoding/encoding.c +451 -0
  445. data/vendor-src/libleptris/src/leptris/encoding/encoding.h +118 -0
  446. data/vendor-src/libleptris/src/leptris/encoding/unicode.c +317 -0
  447. data/vendor-src/libleptris/src/leptris/encoding/unicode.h +64 -0
  448. data/vendor-src/libleptris/src/leptris/encoding/utf16.c +204 -0
  449. data/vendor-src/libleptris/src/leptris/encoding/utf16.h +78 -0
  450. data/vendor-src/libleptris/src/leptris/encoding/wrapper.c +243 -0
  451. data/vendor-src/libleptris/src/leptris/error.c +134 -0
  452. data/vendor-src/libleptris/src/leptris/flat/direct_parse.c +1935 -0
  453. data/vendor-src/libleptris/src/leptris/flat/direct_parse.h +41 -0
  454. data/vendor-src/libleptris/src/leptris/html/html_parse.c +8040 -0
  455. data/vendor-src/libleptris/src/leptris/leptris.c +1264 -0
  456. data/vendor-src/libleptris/src/leptris/leptris_internal.h +910 -0
  457. data/vendor-src/libleptris/src/leptris/leptris_memory.c +179 -0
  458. data/vendor-src/libleptris/src/leptris/leptris_memory.h +180 -0
  459. data/vendor-src/libleptris/src/leptris/leptris_parse.h +195 -0
  460. data/vendor-src/libleptris/src/leptris/memory/arena.c +243 -0
  461. data/vendor-src/libleptris/src/leptris/memory/arena.h +93 -0
  462. data/vendor-src/libleptris/src/leptris/memory/pool.c +1055 -0
  463. data/vendor-src/libleptris/src/leptris/memory/pool.h +426 -0
  464. data/vendor-src/libleptris/src/leptris/rng/parse.c +814 -0
  465. data/vendor-src/libleptris/src/leptris/rng/rng_internal.h +112 -0
  466. data/vendor-src/libleptris/src/leptris/rng/rng_public.c +159 -0
  467. data/vendor-src/libleptris/src/leptris/rng/rng_regex.c +453 -0
  468. data/vendor-src/libleptris/src/leptris/rng/validate.c +1923 -0
  469. data/vendor-src/libleptris/src/leptris/sax/iterparse.c +435 -0
  470. data/vendor-src/libleptris/src/leptris/sax/parser.c +105 -0
  471. data/vendor-src/libleptris/src/leptris/sax/pull.c +489 -0
  472. data/vendor-src/libleptris/src/leptris/sax/recorder.c +252 -0
  473. data/vendor-src/libleptris/src/leptris/sax/sax_internal.h +163 -0
  474. data/vendor-src/libleptris/src/leptris/sax/streaming.c +1469 -0
  475. data/vendor-src/libleptris/src/leptris/sch/schematron.c +1588 -0
  476. data/vendor-src/libleptris/src/leptris/serialize/c14n.c +1143 -0
  477. data/vendor-src/libleptris/src/leptris/serialize/serialize.c +2333 -0
  478. data/vendor-src/libleptris/src/leptris/serialize/serialize.h +188 -0
  479. data/vendor-src/libleptris/src/leptris/simd_helpers.h +447 -0
  480. data/vendor-src/libleptris/src/leptris/unicode/unicode.c +237 -0
  481. data/vendor-src/libleptris/src/leptris/unicode/unicode.h +113 -0
  482. data/vendor-src/libleptris/src/leptris/xinclude/xinclude.c +794 -0
  483. data/vendor-src/libleptris/src/leptris/xpath/bytecode.h +229 -0
  484. data/vendor-src/libleptris/src/leptris/xpath/compiler.c +1478 -0
  485. data/vendor-src/libleptris/src/leptris/xpath/evaluator.c +1099 -0
  486. data/vendor-src/libleptris/src/leptris/xpath/evaluator.h +189 -0
  487. data/vendor-src/libleptris/src/leptris/xpath/evaluator_axes.c +787 -0
  488. data/vendor-src/libleptris/src/leptris/xpath/evaluator_internal.h +112 -0
  489. data/vendor-src/libleptris/src/leptris/xpath/evaluator_operators.c +2138 -0
  490. data/vendor-src/libleptris/src/leptris/xpath/evaluator_path.c +1312 -0
  491. data/vendor-src/libleptris/src/leptris/xpath/evaluator_types.c +294 -0
  492. data/vendor-src/libleptris/src/leptris/xpath/functions.c +2544 -0
  493. data/vendor-src/libleptris/src/leptris/xpath/functions.h +161 -0
  494. data/vendor-src/libleptris/src/leptris/xpath/functions_exslt.c +545 -0
  495. data/vendor-src/libleptris/src/leptris/xpath/functions_ext31.c +4316 -0
  496. data/vendor-src/libleptris/src/leptris/xpath/lexer.c +636 -0
  497. data/vendor-src/libleptris/src/leptris/xpath/lexer.h +25 -0
  498. data/vendor-src/libleptris/src/leptris/xpath/parser.c +2992 -0
  499. data/vendor-src/libleptris/src/leptris/xpath/parser.h +28 -0
  500. data/vendor-src/libleptris/src/leptris/xpath/vm.c +2903 -0
  501. data/vendor-src/libleptris/src/leptris/xpath/xpath_ast_cache.c +319 -0
  502. data/vendor-src/libleptris/src/leptris/xpath/xpath_compiled.c +263 -0
  503. data/vendor-src/libleptris/src/leptris/xpath/xpath_internal.h +134 -0
  504. data/vendor-src/libleptris/src/leptris/xpath/xpath_public.c +1139 -0
  505. data/vendor-src/libleptris/src/leptris/xpath/xpath_variables.c +410 -0
  506. data/vendor-src/libleptris/src/leptris/xpath/xpath_variables.h +230 -0
  507. data/vendor-src/libleptris/src/leptris/xquery/xquery.c +2641 -0
  508. data/vendor-src/libleptris/src/leptris/xslt/xslt_exec.c +4887 -0
  509. data/vendor-src/libleptris/src/leptris/xslt/xslt_functions.c +1612 -0
  510. data/vendor-src/libleptris/src/leptris/xslt/xslt_internal.h +862 -0
  511. data/vendor-src/libleptris/src/leptris/xslt/xslt_parse.c +2418 -0
  512. data/vendor-src/libleptris/src/leptris/xslt/xslt_pattern.c +441 -0
  513. data/vendor-src/libleptris/src/leptris/xslt/xslt_public.c +710 -0
  514. data/vendor-src/libleptris/src/leptris.symvers +16 -0
  515. data/vendor-src/libleptris/src/man/libleptris.5.adoc +961 -0
  516. data/vendor-src/libleptris/test/CMakeLists.txt +234 -0
  517. data/vendor-src/libleptris/test/README.md +59 -0
  518. data/vendor-src/libleptris/test/abi/test_descriptor.cpp +441 -0
  519. data/vendor-src/libleptris/test/abi/test_doctype_api.cpp +51 -0
  520. data/vendor-src/libleptris/test/abi/test_dom_deep_copy.cpp +110 -0
  521. data/vendor-src/libleptris/test/abi/test_dom_mutation_bugs.cpp +210 -0
  522. data/vendor-src/libleptris/test/abi/test_header_hygiene.cpp +269 -0
  523. data/vendor-src/libleptris/test/abi/test_namespace_mutation_and_create.cpp +198 -0
  524. data/vendor-src/libleptris/test/abi/test_node_get_xpath.cpp +128 -0
  525. data/vendor-src/libleptris/test/abi/test_nokogiri_api.cpp +392 -0
  526. data/vendor-src/libleptris/test/abi/test_parse_fragment.cpp +114 -0
  527. data/vendor-src/libleptris/test/abi/test_previous_sibling_and_c14n_ex.cpp +299 -0
  528. data/vendor-src/libleptris/test/abi/test_public_surface.cpp +463 -0
  529. data/vendor-src/libleptris/test/abi/test_serialize_abi.cpp +67 -0
  530. data/vendor-src/libleptris/test/abi/test_v0_5_14_bugs.cpp +299 -0
  531. data/vendor-src/libleptris/test/abi/test_xpath_custom_fns.cpp +106 -0
  532. data/vendor-src/libleptris/test/cli/test_cli.cpp +493 -0
  533. data/vendor-src/libleptris/test/common/test_simd_spans.cpp +88 -0
  534. data/vendor-src/libleptris/test/common/test_simd_text.cpp +142 -0
  535. data/vendor-src/libleptris/test/concurrency/test_concurrency.cpp +218 -0
  536. data/vendor-src/libleptris/test/diff/test_diff.cpp +244 -0
  537. data/vendor-src/libleptris/test/dom/test_compact.cpp +339 -0
  538. data/vendor-src/libleptris/test/dom/test_digest.cpp +111 -0
  539. data/vendor-src/libleptris/test/dom/test_document_children.cpp +270 -0
  540. data/vendor-src/libleptris/test/dom/test_dom.cpp +2310 -0
  541. data/vendor-src/libleptris/test/dom/test_map_lifecycle.cpp +111 -0
  542. data/vendor-src/libleptris/test/dom/test_node_surface_parity.cpp +268 -0
  543. data/vendor-src/libleptris/test/dom/test_text_borrowed.cpp +126 -0
  544. data/vendor-src/libleptris/test/dom/test_vtable.cpp +108 -0
  545. data/vendor-src/libleptris/test/dtd/test_dtd_validate.cpp +1227 -0
  546. data/vendor-src/libleptris/test/dtd/test_w3c_conformance.cpp +212 -0
  547. data/vendor-src/libleptris/test/fixtures/basic.xml +13 -0
  548. data/vendor-src/libleptris/test/fixtures/cdata.xml +5 -0
  549. data/vendor-src/libleptris/test/fixtures/malformed.xml +2 -0
  550. data/vendor-src/libleptris/test/fixtures/namespaces.xml +11 -0
  551. data/vendor-src/libleptris/test/fixtures/utf16_decl.xml +5 -0
  552. data/vendor-src/libleptris/test/fuzz/fuzz_parse.c +40 -0
  553. data/vendor-src/libleptris/test/html/html5lib-redlist.txt +1366 -0
  554. data/vendor-src/libleptris/test/html/html5lib-tests/LICENSE +21 -0
  555. data/vendor-src/libleptris/test/html/html5lib-tests/README.md +11 -0
  556. data/vendor-src/libleptris/test/html/html5lib-tests/tree-construction/adoption01.dat +354 -0
  557. data/vendor-src/libleptris/test/html/html5lib-tests/tree-construction/adoption02.dat +39 -0
  558. data/vendor-src/libleptris/test/html/html5lib-tests/tree-construction/blocks.dat +695 -0
  559. data/vendor-src/libleptris/test/html/html5lib-tests/tree-construction/comments01.dat +217 -0
  560. data/vendor-src/libleptris/test/html/html5lib-tests/tree-construction/doctype01.dat +474 -0
  561. data/vendor-src/libleptris/test/html/html5lib-tests/tree-construction/domjs-unsafe.dat +0 -0
  562. data/vendor-src/libleptris/test/html/html5lib-tests/tree-construction/entities01.dat +943 -0
  563. data/vendor-src/libleptris/test/html/html5lib-tests/tree-construction/entities02.dat +309 -0
  564. data/vendor-src/libleptris/test/html/html5lib-tests/tree-construction/foreign-fragment.dat +645 -0
  565. data/vendor-src/libleptris/test/html/html5lib-tests/tree-construction/html5test-com.dat +301 -0
  566. data/vendor-src/libleptris/test/html/html5lib-tests/tree-construction/inbody01.dat +54 -0
  567. data/vendor-src/libleptris/test/html/html5lib-tests/tree-construction/isindex.dat +49 -0
  568. data/vendor-src/libleptris/test/html/html5lib-tests/tree-construction/main-element.dat +46 -0
  569. data/vendor-src/libleptris/test/html/html5lib-tests/tree-construction/math.dat +104 -0
  570. data/vendor-src/libleptris/test/html/html5lib-tests/tree-construction/menuitem-element.dat +240 -0
  571. data/vendor-src/libleptris/test/html/html5lib-tests/tree-construction/namespace-sensitivity.dat +22 -0
  572. data/vendor-src/libleptris/test/html/html5lib-tests/tree-construction/noscript01.dat +237 -0
  573. data/vendor-src/libleptris/test/html/html5lib-tests/tree-construction/pending-spec-changes-plain-text-unsafe.dat +0 -0
  574. data/vendor-src/libleptris/test/html/html5lib-tests/tree-construction/pending-spec-changes.dat +46 -0
  575. data/vendor-src/libleptris/test/html/html5lib-tests/tree-construction/plain-text-unsafe.dat +0 -0
  576. data/vendor-src/libleptris/test/html/html5lib-tests/tree-construction/ruby.dat +302 -0
  577. data/vendor-src/libleptris/test/html/html5lib-tests/tree-construction/scriptdata01.dat +372 -0
  578. data/vendor-src/libleptris/test/html/html5lib-tests/tree-construction/search-element.dat +46 -0
  579. data/vendor-src/libleptris/test/html/html5lib-tests/tree-construction/svg.dat +104 -0
  580. data/vendor-src/libleptris/test/html/html5lib-tests/tree-construction/tables01.dat +308 -0
  581. data/vendor-src/libleptris/test/html/html5lib-tests/tree-construction/template.dat +1673 -0
  582. data/vendor-src/libleptris/test/html/html5lib-tests/tree-construction/tests1.dat +1956 -0
  583. data/vendor-src/libleptris/test/html/html5lib-tests/tree-construction/tests10.dat +849 -0
  584. data/vendor-src/libleptris/test/html/html5lib-tests/tree-construction/tests11.dat +523 -0
  585. data/vendor-src/libleptris/test/html/html5lib-tests/tree-construction/tests12.dat +62 -0
  586. data/vendor-src/libleptris/test/html/html5lib-tests/tree-construction/tests14.dat +75 -0
  587. data/vendor-src/libleptris/test/html/html5lib-tests/tree-construction/tests15.dat +216 -0
  588. data/vendor-src/libleptris/test/html/html5lib-tests/tree-construction/tests16.dat +2602 -0
  589. data/vendor-src/libleptris/test/html/html5lib-tests/tree-construction/tests17.dat +179 -0
  590. data/vendor-src/libleptris/test/html/html5lib-tests/tree-construction/tests18.dat +558 -0
  591. data/vendor-src/libleptris/test/html/html5lib-tests/tree-construction/tests19.dat +1398 -0
  592. data/vendor-src/libleptris/test/html/html5lib-tests/tree-construction/tests2.dat +821 -0
  593. data/vendor-src/libleptris/test/html/html5lib-tests/tree-construction/tests20.dat +842 -0
  594. data/vendor-src/libleptris/test/html/html5lib-tests/tree-construction/tests21.dat +306 -0
  595. data/vendor-src/libleptris/test/html/html5lib-tests/tree-construction/tests22.dat +190 -0
  596. data/vendor-src/libleptris/test/html/html5lib-tests/tree-construction/tests23.dat +168 -0
  597. data/vendor-src/libleptris/test/html/html5lib-tests/tree-construction/tests24.dat +79 -0
  598. data/vendor-src/libleptris/test/html/html5lib-tests/tree-construction/tests25.dat +288 -0
  599. data/vendor-src/libleptris/test/html/html5lib-tests/tree-construction/tests26.dat +453 -0
  600. data/vendor-src/libleptris/test/html/html5lib-tests/tree-construction/tests3.dat +305 -0
  601. data/vendor-src/libleptris/test/html/html5lib-tests/tree-construction/tests4.dat +58 -0
  602. data/vendor-src/libleptris/test/html/html5lib-tests/tree-construction/tests5.dat +210 -0
  603. data/vendor-src/libleptris/test/html/html5lib-tests/tree-construction/tests6.dat +663 -0
  604. data/vendor-src/libleptris/test/html/html5lib-tests/tree-construction/tests7.dat +417 -0
  605. data/vendor-src/libleptris/test/html/html5lib-tests/tree-construction/tests8.dat +165 -0
  606. data/vendor-src/libleptris/test/html/html5lib-tests/tree-construction/tests9.dat +472 -0
  607. data/vendor-src/libleptris/test/html/html5lib-tests/tree-construction/tests_innerHTML_1.dat +843 -0
  608. data/vendor-src/libleptris/test/html/html5lib-tests/tree-construction/tricky01.dat +336 -0
  609. data/vendor-src/libleptris/test/html/html5lib-tests/tree-construction/webkit01.dat +785 -0
  610. data/vendor-src/libleptris/test/html/html5lib-tests/tree-construction/webkit02.dat +554 -0
  611. data/vendor-src/libleptris/test/html/html5lib_cases.h.in +6 -0
  612. data/vendor-src/libleptris/test/html/nokogiri-parity-redlist.txt +1183 -0
  613. data/vendor-src/libleptris/test/html/nokogiri-tree-tests.dat +18107 -0
  614. data/vendor-src/libleptris/test/html/test_html.cpp +2191 -0
  615. data/vendor-src/libleptris/test/html/test_html5lib.cpp +831 -0
  616. data/vendor-src/libleptris/test/memory/test_arena.cpp +252 -0
  617. data/vendor-src/libleptris/test/memory/test_oom_injection.cpp +170 -0
  618. data/vendor-src/libleptris/test/memory/test_pool.cpp +331 -0
  619. data/vendor-src/libleptris/test/memory/test_pool_arena.cpp +180 -0
  620. data/vendor-src/libleptris/test/parser/test_encoding.cpp +282 -0
  621. data/vendor-src/libleptris/test/parser/test_large_documents.cpp +346 -0
  622. data/vendor-src/libleptris/test/parser/test_parser.cpp +565 -0
  623. data/vendor-src/libleptris/test/parser/test_simd_count.cpp +70 -0
  624. data/vendor-src/libleptris/test/perf/test_perf.cpp +362 -0
  625. data/vendor-src/libleptris/test/perf/test_stress_high_doc_count.cpp +67 -0
  626. data/vendor-src/libleptris/test/rng/include-cases/bad-construct.rng +7 -0
  627. data/vendor-src/libleptris/test/rng/include-cases/bad-override.rng +6 -0
  628. data/vendor-src/libleptris/test/rng/include-cases/bad-start-override.rng +5 -0
  629. data/vendor-src/libleptris/test/rng/include-cases/ext-lib.rng +3 -0
  630. data/vendor-src/libleptris/test/rng/include-cases/ext-main.rng +7 -0
  631. data/vendor-src/libleptris/test/rng/include-cases/lib.rng +5 -0
  632. data/vendor-src/libleptris/test/rng/include-cases/lib2.rng +6 -0
  633. data/vendor-src/libleptris/test/rng/include-cases/main.rng +4 -0
  634. data/vendor-src/libleptris/test/rng/include-cases/no-href.rng +4 -0
  635. data/vendor-src/libleptris/test/rng/include-cases/override.rng +8 -0
  636. data/vendor-src/libleptris/test/rng/include-cases/self-include.rng +4 -0
  637. data/vendor-src/libleptris/test/rng/include-cases/start-override.rng +5 -0
  638. data/vendor-src/libleptris/test/rng/jing-cases/000.bad.xml +1 -0
  639. data/vendor-src/libleptris/test/rng/jing-cases/000.ok.xml +1 -0
  640. data/vendor-src/libleptris/test/rng/jing-cases/000.rng +1 -0
  641. data/vendor-src/libleptris/test/rng/jing-cases/001.bad.xml +1 -0
  642. data/vendor-src/libleptris/test/rng/jing-cases/001.ok.xml +1 -0
  643. data/vendor-src/libleptris/test/rng/jing-cases/001.rng +1 -0
  644. data/vendor-src/libleptris/test/rng/jing-cases/002.bad.xml +1 -0
  645. data/vendor-src/libleptris/test/rng/jing-cases/002.ok.xml +1 -0
  646. data/vendor-src/libleptris/test/rng/jing-cases/002.rng +1 -0
  647. data/vendor-src/libleptris/test/rng/jing-cases/003.bad.xml +1 -0
  648. data/vendor-src/libleptris/test/rng/jing-cases/003.ok.xml +1 -0
  649. data/vendor-src/libleptris/test/rng/jing-cases/003.rng +1 -0
  650. data/vendor-src/libleptris/test/rng/jing-cases/004.bad.xml +1 -0
  651. data/vendor-src/libleptris/test/rng/jing-cases/004.ok.xml +1 -0
  652. data/vendor-src/libleptris/test/rng/jing-cases/004.rng +1 -0
  653. data/vendor-src/libleptris/test/rng/jing-cases/005.bad.xml +1 -0
  654. data/vendor-src/libleptris/test/rng/jing-cases/005.ok.xml +1 -0
  655. data/vendor-src/libleptris/test/rng/jing-cases/005.rng +1 -0
  656. data/vendor-src/libleptris/test/rng/jing-cases/006.bad.xml +1 -0
  657. data/vendor-src/libleptris/test/rng/jing-cases/006.ok.xml +1 -0
  658. data/vendor-src/libleptris/test/rng/jing-cases/006.rng +1 -0
  659. data/vendor-src/libleptris/test/rng/jing-cases/007.bad.xml +1 -0
  660. data/vendor-src/libleptris/test/rng/jing-cases/007.ok.xml +1 -0
  661. data/vendor-src/libleptris/test/rng/jing-cases/007.rng +1 -0
  662. data/vendor-src/libleptris/test/rng/jing-cases/008.bad.xml +1 -0
  663. data/vendor-src/libleptris/test/rng/jing-cases/008.ok.xml +1 -0
  664. data/vendor-src/libleptris/test/rng/jing-cases/008.rng +1 -0
  665. data/vendor-src/libleptris/test/rng/jing-cases/009.bad.xml +1 -0
  666. data/vendor-src/libleptris/test/rng/jing-cases/009.ok.xml +1 -0
  667. data/vendor-src/libleptris/test/rng/jing-cases/009.rng +1 -0
  668. data/vendor-src/libleptris/test/rng/jing-cases/010.bad.xml +1 -0
  669. data/vendor-src/libleptris/test/rng/jing-cases/010.ok.xml +1 -0
  670. data/vendor-src/libleptris/test/rng/jing-cases/010.rng +1 -0
  671. data/vendor-src/libleptris/test/rng/jing-cases/011.bad.xml +1 -0
  672. data/vendor-src/libleptris/test/rng/jing-cases/011.ok.xml +1 -0
  673. data/vendor-src/libleptris/test/rng/jing-cases/011.rng +1 -0
  674. data/vendor-src/libleptris/test/rng/jing-cases/012.bad.xml +1 -0
  675. data/vendor-src/libleptris/test/rng/jing-cases/012.ok.xml +1 -0
  676. data/vendor-src/libleptris/test/rng/jing-cases/012.rng +1 -0
  677. data/vendor-src/libleptris/test/rng/jing-cases/013.bad.xml +1 -0
  678. data/vendor-src/libleptris/test/rng/jing-cases/013.ok.xml +1 -0
  679. data/vendor-src/libleptris/test/rng/jing-cases/013.rng +1 -0
  680. data/vendor-src/libleptris/test/rng/jing-cases/014.bad.xml +1 -0
  681. data/vendor-src/libleptris/test/rng/jing-cases/014.ok.xml +1 -0
  682. data/vendor-src/libleptris/test/rng/jing-cases/014.rng +1 -0
  683. data/vendor-src/libleptris/test/rng/jing-cases/015.bad.xml +1 -0
  684. data/vendor-src/libleptris/test/rng/jing-cases/015.ok.xml +1 -0
  685. data/vendor-src/libleptris/test/rng/jing-cases/015.rng +1 -0
  686. data/vendor-src/libleptris/test/rng/jing-cases/016.bad.xml +1 -0
  687. data/vendor-src/libleptris/test/rng/jing-cases/016.ok.xml +1 -0
  688. data/vendor-src/libleptris/test/rng/jing-cases/016.rng +1 -0
  689. data/vendor-src/libleptris/test/rng/jing-cases/017.bad.xml +1 -0
  690. data/vendor-src/libleptris/test/rng/jing-cases/017.ok.xml +1 -0
  691. data/vendor-src/libleptris/test/rng/jing-cases/017.rng +1 -0
  692. data/vendor-src/libleptris/test/rng/jing-cases/018.bad.xml +1 -0
  693. data/vendor-src/libleptris/test/rng/jing-cases/018.ok.xml +1 -0
  694. data/vendor-src/libleptris/test/rng/jing-cases/018.rng +1 -0
  695. data/vendor-src/libleptris/test/rng/jing-cases/019.bad.xml +1 -0
  696. data/vendor-src/libleptris/test/rng/jing-cases/019.ok.xml +1 -0
  697. data/vendor-src/libleptris/test/rng/jing-cases/019.rng +7 -0
  698. data/vendor-src/libleptris/test/rng/jing-cases/020-book.rng +4 -0
  699. data/vendor-src/libleptris/test/rng/jing-cases/020.bad.xml +1 -0
  700. data/vendor-src/libleptris/test/rng/jing-cases/020.ok.xml +1 -0
  701. data/vendor-src/libleptris/test/rng/jing-cases/020.rng +3 -0
  702. data/vendor-src/libleptris/test/rng/jing-cases/README.md +32 -0
  703. data/vendor-src/libleptris/test/rng/jing-cases/jing-ref.json +212 -0
  704. data/vendor-src/libleptris/test/rng/jing-cases/meta.json +1 -0
  705. data/vendor-src/libleptris/test/rng/test_rng.cpp +1365 -0
  706. data/vendor-src/libleptris/test/rng/test_rng_corpus.cpp +133 -0
  707. data/vendor-src/libleptris/test/rng/test_rng_corpus_msg.cpp +233 -0
  708. data/vendor-src/libleptris/test/sax/test_iterparse.cpp +203 -0
  709. data/vendor-src/libleptris/test/sax/test_pull.cpp +214 -0
  710. data/vendor-src/libleptris/test/sax/test_pull_batch.cpp +201 -0
  711. data/vendor-src/libleptris/test/sax/test_recorder.cpp +265 -0
  712. data/vendor-src/libleptris/test/sax/test_sax.cpp +665 -0
  713. data/vendor-src/libleptris/test/sax/test_streaming.cpp +434 -0
  714. data/vendor-src/libleptris/test/sch/conformance-cases/README.md +15 -0
  715. data/vendor-src/libleptris/test/sch/conformance-cases/extends-baseuri-fixup-01.xml +28 -0
  716. data/vendor-src/libleptris/test/sch/conformance-cases/extends-recursive-01.xml +27 -0
  717. data/vendor-src/libleptris/test/sch/conformance-cases/include-baseuri-fixup-01.xml +24 -0
  718. data/vendor-src/libleptris/test/sch/conformance-cases/include-recursive-01.xml +24 -0
  719. data/vendor-src/libleptris/test/sch/conformance-cases/let-name-collision-error-01.xml +20 -0
  720. data/vendor-src/libleptris/test/sch/conformance-cases/let-name-collision-error-02.xml +20 -0
  721. data/vendor-src/libleptris/test/sch/conformance-cases/let-name-collision-error-03.xml +20 -0
  722. data/vendor-src/libleptris/test/sch/conformance-cases/let-name-collision-error-04.xml +23 -0
  723. data/vendor-src/libleptris/test/sch/conformance-cases/let-name-collision-error-05.xml +20 -0
  724. data/vendor-src/libleptris/test/sch/conformance-cases/let-name-collision-error-06.xml +25 -0
  725. data/vendor-src/libleptris/test/sch/conformance-cases/let-pattern-global-01.xml +24 -0
  726. data/vendor-src/libleptris/test/sch/conformance-cases/let-reference-undefined-01.xml +18 -0
  727. data/vendor-src/libleptris/test/sch/conformance-cases/let-reference-undefined-02.xml +18 -0
  728. data/vendor-src/libleptris/test/sch/conformance-cases/let-reference-undefined-03.xml +18 -0
  729. data/vendor-src/libleptris/test/sch/conformance-cases/let-reference-undefined-04.xml +19 -0
  730. data/vendor-src/libleptris/test/sch/conformance-cases/let-reference-undefined-05.xml +20 -0
  731. data/vendor-src/libleptris/test/sch/conformance-cases/let-reference-undefined-06.xml +20 -0
  732. data/vendor-src/libleptris/test/sch/conformance-cases/let-reference-undefined-07.xml +18 -0
  733. data/vendor-src/libleptris/test/sch/conformance-cases/let-rule-global-01.xml +20 -0
  734. data/vendor-src/libleptris/test/sch/conformance-cases/let-rule-global-02.xml +23 -0
  735. data/vendor-src/libleptris/test/sch/conformance-cases/let-scope-pattern-01.xml +25 -0
  736. data/vendor-src/libleptris/test/sch/conformance-cases/let-scope-phase-01.xml +23 -0
  737. data/vendor-src/libleptris/test/sch/conformance-cases/let-scope-rule-01.xml +23 -0
  738. data/vendor-src/libleptris/test/sch/conformance-cases/let-value-element-content-01.xml +33 -0
  739. data/vendor-src/libleptris/test/sch/conformance-cases/pattern-abstract-01.xml +22 -0
  740. data/vendor-src/libleptris/test/sch/conformance-cases/pattern-subordinate-document-01.xml +21 -0
  741. data/vendor-src/libleptris/test/sch/conformance-cases/pattern-subordinate-document-02.xml +21 -0
  742. data/vendor-src/libleptris/test/sch/conformance-cases/rule-abstract-01.xml +21 -0
  743. data/vendor-src/libleptris/test/sch/conformance-cases/rule-abstract-02.xml +23 -0
  744. data/vendor-src/libleptris/test/sch/conformance-cases/rule-context-attribute-01.xml +18 -0
  745. data/vendor-src/libleptris/test/sch/conformance-cases/rule-context-comment-01.xml +20 -0
  746. data/vendor-src/libleptris/test/sch/conformance-cases/rule-context-element-01.xml +18 -0
  747. data/vendor-src/libleptris/test/sch/conformance-cases/rule-context-pi-01.xml +20 -0
  748. data/vendor-src/libleptris/test/sch/conformance-cases/rule-context-root-01.xml +18 -0
  749. data/vendor-src/libleptris/test/sch/conformance-cases/rule-context-text-01.xml +18 -0
  750. data/vendor-src/libleptris/test/sch/conformance-cases/rule-context-variable-01.xml +22 -0
  751. data/vendor-src/libleptris/test/sch/conformance-cases/rule-context-variable-02.xml +25 -0
  752. data/vendor-src/libleptris/test/sch/conformance-cases/rule-context-variable-03.xml +22 -0
  753. data/vendor-src/libleptris/test/sch/conformance-cases/rule-order-01.xml +21 -0
  754. data/vendor-src/libleptris/test/sch/conformance-cases/schema-default-phase-01.xml +26 -0
  755. data/vendor-src/libleptris/test/sch/conformance-cases/schema-default-phase-02.xml +25 -0
  756. data/vendor-src/libleptris/test/sch/conformance-cases/svrl-diagnostic-01.xml +28 -0
  757. data/vendor-src/libleptris/test/sch/conformance-cases/svrl-diagnostic-02.xml +25 -0
  758. data/vendor-src/libleptris/test/sch/conformance-cases/svrl-name-nopath-01.xml +23 -0
  759. data/vendor-src/libleptris/test/sch/conformance-cases/svrl-name-path-01.xml +23 -0
  760. data/vendor-src/libleptris/test/sch/conformance-cases/svrl-property-01.xml +28 -0
  761. data/vendor-src/libleptris/test/sch/conformance-cases/svrl-property-copy-of.xml +26 -0
  762. data/vendor-src/libleptris/test/sch/conformance-cases/svrl-value-of-01.xml +23 -0
  763. data/vendor-src/libleptris/test/sch/conformance-cases/xslt-key-01.xml +19 -0
  764. data/vendor-src/libleptris/test/sch/conformance-cases/xslt-key-element-content-01.xml +21 -0
  765. data/vendor-src/libleptris/test/sch/test_schematron.cpp +337 -0
  766. data/vendor-src/libleptris/test/sch/test_schematron_corpus.cpp +421 -0
  767. data/vendor-src/libleptris/test/serializer/test_c14n.cpp +539 -0
  768. data/vendor-src/libleptris/test/serializer/test_serialize.cpp +890 -0
  769. data/vendor-src/libleptris/test/smoke/test_smoke.cpp +41 -0
  770. data/vendor-src/libleptris/test/xinclude/test_xinclude.cpp +903 -0
  771. data/vendor-src/libleptris/test/xpath/test_bytecode_vm.cpp +755 -0
  772. data/vendor-src/libleptris/test/xpath/test_compiled.cpp +171 -0
  773. data/vendor-src/libleptris/test/xpath/test_exslt.cpp +141 -0
  774. data/vendor-src/libleptris/test/xpath/test_xpath.cpp +2433 -0
  775. data/vendor-src/libleptris/test/xpath/test_xpath_conformance.cpp +570 -0
  776. data/vendor-src/libleptris/test/xpath/test_xslt.cpp +4245 -0
  777. data/vendor-src/libleptris/test/xquery/books.xml +1 -0
  778. data/vendor-src/libleptris/test/xquery/qt3/README.md +28 -0
  779. data/vendor-src/libleptris/test/xquery/qt3/fn/concat.xml +878 -0
  780. data/vendor-src/libleptris/test/xquery/qt3/fn/contains.xml +795 -0
  781. data/vendor-src/libleptris/test/xquery/qt3/fn/ends-with.xml +556 -0
  782. data/vendor-src/libleptris/test/xquery/qt3/fn/starts-with.xml +644 -0
  783. data/vendor-src/libleptris/test/xquery/qt3/fn/substring/concepts.xml +1 -0
  784. data/vendor-src/libleptris/test/xquery/qt3/fn/substring.xml +449 -0
  785. data/vendor-src/libleptris/test/xquery/test_qt3.cpp +324 -0
  786. data/vendor-src/libleptris/test/xquery/test_xquery.cpp +768 -0
  787. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/ATTRIBUTION.md +12 -0
  788. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/array.out +4 -0
  789. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/array.xml +7 -0
  790. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/array.xsl +26 -0
  791. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-1-.out +6 -0
  792. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-1-.xml +7 -0
  793. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-1-.xsl +21 -0
  794. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-10-.out +2 -0
  795. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-10-.xml +3 -0
  796. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-10-.xsl +10 -0
  797. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-100.out +2 -0
  798. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-100.xml +1 -0
  799. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-100.xsl +9 -0
  800. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-101.out +2 -0
  801. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-101.xml +1 -0
  802. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-101.xsl +8 -0
  803. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-102-inc.xsl +21 -0
  804. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-102.out +3 -0
  805. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-102.xml +1 -0
  806. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-102.xsl +10 -0
  807. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-103.out +2 -0
  808. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-103.xml +1 -0
  809. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-103.xsl +13 -0
  810. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-104.out +2 -0
  811. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-104.xml +1 -0
  812. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-104.xsl +10 -0
  813. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-105.out +2 -0
  814. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-105.xml +1 -0
  815. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-105.xsl +8 -0
  816. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-106.out +2 -0
  817. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-106.xml +2 -0
  818. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-106.xsl +12 -0
  819. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-107.out +8 -0
  820. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-107.xml +7 -0
  821. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-107.xsl +11 -0
  822. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-108.out +25 -0
  823. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-108.xml +4 -0
  824. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-108.xsl +21 -0
  825. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-109.out +3 -0
  826. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-109.xml +4 -0
  827. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-109.xsl +7 -0
  828. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-11-.out +1 -0
  829. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-11-.xml +4 -0
  830. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-11-.xsl +12 -0
  831. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-110.ent +1 -0
  832. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-110.out +1 -0
  833. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-110.xml +9 -0
  834. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-110.xsl +20 -0
  835. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-111.out +6 -0
  836. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-111.xml +17 -0
  837. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-111.xsl +45 -0
  838. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-112.out +2 -0
  839. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-112.xml +1 -0
  840. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-112.xsl +22 -0
  841. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-113.out +4 -0
  842. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-113.xml +7 -0
  843. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-113.xsl +15 -0
  844. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-114.out +3 -0
  845. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-114.xml +7 -0
  846. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-114.xsl +16 -0
  847. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-115.out +2 -0
  848. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-115.xml +1 -0
  849. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-115.xsl +19 -0
  850. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-116.out +2 -0
  851. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-116.xml +1 -0
  852. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-116.xsl +22 -0
  853. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-117.out +5 -0
  854. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-117.xml +10 -0
  855. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-117.xsl +59 -0
  856. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-118.out +3 -0
  857. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-118.xml +6 -0
  858. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-118.xsl +14 -0
  859. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-119.out +10 -0
  860. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-119.xml +12 -0
  861. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-119.xsl +12 -0
  862. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-12-.out +2 -0
  863. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-12-.xml +9 -0
  864. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-12-.xsl +16 -0
  865. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-120.out +8 -0
  866. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-120.xml +15 -0
  867. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-120.xsl +27 -0
  868. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-121.out +1 -0
  869. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-121.xml +1 -0
  870. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-121.xsl +8 -0
  871. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-122.out +2 -0
  872. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-122.xml +11 -0
  873. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-122.xsl +17 -0
  874. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-123.out +2 -0
  875. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-123.xml +2 -0
  876. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-123.xsl +14 -0
  877. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-124.out +2 -0
  878. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-124.xml +6 -0
  879. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-124.xsl +14 -0
  880. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-125.out +351 -0
  881. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-125.xml +118 -0
  882. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-125.xsl +99 -0
  883. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-126.out +9 -0
  884. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-126.xml +1 -0
  885. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-126.xsl +17 -0
  886. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-127.out +1 -0
  887. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-127.xml +1 -0
  888. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-127.xsl +18 -0
  889. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-128.out +5 -0
  890. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-128.xml +26 -0
  891. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-128.xsl +26 -0
  892. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-129.out +6 -0
  893. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-129.xml +6 -0
  894. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-129.xsl +10 -0
  895. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-13-.out +2 -0
  896. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-13-.xml +1 -0
  897. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-13-.xsl +10 -0
  898. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-130-imp1.imp +25 -0
  899. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-130-imp2.imp +14 -0
  900. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-130-imp3.imp +16 -0
  901. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-130-imp4.imp +22 -0
  902. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-130.doc +7 -0
  903. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-130.out +1 -0
  904. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-130.xml +4 -0
  905. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-130.xsl +22 -0
  906. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-131-imp.imp +19 -0
  907. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-131.out +2 -0
  908. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-131.xml +3 -0
  909. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-131.xsl +13 -0
  910. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-132.out +6 -0
  911. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-132.xml +6 -0
  912. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-132.xsl +13 -0
  913. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-133.out +6 -0
  914. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-133.xml +7 -0
  915. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-133.xsl +32 -0
  916. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-134.out +2 -0
  917. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-134.xml +5 -0
  918. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-134.xsl +12 -0
  919. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-135.out +2 -0
  920. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-135.xml +5 -0
  921. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-135.xsl +10 -0
  922. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-136.out +4 -0
  923. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-136.xml +4 -0
  924. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-136.xsl +8 -0
  925. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-137.imp +12 -0
  926. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-137.out +2 -0
  927. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-137.xml +1 -0
  928. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-137.xsl +8 -0
  929. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-138.out +23 -0
  930. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-138.xml +15 -0
  931. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-138.xsl +28 -0
  932. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-139.out +4 -0
  933. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-139.xml +9 -0
  934. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-139.xsl +14 -0
  935. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-14-.out +4 -0
  936. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-14-.xml +7 -0
  937. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-14-.xsl +23 -0
  938. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-140.out +4 -0
  939. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-140.xml +6 -0
  940. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-140.xsl +32 -0
  941. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-141.out +46 -0
  942. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-141.xml +9 -0
  943. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-141.xsl +25 -0
  944. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-142.out +35 -0
  945. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-142.xml +65 -0
  946. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-142.xsl +85 -0
  947. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-143.out +2 -0
  948. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-143.xml +1 -0
  949. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-143.xsl +10 -0
  950. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-144.out +2 -0
  951. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-144.xml +1 -0
  952. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-144.xsl +10 -0
  953. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-145.err +5 -0
  954. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-145.xml +10 -0
  955. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-145.xsl +10 -0
  956. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-147-1.imp +11 -0
  957. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-147-2.imp +11 -0
  958. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-147-3.imp +57 -0
  959. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-147-4.imp +15 -0
  960. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-147-5.imp +27 -0
  961. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-147-6.imp +31 -0
  962. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-147.out +17 -0
  963. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-147.xml +21 -0
  964. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-147.xsl +29 -0
  965. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-148.out +2 -0
  966. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-148.xml +1 -0
  967. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-148.xsl +13 -0
  968. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-149.out +2 -0
  969. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-149.xml +1 -0
  970. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-149.xsl +11 -0
  971. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-15-.out +5 -0
  972. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-15-.xml +5 -0
  973. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-15-.xsl +15 -0
  974. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-150.out +2 -0
  975. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-150.xml +1 -0
  976. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-150.xsl +9 -0
  977. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-151.xml +1 -0
  978. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-151.xsl +15 -0
  979. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-152.out +12 -0
  980. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-152.xml +1 -0
  981. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-152.xsl +30 -0
  982. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-153.doc +4 -0
  983. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-153.out +2 -0
  984. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-153.xml +9 -0
  985. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-153.xsl +19 -0
  986. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-154.xml +1 -0
  987. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-154.xsl +4 -0
  988. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-155.out +3 -0
  989. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-155.xml +5 -0
  990. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-155.xsl +10 -0
  991. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-156.err +2 -0
  992. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-156.imp1.imp +16 -0
  993. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-156.imp2.imp +10 -0
  994. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-156.xml +1 -0
  995. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-156.xsl +12 -0
  996. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-157.err +3 -0
  997. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-157.out +9 -0
  998. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-157.xml +6 -0
  999. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-157.xsl +22 -0
  1000. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-158.doc +3 -0
  1001. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-158.out +4 -0
  1002. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-158.xml +2 -0
  1003. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-158.xsl +19 -0
  1004. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-159.out +8 -0
  1005. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-159.xml +1 -0
  1006. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-159.xsl +17 -0
  1007. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-16-.out +14 -0
  1008. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-16-.xml +17 -0
  1009. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-16-.xsl +13 -0
  1010. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-160.out +7 -0
  1011. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-160.xml +8 -0
  1012. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-160.xsl +14 -0
  1013. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-161.out +6 -0
  1014. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-161.xml +5 -0
  1015. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-161.xsl +18 -0
  1016. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-163.out +2 -0
  1017. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-163.xml +5 -0
  1018. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-163.xsl +6 -0
  1019. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-164.out +4 -0
  1020. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-164.xml +4 -0
  1021. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-164.xsl +13 -0
  1022. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-165.err +6 -0
  1023. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-165.xml +10 -0
  1024. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-165.xsl +9 -0
  1025. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-166.out +15256 -0
  1026. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-166.xml +15255 -0
  1027. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-166.xsl +131 -0
  1028. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-167.out +1 -0
  1029. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-167.xml +1 -0
  1030. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-167.xsl +20 -0
  1031. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-168.out +2 -0
  1032. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-168.xml +9 -0
  1033. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-168.xsl +9 -0
  1034. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-169.imp +5 -0
  1035. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-169.out +2 -0
  1036. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-169.xml +1 -0
  1037. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-169.xsl +11 -0
  1038. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-17-.out +2 -0
  1039. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-17-.xml +1 -0
  1040. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-17-.xsl +7 -0
  1041. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-170.out +4 -0
  1042. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-170.xml +3 -0
  1043. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-170.xsl +6 -0
  1044. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-171.out +2 -0
  1045. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-171.xml +4 -0
  1046. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-171.xsl +7 -0
  1047. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-172.out +6 -0
  1048. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-172.xml +6 -0
  1049. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-172.xsl +22 -0
  1050. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-173.out +1 -0
  1051. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-173.xml +1 -0
  1052. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-173.xsl +11 -0
  1053. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-174.err +1 -0
  1054. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-174.xml +1 -0
  1055. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-174.xsl +18 -0
  1056. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-175.err +2 -0
  1057. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-175.out +8 -0
  1058. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-175.xml +1 -0
  1059. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-175.xsl +33 -0
  1060. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-176.out +2 -0
  1061. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-176.xml +1 -0
  1062. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-176.xsl +11 -0
  1063. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-177.out +2 -0
  1064. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-177.xml +1 -0
  1065. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-177.xsl +7 -0
  1066. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-178.out +2 -0
  1067. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-178.xml +1 -0
  1068. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-178.xsl +18 -0
  1069. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-179.out +9 -0
  1070. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-179.xml +1 -0
  1071. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-179.xsl +24 -0
  1072. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-18-.out +2 -0
  1073. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-18-.xml +3 -0
  1074. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-18-.xsl +17 -0
  1075. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-180.err +4 -0
  1076. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-180.xml +2 -0
  1077. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-180.xsl +8 -0
  1078. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-181.out +5 -0
  1079. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-181.xml +4 -0
  1080. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-181.xsl +13 -0
  1081. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-182.out +2 -0
  1082. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-182.xml +4 -0
  1083. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-182.xsl +21 -0
  1084. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-183.out +2 -0
  1085. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-183.xml +5 -0
  1086. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-183.xsl +9 -0
  1087. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-184.err +6 -0
  1088. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-184.xml +1 -0
  1089. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-184.xsl +8 -0
  1090. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-186.out +5 -0
  1091. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-186.xml +4 -0
  1092. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-186.xsl +7 -0
  1093. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-187.err +6 -0
  1094. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-187.out +14 -0
  1095. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-187.xml +1 -0
  1096. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-187.xsl +42 -0
  1097. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-188-imp.xsl +8 -0
  1098. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-188.out +4 -0
  1099. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-188.xml +1 -0
  1100. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-188.xsl +20 -0
  1101. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-189.out +5 -0
  1102. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-189.xml +1 -0
  1103. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-189.xsl +25 -0
  1104. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-19-.out +2 -0
  1105. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-19-.xml +3 -0
  1106. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-19-.xsl +17 -0
  1107. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-190-imp.xsl +10 -0
  1108. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-190.out +4 -0
  1109. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-190.xml +1 -0
  1110. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-190.xsl +16 -0
  1111. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-191-imp.xsl +8 -0
  1112. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-191.err +2 -0
  1113. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-191.xml +1 -0
  1114. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-191.xsl +9 -0
  1115. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-192.out +1 -0
  1116. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-192.xml +1 -0
  1117. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-192.xsl +33 -0
  1118. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-193.out +2 -0
  1119. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-193.xml +1 -0
  1120. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-193.xsl +11 -0
  1121. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-194.err +9 -0
  1122. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-194.xml +1 -0
  1123. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-194.xsl +8 -0
  1124. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-195.out +8 -0
  1125. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-195.xml +9 -0
  1126. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-195.xsl +19 -0
  1127. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-196.out +7 -0
  1128. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-196.xml +9 -0
  1129. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-196.xsl +19 -0
  1130. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-197.out +6 -0
  1131. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-197.xml +6 -0
  1132. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-197.xsl +16 -0
  1133. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-198.out +2 -0
  1134. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-198.xml +2 -0
  1135. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-198.xsl +17 -0
  1136. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-199.out +6 -0
  1137. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-199.xml +6 -0
  1138. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-199.xsl +18 -0
  1139. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-2-.out +8 -0
  1140. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-2-.xml +12 -0
  1141. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-2-.xsl +16 -0
  1142. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-20-.out +4 -0
  1143. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-20-.xml +7 -0
  1144. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-20-.xsl +22 -0
  1145. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-200.out +2 -0
  1146. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-200.xml +1 -0
  1147. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-200.xsl +5 -0
  1148. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-201.err +6 -0
  1149. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-201.xml +1 -0
  1150. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-201.xsl +16 -0
  1151. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-202.err +2 -0
  1152. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-202.xml +1 -0
  1153. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-202.xsl +5 -0
  1154. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-203.err +1 -0
  1155. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-203.xml +1 -0
  1156. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-203.xsl +5 -0
  1157. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-204.err +2 -0
  1158. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-204.xml +1 -0
  1159. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-204.xsl +6 -0
  1160. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-205.out +2 -0
  1161. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-205.xml +1 -0
  1162. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-205.xsl +10 -0
  1163. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-206.out +2 -0
  1164. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-206.xml +1 -0
  1165. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-206.xsl +9 -0
  1166. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-207.out +2 -0
  1167. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-207.xml +1 -0
  1168. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-207.xsl +61 -0
  1169. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-208.err +6 -0
  1170. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-208.xml +8 -0
  1171. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-208.xsl +8 -0
  1172. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-209.out +2 -0
  1173. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-209.xml +1 -0
  1174. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-209.xsl +21 -0
  1175. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-21-.out +2 -0
  1176. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-21-.xml +8 -0
  1177. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-21-.xsl +7 -0
  1178. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-210.out +2 -0
  1179. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-210.xml +1 -0
  1180. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-210.xsl +20 -0
  1181. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-211.out +2 -0
  1182. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-211.xml +1 -0
  1183. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-211.xsl +26 -0
  1184. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-212.out +1 -0
  1185. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-212.xml +1 -0
  1186. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-212.xsl +25 -0
  1187. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-213.out +1 -0
  1188. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-213.xml +1 -0
  1189. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-213.xsl +26 -0
  1190. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-214.out +6 -0
  1191. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-214.xml +6 -0
  1192. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-214.xsl +25 -0
  1193. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-215.err +5 -0
  1194. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-215.xml +1 -0
  1195. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-215.xsl +6 -0
  1196. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-216.out +2 -0
  1197. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-216.xml +1 -0
  1198. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-216.xsl +11 -0
  1199. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-217.out +2 -0
  1200. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-217.xml +1 -0
  1201. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-217.xsl +24 -0
  1202. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-218.out +2 -0
  1203. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-218.xml +1 -0
  1204. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-218.xsl +8 -0
  1205. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-219.out +68 -0
  1206. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-219.xml +22 -0
  1207. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-219.xsl +17 -0
  1208. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-22-.out +12 -0
  1209. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-22-.xml +18 -0
  1210. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-22-.xsl +19 -0
  1211. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-220.out +2 -0
  1212. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-220.xml +1 -0
  1213. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-220.xsl +15 -0
  1214. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-221.out +2 -0
  1215. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-221.xml +9 -0
  1216. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-221.xsl +15 -0
  1217. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-222.out +2 -0
  1218. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-222.xml +1 -0
  1219. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-222.xsl +6 -0
  1220. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-223-imp.xsl +12 -0
  1221. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-223-inc.xsl +12 -0
  1222. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-223.out +1 -0
  1223. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-223.xml +1 -0
  1224. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-223.xsl +17 -0
  1225. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-224.out +9 -0
  1226. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-224.xml +8 -0
  1227. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-224.xsl +28 -0
  1228. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-225.out +2 -0
  1229. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-225.xml +1 -0
  1230. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-225.xsl +32 -0
  1231. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-23-.out +15 -0
  1232. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-23-.xml +21 -0
  1233. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-23-.xsl +20 -0
  1234. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-24-.out +27 -0
  1235. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-24-.xml +2419 -0
  1236. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-24-.xsl +22 -0
  1237. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-25-.out +3 -0
  1238. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-25-.xml +1 -0
  1239. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-25-.xsl +10 -0
  1240. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-26-.out +2 -0
  1241. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-26-.xml +1 -0
  1242. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-26-.xsl +9 -0
  1243. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-27-.out +2 -0
  1244. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-27-.xml +1 -0
  1245. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-27-.xsl +14 -0
  1246. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-28-.out +1 -0
  1247. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-28-.xml +1 -0
  1248. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-28-.xsl +9 -0
  1249. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-29-.ent +7 -0
  1250. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-29-.out +10 -0
  1251. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-29-.xml +5 -0
  1252. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-29-.xsl +16 -0
  1253. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-3-.out +2 -0
  1254. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-3-.xml +1 -0
  1255. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-3-.xsl +13 -0
  1256. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-30-.out +2 -0
  1257. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-30-.xml +1 -0
  1258. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-30-.xsl +7 -0
  1259. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-31-.out +3 -0
  1260. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-31-.xml +4 -0
  1261. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-31-.xsl +10 -0
  1262. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-32-.out +2 -0
  1263. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-32-.xml +1 -0
  1264. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-32-.xsl +17 -0
  1265. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-33-.out +16 -0
  1266. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-33-.xml +14 -0
  1267. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-33-.xsl +29 -0
  1268. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-35-.out +2 -0
  1269. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-35-.xml +1 -0
  1270. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-35-.xsl +10 -0
  1271. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-36-.out +4 -0
  1272. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-36-.xml +5 -0
  1273. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-36-.xsl +8 -0
  1274. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-36-inc.xsl +16 -0
  1275. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-37-.out +4 -0
  1276. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-37-.xml +5 -0
  1277. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-37-.xsl +8 -0
  1278. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-37-inc.xsl +15 -0
  1279. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-38-.out +2 -0
  1280. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-38-.xml +17 -0
  1281. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-38-.xsl +17 -0
  1282. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-39-.out +3 -0
  1283. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-39-.xml +3 -0
  1284. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-39-.xsl +34 -0
  1285. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-4-.out +6 -0
  1286. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-4-.xml +38 -0
  1287. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-4-.xsl +12 -0
  1288. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-40-.out +2 -0
  1289. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-40-.xml +1 -0
  1290. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-40-.xsl +16 -0
  1291. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-41-.out +2 -0
  1292. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-41-.xml +1 -0
  1293. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-41-.xsl +19 -0
  1294. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-42-.out +2 -0
  1295. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-42-.xml +1 -0
  1296. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-42-.xsl +16 -0
  1297. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-43-.out +2 -0
  1298. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-43-.xml +1 -0
  1299. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-43-.xsl +19 -0
  1300. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-44-.out +2 -0
  1301. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-44-.xml +1 -0
  1302. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-44-.xsl +19 -0
  1303. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-45-.out +2 -0
  1304. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-45-.xml +1 -0
  1305. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-45-.xsl +27 -0
  1306. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-46-.out +2 -0
  1307. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-46-.xml +1 -0
  1308. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-46-.xsl +16 -0
  1309. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-47-.out +2 -0
  1310. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-47-.xml +1 -0
  1311. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-47-.xsl +18 -0
  1312. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-48-.out +2 -0
  1313. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-48-.xml +1 -0
  1314. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-48-.xsl +24 -0
  1315. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-49-.out +2 -0
  1316. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-49-.xml +1 -0
  1317. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-49-.xsl +15 -0
  1318. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-5-.out +954 -0
  1319. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-5-.xml +475 -0
  1320. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-5-.xsl +158 -0
  1321. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-50-.out +7 -0
  1322. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-50-.xml +3 -0
  1323. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-50-.xsl +14 -0
  1324. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-52.out +3 -0
  1325. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-52.xml +12 -0
  1326. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-52.xsl +16 -0
  1327. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-53.out +1 -0
  1328. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-53.xml +6 -0
  1329. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-53.xsl +11 -0
  1330. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-54.out +2 -0
  1331. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-54.xml +2 -0
  1332. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-54.xsl +22 -0
  1333. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-55.out +2 -0
  1334. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-55.xml +3 -0
  1335. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-55.xsl +9 -0
  1336. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-56.out +3 -0
  1337. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-56.xml +1 -0
  1338. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-56.xsl +28 -0
  1339. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-57.out +2 -0
  1340. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-57.xml +8 -0
  1341. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-57.xsl +21 -0
  1342. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-58.xsl +274 -0
  1343. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-59.out +2 -0
  1344. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-59.xml +1 -0
  1345. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-59.xsl +9 -0
  1346. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-6-.out +4 -0
  1347. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-6-.xml +6 -0
  1348. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-6-.xsl +32 -0
  1349. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-60.err +2 -0
  1350. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-60.out +2 -0
  1351. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-60.xml +1 -0
  1352. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-60.xsl +15 -0
  1353. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-61.out +10 -0
  1354. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-61.xml +1 -0
  1355. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-61.xsl +14 -0
  1356. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-62-inc.xsl +4 -0
  1357. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-62.out +2 -0
  1358. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-62.xml +1 -0
  1359. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-62.xsl +8 -0
  1360. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-63.out +22 -0
  1361. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-63.xml +13 -0
  1362. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-63.xsl +13 -0
  1363. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-64.out +2 -0
  1364. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-64.xml +1 -0
  1365. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-64.xsl +8 -0
  1366. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-65.ent +7 -0
  1367. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-65.out +8 -0
  1368. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-65.xml +5 -0
  1369. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-65.xsl +26 -0
  1370. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-66.out +2 -0
  1371. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-66.xml +8 -0
  1372. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-66.xsl +12 -0
  1373. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-68.out +1 -0
  1374. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-68.xml +1 -0
  1375. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-68.xsl +8 -0
  1376. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-69.out +2 -0
  1377. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-69.xml +2 -0
  1378. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-69.xsl +12 -0
  1379. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-7-.out +2 -0
  1380. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-7-.xml +3 -0
  1381. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-7-.xsl +11 -0
  1382. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-70.out +9 -0
  1383. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-70.xml +10 -0
  1384. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-70.xsl +13 -0
  1385. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-71.out +2 -0
  1386. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-71.xml +1 -0
  1387. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-71.xsl +17 -0
  1388. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-72.out +6 -0
  1389. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-72.xml +3 -0
  1390. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-72.xsl +31 -0
  1391. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-73.out +3 -0
  1392. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-73.xml +5 -0
  1393. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-73.xsl +17 -0
  1394. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-74.out +2 -0
  1395. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-74.xml +3 -0
  1396. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-74.xsl +12 -0
  1397. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-75.out +6 -0
  1398. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-75.xml +1 -0
  1399. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-75.xsl +9 -0
  1400. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-76.out +4 -0
  1401. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-76.xml +4 -0
  1402. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-76.xsl +16 -0
  1403. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-77.out +5 -0
  1404. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-77.xml +4 -0
  1405. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-77.xsl +18 -0
  1406. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-78.out +3 -0
  1407. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-78.xml +8 -0
  1408. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-78.xsl +17 -0
  1409. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-79.out +5 -0
  1410. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-79.xml +4 -0
  1411. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-79.xsl +4 -0
  1412. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-8-.out +3 -0
  1413. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-8-.xml +5 -0
  1414. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-8-.xsl +13 -0
  1415. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-80.out +2 -0
  1416. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-80.xml +6 -0
  1417. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-80.xsl +29 -0
  1418. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-81.out +4 -0
  1419. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-81.xml +12 -0
  1420. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-81.xsl +18 -0
  1421. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-82.out +5 -0
  1422. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-82.xml +4 -0
  1423. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-82.xsl +12 -0
  1424. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-83.out +1 -0
  1425. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-83.xml +1 -0
  1426. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-83.xsl +14 -0
  1427. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-84.out +15 -0
  1428. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-84.xml +22 -0
  1429. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-84.xsl +14 -0
  1430. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-86.out +6 -0
  1431. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-86.xml +7 -0
  1432. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-86.xsl +7 -0
  1433. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-87.out +5 -0
  1434. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-87.xml +6 -0
  1435. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-87.xsl +16 -0
  1436. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-88.out +2 -0
  1437. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-88.xml +1 -0
  1438. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-88.xsl +6 -0
  1439. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-89.out +12 -0
  1440. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-89.xml +13 -0
  1441. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-89.xsl +105 -0
  1442. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-9-.out +2 -0
  1443. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-9-.xml +3 -0
  1444. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-9-.xsl +10 -0
  1445. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-90.out +13 -0
  1446. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-90.xml +15 -0
  1447. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-90.xsl +35 -0
  1448. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-91.out +3 -0
  1449. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-91.xml +4 -0
  1450. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-91.xsl +8 -0
  1451. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-92.out +15 -0
  1452. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-92.xml +19 -0
  1453. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-92.xsl +19 -0
  1454. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-93-inc.xsl +12 -0
  1455. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-93.out +3 -0
  1456. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-93.xml +1 -0
  1457. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-93.xsl +7 -0
  1458. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-94.out +2 -0
  1459. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-94.xml +9 -0
  1460. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-94.xsl +35 -0
  1461. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-95.out +4 -0
  1462. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-95.xml +5 -0
  1463. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-95.xsl +22 -0
  1464. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-96.out +5 -0
  1465. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-96.xml +5 -0
  1466. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-96.xsl +10 -0
  1467. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-97.out +9 -0
  1468. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-97.xml +16 -0
  1469. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-97.xsl +32 -0
  1470. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-98.out +6 -0
  1471. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-98.xml +10 -0
  1472. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-98.xsl +31 -0
  1473. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-99.out +2 -0
  1474. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-99.xml +1 -0
  1475. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/bug-99.xsl +16 -0
  1476. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/character.out +2 -0
  1477. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/character.xml +23 -0
  1478. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/character.xsl +16 -0
  1479. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/date_add.out +9 -0
  1480. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/date_add.xml +1 -0
  1481. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/date_add.xsl +16 -0
  1482. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/doc.dtd +7 -0
  1483. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/doc.out +16 -0
  1484. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/doc.xml +17 -0
  1485. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/doc.xsl +62 -0
  1486. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/inner.xsl +12 -0
  1487. data/vendor-src/libleptris/test/xslt/libxslt_suite_general/items.xml +34 -0
  1488. data/vendor-src/libleptris/test/xslt/open_cases.txt +0 -0
  1489. data/vendor-src/libleptris/test/xslt/test_libxslt_suite.cpp +398 -0
  1490. data/vendor-src/libleptris/vcpkg.json +29 -0
  1491. data/vendor-src/utf8proc/CMakeLists.txt +133 -0
  1492. data/vendor-src/utf8proc/Doxyfile +2765 -0
  1493. data/vendor-src/utf8proc/LICENSE.md +93 -0
  1494. data/vendor-src/utf8proc/MANIFEST +9 -0
  1495. data/vendor-src/utf8proc/Makefile +203 -0
  1496. data/vendor-src/utf8proc/NEWS.md +479 -0
  1497. data/vendor-src/utf8proc/README.md +143 -0
  1498. data/vendor-src/utf8proc/appveyor.yml +46 -0
  1499. data/vendor-src/utf8proc/bench/Makefile +40 -0
  1500. data/vendor-src/utf8proc/bench/bench.c +56 -0
  1501. data/vendor-src/utf8proc/bench/icu.c +61 -0
  1502. data/vendor-src/utf8proc/bench/unistring.c +60 -0
  1503. data/vendor-src/utf8proc/bench/util.c +39 -0
  1504. data/vendor-src/utf8proc/bench/util.h +22 -0
  1505. data/vendor-src/utf8proc/cmake/utf8proc-config.cmake.in +5 -0
  1506. data/vendor-src/utf8proc/data/Makefile +62 -0
  1507. data/vendor-src/utf8proc/data/Manifest.toml +16 -0
  1508. data/vendor-src/utf8proc/data/Project.toml +2 -0
  1509. data/vendor-src/utf8proc/data/data_generator.jl +498 -0
  1510. data/vendor-src/utf8proc/libutf8proc.pc.cmakein +10 -0
  1511. data/vendor-src/utf8proc/libutf8proc.pc.in +10 -0
  1512. data/vendor-src/utf8proc/lump.md +27 -0
  1513. data/vendor-src/utf8proc/test/app/CMakeLists.txt +6 -0
  1514. data/vendor-src/utf8proc/test/app/app.c +9 -0
  1515. data/vendor-src/utf8proc/test/case.c +76 -0
  1516. data/vendor-src/utf8proc/test/charwidth.c +91 -0
  1517. data/vendor-src/utf8proc/test/custom.c +28 -0
  1518. data/vendor-src/utf8proc/test/fuzz_main.c +54 -0
  1519. data/vendor-src/utf8proc/test/fuzzer.c +97 -0
  1520. data/vendor-src/utf8proc/test/graphemetest.c +136 -0
  1521. data/vendor-src/utf8proc/test/iscase.c +63 -0
  1522. data/vendor-src/utf8proc/test/iterate.c +168 -0
  1523. data/vendor-src/utf8proc/test/maxdecomposition.c +22 -0
  1524. data/vendor-src/utf8proc/test/misc.c +51 -0
  1525. data/vendor-src/utf8proc/test/normtest.c +64 -0
  1526. data/vendor-src/utf8proc/test/ossfuzz.sh +13 -0
  1527. data/vendor-src/utf8proc/test/printproperty.c +68 -0
  1528. data/vendor-src/utf8proc/test/tests.c +60 -0
  1529. data/vendor-src/utf8proc/test/tests.h +27 -0
  1530. data/vendor-src/utf8proc/test/valid.c +41 -0
  1531. data/vendor-src/utf8proc/utf8proc.c +834 -0
  1532. data/vendor-src/utf8proc/utf8proc.h +794 -0
  1533. data/vendor-src/utf8proc/utf8proc_data.c +17141 -0
  1534. data/vendor-src/utf8proc/utils.cmake +20 -0
  1535. metadata +1528 -2
@@ -0,0 +1,2544 @@
1
+ /* functions.c - XPath 1.0 function library implementation
2
+ * Copyright (c) 2024, Ribose Inc.
3
+ *
4
+ * Pure C implementation of all 27 XPath 1.0 standard functions.
5
+ * Converted from Ruby C extension to standalone C library.
6
+ */
7
+
8
+ #include "functions.h"
9
+ #include "evaluator.h"
10
+ #include "../include/leptris.h"
11
+ #include "../dom/element.h"
12
+ #include "../dom/pi.h"
13
+ #include "../dom/text.h"
14
+ #include "../dom/cdata.h"
15
+ #include "../dom/comment.h"
16
+ #include "../common/port.h"
17
+ #include "../dtd/model.h" /* ttdtd_lookup_attribute (id() §4.1) */
18
+ #include <string.h>
19
+ #include <stdlib.h>
20
+ #include <math.h>
21
+ #include <ctype.h>
22
+ #include <stdio.h>
23
+ #include <float.h>
24
+ #include <errno.h>
25
+
26
+ /* ============================================================================
27
+ * Forward Declarations
28
+ * ============================================================================ */
29
+
30
+ /* External evaluator function */
31
+ extern struct leptris_xpath_result* xpath_evaluate(XPathContext* context,
32
+ XPathASTNode* ast);
33
+
34
+ /* Helper functions.
35
+ * get_node_text is implemented in evaluator_types.c; the extern
36
+ * decl appears in the type-conversion block below. */
37
+ static char* result_to_string(struct leptris_xpath_result* result);
38
+ static int result_to_boolean(struct leptris_xpath_result* result);
39
+ static double result_to_number(struct leptris_xpath_result* result);
40
+
41
+ /* XPath round() per spec section 4.4: nearest integer, ties toward
42
+ * positive infinity. Used by substring() and exposed as the public
43
+ * round() function. NaN/Inf pass through unchanged. */
44
+ static double xpath_round_half_up(double num) {
45
+ if (isnan(num) || isinf(num) || num == 0.0) return num;
46
+ double frac = num - floor(num);
47
+ if (frac == 0.5) return ceil(num); /* tie -> +Inf */
48
+ return floor(num + 0.5);
49
+ }
50
+
51
+ /* ============================================================================
52
+ * Standard function registry singleton (TODO 113 perf optimization)
53
+ *
54
+ * The standard XPath 1.0 function set is fixed (27 functions). Every
55
+ * leptris_xpath_eval call previously allocated a new registry, registered
56
+ * all 27 functions (each with a heap-allocated name string), then freed
57
+ * them. That's ~30 heap operations per query just for function setup.
58
+ *
59
+ * The singleton is initialized on first call and never freed. Reads
60
+ * are concurrent-safe (no mutating operations after init). The
61
+ * registry is internal-only — never modified at runtime.
62
+ * ============================================================================ */
63
+
64
+ static XPathFunctionRegistry* g_standard_registry = NULL;
65
+
66
+ const XPathFunctionRegistry* xpath_function_registry_get_standard_impl(void) {
67
+ return g_standard_registry;
68
+ }
69
+
70
+ /* Lazily initialize the global registry on first call. After init,
71
+ * the registry is read-only.
72
+ *
73
+ * TODO.concurrency/08: built under a mutex — the old unlocked
74
+ * lazy-init had a double-build race on the first concurrent eval.
75
+ * (A constructor-time build was tried and reverted: it allocated
76
+ * the registry in every process that links libleptris, even ones
77
+ * that never evaluate XPath, and valgrind flagged it in binaries
78
+ * where LTO made the global unreachable.) All reads go through the
79
+ * same mutex — no unlocked fast path, so it is also race-clean
80
+ * under ThreadSanitizer. */
81
+ static leptris_mutex_t g_standard_registry_mutex = LEPTRIS_MUTEX_INIT;
82
+
83
+ XPathFunctionRegistry* xpath_function_registry_get_standard(void) {
84
+ LEPTRIS_MUTEX_LOCK(&g_standard_registry_mutex);
85
+ if (!g_standard_registry) {
86
+ XPathFunctionRegistry* r = xpath_function_registry_new();
87
+ if (r) xpath_function_registry_init_standard(r);
88
+ g_standard_registry = r;
89
+ }
90
+ LEPTRIS_MUTEX_UNLOCK(&g_standard_registry_mutex);
91
+ return g_standard_registry;
92
+ }
93
+
94
+ /* ============================================================================
95
+ * Function Registry Implementation
96
+ * ============================================================================ */
97
+
98
+ XPathFunctionRegistry* xpath_function_registry_new(void) {
99
+ XPathFunctionRegistry* registry = LEPTRIS_ALLOC(XPathFunctionRegistry);
100
+ if (!registry) return NULL;
101
+
102
+ registry->functions = NULL;
103
+ registry->count = 0;
104
+ registry->capacity = 0;
105
+
106
+ return registry;
107
+ }
108
+
109
+ void xpath_function_registry_free(XPathFunctionRegistry* registry) {
110
+ if (!registry) return;
111
+
112
+ if (registry->functions) {
113
+ LEPTRIS_FREE(registry->functions);
114
+ }
115
+ LEPTRIS_FREE(registry);
116
+ }
117
+
118
+ void xpath_function_registry_register_ud(
119
+ XPathFunctionRegistry* registry,
120
+ const char* name,
121
+ XPathFunctionHandler handler,
122
+ int min_args,
123
+ int max_args,
124
+ void* user_data
125
+ ) {
126
+ if (!registry || !name || !handler) return;
127
+ for (size_t i = 0; i < registry->count; i++) {
128
+ if (strcmp(registry->functions[i].name, name) == 0) {
129
+ registry->functions[i].handler = handler;
130
+ registry->functions[i].min_args = min_args;
131
+ registry->functions[i].max_args = max_args;
132
+ registry->functions[i].user_data = user_data;
133
+ return;
134
+ }
135
+ }
136
+ xpath_function_registry_register(registry, name, handler,
137
+ min_args, max_args);
138
+ if (registry->count > 0)
139
+ registry->functions[registry->count - 1].user_data = user_data;
140
+ }
141
+
142
+ void xpath_function_registry_register(
143
+ XPathFunctionRegistry* registry,
144
+ const char* name,
145
+ XPathFunctionHandler handler,
146
+ int min_args,
147
+ int max_args
148
+ ) {
149
+ if (!registry || !name || !handler) return;
150
+
151
+ /* Resize if needed */
152
+ if (registry->count >= registry->capacity) {
153
+ size_t new_capacity = registry->capacity == 0 ? 8 : registry->capacity * 2;
154
+ XPathFunctionDef* new_functions = LEPTRIS_REALLOC_N(
155
+ registry->functions,
156
+ XPathFunctionDef,
157
+ new_capacity
158
+ );
159
+ if (!new_functions) return;
160
+ registry->functions = new_functions;
161
+ registry->capacity = new_capacity;
162
+ }
163
+
164
+ /* Last registration WINS: the standard library loads first,
165
+ * then ext31 families, then the XSLT bridge / EXSLT packs —
166
+ * each layer overrides same-named core entries (the bridge's
167
+ * format-number must own the name inside transforms). */
168
+ for (size_t i = 0; i < registry->count; i++) {
169
+ if (strcmp(registry->functions[i].name, name) == 0) {
170
+ registry->functions[i].handler = handler;
171
+ registry->functions[i].min_args = min_args;
172
+ registry->functions[i].max_args = max_args;
173
+ registry->functions[i].user_data = NULL;
174
+ return;
175
+ }
176
+ }
177
+
178
+ /* Add function. user_data must be written explicitly: the
179
+ * array is realloc'd, so a skipped field carries heap garbage
180
+ * until someone patches it (#1111). */
181
+ registry->functions[registry->count].name = name;
182
+ registry->functions[registry->count].handler = handler;
183
+ registry->functions[registry->count].min_args = min_args;
184
+ registry->functions[registry->count].max_args = max_args;
185
+ registry->functions[registry->count].user_data = NULL;
186
+ registry->count++;
187
+ }
188
+
189
+ XPathFunctionHandler xpath_function_registry_lookup(
190
+ XPathFunctionRegistry* registry,
191
+ const char* name
192
+ ) {
193
+ if (!registry || !name) return NULL;
194
+
195
+ for (size_t i = 0; i < registry->count; i++) {
196
+ if (strcmp(registry->functions[i].name, name) == 0) {
197
+ return registry->functions[i].handler;
198
+ }
199
+ }
200
+
201
+ return NULL;
202
+ }
203
+
204
+ XPathFunctionDef* xpath_function_registry_get(
205
+ XPathFunctionRegistry* registry,
206
+ const char* name
207
+ ) {
208
+ if (!registry || !name) return NULL;
209
+
210
+ for (size_t i = 0; i < registry->count; i++) {
211
+ if (strcmp(registry->functions[i].name, name) == 0) {
212
+ return &registry->functions[i];
213
+ }
214
+ }
215
+
216
+ return NULL;
217
+ }
218
+
219
+ /* ============================================================================
220
+ * Helper Functions for Type Conversion
221
+ * ============================================================================ */
222
+
223
+ /* Get text content from typed node (handles elements and attributes)
224
+ * This is declared in evaluator_internal.h and implemented in evaluator_types.c
225
+ */
226
+ extern char* get_node_text(void* node);
227
+ extern char* xpath_number_to_string(double number);
228
+ extern char* xpath_int_to_string(long long v);
229
+
230
+ /* Backward compatibility wrapper */
231
+ static char* get_element_text(LeptrisElement element) {
232
+ return get_node_text((void*)element);
233
+ }
234
+
235
+ /* Convert XPath result to string according to XPath 1.0 spec */
236
+ static char* result_to_string(struct leptris_xpath_result* result) {
237
+ if (!result) return leptris_strdup("");
238
+
239
+ switch (result->type) {
240
+ case XPATH_RESULT_STRING:
241
+ return result->value.string_value ?
242
+ leptris_strdup(result->value.string_value) : leptris_strdup("");
243
+
244
+ case XPATH_RESULT_NUMBER: {
245
+ if (result->is_int) return xpath_int_to_string(result->int_value);
246
+ return xpath_number_to_string(result->value.number_value);
247
+ }
248
+
249
+ case XPATH_RESULT_BOOLEAN:
250
+ return leptris_strdup(result->value.boolean_value ? "true" : "false");
251
+
252
+ case XPATH_RESULT_NODESET: {
253
+ /* String value of first node in document order */
254
+ XPathNodeSet* nodeset = result->value.nodeset_value;
255
+ if (!nodeset || xpath_nodeset_count(nodeset) == 0) {
256
+ return leptris_strdup("");
257
+ }
258
+ void* first_node = xpath_nodeset_get(nodeset, 0);
259
+ return get_node_text(first_node);
260
+ }
261
+
262
+ default:
263
+ return leptris_strdup("");
264
+ }
265
+ }
266
+
267
+ /* Convert XPath result to boolean according to XPath 1.0 spec */
268
+ static int result_to_boolean(struct leptris_xpath_result* result) {
269
+ if (!result) return 0;
270
+
271
+ switch (result->type) {
272
+ case XPATH_RESULT_BOOLEAN:
273
+ return result->value.boolean_value;
274
+ case XPATH_RESULT_NUMBER:
275
+ /* Number is false if 0 or NaN */
276
+ return result->value.number_value != 0.0 &&
277
+ !isnan(result->value.number_value);
278
+ case XPATH_RESULT_STRING:
279
+ /* String is false if empty */
280
+ return result->value.string_value &&
281
+ result->value.string_value[0] != '\0';
282
+ case XPATH_RESULT_NODESET:
283
+ /* Nodeset is false if empty */
284
+ return xpath_nodeset_count(result->value.nodeset_value) > 0;
285
+ default:
286
+ return 0;
287
+ }
288
+ }
289
+
290
+ /* Convert XPath result to number according to XPath 1.0 spec */
291
+ static double result_to_number(struct leptris_xpath_result* result) {
292
+ if (!result) return NAN;
293
+
294
+ switch (result->type) {
295
+ case XPATH_RESULT_NUMBER:
296
+ return result->value.number_value;
297
+
298
+ case XPATH_RESULT_BOOLEAN:
299
+ return result->value.boolean_value ? 1.0 : 0.0;
300
+
301
+ case XPATH_RESULT_STRING: {
302
+ if (!result->value.string_value) return NAN;
303
+
304
+ const char* str = result->value.string_value;
305
+
306
+ /* Skip leading whitespace */
307
+ while (isspace((unsigned char)*str)) str++;
308
+
309
+ /* Empty string or only whitespace -> NaN */
310
+ if (*str == '\0') return NAN;
311
+
312
+ /* Try to parse as number */
313
+ char* endptr;
314
+ double value = strtod(str, &endptr);
315
+
316
+ /* Skip trailing whitespace */
317
+ while (isspace((unsigned char)*endptr)) endptr++;
318
+
319
+ /* If we didn't consume the entire string (after trimming), it's NaN */
320
+ if (*endptr != '\0') return NAN;
321
+
322
+ return value;
323
+ }
324
+
325
+ case XPATH_RESULT_NODESET: {
326
+ /* Convert first node's string value to number */
327
+ XPathNodeSet* nodeset = result->value.nodeset_value;
328
+ if (!nodeset || xpath_nodeset_count(nodeset) == 0) {
329
+ return NAN;
330
+ }
331
+ void* first_node = xpath_nodeset_get(nodeset, 0);
332
+ char* str = get_node_text(first_node);
333
+
334
+ /* Parse the string */
335
+ const char* p = str;
336
+ while (isspace((unsigned char)*p)) p++;
337
+
338
+ if (*p == '\0') {
339
+ LEPTRIS_FREE(str);
340
+ return NAN;
341
+ }
342
+
343
+ char* endptr;
344
+ double value = strtod(p, &endptr);
345
+
346
+ while (isspace((unsigned char)*endptr)) endptr++;
347
+
348
+ if (*endptr != '\0') {
349
+ LEPTRIS_FREE(str);
350
+ return NAN;
351
+ }
352
+
353
+ LEPTRIS_FREE(str);
354
+ return value;
355
+ }
356
+
357
+ default:
358
+ return NAN;
359
+ }
360
+ }
361
+
362
+ /* ============================================================================
363
+ * UTF-8 Helper Functions
364
+ * ============================================================================ */
365
+
366
+ /* ============================================================================
367
+ * Core XPath 1.0 Functions
368
+ * ============================================================================ */
369
+
370
+ /* last() - Returns the context size (number of nodes in context nodeset) */
371
+ static struct leptris_xpath_result* xpath_func_last(XPathContext* context,
372
+ XPathASTNode** args,
373
+ size_t arg_count
374
+ ) {
375
+ (void)args; /* Unused */
376
+
377
+ if (arg_count != 0) {
378
+ snprintf(context->error_msg, sizeof(context->error_msg),
379
+ "last() takes no arguments");
380
+ return NULL;
381
+ }
382
+
383
+ struct leptris_xpath_result* result = xpath_result_new(XPATH_RESULT_NUMBER);
384
+ if (!result) return NULL;
385
+
386
+ result->value.number_value = (double)context->context_size;
387
+ return result;
388
+ }
389
+
390
+ /* position() - Returns the context position (1-based) */
391
+ static struct leptris_xpath_result* xpath_func_position(XPathContext* context,
392
+ XPathASTNode** args,
393
+ size_t arg_count
394
+ ) {
395
+ (void)args; /* Unused */
396
+
397
+ if (arg_count != 0) {
398
+ snprintf(context->error_msg, sizeof(context->error_msg),
399
+ "position() takes no arguments");
400
+ return NULL;
401
+ }
402
+
403
+ struct leptris_xpath_result* result = xpath_result_new(XPATH_RESULT_NUMBER);
404
+ if (!result) return NULL;
405
+
406
+ result->value.number_value = (double)context->context_position;
407
+ return result;
408
+ }
409
+
410
+ /* ============================================================================
411
+ * XPath String Functions
412
+ * ============================================================================ */
413
+
414
+ /* string(object?) - Convert argument to string */
415
+ static struct leptris_xpath_result* xpath_func_string(XPathContext* context,
416
+ XPathASTNode** args,
417
+ size_t arg_count
418
+ ) {
419
+ struct leptris_xpath_result* result = xpath_result_new(XPATH_RESULT_STRING);
420
+ if (!result) return NULL;
421
+
422
+ if (arg_count == 0) {
423
+ /* No argument: convert context node to string */
424
+ result->value.string_value = get_element_text(context->context_node);
425
+ } else {
426
+ /* Evaluate argument and convert to string */
427
+ struct leptris_xpath_result* arg_result = xpath_evaluate(context, args[0]);
428
+ if (!arg_result) {
429
+ xpath_result_free(result);
430
+ return NULL;
431
+ }
432
+
433
+ result->value.string_value = result_to_string(arg_result);
434
+ xpath_result_free(arg_result);
435
+ }
436
+
437
+ return result;
438
+ }
439
+
440
+ /* concat(string, string, string*) - Concatenate strings */
441
+ static struct leptris_xpath_result* xpath_func_concat(XPathContext* context,
442
+ XPathASTNode** args,
443
+ size_t arg_count
444
+ ) {
445
+ if (arg_count < 2) {
446
+ snprintf(context->error_msg, sizeof(context->error_msg),
447
+ "concat() requires at least 2 arguments");
448
+ return NULL;
449
+ }
450
+
451
+ /* Calculate total length needed */
452
+ size_t total_length = 0;
453
+ char** strings = LEPTRIS_ALLOC_N(char*, arg_count);
454
+ if (!strings) return NULL;
455
+
456
+ for (size_t i = 0; i < arg_count; i++) {
457
+ struct leptris_xpath_result* arg_result = xpath_evaluate(context, args[i]);
458
+ if (!arg_result) {
459
+ for (size_t j = 0; j < i; j++) {
460
+ LEPTRIS_FREE(strings[j]);
461
+ }
462
+ LEPTRIS_FREE(strings);
463
+ return NULL;
464
+ }
465
+
466
+ strings[i] = result_to_string(arg_result);
467
+ total_length += strlen(strings[i]);
468
+ xpath_result_free(arg_result);
469
+ }
470
+
471
+ /* Allocate result string */
472
+ char* concat_str = LEPTRIS_ALLOC_N(char, total_length + 1);
473
+ if (!concat_str) {
474
+ for (size_t i = 0; i < arg_count; i++) {
475
+ LEPTRIS_FREE(strings[i]);
476
+ }
477
+ LEPTRIS_FREE(strings);
478
+ return NULL;
479
+ }
480
+
481
+ /* Concatenate all strings */
482
+ memset(concat_str, 0, total_length + 1);
483
+ size_t index = 0;
484
+ for (size_t i = 0; i < arg_count; i++) {
485
+ size_t len = strlen(strings[i]); /* Get length BEFORE freeing */
486
+ strcpy(concat_str + index, strings[i]);
487
+ index += len;
488
+ LEPTRIS_FREE(strings[i]);
489
+ }
490
+ LEPTRIS_FREE(strings);
491
+
492
+ struct leptris_xpath_result* result = xpath_result_new(XPATH_RESULT_STRING);
493
+ if (!result) {
494
+ LEPTRIS_FREE(concat_str);
495
+ return NULL;
496
+ }
497
+ result->value.string_value = concat_str;
498
+ return result;
499
+ }
500
+
501
+ /* Collation-argument mode: 0 = codepoint (the default
502
+ * semantics), 1 = html-ascii-case-insensitive, -1 = unknown
503
+ * collation (error message set, callers return NULL). */
504
+ static int collation_mode(XPathContext* context, XPathASTNode* arg) {
505
+ struct leptris_xpath_result* r = xpath_evaluate(context, arg);
506
+ if (!r) return -1;
507
+ char* uri = result_to_string(r);
508
+ int mode = 0;
509
+ if (uri && strcmp(uri,
510
+ "http://www.w3.org/2005/xpath-functions/collation/"
511
+ "html-ascii-case-insensitive") == 0) {
512
+ mode = 1;
513
+ } else if (uri && strcmp(uri,
514
+ "http://www.w3.org/2005/xpath-functions/collation/"
515
+ "codepoint") != 0) {
516
+ snprintf(context->error_msg, sizeof(context->error_msg),
517
+ "unknown collation %s", uri);
518
+ mode = -1;
519
+ }
520
+ LEPTRIS_FREE(uri);
521
+ xpath_result_free(r);
522
+ return mode;
523
+ }
524
+
525
+ /* starts-with(string, string[, collation]) - Check if string
526
+ * starts with prefix; the 3-arg form carries a collation URI. */
527
+ static struct leptris_xpath_result* xpath_func_starts_with(XPathContext* context,
528
+ XPathASTNode** args,
529
+ size_t arg_count
530
+ ) {
531
+ if (arg_count != 2 && arg_count != 3) {
532
+ snprintf(context->error_msg, sizeof(context->error_msg),
533
+ "starts-with() requires 2 or 3 arguments, got %zu", arg_count);
534
+ return NULL;
535
+ }
536
+
537
+ struct leptris_xpath_result* str_result = xpath_evaluate(context, args[0]);
538
+ if (!str_result) return NULL;
539
+
540
+ struct leptris_xpath_result* prefix_result = xpath_evaluate(context, args[1]);
541
+ if (!prefix_result) {
542
+ xpath_result_free(str_result);
543
+ return NULL;
544
+ }
545
+
546
+ int ascii_ci = 0;
547
+ if (arg_count == 3) {
548
+ int mode = collation_mode(context, args[2]);
549
+ if (mode < 0) {
550
+ xpath_result_free(str_result);
551
+ xpath_result_free(prefix_result);
552
+ return NULL;
553
+ }
554
+ ascii_ci = mode == 1;
555
+ }
556
+
557
+ char* str = result_to_string(str_result);
558
+ char* prefix = result_to_string(prefix_result);
559
+
560
+ int match;
561
+ if (ascii_ci) {
562
+ const char* a = str ? str : "";
563
+ const char* b = prefix ? prefix : "";
564
+ while (*a && *b &&
565
+ tolower((unsigned char)*a) == tolower((unsigned char)*b)) {
566
+ a++;
567
+ b++;
568
+ }
569
+ match = *b == '\0';
570
+ } else {
571
+ match = (strncmp(str ? str : "", prefix ? prefix : "",
572
+ prefix ? strlen(prefix) : 0) == 0);
573
+ }
574
+
575
+ LEPTRIS_FREE(str);
576
+ LEPTRIS_FREE(prefix);
577
+ xpath_result_free(str_result);
578
+ xpath_result_free(prefix_result);
579
+
580
+ struct leptris_xpath_result* result = xpath_result_new(XPATH_RESULT_BOOLEAN);
581
+ if (!result) return NULL;
582
+ result->value.boolean_value = match;
583
+
584
+ return result;
585
+ }
586
+
587
+ /* ends-with(string, string[, collation]) — XPath 2.0 (#684): true
588
+ * when the first string's tail equals the suffix (an empty suffix
589
+ * always matches); the 3-arg form carries a collation URI. */
590
+ static struct leptris_xpath_result* xpath_func_ends_with(XPathContext* context,
591
+ XPathASTNode** args,
592
+ size_t arg_count
593
+ ) {
594
+ if (arg_count != 2 && arg_count != 3) {
595
+ snprintf(context->error_msg, sizeof(context->error_msg),
596
+ "ends-with() requires 2 or 3 arguments, got %zu", arg_count);
597
+ return NULL;
598
+ }
599
+
600
+ struct leptris_xpath_result* str_result = xpath_evaluate(context, args[0]);
601
+ if (!str_result) return NULL;
602
+
603
+ struct leptris_xpath_result* suffix_result = xpath_evaluate(context, args[1]);
604
+ if (!suffix_result) {
605
+ xpath_result_free(str_result);
606
+ return NULL;
607
+ }
608
+
609
+ int ascii_ci = 0;
610
+ if (arg_count == 3) {
611
+ int mode = collation_mode(context, args[2]);
612
+ if (mode < 0) {
613
+ xpath_result_free(str_result);
614
+ xpath_result_free(suffix_result);
615
+ return NULL;
616
+ }
617
+ ascii_ci = mode == 1;
618
+ }
619
+
620
+ char* str = result_to_string(str_result);
621
+ char* suffix = result_to_string(suffix_result);
622
+
623
+ size_t sl = str ? strlen(str) : 0, fl = suffix ? strlen(suffix) : 0;
624
+ int match = fl <= sl;
625
+ if (match) {
626
+ const char* a = (str ? str : "") + sl - fl;
627
+ const char* b = suffix ? suffix : "";
628
+ if (ascii_ci) {
629
+ while (*a && *b &&
630
+ tolower((unsigned char)*a) == tolower((unsigned char)*b)) {
631
+ a++;
632
+ b++;
633
+ }
634
+ match = *b == '\0';
635
+ } else {
636
+ match = memcmp(a, b, fl) == 0;
637
+ }
638
+ }
639
+
640
+ LEPTRIS_FREE(str);
641
+ LEPTRIS_FREE(suffix);
642
+ xpath_result_free(str_result);
643
+ xpath_result_free(suffix_result);
644
+
645
+ struct leptris_xpath_result* result = xpath_result_new(XPATH_RESULT_BOOLEAN);
646
+ if (!result) return NULL;
647
+ result->value.boolean_value = match;
648
+
649
+ return result;
650
+ }
651
+
652
+ /* ---- fn:deep-equal (XPath 2.0, #684) ----
653
+ * Sequences are equal at equal length with pairwise-equal items:
654
+ * nodes compare by kind, name, unordered attribute set and deep
655
+ * content; atomic items compare numerically for numbers, lexically
656
+ * for strings/booleans; kind mismatches are false (not errors). */
657
+
658
+ /* Unordered attribute-set comparison: every attribute of A must
659
+ * exist in B with the same value (lookup by NUL-terminated name
660
+ * snapshot — attribute counts match before we get here). */
661
+ static int de_attrs_equal(LeptrisElement a, LeptrisElement b) {
662
+ size_t ca = leptris_element_attribute_count(a);
663
+ if (ca != leptris_element_attribute_count(b)) return 0;
664
+ for (size_t i = 0; i < ca; i++) {
665
+ struct leptris_attribute* aa =
666
+ leptris_element_get_attribute_by_index(a, (uint8_t)i);
667
+ if (!aa) return 0;
668
+ LeptrisStringView nv = leptris_attribute_name_view(aa);
669
+ char nbuf[256];
670
+ size_t nl = nv.length < sizeof(nbuf) - 1
671
+ ? nv.length : sizeof(nbuf) - 1;
672
+ memcpy(nbuf, nv.data, nl);
673
+ nbuf[nl] = 0;
674
+ const char* bval = leptris_element_attribute(b, nbuf);
675
+ if (!bval) return 0;
676
+ LeptrisStringView av = leptris_attribute_value_view(aa);
677
+ size_t bl = strlen(bval);
678
+ if (bl != av.length ||
679
+ memcmp(av.data, bval, av.length) != 0)
680
+ return 0;
681
+ }
682
+ return 1;
683
+ }
684
+
685
+ static int de_node_equal(LeptrisNodeRef a, LeptrisNodeRef b) {
686
+ if (a == b) return 1;
687
+ if (!a || !b) return 0;
688
+ int ta = leptris_node_get_type(a);
689
+ int tb = leptris_node_get_type(b);
690
+ if (ta != tb) return 0;
691
+ switch (ta) {
692
+ case LEPTRIS_NODE_TYPE_ELEMENT: {
693
+ const char* na = leptris_element_get_name((LeptrisElement)a);
694
+ const char* nb = leptris_element_get_name((LeptrisElement)b);
695
+ if (!na || !nb || strcmp(na, nb) != 0) return 0;
696
+ if (!de_attrs_equal((LeptrisElement)a, (LeptrisElement)b))
697
+ return 0;
698
+ break;
699
+ }
700
+ case LEPTRIS_NODE_TYPE_TEXT:
701
+ return strcmp(leptris_text_get_content((LeptrisTextNode*)a),
702
+ leptris_text_get_content((LeptrisTextNode*)b)) == 0;
703
+ case LEPTRIS_NODE_TYPE_CDATA:
704
+ return strcmp(((LeptrisCDATANode*)a)->content,
705
+ ((LeptrisCDATANode*)b)->content) == 0;
706
+ case LEPTRIS_NODE_TYPE_COMMENT:
707
+ return strcmp(
708
+ leptris_comment_get_content((LeptrisCommentNode*)a),
709
+ leptris_comment_get_content((LeptrisCommentNode*)b)) == 0;
710
+ case LEPTRIS_NODE_TYPE_PI:
711
+ return strcmp(leptris_pi_get_target((LeptrisPINode*)a),
712
+ leptris_pi_get_target((LeptrisPINode*)b)) == 0 &&
713
+ strcmp(leptris_pi_get_data((LeptrisPINode*)a),
714
+ leptris_pi_get_data((LeptrisPINode*)b)) == 0;
715
+ default:
716
+ return 0;
717
+ }
718
+ /* Element children: pairwise, in order. */
719
+ LeptrisNodeRef ca = leptris_node_first_child(a);
720
+ LeptrisNodeRef cb = leptris_node_first_child(b);
721
+ while (ca && cb) {
722
+ if (!de_node_equal(ca, cb)) return 0;
723
+ ca = leptris_node_next_sibling(ca);
724
+ cb = leptris_node_next_sibling(cb);
725
+ }
726
+ return ca == NULL && cb == NULL;
727
+ }
728
+
729
+ /* One comparable item: kind 0 = node, 1 = number, 2 = string,
730
+ * 3 = boolean. Synthetic sequence members carry the "\x03N" numeric
731
+ * marker (stripped here); other synthetic text is a string. */
732
+ typedef struct {
733
+ int kind;
734
+ double num;
735
+ char* str; /* owned for synthetic items */
736
+ const char* borrow; /* document-lifetime text */
737
+ LeptrisNodeRef node;
738
+ } DeItem;
739
+
740
+ static void de_item_clear(DeItem* it) {
741
+ if (it->str) LEPTRIS_FREE(it->str);
742
+ it->str = NULL;
743
+ }
744
+
745
+ static int de_item_equal(DeItem* a, DeItem* b) {
746
+ if (a->kind != b->kind) return 0;
747
+ switch (a->kind) {
748
+ case 0: return de_node_equal(a->node, b->node);
749
+ case 1: return a->num == b->num;
750
+ case 2: {
751
+ const char* as = a->str ? a->str : (a->borrow ? a->borrow : "");
752
+ const char* bs = b->str ? b->str : (b->borrow ? b->borrow : "");
753
+ return strcmp(as, bs) == 0;
754
+ }
755
+ default: return a->num == b->num; /* booleans as 0/1 */
756
+ }
757
+ }
758
+
759
+ /* Collect a result's items into out (cap-limited); returns count. */
760
+ static size_t de_collect(struct leptris_xpath_result* r, DeItem* out,
761
+ size_t cap) {
762
+ if (r->type == XPATH_RESULT_NODESET && r->value.nodeset_value) {
763
+ XPathNodeSet* ns = r->value.nodeset_value;
764
+ size_t n = ns->count < cap ? ns->count : cap;
765
+ for (size_t i = 0; i < n; i++) {
766
+ out[i].str = NULL;
767
+ out[i].borrow = NULL;
768
+ out[i].node = NULL;
769
+ int ty = XPATH_NODE_TYPE(ns->nodes[i]);
770
+ if (ty == LEPTRIS_NODE_TEXT) {
771
+ /* Synthetic sequence member (tag 8): content rides
772
+ * the XPathTextNode struct, numeric members carry
773
+ * the "\x03N" marker. */
774
+ const char* c = ((XPathTextNode*)ns->nodes[i])->content;
775
+ c = c ? c : "";
776
+ if (c[0] == '\x03' && c[1] == 'N') {
777
+ out[i].kind = 1;
778
+ out[i].num = strtod(c + 2, NULL);
779
+ } else {
780
+ out[i].kind = 2;
781
+ out[i].borrow = c;
782
+ }
783
+ } else if (ty == LEPTRIS_NODE_TYPE_TEXT) {
784
+ out[i].kind = 2;
785
+ out[i].borrow = leptris_text_get_content(
786
+ (LeptrisTextNode*)ns->nodes[i]);
787
+ } else {
788
+ out[i].kind = 0;
789
+ out[i].node = ns->nodes[i];
790
+ }
791
+ }
792
+ return ns->count;
793
+ }
794
+ out[0].str = NULL;
795
+ out[0].borrow = NULL;
796
+ out[0].node = NULL;
797
+ if (r->type == XPATH_RESULT_NUMBER) {
798
+ out[0].kind = 1;
799
+ out[0].num = r->value.number_value;
800
+ } else if (r->type == XPATH_RESULT_BOOLEAN) {
801
+ out[0].kind = 3;
802
+ out[0].num = r->value.boolean_value ? 1 : 0;
803
+ } else {
804
+ out[0].kind = 2;
805
+ out[0].str = result_to_string(r);
806
+ }
807
+ return 1;
808
+ }
809
+
810
+ /* deep-equal(arg1, arg2) - deep structural/value comparison. */
811
+ static struct leptris_xpath_result* xpath_func_deep_equal(XPathContext* context,
812
+ XPathASTNode** args,
813
+ size_t arg_count
814
+ ) {
815
+ if (arg_count != 2) {
816
+ snprintf(context->error_msg, sizeof(context->error_msg),
817
+ "deep-equal() requires exactly 2 arguments, got %zu", arg_count);
818
+ return NULL;
819
+ }
820
+
821
+ struct leptris_xpath_result* a = xpath_evaluate(context, args[0]);
822
+ if (!a) return NULL;
823
+ struct leptris_xpath_result* b = xpath_evaluate(context, args[1]);
824
+ if (!b) {
825
+ xpath_result_free(a);
826
+ return NULL;
827
+ }
828
+
829
+ enum { CAP = 64 };
830
+ DeItem ia[CAP], ib[CAP];
831
+ size_t na = de_collect(a, ia, CAP);
832
+ size_t nb = de_collect(b, ib, CAP);
833
+
834
+ int equal = na == nb;
835
+ for (size_t i = 0; equal && i < na && i < CAP; i++)
836
+ equal = de_item_equal(&ia[i], &ib[i]);
837
+
838
+ for (size_t i = 0; i < na && i < CAP; i++) de_item_clear(&ia[i]);
839
+ for (size_t i = 0; i < nb && i < CAP; i++) de_item_clear(&ib[i]);
840
+ xpath_result_free(a);
841
+ xpath_result_free(b);
842
+
843
+ struct leptris_xpath_result* result = xpath_result_new(XPATH_RESULT_BOOLEAN);
844
+ if (!result) return NULL;
845
+ result->value.boolean_value = equal;
846
+ return result;
847
+ }
848
+
849
+ /* ASCII-only case-insensitive substring search — the
850
+ * html-ascii-case-insensitive collation folds ASCII letters and
851
+ * nothing else (WHATWG ASCII case-insensitive matching; folding
852
+ * never changes byte length, so byte-level scans are exact). */
853
+ static int ascii_ci_contains(const char* hay, const char* needle) {
854
+ if (!*needle) return 1;
855
+ for (; *hay; hay++) {
856
+ const char* a = hay;
857
+ const char* b = needle;
858
+ while (*a && *b &&
859
+ tolower((unsigned char)*a) == tolower((unsigned char)*b)) {
860
+ a++;
861
+ b++;
862
+ }
863
+ if (!*b) return 1;
864
+ }
865
+ return 0;
866
+ }
867
+
868
+ /* contains(string, string[, collation]) - Check if string contains
869
+ * substring. The 3-arg form carries a collation URI: codepoint is
870
+ * the default semantics; html-ascii-case-insensitive folds ASCII. */
871
+ static struct leptris_xpath_result* xpath_func_contains(XPathContext* context,
872
+ XPathASTNode** args,
873
+ size_t arg_count
874
+ ) {
875
+ if (arg_count != 2 && arg_count != 3) {
876
+ snprintf(context->error_msg, sizeof(context->error_msg),
877
+ "contains() requires 2 or 3 arguments, got %zu", arg_count);
878
+ return NULL;
879
+ }
880
+
881
+ struct leptris_xpath_result* str_result = xpath_evaluate(context, args[0]);
882
+ if (!str_result) return NULL;
883
+
884
+ struct leptris_xpath_result* substr_result = xpath_evaluate(context, args[1]);
885
+ if (!substr_result) {
886
+ xpath_result_free(str_result);
887
+ return NULL;
888
+ }
889
+
890
+ int ascii_ci = 0;
891
+ if (arg_count == 3) {
892
+ int mode = collation_mode(context, args[2]);
893
+ if (mode < 0) {
894
+ xpath_result_free(str_result);
895
+ xpath_result_free(substr_result);
896
+ return NULL;
897
+ }
898
+ ascii_ci = mode == 1;
899
+ }
900
+
901
+ char* str = result_to_string(str_result);
902
+ char* substr = result_to_string(substr_result);
903
+
904
+ int match = ascii_ci ? ascii_ci_contains(str ? str : "",
905
+ substr ? substr : "")
906
+ : (strstr(str ? str : "",
907
+ substr ? substr : "") != NULL);
908
+
909
+ LEPTRIS_FREE(str);
910
+ LEPTRIS_FREE(substr);
911
+ xpath_result_free(str_result);
912
+ xpath_result_free(substr_result);
913
+
914
+ struct leptris_xpath_result* result = xpath_result_new(XPATH_RESULT_BOOLEAN);
915
+ if (!result) return NULL;
916
+ result->value.boolean_value = match;
917
+
918
+ return result;
919
+ }
920
+
921
+ /* ============================================================================
922
+ * XPath String Functions (substring, substring-before, substring-after, string-length, normalize-space, translate)
923
+ * ============================================================================ */
924
+
925
+ /**
926
+ * substring(string, start) -> string
927
+ * substring(string, start, length) -> string
928
+ * Returns the substring starting at position (1-indexed)
929
+ */
930
+ static struct leptris_xpath_result* xpath_func_substring(XPathContext* context,
931
+ XPathASTNode** args,
932
+ size_t arg_count
933
+ ) {
934
+ if (arg_count < 2 || arg_count > 3) {
935
+ snprintf(context->error_msg, sizeof(context->error_msg),
936
+ "substring() requires 2 or 3 arguments");
937
+ return NULL;
938
+ }
939
+
940
+ /* Evaluate string argument */
941
+ struct leptris_xpath_result* str_result = xpath_evaluate(context, args[0]);
942
+ if (!str_result) return NULL;
943
+ char* str = result_to_string(str_result);
944
+ xpath_result_free(str_result);
945
+ if (!str) return NULL;
946
+
947
+ size_t len = strlen(str);
948
+
949
+ /* Evaluate start position argument */
950
+ struct leptris_xpath_result* start_result = xpath_evaluate(context, args[1]);
951
+ if (!start_result) {
952
+ LEPTRIS_FREE(str);
953
+ return NULL;
954
+ }
955
+ double start_double = result_to_number(start_result);
956
+ xpath_result_free(start_result);
957
+
958
+ /* XPath 1.0 substring() uses IEEE-754 comparisons with round() of
959
+ * arguments. Per spec section 4.2: returned chars are those whose
960
+ * 1-indexed position p satisfies
961
+ * round(start) <= p < round(start) + round(length)
962
+ * (length omitted means +Inf, so the upper bound is +Inf.)
963
+ * NaN start or length returns the empty string. */
964
+
965
+ if (isnan(start_double)) {
966
+ LEPTRIS_FREE(str);
967
+ struct leptris_xpath_result* result = xpath_result_new(XPATH_RESULT_STRING);
968
+ if (result) result->value.string_value = leptris_strdup("");
969
+ return result;
970
+ }
971
+
972
+ /* round() per XPath spec: half rounds toward +Inf. */
973
+ double start_rounded = xpath_round_half_up(start_double);
974
+
975
+ double end_rounded;
976
+ if (arg_count == 2) {
977
+ end_rounded = INFINITY; /* substring(str, start) = start..end */
978
+ } else {
979
+ struct leptris_xpath_result* len_result = xpath_evaluate(context, args[2]);
980
+ if (!len_result) {
981
+ LEPTRIS_FREE(str);
982
+ return NULL;
983
+ }
984
+ double len_double = result_to_number(len_result);
985
+ xpath_result_free(len_result);
986
+ if (isnan(len_double)) {
987
+ LEPTRIS_FREE(str);
988
+ struct leptris_xpath_result* result = xpath_result_new(XPATH_RESULT_STRING);
989
+ if (result) result->value.string_value = leptris_strdup("");
990
+ return result;
991
+ }
992
+ end_rounded = start_rounded + xpath_round_half_up(len_double);
993
+ }
994
+
995
+ /* Walk CODEPOINT positions (XQuery positions are codepoint
996
+ * indexes — a 4-byte astral char is ONE position; QT3's
997
+ * non-BMP cases). ASCII fast path for the common case. */
998
+ size_t out_len = 0;
999
+ char* result_str = LEPTRIS_ALLOC_N(char, len + 1);
1000
+ if (!result_str) {
1001
+ LEPTRIS_FREE(str);
1002
+ return NULL;
1003
+ }
1004
+ int ascii_only = 1;
1005
+ for (size_t i = 0; i < len; i++) {
1006
+ if ((unsigned char)str[i] & 0x80) { ascii_only = 0; break; }
1007
+ }
1008
+ if (ascii_only) {
1009
+ for (size_t i = 0; i < len; i++) {
1010
+ double p = (double)(i + 1);
1011
+ if (p >= start_rounded && p < end_rounded)
1012
+ result_str[out_len++] = str[i];
1013
+ }
1014
+ } else {
1015
+ size_t i = 0;
1016
+ double p = 1.0;
1017
+ while (i < len) {
1018
+ size_t cp_len = 1;
1019
+ unsigned char b = (unsigned char)str[i];
1020
+ if ((b & 0x80) == 0) cp_len = 1;
1021
+ else if ((b & 0xE0) == 0xC0) cp_len = 2;
1022
+ else if ((b & 0xF0) == 0xE0) cp_len = 3;
1023
+ else if ((b & 0xF8) == 0xF0) cp_len = 4;
1024
+ if (i + cp_len > len) cp_len = 1; /* truncated: byte */
1025
+ if (p >= start_rounded && p < end_rounded) {
1026
+ memcpy(result_str + out_len, str + i, cp_len);
1027
+ out_len += cp_len;
1028
+ }
1029
+ i += cp_len;
1030
+ p += 1.0;
1031
+ }
1032
+ }
1033
+ result_str[out_len] = '\0';
1034
+ LEPTRIS_FREE(str);
1035
+
1036
+ struct leptris_xpath_result* result = xpath_result_new(XPATH_RESULT_STRING);
1037
+ if (!result) {
1038
+ LEPTRIS_FREE(result_str);
1039
+ return NULL;
1040
+ }
1041
+ result->value.string_value = result_str;
1042
+ return result;
1043
+ }
1044
+
1045
+ /**
1046
+ * substring-before(string, pattern) -> string
1047
+ * Returns the substring before the first occurrence of pattern
1048
+ */
1049
+ static struct leptris_xpath_result* xpath_func_substring_before(XPathContext* context,
1050
+ XPathASTNode** args,
1051
+ size_t arg_count
1052
+ ) {
1053
+ if (arg_count != 2) {
1054
+ snprintf(context->error_msg, sizeof(context->error_msg),
1055
+ "substring-before() requires exactly 2 arguments");
1056
+ return NULL;
1057
+ }
1058
+
1059
+ /* Evaluate string argument */
1060
+ struct leptris_xpath_result* str_result = xpath_evaluate(context, args[0]);
1061
+ if (!str_result) return NULL;
1062
+ char* str = result_to_string(str_result);
1063
+ xpath_result_free(str_result);
1064
+ if (!str) return NULL;
1065
+
1066
+ /* Evaluate pattern argument */
1067
+ struct leptris_xpath_result* pattern_result = xpath_evaluate(context, args[1]);
1068
+ if (!pattern_result) {
1069
+ LEPTRIS_FREE(str);
1070
+ return NULL;
1071
+ }
1072
+ char* pattern = result_to_string(pattern_result);
1073
+ xpath_result_free(pattern_result);
1074
+
1075
+ if (!pattern) {
1076
+ LEPTRIS_FREE(str);
1077
+ return NULL;
1078
+ }
1079
+
1080
+ char* result_str;
1081
+ if (pattern[0] == '\0') {
1082
+ /* Empty pattern returns empty string */
1083
+ result_str = leptris_strdup("");
1084
+ } else {
1085
+ char* pos = strstr(str, pattern);
1086
+ if (!pos) {
1087
+ result_str = leptris_strdup("");
1088
+ } else {
1089
+ size_t prefix_len = (size_t)(pos - str);
1090
+ result_str = LEPTRIS_ALLOC_N(char, prefix_len + 1);
1091
+ if (result_str) {
1092
+ memcpy(result_str, str, prefix_len);
1093
+ result_str[prefix_len] = '\0';
1094
+ }
1095
+ }
1096
+ }
1097
+
1098
+ LEPTRIS_FREE(str);
1099
+ LEPTRIS_FREE(pattern);
1100
+
1101
+ if (!result_str) return NULL;
1102
+
1103
+ struct leptris_xpath_result* result = xpath_result_new(XPATH_RESULT_STRING);
1104
+ if (!result) {
1105
+ LEPTRIS_FREE(result_str);
1106
+ return NULL;
1107
+ }
1108
+ result->value.string_value = result_str;
1109
+ return result;
1110
+ }
1111
+
1112
+ /**
1113
+ * substring-after(string, pattern) -> string
1114
+ * Returns the substring after the first occurrence of pattern
1115
+ */
1116
+ static struct leptris_xpath_result* xpath_func_substring_after(XPathContext* context,
1117
+ XPathASTNode** args,
1118
+ size_t arg_count
1119
+ ) {
1120
+ if (arg_count != 2) {
1121
+ snprintf(context->error_msg, sizeof(context->error_msg),
1122
+ "substring-after() requires exactly 2 arguments");
1123
+ return NULL;
1124
+ }
1125
+
1126
+ /* Evaluate string argument */
1127
+ struct leptris_xpath_result* str_result = xpath_evaluate(context, args[0]);
1128
+ if (!str_result) return NULL;
1129
+ char* str = result_to_string(str_result);
1130
+ xpath_result_free(str_result);
1131
+ if (!str) return NULL;
1132
+
1133
+ /* Evaluate pattern argument */
1134
+ struct leptris_xpath_result* pattern_result = xpath_evaluate(context, args[1]);
1135
+ if (!pattern_result) {
1136
+ LEPTRIS_FREE(str);
1137
+ return NULL;
1138
+ }
1139
+ char* pattern = result_to_string(pattern_result);
1140
+ xpath_result_free(pattern_result);
1141
+
1142
+ if (!pattern) {
1143
+ LEPTRIS_FREE(str);
1144
+ return NULL;
1145
+ }
1146
+
1147
+ /* XPath spec: substring-after with empty pattern returns empty string */
1148
+ char* result_str;
1149
+ if (pattern[0] == '\0') {
1150
+ /* Empty pattern returns empty string for substring-after */
1151
+ /* Actually per XPath spec: substring-after('', '') = '' and substring-after('test', '') = 'test' */
1152
+ result_str = leptris_strdup(str); /* Return the entire string for empty pattern */
1153
+ } else {
1154
+ char* pos = strstr(str, pattern);
1155
+ if (!pos) {
1156
+ result_str = leptris_strdup("");
1157
+ } else {
1158
+ char* after = pos + strlen(pattern);
1159
+ size_t suffix_len = strlen(after);
1160
+ result_str = LEPTRIS_ALLOC_N(char, suffix_len + 1);
1161
+ if (result_str) {
1162
+ memcpy(result_str, after, suffix_len);
1163
+ result_str[suffix_len] = '\0';
1164
+ }
1165
+ }
1166
+ }
1167
+
1168
+ LEPTRIS_FREE(str);
1169
+ LEPTRIS_FREE(pattern);
1170
+
1171
+ if (!result_str) return NULL;
1172
+
1173
+ struct leptris_xpath_result* result = xpath_result_new(XPATH_RESULT_STRING);
1174
+ if (!result) {
1175
+ LEPTRIS_FREE(result_str);
1176
+ return NULL;
1177
+ }
1178
+ result->value.string_value = result_str;
1179
+ return result;
1180
+ }
1181
+
1182
+ /**
1183
+ * string-length(string) -> number
1184
+ * Returns the length of the string
1185
+ */
1186
+ static struct leptris_xpath_result* xpath_func_string_length(XPathContext* context,
1187
+ XPathASTNode** args,
1188
+ size_t arg_count
1189
+ ) {
1190
+ if (arg_count > 1) {
1191
+ snprintf(context->error_msg, sizeof(context->error_msg),
1192
+ "string-length() requires 0 or 1 argument");
1193
+ return NULL;
1194
+ }
1195
+
1196
+ char* str = NULL;
1197
+
1198
+ if (arg_count == 1) {
1199
+ /* Evaluate string argument */
1200
+ struct leptris_xpath_result* str_result = xpath_evaluate(context, args[0]);
1201
+ if (!str_result) return NULL;
1202
+ str = result_to_string(str_result);
1203
+ xpath_result_free(str_result);
1204
+ } else {
1205
+ /* No argument - use context node's string value */
1206
+ struct leptris_xpath_result* str_result = xpath_func_string(context, NULL, 0);
1207
+ if (!str_result) return NULL;
1208
+ str = result_to_string(str_result);
1209
+ xpath_result_free(str_result);
1210
+ }
1211
+
1212
+ size_t len = str ? strlen(str) : 0;
1213
+ LEPTRIS_FREE(str);
1214
+
1215
+ struct leptris_xpath_result* result = xpath_result_new(XPATH_RESULT_NUMBER);
1216
+ if (!result) return NULL;
1217
+ result->value.number_value = (double)len;
1218
+ return result;
1219
+ }
1220
+
1221
+ /**
1222
+ * normalize-space(string?) -> string
1223
+ * Returns the input string with whitespace normalized
1224
+ */
1225
+ static struct leptris_xpath_result* xpath_func_normalize_space(XPathContext* context,
1226
+ XPathASTNode** args,
1227
+ size_t arg_count
1228
+ ) {
1229
+ if (arg_count > 1) {
1230
+ snprintf(context->error_msg, sizeof(context->error_msg),
1231
+ "normalize-space() requires 0 or 1 argument");
1232
+ return NULL;
1233
+ }
1234
+
1235
+ char* str = NULL;
1236
+
1237
+ if (arg_count == 1) {
1238
+ /* Evaluate string argument */
1239
+ struct leptris_xpath_result* str_result = xpath_evaluate(context, args[0]);
1240
+ if (!str_result) return NULL;
1241
+ str = result_to_string(str_result);
1242
+ xpath_result_free(str_result);
1243
+ } else {
1244
+ /* No argument - use context node's string value */
1245
+ struct leptris_xpath_result* str_result = xpath_func_string(context, NULL, 0);
1246
+ if (!str_result) return NULL;
1247
+ str = result_to_string(str_result);
1248
+ xpath_result_free(str_result);
1249
+ }
1250
+
1251
+ if (!str) {
1252
+ struct leptris_xpath_result* result = xpath_result_new(XPATH_RESULT_STRING);
1253
+ if (result) result->value.string_value = leptris_strdup("");
1254
+ return result;
1255
+ }
1256
+
1257
+ /* Normalize whitespace: trim leading/trailing, collapse internal whitespace */
1258
+ char* src = str;
1259
+ char* dst = str;
1260
+ int in_whitespace = 0;
1261
+
1262
+ /* Skip leading whitespace */
1263
+ while (isspace((unsigned char)*src)) src++;
1264
+
1265
+ while (*src) {
1266
+ if (isspace((unsigned char)*src)) {
1267
+ if (!in_whitespace) {
1268
+ /* Start of whitespace sequence - add single space */
1269
+ *dst++ = ' ';
1270
+ in_whitespace = 1;
1271
+ }
1272
+ /* Skip remaining whitespace */
1273
+ } else {
1274
+ *dst++ = *src;
1275
+ in_whitespace = 0;
1276
+ }
1277
+ src++;
1278
+ }
1279
+
1280
+ /* Remove trailing space if present */
1281
+ if (dst > str && dst[-1] == ' ') {
1282
+ dst--;
1283
+ }
1284
+ *dst = '\0';
1285
+
1286
+ struct leptris_xpath_result* result = xpath_result_new(XPATH_RESULT_STRING);
1287
+ if (!result) {
1288
+ LEPTRIS_FREE(str);
1289
+ return NULL;
1290
+ }
1291
+
1292
+ /* str may have been modified in place, but we need to keep it valid */
1293
+ result->value.string_value = leptris_strdup(str);
1294
+ LEPTRIS_FREE(str);
1295
+
1296
+ return result;
1297
+ }
1298
+
1299
+ /**
1300
+ * translate(string, from, to) -> string
1301
+ * Returns string with characters from replaced by corresponding characters in to
1302
+ */
1303
+ static struct leptris_xpath_result* xpath_func_translate(XPathContext* context,
1304
+ XPathASTNode** args,
1305
+ size_t arg_count
1306
+ ) {
1307
+ if (arg_count != 3) {
1308
+ snprintf(context->error_msg, sizeof(context->error_msg),
1309
+ "translate() requires exactly 3 arguments");
1310
+ return NULL;
1311
+ }
1312
+
1313
+ /* Evaluate arguments */
1314
+ struct leptris_xpath_result* str_result = xpath_evaluate(context, args[0]);
1315
+ if (!str_result) return NULL;
1316
+ char* str = result_to_string(str_result);
1317
+ xpath_result_free(str_result);
1318
+ if (!str) return NULL;
1319
+
1320
+ struct leptris_xpath_result* from_result = xpath_evaluate(context, args[1]);
1321
+ if (!from_result) {
1322
+ LEPTRIS_FREE(str);
1323
+ return NULL;
1324
+ }
1325
+ char* from = result_to_string(from_result);
1326
+ xpath_result_free(from_result);
1327
+
1328
+ struct leptris_xpath_result* to_result = xpath_evaluate(context, args[2]);
1329
+ if (!to_result) {
1330
+ LEPTRIS_FREE(str);
1331
+ LEPTRIS_FREE(from);
1332
+ return NULL;
1333
+ }
1334
+ char* to = result_to_string(to_result);
1335
+ xpath_result_free(to_result);
1336
+
1337
+ if (!from || !to) {
1338
+ LEPTRIS_FREE(str);
1339
+ LEPTRIS_FREE(from);
1340
+ LEPTRIS_FREE(to);
1341
+ return NULL;
1342
+ }
1343
+
1344
+ /* Build translation table for first 256 characters */
1345
+ unsigned char map[256];
1346
+ for (int i = 0; i < 256; i++) {
1347
+ map[i] = (unsigned char)i; /* Default: keep character */
1348
+ }
1349
+
1350
+ size_t from_len = strlen(from);
1351
+ size_t to_len = strlen(to);
1352
+
1353
+ /* For each character in 'from', map to corresponding in 'to' */
1354
+ for (size_t i = 0; i < from_len; i++) {
1355
+ unsigned char c = (unsigned char)from[i];
1356
+ if (i < to_len) {
1357
+ map[c] = (unsigned char)to[i];
1358
+ } else {
1359
+ map[c] = 0; /* Remove character if no corresponding replacement */
1360
+ }
1361
+ }
1362
+
1363
+ /* Translate the string */
1364
+ for (char* p = str; *p; p++) {
1365
+ unsigned char c = (unsigned char)*p;
1366
+ if (map[c] == 0) {
1367
+ /* Remove character by shifting */
1368
+ char* q = p;
1369
+ while (*q) {
1370
+ *q = *(q + 1);
1371
+ q++;
1372
+ }
1373
+ p--; /* Re-check this position */
1374
+ } else if (map[c] != c) {
1375
+ *p = (char)map[c];
1376
+ }
1377
+ }
1378
+
1379
+ LEPTRIS_FREE(from);
1380
+ LEPTRIS_FREE(to);
1381
+
1382
+ struct leptris_xpath_result* result = xpath_result_new(XPATH_RESULT_STRING);
1383
+ if (!result) {
1384
+ LEPTRIS_FREE(str);
1385
+ return NULL;
1386
+ }
1387
+ result->value.string_value = str;
1388
+ return result;
1389
+ }
1390
+
1391
+ /* ============================================================================
1392
+ * XPath Boolean Functions
1393
+ * ============================================================================ */
1394
+
1395
+ /* boolean(object) - Convert any object to boolean */
1396
+ static struct leptris_xpath_result* xpath_func_boolean(XPathContext* context,
1397
+ XPathASTNode** args,
1398
+ size_t arg_count
1399
+ ) {
1400
+ if (arg_count != 1) {
1401
+ snprintf(context->error_msg, sizeof(context->error_msg),
1402
+ "boolean() requires exactly 1 argument");
1403
+ return NULL;
1404
+ }
1405
+
1406
+ /* Evaluate argument */
1407
+ struct leptris_xpath_result* arg_result = xpath_evaluate(context, args[0]);
1408
+ if (!arg_result) return NULL;
1409
+
1410
+ /* Convert to boolean */
1411
+ int bool_value = result_to_boolean(arg_result);
1412
+ xpath_result_free(arg_result);
1413
+
1414
+ struct leptris_xpath_result* result = xpath_result_new(XPATH_RESULT_BOOLEAN);
1415
+ if (!result) return NULL;
1416
+ result->value.boolean_value = bool_value;
1417
+
1418
+ return result;
1419
+ }
1420
+
1421
+ /* not(boolean) - Logical negation */
1422
+ static struct leptris_xpath_result* xpath_func_not(XPathContext* context,
1423
+ XPathASTNode** args,
1424
+ size_t arg_count
1425
+ ) {
1426
+ if (arg_count != 1) {
1427
+ snprintf(context->error_msg, sizeof(context->error_msg),
1428
+ "not() requires exactly 1 argument");
1429
+ return NULL;
1430
+ }
1431
+
1432
+ /* Evaluate argument */
1433
+ struct leptris_xpath_result* arg_result = xpath_evaluate(context, args[0]);
1434
+ if (!arg_result) return NULL;
1435
+
1436
+ /* Convert to boolean and negate */
1437
+ int bool_value = result_to_boolean(arg_result);
1438
+ xpath_result_free(arg_result);
1439
+
1440
+ struct leptris_xpath_result* result = xpath_result_new(XPATH_RESULT_BOOLEAN);
1441
+ if (!result) return NULL;
1442
+ result->value.boolean_value = !bool_value;
1443
+
1444
+ return result;
1445
+ }
1446
+
1447
+ /* true() - Returns boolean true */
1448
+ static struct leptris_xpath_result* xpath_func_true(XPathContext* context,
1449
+ XPathASTNode** args,
1450
+ size_t arg_count
1451
+ ) {
1452
+ (void)context; /* Unused */
1453
+ (void)args; /* Unused */
1454
+
1455
+ if (arg_count != 0) {
1456
+ snprintf(context->error_msg, sizeof(context->error_msg),
1457
+ "true() takes no arguments");
1458
+ return NULL;
1459
+ }
1460
+
1461
+ struct leptris_xpath_result* result = xpath_result_new(XPATH_RESULT_BOOLEAN);
1462
+ if (!result) return NULL;
1463
+ result->value.boolean_value = 1;
1464
+
1465
+ return result;
1466
+ }
1467
+
1468
+ /* false() - Returns boolean false */
1469
+ static struct leptris_xpath_result* xpath_func_false(XPathContext* context,
1470
+ XPathASTNode** args,
1471
+ size_t arg_count
1472
+ ) {
1473
+ (void)context; /* Unused */
1474
+ (void)args; /* Unused */
1475
+
1476
+ if (arg_count != 0) {
1477
+ snprintf(context->error_msg, sizeof(context->error_msg),
1478
+ "false() takes no arguments");
1479
+ return NULL;
1480
+ }
1481
+
1482
+ struct leptris_xpath_result* result = xpath_result_new(XPATH_RESULT_BOOLEAN);
1483
+ if (!result) return NULL;
1484
+ result->value.boolean_value = 0;
1485
+
1486
+ return result;
1487
+ }
1488
+
1489
+ /* ============================================================================
1490
+ * XPath Number Functions
1491
+ * ============================================================================ */
1492
+
1493
+ /* number(object?) - Convert argument to number */
1494
+ static struct leptris_xpath_result* xpath_func_number(XPathContext* context,
1495
+ XPathASTNode** args,
1496
+ size_t arg_count
1497
+ ) {
1498
+ if (arg_count > 1) {
1499
+ snprintf(context->error_msg, sizeof(context->error_msg),
1500
+ "number() takes 0 or 1 argument");
1501
+ return NULL;
1502
+ }
1503
+
1504
+ struct leptris_xpath_result* result = xpath_result_new(XPATH_RESULT_NUMBER);
1505
+ if (!result) return NULL;
1506
+
1507
+ if (arg_count == 0) {
1508
+ /* No argument: convert context node to number */
1509
+ char* str = get_element_text(context->context_node);
1510
+ const char* p = str;
1511
+ while (isspace((unsigned char)*p)) p++;
1512
+
1513
+ if (*p == '\0') {
1514
+ result->value.number_value = NAN;
1515
+ } else {
1516
+ char* endptr;
1517
+ double value = strtod(p, &endptr);
1518
+ while (isspace((unsigned char)*endptr)) endptr++;
1519
+ result->value.number_value = (*endptr == '\0') ? value : NAN;
1520
+ }
1521
+ LEPTRIS_FREE(str);
1522
+ } else {
1523
+ /* Evaluate argument and convert to number */
1524
+ struct leptris_xpath_result* arg_result = xpath_evaluate(context, args[0]);
1525
+ if (!arg_result) {
1526
+ xpath_result_free(result);
1527
+ return NULL;
1528
+ }
1529
+ result->value.number_value = result_to_number(arg_result);
1530
+ xpath_result_free(arg_result);
1531
+ }
1532
+ return result;
1533
+ }
1534
+
1535
+ /* sum(node-set) - Sum the numeric values of all nodes */
1536
+ static struct leptris_xpath_result* xpath_func_sum(XPathContext* context,
1537
+ XPathASTNode** args,
1538
+ size_t arg_count
1539
+ ) {
1540
+ if (arg_count != 1) {
1541
+ snprintf(context->error_msg, sizeof(context->error_msg),
1542
+ "sum() requires exactly 1 argument");
1543
+ return NULL;
1544
+ }
1545
+
1546
+ struct leptris_xpath_result* arg_result = xpath_evaluate(context, args[0]);
1547
+ if (!arg_result) return NULL;
1548
+
1549
+ if (arg_result->type != XPATH_RESULT_NODESET) {
1550
+ snprintf(context->error_msg, sizeof(context->error_msg),
1551
+ "sum() argument must be a nodeset");
1552
+ xpath_result_free(arg_result);
1553
+ return NULL;
1554
+ }
1555
+
1556
+ XPathNodeSet* nodeset = arg_result->value.nodeset_value;
1557
+ double sum = 0.0;
1558
+ int has_nan = 0;
1559
+
1560
+ if (nodeset) {
1561
+ size_t count = xpath_nodeset_count(nodeset);
1562
+ for (size_t i = 0; i < count; i++) {
1563
+ void* node = xpath_nodeset_get(nodeset, i);
1564
+ char* str = get_node_text(node);
1565
+ const char* p = str;
1566
+ while (isspace((unsigned char)*p)) p++;
1567
+
1568
+ if (*p != '\0') {
1569
+ char* endptr;
1570
+ double value = strtod(p, &endptr);
1571
+ while (isspace((unsigned char)*endptr)) endptr++;
1572
+ if (*endptr == '\0') {
1573
+ if (isnan(value)) {
1574
+ has_nan = 1;
1575
+ } else {
1576
+ sum += value;
1577
+ }
1578
+ } else {
1579
+ /* Non-numeric value found */
1580
+ has_nan = 1;
1581
+ }
1582
+ }
1583
+ LEPTRIS_FREE(str);
1584
+ }
1585
+ }
1586
+ xpath_result_free(arg_result);
1587
+
1588
+ struct leptris_xpath_result* result = xpath_result_new(XPATH_RESULT_NUMBER);
1589
+ if (!result) return NULL;
1590
+
1591
+ if (has_nan) {
1592
+ result->value.number_value = NAN;
1593
+ } else {
1594
+ result->value.number_value = sum;
1595
+ }
1596
+ return result;
1597
+ }
1598
+
1599
+ /* floor(number) - Largest integer not greater than argument */
1600
+ static struct leptris_xpath_result* xpath_func_floor(XPathContext* context,
1601
+ XPathASTNode** args,
1602
+ size_t arg_count
1603
+ ) {
1604
+ if (arg_count != 1) {
1605
+ snprintf(context->error_msg, sizeof(context->error_msg),
1606
+ "floor() requires exactly 1 argument");
1607
+ return NULL;
1608
+ }
1609
+
1610
+ struct leptris_xpath_result* arg_result = xpath_evaluate(context, args[0]);
1611
+ if (!arg_result) return NULL;
1612
+
1613
+ double num = result_to_number(arg_result);
1614
+ xpath_result_free(arg_result);
1615
+
1616
+ struct leptris_xpath_result* result = xpath_result_new(XPATH_RESULT_NUMBER);
1617
+ if (!result) return NULL;
1618
+ result->value.number_value = floor(num);
1619
+ return result;
1620
+ }
1621
+
1622
+ /* ceiling(number) - Smallest integer not less than argument */
1623
+ static struct leptris_xpath_result* xpath_func_ceiling(XPathContext* context,
1624
+ XPathASTNode** args,
1625
+ size_t arg_count
1626
+ ) {
1627
+ if (arg_count != 1) {
1628
+ snprintf(context->error_msg, sizeof(context->error_msg),
1629
+ "ceiling() requires exactly 1 argument");
1630
+ return NULL;
1631
+ }
1632
+
1633
+ struct leptris_xpath_result* arg_result = xpath_evaluate(context, args[0]);
1634
+ if (!arg_result) return NULL;
1635
+
1636
+ double num = result_to_number(arg_result);
1637
+ xpath_result_free(arg_result);
1638
+
1639
+ struct leptris_xpath_result* result = xpath_result_new(XPATH_RESULT_NUMBER);
1640
+ if (!result) return NULL;
1641
+ result->value.number_value = ceil(num);
1642
+ return result;
1643
+ }
1644
+
1645
+ /* round(number) - Round to nearest integer; ties toward +Inf (XPath 1.0 spec 4.4). */
1646
+ static struct leptris_xpath_result* xpath_func_round(XPathContext* context,
1647
+ XPathASTNode** args,
1648
+ size_t arg_count
1649
+ ) {
1650
+ if (arg_count < 1 || arg_count > 2) {
1651
+ snprintf(context->error_msg, sizeof(context->error_msg),
1652
+ "round() requires 1 or 2 arguments");
1653
+ return NULL;
1654
+ }
1655
+
1656
+ struct leptris_xpath_result* arg_result = xpath_evaluate(context, args[0]);
1657
+ if (!arg_result) return NULL;
1658
+
1659
+ double num = result_to_number(arg_result);
1660
+ xpath_result_free(arg_result);
1661
+
1662
+ struct leptris_xpath_result* result = xpath_result_new(XPATH_RESULT_NUMBER);
1663
+ if (!result) return NULL;
1664
+
1665
+ /* XPath round() rounds half toward +Inf (spec 4.4). The 2-arg
1666
+ * form (2.0) scales by 10^precision first — negative precision
1667
+ * rounds to tens, hundreds, ... */
1668
+ double scale = 1.0;
1669
+ if (arg_count == 2) {
1670
+ struct leptris_xpath_result* p = xpath_evaluate(context, args[1]);
1671
+ if (!p) { xpath_result_free(result); return NULL; }
1672
+ double pd = result_to_number(p);
1673
+ xpath_result_free(p);
1674
+ if (!(pd >= -100 && pd <= 100)) {
1675
+ snprintf(context->error_msg, sizeof(context->error_msg),
1676
+ "round(): precision out of range");
1677
+ xpath_result_free(result);
1678
+ return NULL;
1679
+ }
1680
+ scale = pow(10.0, pd);
1681
+ }
1682
+ result->value.number_value = xpath_round_half_up(num * scale) / scale;
1683
+ return result;
1684
+ }
1685
+
1686
+ /* ============================================================================
1687
+ * XPath Node-set Functions
1688
+ * ============================================================================ */
1689
+
1690
+ /* XPath §4.1: an attribute identifies its element when the DTD
1691
+ * declares it ID-typed (any QName — bug-163's myns:id) or it is the
1692
+ * conventional unprefixed "id" (xml:id-style documents without a
1693
+ * DTD still resolve). */
1694
+ static int attr_is_id_typed(struct leptris_document* doc,
1695
+ LeptrisElement elem, const char* attr_name) {
1696
+ if (strcmp(attr_name, "id") == 0 || strcmp(attr_name, "xml:id") == 0)
1697
+ return 1;
1698
+ if (!doc || !doc->dtd) return 0;
1699
+ DTDAttributeDecl* ad = ttdtd_lookup_attribute(
1700
+ (const LeptrisDTD*)doc->dtd,
1701
+ leptris_element_get_name(elem), attr_name);
1702
+ return ad && ad->attr_type && strcmp(ad->attr_type, "ID") == 0;
1703
+ }
1704
+
1705
+ /* Helper to recursively find elements by id */
1706
+ static void find_elements_by_id(struct leptris_document* doc,
1707
+ LeptrisElement node, const char* id,
1708
+ XPathNodeSet* result) {
1709
+ if (!node) return;
1710
+
1711
+ /* Check every attribute — an ID may live under any QName the
1712
+ * DTD declares ID-typed. */
1713
+ size_t na = leptris_element_attribute_count(node);
1714
+ for (size_t i = 0; i < na; i++) {
1715
+ const char* an = leptris_element_attribute_name_at(node, i);
1716
+ const char* av = leptris_element_attribute_value_at(node, i);
1717
+ if (an && av && strcmp(av, id) == 0 &&
1718
+ attr_is_id_typed(doc, node, an)) {
1719
+ xpath_nodeset_add(result, node);
1720
+ break;
1721
+ }
1722
+ }
1723
+
1724
+ /* Recursively check children using compact accessor functions */
1725
+ LeptrisElement child_elem = leptris_element_get_first_child(node);
1726
+ while (child_elem) {
1727
+ /* Only recurse into element nodes */
1728
+ find_elements_by_id(doc, child_elem, id, result);
1729
+ child_elem = leptris_element_get_next_sibling(child_elem);
1730
+ }
1731
+ }
1732
+
1733
+ /* ============================================================================
1734
+ * Node-Set Functions (local-name, namespace-uri, name, id)
1735
+ * ============================================================================ */
1736
+
1737
+ /**
1738
+ * Get local name of a node (without namespace prefix)
1739
+ * XPath: local-name(nodeset?)
1740
+ */
1741
+ static struct leptris_xpath_result* xpath_func_local_name(
1742
+ XPathContext* context,
1743
+ XPathASTNode** args,
1744
+ size_t arg_count
1745
+ ) {
1746
+ (void)context;
1747
+ void* node = NULL;
1748
+ char* synth_name = NULL; /* owned copy from a synthetic node */
1749
+ int node_tag = -1; /* captured before the arg result is freed */
1750
+
1751
+ /* Get context node if no argument */
1752
+ if (arg_count == 0) {
1753
+ node = context->context_node;
1754
+ if (node) {
1755
+ node_tag = (int)XPATH_NODE_TYPE(node);
1756
+ if (node_tag == LEPTRIS_NODE_ATTRIBUTE) {
1757
+ const char* n = ((LeptrisAttributeNode*)node)->name;
1758
+ synth_name = n ? leptris_strdup(n) : NULL;
1759
+ } else if (node_tag == LEPTRIS_NODE_NAMESPACE) {
1760
+ const char* n = ((LeptrisNamespaceNode*)node)->prefix;
1761
+ synth_name = n ? leptris_strdup(n) : NULL;
1762
+ } else if (node_tag == LEPTRIS_NODE_TYPE_PI) {
1763
+ const char* t = leptris_pi_get_target((LeptrisPINode*)node);
1764
+ synth_name = t ? leptris_strdup(t) : NULL;
1765
+ }
1766
+ }
1767
+ } else if (arg_count == 1) {
1768
+ /* Use first node from nodeset */
1769
+ struct leptris_xpath_result* arg_result = xpath_evaluate(context, args[0]);
1770
+ if (!arg_result) return NULL;
1771
+
1772
+ if (arg_result->type == XPATH_RESULT_NODESET) {
1773
+ XPathNodeSet* nodeset = arg_result->value.nodeset_value;
1774
+ if (nodeset && xpath_nodeset_count(nodeset) > 0) {
1775
+ node = xpath_nodeset_get(nodeset, 0);
1776
+ /* Synthetic attribute/namespace nodes are owned by
1777
+ * arg_result and die at the free below — copy the
1778
+ * string out while the node is still alive. */
1779
+ if (node) {
1780
+ int tag = (int)XPATH_NODE_TYPE(node);
1781
+ node_tag = tag;
1782
+ if (tag == LEPTRIS_NODE_ATTRIBUTE) {
1783
+ const char* n = ((LeptrisAttributeNode*)node)->name;
1784
+ synth_name = n ? leptris_strdup(n) : NULL;
1785
+ } else if (tag == LEPTRIS_NODE_NAMESPACE) {
1786
+ const char* n = ((LeptrisNamespaceNode*)node)->prefix;
1787
+ synth_name = n ? leptris_strdup(n) : NULL;
1788
+ }
1789
+ }
1790
+ }
1791
+ }
1792
+ xpath_result_free(arg_result);
1793
+ } else {
1794
+ snprintf(context->error_msg, sizeof(context->error_msg),
1795
+ "local-name() requires 0 or 1 argument");
1796
+ return NULL;
1797
+ }
1798
+
1799
+ if (!node) {
1800
+ /* Return empty string for empty nodeset or no node */
1801
+ struct leptris_xpath_result* result = xpath_result_new(XPATH_RESULT_STRING);
1802
+ if (!result) return NULL;
1803
+ result->value.string_value = leptris_strdup("");
1804
+ return result;
1805
+ }
1806
+
1807
+ /* Get local name (everything after last colon, or full name if no colon) */
1808
+ const char* full_name = NULL;
1809
+ if (node_tag == LEPTRIS_NODE_ELEMENT) {
1810
+ full_name = leptris_element_get_name((LeptrisElement)node);
1811
+ } else if (synth_name) {
1812
+ full_name = synth_name;
1813
+ }
1814
+
1815
+ if (!full_name) {
1816
+ LEPTRIS_FREE(synth_name);
1817
+ struct leptris_xpath_result* result = xpath_result_new(XPATH_RESULT_STRING);
1818
+ if (!result) return NULL;
1819
+ result->value.string_value = leptris_strdup("");
1820
+ return result;
1821
+ }
1822
+
1823
+ /* Find last colon */
1824
+ const char* last_colon = strrchr(full_name, ':');
1825
+ const char* local_name = last_colon ? last_colon + 1 : full_name;
1826
+
1827
+ struct leptris_xpath_result* result = xpath_result_new(XPATH_RESULT_STRING);
1828
+ if (!result) {
1829
+ LEPTRIS_FREE(synth_name);
1830
+ return NULL;
1831
+ }
1832
+ result->value.string_value = leptris_strdup(local_name);
1833
+ LEPTRIS_FREE(synth_name);
1834
+ return result;
1835
+ }
1836
+
1837
+ /**
1838
+ * Get namespace URI of a node
1839
+ * XPath: namespace-uri(nodeset?)
1840
+ */
1841
+ static struct leptris_xpath_result* xpath_func_namespace_uri(
1842
+ XPathContext* context,
1843
+ XPathASTNode** args,
1844
+ size_t arg_count
1845
+ ) {
1846
+ (void)context;
1847
+ void* node = NULL;
1848
+ char* synth_uri = NULL; /* owned copy from a synthetic node */
1849
+ int node_tag = -1; /* captured before the arg result is freed */
1850
+
1851
+ /* Get context node if no argument */
1852
+ if (arg_count == 0) {
1853
+ node = context->context_node;
1854
+ if (node) node_tag = (int)XPATH_NODE_TYPE(node);
1855
+ } else if (arg_count == 1) {
1856
+ /* Use first node from nodeset */
1857
+ struct leptris_xpath_result* arg_result = xpath_evaluate(context, args[0]);
1858
+ if (!arg_result) return NULL;
1859
+
1860
+ if (arg_result->type == XPATH_RESULT_NODESET) {
1861
+ XPathNodeSet* nodeset = arg_result->value.nodeset_value;
1862
+ if (nodeset && xpath_nodeset_count(nodeset) > 0) {
1863
+ node = xpath_nodeset_get(nodeset, 0);
1864
+ /* Synthetic attribute/namespace nodes are owned by
1865
+ * arg_result and die at the free below — copy the
1866
+ * string out while the node is still alive. */
1867
+ if (node) {
1868
+ int tag = (int)XPATH_NODE_TYPE(node);
1869
+ node_tag = tag;
1870
+ if (tag == LEPTRIS_NODE_ATTRIBUTE) {
1871
+ const char* u = ((LeptrisAttributeNode*)node)->namespace_uri;
1872
+ synth_uri = u ? leptris_strdup(u) : NULL;
1873
+ } else if (tag == LEPTRIS_NODE_NAMESPACE) {
1874
+ const char* u = ((LeptrisNamespaceNode*)node)->uri;
1875
+ synth_uri = u ? leptris_strdup(u) : NULL;
1876
+ }
1877
+ }
1878
+ }
1879
+ }
1880
+ xpath_result_free(arg_result);
1881
+ } else {
1882
+ snprintf(context->error_msg, sizeof(context->error_msg),
1883
+ "namespace-uri() requires 0 or 1 argument");
1884
+ return NULL;
1885
+ }
1886
+
1887
+ if (!node) {
1888
+ /* Return empty string for empty nodeset or no node */
1889
+ struct leptris_xpath_result* result = xpath_result_new(XPATH_RESULT_STRING);
1890
+ if (!result) return NULL;
1891
+ result->value.string_value = leptris_strdup("");
1892
+ return result;
1893
+ }
1894
+
1895
+ /* Get namespace URI */
1896
+ const char* uri = NULL;
1897
+ if (node_tag == LEPTRIS_NODE_ELEMENT) {
1898
+ uri = leptris_element_get_namespace_uri((LeptrisElement)node);
1899
+ } else if (synth_uri) {
1900
+ uri = synth_uri;
1901
+ }
1902
+
1903
+ struct leptris_xpath_result* result = xpath_result_new(XPATH_RESULT_STRING);
1904
+ if (!result) {
1905
+ LEPTRIS_FREE(synth_uri);
1906
+ return NULL;
1907
+ }
1908
+ result->value.string_value = uri ? leptris_strdup(uri) : leptris_strdup("");
1909
+ LEPTRIS_FREE(synth_uri);
1910
+ return result;
1911
+ }
1912
+
1913
+ /**
1914
+ * Get qualified name of a node
1915
+ * XPath: name(nodeset?)
1916
+ */
1917
+ static struct leptris_xpath_result* xpath_func_name(
1918
+ XPathContext* context,
1919
+ XPathASTNode** args,
1920
+ size_t arg_count
1921
+ ) {
1922
+ (void)context;
1923
+ void* node = NULL;
1924
+ char* synth_name = NULL; /* owned copy from a synthetic node */
1925
+ int node_tag = -1; /* captured before the arg result is freed */
1926
+
1927
+ /* Get context node if no argument */
1928
+ if (arg_count == 0) {
1929
+ node = context->context_node;
1930
+ if (node) {
1931
+ node_tag = (int)XPATH_NODE_TYPE(node);
1932
+ if (node_tag == LEPTRIS_NODE_ATTRIBUTE) {
1933
+ const char* n = ((LeptrisAttributeNode*)node)->name;
1934
+ synth_name = n ? leptris_strdup(n) : NULL;
1935
+ } else if (node_tag == LEPTRIS_NODE_NAMESPACE) {
1936
+ const char* n = ((LeptrisNamespaceNode*)node)->prefix;
1937
+ synth_name = n ? leptris_strdup(n) : NULL;
1938
+ } else if (node_tag == LEPTRIS_NODE_TYPE_PI) {
1939
+ const char* t = leptris_pi_get_target((LeptrisPINode*)node);
1940
+ synth_name = t ? leptris_strdup(t) : NULL;
1941
+ }
1942
+ }
1943
+ } else if (arg_count == 1) {
1944
+ /* Use first node from nodeset */
1945
+ struct leptris_xpath_result* arg_result = xpath_evaluate(context, args[0]);
1946
+ if (!arg_result) return NULL;
1947
+
1948
+ if (arg_result->type == XPATH_RESULT_NODESET) {
1949
+ XPathNodeSet* nodeset = arg_result->value.nodeset_value;
1950
+ if (nodeset && xpath_nodeset_count(nodeset) > 0) {
1951
+ node = xpath_nodeset_get(nodeset, 0);
1952
+ /* Synthetic attribute/namespace nodes are owned by
1953
+ * arg_result and die at the free below — copy the
1954
+ * strings out while the node is still alive. */
1955
+ if (node) {
1956
+ int tag = (int)XPATH_NODE_TYPE(node);
1957
+ node_tag = tag;
1958
+ if (tag == LEPTRIS_NODE_ATTRIBUTE) {
1959
+ const char* n = ((LeptrisAttributeNode*)node)->name;
1960
+ synth_name = n ? leptris_strdup(n) : NULL;
1961
+ } else if (tag == LEPTRIS_NODE_NAMESPACE) {
1962
+ const char* n = ((LeptrisNamespaceNode*)node)->prefix;
1963
+ synth_name = n ? leptris_strdup(n) : NULL;
1964
+ }
1965
+ }
1966
+ }
1967
+ }
1968
+ xpath_result_free(arg_result);
1969
+ } else {
1970
+ snprintf(context->error_msg, sizeof(context->error_msg),
1971
+ "name() requires 0 or 1 argument");
1972
+ return NULL;
1973
+ }
1974
+
1975
+ if (!node) {
1976
+ /* Return empty string for empty nodeset or no node */
1977
+ struct leptris_xpath_result* result = xpath_result_new(XPATH_RESULT_STRING);
1978
+ if (!result) return NULL;
1979
+ result->value.string_value = leptris_strdup("");
1980
+ return result;
1981
+ }
1982
+
1983
+ /* Get qualified name */
1984
+ const char* name = NULL;
1985
+ char* temp_name = NULL; /* For temporary allocations */
1986
+ if (node_tag == LEPTRIS_NODE_ELEMENT) {
1987
+ /* For elements, get qualified name (prefix:local if prefix exists) */
1988
+ LeptrisElement elem = (LeptrisElement)node;
1989
+ const char* local_name = leptris_element_get_name(elem);
1990
+ const char* prefix = leptris_element_get_prefix(elem);
1991
+
1992
+ if (prefix && prefix[0] != '\0') {
1993
+ /* Construct qualified name: prefix:local */
1994
+ size_t prefix_len = strlen(prefix);
1995
+ size_t local_len = strlen(local_name);
1996
+ temp_name = LEPTRIS_ALLOC_N(char, prefix_len + 1 + local_len + 1);
1997
+ if (temp_name) {
1998
+ memcpy(temp_name, prefix, prefix_len);
1999
+ temp_name[prefix_len] = ':';
2000
+ memcpy(temp_name + prefix_len + 1, local_name, local_len);
2001
+ temp_name[prefix_len + 1 + local_len] = '\0';
2002
+ name = temp_name;
2003
+ }
2004
+ } else {
2005
+ /* No prefix, just use local name */
2006
+ name = local_name;
2007
+ }
2008
+ } else if (synth_name) {
2009
+ /* Synthetic attribute node: qualified attribute name.
2010
+ * Synthetic namespace node: its prefix (the name of a
2011
+ * namespace node per XPath 1.0). */
2012
+ name = synth_name;
2013
+ }
2014
+
2015
+ struct leptris_xpath_result* result = xpath_result_new(XPATH_RESULT_STRING);
2016
+ if (!result) {
2017
+ if (temp_name) LEPTRIS_FREE(temp_name);
2018
+ LEPTRIS_FREE(synth_name);
2019
+ return NULL;
2020
+ }
2021
+ result->value.string_value = name ? leptris_strdup(name) : leptris_strdup("");
2022
+
2023
+ /* Free temporary allocation */
2024
+ if (temp_name) LEPTRIS_FREE(temp_name);
2025
+ LEPTRIS_FREE(synth_name);
2026
+
2027
+ return result;
2028
+ }
2029
+
2030
+ /**
2031
+ * Get elements by ID
2032
+ * XPath: id(string)
2033
+ */
2034
+ static struct leptris_xpath_result* xpath_func_id(
2035
+ XPathContext* context,
2036
+ XPathASTNode** args,
2037
+ size_t arg_count
2038
+ ) {
2039
+ if (arg_count != 1) {
2040
+ snprintf(context->error_msg, sizeof(context->error_msg),
2041
+ "id() requires exactly 1 argument");
2042
+ return NULL;
2043
+ }
2044
+
2045
+ /* Get ID string argument */
2046
+ struct leptris_xpath_result* arg_result = xpath_evaluate(context, args[0]);
2047
+ if (!arg_result) return NULL;
2048
+
2049
+ char* id_value = result_to_string(arg_result);
2050
+ if (!id_value) {
2051
+ xpath_result_free(arg_result);
2052
+ return NULL;
2053
+ }
2054
+
2055
+ /* Create nodeset result */
2056
+ XPathNodeSet* nodeset = xpath_nodeset_new();
2057
+ if (!nodeset) {
2058
+ LEPTRIS_FREE(id_value);
2059
+ xpath_result_free(arg_result);
2060
+ return NULL;
2061
+ }
2062
+
2063
+ /* Search document for elements with matching id attribute */
2064
+ LeptrisElement root = (LeptrisElement)context->document->new_dom_root;
2065
+ if (root && id_value[0] != '\0') {
2066
+ /* XPath spec: id(string) can contain multiple space-separated IDs */
2067
+ /* Tokenize the string and search for each ID */
2068
+ char* str = id_value;
2069
+ char* token;
2070
+ char* rest = str;
2071
+ while ((token = strtok_r(rest, " \t\n\r", &rest))) {
2072
+ find_elements_by_id(context->document, root, token, nodeset);
2073
+ }
2074
+ }
2075
+
2076
+ LEPTRIS_FREE(id_value);
2077
+ xpath_result_free(arg_result);
2078
+
2079
+ struct leptris_xpath_result* result = xpath_result_new(XPATH_RESULT_NODESET);
2080
+ if (!result) {
2081
+ xpath_nodeset_free(nodeset);
2082
+ return NULL;
2083
+ }
2084
+ result->value.nodeset_value = nodeset;
2085
+ return result;
2086
+ }
2087
+
2088
+ /* count(node-set) - Returns the number of nodes */
2089
+ static struct leptris_xpath_result* xpath_func_count(XPathContext* context,
2090
+ XPathASTNode** args,
2091
+ size_t arg_count
2092
+ ) {
2093
+ if (arg_count != 1) {
2094
+ snprintf(context->error_msg, sizeof(context->error_msg),
2095
+ "count() requires exactly 1 argument");
2096
+ return NULL;
2097
+ }
2098
+
2099
+ struct leptris_xpath_result* arg_result = xpath_evaluate(context, args[0]);
2100
+ if (!arg_result) return NULL;
2101
+
2102
+ /* XQuery 1.0+: count() accepts any sequence — an atomic
2103
+ * value is one item (QT3: count(fn:substring("",0)) = 1).
2104
+ * Empty sequences arrive as NULL results higher up. */
2105
+ size_t count = 1;
2106
+ if (arg_result->type == XPATH_RESULT_NODESET) {
2107
+ XPathNodeSet* nodeset = arg_result->value.nodeset_value;
2108
+ count = nodeset ? xpath_nodeset_count(nodeset) : 0;
2109
+ }
2110
+ xpath_result_free(arg_result);
2111
+
2112
+ struct leptris_xpath_result* result = xpath_result_new(XPATH_RESULT_NUMBER);
2113
+ if (!result) return NULL;
2114
+ result->value.number_value = (double)count;
2115
+ return result;
2116
+ }
2117
+
2118
+ /* ============================================================================
2119
+ * XPath Language Functions
2120
+ * ============================================================================ */
2121
+
2122
+ /* Helper: Check if target language is a sublanguage of specified language */
2123
+ static int _tb_is_sublanguage(const char* lang, const char* target) {
2124
+ /* Per XPath spec: lang('en') matches 'en', 'en-US', 'en-GB', etc. */
2125
+ if (!lang || !target) return 0;
2126
+
2127
+ size_t lang_len = strlen(lang);
2128
+ size_t target_len = strlen(target);
2129
+
2130
+ /* Target must be at least as long as lang */
2131
+ if (target_len < lang_len) return 0;
2132
+
2133
+ /* Check if target starts with lang (case-insensitive) */
2134
+ if (strncasecmp(lang, target, lang_len) != 0) return 0;
2135
+
2136
+ /* If lengths match, it's an exact match */
2137
+ if (target_len == lang_len) return 1;
2138
+
2139
+ /* If target is longer, next char must be '-' for sublanguage */
2140
+ return (target[lang_len] == '-');
2141
+ }
2142
+
2143
+ /* lang(string) - Check xml:lang matches */
2144
+ static struct leptris_xpath_result* xpath_func_lang(XPathContext* context,
2145
+ XPathASTNode** args,
2146
+ size_t arg_count
2147
+ ) {
2148
+ if (arg_count != 1) {
2149
+ snprintf(context->error_msg, sizeof(context->error_msg),
2150
+ "lang() requires exactly 1 argument, got %zu", arg_count);
2151
+ return NULL;
2152
+ }
2153
+
2154
+ struct leptris_xpath_result* arg_result = xpath_evaluate(context, args[0]);
2155
+ if (!arg_result) return NULL;
2156
+
2157
+ /* §3.2 argument coercion: any type converts via string() —
2158
+ * libxslt stylesheets call lang(ja) with an element-name
2159
+ * argument (empty nodeset -> ""), which is false, not an error
2160
+ * (libxslt bug-142 surfaced this through issue 627's raise). */
2161
+ char* language = result_to_string(arg_result);
2162
+ xpath_result_free(arg_result);
2163
+
2164
+ /* Walk up the ancestor chain looking for xml:lang attribute */
2165
+ /* XML namespace URI for xml:lang */
2166
+ const char* xml_ns_uri = "http://www.w3.org/XML/1998/namespace";
2167
+ int match = 0;
2168
+
2169
+ /* Start from context node and go up through ancestors */
2170
+ LeptrisElement node = (LeptrisElement)context->context_node;
2171
+ while (node && !match) {
2172
+
2173
+ /* Check for xml:lang attribute (in XML namespace) */
2174
+ /* First try by namespace URI */
2175
+ const char* lang_attr = NULL;
2176
+
2177
+ /* Check attributes with namespace URI - walk linked list.
2178
+ *
2179
+ * TODO 34: route StringView conversions through the document
2180
+ * pool so we don't have to manually free() each one. */
2181
+ struct leptris_attribute* attr = leptris_element_get_first_attribute(node);
2182
+ while (attr && !lang_attr) {
2183
+ if (!attr) continue;
2184
+
2185
+ LeptrisMemoryPool* pool = context->document ? context->document->pool : NULL;
2186
+
2187
+ /* Get namespace URI (TODO 173: via ns_cache side table) */
2188
+ const char* ns_uri = attr_get_namespace_uri(attr);
2189
+ if (!ns_uri) {
2190
+ LeptrisStringView ns_view = attr_get_namespace_uri_view(attr);
2191
+ if (!leptris_sv_is_empty(&ns_view)) {
2192
+ ns_uri = pool
2193
+ ? leptris_sv_to_cstr_pooled(&ns_view, pool)
2194
+ : leptris_sv_to_cstr(&ns_view);
2195
+ }
2196
+ }
2197
+
2198
+ /* Get attribute name (single representation: the view IS
2199
+ * the NUL-terminated string; no conversion, no free). */
2200
+ const char* attr_name = attr_cname(attr);
2201
+
2202
+ /* Check if this is xml:lang (try by namespace URI, by prefixed name, or by prefix) */
2203
+ int is_xml_lang_attr = 0;
2204
+ if (attr_name) {
2205
+ /* Check for plain "lang" name (namespace should be XML namespace) */
2206
+ if (strcmp(attr_name, "lang") == 0) {
2207
+ is_xml_lang_attr = 1;
2208
+ }
2209
+ /* Also check for "xml:lang" prefixed form (when stored with prefix) */
2210
+ else if (strcmp(attr_name, "xml:lang") == 0) {
2211
+ is_xml_lang_attr = 1;
2212
+ }
2213
+ }
2214
+
2215
+ if (is_xml_lang_attr) {
2216
+ /* Check by namespace URI first */
2217
+ int is_xml_lang = 0;
2218
+ if (ns_uri && strcmp(ns_uri, xml_ns_uri) == 0) {
2219
+ is_xml_lang = 1;
2220
+ }
2221
+ /* Also check if the prefix is "xml" (for compatibility) */
2222
+ else {
2223
+ const char* prefix = attr_get_prefix(attr);
2224
+ if (!prefix) {
2225
+ LeptrisStringView pfx_view = attr_get_prefix_view(attr);
2226
+ if (!leptris_sv_is_empty(&pfx_view)) {
2227
+ LeptrisMemoryPool* pool2 = context->document ? context->document->pool : NULL;
2228
+ prefix = pool2
2229
+ ? leptris_sv_to_cstr_pooled(&pfx_view, pool2)
2230
+ : leptris_sv_to_cstr(&pfx_view);
2231
+ }
2232
+ }
2233
+ if (prefix && strcmp(prefix, "xml") == 0) {
2234
+ is_xml_lang = 1;
2235
+ }
2236
+ /* Pool-owned: nothing to free. */
2237
+ }
2238
+
2239
+ /* Also check if there's no namespace URI at all (xml:lang might be stored without ns) */
2240
+ if (!is_xml_lang && !ns_uri) {
2241
+ /* This might be xml:lang stored without namespace information */
2242
+ is_xml_lang = 1;
2243
+ }
2244
+
2245
+ if (is_xml_lang) {
2246
+ lang_attr = attr_cvalue(attr);
2247
+ }
2248
+ }
2249
+
2250
+ /* Pool-routed conversions (TODO 34) don't need free.
2251
+ * Only legacy calloc'd intermediates need explicit free. */
2252
+ LeptrisMemoryPool* free_pool = context->document ? context->document->pool : NULL;
2253
+ if (!free_pool) {
2254
+ if (attr_get_namespace_uri(attr) != ns_uri && ns_uri) free((char*)ns_uri);
2255
+ }
2256
+ /* Pool-allocated: pool will reclaim on document free. */
2257
+
2258
+ attr = leptris_attr_next(attr);
2259
+ }
2260
+
2261
+ /* Check if we found xml:lang attribute — §4.3: the NEAREST
2262
+ * declaration decides. A closer non-matching declaration
2263
+ * ends the search; do not walk past it to outer ancestors
2264
+ * (libxslt bug-142: ja span inside an fr root). */
2265
+ if (lang_attr && lang_attr[0] != '\0') {
2266
+ match = _tb_is_sublanguage(language, lang_attr);
2267
+ break;
2268
+ }
2269
+
2270
+ /* Move to parent if no match */
2271
+ if (!match) {
2272
+ /* Get parent element */
2273
+ LeptrisElement parent = leptris_element_get_parent(node);
2274
+ if (parent) {
2275
+ node = parent;
2276
+ } else {
2277
+ break; /* Reached root */
2278
+ }
2279
+ }
2280
+ }
2281
+
2282
+ /* Create result */
2283
+ struct leptris_xpath_result* result = xpath_result_new(XPATH_RESULT_BOOLEAN);
2284
+ if (!result) {
2285
+ LEPTRIS_FREE(language);
2286
+ return NULL;
2287
+ }
2288
+ result->value.boolean_value = match;
2289
+
2290
+ LEPTRIS_FREE(language);
2291
+ return result;
2292
+ }
2293
+
2294
+ /* ---- XPath 2.0+ string functions (XSLT 3.0) ---- */
2295
+
2296
+ /* upper-case(string) */
2297
+ static struct leptris_xpath_result* xpath_func_upper_case(
2298
+ XPathContext* context, XPathASTNode** args, size_t arg_count
2299
+ ) {
2300
+ struct leptris_xpath_result* arg = xpath_evaluate(context, args[0]);
2301
+ if (!arg) return NULL;
2302
+ char* src = result_to_string(arg);
2303
+ xpath_result_free(arg);
2304
+ if (!src) return NULL;
2305
+ size_t n = strlen(src);
2306
+ char* out = LEPTRIS_ALLOC_N(char, n + 1);
2307
+ if (!out) { LEPTRIS_FREE(src); return NULL; }
2308
+ for (size_t i = 0; i < n; i++) {
2309
+ unsigned char c = (unsigned char)src[i];
2310
+ out[i] = (char)((c >= 'a' && c <= 'z') ? c - 32 : c);
2311
+ }
2312
+ out[n] = 0;
2313
+ LEPTRIS_FREE(src);
2314
+ struct leptris_xpath_result* result =
2315
+ xpath_result_new(XPATH_RESULT_STRING);
2316
+ if (!result) { LEPTRIS_FREE(out); return NULL; }
2317
+ result->value.string_value = out;
2318
+ return result;
2319
+ }
2320
+
2321
+ /* lower-case(string) */
2322
+ static struct leptris_xpath_result* xpath_func_lower_case(
2323
+ XPathContext* context, XPathASTNode** args, size_t arg_count
2324
+ ) {
2325
+ struct leptris_xpath_result* arg = xpath_evaluate(context, args[0]);
2326
+ if (!arg) return NULL;
2327
+ char* src = result_to_string(arg);
2328
+ xpath_result_free(arg);
2329
+ if (!src) return NULL;
2330
+ size_t n = strlen(src);
2331
+ char* out = LEPTRIS_ALLOC_N(char, n + 1);
2332
+ if (!out) { LEPTRIS_FREE(src); return NULL; }
2333
+ for (size_t i = 0; i < n; i++) {
2334
+ unsigned char c = (unsigned char)src[i];
2335
+ out[i] = (char)((c >= 'A' && c <= 'Z') ? c + 32 : c);
2336
+ }
2337
+ out[n] = 0;
2338
+ LEPTRIS_FREE(src);
2339
+ struct leptris_xpath_result* result =
2340
+ xpath_result_new(XPATH_RESULT_STRING);
2341
+ if (!result) { LEPTRIS_FREE(out); return NULL; }
2342
+ result->value.string_value = out;
2343
+ return result;
2344
+ }
2345
+
2346
+ /* string-join(sequence, separator): joins each member's string form.
2347
+ * A nodeset joins per-node (the sequence's members); a scalar is a
2348
+ * one-member sequence. */
2349
+ static struct leptris_xpath_result* xpath_func_string_join(
2350
+ XPathContext* context, XPathASTNode** args, size_t arg_count
2351
+ ) {
2352
+ struct leptris_xpath_result* seq = xpath_evaluate(context, args[0]);
2353
+ if (!seq) return NULL;
2354
+ /* XPath 3.1 one-arg form: separator defaults to the zero-length
2355
+ * string ($f(('a','b')) via string-join#1 depends on it). */
2356
+ char* sep;
2357
+ if (arg_count >= 2) {
2358
+ struct leptris_xpath_result* sep_r = xpath_evaluate(context, args[1]);
2359
+ if (!sep_r) { xpath_result_free(seq); return NULL; }
2360
+ sep = result_to_string(sep_r);
2361
+ xpath_result_free(sep_r);
2362
+ if (!sep) { xpath_result_free(seq); return NULL; }
2363
+ } else {
2364
+ sep = (char*)LEPTRIS_ALLOC_N(char, 1);
2365
+ if (!sep) { xpath_result_free(seq); return NULL; }
2366
+ sep[0] = 0;
2367
+ }
2368
+ size_t sep_len = strlen(sep);
2369
+
2370
+ size_t cap = 64, len = 0;
2371
+ char* acc = (char*)LEPTRIS_ALLOC_N(char, cap);
2372
+ if (!acc) { LEPTRIS_FREE(sep); xpath_result_free(seq); return NULL; }
2373
+ acc[0] = 0;
2374
+
2375
+ size_t n = 1;
2376
+ XPathNodeSet* ns = NULL;
2377
+ if (seq->type == XPATH_RESULT_NODESET &&
2378
+ seq->value.nodeset_value) {
2379
+ ns = seq->value.nodeset_value;
2380
+ n = ns->count;
2381
+ }
2382
+ for (size_t i = 0; i < n; i++) {
2383
+ char* piece;
2384
+ if (ns) {
2385
+ piece = get_node_text(ns->nodes[i]);
2386
+ } else {
2387
+ piece = result_to_string(seq);
2388
+ }
2389
+ if (!piece) piece = (char*)calloc(1, 1);
2390
+ size_t pl = strlen(piece);
2391
+ if (i > 0 && sep_len) {
2392
+ while (len + sep_len + pl + 1 > cap) cap *= 2;
2393
+ char* grown = (char*)realloc(acc, cap);
2394
+ if (!grown) { free(piece); break; }
2395
+ acc = grown;
2396
+ memcpy(acc + len, sep, sep_len);
2397
+ len += sep_len;
2398
+ } else {
2399
+ while (len + pl + 1 > cap) cap *= 2;
2400
+ char* grown = (char*)realloc(acc, cap);
2401
+ if (!grown) { free(piece); break; }
2402
+ acc = grown;
2403
+ }
2404
+ memcpy(acc + len, piece, pl + 1);
2405
+ len += pl;
2406
+ free(piece);
2407
+ if (!ns) break; /* scalar sequence: one member */
2408
+ }
2409
+ LEPTRIS_FREE(sep);
2410
+ xpath_result_free(seq);
2411
+
2412
+ struct leptris_xpath_result* result =
2413
+ xpath_result_new(XPATH_RESULT_STRING);
2414
+ if (!result) { free(acc); return NULL; }
2415
+ result->value.string_value = acc;
2416
+ return result;
2417
+ }
2418
+
2419
+ /* ============================================================================
2420
+ * XPath 1.0 Functions Initialization
2421
+ * ============================================================================ */
2422
+
2423
+ /* Array of all supported function names (NULL-terminated) */
2424
+ static const char* g_supported_functions[] = {
2425
+ /* Core */
2426
+ "last",
2427
+ "position",
2428
+ /* String */
2429
+ "string",
2430
+ "concat",
2431
+ "starts-with",
2432
+ "contains",
2433
+ "substring-before",
2434
+ "substring-after",
2435
+ "substring",
2436
+ "string-length",
2437
+ "normalize-space",
2438
+ "translate",
2439
+ /* XPath 2.0+ (XSLT 3.0) */
2440
+ "upper-case",
2441
+ "lower-case",
2442
+ "string-join",
2443
+ /* Boolean */
2444
+ "boolean",
2445
+ "not",
2446
+ "true",
2447
+ "false",
2448
+ "lang",
2449
+ /* Number */
2450
+ "number",
2451
+ "sum",
2452
+ "floor",
2453
+ "ceiling",
2454
+ "round",
2455
+ /* Node-set */
2456
+ "count",
2457
+ "id",
2458
+ "local-name",
2459
+ "namespace-uri",
2460
+ "name",
2461
+ NULL /* Terminator */
2462
+ };
2463
+
2464
+ /**
2465
+ * Check if XPath function is supported
2466
+ */
2467
+ LEPTRIS_API int leptris_xpath_function_supported(const char* function_name) {
2468
+ if (!function_name) return 0;
2469
+
2470
+ for (size_t i = 0; g_supported_functions[i] != NULL; i++) {
2471
+ if (strcmp(function_name, g_supported_functions[i]) == 0) {
2472
+ return 1;
2473
+ }
2474
+ }
2475
+ return 0;
2476
+ }
2477
+
2478
+ /**
2479
+ * Get list of supported XPath functions
2480
+ */
2481
+ LEPTRIS_API const char** leptris_xpath_supported_functions(void) {
2482
+ return g_supported_functions;
2483
+ }
2484
+
2485
+ /* ============================================================================
2486
+ * Standard Function Registry Initialization
2487
+ * ============================================================================ */
2488
+
2489
+ /**
2490
+ * Initialize standard XPath 1.0 functions
2491
+ * Registers all implemented XPath 1.0 functions in the registry
2492
+ */
2493
+ void xpath_function_registry_init_standard(XPathFunctionRegistry* registry) {
2494
+ if (!registry) return;
2495
+
2496
+ /* Core functions (2) */
2497
+ xpath_function_registry_register(registry, "last", xpath_func_last, 0, 0);
2498
+ xpath_function_registry_register(registry, "position", xpath_func_position, 0, 0);
2499
+
2500
+ /* String functions (10 implemented) */
2501
+ xpath_function_registry_register(registry, "string", xpath_func_string, 0, 1);
2502
+ xpath_function_registry_register(registry, "concat", xpath_func_concat, 2, -1);
2503
+ xpath_function_registry_register(registry, "starts-with", xpath_func_starts_with, 2, 3);
2504
+ xpath_function_registry_register(registry, "ends-with", xpath_func_ends_with, 2, 3);
2505
+ xpath_function_registry_register(registry, "deep-equal", xpath_func_deep_equal, 2, 2);
2506
+ xpath_function_registry_register(registry, "contains", xpath_func_contains, 2, 3);
2507
+ xpath_function_registry_register(registry, "substring", xpath_func_substring, 2, 3);
2508
+ xpath_function_registry_register(registry, "substring-before", xpath_func_substring_before, 2, 2);
2509
+ xpath_function_registry_register(registry, "substring-after", xpath_func_substring_after, 2, 2);
2510
+ xpath_function_registry_register(registry, "string-length", xpath_func_string_length, 0, 1);
2511
+ xpath_function_registry_register(registry, "normalize-space", xpath_func_normalize_space, 0, 1);
2512
+ xpath_function_registry_register(registry, "translate", xpath_func_translate, 3, 3);
2513
+
2514
+ /* XPath 2.0+ string functions (XSLT 3.0) */
2515
+ xpath_function_registry_register(registry, "upper-case", xpath_func_upper_case, 1, 1);
2516
+ xpath_function_registry_register(registry, "lower-case", xpath_func_lower_case, 1, 1);
2517
+ xpath_function_registry_register(registry, "string-join", xpath_func_string_join, 1, 2);
2518
+
2519
+ /* Boolean functions (5) */
2520
+ xpath_function_registry_register(registry, "boolean", xpath_func_boolean, 1, 1);
2521
+ xpath_function_registry_register(registry, "not", xpath_func_not, 1, 1);
2522
+ xpath_function_registry_register(registry, "true", xpath_func_true, 0, 0);
2523
+ xpath_function_registry_register(registry, "false", xpath_func_false, 0, 0);
2524
+ xpath_function_registry_register(registry, "lang", xpath_func_lang, 1, 1);
2525
+
2526
+ /* Number functions (5) */
2527
+ xpath_function_registry_register(registry, "number", xpath_func_number, 0, 1);
2528
+ xpath_function_registry_register(registry, "sum", xpath_func_sum, 1, 1);
2529
+ xpath_function_registry_register(registry, "floor", xpath_func_floor, 1, 1);
2530
+ xpath_function_registry_register(registry, "ceiling", xpath_func_ceiling, 1, 1);
2531
+ xpath_function_registry_register(registry, "round", xpath_func_round, 1, 2);
2532
+
2533
+ /* Node-set functions (5 implemented) */
2534
+ xpath_function_registry_register(registry, "count", xpath_func_count, 1, 1);
2535
+ xpath_function_registry_register(registry, "id", xpath_func_id, 1, 1);
2536
+
2537
+ /* XPath 2.0/3.1 extension families (TODO.xslt-full 01/02/03):
2538
+ * sequences, math:, the regex trio. */
2539
+ extern void xpath_register_fn31(XPathFunctionRegistry*);
2540
+ xpath_register_fn31(registry);
2541
+ xpath_function_registry_register(registry, "local-name", xpath_func_local_name, 0, 1);
2542
+ xpath_function_registry_register(registry, "namespace-uri", xpath_func_namespace_uri, 0, 1);
2543
+ xpath_function_registry_register(registry, "name", xpath_func_name, 0, 1);
2544
+ }