kibi-swipl-linux-x64-gnu 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (550) hide show
  1. package/README.md +29 -0
  2. package/bin/swipl +0 -0
  3. package/bin/swipl-win +0 -0
  4. package/build-manifest.json +70 -0
  5. package/lib/cmake/swipl/SWIPLConfig.cmake +21 -0
  6. package/lib/cmake/swipl/SWIPLConfigVersion.cmake +65 -0
  7. package/lib/cmake/swipl/SWIPLTargets-release.cmake +28 -0
  8. package/lib/cmake/swipl/SWIPLTargets.cmake +109 -0
  9. package/lib/swipl/ABI +1 -0
  10. package/lib/swipl/LICENSE +41 -0
  11. package/lib/swipl/README.md +116 -0
  12. package/lib/swipl/app/README.md +25 -0
  13. package/lib/swipl/app/app.pl +87 -0
  14. package/lib/swipl/app/pack.pl +350 -0
  15. package/lib/swipl/app/qlf.pl +521 -0
  16. package/lib/swipl/app/splfr.pl +177 -0
  17. package/lib/swipl/app/sys.pl +310 -0
  18. package/lib/swipl/bin/swipl.home +1 -0
  19. package/lib/swipl/boot/apply.pl +73 -0
  20. package/lib/swipl/boot/attvar.pl +344 -0
  21. package/lib/swipl/boot/autoload.pl +1226 -0
  22. package/lib/swipl/boot/bags.pl +283 -0
  23. package/lib/swipl/boot/dcg.pl +388 -0
  24. package/lib/swipl/boot/dicts.pl +193 -0
  25. package/lib/swipl/boot/dwim.pl +485 -0
  26. package/lib/swipl/boot/engines.pl +152 -0
  27. package/lib/swipl/boot/expand.pl +1628 -0
  28. package/lib/swipl/boot/gc.pl +65 -0
  29. package/lib/swipl/boot/history.pl +304 -0
  30. package/lib/swipl/boot/init.pl +4682 -0
  31. package/lib/swipl/boot/iri.pl +64 -0
  32. package/lib/swipl/boot/license.pl +390 -0
  33. package/lib/swipl/boot/load.pl +81 -0
  34. package/lib/swipl/boot/messages.pl +2521 -0
  35. package/lib/swipl/boot/packs.pl +306 -0
  36. package/lib/swipl/boot/predopts.pl +154 -0
  37. package/lib/swipl/boot/qlf.pl +141 -0
  38. package/lib/swipl/boot/rc.pl +263 -0
  39. package/lib/swipl/boot/syspred.pl +1634 -0
  40. package/lib/swipl/boot/tabling.pl +2321 -0
  41. package/lib/swipl/boot/threads.pl +42 -0
  42. package/lib/swipl/boot/toplevel.pl +2248 -0
  43. package/lib/swipl/boot/topvars.pl +261 -0
  44. package/lib/swipl/boot.prc +0 -0
  45. package/lib/swipl/cmake/swipl.cmake +131 -0
  46. package/lib/swipl/customize/README.md +23 -0
  47. package/lib/swipl/customize/edit +101 -0
  48. package/lib/swipl/customize/init.pl +164 -0
  49. package/lib/swipl/demo/README.md +33 -0
  50. package/lib/swipl/demo/likes.pl +44 -0
  51. package/lib/swipl/doc/packages/examples/chr/bool.chr +281 -0
  52. package/lib/swipl/doc/packages/examples/chr/chrdif.chr +87 -0
  53. package/lib/swipl/doc/packages/examples/chr/chrfreeze.chr +6 -0
  54. package/lib/swipl/doc/packages/examples/chr/family.chr +116 -0
  55. package/lib/swipl/doc/packages/examples/chr/fib.chr +24 -0
  56. package/lib/swipl/doc/packages/examples/chr/fibonacci.chr +31 -0
  57. package/lib/swipl/doc/packages/examples/chr/gcd.chr +28 -0
  58. package/lib/swipl/doc/packages/examples/chr/leq.chr +34 -0
  59. package/lib/swipl/doc/packages/examples/chr/listdom.chr +138 -0
  60. package/lib/swipl/doc/packages/examples/chr/primes.chr +29 -0
  61. package/lib/swipl/doc/packages/examples/http/README.md +98 -0
  62. package/lib/swipl/doc/packages/examples/http/calc.pl +92 -0
  63. package/lib/swipl/doc/packages/examples/http/demo_body.pl +232 -0
  64. package/lib/swipl/doc/packages/examples/http/demo_client.pl +165 -0
  65. package/lib/swipl/doc/packages/examples/http/demo_daemon.pl +38 -0
  66. package/lib/swipl/doc/packages/examples/http/demo_files.pl +50 -0
  67. package/lib/swipl/doc/packages/examples/http/demo_hello.pl +15 -0
  68. package/lib/swipl/doc/packages/examples/http/demo_login.pl +280 -0
  69. package/lib/swipl/doc/packages/examples/http/demo_openid.pl +177 -0
  70. package/lib/swipl/doc/packages/examples/http/demo_pwp.pl +20 -0
  71. package/lib/swipl/doc/packages/examples/http/demo_rest.pl +56 -0
  72. package/lib/swipl/doc/packages/examples/http/demo_threads.pl +52 -0
  73. package/lib/swipl/doc/packages/examples/http/linux-init-script +126 -0
  74. package/lib/swipl/doc/packages/examples/http/pwp/context.pwp +23 -0
  75. package/lib/swipl/doc/packages/examples/http/pwp/index.pwp +25 -0
  76. package/lib/swipl/doc/packages/examples/http/pwp/pwp1.pwp +12 -0
  77. package/lib/swipl/doc/packages/examples/http/pwp/pwp2.pwp +10 -0
  78. package/lib/swipl/doc/packages/examples/http/pwp/pwp3.pwp +25 -0
  79. package/lib/swipl/doc/packages/examples/http/pwp/pwp4.pwp +23 -0
  80. package/lib/swipl/doc/packages/examples/http/pwp/pwp5.pwp +11 -0
  81. package/lib/swipl/doc/packages/examples/http/pwp/pwp6.pwp +3 -0
  82. package/lib/swipl/doc/packages/examples/http/pwp/pwp7.pwp +3 -0
  83. package/lib/swipl/doc/packages/examples/http/pwp/pwp8.pwp +3 -0
  84. package/lib/swipl/doc/packages/examples/http/pwp/pwpdb.pl +12 -0
  85. package/lib/swipl/doc/packages/examples/http/systemd-script.service +18 -0
  86. package/lib/swipl/doc/packages/examples/http/upstart-script.conf +20 -0
  87. package/lib/swipl/doc/packages/examples/plunit/read.pl +17 -0
  88. package/lib/swipl/doc/packages/examples/plunit/simple.pl +33 -0
  89. package/lib/swipl/doc/packages/examples/ssl/client.pl +83 -0
  90. package/lib/swipl/doc/packages/examples/ssl/etc/README +52 -0
  91. package/lib/swipl/doc/packages/examples/ssl/etc/client/client-cert.p12 +0 -0
  92. package/lib/swipl/doc/packages/examples/ssl/etc/client/client-cert.pem +85 -0
  93. package/lib/swipl/doc/packages/examples/ssl/etc/client/client-key.pem +30 -0
  94. package/lib/swipl/doc/packages/examples/ssl/etc/demoCA/cacert.pem +82 -0
  95. package/lib/swipl/doc/packages/examples/ssl/etc/demoCA/careq.pem +18 -0
  96. package/lib/swipl/doc/packages/examples/ssl/etc/demoCA/crlnumber +1 -0
  97. package/lib/swipl/doc/packages/examples/ssl/etc/demoCA/index.txt +3 -0
  98. package/lib/swipl/doc/packages/examples/ssl/etc/demoCA/index.txt.attr +1 -0
  99. package/lib/swipl/doc/packages/examples/ssl/etc/demoCA/newcerts/9DC08797A0F63F7C.pem +85 -0
  100. package/lib/swipl/doc/packages/examples/ssl/etc/demoCA/newcerts/9DC08797A0F63F7D.pem +85 -0
  101. package/lib/swipl/doc/packages/examples/ssl/etc/demoCA/private/cakey.pem +30 -0
  102. package/lib/swipl/doc/packages/examples/ssl/etc/demoCA/serial +1 -0
  103. package/lib/swipl/doc/packages/examples/ssl/etc/server/server-cert.pem +85 -0
  104. package/lib/swipl/doc/packages/examples/ssl/etc/server/server-key.pem +30 -0
  105. package/lib/swipl/doc/packages/examples/ssl/https.pl +267 -0
  106. package/lib/swipl/doc/packages/examples/ssl/server.pl +106 -0
  107. package/lib/swipl/include/SWI-Prolog.h +1544 -0
  108. package/lib/swipl/include/SWI-Stream.h +537 -0
  109. package/lib/swipl/include/Yap/YapInterface.h +283 -0
  110. package/lib/swipl/include/sicstus/sicstus.h +452 -0
  111. package/lib/swipl/lib/x86_64-linux/cgi.so +0 -0
  112. package/lib/swipl/lib/x86_64-linux/crypt.so +0 -0
  113. package/lib/swipl/lib/x86_64-linux/crypto4pl.so +0 -0
  114. package/lib/swipl/lib/x86_64-linux/double_metaphone.so +0 -0
  115. package/lib/swipl/lib/x86_64-linux/files.so +0 -0
  116. package/lib/swipl/lib/x86_64-linux/hashstream.so +0 -0
  117. package/lib/swipl/lib/x86_64-linux/http_stream.so +0 -0
  118. package/lib/swipl/lib/x86_64-linux/isub.so +0 -0
  119. package/lib/swipl/lib/x86_64-linux/json.so +0 -0
  120. package/lib/swipl/lib/x86_64-linux/libswipl.so.10 +0 -0
  121. package/lib/swipl/lib/x86_64-linux/mallocinfo.so +0 -0
  122. package/lib/swipl/lib/x86_64-linux/md54pl.so +0 -0
  123. package/lib/swipl/lib/x86_64-linux/memfile.so +0 -0
  124. package/lib/swipl/lib/x86_64-linux/ntriples.so +0 -0
  125. package/lib/swipl/lib/x86_64-linux/pcre4pl.so +0 -0
  126. package/lib/swipl/lib/x86_64-linux/porter_stem.so +0 -0
  127. package/lib/swipl/lib/x86_64-linux/process.so +0 -0
  128. package/lib/swipl/lib/x86_64-linux/prolog_stream.so +0 -0
  129. package/lib/swipl/lib/x86_64-linux/rdf_db.so +0 -0
  130. package/lib/swipl/lib/x86_64-linux/readutil.so +0 -0
  131. package/lib/swipl/lib/x86_64-linux/rlimit.so +0 -0
  132. package/lib/swipl/lib/x86_64-linux/sched.so +0 -0
  133. package/lib/swipl/lib/x86_64-linux/sgml2pl.so +0 -0
  134. package/lib/swipl/lib/x86_64-linux/sha4pl.so +0 -0
  135. package/lib/swipl/lib/x86_64-linux/snowball.so +0 -0
  136. package/lib/swipl/lib/x86_64-linux/socket.so +0 -0
  137. package/lib/swipl/lib/x86_64-linux/ssl4pl.so +0 -0
  138. package/lib/swipl/lib/x86_64-linux/streaminfo.so +0 -0
  139. package/lib/swipl/lib/x86_64-linux/syslog.so +0 -0
  140. package/lib/swipl/lib/x86_64-linux/time.so +0 -0
  141. package/lib/swipl/lib/x86_64-linux/turtle.so +0 -0
  142. package/lib/swipl/lib/x86_64-linux/uid.so +0 -0
  143. package/lib/swipl/lib/x86_64-linux/unix.so +0 -0
  144. package/lib/swipl/lib/x86_64-linux/uri.so +0 -0
  145. package/lib/swipl/lib/x86_64-linux/websocket.so +0 -0
  146. package/lib/swipl/lib/x86_64-linux/zlib4pl.so +0 -0
  147. package/lib/swipl/library/INDEX.pl +1020 -0
  148. package/lib/swipl/library/aggregate.pl +755 -0
  149. package/lib/swipl/library/ansi_term.pl +653 -0
  150. package/lib/swipl/library/apply.pl +426 -0
  151. package/lib/swipl/library/apply_macros.pl +497 -0
  152. package/lib/swipl/library/arithmetic.pl +320 -0
  153. package/lib/swipl/library/assoc.pl +522 -0
  154. package/lib/swipl/library/atom.pl +169 -0
  155. package/lib/swipl/library/backcomp.pl +688 -0
  156. package/lib/swipl/library/base32.pl +291 -0
  157. package/lib/swipl/library/base64.pl +441 -0
  158. package/lib/swipl/library/broadcast.pl +161 -0
  159. package/lib/swipl/library/build/cmake.pl +137 -0
  160. package/lib/swipl/library/build/conan.pl +232 -0
  161. package/lib/swipl/library/build/make.pl +168 -0
  162. package/lib/swipl/library/build/tools.pl +825 -0
  163. package/lib/swipl/library/charsio.pl +195 -0
  164. package/lib/swipl/library/check.pl +1097 -0
  165. package/lib/swipl/library/check_installation.pl +912 -0
  166. package/lib/swipl/library/clp/INDEX.pl +157 -0
  167. package/lib/swipl/library/clp/bounds.pl +2036 -0
  168. package/lib/swipl/library/clp/clp_distinct.pl +263 -0
  169. package/lib/swipl/library/clp/clp_events.pl +92 -0
  170. package/lib/swipl/library/clp/clpb.pl +1896 -0
  171. package/lib/swipl/library/clp/clpfd.pl +7906 -0
  172. package/lib/swipl/library/clp/simplex.pl +1580 -0
  173. package/lib/swipl/library/codesio.pl +182 -0
  174. package/lib/swipl/library/coinduction.pl +183 -0
  175. package/lib/swipl/library/console_input.pl +289 -0
  176. package/lib/swipl/library/csv.pl +611 -0
  177. package/lib/swipl/library/ctypes.pl +161 -0
  178. package/lib/swipl/library/date.pl +370 -0
  179. package/lib/swipl/library/dcg/INDEX.pl +35 -0
  180. package/lib/swipl/library/dcg/basics.pl +514 -0
  181. package/lib/swipl/library/dcg/high_order.pl +227 -0
  182. package/lib/swipl/library/debug.pl +499 -0
  183. package/lib/swipl/library/dialect/bim.pl +186 -0
  184. package/lib/swipl/library/dialect/commons.pl +77 -0
  185. package/lib/swipl/library/dialect/eclipse/test_util_iso.pl +355 -0
  186. package/lib/swipl/library/dialect/hprolog/format.pl +44 -0
  187. package/lib/swipl/library/dialect/hprolog.pl +314 -0
  188. package/lib/swipl/library/dialect/ifprolog.pl +1317 -0
  189. package/lib/swipl/library/dialect/iso/iso_predicates.pl +277 -0
  190. package/lib/swipl/library/dialect/sicstus/README.TXT +1 -0
  191. package/lib/swipl/library/dialect/sicstus/arrays.pl +121 -0
  192. package/lib/swipl/library/dialect/sicstus/block.pl +278 -0
  193. package/lib/swipl/library/dialect/sicstus/lists.pl +167 -0
  194. package/lib/swipl/library/dialect/sicstus/ordsets.pl +52 -0
  195. package/lib/swipl/library/dialect/sicstus/sockets.pl +174 -0
  196. package/lib/swipl/library/dialect/sicstus/system.pl +262 -0
  197. package/lib/swipl/library/dialect/sicstus/terms.pl +57 -0
  198. package/lib/swipl/library/dialect/sicstus/timeout.pl +92 -0
  199. package/lib/swipl/library/dialect/sicstus.pl +582 -0
  200. package/lib/swipl/library/dialect/sicstus4/aggregate.pl +60 -0
  201. package/lib/swipl/library/dialect/sicstus4/between.pl +62 -0
  202. package/lib/swipl/library/dialect/sicstus4/clpfd.pl +75 -0
  203. package/lib/swipl/library/dialect/sicstus4/file_systems.pl +413 -0
  204. package/lib/swipl/library/dialect/sicstus4/lists.pl +274 -0
  205. package/lib/swipl/library/dialect/sicstus4/ordsets.pl +54 -0
  206. package/lib/swipl/library/dialect/sicstus4/samsort.pl +86 -0
  207. package/lib/swipl/library/dialect/sicstus4/sets.pl +124 -0
  208. package/lib/swipl/library/dialect/sicstus4/sockets.pl +164 -0
  209. package/lib/swipl/library/dialect/sicstus4/system.pl +80 -0
  210. package/lib/swipl/library/dialect/sicstus4/terms.pl +89 -0
  211. package/lib/swipl/library/dialect/sicstus4/timeout.pl +43 -0
  212. package/lib/swipl/library/dialect/sicstus4/types.pl +103 -0
  213. package/lib/swipl/library/dialect/sicstus4.pl +200 -0
  214. package/lib/swipl/library/dialect/swi/syspred_options.pl +250 -0
  215. package/lib/swipl/library/dialect/xsb/README.md +20 -0
  216. package/lib/swipl/library/dialect/xsb/basics.pl +318 -0
  217. package/lib/swipl/library/dialect/xsb/consult.pl +87 -0
  218. package/lib/swipl/library/dialect/xsb/curr_sym.pl +57 -0
  219. package/lib/swipl/library/dialect/xsb/error_handler.pl +111 -0
  220. package/lib/swipl/library/dialect/xsb/gensym.pl +53 -0
  221. package/lib/swipl/library/dialect/xsb/gpp.pl +138 -0
  222. package/lib/swipl/library/dialect/xsb/intern.pl +48 -0
  223. package/lib/swipl/library/dialect/xsb/lists.pl +47 -0
  224. package/lib/swipl/library/dialect/xsb/machine.pl +295 -0
  225. package/lib/swipl/library/dialect/xsb/ordsets.pl +53 -0
  226. package/lib/swipl/library/dialect/xsb/setof.pl +54 -0
  227. package/lib/swipl/library/dialect/xsb/source.pl +308 -0
  228. package/lib/swipl/library/dialect/xsb/standard.pl +169 -0
  229. package/lib/swipl/library/dialect/xsb/storage.pl +70 -0
  230. package/lib/swipl/library/dialect/xsb/string.pl +76 -0
  231. package/lib/swipl/library/dialect/xsb/thread.pl +62 -0
  232. package/lib/swipl/library/dialect/xsb/timed_call.pl +158 -0
  233. package/lib/swipl/library/dialect/xsb.pl +688 -0
  234. package/lib/swipl/library/dialect/yap/README.TXT +8 -0
  235. package/lib/swipl/library/dialect/yap.pl +283 -0
  236. package/lib/swipl/library/dialect.pl +123 -0
  237. package/lib/swipl/library/dicts.pl +399 -0
  238. package/lib/swipl/library/dif.pl +426 -0
  239. package/lib/swipl/library/edinburgh.pl +138 -0
  240. package/lib/swipl/library/edit.pl +783 -0
  241. package/lib/swipl/library/error.pl +495 -0
  242. package/lib/swipl/library/exceptions.pl +231 -0
  243. package/lib/swipl/library/explain.pl +543 -0
  244. package/lib/swipl/library/ext/RDF/INDEX.pl +25 -0
  245. package/lib/swipl/library/ext/RDF/rdf.pl +450 -0
  246. package/lib/swipl/library/ext/RDF/rdf_parser.pl +649 -0
  247. package/lib/swipl/library/ext/RDF/rdf_triple.pl +448 -0
  248. package/lib/swipl/library/ext/RDF/rdf_write.pl +701 -0
  249. package/lib/swipl/library/ext/RDF/rewrite_term.pl +177 -0
  250. package/lib/swipl/library/ext/chr/chr/a_star.pl +80 -0
  251. package/lib/swipl/library/ext/chr/chr/binomialheap.pl +142 -0
  252. package/lib/swipl/library/ext/chr/chr/builtins.pl +629 -0
  253. package/lib/swipl/library/ext/chr/chr/chr_compiler_errors.pl +179 -0
  254. package/lib/swipl/library/ext/chr/chr/chr_compiler_options.pl +382 -0
  255. package/lib/swipl/library/ext/chr/chr/chr_compiler_utility.pl +338 -0
  256. package/lib/swipl/library/ext/chr/chr/chr_debug.pl +59 -0
  257. package/lib/swipl/library/ext/chr/chr/chr_hashtable_store.pl +425 -0
  258. package/lib/swipl/library/ext/chr/chr/chr_integertable_store.pl +139 -0
  259. package/lib/swipl/library/ext/chr/chr/chr_messages.pl +176 -0
  260. package/lib/swipl/library/ext/chr/chr/chr_op.pl +53 -0
  261. package/lib/swipl/library/ext/chr/chr/chr_runtime.pl +1016 -0
  262. package/lib/swipl/library/ext/chr/chr/chr_translate.pl +25424 -0
  263. package/lib/swipl/library/ext/chr/chr/clean_code.pl +252 -0
  264. package/lib/swipl/library/ext/chr/chr/find.pl +78 -0
  265. package/lib/swipl/library/ext/chr/chr/guard_entailment.pl +19432 -0
  266. package/lib/swipl/library/ext/chr/chr/listmap.pl +108 -0
  267. package/lib/swipl/library/ext/chr/chr/pairlist.pl +78 -0
  268. package/lib/swipl/library/ext/chr/chr.pl +686 -0
  269. package/lib/swipl/library/ext/clib/INDEX.pl +158 -0
  270. package/lib/swipl/library/ext/clib/cgi.pl +86 -0
  271. package/lib/swipl/library/ext/clib/crypt.pl +44 -0
  272. package/lib/swipl/library/ext/clib/filesex.pl +644 -0
  273. package/lib/swipl/library/ext/clib/hash_stream.pl +119 -0
  274. package/lib/swipl/library/ext/clib/mallocinfo.pl +138 -0
  275. package/lib/swipl/library/ext/clib/md5.pl +68 -0
  276. package/lib/swipl/library/ext/clib/memfile.pl +61 -0
  277. package/lib/swipl/library/ext/clib/process.pl +573 -0
  278. package/lib/swipl/library/ext/clib/prolog_server.pl +157 -0
  279. package/lib/swipl/library/ext/clib/prolog_stream.pl +80 -0
  280. package/lib/swipl/library/ext/clib/rlimit.pl +54 -0
  281. package/lib/swipl/library/ext/clib/sched.pl +85 -0
  282. package/lib/swipl/library/ext/clib/sha.pl +162 -0
  283. package/lib/swipl/library/ext/clib/socket.pl +1102 -0
  284. package/lib/swipl/library/ext/clib/streaminfo.pl +103 -0
  285. package/lib/swipl/library/ext/clib/streampool.pl +136 -0
  286. package/lib/swipl/library/ext/clib/syslog.pl +180 -0
  287. package/lib/swipl/library/ext/clib/time.pl +194 -0
  288. package/lib/swipl/library/ext/clib/udp_broadcast.pl +975 -0
  289. package/lib/swipl/library/ext/clib/uid.pl +220 -0
  290. package/lib/swipl/library/ext/clib/unix.pl +317 -0
  291. package/lib/swipl/library/ext/clib/uri.pl +530 -0
  292. package/lib/swipl/library/ext/clib/uuid.pl +207 -0
  293. package/lib/swipl/library/ext/http/http/INDEX.pl +266 -0
  294. package/lib/swipl/library/ext/http/http/README.md +34 -0
  295. package/lib/swipl/library/ext/http/http/ax.pl +189 -0
  296. package/lib/swipl/library/ext/http/http/dcg_basics.pl +49 -0
  297. package/lib/swipl/library/ext/http/http/graphql.pl +1367 -0
  298. package/lib/swipl/library/ext/http/http/html_decl.pl +416 -0
  299. package/lib/swipl/library/ext/http/http/html_head.pl +654 -0
  300. package/lib/swipl/library/ext/http/http/html_quasiquotations.pl +120 -0
  301. package/lib/swipl/library/ext/http/http/html_write.pl +1425 -0
  302. package/lib/swipl/library/ext/http/http/htmx.pl +139 -0
  303. package/lib/swipl/library/ext/http/http/http_authenticate.pl +364 -0
  304. package/lib/swipl/library/ext/http/http/http_client.pl +412 -0
  305. package/lib/swipl/library/ext/http/http/http_cookie.pl +245 -0
  306. package/lib/swipl/library/ext/http/http/http_cors.pl +176 -0
  307. package/lib/swipl/library/ext/http/http/http_digest.pl +820 -0
  308. package/lib/swipl/library/ext/http/http/http_dirindex.pl +296 -0
  309. package/lib/swipl/library/ext/http/http/http_dispatch.pl +1552 -0
  310. package/lib/swipl/library/ext/http/http/http_dyn_workers.pl +214 -0
  311. package/lib/swipl/library/ext/http/http/http_error.pl +126 -0
  312. package/lib/swipl/library/ext/http/http/http_exception.pl +225 -0
  313. package/lib/swipl/library/ext/http/http/http_files.pl +163 -0
  314. package/lib/swipl/library/ext/http/http/http_header.pl +2820 -0
  315. package/lib/swipl/library/ext/http/http/http_hook.pl +106 -0
  316. package/lib/swipl/library/ext/http/http/http_host.pl +204 -0
  317. package/lib/swipl/library/ext/http/http/http_load.pl +113 -0
  318. package/lib/swipl/library/ext/http/http/http_log.pl +738 -0
  319. package/lib/swipl/library/ext/http/http/http_multipart_plugin.pl +232 -0
  320. package/lib/swipl/library/ext/http/http/http_open.pl +1821 -0
  321. package/lib/swipl/library/ext/http/http/http_openid.pl +1561 -0
  322. package/lib/swipl/library/ext/http/http/http_parameters.pl +504 -0
  323. package/lib/swipl/library/ext/http/http/http_path.pl +380 -0
  324. package/lib/swipl/library/ext/http/http/http_proxy.pl +80 -0
  325. package/lib/swipl/library/ext/http/http/http_pwp.pl +351 -0
  326. package/lib/swipl/library/ext/http/http/http_redis_plugin.pl +332 -0
  327. package/lib/swipl/library/ext/http/http/http_server.pl +105 -0
  328. package/lib/swipl/library/ext/http/http/http_server_files.pl +126 -0
  329. package/lib/swipl/library/ext/http/http/http_server_health.pl +186 -0
  330. package/lib/swipl/library/ext/http/http/http_session.pl +1040 -0
  331. package/lib/swipl/library/ext/http/http/http_sgml_plugin.pl +137 -0
  332. package/lib/swipl/library/ext/http/http/http_stream.pl +376 -0
  333. package/lib/swipl/library/ext/http/http/http_unix_daemon.pl +989 -0
  334. package/lib/swipl/library/ext/http/http/http_wrapper.pl +559 -0
  335. package/lib/swipl/library/ext/http/http/hub.pl +600 -0
  336. package/lib/swipl/library/ext/http/http/js_write.pl +461 -0
  337. package/lib/swipl/library/ext/http/http/mimepack.pl +224 -0
  338. package/lib/swipl/library/ext/http/http/mimetype.pl +276 -0
  339. package/lib/swipl/library/ext/http/http/term_html.pl +797 -0
  340. package/lib/swipl/library/ext/http/http/thread_httpd.pl +1181 -0
  341. package/lib/swipl/library/ext/http/http/web/css/dirindex.css +24 -0
  342. package/lib/swipl/library/ext/http/http/web/css/openid.css +57 -0
  343. package/lib/swipl/library/ext/http/http/web/icons/back.png +0 -0
  344. package/lib/swipl/library/ext/http/http/web/icons/c.png +0 -0
  345. package/lib/swipl/library/ext/http/http/web/icons/compressed.png +0 -0
  346. package/lib/swipl/library/ext/http/http/web/icons/folder.png +0 -0
  347. package/lib/swipl/library/ext/http/http/web/icons/generic.png +0 -0
  348. package/lib/swipl/library/ext/http/http/web/icons/layout.png +0 -0
  349. package/lib/swipl/library/ext/http/http/web/icons/openid-logo-square.png +0 -0
  350. package/lib/swipl/library/ext/http/http/web/icons/openid-logo-tiny.png +0 -0
  351. package/lib/swipl/library/ext/http/http/websocket.pl +729 -0
  352. package/lib/swipl/library/ext/http/http/yadis.pl +205 -0
  353. package/lib/swipl/library/ext/json/INDEX.pl +36 -0
  354. package/lib/swipl/library/ext/json/http/INDEX.pl +16 -0
  355. package/lib/swipl/library/ext/json/http/http_json.pl +490 -0
  356. package/lib/swipl/library/ext/json/http/js_grammar.pl +53 -0
  357. package/lib/swipl/library/ext/json/http/json.pl +48 -0
  358. package/lib/swipl/library/ext/json/http/json_convert.pl +48 -0
  359. package/lib/swipl/library/ext/json/json.pl +1215 -0
  360. package/lib/swipl/library/ext/json/json_convert.pl +681 -0
  361. package/lib/swipl/library/ext/json/json_grammar.pl +349 -0
  362. package/lib/swipl/library/ext/json/json_rpc_client.pl +423 -0
  363. package/lib/swipl/library/ext/json/json_rpc_common.pl +104 -0
  364. package/lib/swipl/library/ext/json/json_rpc_server.pl +489 -0
  365. package/lib/swipl/library/ext/json/json_schema.pl +2111 -0
  366. package/lib/swipl/library/ext/nlp/INDEX.pl +15 -0
  367. package/lib/swipl/library/ext/nlp/double_metaphone.pl +86 -0
  368. package/lib/swipl/library/ext/nlp/isub.pl +162 -0
  369. package/lib/swipl/library/ext/nlp/porter_stem.pl +50 -0
  370. package/lib/swipl/library/ext/nlp/snowball.pl +97 -0
  371. package/lib/swipl/library/ext/pcre/INDEX.pl +17 -0
  372. package/lib/swipl/library/ext/pcre/pcre.pl +974 -0
  373. package/lib/swipl/library/ext/plunit/INDEX.pl +20 -0
  374. package/lib/swipl/library/ext/plunit/plunit.pl +2631 -0
  375. package/lib/swipl/library/ext/plunit/test_wizard.pl +249 -0
  376. package/lib/swipl/library/ext/semweb/semweb/INDEX.pl +288 -0
  377. package/lib/swipl/library/ext/semweb/semweb/rdf11.pl +2106 -0
  378. package/lib/swipl/library/ext/semweb/semweb/rdf11_containers.pl +299 -0
  379. package/lib/swipl/library/ext/semweb/semweb/rdf_cache.pl +278 -0
  380. package/lib/swipl/library/ext/semweb/semweb/rdf_compare.pl +132 -0
  381. package/lib/swipl/library/ext/semweb/semweb/rdf_db.pl +3468 -0
  382. package/lib/swipl/library/ext/semweb/semweb/rdf_edit.pl +1145 -0
  383. package/lib/swipl/library/ext/semweb/semweb/rdf_http_plugin.pl +274 -0
  384. package/lib/swipl/library/ext/semweb/semweb/rdf_library.pl +1021 -0
  385. package/lib/swipl/library/ext/semweb/semweb/rdf_litindex.pl +1035 -0
  386. package/lib/swipl/library/ext/semweb/semweb/rdf_ntriples.pl +422 -0
  387. package/lib/swipl/library/ext/semweb/semweb/rdf_persistency.pl +1576 -0
  388. package/lib/swipl/library/ext/semweb/semweb/rdf_portray.pl +182 -0
  389. package/lib/swipl/library/ext/semweb/semweb/rdf_prefixes.pl +681 -0
  390. package/lib/swipl/library/ext/semweb/semweb/rdf_sandbox.pl +153 -0
  391. package/lib/swipl/library/ext/semweb/semweb/rdf_turtle.pl +54 -0
  392. package/lib/swipl/library/ext/semweb/semweb/rdf_turtle_write.pl +1587 -0
  393. package/lib/swipl/library/ext/semweb/semweb/rdf_zlib_plugin.pl +52 -0
  394. package/lib/swipl/library/ext/semweb/semweb/rdfa.pl +1510 -0
  395. package/lib/swipl/library/ext/semweb/semweb/rdfs.pl +475 -0
  396. package/lib/swipl/library/ext/semweb/semweb/sparql_client.pl +643 -0
  397. package/lib/swipl/library/ext/semweb/semweb/turtle.pl +455 -0
  398. package/lib/swipl/library/ext/sgml/DTD/HTML4.dcl +88 -0
  399. package/lib/swipl/library/ext/sgml/DTD/HTML4.dtd +1092 -0
  400. package/lib/swipl/library/ext/sgml/DTD/HTML4.soc +6 -0
  401. package/lib/swipl/library/ext/sgml/DTD/HTML5.dtd +906 -0
  402. package/lib/swipl/library/ext/sgml/DTD/HTMLlat1.ent +195 -0
  403. package/lib/swipl/library/ext/sgml/DTD/HTMLspec.ent +77 -0
  404. package/lib/swipl/library/ext/sgml/DTD/HTMLsym.ent +241 -0
  405. package/lib/swipl/library/ext/sgml/INDEX.pl +64 -0
  406. package/lib/swipl/library/ext/sgml/c14n2.pl +203 -0
  407. package/lib/swipl/library/ext/sgml/iso_639.pl +631 -0
  408. package/lib/swipl/library/ext/sgml/pwp.pl +705 -0
  409. package/lib/swipl/library/ext/sgml/sgml.pl +815 -0
  410. package/lib/swipl/library/ext/sgml/sgml_write.pl +1003 -0
  411. package/lib/swipl/library/ext/sgml/xpath.pl +620 -0
  412. package/lib/swipl/library/ext/sgml/xsdp_types.pl +232 -0
  413. package/lib/swipl/library/ext/ssl/INDEX.pl +60 -0
  414. package/lib/swipl/library/ext/ssl/crypto.pl +1015 -0
  415. package/lib/swipl/library/ext/ssl/http/INDEX.pl +5 -0
  416. package/lib/swipl/library/ext/ssl/http/http_ssl_plugin.pl +296 -0
  417. package/lib/swipl/library/ext/ssl/saml.pl +609 -0
  418. package/lib/swipl/library/ext/ssl/ssl.pl +647 -0
  419. package/lib/swipl/library/ext/ssl/xmldsig.pl +391 -0
  420. package/lib/swipl/library/ext/ssl/xmlenc.pl +354 -0
  421. package/lib/swipl/library/ext/zlib/INDEX.pl +8 -0
  422. package/lib/swipl/library/ext/zlib/zlib.pl +112 -0
  423. package/lib/swipl/library/fastrw.pl +105 -0
  424. package/lib/swipl/library/files.pl +80 -0
  425. package/lib/swipl/library/gensym.pl +111 -0
  426. package/lib/swipl/library/git.pl +1027 -0
  427. package/lib/swipl/library/hashtable.pl +365 -0
  428. package/lib/swipl/library/heaps.pl +252 -0
  429. package/lib/swipl/library/hotfix.pl +239 -0
  430. package/lib/swipl/library/http/jquery.pl +103 -0
  431. package/lib/swipl/library/http/web/js/jquery-3.6.0.min.js +2 -0
  432. package/lib/swipl/library/increval.pl +217 -0
  433. package/lib/swipl/library/intercept.pl +263 -0
  434. package/lib/swipl/library/iostream.pl +237 -0
  435. package/lib/swipl/library/iri_scheme/file.pl +70 -0
  436. package/lib/swipl/library/lazy_lists.pl +481 -0
  437. package/lib/swipl/library/listing.pl +1362 -0
  438. package/lib/swipl/library/lists.pl +860 -0
  439. package/lib/swipl/library/lynx/INDEX.pl +14 -0
  440. package/lib/swipl/library/lynx/format.pl +380 -0
  441. package/lib/swipl/library/lynx/html_style.pl +129 -0
  442. package/lib/swipl/library/lynx/html_text.pl +865 -0
  443. package/lib/swipl/library/lynx/pldoc_style.pl +87 -0
  444. package/lib/swipl/library/macros.pl +451 -0
  445. package/lib/swipl/library/main.pl +1200 -0
  446. package/lib/swipl/library/make.pl +197 -0
  447. package/lib/swipl/library/modules.pl +129 -0
  448. package/lib/swipl/library/nb_rbtrees.pl +267 -0
  449. package/lib/swipl/library/nb_set.pl +203 -0
  450. package/lib/swipl/library/obfuscate.pl +115 -0
  451. package/lib/swipl/library/occurs.pl +241 -0
  452. package/lib/swipl/library/operators.pl +182 -0
  453. package/lib/swipl/library/option.pl +388 -0
  454. package/lib/swipl/library/optparse.pl +966 -0
  455. package/lib/swipl/library/ordsets.pl +518 -0
  456. package/lib/swipl/library/oset.pl +160 -0
  457. package/lib/swipl/library/pairs.pl +187 -0
  458. package/lib/swipl/library/persistency.pl +713 -0
  459. package/lib/swipl/library/pio.pl +47 -0
  460. package/lib/swipl/library/portray_text.pl +277 -0
  461. package/lib/swipl/library/pprint.pl +940 -0
  462. package/lib/swipl/library/predicate_options.pl +975 -0
  463. package/lib/swipl/library/prolog_autoload.pl +233 -0
  464. package/lib/swipl/library/prolog_breakpoints.pl +396 -0
  465. package/lib/swipl/library/prolog_clause.pl +1104 -0
  466. package/lib/swipl/library/prolog_code.pl +416 -0
  467. package/lib/swipl/library/prolog_codewalk.pl +1248 -0
  468. package/lib/swipl/library/prolog_colour.pl +3301 -0
  469. package/lib/swipl/library/prolog_colour.qlf +0 -0
  470. package/lib/swipl/library/prolog_config.pl +154 -0
  471. package/lib/swipl/library/prolog_coverage.pl +1333 -0
  472. package/lib/swipl/library/prolog_debug.pl +404 -0
  473. package/lib/swipl/library/prolog_deps.pl +675 -0
  474. package/lib/swipl/library/prolog_evaluable.pl +234 -0
  475. package/lib/swipl/library/prolog_format.pl +219 -0
  476. package/lib/swipl/library/prolog_history.pl +161 -0
  477. package/lib/swipl/library/prolog_jiti.pl +333 -0
  478. package/lib/swipl/library/prolog_locale.pl +61 -0
  479. package/lib/swipl/library/prolog_metainference.pl +307 -0
  480. package/lib/swipl/library/prolog_pack.pl +3906 -0
  481. package/lib/swipl/library/prolog_profile.pl +346 -0
  482. package/lib/swipl/library/prolog_qlfmake.pl +533 -0
  483. package/lib/swipl/library/prolog_source.pl +1188 -0
  484. package/lib/swipl/library/prolog_stack.pl +794 -0
  485. package/lib/swipl/library/prolog_trace.pl +365 -0
  486. package/lib/swipl/library/prolog_versions.pl +347 -0
  487. package/lib/swipl/library/prolog_wrap.pl +164 -0
  488. package/lib/swipl/library/prolog_xref.pl +3090 -0
  489. package/lib/swipl/library/prolog_xref.qlf +0 -0
  490. package/lib/swipl/library/pure_input.pl +266 -0
  491. package/lib/swipl/library/qpforeign.pl +695 -0
  492. package/lib/swipl/library/qsave.pl +1516 -0
  493. package/lib/swipl/library/quasi_quotations.pl +300 -0
  494. package/lib/swipl/library/quintus.pl +437 -0
  495. package/lib/swipl/library/random.pl +459 -0
  496. package/lib/swipl/library/rbtrees.pl +1153 -0
  497. package/lib/swipl/library/readln.pl +256 -0
  498. package/lib/swipl/library/readutil.pl +304 -0
  499. package/lib/swipl/library/record.pl +544 -0
  500. package/lib/swipl/library/rwlocks.pl +172 -0
  501. package/lib/swipl/library/sandbox.pl +1384 -0
  502. package/lib/swipl/library/semweb/dc.rdfs +198 -0
  503. package/lib/swipl/library/semweb/eor.rdfs +95 -0
  504. package/lib/swipl/library/semweb/owl.owl +287 -0
  505. package/lib/swipl/library/semweb/rdf_library.ttl +90 -0
  506. package/lib/swipl/library/semweb/rdfs.rdfs +251 -0
  507. package/lib/swipl/library/settings.pl +755 -0
  508. package/lib/swipl/library/shell.pl +462 -0
  509. package/lib/swipl/library/shlib.pl +670 -0
  510. package/lib/swipl/library/solution_sequences.pl +439 -0
  511. package/lib/swipl/library/sort.pl +119 -0
  512. package/lib/swipl/library/statistics.pl +541 -0
  513. package/lib/swipl/library/streams.pl +118 -0
  514. package/lib/swipl/library/strings.pl +469 -0
  515. package/lib/swipl/library/system.pl +95 -0
  516. package/lib/swipl/library/tables.pl +381 -0
  517. package/lib/swipl/library/tableutil.pl +771 -0
  518. package/lib/swipl/library/tabling.pl +42 -0
  519. package/lib/swipl/library/terms.pl +457 -0
  520. package/lib/swipl/library/theme/auto.pl +61 -0
  521. package/lib/swipl/library/theme/dark.pl +455 -0
  522. package/lib/swipl/library/theme/light.pl +45 -0
  523. package/lib/swipl/library/thread.pl +810 -0
  524. package/lib/swipl/library/thread_pool.pl +508 -0
  525. package/lib/swipl/library/threadutil.pl +574 -0
  526. package/lib/swipl/library/tty.pl +316 -0
  527. package/lib/swipl/library/ugraphs.pl +644 -0
  528. package/lib/swipl/library/unicode/INDEX.pl +6 -0
  529. package/lib/swipl/library/unicode/blocks.pl +414 -0
  530. package/lib/swipl/library/url.pl +1129 -0
  531. package/lib/swipl/library/utf8.pl +145 -0
  532. package/lib/swipl/library/varnumbers.pl +221 -0
  533. package/lib/swipl/library/vm.pl +251 -0
  534. package/lib/swipl/library/wfs.pl +205 -0
  535. package/lib/swipl/library/when.pl +263 -0
  536. package/lib/swipl/library/writef.pl +278 -0
  537. package/lib/swipl/library/www_browser.pl +251 -0
  538. package/lib/swipl/library/yall.pl +574 -0
  539. package/lib/swipl/library/zip.pl +211 -0
  540. package/lib/swipl/swipl.home +1 -0
  541. package/lib/vendor/libcrypto.so.3 +0 -0
  542. package/lib/vendor/libpcre2-8.so.0 +0 -0
  543. package/lib/vendor/libssl.so.3 +0 -0
  544. package/lib/vendor/libz.so.1 +0 -0
  545. package/licenses/OpenSSL-LICENSE.txt +177 -0
  546. package/licenses/PCRE2-COPYING +5 -0
  547. package/licenses/README.md +12 -0
  548. package/licenses/SWI-Prolog-LICENSE +41 -0
  549. package/licenses/zlib-LICENSE +22 -0
  550. package/package.json +27 -0
