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,794 @@
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) 2004-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_stack,
38
+ [ get_prolog_backtrace/2, % +MaxDepth, -Stack
39
+ get_prolog_backtrace/3, % +MaxDepth, -Stack, +Options
40
+ prolog_stack_frame_property/2, % +Frame, ?Property
41
+ print_prolog_backtrace/2, % +Stream, +Stack
42
+ print_prolog_backtrace/3, % +Stream, +Stack, +Options
43
+ backtrace/1, % +MaxDepth
44
+ print_last_choicepoint/0,
45
+ print_last_choicepoint/2 % +Choice, +Options
46
+ ]).
47
+ :- use_module(library(debug),[debug/3]).
48
+ :- autoload(library(error),[must_be/2]).
49
+ :- autoload(library(lists),[nth1/3,append/3]).
50
+ :- autoload(library(option),[option/2,option/3,merge_options/3]).
51
+ :- autoload(library(prolog_clause),
52
+ [clause_name/2,predicate_name/2,clause_info/4]).
53
+
54
+
55
+ :- dynamic stack_guard/1.
56
+ :- multifile stack_guard/1.
57
+
58
+ :- predicate_options(print_prolog_backtrace/3, 3,
59
+ [ subgoal_positions(boolean),
60
+ show_file(oneof([absolute, basename]))
61
+ ]).
62
+
63
+ /** <module> Examine the Prolog stack
64
+
65
+ This module defines high-level primitives for examining the Prolog
66
+ stack, primarily intended to support debugging. It provides the
67
+ following functionality:
68
+
69
+ * get_prolog_backtrace/2 gets a Prolog representation of the
70
+ Prolog stack. This can be used for printing, but also to enrich
71
+ exceptions using prolog:prolog_exception_hook/5. Decorating exceptions
72
+ is provided by this library and controlled by the hook
73
+ stack_guard/1.
74
+
75
+ * print_prolog_backtrace/2 prints a backtrace as returned by
76
+ get_prolog_backtrace/2
77
+
78
+ * The shorthand backtrace/1 fetches and prints a backtrace.
79
+
80
+ This library may be enabled by default to improve interactive debugging,
81
+ for example by adding the lines below to your ``<config>/init.pl`` to
82
+ decorate uncaught exceptions:
83
+
84
+ ==
85
+ :- use_module(library(prolog_stack)).
86
+ ==
87
+
88
+ @bug Use of this library may negatively impact performance of
89
+ applications that process (error-)exceptions frequently
90
+ as part of their normal processing.
91
+ */
92
+
93
+ :- create_prolog_flag(backtrace, true, [type(boolean), keep(true)]).
94
+ :- create_prolog_flag(backtrace_depth, 20, [type(integer), keep(true)]).
95
+ :- create_prolog_flag(backtrace_goal_depth, 3, [type(integer), keep(true)]).
96
+ :- create_prolog_flag(backtrace_show_lines, true, [type(boolean), keep(true)]).
97
+
98
+ %! get_prolog_backtrace(+MaxDepth, -Backtrace) is det.
99
+ %! get_prolog_backtrace(+MaxDepth, -Backtrace, +Options) is det.
100
+ %
101
+ % Obtain a backtrace from the current location. The backtrace is a
102
+ % list of frames. Each frame is an opaque term that can be
103
+ % inspected using the predicate prolog_stack_frame_property/2 can
104
+ % be used to extract information from these frames. Most use
105
+ % scenarios will pass the stack to print_prolog_backtrace/2. The
106
+ % following options are provided:
107
+ %
108
+ % * frame(+Frame)
109
+ % Start at Frame instead of the current frame.
110
+ % * goal_term_depth(+Depth)
111
+ % If Depth > 0, include a shallow copy of the goal arguments
112
+ % into the stack. Default is set by the Prolog flag
113
+ % `backtrace_goal_depth`, set to `3` initially, showing the
114
+ % goal and toplevel of any argument.
115
+ % * guard(+Guard)
116
+ % Do not show stack frames above Guard. See stack_guard/1.
117
+ % * clause_references(+Bool)
118
+ % Report locations as `Clause+PC` or as a location term that
119
+ % does not use clause references, allowing the exception to
120
+ % be printed safely in a different context.
121
+ %
122
+ % @param Frame is the frame to start from. See prolog_current_frame/1.
123
+ % @param MaxDepth defines the maximum number of frames returned.
124
+ % @compat get_prolog_backtrace/3 used to have the parameters
125
+ % +Frame, +MaxDepth, -Backtrace. A call that matches this
126
+ % signature is mapped to get_prolog_backtrace(MaxDepth, Backtrace,
127
+ % [frame(Frame)]).
128
+
129
+ get_prolog_backtrace(MaxDepth, Stack) :-
130
+ get_prolog_backtrace(MaxDepth, Stack, []).
131
+
132
+ get_prolog_backtrace(Fr, MaxDepth, Stack) :-
133
+ integer(Fr), integer(MaxDepth), var(Stack),
134
+ !,
135
+ get_prolog_backtrace_lc(MaxDepth, Stack, [frame(Fr)]),
136
+ nlc.
137
+ get_prolog_backtrace(MaxDepth, Stack, Options) :-
138
+ get_prolog_backtrace_lc(MaxDepth, Stack, Options),
139
+ nlc. % avoid last-call-optimization, such that
140
+ % the top of the stack is always a nice Prolog
141
+ % frame
142
+
143
+ nlc.
144
+
145
+ get_prolog_backtrace_lc(MaxDepth, Stack, Options) :-
146
+ ( option(frame(Fr), Options)
147
+ -> PC = call
148
+ ; prolog_current_frame(Fr0),
149
+ prolog_frame_attribute(Fr0, pc, PC),
150
+ prolog_frame_attribute(Fr0, parent, Fr)
151
+ ),
152
+ ( option(goal_term_depth(GoalDepth), Options)
153
+ -> true
154
+ ; current_prolog_flag(backtrace_goal_depth, GoalDepth)
155
+ ),
156
+ option(guard(Guard), Options, none),
157
+ ( def_no_clause_refs(Guard)
158
+ -> DefClauseRefs = false
159
+ ; DefClauseRefs = true
160
+ ),
161
+ option(clause_references(ClauseRefs), Options, DefClauseRefs),
162
+ must_be(nonneg, GoalDepth),
163
+ backtrace(MaxDepth, Fr, PC, GoalDepth, Guard, ClauseRefs, Stack, Options).
164
+
165
+ def_no_clause_refs(system:catch_with_backtrace/3).
166
+
167
+ backtrace(0, _, _, _, _, _, [], _) :- !.
168
+ backtrace(MaxDepth, Fr, PC, GoalDepth, Guard, ClauseRefs,
169
+ [frame(Level, Where, Goal)|Stack], Options) :-
170
+ prolog_frame_attribute(Fr, level, Level),
171
+ ( PC == foreign
172
+ -> prolog_frame_attribute(Fr, predicate_indicator, Pred),
173
+ Where = foreign(Pred)
174
+ ; PC == call
175
+ -> prolog_frame_attribute(Fr, predicate_indicator, Pred),
176
+ Where = call(Pred)
177
+ ; prolog_frame_attribute(Fr, clause, Clause)
178
+ -> clause_where(ClauseRefs, Clause, PC, Where, Options)
179
+ ; Where = meta_call
180
+ ),
181
+ ( Where == meta_call
182
+ -> Goal = 0
183
+ ; copy_goal(GoalDepth, Fr, Goal)
184
+ ),
185
+ ( prolog_frame_attribute(Fr, pc, PC2)
186
+ -> true
187
+ ; PC2 = foreign
188
+ ),
189
+ ( prolog_frame_attribute(Fr, parent, Parent),
190
+ prolog_frame_attribute(Parent, predicate_indicator, PI),
191
+ PI == Guard % last frame
192
+ -> backtrace(1, Parent, PC2, GoalDepth, Guard, ClauseRefs, Stack, Options)
193
+ ; prolog_frame_attribute(Fr, parent, Parent),
194
+ more_stack(Parent)
195
+ -> D2 is MaxDepth - 1,
196
+ backtrace(D2, Parent, PC2, GoalDepth, Guard, ClauseRefs, Stack, Options)
197
+ ; Stack = []
198
+ ).
199
+
200
+ more_stack(Parent) :-
201
+ prolog_frame_attribute(Parent, predicate_indicator, PI),
202
+ \+ ( PI = ('$toplevel':G),
203
+ G \== (toplevel_call/1)
204
+ ),
205
+ !.
206
+ more_stack(_) :-
207
+ current_prolog_flag(break_level, Break),
208
+ Break >= 1.
209
+
210
+ %! clause_where(+UseClauseRef, +Clause, +PC, -Where, +Options) is det.
211
+ %
212
+ % Get a description of the frame source location from Clause and the
213
+ % PC inside clause. If UseClauseRef is `true`, this is the a term
214
+ % clause(Clause,PC), providing all abvailable information to the
215
+ % caller at low time overhead. If however the exception need to be
216
+ % printed in an environment where the clause references may differ,
217
+ % for example because the program is not loaded, it is printed in a
218
+ % different thread and contains references to dynamic predicates, etc,
219
+ % it is better to use the information inside the clause here.
220
+
221
+ clause_where(true, Clause, PC, clause(Clause, PC), _).
222
+ clause_where(false, Clause, PC, pred_line(PredName, File:Line), Options) :-
223
+ option(subgoal_positions(true), Options, true),
224
+ subgoal_position(Clause, PC, File, CharA, _CharZ),
225
+ File \= @(_), % XPCE Object reference
226
+ lineno(File, CharA, Line),
227
+ clause_predicate_name(Clause, PredName),
228
+ !.
229
+ clause_where(false, Clause, _PC, pred_line(PredName, File:Line), _Options) :-
230
+ clause_property(Clause, file(File)),
231
+ clause_property(Clause, line_count(Line)),
232
+ clause_predicate_name(Clause, PredName),
233
+ !.
234
+ clause_where(false, Clause, _PC, clause_name(ClauseName), _Options) :-
235
+ clause_name(Clause, ClauseName).
236
+
237
+ %! copy_goal(+TermDepth, +Frame, -Goal) is det.
238
+ %
239
+ % Create a shallow copy of the frame's goal to help debugging. In
240
+ % addition to shallow copying, high-arity terms are represented
241
+ % as below. Currently the 16 first arguments are hardcoded.
242
+ %
243
+ % ==
244
+ % name(A1, ..., A16, <skipped Skipped of Arity>, An)
245
+ % ==
246
+
247
+ copy_goal(0, _, 0) :- !. % 0 is not a valid goal
248
+ copy_goal(D, Fr, Goal) :-
249
+ prolog_frame_attribute(Fr, goal, Goal0),
250
+ ( Goal0 = Module:Goal1
251
+ -> copy_term_limit(D, Goal1, Goal2),
252
+ ( hidden_module(Module)
253
+ -> Goal = Goal2
254
+ ; Goal = Module:Goal2
255
+ )
256
+ ; copy_term_limit(D, Goal0, Goal)
257
+ ).
258
+
259
+ hidden_module(system).
260
+ hidden_module(user).
261
+
262
+ copy_term_limit(0, In, '...') :-
263
+ compound(In),
264
+ !.
265
+ copy_term_limit(N, In, Out) :-
266
+ is_dict(In),
267
+ !,
268
+ dict_pairs(In, Tag, PairsIn),
269
+ N2 is N - 1,
270
+ MaxArity = 16,
271
+ copy_pairs(PairsIn, N2, MaxArity, PairsOut),
272
+ dict_pairs(Out, Tag, PairsOut).
273
+ copy_term_limit(N, In, Out) :-
274
+ compound(In),
275
+ !,
276
+ compound_name_arity(In, Functor, Arity),
277
+ N2 is N - 1,
278
+ MaxArity = 16,
279
+ ( Arity =< MaxArity
280
+ -> compound_name_arity(Out, Functor, Arity),
281
+ copy_term_args(0, Arity, N2, In, Out)
282
+ ; OutArity is MaxArity+2,
283
+ compound_name_arity(Out, Functor, OutArity),
284
+ copy_term_args(0, MaxArity, N2, In, Out),
285
+ SkipArg is MaxArity+1,
286
+ Skipped is Arity - MaxArity - 1,
287
+ format(atom(Msg), '<skipped ~D of ~D>', [Skipped, Arity]),
288
+ arg(SkipArg, Out, Msg),
289
+ arg(Arity, In, InA),
290
+ arg(OutArity, Out, OutA),
291
+ copy_term_limit(N2, InA, OutA)
292
+ ).
293
+ copy_term_limit(_, In, Out) :-
294
+ copy_term_nat(In, Out).
295
+
296
+ copy_term_args(I, Arity, Depth, In, Out) :-
297
+ I < Arity,
298
+ !,
299
+ I2 is I + 1,
300
+ arg(I2, In, InA),
301
+ arg(I2, Out, OutA),
302
+ copy_term_limit(Depth, InA, OutA),
303
+ copy_term_args(I2, Arity, Depth, In, Out).
304
+ copy_term_args(_, _, _, _, _).
305
+
306
+ copy_pairs([], _, _, []) :- !.
307
+ copy_pairs(Pairs, _, 0, ['<skipped>'-Skipped]) :-
308
+ !,
309
+ length(Pairs, Skipped).
310
+ copy_pairs([K-V0|T0], N, MaxArity, [K-V|T]) :-
311
+ copy_term_limit(N, V0, V),
312
+ MaxArity1 is MaxArity - 1,
313
+ copy_pairs(T0, N, MaxArity1, T).
314
+
315
+
316
+ %! prolog_stack_frame_property(+Frame, ?Property) is nondet.
317
+ %
318
+ % True when Property is a property of Frame. Frame is an element
319
+ % of a stack-trace as produced by get_prolog_backtrace/2. Defined
320
+ % properties are:
321
+ %
322
+ % - level(Level)
323
+ % - predicate(PI)
324
+ % - goal(Term)
325
+ % - location(File:Line)
326
+ % This property is only available if Frame executes a Prolog
327
+ % clause, the program counter is known and the clause layout
328
+ % can be retrieved.
329
+
330
+ prolog_stack_frame_property(frame(Level,_,_), level(Level)).
331
+ prolog_stack_frame_property(frame(_,Where,_), predicate(PI)) :-
332
+ frame_predicate(Where, PI).
333
+ prolog_stack_frame_property(frame(_,clause(Clause,PC),_), location(File:Line)) :-
334
+ subgoal_position(Clause, PC, File, CharA, _CharZ),
335
+ File \= @(_), % XPCE Object reference
336
+ lineno(File, CharA, Line).
337
+ prolog_stack_frame_property(frame(_,_,_,Goal), goal(Goal)) :-
338
+ Goal \== 0.
339
+
340
+
341
+ frame_predicate(foreign(PI), PI).
342
+ frame_predicate(call(PI), PI).
343
+ frame_predicate(clause(Clause, _PC), PI) :-
344
+ clause_property(Clause, predicate(PI)).
345
+
346
+ default_backtrace_options(Options) :-
347
+ ( current_prolog_flag(backtrace_show_lines, true),
348
+ current_prolog_flag(iso, false)
349
+ -> Options = []
350
+ ; Options = [subgoal_positions(false)]
351
+ ).
352
+
353
+ %! print_prolog_backtrace(+Stream, +Backtrace) is det.
354
+ %! print_prolog_backtrace(+Stream, +Backtrace, +Options) is det.
355
+ %
356
+ % Print a stacktrace in human readable form to Stream.
357
+ % Options is an option list that accepts:
358
+ %
359
+ % * subgoal_positions(+Boolean)
360
+ % If `true`. print subgoal line numbers. The default depends
361
+ % on the Prolog flag `backtrace_show_lines`.
362
+ % * show_file(+How)
363
+ % How to display the file name. How is one of `absolute` or
364
+ % `basename`.
365
+ %
366
+ % @arg Backtrace is a list of frame(Depth,Location,Goal) terms.
367
+
368
+ print_prolog_backtrace(Stream, Backtrace) :-
369
+ print_prolog_backtrace(Stream, Backtrace, []).
370
+
371
+ print_prolog_backtrace(Stream, Backtrace, Options) :-
372
+ default_backtrace_options(DefOptions),
373
+ merge_options(Options, DefOptions, FinalOptions),
374
+ phrase(message(Backtrace, FinalOptions), Lines),
375
+ print_message_lines(Stream, '', Lines).
376
+
377
+ :- public % Called from some handlers
378
+ message//1.
379
+
380
+ message(Backtrace) -->
381
+ {default_backtrace_options(Options)},
382
+ message(Backtrace, Options).
383
+
384
+ message(Backtrace, Options) -->
385
+ message_frames(Backtrace, Options),
386
+ warn_nodebug(Backtrace).
387
+
388
+ message_frames([], _) -->
389
+ [].
390
+ message_frames([H|T], Options) -->
391
+ message_frames(H, Options),
392
+ ( {T == []}
393
+ -> []
394
+ ; [nl],
395
+ message_frames(T, Options)
396
+ ).
397
+
398
+ message_frames(frame(Level, Where, 0), Options) -->
399
+ !,
400
+ level(Level),
401
+ where_no_goal(Where, Options).
402
+ message_frames(frame(Level, _Where, '$toplevel':toplevel_call(_)), _) -->
403
+ !,
404
+ level(Level),
405
+ [ '<user>'-[] ].
406
+ message_frames(frame(Level, Where, Goal), Options) -->
407
+ level(Level),
408
+ [ ansi(code, '~p', [Goal]) ],
409
+ where_goal(Where, Options).
410
+
411
+ where_no_goal(foreign(PI), _) -->
412
+ [ '~w <foreign>'-[PI] ].
413
+ where_no_goal(call(PI), _) -->
414
+ [ '~w'-[PI] ].
415
+ where_no_goal(pred_line(PredName, File:Line), Options) -->
416
+ !,
417
+ [ '~w at '-[PredName] ], file_line(File:Line, Options).
418
+ where_no_goal(clause_name(ClauseName), _) -->
419
+ !,
420
+ [ '~w <no source>'-[ClauseName] ].
421
+ where_no_goal(clause(Clause, PC), Options) -->
422
+ { nonvar(Clause),
423
+ !,
424
+ clause_where(false, Clause, PC, Where, Options)
425
+ },
426
+ where_no_goal(Where, Options).
427
+ where_no_goal(meta_call, _) -->
428
+ [ '<meta call>' ].
429
+
430
+ where_goal(foreign(_), _) -->
431
+ [ ' <foreign>'-[] ],
432
+ !.
433
+ where_goal(pred_line(_PredName, File:Line), Options) -->
434
+ !,
435
+ [ ' at ' ], file_line(File:Line, Options).
436
+ where_goal(clause_name(ClauseName), _) -->
437
+ !,
438
+ [ '~w <no source>'-[ClauseName] ].
439
+ where_goal(clause(Clause, PC), Options) -->
440
+ { nonvar(Clause),
441
+ !,
442
+ clause_where(false, Clause, PC, Where, Options)
443
+ },
444
+ where_goal(Where, Options).
445
+ where_goal(clause(Clause, _PC), _) -->
446
+ { clause_property(Clause, file(File)),
447
+ clause_property(Clause, line_count(Line))
448
+ },
449
+ !,
450
+ [ ' at ', url(File:Line) ].
451
+ where_goal(clause(Clause, _PC), _) -->
452
+ { clause_name(Clause, ClauseName)
453
+ },
454
+ !,
455
+ [ ' ~w <no source>'-[ClauseName] ].
456
+ where_goal(_, _) -->
457
+ [].
458
+
459
+ level(Level) -->
460
+ [ ansi(bold, '~|~t[~D]~6+ ', [Level]) ].
461
+
462
+ file_line(File:Line, Options), option(show_files(basename), Options) ==>
463
+ { file_base_name(File, Base),
464
+ format(string(Label), '~w:~d', [Base, Line])
465
+ },
466
+ [ url(File:Line, Label) ].
467
+ file_line(File:Line, _Options) ==>
468
+ [ url(File:Line) ].
469
+
470
+ warn_nodebug(Backtrace) -->
471
+ { contiguous(Backtrace) },
472
+ !.
473
+ warn_nodebug(_Backtrace) -->
474
+ [ nl,nl,
475
+ 'Note: some frames are missing due to last-call optimization.'-[], nl,
476
+ 'Re-run your program in debug mode (:- debug.) to get more detail.'-[]
477
+ ].
478
+
479
+ contiguous([frame(D0,_,_)|Frames]) :-
480
+ contiguous(Frames, D0).
481
+
482
+ contiguous([], _).
483
+ contiguous([frame(D1,_,_)|Frames], D0) :-
484
+ D1 =:= D0-1,
485
+ contiguous(Frames, D1).
486
+
487
+
488
+ %! clause_predicate_name(+ClauseRef, -Predname) is det.
489
+ %
490
+ % Produce a name (typically Functor/Arity) for a predicate to
491
+ % which Clause belongs.
492
+
493
+ :- multifile
494
+ user:prolog_clause_name/2.
495
+
496
+ clause_predicate_name(Clause, PredName) :-
497
+ user:prolog_clause_name(Clause, PredName),
498
+ !.
499
+ clause_predicate_name(Clause, PredName) :-
500
+ nth_clause(Head, _N, Clause),
501
+ !,
502
+ predicate_name(user:Head, PredName).
503
+
504
+
505
+ %! backtrace(+MaxDepth)
506
+ %
507
+ % Get and print a stacktrace to the user_error stream.
508
+
509
+ backtrace(MaxDepth) :-
510
+ get_prolog_backtrace_lc(MaxDepth, Stack, []),
511
+ print_prolog_backtrace(user_error, Stack).
512
+
513
+
514
+ subgoal_position(ClauseRef, PC, File, CharA, CharZ) :-
515
+ debug(backtrace, 'Term-position in ~p at PC=~w:', [ClauseRef, PC]),
516
+ clause_info(ClauseRef, File, TPos, _),
517
+ '$clause_term_position'(ClauseRef, PC, List),
518
+ debug(backtrace, '\t~p~n', [List]),
519
+ find_subgoal(List, TPos, PosTerm),
520
+ compound(PosTerm),
521
+ arg(1, PosTerm, CharA),
522
+ arg(2, PosTerm, CharZ).
523
+
524
+ %! find_subgoal(+PosList, +TermPos, -SubGoalPos).
525
+ %
526
+ % @see Same as find_subgoal/3 in trace.pl from the GUI tracer.
527
+
528
+ find_subgoal(_, Pos, Pos) :-
529
+ var(Pos),
530
+ !.
531
+ find_subgoal([A|T], term_position(_, _, _, _, PosL), SPos) :-
532
+ nth1(A, PosL, Pos),
533
+ !,
534
+ find_subgoal(T, Pos, SPos).
535
+ find_subgoal([1|T], brace_term_position(_,_,Pos), SPos) :-
536
+ !,
537
+ find_subgoal(T, Pos, SPos).
538
+ find_subgoal(List, parentheses_term_position(_,_,Pos), SPos) :-
539
+ !,
540
+ find_subgoal(List, Pos, SPos).
541
+ find_subgoal(_, Pos, Pos).
542
+
543
+
544
+ %! lineno(+File, +Char, -Line)
545
+ %
546
+ % Translate a character location to a line-number. Note that this
547
+ % calls prolog_clause:try_open_source/2, but this is always loaded as
548
+ % we would not have clause info without.
549
+
550
+ lineno(File, Char, Line) :-
551
+ setup_call_cleanup(
552
+ ( prolog_clause:try_open_source(File, Fd),
553
+ set_stream(Fd, newline(detect))
554
+ ),
555
+ lineno_(Fd, Char, Line),
556
+ close(Fd)).
557
+
558
+ lineno_(Fd, Char, L) :-
559
+ stream_property(Fd, position(Pos)),
560
+ stream_position_data(char_count, Pos, C),
561
+ C > Char,
562
+ !,
563
+ stream_position_data(line_count, Pos, L0),
564
+ L is L0-1.
565
+ lineno_(Fd, Char, L) :-
566
+ skip(Fd, 0'\n),
567
+ lineno_(Fd, Char, L).
568
+
569
+
570
+ /*******************************
571
+ * CHOICEPOINTS *
572
+ *******************************/
573
+
574
+ %! print_last_choicepoint is det.
575
+ %
576
+ % Print details on the last open choice point.
577
+
578
+ print_last_choicepoint :-
579
+ prolog_current_choice(ChI0), % Choice in print_last_choicepoint/0
580
+ prolog_choice_attribute(ChI0, parent, ChI1),
581
+ print_last_choicepoint(ChI1, []).
582
+ print_last_choicepoint.
583
+
584
+ %! print_last_choicepoint(+ChoiceRef, +Options) is det.
585
+
586
+ print_last_choicepoint(ChI1, Options) :-
587
+ real_choice(ChI1, ChI),
588
+ prolog_choice_attribute(ChI, frame, F),
589
+ prolog_frame_attribute(F, goal, Goal),
590
+ Goal \= '$execute_goal2'(_,_,_), % Toplevel REPL choicepoint
591
+ !,
592
+ option(message_level(Level), Options, warning),
593
+ get_prolog_backtrace(2, [_|Stack], [frame(F)]),
594
+ ( predicate_property(Goal, foreign)
595
+ -> print_message(Level, choicepoint(foreign(Goal), Stack))
596
+ ; prolog_frame_attribute(F, clause, Clause),
597
+ ( prolog_choice_attribute(ChI, pc, PC)
598
+ -> Ctx = jump(PC)
599
+ ; prolog_choice_attribute(ChI, clause, Next)
600
+ -> Ctx = clause(Next)
601
+ ),
602
+ print_message(Level, choicepoint(clause(Goal, Clause, Ctx), Stack))
603
+ ).
604
+ print_last_choicepoint(_, _).
605
+
606
+ real_choice(Ch0, Ch) :-
607
+ prolog_choice_attribute(Ch0, type, Type),
608
+ dummy_type(Type),
609
+ !,
610
+ prolog_choice_attribute(Ch0, parent, Ch1),
611
+ real_choice(Ch1, Ch).
612
+ real_choice(Ch, Ch).
613
+
614
+ dummy_type(debug).
615
+ dummy_type(none).
616
+
617
+ prolog:message(choicepoint(Choice, Stack)) -->
618
+ choice(Choice),
619
+ [ nl, 'Called from', nl ],
620
+ message(Stack).
621
+
622
+ choice(foreign(Goal)) -->
623
+ success_goal(Goal, 'a foreign choice point').
624
+ choice(clause(Goal, ClauseRef, clause(Next))) -->
625
+ success_goal(Goal, 'a choice point in alternate clause'),
626
+ [ nl ],
627
+ [ ' ' ], clause_descr(ClauseRef), [': clause succeeded', nl],
628
+ [ ' ' ], clause_descr(Next), [': next candidate clause' ].
629
+ choice(clause(Goal, ClauseRef, jump(PC))) -->
630
+ { clause_where(false, ClauseRef, PC, Where,
631
+ [subgoal_positions(true)])
632
+ },
633
+ success_goal(Goal, 'an in-clause choice point'),
634
+ [ nl, ' ' ],
635
+ where_no_goal(Where).
636
+
637
+ success_goal(Goal, Reason) -->
638
+ [ ansi(code, '~p', [Goal]),
639
+ ' left ~w (after success)'-[Reason]
640
+ ].
641
+
642
+ where_no_goal(pred_line(_PredName, File:Line)) -->
643
+ !,
644
+ [ url(File:Line) ].
645
+ where_no_goal(clause_name(ClauseName)) -->
646
+ !,
647
+ [ '~w <no source>'-[ClauseName] ].
648
+
649
+ clause_descr(ClauseRef) -->
650
+ { clause_property(ClauseRef, file(File)),
651
+ clause_property(ClauseRef, line_count(Line))
652
+ },
653
+ !,
654
+ [ url(File:Line) ].
655
+ clause_descr(ClauseRef) -->
656
+ { clause_name(ClauseRef, Name)
657
+ },
658
+ [ '~w'-[Name] ].
659
+
660
+
661
+ /*******************************
662
+ * DECORATE ERRORS *
663
+ *******************************/
664
+
665
+ %! prolog_stack:stack_guard(+PI) is semidet.
666
+ %
667
+ % Dynamic multifile hook that is normally not defined. The hook is
668
+ % called with PI equal to =none= if the exception is not caught
669
+ % and with a fully qualified (e.g., Module:Name/Arity) predicate
670
+ % indicator of the predicate that called catch/3 if the exception
671
+ % is caught.
672
+ %
673
+ % The exception is of the form error(Formal, ImplDef) and this
674
+ % hook succeeds, ImplDef is unified to a term
675
+ % context(prolog_stack(StackData), Message). This context
676
+ % information is used by the message printing system to print a
677
+ % human readable representation of the stack when the exception
678
+ % was raised.
679
+ %
680
+ % For example, using a clause stack_guard(none) prints contexts
681
+ % for uncaught exceptions only. Using a clause stack_guard(_)
682
+ % prints a full stack-trace for any error exception if the
683
+ % exception is given to print_message/2. See also
684
+ % library(http/http_error), which limits printing of exceptions to
685
+ % exceptions in user-code called from the HTTP server library.
686
+ %
687
+ % Details of the exception decoration is controlled by two Prolog
688
+ % flags:
689
+ %
690
+ % * backtrace_depth
691
+ % Integer that controls the maximum number of frames
692
+ % collected. Default is 20. If a guard is specified, callers
693
+ % of the guard are removed from the stack-trace.
694
+ %
695
+ % * backtrace_show_lines
696
+ % Boolean that indicates whether the library tries to find
697
+ % line numbers for the calls. Default is =true=.
698
+
699
+ :- multifile prolog:prolog_exception_hook/5.
700
+ :- dynamic prolog:prolog_exception_hook/5.
701
+
702
+ prolog:prolog_exception_hook(error(E, context(Ctx0,Msg)),
703
+ error(E, context(prolog_stack(Stack),Msg)),
704
+ Fr, GuardSpec, Debug) :-
705
+ current_prolog_flag(backtrace, true),
706
+ \+ is_stack(Ctx0, _Frames),
707
+ ( atom(GuardSpec)
708
+ -> debug(backtrace, 'Got uncaught (guard = ~q) exception ~p (Ctx0=~p)',
709
+ [GuardSpec, E, Ctx0]),
710
+ stack_guard(GuardSpec),
711
+ Guard = GuardSpec
712
+ ; prolog_frame_attribute(GuardSpec, predicate_indicator, Guard),
713
+ debug(backtrace, 'Got exception ~p (Ctx0=~p, Catcher=~p)',
714
+ [E, Ctx0, Guard]),
715
+ stack_guard(Guard)
716
+ -> true
717
+ ; Debug == true,
718
+ stack_guard(debug),
719
+ Guard = none
720
+ ),
721
+ ( current_prolog_flag(backtrace_depth, Depth)
722
+ -> Depth > 0
723
+ ; Depth = 20 % Thread created before lib was loaded
724
+ ),
725
+ get_prolog_backtrace(Depth, Stack0,
726
+ [ frame(Fr),
727
+ guard(Guard)
728
+ ]),
729
+ debug(backtrace, 'Stack = ~p', [Stack0]),
730
+ clean_stack(Stack0, Stack1),
731
+ join_stacks(Ctx0, Stack1, Stack).
732
+
733
+ clean_stack(List, List) :-
734
+ stack_guard(X), var(X),
735
+ !. % Do not stop if we catch all
736
+ clean_stack(List, Clean) :-
737
+ clean_stack2(List, Clean).
738
+
739
+ clean_stack2([], []).
740
+ clean_stack2([H|_], [H]) :-
741
+ guard_frame(H),
742
+ !.
743
+ clean_stack2([H|T0], [H|T]) :-
744
+ clean_stack2(T0, T).
745
+
746
+ guard_frame(frame(_,clause(ClauseRef, _, _))) :-
747
+ nth_clause(M:Head, _, ClauseRef),
748
+ functor(Head, Name, Arity),
749
+ stack_guard(M:Name/Arity).
750
+
751
+ join_stacks(Ctx0, Stack1, Stack) :-
752
+ nonvar(Ctx0),
753
+ Ctx0 = prolog_stack(Stack0),
754
+ is_list(Stack0), !,
755
+ append(Stack0, Stack1, Stack).
756
+ join_stacks(_, Stack, Stack).
757
+
758
+
759
+ %! stack_guard(+Reason) is semidet.
760
+ %
761
+ % Dynamic multifile predicate. It is called with `none`, `'C'` or
762
+ % the predicate indicator of the _guard_, the predicate calling
763
+ % catch/3. The exception must be of _compatible_ with the shape
764
+ % error(Formal, context(Stack, Msg)). The default is to catch
765
+ % `none`, uncaught exceptions. `'C'` implies that the callback
766
+ % from C will handle the exception.
767
+
768
+ stack_guard(none).
769
+ stack_guard(system:catch_with_backtrace/3).
770
+ stack_guard(debug).
771
+
772
+
773
+ /*******************************
774
+ * MESSAGES *
775
+ *******************************/
776
+
777
+ :- multifile
778
+ prolog:message//1.
779
+
780
+ prolog:message(error(Error, context(Stack, Message))) -->
781
+ { Message \== 'DWIM could not correct goal',
782
+ is_stack(Stack, Frames)
783
+ },
784
+ !,
785
+ '$messages':translate_message(error(Error, context(_, Message))),
786
+ [ nl, 'In:', nl ],
787
+ ( {is_list(Frames)}
788
+ -> message(Frames)
789
+ ; ['~w'-[Frames]]
790
+ ).
791
+
792
+ is_stack(Stack, Frames) :-
793
+ nonvar(Stack),
794
+ Stack = prolog_stack(Frames).