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,1188 @@
1
+ /* Part of SWI-Prolog
2
+
3
+ Author: Jan Wielemaker
4
+ E-mail: J.Wielemaker@vu.nl
5
+ WWW: http://www.swi-prolog.org
6
+ Copyright (c) 2006-2025, University of Amsterdam
7
+ VU University Amsterdam
8
+ SWI-Prolog Solutions b.v.
9
+ All rights reserved.
10
+
11
+ Redistribution and use in source and binary forms, with or without
12
+ modification, are permitted provided that the following conditions
13
+ are met:
14
+
15
+ 1. Redistributions of source code must retain the above copyright
16
+ notice, this list of conditions and the following disclaimer.
17
+
18
+ 2. Redistributions in binary form must reproduce the above copyright
19
+ notice, this list of conditions and the following disclaimer in
20
+ the documentation and/or other materials provided with the
21
+ distribution.
22
+
23
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
24
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
25
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
26
+ FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
27
+ COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
28
+ INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
29
+ BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
30
+ LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
31
+ CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
32
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
33
+ ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
34
+ POSSIBILITY OF SUCH DAMAGE.
35
+ */
36
+
37
+ :- module(prolog_source,
38
+ [ prolog_read_source_term/4, % +Stream, -Term, -Expanded, +Options
39
+ read_source_term_at_location/3, %Stream, -Term, +Options
40
+ prolog_file_directives/3, % +File, -Directives, +Options
41
+ prolog_open_source/2, % +Source, -Stream
42
+ prolog_close_source/1, % +Stream
43
+ prolog_canonical_source/2, % +Spec, -Id
44
+
45
+ load_quasi_quotation_syntax/2, % :Path, +Syntax
46
+
47
+ file_name_on_path/2, % +File, -PathSpec
48
+ file_alias_path/2, % ?Alias, ?Dir
49
+ path_segments_atom/2, % ?Segments, ?Atom
50
+ directory_source_files/3, % +Dir, -Files, +Options
51
+ valid_term_position/2 % +Term, +TermPos
52
+ ]).
53
+ :- use_module(library(debug), [debug/3, assertion/1]).
54
+ :- autoload(library(apply), [maplist/2, maplist/3, foldl/4]).
55
+ :- autoload(library(error), [domain_error/2, is_of_type/2]).
56
+ :- autoload(library(lists), [member/2, last/2, select/3, append/3, selectchk/3]).
57
+ :- autoload(library(operators), [push_op/3, push_operators/1, pop_operators/0]).
58
+ :- autoload(library(option), [select_option/4, option/3, option/2]).
59
+ :- autoload(library(modules),[in_temporary_module/3]).
60
+
61
+
62
+ /** <module> Examine Prolog source-files
63
+
64
+ This module provides predicates to open, close and read terms from
65
+ Prolog source-files. This may seem easy, but there are a couple of
66
+ problems that must be taken care of.
67
+
68
+ * Source files may start with #!, supporting PrologScript
69
+ * Embedded operators declarations must be taken into account
70
+ * Style-check options must be taken into account
71
+ * Operators and style-check options may be implied by directives
72
+ * On behalf of the development environment we also wish to
73
+ parse PceEmacs buffers
74
+
75
+ This module concentrates these issues in a single library. Intended
76
+ users of the library are:
77
+
78
+ $ prolog_xref.pl : The Prolog cross-referencer
79
+ $ prolog_clause.pl : Get details about (compiled) clauses
80
+ $ prolog_colour.pl : Colourise source-code
81
+ $ PceEmacs : Emacs syntax-colouring
82
+ $ PlDoc : The documentation framework
83
+ */
84
+
85
+ :- thread_local
86
+ open_source/2, % Stream, State
87
+ mode/2. % Stream, Data
88
+
89
+ :- multifile
90
+ requires_library/2,
91
+ prolog:xref_source_identifier/2, % +Source, -Id
92
+ prolog:xref_source_time/2, % +Source, -Modified
93
+ prolog:xref_open_source/2, % +SourceId, -Stream
94
+ prolog:xref_close_source/2, % +SourceId, -Stream
95
+ prolog:alternate_syntax/4, % Syntax, +Module, -Setup, -Restore
96
+ prolog:xref_update_syntax/2, % +Directive, +Module
97
+ prolog:quasi_quotation_syntax/2. % Syntax, Library
98
+
99
+
100
+ :- predicate_options(prolog_read_source_term/4, 4,
101
+ [ pass_to(system:read_clause/3, 3)
102
+ ]).
103
+ :- predicate_options(read_source_term_at_location/3, 3,
104
+ [ line(integer),
105
+ offset(integer),
106
+ module(atom),
107
+ operators(list),
108
+ error(-any),
109
+ pass_to(system:read_term/3, 3)
110
+ ]).
111
+ :- predicate_options(directory_source_files/3, 3,
112
+ [ recursive(boolean),
113
+ if(oneof([true,loaded])),
114
+ pass_to(system:absolute_file_name/3,3)
115
+ ]).
116
+
117
+
118
+ /*******************************
119
+ * READING *
120
+ *******************************/
121
+
122
+ %! prolog_read_source_term(+In, -Term, -Expanded, +Options) is det.
123
+ %
124
+ % Read a term from a Prolog source-file. Options is a option list
125
+ % that is forwarded to read_clause/3.
126
+ %
127
+ % This predicate is intended to read the file from the start. It
128
+ % tracks directives to update its notion of the currently
129
+ % effective syntax (e.g., declared operators).
130
+ %
131
+ % @param Term Term read
132
+ % @param Expanded Result of term-expansion on the term
133
+ % @see read_source_term_at_location/3 for reading at an
134
+ % arbitrary location.
135
+
136
+ prolog_read_source_term(In, Term, Expanded, Options) :-
137
+ maplist(read_clause_option, Options),
138
+ !,
139
+ select_option(subterm_positions(TermPos), Options,
140
+ RestOptions, TermPos),
141
+ read_clause(In, Term,
142
+ [ subterm_positions(TermPos)
143
+ | RestOptions
144
+ ]),
145
+ expand(Term, TermPos, In, Expanded),
146
+ '$current_source_module'(M),
147
+ update_state(Term, Expanded, M, In).
148
+ prolog_read_source_term(In, Term, Expanded, Options) :-
149
+ '$current_source_module'(M),
150
+ select_option(syntax_errors(SE), Options, RestOptions0, dec10),
151
+ select_option(subterm_positions(TermPos), RestOptions0,
152
+ RestOptions, TermPos),
153
+ ( style_check(?(singleton))
154
+ -> FinalOptions = [ singletons(warning) | RestOptions ]
155
+ ; FinalOptions = RestOptions
156
+ ),
157
+ read_term(In, Term,
158
+ [ module(M),
159
+ syntax_errors(SE),
160
+ subterm_positions(TermPos)
161
+ | FinalOptions
162
+ ]),
163
+ expand(Term, TermPos, In, Expanded),
164
+ update_state(Term, Expanded, M, In).
165
+
166
+ read_clause_option(syntax_errors(_)).
167
+ read_clause_option(term_position(_)).
168
+ read_clause_option(process_comment(_)).
169
+ read_clause_option(comments(_)).
170
+
171
+ :- public
172
+ expand/3. % Used by Prolog colour
173
+
174
+ expand(Term, In, Exp) :-
175
+ expand(Term, _, In, Exp).
176
+
177
+ expand(Var, _, _, Var) :-
178
+ var(Var),
179
+ !.
180
+ expand(Term, _, _, Term) :-
181
+ no_expand(Term),
182
+ !.
183
+ expand(Term, _, _, _) :-
184
+ requires_library(Term, Lib),
185
+ ensure_loaded(user:Lib),
186
+ fail.
187
+ expand(Term, _, In, Term) :-
188
+ chr_expandable(Term, In),
189
+ !.
190
+ expand(Term, Pos, _, Expanded) :-
191
+ expand_term(Term, Pos, Expanded, _).
192
+
193
+ no_expand((:- if(_))).
194
+ no_expand((:- elif(_))).
195
+ no_expand((:- else)).
196
+ no_expand((:- endif)).
197
+ no_expand((:- require(_))).
198
+
199
+ chr_expandable((:- chr_constraint(_)), In) :-
200
+ add_mode(In, chr).
201
+ chr_expandable((handler(_)), In) :-
202
+ mode(In, chr).
203
+ chr_expandable((rules(_)), In) :-
204
+ mode(In, chr).
205
+ chr_expandable(<=>(_, _), In) :-
206
+ mode(In, chr).
207
+ chr_expandable(@(_, _), In) :-
208
+ mode(In, chr).
209
+ chr_expandable(==>(_, _), In) :-
210
+ mode(In, chr).
211
+ chr_expandable(pragma(_, _), In) :-
212
+ mode(In, chr).
213
+ chr_expandable(option(_, _), In) :-
214
+ mode(In, chr).
215
+
216
+ add_mode(Stream, Mode) :-
217
+ mode(Stream, Mode),
218
+ !.
219
+ add_mode(Stream, Mode) :-
220
+ asserta(mode(Stream, Mode)).
221
+
222
+ %! requires_library(+Term, -Library)
223
+ %
224
+ % known expansion hooks. May be expanded as multifile predicate.
225
+
226
+ requires_library((:- emacs_begin_mode(_,_,_,_,_)), library(emacs_extend)).
227
+ requires_library((:- draw_begin_shape(_,_,_,_)), library(pcedraw)).
228
+ requires_library((:- use_module(library(pce))), library(pce)).
229
+ requires_library((:- pce_begin_class(_,_)), library(pce)).
230
+ requires_library((:- pce_begin_class(_,_,_)), library(pce)).
231
+ requires_library((:- html_meta(_)), library(http/html_decl)).
232
+
233
+ %! update_state(+Term, +Expanded, +Module, +In) is det.
234
+ %
235
+ % Update operators and style-check options from Term or Expanded.
236
+
237
+ :- multifile
238
+ pce_expansion:push_compile_operators/1,
239
+ pce_expansion:pop_compile_operators/0.
240
+
241
+ update_state((:- pce_end_class), _, _, _) =>
242
+ ignore(pce_expansion:pop_compile_operators).
243
+ update_state((:- pce_extend_class(_)), _, SM, _) =>
244
+ pce_expansion:push_compile_operators(SM).
245
+ update_state(Raw, _, Module, _),
246
+ catch(prolog:xref_update_syntax(Raw, Module),
247
+ error(_,_),
248
+ fail) =>
249
+ true.
250
+ update_state(_Raw, Expanded, M, In) =>
251
+ update_state(Expanded, M, In).
252
+
253
+ update_state(Var, _, _) :-
254
+ var(Var),
255
+ !.
256
+ update_state([], _, _) :-
257
+ !.
258
+ update_state([H|T], M, In) :-
259
+ !,
260
+ update_state(H, M, In),
261
+ update_state(T, M, In).
262
+ update_state((:- Directive), M, In) :-
263
+ nonvar(Directive),
264
+ !,
265
+ catch(update_directive(Directive, M, In), _, true).
266
+ update_state((?- Directive), M, In) :-
267
+ !,
268
+ update_state((:- Directive), M, In).
269
+ update_state(MetaDecl, _M, _) :-
270
+ MetaDecl = html_write:html_meta_head(_Head,_Module,_Meta),
271
+ ( clause(MetaDecl, true)
272
+ -> true
273
+ ; assertz(MetaDecl)
274
+ ).
275
+ update_state(_, _, _).
276
+
277
+ %! update_directive(+Directive, +Module, +In) is det.
278
+
279
+ update_directive(Directive, Module, _) :-
280
+ prolog:xref_update_syntax((:- Directive), Module),
281
+ !.
282
+ update_directive(encoding(Enc), _, In) :-
283
+ !,
284
+ set_stream(In, encoding(Enc)).
285
+ update_directive(module(Module, Public), _, _) :-
286
+ atom(Module),
287
+ is_list(Public),
288
+ !,
289
+ '$set_source_module'(Module),
290
+ maplist(import_syntax(_,Module, _), Public).
291
+ update_directive(M:op(P,T,N), SM, In) :-
292
+ atom(M),
293
+ ground(op(P,T,N)),
294
+ !,
295
+ update_directive(op(P,T,N), SM, In).
296
+ update_directive(op(P,T,N), SM, _) :-
297
+ ground(op(P,T,N)),
298
+ !,
299
+ strip_module(SM:N, M, PN),
300
+ push_op(P,T,M:PN).
301
+ update_directive(style_check(Style), _, _) :-
302
+ ground(Style),
303
+ style_check(Style),
304
+ !.
305
+ update_directive(use_module(Spec), SM, _) :-
306
+ ground(Spec),
307
+ catch(module_decl(Spec, Path, Public), _, fail),
308
+ is_list(Public),
309
+ !,
310
+ maplist(import_syntax(Path, SM, _), Public).
311
+ update_directive(use_module(Spec, Imports), SM, _) :-
312
+ ground(Spec),
313
+ is_list(Imports),
314
+ catch(module_decl(Spec, Path, Public), _, fail),
315
+ is_list(Public),
316
+ !,
317
+ maplist(import_syntax(Path, SM, Imports), Public).
318
+ update_directive(pce_begin_class_definition(_,_,_,_), SM, _) :-
319
+ pce_expansion:push_compile_operators(SM),
320
+ !.
321
+ update_directive(_, _, _).
322
+
323
+ %! import_syntax(+Path, +Module, +Imports, +ExportStatement) is det.
324
+ %
325
+ % Import syntax affecting aspects of a declaration. Deals with
326
+ % op/3 terms and Syntax/4 quasi quotation declarations.
327
+
328
+ import_syntax(_, _, _, Var) :-
329
+ var(Var),
330
+ !.
331
+ import_syntax(_, M, Imports, Op) :-
332
+ Op = op(_,_,_),
333
+ \+ \+ member(Op, Imports),
334
+ !,
335
+ update_directive(Op, M, _).
336
+ import_syntax(Path, SM, Imports, Syntax/4) :-
337
+ \+ \+ member(Syntax/4, Imports),
338
+ load_quasi_quotation_syntax(SM:Path, Syntax),
339
+ !.
340
+ import_syntax(_,_,_, _).
341
+
342
+
343
+ %! load_quasi_quotation_syntax(:Path, +Syntax) is semidet.
344
+ %
345
+ % Import quasi quotation syntax Syntax from Path into the module
346
+ % specified by the first argument. Quasi quotation syntax is
347
+ % imported iff:
348
+ %
349
+ % - It is already loaded
350
+ % - It is declared with prolog:quasi_quotation_syntax/2
351
+ %
352
+ % @tbd We need a better way to know that an import affects the
353
+ % syntax or compilation process. This is also needed for
354
+ % better compatibility with systems that provide a
355
+ % separate compiler.
356
+
357
+ load_quasi_quotation_syntax(SM:Path, Syntax) :-
358
+ atom(Path), atom(Syntax),
359
+ source_file_property(Path, module(M)),
360
+ functor(ST, Syntax, 4),
361
+ predicate_property(M:ST, quasi_quotation_syntax),
362
+ !,
363
+ use_module(SM:Path, [Syntax/4]).
364
+ load_quasi_quotation_syntax(SM:Path, Syntax) :-
365
+ atom(Path), atom(Syntax),
366
+ prolog:quasi_quotation_syntax(Syntax, Spec),
367
+ absolute_file_name(Spec, Path2,
368
+ [ file_type(prolog),
369
+ file_errors(fail),
370
+ access(read)
371
+ ]),
372
+ Path == Path2,
373
+ !,
374
+ use_module(SM:Path, [Syntax/4]).
375
+
376
+ %! module_decl(+FileSpec, -Source, -Exports) is semidet.
377
+ %
378
+ % If FileSpec refers to a Prolog module file, unify Path with the
379
+ % canonical file path to the file and Decl with the second argument of
380
+ % the module declaration.
381
+
382
+ module_decl(Spec, Source, Exports) :-
383
+ absolute_file_name(Spec, Path,
384
+ [ file_type(prolog),
385
+ file_errors(fail),
386
+ access(read)
387
+ ]),
388
+ module_decl_(Path, Source, Exports).
389
+
390
+ module_decl_(Path, Source, Exports) :-
391
+ file_name_extension(_, qlf, Path),
392
+ !,
393
+ '$qlf_module'(Path, Info),
394
+ _{file:Source, exports:Exports} :< Info.
395
+ module_decl_(Path, Path, Exports) :-
396
+ setup_call_cleanup(
397
+ prolog_open_source(Path, In),
398
+ read_module_decl(In, Exports),
399
+ prolog_close_source(In)).
400
+
401
+ read_module_decl(In, Decl) :-
402
+ read(In, Term0),
403
+ read_module_decl(Term0, In, Decl).
404
+
405
+ read_module_decl((:- module(_, DeclIn)), _In, Decl) =>
406
+ Decl = DeclIn.
407
+ read_module_decl((:- encoding(Enc)), In, Decl) =>
408
+ set_stream(In, encoding(Enc)),
409
+ read(In, Term2),
410
+ read_module_decl(Term2, In, Decl).
411
+ read_module_decl(_, _, _) =>
412
+ fail.
413
+
414
+
415
+ %! read_source_term_at_location(+Stream, -Term, +Options) is semidet.
416
+ %
417
+ % Try to read a Prolog term form an arbitrary location inside a
418
+ % file. Due to Prolog's dynamic syntax, e.g., due to operator
419
+ % declarations that may change anywhere inside the file, this is
420
+ % theoreticaly impossible. Therefore, this predicate is
421
+ % fundamentally _heuristic_ and may fail. This predicate is used
422
+ % by e.g., clause_info/4 and by PceEmacs to colour the current
423
+ % clause.
424
+ %
425
+ % This predicate has two ways to find the right syntax. If the
426
+ % file is loaded, it can be passed the module using the module
427
+ % option. This deals with module files that define the used
428
+ % operators globally for the file. Second, there is a hook
429
+ % prolog:alternate_syntax/4 that can be used to temporary redefine
430
+ % the syntax.
431
+ %
432
+ % The options below are processed in addition to the options of
433
+ % read_term/3. Note that the =line= and =offset= options are
434
+ % mutually exclusive.
435
+ %
436
+ % * line(+Line)
437
+ % If present, start reading at line Line.
438
+ % * offset(+Characters)
439
+ % Use seek/4 to go to the indicated location. See seek/4
440
+ % for limitations of seeking in text-files.
441
+ % * module(+Module)
442
+ % Use syntax from the given module. Default is the current
443
+ % `source module'.
444
+ % * operators(+List)
445
+ % List of additional operator declarations to enforce while
446
+ % reading the term.
447
+ % * error(-Error)
448
+ % If no correct parse can be found, unify Error with a term
449
+ % Offset:Message that indicates the (character) location of
450
+ % the error and the related message. Adding this option
451
+ % makes read_source_term_at_location/3 deterministic (=det=).
452
+ %
453
+ % @see Use read_source_term/4 to read a file from the start.
454
+ % @see prolog:alternate_syntax/4 for locally scoped operators.
455
+
456
+ :- thread_local
457
+ last_syntax_error/2. % location, message
458
+
459
+ read_source_term_at_location(Stream, Term, Options) :-
460
+ retractall(last_syntax_error(_,_)),
461
+ seek_to_start(Stream, Options),
462
+ stream_property(Stream, position(Here)),
463
+ '$current_source_module'(DefModule),
464
+ option(module(Module), Options, DefModule),
465
+ option(operators(Ops), Options, []),
466
+ alternate_syntax(Syntax, Module, Setup, Restore),
467
+ set_stream_position(Stream, Here),
468
+ debug(read, 'Trying with syntax ~w', [Syntax]),
469
+ push_operators(Module:Ops),
470
+ call(Setup),
471
+ Error = error(Formal,_), % do not catch timeout, etc.
472
+ setup_call_cleanup(
473
+ asserta(user:thread_message_hook(_,_,_), Ref), % silence messages
474
+ catch(qq_read_term(Stream, Term0,
475
+ [ module(Module)
476
+ | Options
477
+ ]),
478
+ Error,
479
+ true),
480
+ erase(Ref)),
481
+ call(Restore),
482
+ pop_operators,
483
+ ( var(Formal)
484
+ -> !, Term = Term0
485
+ ; assert_error(Error, Options),
486
+ fail
487
+ ).
488
+ read_source_term_at_location(_, _, Options) :-
489
+ option(error(Error), Options),
490
+ !,
491
+ setof(CharNo:Msg, retract(last_syntax_error(CharNo, Msg)), Pairs),
492
+ last(Pairs, Error).
493
+
494
+ assert_error(Error, Options) :-
495
+ option(error(_), Options),
496
+ !,
497
+ ( ( Error = error(syntax_error(Id),
498
+ stream(_S1, _Line1, _LinePos1, CharNo))
499
+ ; Error = error(syntax_error(Id),
500
+ file(_S2, _Line2, _LinePos2, CharNo))
501
+ )
502
+ -> message_to_string(error(syntax_error(Id), _), Msg),
503
+ assertz(last_syntax_error(CharNo, Msg))
504
+ ; debug(read, 'Error: ~q', [Error]),
505
+ throw(Error)
506
+ ).
507
+ assert_error(_, _).
508
+
509
+
510
+ %! alternate_syntax(?Syntax, +Module, -Setup, -Restore) is nondet.
511
+ %
512
+ % Define an alternative syntax to try reading a term at an
513
+ % arbitrary location in module Module.
514
+ %
515
+ % Calls the hook prolog:alternate_syntax/4 with the same signature
516
+ % to allow for user-defined extensions.
517
+ %
518
+ % @param Setup is a deterministic goal to enable this syntax in
519
+ % module.
520
+ % @param Restore is a deterministic goal to revert the actions of
521
+ % Setup.
522
+
523
+ alternate_syntax(prolog, _, true, true).
524
+ alternate_syntax(Syntax, M, Setup, Restore) :-
525
+ prolog:alternate_syntax(Syntax, M, Setup, Restore).
526
+
527
+
528
+ %! seek_to_start(+Stream, +Options) is det.
529
+ %
530
+ % Go to the location from where to start reading.
531
+
532
+ seek_to_start(Stream, Options) :-
533
+ option(line(Line), Options),
534
+ !,
535
+ seek(Stream, 0, bof, _),
536
+ seek_to_line(Stream, Line).
537
+ seek_to_start(Stream, Options) :-
538
+ option(offset(Start), Options),
539
+ !,
540
+ seek(Stream, Start, bof, _).
541
+ seek_to_start(_, _).
542
+
543
+ %! seek_to_line(+Stream, +Line)
544
+ %
545
+ % Seek to indicated line-number.
546
+
547
+ seek_to_line(Fd, N) :-
548
+ N > 1,
549
+ !,
550
+ skip(Fd, 10),
551
+ NN is N - 1,
552
+ seek_to_line(Fd, NN).
553
+ seek_to_line(_, _).
554
+
555
+
556
+ /*******************************
557
+ * QUASI QUOTATIONS *
558
+ *******************************/
559
+
560
+ %! qq_read_term(+Stream, -Term, +Options)
561
+ %
562
+ % Same as read_term/3, but dynamically loads known quasi
563
+ % quotations. Quasi quotations that can be autoloaded must be
564
+ % defined using prolog:quasi_quotation_syntax/2.
565
+
566
+ qq_read_term(Stream, Term, Options) :-
567
+ select(syntax_errors(ErrorMode), Options, Options1),
568
+ ErrorMode \== error,
569
+ !,
570
+ ( ErrorMode == dec10
571
+ -> repeat,
572
+ qq_read_syntax_ex(Stream, Term, Options1, Error),
573
+ ( var(Error)
574
+ -> !
575
+ ; print_message(error, Error),
576
+ fail
577
+ )
578
+ ; qq_read_syntax_ex(Stream, Term, Options1, Error),
579
+ ( ErrorMode == fail
580
+ -> print_message(error, Error),
581
+ fail
582
+ ; ErrorMode == quiet
583
+ -> fail
584
+ ; domain_error(syntax_errors, ErrorMode)
585
+ )
586
+ ).
587
+ qq_read_term(Stream, Term, Options) :-
588
+ qq_read_term_ex(Stream, Term, Options).
589
+
590
+ qq_read_syntax_ex(Stream, Term, Options, Error) :-
591
+ catch(qq_read_term_ex(Stream, Term, Options),
592
+ error(syntax_error(Syntax), Context),
593
+ Error = error(Syntax, Context)).
594
+
595
+ qq_read_term_ex(Stream, Term, Options) :-
596
+ stream_property(Stream, position(Here)),
597
+ catch(read_term(Stream, Term, Options),
598
+ error(syntax_error(unknown_quasi_quotation_syntax(Syntax, Module)), Context),
599
+ load_qq_and_retry(Here, Syntax, Module, Context, Stream, Term, Options)).
600
+
601
+ load_qq_and_retry(Here, Syntax, Module, _, Stream, Term, Options) :-
602
+ set_stream_position(Stream, Here),
603
+ prolog:quasi_quotation_syntax(Syntax, Library),
604
+ !,
605
+ use_module(Module:Library, [Syntax/4]),
606
+ read_term(Stream, Term, Options).
607
+ load_qq_and_retry(_Pos, Syntax, Module, Context, _Stream, _Term, _Options) :-
608
+ print_message(warning, quasi_quotation(undeclared, Syntax)),
609
+ throw(error(syntax_error(unknown_quasi_quotation_syntax(Syntax, Module)), Context)).
610
+
611
+ %! prolog:quasi_quotation_syntax(+Syntax, -Library) is semidet.
612
+ %
613
+ % True when the quasi quotation syntax Syntax can be loaded from
614
+ % Library. Library must be a valid first argument for
615
+ % use_module/2.
616
+ %
617
+ % This multifile hook is used by library(prolog_source) to load
618
+ % quasi quotation handlers on demand.
619
+
620
+ prolog:quasi_quotation_syntax(html, library(http/html_write)).
621
+ prolog:quasi_quotation_syntax(javascript, library(http/js_write)).
622
+
623
+
624
+ %! prolog_file_directives(+File, -Directives, +Options) is det.
625
+ %
626
+ % True when Directives is a list of directives that appear in the
627
+ % source file File. Reading directives stops at the first
628
+ % non-directive term. Processing deals with expand_term/2 as well as
629
+ % conditional compilation. Options processed:
630
+ %
631
+ % - canonical_source(-Source)
632
+ % Unify Source with the canonical source identifier as also
633
+ % used by library(prolog_xref).
634
+ % - silent(+Boolean)
635
+ % If `true` (default `false`), do not report syntax errors and
636
+ % other errors.
637
+
638
+ prolog_file_directives(File, Directives, Options) :-
639
+ option(canonical_source(Path), Options, _),
640
+ prolog_canonical_source(File, Path),
641
+ in_temporary_module(
642
+ TempModule,
643
+ true,
644
+ read_directives(TempModule, Path, Directives, Options)).
645
+
646
+ read_directives(TempModule, Path, Directives, Options) :-
647
+ setup_call_cleanup(
648
+ read_directives_setup(TempModule, Path, In, State),
649
+ phrase(read_directives(In, Options, [true]), Directives),
650
+ read_directives_cleanup(In, State)).
651
+
652
+ read_directives_setup(TempModule, Path, In, state(OldM, OldXref)) :-
653
+ prolog_open_source(Path, In),
654
+ '$set_source_module'(OldM, TempModule),
655
+ current_prolog_flag(xref, OldXref),
656
+ set_prolog_flag(xref, true).
657
+
658
+ read_directives_cleanup(In, state(OldM, OldXref)) :-
659
+ '$set_source_module'(OldM),
660
+ set_prolog_flag(xref, OldXref),
661
+ prolog_close_source(In).
662
+
663
+ read_directives(In, Options, State) -->
664
+ { E = error(_,_),
665
+ repeat,
666
+ catch(prolog_read_source_term(In, Term, Expanded,
667
+ [ process_comment(true),
668
+ syntax_errors(error)
669
+ ]),
670
+ E, report_syntax_error(E, Options))
671
+ -> nonvar(Term),
672
+ Term = (:-_)
673
+ },
674
+ !,
675
+ terms(Expanded, State, State1),
676
+ read_directives(In, Options, State1).
677
+ read_directives(_, _, _) --> [].
678
+
679
+ report_syntax_error(_, Options) :-
680
+ option(silent(true), Options),
681
+ !,
682
+ fail.
683
+ report_syntax_error(E, _Options) :-
684
+ print_message(warning, E),
685
+ fail.
686
+
687
+ terms(Var, State, State) --> { var(Var) }, !.
688
+ terms([H|T], State0, State) -->
689
+ !,
690
+ terms(H, State0, State1),
691
+ terms(T, State1, State).
692
+ terms((:-if(Cond)), State0, [True|State0]) -->
693
+ !,
694
+ { eval_cond(Cond, True) }.
695
+ terms((:-elif(Cond)), [True0|State], [True|State]) -->
696
+ !,
697
+ { eval_cond(Cond, True1),
698
+ elif(True0, True1, True)
699
+ }.
700
+ terms((:-else), [True0|State], [True|State]) -->
701
+ !,
702
+ { negate(True0, True) }.
703
+ terms((:-endif), [_|State], State) --> !.
704
+ terms(H, State, State) -->
705
+ ( {State = [true|_]}
706
+ -> [H]
707
+ ; []
708
+ ).
709
+
710
+ eval_cond(Cond, true) :-
711
+ catch(Cond, error(_,_), fail),
712
+ !.
713
+ eval_cond(_, false).
714
+
715
+ elif(true, _, else_false) :- !.
716
+ elif(false, true, true) :- !.
717
+ elif(True, _, True).
718
+
719
+ negate(true, false).
720
+ negate(false, true).
721
+ negate(else_false, else_false).
722
+
723
+ /*******************************
724
+ * SOURCES *
725
+ *******************************/
726
+
727
+ %! prolog_open_source(+CanonicalId:atomic, -Stream:stream) is det.
728
+ %
729
+ % Open source with given canonical id (see
730
+ % prolog_canonical_source/2) and remove the #! line if any.
731
+ % Streams opened using this predicate must be closed using
732
+ % prolog_close_source/1. Typically using the skeleton below. Using
733
+ % this skeleton, operator and style-check options are
734
+ % automatically restored to the values before opening the source.
735
+ %
736
+ % ==
737
+ % process_source(Src) :-
738
+ % prolog_open_source(Src, In),
739
+ % call_cleanup(process(Src), prolog_close_source(In)).
740
+ % ==
741
+
742
+ prolog_open_source(Src, Fd) :-
743
+ '$push_input_context'(source),
744
+ catch(( prolog:xref_open_source(Src, Fd)
745
+ -> Hooked = true
746
+ ; open(Src, read, Fd),
747
+ Hooked = false
748
+ ), E,
749
+ ( '$pop_input_context',
750
+ throw(E)
751
+ )),
752
+ skip_hashbang(Fd),
753
+ push_operators([]),
754
+ '$current_source_module'(SM),
755
+ '$save_lex_state'(LexState, []),
756
+ asserta(open_source(Fd, state(Hooked, Src, LexState, SM))).
757
+
758
+ skip_hashbang(Fd) :-
759
+ catch(( peek_char(Fd, #) % Deal with #! script
760
+ -> skip(Fd, 10)
761
+ ; true
762
+ ), E,
763
+ ( close(Fd, [force(true)]),
764
+ '$pop_input_context',
765
+ throw(E)
766
+ )).
767
+
768
+ %! prolog:xref_open_source(+SourceID, -Stream)
769
+ %
770
+ % Hook to open an xref SourceID. This is used for
771
+ % cross-referencing non-files, such as XPCE buffers, files from
772
+ % archives, git repositories, etc. When successful, the
773
+ % corresponding prolog:xref_close_source/2 hook is called for
774
+ % closing the source.
775
+
776
+
777
+ %! prolog_close_source(+In:stream) is det.
778
+ %
779
+ % Close a stream opened using prolog_open_source/2. Restores
780
+ % operator and style options. If the stream has not been read to
781
+ % the end, we call expand_term(end_of_file, _) to allow expansion
782
+ % modules to clean-up.
783
+
784
+ prolog_close_source(In) :-
785
+ call_cleanup(
786
+ restore_source_context(In, Hooked, Src),
787
+ close_source(Hooked, Src, In)).
788
+
789
+ close_source(true, Src, In) :-
790
+ catch(prolog:xref_close_source(Src, In), _, false),
791
+ !,
792
+ '$pop_input_context'.
793
+ close_source(_, _Src, In) :-
794
+ close(In, [force(true)]),
795
+ '$pop_input_context'.
796
+
797
+ restore_source_context(In, Hooked, Src) :-
798
+ ( at_end_of_stream(In)
799
+ -> true
800
+ ; ignore(catch(expand(end_of_file, _, In, _), _, true))
801
+ ),
802
+ pop_operators,
803
+ retractall(mode(In, _)),
804
+ ( retract(open_source(In, state(Hooked, Src, LexState, SM)))
805
+ -> '$restore_lex_state'(LexState),
806
+ '$set_source_module'(SM)
807
+ ; assertion(fail)
808
+ ).
809
+
810
+ %! prolog:xref_close_source(+SourceID, +Stream) is semidet.
811
+ %
812
+ % Called by prolog_close_source/1 to close a source previously
813
+ % opened by the hook prolog:xref_open_source/2. If the hook fails
814
+ % close/2 using the option force(true) is used.
815
+
816
+ %! prolog_canonical_source(+SourceSpec:ground, -Id:atomic) is semidet.
817
+ %
818
+ % Given a user-specification of a source, generate a unique and
819
+ % indexable identifier for it. For files we use the
820
+ % prolog_canonical absolute filename. Id must be valid input for
821
+ % prolog_open_source/2.
822
+
823
+ prolog_canonical_source(Source, Src) :-
824
+ var(Source),
825
+ !,
826
+ Src = Source.
827
+ prolog_canonical_source(User, user) :-
828
+ User == user,
829
+ !.
830
+ prolog_canonical_source(Src, Id) :- % Call hook
831
+ prolog:xref_source_identifier(Src, Id),
832
+ !.
833
+ prolog_canonical_source(Source, Src) :-
834
+ source_file(Source),
835
+ !,
836
+ Src = Source.
837
+ prolog_canonical_source(Source, Src) :-
838
+ absolute_file_name(Source, Src,
839
+ [ file_type(prolog),
840
+ access(read),
841
+ file_errors(fail)
842
+ ]),
843
+ !.
844
+
845
+
846
+ %! file_name_on_path(+File:atom, -OnPath) is det.
847
+ %
848
+ % True if OnPath a description of File based on the file search
849
+ % path. This performs the inverse of absolute_file_name/3.
850
+
851
+ file_name_on_path(Path, ShortId) :-
852
+ ( file_alias_path(Alias, Dir),
853
+ atom_concat(Dir, Local, Path)
854
+ -> ( Alias == '.'
855
+ -> ShortId = Local
856
+ ; file_name_extension(Base, pl, Local)
857
+ -> ShortId =.. [Alias, Base]
858
+ ; ShortId =.. [Alias, Local]
859
+ )
860
+ ; ShortId = Path
861
+ ).
862
+
863
+
864
+ %! file_alias_path(-Alias, ?Dir) is nondet.
865
+ %
866
+ % True if file Alias points to Dir. Multiple solutions are
867
+ % generated with the longest directory first.
868
+
869
+ :- dynamic
870
+ alias_cache/2.
871
+
872
+ file_alias_path(Alias, Dir) :-
873
+ ( alias_cache(_, _)
874
+ -> true
875
+ ; build_alias_cache
876
+ ),
877
+ ( nonvar(Dir)
878
+ -> ensure_slash(Dir, DirSlash),
879
+ alias_cache(Alias, DirSlash)
880
+ ; alias_cache(Alias, Dir)
881
+ ).
882
+
883
+ build_alias_cache :-
884
+ findall(t(DirLen, AliasLen, Alias, Dir),
885
+ search_path(Alias, Dir, AliasLen, DirLen), Ts),
886
+ sort(0, >, Ts, List),
887
+ forall(member(t(_, _, Alias, Dir), List),
888
+ assert(alias_cache(Alias, Dir))).
889
+
890
+ search_path('.', Here, 999, DirLen) :-
891
+ working_directory(Here0, Here0),
892
+ ensure_slash(Here0, Here),
893
+ atom_length(Here, DirLen).
894
+ search_path(Alias, Dir, AliasLen, DirLen) :-
895
+ user:file_search_path(Alias, _),
896
+ Alias \== autoload, % TBD: Multifile predicate?
897
+ Alias \== noautoload,
898
+ Spec =.. [Alias,'.'],
899
+ atom_length(Alias, AliasLen0),
900
+ AliasLen is 1000 - AliasLen0, % must do reverse sort
901
+ absolute_file_name(Spec, Dir0,
902
+ [ file_type(directory),
903
+ access(read),
904
+ solutions(all),
905
+ file_errors(fail)
906
+ ]),
907
+ ensure_slash(Dir0, Dir),
908
+ atom_length(Dir, DirLen).
909
+
910
+ ensure_slash(Dir, Dir) :-
911
+ sub_atom(Dir, _, _, 0, /),
912
+ !.
913
+ ensure_slash(Dir0, Dir) :-
914
+ atom_concat(Dir0, /, Dir).
915
+
916
+
917
+ %! path_segments_atom(+Segments, -Atom) is det.
918
+ %! path_segments_atom(-Segments, +Atom) is det.
919
+ %
920
+ % Translate between a path represented as a/b/c and an atom
921
+ % representing the same path. For example:
922
+ %
923
+ % ==
924
+ % ?- path_segments_atom(a/b/c, X).
925
+ % X = 'a/b/c'.
926
+ % ?- path_segments_atom(S, 'a/b/c'), display(S).
927
+ % /(/(a,b),c)
928
+ % S = a/b/c.
929
+ % ==
930
+ %
931
+ % This predicate is part of the Prolog source library because
932
+ % SWI-Prolog allows writing paths as /-nested terms and
933
+ % source-code analysis programs often need this.
934
+
935
+ path_segments_atom(Segments, Atom) :-
936
+ var(Atom),
937
+ !,
938
+ ( atomic(Segments)
939
+ -> Atom = Segments
940
+ ; segments_to_list(Segments, List, [])
941
+ -> atomic_list_concat(List, /, Atom)
942
+ ; throw(error(type_error(file_path, Segments), _))
943
+ ).
944
+ path_segments_atom(Segments, Atom) :-
945
+ atomic_list_concat(List, /, Atom),
946
+ parts_to_path(List, Segments).
947
+
948
+ segments_to_list(Var, _, _) :-
949
+ var(Var), !, fail.
950
+ segments_to_list(A/B, H, T) :-
951
+ segments_to_list(A, H, T0),
952
+ segments_to_list(B, T0, T).
953
+ segments_to_list(A, [A|T], T) :-
954
+ atomic(A).
955
+
956
+ parts_to_path([One], One) :- !.
957
+ parts_to_path(List, More/T) :-
958
+ ( append(H, [T], List)
959
+ -> parts_to_path(H, More)
960
+ ).
961
+
962
+ %! directory_source_files(+Dir, -Files, +Options) is det.
963
+ %
964
+ % True when Files is a sorted list of Prolog source files in Dir.
965
+ % Options:
966
+ %
967
+ % * recursive(boolean)
968
+ % If =true= (default =false=), recurse into subdirectories
969
+ % * if(Condition)
970
+ % If =true= (default =loaded=), only report loaded files.
971
+ %
972
+ % Other options are passed to absolute_file_name/3, unless
973
+ % loaded(true) is passed.
974
+
975
+ directory_source_files(Dir, SrcFiles, Options) :-
976
+ option(if(loaded), Options, loaded),
977
+ !,
978
+ absolute_file_name(Dir, AbsDir, [file_type(directory), access(read)]),
979
+ ( option(recursive(true), Options)
980
+ -> ensure_slash(AbsDir, Prefix),
981
+ findall(F, ( source_file(F),
982
+ sub_atom(F, 0, _, _, Prefix)
983
+ ),
984
+ SrcFiles)
985
+ ; findall(F, ( source_file(F),
986
+ file_directory_name(F, AbsDir)
987
+ ),
988
+ SrcFiles)
989
+ ).
990
+ directory_source_files(Dir, SrcFiles, Options) :-
991
+ absolute_file_name(Dir, AbsDir, [file_type(directory), access(read)]),
992
+ directory_files(AbsDir, Files),
993
+ phrase(src_files(Files, AbsDir, Options), SrcFiles).
994
+
995
+ src_files([], _, _) -->
996
+ [].
997
+ src_files([H|T], Dir, Options) -->
998
+ { file_name_extension(_, Ext, H),
999
+ user:prolog_file_type(Ext, prolog),
1000
+ \+ user:prolog_file_type(Ext, qlf),
1001
+ dir_file_path(Dir, H, File0),
1002
+ absolute_file_name(File0, File,
1003
+ [ file_errors(fail)
1004
+ | Options
1005
+ ])
1006
+ },
1007
+ !,
1008
+ [File],
1009
+ src_files(T, Dir, Options).
1010
+ src_files([H|T], Dir, Options) -->
1011
+ { \+ special(H),
1012
+ option(recursive(true), Options),
1013
+ dir_file_path(Dir, H, SubDir),
1014
+ exists_directory(SubDir),
1015
+ !,
1016
+ catch(directory_files(SubDir, Files), _, fail)
1017
+ },
1018
+ !,
1019
+ src_files(Files, SubDir, Options),
1020
+ src_files(T, Dir, Options).
1021
+ src_files([_|T], Dir, Options) -->
1022
+ src_files(T, Dir, Options).
1023
+
1024
+ special(.).
1025
+ special(..).
1026
+
1027
+ % avoid dependency on library(filesex), which also pulls a foreign
1028
+ % dependency.
1029
+ dir_file_path(Dir, File, Path) :-
1030
+ ( sub_atom(Dir, _, _, 0, /)
1031
+ -> atom_concat(Dir, File, Path)
1032
+ ; atom_concat(Dir, /, TheDir),
1033
+ atom_concat(TheDir, File, Path)
1034
+ ).
1035
+
1036
+
1037
+ %! valid_term_position(@Term, @TermPos) is semidet.
1038
+ %
1039
+ % Check that a Term has an appropriate TermPos layout. An incorrect
1040
+ % TermPos results in either failure of this predicate or an error.
1041
+ %
1042
+ % If a position in TermPos is a variable, the validation of the
1043
+ % corresponding part of Term succeeds. This matches the
1044
+ % term_expansion/4 treats "unknown" layout information. If part of a
1045
+ % TermPos is given, then all its "from" and "to" information must be
1046
+ % specified; for example, string_position(X,Y) is an error but
1047
+ % string_position(0,5) succeeds. The position values are checked for
1048
+ % being plausible -- e.g., string_position(5,0) will fail.
1049
+ %
1050
+ % This should always succeed:
1051
+ %
1052
+ % read_term(Term, [subterm_positions(TermPos)]),
1053
+ % valid_term_position(Term, TermPos)
1054
+ %
1055
+ % @arg Term Any Prolog term including a variable).
1056
+ % @arg TermPos The detailed layout of the term, for example
1057
+ % from using =|read_term(Term, subterm_positions(TermPos)|=.
1058
+ %
1059
+ % @error existence_error(matching_rule, Subterm) if a subterm of Term
1060
+ % is inconsistent with the corresponding part of TermPos.
1061
+ %
1062
+ % @see read_term/2, read_term/3, term_string/3
1063
+ % @see expand_term/4, term_expansion/4, expand_goal/4, expand_term/4
1064
+ % @see clause_info/4, clause_info/5
1065
+ % @see prolog_clause:unify_clause_hook/5
1066
+
1067
+ valid_term_position(Term, TermPos) :-
1068
+ valid_term_position(0, 0x7fffffffffffffff, Term, TermPos).
1069
+
1070
+ valid_term_position(OuterFrom, OuterTo, _Term, TermPos),
1071
+ var(TermPos),
1072
+ OuterFrom =< OuterTo => true.
1073
+ valid_term_position(OuterFrom, OuterTo, Var, From-To),
1074
+ var(Var),
1075
+ valid_term_position_from_to(OuterFrom, OuterTo, From, To) => true.
1076
+ valid_term_position(OuterFrom, OuterTo, Atom, From-To),
1077
+ atom(Atom),
1078
+ valid_term_position_from_to(OuterFrom, OuterTo, From, To) => true.
1079
+ valid_term_position(OuterFrom, OuterTo, Number, From-To),
1080
+ number(Number),
1081
+ valid_term_position_from_to(OuterFrom, OuterTo, From, To) => true.
1082
+ valid_term_position(OuterFrom, OuterTo, [], From-To),
1083
+ valid_term_position_from_to(OuterFrom, OuterTo, From, To) => true.
1084
+ valid_term_position(OuterFrom, OuterTo, String, string_position(From,To)),
1085
+ ( string(String)
1086
+ -> true
1087
+ ; is_of_type(codes, String)
1088
+ -> true
1089
+ ; is_of_type(chars, String)
1090
+ -> true
1091
+ ; atom(String)
1092
+ ),
1093
+ valid_term_position_from_to(OuterFrom, OuterTo, From, To) => true.
1094
+ valid_term_position(OuterFrom, OuterTo, {Arg},
1095
+ brace_term_position(From,To,ArgPos)),
1096
+ valid_term_position_from_to(OuterFrom, OuterTo, From, To) =>
1097
+ valid_term_position(From, To, Arg, ArgPos).
1098
+ valid_term_position(OuterFrom, OuterTo, [Hd|Tl],
1099
+ list_position(From,To,ElemsPos,none)),
1100
+ valid_term_position_from_to(OuterFrom, OuterTo, From, To) =>
1101
+ term_position_list_tail([Hd|Tl], _HdPart, []),
1102
+ maplist(valid_term_position, [Hd|Tl], ElemsPos).
1103
+ valid_term_position(OuterFrom, OuterTo, [Hd|Tl],
1104
+ list_position(From, To, ElemsPos, TailPos)),
1105
+ valid_term_position_from_to(OuterFrom, OuterTo, From, To) =>
1106
+ term_position_list_tail([Hd|Tl], HdPart, Tail),
1107
+ maplist(valid_term_position(From,To), HdPart, ElemsPos),
1108
+ valid_term_position(Tail, TailPos).
1109
+ valid_term_position(OuterFrom, OuterTo, Term,
1110
+ term_position(From,To, FFrom,FTo,SubPos)),
1111
+ valid_term_position_from_to(OuterFrom, OuterTo, From, To) =>
1112
+ compound_name_arguments(Term, Name, Arguments),
1113
+ valid_term_position(Name, FFrom-FTo),
1114
+ maplist(valid_term_position(From,To), Arguments, SubPos).
1115
+ valid_term_position(OuterFrom, OuterTo, Dict,
1116
+ dict_position(From,To,TagFrom,TagTo,KeyValuePosList)),
1117
+ valid_term_position_from_to(OuterFrom, OuterTo, From, To) =>
1118
+ dict_pairs(Dict, Tag, Pairs),
1119
+ valid_term_position(Tag, TagFrom-TagTo),
1120
+ foldl(valid_term_position_dict(From,To), Pairs, KeyValuePosList, []).
1121
+ % key_value_position(From, To, SepFrom, SepTo, Key, KeyPos, ValuePos)
1122
+ % is handled in valid_term_position_dict.
1123
+ valid_term_position(OuterFrom, OuterTo, Term,
1124
+ parentheses_term_position(From,To,ContentPos)),
1125
+ valid_term_position_from_to(OuterFrom, OuterTo, From, To) =>
1126
+ valid_term_position(From, To, Term, ContentPos).
1127
+ valid_term_position(OuterFrom, OuterTo, _Term,
1128
+ quasi_quotation_position(From,To,
1129
+ SyntaxTerm,SyntaxPos,_ContentPos)),
1130
+ valid_term_position_from_to(OuterFrom, OuterTo, From, To) =>
1131
+ valid_term_position(From, To, SyntaxTerm, SyntaxPos).
1132
+
1133
+ valid_term_position_from_to(OuterFrom, OuterTo, From, To) :-
1134
+ integer(OuterFrom),
1135
+ integer(OuterTo),
1136
+ integer(From),
1137
+ integer(To),
1138
+ OuterFrom =< OuterTo,
1139
+ From =< To,
1140
+ OuterFrom =< From,
1141
+ To =< OuterTo.
1142
+
1143
+ :- det(valid_term_position_dict/5).
1144
+ valid_term_position_dict(OuterFrom, OuterTo, Key-Value,
1145
+ KeyValuePosList0, KeyValuePosList1) :-
1146
+ selectchk(key_value_position(From,To,SepFrom,SepTo,Key,KeyPos,ValuePos),
1147
+ KeyValuePosList0, KeyValuePosList1),
1148
+ valid_term_position_from_to(OuterFrom, OuterTo, From, To),
1149
+ valid_term_position_from_to(OuterFrom, OuterTo, SepFrom, SepTo),
1150
+ SepFrom >= OuterFrom,
1151
+ valid_term_position(From, SepFrom, Key, KeyPos),
1152
+ valid_term_position(SepTo, To, Value, ValuePos).
1153
+
1154
+ %! term_position_list_tail(@List, -HdPart, -Tail) is det.
1155
+ %
1156
+ % Similar to append(HdPart, [Tail], List) for proper lists, but also
1157
+ % works for inproper lists, in which case it unifies Tail with the
1158
+ % tail of the partial list. HdPart is always a proper list:
1159
+ %
1160
+ % ```
1161
+ % ?- prolog_source:term_position_list_tail([a,b,c], Hd, Tl).
1162
+ % Hd = [a, b, c],
1163
+ % Tl = [].
1164
+ % ?- prolog_source:term_position_list_tail([a,b|X], Hd, Tl).
1165
+ % X = Tl,
1166
+ % Hd = [a, b].
1167
+ % ```
1168
+
1169
+ :- det(term_position_list_tail/3).
1170
+ term_position_list_tail([X|Xs], HdPart, Tail) =>
1171
+ HdPart = [X|HdPart2],
1172
+ term_position_list_tail(Xs, HdPart2, Tail).
1173
+ term_position_list_tail(Tail0, HdPart, Tail) =>
1174
+ HdPart = [],
1175
+ Tail0 = Tail.
1176
+
1177
+
1178
+ /*******************************
1179
+ * MESSAGES *
1180
+ *******************************/
1181
+
1182
+ :- multifile
1183
+ prolog:message//1.
1184
+
1185
+ prolog:message(quasi_quotation(undeclared, Syntax)) -->
1186
+ [ 'Undeclared quasi quotation syntax: ~w'-[Syntax], nl,
1187
+ 'Autoloading can be defined using prolog:quasi_quotation_syntax/2'
1188
+ ].