@@ -0,0 +1,974 @@
1
+ /* Part of SWI-Prolog
2
+
3
+ Author: Jan Wielemaker and Peter Ludemann
4
+ E-mail: jan@swi-prolog.org
5
+ WWW: http://www.swi-prolog.org
6
+ Copyright (c) 2017-2023, VU University Amsterdam
7
+ SWI-Prolog Solutions b.v.
8
+ All rights reserved.
9
+
10
+ Redistribution and use in source and binary forms, with or without
11
+ modification, are permitted provided that the following conditions
12
+ are met:
13
+
14
+ 1. Redistributions of source code must retain the above copyright
15
+ notice, this list of conditions and the following disclaimer.
16
+
17
+ 2. Redistributions in binary form must reproduce the above copyright
18
+ notice, this list of conditions and the following disclaimer in
19
+ the documentation and/or other materials provided with the
20
+ distribution.
21
+
22
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
23
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
24
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
25
+ FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
26
+ COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
27
+ INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
28
+ BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
29
+ LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
30
+ CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
31
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
32
+ ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
33
+ POSSIBILITY OF SUCH DAMAGE.
34
+ */
35
+
36
+ :- module(pcre,
37
+ [ re_match/2, % +Regex, +String
38
+ re_match/3, % +Regex, +String, +Options
39
+ re_matchsub/3, % +Regex, +String, -Subs
40
+ re_matchsub/4, % +Regex, +String, -Subs, +Options
41
+ re_foldl/6, % :Goal, +Regex, +String, ?V0, ?V, +Options
42
+ re_split/3, % +Pattern, +String, -Split:list
43
+ re_split/4, % +Pattern, +String, -Split:list, +Options
44
+ re_replace/4, % +Pattern, +With, +String, -NewString
45
+ re_replace/5, % +Pattern, +With, +String, -NewString, +Options
46
+ re_compile/3, % +Pattern, -Regex, +Options
47
+ re_flush/0,
48
+ re_config/1 % ?Config
49
+ ]).
50
+ :- autoload(library(apply), [maplist/2, maplist/3]).
51
+ :- autoload(library(error), [must_be/2, existence_error/2]).
52
+ :- autoload(library(dcg/basics), [eos/2, digit/3, digits/3]).
53
+ :- autoload(library(lists), [append/3]).
54
+
55
+ :- use_foreign_library(foreign(pcre4pl)).
56
+
57
+ :- meta_predicate
58
+ re_foldl(3, +, +, ?, ?, +).
59
+
60
+ /** <module> Perl compatible regular expression matching for SWI-Prolog
61
+
62
+ This module provides an interface to the [PCRE2](http://www.pcre.org/)
63
+ (Perl Compatible Regular Expression) library. This Prolog interface
64
+ provides an almost complete wrapper around PCRE2 (the successor to
65
+ PCRE) with as much backward compatibility to PCRE as possible, because
66
+ the original implementation was for PCRE (also known as PCRE1).
67
+
68
+ Regular expressions are created from a pattern and options and
69
+ represented as a SWI-Prolog _blob_. This implies they are subject to
70
+ (atom) garbage collection. Compiled regular expressions can safely be
71
+ used in multiple threads. Most predicates accept both an explicitly
72
+ compiled regular expression, a pattern, or a term Pattern/Flags. The
73
+ semantics of the pattern can be additionally modified by options. In the
74
+ latter two cases a regular expression _blob_ is created and stored in a
75
+ cache. The cache can be cleared using re_flush/0.
76
+
77
+ Most of the predicates in this library take both a regular expression
78
+ represented as a string with optional flags, e.g., `'aap'/i` or a
79
+ _compiled regular_ expression. If a string (+flags) alternative is used,
80
+ the library maintains a cache of compiled regular expressions. See also
81
+ re_flush/0. The library can be asked to rewrite the re_match/2 and
82
+ re_match/3 goals to use inlined compiled regular expression objects
83
+ using
84
+
85
+ :- set_prolog_flag(re_compile, true).
86
+
87
+ This has some consequences:
88
+
89
+ - Performance is considerable better.
90
+ - Compiled regular expressions are currently incompatible with
91
+ _Quick Load Files_ (`.qlf`, see qcompile/1) and _Saved States_
92
+ (see qsave_program/2 and the ``-c`` command line option.
93
+ - Debugging may be harder.
94
+
95
+ @see `man pcre2api` or https://www.pcre.org/current/doc/html/pcre2api.html
96
+ for details of the PCRE2 syntax and options.
97
+ */
98
+
99
+ :- predicate_options(re_match/3, 3,
100
+ [ start(integer), % Not part of pcre2 API
101
+ % These are in the same order as in pcre4pl.c, to make it easy to compare them
102
+ anchored(boolean), % Also re_compile/3
103
+ utf_check(boolean), % Also re_compile/3
104
+ endanchored(boolean), % Also re_compile/3
105
+ bol(boolean),
106
+ eol(boolean),
107
+ empty(boolean),
108
+ empty_atstart(boolean),
109
+ partial_soft(boolean),
110
+ partial_hard(boolean),
111
+ % dfa_restart(boolean), % TODO: if pcre2_dfa_match() is supported
112
+ % dfa_shortest(boolean), % TODO: if pcre2_dfa_match() is supported
113
+ jit(boolean),
114
+ copy_matched_subject(boolean)
115
+ ]).
116
+ :- predicate_options(re_compile/3, 3,
117
+ [ capture_type(oneof([atom,string,range])), % Not part of pcre2 API
118
+ % These are in the same order as in pcre4pl.c, to make it easy to compare them
119
+ anchored(boolean), % Also re_match/3
120
+ utf_check(boolean), % Also re_match/3
121
+ endanchored(boolean), % Also re_match/3
122
+ allow_empty_class(boolean),
123
+ alt_bsux(boolean),
124
+ auto_callout(boolean),
125
+ caseless(boolean),
126
+ dollar_endonly(boolean),
127
+ dotall(boolean),
128
+ dupnames(boolean),
129
+ extended(boolean),
130
+ firstline(boolean),
131
+ match_unset_backref(boolean),
132
+ multiline(boolean),
133
+ never_ucp(boolean),
134
+ never_utf(boolean),
135
+ auto_capture(boolean),
136
+ no_auto_capture(boolean), % backwards compatibility
137
+ auto_possess(boolean),
138
+ dotstar_anchor(boolean),
139
+ start_optimize(boolean),
140
+ ucp(boolean),
141
+ greedy(boolean),
142
+ ungreedy(boolean), % Backwards compatibility
143
+ utf(boolean),
144
+ never_backslash_c(boolean),
145
+ alt_circumflex(boolean),
146
+ alt_verbnames(boolean),
147
+ use_offset_limit(boolean),
148
+ extended_more(boolean),
149
+ literal(boolean),
150
+ match_invalid_utf(boolean),
151
+ jit_complete(boolean),
152
+ jit_partial_soft(boolean),
153
+ jit_partial_hard(boolean),
154
+ jit_invalid_utf(boolean),
155
+ bsr(oneof([anycrlf,unicode])),
156
+ bsr2(oneof([anycrlf,unicode])),
157
+ compat(oneof([])), % Obsolete
158
+ newline(oneof([any,anycrlf,cr,lf,crlf,nul])),
159
+ newline2(oneof([any,anycrlf,cr,lf,crlf,nul]))
160
+ ]).
161
+ :- predicate_options(re_matchsub/4, 4,
162
+ [ pass_to(re_match/3, 3)
163
+ ]).
164
+ :- predicate_options(re_foldl/6, 6,
165
+ [ pass_to(re_match/3, 3)
166
+ ]).
167
+ :- predicate_options(re_split/4, 4,
168
+ [ pass_to(re_match/3, 3)
169
+ ]).
170
+ :- predicate_options(re_replace/5, 5,
171
+ [ pass_to(re_match/3, 3)
172
+ ]).
173
+
174
+ %! re_match(+Regex, +String) is semidet.
175
+ %! re_match(+Regex, +String, +Options) is semidet.
176
+ %
177
+ % Succeeds if String matches Regex. For example:
178
+ %
179
+ % ```
180
+ % ?- re_match("^needle"/i, "Needle in a haystack").
181
+ % true.
182
+ % ```
183
+ %
184
+ % Defined Options are given below. For details, see the PCRE
185
+ % documentation. If an option is repeated, the first value is used
186
+ % and subsequent values are ignored. Unrecognized options are
187
+ % ignored. Unless otherwise specified, boolean options default to
188
+ % `false`.
189
+ %
190
+ % If Regex is a text pattern (optionally with flags), then any of the
191
+ % Options for re_compile/3 can be used, in addition to the Options
192
+ % listed below. If Regex is the result of re_compile/3, then only the
193
+ % following execution-time Options are recognized and any others are
194
+ % ignored. Some options may not exist on your system, depending on the
195
+ % PCRE2 version and how it was built - these unsupported options are
196
+ % silently ignored.
197
+ %
198
+ % * start(From)
199
+ % Start at the given character index
200
+ % * anchored(Bool)
201
+ % If `true`, match only at the first position
202
+ % * bol(Bool)
203
+ % String is the beginning of a line (default `true`) -
204
+ % affects behavior of circumflex metacharacter (`^`).
205
+ % * empty(Bool)
206
+ % An empty string is a valid match (default `true`)
207
+ % * empty_atstart(Bool)
208
+ % An empty string at the start of the subject is a valid match
209
+ % (default `true`)
210
+ % * eol(Bool)
211
+ % String is the end of a line -
212
+ % affects behavior of dollar metacharacter (`$`)
213
+ % (default `true`).
214
+ % * newline(Mode)
215
+ % If `any`, recognize any Unicode newline sequence,
216
+ % if `anycrlf`, recognize CR, LF, and CRLF as newline
217
+ % sequences, if `cr`, recognize CR, if `lf`, recognize
218
+ % LF, if `crlf` recognize CRLF as newline.
219
+ % The default is determined by how PCRE was built, and
220
+ % can be found by re_config(newline2(NewlineDefault)).
221
+ % * newline2(Mode) - synonym for newline(Mode).
222
+ % * utf_check(Bool) - see [PCRE2 API documentation](https://www.pcre.org/current/doc/html/pcre2api.html)
223
+ % You should not need this because SWI-Prolog ensures that the UTF8 strings are valid,
224
+ % so the default is `false`.
225
+ % * endanchored(Bool) - see [PCRE2 API documentation](https://www.pcre.org/current/doc/html/pcre2api.html)
226
+ % * partial_soft(Bool) - see [PCRE2 API documentation](https://www.pcre.org/current/doc/html/pcre2api.html)
227
+ % * partial_hard(Bool) - see [PCRE2 API documentation](https://www.pcre.org/current/doc/html/pcre2api.html)
228
+ % * dfa_restart(Bool) - see [PCRE2 API documentation](https://www.pcre.org/current/doc/html/pcre2api.html)
229
+ % * dfa_shortest(Bool) - see [PCRE2 API documentation](https://www.pcre.org/current/doc/html/pcre2api.html)
230
+ %
231
+ % @arg Regex is the output of re_compile/3, a pattern or a term
232
+ % Pattern/Flags, where Pattern is an atom or string. The defined flags
233
+ % and their related option for re_compile/3 are below.
234
+ % - *x*: extended(true)
235
+ % - *i*: caseless(true)
236
+ % - *m*: multiline(true)
237
+ % - *s*: dotall(true)
238
+ % - *a*: capture_type(atom)
239
+ % - *r*: capture_type(range)
240
+ % - *t*: capture_type(term)
241
+ %
242
+ % If Regex is the output of re_compile/3, any compile-time options in
243
+ % Options or Flags are ignored and only match-time options are used.
244
+ %
245
+ % The options that are derived from flags take precedence over the
246
+ % options in the Options list. In the case of conflicting flags, the
247
+ % first one is used (e.g., `ra` results in `capture_type(range)`).
248
+
249
+ re_match(Regex, String) :-
250
+ re_match(Regex, String, []).
251
+ re_match(Regex, String, Options) :-
252
+ re_compiled(Regex, Compiled, Options),
253
+ re_match_(Compiled, String, Options).
254
+
255
+ %! re_matchsub(+Regex, +String, -Sub:dict) is semidet.
256
+ %! re_matchsub(+Regex, +String, -Sub:dict, +Options) is semidet.
257
+ %
258
+ % Match String against Regex. On success, Sub is a dict containing
259
+ % integer keys for the numbered capture group and atom keys for the
260
+ % named capture groups. The entire match string has the key `0`. The
261
+ % associated value is determined by the capture_type(Type) option
262
+ % passed to re_compile/3, or by flags if Regex is of the form
263
+ % Pattern/Flags; and may be specified at the level of individual
264
+ % captures using a naming convention for the caption name. See
265
+ % re_compile/3 for details.
266
+ %
267
+ % The example below exploits the typed groups to parse a date
268
+ % specification:
269
+ %
270
+ % ```
271
+ % ?- re_matchsub("(?<date> (?<year_I>(?:\\d\\d)?\\d\\d) -
272
+ % (?<month_I>\\d\\d) - (?<day_I>\\d\\d) )"/x,
273
+ % "2017-04-20", Sub, []).
274
+ % Sub = re_match{0:"2017-04-20", date:"2017-04-20",
275
+ % day:20, month:4, year:2017}.
276
+ %
277
+ % ```
278
+ %
279
+ % @arg Both compilation and execution options are processed. See
280
+ % re_compile/3 and re_match/3 for the set of options. In addition,
281
+ % some compilation options may passed as ``/Flags`` to Regex - see
282
+ % re_match/3 for the list of flags.
283
+ %
284
+ % @arg Regex See re_match/2 for a description of this argument.
285
+
286
+ re_matchsub(Regex, String, Subs) :-
287
+ re_matchsub(Regex, String, Subs, []).
288
+
289
+ re_matchsub(Regex, String, Subs, Options) :-
290
+ re_compiled(Regex, Compiled, Options),
291
+ re_matchsub_(Compiled, String, Pairs, Options),
292
+ dict_pairs(Subs, re_match, Pairs).
293
+
294
+ %! re_foldl(:Goal, +Regex, +String, ?V0, ?V, +Options) is semidet.
295
+ %
296
+ % Fold all matches of Regex on String. Each match is represented by a
297
+ % dict as specified for re_matchsub/4. V0 and V are related using a
298
+ % sequence of invocations of Goal as illustrated below.
299
+ %
300
+ % ```
301
+ % call(Goal, Dict1, V0, V1),
302
+ % call(Goal, Dict2, V1, V2),
303
+ % ...
304
+ % call(Goal, Dictn, Vn, V).
305
+ % ```
306
+ %
307
+ % This predicate is used to implement re_split/4 and re_replace/4. For
308
+ % example, we can count all matches of a Regex on String using this
309
+ % code:
310
+ %
311
+ % ```
312
+ % re_match_count(Regex, String, Count) :-
313
+ % re_foldl(increment, Regex, String, 0, Count, []).
314
+ %
315
+ % increment(_Match, V0, V1) :-
316
+ % V1 is V0+1.
317
+ % ```
318
+ %
319
+ % After which we can query
320
+ %
321
+ % ```
322
+ % ?- re_match_count("a", "aap", X).
323
+ % X = 2.
324
+ % ```
325
+ %
326
+ % Here is an example Goal for extracting all the matches with their
327
+ % offsets within the string:
328
+ %
329
+ % ```
330
+ % range_match(Dict, StringIndex-[MatchStart-Substring|List], StringIndex-List) :-
331
+ % Dict.(StringIndex.index) = MatchStart-MatchLen,
332
+ % sub_string(StringIndex.string, MatchStart, MatchLen, _, Substring).
333
+ % ```
334
+ % And can be used with this query (note the capture_type(range) option,
335
+ % which is needed by `range_match/3`, and greedy(false) to invert the
336
+ % meaning of `*?`):
337
+ % ```
338
+ % ?- String = "{START} Mary {END} had a {START} little lamb {END}",
339
+ % re_foldl(range_match,
340
+ % "{START} *?(?<piece>.*) *?{END}",
341
+ % String, _{string:String,index:piece}-Matches, _-[],
342
+ % [capture_type(range),greedy(false)]).
343
+ % Matches = [8-"Mary", 33-"little lamb"].
344
+ % ```
345
+ re_foldl(Goal, Regex, String, V0, V, Options) :-
346
+ re_compiled(Regex, Compiled, Options),
347
+ re_foldl_(Compiled, String, Goal, V0, V, Options).
348
+
349
+ :- public re_call_folder/4. % prevent code obfusication name mangling
350
+ :- meta_predicate re_call_folder(2, +, ?, ?).
351
+
352
+ % re_call_folder(:Goal, +Pairs, ?V0, ?V1).
353
+ % Used by re_foldl_/6 to call Goal with a dict.
354
+ % DO NOT use "%!" comment - that would add it to the docs
355
+ re_call_folder(Goal, Pairs, V0, V1) :-
356
+ dict_pairs(Dict, re_match, Pairs),
357
+ call(Goal, Dict, V0, V1).
358
+
359
+
360
+ %! re_split(+Pattern, +String, -Splits:list) is det.
361
+ %! re_split(+Pattern, +String, -Splits:list, +Options) is det.
362
+ %
363
+ % Split String using the regular expression Pattern. Splits is a list
364
+ % of strings holding alternating matches of Pattern and skipped parts
365
+ % of the String, starting with a skipped part. The Splits lists ends
366
+ % with a string of the content of String after the last match. If
367
+ % Pattern does not appear in String, Splits is a list holding a copy
368
+ % of String. This implies the number of elements in Splits is _always_
369
+ % odd. For example:
370
+ %
371
+ % ```
372
+ % ?- re_split("a+", "abaac", Splits, []).
373
+ % Splits = ["","a","b","aa","c"].
374
+ % ?- re_split(":\\s*"/n, "Age: 33", Splits, []).
375
+ % Splits = ['Age', ': ', 33].
376
+ % ```
377
+ %
378
+ % @arg Pattern is the pattern text, optionally follows by /Flags.
379
+ % Similar to re_matchsub/4, the final output type can be controlled by
380
+ % a flag `a` (atom), `s` (string, default) or `n` (number if possible,
381
+ % atom otherwise).
382
+
383
+ re_split(Pattern, String, Splits) :-
384
+ re_split(Pattern, String, Splits, []).
385
+ re_split(Pattern, String, Splits, Options) :-
386
+ split_range_regex(Pattern, Compiled, Type, Options),
387
+ State = state(String, 0, Type),
388
+ re_foldl(split(State), Compiled, String, Splits, [Last], Options),
389
+ arg(2, State, LastSkipStart),
390
+ typed_sub(Type, String, LastSkipStart, _, 0, Last).
391
+
392
+ split_range_regex(Pattern/Flags, Compiled, Type, Options) =>
393
+ split_range_regex(Pattern, Flags, Compiled, Type, Options).
394
+ split_range_regex(Pattern, Compiled, Type, Options) =>
395
+ split_range_regex(Pattern, '', Compiled, Type, Options).
396
+
397
+ split_range_regex(Pattern, Flags, Compiled, Type, Options) =>
398
+ regex_capture_type_flag_chars(Flags, Chars, Options),
399
+ split_flags(Chars, Chars1, Type),
400
+ atom_chars(RFlags, [r|Chars1]),
401
+ re_flags_options(RFlags, ROptions),
402
+ append(ROptions, Options, Options2),
403
+ re_compiled(Pattern/RFlags, Compiled, Options2).
404
+
405
+ split_flags([], [], Type) :-
406
+ default(Type, string).
407
+ split_flags([H|T0], T, Type) :-
408
+ split_type(H, Type),
409
+ !,
410
+ split_flags(T0, T, Type).
411
+ split_flags([H|T0], [H|T], Type) :-
412
+ split_flags(T0, T, Type).
413
+
414
+ split_type(a, atom).
415
+ split_type(s, string).
416
+ split_type(n, name).
417
+
418
+ split(State, Dict, [Skipped,Sep|T], T) :-
419
+ matched(State, Dict.0, Sep),
420
+ skipped(State, Dict.0, Skipped).
421
+
422
+ matched(state(String, _, Type), Start-Len, Matched) :-
423
+ typed_sub(Type, String, Start, Len, _, Matched).
424
+
425
+ skipped(State, Start-Len, Skipped) :-
426
+ State = state(String, Here, Type),
427
+ SkipLen is Start-Here,
428
+ typed_sub(Type, String, Here, SkipLen, _, Skipped),
429
+ NextSkipStart is Start+Len,
430
+ nb_setarg(2, State, NextSkipStart).
431
+
432
+ typed_sub(string, Haystack, B, L, A, String) :-
433
+ sub_string(Haystack, B, L, A, String).
434
+ typed_sub(atom, Haystack, B, L, A, String) :-
435
+ sub_atom(Haystack, B, L, A, String).
436
+ typed_sub(name, Haystack, B, L, A, Value) :-
437
+ sub_string(Haystack, B, L, A, String),
438
+ ( number_string(Number, String)
439
+ -> Value = Number
440
+ ; atom_string(Value, String)
441
+ ).
442
+
443
+ %! re_replace(+Pattern, +With, +String, -NewString) is det.
444
+ %! re_replace(+Pattern, +With, +String, -NewString, +Options) is det.
445
+ %
446
+ % Replace matches of the regular expression Pattern in String with
447
+ % With (possibly containing references to captured substrings).
448
+ %
449
+ % Throws an error if With uses a name that doesn't exist in the
450
+ % Pattern.
451
+ %
452
+ % @arg Pattern is the pattern text, optionally followed by /Flags.
453
+ % Flags may include `g`, replacing all occurences of Pattern. In
454
+ % addition, similar to re_matchsub/4, the final output type can be
455
+ % controlled by a flag `a` (atom) or `s` (string, default). The
456
+ % output type can also be specified by the `capture_type` option.
457
+ % Capture type suffixes can modify behavior; for example, the
458
+ % following will change an ISO 8601 format date (YYYY-MM-DD) to
459
+ % American style (m/d/y), and also remove leading zeros by using the
460
+ % `_I` suffix:
461
+ %
462
+ % ```
463
+ % re_replace("(?<date> (?<year_I>(?:\\d\\d)?\\d\\d) -
464
+ % (?<month_I>\\d\\d) - (?<day_I>\\d\\d) )"/x,
465
+ % "$month-$day-$year",
466
+ % ISODate, AmericanDate)`
467
+ % ```
468
+ %
469
+ % @arg With is the replacement text. It may reference captured
470
+ % substrings using \N or $Name. Both N and Name may be written as {N}
471
+ % and {Name} to avoid ambiguities. If a substring is named, it cannot
472
+ % be referenced by its number. The single chracters `$` and `\` can be
473
+ % escaped by doubling (e.g., `re_replace(".","$$","abc",Replaced)`
474
+ % results in `Replaced="$bc"`). (Because `\` is an escape character
475
+ % inside strings, you need to write "\\\\" to get a single backslash.)
476
+ %
477
+ % @arg Options See re_match/3 for the set of options.
478
+ %
479
+ % The options that are derived from flags take precedence over the
480
+ % options in the Options list. In the case of conflicting flags, the
481
+ % first one is used (e.g., `as` results in `capture_type(string)`).
482
+ % If a `capture_type` is meaningless (`range` or `term`), it is
483
+ % ignored.
484
+
485
+ re_replace(Pattern, With, String, NewString) :-
486
+ re_replace(Pattern, With, String, NewString, []).
487
+
488
+ re_replace(Pattern, With, String, NewString, Options) :-
489
+ replace_range_regex(Pattern, Compiled, All, Type, Options),
490
+ compile_replacement(With, RCompiled),
491
+ State = state(String, 0, Type),
492
+ ( All == all
493
+ -> re_foldl(replace(State, RCompiled), Compiled, String, Parts, [Last], [])
494
+ ; ( re_matchsub(Compiled, String, Match, [])
495
+ -> replace(State, RCompiled, Match, Parts, [Last])
496
+ ; Repl = false
497
+ )
498
+ ),
499
+ ( Repl == false
500
+ -> parts_to_output(Type, [String], NewString)
501
+ ; arg(2, State, LastSkipStart),
502
+ sub_string(String, LastSkipStart, _, 0, Last),
503
+ parts_to_output(Type, Parts, NewString)
504
+ ).
505
+
506
+ regex_capture_type_flag_chars(Flags, Chars, Options) :-
507
+ atom_chars(Flags, Chars0),
508
+ % For replace or split, the capture_type must be range, so if a
509
+ % different result is desired, it is specified in the flags. The
510
+ % following code converts an Options capture_type to a flag
511
+ % character and appends it to the Flags.
512
+ ( memberchk(capture_type(T), Options),
513
+ type_flag(TFlag, T)
514
+ -> % No need to do delete(Options,capture_type(_),Options2)
515
+ % because Flags take precedence and first occurence in Options
516
+ % takes precedence.
517
+ append(Chars0, [TFlag], Chars)
518
+ ; Chars = Chars0
519
+ ).
520
+
521
+ %! replace_range_regex(+Pattern, -Compiled, -All, -Type, +Options) is det.
522
+ replace_range_regex(Pattern/Flags, Compiled, All, Type, Options) =>
523
+ replace_range_regex(Pattern, Flags, Compiled, All, Type, Options).
524
+ replace_range_regex(Pattern, Compiled, All, Type, Options) =>
525
+ replace_range_regex(Pattern, '', Compiled, All, Type, Options).
526
+
527
+ replace_range_regex(Pattern, Flags, Compiled, All, Type, Options) =>
528
+ regex_capture_type_flag_chars(Flags, Chars, Options),
529
+ replace_flags(Chars, Chars1, All, Type),
530
+ atom_chars(RFlags, [r|Chars1]),
531
+ re_flags_options(RFlags, ROptions),
532
+ append(ROptions, Options, Options2),
533
+ re_compiled(Pattern, Compiled, Options2).
534
+
535
+ replace_flags([], [], All, Type) :-
536
+ default(All, first),
537
+ default(Type, string).
538
+ replace_flags([H|T0], T, All, Type) :-
539
+ ( all_flag(H, All)
540
+ -> true
541
+ ; type_flag(H, Type)
542
+ ),
543
+ !,
544
+ replace_flags(T0, T, All, Type).
545
+ replace_flags([H|T0], [H|T], All, Type) :-
546
+ replace_flags(T0, T, All, Type).
547
+
548
+ all_flag(g, all).
549
+
550
+ type_flag(a, atom).
551
+ type_flag(s, string).
552
+
553
+ %! default(?Val, +Default) is det.
554
+ % If Val isn't instantiated, instantiate it to Default.
555
+ % If Val is already instantiated, succeed.
556
+ % Equivalent to:
557
+ % default( Val, Default), var(Val) => Val = Default.
558
+ % default(_Val, _Default) => true.
559
+ default(Val, Val) :- !.
560
+ default(_, _).
561
+
562
+ replace(State, With, Dict, [Skipped|Parts], T) :-
563
+ State = state(String, _, _Type),
564
+ copy_term(With, r(PartsR, Skel)),
565
+ maplist(dict_pair_lookup(Dict), Skel),
566
+ range_strings(PartsR, String, Parts, T),
567
+ skipped(State, Dict.0, Skipped).
568
+
569
+ % dict_pair_lookup(d{a:1}, a-K) results in K=1.
570
+ dict_pair_lookup(Dict, Key-Dict.Key).
571
+
572
+ range_strings([], _, T, T).
573
+ range_strings([Start-Len|T0], String, [S|T1], T) :-
574
+ !,
575
+ sub_string(String, Start, Len, _, S),
576
+ range_strings(T0, String, T1, T).
577
+ range_strings([S|T0], String, [S|T1], T) :-
578
+ range_strings(T0, String, T1, T).
579
+
580
+ parts_to_output(string, Parts, String) :-
581
+ atomics_to_string(Parts, String).
582
+ parts_to_output(atom, Parts, String) :-
583
+ atomic_list_concat(Parts, String).
584
+
585
+ %! compile_replacement(+With, -Compiled)
586
+ %
587
+ % Compile the replacement specification into a specification that can
588
+ % be processed quickly. The compiled expressions are cached and may be
589
+ % reclaimed using re_flush/0 (which also removes compiled Regex from
590
+ % re_compile/3).
591
+ %
592
+ % This "compilation" has nothing to do with PCRE pattern compilation;
593
+ % it's used by re_replace/5 to process the With argument.
594
+
595
+ :- table compile_replacement/2 as shared.
596
+
597
+ compile_replacement(With, r(Parts, Extract)) :-
598
+ string_codes(With, Codes),
599
+ phrase(replacement_parts(Parts, Pairs), Codes),
600
+ % Pairs is LookupKey-Slot pairs, where a LookupKey might be
601
+ % duplicated (Slot is a shared variable within Parts).
602
+ Extract = Pairs.
603
+
604
+ replacement_parts(Parts, Extract) -->
605
+ string_escape(HCodes),
606
+ ( ("\\" ; "$"),
607
+ capture_name(Name)
608
+ -> !,
609
+ { add_part(HCodes, Parts, T0),
610
+ T0 = [Repl|T1],
611
+ Extract = [Name-Repl|Extract1]
612
+ },
613
+ replacement_parts(T1, Extract1)
614
+ ; eos
615
+ -> !,
616
+ { add_part(HCodes, Parts, []),
617
+ Extract = []
618
+ }
619
+ ).
620
+
621
+ add_part([], Parts, Parts) :-
622
+ !.
623
+ add_part(Codes, [H|T], T) :-
624
+ string_codes(H, Codes).
625
+
626
+ %! string_escape(-Codes)// is nondet.
627
+ % Similar to dcg_basics:string(Codes) but also escapes "$" and "/"
628
+ string_escape([]) -->
629
+ [].
630
+ string_escape([0'$|T]) -->
631
+ "$$", !,
632
+ string_escape(T).
633
+ string_escape([0'\\|T]) -->
634
+ "\\\\", !,
635
+ string_escape(T).
636
+ string_escape([H|T]) -->
637
+ [H],
638
+ string_escape(T).
639
+
640
+ capture_name(Name) -->
641
+ "{",
642
+ ( digit(D0)
643
+ -> digits(DL),
644
+ "}",
645
+ { number_codes(Name, [D0|DL]) }
646
+ ; letter(A0),
647
+ alnums(AL),
648
+ "}",
649
+ { atom_codes(Name, [A0|AL]) }
650
+ ).
651
+ capture_name(Name) -->
652
+ digit(D0),
653
+ !,
654
+ digits(DL),
655
+ { number_codes(Name, [D0|DL]) }.
656
+ capture_name(Name) -->
657
+ letter(A0),
658
+ !,
659
+ alnums(AL),
660
+ { atom_codes(Name, [A0|AL]) }.
661
+
662
+ letter(L) -->
663
+ [L],
664
+ { between(0'a,0'z,L)
665
+ ; between(0'A,0'Z,L)
666
+ ; L == 0'_
667
+ }, !.
668
+
669
+ alnums([H|T]) -->
670
+ alnum(H),
671
+ !,
672
+ alnums(T).
673
+ alnums([]) -->
674
+ "".
675
+
676
+ alnum(L) -->
677
+ [L],
678
+ { between(0'a,0'z,L)
679
+ ; between(0'A,0'Z,L)
680
+ ; between(0'0,0'9,L)
681
+ ; L == 0'_
682
+ }, !.
683
+
684
+ %! re_compile(+Pattern, -Regex, +Options) is det.
685
+ %
686
+ % Compiles Pattern to a Regex _blob_ of type `regex` (see blob/2).
687
+ % Defined Options are given below. Please consult the [PCRE2 API
688
+ % documentation](https://www.pcre.org/current/doc/html/pcre2api.html)
689
+ % for details. If an option is repeated, the first value is used and
690
+ % subsequent values are ignored. Unrecognized options are ignored.
691
+ % Unless otherwise specified, boolean options default to `false`. Some
692
+ % options may not exist on your system, depending on the PCRE2 version
693
+ % and how it was built - these unsupported options are silently
694
+ % ignored.
695
+ %
696
+ % The various matching predicates can take either a Regex _blob_ or a
697
+ % string pattern; if they are given a string pattern, they call
698
+ % re_compile/3 and cache the result; so, there is little reason to use
699
+ % re_compile/3 directly.
700
+ %
701
+ % * anchored(Bool)
702
+ % If `true`, match only at the first position
703
+ % * auto_capture(Bool)
704
+ % Enable use of numbered capturing parentheses.
705
+ % (default `true`)
706
+ % * bsr(Mode)
707
+ % If `anycrlf`, \R only matches CR, LF or CRLF; if `unicode`,
708
+ % \R matches all Unicode line endings.
709
+ % * bsr2(Mode) - synonym for bsr(Mode).
710
+ % * caseless(Bool)
711
+ % If `true`, do caseless matching.
712
+ % * compat(With)
713
+ % Error - PCRE1 had =|compat(javascript)|= for JavaScript
714
+ % compatibility, but PCRE2 has removed that.
715
+ % * dollar_endonly(Bool)
716
+ % If `true`, $ not to match newline at end
717
+ % * dotall(Bool)
718
+ % If `true`, . matches anything including NL
719
+ % * dupnames(Bool)
720
+ % If `true`, allow duplicate names for subpatterns
721
+ % * extended(Bool)
722
+ % If `true`, ignore white space and # comments
723
+ % * firstline(Bool)
724
+ % If `true`, force matching to be before newline
725
+ % * greedy(Bool)
726
+ % If `true`, operators such as `+` and `*` are greedy unless
727
+ % followed by `?`; if `false`, the operators are not greedy and `?`
728
+ % has the opposite meaning. It can also beset by a `(?U)` within the
729
+ % pattern - see the [PCRE2 pattern internal option setting
730
+ % documentation](https://www.pcre.org/current/doc/html/pcre2pattern.html#SEC13)
731
+ % for details and note that the PCRE2 option is `UNGREEDY`, which is
732
+ % the inverse of this packages `greedy` options. (default `true`)
733
+ % * compat(With)
734
+ % Raises an errr - PCRE1 had =|compat(javascript)|= for JavaScript
735
+ % compatibility, but PCRE2 has removed that option . Consider using
736
+ % the `alt_bsux` and `extra_alt_bsux` options.
737
+ % * multiline(Bool)
738
+ % If `true`, ^ and $ match newlines within data
739
+ % * newline(Mode)
740
+ % If `any`, recognize any Unicode newline sequence; if `anycrlf`
741
+ % (default), recognize CR, LF, and CRLF as newline sequences; if
742
+ % `cr`, recognize CR; if `lf`, recognize LF; `crlf` recognize CRLF
743
+ % as newline; if `nul`, recognize the NULL character (0x00) as
744
+ % newline.
745
+ % * newline2(Mode) - synonym for newline(Mode).
746
+ % * ucp(Bool)
747
+ % If `true`, use Unicode properties for \d, \w, etc.
748
+ % * utf_check(Bool) - see [PCRE2 API documentation](https://www.pcre.org/current/doc/html/pcre2api.html)
749
+ % You should not need this because SWI-Prolog ensures that the UTF8 strings are valid,
750
+ % * endanchored(boolean) - see [PCRE2 API documentation](https://www.pcre.org/current/doc/html/pcre2api.html)
751
+ % * allow_empty_class(boolean) - see [PCRE2 API documentation](https://www.pcre.org/current/doc/html/pcre2api.html)
752
+ % * alt_bsux(boolean) - see [PCRE2 API documentation](https://www.pcre.org/current/doc/html/pcre2api.html)
753
+ % * auto_callout(boolean) - see [PCRE2 API documentation](https://www.pcre.org/current/doc/html/pcre2api.html)
754
+ % * match_unset_backref(boolean) - see [PCRE2 API documentation](https://www.pcre.org/current/doc/html/pcre2api.html)
755
+ % * never_ucp(boolean) - see [PCRE2 API documentation](https://www.pcre.org/current/doc/html/pcre2api.html)
756
+ % * never_utf(boolean) - see [PCRE2 API documentation](https://www.pcre.org/current/doc/html/pcre2api.html)
757
+ % * auto_possess(boolean) - see [PCRE2 API documentation](https://www.pcre.org/current/doc/html/pcre2api.html)
758
+ % (default `true`)
759
+ % * dotstar_anchor(boolean) - see [PCRE2 API documentation](https://www.pcre.org/current/doc/html/pcre2api.html)
760
+ % (default `true`)
761
+ % * start_optimize(boolean) - see [PCRE2 API documentation](https://www.pcre.org/current/doc/html/pcre2api.html)
762
+ % (default `true`)
763
+ % * utf(boolean) - see [PCRE2 API documentation](https://www.pcre.org/current/doc/html/pcre2api.html)
764
+ % * never_backslash_c(boolean) - see [PCRE2 API documentation](https://www.pcre.org/current/doc/html/pcre2api.html)
765
+ % * alt_circumflex(boolean) - see [PCRE2 API documentation](https://www.pcre.org/current/doc/html/pcre2api.html)
766
+ % * alt_verbnames(boolean) - see [PCRE2 API documentation](https://www.pcre.org/current/doc/html/pcre2api.html)
767
+ % * use_offset_limit(boolean) - see [PCRE2 API documentation](https://www.pcre.org/current/doc/html/pcre2api.html)
768
+ % * extended_more(boolean) - see [PCRE2 API documentation](https://www.pcre.org/current/doc/html/pcre2api.html)
769
+ % * literal(boolean) - see [PCRE2 API documentation](https://www.pcre.org/current/doc/html/pcre2api.html)
770
+ % * match_invalid_utf(boolean) - see [PCRE2 API documentation](https://www.pcre.org/current/doc/html/pcre2api.html)
771
+ % * jit_complete(boolean) - see [PCRE2 API documentation](https://www.pcre.org/current/doc/html/pcre2api.html)
772
+ % * jit_partial_soft(boolean) - see [PCRE2 API documentation](https://www.pcre.org/current/doc/html/pcre2api.html)
773
+ % * jit_partial_hard(boolean) - see [PCRE2 API documentation](https://www.pcre.org/current/doc/html/pcre2api.html)
774
+ % * jit_invalid_utf(boolean) - see [PCRE2 API documentation](https://www.pcre.org/current/doc/html/pcre2api.html)
775
+ % * jit(boolean) - see [PCRE2 API documentation](https://www.pcre.org/current/doc/html/pcre2api.html)
776
+ % (default `true`)
777
+ % * copy_matched_subject(boolean) - see [PCRE2 API documentation](https://www.pcre.org/current/doc/html/pcre2api.html)
778
+ %
779
+ % In addition to the options above that directly map to PCRE flags the
780
+ % following options are processed:
781
+ %
782
+ % * optimise(Bool) or optimize(Bool)
783
+ % Turns on the JIT compiler for additional optimization that greatly
784
+ % that speeds up the matching performance of many patterns. (Note
785
+ % that he meaning has changed slightly from the PCRE1 implementation
786
+ % - PCRE2 always optimises where possible; this is an additional
787
+ % optimisation.)
788
+ % * capture_type(+Type)
789
+ % How to return the matched part of the input and possibly captured
790
+ % groups in there. Possible values are:
791
+ % - string
792
+ % Return the captured string as a string (default).
793
+ % - atom
794
+ % Return the captured string as an atom.
795
+ % - range
796
+ % Return the captured string as a pair `Start-Length`. Note that
797
+ % we use `Start-Length` rather than the more conventional
798
+ % `Start-End` to allow for immediate use with sub_atom/5 and
799
+ % sub_string/5.
800
+ % - term
801
+ % Parse the captured string as a Prolog term. This is notably
802
+ % practical if you capture a number.
803
+ %
804
+ % The `capture_type` specifies the default for this pattern. The
805
+ % interface supports a different type for each _named_ group using
806
+ % the syntax `(?<name_T>...)`, where `T` is one of ``S`` (string),
807
+ % ``A`` (atom), ``I`` (integer), ``F`` (float), ``N`` (number), ``T``
808
+ % (term) and ``R`` (range). In the current implementation ``I``,
809
+ % ``F`` and ``N`` are synonyms for ``T``. Future versions may act
810
+ % different if the parsed value is not of the requested numeric type.
811
+ %
812
+ % Note that re_compile/3 does not support the Pattern/Flags form that
813
+ % is supported by re_match/3, re_replace/4, etc.; the Pattern must be
814
+ % text and all compile options specified in Options.
815
+
816
+ %! re_compiled(+Spec, --Regex, +Options) is det.
817
+ %
818
+ % Create a compiled regex from a specification. Cached compiled
819
+ % regular expressions can be reclaimed using re_flush/0 (which also
820
+ % removes "compiled" With arguments from re_replace/4 and
821
+ % re_replace/5).
822
+
823
+ :- table re_compiled_/4 as shared.
824
+
825
+ re_compiled(RegexIn, Regex, Options) :-
826
+ ( blob(RegexIn, regex)
827
+ -> Regex = RegexIn
828
+ ; RegexIn = Text/Flags
829
+ -> re_compiled_(Text, Flags, Regex, Options)
830
+ ; re_compiled_(RegexIn, '', Regex, Options)
831
+ ).
832
+
833
+ re_compiled_(Text, Flags, Regex, Options) =>
834
+ must_be(text, Text),
835
+ must_be(atom, Flags),
836
+ re_flags_options(Flags, Options0),
837
+ append(Options0, Options, Options2),
838
+ re_compile(Text, Regex, Options2).
839
+
840
+ re_flags_options(Flags, Options) :-
841
+ atom_chars(Flags, Chars),
842
+ maplist(re_flag_option, Chars, Options).
843
+
844
+ re_flag_option(Flag, Option) :-
845
+ re_flag_option_(Flag, Option),
846
+ !.
847
+ re_flag_option(Flag, _) :-
848
+ existence_error(re_flag, Flag).
849
+
850
+ re_flag_option_(i, caseless(true)).
851
+ re_flag_option_(m, multiline(true)).
852
+ re_flag_option_(x, extended(true)).
853
+ re_flag_option_(s, dotall(true)).
854
+ re_flag_option_(a, capture_type(atom)).
855
+ re_flag_option_(r, capture_type(range)).
856
+ re_flag_option_(t, capture_type(term)).
857
+
858
+ %! re_flush
859
+ %
860
+ % Clean pattern and replacement caches.
861
+ %
862
+ % @tbd Flush automatically if the cache becomes too large.
863
+
864
+ re_flush :-
865
+ abolish_module_tables(pcre).
866
+
867
+ %! re_config(?Term)
868
+ %
869
+ % Extract configuration information from the pcre library. Term is of
870
+ % the form ``Name(Value)``. Name is derived from the
871
+ % ``PCRE_CONFIG_*`` constant after removing ``PCRE_CONFIG_`` and
872
+ % mapping the name to lower case, e.g. `utf8`, `unicode_properties`,
873
+ % etc. Value is a Prolog boolean, integer, or atom. For boolean (1 or
874
+ % 0) values, `true` or `false` is returned.
875
+ %
876
+ % re_config/1 will backtrack through all the possible configuration
877
+ % values if its argument is a variable. If an unknown option is
878
+ % specified, re_config/1 fails.
879
+ %
880
+ % Non-compatible changes between PCRE1 and PCRE2 because numeric
881
+ % values changed: `bsr` and `newline` have been replaced by `bsr2` and
882
+ % `newline2`:
883
+ % * `bsr2` - previously `bsr` returned 0 or 1; now returns `unicode`
884
+ % or `anycrlf`
885
+ % * `newline2` - previously `newline` returned an integer, now
886
+ % returns `cr`, `lf`, `crlf`, `any`, `anycrlf`, `nul`
887
+ %
888
+ % Term values are as follows. Some values might not exist, depending on
889
+ % the version of PCRE2 and the options it was built with.
890
+ %
891
+ % * bsr2
892
+ % The character sequences that the `\R` escape sequence matches by
893
+ % default. Replaces `bsr` option from PCRE1, which is not compatible.
894
+ % * compiled_widths
895
+ % An integer whose lower bits indicate which code unit widths were
896
+ % selected when PCRE2 was built. The 1-bit indicates 8-bit support,
897
+ % and the 2-bit and 4-bit indicate 16-bit and 32-bit support,
898
+ % respectively. The 1 bit should always be set because the wrapper
899
+ % code requires 8 bit support.
900
+ % * depthlimit
901
+ % * heaplimit
902
+ % * jit
903
+ % `true` if just-in-time compiling is available.
904
+ % * jittarget
905
+ % A string containing the name of the architecture for which the JIT
906
+ % compiler is configured. e.g., 'x86 64bit (little endian + unaligned)'.
907
+ % * linksize
908
+ % * matchlimit
909
+ % * never_backslash_c
910
+ % * newline2
911
+ % An atom whose value specifies the default character sequence that
912
+ % is recognized as meaning "newline" (`cr`, `lf`, `crlf`, `any`,
913
+ % `anycrlf`, `nul`). Replaces `newline` option from PCRE1, which is
914
+ % not compatible.
915
+ % * parenslimit
916
+ % * stackrecurse
917
+ % * unicode
918
+ % Always `true`
919
+ % * unicode_version
920
+ % The unicode version as an atom, e.g. '12.1.0'.
921
+ % * utf8 - synonym for `unicode`
922
+ % * parens_limit
923
+ % * version
924
+ % The version information as an atom, containing the PCRE version
925
+ % number and release date, e.g. '10.34 2019-11-21'.
926
+ %
927
+ % For backwards compatibility with PCRE1, the following are accepted,
928
+ % but are deprecated:
929
+ % * `utf8` - synonym for `unicode`
930
+ % * `link_size` - synonym for `linksize`
931
+ % * `match_limit` - synonym for `matchlimit`
932
+ % * `parens_limit` - synonym for `parenslimit`
933
+ % * `unicode_properties` - always true
934
+ % The following have been removed because they don't exist in PCRE2
935
+ % and don't seem to have any meaningful use in PCRE1:
936
+ % * `posix_malloc_threshold`
937
+ % * `match_limit_recursion`
938
+
939
+ % @see `man pcre2api` for details
940
+
941
+ re_config(Term), var(Term) =>
942
+ re_config_choice(Term),
943
+ % This code depends on re_config_/1 failing if it's given an invalid
944
+ % Term (e.g., re_config_(jittarget(_)) fails if jit(false)). If
945
+ % re_config_/1 is changed to throw an error, then the following call
946
+ % needs to be inside catch/3.
947
+ re_config_(Term).
948
+ re_config(Term) =>
949
+ re_config_(Term).
950
+
951
+ /*******************************
952
+ * COMPILE *
953
+ *******************************/
954
+
955
+ :- create_prolog_flag(re_compile, false, [keep(true)]).
956
+
957
+ expand_regex(Regex, String, Options, Goal) :-
958
+ \+ blob(Regex, regex),
959
+ re_compiled(Regex, Compiled, Options),
960
+ Goal = (pcre:re_match_(Compiled, String, Options)).
961
+
962
+
963
+ :- multifile
964
+ user:goal_expansion/2.
965
+
966
+ user:goal_expansion(re_match(Regex, String), Compiled) :-
967
+ ground(Regex),
968
+ current_prolog_flag(re_compile, true),
969
+ expand_regex(Regex, String, [], Compiled).
970
+ user:goal_expansion(re_match(Regex, String, Options), Compiled) :-
971
+ ground(Regex),
972
+ ground(Options),
973
+ current_prolog_flag(re_compile, true),
974
+ expand_regex(Regex, String, Options, Compiled).