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,966 @@
1
+ /* Part of SWI-Prolog
2
+
3
+ Author: Marcus Uneson
4
+ E-mail: marcus.uneson@ling.lu.se
5
+ WWW: http://person.sol.lu.se/MarcusUneson/
6
+ Copyright (c) 2011-2015, Marcus Uneson
7
+ All rights reserved.
8
+
9
+ Redistribution and use in source and binary forms, with or without
10
+ modification, are permitted provided that the following conditions
11
+ are met:
12
+
13
+ 1. Redistributions of source code must retain the above copyright
14
+ notice, this list of conditions and the following disclaimer.
15
+
16
+ 2. Redistributions in binary form must reproduce the above copyright
17
+ notice, this list of conditions and the following disclaimer in
18
+ the documentation and/or other materials provided with the
19
+ distribution.
20
+
21
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
22
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
23
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
24
+ FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
25
+ COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
26
+ INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
27
+ BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
28
+ LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
29
+ CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
30
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
31
+ ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
32
+ POSSIBILITY OF SUCH DAMAGE.
33
+ */
34
+
35
+ :- module(optparse,
36
+ [ opt_parse/5, %+OptsSpec, +CLArgs, -Opts, -PositionalArgs,-ParseOptions
37
+ opt_parse/4, %+OptsSpec, +CLArgs, -Opts, -PositionalArgs,
38
+ opt_arguments/3, %+OptsSpec, -Opts, -PositionalArgs
39
+ opt_help/2 %+OptsSpec, -Help
40
+ ]).
41
+
42
+ :- autoload(library(apply),[maplist/3]).
43
+ :- use_module(library(debug),[assertion/1]).
44
+ :- autoload(library(error),[must_be/2, current_type/3]).
45
+ :- autoload(library(lists),[member/2,max_list/2,reverse/2,append/3]).
46
+ :- autoload(library(option),[merge_options/3,option/3]).
47
+
48
+
49
+ :- set_prolog_flag(double_quotes, codes).
50
+ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% EXPORTS
51
+
52
+ /** <module> command line parsing
53
+
54
+ This module helps in building a command-line interface to an
55
+ application. In particular, it provides functions that take an option
56
+ specification and a list of atoms, probably given to the program on the
57
+ command line, and return a parsed representation (a list of the
58
+ customary Key(Val) by default; or optionally, a list of Func(Key, Val)
59
+ terms in the style of current_prolog_flag/2). It can also synthesize a
60
+ simple help text from the options specification.
61
+
62
+ The terminology in the following is partly borrowed from python, see
63
+ http://docs.python.org/library/optparse.html#terminology . Very briefly,
64
+ _arguments_ is what you provide on the command line and for many prologs
65
+ show up as a list of atoms =|Args|= in =|current_prolog_flag(argv,
66
+ Args)|=. For a typical prolog incantation, they can be divided into
67
+
68
+ * _|runtime arguments|_, which controls the prolog runtime;
69
+ conventionally, they are ended by '--';
70
+ * _options_, which are key-value pairs (with a boolean value
71
+ possibly implicit) intended to control your program in one way
72
+ or another; and
73
+ * _|positional arguments|_, which is what remains after
74
+ all runtime arguments and options have been removed (with
75
+ implicit arguments -- true/false for booleans -- filled in).
76
+
77
+ Positional arguments are in particular used for mandatory arguments
78
+ without which your program won't work and for which there are no
79
+ sensible defaults (e.g,, input file names). Options, by contrast, offer
80
+ flexibility by letting you change a default setting. Options are
81
+ optional not only by etymology: this library has no notion of mandatory
82
+ or required options (see the python docs for other rationales than
83
+ laziness).
84
+
85
+ The command-line arguments enter your program as a list of atoms, but
86
+ the programs perhaps expects booleans, integers, floats or even prolog
87
+ terms. You tell the parser so by providing an _|options specification|_.
88
+ This is just a list of individual option specifications. One of those,
89
+ in turn, is a list of ground prolog terms in the customary Name(Value)
90
+ format. The following terms are recognized (any others raise error).
91
+
92
+ * opt(Key)
93
+ Key is what the option later will be accessed by, just like for
94
+ current_prolog_flag(Key, Value). This term is mandatory (an error is
95
+ thrown if missing).
96
+
97
+ * shortflags(ListOfFlags)
98
+ ListOfFlags denotes any single-dashed, single letter args specifying the
99
+ current option (=|-s , -K|=, etc). Uppercase letters must be quoted.
100
+ Usually ListOfFlags will be a singleton list, but sometimes aliased flags
101
+ may be convenient.
102
+
103
+ * longflags(ListOfFlags)
104
+ ListOfFlags denotes any double-dashed arguments specifying
105
+ the current option (=|--verbose, --no-debug|=, etc). They are
106
+ basically a more readable alternative to short flags, except
107
+
108
+ 1. long flags can be specified as =|--flag value|= or
109
+ =|--flag=value|= (but not as =|--flagvalue|=); short flags as
110
+ =|-f val|= or =|-fval|= (but not =|-f=val|=)
111
+ 2. boolean long flags can be specified as =|--bool-flag|=
112
+ or =|--bool-flag=true|= or =|--bool-flag true|=; and they can be
113
+ negated as =|--no-bool-flag|= or =|--bool-flag=false|= or
114
+ =|--bool-flag false|=.
115
+
116
+ Except that shortflags must be single characters, the
117
+ distinction between long and short is in calling convention, not
118
+ in namespaces. Thus, if you have shortflags([v]), you can use it
119
+ as =|-v2|= or =|-v 2|= or =|--v=2|= or =|--v 2|= (but not
120
+ =|-v=2|= or =|--v2|=).
121
+
122
+ Shortflags and longflags both default to =|[]|=. It can be useful to
123
+ have flagless options -- see example below.
124
+
125
+ * meta(Meta)
126
+ Meta is optional and only relevant for the synthesized usage message
127
+ and is the name (an atom) of the metasyntactic variable (possibly)
128
+ appearing in it together with type and default value (e.g,
129
+ =|x:integer=3|=, =|interest:float=0.11|=). It may be useful to
130
+ have named variables (=|x|=, =|interest|=) in case you wish to
131
+ mention them again in the help text. If not given the =|Meta:|=
132
+ part is suppressed -- see example below.
133
+
134
+ * type(Type)
135
+ Type is one of =|boolean, atom, integer, float, term|=.
136
+ The corresponding argument will be parsed appropriately. This
137
+ term is optional; if not given, defaults to =|term|=.
138
+
139
+ * default(Default)
140
+ Default value. This term is optional; if not given, or if given the
141
+ special value '_', an uninstantiated variable is created (and any
142
+ type declaration is ignored).
143
+
144
+ * help(Help)
145
+ Help is (usually) an atom of text describing the option in the
146
+ help text. This term is optional (but obviously strongly recommended
147
+ for all options which have flags).
148
+
149
+ Long lines are subject to basic word wrapping -- split on white
150
+ space, reindent, rejoin. However, you can get more control by
151
+ supplying the line breaking yourself: rather than a single line of
152
+ text, you can provide a list of lines (as atoms). If you do, they
153
+ will be joined with the appropriate indent but otherwise left
154
+ untouched (see the option =mode= in the example below).
155
+
156
+ Absence of mandatory option specs or the presence of more than one for a
157
+ particular option throws an error, as do unknown or incompatible types.
158
+
159
+ As a concrete example from a fictive application, suppose we want the
160
+ following options to be read from the command line (long flag(s), short
161
+ flag(s), meta:type=default, help)
162
+
163
+ ==
164
+ --mode -m atom=SCAN data gathering mode,
165
+ one of
166
+ SCAN: do this
167
+ READ: do that
168
+ MAKE: make numbers
169
+ WAIT: do nothing
170
+ --rebuild-cache -r boolean=true rebuild cache in
171
+ each iteration
172
+ --heisenberg-threshold -t,-h float=0.1 heisenberg threshold
173
+ --depths, --iters -i,-d K:integer=3 stop after K
174
+ iterations
175
+ --distances term=[1,2,3,5] initial prolog term
176
+ --output-file -o FILE:atom=_ write output to FILE
177
+ --label -l atom=REPORT report label
178
+ --verbosity -v V:integer=2 verbosity level,
179
+ 1 <= V <= 3
180
+ ==
181
+
182
+ We may also have some configuration parameters which we currently think
183
+ not needs to be controlled from the command line, say
184
+ path('/some/file/path').
185
+
186
+ This interface is described by the following options specification
187
+ (order between the specifications of a particular option is irrelevant).
188
+
189
+ ==
190
+ ExampleOptsSpec =
191
+ [ [opt(mode ), type(atom), default('SCAN'),
192
+ shortflags([m]), longflags(['mode'] ),
193
+ help([ 'data gathering mode, one of'
194
+ , ' SCAN: do this'
195
+ , ' READ: do that'
196
+ , ' MAKE: fabricate some numbers'
197
+ , ' WAIT: don''t do anything'])]
198
+
199
+ , [opt(cache), type(boolean), default(true),
200
+ shortflags([r]), longflags(['rebuild-cache']),
201
+ help('rebuild cache in each iteration')]
202
+
203
+ , [opt(threshold), type(float), default(0.1),
204
+ shortflags([t,h]), longflags(['heisenberg-threshold']),
205
+ help('heisenberg threshold')]
206
+
207
+ , [opt(depth), meta('K'), type(integer), default(3),
208
+ shortflags([i,d]),longflags([depths,iters]),
209
+ help('stop after K iterations')]
210
+
211
+ , [opt(distances), default([1,2,3,5]),
212
+ longflags([distances]),
213
+ help('initial prolog term')]
214
+
215
+ , [opt(outfile), meta('FILE'), type(atom),
216
+ shortflags([o]), longflags(['output-file']),
217
+ help('write output to FILE')]
218
+
219
+ , [opt(label), type(atom), default('REPORT'),
220
+ shortflags([l]), longflags([label]),
221
+ help('report label')]
222
+
223
+ , [opt(verbose), meta('V'), type(integer), default(2),
224
+ shortflags([v]), longflags([verbosity]),
225
+ help('verbosity level, 1 <= V <= 3')]
226
+
227
+ , [opt(path), default('/some/file/path/')]
228
+ ].
229
+ ==
230
+
231
+ The help text above was accessed by =|opt_help(ExamplesOptsSpec,
232
+ HelpText)|=. The options appear in the same order as in the OptsSpec.
233
+
234
+ Given =|ExampleOptsSpec|=, a command line (somewhat syntactically
235
+ inconsistent, in order to demonstrate different calling conventions) may
236
+ look as follows
237
+
238
+ ==
239
+ ExampleArgs = [ '-d5'
240
+ , '--heisenberg-threshold', '0.14'
241
+ , '--distances=[1,1,2,3,5,8]'
242
+ , '--iters', '7'
243
+ , '-ooutput.txt'
244
+ , '--rebuild-cache', 'true'
245
+ , 'input.txt'
246
+ , '--verbosity=2'
247
+ ].
248
+ ==
249
+
250
+ opt_parse(ExampleOptsSpec, ExampleArgs, Opts, PositionalArgs) would then
251
+ succeed with
252
+
253
+ ==
254
+ Opts = [ mode('SCAN')
255
+ , label('REPORT')
256
+ , path('/some/file/path')
257
+ , threshold(0.14)
258
+ , distances([1,1,2,3,5,8])
259
+ , depth(7)
260
+ , outfile('output.txt')
261
+ , cache(true)
262
+ , verbose(2)
263
+ ],
264
+ PositionalArgs = ['input.txt'].
265
+ ==
266
+
267
+ Note that path('/some/file/path') showing up in Opts has a default value
268
+ (of the implicit type 'term'), but no corresponding flags in OptsSpec.
269
+ Thus it can't be set from the command line. The rest of your program
270
+ doesn't need to know that, of course. This provides an alternative to
271
+ the common practice of asserting such hard-coded parameters under a
272
+ single predicate (for instance setting(path, '/some/file/path')), with
273
+ the advantage that you may seamlessly upgrade them to command-line
274
+ options, should you one day find this a good idea. Just add an
275
+ appropriate flag or two and a line of help text. Similarly, suppressing
276
+ an option in a cluttered interface amounts to commenting out the flags.
277
+
278
+ opt_parse/5 allows more control through an additional argument list as
279
+ shown in the example below.
280
+
281
+ ==
282
+ ?- opt_parse(ExampleOptsSpec, ExampleArgs, Opts, PositionalArgs,
283
+ [ output_functor(appl_config)
284
+ ]).
285
+
286
+ Opts = [ appl_config(verbose, 2),
287
+ , appl_config(label, 'REPORT')
288
+ ...
289
+ ]
290
+ ==
291
+
292
+ This representation may be preferable with the empty-flag configuration
293
+ parameter style above (perhaps with asserting appl_config/2).
294
+
295
+ ## Notes and tips {#optparse-notes}
296
+
297
+ * In the example we were mostly explicit about the types. Since the
298
+ default is =|term|=, which subsumes =|integer, float, atom|=, it
299
+ may be possible to get away cheaper (e.g., by only giving booleans).
300
+ However, it is recommended practice to always specify types:
301
+ parsing becomes more reliable and error messages will be easier to interpret.
302
+
303
+
304
+ * Note that =|-sbar|= is taken to mean =|-s bar|=, not =|-s -b -a -r|=,
305
+ that is, there is no clustering of flags.
306
+
307
+ * =|-s=foo|= is disallowed. The rationale is that although some
308
+ command-line parsers will silently interpret this as =|-s =foo|=, this is very
309
+ seldom what you want. To have an option argument start with '=' (very
310
+ un-recommended), say so explicitly.
311
+
312
+ * The example specifies the option =|depth|= twice: once as
313
+ =|-d5|= and once as =|--iters 7|=. The default when encountering duplicated
314
+ flags is to =|keeplast|= (this behaviour can be controlled, by ParseOption
315
+ duplicated_flags).
316
+
317
+ * The order of the options returned by the parsing functions is the same as
318
+ given on the command
319
+ line, with non-overridden defaults prepended and duplicates removed
320
+ as in previous item. You should not rely on this, however.
321
+
322
+ * Unknown flags (not appearing in OptsSpec) will throw errors. This
323
+ is usually a Good Thing. Sometimes, however, you may wish to pass
324
+ along flags to an external program (say, one called by shell/2), and
325
+ it means duplicated effort and a maintenance headache to have to
326
+ specify all possible flags for the external program explicitly (if
327
+ it even can be done). On the other hand, simply taking all unknown
328
+ flags as valid makes error checking much less efficient and
329
+ identification of positional arguments uncertain. A better solution
330
+ is to collect all arguments intended for passing along to an
331
+ indirectly called program as a single argument, probably as an atom
332
+ (if you don't need to inspect them first) or as a prolog term (if
333
+ you do).
334
+
335
+ @author Marcus Uneson
336
+ @version 0.20 (2011-04-27)
337
+ @tbd: validation? e.g, numbers; file path existence; one-out-of-a-set-of-atoms
338
+ */
339
+
340
+ :- predicate_options(opt_parse/5, 5,
341
+ [ allow_empty_flag_spec(boolean),
342
+ duplicated_flags(oneof([keepfirst,keeplast,keepall])),
343
+ output_functor(atom),
344
+ suppress_empty_meta(boolean)
345
+ ]).
346
+
347
+ :- multifile
348
+ error:has_type/2,
349
+ parse_type/3.
350
+
351
+ %% opt_arguments(+OptsSpec, -Opts, -PositionalArgs) is det
352
+ %
353
+ % Extract commandline options according to a specification.
354
+ % Convenience predicate, assuming that command-line arguments can be
355
+ % accessed by current_prolog_flag/2 (as in swi-prolog). For other
356
+ % access mechanisms and/or more control, get the args and pass them
357
+ % as a list of atoms to opt_parse/4 or opt_parse/5 instead.
358
+ %
359
+ % Opts is a list of parsed options in the form Key(Value). Dashed
360
+ % args not in OptsSpec are not permitted and will raise error (see
361
+ % tip on how to pass unknown flags in the module description).
362
+ % PositionalArgs are the remaining non-dashed args after each flag
363
+ % has taken its argument (filling in =true= or =false= for booleans).
364
+ % There are no restrictions on non-dashed arguments and they may go
365
+ % anywhere (although it is good practice to put them last). Any
366
+ % leading arguments for the runtime (up to and including '--') are
367
+ % discarded.
368
+
369
+ opt_arguments(OptsSpec, Opts, PositionalArgs) :-
370
+ current_prolog_flag(argv, Argv),
371
+ opt_parse(OptsSpec, Argv, Opts, PositionalArgs).
372
+
373
+ %% opt_parse(+OptsSpec, +ApplArgs, -Opts, -PositionalArgs) is det
374
+ %
375
+ % Equivalent to opt_parse(OptsSpec, ApplArgs, Opts, PositionalArgs, []).
376
+
377
+
378
+ opt_parse(OptsSpec, ApplArgs, Opts, PositionalArgs) :-
379
+ opt_parse(OptsSpec, ApplArgs, Opts, PositionalArgs, []).
380
+
381
+ %% opt_parse(+OptsSpec, +ApplArgs, -Opts, -PositionalArgs, +ParseOptions) is det
382
+ %
383
+ % Parse the arguments Args (as list of atoms) according to OptsSpec.
384
+ % Any runtime arguments (typically terminated by '--') are assumed to
385
+ % be removed already.
386
+ %
387
+ % Opts is a list of parsed options in the form Key(Value), or (with
388
+ % the option functor(Func) given) in the form Func(Key, Value).
389
+ % Dashed args not in OptsSpec are not permitted and will raise error
390
+ % (see tip on how to pass unknown flags in the module description).
391
+ % PositionalArgs are the remaining non-dashed args after each flag
392
+ % has taken its argument (filling in =true= or =false= for booleans).
393
+ % There are no restrictions on non-dashed arguments and they may go
394
+ % anywhere (although it is good practice to put them last).
395
+ % ParseOptions are
396
+ %
397
+ % * output_functor(Func)
398
+ % Set the functor Func of the returned options Func(Key,Value).
399
+ % Default is the special value 'OPTION' (upper-case), which makes
400
+ % the returned options have form Key(Value).
401
+ %
402
+ % * duplicated_flags(Keep)
403
+ % Controls how to handle options given more than once on the commad line.
404
+ % Keep is one of =|keepfirst, keeplast, keepall|= with the obvious meaning.
405
+ % Default is =|keeplast|=.
406
+ %
407
+ % * allow_empty_flag_spec(Bool)
408
+ % If true (default), a flag specification is not required (it is allowed
409
+ % that both shortflags and longflags be either [] or absent).
410
+ % Flagless options cannot be manipulated from the command line
411
+ % and will not show up in the generated help. This is useful when you
412
+ % have (also) general configuration parameters in
413
+ % your OptsSpec, especially if you think they one day might need to be
414
+ % controlled externally. See example in the module overview.
415
+ % allow_empty_flag_spec(false) gives the more customary behaviour of
416
+ % raising error on empty flags.
417
+
418
+
419
+ opt_parse(OptsSpec, ApplArgs, Opts, PositionalArgs, ParseOptions) :-
420
+ opt_parse_(OptsSpec, ApplArgs, Opts, PositionalArgs, ParseOptions).
421
+
422
+
423
+ %% opt_help(+OptsSpec, -Help:atom) is det
424
+ %
425
+ % True when Help is a help string synthesized from OptsSpec.
426
+
427
+ opt_help(OptsSpec, Help) :-
428
+ opt_help(OptsSpec, Help, []).
429
+
430
+ % semi-arbitrary default format settings go here;
431
+ % if someone needs more control one day, opt_help/3 could be exported
432
+ opt_help(OptsSpec, Help, HelpOptions0) :-
433
+ Defaults = [ line_width(80)
434
+ , min_help_width(40)
435
+ , break_long_flags(false)
436
+ , suppress_empty_meta(true)
437
+ ],
438
+ merge_options(HelpOptions0, Defaults, HelpOptions),
439
+ opt_help_(OptsSpec, Help, HelpOptions).
440
+
441
+
442
+ %{{{ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% OPT_PARSE
443
+
444
+ opt_parse_(OptsSpec0, Args0, Opts, PositionalArgs, ParseOptions) :-
445
+ must_be(list(atom), Args0),
446
+
447
+ check_opts_spec(OptsSpec0, ParseOptions, OptsSpec),
448
+
449
+ maplist(atom_codes, Args0, Args1),
450
+ parse_options(OptsSpec, Args1, Args2, PositionalArgs),
451
+ add_default_opts(OptsSpec, Args2, Args3),
452
+
453
+ option(duplicated_flags(Keep), ParseOptions, keeplast),
454
+ remove_duplicates(Keep, Args3, Args4),
455
+
456
+ option(output_functor(Func), ParseOptions, 'OPTION'),
457
+ refunctor_opts(Func, Args4, Opts). %}}}
458
+
459
+
460
+
461
+ %{{{ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% MAKE HELP
462
+ opt_help_(OptsSpec0, Help, HelpOptions) :-
463
+ check_opts_spec(OptsSpec0, HelpOptions, OptsSpec1),
464
+ include_in_help(OptsSpec1, OptsSpec2),
465
+ format_help_fields(OptsSpec2, OptsSpec3),
466
+ col_widths(OptsSpec3, [shortflags, metatypedef], CWs),
467
+ long_flag_col_width(OptsSpec3, LongestFlagWidth),
468
+ maplist(format_opt(LongestFlagWidth, CWs, HelpOptions), OptsSpec3, Lines),
469
+ atomic_list_concat(Lines, Help).
470
+
471
+ include_in_help([], []).
472
+ include_in_help([OptSpec|OptsSpec], Result) :-
473
+ ( flags(OptSpec, [_|_])
474
+ -> Result = [OptSpec|Rest]
475
+ ; Result = Rest
476
+ ),
477
+ include_in_help(OptsSpec, Rest).
478
+
479
+ format_help_fields(OptsSpec0, OptsSpec) :-
480
+ maplist(embellish_flag(short), OptsSpec0, OptsSpec1),
481
+ maplist(embellish_flag(long), OptsSpec1, OptsSpec2),
482
+ maplist(merge_meta_type_def, OptsSpec2, OptsSpec).
483
+
484
+ merge_meta_type_def(OptSpecIn, [metatypedef(MTD)|OptSpecIn]) :-
485
+ memberchk(meta(Meta), OptSpecIn),
486
+ memberchk(type(Type), OptSpecIn),
487
+ memberchk(default(Def), OptSpecIn),
488
+ atom_length(Meta, N),
489
+ ( N > 0
490
+ -> format(atom(MTD), '~w:~w=~w', [Meta, Type, Def])
491
+ ; format(atom(MTD), '~w=~w', [Type, Def])
492
+ ).
493
+ embellish_flag(short, OptSpecIn, OptSpecOut) :-
494
+ memberchk(shortflags(FlagsIn), OptSpecIn),
495
+ maplist(atom_concat('-'), FlagsIn, FlagsOut0),
496
+ atomic_list_concat(FlagsOut0, ',', FlagsOut),
497
+ merge_options([shortflags(FlagsOut)], OptSpecIn, OptSpecOut).
498
+ embellish_flag(long, OptSpecIn, OptSpecOut) :-
499
+ memberchk(longflags(FlagsIn), OptSpecIn),
500
+ maplist(atom_concat('--'), FlagsIn, FlagsOut),
501
+ merge_options([longflags(FlagsOut)], OptSpecIn, OptSpecOut).
502
+
503
+ col_widths(OptsSpec, Functors, ColWidths) :-
504
+ maplist(col_width(OptsSpec), Functors, ColWidths).
505
+ col_width(OptsSpec, Functor, ColWidth) :-
506
+ findall(N,
507
+ ( member(OptSpec, OptsSpec),
508
+ M =.. [Functor, Arg],
509
+ member(M, OptSpec),
510
+ format(atom(Atom), '~w', [Arg]),
511
+ atom_length(Atom, N0),
512
+ N is N0 + 2 %separate cols with two spaces
513
+ ),
514
+ Ns),
515
+ max_list([0|Ns], ColWidth).
516
+
517
+ long_flag_col_width(OptsSpec, ColWidth) :-
518
+ findall(FlagLength,
519
+ ( member(OptSpec, OptsSpec),
520
+ memberchk(longflags(LFlags), OptSpec),
521
+ member(LFlag, LFlags),
522
+ atom_length(LFlag, FlagLength)
523
+ ),
524
+ FlagLengths),
525
+ max_list([0|FlagLengths], ColWidth).
526
+
527
+
528
+ format_opt(LongestFlagWidth, [SFlagsCW, MTDCW], HelpOptions, Opt, Line) :-
529
+ memberchk(shortflags(SFlags), Opt),
530
+
531
+ memberchk(longflags(LFlags0), Opt),
532
+ group_length(LongestFlagWidth, LFlags0, LFlags1),
533
+ LFlagsCW is LongestFlagWidth + 2, %separate with comma and space
534
+ option(break_long_flags(BLF), HelpOptions, true),
535
+ ( BLF
536
+ -> maplist(atomic_list_concat_(',\n'), LFlags1, LFlags2)
537
+ ; maplist(atomic_list_concat_(', '), LFlags1, LFlags2)
538
+ ),
539
+ atomic_list_concat(LFlags2, ',\n', LFlags),
540
+
541
+ memberchk(metatypedef(MetaTypeDef), Opt),
542
+
543
+ memberchk(help(Help), Opt),
544
+ HelpIndent is LFlagsCW + SFlagsCW + MTDCW + 2,
545
+ option(line_width(LW), HelpOptions, 80),
546
+ option(min_help_width(MHW), HelpOptions, 40),
547
+ HelpWidth is max(MHW, LW - HelpIndent),
548
+ ( ( atom(Help) ; string(Help) )
549
+ -> line_breaks(Help, HelpWidth, HelpIndent, BrokenHelp)
550
+ ; assertion(is_list_of_atoms(Help))
551
+ -> indent_lines(Help, HelpIndent, BrokenHelp)
552
+ ),
553
+ format(atom(Line), '~w~t~*+~w~t~*+~w~t~*+~w~n',
554
+ [LFlags, LFlagsCW, SFlags, SFlagsCW, MetaTypeDef, MTDCW, BrokenHelp]).
555
+
556
+
557
+ line_breaks(TextLine, LineLength, Indent, TextLines) :-
558
+ atomic_list_concat(Words, ' ', TextLine),
559
+ group_length(LineLength, Words, Groups0),
560
+ maplist(atomic_list_concat_(' '), Groups0, Groups),
561
+ indent_lines(Groups, Indent, TextLines).
562
+
563
+ indent_lines(Lines, Indent, TextLines) :-
564
+ format(atom(Separator), '~n~*|', [Indent]),
565
+ atomic_list_concat(Lines, Separator, TextLines).
566
+
567
+ atomic_list_concat_(Separator, List, Atom) :-
568
+ atomic_list_concat(List, Separator, Atom).
569
+
570
+ %group_length(10,
571
+ % [here, are, some, words, you, see],
572
+ % [[here are], [some words], [you see]]) %each group >= 10F
573
+ group_length(LineLength, Words, Groups) :-
574
+ group_length_(Words, LineLength, LineLength, [], [], Groups).
575
+
576
+ group_length_([], _, _, ThisLine, GroupsAcc, Groups) :-
577
+ maplist(reverse, [ThisLine|GroupsAcc], GroupsAcc1),
578
+ reverse(GroupsAcc1, Groups).
579
+ group_length_([Word|Words], LineLength, Remains, ThisLine, Groups, GroupsAcc) :-
580
+ atom_length(Word, K),
581
+ ( (Remains >= K; ThisLine = []) %Word fits on ThisLine, or too long too fit
582
+ -> Remains1 is Remains - K - 1, %even on a new line
583
+ group_length_(Words, LineLength, Remains1, [Word|ThisLine], Groups, GroupsAcc)
584
+
585
+ %Word doesn't fit on ThisLine (non-empty)
586
+ ; group_length_([Word|Words], LineLength, LineLength, [], [ThisLine|Groups], GroupsAcc)
587
+ ).
588
+
589
+
590
+ %}}}
591
+
592
+
593
+ %! add_default_defaults(+OptSpecIn, -OptSpec, +Options) is det.
594
+ %
595
+ % Add defaults to the user speficified options.
596
+
597
+ add_default_defaults(OptsSpec0, OptsSpec, Options) :-
598
+ option(suppress_empty_meta(SEM), Options, true),
599
+ maplist(default_defaults(SEM), OptsSpec0, OptsSpec).
600
+
601
+ default_defaults(SuppressEmptyMeta, OptSpec0, OptSpec) :-
602
+ ( SuppressEmptyMeta
603
+ -> Meta = ''
604
+ ; memberchk(type(Type), OptSpec0)
605
+ -> meta_placeholder(Type, Meta)
606
+ ; Meta = 'T'
607
+ ),
608
+
609
+ Defaults = [ help(''),
610
+ type(term),
611
+ shortflags([]),
612
+ longflags([]),
613
+ default('_'),
614
+ meta(Meta)
615
+ ],
616
+ merge_options(OptSpec0, Defaults, OptSpec).
617
+
618
+ meta_placeholder(boolean, 'B').
619
+ meta_placeholder(atom, 'A').
620
+ meta_placeholder(float, 'F').
621
+ meta_placeholder(integer, 'I').
622
+ meta_placeholder(term, 'T').
623
+
624
+
625
+ %! check_opts_spec(+OptSpecIn, +Options, -OptSpec)
626
+ %
627
+ % Verify and possibly fix the user option specification.
628
+
629
+ check_opts_spec(OptsSpec0, Options, OptsSpec) :-
630
+ validate_opts_spec(OptsSpec0, Options),
631
+ add_default_defaults(OptsSpec0, OptsSpec, Options),
632
+ validate_opts_spec(OptsSpec, Options).
633
+
634
+ validate_opts_spec(OptsSpec, ParseOptions) :-
635
+ \+ invalidate_opts_spec(OptsSpec, ParseOptions).
636
+
637
+ invalidate_opts_spec(OptsSpec, _ParseOptions) :-
638
+ %invalid if not ground -- must go first for \+ to be sound
639
+ ( \+ ground(OptsSpec)
640
+ -> throw(error(instantiation_error,
641
+ context(validate_opts_spec/1, 'option spec must be ground')))
642
+
643
+ %invalid if conflicting flags
644
+ ; member(O1, OptsSpec), flags(O1, Flags1), member(F, Flags1),
645
+ member(O2, OptsSpec), flags(O2, Flags2), member(F, Flags2),
646
+ O1 \= O2
647
+ -> throw(error(domain_error(unique_atom, F),
648
+ context(validate_opts_spec/1, 'ambiguous flag')))
649
+
650
+ %invalid if unknown opt spec
651
+ ; member(OptSpec, OptsSpec),
652
+ member(Spec, OptSpec),
653
+ functor(Spec, F, _),
654
+ \+ member(F, [opt, shortflags, longflags, type, help, default, meta])
655
+ -> throw(error(domain_error(opt_spec, F),
656
+ context(validate_opts_spec/1, 'unknown opt spec')))
657
+
658
+ %invalid if mandatory option spec opt(ID) is not unique in the entire Spec
659
+ ; member(O1, OptsSpec), member(opt(Name), O1),
660
+ member(O2, OptsSpec), member(opt(Name), O2),
661
+ O1 \= O2
662
+ -> throw(error(domain_error(unique_atom, Name),
663
+ context(_, 'ambiguous id')))
664
+ ).
665
+ invalidate_opts_spec(OptsSpec, _ParseOptions) :-
666
+ member(OptSpec, OptsSpec),
667
+ \+ member(opt(_Name), OptSpec),
668
+ %invalid if mandatory option spec opt(ID) is absent
669
+ throw(error(domain_error(unique_atom, OptSpec),
670
+ context(_, 'opt(id) missing'))).
671
+ invalidate_opts_spec(OptsSpec, ParseOptions) :-
672
+ member(OptSpec, OptsSpec), %if we got here, OptSpec has a single unique Name
673
+ member(opt(Name), OptSpec),
674
+
675
+ option(allow_empty_flag_spec(AllowEmpty), ParseOptions, true),
676
+
677
+ %invalid if allow_empty_flag_spec(false) and no flag is given
678
+ ( ( AllowEmpty \== true,
679
+ \+ flags(OptSpec, [_|_])
680
+ )
681
+ -> format(atom(Msg), 'no flag specified for option ''~w''', [Name]),
682
+ throw(error(domain_error(unique_atom, _),
683
+ context(_, Msg)))
684
+
685
+ %invalid if any short flag is not actually single-letter
686
+ ; memberchk(shortflags(Flags), OptSpec),
687
+ member(F, Flags),
688
+ atom_length(F, L),
689
+ L > 1
690
+ -> format(atom(Msg), 'option ''~w'': flag too long to be short', [Name]),
691
+ throw(error(domain_error(short_flag, F),
692
+ context(_, Msg)))
693
+
694
+ %invalid if any option spec is given more than once
695
+ ; duplicate_optspec(OptSpec,
696
+ [type,opt,default,help,shortflags,longflags,meta])
697
+ -> format(atom(Msg), 'duplicate spec in option ''~w''', [Name]),
698
+ throw(error(domain_error(unique_functor, _),
699
+ context(_, Msg)))
700
+
701
+ %invalid if unknown type
702
+ ; memberchk(type(Type), OptSpec),
703
+ Type \== term,
704
+ \+ ( current_type(Type, _Var, _Body)
705
+ ; clause(parse_type(Type, _, _), _)
706
+ )
707
+ -> existence_error(type, Type)
708
+
709
+ ; memberchk(type(Type), OptSpec),
710
+ current_type(Type, _, _),
711
+ memberchk(default(Default), OptSpec),
712
+ Default \== '_'
713
+ -> \+ must_be(Type, Default)
714
+
715
+ ; fail
716
+ ).
717
+
718
+ duplicate_optspec(_, []) :- !, fail.
719
+ duplicate_optspec(OptSpec, [Func|Funcs]) :-
720
+ functor(F, Func, 1),
721
+ findall(F, member(F, OptSpec), Xs),
722
+ ( Xs = [_,_|_]
723
+ -> true
724
+ ; duplicate_optspec(OptSpec, Funcs)
725
+ ).
726
+
727
+ %{{{ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% PARSE OPTIONS
728
+ % NOTE:
729
+ % -sbar could be interpreted in two ways: as short for -s bar, and
730
+ % as short ('clustered') for -s -b -a -r. Here, the former interpretation
731
+ % is chosen.
732
+ % Cf http://perldoc.perl.org/Getopt/Long.html (no clustering by default)
733
+
734
+
735
+ parse_options(OptsSpec, Args0, Options, PosArgs) :-
736
+ append(Args0, [""], Args1),
737
+ parse_args_(Args1, OptsSpec, Args2),
738
+ partition_args_(Args2, Options, PosArgs).
739
+
740
+ %{{{ PARSE ARGS
741
+
742
+
743
+ %if arg is boolean flag given as --no-my-arg, expand to my-arg, false, re-call
744
+ parse_args_([Arg,Arg2|Args], OptsSpec, [opt(KID, false)|Result]) :-
745
+ flag_name_long_neg(Dashed, NonDashed, Arg, []),
746
+ flag_id_type(OptsSpec, NonDashed, KID, boolean),
747
+ !,
748
+ parse_args_([Dashed, "false", Arg2|Args], OptsSpec, Result).
749
+
750
+ %if arg is ordinary boolean flag, fill in implicit true if arg absent; re-call
751
+ parse_args_([Arg,Arg2|Args], OptsSpec, Result) :-
752
+ flag_name(K, Arg, []),
753
+ flag_id_type(OptsSpec, K, _KID, boolean),
754
+ \+ member(Arg2, ["true", "false"]),
755
+ !,
756
+ parse_args_([Arg, "true", Arg2 | Args], OptsSpec, Result).
757
+
758
+ % separate short or long flag run together with its value and parse
759
+ parse_args_([Arg|Args], OptsSpec, [opt(KID, Val)|Result]) :-
760
+ flag_name_value(Arg1, Arg2, Arg, []),
761
+ \+ short_flag_w_equals(Arg1, Arg2),
762
+ flag_name(K, Arg1, []),
763
+ !,
764
+ parse_option(OptsSpec, K, Arg2, opt(KID, Val)),
765
+ parse_args_(Args, OptsSpec, Result).
766
+
767
+ %from here, unparsed args have form
768
+ % PosArg1,Flag1,Val1,PosArg2,PosArg3,Flag2,Val2, PosArg4...
769
+ %i.e., positional args may go anywhere except between FlagN and ValueN
770
+ %(of course, good programming style says they should go last, but it is poor
771
+ %programming style to assume that)
772
+
773
+ parse_args_([Arg1,Arg2|Args], OptsSpec, [opt(KID, Val)|Result]) :-
774
+ flag_name(K, Arg1, []),
775
+ !,
776
+ parse_option(OptsSpec, K, Arg2, opt(KID, Val)),
777
+ parse_args_(Args, OptsSpec, Result).
778
+
779
+ parse_args_([Arg1,Arg2|Args], OptsSpec, [pos(At)|Result]) :-
780
+ \+ flag_name(_, Arg1, []),
781
+ !,
782
+ atom_codes(At, Arg1),
783
+ parse_args_([Arg2|Args], OptsSpec, Result).
784
+
785
+ parse_args_([""], _, []) :- !. %placeholder, but useful for error messages
786
+ parse_args_([], _, []) :- !.
787
+
788
+ short_flag_w_equals([0'-,_C], [0'=|_]) :-
789
+ throw(error(syntax_error('disallowed: <shortflag>=<value>'),_)).
790
+
791
+ %! flag_id_type(+OptSpec, +FlagCodes, -ID, -Type) is semidet.
792
+
793
+ flag_id_type(OptsSpec, FlagCodes, ID, Type) :-
794
+ atom_codes(Flag, FlagCodes),
795
+ member(OptSpec, OptsSpec),
796
+ flags(OptSpec, Flags),
797
+ member(Flag, Flags),
798
+ member(type(Type), OptSpec),
799
+ member(opt(ID), OptSpec).
800
+
801
+ %{{{ FLAG DCG
802
+
803
+ %DCG non-terminals:
804
+ % flag_name(NonDashed) %c, flag-name, x
805
+ % flag_name_short(Dashed, NonDashed) %c, x
806
+ % flag_name_long(Dashed, NonDashed) %flag-name
807
+ % flag_name_long_neg(Dashed, NonDashed) %no-flag-name
808
+ % flag_value(Val) %non-empty string
809
+ % flag_value0(Val) %any string, also empty
810
+ % flag_name_value(Dashed, Val) %pair of flag_name, flag_value
811
+
812
+
813
+ flag_name(NonDashed) --> flag_name_long(_, NonDashed).
814
+ flag_name(NonDashed) --> flag_name_short(_, NonDashed).
815
+ flag_name(NonDashed) --> flag_name_long_neg(_, NonDashed).
816
+
817
+ flag_name_long_neg([0'-,0'-|Cs], Cs) --> "--no-", name_long(Cs).
818
+ flag_name_long([0'-,0'-|Cs], Cs) --> "--", name_long(Cs).
819
+ flag_name_short([0'-|C], C) --> "-", name_1st(C).
820
+
821
+ flag_value([C|Cs]) --> [C], flag_value0(Cs).
822
+ flag_value0([]) --> [].
823
+ flag_value0([C|Cs]) --> [C], flag_value0(Cs).
824
+ flag_name_value(Dashed, Val) --> flag_name_long(Dashed, _), "=", flag_value0(Val).
825
+ flag_name_value(Dashed, Val) --> flag_name_short(Dashed, _), flag_value(Val).
826
+
827
+ name_long([C|Cs]) --> name_1st([C]), name_rest(Cs).
828
+ name_1st([C]) --> [C], {name_1st(C)}.
829
+ name_rest([]) --> [].
830
+ name_rest([C|Cs]) --> [C], {name_char(C)}, name_rest(Cs).
831
+ name_1st(C) :- char_type(C, alpha).
832
+ name_char(C) :- char_type(C, alpha).
833
+ name_char( 0'_ ).
834
+ name_char( 0'- ). %}}}
835
+
836
+
837
+ %! parse_option(+OptSpec, +Flag:codes, +Val:codes, -Opt)
838
+
839
+ parse_option(OptsSpec, Arg1, Arg2, opt(KID, Val)) :-
840
+ ( flag_id_type(OptsSpec, Arg1, KID, Type)
841
+ -> parse_val(Arg1, Type, Arg2, Val)
842
+ ; atom_codes(Flag, Arg1),
843
+ existence_error(commandline_option, Flag)
844
+ ).
845
+
846
+
847
+ parse_val(Opt, Type, Cs, Val) :-
848
+ catch(
849
+ parse_loc(Type, Cs, Val),
850
+ E,
851
+ ( format('~nERROR: flag ''~s'': expected atom parsable as ~w, found ''~s'' ~n',
852
+ [Opt, Type, Cs]),
853
+ throw(E))
854
+ ).
855
+
856
+ %! parse_loc(+Type, +ListOfCodes, -Result).
857
+
858
+ parse_loc(Type, _LOC, _) :-
859
+ var(Type), !, throw(error(instantiation_error, _)).
860
+ parse_loc(_Type, LOC, _) :-
861
+ var(LOC), !, throw(error(instantiation_error, _)).
862
+ parse_loc(boolean, Cs, true) :- atom_codes(true, Cs), !.
863
+ parse_loc(boolean, Cs, false) :- atom_codes(false, Cs), !.
864
+ parse_loc(atom, Cs, Result) :- atom_codes(Result, Cs), !.
865
+ parse_loc(integer, Cs, Result) :-
866
+ number_codes(Result, Cs),
867
+ integer(Result),
868
+ !.
869
+ parse_loc(float, Cs, Result) :-
870
+ number_codes(Result, Cs),
871
+ float(Result),
872
+ !.
873
+ parse_loc(term, Cs, Result) :-
874
+ atom_codes(A, Cs),
875
+ term_to_atom(Result, A),
876
+ !.
877
+ parse_loc(Type, Cs, Result) :-
878
+ parse_type(Type, Cs, Result),
879
+ !.
880
+ parse_loc(Type, _Cs, _) :- %could not parse Cs as Type
881
+ throw(error(type_error(flag_value, Type), _)),
882
+ !. %}}}
883
+ %}}}
884
+
885
+ %% parse_type(+Type, +Codes:list(code), -Result) is semidet.
886
+ %
887
+ % Hook to parse option text Codes to an object of type Type.
888
+
889
+ partition_args_([], [], []).
890
+ partition_args_([opt(K,V)|Rest], [opt(K,V)|RestOpts], RestPos) :-
891
+ !,
892
+ partition_args_(Rest, RestOpts, RestPos).
893
+ partition_args_([pos(Arg)|Rest], RestOpts, [Arg|RestPos]) :-
894
+ !,
895
+ partition_args_(Rest, RestOpts, RestPos).
896
+
897
+
898
+
899
+
900
+ %{{{ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ADD DEFAULTS
901
+
902
+ add_default_opts([], Opts, Opts).
903
+ add_default_opts([OptSpec|OptsSpec], OptsIn, Result) :-
904
+ memberchk(opt(OptName), OptSpec),
905
+ ( memberchk(opt(OptName, _Val), OptsIn)
906
+ -> Result = OptsOut %value given on cl, ignore default
907
+
908
+ ; %value not given on cl:
909
+ memberchk(default('_'), OptSpec) % no default in OptsSpec (or 'VAR'):
910
+ -> Result = [opt(OptName, _) | OptsOut] % create uninstantiated variable
911
+ ;
912
+ memberchk(default(Def), OptSpec), % default given in OptsSpec
913
+ % memberchk(type(Type), OptSpec), % already typechecked
914
+ % assertion(must_be(Type, Def)),
915
+ Result = [opt(OptName, Def) | OptsOut]
916
+ ),
917
+ add_default_opts(OptsSpec, OptsIn, OptsOut).
918
+
919
+
920
+
921
+ %}}}
922
+
923
+
924
+ %{{{ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% REMOVE DUPLICATES
925
+ remove_duplicates(_, [], []) :- !.
926
+ remove_duplicates(keeplast, [opt(OptName, Val) | Opts], Result) :-
927
+ !,
928
+ ( memberchk(opt(OptName, _), Opts)
929
+ -> Result = RestOpts
930
+ ; Result = [opt(OptName, Val) | RestOpts]
931
+ ),
932
+ remove_duplicates(keeplast, Opts, RestOpts).
933
+
934
+ remove_duplicates(keepfirst, OptsIn, OptsOut) :-
935
+ !,
936
+ reverse(OptsIn, OptsInRev),
937
+ remove_duplicates(keeplast, OptsInRev, OptsOutRev),
938
+ reverse(OptsOutRev, OptsOut).
939
+
940
+ remove_duplicates(keepall, OptsIn, OptsIn) :- !.
941
+ remove_duplicates(K, [_|_], _) :-
942
+ !,
943
+ throw(error(domain_error(keep_flag, K), _)). %}}}
944
+
945
+
946
+ %{{{ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% REFUNCTOR
947
+ refunctor_opts(Fnct, OptsIn, OptsOut) :-
948
+ maplist(refunctor_opt(Fnct), OptsIn, OptsOut).
949
+
950
+ refunctor_opt('OPTION', opt(OptName, OptVal), Result) :-
951
+ !,
952
+ Result =.. [OptName, OptVal].
953
+
954
+ refunctor_opt(F, opt(OptName, OptVal), Result) :-
955
+ Result =.. [F, OptName, OptVal]. %}}}
956
+
957
+
958
+ %{{{ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ACCESSORS
959
+
960
+ flags(OptSpec, Flags) :- memberchk(shortflags(Flags), OptSpec).
961
+ flags(OptSpec, Flags) :- memberchk(longflags(Flags), OptSpec). %}}}
962
+
963
+ %{{{ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% UTILS
964
+ is_list_of_atoms([]).
965
+ is_list_of_atoms([X|Xs]) :- atom(X), is_list_of_atoms(Xs).
966
+ %}}}