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,2992 @@
1
+ /* parser.c - XPath parser implementation
2
+ * Copyright (c) 2024, Ribose Inc.
3
+ *
4
+ * Pure C implementation of XPath 1.0 parser.
5
+ * Uses token buffer for lookahead (matches leptris_internal.h).
6
+ */
7
+
8
+ #include "parser.h"
9
+ #include "lexer.h"
10
+ #include "evaluator_internal.h" /* xpath_axis_from_name (TODO 113) */
11
+ #include "../leptris_internal.h"
12
+ #include <string.h>
13
+ #include <stdlib.h>
14
+ #include <stdio.h>
15
+ #include <ctype.h>
16
+
17
+ /* ============================================================================
18
+ * Forward Declarations
19
+ * ============================================================================ */
20
+
21
+ /* Expression parsers (precedence order) */
22
+ static XPathASTNode* parse_expr(XPathParser* parser);
23
+ static XPathASTNode* parse_or_expr(XPathParser* parser);
24
+ static XPathASTNode* parse_and_expr(XPathParser* parser);
25
+ static XPathASTNode* parse_equality_expr(XPathParser* parser);
26
+ static XPathASTNode* parse_relational_expr(XPathParser* parser);
27
+ static XPathASTNode* parse_additive_expr(XPathParser* parser);
28
+ static XPathASTNode* parse_multiplicative_expr(XPathParser* parser);
29
+ static XPathASTNode* parse_unary_expr(XPathParser* parser);
30
+ static XPathASTNode* parse_union_expr(XPathParser* parser);
31
+ static XPathASTNode* parse_arrow_expr(XPathParser* parser);
32
+
33
+ /* Path parsers */
34
+ static XPathASTNode* parse_path_expr(XPathParser* parser);
35
+ static XPathASTNode* parse_filter_expr(XPathParser* parser);
36
+ static XPathASTNode* parse_primary_expr(XPathParser* parser);
37
+ static XPathASTNode* parse_postfix_ops(XPathParser* parser,
38
+ XPathASTNode* expr);
39
+ static XPathASTNode* parse_if_expr(XPathParser* parser);
40
+ static XPathASTNode* parse_for_expr(XPathParser* parser);
41
+ static XPathASTNode* parse_let_expr(XPathParser* parser);
42
+ static XPathASTNode* parse_quantified_expr(XPathParser* parser);
43
+ static XPathASTNode* parse_switch_expr(XPathParser* parser);
44
+ static int token_starts_path(XPathToken* t);
45
+ /* Saxon-HE rejects switch in XPath EXPRESSIONS (XPST0003 — the
46
+ * syntax is XSLT 3.0 PATTERN-only). parse_switch_expr lands with
47
+ * pattern support (TODO.xslt-full/06). */
48
+ #if 0
49
+ static XPathASTNode* parse_switch_expr(XPathParser* parser);
50
+ #endif
51
+ static XPathASTNode* parse_location_path(XPathParser* parser);
52
+ static XPathASTNode* parse_relative_location_path(XPathParser* parser);
53
+ static XPathASTNode* parse_step(XPathParser* parser);
54
+
55
+ /* Node test and predicate parsers */
56
+ static XPathASTNode* parse_node_test(XPathParser* parser);
57
+ static XPathASTNode* parse_predicate(XPathParser* parser);
58
+ static XPathASTNode* parse_function_call(XPathParser* parser, const char* name, size_t name_len);
59
+
60
+ /* Token management */
61
+ static void advance_token(XPathParser* parser);
62
+ static XPathToken* peek_token(XPathParser* parser, int offset);
63
+ static XPathToken* current_token(XPathParser* parser);
64
+ static int current_token_is(XPathParser* parser, XPathTokenType type);
65
+ static int match_token(XPathParser* parser, XPathTokenType type);
66
+ static int consume_token(XPathParser* parser, XPathTokenType type, const char* error_msg);
67
+
68
+ /* AST helpers */
69
+ static char* token_to_string(const XPathToken* token);
70
+ static XPathASTNode* create_operator_node(XPathOperatorType op_type,
71
+ XPathASTNode* left,
72
+ XPathASTNode* right);
73
+
74
+ /* ============================================================================
75
+ * Parser Lifecycle
76
+ * ============================================================================ */
77
+
78
+ XPathParser* xpath_parser_new(const char* input, size_t len) {
79
+ if (!input) return NULL;
80
+
81
+ XPathParser* parser = LEPTRIS_ALLOC(XPathParser);
82
+ if (!parser) return NULL;
83
+
84
+ parser->lexer = xpath_lexer_new(input, len);
85
+ if (!parser->lexer) {
86
+ LEPTRIS_FREE(parser);
87
+ return NULL;
88
+ }
89
+
90
+ parser->tokens = NULL;
91
+ parser->token_count = 0;
92
+ parser->token_pos = 0;
93
+ parser->error_msg[0] = '\0';
94
+
95
+ /* Tokenize entire input into array */
96
+ size_t capacity = 16;
97
+ parser->tokens = LEPTRIS_ALLOC_N(XPathToken, capacity);
98
+ if (!parser->tokens) {
99
+ xpath_lexer_free(parser->lexer);
100
+ LEPTRIS_FREE(parser);
101
+ return NULL;
102
+ }
103
+
104
+ /* Read all tokens */
105
+ while (1) {
106
+ XPathToken tok = xpath_lexer_next_token(parser->lexer);
107
+
108
+ /* Grow array if needed */
109
+ if (parser->token_count >= capacity) {
110
+ capacity *= 2;
111
+ XPathToken* new_tokens = LEPTRIS_REALLOC_N(parser->tokens, XPathToken, capacity);
112
+ if (!new_tokens) {
113
+ LEPTRIS_FREE(parser->tokens);
114
+ xpath_lexer_free(parser->lexer);
115
+ LEPTRIS_FREE(parser);
116
+ return NULL;
117
+ }
118
+ parser->tokens = new_tokens;
119
+ }
120
+
121
+ parser->tokens[parser->token_count++] = tok;
122
+
123
+ if (tok.type == TOK_EOF) break;
124
+ }
125
+
126
+ return parser;
127
+ }
128
+
129
+ void xpath_parser_free(XPathParser* parser) {
130
+ if (!parser) return;
131
+ if (parser->tokens) {
132
+ LEPTRIS_FREE(parser->tokens);
133
+ }
134
+ if (parser->lexer) {
135
+ xpath_lexer_free(parser->lexer);
136
+ }
137
+ LEPTRIS_FREE(parser);
138
+ }
139
+
140
+ const char* xpath_parser_error(XPathParser* parser) {
141
+ if (!parser) return "Invalid parser";
142
+ return parser->error_msg[0] ? parser->error_msg : NULL;
143
+ }
144
+
145
+ /* ============================================================================
146
+ * AST Node Management
147
+ * ============================================================================ */
148
+
149
+ static XPathASTNode* ast_node_new(XPathASTType type) {
150
+ XPathASTNode* node = LEPTRIS_ALLOC(XPathASTNode);
151
+ if (!node) return NULL;
152
+
153
+ node->type = type;
154
+ node->value = NULL;
155
+ node->number_value = 0.0;
156
+ node->children = NULL;
157
+ node->child_count = 0;
158
+ node->child_capacity = 0;
159
+ node->axis_id = XPATH_AXIS_CHILD;
160
+
161
+ /* Initialize namespace support fields (v0.8.0) */
162
+ node->prefix = NULL;
163
+ node->local_name = NULL;
164
+
165
+ return node;
166
+ }
167
+
168
+ void ast_node_free(XPathASTNode* node) {
169
+ if (!node) return;
170
+
171
+ if (node->value) {
172
+ LEPTRIS_FREE(node->value);
173
+ }
174
+
175
+ /* Free namespace support fields (v0.8.0) */
176
+ if (node->prefix) {
177
+ LEPTRIS_FREE(node->prefix);
178
+ }
179
+ if (node->local_name) {
180
+ LEPTRIS_FREE(node->local_name);
181
+ }
182
+
183
+ if (node->children) {
184
+ for (size_t i = 0; i < node->child_count; i++) {
185
+ ast_node_free(node->children[i]);
186
+ }
187
+ LEPTRIS_FREE(node->children);
188
+ }
189
+
190
+ LEPTRIS_FREE(node);
191
+ }
192
+
193
+ static void ast_node_add_child(XPathASTNode* parent, XPathASTNode* child) {
194
+ if (!parent || !child) return;
195
+
196
+ /* Resize if needed */
197
+ if (parent->child_count >= parent->child_capacity) {
198
+ size_t new_capacity = parent->child_capacity == 0 ? 4 : parent->child_capacity * 2;
199
+ XPathASTNode** new_children = LEPTRIS_REALLOC_N(parent->children, XPathASTNode*, new_capacity);
200
+ if (!new_children) return;
201
+ parent->children = new_children;
202
+ parent->child_capacity = new_capacity;
203
+ }
204
+
205
+ parent->children[parent->child_count++] = child;
206
+ }
207
+
208
+ /* ============================================================================
209
+ * Token Management
210
+ * ============================================================================ */
211
+
212
+ static XPathToken* current_token(XPathParser* parser) {
213
+ if (!parser || parser->token_pos >= parser->token_count) return NULL;
214
+ return &parser->tokens[parser->token_pos];
215
+ }
216
+
217
+ static void advance_token(XPathParser* parser) {
218
+ if (!parser) return;
219
+ if (parser->token_pos < parser->token_count) {
220
+ parser->token_pos++;
221
+ }
222
+ }
223
+
224
+ static XPathToken* peek_token(XPathParser* parser, int offset) {
225
+ if (!parser) return NULL;
226
+ size_t pos = parser->token_pos + offset;
227
+ if (pos >= parser->token_count) return NULL;
228
+ return &parser->tokens[pos];
229
+ }
230
+
231
+ static int current_token_is(XPathParser* parser, XPathTokenType type) {
232
+ XPathToken* tok = current_token(parser);
233
+ return tok && (int)tok->type == (int)type;
234
+ }
235
+
236
+ static int match_token(XPathParser* parser, XPathTokenType type) {
237
+ if (!parser) return 0;
238
+ if (current_token_is(parser, type)) {
239
+ advance_token(parser);
240
+ return 1;
241
+ }
242
+ return 0;
243
+ }
244
+
245
+ static int consume_token(XPathParser* parser, XPathTokenType type, const char* error_msg) {
246
+ if (!parser) return 0;
247
+ XPathToken* tok = current_token(parser);
248
+ if (tok && (int)tok->type == (int)type) {
249
+ advance_token(parser);
250
+ return 1;
251
+ }
252
+ if (tok && parser->lexer && parser->lexer->input) {
253
+ /* Calculate byte offset from token position */
254
+ size_t byte_offset = (tok->value && tok->value >= parser->lexer->input)
255
+ ? tok->value - parser->lexer->input
256
+ : 0;
257
+
258
+ /* Build detailed error message */
259
+ char detailed_msg[512];
260
+ snprintf(detailed_msg, sizeof(detailed_msg),
261
+ "%s (got %s)",
262
+ error_msg,
263
+ xpath_token_type_to_string(tok->type));
264
+
265
+ leptris_set_error_with_context(
266
+ LEPTRIS_ERROR_XPATH_SYNTAX,
267
+ detailed_msg,
268
+ parser->lexer->input,
269
+ byte_offset,
270
+ tok->line,
271
+ tok->column
272
+ );
273
+
274
+ /* Also store in parser for legacy compatibility */
275
+ snprintf(parser->error_msg, sizeof(parser->error_msg),
276
+ "%s at line %d, column %d (got %s)",
277
+ error_msg, tok->line, tok->column,
278
+ xpath_token_type_to_string(tok->type));
279
+ } else if (parser->lexer && parser->lexer->input) {
280
+ size_t byte_offset = (parser->lexer->end && parser->lexer->end >= parser->lexer->input)
281
+ ? parser->lexer->end - parser->lexer->input
282
+ : 0;
283
+
284
+ leptris_set_error_with_context(
285
+ LEPTRIS_ERROR_XPATH_SYNTAX,
286
+ error_msg,
287
+ parser->lexer->input,
288
+ byte_offset,
289
+ parser->lexer->line,
290
+ parser->lexer->column
291
+ );
292
+
293
+ snprintf(parser->error_msg, sizeof(parser->error_msg),
294
+ "%s at EOF", error_msg);
295
+ } else {
296
+ /* Fallback: set error without context */
297
+ snprintf(parser->error_msg, sizeof(parser->error_msg),
298
+ "%s", error_msg);
299
+ }
300
+ return 0;
301
+ }
302
+
303
+ /* ============================================================================
304
+ * Helper Functions
305
+ * ============================================================================ */
306
+
307
+ static char* token_to_string(const XPathToken* token) {
308
+ if (!token || token->value_len == 0) return NULL;
309
+
310
+ char* str = LEPTRIS_ALLOC_N(char, token->value_len + 1);
311
+ if (!str) return NULL;
312
+
313
+ memcpy(str, token->value, token->value_len);
314
+ str[token->value_len] = '\0';
315
+ return str;
316
+ }
317
+
318
+ static XPathASTNode* create_operator_node(XPathOperatorType op_type,
319
+ XPathASTNode* left,
320
+ XPathASTNode* right) {
321
+ XPathASTNode* node = ast_node_new(XPATH_AST_OPERATOR);
322
+ if (!node) {
323
+ ast_node_free(left);
324
+ ast_node_free(right);
325
+ return NULL;
326
+ }
327
+
328
+ node->number_value = (double)op_type;
329
+ ast_node_add_child(node, left);
330
+ ast_node_add_child(node, right);
331
+ return node;
332
+ }
333
+
334
+ /* ============================================================================
335
+ * Main Parser Entry Point
336
+ * ============================================================================ */
337
+
338
+ static int ncname_is(XPathToken* t, const char* kw, size_t kwlen) {
339
+ return t && t->type == TOK_NCNAME && t->value_len == kwlen &&
340
+ memcmp(t->value, kw, kwlen) == 0;
341
+ }
342
+
343
+ /* SequenceType v1 (TODO.xslt-full/06): a prefixed name arrives as
344
+ * one TOK_QNAME (xs:integer); a bare NCNAME may be a KindTest
345
+ * (node()/item()) with an argument list. Occurrence indicators:
346
+ * '*' and '+' only ('?' has no lexer token). Returns a malloc'd
347
+ * "name[()]" + indicator string, NULL on parse failure. */
348
+ /* Can this token begin a primary/unary expression? Decides whether
349
+ * `*`/`+` after a SequenceType is an occurrence indicator or the
350
+ * multiplication/addition operator (`'12' cast as xs:integer + 1`
351
+ * — the operator; `'a' instance of xs:string*` at EOF — the
352
+ * indicator). */
353
+ static int token_begins_expr(XPathTokenType t) {
354
+ switch (t) {
355
+ case TOK_NUMBER: case TOK_STRING: case TOK_NCNAME: case TOK_QNAME:
356
+ case TOK_DOLLAR: case TOK_LPAREN: case TOK_DOT: case TOK_DOUBLE_DOT:
357
+ case TOK_SLASH: case TOK_DOUBLE_SLASH: case TOK_AT: case TOK_MINUS:
358
+ case TOK_NODE: case TOK_TEXT: case TOK_COMMENT:
359
+ case TOK_PROCESSING_INSTRUCTION:
360
+ return 1;
361
+ default:
362
+ return 0;
363
+ }
364
+ }
365
+
366
+ static char* parse_sequence_type(XPathParser* parser) {
367
+ XPathToken* t = current_token(parser);
368
+ /* The lexer keyword-tokenizes node tests — `text()`,
369
+ * `comment()`, `processing-instruction()` are type names here
370
+ * too (issue #744). */
371
+ if (!t || (t->type != TOK_NCNAME && t->type != TOK_QNAME &&
372
+ t->type != TOK_NODE && t->type != TOK_TEXT &&
373
+ t->type != TOK_COMMENT &&
374
+ t->type != TOK_PROCESSING_INSTRUCTION))
375
+ return NULL;
376
+ char buf[96];
377
+ size_t len = t->value_len;
378
+ if (len >= sizeof(buf) - 4) return NULL;
379
+ memcpy(buf, t->value, len);
380
+ buf[len] = '\0';
381
+ advance_token(parser);
382
+ /* KindTest argument list: node() / item(). */
383
+ if (current_token_is(parser, TOK_LPAREN)) {
384
+ advance_token(parser);
385
+ if (current_token_is(parser, TOK_RPAREN)) advance_token(parser);
386
+ else return NULL;
387
+ if (len + 2 < sizeof(buf) - 4) { buf[len++] = '('; buf[len++] = ')'; buf[len] = '\0'; }
388
+ }
389
+ /* Occurrence indicators. `?` is unambiguous (postfix lookup
390
+ * applies to primary exprs, never type names); `*`/`+` need
391
+ * lookahead (#744). */
392
+ if (current_token_is(parser, TOK_QUESTION)) {
393
+ if (len + 1 < sizeof(buf) - 1) { buf[len++] = '?'; buf[len] = 0; }
394
+ advance_token(parser);
395
+ } else if (current_token_is(parser, TOK_STAR) ||
396
+ current_token_is(parser, TOK_PLUS)) {
397
+ XPathTokenType oc = current_token(parser)->type;
398
+ XPathToken* after = (parser->token_pos + 1 < parser->token_count)
399
+ ? &parser->tokens[parser->token_pos + 1] : NULL;
400
+ if (!after || !token_begins_expr(after->type)) {
401
+ if (len + 1 < sizeof(buf) - 1) {
402
+ buf[len++] = (oc == TOK_STAR) ? '*' : '+';
403
+ buf[len] = 0;
404
+ }
405
+ advance_token(parser);
406
+ }
407
+ }
408
+ char* out = LEPTRIS_ALLOC_N(char, len + 1);
409
+ if (out) memcpy(out, buf, len + 1);
410
+ return out;
411
+ }
412
+
413
+ static XPathASTNode* parse_expr(XPathParser* parser) {
414
+ XPathASTNode* e = parse_or_expr(parser);
415
+ if (!e) return NULL;
416
+ /* XPath 2.0+ range `A to B` (XSLT 3.0): `to` between two
417
+ * expressions. Value-matched so name tests stay intact. */
418
+ if (ncname_is(current_token(parser), "to", 2)) {
419
+ advance_token(parser);
420
+ XPathASTNode* hi = parse_or_expr(parser);
421
+ if (!hi) { ast_node_free(e); return NULL; }
422
+ XPathASTNode* node = ast_node_new(XPATH_AST_OPERATOR);
423
+ if (!node) { ast_node_free(e); ast_node_free(hi); return NULL; }
424
+ node->number_value = (double)XPATH_OP_RANGE;
425
+ ast_node_add_child(node, e);
426
+ ast_node_add_child(node, hi);
427
+ return node;
428
+ }
429
+ /* 2.0 type operators (TODO.xslt-full/06): value-matched
430
+ * two-word keywords + a SequenceType. Same whole-expr shape as
431
+ * `to` above (X instance of T — comparisons against the result
432
+ * need parentheses, as with ranges). */
433
+ {
434
+ XPathOperatorType op;
435
+ int matched = 0;
436
+ XPathToken* t = current_token(parser);
437
+ XPathToken* t2 = (t && parser->token_pos + 1 < parser->token_count)
438
+ ? &parser->tokens[parser->token_pos + 1] : NULL;
439
+ if (ncname_is(t, "instance", 8) &&
440
+ ncname_is(t2, "of", 2)) {
441
+ op = XPATH_OP_INSTANCE_OF; matched = 1;
442
+ advance_token(parser); advance_token(parser);
443
+ } else if (ncname_is(t, "castable", 8) &&
444
+ ncname_is(t2, "as", 2)) {
445
+ op = XPATH_OP_CASTABLE; matched = 1;
446
+ advance_token(parser); advance_token(parser);
447
+ } else if (ncname_is(t, "cast", 4) &&
448
+ ncname_is(t2, "as", 2)) {
449
+ op = XPATH_OP_CAST; matched = 1;
450
+ advance_token(parser); advance_token(parser);
451
+ } else if (ncname_is(t, "treat", 5) &&
452
+ ncname_is(t2, "as", 2)) {
453
+ op = XPATH_OP_TREAT; matched = 1;
454
+ advance_token(parser); advance_token(parser);
455
+ }
456
+ if (matched) {
457
+ char* ty = parse_sequence_type(parser);
458
+ if (!ty) { ast_node_free(e); return NULL; }
459
+ XPathASTNode* node = ast_node_new(XPATH_AST_OPERATOR);
460
+ if (!node) { free(ty); ast_node_free(e); return NULL; }
461
+ node->number_value = (double)op;
462
+ node->value = ty;
463
+ ast_node_add_child(node, e);
464
+ /* The type-op node closes above the additive level, so
465
+ * trailing arithmetic on the cast result must fold
466
+ * here: `'12' cast as xs:integer + 1` (#744). */
467
+ while (current_token_is(parser, TOK_PLUS) ||
468
+ current_token_is(parser, TOK_MINUS) ||
469
+ current_token_is(parser, TOK_STAR)) {
470
+ XPathTokenType ot = current_token(parser)->type;
471
+ advance_token(parser);
472
+ XPathASTNode* rhs = parse_or_expr(parser);
473
+ if (!rhs) { ast_node_free(node); return NULL; }
474
+ XPathASTNode* opn = ast_node_new(XPATH_AST_OPERATOR);
475
+ if (!opn) { ast_node_free(rhs); ast_node_free(node); return NULL; }
476
+ opn->number_value = (double)((ot == TOK_PLUS) ? XPATH_OP_PLUS
477
+ : (ot == TOK_MINUS) ? XPATH_OP_MINUS
478
+ : XPATH_OP_MULTIPLY);
479
+ ast_node_add_child(opn, node);
480
+ ast_node_add_child(opn, rhs);
481
+ node = opn;
482
+ }
483
+ return node;
484
+ }
485
+ }
486
+ return e;
487
+ }
488
+
489
+ XPathASTNode* xpath_parse(XPathParser* parser) {
490
+ if (!parser) return NULL;
491
+
492
+ XPathASTNode* ast = parse_expr(parser);
493
+ /* XPath 3.1 top-level sequence: Expr ::= ExprSingle ("," ExprSingle)*.
494
+ * One member parses as itself; a comma list builds the sequence
495
+ * node (synthetic-text items) the parenthesized form uses. */
496
+ if (ast && current_token_is(parser, TOK_COMMA)) {
497
+ XPathASTNode* seq = ast_node_new(XPATH_AST_OPERATOR);
498
+ if (!seq) { ast_node_free(ast); return NULL; }
499
+ seq->number_value = (double)XPATH_OP_SEQUENCE;
500
+ ast_node_add_child(seq, ast);
501
+ while (current_token_is(parser, TOK_COMMA)) {
502
+ advance_token(parser);
503
+ XPathASTNode* member = parse_expr(parser);
504
+ if (!member) { ast_node_free(seq); return NULL; }
505
+ ast_node_add_child(seq, member);
506
+ }
507
+ ast = seq;
508
+ }
509
+
510
+ if (ast && !current_token_is(parser, TOK_EOF)) {
511
+ XPathToken* tok = current_token(parser);
512
+ if (tok && parser->lexer && parser->lexer->input) {
513
+ size_t byte_offset = (tok->value && tok->value >= parser->lexer->input)
514
+ ? tok->value - parser->lexer->input
515
+ : 0;
516
+ char msg[256];
517
+ snprintf(msg, sizeof(msg),
518
+ "Unexpected token after expression: %s",
519
+ xpath_token_type_to_string(tok->type));
520
+
521
+ leptris_set_error_with_context(
522
+ LEPTRIS_ERROR_XPATH_SYNTAX,
523
+ msg,
524
+ parser->lexer->input,
525
+ byte_offset,
526
+ tok->line,
527
+ tok->column
528
+ );
529
+
530
+ snprintf(parser->error_msg, sizeof(parser->error_msg),
531
+ "Unexpected token after expression: %s at line %d, column %d",
532
+ xpath_token_type_to_string(tok->type),
533
+ tok->line, tok->column);
534
+ } else {
535
+ snprintf(parser->error_msg, sizeof(parser->error_msg),
536
+ "Unexpected token after expression");
537
+ }
538
+ ast_node_free(ast);
539
+ return NULL;
540
+ }
541
+
542
+ return ast;
543
+ }
544
+
545
+ /* ============================================================================
546
+ * Expression Parsers (Operator Precedence)
547
+ * ============================================================================ */
548
+
549
+ /* Parse OR expressions: AndExpr ( 'or' AndExpr )* */
550
+ static XPathASTNode* parse_or_expr(XPathParser* parser) {
551
+ if (!parser) return NULL;
552
+
553
+ XPathASTNode* left = parse_and_expr(parser);
554
+ if (!left) return NULL;
555
+
556
+ while (current_token_is(parser, TOK_OR)) {
557
+ advance_token(parser);
558
+ XPathASTNode* right = parse_and_expr(parser);
559
+ if (!right) {
560
+ ast_node_free(left);
561
+ return NULL;
562
+ }
563
+
564
+ left = create_operator_node(XPATH_OP_OR, left, right);
565
+ if (!left) return NULL;
566
+ }
567
+
568
+ return left;
569
+ }
570
+
571
+ /* Parse AND expressions: EqualityExpr ( 'and' EqualityExpr )* */
572
+ static XPathASTNode* parse_and_expr(XPathParser* parser) {
573
+ if (!parser) return NULL;
574
+
575
+ XPathASTNode* left = parse_equality_expr(parser);
576
+ if (!left) return NULL;
577
+
578
+ while (current_token_is(parser, TOK_AND)) {
579
+ advance_token(parser);
580
+ XPathASTNode* right = parse_equality_expr(parser);
581
+ if (!right) {
582
+ ast_node_free(left);
583
+ return NULL;
584
+ }
585
+
586
+ left = create_operator_node(XPATH_OP_AND, left, right);
587
+ if (!left) return NULL;
588
+ }
589
+
590
+ return left;
591
+ }
592
+
593
+ /* Parse equality expressions: RelationalExpr ( ('=' | '!=') RelationalExpr )* */
594
+ static XPathASTNode* parse_equality_expr(XPathParser* parser) {
595
+ if (!parser) return NULL;
596
+
597
+ XPathASTNode* left = parse_relational_expr(parser);
598
+ if (!left) return NULL;
599
+
600
+ while (1) {
601
+ XPathOperatorType op_type;
602
+
603
+ if (current_token_is(parser, TOK_EQUALS)) {
604
+ op_type = XPATH_OP_EQUAL;
605
+ } else if (current_token_is(parser, TOK_NOT_EQUALS)) {
606
+ op_type = XPATH_OP_NOT_EQUAL;
607
+ } else {
608
+ break;
609
+ }
610
+
611
+ advance_token(parser);
612
+ XPathASTNode* right = parse_relational_expr(parser);
613
+ if (!right) {
614
+ ast_node_free(left);
615
+ return NULL;
616
+ }
617
+
618
+ left = create_operator_node(op_type, left, right);
619
+ if (!left) return NULL;
620
+ }
621
+
622
+ return left;
623
+ }
624
+
625
+ /* Parse relational expressions: AdditiveExpr ( ('<' | '>' | '<=' | '>=') AdditiveExpr )* */
626
+ /* XPath 3.0 StringConcatExpr: AdditiveExpr ('||' AdditiveExpr)* —
627
+ * sits between comparison and addition (XQuery/XPath 3.x
628
+ * grammar). */
629
+ static XPathASTNode* parse_string_concat_expr(XPathParser* parser) {
630
+ XPathASTNode* left = parse_additive_expr(parser);
631
+ if (!left) return NULL;
632
+
633
+ while (current_token_is(parser, TOK_CONCAT)) {
634
+ advance_token(parser);
635
+ XPathASTNode* right = parse_additive_expr(parser);
636
+ if (!right) { ast_node_free(left); return NULL; }
637
+ left = create_operator_node(XPATH_OP_CONCAT, left, right);
638
+ if (!left) return NULL;
639
+ }
640
+ return left;
641
+ }
642
+
643
+ static XPathASTNode* parse_relational_expr(XPathParser* parser) {
644
+ XPathASTNode* left = parse_string_concat_expr(parser);
645
+ if (!left) return NULL;
646
+
647
+ while (1) {
648
+ XPathOperatorType op_type;
649
+
650
+ /* XPath 2.0 value-comparison keywords (eq/ne/lt/le/gt/ge)
651
+ * — XQuery window conditions use them heavily. Only bare
652
+ * NCNames followed by whitespace/operand qualify. `is`
653
+ * joins the family as the node-identity comparison. */
654
+ int kw_op = 0;
655
+ int kw_is = 0;
656
+ {
657
+ XPathToken* t = current_token(parser);
658
+ if (t && t->type == TOK_NCNAME) {
659
+ XPathToken* nx =
660
+ parser->token_pos + 1 < parser->token_count
661
+ ? &parser->tokens[parser->token_pos + 1]
662
+ : NULL;
663
+ int boundary =
664
+ !nx || nx->type == TOK_EOF ||
665
+ nx->type == TOK_RPAREN || nx->type == TOK_COMMA ||
666
+ nx->type == TOK_RBRACE || nx->type == TOK_LBRACE ||
667
+ nx->type == TOK_NUMBER || nx->type == TOK_STRING ||
668
+ nx->type == TOK_DOLLAR || nx->type == TOK_LPAREN ||
669
+ nx->type == TOK_MINUS;
670
+ if (boundary) {
671
+ if (t->value_len == 2 &&
672
+ (memcmp(t->value, "eq", 2) == 0 ||
673
+ memcmp(t->value, "ne", 2) == 0 ||
674
+ memcmp(t->value, "lt", 2) == 0 ||
675
+ memcmp(t->value, "le", 2) == 0 ||
676
+ memcmp(t->value, "gt", 2) == 0 ||
677
+ memcmp(t->value, "ge", 2) == 0))
678
+ kw_op = 1;
679
+ else if (t->value_len == 2 &&
680
+ memcmp(t->value, "is", 2) == 0)
681
+ kw_is = 1;
682
+ }
683
+ }
684
+ }
685
+ /* `is` operands are node-y: accept path starts as followers
686
+ * (//x is //y, . is $v) beyond the scalar boundary list. */
687
+ if (!kw_is) {
688
+ XPathToken* t = current_token(parser);
689
+ XPathToken* nx =
690
+ parser->token_pos + 1 < parser->token_count
691
+ ? &parser->tokens[parser->token_pos + 1]
692
+ : NULL;
693
+ if (t && t->type == TOK_NCNAME && t->value_len == 2 &&
694
+ memcmp(t->value, "is", 2) == 0 &&
695
+ token_starts_path(nx))
696
+ kw_is = 1;
697
+ }
698
+ if (current_token_is(parser, TOK_LT)) {
699
+ op_type = XPATH_OP_LESS;
700
+ } else if (current_token_is(parser, TOK_LE)) {
701
+ op_type = XPATH_OP_LESS_EQUAL;
702
+ } else if (current_token_is(parser, TOK_GT)) {
703
+ op_type = XPATH_OP_GREATER;
704
+ } else if (current_token_is(parser, TOK_GE)) {
705
+ op_type = XPATH_OP_GREATER_EQUAL;
706
+ } else if (current_token_is(parser, TOK_NODE_BEFORE)) {
707
+ op_type = XPATH_OP_NODE_BEFORE;
708
+ } else if (current_token_is(parser, TOK_NODE_AFTER)) {
709
+ op_type = XPATH_OP_NODE_AFTER;
710
+ } else if (kw_is) {
711
+ op_type = XPATH_OP_IS;
712
+ } else if (kw_op) {
713
+ XPathToken* t = current_token(parser);
714
+ if (t->value[0] == 'e' && t->value[1] == 'q')
715
+ op_type = XPATH_OP_EQUAL;
716
+ else if (t->value[0] == 'n')
717
+ op_type = XPATH_OP_NOT_EQUAL;
718
+ else if (t->value[0] == 'l' && t->value[1] == 't')
719
+ op_type = XPATH_OP_LESS;
720
+ else if (t->value[0] == 'l')
721
+ op_type = XPATH_OP_LESS_EQUAL;
722
+ else if (t->value[0] == 'g' && t->value[1] == 't')
723
+ op_type = XPATH_OP_GREATER;
724
+ else
725
+ op_type = XPATH_OP_GREATER_EQUAL;
726
+ } else {
727
+ break;
728
+ }
729
+
730
+ advance_token(parser);
731
+ XPathASTNode* right = parse_string_concat_expr(parser);
732
+ if (!right) {
733
+ ast_node_free(left);
734
+ return NULL;
735
+ }
736
+
737
+ left = create_operator_node(op_type, left, right);
738
+ if (!left) return NULL;
739
+ }
740
+
741
+ return left;
742
+ }
743
+
744
+ /* Parse additive expressions: MultiplicativeExpr ( ('+' | '-') MultiplicativeExpr )* */
745
+ static XPathASTNode* parse_additive_expr(XPathParser* parser) {
746
+ XPathASTNode* left = parse_multiplicative_expr(parser);
747
+ if (!left) return NULL;
748
+
749
+ while (1) {
750
+ XPathOperatorType op_type;
751
+
752
+ if (current_token_is(parser, TOK_PLUS)) {
753
+ op_type = XPATH_OP_PLUS;
754
+ } else if (current_token_is(parser, TOK_MINUS)) {
755
+ op_type = XPATH_OP_MINUS;
756
+ } else {
757
+ break;
758
+ }
759
+
760
+ advance_token(parser);
761
+ XPathASTNode* right = parse_multiplicative_expr(parser);
762
+ if (!right) {
763
+ ast_node_free(left);
764
+ return NULL;
765
+ }
766
+
767
+ left = create_operator_node(op_type, left, right);
768
+ if (!left) return NULL;
769
+ }
770
+
771
+ return left;
772
+ }
773
+
774
+ /* Parse multiplicative expressions: UnaryExpr ( ('*' | 'div' | 'mod') UnaryExpr )* */
775
+ static XPathASTNode* parse_multiplicative_expr(XPathParser* parser) {
776
+ XPathASTNode* left = parse_unary_expr(parser);
777
+ if (!left) return NULL;
778
+
779
+ while (1) {
780
+ XPathOperatorType op_type;
781
+
782
+ if (current_token_is(parser, TOK_STAR)) {
783
+ op_type = XPATH_OP_MULTIPLY;
784
+ } else if (current_token_is(parser, TOK_DIV)) {
785
+ op_type = XPATH_OP_DIV;
786
+ } else if (current_token_is(parser, TOK_MOD)) {
787
+ op_type = XPATH_OP_MOD;
788
+ } else {
789
+ break;
790
+ }
791
+
792
+ advance_token(parser);
793
+ XPathASTNode* right = parse_unary_expr(parser);
794
+ if (!right) {
795
+ ast_node_free(left);
796
+ return NULL;
797
+ }
798
+
799
+ left = create_operator_node(op_type, left, right);
800
+ if (!left) return NULL;
801
+ }
802
+
803
+ return left;
804
+ }
805
+
806
+ /* Parse unary expressions: '-' UnaryExpr | UnionExpr */
807
+ static XPathASTNode* parse_unary_expr(XPathParser* parser) {
808
+ if (current_token_is(parser, TOK_MINUS)) {
809
+ advance_token(parser);
810
+ XPathASTNode* expr = parse_unary_expr(parser);
811
+ if (!expr) return NULL;
812
+
813
+ XPathASTNode* node = ast_node_new(XPATH_AST_OPERATOR);
814
+ if (!node) {
815
+ ast_node_free(expr);
816
+ return NULL;
817
+ }
818
+
819
+ node->number_value = (double)XPATH_OP_NEGATION;
820
+ ast_node_add_child(node, expr);
821
+ return node;
822
+ }
823
+
824
+ return parse_arrow_expr(parser);
825
+ }
826
+
827
+ /* Parse union expressions: PathExpr ( '|' PathExpr )* — with the
828
+ * XPath 3.0 simple map binding tighter than '|':
829
+ * SimpleMapExpr := PathExpr ('!' PathExpr)*. */
830
+ static XPathASTNode* parse_simple_map_expr(XPathParser* parser) {
831
+ XPathASTNode* left = parse_path_expr(parser);
832
+ if (!left) return NULL;
833
+
834
+ while (current_token_is(parser, TOK_BANG)) {
835
+ advance_token(parser);
836
+ XPathASTNode* right = parse_path_expr(parser);
837
+ if (!right) { ast_node_free(left); return NULL; }
838
+ XPathASTNode* map = ast_node_new(XPATH_AST_OPERATOR);
839
+ if (!map) { ast_node_free(left); ast_node_free(right); return NULL; }
840
+ map->number_value = (double)XPATH_OP_MAP;
841
+ ast_node_add_child(map, left);
842
+ ast_node_add_child(map, right);
843
+ left = map;
844
+ }
845
+ return left;
846
+ }
847
+
848
+ /* XPath 2.0 set algebra binds TIGHTER than '|': IntersectExceptExpr
849
+ * := SimpleMapExpr ( ('intersect'|'except') SimpleMapExpr )* (#684).
850
+ * The keywords are bare NCNames in operator position followed by a
851
+ * path start — after '/' they stay name tests. */
852
+ static int token_starts_path(XPathToken* t) {
853
+ if (!t) return 0;
854
+ switch (t->type) {
855
+ case TOK_NCNAME: case TOK_QNAME: case TOK_DOLLAR:
856
+ case TOK_LPAREN: case TOK_NUMBER: case TOK_STRING:
857
+ case TOK_DOT: case TOK_DOUBLE_DOT: case TOK_SLASH:
858
+ case TOK_DOUBLE_SLASH: case TOK_AT: case TOK_STAR:
859
+ return 1;
860
+ default:
861
+ return 0;
862
+ }
863
+ }
864
+
865
+ static XPathASTNode* parse_intersect_except_expr(XPathParser* parser) {
866
+ XPathASTNode* left = parse_simple_map_expr(parser);
867
+ if (!left) return NULL;
868
+
869
+ while (1) {
870
+ XPathToken* t = current_token(parser);
871
+ int is_intersect = 0, is_except = 0;
872
+ if (t && t->type == TOK_NCNAME) {
873
+ XPathToken* nx =
874
+ parser->token_pos + 1 < parser->token_count
875
+ ? &parser->tokens[parser->token_pos + 1]
876
+ : NULL;
877
+ if (token_starts_path(nx)) {
878
+ if (t->value_len == 9 &&
879
+ memcmp(t->value, "intersect", 9) == 0)
880
+ is_intersect = 1;
881
+ else if (t->value_len == 6 &&
882
+ memcmp(t->value, "except", 6) == 0)
883
+ is_except = 1;
884
+ }
885
+ }
886
+ if (!is_intersect && !is_except) break;
887
+
888
+ advance_token(parser);
889
+ XPathASTNode* right = parse_simple_map_expr(parser);
890
+ if (!right) { ast_node_free(left); return NULL; }
891
+ left = create_operator_node(
892
+ is_intersect ? XPATH_OP_INTERSECT : XPATH_OP_EXCEPT,
893
+ left, right);
894
+ if (!left) return NULL;
895
+ }
896
+ return left;
897
+ }
898
+
899
+ static XPathASTNode* parse_union_expr(XPathParser* parser) {
900
+ XPathASTNode* left = parse_intersect_except_expr(parser);
901
+ if (!left) return NULL;
902
+
903
+ while (current_token_is(parser, TOK_PIPE)) {
904
+ advance_token(parser);
905
+ XPathASTNode* right = parse_intersect_except_expr(parser);
906
+ if (!right) {
907
+ ast_node_free(left);
908
+ return NULL;
909
+ }
910
+
911
+ left = create_operator_node(XPATH_OP_UNION, left, right);
912
+ if (!left) return NULL;
913
+ }
914
+
915
+ return left;
916
+ }
917
+
918
+ /* XPath 3.1 ArrowExpr: UnionExpr ( '=>' Name '(' args ')' )* — the
919
+ * accumulated left side becomes the FIRST argument of each call,
920
+ * so `E => f(a) => g(b)` nests g(f(E, a), b). Arrow binds looser
921
+ * than '|' and '!'. */
922
+ static XPathASTNode* parse_arrow_expr(XPathParser* parser) {
923
+ XPathASTNode* left = parse_union_expr(parser);
924
+ if (!left) return NULL;
925
+
926
+ while (current_token_is(parser, TOK_ARROW)) {
927
+ advance_token(parser);
928
+ XPathToken* nt = current_token(parser);
929
+ if (!nt || (nt->type != TOK_NCNAME && nt->type != TOK_QNAME)) {
930
+ snprintf(parser->error_msg, sizeof(parser->error_msg),
931
+ "Expected function name after '=>'");
932
+ ast_node_free(left);
933
+ return NULL;
934
+ }
935
+ char* fname = token_to_string(nt);
936
+ if (!fname) { ast_node_free(left); return NULL; }
937
+ advance_token(parser);
938
+
939
+ XPathASTNode* call = ast_node_new(XPATH_AST_FUNCTION_CALL);
940
+ if (!call) { free(fname); ast_node_free(left); return NULL; }
941
+ call->value = fname;
942
+ ast_node_add_child(call, left); /* the arrow's first argument */
943
+
944
+ if (!consume_token(parser, TOK_LPAREN,
945
+ "Expected '(' after arrow function name")) {
946
+ ast_node_free(call);
947
+ return NULL;
948
+ }
949
+ if (!current_token_is(parser, TOK_RPAREN)) {
950
+ do {
951
+ XPathASTNode* arg = parse_expr(parser);
952
+ if (!arg) { ast_node_free(call); return NULL; }
953
+ ast_node_add_child(call, arg);
954
+ } while (match_token(parser, TOK_COMMA));
955
+ }
956
+ if (!consume_token(parser, TOK_RPAREN,
957
+ "Expected ')' after arrow arguments")) {
958
+ ast_node_free(call);
959
+ return NULL;
960
+ }
961
+ left = call;
962
+ }
963
+ return left;
964
+ }
965
+
966
+ /* ============================================================================
967
+ * Path Parsers
968
+ * ============================================================================ */
969
+
970
+ /* Parse path expressions */
971
+ static XPathASTNode* parse_path_expr(XPathParser* parser) {
972
+ /* Check if it starts with location path indicator */
973
+ if (current_token_is(parser, TOK_SLASH) ||
974
+ current_token_is(parser, TOK_DOUBLE_SLASH) ||
975
+ current_token_is(parser, TOK_AT) ||
976
+ current_token_is(parser, TOK_DOT) ||
977
+ current_token_is(parser, TOK_DOUBLE_DOT) ||
978
+ current_token_is(parser, TOK_STAR) ||
979
+ (current_token(parser) && current_token(parser)->type >= TOK_ANCESTOR &&
980
+ current_token(parser)->type <= TOK_SELF)) {
981
+ return parse_location_path(parser);
982
+ }
983
+
984
+ /* XPath 1.0 §3.7 lexical disambiguation: an operator KEYWORD at
985
+ * the START of a path expression can only be a NameTest (an
986
+ * element named div/mod/and/or — patterns like match="div" and
987
+ * union patterns div|obj). As operators they need a left operand,
988
+ * which a path start cannot supply. parse_node_test already
989
+ * accepts the keyword tokens as names. */
990
+ if (current_token_is(parser, TOK_DIV) ||
991
+ current_token_is(parser, TOK_MOD) ||
992
+ current_token_is(parser, TOK_AND) ||
993
+ current_token_is(parser, TOK_OR)) {
994
+ return parse_location_path(parser);
995
+ }
996
+
997
+ /* 3.1 square array constructor `[ a, b, ... ]` — a leading '['
998
+ * can only be this (predicates need a preceding expression). */
999
+ if (current_token_is(parser, TOK_LBRACKET)) {
1000
+ advance_token(parser);
1001
+ XPathASTNode* ac = ast_node_new(XPATH_AST_OPERATOR);
1002
+ if (!ac) return NULL;
1003
+ ac->number_value = (double)XPATH_OP_ARRAY_CONSTRUCTOR;
1004
+ while (!current_token_is(parser, TOK_RBRACKET)) {
1005
+ XPathASTNode* m = parse_expr(parser);
1006
+ if (!m) { ast_node_free(ac); return NULL; }
1007
+ ast_node_add_child(ac, m);
1008
+ if (current_token_is(parser, TOK_COMMA)) advance_token(parser);
1009
+ else break;
1010
+ }
1011
+ if (!current_token_is(parser, TOK_RBRACKET)) {
1012
+ ast_node_free(ac);
1013
+ return NULL;
1014
+ }
1015
+ advance_token(parser);
1016
+ return parse_postfix_ops(parser, ac);
1017
+ }
1018
+
1019
+ /* Check for relative paths starting with NCName/QName */
1020
+ if (current_token_is(parser, TOK_NCNAME) || current_token_is(parser, TOK_QNAME)) {
1021
+ XPathToken* next = peek_token(parser, 1);
1022
+
1023
+ /* `for $v ...` / `let $v := ...` (XSLT 3.0 / XPath 3.1) and
1024
+ * the XPath 2.0 quantified `some`/`every $v in ...` — fall
1025
+ * through to the primary's hooks before the location-path
1026
+ * dispatch eats the keyword as a name test. */
1027
+ if (current_token(parser)->type == TOK_NCNAME &&
1028
+ ((current_token(parser)->value_len == 3 &&
1029
+ memcmp(current_token(parser)->value, "for", 3) == 0) ||
1030
+ (current_token(parser)->value_len == 3 &&
1031
+ memcmp(current_token(parser)->value, "let", 3) == 0) ||
1032
+ (current_token(parser)->value_len == 4 &&
1033
+ memcmp(current_token(parser)->value, "some", 4) == 0) ||
1034
+ (current_token(parser)->value_len == 5 &&
1035
+ memcmp(current_token(parser)->value, "every", 5) == 0)) &&
1036
+ next && next->type == TOK_DOLLAR) {
1037
+ /* Fall through to filter expression */
1038
+ }
1039
+ /* switch( and array{ fall through the same way (#692). */
1040
+ else if (current_token(parser)->type == TOK_NCNAME &&
1041
+ current_token(parser)->value_len == 6 &&
1042
+ memcmp(current_token(parser)->value, "switch", 6) == 0 &&
1043
+ next && next->type == TOK_LPAREN) {
1044
+ /* Fall through to filter expression */
1045
+ }
1046
+ else if (current_token(parser)->type == TOK_NCNAME &&
1047
+ current_token(parser)->value_len == 5 &&
1048
+ memcmp(current_token(parser)->value, "array", 5) == 0 &&
1049
+ next && next->type == TOK_LBRACE) {
1050
+ /* Fall through to filter expression */
1051
+ }
1052
+ /* 3.0 inline function item `function ($a, $b) { body }`. */
1053
+ else if (current_token(parser)->type == TOK_NCNAME &&
1054
+ current_token(parser)->value_len == 8 &&
1055
+ memcmp(current_token(parser)->value, "function", 8) == 0 &&
1056
+ next && next->type == TOK_LPAREN) {
1057
+ advance_token(parser);
1058
+ advance_token(parser);
1059
+ char params[256];
1060
+ size_t plen = 0;
1061
+ params[0] = 0;
1062
+ while (!current_token_is(parser, TOK_RPAREN)) {
1063
+ if (!current_token_is(parser, TOK_DOLLAR)) return NULL;
1064
+ advance_token(parser);
1065
+ XPathToken* pt = current_token(parser);
1066
+ if (!pt || (pt->type != TOK_NCNAME &&
1067
+ pt->type != TOK_QNAME))
1068
+ return NULL;
1069
+ if (plen && plen + 1 < sizeof(params))
1070
+ params[plen++] = '\x01'; /* matches the DYN_CALL splitter */
1071
+ if (plen + pt->value_len < sizeof(params)) {
1072
+ memcpy(params + plen, pt->value, pt->value_len);
1073
+ plen += pt->value_len;
1074
+ }
1075
+ params[plen] = 0;
1076
+ advance_token(parser);
1077
+ if (current_token_is(parser, TOK_COMMA))
1078
+ advance_token(parser);
1079
+ else break;
1080
+ }
1081
+ if (!current_token_is(parser, TOK_RPAREN)) return NULL;
1082
+ advance_token(parser);
1083
+ if (!current_token_is(parser, TOK_LBRACE)) return NULL;
1084
+ advance_token(parser);
1085
+ XPathASTNode* body = parse_expr(parser);
1086
+ if (!body) return NULL;
1087
+ if (!current_token_is(parser, TOK_RBRACE)) {
1088
+ ast_node_free(body);
1089
+ return NULL;
1090
+ }
1091
+ advance_token(parser);
1092
+ XPathASTNode* fn = ast_node_new(XPATH_AST_OPERATOR);
1093
+ if (!fn) { ast_node_free(body); return NULL; }
1094
+ fn->number_value = (double)XPATH_OP_INLINE_FN;
1095
+ fn->value = leptris_strdup(params);
1096
+ ast_node_add_child(fn, body);
1097
+ return parse_postfix_ops(parser, fn);
1098
+ }
1099
+ /* 3.0 named function reference `name#arity`. */
1100
+ else if (current_token(parser)->type == TOK_NCNAME &&
1101
+ next && next->type == TOK_HASH) {
1102
+ char name[128];
1103
+ size_t nl = current_token(parser)->value_len;
1104
+ if (nl >= sizeof(name)) return NULL;
1105
+ memcpy(name, current_token(parser)->value, nl);
1106
+ name[nl] = 0;
1107
+ advance_token(parser);
1108
+ advance_token(parser);
1109
+ XPathToken* at = current_token(parser);
1110
+ if (!at || at->type != TOK_NUMBER) return NULL;
1111
+ char ref[160];
1112
+ snprintf(ref, sizeof(ref), "%.*s#%.*s",
1113
+ (int)nl, name, (int)at->value_len, at->value);
1114
+ advance_token(parser);
1115
+ XPathASTNode* fr = ast_node_new(XPATH_AST_OPERATOR);
1116
+ if (!fr) return NULL;
1117
+ fr->number_value = (double)XPATH_OP_FN_REF;
1118
+ fr->value = leptris_strdup(ref);
1119
+ return parse_postfix_ops(parser, fr);
1120
+ }
1121
+ /* 3.1 map constructor `map { k: v, ... }`. */
1122
+ else if (current_token(parser)->type == TOK_NCNAME &&
1123
+ current_token(parser)->value_len == 3 &&
1124
+ memcmp(current_token(parser)->value, "map", 3) == 0 &&
1125
+ next && next->type == TOK_LBRACE) {
1126
+ advance_token(parser);
1127
+ advance_token(parser);
1128
+ XPathASTNode* mc = ast_node_new(XPATH_AST_OPERATOR);
1129
+ if (!mc) return NULL;
1130
+ mc->number_value = (double)XPATH_OP_MAP_CONSTRUCTOR;
1131
+ while (!current_token_is(parser, TOK_RBRACE)) {
1132
+ XPathASTNode* k = parse_expr(parser);
1133
+ if (!k || !current_token_is(parser, TOK_COLON)) {
1134
+ ast_node_free(k);
1135
+ ast_node_free(mc);
1136
+ return NULL;
1137
+ }
1138
+ advance_token(parser);
1139
+ XPathASTNode* v = parse_expr(parser);
1140
+ if (!v) {
1141
+ ast_node_free(k);
1142
+ ast_node_free(mc);
1143
+ return NULL;
1144
+ }
1145
+ ast_node_add_child(mc, k);
1146
+ ast_node_add_child(mc, v);
1147
+ if (current_token_is(parser, TOK_COMMA)) advance_token(parser);
1148
+ else break;
1149
+ }
1150
+ if (!current_token_is(parser, TOK_RBRACE)) {
1151
+ ast_node_free(mc);
1152
+ return NULL;
1153
+ }
1154
+ advance_token(parser);
1155
+ return parse_postfix_ops(parser, mc);
1156
+ }
1157
+ /* XQuery 1.0 computed constructors (TODO.xslt-full/11):
1158
+ * element NAME { content }, attribute NAME { value },
1159
+ * text { content }. Matched only with the name+brace in
1160
+ * place — bare `element`/`text` name tests stay intact
1161
+ * (the lexer only keyword-tokenizes `text(`). */
1162
+ else if (current_token(parser)->type == TOK_NCNAME &&
1163
+ next && next->type == TOK_LBRACE &&
1164
+ current_token(parser)->value_len == 8 &&
1165
+ memcmp(current_token(parser)->value, "document", 8) == 0) {
1166
+ advance_token(parser);
1167
+ advance_token(parser);
1168
+ XPathASTNode* dc = ast_node_new(XPATH_AST_OPERATOR);
1169
+ if (!dc) return NULL;
1170
+ dc->number_value = (double)XPATH_OP_DOCUMENT_CTOR;
1171
+ /* Empty content `document { }` is legal (no children). */
1172
+ if (current_token_is(parser, TOK_RBRACE) &&
1173
+ dc->child_count == 0) {
1174
+ /* fall through to the RBRACE consume below */
1175
+ } else
1176
+ for (;;) {
1177
+ XPathASTNode* item = parse_expr(parser);
1178
+ if (!item) { ast_node_free(dc); return NULL; }
1179
+ ast_node_add_child(dc, item);
1180
+ if (current_token_is(parser, TOK_COMMA)) {
1181
+ advance_token(parser);
1182
+ continue;
1183
+ }
1184
+ break;
1185
+ }
1186
+ if (!current_token_is(parser, TOK_RBRACE)) {
1187
+ ast_node_free(dc);
1188
+ return NULL;
1189
+ }
1190
+ advance_token(parser);
1191
+ return parse_postfix_ops(parser, dc);
1192
+ }
1193
+ /* XQuery 3.0 typeswitch (#692/12): typeswitch (E)
1194
+ * case T1 return R1 case T2 return R2 ... default return
1195
+ * RD. Dispatch reuses the instance-of classifier. */
1196
+ else if (current_token(parser)->type == TOK_NCNAME &&
1197
+ next && next->type == TOK_LPAREN &&
1198
+ current_token(parser)->value_len == 10 &&
1199
+ memcmp(current_token(parser)->value, "typeswitch", 10) == 0) {
1200
+ advance_token(parser);
1201
+ advance_token(parser);
1202
+ XPathASTNode* operand = parse_expr(parser);
1203
+ if (!operand) return NULL;
1204
+ if (!current_token_is(parser, TOK_RPAREN)) {
1205
+ ast_node_free(operand);
1206
+ return NULL;
1207
+ }
1208
+ advance_token(parser);
1209
+ XPathASTNode* ts = ast_node_new(XPATH_AST_OPERATOR);
1210
+ if (!ts) { ast_node_free(operand); return NULL; }
1211
+ ts->number_value = (double)XPATH_OP_TYPESWITCH;
1212
+ ast_node_add_child(ts, operand);
1213
+ char types[512];
1214
+ size_t ty = 0;
1215
+ types[0] = 0;
1216
+ for (;;) {
1217
+ XPathToken* t = current_token(parser);
1218
+ int is_default = 0;
1219
+ if (t && t->type == TOK_NCNAME && t->value_len == 7 &&
1220
+ memcmp(t->value, "default", 7) == 0) {
1221
+ is_default = 1;
1222
+ advance_token(parser);
1223
+ } else if (t && t->type == TOK_NCNAME &&
1224
+ t->value_len == 4 &&
1225
+ memcmp(t->value, "case", 4) == 0) {
1226
+ advance_token(parser);
1227
+ /* SequenceType name (+ occurrence ignored) */
1228
+ char tn[96];
1229
+ size_t tnl = 0;
1230
+ tn[0] = 0;
1231
+ for (;;) {
1232
+ XPathToken* nt = current_token(parser);
1233
+ if (!nt || (nt->type != TOK_NCNAME &&
1234
+ nt->type != TOK_QNAME &&
1235
+ nt->type != TOK_NODE &&
1236
+ nt->type != TOK_TEXT &&
1237
+ nt->type != TOK_COMMENT &&
1238
+ nt->type !=
1239
+ TOK_PROCESSING_INSTRUCTION))
1240
+ break;
1241
+ /* `return` starts the arm, not the type */
1242
+ if (nt->type == TOK_NCNAME &&
1243
+ nt->value_len == 6 &&
1244
+ memcmp(nt->value, "return", 6) == 0)
1245
+ break;
1246
+ size_t cp = tnl ? 1 : 0; /* ':' separator */
1247
+ if (ty + tnl + nt->value_len + cp + 2 >=
1248
+ sizeof(types))
1249
+ break;
1250
+ if (tnl && tnl + 1 < sizeof(tn)) tn[tnl++] = ':';
1251
+ if (nt->value_len < sizeof(tn) - tnl) {
1252
+ memcpy(tn + tnl, nt->value, nt->value_len);
1253
+ tnl += nt->value_len;
1254
+ tn[tnl] = 0;
1255
+ }
1256
+ advance_token(parser);
1257
+ if (current_token_is(parser, TOK_LPAREN)) {
1258
+ advance_token(parser);
1259
+ if (current_token_is(parser, TOK_RPAREN))
1260
+ advance_token(parser);
1261
+ else { ast_node_free(ts); return NULL; }
1262
+ if (tnl + 2 < sizeof(tn)) {
1263
+ tn[tnl++] = '(';
1264
+ tn[tnl++] = ')';
1265
+ tn[tnl] = 0;
1266
+ }
1267
+ break;
1268
+ }
1269
+ }
1270
+ if (!tnl) { ast_node_free(ts); return NULL; }
1271
+ if (ty) types[ty++] = '\x01';
1272
+ if (ty + tnl < sizeof(types)) {
1273
+ memcpy(types + ty, tn, tnl);
1274
+ ty += tnl;
1275
+ }
1276
+ types[ty] = 0;
1277
+ } else {
1278
+ ast_node_free(ts);
1279
+ return NULL;
1280
+ }
1281
+ XPathToken* rt = current_token(parser);
1282
+ if (!rt || rt->type != TOK_NCNAME || rt->value_len != 6 ||
1283
+ memcmp(rt->value, "return", 6) != 0) {
1284
+ ast_node_free(ts);
1285
+ return NULL;
1286
+ }
1287
+ advance_token(parser);
1288
+ XPathASTNode* ret = parse_expr(parser);
1289
+ if (!ret) { ast_node_free(ts); return NULL; }
1290
+ ast_node_add_child(ts, ret);
1291
+ if (is_default) break;
1292
+ }
1293
+ if (ty && ty + 2 < sizeof(types)) {
1294
+ types[ty++] = '\x01';
1295
+ types[ty++] = '\x01'; /* empty default marker */
1296
+ types[ty] = 0;
1297
+ }
1298
+ ts->value = leptris_strdup(types);
1299
+ return parse_postfix_ops(parser, ts);
1300
+ }
1301
+ /* XQuery 3.0 try/catch (#692): try { E } catch TEST { E }+.
1302
+ * TEST: * | err:CODE | err:* */
1303
+ else if (current_token(parser)->type == TOK_NCNAME &&
1304
+ next && next->type == TOK_LBRACE &&
1305
+ current_token(parser)->value_len == 3 &&
1306
+ memcmp(current_token(parser)->value, "try", 3) == 0) {
1307
+ advance_token(parser);
1308
+ advance_token(parser);
1309
+ XPathASTNode* body = parse_expr(parser);
1310
+ if (!body) return NULL;
1311
+ if (!current_token_is(parser, TOK_RBRACE)) {
1312
+ ast_node_free(body);
1313
+ return NULL;
1314
+ }
1315
+ advance_token(parser);
1316
+ XPathASTNode* tc = ast_node_new(XPATH_AST_OPERATOR);
1317
+ if (!tc) { ast_node_free(body); return NULL; }
1318
+ tc->number_value = (double)XPATH_OP_TRY;
1319
+ ast_node_add_child(tc, body);
1320
+ char tests[256];
1321
+ size_t tlen = 0;
1322
+ tests[0] = 0;
1323
+ while (current_token_is(parser, TOK_NCNAME) &&
1324
+ current_token(parser)->value_len == 5 &&
1325
+ memcmp(current_token(parser)->value, "catch", 5) == 0) {
1326
+ advance_token(parser);
1327
+ char test[128];
1328
+ size_t tnl = 0;
1329
+ test[0] = 0;
1330
+ XPathToken* t = current_token(parser);
1331
+ if (t && t->type == TOK_STAR) {
1332
+ test[tnl++] = '*';
1333
+ advance_token(parser);
1334
+ } else if (t && (t->type == TOK_NCNAME ||
1335
+ t->type == TOK_QNAME)) {
1336
+ if (t->value_len < sizeof(test)) {
1337
+ memcpy(test, t->value, t->value_len);
1338
+ tnl = t->value_len;
1339
+ }
1340
+ advance_token(parser);
1341
+ if (current_token_is(parser, TOK_COLON)) {
1342
+ advance_token(parser);
1343
+ if (tnl < sizeof(test) - 1) test[tnl++] = ':';
1344
+ t = current_token(parser);
1345
+ if (t && t->type == TOK_STAR) {
1346
+ if (tnl < sizeof(test) - 1) test[tnl++] = '*';
1347
+ advance_token(parser);
1348
+ } else if (t && (t->type == TOK_NCNAME ||
1349
+ t->type == TOK_QNAME)) {
1350
+ if (tnl + t->value_len < sizeof(test)) {
1351
+ memcpy(test + tnl, t->value, t->value_len);
1352
+ tnl += t->value_len;
1353
+ }
1354
+ advance_token(parser);
1355
+ }
1356
+ }
1357
+ }
1358
+ if (!tnl) {
1359
+ ast_node_free(tc);
1360
+ return NULL;
1361
+ }
1362
+ test[tnl] = 0;
1363
+ if (tlen && tlen + 1 < sizeof(tests))
1364
+ tests[tlen++] = '\x01';
1365
+ if (tlen + tnl < sizeof(tests)) {
1366
+ memcpy(tests + tlen, test, tnl);
1367
+ tlen += tnl;
1368
+ }
1369
+ tests[tlen] = 0;
1370
+ if (!current_token_is(parser, TOK_LBRACE)) {
1371
+ ast_node_free(tc);
1372
+ return NULL;
1373
+ }
1374
+ advance_token(parser);
1375
+ XPathASTNode* cb = parse_expr(parser);
1376
+ if (!cb) { ast_node_free(tc); return NULL; }
1377
+ if (!current_token_is(parser, TOK_RBRACE)) {
1378
+ ast_node_free(cb);
1379
+ ast_node_free(tc);
1380
+ return NULL;
1381
+ }
1382
+ advance_token(parser);
1383
+ ast_node_add_child(tc, cb);
1384
+ }
1385
+ if (tc->child_count < 2) { /* try needs >= 1 catch */
1386
+ ast_node_free(tc);
1387
+ return NULL;
1388
+ }
1389
+ tc->value = leptris_strdup(tests);
1390
+ return parse_postfix_ops(parser, tc);
1391
+ }
1392
+ else if (current_token(parser)->type == TOK_NCNAME &&
1393
+ next && next->type == TOK_LBRACE &&
1394
+ current_token(parser)->value_len == 4 &&
1395
+ memcmp(current_token(parser)->value, "text", 4) == 0) {
1396
+ advance_token(parser);
1397
+ advance_token(parser);
1398
+ /* `text { }` — the empty string (zero-child SEQUENCE,
1399
+ * the `()` literal shape). */
1400
+ XPathASTNode* body = NULL;
1401
+ if (current_token_is(parser, TOK_RBRACE)) {
1402
+ body = ast_node_new(XPATH_AST_OPERATOR);
1403
+ if (body) body->number_value =
1404
+ (double)XPATH_OP_SEQUENCE;
1405
+ } else {
1406
+ body = parse_expr(parser);
1407
+ }
1408
+ if (!body) return NULL;
1409
+ if (!current_token_is(parser, TOK_RBRACE)) {
1410
+ ast_node_free(body);
1411
+ return NULL;
1412
+ }
1413
+ advance_token(parser);
1414
+ XPathASTNode* tc = ast_node_new(XPATH_AST_OPERATOR);
1415
+ if (!tc) { ast_node_free(body); return NULL; }
1416
+ tc->number_value = (double)XPATH_OP_TEXT_CTOR;
1417
+ ast_node_add_child(tc, body);
1418
+ return parse_postfix_ops(parser, tc);
1419
+ }
1420
+ else if (current_token(parser)->type == TOK_NCNAME &&
1421
+ ((current_token(parser)->value_len == 7 &&
1422
+ memcmp(current_token(parser)->value, "element", 7) == 0) ||
1423
+ (current_token(parser)->value_len == 9 &&
1424
+ memcmp(current_token(parser)->value, "attribute", 9) == 0)) &&
1425
+ next && (next->type == TOK_NCNAME ||
1426
+ next->type == TOK_QNAME) &&
1427
+ parser->token_pos + 2 < parser->token_count &&
1428
+ parser->tokens[parser->token_pos + 2].type == TOK_LBRACE) {
1429
+ int is_attr =
1430
+ current_token(parser)->value_len == 9;
1431
+ char name[128];
1432
+ size_t nl = next->value_len;
1433
+ if (nl >= sizeof(name)) return NULL;
1434
+ memcpy(name, next->value, nl);
1435
+ name[nl] = 0;
1436
+ advance_token(parser);
1437
+ advance_token(parser);
1438
+ advance_token(parser);
1439
+ XPathASTNode* ctor = ast_node_new(XPATH_AST_OPERATOR);
1440
+ if (!ctor) return NULL;
1441
+ ctor->number_value = (double)(is_attr ? XPATH_OP_ATTRIBUTE_CTOR
1442
+ : XPATH_OP_ELEMENT_CTOR);
1443
+ ctor->value = leptris_strdup(name);
1444
+ /* Comma-separated ctor children attach directly (the
1445
+ * evaluator sees attribute and content children up
1446
+ * front). Empty content `element n { }` is legal. */
1447
+ if (current_token_is(parser, TOK_RBRACE) &&
1448
+ ctor->child_count == 0) {
1449
+ /* no content items */
1450
+ } else
1451
+ for (;;) {
1452
+ XPathASTNode* item = parse_expr(parser);
1453
+ if (!item) { ast_node_free(ctor); return NULL; }
1454
+ ast_node_add_child(ctor, item);
1455
+ if (current_token_is(parser, TOK_COMMA)) {
1456
+ advance_token(parser);
1457
+ continue;
1458
+ }
1459
+ break;
1460
+ }
1461
+ if (!current_token_is(parser, TOK_RBRACE)) {
1462
+ ast_node_free(ctor);
1463
+ return NULL;
1464
+ }
1465
+ advance_token(parser);
1466
+ return parse_postfix_ops(parser, ctor);
1467
+ }
1468
+ /* If followed by '(', it's a function call - fall through to filter expression */
1469
+ else if (next && next->type == TOK_LPAREN) {
1470
+ /* Fall through to filter expression */
1471
+ }
1472
+ /* Otherwise (including operators, path operators, or EOF/end markers), it's a location path */
1473
+ else {
1474
+ return parse_location_path(parser);
1475
+ }
1476
+ }
1477
+
1478
+ /* Try filter expression */
1479
+ XPathASTNode* expr = parse_filter_expr(parser);
1480
+ if (!expr) return NULL;
1481
+
1482
+ /* Check for path continuation */
1483
+ if (current_token_is(parser, TOK_SLASH) || current_token_is(parser, TOK_DOUBLE_SLASH)) {
1484
+ XPathASTNode* path = ast_node_new(XPATH_AST_PATH_EXPR);
1485
+ if (!path) {
1486
+ ast_node_free(expr);
1487
+ return NULL;
1488
+ }
1489
+
1490
+ ast_node_add_child(path, expr);
1491
+
1492
+ int is_double = current_token_is(parser, TOK_DOUBLE_SLASH);
1493
+ advance_token(parser);
1494
+
1495
+ XPathASTNode* rel_path = parse_relative_location_path(parser);
1496
+ if (!rel_path) {
1497
+ ast_node_free(path);
1498
+ return NULL;
1499
+ }
1500
+
1501
+ if (is_double) {
1502
+ XPathASTNode* desc_step = ast_node_new(XPATH_AST_STEP);
1503
+ if (desc_step) {
1504
+ desc_step->value = leptris_strdup("descendant-or-self");
1505
+ desc_step->axis_id = XPATH_AXIS_DESCENDANT_OR_SELF;
1506
+ XPathASTNode* node_test = ast_node_new(XPATH_AST_NODE_TEST_TYPE);
1507
+ if (node_test) {
1508
+ node_test->value = leptris_strdup("node");
1509
+ }
1510
+ ast_node_add_child(desc_step, node_test);
1511
+ ast_node_add_child(path, desc_step);
1512
+ }
1513
+ }
1514
+
1515
+ ast_node_add_child(path, rel_path);
1516
+ return path;
1517
+ }
1518
+
1519
+ return expr;
1520
+ }
1521
+
1522
+ /* Parse filter expressions */
1523
+ static XPathASTNode* parse_filter_expr(XPathParser* parser);
1524
+
1525
+ /* Postfix operations on a primary: predicates + 3.1 lookups.
1526
+ * Shared by parse_filter_expr and the map/array constructors
1527
+ * (which return from the path dispatch before the filter level —
1528
+ * `map { 'b': 1 }?b` must still bind the lookup). */
1529
+ static XPathASTNode* parse_postfix_ops(XPathParser* parser,
1530
+ XPathASTNode* expr) {
1531
+ while (current_token_is(parser, TOK_LBRACKET) ||
1532
+ current_token_is(parser, TOK_QUESTION) ||
1533
+ current_token_is(parser, TOK_LPAREN)) {
1534
+ /* 3.0 dynamic call: primary '(' args ')' — a '(' after a
1535
+ * complete primary can only be this (1.0 function calls
1536
+ * are primaries themselves). */
1537
+ if (current_token_is(parser, TOK_LPAREN)) {
1538
+ advance_token(parser);
1539
+ XPathASTNode* call = ast_node_new(XPATH_AST_OPERATOR);
1540
+ if (!call) { ast_node_free(expr); return NULL; }
1541
+ call->number_value = (double)XPATH_OP_DYN_CALL;
1542
+ ast_node_add_child(call, expr);
1543
+ while (!current_token_is(parser, TOK_RPAREN)) {
1544
+ XPathASTNode* a = parse_expr(parser);
1545
+ if (!a) { ast_node_free(call); return NULL; }
1546
+ ast_node_add_child(call, a);
1547
+ if (current_token_is(parser, TOK_COMMA))
1548
+ advance_token(parser);
1549
+ else break;
1550
+ }
1551
+ if (!current_token_is(parser, TOK_RPAREN)) {
1552
+ ast_node_free(call);
1553
+ return NULL;
1554
+ }
1555
+ advance_token(parser);
1556
+ expr = call;
1557
+ continue;
1558
+ }
1559
+ if (current_token_is(parser, TOK_QUESTION)) {
1560
+ advance_token(parser);
1561
+ XPathToken* kt = current_token(parser);
1562
+ if (!kt || (kt->type != TOK_NCNAME && kt->type != TOK_QNAME &&
1563
+ kt->type != TOK_NUMBER)) {
1564
+ ast_node_free(expr);
1565
+ return NULL;
1566
+ }
1567
+ char key[96];
1568
+ size_t klen = kt->value_len < sizeof(key) - 1
1569
+ ? kt->value_len : sizeof(key) - 1;
1570
+ memcpy(key, kt->value, klen);
1571
+ key[klen] = '\0';
1572
+ advance_token(parser);
1573
+ XPathASTNode* lk = ast_node_new(XPATH_AST_OPERATOR);
1574
+ if (!lk) { ast_node_free(expr); return NULL; }
1575
+ lk->number_value = (double)XPATH_OP_LOOKUP;
1576
+ lk->value = leptris_strdup(key);
1577
+ ast_node_add_child(lk, expr);
1578
+ expr = lk;
1579
+ continue;
1580
+ }
1581
+ XPathASTNode* pred = parse_predicate(parser);
1582
+ if (!pred) {
1583
+ ast_node_free(expr);
1584
+ return NULL;
1585
+ }
1586
+
1587
+ XPathASTNode* filter = ast_node_new(XPATH_AST_PREDICATE);
1588
+ if (!filter) {
1589
+ ast_node_free(expr);
1590
+ ast_node_free(pred);
1591
+ return NULL;
1592
+ }
1593
+
1594
+ ast_node_add_child(filter, expr);
1595
+ ast_node_add_child(filter, pred);
1596
+ expr = filter;
1597
+ }
1598
+ return expr;
1599
+ }
1600
+
1601
+ static XPathASTNode* parse_filter_expr(XPathParser* parser) {
1602
+ XPathASTNode* expr = parse_primary_expr(parser);
1603
+ if (!expr) return NULL;
1604
+ return parse_postfix_ops(parser, expr);
1605
+ }
1606
+
1607
+ /* Parse primary expressions: NUMBER | STRING | FunctionCall | '(' Expr ')' */
1608
+ /* XPath 2.0+ conditional (XSLT 3.0 expressions):
1609
+ * `if (cond) then expr else expr`. `then`/`else` are matched by
1610
+ * token VALUE at the expected position — they stay NCNames
1611
+ * everywhere else (name tests, paths) keep parsing. */
1612
+ static XPathASTNode* parse_if_expr(XPathParser* parser) {
1613
+ /* current token is `if`; the ( follows. */
1614
+ advance_token(parser); /* consume `if` */
1615
+ XPathToken* lp = current_token(parser);
1616
+ if (!lp || lp->type != TOK_LPAREN) {
1617
+ snprintf(parser->error_msg, sizeof(parser->error_msg),
1618
+ "Expected '(' after if");
1619
+ return NULL;
1620
+ }
1621
+ advance_token(parser);
1622
+
1623
+ XPathASTNode* cond = parse_expr(parser);
1624
+ if (!cond) return NULL;
1625
+
1626
+ /* The parens wrap ONLY the condition:
1627
+ * if ( cond ) then expr else expr. */
1628
+ XPathToken* rp0 = current_token(parser);
1629
+ if (!rp0 || rp0->type != TOK_RPAREN) {
1630
+ snprintf(parser->error_msg, sizeof(parser->error_msg),
1631
+ "Expected ')' after if condition");
1632
+ ast_node_free(cond);
1633
+ return NULL;
1634
+ }
1635
+ advance_token(parser);
1636
+
1637
+ XPathToken* t = current_token(parser);
1638
+ if (!t || t->type != TOK_NCNAME || t->value_len != 4 ||
1639
+ memcmp(t->value, "then", 4) != 0) {
1640
+ snprintf(parser->error_msg, sizeof(parser->error_msg),
1641
+ "Expected 'then' in if expression");
1642
+ ast_node_free(cond);
1643
+ return NULL;
1644
+ }
1645
+ advance_token(parser);
1646
+
1647
+ XPathASTNode* then_e = parse_expr(parser);
1648
+ if (!then_e) { ast_node_free(cond); return NULL; }
1649
+
1650
+ t = current_token(parser);
1651
+ if (!t || t->type != TOK_NCNAME || t->value_len != 4 ||
1652
+ memcmp(t->value, "else", 4) != 0) {
1653
+ snprintf(parser->error_msg, sizeof(parser->error_msg),
1654
+ "Expected 'else' in if expression");
1655
+ ast_node_free(cond);
1656
+ ast_node_free(then_e);
1657
+ return NULL;
1658
+ }
1659
+ advance_token(parser);
1660
+
1661
+ XPathASTNode* else_e = parse_expr(parser);
1662
+ if (!else_e) {
1663
+ ast_node_free(cond);
1664
+ ast_node_free(then_e);
1665
+ return NULL;
1666
+ }
1667
+
1668
+ XPathASTNode* node = ast_node_new(XPATH_AST_OPERATOR);
1669
+ if (!node) {
1670
+ ast_node_free(cond);
1671
+ ast_node_free(then_e);
1672
+ ast_node_free(else_e);
1673
+ return NULL;
1674
+ }
1675
+ node->number_value = (double)XPATH_OP_IF;
1676
+ ast_node_add_child(node, cond);
1677
+ ast_node_add_child(node, then_e);
1678
+ ast_node_add_child(node, else_e);
1679
+ return node;
1680
+ }
1681
+
1682
+ /* XPath 2.0+ `for $v1 in E1, $v2 in E2 ... return R` (XSLT 3.0).
1683
+ * Single-variable form first; the operator node carries [0]=the
1684
+ * binding (an XPATH_AST_ARGUMENT-shaped pair), [1]=return expr. */
1685
+ static XPathASTNode* parse_for_expr(XPathParser* parser) {
1686
+ advance_token(parser); /* consume `for` */
1687
+
1688
+ XPathToken* d = current_token(parser);
1689
+ if (!d || d->type != TOK_DOLLAR) {
1690
+ snprintf(parser->error_msg, sizeof(parser->error_msg),
1691
+ "Expected '$' variable after for");
1692
+ return NULL;
1693
+ }
1694
+ advance_token(parser);
1695
+ XPathToken* vt = current_token(parser);
1696
+ if (!vt || (vt->type != TOK_NCNAME && vt->type != TOK_QNAME)) {
1697
+ snprintf(parser->error_msg, sizeof(parser->error_msg),
1698
+ "Expected variable name in for");
1699
+ return NULL;
1700
+ }
1701
+ char* var_name = token_to_string(vt);
1702
+ if (!var_name) return NULL;
1703
+ advance_token(parser);
1704
+
1705
+ /* XQuery `for $x at $p` — the position name rides ->value as
1706
+ * var '\x01' pos (the evaluator splits it). */
1707
+ char* pos_name = NULL;
1708
+ {
1709
+ XPathToken* at = current_token(parser);
1710
+ if (at && at->type == TOK_NCNAME && at->value_len == 2 &&
1711
+ memcmp(at->value, "at", 2) == 0) {
1712
+ advance_token(parser);
1713
+ XPathToken* pd = current_token(parser);
1714
+ if (!pd || pd->type != TOK_DOLLAR) {
1715
+ snprintf(parser->error_msg, sizeof(parser->error_msg),
1716
+ "Expected '$' position variable after at");
1717
+ free(var_name);
1718
+ return NULL;
1719
+ }
1720
+ advance_token(parser);
1721
+ XPathToken* pt = current_token(parser);
1722
+ if (!pt || (pt->type != TOK_NCNAME && pt->type != TOK_QNAME)) {
1723
+ snprintf(parser->error_msg, sizeof(parser->error_msg),
1724
+ "Expected position variable name");
1725
+ free(var_name);
1726
+ return NULL;
1727
+ }
1728
+ pos_name = token_to_string(pt);
1729
+ if (!pos_name) { free(var_name); return NULL; }
1730
+ advance_token(parser);
1731
+ }
1732
+ }
1733
+
1734
+ XPathToken* it = current_token(parser);
1735
+ if (!it || it->type != TOK_NCNAME || it->value_len != 2 ||
1736
+ memcmp(it->value, "in", 2) != 0) {
1737
+ snprintf(parser->error_msg, sizeof(parser->error_msg),
1738
+ "Expected 'in' in for expression");
1739
+ free(var_name);
1740
+ free(pos_name);
1741
+ return NULL;
1742
+ }
1743
+ advance_token(parser);
1744
+
1745
+ XPathASTNode* domain = parse_expr(parser);
1746
+ if (!domain) { free(var_name); free(pos_name); return NULL; }
1747
+
1748
+ /* XQuery `where` — desugars to if (W, R, ()). */
1749
+ XPathASTNode* where_ast = NULL;
1750
+ {
1751
+ XPathToken* wt = current_token(parser);
1752
+ if (wt && wt->type == TOK_NCNAME && wt->value_len == 5 &&
1753
+ memcmp(wt->value, "where", 5) == 0) {
1754
+ advance_token(parser);
1755
+ where_ast = parse_expr(parser);
1756
+ if (!where_ast) {
1757
+ ast_node_free(domain);
1758
+ free(var_name);
1759
+ free(pos_name);
1760
+ return NULL;
1761
+ }
1762
+ }
1763
+ }
1764
+
1765
+ XPathToken* rt = current_token(parser);
1766
+ if (!rt || rt->type != TOK_NCNAME || rt->value_len != 6 ||
1767
+ memcmp(rt->value, "return", 6) != 0) {
1768
+ snprintf(parser->error_msg, sizeof(parser->error_msg),
1769
+ "Expected 'return' in for expression");
1770
+ ast_node_free(domain);
1771
+ ast_node_free(where_ast);
1772
+ free(var_name);
1773
+ free(pos_name);
1774
+ return NULL;
1775
+ }
1776
+ advance_token(parser);
1777
+
1778
+ XPathASTNode* ret = parse_expr(parser);
1779
+ if (!ret) {
1780
+ ast_node_free(domain);
1781
+ ast_node_free(where_ast);
1782
+ free(var_name);
1783
+ free(pos_name);
1784
+ return NULL;
1785
+ }
1786
+
1787
+ if (where_ast) {
1788
+ /* if (W, R, ()) — the empty sequence is a zero-child
1789
+ * SEQUENCE. */
1790
+ XPathASTNode* guard = ast_node_new(XPATH_AST_OPERATOR);
1791
+ XPathASTNode* empty = ast_node_new(XPATH_AST_OPERATOR);
1792
+ if (!guard || !empty) {
1793
+ ast_node_free(guard);
1794
+ ast_node_free(empty);
1795
+ ast_node_free(domain);
1796
+ ast_node_free(where_ast);
1797
+ ast_node_free(ret);
1798
+ free(var_name);
1799
+ free(pos_name);
1800
+ return NULL;
1801
+ }
1802
+ guard->number_value = (double)XPATH_OP_IF;
1803
+ empty->number_value = (double)XPATH_OP_SEQUENCE;
1804
+ ast_node_add_child(guard, where_ast);
1805
+ ast_node_add_child(guard, ret);
1806
+ ast_node_add_child(guard, empty);
1807
+ ret = guard;
1808
+ }
1809
+
1810
+ XPathASTNode* node = ast_node_new(XPATH_AST_OPERATOR);
1811
+ if (!node) {
1812
+ ast_node_free(domain);
1813
+ ast_node_free(ret);
1814
+ free(var_name);
1815
+ free(pos_name);
1816
+ return NULL;
1817
+ }
1818
+ node->number_value = (double)XPATH_OP_FOR;
1819
+ if (pos_name) {
1820
+ size_t vl = strlen(var_name), pl = strlen(pos_name);
1821
+ char* joined = (char*)malloc(vl + pl + 2);
1822
+ if (!joined) {
1823
+ ast_node_free(domain);
1824
+ ast_node_free(ret);
1825
+ free(var_name);
1826
+ free(pos_name);
1827
+ return NULL;
1828
+ }
1829
+ memcpy(joined, var_name, vl);
1830
+ joined[vl] = '\x01';
1831
+ memcpy(joined + vl + 1, pos_name, pl + 1);
1832
+ node->value = joined;
1833
+ free(var_name);
1834
+ free(pos_name);
1835
+ } else {
1836
+ node->value = var_name; /* the loop variable name */
1837
+ free(pos_name);
1838
+ }
1839
+ ast_node_add_child(node, domain);
1840
+ ast_node_add_child(node, ret);
1841
+ return node;
1842
+ }
1843
+
1844
+ /* XPath 3.1 `let $x := E1, $y := E2 ... return B`. Bindings are
1845
+ * comma-separated (a top-level comma never belongs to the binding
1846
+ * expression — sequences are parenthesized); each binding may
1847
+ * reference the earlier ones. The operator node carries [0..n-1]
1848
+ * = binding values, [n] = body; ->value space-joins the names. */
1849
+ /* XPath 2.0 quantified expression (#684):
1850
+ * ("some" | "every") "$" VarName "in" ExprSingle
1851
+ * ("," "$" VarName "in" ExprSingle)*
1852
+ * "satisfies" ExprSingle.
1853
+ * AST: SOME/EVERY operator whose children are the BINDING nodes
1854
+ * followed by the test; each BINDING carries the variable name in
1855
+ * ->value with its domain as the single child. */
1856
+ static XPathASTNode* parse_quantified_expr(XPathParser* parser) {
1857
+ XPathToken* q = current_token(parser);
1858
+ int is_every =
1859
+ q->value_len == 5; /* "some"=4, "every"=5 */
1860
+ advance_token(parser); /* consume some/every */
1861
+
1862
+ XPathASTNode* node = ast_node_new(XPATH_AST_OPERATOR);
1863
+ if (!node) return NULL;
1864
+ node->number_value =
1865
+ (double)(is_every ? XPATH_OP_EVERY : XPATH_OP_SOME);
1866
+
1867
+ do {
1868
+ XPathToken* d = current_token(parser);
1869
+ if (!d || d->type != TOK_DOLLAR) {
1870
+ snprintf(parser->error_msg, sizeof(parser->error_msg),
1871
+ "Expected '$' variable in quantified expression");
1872
+ ast_node_free(node);
1873
+ return NULL;
1874
+ }
1875
+ advance_token(parser);
1876
+ XPathToken* vt = current_token(parser);
1877
+ if (!vt || (vt->type != TOK_NCNAME && vt->type != TOK_QNAME)) {
1878
+ snprintf(parser->error_msg, sizeof(parser->error_msg),
1879
+ "Expected variable name in quantified expression");
1880
+ ast_node_free(node);
1881
+ return NULL;
1882
+ }
1883
+ char* var_name = token_to_string(vt);
1884
+ if (!var_name) { ast_node_free(node); return NULL; }
1885
+ advance_token(parser);
1886
+
1887
+ XPathToken* it = current_token(parser);
1888
+ if (!it || it->type != TOK_NCNAME || it->value_len != 2 ||
1889
+ memcmp(it->value, "in", 2) != 0) {
1890
+ snprintf(parser->error_msg, sizeof(parser->error_msg),
1891
+ "Expected 'in' in quantified expression");
1892
+ free(var_name);
1893
+ ast_node_free(node);
1894
+ return NULL;
1895
+ }
1896
+ advance_token(parser);
1897
+
1898
+ XPathASTNode* domain = parse_expr(parser);
1899
+ if (!domain) { free(var_name); ast_node_free(node); return NULL; }
1900
+
1901
+ XPathASTNode* binding = ast_node_new(XPATH_AST_OPERATOR);
1902
+ if (!binding) {
1903
+ free(var_name);
1904
+ ast_node_free(domain);
1905
+ ast_node_free(node);
1906
+ return NULL;
1907
+ }
1908
+ binding->number_value = (double)XPATH_OP_BINDING;
1909
+ binding->value = var_name;
1910
+ ast_node_add_child(binding, domain);
1911
+ ast_node_add_child(node, binding);
1912
+ } while (current_token_is(parser, TOK_COMMA) &&
1913
+ (advance_token(parser), 1));
1914
+
1915
+ XPathToken* st = current_token(parser);
1916
+ if (!st || st->type != TOK_NCNAME || st->value_len != 9 ||
1917
+ memcmp(st->value, "satisfies", 9) != 0) {
1918
+ snprintf(parser->error_msg, sizeof(parser->error_msg),
1919
+ "Expected 'satisfies' in quantified expression");
1920
+ ast_node_free(node);
1921
+ return NULL;
1922
+ }
1923
+ advance_token(parser);
1924
+
1925
+ XPathASTNode* test = parse_expr(parser);
1926
+ if (!test) { ast_node_free(node); return NULL; }
1927
+ ast_node_add_child(node, test);
1928
+ return node;
1929
+ }
1930
+
1931
+ static XPathASTNode* parse_let_expr(XPathParser* parser) {
1932
+ advance_token(parser); /* consume `let` */
1933
+
1934
+ XPathASTNode* node = ast_node_new(XPATH_AST_OPERATOR);
1935
+ if (!node) return NULL;
1936
+ node->number_value = (double)XPATH_OP_LET;
1937
+
1938
+ char* names = NULL;
1939
+ size_t names_len = 0, names_cap = 0;
1940
+
1941
+ for (;;) {
1942
+ XPathToken* d = current_token(parser);
1943
+ if (!d || d->type != TOK_DOLLAR) {
1944
+ snprintf(parser->error_msg, sizeof(parser->error_msg),
1945
+ "Expected '$' variable in let binding");
1946
+ goto fail;
1947
+ }
1948
+ advance_token(parser);
1949
+ XPathToken* vt = current_token(parser);
1950
+ if (!vt || (vt->type != TOK_NCNAME && vt->type != TOK_QNAME)) {
1951
+ snprintf(parser->error_msg, sizeof(parser->error_msg),
1952
+ "Expected variable name in let");
1953
+ goto fail;
1954
+ }
1955
+ char* var_name = token_to_string(vt);
1956
+ if (!var_name) goto fail;
1957
+ advance_token(parser);
1958
+
1959
+ if (!consume_token(parser, TOK_ASSIGN,
1960
+ "Expected ':=' in let binding")) {
1961
+ free(var_name);
1962
+ goto fail;
1963
+ }
1964
+
1965
+ XPathASTNode* val = parse_expr(parser);
1966
+ if (!val) { free(var_name); goto fail; }
1967
+
1968
+ /* Space-join the binding names (names contain no spaces). */
1969
+ size_t need = names_len + strlen(var_name) + 2;
1970
+ if (need > names_cap) {
1971
+ size_t cap = names_cap ? names_cap * 2 : 32;
1972
+ while (cap < need) cap *= 2;
1973
+ char* grown = (char*)realloc(names, cap);
1974
+ if (!grown) { free(var_name); ast_node_free(val); goto fail; }
1975
+ names = grown;
1976
+ names_cap = cap;
1977
+ }
1978
+ if (names_len) names[names_len++] = ' ';
1979
+ size_t vl = strlen(var_name);
1980
+ memcpy(names + names_len, var_name, vl);
1981
+ names_len += vl;
1982
+ names[names_len] = '\0';
1983
+ free(var_name);
1984
+
1985
+ ast_node_add_child(node, val);
1986
+
1987
+ if (current_token_is(parser, TOK_COMMA)) {
1988
+ advance_token(parser);
1989
+ continue;
1990
+ }
1991
+ break;
1992
+ }
1993
+
1994
+ XPathToken* rt = current_token(parser);
1995
+ if (!rt || rt->type != TOK_NCNAME || rt->value_len != 6 ||
1996
+ memcmp(rt->value, "return", 6) != 0) {
1997
+ snprintf(parser->error_msg, sizeof(parser->error_msg),
1998
+ "Expected 'return' in let expression");
1999
+ goto fail;
2000
+ }
2001
+ advance_token(parser);
2002
+
2003
+ XPathASTNode* body = parse_expr(parser);
2004
+ if (!body) goto fail;
2005
+ ast_node_add_child(node, body);
2006
+ node->value = names;
2007
+ return node;
2008
+
2009
+ fail:
2010
+ free(names);
2011
+ ast_node_free(node);
2012
+ return NULL;
2013
+ }
2014
+
2015
+ /* XQuery 3.0 switch: `switch (E) case T return R ...
2016
+ * default return D` (braceless — the XPath 3.1 braced form is
2017
+ * Saxon-rejected in expressions; XQuery's shape is the spec
2018
+ * one). First case whose test VALUE-equals the operand wins;
2019
+ * default is mandatory (XQuery 3.0 §3.10.2). */
2020
+ static XPathASTNode* parse_switch_expr(XPathParser* parser) {
2021
+ advance_token(parser); /* consume `switch` */
2022
+ if (!consume_token(parser, TOK_LPAREN, "Expected '(' after switch"))
2023
+ return NULL;
2024
+ XPathASTNode* operand = parse_expr(parser);
2025
+ if (!operand) return NULL;
2026
+ if (!consume_token(parser, TOK_RPAREN,
2027
+ "Expected ')' after switch operand")) {
2028
+ ast_node_free(operand);
2029
+ return NULL;
2030
+ }
2031
+ XPathASTNode* node = ast_node_new(XPATH_AST_OPERATOR);
2032
+ if (!node) { ast_node_free(operand); return NULL; }
2033
+ node->number_value = (double)XPATH_OP_SWITCH;
2034
+ ast_node_add_child(node, operand);
2035
+
2036
+ int have_default = 0;
2037
+ for (;;) {
2038
+ XPathToken* kw = current_token(parser);
2039
+ if (!kw || kw->type != TOK_NCNAME) {
2040
+ snprintf(parser->error_msg, sizeof(parser->error_msg),
2041
+ "Expected 'case' or 'default' in switch");
2042
+ ast_node_free(node);
2043
+ return NULL;
2044
+ }
2045
+ int is_default = kw->value_len == 7 &&
2046
+ memcmp(kw->value, "default", 7) == 0;
2047
+ int is_case = kw->value_len == 4 &&
2048
+ memcmp(kw->value, "case", 4) == 0;
2049
+ if (!is_default && !is_case) {
2050
+ snprintf(parser->error_msg, sizeof(parser->error_msg),
2051
+ "Expected 'case' or 'default' in switch");
2052
+ ast_node_free(node);
2053
+ return NULL;
2054
+ }
2055
+ advance_token(parser);
2056
+ if (is_case) {
2057
+ XPathASTNode* test = parse_expr(parser);
2058
+ if (!test) { ast_node_free(node); return NULL; }
2059
+ XPathToken* rt = current_token(parser);
2060
+ if (!rt || rt->type != TOK_NCNAME || rt->value_len != 6 ||
2061
+ memcmp(rt->value, "return", 6) != 0) {
2062
+ snprintf(parser->error_msg, sizeof(parser->error_msg),
2063
+ "Expected 'return' after switch case");
2064
+ ast_node_free(test);
2065
+ ast_node_free(node);
2066
+ return NULL;
2067
+ }
2068
+ advance_token(parser);
2069
+ XPathASTNode* res = parse_expr(parser);
2070
+ if (!res) { ast_node_free(node); return NULL; }
2071
+ ast_node_add_child(node, test);
2072
+ ast_node_add_child(node, res);
2073
+ } else {
2074
+ if (have_default) {
2075
+ snprintf(parser->error_msg, sizeof(parser->error_msg),
2076
+ "Duplicate default clause in switch");
2077
+ ast_node_free(node);
2078
+ return NULL;
2079
+ }
2080
+ have_default = 1;
2081
+ XPathToken* rt = current_token(parser);
2082
+ if (!rt || rt->type != TOK_NCNAME || rt->value_len != 6 ||
2083
+ memcmp(rt->value, "return", 6) != 0) {
2084
+ snprintf(parser->error_msg, sizeof(parser->error_msg),
2085
+ "Expected 'return' after switch default");
2086
+ ast_node_free(node);
2087
+ return NULL;
2088
+ }
2089
+ advance_token(parser);
2090
+ XPathASTNode* res = parse_expr(parser);
2091
+ if (!res) { ast_node_free(node); return NULL; }
2092
+ node->value = leptris_strdup("__switch_default");
2093
+ ast_node_add_child(node, res);
2094
+ return parse_postfix_ops(parser, node);
2095
+ }
2096
+ }
2097
+ }
2098
+ static XPathASTNode* parse_primary_expr(XPathParser* parser) {
2099
+ XPathToken* tok = current_token(parser);
2100
+ if (!tok) {
2101
+ if (parser->lexer && parser->lexer->input) {
2102
+ size_t byte_offset = (parser->lexer->end && parser->lexer->end >= parser->lexer->input)
2103
+ ? parser->lexer->end - parser->lexer->input
2104
+ : 0;
2105
+ leptris_set_error_with_context(
2106
+ LEPTRIS_ERROR_XPATH_SYNTAX,
2107
+ "Unexpected end of XPath expression",
2108
+ parser->lexer->input,
2109
+ byte_offset,
2110
+ parser->lexer->line,
2111
+ parser->lexer->column
2112
+ );
2113
+ }
2114
+
2115
+ snprintf(parser->error_msg, sizeof(parser->error_msg),
2116
+ "Unexpected EOF in primary expression");
2117
+ return NULL;
2118
+ }
2119
+
2120
+ /* Number literal */
2121
+ if (tok->type == TOK_NUMBER) {
2122
+ XPathASTNode* node = ast_node_new(XPATH_AST_NUMBER);
2123
+ if (!node) return NULL;
2124
+
2125
+ char* num_str = token_to_string(tok);
2126
+ if (num_str) {
2127
+ node->number_value = strtod(num_str, NULL);
2128
+ LEPTRIS_FREE(num_str);
2129
+ }
2130
+ advance_token(parser);
2131
+ return node;
2132
+ }
2133
+
2134
+ /* String literal */
2135
+ if (tok->type == TOK_STRING) {
2136
+ XPathASTNode* node = ast_node_new(XPATH_AST_STRING);
2137
+ if (!node) return NULL;
2138
+
2139
+ /* Remove quotes */
2140
+ if (tok->value_len >= 2) {
2141
+ size_t len = tok->value_len - 2;
2142
+ node->value = LEPTRIS_ALLOC_N(char, len + 1);
2143
+ if (node->value) {
2144
+ memcpy(node->value, tok->value + 1, len);
2145
+ node->value[len] = '\0';
2146
+ }
2147
+ }
2148
+ advance_token(parser);
2149
+ return node;
2150
+ }
2151
+
2152
+ /* Parenthesized expression */
2153
+ if (tok->type == TOK_LPAREN) {
2154
+ advance_token(parser);
2155
+ /* XPath 2.0 empty sequence `()` — a zero-child SEQUENCE
2156
+ * (the same shape `for ... where` desugars to). */
2157
+ if (current_token_is(parser, TOK_RPAREN)) {
2158
+ advance_token(parser);
2159
+ XPathASTNode* empty =
2160
+ ast_node_new(XPATH_AST_OPERATOR);
2161
+ if (!empty) return NULL;
2162
+ empty->number_value = (double)XPATH_OP_SEQUENCE;
2163
+ return empty;
2164
+ }
2165
+ XPathASTNode* expr = parse_expr(parser);
2166
+ if (!expr) return NULL;
2167
+
2168
+ /* XPath 2.0+ item sequence `('a','b',expr)`: comma after
2169
+ * the first member (XSLT 3.0). */
2170
+ if (current_token_is(parser, TOK_COMMA)) {
2171
+ XPathASTNode* seq = ast_node_new(XPATH_AST_OPERATOR);
2172
+ if (!seq) { ast_node_free(expr); return NULL; }
2173
+ seq->number_value = (double)XPATH_OP_SEQUENCE;
2174
+ ast_node_add_child(seq, expr);
2175
+ while (current_token_is(parser, TOK_COMMA)) {
2176
+ advance_token(parser);
2177
+ XPathASTNode* member = parse_expr(parser);
2178
+ if (!member) {
2179
+ ast_node_free(seq);
2180
+ return NULL;
2181
+ }
2182
+ ast_node_add_child(seq, member);
2183
+ }
2184
+ if (!consume_token(parser, TOK_RPAREN,
2185
+ "Expected ')' after sequence")) {
2186
+ ast_node_free(seq);
2187
+ return NULL;
2188
+ }
2189
+ return seq;
2190
+ }
2191
+
2192
+ if (!consume_token(parser, TOK_RPAREN, "Expected ')' after expression")) {
2193
+ ast_node_free(expr);
2194
+ return NULL;
2195
+ }
2196
+ return expr;
2197
+ }
2198
+
2199
+ /* Node-type tokens are node tests, not functions: XPath 1.0
2200
+ * defines no text()/node()/comment()/processing-instruction()
2201
+ * function. `text()` in expression position (e.g. inside a
2202
+ * predicate, a[text()]) is a relative location path — a single
2203
+ * child-axis step with a type node test. */
2204
+ if (tok->type >= TOK_COMMENT && tok->type <= TOK_NODE) {
2205
+ XPathToken* next = peek_token(parser, 1);
2206
+
2207
+ if (next && next->type == TOK_LPAREN) {
2208
+ XPathASTNode* node = ast_node_new(XPATH_AST_STEP);
2209
+ if (!node) return NULL;
2210
+ node->value = leptris_strdup("child");
2211
+ node->axis_id = XPATH_AXIS_CHILD;
2212
+
2213
+ XPathASTNode* test = parse_node_test(parser);
2214
+ if (!test) {
2215
+ ast_node_free(node);
2216
+ return NULL;
2217
+ }
2218
+ ast_node_add_child(node, test);
2219
+ return node;
2220
+ }
2221
+ }
2222
+
2223
+ /* `for $v in EXPR return EXPR` — token after `for` is `$`;
2224
+ * value-matched keyword keeps name tests intact. */
2225
+ if (tok->type == TOK_NCNAME && tok->value_len == 3 &&
2226
+ memcmp(tok->value, "for", 3) == 0) {
2227
+ XPathToken* fn = peek_token(parser, 1);
2228
+ if (fn && fn->type == TOK_DOLLAR)
2229
+ return parse_for_expr(parser);
2230
+ }
2231
+
2232
+ /* XPath 2.0 quantified `some`/`every $v in E satisfies T` —
2233
+ * the $-lookahead guard keeps name tests intact (#684). */
2234
+ if (tok->type == TOK_NCNAME &&
2235
+ ((tok->value_len == 4 && memcmp(tok->value, "some", 4) == 0) ||
2236
+ (tok->value_len == 5 && memcmp(tok->value, "every", 5) == 0))) {
2237
+ XPathToken* fn = peek_token(parser, 1);
2238
+ if (fn && fn->type == TOK_DOLLAR)
2239
+ return parse_quantified_expr(parser);
2240
+ }
2241
+
2242
+ /* XQuery 3.0 `switch (E) case ...` — the '('-lookahead guard
2243
+ * keeps name tests intact (#692). */
2244
+ if (tok->type == TOK_NCNAME && tok->value_len == 6 &&
2245
+ memcmp(tok->value, "switch", 6) == 0) {
2246
+ XPathToken* fn = peek_token(parser, 1);
2247
+ if (fn && fn->type == TOK_LPAREN)
2248
+ return parse_switch_expr(parser);
2249
+ }
2250
+
2251
+ /* XQuery 3.0 computed array constructor `array { E }` (#692). */
2252
+ if (tok->type == TOK_NCNAME && tok->value_len == 5 &&
2253
+ memcmp(tok->value, "array", 5) == 0) {
2254
+ XPathToken* fn = peek_token(parser, 1);
2255
+ if (fn && fn->type == TOK_LBRACE) {
2256
+ advance_token(parser);
2257
+ advance_token(parser);
2258
+ XPathASTNode* ac = ast_node_new(XPATH_AST_OPERATOR);
2259
+ if (!ac) return NULL;
2260
+ ac->number_value = (double)XPATH_OP_ARRAY_OF;
2261
+ /* Comma-separated content exprs (each's ITEMS flatten
2262
+ * into the array, #692 §3.10.3). */
2263
+ if (current_token_is(parser, TOK_RBRACE) &&
2264
+ ac->child_count == 0) {
2265
+ /* empty array */
2266
+ } else
2267
+ for (;;) {
2268
+ XPathASTNode* item = parse_expr(parser);
2269
+ if (!item) { ast_node_free(ac); return NULL; }
2270
+ ast_node_add_child(ac, item);
2271
+ if (current_token_is(parser, TOK_COMMA)) {
2272
+ advance_token(parser);
2273
+ continue;
2274
+ }
2275
+ break;
2276
+ }
2277
+ if (!current_token_is(parser, TOK_RBRACE)) {
2278
+ snprintf(parser->error_msg, sizeof(parser->error_msg),
2279
+ "Expected '}' after array content");
2280
+ ast_node_free(ac);
2281
+ return NULL;
2282
+ }
2283
+ advance_token(parser);
2284
+ return parse_postfix_ops(parser, ac);
2285
+ }
2286
+ }
2287
+
2288
+ /* XPath 3.1 `let $x := E return B` — same $-lookahead guard. */
2289
+ if (tok->type == TOK_NCNAME && tok->value_len == 3 &&
2290
+ memcmp(tok->value, "let", 3) == 0) {
2291
+ XPathToken* fn = peek_token(parser, 1);
2292
+ if (fn && fn->type == TOK_DOLLAR)
2293
+ return parse_let_expr(parser);
2294
+ }
2295
+
2296
+ /* Function call with NCName/QName */
2297
+ if (tok->type == TOK_NCNAME || tok->type == TOK_QNAME) {
2298
+ XPathToken name_token = *tok;
2299
+ XPathToken* next = peek_token(parser, 1);
2300
+
2301
+ if (next && next->type == TOK_LPAREN) {
2302
+ /* XPath 2.0+ `if (cond) then A else B`: `if` followed by
2303
+ * `(` is the conditional form — XSLT 3.0 expressions.
2304
+ * `then`/`else` are matched by VALUE at the expected
2305
+ * position so NCName name tests keep working. */
2306
+ if (tok->type == TOK_NCNAME && tok->value_len == 2 &&
2307
+ memcmp(tok->value, "if", 2) == 0) {
2308
+ return parse_if_expr(parser);
2309
+ }
2310
+ advance_token(parser);
2311
+ return parse_function_call(parser, name_token.value, name_token.value_len);
2312
+ }
2313
+ }
2314
+
2315
+ /* Variable reference: $varname */
2316
+ if (tok->type == TOK_DOLLAR) {
2317
+ advance_token(parser); /* Consume $ */
2318
+
2319
+ /* Expect variable name (NCName) */
2320
+ XPathToken* name_tok = current_token(parser);
2321
+ if (!name_tok || (name_tok->type != TOK_NCNAME && name_tok->type != TOK_QNAME)) {
2322
+ snprintf(parser->error_msg, sizeof(parser->error_msg),
2323
+ "Expected variable name after $ at line %d, column %d",
2324
+ tok->line, tok->column);
2325
+ return NULL;
2326
+ }
2327
+
2328
+ XPathASTNode* node = ast_node_new(XPATH_AST_VARIABLE_REFERENCE);
2329
+ if (!node) return NULL;
2330
+
2331
+ /* Store variable name */
2332
+ node->value = LEPTRIS_ALLOC_N(char, name_tok->value_len + 1);
2333
+ if (node->value) {
2334
+ memcpy(node->value, name_tok->value, name_tok->value_len);
2335
+ node->value[name_tok->value_len] = '\0';
2336
+ }
2337
+
2338
+ advance_token(parser); /* Consume variable name */
2339
+ return node;
2340
+ }
2341
+
2342
+ if (parser->lexer && parser->lexer->input && tok->value) {
2343
+ size_t byte_offset = (tok->value >= parser->lexer->input)
2344
+ ? tok->value - parser->lexer->input
2345
+ : 0;
2346
+ char msg[256];
2347
+ snprintf(msg, sizeof(msg),
2348
+ "Unexpected token in primary expression: %s",
2349
+ xpath_token_type_to_string(tok->type));
2350
+
2351
+ leptris_set_error_with_context(
2352
+ LEPTRIS_ERROR_XPATH_SYNTAX,
2353
+ msg,
2354
+ parser->lexer->input,
2355
+ byte_offset,
2356
+ tok->line,
2357
+ tok->column
2358
+ );
2359
+ }
2360
+
2361
+ snprintf(parser->error_msg, sizeof(parser->error_msg),
2362
+ "Unexpected token %s at line %d, column %d in primary expression",
2363
+ xpath_token_type_to_string(tok->type),
2364
+ tok->line, tok->column);
2365
+ return NULL;
2366
+ }
2367
+
2368
+ /* Parse function call */
2369
+ static XPathASTNode* parse_function_call(XPathParser* parser, const char* name, size_t name_len) {
2370
+ XPathASTNode* node = ast_node_new(XPATH_AST_FUNCTION_CALL);
2371
+ if (!node) return NULL;
2372
+
2373
+ node->value = LEPTRIS_ALLOC_N(char, name_len + 1);
2374
+ if (node->value) {
2375
+ memcpy(node->value, name, name_len);
2376
+ node->value[name_len] = '\0';
2377
+ }
2378
+
2379
+ if (!consume_token(parser, TOK_LPAREN, "Expected '(' after function name")) {
2380
+ ast_node_free(node);
2381
+ return NULL;
2382
+ }
2383
+
2384
+ /* Parse arguments. A leading `?` is a partial-application
2385
+ * placeholder: concat('x', ?, 'z') desugars to the inline fn
2386
+ * function($_1){ concat('x', $_1, 'z') } — the placeholder
2387
+ * becomes a variable reference bound at dynamic-call time. */
2388
+ size_t holes = 0;
2389
+ if (!current_token_is(parser, TOK_RPAREN)) {
2390
+ do {
2391
+ if (current_token_is(parser, TOK_QUESTION)) {
2392
+ advance_token(parser);
2393
+ /* Hole names cannot collide with user variables
2394
+ * (NCNames exclude '%') and must not embed '\x01' —
2395
+ * that byte separates the INLINE_FN params string. */
2396
+ char pname[16];
2397
+ snprintf(pname, sizeof(pname), "%%%zu", holes + 1);
2398
+ XPathASTNode* v =
2399
+ ast_node_new(XPATH_AST_VARIABLE_REFERENCE);
2400
+ if (v) v->value = leptris_strdup(pname);
2401
+ if (!v || !v->value) {
2402
+ ast_node_free(v);
2403
+ ast_node_free(node);
2404
+ return NULL;
2405
+ }
2406
+ ast_node_add_child(node, v);
2407
+ holes++;
2408
+ continue;
2409
+ }
2410
+ XPathASTNode* arg = parse_expr(parser);
2411
+ if (!arg) {
2412
+ ast_node_free(node);
2413
+ return NULL;
2414
+ }
2415
+ ast_node_add_child(node, arg);
2416
+ } while (match_token(parser, TOK_COMMA));
2417
+ }
2418
+
2419
+ if (!consume_token(parser, TOK_RPAREN, "Expected ')' after function arguments")) {
2420
+ ast_node_free(node);
2421
+ return NULL;
2422
+ }
2423
+
2424
+ if (!holes) return node;
2425
+
2426
+ /* Re-wrap the call as an inline function over the hole params
2427
+ * (joined with '\x01', matching the INLINE_FN format). */
2428
+ char params[128];
2429
+ size_t plen = 0;
2430
+ for (size_t i = 1; i <= holes; i++) {
2431
+ int w = snprintf(params + plen, sizeof(params) - plen,
2432
+ i > 1 ? "\x01%%%zu" : "%%%zu", i);
2433
+ if (w < 0 || (size_t)w >= sizeof(params) - plen) {
2434
+ ast_node_free(node);
2435
+ return NULL;
2436
+ }
2437
+ plen += (size_t)w;
2438
+ }
2439
+ XPathASTNode* fn = ast_node_new(XPATH_AST_OPERATOR);
2440
+ if (!fn) { ast_node_free(node); return NULL; }
2441
+ fn->number_value = (double)XPATH_OP_INLINE_FN;
2442
+ fn->value = leptris_strdup(params);
2443
+ if (!fn->value) { ast_node_free(fn); ast_node_free(node); return NULL; }
2444
+ ast_node_add_child(fn, node);
2445
+ return parse_postfix_ops(parser, fn);
2446
+ }
2447
+
2448
+ /* ============================================================================
2449
+ * Location Path Parsers
2450
+ * ============================================================================ */
2451
+
2452
+ /* Parse location path */
2453
+ static XPathASTNode* parse_location_path(XPathParser* parser) {
2454
+ XPathASTNode* node;
2455
+
2456
+ /* Absolute path starting with / */
2457
+ if (current_token_is(parser, TOK_SLASH)) {
2458
+ advance_token(parser);
2459
+
2460
+ node = ast_node_new(XPATH_AST_ABSOLUTE_PATH);
2461
+ if (!node) return NULL;
2462
+
2463
+ /* If followed by a step, parse relative path */
2464
+ if (!current_token_is(parser, TOK_EOF) &&
2465
+ !current_token_is(parser, TOK_RPAREN) &&
2466
+ !current_token_is(parser, TOK_RBRACKET) &&
2467
+ !current_token_is(parser, TOK_PIPE)) {
2468
+
2469
+ XPathASTNode* rel = parse_relative_location_path(parser);
2470
+ if (!rel) {
2471
+ ast_node_free(node);
2472
+ return NULL;
2473
+ }
2474
+ ast_node_add_child(node, rel);
2475
+ }
2476
+
2477
+ return node;
2478
+ }
2479
+
2480
+ /* Absolute path starting with // */
2481
+ if (current_token_is(parser, TOK_DOUBLE_SLASH)) {
2482
+ advance_token(parser);
2483
+
2484
+ node = ast_node_new(XPATH_AST_ABSOLUTE_PATH);
2485
+ if (!node) return NULL;
2486
+
2487
+ /* Optimization: double-slash followed by star should be a single descendant-or-self::* step,
2488
+ * not two steps (descendant-or-self::node() + child::*).
2489
+ * This matches how most XPath implementations handle double-slash-star for efficiency. */
2490
+ if (current_token_is(parser, TOK_STAR)) {
2491
+ /* Create single step: descendant-or-self::* */
2492
+ XPathASTNode* desc_step = ast_node_new(XPATH_AST_STEP);
2493
+ if (!desc_step) {
2494
+ ast_node_free(node);
2495
+ return NULL;
2496
+ }
2497
+ desc_step->value = leptris_strdup("descendant-or-self");
2498
+ desc_step->axis_id = XPATH_AXIS_DESCENDANT_OR_SELF;
2499
+
2500
+ /* Use wildcard node test instead of node() */
2501
+ XPathASTNode* node_test = ast_node_new(XPATH_AST_NODE_TEST_ALL);
2502
+ if (!node_test) {
2503
+ ast_node_free(desc_step);
2504
+ ast_node_free(node);
2505
+ return NULL;
2506
+ }
2507
+ ast_node_add_child(desc_step, node_test);
2508
+
2509
+ /* Consume the * token */
2510
+ advance_token(parser);
2511
+
2512
+ /* Parse predicates (FIX: was missing before!) */
2513
+ while (current_token_is(parser, TOK_LBRACKET)) {
2514
+ XPathASTNode* pred = parse_predicate(parser);
2515
+ if (!pred) {
2516
+ ast_node_free(desc_step);
2517
+ ast_node_free(node);
2518
+ return NULL;
2519
+ }
2520
+ ast_node_add_child(desc_step, pred);
2521
+ }
2522
+
2523
+ ast_node_add_child(node, desc_step);
2524
+
2525
+ return node;
2526
+ }
2527
+
2528
+ /* General case: Add descendant-or-self::node() step */
2529
+ XPathASTNode* desc_step = ast_node_new(XPATH_AST_STEP);
2530
+ if (!desc_step) {
2531
+ ast_node_free(node);
2532
+ return NULL;
2533
+ }
2534
+
2535
+ desc_step->value = leptris_strdup("descendant-or-self");
2536
+ desc_step->axis_id = XPATH_AXIS_DESCENDANT_OR_SELF;
2537
+ XPathASTNode* node_test = ast_node_new(XPATH_AST_NODE_TEST_TYPE);
2538
+ if (!node_test) {
2539
+ ast_node_free(desc_step);
2540
+ ast_node_free(node);
2541
+ return NULL;
2542
+ }
2543
+ node_test->value = leptris_strdup("node");
2544
+ ast_node_add_child(desc_step, node_test);
2545
+ ast_node_add_child(node, desc_step);
2546
+
2547
+ /* Parse relative path */
2548
+ XPathASTNode* rel = parse_relative_location_path(parser);
2549
+ if (!rel) {
2550
+ ast_node_free(node);
2551
+ return NULL;
2552
+ }
2553
+ if (rel->type == XPATH_AST_OPERATOR) {
2554
+ /* Postfix fn-step rehang (#692): the map chain's leftmost
2555
+ * RELATIVE_PATH folds INTO the absolute path so the
2556
+ * absolute evaluator only ever sees plain steps; the map
2557
+ * then applies per item over the absolute result. */
2558
+ XPathASTNode* m = rel;
2559
+ while (m->children[0]->type == XPATH_AST_OPERATOR)
2560
+ m = m->children[0];
2561
+ XPathASTNode* r = m->children[0];
2562
+ for (size_t i = 0; i < r->child_count; i++)
2563
+ ast_node_add_child(node, r->children[i]);
2564
+ r->child_count = 0;
2565
+ ast_node_free(r);
2566
+ m->children[0] = node;
2567
+ return rel;
2568
+ }
2569
+ ast_node_add_child(node, rel);
2570
+
2571
+ return node;
2572
+ }
2573
+
2574
+ /* Relative path */
2575
+ XPathASTNode* rel = parse_relative_location_path(parser);
2576
+ if (!rel) return NULL;
2577
+
2578
+ /* Unwrap single-step relative paths */
2579
+ if (rel->type == XPATH_AST_RELATIVE_PATH && rel->child_count == 1) {
2580
+ XPathASTNode* single_step = rel->children[0];
2581
+ rel->children[0] = NULL;
2582
+ rel->child_count = 0;
2583
+ ast_node_free(rel);
2584
+ return single_step;
2585
+ }
2586
+
2587
+ return rel;
2588
+ }
2589
+
2590
+ /* Parse relative location path. A name directly followed by '(' in
2591
+ * STEP position is a postfix FUNCTION step (XPath 2.0+ PostfixExpr,
2592
+ * #692) — node-test keywords (text/comment/node) lex as their own
2593
+ * tokens, so they never reach this branch. It desugars to the simple
2594
+ * map; after the first one every later step maps per item too. */
2595
+ static XPathASTNode* parse_relative_location_path(XPathParser* parser) {
2596
+ XPathASTNode* node = ast_node_new(XPATH_AST_RELATIVE_PATH);
2597
+ if (!node) return NULL;
2598
+
2599
+ /* Parse first step */
2600
+ XPathASTNode* step = parse_step(parser);
2601
+ if (!step) {
2602
+ ast_node_free(node);
2603
+ return NULL;
2604
+ }
2605
+ ast_node_add_child(node, step);
2606
+
2607
+ XPathASTNode* left = node;
2608
+ int mapped = 0;
2609
+
2610
+ /* Parse additional steps */
2611
+ while (current_token_is(parser, TOK_SLASH) || current_token_is(parser, TOK_DOUBLE_SLASH)) {
2612
+ int is_double = current_token_is(parser, TOK_DOUBLE_SLASH);
2613
+ advance_token(parser);
2614
+
2615
+ if (!mapped &&
2616
+ (current_token_is(parser, TOK_NCNAME) ||
2617
+ current_token_is(parser, TOK_QNAME)) &&
2618
+ peek_token(parser, 1) &&
2619
+ peek_token(parser, 1)->type == TOK_LPAREN) {
2620
+ XPathToken nt = *current_token(parser);
2621
+ advance_token(parser);
2622
+ XPathASTNode* fc =
2623
+ parse_function_call(parser, nt.value, nt.value_len);
2624
+ XPathASTNode* map =
2625
+ fc ? ast_node_new(XPATH_AST_OPERATOR) : NULL;
2626
+ if (!map) {
2627
+ ast_node_free(fc);
2628
+ ast_node_free(left);
2629
+ return NULL;
2630
+ }
2631
+ map->number_value = (double)XPATH_OP_MAP;
2632
+ ast_node_add_child(map, left);
2633
+ ast_node_add_child(map, fc);
2634
+ left = map;
2635
+ mapped = 1;
2636
+ continue;
2637
+ }
2638
+
2639
+ /* Steps after a function step: a fresh relative path mapped
2640
+ * per item; plain steps append to the container as before. */
2641
+ XPathASTNode* step_host = mapped
2642
+ ? ast_node_new(XPATH_AST_RELATIVE_PATH) : node;
2643
+ if (!step_host) {
2644
+ ast_node_free(left);
2645
+ return NULL;
2646
+ }
2647
+
2648
+ if (is_double) {
2649
+ /* Insert descendant-or-self::node() step */
2650
+ XPathASTNode* desc_step = ast_node_new(XPATH_AST_STEP);
2651
+ if (!desc_step) {
2652
+ if (mapped) ast_node_free(step_host);
2653
+ ast_node_free(left);
2654
+ return NULL;
2655
+ }
2656
+ desc_step->value = leptris_strdup("descendant-or-self");
2657
+ desc_step->axis_id = XPATH_AXIS_DESCENDANT_OR_SELF;
2658
+ XPathASTNode* node_test = ast_node_new(XPATH_AST_NODE_TEST_TYPE);
2659
+ if (node_test) {
2660
+ node_test->value = leptris_strdup("node");
2661
+ }
2662
+ ast_node_add_child(desc_step, node_test);
2663
+ ast_node_add_child(step_host, desc_step);
2664
+ }
2665
+
2666
+ step = parse_step(parser);
2667
+ if (!step) {
2668
+ if (mapped) ast_node_free(step_host);
2669
+ ast_node_free(left);
2670
+ return NULL;
2671
+ }
2672
+ ast_node_add_child(step_host, step);
2673
+
2674
+ if (mapped) {
2675
+ XPathASTNode* map = ast_node_new(XPATH_AST_OPERATOR);
2676
+ if (!map) {
2677
+ ast_node_free(step_host);
2678
+ ast_node_free(left);
2679
+ return NULL;
2680
+ }
2681
+ map->number_value = (double)XPATH_OP_MAP;
2682
+ ast_node_add_child(map, left);
2683
+ ast_node_add_child(map, step_host);
2684
+ left = map;
2685
+ }
2686
+ }
2687
+
2688
+ return left;
2689
+ }
2690
+
2691
+ /* Parse step */
2692
+ static XPathASTNode* parse_step(XPathParser* parser) {
2693
+ /* Handle abbreviated steps */
2694
+ if (current_token_is(parser, TOK_DOT)) {
2695
+ advance_token(parser);
2696
+ XPathASTNode* node = ast_node_new(XPATH_AST_STEP);
2697
+ if (node) {
2698
+ node->value = leptris_strdup("self");
2699
+ node->axis_id = XPATH_AXIS_SELF;
2700
+ /* "." is self::node() — a KIND test, not "*": it must
2701
+ * match any node kind (text/comment/PI/namespace), while
2702
+ * the name wildcard stays elements-only. */
2703
+ XPathASTNode* test = ast_node_new(XPATH_AST_NODE_TEST_TYPE);
2704
+ if (test) test->value = leptris_strdup("node");
2705
+ ast_node_add_child(node, test);
2706
+ }
2707
+ return node;
2708
+ }
2709
+
2710
+ if (current_token_is(parser, TOK_DOUBLE_DOT)) {
2711
+ advance_token(parser);
2712
+ XPathASTNode* node = ast_node_new(XPATH_AST_STEP);
2713
+ if (node) {
2714
+ node->value = leptris_strdup("parent");
2715
+ node->axis_id = XPATH_AXIS_PARENT;
2716
+ XPathASTNode* test = ast_node_new(XPATH_AST_NODE_TEST_ALL);
2717
+ ast_node_add_child(node, test);
2718
+ }
2719
+ return node;
2720
+ }
2721
+
2722
+ /* Handle @ abbreviation */
2723
+ if (current_token_is(parser, TOK_AT)) {
2724
+ advance_token(parser);
2725
+ XPathASTNode* node = ast_node_new(XPATH_AST_STEP);
2726
+ if (!node) return NULL;
2727
+
2728
+ node->value = leptris_strdup("attribute");
2729
+ node->axis_id = XPATH_AXIS_ATTRIBUTE;
2730
+
2731
+ XPathASTNode* test = parse_node_test(parser);
2732
+ if (!test) {
2733
+ ast_node_free(node);
2734
+ return NULL;
2735
+ }
2736
+ ast_node_add_child(node, test);
2737
+
2738
+ /* Parse predicates */
2739
+ while (current_token_is(parser, TOK_LBRACKET)) {
2740
+ XPathASTNode* pred = parse_predicate(parser);
2741
+ if (!pred) {
2742
+ ast_node_free(node);
2743
+ return NULL;
2744
+ }
2745
+ ast_node_add_child(node, pred);
2746
+ }
2747
+
2748
+ return node;
2749
+ }
2750
+
2751
+ XPathASTNode* node = ast_node_new(XPATH_AST_STEP);
2752
+ if (!node) return NULL;
2753
+
2754
+ /* Check for axis specifier */
2755
+ char* axis = NULL;
2756
+ XPathToken* tok = current_token(parser);
2757
+
2758
+ if (tok && tok->type >= TOK_ANCESTOR && tok->type <= TOK_SELF) {
2759
+ axis = token_to_string(tok);
2760
+ advance_token(parser);
2761
+
2762
+ if (!consume_token(parser, TOK_DOUBLE_COLON, "Expected '::' after axis name")) {
2763
+ if (axis) LEPTRIS_FREE(axis);
2764
+ ast_node_free(node);
2765
+ return NULL;
2766
+ }
2767
+ }
2768
+
2769
+ node->value = axis ? leptris_strdup(axis) : leptris_strdup("child");
2770
+ if (axis) LEPTRIS_FREE(axis);
2771
+
2772
+ /* Pre-compute axis enum so apply_axis can dispatch via switch
2773
+ * instead of strcmp chain (TODO 113 Phase 1). */
2774
+ node->axis_id = xpath_axis_from_name(node->value);
2775
+
2776
+ /* Parse node test */
2777
+ XPathASTNode* test = parse_node_test(parser);
2778
+ if (!test) {
2779
+ ast_node_free(node);
2780
+ return NULL;
2781
+ }
2782
+ ast_node_add_child(node, test);
2783
+
2784
+ /* Parse predicates */
2785
+ while (current_token_is(parser, TOK_LBRACKET)) {
2786
+ XPathASTNode* pred = parse_predicate(parser);
2787
+ if (!pred) {
2788
+ ast_node_free(node);
2789
+ return NULL;
2790
+ }
2791
+ ast_node_add_child(node, pred);
2792
+ }
2793
+
2794
+ return node;
2795
+ }
2796
+
2797
+ /* ============================================================================
2798
+ * Node Test and Predicate Parsers
2799
+ * ============================================================================ */
2800
+
2801
+ /* Parse node test */
2802
+ static XPathASTNode* parse_node_test(XPathParser* parser) {
2803
+ XPathToken* tok = current_token(parser);
2804
+ if (!tok) {
2805
+ if (parser->lexer && parser->lexer->input) {
2806
+ size_t byte_offset = (parser->lexer->end && parser->lexer->end >= parser->lexer->input)
2807
+ ? parser->lexer->end - parser->lexer->input
2808
+ : 0;
2809
+ leptris_set_error_with_context(
2810
+ LEPTRIS_ERROR_XPATH_SYNTAX,
2811
+ "Expected node test, got end of expression",
2812
+ parser->lexer->input,
2813
+ byte_offset,
2814
+ parser->lexer->line,
2815
+ parser->lexer->column
2816
+ );
2817
+ }
2818
+
2819
+ snprintf(parser->error_msg, sizeof(parser->error_msg),
2820
+ "Expected node test at EOF");
2821
+ return NULL;
2822
+ }
2823
+
2824
+ /* Node type tests */
2825
+ if (tok->type == TOK_COMMENT || tok->type == TOK_TEXT ||
2826
+ tok->type == TOK_NODE || tok->type == TOK_PROCESSING_INSTRUCTION) {
2827
+
2828
+ XPathASTNode* node = ast_node_new(XPATH_AST_NODE_TEST_TYPE);
2829
+ if (!node) return NULL;
2830
+
2831
+ node->value = token_to_string(tok);
2832
+ advance_token(parser);
2833
+
2834
+ if (!consume_token(parser, TOK_LPAREN, "Expected '(' after node type")) {
2835
+ ast_node_free(node);
2836
+ return NULL;
2837
+ }
2838
+
2839
+ if (current_token_is(parser, TOK_STRING)) {
2840
+ /* PI node test target argument, e.g.,
2841
+ * processing-instruction('xml-stylesheet'). The lexer
2842
+ * includes the surrounding quotes in token->value; strip
2843
+ * them so local_name holds the bare target name. */
2844
+ const XPathToken* lit_tok = current_token(parser);
2845
+ if (lit_tok->value_len >= 2 &&
2846
+ (lit_tok->value[0] == '\'' || lit_tok->value[0] == '"') &&
2847
+ lit_tok->value[0] == lit_tok->value[lit_tok->value_len - 1]) {
2848
+ size_t inner_len = lit_tok->value_len - 2;
2849
+ char* arg = LEPTRIS_ALLOC_N(char, inner_len + 1);
2850
+ if (arg) {
2851
+ memcpy(arg, lit_tok->value + 1, inner_len);
2852
+ arg[inner_len] = '\0';
2853
+ node->local_name = arg;
2854
+ }
2855
+ } else {
2856
+ node->local_name = token_to_string(lit_tok);
2857
+ }
2858
+ advance_token(parser);
2859
+ }
2860
+
2861
+ if (!consume_token(parser, TOK_RPAREN, "Expected ')' after node type")) {
2862
+ ast_node_free(node);
2863
+ return NULL;
2864
+ }
2865
+
2866
+ return node;
2867
+ }
2868
+
2869
+ /* Check for namespace wildcard: prefix:*
2870
+ * Lexer produces: TOK_NCNAME("prefix") followed by TOK_STAR
2871
+ * when it sees prefix:* because * is not an ncname_start char */
2872
+ if (tok->type == TOK_NCNAME) {
2873
+ XPathToken* next = peek_token(parser, 1);
2874
+
2875
+ /* Check if next token is * (namespace wildcard pattern) */
2876
+ if (next && next->type == TOK_STAR) {
2877
+ /* This is prefix:* pattern */
2878
+ XPathASTNode* node = ast_node_new(XPATH_AST_NODE_TEST_ALL);
2879
+ if (!node) return NULL;
2880
+
2881
+ /* Set prefix from NCName token */
2882
+ node->prefix = token_to_string(tok);
2883
+ node->value = leptris_strdup("*");
2884
+
2885
+ advance_token(parser); /* Consume NCName */
2886
+ advance_token(parser); /* Consume STAR */
2887
+
2888
+ return node;
2889
+ }
2890
+ /* Otherwise fall through to normal name test handling below */
2891
+ }
2892
+
2893
+ /* Wildcard */
2894
+ if (tok->type == TOK_STAR) {
2895
+ advance_token(parser);
2896
+ return ast_node_new(XPATH_AST_NODE_TEST_ALL);
2897
+ }
2898
+
2899
+ /* Name test */
2900
+ if (tok->type == TOK_NCNAME || tok->type == TOK_QNAME) {
2901
+ XPathASTNode* node = ast_node_new(XPATH_AST_NODE_TEST_NAME);
2902
+ if (!node) return NULL;
2903
+
2904
+ /* Get full QName string */
2905
+ char* full_name = token_to_string(tok);
2906
+ if (!full_name) {
2907
+ ast_node_free(node);
2908
+ return NULL;
2909
+ }
2910
+
2911
+ /* Split into prefix and local name (v0.8.0 namespace support) */
2912
+ char* colon = strchr(full_name, ':');
2913
+ if (colon && tok->type == TOK_QNAME) {
2914
+ /* Has namespace prefix */
2915
+ size_t prefix_len = colon - full_name;
2916
+ node->prefix = LEPTRIS_ALLOC_N(char, prefix_len + 1);
2917
+ if (node->prefix) {
2918
+ memcpy(node->prefix, full_name, prefix_len);
2919
+ node->prefix[prefix_len] = '\0';
2920
+ }
2921
+ node->local_name = leptris_strdup(colon + 1);
2922
+ } else {
2923
+ /* No prefix - simple NCName */
2924
+ node->prefix = NULL;
2925
+ node->local_name = leptris_strdup(full_name);
2926
+ }
2927
+
2928
+ node->value = full_name; /* Keep full name for backward compat */
2929
+ advance_token(parser);
2930
+
2931
+ return node;
2932
+ }
2933
+
2934
+ /* v1.1.0: Allow operator keywords as element names in node tests
2935
+ * This fixes axis::name syntax where name happens to be a keyword
2936
+ * e.g., ancestor::div, child::mod, parent::and, self::or */
2937
+ if (tok->type == TOK_DIV || tok->type == TOK_MOD ||
2938
+ tok->type == TOK_AND || tok->type == TOK_OR) {
2939
+ XPathASTNode* node = ast_node_new(XPATH_AST_NODE_TEST_NAME);
2940
+ if (!node) return NULL;
2941
+
2942
+ char* name = token_to_string(tok);
2943
+ if (!name) {
2944
+ ast_node_free(node);
2945
+ return NULL;
2946
+ }
2947
+
2948
+ node->prefix = NULL;
2949
+ node->local_name = leptris_strdup(name);
2950
+ node->value = name;
2951
+ advance_token(parser);
2952
+
2953
+ return node;
2954
+ }
2955
+
2956
+ if (parser->lexer && parser->lexer->input && tok->value) {
2957
+ size_t byte_offset = (tok->value >= parser->lexer->input)
2958
+ ? tok->value - parser->lexer->input
2959
+ : 0;
2960
+
2961
+ leptris_set_error_with_context(
2962
+ LEPTRIS_ERROR_XPATH_SYNTAX,
2963
+ "Expected node test",
2964
+ parser->lexer->input,
2965
+ byte_offset,
2966
+ tok->line,
2967
+ tok->column
2968
+ );
2969
+ }
2970
+
2971
+ snprintf(parser->error_msg, sizeof(parser->error_msg),
2972
+ "Expected node test at line %d, column %d",
2973
+ tok->line, tok->column);
2974
+ return NULL;
2975
+ }
2976
+
2977
+ /* Parse predicate */
2978
+ static XPathASTNode* parse_predicate(XPathParser* parser) {
2979
+ if (!consume_token(parser, TOK_LBRACKET, "Expected '[' to start predicate")) {
2980
+ return NULL;
2981
+ }
2982
+
2983
+ XPathASTNode* expr = parse_expr(parser);
2984
+ if (!expr) return NULL;
2985
+
2986
+ if (!consume_token(parser, TOK_RBRACKET, "Expected ']' to end predicate")) {
2987
+ ast_node_free(expr);
2988
+ return NULL;
2989
+ }
2990
+
2991
+ return expr;
2992
+ }