From 1cb167b597a2f5274d7b3fc2983ca467a102e3d2 Mon Sep 17 00:00:00 2001 From: Ian Keane Date: Tue, 18 Feb 2020 14:21:14 -0500 Subject: [PATCH] Tmux etc --- .../quicklisp/archives/babel-20191130-git.tgz | Bin 0 -> 271183 bytes .../archives/bordeaux-threads-v0.8.7.tgz | Bin 0 -> 21951 bytes .../dists/quicklisp/archives/cffi_0.20.1.tgz | Bin 0 -> 260119 bytes .../archives/croatoan-20191227-git.tgz | Bin 0 -> 121276 bytes .../trivial-features-20190710-git.tgz | Bin 0 -> 10765 bytes .../quicklisp/installed/releases/babel.txt | 1 + .../installed/releases/bordeaux-threads.txt | 1 + .../quicklisp/installed/releases/cffi.txt | 1 + .../quicklisp/installed/releases/croatoan.txt | 1 + .../installed/releases/trivial-features.txt | 1 + .../installed/systems/babel-streams.txt | 1 + .../installed/systems/babel-tests.txt | 1 + .../quicklisp/installed/systems/babel.txt | 1 + .../installed/systems/bordeaux-threads.txt | 1 + .../installed/systems/cffi-examples.txt | 1 + .../installed/systems/cffi-grovel.txt | 1 + .../installed/systems/cffi-libffi.txt | 1 + .../installed/systems/cffi-tests.txt | 1 + .../installed/systems/cffi-toolchain.txt | 1 + .../installed/systems/cffi-uffi-compat.txt | 1 + .../quicklisp/installed/systems/cffi.txt | 1 + .../installed/systems/croatoan-test.txt | 1 + .../quicklisp/installed/systems/croatoan.txt | 1 + .../systems/trivial-features-tests.txt | 1 + .../installed/systems/trivial-features.txt | 1 + .../software/babel-20191130-git/.travis.yml | 31 + .../software/babel-20191130-git/COPYRIGHT | 20 + .../software/babel-20191130-git/HEADER | 27 + .../software/babel-20191130-git/NOTES | 34 + .../software/babel-20191130-git/README.md | 19 + .../babel-20191130-git/babel-streams.asd | 38 + .../babel-20191130-git/babel-tests.asd | 42 + .../software/babel-20191130-git/babel.asd | 59 + .../software/babel-20191130-git/doc/Makefile | 31 + .../babel-20191130-git/doc/babel.texinfo | 105 + .../babel-20191130-git/doc/license.texinfo | 20 + .../babel-20191130-git/doc/macros.texinfo | 27 + .../babel-20191130-git/scripts/release.lisp | 250 + .../babel-20191130-git/src/enc-ascii.lisp | 43 + .../babel-20191130-git/src/enc-cp1251.lisp | 119 + .../babel-20191130-git/src/enc-cp1252.lisp | 81 + .../src/enc-ebcdic-int.lisp | 49 + .../babel-20191130-git/src/enc-ebcdic.lisp | 71 + .../babel-20191130-git/src/enc-gbk.lisp | 184 + .../babel-20191130-git/src/enc-iso-8859.lisp | 1087 + .../babel-20191130-git/src/enc-jpn.lisp | 767 + .../babel-20191130-git/src/enc-koi8.lisp | 577 + .../babel-20191130-git/src/enc-unicode.lisp | 881 + .../babel-20191130-git/src/encodings.lisp | 503 + .../src/external-format.lisp | 88 + .../babel-20191130-git/src/gbk-map.lisp | 2226 ++ .../babel-20191130-git/src/jpn-table.lisp | 17637 ++++++++++++++++ .../babel-20191130-git/src/packages.lisp | 115 + .../src/sharp-backslash.lisp | 82 + .../babel-20191130-git/src/streams.lisp | 436 + .../babel-20191130-git/src/strings.lisp | 353 + .../babel-20191130-git/tests/ascii.txt | 212 + .../babel-20191130-git/tests/ascii.txt-utf8 | 212 + .../babel-20191130-git/tests/benchmarks.lisp | 43 + .../babel-20191130-git/tests/ebcdic-us.txt | 1 + .../tests/ebcdic-us.txt-utf8 | 212 + .../tests/gen-test-files.sh | 37 + .../babel-20191130-git/tests/streams.lisp | 45 + .../babel-20191130-git/tests/tests.lisp | 912 + .../tests/utf-16-with-le-bom.txt | Bin 0 -> 15244 bytes .../babel-20191130-git/tests/utf-16.txt | Bin 0 -> 15244 bytes .../babel-20191130-git/tests/utf-16.txt-utf8 | 212 + .../tests/utf-32-with-le-bom.txt | Bin 0 -> 30488 bytes .../babel-20191130-git/tests/utf-32.txt | Bin 0 -> 30488 bytes .../babel-20191130-git/tests/utf-32.txt-utf8 | 212 + .../babel-20191130-git/tests/utf-8.txt | 212 + .../babel-20191130-git/tests/utf-8.txt-utf8 | 212 + .../bordeaux-threads-v0.8.7/.travis.yml | 46 + .../bordeaux-threads-v0.8.7/CONTRIBUTORS | 19 + .../software/bordeaux-threads-v0.8.7/LICENSE | 20 + .../software/bordeaux-threads-v0.8.7/README | 2 + .../bordeaux-threads.asd | 76 + .../bordeaux-threads-v0.8.7/site/index.html | 55 + .../bordeaux-threads-v0.8.7/site/style.css | 86 + .../src/bordeaux-threads.lisp | 170 + .../src/condition-variables.lisp | 38 + .../src/default-implementations.lisp | 361 + .../src/impl-abcl.lisp | 150 + .../src/impl-allegro.lisp | 143 + .../src/impl-clasp.lisp | 111 + .../src/impl-clisp.lisp | 105 + .../src/impl-clozure.lisp | 130 + .../src/impl-cmucl.lisp | 161 + .../src/impl-corman.lisp | 26 + .../bordeaux-threads-v0.8.7/src/impl-ecl.lisp | 111 + .../src/impl-genera.lisp | 136 + .../impl-lispworks-condition-variables.lisp | 144 + .../src/impl-lispworks.lisp | 143 + .../bordeaux-threads-v0.8.7/src/impl-mcl.lisp | 68 + .../src/impl-mkcl.lisp | 109 + .../src/impl-null.lisp | 3 + .../src/impl-sbcl.lisp | 130 + .../bordeaux-threads-v0.8.7/src/impl-scl.lisp | 103 + .../bordeaux-threads-v0.8.7/src/pkgdcl.lisp | 66 + .../test/bordeaux-threads-test.lisp | 251 + .../bordeaux-threads-v0.8.7/version.sexp | 2 + .../quicklisp/software/cffi_0.20.1/.gitignore | 28 + .../software/cffi_0.20.1/.travis.yml | 38 + .../quicklisp/software/cffi_0.20.1/COPYRIGHT | 21 + .../quicklisp/software/cffi_0.20.1/HEADER | 28 + .../quicklisp/software/cffi_0.20.1/Makefile | 72 + .../quicklisp/software/cffi_0.20.1/README.md | 19 + .../dists/quicklisp/software/cffi_0.20.1/TODO | 115 + .../software/cffi_0.20.1/cffi-examples.asd | 37 + .../software/cffi_0.20.1/cffi-grovel.asd | 41 + .../software/cffi_0.20.1/cffi-libffi.asd | 48 + .../software/cffi_0.20.1/cffi-tests.asd | 91 + .../software/cffi_0.20.1/cffi-toolchain.asd | 48 + .../software/cffi_0.20.1/cffi-uffi-compat.asd | 41 + .../quicklisp/software/cffi_0.20.1/cffi.asd | 101 + .../software/cffi_0.20.1/doc/Makefile | 46 + .../cffi_0.20.1/doc/allegro-internals.txt | 132 + .../cffi_0.20.1/doc/cffi-manual.texinfo | 7113 +++++++ .../cffi_0.20.1/doc/cffi-sys-spec.texinfo | 334 + .../doc/colorize-lisp-examples.lisp | 1058 + .../software/cffi_0.20.1/doc/gendocs.sh | 313 + .../software/cffi_0.20.1/doc/gendocs_template | 259 + .../software/cffi_0.20.1/doc/mem-vector.txt | 75 + .../cffi_0.20.1/doc/shareable-vectors.txt | 44 + .../software/cffi_0.20.1/doc/style.css | 48 + .../cffi_0.20.1/examples/examples.lisp | 78 + .../cffi_0.20.1/examples/gethostname.lisp | 51 + .../cffi_0.20.1/examples/gettimeofday.lisp | 93 + .../cffi_0.20.1/examples/grovel-example.lisp | 20 + .../cffi_0.20.1/examples/main-example.lisp | 17 + .../cffi_0.20.1/examples/mapping.lisp | 76 + .../cffi_0.20.1/examples/package.lisp | 30 + .../cffi_0.20.1/examples/run-examples.lisp | 39 + .../cffi_0.20.1/examples/translator-test.lisp | 88 + .../cffi_0.20.1/examples/wrapper-example.lisp | 20 + .../software/cffi_0.20.1/grovel/asdf.lisp | 152 + .../software/cffi_0.20.1/grovel/common.h | 57 + .../software/cffi_0.20.1/grovel/grovel.lisp | 913 + .../software/cffi_0.20.1/grovel/package.lisp | 36 + .../software/cffi_0.20.1/libffi/funcall.lisp | 132 + .../cffi_0.20.1/libffi/libffi-functions.lisp | 43 + .../cffi_0.20.1/libffi/libffi-types.lisp | 110 + .../software/cffi_0.20.1/libffi/libffi.lisp | 38 + .../cffi_0.20.1/libffi/type-descriptors.lisp | 106 + .../software/cffi_0.20.1/scripts/release.lisp | 248 + .../software/cffi_0.20.1/src/c2ffi/asdf.lisp | 211 + .../software/cffi_0.20.1/src/c2ffi/c2ffi.lisp | 194 + .../cffi_0.20.1/src/c2ffi/generator.lisp | 838 + .../cffi_0.20.1/src/c2ffi/package.lisp | 54 + .../software/cffi_0.20.1/src/cffi-abcl.lisp | 664 + .../cffi_0.20.1/src/cffi-allegro.lisp | 446 + .../software/cffi_0.20.1/src/cffi-clasp.lisp | 201 + .../software/cffi_0.20.1/src/cffi-clisp.lisp | 432 + .../software/cffi_0.20.1/src/cffi-cmucl.lisp | 384 + .../software/cffi_0.20.1/src/cffi-corman.lisp | 331 + .../software/cffi_0.20.1/src/cffi-ecl.lisp | 454 + .../software/cffi_0.20.1/src/cffi-gcl.lisp | 313 + .../cffi_0.20.1/src/cffi-lispworks.lisp | 417 + .../software/cffi_0.20.1/src/cffi-mcl.lisp | 396 + .../software/cffi_0.20.1/src/cffi-mkcl.lisp | 342 + .../cffi_0.20.1/src/cffi-openmcl.lisp | 314 + .../software/cffi_0.20.1/src/cffi-sbcl.lisp | 408 + .../software/cffi_0.20.1/src/cffi-scl.lisp | 322 + .../software/cffi_0.20.1/src/early-types.lisp | 713 + .../software/cffi_0.20.1/src/enum.lisp | 369 + .../software/cffi_0.20.1/src/features.lisp | 111 + .../cffi_0.20.1/src/foreign-vars.lisp | 90 + .../software/cffi_0.20.1/src/functions.lisp | 441 + .../software/cffi_0.20.1/src/libraries.lisp | 458 + .../software/cffi_0.20.1/src/package.lisp | 181 + .../software/cffi_0.20.1/src/strings.lisp | 305 + .../software/cffi_0.20.1/src/structures.lisp | 133 + .../software/cffi_0.20.1/src/types.lisp | 1051 + .../software/cffi_0.20.1/src/utils.lisp | 84 + .../software/cffi_0.20.1/tests/GNUmakefile | 98 + .../software/cffi_0.20.1/tests/Makefile | 2 + .../software/cffi_0.20.1/tests/arrays.lisp | 71 + .../software/cffi_0.20.1/tests/bindings.lisp | 148 + .../software/cffi_0.20.1/tests/callbacks.lisp | 526 + .../software/cffi_0.20.1/tests/compile.bat | 9 + .../software/cffi_0.20.1/tests/defcfun.lisp | 536 + .../software/cffi_0.20.1/tests/enum.lisp | 231 + .../cffi_0.20.1/tests/foreign-globals.lisp | 309 + .../software/cffi_0.20.1/tests/fsbv.lisp | 199 + .../software/cffi_0.20.1/tests/funcall.lisp | 245 + .../software/cffi_0.20.1/tests/grovel.lisp | 96 + .../software/cffi_0.20.1/tests/libfsbv.c | 179 + .../software/cffi_0.20.1/tests/libtest.c | 985 + .../software/cffi_0.20.1/tests/libtest2.c | 50 + .../software/cffi_0.20.1/tests/memory.lisp | 657 + .../cffi_0.20.1/tests/misc-types.lisp | 296 + .../software/cffi_0.20.1/tests/misc.lisp | 132 + .../software/cffi_0.20.1/tests/package.lisp | 33 + .../cffi_0.20.1/tests/random-tester.lisp | 246 + .../software/cffi_0.20.1/tests/run-tests.lisp | 44 + .../software/cffi_0.20.1/tests/strings.lisp | 150 + .../software/cffi_0.20.1/tests/struct.lisp | 705 + .../software/cffi_0.20.1/tests/test-asdf.lisp | 42 + .../cffi_0.20.1/tests/test-static-link.sh | 9 + .../software/cffi_0.20.1/tests/union.lisp | 52 + .../cffi_0.20.1/toolchain/bundle.lisp | 565 + .../cffi_0.20.1/toolchain/c-toolchain.lisp | 392 + .../cffi_0.20.1/toolchain/package.lisp | 46 + .../cffi_0.20.1/toolchain/static-link.lisp | 95 + .../cffi_0.20.1/uffi-compat/uffi-compat.lisp | 664 + .../software/cffi_0.20.1/uffi-compat/uffi.asd | 3 + .../software/croatoan-20191227-git/LICENSE | 22 + .../software/croatoan-20191227-git/README | 40 + .../croatoan-20191227-git/croatoan-test.asd | 19 + .../croatoan-20191227-git/croatoan.asd | 116 + .../croatoan-20191227-git/doc/slime.md | 137 + .../ncurses/add_wch.lisp | 24 + .../croatoan-20191227-git/ncurses/addch.lisp | 25 + .../croatoan-20191227-git/ncurses/addstr.lisp | 31 + .../croatoan-20191227-git/ncurses/attr.lisp | 72 + .../croatoan-20191227-git/ncurses/beep.lisp | 15 + .../croatoan-20191227-git/ncurses/bkgd.lisp | 21 + .../croatoan-20191227-git/ncurses/bkgrnd.lisp | 23 + .../croatoan-20191227-git/ncurses/border.lisp | 57 + .../ncurses/border_set.lisp | 60 + .../croatoan-20191227-git/ncurses/clear.lisp | 29 + .../croatoan-20191227-git/ncurses/color.lisp | 56 + .../ncurses/default_colors.lisp | 15 + .../ncurses/define_key.lisp | 13 + .../croatoan-20191227-git/ncurses/delch.lisp | 19 + .../ncurses/deleteln.lisp | 23 + .../croatoan-20191227-git/ncurses/extend.lisp | 15 + .../ncurses/get_wch.lisp | 21 + .../ncurses/getcchar.lisp | 26 + .../croatoan-20191227-git/ncurses/getch.lisp | 25 + .../croatoan-20191227-git/ncurses/getstr.lisp | 27 + .../croatoan-20191227-git/ncurses/getyx.lisp | 42 + .../croatoan-20191227-git/ncurses/in_wch.lisp | 19 + .../croatoan-20191227-git/ncurses/inch.lisp | 19 + .../ncurses/inchstr.lisp | 27 + .../ncurses/initscr.lisp | 24 + .../croatoan-20191227-git/ncurses/inopts.lisp | 45 + .../ncurses/ins_wch.lisp | 19 + .../croatoan-20191227-git/ncurses/insch.lisp | 19 + .../croatoan-20191227-git/ncurses/insstr.lisp | 27 + .../croatoan-20191227-git/ncurses/instr.lisp | 27 + .../croatoan-20191227-git/ncurses/inwstr.lisp | 27 + .../croatoan-20191227-git/ncurses/kernel.lisp | 33 + .../ncurses/key_defined.lisp | 13 + .../ncurses/keybound.lisp | 13 + .../croatoan-20191227-git/ncurses/legacy.lisp | 28 + .../ncurses/legacy_coding.lisp | 12 + .../croatoan-20191227-git/ncurses/mouse.lisp | 24 + .../croatoan-20191227-git/ncurses/move.lisp | 16 + .../ncurses/ncurses.lisp | 213 + .../croatoan-20191227-git/ncurses/opaque.lisp | 40 + .../ncurses/outopts.lisp | 35 + .../ncurses/package.lisp | 467 + .../croatoan-20191227-git/ncurses/pad.lisp | 45 + .../ncurses/refresh.lisp | 23 + .../ncurses/resizeterm.lisp | 17 + .../croatoan-20191227-git/ncurses/scroll.lisp | 17 + .../croatoan-20191227-git/ncurses/slk.lisp | 47 + .../ncurses/termattrs.lisp | 31 + .../croatoan-20191227-git/ncurses/touch.lisp | 25 + .../croatoan-20191227-git/ncurses/util.lisp | 33 + .../ncurses/variables.lisp | 27 + .../croatoan-20191227-git/ncurses/window.lisp | 36 + .../ncurses/wresize.lisp | 13 + .../croatoan-20191227-git/src/add_wch.lisp | 239 + .../croatoan-20191227-git/src/addch.lisp | 230 + .../croatoan-20191227-git/src/addstr.lisp | 42 + .../croatoan-20191227-git/src/attr.lisp | 501 + .../croatoan-20191227-git/src/beep.lisp | 11 + .../croatoan-20191227-git/src/bkgd.lisp | 32 + .../croatoan-20191227-git/src/bkgrnd.lisp | 51 + .../croatoan-20191227-git/src/border.lisp | 23 + .../croatoan-20191227-git/src/border_set.lisp | 39 + .../croatoan-20191227-git/src/classes.lisp | 1564 ++ .../croatoan-20191227-git/src/clear.lisp | 27 + .../croatoan-20191227-git/src/color.lisp | 160 + .../croatoan-20191227-git/src/croatoan.lisp | 297 + .../src/default_colors.lisp | 30 + .../croatoan-20191227-git/src/define_key.lisp | 24 + .../croatoan-20191227-git/src/delch.lisp | 14 + .../croatoan-20191227-git/src/deleteln.lisp | 18 + .../croatoan-20191227-git/src/extend.lisp | 19 + .../croatoan-20191227-git/src/form.lisp | 484 + .../croatoan-20191227-git/src/get_wch.lisp | 36 + .../croatoan-20191227-git/src/getch.lisp | 520 + .../croatoan-20191227-git/src/getstr.lisp | 19 + .../croatoan-20191227-git/src/getyx.lisp | 54 + .../src/gray_streams.lisp | 162 + .../croatoan-20191227-git/src/in_wch.lisp | 14 + .../croatoan-20191227-git/src/inch.lisp | 14 + .../croatoan-20191227-git/src/inchstr.lisp | 21 + .../croatoan-20191227-git/src/initscr.lisp | 31 + .../croatoan-20191227-git/src/inopts.lisp | 82 + .../croatoan-20191227-git/src/ins_wch.lisp | 56 + .../croatoan-20191227-git/src/insch.lisp | 28 + .../croatoan-20191227-git/src/insstr.lisp | 42 + .../croatoan-20191227-git/src/instr.lisp | 28 + .../croatoan-20191227-git/src/inwstr.lisp | 25 + .../croatoan-20191227-git/src/kernel.lisp | 9 + .../src/key_defined.lisp | 27 + .../croatoan-20191227-git/src/keybound.lisp | 24 + .../croatoan-20191227-git/src/legacy.lisp | 39 + .../src/legacy_coding.lisp | 26 + .../croatoan-20191227-git/src/menu.lisp | 344 + .../croatoan-20191227-git/src/mouse.lisp | 89 + .../croatoan-20191227-git/src/move.lisp | 32 + .../croatoan-20191227-git/src/opaque.lisp | 118 + .../croatoan-20191227-git/src/outopts.lisp | 57 + .../croatoan-20191227-git/src/package.lisp | 321 + .../croatoan-20191227-git/src/panel.lisp | 54 + .../croatoan-20191227-git/src/queue.lisp | 107 + .../croatoan-20191227-git/src/refresh.lisp | 56 + .../croatoan-20191227-git/src/resizeterm.lisp | 41 + .../croatoan-20191227-git/src/scroll.lisp | 30 + .../croatoan-20191227-git/src/shape.lisp | 193 + .../croatoan-20191227-git/src/slk.lisp | 53 + .../croatoan-20191227-git/src/termattrs.lisp | 37 + .../croatoan-20191227-git/src/touch.lisp | 13 + .../croatoan-20191227-git/src/utf8.lisp | 350 + .../croatoan-20191227-git/src/util.lisp | 52 + .../croatoan-20191227-git/src/variables.lisp | 62 + .../croatoan-20191227-git/src/window.lisp | 39 + .../croatoan-20191227-git/src/wresize.lisp | 5 + .../croatoan-20191227-git/test/clos.lisp | 2878 +++ .../croatoan-20191227-git/test/evolution.lisp | 311 + .../croatoan-20191227-git/test/ncurses.lisp | 137 + .../croatoan-20191227-git/test/package.lisp | 127 + .../croatoan-20191227-git/test/tetris.lisp | 148 + .../croatoan-20191227-git/test/unicode.lisp | 116 + .../trivial-features-20190710-git/.travis.yml | 30 + .../trivial-features-20190710-git/COPYRIGHT | 21 + .../trivial-features-20190710-git/README.md | 32 + .../trivial-features-20190710-git/SPEC.md | 86 + .../release.lisp | 247 + .../src/tf-abcl.lisp | 46 + .../src/tf-allegro.lisp | 49 + .../src/tf-clasp.lisp | 36 + .../src/tf-clisp.lisp | 72 + .../src/tf-cmucl.lisp | 44 + .../src/tf-corman.lisp | 39 + .../src/tf-ecl.lisp | 55 + .../src/tf-lispworks.lisp | 58 + .../src/tf-mcl.lisp | 41 + .../src/tf-mezzano.lisp | 39 + .../src/tf-mkcl.lisp | 49 + .../src/tf-mocl.lisp | 40 + .../src/tf-openmcl.lisp | 47 + .../src/tf-sbcl.lisp | 51 + .../src/tf-scl.lisp | 47 + .../src/tf-xcl.lisp | 39 + .../tests/package.lisp | 34 + .../tests/sysinfo.lisp | 49 + .../tests/tests.lisp | 130 + .../tests/utsname.lisp | 36 + .../trivial-features-tests.asd | 52 + .../trivial-features.asd | 59 + sbcl/.quicklisp/tmp/release-install.tar | Bin 20480 -> 624640 bytes sbcl/.sbclrc | 8 + tmux/.tmux.conf | 15 +- vim/.vim/bindings.md | 9 + vim/.vimrc | 2 +- 361 files changed, 77302 insertions(+), 4 deletions(-) create mode 100644 sbcl/.quicklisp/dists/quicklisp/archives/babel-20191130-git.tgz create mode 100644 sbcl/.quicklisp/dists/quicklisp/archives/bordeaux-threads-v0.8.7.tgz create mode 100644 sbcl/.quicklisp/dists/quicklisp/archives/cffi_0.20.1.tgz create mode 100644 sbcl/.quicklisp/dists/quicklisp/archives/croatoan-20191227-git.tgz create mode 100644 sbcl/.quicklisp/dists/quicklisp/archives/trivial-features-20190710-git.tgz create mode 100644 sbcl/.quicklisp/dists/quicklisp/installed/releases/babel.txt create mode 100644 sbcl/.quicklisp/dists/quicklisp/installed/releases/bordeaux-threads.txt create mode 100644 sbcl/.quicklisp/dists/quicklisp/installed/releases/cffi.txt create mode 100644 sbcl/.quicklisp/dists/quicklisp/installed/releases/croatoan.txt create mode 100644 sbcl/.quicklisp/dists/quicklisp/installed/releases/trivial-features.txt create mode 100644 sbcl/.quicklisp/dists/quicklisp/installed/systems/babel-streams.txt create mode 100644 sbcl/.quicklisp/dists/quicklisp/installed/systems/babel-tests.txt create mode 100644 sbcl/.quicklisp/dists/quicklisp/installed/systems/babel.txt create mode 100644 sbcl/.quicklisp/dists/quicklisp/installed/systems/bordeaux-threads.txt create mode 100644 sbcl/.quicklisp/dists/quicklisp/installed/systems/cffi-examples.txt create mode 100644 sbcl/.quicklisp/dists/quicklisp/installed/systems/cffi-grovel.txt create mode 100644 sbcl/.quicklisp/dists/quicklisp/installed/systems/cffi-libffi.txt create mode 100644 sbcl/.quicklisp/dists/quicklisp/installed/systems/cffi-tests.txt create mode 100644 sbcl/.quicklisp/dists/quicklisp/installed/systems/cffi-toolchain.txt create mode 100644 sbcl/.quicklisp/dists/quicklisp/installed/systems/cffi-uffi-compat.txt create mode 100644 sbcl/.quicklisp/dists/quicklisp/installed/systems/cffi.txt create mode 100644 sbcl/.quicklisp/dists/quicklisp/installed/systems/croatoan-test.txt create mode 100644 sbcl/.quicklisp/dists/quicklisp/installed/systems/croatoan.txt create mode 100644 sbcl/.quicklisp/dists/quicklisp/installed/systems/trivial-features-tests.txt create mode 100644 sbcl/.quicklisp/dists/quicklisp/installed/systems/trivial-features.txt create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/.travis.yml create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/COPYRIGHT create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/HEADER create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/NOTES create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/README.md create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/babel-streams.asd create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/babel-tests.asd create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/babel.asd create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/doc/Makefile create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/doc/babel.texinfo create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/doc/license.texinfo create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/doc/macros.texinfo create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/scripts/release.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/src/enc-ascii.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/src/enc-cp1251.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/src/enc-cp1252.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/src/enc-ebcdic-int.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/src/enc-ebcdic.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/src/enc-gbk.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/src/enc-iso-8859.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/src/enc-jpn.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/src/enc-koi8.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/src/enc-unicode.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/src/encodings.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/src/external-format.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/src/gbk-map.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/src/jpn-table.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/src/packages.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/src/sharp-backslash.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/src/streams.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/src/strings.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/tests/ascii.txt create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/tests/ascii.txt-utf8 create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/tests/benchmarks.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/tests/ebcdic-us.txt create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/tests/ebcdic-us.txt-utf8 create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/tests/gen-test-files.sh create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/tests/streams.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/tests/tests.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/tests/utf-16-with-le-bom.txt create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/tests/utf-16.txt create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/tests/utf-16.txt-utf8 create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/tests/utf-32-with-le-bom.txt create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/tests/utf-32.txt create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/tests/utf-32.txt-utf8 create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/tests/utf-8.txt create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/tests/utf-8.txt-utf8 create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/.travis.yml create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/CONTRIBUTORS create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/LICENSE create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/README create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/bordeaux-threads.asd create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/site/index.html create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/site/style.css create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/src/bordeaux-threads.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/src/condition-variables.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/src/default-implementations.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/src/impl-abcl.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/src/impl-allegro.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/src/impl-clasp.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/src/impl-clisp.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/src/impl-clozure.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/src/impl-cmucl.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/src/impl-corman.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/src/impl-ecl.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/src/impl-genera.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/src/impl-lispworks-condition-variables.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/src/impl-lispworks.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/src/impl-mcl.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/src/impl-mkcl.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/src/impl-null.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/src/impl-sbcl.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/src/impl-scl.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/src/pkgdcl.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/test/bordeaux-threads-test.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/version.sexp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/.gitignore create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/.travis.yml create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/COPYRIGHT create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/HEADER create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/Makefile create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/README.md create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/TODO create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/cffi-examples.asd create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/cffi-grovel.asd create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/cffi-libffi.asd create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/cffi-tests.asd create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/cffi-toolchain.asd create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/cffi-uffi-compat.asd create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/cffi.asd create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/doc/Makefile create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/doc/allegro-internals.txt create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/doc/cffi-manual.texinfo create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/doc/cffi-sys-spec.texinfo create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/doc/colorize-lisp-examples.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/doc/gendocs.sh create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/doc/gendocs_template create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/doc/mem-vector.txt create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/doc/shareable-vectors.txt create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/doc/style.css create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/examples/examples.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/examples/gethostname.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/examples/gettimeofday.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/examples/grovel-example.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/examples/main-example.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/examples/mapping.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/examples/package.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/examples/run-examples.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/examples/translator-test.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/examples/wrapper-example.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/grovel/asdf.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/grovel/common.h create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/grovel/grovel.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/grovel/package.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/libffi/funcall.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/libffi/libffi-functions.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/libffi/libffi-types.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/libffi/libffi.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/libffi/type-descriptors.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/scripts/release.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/c2ffi/asdf.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/c2ffi/c2ffi.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/c2ffi/generator.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/c2ffi/package.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/cffi-abcl.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/cffi-allegro.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/cffi-clasp.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/cffi-clisp.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/cffi-cmucl.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/cffi-corman.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/cffi-ecl.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/cffi-gcl.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/cffi-lispworks.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/cffi-mcl.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/cffi-mkcl.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/cffi-openmcl.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/cffi-sbcl.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/cffi-scl.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/early-types.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/enum.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/features.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/foreign-vars.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/functions.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/libraries.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/package.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/strings.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/structures.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/types.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/utils.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/tests/GNUmakefile create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/tests/Makefile create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/tests/arrays.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/tests/bindings.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/tests/callbacks.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/tests/compile.bat create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/tests/defcfun.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/tests/enum.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/tests/foreign-globals.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/tests/fsbv.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/tests/funcall.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/tests/grovel.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/tests/libfsbv.c create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/tests/libtest.c create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/tests/libtest2.c create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/tests/memory.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/tests/misc-types.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/tests/misc.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/tests/package.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/tests/random-tester.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/tests/run-tests.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/tests/strings.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/tests/struct.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/tests/test-asdf.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/tests/test-static-link.sh create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/tests/union.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/toolchain/bundle.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/toolchain/c-toolchain.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/toolchain/package.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/toolchain/static-link.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/uffi-compat/uffi-compat.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/uffi-compat/uffi.asd create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/LICENSE create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/README create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/croatoan-test.asd create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/croatoan.asd create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/doc/slime.md create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/add_wch.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/addch.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/addstr.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/attr.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/beep.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/bkgd.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/bkgrnd.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/border.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/border_set.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/clear.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/color.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/default_colors.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/define_key.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/delch.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/deleteln.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/extend.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/get_wch.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/getcchar.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/getch.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/getstr.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/getyx.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/in_wch.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/inch.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/inchstr.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/initscr.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/inopts.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/ins_wch.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/insch.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/insstr.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/instr.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/inwstr.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/kernel.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/key_defined.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/keybound.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/legacy.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/legacy_coding.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/mouse.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/move.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/ncurses.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/opaque.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/outopts.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/package.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/pad.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/refresh.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/resizeterm.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/scroll.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/slk.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/termattrs.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/touch.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/util.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/variables.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/window.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/wresize.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/add_wch.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/addch.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/addstr.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/attr.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/beep.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/bkgd.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/bkgrnd.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/border.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/border_set.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/classes.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/clear.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/color.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/croatoan.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/default_colors.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/define_key.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/delch.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/deleteln.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/extend.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/form.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/get_wch.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/getch.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/getstr.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/getyx.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/gray_streams.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/in_wch.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/inch.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/inchstr.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/initscr.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/inopts.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/ins_wch.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/insch.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/insstr.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/instr.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/inwstr.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/kernel.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/key_defined.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/keybound.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/legacy.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/legacy_coding.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/menu.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/mouse.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/move.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/opaque.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/outopts.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/package.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/panel.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/queue.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/refresh.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/resizeterm.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/scroll.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/shape.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/slk.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/termattrs.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/touch.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/utf8.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/util.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/variables.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/window.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/wresize.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/test/clos.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/test/evolution.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/test/ncurses.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/test/package.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/test/tetris.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/test/unicode.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/.travis.yml create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/COPYRIGHT create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/README.md create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/SPEC.md create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/release.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/src/tf-abcl.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/src/tf-allegro.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/src/tf-clasp.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/src/tf-clisp.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/src/tf-cmucl.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/src/tf-corman.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/src/tf-ecl.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/src/tf-lispworks.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/src/tf-mcl.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/src/tf-mezzano.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/src/tf-mkcl.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/src/tf-mocl.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/src/tf-openmcl.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/src/tf-sbcl.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/src/tf-scl.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/src/tf-xcl.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/tests/package.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/tests/sysinfo.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/tests/tests.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/tests/utsname.lisp create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/trivial-features-tests.asd create mode 100644 sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/trivial-features.asd diff --git a/sbcl/.quicklisp/dists/quicklisp/archives/babel-20191130-git.tgz b/sbcl/.quicklisp/dists/quicklisp/archives/babel-20191130-git.tgz new file mode 100644 index 0000000000000000000000000000000000000000..300b888728964d576f83540e9124e46d58a9d3f1 GIT binary patch literal 271183 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%0A2&f?am`xY&;t@pG3mnL#|W0}>R$+wj?lCM@r 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 fN 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 GfB^s^1Zv3u literal 0 HcmV?d00001 diff --git a/sbcl/.quicklisp/dists/quicklisp/archives/bordeaux-threads-v0.8.7.tgz b/sbcl/.quicklisp/dists/quicklisp/archives/bordeaux-threads-v0.8.7.tgz new file mode 100644 index 0000000000000000000000000000000000000000..4092858f6574c58e30e6f40a363dc73a6e3dbd10 GIT binary patch literal 21951 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 literal 0 HcmV?d00001 diff --git a/sbcl/.quicklisp/dists/quicklisp/archives/cffi_0.20.1.tgz b/sbcl/.quicklisp/dists/quicklisp/archives/cffi_0.20.1.tgz new file mode 100644 index 0000000000000000000000000000000000000000..3c2c22d3866bdc06a64cce442366d07bb22eb271 GIT binary patch literal 260119 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Π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%0A8$yZrxy~R{i;(`wE5rZ#j;n^d8@+KURL3?H7?zC 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 >Oy0x9Q_ECMAbzXv^ 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%0AxPPuI2@G#D-vSb6&OhUk->sxh$-)QhWU{Mst^ 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φ&Sd=Ha>2* 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∋ZuJL=PYM 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

h-U0 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 a_EkW;)s=;OrF#y1j4#`|^&Eo(BLe_&ODV4a literal 0 HcmV?d00001 diff --git a/sbcl/.quicklisp/dists/quicklisp/installed/releases/babel.txt b/sbcl/.quicklisp/dists/quicklisp/installed/releases/babel.txt new file mode 100644 index 0000000..1f5514f --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/installed/releases/babel.txt @@ -0,0 +1 @@ +dists/quicklisp/software/babel-20191130-git/ diff --git a/sbcl/.quicklisp/dists/quicklisp/installed/releases/bordeaux-threads.txt b/sbcl/.quicklisp/dists/quicklisp/installed/releases/bordeaux-threads.txt new file mode 100644 index 0000000..1259e13 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/installed/releases/bordeaux-threads.txt @@ -0,0 +1 @@ +dists/quicklisp/software/bordeaux-threads-v0.8.7/ diff --git a/sbcl/.quicklisp/dists/quicklisp/installed/releases/cffi.txt b/sbcl/.quicklisp/dists/quicklisp/installed/releases/cffi.txt new file mode 100644 index 0000000..2581831 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/installed/releases/cffi.txt @@ -0,0 +1 @@ +dists/quicklisp/software/cffi_0.20.1/ diff --git a/sbcl/.quicklisp/dists/quicklisp/installed/releases/croatoan.txt b/sbcl/.quicklisp/dists/quicklisp/installed/releases/croatoan.txt new file mode 100644 index 0000000..88bb748 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/installed/releases/croatoan.txt @@ -0,0 +1 @@ +dists/quicklisp/software/croatoan-20191227-git/ diff --git a/sbcl/.quicklisp/dists/quicklisp/installed/releases/trivial-features.txt b/sbcl/.quicklisp/dists/quicklisp/installed/releases/trivial-features.txt new file mode 100644 index 0000000..f478159 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/installed/releases/trivial-features.txt @@ -0,0 +1 @@ +dists/quicklisp/software/trivial-features-20190710-git/ diff --git a/sbcl/.quicklisp/dists/quicklisp/installed/systems/babel-streams.txt b/sbcl/.quicklisp/dists/quicklisp/installed/systems/babel-streams.txt new file mode 100644 index 0000000..a87924e --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/installed/systems/babel-streams.txt @@ -0,0 +1 @@ +dists/quicklisp/software/babel-20191130-git/babel-streams.asd diff --git a/sbcl/.quicklisp/dists/quicklisp/installed/systems/babel-tests.txt b/sbcl/.quicklisp/dists/quicklisp/installed/systems/babel-tests.txt new file mode 100644 index 0000000..dffcd0e --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/installed/systems/babel-tests.txt @@ -0,0 +1 @@ +dists/quicklisp/software/babel-20191130-git/babel-tests.asd diff --git a/sbcl/.quicklisp/dists/quicklisp/installed/systems/babel.txt b/sbcl/.quicklisp/dists/quicklisp/installed/systems/babel.txt new file mode 100644 index 0000000..a3bbc5a --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/installed/systems/babel.txt @@ -0,0 +1 @@ +dists/quicklisp/software/babel-20191130-git/babel.asd diff --git a/sbcl/.quicklisp/dists/quicklisp/installed/systems/bordeaux-threads.txt b/sbcl/.quicklisp/dists/quicklisp/installed/systems/bordeaux-threads.txt new file mode 100644 index 0000000..39327ae --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/installed/systems/bordeaux-threads.txt @@ -0,0 +1 @@ +dists/quicklisp/software/bordeaux-threads-v0.8.7/bordeaux-threads.asd diff --git a/sbcl/.quicklisp/dists/quicklisp/installed/systems/cffi-examples.txt b/sbcl/.quicklisp/dists/quicklisp/installed/systems/cffi-examples.txt new file mode 100644 index 0000000..96b10d4 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/installed/systems/cffi-examples.txt @@ -0,0 +1 @@ +dists/quicklisp/software/cffi_0.20.1/cffi-examples.asd diff --git a/sbcl/.quicklisp/dists/quicklisp/installed/systems/cffi-grovel.txt b/sbcl/.quicklisp/dists/quicklisp/installed/systems/cffi-grovel.txt new file mode 100644 index 0000000..b10784b --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/installed/systems/cffi-grovel.txt @@ -0,0 +1 @@ +dists/quicklisp/software/cffi_0.20.1/cffi-grovel.asd diff --git a/sbcl/.quicklisp/dists/quicklisp/installed/systems/cffi-libffi.txt b/sbcl/.quicklisp/dists/quicklisp/installed/systems/cffi-libffi.txt new file mode 100644 index 0000000..ada9d02 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/installed/systems/cffi-libffi.txt @@ -0,0 +1 @@ +dists/quicklisp/software/cffi_0.20.1/cffi-libffi.asd diff --git a/sbcl/.quicklisp/dists/quicklisp/installed/systems/cffi-tests.txt b/sbcl/.quicklisp/dists/quicklisp/installed/systems/cffi-tests.txt new file mode 100644 index 0000000..14e7c79 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/installed/systems/cffi-tests.txt @@ -0,0 +1 @@ +dists/quicklisp/software/cffi_0.20.1/cffi-tests.asd diff --git a/sbcl/.quicklisp/dists/quicklisp/installed/systems/cffi-toolchain.txt b/sbcl/.quicklisp/dists/quicklisp/installed/systems/cffi-toolchain.txt new file mode 100644 index 0000000..ca8d287 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/installed/systems/cffi-toolchain.txt @@ -0,0 +1 @@ +dists/quicklisp/software/cffi_0.20.1/cffi-toolchain.asd diff --git a/sbcl/.quicklisp/dists/quicklisp/installed/systems/cffi-uffi-compat.txt b/sbcl/.quicklisp/dists/quicklisp/installed/systems/cffi-uffi-compat.txt new file mode 100644 index 0000000..667c8f5 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/installed/systems/cffi-uffi-compat.txt @@ -0,0 +1 @@ +dists/quicklisp/software/cffi_0.20.1/cffi-uffi-compat.asd diff --git a/sbcl/.quicklisp/dists/quicklisp/installed/systems/cffi.txt b/sbcl/.quicklisp/dists/quicklisp/installed/systems/cffi.txt new file mode 100644 index 0000000..4d0cec7 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/installed/systems/cffi.txt @@ -0,0 +1 @@ +dists/quicklisp/software/cffi_0.20.1/cffi.asd diff --git a/sbcl/.quicklisp/dists/quicklisp/installed/systems/croatoan-test.txt b/sbcl/.quicklisp/dists/quicklisp/installed/systems/croatoan-test.txt new file mode 100644 index 0000000..62799e0 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/installed/systems/croatoan-test.txt @@ -0,0 +1 @@ +dists/quicklisp/software/croatoan-20191227-git/croatoan-test.asd diff --git a/sbcl/.quicklisp/dists/quicklisp/installed/systems/croatoan.txt b/sbcl/.quicklisp/dists/quicklisp/installed/systems/croatoan.txt new file mode 100644 index 0000000..bdcd772 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/installed/systems/croatoan.txt @@ -0,0 +1 @@ +dists/quicklisp/software/croatoan-20191227-git/croatoan.asd diff --git a/sbcl/.quicklisp/dists/quicklisp/installed/systems/trivial-features-tests.txt b/sbcl/.quicklisp/dists/quicklisp/installed/systems/trivial-features-tests.txt new file mode 100644 index 0000000..bd553fa --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/installed/systems/trivial-features-tests.txt @@ -0,0 +1 @@ +dists/quicklisp/software/trivial-features-20190710-git/trivial-features-tests.asd diff --git a/sbcl/.quicklisp/dists/quicklisp/installed/systems/trivial-features.txt b/sbcl/.quicklisp/dists/quicklisp/installed/systems/trivial-features.txt new file mode 100644 index 0000000..91f4fab --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/installed/systems/trivial-features.txt @@ -0,0 +1 @@ +dists/quicklisp/software/trivial-features-20190710-git/trivial-features.asd diff --git a/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/.travis.yml b/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/.travis.yml new file mode 100644 index 0000000..7460681 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/.travis.yml @@ -0,0 +1,31 @@ +language: lisp + +env: + matrix: + - LISP=abcl + - LISP=allegro + - LISP=sbcl + - LISP=sbcl32 + - LISP=ccl + - LISP=ccl32 + - LISP=clisp + - LISP=clisp32 + - LISP=cmucl + - LISP=ecl + +matrix: + allow_failures: + - env: LISP=cmucl + - env: LISP=ecl + +install: + - curl -L https://github.com/luismbo/cl-travis/raw/master/install.sh | sh + - git clone --depth=1 git://github.com/trivial-features/trivial-features.git ~/lisp/trivial-features + - git clone https://gitlab.common-lisp.net/alexandria/alexandria.git ~/lisp/alexandria + +script: + - cl -e '(ql:quickload :babel-tests) + (unless (babel-tests:run) + (uiop:quit 1))' + +sudo: required diff --git a/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/COPYRIGHT b/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/COPYRIGHT new file mode 100644 index 0000000..029c569 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/COPYRIGHT @@ -0,0 +1,20 @@ +Copyright (C) 2007, Luis Oliveira + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/HEADER b/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/HEADER new file mode 100644 index 0000000..6687549 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/HEADER @@ -0,0 +1,27 @@ +;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- +;;; +;;; filename --- description +;;; +;;; Copyright (C) 2007, Luis Oliveira +;;; +;;; Permission is hereby granted, free of charge, to any person +;;; obtaining a copy of this software and associated documentation +;;; files (the "Software"), to deal in the Software without +;;; restriction, including without limitation the rights to use, copy, +;;; modify, merge, publish, distribute, sublicense, and/or sell copies +;;; of the Software, and to permit persons to whom the Software is +;;; furnished to do so, subject to the following conditions: +;;; +;;; The above copyright notice and this permission notice shall be +;;; included in all copies or substantial portions of the Software. +;;; +;;; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +;;; EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +;;; MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +;;; NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +;;; HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +;;; WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +;;; OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +;;; DEALINGS IN THE SOFTWARE. + + diff --git a/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/NOTES b/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/NOTES new file mode 100644 index 0000000..47105d5 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/NOTES @@ -0,0 +1,34 @@ +====================================== +LIST OF IDEAS AND TODO ITEMS FOR BABEL + + * VERY IMPORTANT: given that we steal a lot of code from OpenMCL we + probably to license those files under the LLGPL (or is it the + whole library?) Figure this out ASAP. + + * Many more tests needed. + - test invalid sequences. + - use more interesting test files. + - test with big strings that when converted would need a array + with more than array-index-limit elements. + + * Add support for ennforcing endiannes for multi-byte encodings like + UTF-16 and UTF-32. + + * Implement more encodings. (ISO-8859-*, windows, CJK encodings, etc) + + * null-termination, bom-markers. Add to string-to-octets. + + * Unicode normalization routines? + + * Allow for non-fixnum indexes? + + * Documentation. + + * Address the various XXX and TODO items in the source. + + * Should we start adding a lot of encodings, a load-on-demand scheme + might come in handy. It would also help with debugging. + + * Make the test suite reusable, very much like mappings are reusable. + + * Make the whole thing easier to debug. diff --git a/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/README.md b/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/README.md new file mode 100644 index 0000000..76d64e7 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/README.md @@ -0,0 +1,19 @@ +[![Build Status](https://travis-ci.org/cl-babel/babel.svg?branch=master)](https://travis-ci.org/cl-babel/babel) + +Babel is a charset encoding/decoding library, not unlike GNU libiconv, +but completely written in Common Lisp. + +It strives to achieve decent performance. To that effect, we use +OpenMCL's approach of calculating the destination buffer size in +advance. Most of the encoding/decoding algorithms have been adapted +from OpenMCL's source. + +Another important goal is reusability. Similarly to SBCL, we define +an interface wherein the algorithms can be reused between a variety of +data types so long we're dealing with conversions between octets and +unicode code points. + +Babel comes with converters between strings and (unsigned-byte 8) +vectors but can be easily extended to deal with, e.g., strings and +foreign memory, vectors and Closure's runes, etc... + diff --git a/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/babel-streams.asd b/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/babel-streams.asd new file mode 100644 index 0000000..8a5cac0 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/babel-streams.asd @@ -0,0 +1,38 @@ +;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- +;;; +;;; babel-streams.asd --- ASDF system definition for Babel streams. +;;; +;;; Copyright (C) 2008, Attila Lendvai +;;; +;;; Permission is hereby granted, free of charge, to any person +;;; obtaining a copy of this software and associated documentation +;;; files (the "Software"), to deal in the Software without +;;; restriction, including without limitation the rights to use, copy, +;;; modify, merge, publish, distribute, sublicense, and/or sell copies +;;; of the Software, and to permit persons to whom the Software is +;;; furnished to do so, subject to the following conditions: +;;; +;;; The above copyright notice and this permission notice shall be +;;; included in all copies or substantial portions of the Software. +;;; +;;; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +;;; EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +;;; MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +;;; NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +;;; HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +;;; WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +;;; OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +;;; DEALINGS IN THE SOFTWARE. + +(defsystem :babel-streams + :description "Some useful streams based on Babel's encoding code" + :author ("Dr. Edmund Weitz" + "Attila Lendvai ") + :version "0.1.0" + :licence "MIT" + :depends-on (:babel :alexandria :trivial-gray-streams) + :components + ((:module "src" + :serial t + :components + ((:file "streams"))))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/babel-tests.asd b/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/babel-tests.asd new file mode 100644 index 0000000..9c1eed0 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/babel-tests.asd @@ -0,0 +1,42 @@ +;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- +;;; +;;; babel-tests.asd --- ASDF system definition for Babel unit tests. +;;; +;;; Copyright (C) 2007, Luis Oliveira +;;; +;;; Permission is hereby granted, free of charge, to any person +;;; obtaining a copy of this software and associated documentation +;;; files (the "Software"), to deal in the Software without +;;; restriction, including without limitation the rights to use, copy, +;;; modify, merge, publish, distribute, sublicense, and/or sell copies +;;; of the Software, and to permit persons to whom the Software is +;;; furnished to do so, subject to the following conditions: +;;; +;;; The above copyright notice and this permission notice shall be +;;; included in all copies or substantial portions of the Software. +;;; +;;; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +;;; EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +;;; MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +;;; NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +;;; HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +;;; WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +;;; OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +;;; DEALINGS IN THE SOFTWARE. + +(defsystem babel-tests + :description "Unit tests for Babel." + :depends-on (babel hu.dwim.stefil) + :components + ((:module "tests" + :serial t + :components + ((:file "tests"))))) + +(defmethod perform ((o test-op) (c (eql (find-system :babel-tests)))) + (funcall (intern (string '#:run) '#:babel-tests))) + +(defmethod operation-done-p ((o test-op) (c (eql (find-system :babel-tests)))) + nil) + +;;; vim: ft=lisp et diff --git a/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/babel.asd b/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/babel.asd new file mode 100644 index 0000000..abb8885 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/babel.asd @@ -0,0 +1,59 @@ +;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- +;;; +;;; babel.asd --- ASDF system definition for Babel. +;;; +;;; Copyright (C) 2007, Luis Oliveira +;;; +;;; Permission is hereby granted, free of charge, to any person +;;; obtaining a copy of this software and associated documentation +;;; files (the "Software"), to deal in the Software without +;;; restriction, including without limitation the rights to use, copy, +;;; modify, merge, publish, distribute, sublicense, and/or sell copies +;;; of the Software, and to permit persons to whom the Software is +;;; furnished to do so, subject to the following conditions: +;;; +;;; The above copyright notice and this permission notice shall be +;;; included in all copies or substantial portions of the Software. +;;; +;;; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +;;; EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +;;; MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +;;; NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +;;; HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +;;; WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +;;; OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +;;; DEALINGS IN THE SOFTWARE. + +(defsystem babel + :description "Babel, a charset conversion library." + :author "Luis Oliveira " + :licence "MIT" + :depends-on (trivial-features alexandria) + :components + ((:module src + :serial t + :components + ((:file "packages") + (:file "encodings") + (:file "enc-ascii") + (:file "enc-ebcdic") + (:file "enc-ebcdic-int") + (:file "enc-iso-8859") + (:file "enc-unicode") + (:file "enc-cp1251") + (:file "enc-cp1252") + (:file "jpn-table") + (:file "enc-jpn") + (:file "enc-gbk") + (:file "enc-koi8") + (:file "external-format") + (:file "strings") + (:file "gbk-map") + (:file "sharp-backslash"))))) + +(defmethod perform ((o test-op) (c (eql (find-system :babel)))) + (operate 'load-op :babel-tests) + (operate 'test-op :babel-tests)) + +(defmethod operation-done-p ((o test-op) (c (eql (find-system :babel)))) + nil) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/doc/Makefile b/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/doc/Makefile new file mode 100644 index 0000000..5446d3c --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/doc/Makefile @@ -0,0 +1,31 @@ +# -*- Mode: Makefile; tab-width: 4; indent-tabs-mode: t -*- + +MANUAL := "babel" +SYSTEM := "babel" +PACKAGES := babel babel-encodings +TITLE := "Babel Manual" +CSS := "default" + +export LISP ?= sbcl +export SBCL_OPTIONS ?= --noinform + +.PHONY: all clean html pdf upload + +all: + texinfo-docstrings all $(SYSTEM) $(MANUAL) $(TITLE) $(CSS) $(PACKAGES) + +pdf: + texinfo-docstrings pdf $(SYSTEM) $(MANUAL) $(TITLE) $(CSS) $(PACKAGES) + +html: + texinfo-docstrings html $(SYSTEM) $(MANUAL) $(TITLE) $(CSS) $(PACKAGES) + +upload: +# rsync -av --delete -e ssh manual common-lisp.net:/project/FOO/public_html/ +# scp -r manual common-lisp.net:/project/cffi/public_html/ + +clean: + find . \( -name "*.pdf" -o -name "*.html" -o -name "*.info" -o -name "*.aux" -o -name "*.cp" -o -name "*.fn" -o -name "*.fns" -o -name "*.ky" -o -name "*.log" -o -name "*.pg" -o -name "*.toc" -o -name "*.tp" -o -name "*.vr" -o -name "*.dvi" -o -name "*.cps" -o -name "*.vrs" \) -exec rm {} \; + rm -rf include manual + +# vim: ft=make ts=4 noet diff --git a/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/doc/babel.texinfo b/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/doc/babel.texinfo new file mode 100644 index 0000000..efdc5dc --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/doc/babel.texinfo @@ -0,0 +1,105 @@ +\input texinfo @c -*-texinfo-*- +@c %**start of header +@setfilename babel.info +@settitle Babel Manual + +@c @exampleindent 2 +@c @documentencoding utf-8 + +@c %**end of header + +@c for install-info +@c @dircategory %%INFO-CATEGORY%% +@c @direntry +@c * babel: %%PROJECT-DESCRIPTION%% +@c @end direntry + +@include macros.texinfo + +@c Show types, functions, and concepts in the same index. +@syncodeindex tp cp +@syncodeindex fn cp + +@copying +@c Copyright @copyright{} 2084 John Doe + +@include license.texinfo +@end copying + +@titlepage +@title Babel Manual +@subtitle draft version +@c @author John Doe +@page +@vskip 0pt plus 1filll +@insertcopying +@end titlepage + +@contents + +@ifnottex +@node Top +@top babel +@insertcopying +@end ifnottex + +@c Top Menu +@menu +* First Chapter:: +* Comprehensive Index:: +@end menu + +@node First Chapter +@chapter First Chapter + +Bla bla bla, bla bla bla. + +@section Conditions + +@include include/condition-babel-character-out-of-range.texinfo +@include include/condition-babel-encodings-character-out-of-range.texinfo +@include include/condition-babel-encodings-end-of-input-in-character.texinfo +@include include/condition-babel-encodings-invalid-utf8-continuation-byte.texinfo +@include include/condition-babel-encodings-invalid-utf8-starter-byte.texinfo +@include include/condition-babel-encodings-overlong-utf8-sequence.texinfo +@include include/condition-babel-end-of-input-in-character.texinfo +@include include/condition-babel-invalid-utf8-continuation-byte.texinfo +@include include/condition-babel-invalid-utf8-starter-byte.texinfo +@include include/condition-babel-overlong-utf8-sequence.texinfo +@include include/constant-babel-unicode-char-code-limit.texinfo + +@section More stuff + +@include include/fun-babel-encodings-get-character-encoding.texinfo +@include include/fun-babel-encodings-list-character-encodings.texinfo +@include include/fun-babel-encodings-lookup-mapping.texinfo +@include include/fun-babel-list-character-encodings.texinfo +@include include/macro-babel-encodings-with-checked-simple-vector.texinfo +@include include/macro-babel-encodings-with-simple-vector.texinfo +@include include/type-babel-simple-unicode-string.texinfo +@include include/type-babel-unicode-char.texinfo +@include include/type-babel-unicode-string.texinfo +@include include/var-babel-encodings-star-default-character-encoding-star.texinfo +@include include/var-babel-encodings-star-suppress-character-coding-errors-star.texinfo +@include include/var-babel-star-default-character-encoding-star.texinfo +@include include/var-babel-star-default-eol-style-star.texinfo + +@c @include include/fun-somepackage-somefunction.texinfo +@c @include include/macro-somepackage-somemacro.texinfo + +@c @node First Section +@c @section First Section + +@c @include include/fun-somepackage-somefunction.texinfo +@c @include include/fun-somepackage-somefunction.texinfo + + + +@c We call this node ``Comprehensive Index'' so that texinfo's HTML +@c output doesn't generate an index.html that'd overwrite the manual's +@c initial page. +@node Comprehensive Index +@unnumbered Index +@printindex cp + +@bye diff --git a/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/doc/license.texinfo b/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/doc/license.texinfo new file mode 100644 index 0000000..2835843 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/doc/license.texinfo @@ -0,0 +1,20 @@ +@quotation +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +``Software''), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +@sc{The software is provided ``as is'', without warranty of any kind, +express or implied, including but not limited to the warranties of +merchantability, fitness for a particular purpose and noninfringement. +In no event shall the authors or copyright holders be liable for any +claim, damages or other liability, whether in an action of contract, +tort or otherwise, arising from, out of or in connection with the +software or the use or other dealings in the software.} +@end quotation diff --git a/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/doc/macros.texinfo b/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/doc/macros.texinfo new file mode 100644 index 0000000..95f47cf --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/doc/macros.texinfo @@ -0,0 +1,27 @@ +@c Some plain TeX macrology to wrap text in \hbox{} only if the text +@c contains no hyphens. +@iftex +@tex +\newif\ifdash +\long\def\dashp#1{\expandafter\setnext#1-\dashphelper} +\long\def\setnext#1-{\futurelet\next\dashphelper} +\long\def\dashphelper#1\dashphelper{ + \ifx\dashphelper\next\dashfalse\else\dashtrue\fi +} +\def\lw#1{\leavevmode\dashp{#1}\ifdash#1\else\hbox{#1}\fi} +@end tex +@end iftex + +@c A Texinfo binding for the plain TeX above. Analogous to Texinfo's +@c @w, but for Lisp symbols. AFAICT, the comment characters are +@c necessary to prevent treating the newline as a space. +@macro lw{word} +@iftex +@tex +\\lw{\word\}% +@end tex +@end iftex +@ifnottex +\word\@c +@end ifnottex +@end macro diff --git a/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/scripts/release.lisp b/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/scripts/release.lisp new file mode 100644 index 0000000..80308d0 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/scripts/release.lisp @@ -0,0 +1,250 @@ +#!/usr/bin/env clisp +;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- + +(defpackage :release-script (:use #:cl #:regexp)) +(in-package :release-script) + +;;;; Configuration ------------------------------------------------------------ + +(defparameter *project-name* "babel") +(defparameter *asdf-file* (format nil "~A.asd" *project-name*)) + +(defparameter *host* "common-lisp.net") +(defparameter *release-dir* + (format nil "/project/~A/public_html/releases" *project-name*)) + +(defparameter *version-file* "VERSION") +(defparameter *version-file-dir* + (format nil "/project/~A/public_html" *project-name*)) + +;;;; -------------------------------------------------------------------------- + +;;;; Utilities + +(defun ensure-list (x) + (if (listp x) x (list x))) + +(defmacro string-case (expression &body clauses) + `(let ((it ,expression)) ; yes, anaphoric, deal with it. + (cond + ,@(loop for clause in clauses collect + `((or ,@(loop for alternative in (ensure-list (first clause)) + collect (or (eq t alternative) + `(string= it ,alternative)))) + ,@(rest clause)))))) + +(defparameter *development-mode* nil) + +(defun die (format-control &rest format-args) + (format *error-output* "~?" format-control format-args) + (if *development-mode* + (cerror "continue" "die") + (ext:quit 1))) + +(defun numeric-split (string) + (if (digit-char-p (char string 0)) + (multiple-value-bind (number next-position) + (parse-integer string :junk-allowed t) + (cons number (when (< next-position (length string)) + (numeric-split (subseq string next-position))))) + (let ((next-digit-position (position-if #'digit-char-p string))) + (if next-digit-position + (cons (subseq string 0 next-digit-position) + (numeric-split (subseq string next-digit-position))) + (list string))))) + +(defun natural-string-< (s1 s2) + (labels ((aux< (l1 l2) + (cond ((null l1) (not (null l2))) + ((null l2) nil) + (t (destructuring-bind (x . xs) l1 + (destructuring-bind (y . ys) l2 + (cond ((and (numberp x) (stringp y)) + t) + ((and (numberp y) (stringp x)) + nil) + ((and (numberp x) (numberp y)) + (or (< x y) (and (= x y) (aux< xs ys)))) + (t + (or (string-lessp x y) + (and (string-equal x y) + (aux< xs ys))))))))))) + (aux< (numeric-split s1) + (numeric-split s2)))) + +;;;; Running commands + +(defparameter *dry-run* nil) + +(defun cmd? (format-control &rest format-args) + (let ((cmd (format nil "~?" format-control format-args))) + (with-open-stream (s1 (ext:run-shell-command cmd :output :stream)) + (loop for line = (read-line s1 nil nil) + while line + collect line)))) + +;; XXX: quote arguments. +(defun cmd (format-control &rest format-args) + (when *development-mode* + (format *debug-io* "CMD: ~?~%" format-control format-args)) + (let ((ret (ext:run-shell-command (format nil "~?" format-control format-args)))) + (or (null ret) + (zerop ret)))) + +(defun cmd! (format-control &rest format-args) + (or (apply #'cmd format-control format-args) + (die "cmd '~?' failed." format-control format-args))) + +(defun maybe-cmd! (format-control &rest format-args) + (if *dry-run* + (format t "SUPPRESSING: ~?~%" format-control format-args) + (apply #'cmd! format-control format-args))) + +;;;; + +(defun find-current-version () + (subseq (reduce (lambda (x y) (if (natural-string-< x y) y x)) + (or (cmd? "git tag -l v\\*") + (die "no version tags found. Please specify initial version."))) + 1)) + +(defun parse-version (string) + (mapcar (lambda (x) + (parse-integer x :junk-allowed t)) + (loop repeat 3 ; XXX: parameterize + for el in (regexp-split "\\." (find-current-version)) + collect el))) + +(defun check-for-unrecorded-changes (&optional force) + (unless (cmd "git diff --exit-code") + (write-line "Unrecorded changes.") + (if force + (write-line "Continuing anyway.") + (die "Aborting.~@ + Use -f or --force if you want to make a release anyway.")))) + +(defun new-version-number-candidates (current-version) + (let ((current-version (parse-version current-version))) + (labels ((alternatives (before after) + (when after + (cons (append before (list (1+ (first after))) + (mapcar (constantly 0) (rest after))) + (alternatives (append before (list (first after))) + (rest after)))))) + (loop for alt in (alternatives nil current-version) + collect (reduce (lambda (acc next) + (format nil "~a.~a" acc next)) + alt))))) + +(defun ask-user-for-version (current-version next-versions) + (format *query-io* "Current version is ~A. Which will be the next one?~%" + current-version) + (loop for i from 1 and version in next-versions + do (format *query-io* "~T~A) ~A~%" i version)) + (format *query-io* "? ") + (finish-output *query-io*) + (nth (1- (parse-integer (read-line) :junk-allowed t)) + next-versions)) + +(defun git-tag-tree (version) + (write-line "Tagging the tree...") + (maybe-cmd! "git tag \"v~A\"" version)) + +(defun add-version-to-system-file (version path-in path-out) + (with-open-file (in path-in :direction :input) + (with-open-file (out path-out :direction :output) + (loop for line = (read-line in nil nil) while line + do (write-line line out) + when (string= #1="(defsystem " line + :end2 (min (length #1#) (length line))) + do (format out " :version ~s~%" version))))) + +(defun create-dist (version distname) + (write-line "Creating distribution...") + (cmd! "mkdir \"~a\"" distname) + (cmd! "git archive master | tar xC \"~A\"" distname) + (format t "Updating ~A with new version: ~A~%" *asdf-file* version) + (let* ((asdf-file-path (format nil "~A/~A" distname *asdf-file*)) + (tmp-asdf-file-path (format nil "~a.tmp" asdf-file-path))) + (add-version-to-system-file version asdf-file-path tmp-asdf-file-path) + (cmd! "mv \"~a\" \"~a\"" tmp-asdf-file-path asdf-file-path))) + +(defun tar-and-sign (distname tarball) + (write-line "Creating and signing tarball...") + (cmd! "tar czf \"~a\" \"~a\"" tarball distname) + (cmd! "gpg -b -a \"~a\"" tarball)) + +(defparameter *remote-directory* (format nil "~A:~A" *host* *release-dir*)) + +(defun upload-tarball (tarball signature remote-directory) + (write-line "Copying tarball to web server...") + (maybe-cmd! "scp \"~A\" \"~A\" \"~A\"" tarball signature remote-directory) + (format t "Uploaded ~A and ~A.~%" tarball signature)) + +(defun update-remote-links (tarball signature host release-dir project-name) + (format t "Updating ~A_latest links...~%" project-name) + (maybe-cmd! "ssh \"~A\" ln -sf \"~A\" \"~A/~A_latest.tar.gz\"" + host tarball release-dir project-name) + (maybe-cmd! "ssh \"~A\" ln -sf \"~A\" \"~A/~A_latest.tar.gz.asc\"" + host signature release-dir project-name)) + +(defun upload-version-file (version version-file host version-file-dir) + (format t "Uploading ~A...~%" version-file) + (with-open-file (out version-file :direction :output) + (write-string version out)) + (maybe-cmd! "scp \"~A\" \"~A\":\"~A\"" version-file host version-file-dir) + (maybe-cmd! "rm \"~A\"" version-file)) + +(defun maybe-clean-things-up (tarball signature) + (when (y-or-n-p "Clean local tarball and signature?") + (cmd! "rm \"~A\" \"~A\"" tarball signature))) + +(defun run (force version) + (check-for-unrecorded-changes force) + ;; figure out what version we'll be preparing. + (unless version + (let* ((current-version (find-current-version)) + (next-versions (new-version-number-candidates current-version))) + (setf version (or (ask-user-for-version current-version next-versions) + (die "invalid selection."))))) + (git-tag-tree version) + (let* ((distname (format nil "~A_~A" *project-name* version)) + (tarball (format nil "~A.tar.gz" distname)) + (signature (format nil "~A.asc" tarball))) + ;; package things up. + (create-dist version distname) + (tar-and-sign distname tarball) + ;; upload. + (upload-tarball tarball signature *remote-directory*) + (update-remote-links tarball signature *host* *release-dir* *project-name*) + (when *version-file* + (upload-version-file version *version-file* *host* *version-file-dir*)) + ;; clean up. + (maybe-clean-things-up tarball signature) + ;; documentation. + ;; (write-line "Building and uploading documentation...") + ;; (maybe-cmd! "make -C doc upload-docs") + ;; push tags and any outstanding changes. + (write-line "Pushing tags and changes...") + (maybe-cmd! "git push --tags origin master"))) + + +;;;; Do it to it + +(let ((force nil) + (version nil) + (args ext:*args*)) + (loop while args + do (string-case (pop args) + (("-h" "--help") + (write-line "No help, sorry. Read the source.") + (ext:quit 0)) + (("-f" "--force") + (setf force t)) + (("-v" "--version") + (setf version (pop args))) + (("-n" "--dry-run") + (setf *dry-run* t)) + (t + (die "Unrecognized argument '~a'" it)))) + (run force version)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/src/enc-ascii.lisp b/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/src/enc-ascii.lisp new file mode 100644 index 0000000..dd26d13 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/src/enc-ascii.lisp @@ -0,0 +1,43 @@ +;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- +;;; +;;; enc-ascii.lisp --- Implementation of the ASCII character encoding. +;;; +;;; Copyright (C) 2007, Luis Oliveira +;;; +;;; Permission is hereby granted, free of charge, to any person +;;; obtaining a copy of this software and associated documentation +;;; files (the "Software"), to deal in the Software without +;;; restriction, including without limitation the rights to use, copy, +;;; modify, merge, publish, distribute, sublicense, and/or sell copies +;;; of the Software, and to permit persons to whom the Software is +;;; furnished to do so, subject to the following conditions: +;;; +;;; The above copyright notice and this permission notice shall be +;;; included in all copies or substantial portions of the Software. +;;; +;;; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +;;; EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +;;; MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +;;; NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +;;; HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +;;; WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +;;; OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +;;; DEALINGS IN THE SOFTWARE. + +(in-package #:babel-encodings) + +(define-character-encoding :ascii + "A 7-bit, fixed-width character encoding in which all +character codes map to their Unicode equivalents." + :aliases '(:us-ascii) + :literal-char-code-limit 128) + +(define-unibyte-encoder :ascii (code) + (if (>= code 128) + (handle-error) + code)) + +(define-unibyte-decoder :ascii (octet) + (if (>= octet 128) + (handle-error) + octet)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/src/enc-cp1251.lisp b/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/src/enc-cp1251.lisp new file mode 100644 index 0000000..8bcead0 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/src/enc-cp1251.lisp @@ -0,0 +1,119 @@ +;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- +;;; +;;; enc-cp1251.lisp --- Implementation of the CP1251 character encoding. +;;; +;;; Copyright (C) 2009, Andrey Moskvitin +;;; +;;; Permission is hereby granted, free of charge, to any person +;;; obtaining a copy of this software and associated documentation +;;; files (the "Software"), to deal in the Software without +;;; restriction, including without limitation the rights to use, copy, +;;; modify, merge, publish, distribute, sublicense, and/or sell copies +;;; of the Software, and to permit persons to whom the Software is +;;; furnished to do so, subject to the following conditions: +;;; +;;; The above copyright notice and this permission notice shall be +;;; included in all copies or substantial portions of the Software. +;;; +;;; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +;;; EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +;;; MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +;;; NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +;;; HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +;;; WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +;;; OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +;;; DEALINGS IN THE SOFTWARE. + +(in-package #:babel-encodings) + +(define-character-encoding :cp1251 + "An 8-bit, fixed-width character Russian encoding from Windows." + :aliases '(:windows-1251) + :literal-char-code-limit #x80) + +(define-constant +cp1251-to-unicode+ + #(;; #x80 + #x0402 #x0403 #x201a #x0453 #x201e #x2026 #x2020 #x2021 + #x20ac #x2030 #x0409 #x2039 #x040a #x040c #x040b #x040f + ;; #x90 + #x0452 #x2018 #x2019 #x201c #x201d #x2022 #x2013 #x2014 + #xfffd #x2122 #x0459 #x203a #x045a #x045c #x045b #x045f + ;; #xa0 + #x00a0 #x040e #x045e #x0408 #x00a4 #x0490 #x00a6 #x00a7 + #x0401 #x00a9 #x0404 #x00ab #x00ac #x00ad #x00ae #x0407 + ;; #xb0 + #x00b0 #x00b1 #x0406 #x0456 #x0491 #x00b5 #x00b6 #x00b7 + #x0451 #x2116 #x0454 #x00bb #x0458 #x0405 #x0455 #x0457 + ;; #xc0 + #x0410 #x0411 #x0412 #x0413 #x0414 #x0415 #x0416 #x0417 + #x0418 #x0419 #x041a #x041b #x041c #x041d #x041e #x041f + ;; #xd0 + #x0420 #x0421 #x0422 #x0423 #x0424 #x0425 #x0426 #x0427 + #x0428 #x0429 #x042a #x042b #x042c #x042d #x042e #x042f + ;; #xe0 + #x0430 #x0431 #x0432 #x0433 #x0434 #x0435 #x0436 #x0437 + #x0438 #x0439 #x043a #x043b #x043c #x043d #x043e #x043f + ;; #xf0 + #x0440 #x0441 #x0442 #x0443 #x0444 #x0445 #x0446 #x0447 + #x0448 #x0449 #x044a #x044b #x044c #x044d #x044e #x044f) + :test #'equalp) + +(define-unibyte-decoder :cp1251 (octet) + (if (< octet #x80) + octet + (svref +cp1251-to-unicode+ (the ub8 (- octet #x80))))) + +(define-constant +unicode-a0-bf-to-cp1251+ + #(#xa0 #x00 #x00 #x00 #xa4 #x00 #xa6 #xa7 ; #xa0-#xa7 + #x00 #xa9 #x00 #xab #xac #xad #xae #x00 ; #xa8-#xaf + #xb0 #xb1 #x00 #x00 #x00 #xb5 #xb6 #xb7 ; #xb0-#xb7 + #x00 #x00 #x00 #xbb #x00 #x00 #x00 #x00) ; #xb8-#xbf + :test #'equalp) + +(define-constant +unicode-0-97-to-cp1251+ + #(#x00 #xa8 #x80 #x81 #xaa #xbd #xb2 #xaf ; #x00-#x07 + #xa3 #x8a #x8c #x8e #x8d #x00 #xa1 #x8f ; #x08-#x0f + #xc0 #xc1 #xc2 #xc3 #xc4 #xc5 #xc6 #xc7 ; #x10-#x17 + #xc8 #xc9 #xca #xcb #xcc #xcd #xce #xcf ; #x18-#x1f + #xd0 #xd1 #xd2 #xd3 #xd4 #xd5 #xd6 #xd7 ; #x20-#x27 + #xd8 #xd9 #xda #xdb #xdc #xdd #xde #xdf ; #x28-#x2f + #xe0 #xe1 #xe2 #xe3 #xe4 #xe5 #xe6 #xe7 ; #x30-#x37 + #xe8 #xe9 #xea #xeb #xec #xed #xee #xef ; #x38-#x3f + #xf0 #xf1 #xf2 #xf3 #xf4 #xf5 #xf6 #xf7 ; #x40-#x47 + #xf8 #xf9 #xfa #xfb #xfc #xfd #xfe #xff ; #x48-#x4f + #x00 #xb8 #x90 #x83 #xba #xbe #xb3 #xbf ; #x50-#x57 + #xbc #x9a #x9c #x9e #x9d #x00 #xa2 #x9f ; #x58-#x5f + #x00 #x00 #x00 #x00 #x00 #x00 #x00 #x00 ; #x60-#x67 + #x00 #x00 #x00 #x00 #x00 #x00 #x00 #x00 ; #x68-#x6f + #x00 #x00 #x00 #x00 #x00 #x00 #x00 #x00 ; #x70-#x77 + #x00 #x00 #x00 #x00 #x00 #x00 #x00 #x00 ; #x78-#x7f + #x00 #x00 #x00 #x00 #x00 #x00 #x00 #x00 ; #x80-#x87 + #x00 #x00 #x00 #x00 #x00 #x00 #x00 #x00 ; #x88-#x8f + #xa5 #xb4 #x00 #x00 #x00 #x00 #x00 #x00) ; #x90-#x97 + :test #'equalp) + +(define-constant +unicode-10-3f-to-cp1251+ + #(#x00 #x00 #x00 #x96 #x97 #x00 #x00 #x00 ; #x10-#x17 + #x91 #x92 #x82 #x00 #x93 #x94 #x84 #x00 ; #x18-#x1f + #x86 #x87 #x95 #x00 #x00 #x00 #x85 #x00 ; #x20-#x27 + #x00 #x00 #x00 #x00 #x00 #x00 #x00 #x00 ; #x28-#x2f + #x89 #x00 #x00 #x00 #x00 #x00 #x00 #x00 ; #x30-#x37 + #x00 #x8b #x9b #x00 #x00 #x00 #x00 #x00) ; #x38-#x3f + :test #'equalp) + +(define-unibyte-encoder :cp1251 (code) + (cond + ((< code #x80) code) + ((and (>= code #xa0) (< code #xc0)) + (svref +unicode-a0-bf-to-cp1251+ + (the ub8 (- code #xa0)))) + ((and (>= code #x400) (< code #x498)) + (svref +unicode-0-97-to-cp1251+ + (the ub8 (- code #x400)))) + ((and (>= code #x2010) (< code #x2040)) + (svref +unicode-10-3f-to-cp1251+ + (the ub8 (- code #x2010)))) + ((= code #x20ac) #x88) + ((= code #x2116) #xb9) + ((= code #x2122) #x99) + (t (handle-error)))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/src/enc-cp1252.lisp b/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/src/enc-cp1252.lisp new file mode 100644 index 0000000..cae80d8 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/src/enc-cp1252.lisp @@ -0,0 +1,81 @@ +;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- +;;; +;;; enc-cp1252.lisp --- Implementation of the CP1252 character encoding. +;;; +;;; Copyright (C) 2011, Nicolas Martyanoff +;;; +;;; Permission is hereby granted, free of charge, to any person +;;; obtaining a copy of this software and associated documentation +;;; files (the "Software"), to deal in the Software without +;;; restriction, including without limitation the rights to use, copy, +;;; modify, merge, publish, distribute, sublicense, and/or sell copies +;;; of the Software, and to permit persons to whom the Software is +;;; furnished to do so, subject to the following conditions: +;;; +;;; The above copyright notice and this permission notice shall be +;;; included in all copies or substantial portions of the Software. +;;; +;;; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +;;; EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +;;; MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +;;; NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +;;; HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +;;; WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +;;; OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +;;; DEALINGS IN THE SOFTWARE. + +(in-package #:babel-encodings) + +(define-character-encoding :cp1252 + "A 8-bit, fixed-width character encoding used by Windows for Western + European languages." + :aliases '(:windows-1252) + :literal-char-code-limit 256) + +(define-constant +cp1252-to-unicode+ + #(#x20ac nil #x201a #x0192 #x201e #x2026 #x2020 #x2021 + #x02c6 #x2030 #x0160 #x2039 #x0152 nil #x017d nil + nil #x2018 #x2019 #x201c #x201d #x2022 #x2013 #x2014 + #x02dc #x2122 #x0161 #x203a #x0153 nil #x017e #x0178) + :test #'equalp) + +(define-unibyte-decoder :cp1252 (octet) + (if (and (>= octet #x80) (<= octet #x9f)) + (svref +cp1252-to-unicode+ + (the ub8 (- octet #x80))) + octet)) + +(define-constant +unicode-0152-017e-cp1252+ + #(#x8c #x9c #x00 #x00 #x00 #x00 #x00 #x00 + #x00 #x00 #x00 #x00 #x00 #x00 #x8a #x9a + #x00 #x00 #x00 #x00 #x00 #x00 #x00 #x00 + #x00 #x00 #x00 #x00 #x00 #x00 #x00 #x00 + #x00 #x00 #x00 #x00 #x00 #x00 #x9f #x00 + #x00 #x00 #x00 #x8e #x9e) + :test #'equalp) + +(define-constant +unicode-2013-203a-cp1252+ + #(#x96 #x97 #x00 #x00 #x00 #x91 #x92 #x82 + #x00 #x93 #x94 #x84 #x00 #x86 #x87 #x95 + #x00 #x00 #x00 #x85 #x00 #x00 #x00 #x00 + #x00 #x00 #x00 #x00 #x00 #x89 #x00 #x00 + #x00 #x00 #x00 #x00 #x00 #x00 #x8b #x9b) + :test #'equalp) + +(define-unibyte-encoder :cp1252 (code) + (cond + ((or (< code #x80) + (and (> code #xa0) (<= code #xff))) + code) + ((and (>= code #x0152) (<= code #x017e)) + (svref +unicode-0152-017e-cp1252+ + (the ub8 (- code #x0152)))) + ((= code #x0192) #x83) + ((= code #x02c6) #x88) + ((= code #x02dc) #x89) + ((and (>= code #x2013) (<= code #x203a)) + (svref +unicode-2013-203a-cp1252+ + (the ub8 (- code #x2013)))) + ((= code #x20ac) #x80) + ((= code #x2122) #x99) + (t (handle-error)))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/src/enc-ebcdic-int.lisp b/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/src/enc-ebcdic-int.lisp new file mode 100644 index 0000000..aa01572 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/src/enc-ebcdic-int.lisp @@ -0,0 +1,49 @@ +(in-package #:babel-encodings) + +(define-character-encoding :ebcdic-international + "An 8-bit, fixed-width character encoding from IBM.") + +(defparameter +ebcdic-int-to-unicode+ + #(0 1 2 3 156 9 134 127 151 141 142 11 12 13 14 15 16 17 18 19 157 133 8 135 + 24 25 146 143 28 29 30 31 128 129 130 65535 132 10 23 27 65535 65535 138 139 + 65535 5 6 7 65535 65535 22 65535 148 149 150 4 65535 65535 65535 155 20 21 + 65535 26 32 65535 65535 65535 65535 65535 65535 65535 65535 65535 91 46 60 + 40 43 33 38 65535 65535 65535 65535 65535 65535 65535 65535 65535 93 164 42 + 41 59 172 45 47 65535 65535 65535 65535 65535 65535 65535 65535 124 44 37 95 + 62 63 65535 65535 65535 65535 65535 65535 1102 1072 1073 96 58 35 64 39 61 + 34 1094 97 98 99 100 101 102 103 104 105 1076 1077 1092 1075 1093 1080 1081 + 106 107 108 109 110 111 112 113 114 1082 1083 1084 1085 1086 1087 1103 126 + 115 116 117 118 119 120 121 122 1088 1089 1090 1091 1078 1074 1100 1099 1079 + 1096 1101 1097 1095 1098 1070 1040 1041 1062 1044 1045 1060 1043 123 65 66 + 67 68 69 70 71 72 73 1061 1048 1049 1050 1051 1052 125 74 75 76 77 78 79 80 + 81 82 1053 1054 1055 1071 1056 1057 92 65535 83 84 85 86 87 88 89 90 1058 + 1059 1046 1042 1068 1067 48 49 50 51 52 53 54 55 56 57 1047 1064 1069 1065 + 1063 159)) + +(defparameter +unicode-upto-ac-ebcdic-int+ + #(0 1 2 3 55 45 46 47 22 5 37 11 12 13 14 15 16 17 18 19 60 61 50 38 24 25 63 + 39 28 29 30 31 64 79 127 123 0 108 80 125 77 93 92 78 107 96 75 97 240 241 + 242 243 244 245 246 247 248 249 122 94 76 126 110 111 124 193 194 195 196 + 197 198 199 200 201 209 210 211 212 213 214 215 216 217 226 227 228 229 230 + 231 232 233 74 224 90 0 109 121 129 130 131 132 133 134 135 136 137 145 146 + 147 148 149 150 151 152 153 162 163 164 165 166 167 168 169 192 106 208 161 + 7 32 33 34 0 36 21 6 23 0 0 42 43 0 9 10 27 0 0 26 0 52 53 54 8 0 0 0 59 4 + 20 0 255 0 0 0 0 91 0 0 0 0 0 0 0 95)) + +(defparameter +unicode-0410-0450-ebcdic-int+ + #(185 186 237 191 188 189 236 250 203 204 205 206 207 218 219 220 222 223 234 + 235 190 202 187 254 251 253 0 239 238 252 184 221 119 120 175 141 138 139 + 174 178 143 144 154 155 156 157 158 159 170 171 172 173 140 142 128 182 179 + 181 183 177 176 180 118 160)) + +(define-unibyte-decoder :ebcdic-international (octet) + (svref +ebcdic-int-to-unicode+ (the ub8 octet))) + +(define-unibyte-encoder :ebcdic-international (code) + (let ((result (cond + ((<= code 172) (svref +unicode-upto-ac-ebcdic-int+ code)) + ((<= #x0410 code #x0450) (svref +unicode-0410-0450-ebcdic-int+ + (- code #x0410)))))) + (prog1 result + (when (and (zerop result) (plusp code)) + (handle-error))))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/src/enc-ebcdic.lisp b/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/src/enc-ebcdic.lisp new file mode 100644 index 0000000..6977da4 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/src/enc-ebcdic.lisp @@ -0,0 +1,71 @@ +;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- +;;; +;;; enc-ebcdic.lisp --- EBCDIC encodings. +;;; +;;; Copyright (C) 2007, Luis Oliveira +;;; +;;; Permission is hereby granted, free of charge, to any person +;;; obtaining a copy of this software and associated documentation +;;; files (the "Software"), to deal in the Software without +;;; restriction, including without limitation the rights to use, copy, +;;; modify, merge, publish, distribute, sublicense, and/or sell copies +;;; of the Software, and to permit persons to whom the Software is +;;; furnished to do so, subject to the following conditions: +;;; +;;; The above copyright notice and this permission notice shall be +;;; included in all copies or substantial portions of the Software. +;;; +;;; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +;;; EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +;;; MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +;;; NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +;;; HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +;;; WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +;;; OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +;;; DEALINGS IN THE SOFTWARE. + +(in-package #:babel-encodings) + +(define-character-encoding :ebcdic-us + "An alleged character set used on IBM dinosaurs." + :aliases '(:ibm-037)) + +(define-constant +ebcdic-decode-table+ + (make-array + 256 :element-type 'ub8 :initial-contents + '(#x00 #x01 #x02 #x03 #x9c #x09 #x86 #x7f #x97 #x8d #x8e #x0b #x0c #x0d + #x0e #x0f #x10 #x11 #x12 #x13 #x9d #x85 #x08 #x87 #x18 #x19 #x92 #x8f + #x1c #x1d #x1e #x1f #x80 #x81 #x82 #x83 #x84 #x0a #x17 #x1b #x88 #x89 + #x8a #x8b #x8c #x05 #x06 #x07 #x90 #x91 #x16 #x93 #x94 #x95 #x96 #x04 + #x98 #x99 #x9a #x9b #x14 #x15 #x9e #x1a #x20 #xa0 #xe2 #xe4 #xe0 #xe1 + #xe3 #xe5 #xe7 #xf1 #xa2 #x2e #x3c #x28 #x2b #x7c #x26 #xe9 #xea #xeb + #xe8 #xed #xee #xef #xec #xdf #x21 #x24 #x2a #x29 #x3b #xac #x2d #x2f + #xc2 #xc4 #xc0 #xc1 #xc3 #xc5 #xc7 #xd1 #xa6 #x2c #x25 #x5f #x3e #x3f + #xf8 #xc9 #xca #xcb #xc8 #xcd #xce #xcf #xcc #x60 #x3a #x23 #x40 #x27 + #x3d #x22 #xd8 #x61 #x62 #x63 #x64 #x65 #x66 #x67 #x68 #x69 #xab #xbb + #xf0 #xfd #xfe #xb1 #xb0 #x6a #x6b #x6c #x6d #x6e #x6f #x70 #x71 #x72 + #xaa #xba #xe6 #xb8 #xc6 #xa4 #xb5 #x7e #x73 #x74 #x75 #x76 #x77 #x78 + #x79 #x7a #xa1 #xbf #xd0 #xdd #xde #xae #x5e #xa3 #xa5 #xb7 #xa9 #xa7 + #xb6 #xbc #xbd #xbe #x5b #x5d #xaf #xa8 #xb4 #xd7 #x7b #x41 #x42 #x43 + #x44 #x45 #x46 #x47 #x48 #x49 #xad #xf4 #xf6 #xf2 #xf3 #xf5 #x7d #x4a + #x4b #x4c #x4d #x4e #x4f #x50 #x51 #x52 #xb9 #xfb #xfc #xf9 #xfa #xff + #x5c #xf7 #x53 #x54 #x55 #x56 #x57 #x58 #x59 #x5a #xb2 #xd4 #xd6 #xd2 + #xd3 #xd5 #x30 #x31 #x32 #x33 #x34 #x35 #x36 #x37 #x38 #x39 #xb3 #xdb + #xdc #xd9 #xda #x9f)) + :test #'equalp) + +(define-constant +ebcdic-encode-table+ + (loop with rt = (make-array 256 :element-type 'ub8 :initial-element 0) + for code across +ebcdic-decode-table+ for i from 0 do + (assert (= 0 (aref rt code))) + (setf (aref rt code) i) + finally (return rt)) + :test #'equalp) + +(define-unibyte-encoder :ebcdic-us (code) + (if (>= code 256) + (handle-error) + (aref +ebcdic-encode-table+ code))) + +(define-unibyte-decoder :ebcdic-us (octet) + (aref +ebcdic-decode-table+ octet)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/src/enc-gbk.lisp b/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/src/enc-gbk.lisp new file mode 100644 index 0000000..816f18c --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/src/enc-gbk.lisp @@ -0,0 +1,184 @@ +;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- +;;; +;;; enc-gbk.lisp --- GBK encodings. +;;; +;;; Copyright (C) 2011, Li Wenpeng +;;; +;;; Permission is hereby granted, free of charge, to any person +;;; obtaining a copy of this software and associated documentation +;;; files (the "Software"), to deal in the Software without +;;; restriction, including without limitation the rights to use, copy, +;;; modify, merge, publish, distribute, sublicense, and/or sell copies +;;; of the Software, and to permit persons to whom the Software is +;;; furnished to do so, subject to the following conditions: +;;; +;;; The above copyright notice and this permission notice shall be +;;; included in all copies or substantial portions of the Software. +;;; +;;; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +;;; EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +;;; MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +;;; NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +;;; HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +;;; WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +;;; OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +;;; DEALINGS IN THE SOFTWARE. + +(in-package #:babel-encodings) + +;; populated in gbk-map.lisp +(defvar *gbk-unicode-mapping*) + +(defconstant +gbk2-offset+ 0) +(defconstant +gbk3-offset+ 6763) +(defconstant +gbk4-offset+ (+ 6763 6080)) +(defconstant +gbk1-offset+ 20902) +(defconstant +gbk5-offset+ (+ 20902 846)) + +(define-character-encoding :gbk + "GBK is an extension of the GB2312 character set for simplified +Chinese characters, used in the People's Republic of China." + :max-units-per-char 4 + :literal-char-code-limit #x80) + +(define-condition invalid-gbk-byte (character-decoding-error) + () + (:documentation "Signalled when an invalid GBK byte is found.")) + +(define-condition invalid-gbk-character (character-encoding-error) + () + (:documentation "Signalled when an invalid GBK character is found.")) + +(define-octet-counter :gbk (getter type) + `(lambda (seq start end max) + (declare (type ,type seq) (fixnum start end max)) + (let ((noctets 0)) + (loop for i from start below end + for u1 of-type code-point = (,getter seq i) + do (cond ((< u1 #x80) (incf noctets)) + (t (incf noctets 2))) + (when (and (plusp max) (= noctets max)) + (return (values noctets i))) + finally (return (values noctets i)))))) + +(define-code-point-counter :gbk (getter type) + `(lambda (seq start end max) + (declare (type ,type seq)) + (let (u1 (noctets 0)) + (loop with i = start + while (< i end) + do (setf u1 (,getter seq i)) + (cond + ((eq 0 (logand u1 #x80)) (incf i)) + (t (incf i 2))) + (incf noctets) + (when (and (plusp max) (= noctets max)) + (return (values noctets i))) + finally (return (values noctets i)))))) + +(define-encoder :gbk (getter src-type setter dest-type) + `(lambda (src start end dest d-start) + (declare (type ,src-type src) + (type ,dest-type dest) + (fixnum start end d-start)) + (macrolet + ((do-encoding (index) + `(let ((u1 0) (u2 0)) + (cond + ((<= +gbk2-offset+ ,index (- +gbk3-offset+ 1)) ; gbk/2 + (setf u1 (+ #xB0 (truncate (/ ,index 94)))) + (setf u2 (+ #xA1 (mod ,index 94)))) + ((<= +gbk3-offset+ ,index (- +gbk4-offset+ 1)) ; gbk/3 + (setf index (- ,index +gbk3-offset+)) + (setf u1 (+ #x81 (truncate (/ ,index 190)))) + (setf u2 (+ #x40 (mod ,index 190))) + (if (>= u2 #x7F) (incf u2))) + ((<= +gbk4-offset+ ,index (- +gbk1-offset+ 1)) ; gbk/4 + (setf index (- ,index +gbk4-offset+)) + (setf u1 (+ #xAA (truncate (/ ,index 96)))) + (setf u2 (+ #x40 (mod ,index 96))) + (if (>= u2 #x7F) (incf u2))) + ((<= +gbk1-offset+ ,index (- +gbk5-offset+ 1)) ; gbk/1 + (setf index (- ,index +gbk1-offset+)) + (setf u1 (+ #xA1 (truncate (/ ,index 94)))) + (setf u2 (+ #xA1 (mod ,index 94)))) + ((<= +gbk5-offset+ ,index (length *gbk-unicode-mapping*)) ; gbk/5 + (setf index (- ,index +gbk5-offset+)) + (setf u1 (+ #xA8 (truncate (/ ,index 96)))) + (setf u2 (+ #x40 (mod ,index 96))) + (if (>= u2 #x7F) (incf u2)))) + (values u1 u2)))) + (let ((c 0) index (noctets 0)) + (loop for i from start below end + for code of-type code-point = (,getter src i) + do (macrolet + ((handle-error (&optional (c 'character-encoding-error)) + `(encoding-error code :gbk src i +repl+ ',c))) + (setf c (code-char code)) + (cond + ((< code #x80) ; ascii + (,setter code dest noctets) + (incf noctets)) + (t ; gbk + (setf index + (position c *gbk-unicode-mapping*)) + + (if (not index) + (handle-error invalid-gbk-character)) + (multiple-value-bind (uh ul) (do-encoding index) + (,setter uh dest noctets) + (,setter ul dest (+ 1 noctets)) + (incf noctets 2))))) + finally (return (the fixnum (- noctets d-start)))))))) + +(define-decoder :gbk (getter src-type setter dest-type) + `(lambda (src start end dest d-start) + (declare (type ,src-type src) + (type ,dest-type dest)) + (let ((u1 0) (u2 0) (index 0) (tmp 0) (noctets 0)) + (loop with i = start + while (< i end) + do (macrolet + ((handle-error (&optional (c 'character-decoding-error)) + `(decoding-error #(u1 u2) :gbk src i +repl+ ',c))) + (setf u1 (,getter src i)) + (incf i) + (cond + ((eq 0 (logand u1 #x80)) + (,setter u1 dest noctets)) + (t + (setf u2 (,getter src i)) + (incf i) + (setf index + (block setter-block + (cond + ((and (<= #xB0 u1 #xF7) (<= #xA1 u2 #xFE)) + (+ +gbk2-offset+ (+ (* 94 (- u1 #xB0)) (- u2 #xA1)))) + + ((and (<= #x81 u1 #xA0) (<= #x40 u2 #xFE)) + (cond ((> u2 #x7F) (setf tmp 1)) + (t (setf tmp 0))) + (+ +gbk3-offset+ (* 190 (- u1 #x81)) (- u2 #x40 tmp))) + + ((and (<= #xAA u1 #xFE) (<= #x40 #xA0)) + (cond ((> u2 #x7F) (setf tmp 1)) + (t (setf tmp 0))) + (+ +gbk4-offset+ (* 96 (- u1 #xAA)) (- u2 #x40 tmp))) + + ((and (<= #xA1 u1 #xA9) (<= #xA1 u2 #xFE)) + (+ +gbk1-offset+ (* 94 (- u1 #xA1)) (- u2 #xA1))) + + ((and (<= #xA8 u1 #xA9) (<= #x40 #xA0)) + (cond ((> u2 #x7F) (setf tmp 1)) + (t (setf tmp 0))) + (+ +gbk5-offset+ (* 96 (- u1 #xA8)) (- u2 #x40 tmp))) + (t + (handle-error invalid-gbk-byte))))) + + (when (>= index (length *gbk-unicode-mapping*)) + (handle-error invalid-gbk-byte)) + (,setter (char-code + (elt *gbk-unicode-mapping* index)) + dest noctets))) + (incf noctets)) + finally (return (the fixnum (- noctets d-start))))))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/src/enc-iso-8859.lisp b/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/src/enc-iso-8859.lisp new file mode 100644 index 0000000..aeed673 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/src/enc-iso-8859.lisp @@ -0,0 +1,1087 @@ +;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- +;;; +;;; enc-iso-8859.lisp --- ISO-8859-* encodings. +;;; +;;; Copyright (C) 2007, Luis Oliveira +;;; +;;; Permission is hereby granted, free of charge, to any person +;;; obtaining a copy of this software and associated documentation +;;; files (the "Software"), to deal in the Software without +;;; restriction, including without limitation the rights to use, copy, +;;; modify, merge, publish, distribute, sublicense, and/or sell copies +;;; of the Software, and to permit persons to whom the Software is +;;; furnished to do so, subject to the following conditions: +;;; +;;; The above copyright notice and this permission notice shall be +;;; included in all copies or substantial portions of the Software. +;;; +;;; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +;;; EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +;;; MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +;;; NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +;;; HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +;;; WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +;;; OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +;;; DEALINGS IN THE SOFTWARE. + +;;; This implementation is largely based on OpenMCL's l1-unicode.lisp +;;; Copyright (C) 2006 Clozure Associates and contributors. + +(in-package #:babel-encodings) + +;;; Typically, ISO-8859-* codes in the range #x00-#x9f map straight +;;; through, while codes #xa0-#xff select arbitrary Unicode characters +;;; that are commonly used in some locale. (Sometimes the break is at +;;; #x80 instead of #xa0). +;;; +;;; (comment from OpenMCL's ccl/level-1/l1-unicode.lisp) + +(define-character-encoding :iso-8859-1 + "An 8-bit, fixed-width character encoding in which all +character codes map to their Unicode equivalents. Intended to +support most characters used in most Western European languages." + :aliases '(:latin-1 :latin1) + :literal-char-code-limit 256) + +(define-unibyte-encoder :iso-8859-1 (code) + (if (>= code 256) + (handle-error) + code)) + +(define-unibyte-decoder :iso-8859-1 (octet) + octet) + +(define-character-encoding :iso-8859-2 + "An 8-bit, fixed-width character encoding in which codes +#x00-#x9f map to their Unicode equivalents and other codes map to +other Unicode character values. Intended to provide most +characters found in most languages used in Central/Eastern +Europe." + :aliases '(:latin-2 :latin2) + :literal-char-code-limit #xa0) + +(define-constant +unicode-00a0-0180-to-iso-8859-2+ + #(#xa0 nil nil nil #xa4 nil nil #xa7 ; #xa0-#xa7 + #xa8 nil nil nil nil #xad nil nil ; #xa8-#xaf + #xb0 nil nil nil #xb4 nil nil nil ; #xb0-#xb7 + #xb8 nil nil nil nil nil nil nil ; #xb8-#xbf + nil #xc1 #xc2 nil #xc4 nil nil #xc7 ; #xc0-#xc7 + nil #xc9 nil #xcb nil #xcd #xce nil ; #xc8-#xcf + nil nil nil #xd3 #xd4 nil #xd6 #xd7 ; #xd0-#xd7 + nil nil #xda nil #xdc #xdd nil #xdf ; #xd8-#xdf + nil #xe1 #xe2 nil #xe4 nil nil #xe7 ; #xe0-#xe7 + nil #xe9 nil #xeb nil #xed #xee nil ; #xe8-#xef + nil nil nil #xf3 #xf4 nil #xf6 #xf7 ; #xf0-#xf7 + nil nil #xfa nil #xfc #xfd nil nil ; #xf8-#xff + ;; #x0100 + nil nil #xc3 #xe3 #xa1 #xb1 #xc6 #xe6 ; #x100-#x107 + nil nil nil nil #xc8 #xe8 #xcf #xef ; #x108-#x10f + #xd0 #xf0 nil nil nil nil nil nil ; #x110-#x117 + #xca #xea #xcc #xec nil nil nil nil ; #x118-#x11f + nil nil nil nil nil nil nil nil ; #x120-#x127 + nil nil nil nil nil nil nil nil ; #x128-#x12f + nil nil nil nil nil nil nil nil ; #x130-#x137 + nil #xc5 #xe5 nil nil #xa5 #xb5 nil ; #x138-#x13f + nil #xa3 #xb3 #xd1 #xf1 nil nil #xd2 ; #x140-#x147 + #xf2 nil nil nil nil nil nil nil ; #x148-#x14f + #xd5 #xf5 nil nil #xc0 #xe0 nil nil ; #x150-#x157 + #xd8 #xf8 #xa6 #xb6 nil nil #xaa #xba ; #x158-#x15f + #xa9 #xb9 #xde #xfe #xab #xbb nil nil ; #x160-#x167 + nil nil nil nil nil nil #xd9 #xf9 ; #x168-#x16f + #xdb #xfb nil nil nil nil nil nil ; #x170-#x177 + nil #xac #xbc #xaf #xbf #xae #xbe nil) ; #x178-#x17f + :test #'equalp) + +(define-constant +unicode-02c0-02e0-to-iso-8859-2+ + #(nil nil nil nil nil nil nil #xb7 ; #x2c0-#x2c7 + nil nil nil nil nil nil nil nil ; #x2c8-#x2cf + nil nil nil nil nil nil nil nil ; #x2d0-#x2d7 + #xa2 #xff nil #xb2 nil #xbd nil nil) ; #x2d8-#x2df + :test #'equalp) + +(define-unibyte-encoder :iso-8859-2 (code) + (or (cond ((< code #xa0) code) + ((< code #x180) + (svref +unicode-00a0-0180-to-iso-8859-2+ + (the ub8 (- code #xa0)))) + ((<= #x2c0 code #x2df) + (svref +unicode-02c0-02e0-to-iso-8859-2+ + (the ub8 (- code #x2c0))))) + (handle-error))) + +(define-constant +iso-8859-2-to-unicode+ + #(;; #xa0 + #x00a0 #x0104 #x02d8 #x0141 #x00a4 #x013d #x015a #x00a7 + #x00a8 #x0160 #x015e #x0164 #x0179 #x00ad #x017d #x017b + ;; #xb0 + #x00b0 #x0105 #x02db #x0142 #x00b4 #x013e #x015b #x02c7 + #x00b8 #x0161 #x015f #x0165 #x017a #x02dd #x017e #x017c + ;; #xc0 + #x0154 #x00c1 #x00c2 #x0102 #x00c4 #x0139 #x0106 #x00c7 + #x010c #x00c9 #x0118 #x00cb #x011a #x00cd #x00ce #x010e + ;; #xd0 + #x0110 #x0143 #x0147 #x00d3 #x00d4 #x0150 #x00d6 #x00d7 + #x0158 #x016e #x00da #x0170 #x00dc #x00dd #x0162 #x00df + ;; #xe0 + #x0155 #x00e1 #x00e2 #x0103 #x00e4 #x013a #x0107 #x00e7 + #x010d #x00e9 #x0119 #x00eb #x011b #x00ed #x00ee #x010f + ;; #xf0 + #x0111 #x0144 #x0148 #x00f3 #x00f4 #x0151 #x00f6 #x00f7 + #x0159 #x016f #x00fa #x0171 #x00fc #x00fd #x0163 #x02d9) + :test #'equalp) + +(define-unibyte-decoder :iso-8859-2 (octet) + (if (< octet #xa0) + octet + (svref +iso-8859-2-to-unicode+ (the ub8 (- octet #xa0))))) + +(define-character-encoding :iso-8859-3 + "An 8-bit, fixed-width character encoding in which codes +#x00-#x9f map to their Unicode equivalents and other codes map to +other Unicode character values. Intended to provide most +characters found in most languages used in Southern Europe." + :aliases '(:latin-3 :latin3) + :literal-char-code-limit #xa0) + +(define-constant +unicode-a0-100-to-iso-8859-3+ + #(#xa0 nil nil #xa3 #xa4 nil nil #xa7 ; #xa0-#xa7 + #xa8 nil nil nil nil #xad nil nil ; #xa8-#xaf + #xb0 nil #xb2 #xb3 #xb4 #xb5 nil #xb7 ; #xb0-#xb7 + #xb8 nil nil nil nil #xbd nil nil ; #xb8-#xbf + #xc0 #xc1 #xc2 nil #xc4 nil nil #xc7 ; #xc0-#xc7 + #xc8 #xc9 #xca #xcb #xcc #xcd #xce #xcf ; #xc8-#xcf + nil #xd1 #xd2 #xd3 #xd4 nil #xd6 #xd7 ; #xd0-#xd7 + nil #xd9 #xda #xdb #xdc nil nil #xdf ; #xd8-#xdf + #xe0 #xe1 #xe2 nil #xe4 nil nil #xe7 ; #xe0-#xe7 + #xe8 #xe9 #xea #xeb #xec #xed #xee #xef ; #xe8-#xef + nil #xf1 #xf2 #xf3 #xf4 nil #xf6 #xf7 ; #xf0-#xf7 + nil #xf9 #xfa #xfb #xfc nil nil nil) ; #xf8-#xff + :test #'equalp) + +(define-constant +unicode-108-180-to-iso-8859-3+ + #(#xc6 #xe6 #xc5 #xe5 #x00 #x00 #x00 #x00 ; #x108-#x10f + nil nil nil nil nil nil nil nil ; #x110-#x117 + nil nil nil nil #xd8 #xf8 #xab #xbb ; #x118-#x11f + #xd5 #xf5 nil nil #xa6 #xb6 #xa1 #xb1 ; #x120-#x127 + nil nil nil nil nil nil nil nil ; #x128-#x12f + #xa9 #xb9 nil nil #xac #xbc nil nil ; #x130-#x137 + nil nil nil nil nil nil nil nil ; #x138-#x13f + nil nil nil nil nil nil nil nil ; #x140-#x147 + nil nil nil nil nil nil nil nil ; #x148-#x14f + nil nil nil nil nil nil nil nil ; #x150-#x157 + nil nil nil nil #xde #xfe #xaa #xba ; #x158-#x15f + nil nil nil nil nil nil nil nil ; #x160-#x167 + nil nil nil nil #xdd #xfd nil nil ; #x168-#x16f + nil nil nil nil nil nil nil nil ; #x170-#x177 + nil nil nil #xaf #xbf nil nil nil) ; #x178-#x17f + :test #'equalp) + +(define-constant +unicode-2d8-2e0-to-iso-8859-3+ + #(#xa2 #xff nil nil nil nil nil nil) ; #x2d8-#x2df + :test #'equalp) + +(define-unibyte-encoder :iso-8859-3 (code) + (or (cond ((< code #xa0) code) + ((< code #x100) + (svref +unicode-a0-100-to-iso-8859-3+ + (the ub8 (- code #xa0)))) + ((<= #x108 code #x17f) + (svref +unicode-108-180-to-iso-8859-3+ + (the ub8 (- code #x108)))) + ((<= #x2d8 code #x2df) + (svref +unicode-2d8-2e0-to-iso-8859-3+ + (the ub8 (- code #x2d8))))) + (handle-error))) + +(define-constant +iso-8859-3-to-unicode+ + #(;; #xa0 + #x00a0 #x0126 #x02d8 #x00a3 #x00a4 #xfffd #x0124 #x00a7 + #x00a8 #x0130 #x015e #x011e #x0134 #x00ad #xfffd #x017b + ;; #xb0 + #x00b0 #x0127 #x00b2 #x00b3 #x00b4 #x00b5 #x0125 #x00b7 + #x00b8 #x0131 #x015f #x011f #x0135 #x00bd #xfffd #x017c + ;; #xc0 + #x00c0 #x00c1 #x00c2 #xfffd #x00c4 #x010a #x0108 #x00c7 + #x00c8 #x00c9 #x00ca #x00cb #x00cc #x00cd #x00ce #x00cf + ;; #xd0 + #xfffd #x00d1 #x00d2 #x00d3 #x00d4 #x0120 #x00d6 #x00d7 + #x011c #x00d9 #x00da #x00db #x00dc #x016c #x015c #x00df + ;; #xe0 + #x00e0 #x00e1 #x00e2 #xfffd #x00e4 #x010b #x0109 #x00e7 + #x00e8 #x00e9 #x00ea #x00eb #x00ec #x00ed #x00ee #x00ef + ;; #xf0 + #xfffd #x00f1 #x00f2 #x00f3 #x00f4 #x0121 #x00f6 #x00f7 + #x011d #x00f9 #x00fa #x00fb #x00fc #x016d #x015d #x02d9) + :test #'equalp) + +(define-unibyte-decoder :iso-8859-3 (octet) + (if (< octet #xa0) + octet + (svref +iso-8859-3-to-unicode+ (the ub8 (- octet #xa0))))) + +(define-character-encoding :iso-8859-4 + "An 8-bit, fixed-width character encoding in which codes +#x00-#x9f map to their Unicode equivalents and other codes map to +other Unicode character values. Intended to provide most +characters found in most languages used in Northern Europe." + :aliases '(:latin-4 :latin4) + :literal-char-code-limit #xa0) + +(define-constant +unicode-a0-180-to-iso-8859-4+ + #(#xa0 nil nil nil #xa4 nil nil #xa7 ; #xa0-#xa7 + #xa8 nil nil nil nil #xad nil #xaf ; #xa8-#xaf + #xb0 nil nil nil #xb4 nil nil nil ; #xb0-#xb7 + #xb8 nil nil nil nil nil nil nil ; #xb8-#xbf + nil #xc1 #xc2 #xc3 #xc4 #xc5 #xc6 nil ; #xc0-#xc7 + nil #xc9 nil #xcb nil #xcd #xce nil ; #xc8-#xcf + nil nil nil nil #xd4 #xd5 #xd6 #xd7 ; #xd0-#xd7 + #xd8 nil #xda #xdb #xdc nil nil #xdf ; #xd8-#xdf + nil #xe1 #xe2 #xe3 #xe4 #xe5 #xe6 nil ; #xe0-#xe7 + nil #xe9 nil #xeb nil #xed #xee nil ; #xe8-#xef + nil nil nil nil #xf4 #xf5 #xf6 #xf7 ; #xf0-#xf7 + #xf8 nil #xfa #xfb #xfc nil nil nil ; #xf8-#xff + #xc0 #xe0 nil nil #xa1 #xb1 nil nil ; #x100-#x107 + nil nil nil nil #xc8 #xe8 nil nil ; #x108-#x10f + #xd0 #xf0 #xaa #xba nil nil #xcc #xec ; #x110-#x117 + #xca #xea nil nil nil nil nil nil ; #x118-#x11f + nil nil #xab #xbb nil nil nil nil ; #x120-#x127 + #xa5 #xb5 #xcf #xef nil nil #xc7 #xe7 ; #x128-#x12f + nil nil nil nil nil nil #xd3 #xf3 ; #x130-#x137 + #xa2 nil nil #xa6 #xb6 nil nil nil ; #x138-#x13f + nil nil nil nil nil #xd1 #xf1 nil ; #x140-#x147 + nil nil #xbd #xbf #xd2 #xf2 nil nil ; #x148-#x14f + nil nil nil nil nil nil #xa3 #xb3 ; #x150-#x157 + nil nil nil nil nil nil nil nil ; #x158-#x15f + #xa9 #xb9 nil nil nil nil #xac #xbc ; #x160-#x167 + #xdd #xfd #xde #xfe nil nil nil nil ; #x168-#x16f + nil nil #xd9 #xf9 nil nil nil nil ; #x170-#x177 + nil nil nil nil nil #xae #xbe nil) ; #x178-#x17f + :test #'equalp) + +(define-constant +unicode-2c0-2e0-to-iso-8859-4+ + #(nil nil nil nil nil nil nil #xb7 ; #x2c0-#x2c7 + nil nil nil nil nil nil nil nil ; #x2c8-#x2cf + nil nil nil nil nil nil nil nil ; #x2d0-#x2d7 + nil #xff nil #xb2 nil nil nil nil) ; #x2d8-#x2df + :test #'equalp) + +(define-unibyte-encoder :iso-8859-4 (code) + (or (cond ((< code #xa0) code) + ((< code #x180) + (svref +unicode-a0-180-to-iso-8859-4+ + (the ub8 (- code #xa0)))) + ((<= #x2c0 code #x2df) + (svref +unicode-2c0-2e0-to-iso-8859-4+ + (the ub8 (- code #x2c0))))) + (handle-error))) + +(define-constant +iso-8859-4-to-unicode+ + #(;; #xa0 + #x00a0 #x0104 #x0138 #x0156 #x00a4 #x0128 #x013b #x00a7 + #x00a8 #x0160 #x0112 #x0122 #x0166 #x00ad #x017d #x00af + ;; #xb0 + #x00b0 #x0105 #x02db #x0157 #x00b4 #x0129 #x013c #x02c7 + #x00b8 #x0161 #x0113 #x0123 #x0167 #x014a #x017e #x014b + ;; #xc0 + #x0100 #x00c1 #x00c2 #x00c3 #x00c4 #x00c5 #x00c6 #x012e + #x010c #x00c9 #x0118 #x00cb #x0116 #x00cd #x00ce #x012a + ;; #xd0 + #x0110 #x0145 #x014c #x0136 #x00d4 #x00d5 #x00d6 #x00d7 + #x00d8 #x0172 #x00da #x00db #x00dc #x0168 #x016a #x00df + ;; #xe0 + #x0101 #x00e1 #x00e2 #x00e3 #x00e4 #x00e5 #x00e6 #x012f + #x010d #x00e9 #x0119 #x00eb #x0117 #x00ed #x00ee #x012b + ;; #xf0 + #x0111 #x0146 #x014d #x0137 #x00f4 #x00f5 #x00f6 #x00f7 + #x00f8 #x0173 #x00fa #x00fb #x00fc #x0169 #x016b #x02d9) + :test #'equalp) + +(define-unibyte-decoder :iso-8859-4 (octet) + (if (< octet #xa0) + octet + (svref +iso-8859-4-to-unicode+ (the ub8 (- octet #xa0))))) + +(define-character-encoding :iso-8859-5 + "An 8-bit, fixed-width character encoding in which codes +#x00-#x9f map to their Unicode equivalents and other codes map to +other Unicode character values. Intended to provide most +characters found in the Cyrillic alphabet." + :aliases '(:cyrillic) + :literal-char-code-limit #xa0) + +(define-constant +unicode-a0-b0-to-iso-8859-5+ + #(#xa0 nil nil nil nil nil nil #xfd ; #xa0-#xa7 + nil nil nil nil nil #xad nil nil) ; #xa8-#xaf + :test #'equalp) + +(define-constant +unicode-400-460-to-iso-8859-5+ + #(nil #xa1 #xa2 #xa3 #xa4 #xa5 #xa6 #xa7 ; #x400-#x407 + #xa8 #xa9 #xaa #xab #xac nil #xae #xaf ; #x408-#x40f + #xb0 #xb1 #xb2 #xb3 #xb4 #xb5 #xb6 #xb7 ; #x410-#x417 + #xb8 #xb9 #xba #xbb #xbc #xbd #xbe #xbf ; #x418-#x41f + #xc0 #xc1 #xc2 #xc3 #xc4 #xc5 #xc6 #xc7 ; #x420-#x427 + #xc8 #xc9 #xca #xcb #xcc #xcd #xce #xcf ; #x428-#x42f + #xd0 #xd1 #xd2 #xd3 #xd4 #xd5 #xd6 #xd7 ; #x430-#x437 + #xd8 #xd9 #xda #xdb #xdc #xdd #xde #xdf ; #x438-#x43f + #xe0 #xe1 #xe2 #xe3 #xe4 #xe5 #xe6 #xe7 ; #x440-#x447 + #xe8 #xe9 #xea #xeb #xec #xed #xee #xef ; #x448-#x44f + nil #xf1 #xf2 #xf3 #xf4 #xf5 #xf6 #xf7 ; #x450-#x457 + #xf8 #xf9 #xfa #xfb #xfc nil #xfe #xff) ; #x458-#x45f + :test #'equalp) + +(define-unibyte-encoder :iso-8859-5 (code) + (or (cond ((< code #xa0) code) + ((< code #xb0) + (svref +unicode-a0-b0-to-iso-8859-5+ + (the ub8 (- code #xa0)))) + ((<= #x400 code #x45f) + (svref +unicode-400-460-to-iso-8859-5+ + (the ub8 (- code #x400)))) + ;; the Numero sign + ((= code #x2116) #xf0)) + (handle-error))) + +(define-constant +iso-8859-5-to-unicode+ + #(;; #xa0 + #x00a0 #x0401 #x0402 #x0403 #x0404 #x0405 #x0406 #x0407 + #x0408 #x0409 #x040a #x040b #x040c #x00ad #x040e #x040f + ;; #xb0 + #x0410 #x0411 #x0412 #x0413 #x0414 #x0415 #x0416 #x0417 + #x0418 #x0419 #x041a #x041b #x041c #x041d #x041e #x041f + ;; #xc0 + #x0420 #x0421 #x0422 #x0423 #x0424 #x0425 #x0426 #x0427 + #x0428 #x0429 #x042a #x042b #x042c #x042d #x042e #x042f + ;; #xd0 + #x0430 #x0431 #x0432 #x0433 #x0434 #x0435 #x0436 #x0437 + #x0438 #x0439 #x043a #x043b #x043c #x043d #x043e #x043f + ;; #xe0 + #x0440 #x0441 #x0442 #x0443 #x0444 #x0445 #x0446 #x0447 + #x0448 #x0449 #x044a #x044b #x044c #x044d #x044e #x044f + ;; #xf0 + #x2116 #x0451 #x0452 #x0453 #x0454 #x0455 #x0456 #x0457 + #x0458 #x0459 #x045a #x045b #x045c #x00a7 #x045e #x045f) + :test #'equalp) + +(define-unibyte-decoder :iso-8859-5 (octet) + (if (< octet #xa0) + octet + (svref +iso-8859-5-to-unicode+ (the ub8 (- octet #xa0))))) + +(define-character-encoding :iso-8859-6 + "An 8-bit, fixed-width character encoding in which codes #x00-#x9f +map to their Unicode equivalents and other codes map to other Unicode +character values. Intended to provide most characters found in the +Arabic alphabet." + :aliases '(:arabic) + :literal-char-code-limit #xa0) + +(define-constant +unicode-a0-b0-to-iso-8859-6+ + #(#xa0 nil nil nil #xa4 nil nil nil ; #xa0-#xa7 + nil nil nil nil nil #xad nil nil) ; #xa8-#xaf + :test #'equalp) + +(define-constant +unicode-608-658-to-iso-8859-6+ + #(nil nil nil nil #xac nil nil nil ; #x608-#x60f + nil nil nil nil nil nil nil nil ; #x610-#x617 + nil nil nil #xbb nil nil nil #xbf ; #x618-#x61f + nil #xc1 #xc2 #xc3 #xc4 #xc5 #xc6 #xc7 ; #x620-#x627 + #xc8 #xc9 #xca #xcb #xcc #xcd #xce #xcf ; #x628-#x62f + #xd0 #xd1 #xd2 #xd3 #xd4 #xd5 #xd6 #xd7 ; #x630-#x637 + #xd8 #xd9 #xda nil nil nil nil nil ; #x638-#x63f + #xe0 #xe1 #xe2 #xe3 #xe4 #xe5 #xe6 #xe7 ; #x640-#x647 + #xe8 #xe9 #xea #xeb #xec #xed #xee #xef ; #x648-#x64f + #xf0 #xf1 #xf2 nil nil nil nil nil) ; #x650-#x657 + :test #'equalp) + +(define-unibyte-encoder :iso-8859-6 (code) + (or (cond ((< code #xa0) code) + ((< code #xb0) + (svref +unicode-a0-b0-to-iso-8859-6+ + (the ub8 (- code #xa0)))) + ((<= #x608 code #x657) + (svref +unicode-608-658-to-iso-8859-6+ + (the ub8 (- code #x608))))) + (handle-error))) + +(define-constant +iso-8859-6-to-unicode+ + #(;; #xa0 + #x00a0 #xfffd #xfffd #xfffd #x00a4 #xfffd #xfffd #xfffd + #xfffd #xfffd #xfffd #xfffd #x060c #x00ad #xfffd #xfffd + ;; #xb0 + #xfffd #xfffd #xfffd #xfffd #xfffd #xfffd #xfffd #xfffd + #xfffd #xfffd #xfffd #x061b #xfffd #xfffd #xfffd #x061f + ;; #xc0 + #xfffd #x0621 #x0622 #x0623 #x0624 #x0625 #x0626 #x0627 + #x0628 #x0629 #x062a #x062b #x062c #x062d #x062e #x062f + ;; #xd0 + #x0630 #x0631 #x0632 #x0633 #x0634 #x0635 #x0636 #x0637 + #x0638 #x0639 #x063a #xfffd #xfffd #xfffd #xfffd #xfffd + ;; #xe0 + #x0640 #x0641 #x0642 #x0643 #x0644 #x0645 #x0646 #x0647 + #x0648 #x0649 #x064a #x064b #x064c #x064d #x064e #x064f + ;; #xf0 + #x0650 #x0651 #x0652 #xfffd #xfffd #xfffd #xfffd #xfffd + #xfffd #xfffd #xfffd #xfffd #xfffd #xfffd #xfffd #xfffd) + :test #'equalp) + +(define-unibyte-decoder :iso-8859-6 (octet) + (if (< octet #xa0) + octet + (svref +iso-8859-6-to-unicode+ (the ub8 (- octet #xa0))))) + +(define-character-encoding :iso-8859-7 + "An 8-bit, fixed-width character encoding in which codes +#x00-#x9f map to their Unicode equivalents and other codes map to +other Unicode character values. Intended to provide most +characters found in the Greek alphabet." + :aliases '(:greek) + :literal-char-code-limit #xa0) + +(define-constant +unicode-a0-c0-to-iso-8859-7+ + #(#xa0 nil nil #xa3 nil nil #xa6 #xa7 ; #xa0-#xa7 + #xa8 #xa9 nil #xab #xac #xad nil nil ; #xa8-#xaf + #xb0 #xb1 #xb2 #xb3 nil nil nil #xb7 ; #xb0-#xb7 + nil nil nil #xbb nil #xbd nil nil) ; #xb8-#xbf + :test #'equalp) + +(define-constant +unicode-378-3d0-to-iso-8859-7+ + #(nil nil #xaa nil nil nil nil nil ; #x378-#x37f + nil nil nil nil #xb4 #xb5 #xb6 nil ; #x380-#x387 + #xb8 #xb9 #xba nil #xbc nil #xbe #xbf ; #x388-#x38f + #xc0 #xc1 #xc2 #xc3 #xc4 #xc5 #xc6 #xc7 ; #x390-#x397 + #xc8 #xc9 #xca #xcb #xcc #xcd #xce #xcf ; #x398-#x39f + #xd0 #xd1 nil #xd3 #xd4 #xd5 #xd6 #xd7 ; #x3a0-#x3a7 + #xd8 #xd9 #xda #xdb #xdc #xdd #xde #xdf ; #x3a8-#x3af + #xe0 #xe1 #xe2 #xe3 #xe4 #xe5 #xe6 #xe7 ; #x3b0-#x3b7 + #xe8 #xe9 #xea #xeb #xec #xed #xee #xef ; #x3b8-#x3bf + #xf0 #xf1 #xf2 #xf3 #xf4 #xf5 #xf6 #xf7 ; #x3c0-#x3c7 + #xf8 #xf9 #xfa #xfb #xfc #xfd #xfe nil) ; #x3c8-#x3cf + :test #'equalp) + +(define-constant +unicode-2010-2020-to-iso-8859-7+ + #(nil nil nil nil nil #xaf nil nil ; #x2010-#x2017 + #xa1 #xa2 nil nil nil nil nil nil) ; #x2018-#x201f + :test #'equalp) + +(define-constant +unicode-20ac-20b0-to-iso-8859-7+ + #(#xa4 nil nil #xa5) + :test #'equalp) + +(define-unibyte-encoder :iso-8859-7 (code) + (or (cond ((< code #xa0) code) + ((< code #xc0) + (svref +unicode-a0-c0-to-iso-8859-7+ + (the ub8 (- code #xa0)))) + ((<= #x378 code #x3cf) + (svref +unicode-378-3d0-to-iso-8859-7+ + (the ub8 (- code #x378)))) + ((<= #x2010 code #x201f) + (svref +unicode-2010-2020-to-iso-8859-7+ + (the ub8 (- code #x2010)))) + ((<= #x201c code #x20af) + (svref +unicode-20ac-20b0-to-iso-8859-7+ + (the ub8 (- code #x20ac))))) + (handle-error))) + +(define-constant +iso-8859-7-to-unicode+ + #(;; #xa0 + #x00a0 #x2018 #x2019 #x00a3 #x20ac #x20af #x00a6 #x00a7 + #x00a8 #x00a9 #x037a #x00ab #x00ac #x00ad #xfffd #x2015 + ;; #xb0 + #x00b0 #x00b1 #x00b2 #x00b3 #x0384 #x0385 #x0386 #x00b7 + #x0388 #x0389 #x038a #x00bb #x038c #x00bd #x038e #x038f + ;; #xc0 + #x0390 #x0391 #x0392 #x0393 #x0394 #x0395 #x0396 #x0397 + #x0398 #x0399 #x039a #x039b #x039c #x039d #x039e #x039f + ;; #xd0 + #x03a0 #x03a1 #xfffd #x03a3 #x03a4 #x03a5 #x03a6 #x03a7 + #x03a8 #x03a9 #x03aa #x03ab #x03ac #x03ad #x03ae #x03af + ;; #xe0 + #x03b0 #x03b1 #x03b2 #x03b3 #x03b4 #x03b5 #x03b6 #x03b7 + #x03b8 #x03b9 #x03ba #x03bb #x03bc #x03bd #x03be #x03bf + ;; #xf0 + #x03c0 #x03c1 #x03c2 #x03c3 #x03c4 #x03c5 #x03c6 #x03c7 + #x03c8 #x03c9 #x03ca #x03cb #x03cc #x03cd #x03ce #xfffd) + :test #'equalp) + +(define-unibyte-decoder :iso-8859-7 (octet) + (if (< octet #xa0) + octet + (svref +iso-8859-7-to-unicode+ (the ub8 (- octet #xa0))))) + +(define-character-encoding :iso-8859-8 + "An 8-bit, fixed-width character encoding in which codes #x00-#x9f +map to their Unicode equivalents and other codes map to other Unicode +character values. Intended to provide most characters found in the +Hebrew alphabet." + :aliases '(:hebrew) + :literal-char-code-limit #xa0) + +(define-constant +unicode-a0-f8-to-iso-8859-8+ + #(#xa0 nil #xa2 #xa3 #xa4 #xa5 #xa6 #xa7 ; #xa0-#xa7 + #xa8 #xa9 nil #xab #xac #xad #xae #xaf ; #xa8-#xaf + #xb0 #xb1 #xb2 #xb3 #xb4 #xb5 #xb6 #xb7 ; #xb0-#xb7 + #xb8 #xb9 nil #xbb #xbc #xbd #xbe nil ; #xb8-#xbf + nil nil nil nil nil nil nil nil ; #xc0-#xc7 + nil nil nil nil nil nil nil nil ; #xc8-#xcf + nil nil nil nil nil nil nil #xaa ; #xd0-#xd7 + nil nil nil nil nil nil nil nil ; #xd8-#xdf + nil nil nil nil nil nil nil nil ; #xe0-#xe7 + nil nil nil nil nil nil nil nil ; #xe8-#xef + nil nil nil nil nil nil nil #xba) ; #xf0-#xf7 + :test #'equalp) + +(define-constant +unicode-5d0-5f0-to-iso-8859-8+ + #(#xe0 #xe1 #xe2 #xe3 #xe4 #xe5 #xe6 #xe7 ; #x5d0-#x5d7 + #xe8 #xe9 #xea #xeb #xec #xed #xee #xef ; #x5d8-#x5df + #xf0 #xf1 #xf2 #xf3 #xf4 #xf5 #xf6 #xf7 ; #x5e0-#x5e7 + #xf8 #xf9 #xfa nil nil nil nil nil) ; #x5e8-#x5ef + :test #'equalp) + +(define-constant +unicode-2008-2018-to-iso-8859-8+ + #(nil nil nil nil nil nil #xfd #xfe ; #x2008-#x200f + nil nil nil nil nil nil nil #xdf) ; #x2010-#x2017 + :test #'equalp) + +(define-unibyte-encoder :iso-8859-8 (code) + (or (cond ((< code #xa0) code) + ((< code #xf8) + (svref +unicode-a0-f8-to-iso-8859-8+ + (the ub8 (- code #xa0)))) + ((<= #x5d0 code #x5ef) + (svref +unicode-5d0-5f0-to-iso-8859-8+ + (the ub8 (- code #x5d0)))) + ((<= #x2008 code #x201f) + (svref +unicode-2008-2018-to-iso-8859-8+ + (the ub8 (- code #x2008))))) + (handle-error))) + +(define-constant +iso-8859-8-to-unicode+ + #(;; #xa0 + #x00a0 #xfffd #x00a2 #x00a3 #x00a4 #x00a5 #x00a6 #x00a7 + #x00a8 #x00a9 #x00d7 #x00ab #x00ac #x00ad #x00ae #x00af + ;; #xb0 + #x00b0 #x00b1 #x00b2 #x00b3 #x00b4 #x00b5 #x00b6 #x00b7 + #x00b8 #x00b9 #x00f7 #x00bb #x00bc #x00bd #x00be #xfffd + ;; #xc0 + #xfffd #xfffd #xfffd #xfffd #xfffd #xfffd #xfffd #xfffd + #xfffd #xfffd #xfffd #xfffd #xfffd #xfffd #xfffd #xfffd + ;; #xd0 + #xfffd #xfffd #xfffd #xfffd #xfffd #xfffd #xfffd #xfffd + #xfffd #xfffd #xfffd #xfffd #xfffd #xfffd #xfffd #x2017 + ;; #xe0 + #x05d0 #x05d1 #x05d2 #x05d3 #x05d4 #x05d5 #x05d6 #x05d7 + #x05d8 #x05d9 #x05da #x05db #x05dc #x05dd #x05de #x05df + ;; #xf0 + #x05e0 #x05e1 #x05e2 #x05e3 #x05e4 #x05e5 #x05e6 #x05e7 + #x05e8 #x05e9 #x05ea #xfffd #xfffd #x200e #x200f #xfffd) + :test #'equalp) + +(define-unibyte-decoder :iso-8859-8 (octet) + (if (< octet #xa0) + octet + (svref +iso-8859-8-to-unicode+ (the ub8 (- octet #xa0))))) + +(define-character-encoding :iso-8859-9 + "An 8-bit, fixed-width character encoding in which codes +#x00-#xcf map to their Unicode equivalents and other codes map to +other Unicode character values. Intended to provide most +characters found in the Turkish alphabet." + :aliases '(:latin-5 :latin5) + :decode-literal-code-unit-limit #xd0 + :encode-literal-code-unit-limit #xa0) + +(define-constant +unicode-d0-100-to-iso-8859-9+ + #(nil #xd1 #xd2 #xd3 #xd4 #xd5 #xd6 #xd7 ; #xd0-#xd7 + #xd8 #xd9 #xda #xdb #xdc nil nil #xdf ; #xd8-#xdf + #xe0 #xe1 #xe2 #xe3 #xe4 #xe5 #xe6 #xe7 ; #xe0-#xe7 + #xe8 #xe9 #xea #xeb #xec #xed #xee #xef ; #xe8-#xef + nil #xf1 #xf2 #xf3 #xf4 #xf5 #xf6 #xf7 ; #xf0-#xf7 + #xf8 #xf9 #xfa #xfb #xfc nil nil #xff) ; #xf8-#xff + :test #'equalp) + +(define-constant +unicode-118-160-to-iso-8859-9+ + #(nil nil nil nil nil nil #xd0 #xf0 ; #x118-#x11f + nil nil nil nil nil nil nil nil ; #x120-#x127 + nil nil nil nil nil nil nil nil ; #x128-#x12f + #xdd #xfd nil nil nil nil nil nil ; #x130-#x137 + nil nil nil nil nil nil nil nil ; #x138-#x13f + nil nil nil nil nil nil nil nil ; #x140-#x147 + nil nil nil nil nil nil nil nil ; #x148-#x14f + nil nil nil nil nil nil nil nil ; #x150-#x157 + nil nil nil nil nil nil #xde #xfe) ; #x158-#x15f + :test #'equalp) + +(define-unibyte-encoder :iso-8859-9 (code) + (or (cond ((< code #xd0) code) + ((< code #x100) + (svref +unicode-d0-100-to-iso-8859-9+ + (the ub8 (- code #xd0)))) + ((<= #x118 code #x15f) + (svref +unicode-118-160-to-iso-8859-9+ + (the ub8 (- code #x118))))) + (handle-error))) + +(define-constant +iso-8859-9-to-unicode+ + #(;; #xd0 + #x011e #x00d1 #x00d2 #x00d3 #x00d4 #x00d5 #x00d6 #x00d7 + #x00d8 #x00d9 #x00da #x00db #x00dc #x0130 #x015e #x00df + ;; #xe0 + #x00e0 #x00e1 #x00e2 #x00e3 #x00e4 #x00e5 #x00e6 #x00e7 + #x00e8 #x00e9 #x00ea #x00eb #x00ec #x00ed #x00ee #x00ef + ;; #xf0 + #x011f #x00f1 #x00f2 #x00f3 #x00f4 #x00f5 #x00f6 #x00f7 + #x00f8 #x00f9 #x00fa #x00fb #x00fc #x0131 #x015f #x00ff) + :test #'equalp) + +(define-unibyte-decoder :iso-8859-9 (octet) + (if (< octet #xd0) + octet + (svref +iso-8859-9-to-unicode+ (the ub8 (- octet #xd0))))) + +(define-character-encoding :iso-8859-10 + "An 8-bit, fixed-width character encoding in which codes +#x00-#x9f map to their Unicode equivalents and other codes map to +other Unicode character values. Intended to provide most +characters found in Nordic alphabets." + :aliases '(:latin-6 :latin6) + :literal-char-code-limit #xa0) + +(define-constant +unicode-a0-180-to-iso-8859-10+ + #(#xa0 nil nil nil nil nil nil #xa7 ; #xa0-#xa7 + nil nil nil nil nil #xad nil nil ; #xa8-#xaf + #xb0 nil nil nil nil nil nil #xb7 ; #xb0-#xb7 + nil nil nil nil nil #x2015 nil nil ; #xb8-#xbf + nil #xc1 #xc2 #xc3 #xc4 #xc5 #xc6 nil ; #xc0-#xc7 + nil #xc9 nil #xcb nil #xcd #xce #xcf ; #xc8-#xcf + #xd0 nil nil #xd3 #xd4 #xd5 #xd6 nil ; #xd0-#xd7 + #xd8 nil #xda #xdb #xdc #xdd #xde #xdf ; #xd8-#xdf + nil #xe1 #xe2 #xe3 #xe4 #xe5 #xe6 nil ; #xe0-#xe7 + nil #xe9 nil #xeb nil #xed #xee #xef ; #xe8-#xef + #xf0 nil nil #xf3 #xf4 #xf5 #xf6 nil ; #xf0-#xf7 + #xf8 nil #xfa #xfb #xfc #xfd #xfe nil ; #xf8-#xff + #xc0 #xe0 nil nil #xa1 #xb1 nil nil ; #x100-#x107 + nil nil nil nil #xc8 #xe8 nil nil ; #x108-#x10f + #xa9 #xb9 #xa2 #xb2 nil nil #xcc #xec ; #x110-#x117 + #xca #xea nil nil nil nil nil nil ; #x118-#x11f + nil nil #xa3 #xb3 nil nil nil nil ; #x120-#x127 + #xa5 #xb5 #xa4 #xb4 nil nil #xc7 #xe7 ; #x128-#x12f + nil nil nil nil nil nil #xa6 #xb6 ; #x130-#x137 + #xff nil nil #xa8 #xb8 nil nil nil ; #x138-#x13f + nil nil nil nil nil #xd1 #xf1 nil ; #x140-#x147 + nil nil #xaf #xbf #xd2 #xf2 nil nil ; #x148-#x14f + nil nil nil nil nil nil nil nil ; #x150-#x157 + nil nil nil nil nil nil nil nil ; #x158-#x15f + #xaa #xba nil nil nil nil #xab #xbb ; #x160-#x167 + #xd7 #xf7 #xae #xbe nil nil nil nil ; #x168-#x16f + nil nil #xd9 #xf9 nil nil nil nil ; #x170-#x177 + nil nil nil nil nil #xac #xbc nil) ; #x178-#x17f + :test #'equalp) + +(define-unibyte-encoder :iso-8859-10 (code) + (or (cond ((< code #xa0) code) + ((< code #x180) + (svref +unicode-a0-180-to-iso-8859-10+ + (the ub8 (- code #xa0)))) + ;; Horizontal bar + ((= code #x2015) #xbd)) + (handle-error))) + +(define-constant +iso-8859-10-to-unicode+ + #(;; #xa0 + #x00a0 #x0104 #x0112 #x0122 #x012a #x0128 #x0136 #x00a7 + #x013b #x0110 #x0160 #x0166 #x017d #x00ad #x016a #x014a + ;; #xb0 + #x00b0 #x0105 #x0113 #x0123 #x012b #x0129 #x0137 #x00b7 + #x013c #x0111 #x0161 #x0167 #x017e #x2015 #x016b #x014b + ;; #xc0 + #x0100 #x00c1 #x00c2 #x00c3 #x00c4 #x00c5 #x00c6 #x012e + #x010c #x00c9 #x0118 #x00cb #x0116 #x00cd #x00ce #x00cf + ;; #xd0 + #x00d0 #x0145 #x014c #x00d3 #x00d4 #x00d5 #x00d6 #x0168 + #x00d8 #x0172 #x00da #x00db #x00dc #x00dd #x00de #x00df + ;; #xe0 + #x0101 #x00e1 #x00e2 #x00e3 #x00e4 #x00e5 #x00e6 #x012f + #x010d #x00e9 #x0119 #x00eb #x0117 #x00ed #x00ee #x00ef + ;; #xf0 + #x00f0 #x0146 #x014d #x00f3 #x00f4 #x00f5 #x00f6 #x0169 + #x00f8 #x0173 #x00fa #x00fb #x00fc #x00fd #x00fe #x0138) + :test #'equalp) + +(define-unibyte-decoder :iso-8859-10 (octet) + (if (< octet #xa0) + octet + (svref +iso-8859-10-to-unicode+ (the ub8 (- octet #xa0))))) + +(define-character-encoding :iso-8859-11 + "An 8-bit, fixed-width character encoding in which codes +#x00-#x9f map to their Unicode equivalents and other codes map to +other Unicode character values. Intended to provide most +characters found the Thai alphabet." + :aliases '() + :literal-char-code-limit #xa0) + +(define-unibyte-encoder :iso-8859-11 (code) + (cond ((< code #xa1) code) + ((and (<= #xe01 code #xe5b) + (not (<= #xe3b code #xe3e)) + (not (<= #xe5c code #xe5f))) + (- code #xd60)) + (t (handle-error)))) + +(define-unibyte-decoder :iso-8859-11 (octet) + (cond ((<= octet #xa0) octet) + ((or (<= #xdb octet #xde) + (<= #xfc octet #xff)) + #xfffd) + ((<= octet #xfb) + (+ octet #x0d60)) + (t (handle-error)))) + +;;; There is no iso-8859-12 encoding. + +(define-character-encoding :iso-8859-13 + "An 8-bit, fixed-width character encoding in which codes +#x00-#x9f map to their Unicode equivalents and other codes map to +other Unicode character values. Intended to provide most +characters found in Baltic alphabets." + :aliases '() + :literal-char-code-limit #xa0) + +(define-constant +unicode-a0-180-to-iso-8859-13+ + #(#xa0 nil #xa2 #xa3 #xa4 nil #xa6 #xa7 ; #xa0-#xa7 + nil #xa9 nil #xab #xac #xad #xae nil ; #xa8-#xaf + #xb0 #xb1 #xb2 #xb3 nil #xb5 #xb6 #xb7 ; #xb0-#xb7 + nil #xb9 nil #xbb #xbc #xbd #xbe nil ; #xb8-#xbf + nil nil nil nil #xc4 #xc5 #xaf nil ; #xc0-#xc7 + nil #xc9 nil nil nil nil nil nil ; #xc8-#xcf + nil nil nil #xd3 nil #xd5 #xd6 #xd7 ; #xd0-#xd7 + #xa8 nil nil nil #xdc nil nil #xdf ; #xd8-#xdf + nil nil nil nil #xe4 #xe5 #xbf nil ; #xe0-#xe7 + nil #xe9 nil nil nil nil nil nil ; #xe8-#xef + nil nil nil #xf3 nil #xf5 #xf6 #xf7 ; #xf0-#xf7 + #xb8 nil nil nil #xfc nil nil nil ; #xf8-#xff + #xc2 #xe2 nil nil #xc0 #xe0 #xc3 #xe3 ; #x100-#x107 + nil nil nil nil #xc8 #xe8 nil nil ; #x108-#x10f + nil nil #xc7 #xe7 nil nil #xcb #xeb ; #x110-#x117 + #xc6 #xe6 nil nil nil nil nil nil ; #x118-#x11f + nil nil #xcc #xec nil nil nil nil ; #x120-#x127 + nil nil #xce #xee nil nil #xc1 #xe1 ; #x128-#x12f + nil nil nil nil nil nil #xcd #xed ; #x130-#x137 + nil nil nil #xcf #xef nil nil nil ; #x138-#x13f + nil #xd9 #xf9 #xd1 #xf1 #xd2 #xf2 nil ; #x140-#x147 + nil nil nil nil #xd4 #xf4 nil nil ; #x148-#x14f + nil nil nil nil nil nil #xaa #xba ; #x150-#x157 + nil nil #xda #xfa nil nil nil nil ; #x158-#x15f + #xd0 #xf0 nil nil nil nil nil nil ; #x160-#x167 + nil nil #xdb #xfb nil nil nil nil ; #x168-#x16f + nil nil #xd8 #xf8 nil nil nil nil ; #x170-#x177 + nil #xca #xea #xdd #xfd #xde #xfe nil) ; #x178-#x17f + :test #'equalp) + +(define-constant +unicode-2018-2020-to-iso-8859-13+ + #(nil #xff nil nil #xb4 #xa1 #xa5 nil) ; #x2018-#x201f + :test #'equalp) + +(define-unibyte-encoder :iso-8859-13 (code) + (or (cond ((< code #xa0) code) + ((< code #x180) + (svref +unicode-a0-180-to-iso-8859-13+ + (the ub8 (- code #xa0)))) + ((<= #x2018 code #x201f) + (svref +unicode-2018-2020-to-iso-8859-13+ + (the ub8 (- code #x2018))))) + (handle-error))) + +(define-constant +iso-8859-13-to-unicode+ + #(;; #xa0 + #x00a0 #x201d #x00a2 #x00a3 #x00a4 #x201e #x00a6 #x00a7 + #x00d8 #x00a9 #x0156 #x00ab #x00ac #x00ad #x00ae #x00c6 + ;; #xb0 + #x00b0 #x00b1 #x00b2 #x00b3 #x201c #x00b5 #x00b6 #x00b7 + #x00f8 #x00b9 #x0157 #x00bb #x00bc #x00bd #x00be #x00e6 + ;; #xc0 + #x0104 #x012e #x0100 #x0106 #x00c4 #x00c5 #x0118 #x0112 + #x010c #x00c9 #x0179 #x0116 #x0122 #x0136 #x012a #x013b + ;; #xd0 + #x0160 #x0143 #x0145 #x00d3 #x014c #x00d5 #x00d6 #x00d7 + #x0172 #x0141 #x015a #x016a #x00dc #x017b #x017d #x00df + ;; #xe0 + #x0105 #x012f #x0101 #x0107 #x00e4 #x00e5 #x0119 #x0113 + #x010d #x00e9 #x017a #x0117 #x0123 #x0137 #x012b #x013c + ;; #xf0 + #x0161 #x0144 #x0146 #x00f3 #x014d #x00f5 #x00f6 #x00f7 + #x0173 #x0142 #x015b #x016b #x00fc #x017c #x017e #x2019) + :test #'equalp) + +(define-unibyte-decoder :iso-8859-13 (octet) + (if (< octet #xa0) + octet + (svref +iso-8859-13-to-unicode+ (the ub8 (- octet #xa0))))) + +(define-character-encoding :iso-8859-14 + "An 8-bit, fixed-width character encoding in which codes +#x00-#x9f map to their Unicode equivalents and other codes map to +other Unicode character values. Intended to provide most +characters found in Celtic languages." + :aliases '(:latin-8 :latin8) + :literal-char-code-limit #xa0) + +(define-constant +unicode-a0-100-to-iso-8859-14+ + #(#xa0 nil nil #xa3 nil nil nil #xa7 ; #xa0-#xa7 + nil #xa9 nil nil nil #xad #xae nil ; #xa8-#xaf + nil nil nil nil nil nil #xb6 nil ; #xb0-#xb7 + nil nil nil nil nil nil nil nil ; #xb8-#xbf + #xc0 #xc1 #xc2 #xc3 #xc4 #xc5 #xc6 #xc7 ; #xc0-#xc7 + #xc8 #xc9 #xca #xcb #xcc #xcd #xce #xcf ; #xc8-#xcf + nil #xd1 #xd2 #xd3 #xd4 #xd5 #xd6 nil ; #xd0-#xd7 + #xd8 #xd9 #xda #xdb #xdc #xdd nil #xdf ; #xd8-#xdf + #xe0 #xe1 #xe2 #xe3 #xe4 #xe5 #xe6 #xe7 ; #xe0-#xe7 + #xe8 #xe9 #xea #xeb #xec #xed #xee #xef ; #xe8-#xef + nil #xf1 #xf2 #xf3 #xf4 #xf5 #xf6 nil ; #xf0-#xf7 + #xf8 #xf9 #xfa #xfb #xfc #xfd nil #xff) ; #xf8-#xff + :test #'equalp) + +(define-constant +unicode-108-128-to-iso-8859-14+ + #(nil nil #xa4 #xa5 nil nil nil nil ; #x108-#x10f + nil nil nil nil nil nil nil nil ; #x110-#x117 + nil nil nil nil nil nil nil nil ; #x118-#x11f + #xb2 #xb3 nil nil nil nil nil nil) ; #x120-#x127 + :test #'equalp) + +(define-constant +unicode-170-180-to-iso-8859-14+ + #(nil nil nil nil #xd0 #xf0 #xde #xfe ; #x170-#x177 + #xaf nil nil nil nil nil nil nil) ; #x178-#x17f + :test #'equalp) + +(define-constant +unicode-1e00-1e88-to-iso-8859-14+ + #(nil nil #xa1 #xa2 nil nil nil nil ; #x1e00-#x1e07 + nil nil #xa6 #xab nil nil nil nil ; #x1e08-#x1e0f + nil nil nil nil nil nil nil nil ; #x1e10-#x1e17 + nil nil nil nil nil nil #xb0 #xb1 ; #x1e18-#x1e1f + nil nil nil nil nil nil nil nil ; #x1e20-#x1e27 + nil nil nil nil nil nil nil nil ; #x1e28-#x1e2f + nil nil nil nil nil nil nil nil ; #x1e30-#x1e37 + nil nil nil nil nil nil nil nil ; #x1e38-#x1e3f + #xb4 #xb5 nil nil nil nil nil nil ; #x1e40-#x1e47 + nil nil nil nil nil nil nil nil ; #x1e48-#x1e4f + nil nil nil nil nil nil #xb7 #xb9 ; #x1e50-#x1e57 + nil nil nil nil nil nil nil nil ; #x1e58-#x1e5f + #xbb #xbf nil nil nil nil nil nil ; #x1e60-#x1e67 + nil nil #xd7 #xf7 nil nil nil nil ; #x1e68-#x1e6f + nil nil nil nil nil nil nil nil ; #x1e70-#x1e77 + nil nil nil nil nil nil nil nil ; #x1e78-#x1e7f + #xa8 #xb8 #xaa #xba #xbd #xbe nil nil) ; #x1e80-#x1e87 + :test #'equalp) + +(define-constant +unicode-1ef0-1ef8-to-iso-8859-14+ + #(nil nil #xac #xbc nil nil nil nil) ; #x1ef0-#x1ef7 + :test #'equalp) + +(define-unibyte-encoder :iso-8859-14 (code) + (or (cond ((< code #xa0) code) + ((< code #x100) + (svref +unicode-a0-100-to-iso-8859-14+ + (the ub8 (- code #xa0)))) + ((<= #x108 code #x127) + (svref +unicode-108-128-to-iso-8859-14+ + (the ub8 (- code #x108)))) + ((<= #x170 code #x17f) + (svref +unicode-170-180-to-iso-8859-14+ + (the ub8 (- code #x170)))) + ((<= #x1e00 code #x1e87) + (svref +unicode-1e00-1e88-to-iso-8859-14+ + (the ub8 (- code #x1e00)))) + ((<= #x1ef0 code #x1ef7) + (svref +unicode-1ef0-1ef8-to-iso-8859-14+ + (the ub8 (- code #x1ef0))))) + (handle-error))) + +(define-constant +iso-8859-14-to-unicode+ + #(;; #xa0 + #x00a0 #x1e02 #x1e03 #x00a3 #x010a #x010b #x1e0a #x00a7 + #x1e80 #x00a9 #x1e82 #x1e0b #x1ef2 #x00ad #x00ae #x0178 + ;; #xb0 + #x1e1e #x1e1f #x0120 #x0121 #x1e40 #x1e41 #x00b6 #x1e56 + #x1e81 #x1e57 #x1e83 #x1e60 #x1ef3 #x1e84 #x1e85 #x1e61 + ;; #xc0 + #x00c0 #x00c1 #x00c2 #x00c3 #x00c4 #x00c5 #x00c6 #x00c7 + #x00c8 #x00c9 #x00ca #x00cb #x00cc #x00cd #x00ce #x00cf + ;; #xd0 + #x0174 #x00d1 #x00d2 #x00d3 #x00d4 #x00d5 #x00d6 #x1e6a + #x00d8 #x00d9 #x00da #x00db #x00dc #x00dd #x0176 #x00df + ;; #xe0 + #x00e0 #x00e1 #x00e2 #x00e3 #x00e4 #x00e5 #x00e6 #x00e7 + #x00e8 #x00e9 #x00ea #x00eb #x00ec #x00ed #x00ee #x00ef + ;; #xf0 + #x0175 #x00f1 #x00f2 #x00f3 #x00f4 #x00f5 #x00f6 #x1e6b + #x00f8 #x00f9 #x00fa #x00fb #x00fc #x00fd #x0177 #x00ff) + :test #'equalp) + +(define-unibyte-decoder :iso-8859-14 (octet) + (if (< octet #xa0) + octet + (svref +iso-8859-14-to-unicode+ (the ub8 (- octet #xa0))))) + +(define-character-encoding :iso-8859-15 + "An 8-bit, fixed-width character encoding in which codes +#x00-#x9f map to their Unicode equivalents and other codes map to +other Unicode character values. Intended to provide most +characters found in Western European languages (including the +Euro sign and some other characters missing from ISO-8859-1." + :aliases '(:latin-9 :latin9) + :literal-char-code-limit #xa0) + +(define-constant +unicode-a0-100-to-iso-8859-15+ + #(#xa0 #xa1 #xa2 #xa3 nil #xa5 nil #xa7 ; #xa0-#xa7 + nil #xa9 #xaa #xab #xac #xad #xae #xaf ; #xa8-#xaf + #xb0 #xb1 #xb2 #xb3 nil #xb5 #xb6 #xb7 ; #xb0-#xb7 + nil #xb9 #xba #xbb nil nil nil #xbf ; #xb8-0xbf + #xc0 #xc1 #xc2 #xc3 #xc4 #xc5 #xc6 #xc7 ; #xc0-#xc7 + #xc8 #xc9 #xca #xcb #xcc #xcd #xce #xcf ; #xc8-#xcf + #xd0 #xd1 #xd2 #xd3 #xd4 #xd5 #xd6 #xd7 ; #xd0-#xd7 + #xd8 #xd9 #xda #xdb #xdc #xdd #xde #xdf ; #xd8-#xdf + #xe0 #xe1 #xe2 #xe3 #xe4 #xe5 #xe6 #xe7 ; #xe0-#xe7 + #xe8 #xe9 #xea #xeb #xec #xed #xee #xef ; #xe8-#xef + #xf0 #xf1 #xf2 #xf3 #xf4 #xf5 #xf6 #xf7 ; #xf0-#xf7 + #xf8 #xf9 #xfa #xfb #xfc #xfd #xfe #xff) ; #xf8-#xff + :test #'equalp) + +(define-constant +unicode-150-180-to-iso-8859-15+ + #(nil nil #xbc #xbd nil nil nil nil ; #x150-#x157 + nil nil nil nil nil nil nil nil ; #x158-#x15f + #xa6 #xa8 nil nil nil nil nil nil ; #x160-#x167 + nil nil nil nil nil nil nil nil ; #x168-#x16f + nil nil nil nil nil nil nil nil ; #x170-#x177 + #xbe nil nil nil nil #xb4 #xb8 nil) ; #x178-#x17f + :test #'equalp) + +(define-unibyte-encoder :iso-8859-15 (code) + (or (cond ((< code #xa0) code) + ((< code #x100) + (svref +unicode-a0-100-to-iso-8859-15+ + (the ub8 (- code #xa0)))) + ((<= #x150 code #x1f7) + (svref +unicode-150-180-to-iso-8859-15+ + (the ub8 (- code #x150)))) + ;; Euro sign + ((= code #x20ac) #xa4)) + (handle-error))) + +(define-constant +iso-8859-15-to-unicode+ + #(;; #xa0 + #x00a0 #x00a1 #x00a2 #x00a3 #x20ac #x00a5 #x0160 #x00a7 + #x0161 #x00a9 #x00aa #x00ab #x00ac #x00ad #x00ae #x00af + ;; #xb0 + #x00b0 #x00b1 #x00b2 #x00b3 #x017d #x00b5 #x00b6 #x00b7 + #x017e #x00b9 #x00ba #x00bb #x0152 #x0153 #x0178 #x00bf + ;; #xc0 + #x00c0 #x00c1 #x00c2 #x00c3 #x00c4 #x00c5 #x00c6 #x00c7 + ;; #xc8 + #x00c8 #x00c9 #x00ca #x00cb #x00cc #x00cd #x00ce #x00cf + ;; #xd0 + #x00d0 #x00d1 #x00d2 #x00d3 #x00d4 #x00d5 #x00d6 #x00d7 + ;; #xd8 + #x00d8 #x00d9 #x00da #x00db #x00dc #x00dd #x00de #x00df + ;; #xe0 + #x00e0 #x00e1 #x00e2 #x00e3 #x00e4 #x00e5 #x00e6 #x00e7 + ;; #xe8 + #x00e8 #x00e9 #x00ea #x00eb #x00ec #x00ed #x00ee #x00ef + ;; #xf0 + #x00f0 #x00f1 #x00f2 #x00f3 #x00f4 #x00f5 #x00f6 #x00f7 + ;; #xf8 + #x00f8 #x00f9 #x00fa #x00fb #x00fc #x00fd #x00fe #x00ff) + :test #'equalp) + +(define-unibyte-decoder :iso-8859-15 (octet) + (if (< octet #xa0) + octet + (svref +iso-8859-15-to-unicode+ (the ub8 (- octet #xa0))))) + +(define-character-encoding :iso-8859-16 + "An 8-bit, fixed-width character encoding in which codes +#x00-#x9f map to their Unicode equivalents and other codes map to +other Unicode character values. Intended to provide most +characters found in Southeast European languages." + :aliases '(:latin-10 :latin10) + :literal-char-code-limit #xa0) + +(define-constant +unicode-a0-180-to-iso-8859-16+ + #(#xa0 nil nil nil nil nil nil #xa7 ; #xa0-#xa7 + nil #xa9 nil #xab nil #xad nil nil ; #xa8-#xaf + #xb0 #xb1 nil nil nil nil #xb6 #xb7 ; #xb0-#xb7 + nil nil nil #xbb nil nil nil nil ; #xb8-#xbf + #xc0 #xc1 #xc2 nil #xc4 nil #xc6 #xc7 ; #xc0-#xc7 + #xc8 #xc9 #xca #xcb #xcc #xcd #xce #xcf ; #xc8-#xcf + nil nil #xd2 #xd3 #xd4 nil #xd6 nil ; #xd0-#xd7 + nil #xd9 #xda #xdb #xdc nil nil #xdf ; #xd8-#xdf + #xe0 #xe1 #xe2 nil #xe4 nil #xe6 #xe7 ; #xe0-#xe7 + #xe8 #xe9 #xea #xeb #xec #xed #xee #xef ; #xe8-#xef + nil nil #xf2 #xf3 #xf4 nil #xf6 nil ; #xf0-#xf7 + nil #xf9 #xfa #xfb #xfc nil nil #xff ; #xf8-#xff + nil nil #xc3 #xe3 #xa1 #xa2 #xc5 #xe5 ; #x100-#x107 + nil nil nil nil #xb2 #xb9 nil nil ; #x108-#x10f + #xd0 #xf0 nil nil nil nil nil nil ; #x110-#x117 + #xdd #xfd nil nil nil nil nil nil ; #x118-#x11f + nil nil nil nil nil nil nil nil ; #x120-#x127 + nil nil nil nil nil nil nil nil ; #x128-#x12f + nil nil nil nil nil nil nil nil ; #x130-#x137 + nil nil nil nil nil nil nil nil ; #x138-#x13f + nil #xa3 #xb3 #xd1 #xf1 nil nil nil ; #x140-#x147 + nil nil nil nil nil nil nil nil ; #x148-#x14f + #xd5 #xf5 #xbc #xbd nil nil nil nil ; #x150-#x157 + nil nil #xd7 #xf7 nil nil nil nil ; #x158-#x15f + #xa6 #xa8 nil nil nil nil nil nil ; #x160-#x167 + nil nil nil nil nil nil nil nil ; #x168-#x16f + #xd8 #xf8 nil nil nil nil nil nil ; #x170-#x177 + #xbe #xac #xae #xaf #xbf #xb4 #xb8 nil) ; #x178-#x17f + :test #'equalp) + +(define-constant +unicode-218-220-to-iso-8859-16+ + #(#xaa #xba #xde #xfe nil nil nil nil) ; #x218-#x21f + :test #'equalp) + +(define-constant +unicode-2018-2020-to-iso-8859-16+ + #(nil nil nil nil nil #xb5 #xa5 nil) ; #x2018-#x201f + :test #'equalp) + +(define-unibyte-encoder :iso-8859-16 (code) + (or (cond ((< code #xa0) code) + ((< code #x180) + (svref +unicode-a0-180-to-iso-8859-16+ + (the ub8 (- code #xa0)))) + ((<= #x218 code #x21f) + (svref +unicode-218-220-to-iso-8859-16+ + (the ub8 (- code #x218)))) + ((< #x2018 code #x201f) + (svref +unicode-2018-2020-to-iso-8859-16+ + (the ub8 (- code #x2018)))) + ;; Euro sign + ((= code #x20ac) #xa4)) + (handle-error))) + +(define-constant +iso-8859-16-to-unicode+ + #(;; #xa0 + #x00a0 #x0104 #x0105 #x0141 #x20ac #x201e #x0160 #x00a7 + #x0161 #x00a9 #x0218 #x00ab #x0179 #x00ad #x017a #x017b + ;; #xb0 + #x00b0 #x00b1 #x010c #x0142 #x017d #x201d #x00b6 #x00b7 + #x017e #x010d #x0219 #x00bb #x0152 #x0153 #x0178 #x017c + ;; #xc0 + #x00c0 #x00c1 #x00c2 #x0102 #x00c4 #x0106 #x00c6 #x00c7 + #x00c8 #x00c9 #x00ca #x00cb #x00cc #x00cd #x00ce #x00cf + ;; #xd0 + #x0110 #x0143 #x00d2 #x00d3 #x00d4 #x0150 #x00d6 #x015a + #x0170 #x00d9 #x00da #x00db #x00dc #x0118 #x021a #x00df + ;; #xe0 + #x00e0 #x00e1 #x00e2 #x0103 #x00e4 #x0107 #x00e6 #x00e7 + #x00e8 #x00e9 #x00ea #x00eb #x00ec #x00ed #x00ee #x00ef + ;; #xf0 + #x0111 #x0144 #x00f2 #x00f3 #x00f4 #x0151 #x00f6 #x015b + #x0171 #x00f9 #x00fa #x00fb #x00fc #x0119 #x021b #x00ff) + :test #'equalp) + +(define-unibyte-decoder :iso-8859-16 (octet) + (if (< octet #xa0) + octet + (svref +iso-8859-16-to-unicode+ (the ub8 (- octet #xa0))))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/src/enc-jpn.lisp b/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/src/enc-jpn.lisp new file mode 100644 index 0000000..9504f89 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/src/enc-jpn.lisp @@ -0,0 +1,767 @@ +;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- +;;; +;;; enc-jpn.lisp --- Japanese encodings. +;;; + +(in-package #:babel-encodings) + +;;;; helper functions +(defvar *eucjp-to-ucs-hash* (make-hash-table)) +(defvar *ucs-to-eucjp-hash* (make-hash-table)) +(defvar *cp932-to-ucs-hash* (make-hash-table)) +(defvar *ucs-to-cp932-hash* (make-hash-table)) + +(dolist (i `((,*cp932-only* + ,*cp932-to-ucs-hash* + ,*ucs-to-cp932-hash*) + (,*eucjp-only* + ,*eucjp-to-ucs-hash* + ,*ucs-to-eucjp-hash*) + (,*eucjp* + ,*eucjp-to-ucs-hash* + ,*ucs-to-eucjp-hash*))) + (dolist (j (first i)) + (setf (gethash (car j) (second i)) (cadr j)) + (setf (gethash (cadr j) (third i)) (car j)))) + +(flet ((euc-cp932 (x) + (let ((high (ash x -16)) + (mid (logand (ash x -8) 255)) + (low (logand x 255))) + (cond ((not (zerop high)) + nil) + ((= mid #x8e) + (logand x 255)) + ((zerop mid) + x) + ((decf mid #xa1) + (decf low #x80) + (incf low (if (zerop (logand mid 1)) #x1f #x7e)) + (incf low (if (<= #x7f low #x9d) 1 0)) + (setq mid (ash mid -1)) + (incf mid (if (<= mid #x1e) #x81 #xc1)) + (+ (ash mid 8) low)))))) + (dolist (i *eucjp*) + (let ((cp932 (euc-cp932 (first i)))) + (when cp932 + (setf (gethash cp932 *cp932-to-ucs-hash*) (second i)) + (setf (gethash (second i) *ucs-to-cp932-hash*) cp932))))) + +;ascii +(loop for i from #x00 to #x7f do + (setf (gethash i *cp932-to-ucs-hash*) i) + (setf (gethash i *eucjp-to-ucs-hash*) i) + (setf (gethash i *ucs-to-eucjp-hash*) i) + (setf (gethash i *ucs-to-cp932-hash*) i)) + +;half-width katakana +(loop for i from #xa1 to #xdf do + (setf (gethash i *cp932-to-ucs-hash*) (+ #xff61 #x-a1 i)) + (setf (gethash (+ #xff61 #x-a1 i) *ucs-to-cp932-hash*) i) + (setf (gethash (+ #x8e00 i) *eucjp-to-ucs-hash*) (+ #xff61 #x-a1 i)) + (setf (gethash (+ #xff61 #x-a1 i) *ucs-to-eucjp-hash*) (+ #x8e00 i))) + +;; This is quoted from https://support.microsoft.com/en-us/kb/170559/en-us +(let ((kb170559 "0x8790 -> U+2252 -> 0x81e0 Approximately Equal To Or The Image Of +0x8791 -> U+2261 -> 0x81df Identical To +0x8792 -> U+222b -> 0x81e7 Integral +0x8795 -> U+221a -> 0x81e3 Square Root +0x8796 -> U+22a5 -> 0x81db Up Tack +0x8797 -> U+2220 -> 0x81da Angle +0x879a -> U+2235 -> 0x81e6 Because +0x879b -> U+2229 -> 0x81bf Intersection +0x879c -> U+222a -> 0x81be Union +0xed40 -> U+7e8a -> 0xfa5c CJK Unified Ideograph +0xed41 -> U+891c -> 0xfa5d CJK Unified Ideograph +0xed42 -> U+9348 -> 0xfa5e CJK Unified Ideograph +0xed43 -> U+9288 -> 0xfa5f CJK Unified Ideograph +0xed44 -> U+84dc -> 0xfa60 CJK Unified Ideograph +0xed45 -> U+4fc9 -> 0xfa61 CJK Unified Ideograph +0xed46 -> U+70bb -> 0xfa62 CJK Unified Ideograph +0xed47 -> U+6631 -> 0xfa63 CJK Unified Ideograph +0xed48 -> U+68c8 -> 0xfa64 CJK Unified Ideograph +0xed49 -> U+92f9 -> 0xfa65 CJK Unified Ideograph +0xed4a -> U+66fb -> 0xfa66 CJK Unified Ideograph +0xed4b -> U+5f45 -> 0xfa67 CJK Unified Ideograph +0xed4c -> U+4e28 -> 0xfa68 CJK Unified Ideograph +0xed4d -> U+4ee1 -> 0xfa69 CJK Unified Ideograph +0xed4e -> U+4efc -> 0xfa6a CJK Unified Ideograph +0xed4f -> U+4f00 -> 0xfa6b CJK Unified Ideograph +0xed50 -> U+4f03 -> 0xfa6c CJK Unified Ideograph +0xed51 -> U+4f39 -> 0xfa6d CJK Unified Ideograph +0xed52 -> U+4f56 -> 0xfa6e CJK Unified Ideograph +0xed53 -> U+4f92 -> 0xfa6f CJK Unified Ideograph +0xed54 -> U+4f8a -> 0xfa70 CJK Unified Ideograph +0xed55 -> U+4f9a -> 0xfa71 CJK Unified Ideograph +0xed56 -> U+4f94 -> 0xfa72 CJK Unified Ideograph +0xed57 -> U+4fcd -> 0xfa73 CJK Unified Ideograph +0xed58 -> U+5040 -> 0xfa74 CJK Unified Ideograph +0xed59 -> U+5022 -> 0xfa75 CJK Unified Ideograph +0xed5a -> U+4fff -> 0xfa76 CJK Unified Ideograph +0xed5b -> U+501e -> 0xfa77 CJK Unified Ideograph +0xed5c -> U+5046 -> 0xfa78 CJK Unified Ideograph +0xed5d -> U+5070 -> 0xfa79 CJK Unified Ideograph +0xed5e -> U+5042 -> 0xfa7a CJK Unified Ideograph +0xed5f -> U+5094 -> 0xfa7b CJK Unified Ideograph +0xed60 -> U+50f4 -> 0xfa7c CJK Unified Ideograph +0xed61 -> U+50d8 -> 0xfa7d CJK Unified Ideograph +0xed62 -> U+514a -> 0xfa7e CJK Unified Ideograph +0xed63 -> U+5164 -> 0xfa80 CJK Unified Ideograph +0xed64 -> U+519d -> 0xfa81 CJK Unified Ideograph +0xed65 -> U+51be -> 0xfa82 CJK Unified Ideograph +0xed66 -> U+51ec -> 0xfa83 CJK Unified Ideograph +0xed67 -> U+5215 -> 0xfa84 CJK Unified Ideograph +0xed68 -> U+529c -> 0xfa85 CJK Unified Ideograph +0xed69 -> U+52a6 -> 0xfa86 CJK Unified Ideograph +0xed6a -> U+52c0 -> 0xfa87 CJK Unified Ideograph +0xed6b -> U+52db -> 0xfa88 CJK Unified Ideograph +0xed6c -> U+5300 -> 0xfa89 CJK Unified Ideograph +0xed6d -> U+5307 -> 0xfa8a CJK Unified Ideograph +0xed6e -> U+5324 -> 0xfa8b CJK Unified Ideograph +0xed6f -> U+5372 -> 0xfa8c CJK Unified Ideograph +0xed70 -> U+5393 -> 0xfa8d CJK Unified Ideograph +0xed71 -> U+53b2 -> 0xfa8e CJK Unified Ideograph +0xed72 -> U+53dd -> 0xfa8f CJK Unified Ideograph +0xed73 -> U+fa0e -> 0xfa90 CJK compatibility Ideograph +0xed74 -> U+549c -> 0xfa91 CJK Unified Ideograph +0xed75 -> U+548a -> 0xfa92 CJK Unified Ideograph +0xed76 -> U+54a9 -> 0xfa93 CJK Unified Ideograph +0xed77 -> U+54ff -> 0xfa94 CJK Unified Ideograph +0xed78 -> U+5586 -> 0xfa95 CJK Unified Ideograph +0xed79 -> U+5759 -> 0xfa96 CJK Unified Ideograph +0xed7a -> U+5765 -> 0xfa97 CJK Unified Ideograph +0xed7b -> U+57ac -> 0xfa98 CJK Unified Ideograph +0xed7c -> U+57c8 -> 0xfa99 CJK Unified Ideograph +0xed7d -> U+57c7 -> 0xfa9a CJK Unified Ideograph +0xed7e -> U+fa0f -> 0xfa9b CJK compatibility Ideograph +0xed80 -> U+fa10 -> 0xfa9c CJK compatibility Ideograph +0xed81 -> U+589e -> 0xfa9d CJK Unified Ideograph +0xed82 -> U+58b2 -> 0xfa9e CJK Unified Ideograph +0xed83 -> U+590b -> 0xfa9f CJK Unified Ideograph +0xed84 -> U+5953 -> 0xfaa0 CJK Unified Ideograph +0xed85 -> U+595b -> 0xfaa1 CJK Unified Ideograph +0xed86 -> U+595d -> 0xfaa2 CJK Unified Ideograph +0xed87 -> U+5963 -> 0xfaa3 CJK Unified Ideograph +0xed88 -> U+59a4 -> 0xfaa4 CJK Unified Ideograph +0xed89 -> U+59ba -> 0xfaa5 CJK Unified Ideograph +0xed8a -> U+5b56 -> 0xfaa6 CJK Unified Ideograph +0xed8b -> U+5bc0 -> 0xfaa7 CJK Unified Ideograph +0xed8c -> U+752f -> 0xfaa8 CJK Unified Ideograph +0xed8d -> U+5bd8 -> 0xfaa9 CJK Unified Ideograph +0xed8e -> U+5bec -> 0xfaaa CJK Unified Ideograph +0xed8f -> U+5c1e -> 0xfaab CJK Unified Ideograph +0xed90 -> U+5ca6 -> 0xfaac CJK Unified Ideograph +0xed91 -> U+5cba -> 0xfaad CJK Unified Ideograph +0xed92 -> U+5cf5 -> 0xfaae CJK Unified Ideograph +0xed93 -> U+5d27 -> 0xfaaf CJK Unified Ideograph +0xed94 -> U+5d53 -> 0xfab0 CJK Unified Ideograph +0xed95 -> U+fa11 -> 0xfab1 CJK compatibility Ideograph +0xed96 -> U+5d42 -> 0xfab2 CJK Unified Ideograph +0xed97 -> U+5d6d -> 0xfab3 CJK Unified Ideograph +0xed98 -> U+5db8 -> 0xfab4 CJK Unified Ideograph +0xed99 -> U+5db9 -> 0xfab5 CJK Unified Ideograph +0xed9a -> U+5dd0 -> 0xfab6 CJK Unified Ideograph +0xed9b -> U+5f21 -> 0xfab7 CJK Unified Ideograph +0xed9c -> U+5f34 -> 0xfab8 CJK Unified Ideograph +0xed9d -> U+5f67 -> 0xfab9 CJK Unified Ideograph +0xed9e -> U+5fb7 -> 0xfaba CJK Unified Ideograph +0xed9f -> U+5fde -> 0xfabb CJK Unified Ideograph +0xeda0 -> U+605d -> 0xfabc CJK Unified Ideograph +0xeda1 -> U+6085 -> 0xfabd CJK Unified Ideograph +0xeda2 -> U+608a -> 0xfabe CJK Unified Ideograph +0xeda3 -> U+60de -> 0xfabf CJK Unified Ideograph +0xeda4 -> U+60d5 -> 0xfac0 CJK Unified Ideograph +0xeda5 -> U+6120 -> 0xfac1 CJK Unified Ideograph +0xeda6 -> U+60f2 -> 0xfac2 CJK Unified Ideograph +0xeda7 -> U+6111 -> 0xfac3 CJK Unified Ideograph +0xeda8 -> U+6137 -> 0xfac4 CJK Unified Ideograph +0xeda9 -> U+6130 -> 0xfac5 CJK Unified Ideograph +0xedaa -> U+6198 -> 0xfac6 CJK Unified Ideograph +0xedab -> U+6213 -> 0xfac7 CJK Unified Ideograph +0xedac -> U+62a6 -> 0xfac8 CJK Unified Ideograph +0xedad -> U+63f5 -> 0xfac9 CJK Unified Ideograph +0xedae -> U+6460 -> 0xfaca CJK Unified Ideograph +0xedaf -> U+649d -> 0xfacb CJK Unified Ideograph +0xedb0 -> U+64ce -> 0xfacc CJK Unified Ideograph +0xedb1 -> U+654e -> 0xfacd CJK Unified Ideograph +0xedb2 -> U+6600 -> 0xface CJK Unified Ideograph +0xedb3 -> U+6615 -> 0xfacf CJK Unified Ideograph +0xedb4 -> U+663b -> 0xfad0 CJK Unified Ideograph +0xedb5 -> U+6609 -> 0xfad1 CJK Unified Ideograph +0xedb6 -> U+662e -> 0xfad2 CJK Unified Ideograph +0xedb7 -> U+661e -> 0xfad3 CJK Unified Ideograph +0xedb8 -> U+6624 -> 0xfad4 CJK Unified Ideograph +0xedb9 -> U+6665 -> 0xfad5 CJK Unified Ideograph +0xedba -> U+6657 -> 0xfad6 CJK Unified Ideograph +0xedbb -> U+6659 -> 0xfad7 CJK Unified Ideograph +0xedbc -> U+fa12 -> 0xfad8 CJK compatibility Ideograph +0xedbd -> U+6673 -> 0xfad9 CJK Unified Ideograph +0xedbe -> U+6699 -> 0xfada CJK Unified Ideograph +0xedbf -> U+66a0 -> 0xfadb CJK Unified Ideograph +0xedc0 -> U+66b2 -> 0xfadc CJK Unified Ideograph +0xedc1 -> U+66bf -> 0xfadd CJK Unified Ideograph +0xedc2 -> U+66fa -> 0xfade CJK Unified Ideograph +0xedc3 -> U+670e -> 0xfadf CJK Unified Ideograph +0xedc4 -> U+f929 -> 0xfae0 CJK compatibility Ideograph +0xedc5 -> U+6766 -> 0xfae1 CJK Unified Ideograph +0xedc6 -> U+67bb -> 0xfae2 CJK Unified Ideograph +0xedc7 -> U+6852 -> 0xfae3 CJK Unified Ideograph +0xedc8 -> U+67c0 -> 0xfae4 CJK Unified Ideograph +0xedc9 -> U+6801 -> 0xfae5 CJK Unified Ideograph +0xedca -> U+6844 -> 0xfae6 CJK Unified Ideograph +0xedcb -> U+68cf -> 0xfae7 CJK Unified Ideograph +0xedcc -> U+fa13 -> 0xfae8 CJK compatibility Ideograph +0xedcd -> U+6968 -> 0xfae9 CJK Unified Ideograph +0xedce -> U+fa14 -> 0xfaea CJK compatibility Ideograph +0xedcf -> U+6998 -> 0xfaeb CJK Unified Ideograph +0xedd0 -> U+69e2 -> 0xfaec CJK Unified Ideograph +0xedd1 -> U+6a30 -> 0xfaed CJK Unified Ideograph +0xedd2 -> U+6a6b -> 0xfaee CJK Unified Ideograph +0xedd3 -> U+6a46 -> 0xfaef CJK Unified Ideograph +0xedd4 -> U+6a73 -> 0xfaf0 CJK Unified Ideograph +0xedd5 -> U+6a7e -> 0xfaf1 CJK Unified Ideograph +0xedd6 -> U+6ae2 -> 0xfaf2 CJK Unified Ideograph +0xedd7 -> U+6ae4 -> 0xfaf3 CJK Unified Ideograph +0xedd8 -> U+6bd6 -> 0xfaf4 CJK Unified Ideograph +0xedd9 -> U+6c3f -> 0xfaf5 CJK Unified Ideograph +0xedda -> U+6c5c -> 0xfaf6 CJK Unified Ideograph +0xeddb -> U+6c86 -> 0xfaf7 CJK Unified Ideograph +0xeddc -> U+6c6f -> 0xfaf8 CJK Unified Ideograph +0xeddd -> U+6cda -> 0xfaf9 CJK Unified Ideograph +0xedde -> U+6d04 -> 0xfafa CJK Unified Ideograph +0xeddf -> U+6d87 -> 0xfafb CJK Unified Ideograph +0xede0 -> U+6d6f -> 0xfafc CJK Unified Ideograph +0xede1 -> U+6d96 -> 0xfb40 CJK Unified Ideograph +0xede2 -> U+6dac -> 0xfb41 CJK Unified Ideograph +0xede3 -> U+6dcf -> 0xfb42 CJK Unified Ideograph +0xede4 -> U+6df8 -> 0xfb43 CJK Unified Ideograph +0xede5 -> U+6df2 -> 0xfb44 CJK Unified Ideograph +0xede6 -> U+6dfc -> 0xfb45 CJK Unified Ideograph +0xede7 -> U+6e39 -> 0xfb46 CJK Unified Ideograph +0xede8 -> U+6e5c -> 0xfb47 CJK Unified Ideograph +0xede9 -> U+6e27 -> 0xfb48 CJK Unified Ideograph +0xedea -> U+6e3c -> 0xfb49 CJK Unified Ideograph +0xedeb -> U+6ebf -> 0xfb4a CJK Unified Ideograph +0xedec -> U+6f88 -> 0xfb4b CJK Unified Ideograph +0xeded -> U+6fb5 -> 0xfb4c CJK Unified Ideograph +0xedee -> U+6ff5 -> 0xfb4d CJK Unified Ideograph +0xedef -> U+7005 -> 0xfb4e CJK Unified Ideograph +0xedf0 -> U+7007 -> 0xfb4f CJK Unified Ideograph +0xedf1 -> U+7028 -> 0xfb50 CJK Unified Ideograph +0xedf2 -> U+7085 -> 0xfb51 CJK Unified Ideograph +0xedf3 -> U+70ab -> 0xfb52 CJK Unified Ideograph +0xedf4 -> U+710f -> 0xfb53 CJK Unified Ideograph +0xedf5 -> U+7104 -> 0xfb54 CJK Unified Ideograph +0xedf6 -> U+715c -> 0xfb55 CJK Unified Ideograph +0xedf7 -> U+7146 -> 0xfb56 CJK Unified Ideograph +0xedf8 -> U+7147 -> 0xfb57 CJK Unified Ideograph +0xedf9 -> U+fa15 -> 0xfb58 CJK compatibility Ideograph +0xedfa -> U+71c1 -> 0xfb59 CJK Unified Ideograph +0xedfb -> U+71fe -> 0xfb5a CJK Unified Ideograph +0xedfc -> U+72b1 -> 0xfb5b CJK Unified Ideograph +0xee40 -> U+72be -> 0xfb5c CJK Unified Ideograph +0xee41 -> U+7324 -> 0xfb5d CJK Unified Ideograph +0xee42 -> U+fa16 -> 0xfb5e CJK compatibility Ideograph +0xee43 -> U+7377 -> 0xfb5f CJK Unified Ideograph +0xee44 -> U+73bd -> 0xfb60 CJK Unified Ideograph +0xee45 -> U+73c9 -> 0xfb61 CJK Unified Ideograph +0xee46 -> U+73d6 -> 0xfb62 CJK Unified Ideograph +0xee47 -> U+73e3 -> 0xfb63 CJK Unified Ideograph +0xee48 -> U+73d2 -> 0xfb64 CJK Unified Ideograph +0xee49 -> U+7407 -> 0xfb65 CJK Unified Ideograph +0xee4a -> U+73f5 -> 0xfb66 CJK Unified Ideograph +0xee4b -> U+7426 -> 0xfb67 CJK Unified Ideograph +0xee4c -> U+742a -> 0xfb68 CJK Unified Ideograph +0xee4d -> U+7429 -> 0xfb69 CJK Unified Ideograph +0xee4e -> U+742e -> 0xfb6a CJK Unified Ideograph +0xee4f -> U+7462 -> 0xfb6b CJK Unified Ideograph +0xee50 -> U+7489 -> 0xfb6c CJK Unified Ideograph +0xee51 -> U+749f -> 0xfb6d CJK Unified Ideograph +0xee52 -> U+7501 -> 0xfb6e CJK Unified Ideograph +0xee53 -> U+756f -> 0xfb6f CJK Unified Ideograph +0xee54 -> U+7682 -> 0xfb70 CJK Unified Ideograph +0xee55 -> U+769c -> 0xfb71 CJK Unified Ideograph +0xee56 -> U+769e -> 0xfb72 CJK Unified Ideograph +0xee57 -> U+769b -> 0xfb73 CJK Unified Ideograph +0xee58 -> U+76a6 -> 0xfb74 CJK Unified Ideograph +0xee59 -> U+fa17 -> 0xfb75 CJK compatibility Ideograph +0xee5a -> U+7746 -> 0xfb76 CJK Unified Ideograph +0xee5b -> U+52af -> 0xfb77 CJK Unified Ideograph +0xee5c -> U+7821 -> 0xfb78 CJK Unified Ideograph +0xee5d -> U+784e -> 0xfb79 CJK Unified Ideograph +0xee5e -> U+7864 -> 0xfb7a CJK Unified Ideograph +0xee5f -> U+787a -> 0xfb7b CJK Unified Ideograph +0xee60 -> U+7930 -> 0xfb7c CJK Unified Ideograph +0xee61 -> U+fa18 -> 0xfb7d CJK compatibility Ideograph +0xee62 -> U+fa19 -> 0xfb7e CJK compatibility Ideograph +0xee63 -> U+fa1a -> 0xfb80 CJK compatibility Ideograph +0xee64 -> U+7994 -> 0xfb81 CJK Unified Ideograph +0xee65 -> U+fa1b -> 0xfb82 CJK compatibility Ideograph +0xee66 -> U+799b -> 0xfb83 CJK Unified Ideograph +0xee67 -> U+7ad1 -> 0xfb84 CJK Unified Ideograph +0xee68 -> U+7ae7 -> 0xfb85 CJK Unified Ideograph +0xee69 -> U+fa1c -> 0xfb86 CJK compatibility Ideograph +0xee6a -> U+7aeb -> 0xfb87 CJK Unified Ideograph +0xee6b -> U+7b9e -> 0xfb88 CJK Unified Ideograph +0xee6c -> U+fa1d -> 0xfb89 CJK compatibility Ideograph +0xee6d -> U+7d48 -> 0xfb8a CJK Unified Ideograph +0xee6e -> U+7d5c -> 0xfb8b CJK Unified Ideograph +0xee6f -> U+7db7 -> 0xfb8c CJK Unified Ideograph +0xee70 -> U+7da0 -> 0xfb8d CJK Unified Ideograph +0xee71 -> U+7dd6 -> 0xfb8e CJK Unified Ideograph +0xee72 -> U+7e52 -> 0xfb8f CJK Unified Ideograph +0xee73 -> U+7f47 -> 0xfb90 CJK Unified Ideograph +0xee74 -> U+7fa1 -> 0xfb91 CJK Unified Ideograph +0xee75 -> U+fa1e -> 0xfb92 CJK compatibility Ideograph +0xee76 -> U+8301 -> 0xfb93 CJK Unified Ideograph +0xee77 -> U+8362 -> 0xfb94 CJK Unified Ideograph +0xee78 -> U+837f -> 0xfb95 CJK Unified Ideograph +0xee79 -> U+83c7 -> 0xfb96 CJK Unified Ideograph +0xee7a -> U+83f6 -> 0xfb97 CJK Unified Ideograph +0xee7b -> U+8448 -> 0xfb98 CJK Unified Ideograph +0xee7c -> U+84b4 -> 0xfb99 CJK Unified Ideograph +0xee7d -> U+8553 -> 0xfb9a CJK Unified Ideograph +0xee7e -> U+8559 -> 0xfb9b CJK Unified Ideograph +0xee80 -> U+856b -> 0xfb9c CJK Unified Ideograph +0xee81 -> U+fa1f -> 0xfb9d CJK compatibility Ideograph +0xee82 -> U+85b0 -> 0xfb9e CJK Unified Ideograph +0xee83 -> U+fa20 -> 0xfb9f CJK compatibility Ideograph +0xee84 -> U+fa21 -> 0xfba0 CJK compatibility Ideograph +0xee85 -> U+8807 -> 0xfba1 CJK Unified Ideograph +0xee86 -> U+88f5 -> 0xfba2 CJK Unified Ideograph +0xee87 -> U+8a12 -> 0xfba3 CJK Unified Ideograph +0xee88 -> U+8a37 -> 0xfba4 CJK Unified Ideograph +0xee89 -> U+8a79 -> 0xfba5 CJK Unified Ideograph +0xee8a -> U+8aa7 -> 0xfba6 CJK Unified Ideograph +0xee8b -> U+8abe -> 0xfba7 CJK Unified Ideograph +0xee8c -> U+8adf -> 0xfba8 CJK Unified Ideograph +0xee8d -> U+fa22 -> 0xfba9 CJK compatibility Ideograph +0xee8e -> U+8af6 -> 0xfbaa CJK Unified Ideograph +0xee8f -> U+8b53 -> 0xfbab CJK Unified Ideograph +0xee90 -> U+8b7f -> 0xfbac CJK Unified Ideograph +0xee91 -> U+8cf0 -> 0xfbad CJK Unified Ideograph +0xee92 -> U+8cf4 -> 0xfbae CJK Unified Ideograph +0xee93 -> U+8d12 -> 0xfbaf CJK Unified Ideograph +0xee94 -> U+8d76 -> 0xfbb0 CJK Unified Ideograph +0xee95 -> U+fa23 -> 0xfbb1 CJK compatibility Ideograph +0xee96 -> U+8ecf -> 0xfbb2 CJK Unified Ideograph +0xee97 -> U+fa24 -> 0xfbb3 CJK compatibility Ideograph +0xee98 -> U+fa25 -> 0xfbb4 CJK compatibility Ideograph +0xee99 -> U+9067 -> 0xfbb5 CJK Unified Ideograph +0xee9a -> U+90de -> 0xfbb6 CJK Unified Ideograph +0xee9b -> U+fa26 -> 0xfbb7 CJK compatibility Ideograph +0xee9c -> U+9115 -> 0xfbb8 CJK Unified Ideograph +0xee9d -> U+9127 -> 0xfbb9 CJK Unified Ideograph +0xee9e -> U+91da -> 0xfbba CJK Unified Ideograph +0xee9f -> U+91d7 -> 0xfbbb CJK Unified Ideograph +0xeea0 -> U+91de -> 0xfbbc CJK Unified Ideograph +0xeea1 -> U+91ed -> 0xfbbd CJK Unified Ideograph +0xeea2 -> U+91ee -> 0xfbbe CJK Unified Ideograph +0xeea3 -> U+91e4 -> 0xfbbf CJK Unified Ideograph +0xeea4 -> U+91e5 -> 0xfbc0 CJK Unified Ideograph +0xeea5 -> U+9206 -> 0xfbc1 CJK Unified Ideograph +0xeea6 -> U+9210 -> 0xfbc2 CJK Unified Ideograph +0xeea7 -> U+920a -> 0xfbc3 CJK Unified Ideograph +0xeea8 -> U+923a -> 0xfbc4 CJK Unified Ideograph +0xeea9 -> U+9240 -> 0xfbc5 CJK Unified Ideograph +0xeeaa -> U+923c -> 0xfbc6 CJK Unified Ideograph +0xeeab -> U+924e -> 0xfbc7 CJK Unified Ideograph +0xeeac -> U+9259 -> 0xfbc8 CJK Unified Ideograph +0xeead -> U+9251 -> 0xfbc9 CJK Unified Ideograph +0xeeae -> U+9239 -> 0xfbca CJK Unified Ideograph +0xeeaf -> U+9267 -> 0xfbcb CJK Unified Ideograph +0xeeb0 -> U+92a7 -> 0xfbcc CJK Unified Ideograph +0xeeb1 -> U+9277 -> 0xfbcd CJK Unified Ideograph +0xeeb2 -> U+9278 -> 0xfbce CJK Unified Ideograph +0xeeb3 -> U+92e7 -> 0xfbcf CJK Unified Ideograph +0xeeb4 -> U+92d7 -> 0xfbd0 CJK Unified Ideograph +0xeeb5 -> U+92d9 -> 0xfbd1 CJK Unified Ideograph +0xeeb6 -> U+92d0 -> 0xfbd2 CJK Unified Ideograph +0xeeb7 -> U+fa27 -> 0xfbd3 CJK compatibility Ideograph +0xeeb8 -> U+92d5 -> 0xfbd4 CJK Unified Ideograph +0xeeb9 -> U+92e0 -> 0xfbd5 CJK Unified Ideograph +0xeeba -> U+92d3 -> 0xfbd6 CJK Unified Ideograph +0xeebb -> U+9325 -> 0xfbd7 CJK Unified Ideograph +0xeebc -> U+9321 -> 0xfbd8 CJK Unified Ideograph +0xeebd -> U+92fb -> 0xfbd9 CJK Unified Ideograph +0xeebe -> U+fa28 -> 0xfbda CJK compatibility Ideograph +0xeebf -> U+931e -> 0xfbdb CJK Unified Ideograph +0xeec0 -> U+92ff -> 0xfbdc CJK Unified Ideograph +0xeec1 -> U+931d -> 0xfbdd CJK Unified Ideograph +0xeec2 -> U+9302 -> 0xfbde CJK Unified Ideograph +0xeec3 -> U+9370 -> 0xfbdf CJK Unified Ideograph +0xeec4 -> U+9357 -> 0xfbe0 CJK Unified Ideograph +0xeec5 -> U+93a4 -> 0xfbe1 CJK Unified Ideograph +0xeec6 -> U+93c6 -> 0xfbe2 CJK Unified Ideograph +0xeec7 -> U+93de -> 0xfbe3 CJK Unified Ideograph +0xeec8 -> U+93f8 -> 0xfbe4 CJK Unified Ideograph +0xeec9 -> U+9431 -> 0xfbe5 CJK Unified Ideograph +0xeeca -> U+9445 -> 0xfbe6 CJK Unified Ideograph +0xeecb -> U+9448 -> 0xfbe7 CJK Unified Ideograph +0xeecc -> U+9592 -> 0xfbe8 CJK Unified Ideograph +0xeecd -> U+f9dc -> 0xfbe9 CJK compatibility Ideograph +0xeece -> U+fa29 -> 0xfbea CJK compatibility Ideograph +0xeecf -> U+969d -> 0xfbeb CJK Unified Ideograph +0xeed0 -> U+96af -> 0xfbec CJK Unified Ideograph +0xeed1 -> U+9733 -> 0xfbed CJK Unified Ideograph +0xeed2 -> U+973b -> 0xfbee CJK Unified Ideograph +0xeed3 -> U+9743 -> 0xfbef CJK Unified Ideograph +0xeed4 -> U+974d -> 0xfbf0 CJK Unified Ideograph +0xeed5 -> U+974f -> 0xfbf1 CJK Unified Ideograph +0xeed6 -> U+9751 -> 0xfbf2 CJK Unified Ideograph +0xeed7 -> U+9755 -> 0xfbf3 CJK Unified Ideograph +0xeed8 -> U+9857 -> 0xfbf4 CJK Unified Ideograph +0xeed9 -> U+9865 -> 0xfbf5 CJK Unified Ideograph +0xeeda -> U+fa2a -> 0xfbf6 CJK compatibility Ideograph +0xeedb -> U+fa2b -> 0xfbf7 CJK compatibility Ideograph +0xeedc -> U+9927 -> 0xfbf8 CJK Unified Ideograph +0xeedd -> U+fa2c -> 0xfbf9 CJK compatibility Ideograph +0xeede -> U+999e -> 0xfbfa CJK Unified Ideograph +0xeedf -> U+9a4e -> 0xfbfb CJK Unified Ideograph +0xeee0 -> U+9ad9 -> 0xfbfc CJK Unified Ideograph +0xeee1 -> U+9adc -> 0xfc40 CJK Unified Ideograph +0xeee2 -> U+9b75 -> 0xfc41 CJK Unified Ideograph +0xeee3 -> U+9b72 -> 0xfc42 CJK Unified Ideograph +0xeee4 -> U+9b8f -> 0xfc43 CJK Unified Ideograph +0xeee5 -> U+9bb1 -> 0xfc44 CJK Unified Ideograph +0xeee6 -> U+9bbb -> 0xfc45 CJK Unified Ideograph +0xeee7 -> U+9c00 -> 0xfc46 CJK Unified Ideograph +0xeee8 -> U+9d70 -> 0xfc47 CJK Unified Ideograph +0xeee9 -> U+9d6b -> 0xfc48 CJK Unified Ideograph +0xeeea -> U+fa2d -> 0xfc49 CJK compatibility Ideograph +0xeeeb -> U+9e19 -> 0xfc4a CJK Unified Ideograph +0xeeec -> U+9ed1 -> 0xfc4b CJK Unified Ideograph +0xeeef -> U+2170 -> 0xfa40 Small Roman Numeral One +0xeef0 -> U+2171 -> 0xfa41 Small Roman Numeral Two +0xeef1 -> U+2172 -> 0xfa42 Small Roman Numeral Three +0xeef2 -> U+2173 -> 0xfa43 Small Roman Numeral Four +0xeef3 -> U+2174 -> 0xfa44 Small Roman Numeral Five +0xeef4 -> U+2175 -> 0xfa45 Small Roman Numeral Six +0xeef5 -> U+2176 -> 0xfa46 Small Roman Numeral Seven +0xeef6 -> U+2177 -> 0xfa47 Small Roman Numeral Eight +0xeef7 -> U+2178 -> 0xfa48 Small Roman Numeral Nine +0xeef8 -> U+2179 -> 0xfa49 Small Roman Numeral Ten +0xeef9 -> U+ffe2 -> 0x81ca Fullwidth Not Sign +0xeefa -> U+ffe4 -> 0xfa55 Fullwidth Broken Bar +0xeefb -> U+ff07 -> 0xfa56 Fullwidth Apostrophe +0xeefc -> U+ff02 -> 0xfa57 Fullwidth Quotation Mark +0xfa4a -> U+2160 -> 0x8754 Roman Numeral One +0xfa4b -> U+2161 -> 0x8755 Roman Numeral Two +0xfa4c -> U+2162 -> 0x8756 Roman Numeral Three +0xfa4d -> U+2163 -> 0x8757 Roman Numeral Four +0xfa4e -> U+2164 -> 0x8758 Roman Numeral Five +0xfa4f -> U+2165 -> 0x8759 Roman Numeral Six +0xfa50 -> U+2166 -> 0x875a Roman Numeral Seven +0xfa51 -> U+2167 -> 0x875b Roman Numeral Eight +0xfa52 -> U+2168 -> 0x875c Roman Numeral Nine +0xfa53 -> U+2169 -> 0x875d Roman Numeral Ten +0xfa54 -> U+ffe2 -> 0x81ca Fullwidth Not Sign +0xfa58 -> U+3231 -> 0x878a Parenthesized Ideograph Stock +0xfa59 -> U+2116 -> 0x8782 Numero Sign +0xfa5a -> U+2121 -> 0x8784 Telephone Sign +0xfa5b -> U+2235 -> 0x81e6 Because")) + (with-input-from-string (s kb170559) + (loop for line = (read-line s nil) until (null line) + do (let ((ucs (parse-integer (subseq line 14 18) :radix 16)) + (cp932 (parse-integer (subseq line 26 30) :radix 16))) + (setf (gethash ucs *ucs-to-cp932-hash*) cp932))))) + +(defun eucjp-to-ucs (code) + (values (gethash code *eucjp-to-ucs-hash*))) + +(defun ucs-to-eucjp (code) + (values (gethash code *ucs-to-eucjp-hash*))) + +(defun cp932-to-ucs (code) + (values (gethash code *cp932-to-ucs-hash*))) + +(defun ucs-to-cp932 (code) + (values (gethash code *ucs-to-cp932-hash*))) + +;;;; EUC-JP + +(define-character-encoding :eucjp + "An 8-bit, variable-length character encoding in which +character code points in the range #x00-#x7f can be encoded in a +single octet; characters with larger code values can be encoded +in 2 to 3 bytes." + :max-units-per-char 3 + :literal-char-code-limit #x80) + + +(define-octet-counter :eucjp (getter type) + `(named-lambda eucjp-octet-counter (seq start end max) + (declare (type ,type seq) (fixnum start end max)) + (loop with noctets fixnum = 0 + for i fixnum from start below end + for code of-type code-point = (,getter seq i) + do (let* ((c (ucs-to-eucjp code)) + (new (+ (cond ((< #xffff c) 3) + ((< #xff c) 2) + (t 1)) + noctets))) + (if (and (plusp max) (> new max)) + (loop-finish) + (setq noctets new))) + finally (return (values noctets i))))) + +(define-code-point-counter :eucjp (getter type) + `(named-lambda eucjp-code-point-counter (seq start end max) + (declare (type ,type seq) (fixnum start end max)) + (loop with nchars fixnum = 0 + with i fixnum = start + while (< i end) do + (let* ((octet (,getter seq i)) + (next-i (+ i (cond ((= #x8f octet) 3) + ((or (< #xa0 octet #xff) + (= #x8e octet)) 2) + (t 1))))) + (declare (type ub8 octet) (fixnum next-i)) + (cond ((> next-i end) + ;; Should we add restarts to this error, we'll have + ;; to figure out a way to communicate with the + ;; decoder since we probably want to do something + ;; about it right here when we have a chance to + ;; change the count or something. (Like an + ;; alternative replacement character or perhaps the + ;; existence of this error so that the decoder + ;; doesn't have to check for it on every iteration + ;; like we do.) + ;; + ;; FIXME: The data for this error is not right. + (decoding-error (vector octet) :eucjp seq i + nil 'end-of-input-in-character) + (return (values (1+ nchars) end))) + (t + (setq nchars (1+ nchars) + i next-i) + (when (and (plusp max) (= nchars max)) + (return (values nchars i)))))) + finally (progn (assert (= i end)) + (return (values nchars i)))))) + +(define-encoder :eucjp (getter src-type setter dest-type) + `(named-lambda eucjp-encoder (src start end dest d-start) + (declare (type ,src-type src) + (type ,dest-type dest) + (fixnum start end d-start)) + (loop with di fixnum = d-start + for i fixnum from start below end + for code of-type code-point = (,getter src i) + for eucjp of-type code-point + = (ucs-to-eucjp code) do + (macrolet ((set-octet (offset value) + `(,',setter ,value dest (the fixnum (+ di ,offset))))) + (cond + ;; 1 octet + ((< eucjp #x100) + (set-octet 0 eucjp) + (incf di)) + ;; 2 octets + ((< eucjp #x10000) + (set-octet 0 (f-logand #xff (f-ash eucjp -8))) + (set-octet 1 (logand eucjp #xff)) + (incf di 2)) + ;; 3 octets + (t + (set-octet 0 (f-logand #xff (f-ash eucjp -16))) + (set-octet 1 (f-logand #xff (f-ash eucjp -8))) + (set-octet 2 (logand eucjp #xff)) + (incf di 3)) + )) + finally (return (the fixnum (- di d-start)))))) + + +(define-decoder :eucjp (getter src-type setter dest-type) + `(named-lambda eucjp-decoder (src start end dest d-start) + (declare (type ,src-type src) + (type ,dest-type dest) + (fixnum start end d-start)) + (let ((u2 0)) + (declare (type ub8 u2)) + (loop for di fixnum from d-start + for i fixnum from start below end + for u1 of-type ub8 = (,getter src i) do + ;; Note: CONSUME-OCTET doesn't check if I is being + ;; incremented past END. We're assuming that END has + ;; been calculated with the CODE-POINT-POINTER above that + ;; checks this. + (macrolet + ((consume-octet () + `(let ((next-i (incf i))) + (if (= next-i end) + ;; FIXME: data for this error is incomplete. + ;; and signalling this error twice + (return-from setter-block + (decoding-error nil :eucjp src i +repl+ + 'end-of-input-in-character)) + (,',getter src next-i)))) + (handle-error (n &optional (c 'character-decoding-error)) + `(decoding-error + (vector ,@(subseq '(u1 u2) 0 n)) + :eucjp src (1+ (- i ,n)) +repl+ ',c)) + (handle-error-if-icb (var n) + `(when (not (< #x7f ,var #xc0)) + (decf i) + (return-from setter-block + (handle-error ,n invalid-utf8-continuation-byte))))) + (,setter + (block setter-block + (cond + ;; 3 octets + ((= u1 #x8f) + (setq u2 (consume-octet)) + (eucjp-to-ucs (logior #x8f0000 + (f-ash u2 8) + (consume-octet)))) + ;; 2 octets + ((or (= u1 #x8e) + (< #xa0 u1 #xff)) + (eucjp-to-ucs (logior (f-ash u1 8) + (consume-octet)))) + ;; 1 octet + (t + (eucjp-to-ucs u1)))) + dest di)) + finally (return (the fixnum (- di d-start))))))) + +;;;; CP932 + +(define-character-encoding :cp932 + "An 8-bit, variable-length character encoding in which +character code points in the range #x00-#x7f can be encoded in a +single octet; characters with larger code values can be encoded +in 2 bytes." + :max-units-per-char 2 + :literal-char-code-limit #x80) + + +(define-octet-counter :cp932 (getter type) + `(named-lambda cp932-octet-counter (seq start end max) + (declare (type ,type seq) (fixnum start end max)) + (loop with noctets fixnum = 0 + for i fixnum from start below end + for code of-type code-point = (,getter seq i) + do (let* ((c (ucs-to-cp932 code)) + (new (+ (cond ((< #xff c) 2) + (t 1)) + noctets))) + (if (and (plusp max) (> new max)) + (loop-finish) + (setq noctets new))) + finally (return (values noctets i))))) + +(define-code-point-counter :cp932 (getter type) + `(named-lambda cp932-code-point-counter (seq start end max) + (declare (type ,type seq) (fixnum start end max)) + (loop with nchars fixnum = 0 + with i fixnum = start + while (< i end) do + (let* ((octet (,getter seq i)) + (next-i (+ i (cond ((or (<= #x81 octet #x9f) + (<= #xe0 octet #xfc)) + 2) + (t 1))))) + (declare (type ub8 octet) (fixnum next-i)) + (cond ((> next-i end) + ;; Should we add restarts to this error, we'll have + ;; to figure out a way to communicate with the + ;; decoder since we probably want to do something + ;; about it right here when we have a chance to + ;; change the count or something. (Like an + ;; alternative replacement character or perhaps the + ;; existence of this error so that the decoder + ;; doesn't have to check for it on every iteration + ;; like we do.) + ;; + ;; FIXME: The data for this error is not right. + (decoding-error (vector octet) :cp932 seq i + nil 'end-of-input-in-character) + (return (values (1+ nchars) end))) + (t + (setq nchars (1+ nchars) + i next-i) + (when (and (plusp max) (= nchars max)) + (return (values nchars i)))))) + finally (progn (assert (= i end)) + (return (values nchars i)))))) + +(define-encoder :cp932 (getter src-type setter dest-type) + `(named-lambda cp932-encoder (src start end dest d-start) + (declare (type ,src-type src) + (type ,dest-type dest) + (fixnum start end d-start)) + (loop with di fixnum = d-start + for i fixnum from start below end + for code of-type code-point = (,getter src i) + for cp932 of-type code-point + = (ucs-to-cp932 code) do + (macrolet ((set-octet (offset value) + `(,',setter ,value dest (the fixnum (+ di ,offset))))) + (cond + ;; 1 octet + ((< cp932 #x100) + (set-octet 0 cp932) + (incf di)) + ;; 2 octets + ((< cp932 #x10000) + (set-octet 0 (f-logand #xff (f-ash cp932 -8))) + (set-octet 1 (logand cp932 #xff)) + (incf di 2)) + ;; 3 octets + (t + (set-octet 0 (f-logand #xff (f-ash cp932 -16))) + (set-octet 1 (f-logand #xff (f-ash cp932 -8))) + (set-octet 2 (logand cp932 #xff)) + (incf di 3)) + )) + finally (return (the fixnum (- di d-start)))))) + + +(define-decoder :cp932 (getter src-type setter dest-type) + `(named-lambda cp932-decoder (src start end dest d-start) + (declare (type ,src-type src) + (type ,dest-type dest) + (fixnum start end d-start)) + (let ((u2 0)) + (declare (type ub8 u2)) + (loop for di fixnum from d-start + for i fixnum from start below end + for u1 of-type ub8 = (,getter src i) do + ;; Note: CONSUME-OCTET doesn't check if I is being + ;; incremented past END. We're assuming that END has + ;; been calculated with the CODE-POINT-POINTER above that + ;; checks this. + (macrolet + ((consume-octet () + `(let ((next-i (incf i))) + (if (= next-i end) + ;; FIXME: data for this error is incomplete. + ;; and signalling this error twice + (return-from setter-block + (decoding-error nil :cp932 src i +repl+ + 'end-of-input-in-character)) + (,',getter src next-i)))) + (handle-error (n &optional (c 'character-decoding-error)) + `(decoding-error + (vector ,@(subseq '(u1 u2) 0 n)) + :cp932 src (1+ (- i ,n)) +repl+ ',c)) + (handle-error-if-icb (var n) + `(when (not (< #x7f ,var #xc0)) + (decf i) + (return-from setter-block + (handle-error ,n invalid-utf8-continuation-byte))))) + (,setter + (block setter-block + (cond + ;; 2 octets + ((or (<= #x81 u1 #x9f) + (<= #xe0 u1 #xfc)) + (setq u2 (consume-octet)) + (cp932-to-ucs (logior (f-ash u1 8) + u2))) + ;; 1 octet + (t + (cp932-to-ucs u1)))) + dest di)) + finally (return (the fixnum (- di d-start))))))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/src/enc-koi8.lisp b/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/src/enc-koi8.lisp new file mode 100644 index 0000000..6f9f5db --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/src/enc-koi8.lisp @@ -0,0 +1,577 @@ +;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- +;;; +;;; enc-cp1251.lisp --- Implementation of the CP1251 character encoding. +;;; +;;; Copyright (C) 2009, Andrey Moskvitin +;;; +;;; Permission is hereby granted, free of charge, to any person +;;; obtaining a copy of this software and associated documentation +;;; files (the "Software"), to deal in the Software without +;;; restriction, including without limitation the rights to use, copy, +;;; modify, merge, publish, distribute, sublicense, and/or sell copies +;;; of the Software, and to permit persons to whom the Software is +;;; furnished to do so, subject to the following conditions: +;;; +;;; The above copyright notice and this permission notice shall be +;;; included in all copies or substantial portions of the Software. +;;; +;;; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +;;; EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +;;; MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +;;; NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +;;; HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +;;; WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +;;; OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +;;; DEALINGS IN THE SOFTWARE. + +(in-package #:babel-encodings) + +(define-character-encoding :koi8-ru + "An 8-bit, fixed-width character Russian encoding." + :literal-char-code-limit #x80) + +(define-constant +koi8-ru-to-unicode+ + #(#x2500 #x2502 #x250C #x2510 #x2514 #x2518 #x251C #x2524 + #x252C #x2534 #x253C #x2580 #x2584 #x2588 #x258C #x2590 + #x2591 #x2592 #x2593 #x2320 #x25A0 #x2219 #x221A #x2248 + #x2264 #x2265 #x00A0 #x2321 #x00B0 #x00B2 #x00B7 #x00F7 + #x2550 #x2551 #x2552 #x0451 #x0454 #x2554 #x0456 #x0457 + #x2557 #x2558 #x2559 #x255A #x255B #x0491 #x045E #x255E + #x255F #x2560 #x2561 #x0401 #x0404 #x2563 #x0406 #x0407 + #x2566 #x2567 #x2568 #x2569 #x256A #x0490 #x040E #x00A9 + #x044E #x0430 #x0431 #x0446 #x0434 #x0435 #x0444 #x0433 + #x0445 #x0438 #x0439 #x043A #x043B #x043C #x043D #x043E + #x043F #x044F #x0440 #x0441 #x0442 #x0443 #x0436 #x0432 + #x044C #x044B #x0437 #x0448 #x044D #x0449 #x0447 #x044A + #x042E #x0410 #x0411 #x0426 #x0414 #x0415 #x0424 #x0413 + #x0425 #x0418 #x0419 #x041A #x041B #x041C #x041D #x041E + #x041F #x042F #x0420 #x0421 #x0422 #x0423 #x0416 #x0412 + #x042C #x042B #x0417 #x0428 #x042D #x0429 #x0427 #x042A) + :test #'equalp) + +(define-unibyte-decoder :koi8-ru (octet) + (if (< octet #x80) + octet + (svref +koi8-ru-to-unicode+ (the ub8 (- octet #x80))))) + +(define-constant +unicode-04->koi8-ru+ + #(#x7f #x79 #x78 #x7c #x60 #x71 #x41 #x42 #x57 #x47 #x44 #x45 #x56 #x5a + #x49 #x4a #x4b #x4c #x4d #x4e #x4f #x50 #x52 #x53 #x54 #x55 #x46 #x48 + #x43 #x5e #x5b #x5d #x5f #x59 #x58 #x5c #x40 #x51 nil #x23 nil nil #x24 + nil #x26 #x27 nil nil nil nil nil nil #x2e nil nil nil nil nil nil nil + nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil + nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil + nil nil nil nil nil nil #x3d #x2d) + :test 'equalp) + +(define-unibyte-encoder :koi8-ru (code) + (or (and (< code #x80) code) + (let ((hi (ldb (byte 8 8) code)) + (lo (ldb (byte 8 0) code))) + (case hi + (#x4 + (case lo + (#x1 #xb3) + (#x4 #xb4) + (#x6 #xb6) + (#x7 #xb7) + (#xe #xbe) + (#x10 #xe1) + (#x11 #xe2) + (#x12 #xf7) + (#x13 #xe7) + (#x14 #xe4) + (#x15 #xe5) + (#x16 #xf6) + (#x17 #xfa) + (#x18 #xe9) + (#x19 #xea) + (#x1a #xeb) + (#x1b #xec) + (#x1c #xed) + (#x1d #xee) + (#x1e #xef) + (#x1f #xf0) + (#x20 #xf2) + (#x21 #xf3) + (#x22 #xf4) + (#x23 #xf5) + (#x24 #xe6) + (#x25 #xe8) + (#x26 #xe3) + (#x27 #xfe) + (#x28 #xfb) + (#x29 #xfd) + (#x2a #xff) + (#x2b #xf9) + (#x2c #xf8) + (#x2d #xfc) + (#x2e #xe0) + (#x2f #xf1) + (#x30 #xc1) + (#x31 #xc2) + (#x32 #xd7) + (#x33 #xc7) + (#x34 #xc4) + (#x35 #xc5) + (#x36 #xd6) + (#x37 #xda) + (#x38 #xc9) + (#x39 #xca) + (#x3a #xcb) + (#x3b #xcc) + (#x3c #xcd) + (#x3d #xce) + (#x3e #xcf) + (#x3f #xd0) + (#x40 #xd2) + (#x41 #xd3) + (#x42 #xd4) + (#x43 #xd5) + (#x44 #xc6) + (#x45 #xc8) + (#x46 #xc3) + (#x47 #xde) + (#x48 #xdb) + (#x49 #xdd) + (#x4a #xdf) + (#x4b #xd9) + (#x4c #xd8) + (#x4d #xdc) + (#x4e #xc0) + (#x4f #xd1) + (#x51 #xa3) + (#x54 #xa4) + (#x56 #xa6) + (#x57 #xa7) + (#x5e #xae) + (#x90 #xbd) + (#x91 #xad))) + (#x0 + (case lo + (#xa0 #x9a) + (#xa9 #xbf) + (#xb0 #x9c) + (#xb2 #x9d) + (#xb7 #x9e) + (#xf7 #x9f))) + (#x22 (case lo (#x19 #x95) (#x1a #x96) (#x48 #x97) (#x64 #x98) (#x65 #x99))) + (#x23 (case lo (#x20 #x93) (#x21 #x9b))) + (#x25 + (case lo + (#x0 #x80) + (#x2 #x81) + (#xc #x82) + (#x10 #x83) + (#x14 #x84) + (#x18 #x85) + (#x1c #x86) + (#x24 #x87) + (#x2c #x88) + (#x34 #x89) + (#x3c #x8a) + (#x50 #xa0) + (#x51 #xa1) + (#x52 #xa2) + (#x54 #xa5) + (#x57 #xa8) + (#x58 #xa9) + (#x59 #xaa) + (#x5a #xab) + (#x5b #xac) + (#x5e #xaf) + (#x5f #xb0) + (#x60 #xb1) + (#x61 #xb2) + (#x63 #xb5) + (#x66 #xb8) + (#x67 #xb9) + (#x68 #xba) + (#x69 #xbb) + (#x6a #xbc) + (#x80 #x8b) + (#x84 #x8c) + (#x88 #x8d) + (#x8c #x8e) + (#x90 #x8f) + (#x91 #x90) + (#x92 #x91) + (#x93 #x92) + (#xa0 #x94))))) + (handle-error))) + +(define-character-encoding :koi8-r + "An 8-bit, fixed-width character Russian encoding." + :literal-char-code-limit #x80) + +(define-constant +koi8-r-to-unicode+ + #(#x2500 #x2502 #x250C #x2510 #x2514 #x2518 #x251C #x2524 + #x252C #x2534 #x253C #x2580 #x2584 #x2588 #x258C #x2590 + #x2591 #x2592 #x2593 #x2320 #x25A0 #x2219 #x221A #x2248 + #x2264 #x2265 #x00A0 #x2321 #x00B0 #x00B2 #x00B7 #x00F7 + #x2550 #x2551 #x2552 #x0451 #x2553 #x2554 #x2555 #x2556 + #x2557 #x2558 #x2559 #x255A #x255B #x255C #x255D #x255E + #x255F #x2560 #x2561 #x0401 #x2562 #x2563 #x2564 #x2565 + #x2566 #x2567 #x2568 #x2569 #x256A #x256B #x256C #x00A9 + #x044E #x0430 #x0431 #x0446 #x0434 #x0435 #x0444 #x0433 + #x0445 #x0438 #x0439 #x043A #x043B #x043C #x043D #x043E + #x043F #x044F #x0440 #x0441 #x0442 #x0443 #x0436 #x0432 + #x044C #x044B #x0437 #x0448 #x044D #x0449 #x0447 #x044A + #x042E #x0410 #x0411 #x0426 #x0414 #x0415 #x0424 #x0413 + #x0425 #x0418 #x0419 #x041A #x041B #x041C #x041D #x041E + #x041F #x042F #x0420 #x0421 #x0422 #x0423 #x0416 #x0412 + #x042C #x042B #x0417 #x0428 #x042D #x0429 #x0427 #x042A) + :test #'equalp) + +(define-unibyte-decoder :koi8-r (octet) + (if (< octet #x80) + octet + (svref +koi8-r-to-unicode+ (the ub8 (- octet #x80))))) + +(define-constant +unicode-x04->koi8-r+ + #(nil #x33 nil nil nil nil nil nil nil nil nil nil nil nil nil nil #x61 + #x62 #x77 #x67 #x64 #x65 #x76 #x7a #x69 #x6a #x6b #x6c #x6d #x6e #x6f + #x70 #x72 #x73 #x74 #x75 #x66 #x68 #x63 #x7e #x7b #x7d #x7f #x79 #x78 + #x7c #x60 #x71 #x41 #x42 #x57 #x47 #x44 #x45 #x56 #x5a #x49 #x4a #x4b + #x4c #x4d #x4e #x4f #x50 #x52 #x53 #x54 #x55 #x46 #x48 #x43 #x5e #x5b + #x5d #x5f #x59 #x58 #x5c #x40 #x51 nil #x23) + :test 'equalp) + +(define-constant +unicode-x25->koi8-r+ + #(#x0 nil #x1 nil nil nil nil nil nil nil nil nil #x2 nil nil nil #x3 nil + nil nil #x4 nil nil nil #x5 nil nil nil #x6 nil nil nil nil nil nil nil + #x7 nil nil nil nil nil nil nil #x8 nil nil nil nil nil nil nil #x9 nil + nil nil nil nil nil nil #xa nil nil nil nil nil nil nil nil nil nil nil + nil nil nil nil nil nil nil nil #x20 #x21 #x22 #x24 #x25 #x26 #x27 #x28 + #x29 #x2a #x2b #x2c #x2d #x2e #x2f #x30 #x31 #x32 #x34 #x35 #x36 #x37 + #x38 #x39 #x3a #x3b #x3c #x3d #x3e nil nil nil nil nil nil nil nil nil + nil nil nil nil nil nil nil nil nil nil #xb nil nil nil #xc nil nil nil + #xd nil nil nil #xe nil nil nil #xf #x10 #x11 #x12 nil nil nil nil nil + nil nil nil nil nil nil nil #x14) + :test 'equalp) + +(define-unibyte-encoder :koi8-r (code) + (or (and (< code #x80) code) + (let ((hi (ldb (byte 8 8) code)) + (lo (ldb (byte 8 0) code))) + (case hi + (#x4 + (case lo + (#x1 #xb3) + (#x10 #xe1) + (#x11 #xe2) + (#x12 #xf7) + (#x13 #xe7) + (#x14 #xe4) + (#x15 #xe5) + (#x16 #xf6) + (#x17 #xfa) + (#x18 #xe9) + (#x19 #xea) + (#x1a #xeb) + (#x1b #xec) + (#x1c #xed) + (#x1d #xee) + (#x1e #xef) + (#x1f #xf0) + (#x20 #xf2) + (#x21 #xf3) + (#x22 #xf4) + (#x23 #xf5) + (#x24 #xe6) + (#x25 #xe8) + (#x26 #xe3) + (#x27 #xfe) + (#x28 #xfb) + (#x29 #xfd) + (#x2a #xff) + (#x2b #xf9) + (#x2c #xf8) + (#x2d #xfc) + (#x2e #xe0) + (#x2f #xf1) + (#x30 #xc1) + (#x31 #xc2) + (#x32 #xd7) + (#x33 #xc7) + (#x34 #xc4) + (#x35 #xc5) + (#x36 #xd6) + (#x37 #xda) + (#x38 #xc9) + (#x39 #xca) + (#x3a #xcb) + (#x3b #xcc) + (#x3c #xcd) + (#x3d #xce) + (#x3e #xcf) + (#x3f #xd0) + (#x40 #xd2) + (#x41 #xd3) + (#x42 #xd4) + (#x43 #xd5) + (#x44 #xc6) + (#x45 #xc8) + (#x46 #xc3) + (#x47 #xde) + (#x48 #xdb) + (#x49 #xdd) + (#x4a #xdf) + (#x4b #xd9) + (#x4c #xd8) + (#x4d #xdc) + (#x4e #xc0) + (#x4f #xd1) + (#x51 #xa3))) + (#x0 + (case lo + (#xa0 #x9a) + (#xa9 #xbf) + (#xb0 #x9c) + (#xb2 #x9d) + (#xb7 #x9e) + (#xf7 #x9f))) + (#x22 (case lo (#x19 #x95) (#x1a #x96) (#x48 #x97) (#x64 #x98) (#x65 #x99))) + (#x23 (case lo (#x20 #x93) (#x21 #x9b))) + (#x25 + (case lo + (#x0 #x80) + (#x2 #x81) + (#xc #x82) + (#x10 #x83) + (#x14 #x84) + (#x18 #x85) + (#x1c #x86) + (#x24 #x87) + (#x2c #x88) + (#x34 #x89) + (#x3c #x8a) + (#x50 #xa0) + (#x51 #xa1) + (#x52 #xa2) + (#x53 #xa4) + (#x54 #xa5) + (#x55 #xa6) + (#x56 #xa7) + (#x57 #xa8) + (#x58 #xa9) + (#x59 #xaa) + (#x5a #xab) + (#x5b #xac) + (#x5c #xad) + (#x5d #xae) + (#x5e #xaf) + (#x5f #xb0) + (#x60 #xb1) + (#x61 #xb2) + (#x62 #xb4) + (#x63 #xb5) + (#x64 #xb6) + (#x65 #xb7) + (#x66 #xb8) + (#x67 #xb9) + (#x68 #xba) + (#x69 #xbb) + (#x6a #xbc) + (#x6b #xbd) + (#x6c #xbe) + (#x80 #x8b) + (#x84 #x8c) + (#x88 #x8d) + (#x8c #x8e) + (#x90 #x8f) + (#x91 #x90) + (#x92 #x91) + (#x93 #x92) + (#xa0 #x94))))) + (handle-error))) + +(define-character-encoding :koi8-u + "An 8-bit, fixed-width character Ukranian encoding." + :literal-char-code-limit #x80) + +(define-constant +koi8-u-to-unicode+ + #(#x2500 #x2502 #x250C #x2510 #x2514 #x2518 #x251C #x2524 + #x252C #x2534 #x253C #x2580 #x2584 #x2588 #x258C #x2590 + #x2591 #x2592 #x2593 #x2320 #x25A0 #x2219 #x221A #x2248 + #x2264 #x2265 #x00A0 #x2321 #x00B0 #x00B2 #x00B7 #x00F7 + #x2550 #x2551 #x2552 #x0451 #x0454 #x2554 #x0456 #x0457 + #x2557 #x2558 #x2559 #x255A #x255B #x0491 #x255D #x255E + #x255F #x2560 #x2561 #x0401 #x0404 #x2563 #x0406 #x0407 + #x2566 #x2567 #x2568 #x2569 #x256A #x0490 #x256C #x00A9 + #x044E #x0430 #x0431 #x0446 #x0434 #x0435 #x0444 #x0433 + #x0445 #x0438 #x0439 #x043A #x043B #x043C #x043D #x043E + #x043F #x044F #x0440 #x0441 #x0442 #x0443 #x0436 #x0432 + #x044C #x044B #x0437 #x0448 #x044D #x0449 #x0447 #x044A + #x042E #x0410 #x0411 #x0426 #x0414 #x0415 #x0424 #x0413 + #x0425 #x0418 #x0419 #x041A #x041B #x041C #x041D #x041E + #x041F #x042F #x0420 #x0421 #x0422 #x0423 #x0416 #x0412 + #x042C #x042B #x0417 #x0428 #x042D #x0429 #x0427 #x042A ) + :test #'equalp) + +(define-unibyte-decoder :koi8-u (octet) + (if (< octet #x80) + octet + (svref +koi8-u-to-unicode+ (the ub8 (- octet #x80))))) + +(define-constant +unicode-x04->koi8-u+ + #(nil #x33 nil nil #x34 nil #x36 #x37 nil nil nil nil nil nil nil nil #x61 + #x62 #x77 #x67 #x64 #x65 #x76 #x7a #x69 #x6a #x6b #x6c #x6d #x6e #x6f + #x70 #x72 #x73 #x74 #x75 #x66 #x68 #x63 #x7e #x7b #x7d #x7f #x79 #x78 + #x7c #x60 #x71 #x41 #x42 #x57 #x47 #x44 #x45 #x56 #x5a #x49 #x4a #x4b + #x4c #x4d #x4e #x4f #x50 #x52 #x53 #x54 #x55 #x46 #x48 #x43 #x5e #x5b + #x5d #x5f #x59 #x58 #x5c #x40 #x51 nil #x23 nil nil #x24 nil #x26 #x27 + nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil + nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil + nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil + nil nil #x3d #x2d) + :test 'equalp) + +(define-constant +unicode-x25->koi8-u+ + #(#x0 nil #x1 nil nil nil nil nil nil nil nil nil #x2 nil nil nil #x3 nil + nil nil #x4 nil nil nil #x5 nil nil nil #x6 nil nil nil nil nil nil nil + #x7 nil nil nil nil nil nil nil #x8 nil nil nil nil nil nil nil #x9 nil + nil nil nil nil nil nil #xa nil nil nil nil nil nil nil nil nil nil nil + nil nil nil nil nil nil nil nil #x20 #x21 #x22 nil #x25 nil nil #x28 + #x29 #x2a #x2b #x2c nil #x2e #x2f #x30 #x31 #x32 nil #x35 nil nil #x38 + #x39 #x3a #x3b #x3c nil #x3e nil nil nil nil nil nil nil nil nil nil nil + nil nil nil nil nil nil nil nil #xb nil nil nil #xc nil nil nil #xd nil + nil nil #xe nil nil nil #xf #x10 #x11 #x12 nil nil nil nil nil nil nil + nil nil nil nil nil #x14) + :test 'equalp) + +(define-unibyte-encoder :koi8-u (code) + (or (and (< code #x80) code) + (let ((hi (ldb (byte 8 8) code)) + (lo (ldb (byte 8 0) code))) + (case hi + (#x4 + (case lo + (#x1 #xb3) + (#x4 #xb4) + (#x6 #xb6) + (#x7 #xb7) + (#x10 #xe1) + (#x11 #xe2) + (#x12 #xf7) + (#x13 #xe7) + (#x14 #xe4) + (#x15 #xe5) + (#x16 #xf6) + (#x17 #xfa) + (#x18 #xe9) + (#x19 #xea) + (#x1a #xeb) + (#x1b #xec) + (#x1c #xed) + (#x1d #xee) + (#x1e #xef) + (#x1f #xf0) + (#x20 #xf2) + (#x21 #xf3) + (#x22 #xf4) + (#x23 #xf5) + (#x24 #xe6) + (#x25 #xe8) + (#x26 #xe3) + (#x27 #xfe) + (#x28 #xfb) + (#x29 #xfd) + (#x2a #xff) + (#x2b #xf9) + (#x2c #xf8) + (#x2d #xfc) + (#x2e #xe0) + (#x2f #xf1) + (#x30 #xc1) + (#x31 #xc2) + (#x32 #xd7) + (#x33 #xc7) + (#x34 #xc4) + (#x35 #xc5) + (#x36 #xd6) + (#x37 #xda) + (#x38 #xc9) + (#x39 #xca) + (#x3a #xcb) + (#x3b #xcc) + (#x3c #xcd) + (#x3d #xce) + (#x3e #xcf) + (#x3f #xd0) + (#x40 #xd2) + (#x41 #xd3) + (#x42 #xd4) + (#x43 #xd5) + (#x44 #xc6) + (#x45 #xc8) + (#x46 #xc3) + (#x47 #xde) + (#x48 #xdb) + (#x49 #xdd) + (#x4a #xdf) + (#x4b #xd9) + (#x4c #xd8) + (#x4d #xdc) + (#x4e #xc0) + (#x4f #xd1) + (#x51 #xa3) + (#x54 #xa4) + (#x56 #xa6) + (#x57 #xa7) + (#x90 #xbd) + (#x91 #xad))) + (#x0 + (case lo + (#xa0 #x9a) + (#xa9 #xbf) + (#xb0 #x9c) + (#xb2 #x9d) + (#xb7 #x9e) + (#xf7 #x9f))) + (#x22 (case lo (#x19 #x95) (#x1a #x96) (#x48 #x97) (#x64 #x98) (#x65 #x99))) + (#x23 (case lo (#x20 #x93) (#x21 #x9b))) + (#x25 + (case lo + (#x0 #x80) + (#x2 #x81) + (#xc #x82) + (#x10 #x83) + (#x14 #x84) + (#x18 #x85) + (#x1c #x86) + (#x24 #x87) + (#x2c #x88) + (#x34 #x89) + (#x3c #x8a) + (#x50 #xa0) + (#x51 #xa1) + (#x52 #xa2) + (#x54 #xa5) + (#x57 #xa8) + (#x58 #xa9) + (#x59 #xaa) + (#x5a #xab) + (#x5b #xac) + (#x5d #xae) + (#x5e #xaf) + (#x5f #xb0) + (#x60 #xb1) + (#x61 #xb2) + (#x63 #xb5) + (#x66 #xb8) + (#x67 #xb9) + (#x68 #xba) + (#x69 #xbb) + (#x6a #xbc) + (#x6c #xbe) + (#x80 #x8b) + (#x84 #x8c) + (#x88 #x8d) + (#x8c #x8e) + (#x90 #x8f) + (#x91 #x90) + (#x92 #x91) + (#x93 #x92) + (#xa0 #x94))))) + (handle-error))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/src/enc-unicode.lisp b/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/src/enc-unicode.lisp new file mode 100644 index 0000000..f4e4ecf --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/src/enc-unicode.lisp @@ -0,0 +1,881 @@ +;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- +;;; +;;; enc-unicode.lisp --- Unicode encodings. +;;; +;;; Copyright (C) 2007, Luis Oliveira +;;; +;;; Permission is hereby granted, free of charge, to any person +;;; obtaining a copy of this software and associated documentation +;;; files (the "Software"), to deal in the Software without +;;; restriction, including without limitation the rights to use, copy, +;;; modify, merge, publish, distribute, sublicense, and/or sell copies +;;; of the Software, and to permit persons to whom the Software is +;;; furnished to do so, subject to the following conditions: +;;; +;;; The above copyright notice and this permission notice shall be +;;; included in all copies or substantial portions of the Software. +;;; +;;; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +;;; EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +;;; MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +;;; NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +;;; HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +;;; WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +;;; OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +;;; DEALINGS IN THE SOFTWARE. + +;;; This implementation is largely based on OpenMCL's l1-unicode.lisp +;;; Copyright (C) 2006 Clozure Associates and contributors. + +(in-package #:babel-encodings) + +(eval-when (:compile-toplevel :load-toplevel :execute) + (defconstant +repl+ #xfffd "Unicode replacement character code point.") + (defconstant +byte-order-mark-code+ #xfeff) + (defconstant +swapped-byte-order-mark-code+ #xfffe) + (defconstant +swapped-byte-order-mark-code-32+ #xfffe0000)) + +;;; Some convenience macros adding FIXNUM declarations. +(defmacro f-ash (integer count) `(the fixnum (ash ,integer ,count))) +(defmacro f-logior (&rest integers) `(the fixnum (logior ,@integers))) +(defmacro f-logand (&rest integers) `(the fixnum (logand ,@integers))) +(defmacro f-logxor (&rest integers) `(the fixnum (logxor ,@integers))) + +;;;; UTF-8 + +(define-character-encoding :utf-8 + "An 8-bit, variable-length character encoding in which +character code points in the range #x00-#x7f can be encoded in a +single octet; characters with larger code values can be encoded +in 2 to 4 bytes." + :max-units-per-char 4 + :literal-char-code-limit #x80 + :bom-encoding #(#xef #xbb #xbf) + :default-replacement #xfffd) + +(define-condition invalid-utf8-starter-byte (character-decoding-error) + () + (:documentation "Signalled when an invalid UTF-8 starter byte is found.")) + +(define-condition invalid-utf8-continuation-byte (character-decoding-error) + () + (:documentation + "Signalled when an invalid UTF-8 continuation byte is found.")) + +(define-condition overlong-utf8-sequence (character-decoding-error) + () + (:documentation "Signalled upon overlong UTF-8 sequences.")) + +(define-octet-counter :utf-8 (getter type) + `(named-lambda utf-8-octet-counter (seq start end max) + (declare (type ,type seq) (fixnum start end max)) + (loop with noctets fixnum = 0 + for i fixnum from start below end + for code of-type code-point = (,getter seq i) do + (let ((new (+ (cond ((< code #x80) 1) + ((< code #x800) 2) + ((< code #x10000) 3) + (t 4)) + noctets))) + (if (and (plusp max) (> new max)) + (loop-finish) + (setq noctets new))) + finally (return (values noctets i))))) + +(define-code-point-counter :utf-8 (getter type) + `(named-lambda utf-8-code-point-counter (seq start end max) + (declare (type ,type seq) (fixnum start end max)) + (loop with nchars fixnum = 0 + with i fixnum = start + while (< i end) do + ;; check for invalid continuation bytes + (macrolet ((invalid-cb-p (n) + `(and (< (+ i ,n) end) + (not (< #x7f (,',getter seq (+ i ,n)) #xc0))))) + ;; wrote this code with LET instead of FOR because CLISP's + ;; LOOP doesn't like WHILE clauses before FOR clauses. + (let* ((octet (,getter seq i)) + (next-i (+ i (cond ((or (< octet #xc0) (invalid-cb-p 1)) 1) + ((or (< octet #xe0) (invalid-cb-p 2)) 2) + ((or (< octet #xf0) (invalid-cb-p 3)) 3) + ((or (< octet #xf8) (invalid-cb-p 4)) 4) + ((or (< octet #xfc) (invalid-cb-p 5)) 5) + (t 6))))) + (declare (type ub8 octet) (fixnum next-i)) + (cond + ((> next-i end) + ;; Should we add restarts to this error, we'll have + ;; to figure out a way to communicate with the + ;; decoder since we probably want to do something + ;; about it right here when we have a chance to + ;; change the count or something. (Like an + ;; alternative replacement character or perhaps the + ;; existence of this error so that the decoder + ;; doesn't have to check for it on every iteration + ;; like we do.) + ;; + ;; FIXME: The data for this error is not right. + (decoding-error (vector octet) :utf-8 seq i + nil 'end-of-input-in-character) + (return (values (1+ nchars) end))) + (t + (setq nchars (1+ nchars) + i next-i) + (when (and (plusp max) (= nchars max)) + (return (values nchars i))))))) + finally (progn + (assert (= i end)) + (return (values nchars i)))))) + +(define-encoder :utf-8 (getter src-type setter dest-type) + `(named-lambda utf-8-encoder (src start end dest d-start) + (declare (type ,src-type src) + (type ,dest-type dest) + (fixnum start end d-start)) + (loop with di fixnum = d-start + for i fixnum from start below end + for code of-type code-point = (,getter src i) do + (macrolet ((set-octet (offset value) + `(,',setter ,value dest (the fixnum (+ di ,offset))))) + (cond + ;; 1 octet + ((< code #x80) + (set-octet 0 code) + (incf di)) + ;; 2 octets + ((< code #x800) + (set-octet 0 (logior #xc0 (f-ash code -6))) + (set-octet 1 (logior #x80 (f-logand code #x3f))) + (incf di 2)) + ;; 3 octets + ((< code #x10000) + (set-octet 0 (logior #xe0 (f-ash code -12))) + (set-octet 1 (logior #x80 (f-logand #x3f (f-ash code -6)))) + (set-octet 2 (logior #x80 (f-logand code #x3f))) + (incf di 3)) + ;; 4 octets + (t + (set-octet 0 (logior #xf0 (f-logand #x07 (f-ash code -18)))) + (set-octet 1 (logior #x80 (f-logand #x3f (f-ash code -12)))) + (set-octet 2 (logior #x80 (f-logand #x3f (f-ash code -6)))) + (set-octet 3 (logior #x80 (logand code #x3f))) + (incf di 4)))) + finally (return (the fixnum (- di d-start)))))) + +(define-decoder :utf-8 (getter src-type setter dest-type) + `(named-lambda utf-8-decoder (src start end dest d-start) + (declare (type ,src-type src) + (type ,dest-type dest) + (fixnum start end d-start)) + (let ((u2 0) (u3 0) (u4 0) (u5 0) (u6 0)) + (declare (type ub8 u2 u3 u4 u5 u6)) + (loop for di fixnum from d-start + for i fixnum from start below end + for u1 of-type ub8 = (,getter src i) do + ;; Note: CONSUME-OCTET doesn't check if I is being + ;; incremented past END. We're assuming that END has + ;; been calculated with the CODE-POINT-POINTER above that + ;; checks this. + (macrolet + ((consume-octet () + `(let ((next-i (incf i))) + (if (= next-i end) + ;; FIXME: data for this error is incomplete. + ;; and signalling this error twice + (return-from setter-block + (decoding-error nil :utf-8 src i +repl+ + 'end-of-input-in-character)) + (,',getter src next-i)))) + (handle-error (n &optional (c 'character-decoding-error)) + `(decoding-error + (vector ,@(subseq '(u1 u2 u3 u4 u5 u6) 0 n)) + :utf-8 src (1+ (- i ,n)) +repl+ ',c)) + (handle-error-if-icb (var n) + `(when (not (< #x7f ,var #xc0)) + (decf i) + (return-from setter-block + (handle-error ,n invalid-utf8-continuation-byte))))) + (,setter + (block setter-block + (cond + ((< u1 #x80) u1) ; 1 octet + ((< u1 #xc0) + (handle-error 1 invalid-utf8-starter-byte)) + (t + (setq u2 (consume-octet)) + (handle-error-if-icb u2 1) + (cond + ((< u1 #xc2) + (handle-error 2 overlong-utf8-sequence)) + ((< u1 #xe0) ; 2 octets + (logior (f-ash (f-logand #x1f u1) 6) + (f-logxor u2 #x80))) + (t + (setq u3 (consume-octet)) + (handle-error-if-icb u3 2) + (cond + ((and (= u1 #xe0) (< u2 #xa0)) + (handle-error 3 overlong-utf8-sequence)) + ((< u1 #xf0) ; 3 octets + (let ((start (f-logior (f-ash (f-logand u1 #x0f) 12) + (f-ash (f-logand u2 #x3f) 6)))) + (if (<= #xd800 start #xdfc0) + (handle-error 3 character-out-of-range) + (logior start (f-logand u3 #x3f))))) + (t ; 4 octets + (setq u4 (consume-octet)) + (handle-error-if-icb u4 3) + (cond + ((and (= u1 #xf0) (< u2 #x90)) + (handle-error 4 overlong-utf8-sequence)) + ((< u1 #xf8) + (if (or (> u1 #xf4) (and (= u1 #xf4) (> u2 #x8f))) + (handle-error 4 character-out-of-range) + (f-logior (f-ash (f-logand u1 7) 18) + (f-ash (f-logxor u2 #x80) 12) + (f-ash (f-logxor u3 #x80) 6) + (f-logxor u4 #x80)))) + ;; from here on we'll be getting either + ;; invalid continuation bytes or overlong + ;; 5-byte or 6-byte sequences. + (t + (setq u5 (consume-octet)) + (handle-error-if-icb u5 4) + (cond + ((and (= u1 #xf8) (< u2 #x88)) + (handle-error 5 overlong-utf8-sequence)) + ((< u1 #xfc) + (handle-error 5 character-out-of-range)) + (t + (setq u6 (consume-octet)) + (handle-error-if-icb u6 5) + (cond + ((and (= u1 #xfc) (< u2 #x84)) + (handle-error 6 overlong-utf8-sequence)) + (t + (handle-error 6 character-out-of-range) + ))))))))))))) + dest di)) + finally (return (the fixnum (- di d-start))))))) + +;;;; UTF-8B + +;;; The following excerpt from a linux-utf8 message by Markus Kuhn is +;;; the closest thing to a UTF-8B specification: +;;; +;;; +;;; +;;; "D) Emit a malformed UTF-16 sequence for every byte in a malformed +;;; UTF-8 sequence +;;; +;;; All the previous options for converting malformed UTF-8 sequences +;;; to UTF-16 destroy information. This can be highly undesirable in +;;; applications such as text file editors, where guaranteed binary +;;; transparency is a desireable feature. (E.g., I frequently edit +;;; executable code or graphic files with the Emacs text editor and I +;;; hate the idea that my editor might automatically make U+FFFD +;;; substitutions at locations that I haven't even edited when I save +;;; the file again.) +;;; +;;; I therefore suggested 1999-11-02 on the unicode@xxxxxxxxxxx +;;; mailing list the following approach. Instead of using U+FFFD, +;;; simply encode malformed UTF-8 sequences as malformed UTF-16 +;;; sequences. Malformed UTF-8 sequences consist excludively of the +;;; bytes 0x80 - 0xff, and each of these bytes can be represented +;;; using a 16-bit value from the UTF-16 low-half surrogate zone +;;; U+DC80 to U+DCFF. Thus, the overlong "K" (U+004B) 0xc1 0x8b from +;;; the above example would be represented in UTF-16 as U+DCC1 +;;; U+DC8B. If we simply make sure that every UTF-8 encoded surrogate +;;; character is also treated like a malformed sequence, then there +;;; is no way that a single high-half surrogate could precede the +;;; encoded malformed sequence and cause a valid UTF-16 sequence to +;;; emerge. +;;; +;;; This way 100% binary transparent UTF-8 -> UTF-16 -> UTF-8 +;;; round-trip compatibility can be achieved quite easily. +;;; +;;; On an output device, a lonely low-half surrogate character should +;;; be treated just like a character outside the adopted subset of +;;; representable characters, that is for the end user, the display +;;; would look exactly like with semantics B), i.e. one symbol per +;;; byte of a malformed sequence. However in contrast to semantics +;;; B), no information is thrown away, and a cut&paste in an editor +;;; or terminal emulator will be guaranteed to reconstruct the +;;; original byte sequence. This should greatly reduce the incidence +;;; of accidental corruption of binary data by UTF-8 -> UTF-16 -> +;;; UTF-8 conversion round trips." + +(define-character-encoding :utf-8b + "An 8-bit, variable-length character encoding in which +character code points in the range #x00-#x7f can be encoded in a +single octet; characters with larger code values can be encoded +in 2 to 4 bytes. Invalid UTF-8 sequences are encoded with #xDCXX +code points for each invalid byte." + :max-units-per-char 4 + :literal-char-code-limit #x80 + :bom-encoding #(#xef #xbb #xbf) + :default-replacement nil) + +;;; TODO: reuse the :UTF-8 octet counter through a simple macro. +(define-octet-counter :utf-8b (getter type) + `(named-lambda utf-8b-octet-counter (seq start end max) + (declare (type ,type seq) (fixnum start end max)) + (loop with noctets fixnum = 0 + for i fixnum from start below end + for code of-type code-point = (,getter seq i) do + (let ((new (+ (cond ((< code #x80) 1) + ((< code #x800) 2) + ((<= #xdc80 code #xdcff) 1) + ((< code #x10000) 3) + (t 4)) + noctets))) + (if (and (plusp max) (> new max)) + (loop-finish) + (setq noctets new))) + finally (return (values noctets i))))) + +(define-code-point-counter :utf-8b (getter type) + `(named-lambda utf-8b-code-point-counter (seq start end max) + (declare (type ,type seq) (fixnum start end max)) + (loop with nchars fixnum = 0 + with i fixnum = start + while (< i end) do + ;; wrote this code with LET instead of FOR because CLISP's + ;; LOOP doesn't like WHILE clauses before FOR clauses. + (let* ((octet (,getter seq i)) + (noctets (cond ((< octet #x80) 1) + ((< octet #xe0) 2) + ((< octet #xf0) 3) + (t 4)))) + (declare (type ub8 octet) (fixnum noctets)) + (cond + ((> (+ i noctets) end) + ;; If this error is suppressed these last few bytes + ;; will be encoded as raw bytes later. + (decoding-error (vector octet) :utf-8 seq i + nil 'end-of-input-in-character) + (return (values (+ nchars (- end i)) end))) + (t + ;; FIXME: clean this mess up. + (let* ((u1 octet) + (u2 (if (>= noctets 2) (,getter seq (1+ i)) 0)) + (u3 (if (>= noctets 3) (,getter seq (+ i 2)) 0)) + (u4 (if (= noctets 4) (,getter seq (+ i 3)) 0)) + (inc (or (and (> noctets 1) + (< u1 #xc2)) + (and (= noctets 2) + (not (logior u2 #x40))) + (and (= noctets 3) + (not (and (< (f-logxor u2 #x80) #x40) + (< (f-logxor u3 #x80) #x40) + (or (>= u1 #xe1) (>= u2 #xa0)) + (or (/= u1 #xed) (< u2 #xa0) (> u2 #xbf))))) + (and (= noctets 4) + (not + (and (< (f-logxor u2 #x80) #x40) + (< (f-logxor u3 #x80) #x40) + (< (f-logxor u4 #x80) #x40) + (or (>= u1 #xf1) (>= u2 #x90)))))))) + (let ((new-nchars (if inc (+ nchars noctets) (1+ nchars)))) + (when (and (plusp max) (> new-nchars max)) + (return (values nchars i))) + (incf i noctets) + (setq nchars new-nchars)))))) + finally (progn + (assert (= i end)) + (return (values nchars i)))))) + +;;; TODO: reuse the :UTF-8 encoder with through a simple macro. +(define-encoder :utf-8b (getter src-type setter dest-type) + `(named-lambda utf-8b-encoder (src start end dest d-start) + (declare (type ,src-type src) + (type ,dest-type dest) + (fixnum start end d-start)) + (loop with di fixnum = d-start + for i fixnum from start below end + for code of-type code-point = (,getter src i) do + (macrolet ((set-octet (offset value) + `(,',setter ,value dest (the fixnum (+ di ,offset))))) + (cond + ;; 1 octet + ((< code #x80) + (set-octet 0 code) + (incf di)) + ;; 2 octets + ((< code #x800) + (set-octet 0 (logior #xc0 (f-ash code -6))) + (set-octet 1 (logior #x80 (f-logand code #x3f))) + (incf di 2)) + ;; 1 octet (invalid octet) + ((<= #xdc80 code #xdcff) + (set-octet 0 (f-logand code #xff)) + (incf di)) + ;; 3 octets + ((< code #x10000) + (set-octet 0 (logior #xe0 (f-ash code -12))) + (set-octet 1 (logior #x80 (f-logand #x3f (f-ash code -6)))) + (set-octet 2 (logior #x80 (f-logand code #x3f))) + (incf di 3)) + ;; 4 octets + (t + (set-octet 0 (logior #xf0 (f-logand #x07 (f-ash code -18)))) + (set-octet 1 (logior #x80 (f-logand #x3f (f-ash code -12)))) + (set-octet 2 (logior #x80 (f-logand #x3f (f-ash code -6)))) + (set-octet 3 (logand #x3f code)) + (incf di 4)))) + finally (return (the fixnum (- di d-start)))))) + +(define-decoder :utf-8b (getter src-type setter dest-type) + `(named-lambda utf-8b-decoder (src start end dest d-start) + (declare (type ,src-type src) + (type ,dest-type dest) + (fixnum start end d-start)) + (let ((u2 0) (u3 0) (u4 0)) + (declare (type ub8 u2 u3 u4)) + (loop for di fixnum from d-start + for i fixnum from start below end + for u1 of-type ub8 = (,getter src i) do + ;; Unlike the UTF-8 version, this version of + ;; CONSUME-OCTET needs to check if I is being incremented + ;; past END because we might have trailing binary + ;; garbage. + (macrolet + ((consume-octet (n) + `(if (= i (1- end)) + (encode-raw-octets ,n) + (,',getter src (incf i)))) + (encode-raw-octets (n) + `(progn + ,@(loop for i below n and var in '(u1 u2 u3 u4) + collect `(,',setter (logior #xdc00 ,var) dest di) + unless (= i (1- n)) + collect '(incf di)) + (return-from set-body)))) + (block set-body + (,setter (cond + ((< u1 #x80) ; 1 octet + u1) + ((>= u1 #xc2) + (setq u2 (consume-octet 1)) + (cond + ((< u1 #xe0) ; 2 octets + (if (< (f-logxor u2 #x80) #x40) + (logior (f-ash (f-logand #x1f u1) 6) + (f-logxor u2 #x80)) + (encode-raw-octets 2))) + (t + (setq u3 (consume-octet 2)) + (cond + ((< u1 #xf0) ; 3 octets + (if (and (< (f-logxor u2 #x80) #x40) + (< (f-logxor u3 #x80) #x40) + (or (>= u1 #xe1) (>= u2 #xa0))) + (let ((start (f-logior (f-ash (f-logand u1 #x0f) 12) + (f-ash (f-logand u2 #x3f) 6)))) + (if (<= #xd800 start #xdfc0) + (encode-raw-octets 3) + (logior start (f-logand u3 #x3f)))) + (encode-raw-octets 3))) + (t ; 4 octets + (setq u4 (consume-octet 3)) + (if (and (< (f-logxor u2 #x80) #x40) + (< (f-logxor u3 #x80) #x40) + (< (f-logxor u4 #x80) #x40) + (or (>= u1 #xf1) (>= u2 #x90))) + (logior + (f-logior (f-ash (f-logand u1 7) 18) + (f-ash (f-logxor u2 #x80) 12)) + (f-logior (f-ash (f-logxor u3 #x80) 6) + (f-logxor u4 #x80))) + (encode-raw-octets 4))))))) + (t (encode-raw-octets 1))) + dest di))) + finally (return (the fixnum (- di d-start))))))) + +;;;; UTF-16 + +;;; TODO: add a way to pass some info at compile-time telling us that, +;;; for example, the maximum code-point will always be < #x10000 in +;;; which case we could simply return (* 2 (- end start)). +(defmacro utf16-octet-counter (getter type) + `(named-lambda utf-16-octet-counter (seq start end max) + (declare (type ,type seq) (fixnum start end max)) + (loop with noctets fixnum = 0 + for i fixnum from start below end + for code of-type code-point = (,getter seq i) + do (let ((new (the fixnum (+ (if (< code #x10000) 2 4) noctets)))) + (if (and (plusp max) (> new max)) + (loop-finish) + (setq noctets new))) + finally (return (values noctets i))))) + +(defmacro utf-16-combine-surrogate-pairs (u1 u2) + `(the (unsigned-byte 21) + (+ #x10000 + (the (unsigned-byte 20) + (logior + (the (unsigned-byte 20) + (ash (the (unsigned-byte 10) (- ,u1 #xd800)) 10)) + (the (unsigned-byte 10) + (- ,u2 #xdc00))))))) + +(defmacro define-utf-16 (name &optional endianness) + (check-type endianness (or null (eql :be) (eql :le))) + (check-type name keyword) + (let ((swap-var (gensym "SWAP")) + (code-point-counter-name + (format-symbol t '#:~a-code-point-counter (string name))) + (encoder-name (format-symbol t '#:~a-encoder (string name))) + (decoder-name (format-symbol t '#:~a-decoder (string name)))) + (labels ((make-bom-check-form (end start getter seq) + (if (null endianness) + ``((,',swap-var + (when (> ,,end ,,start) + (case (,,getter ,,seq ,,start 2 :ne) + (#.+byte-order-mark-code+ (incf ,,start 2) nil) + (#.+swapped-byte-order-mark-code+ (incf ,,start 2) t) + (t #+little-endian t))))) + '())) + (make-getter-form (getter src i) + (case endianness + (:le ``(,,getter ,,src ,,i 2 :le)) + (:be ``(,,getter ,,src ,,i 2 :be)) + (t ``(if ,',swap-var + (,,getter ,,src ,,i 2 :re) + (,,getter ,,src ,,i 2 :ne))))) + (make-setter-form (setter code dest di) + (case endianness + (:be ``(,,setter ,,code ,,dest ,,di 2 :be)) + (:le ``(,,setter ,,code ,,dest ,,di 2 :le)) + (t ``(,,setter ,,code ,,dest ,,di 2 :ne))))) + `(progn + (define-octet-counter ,name (getter type) + `(utf16-octet-counter ,getter ,type)) + (define-code-point-counter ,name (getter type) + `(named-lambda ,',code-point-counter-name (seq start end max) + (declare (type ,type seq) (fixnum start end max)) + (let* ,,(make-bom-check-form ''end ''start 'getter ''seq) + (loop with count fixnum = 0 + with i fixnum = start + while (<= i (- end 2)) do + (let* ((code ,,(make-getter-form 'getter ''seq ''i)) + (next-i (+ i (if (or (< code #xd800) (>= code #xdc00)) + 2 + 4)))) + (declare (type (unsigned-byte 16) code) (fixnum next-i)) + (cond + ((> next-i end) + (decoding-error + (vector (,getter seq i) (,getter seq (1+ i))) + ,',name seq i nil 'end-of-input-in-character) + (return (values count i))) + (t + (setq i next-i + count (1+ count)) + (when (and (plusp max) (= count max)) + (return (values count i)))))) + finally (progn + (assert (= i end)) + (return (values count i))))))) + (define-encoder ,name (getter src-type setter dest-type) + `(named-lambda ,',encoder-name (src start end dest d-start) + (declare (type ,src-type src) + (type ,dest-type dest) + (fixnum start end d-start)) + (loop with di fixnum = d-start + for i fixnum from start below end + for code of-type code-point = (,getter src i) + for high-bits fixnum = (- code #x10000) do + (cond ((< high-bits 0) + ,,(make-setter-form 'setter ''code ''dest ''di) + (incf di 2)) + (t + ,,(make-setter-form + 'setter ''(logior #xd800 (f-ash high-bits -10)) + ''dest ''di) + ,,(make-setter-form + 'setter ''(logior #xdc00 (f-logand high-bits #x3ff)) + ''dest ''(+ di 2)) + (incf di 4))) + finally (return (the fixnum (- di d-start)))))) + (define-decoder ,name (getter src-type setter dest-type) + `(named-lambda ,',decoder-name (src start end dest d-start) + (declare (type ,src-type src) + (type ,dest-type dest) + (fixnum start end d-start)) + (let ,,(make-bom-check-form ''end ''start 'getter ''src) + (loop with i fixnum = start + for di fixnum from d-start + until (= i end) do + (let ((u1 ,,(make-getter-form 'getter ''src ''i))) + (declare (type (unsigned-byte 16) u1)) + (incf i 2) + (,setter (cond + ((or (< u1 #xd800) (>= u1 #xe000)) ; 2 octets + u1) + ((< u1 #xdc00) ; 4 octets + (let ((u2 ,,(make-getter-form 'getter ''src ''i))) + (declare (type (unsigned-byte 16) u2)) + (incf i 2) + (if (and (>= u2 #xdc00) (< u2 #xe000)) + (utf-16-combine-surrogate-pairs u1 u2) + (decoding-error + (vector (,getter src (- i 4)) + (,getter src (- i 3)) + (,getter src (- i 2)) + (,getter src (- i 1))) + ,',name src i +repl+)))) + (t + (decoding-error (vector (,getter src (- i 2)) + (,getter src (- i 1))) + ,',name src i +repl+))) + dest di)) + finally (return (the fixnum (- di d-start))))))) + ',name)))) + +(define-character-encoding :utf-16 + "A 16-bit, variable-length encoding in which characters with +code points less than #x10000 can be encoded in a single 16-bit +word and characters with larger codes can be encoded in a pair of +16-bit words. The endianness of the encoded data is indicated by +the endianness of a byte-order-mark character (#\u+feff) +prepended to the data; in the absence of such a character on +input, the data is assumed to be in big-endian order. Output is +written in native byte-order with a leading byte-order mark." + :max-units-per-char 2 + :code-unit-size 16 + :native-endianness t ; not necessarily true when decoding + :decode-literal-code-unit-limit #xd800 + :encode-literal-code-unit-limit #x10000 + :use-bom #+big-endian :utf-16be #+little-endian :utf-16le + :bom-encoding #+big-endian #(#xfe #xff) #+little-endian #(#xff #xfe) + :nul-encoding #(0 0) + :default-replacement #xfffd + :ambiguous #+little-endian t #+big-endian nil) + +(define-utf-16 :utf-16) + +(define-character-encoding :utf-16le + "A 16-bit, variable-length encoding in which characters with +code points less than #x10000 can be encoded in a single 16-bit +word and characters with larger codes can be encoded in a pair of +16-bit words. The data is assumed to be in little-endian order. Output is +written in little-endian byte-order without a leading byte-order mark." + :aliases '(:utf-16/le) + :max-units-per-char 2 + :code-unit-size 16 + :native-endianness #+little-endian t #+big-endian nil + :decode-literal-code-unit-limit #xd800 + :encode-literal-code-unit-limit #x10000 + :nul-encoding #(0 0) + :default-replacement #xfffd) + +(define-utf-16 :utf-16le :le) + +(define-character-encoding :utf-16be + "A 16-bit, variable-length encoding in which characters with +code points less than #x10000 can be encoded in a single 16-bit +word and characters with larger codes can be encoded in a pair of +16-bit words. The data is assumed to be in big-endian order. Output is +written in big-endian byte-order without a leading byte-order mark." + :aliases '(:utf-16/be) + :max-units-per-char 2 + :code-unit-size 16 + :native-endianness #+little-endian nil #+big-endian t + :decode-literal-code-unit-limit #xd800 + :encode-literal-code-unit-limit #x10000 + :nul-encoding #(0 0) + :default-replacement #xfffd) + +(define-utf-16 :utf-16be :be) + +(defmacro define-ucs (name bytes &optional endianness (limit #x110000)) + (check-type name keyword) + (check-type bytes (or (eql 2) (eql 4))) + (check-type endianness (or null (eql :le) (eql :be))) + (let ((swap-var (gensym "SWAP")) + (code-point-counter-name + (format-symbol t '#:~a-code-point-counter (string name))) + (encoder-name + (format-symbol t '#:~a-encoder (string name))) + (decoder-name + (format-symbol t '#:~a-decoder (string name)))) + (labels ((make-bom-check-form (end start getter src) + (if (null endianness) + ``(when (not (zerop (- ,,end ,,start))) + (case (,,getter ,,src 0 ,',bytes :ne) + (#.+byte-order-mark-code+ + (incf ,,start ,',bytes) nil) + (#.+swapped-byte-order-mark-code-32+ + (incf ,,start ,',bytes) t) + (t #+little-endian t))) + '())) + (make-setter-form (setter code dest di) + ``(,,setter ,,code ,,dest ,,di ,',bytes + ,',(or endianness :ne))) + (make-getter-form (getter src i) + (if (null endianness) + ``(if ,',swap-var + (,,getter ,,src ,,i ,',bytes :re) + (,,getter ,,src ,,i ,',bytes :ne)) + ``(,,getter ,,src ,,i ,',bytes ,',endianness)))) + `(progn + (define-code-point-counter ,name (getter type) + `(named-lambda ,',code-point-counter-name (seq start end max) + (declare (type ,type seq) (fixnum start end max)) + ;; check for bom + ,,(make-bom-check-form ''end ''start 'getter ''seq) + (multiple-value-bind (count rem) + (floor (- end start) ,',bytes) + (cond + ((and (plusp max) (> count max)) + (values max (the fixnum (+ start (* ,',bytes max))))) + (t + ;; check for incomplete last character + (unless (zerop rem) + (let ((vector (make-array ,',bytes :fill-pointer 0))) + (dotimes (i rem) + (vector-push (,getter seq (+ i (- end rem))) vector)) + (decoding-error vector ,',name seq (the fixnum (- end rem)) nil + 'end-of-input-in-character) + (decf end rem))) + (values count end)))))) + (define-encoder ,name (getter src-type setter dest-type) + `(named-lambda ,',encoder-name (src start end dest d-start) + (declare (type ,src-type src) + (type ,dest-type dest) + (fixnum start end d-start)) + (loop for i fixnum from start below end + and di fixnum from d-start by ,',bytes + for code of-type code-point = (,getter src i) + do (if (>= code ,',limit) + (encoding-error code ,',name src i +repl+) + ,,(make-setter-form 'setter ''code ''dest ''di)) + finally (return (the fixnum (- di d-start)))))) + (define-decoder ,name (getter src-type setter dest-type) + `(named-lambda ,',decoder-name (src start end dest d-start) + (declare (type ,src-type src) + (type ,dest-type dest) + (fixnum start end d-start)) + (let ((,',swap-var ,,(make-bom-check-form ''end ''start 'getter ''src))) + (declare (ignorable ,',swap-var)) + (loop for i fixnum from start below end by ,',bytes + and di from d-start + do (,setter (let ((unit ,,(make-getter-form 'getter ''src ''i))) + (if (>= unit ,',limit) + (decoding-error + (vector (,getter src i) + (,getter src (+ i 1)) + ,@,(if (= bytes 4) + ``((,getter src (+ i 2)) + (,getter src (+ i 3))))) + ,',name src i +repl+ + 'character-out-of-range) + unit)) + dest di) + finally (return (the fixnum (- di d-start))))))) + ',name)))) + +;;;; UTF-32 + +(define-character-encoding :utf-32 + "A 32-bit, fixed-length encoding in which all Unicode +characters can be encoded in a single 32-bit word. The +endianness of the encoded data is indicated by the endianness of +a byte-order-mark character (#\u+feff) prepended to the data; in +the absence of such a character on input, input data is assumed +to be in big-endian order. Output is written in native byte +order with a leading byte-order mark." + :aliases '(:ucs-4) + :max-units-per-char 1 + :code-unit-size 32 + :native-endianness t ; not necessarily true when decoding + :literal-char-code-limit #x110000 + :use-bom #+little-endian :utf-32le #+big-endian :utf-32be + :bom-encoding + #+big-endian #(#x00 #x00 #xfe #xff) + #+little-endian #(#xff #xfe #x00 #x00) + :nul-encoding #(0 0 0 0) + :ambiguous #+little-endian t #+big-endian nil) + +(define-ucs :utf-32 4) + +(define-character-encoding :utf-32le + "A 32-bit, fixed-length encoding in which all Unicode +characters can be encoded in a single 32-bit word. Input data is assumed +to be in little-endian order. Output is also written in little-endian byte +order without a leading byte-order mark." + :max-units-per-char 1 + :code-unit-size 32 + :aliases '(:utf-32/le :ucs-4le :ucs-4/le) + :native-endianness #+little-endian t #+big-endian nil + :literal-char-code-limit #x110000 + :nul-encoding #(0 0 0 0)) + +(define-ucs :utf-32le 4 :le) + +(define-character-encoding :utf-32be + "A 32-bit, fixed-length encoding in which all Unicode +characters can be encoded in a single 32-bit word. Input data is assumed +to be in big-endian order. Output is also written in big-endian byte +order without a leading byte-order mark." + :max-units-per-char 1 + :code-unit-size 32 + :aliases '(:utf-32/be :ucs-4be :ucs-4/be) + :native-endianness #+little-endian nil #+big-endian t + :literal-char-code-limit #x110000 + :nul-encoding #(0 0 0 0)) + +(define-ucs :utf-32be 4 :be) + +;; UCS-2 + +(define-character-encoding :ucs-2 + "A 16-bit, fixed-length encoding in which all Unicode +characters can be encoded in a single 16-bit word. The +endianness of the encoded data is indicated by the endianness of +a byte-order-mark character (#\u+feff) prepended to the data; in +the absence of such a character on input, input data is assumed +to be in big-endian order. Output is written in native byte +order with a leading byte-order mark." + :aliases '(:ucs-2) + :max-units-per-char 1 + :code-unit-size 16 + :native-endianness t ; not necessarily true when decoding + :literal-char-code-limit #x10000 + :use-bom #+little-endian :ucs-2le #+big-endian :ucs-2be + :bom-encoding + #+big-endian #(#xfe #xff) + #+little-endian #(#xff #xfe) + :nul-encoding #(0 0) + :ambiguous #+little-endian t #+big-endian nil) + +(define-ucs :ucs-2 2 nil #x10000) + +(define-character-encoding :ucs-2le + "A 16-bit, fixed-length encoding in which all Unicode +characters can be encoded in a single 16-bit word. Input data is assumed +to be in little-endian order. Output is also written in little-endian byte +order without a leading byte-order mark." + :max-units-per-char 1 + :code-unit-size 16 + :aliases '(:ucs-2/le) + :native-endianness #+little-endian t #+big-endian nil + :literal-char-code-limit #x10000 + :nul-encoding #(0 0)) + +(define-ucs :ucs-2le 2 :le #x10000) + +(define-character-encoding :ucs-2be + "A 16-bit, fixed-length encoding in which all Unicode +characters can be encoded in a single 16-bit word. Input data is assumed +to be in big-endian order. Output is also written in big-endian byte +order without a leading byte-order mark." + :max-units-per-char 1 + :code-unit-size 16 + :aliases '(:ucs-2/be) + :native-endianness #+little-endian nil #+big-endian t + :literal-char-code-limit #x10000 + :nul-encoding #(0 0)) + +(define-ucs :ucs-2be 2 :be #x10000) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/src/encodings.lisp b/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/src/encodings.lisp new file mode 100644 index 0000000..da2c66b --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/src/encodings.lisp @@ -0,0 +1,503 @@ +;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- +;;; +;;; encodings.lisp --- Character encodings and mappings. +;;; +;;; Copyright (C) 2007, Luis Oliveira +;;; +;;; Permission is hereby granted, free of charge, to any person +;;; obtaining a copy of this software and associated documentation +;;; files (the "Software"), to deal in the Software without +;;; restriction, including without limitation the rights to use, copy, +;;; modify, merge, publish, distribute, sublicense, and/or sell copies +;;; of the Software, and to permit persons to whom the Software is +;;; furnished to do so, subject to the following conditions: +;;; +;;; The above copyright notice and this permission notice shall be +;;; included in all copies or substantial portions of the Software. +;;; +;;; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +;;; EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +;;; MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +;;; NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +;;; HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +;;; WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +;;; OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +;;; DEALINGS IN THE SOFTWARE. + +(in-package #:babel-encodings) + +;;;; Character Encodings + +(defclass character-encoding () + ((name :initarg :name :reader enc-name + :initform (error "Must specify a NAME for this character encoding.")) + ;; Most of these documentation strings are taken from OpenMCL. + (documentation + :initarg :documentation :reader enc-documentation :initform nil) + ;; A non-exhaustive list of aliases for the encoding. + (aliases :initarg :aliases :initform nil :reader enc-aliases) + ;; Specified in bits. Usually 8, 16 or 32. + (code-unit-size + :initarg :code-unit-size :reader enc-code-unit-size :initform 8) + (max-units-per-char + :initarg :max-units-per-char :reader enc-max-units-per-char :initform 1) + ;; If NIL, it is necessary to swap 16- and 32-bit units. + (native-endianness + :initarg :native-endianness :reader enc-native-endianness :initform t) + ;; Code units less than this value map to themselves on input. + (decode-literal-code-unit-limit + :initarg :decode-literal-code-unit-limit :initform 0 + :reader enc-decode-literal-code-unit-limit) + ;; Code points less than this value map to themselves on output. + (encode-literal-code-unit-limit + :initarg :encode-literal-code-unit-limit :initform 0 + :reader enc-encode-literal-code-unit-limit) + ;; Defines whether it is necessary to prepend a byte-order-mark to + ;; determine the endianness. + (use-bom :initarg :use-bom :initform nil :reader enc-use-bom) + ;; How the byte-order-mark should be encoded, specified as a + ;; sequence of octets. NIL if it cannot be encoded. + (bom-encoding + :initarg :bom-encoding :reader enc-bom-encoding :initform nil) + ;; How should NUL be encoded, specified as sequence of octets. + (nul-encoding + :initarg :nul-encoding :reader enc-nul-encoding :initform #(0)) + ;; Preferred replacement character code point. + (default-replacement + :initarg :default-replacement :reader enc-default-replacement + :initform #x1a) + ;; Does VALID-STRING => OCTETS => STRING2 guarantee a valid + ;; STRING2? UTF-{16,32} on little-endian plaforms don't because + ;; they assume different endianness on each direction. + (ambiguous + :initarg :ambiguous :reader ambiguous-encoding-p :initform nil))) + +;;; I'm too lazy to write all the identical limits twice. +(defmethod initialize-instance :after ((enc character-encoding) + &key literal-char-code-limit) + (when literal-char-code-limit + (setf (slot-value enc 'encode-literal-code-unit-limit) + literal-char-code-limit) + (setf (slot-value enc 'decode-literal-code-unit-limit) + literal-char-code-limit))) + +#-(and) +(defmethod describe-object ((enc character-encoding) s) + "Prints out the name, aliases and documentation slots of a +character encoding object." + (with-slots (name aliases documentation) enc + (format s "~&~S" name) + (when aliases + (format s " [Aliases:~{ ~S~}]" aliases)) + (format s "~&~A~%~%" documentation)) + (call-next-method)) + +(defvar *supported-character-encodings* nil) + +(defun list-character-encodings () + "List of keyword symbols denoting supported character +encodings. This list does not include aliases." + *supported-character-encodings*) + +(defvar *character-encodings* (make-hash-table :test 'eq)) + +(defvar *default-character-encoding* :utf-8 + "Special variable used to determine the default character +encoding.") + +(defun get-character-encoding (name) + "Lookups the character encoding denoted by the keyword symbol +NAME. Signals an error if one is not found. If NAME is already +a CHARACTER-ENCONDING object, it is returned unmodified." + (when (typep name 'character-encoding) + (return-from get-character-encoding name)) + (when (eq name :default) + (setq name *default-character-encoding*)) + (or (gethash name *character-encodings*) + (error "Unknown character encoding: ~S" name))) + +(defmethod ambiguous-encoding-p ((encoding symbol)) + (ambiguous-encoding-p (get-character-encoding encoding))) + +(defun notice-character-encoding (enc) + (pushnew (enc-name enc) *supported-character-encodings*) + (dolist (kw (cons (enc-name enc) (enc-aliases enc))) + (setf (gethash kw *character-encodings*) enc)) + (enc-name enc)) + +(defmacro define-character-encoding (name docstring &body options) + `(notice-character-encoding + (make-instance 'character-encoding :name ,name ,@options + :documentation ,docstring))) + +;;;; Mappings + +;;; TODO: describe what mappings are + +(defun make-fixed-width-counter (getter type &optional (unit-size-in-bits 8)) + (declare (ignore getter type)) + (check-type unit-size-in-bits positive-fixnum) + (let ((unit-size-in-bytes (/ unit-size-in-bits 8))) + `(named-lambda fixed-width-counter (seq start end max) + (declare (ignore seq) (fixnum start end max)) + ;; XXX: the result can be bigger than a fixnum when (> unit-size + ;; 1) and we don't want that to happen. Possible solution: signal + ;; a warning (hmm, make that an actual error) and truncate. + (if (plusp max) + (let ((count (the fixnum (min (floor max ,unit-size-in-bytes) + (the fixnum (- end start)))))) + (values (the fixnum (* count ,unit-size-in-bytes)) + (the fixnum (+ start count)))) + (values (the fixnum (* (the fixnum (- end start)) + ,unit-size-in-bytes)) + (the fixnum end)))))) + +;;; Useful to develop new encodings incrementally starting with octet +;;; and code-unit counters. +(defun make-dummy-coder (sg st ds dt) + (declare (ignore sg st ds dt)) + `(named-lambda dummy-coder (src s e dest i) + (declare (ignore src s e dest i)) + (error "this encoder/decoder hasn't been implemented yet"))) + +;;; TODO: document here +;;; +;;; ENCODER -- (lambda (src-getter src-type dest-setter dest-type) ...) +;;; DECODER -- (lambda (src-getter src-type dest-setter dest-type) ...) +;;; +;;; OCTET-COUNTER -- (lambda (getter type) ...) +;;; CODE-POINT-COUNTER -- (lambda (getter type) ...) +(defclass abstract-mapping () + ((encoder-factory :accessor encoder-factory :initform 'make-dummy-coder) + (decoder-factory :accessor decoder-factory :initform 'make-dummy-coder) + (octet-counter-factory :accessor octet-counter-factory + :initform 'make-fixed-width-counter) + (code-point-counter-factory :accessor code-point-counter-factory + :initform 'make-fixed-width-counter))) + +;;; TODO: document these +;;; +;;; ENCODER -- (lambda (src start end dest d-start) ...) +;;; DECODER -- (lambda (src start end dest d-start) ...) +;;; +;;; OCTET-COUNTER -- (lambda (seq start end max-octets) ...) +;;; CODE-POINT-COUNTER -- (lambda (seq start end max-chars) ...) +;;; => N-CHARS NEW-END +;;; (important: describe NEW-END) +(defclass concrete-mapping () + ((encoder :accessor encoder) + (decoder :accessor decoder) + (octet-counter :accessor octet-counter) + (code-point-counter :accessor code-point-counter))) + +(defparameter *abstract-mappings* (make-hash-table :test 'eq)) + +(defun get-abstract-mapping (encoding) + (gethash encoding *abstract-mappings*)) + +(defun (setf get-abstract-mapping) (value encoding) + (setf (gethash encoding *abstract-mappings*) value)) + +(defun %register-mapping-part (encoding slot-name fn) + (let ((mapping (get-abstract-mapping encoding))) + (unless mapping + (setq mapping (make-instance 'abstract-mapping)) + (setf (get-abstract-mapping encoding) mapping)) + (setf (slot-value mapping slot-name) fn))) + +;;; See enc-*.lisp for example usages of these 4 macros. + +(defmacro define-encoder (encoding (sa st da dt) &body body) + `(%register-mapping-part ,encoding 'encoder-factory + (named-lambda encoder (,sa ,st ,da ,dt) + ,@body))) + +(defmacro define-decoder (encoding (sa st da dt) &body body) + `(%register-mapping-part ,encoding 'decoder-factory + (named-lambda decoder (,sa ,st ,da ,dt) + ,@body))) + +(defmacro define-octet-counter (encoding (acc type) &body body) + `(%register-mapping-part ,encoding 'octet-counter-factory + (named-lambda octet-counter-factory (,acc ,type) + ,@body))) + +(defmacro define-code-point-counter (encoding (acc type) &body body) + `(%register-mapping-part ,encoding 'code-point-counter-factory + (named-lambda code-point-counter (,acc ,type) + ,@body))) + +(defun instantiate-encoder (encoding am octet-seq-getter octet-seq-type + code-point-seq-setter code-point-seq-type) + (declare (ignore encoding)) + (funcall (encoder-factory am) + octet-seq-getter + octet-seq-type + code-point-seq-setter + code-point-seq-type)) + +(defun instantiate-decoder (encoding am octet-seq-getter octet-seq-type + code-point-seq-setter code-point-seq-type) + (declare (ignore encoding)) + (funcall (decoder-factory am) + octet-seq-getter + octet-seq-type + code-point-seq-setter + code-point-seq-type)) + +(defun instantiate-code-point-counter (encoding am octet-seq-getter + octet-seq-type) + (declare (ignore encoding)) + (funcall (code-point-counter-factory am) + octet-seq-getter + octet-seq-type)) + +(defun instantiate-octet-counter (encoding am code-point-seq-getter + code-point-seq-type) + (if (= 1 (enc-max-units-per-char encoding)) + (make-fixed-width-counter code-point-seq-getter code-point-seq-type + (enc-code-unit-size encoding)) + (funcall (octet-counter-factory am) + code-point-seq-getter + code-point-seq-type))) + +;;; Expands into code generated by the available abstract mappings +;;; that will be compiled into concrete mappings. This is used in +;;; e.g. strings.lisp to define mappings between strings and +;;; (unsigned-byte 8) vectors. +;;; +;;; For each encoding funcall the abstract mappings at macro-expansion +;;; time with the src/dest accessors and types to generate the +;;; appropriate code for the concrete mappings. These functions are +;;; then saved in their respective slots of the CONCRETE-MAPPING +;;; object. +(defmacro instantiate-concrete-mappings + (&key (encodings (hash-table-keys *abstract-mappings*)) + (optimize '((speed 3) (debug 0) (compilation-speed 0))) + octet-seq-getter octet-seq-setter octet-seq-type + code-point-seq-getter code-point-seq-setter code-point-seq-type + (instantiate-decoders t)) + `(let ((ht (make-hash-table :test 'eq))) + (declare (optimize ,@optimize) + #+sbcl (sb-ext:muffle-conditions sb-ext:compiler-note)) + (flet ((notice-mapping (encoding-name cm) + (let* ((encoding (get-character-encoding encoding-name)) + (aliases (enc-aliases encoding))) + (dolist (kw (cons (enc-name encoding) aliases)) + (setf (gethash kw ht) cm))))) + ,@(loop for encoding-name in encodings + for encoding = (get-character-encoding encoding-name) + for am = (gethash encoding-name *abstract-mappings*) + collect + `(let ((cm (make-instance 'concrete-mapping))) + (setf (encoder cm) + ,(instantiate-encoder encoding am + code-point-seq-getter + code-point-seq-type + octet-seq-setter + octet-seq-type)) + ,(when instantiate-decoders + `(progn + (setf (decoder cm) + ,(instantiate-decoder encoding am + octet-seq-getter + octet-seq-type + code-point-seq-setter + code-point-seq-type)) + (setf (code-point-counter cm) + ,(instantiate-code-point-counter + encoding am octet-seq-getter octet-seq-type)))) + (setf (octet-counter cm) + ,(instantiate-octet-counter encoding am + code-point-seq-getter + code-point-seq-type)) + (notice-mapping ,encoding-name cm)))) + ht)) + +;;; debugging stuff + +#-(and) +(defun pprint-instantiate-concrete-mappings + (&key (encodings (hash-table-keys *abstract-mappings*)) + (optimize '((debug 3) (safety 3))) + (octet-seq-setter 'ub-set) (octet-seq-getter 'ub-get) + (octet-seq-type '(simple-array (unsigned-byte 8) (*))) + (code-point-seq-setter 'string-set) + (code-point-seq-getter 'string-get) + (code-point-seq-type 'simple-unicode-string)) + (let ((encodings (ensure-list encodings)) + (*package* (find-package :babel-encodings)) + (*print-case* :downcase)) + (pprint + (macroexpand + `(instantiate-concrete-mappings + :encodings ,encodings + :optimize ,optimize + :octet-seq-getter ,octet-seq-getter + :octet-seq-setter ,octet-seq-setter + :octet-seq-type ,octet-seq-type + :code-point-seq-getter ,code-point-seq-getter + :code-point-seq-setter ,code-point-seq-setter + :code-point-seq-type ,code-point-seq-type)))) + (values)) + +;;;; Utilities used in enc-*.lisp + +(defconstant +default-substitution-code-point+ #x1a + "Default ASCII substitution character code point used in case of an encoding/decoding error.") + +;;; We're converting between objects of the (UNSIGNED-BYTE 8) and +;;; (MOD #x110000) types which are aliased here to UB8 and CODE-POINT +;;; for convenience. +(deftype ub8 () '(unsigned-byte 8)) +(deftype code-point () '(mod #x110000)) + +;;; Utility macro around DEFINE-ENCODER that takes care of most of the +;;; work need to deal with an 8-bit, fixed-width character encoding. +;;; +;;; BODY will be inside a loop and its return value will placed in the +;;; destination buffer. BODY will be surounded by lexical BLOCK which +;;; will have the ENCODING's name, usually a keyword. It handles all +;;; sorts of type declarations. +;;; +;;; See enc-ascii.lisp for a simple usage example. +(defmacro define-unibyte-encoder (encoding (code) &body body) + (with-unique-names (s-getter s-type d-setter d-type + src start end dest d-start i di) + `(define-encoder ,encoding (,s-getter ,s-type ,d-setter ,d-type) + `(named-lambda ,',(symbolicate encoding '#:-unibyte-encoder) + (,',src ,',start ,',end ,',dest ,',d-start) + (declare (type ,,s-type ,',src) + (type ,,d-type ,',dest) + (fixnum ,',start ,',end ,',d-start)) + (loop for ,',i fixnum from ,',start below ,',end + and ,',di fixnum from ,',d-start do + (,,d-setter + (macrolet + ;; this should probably be a function... + ((handle-error (&optional (c ''character-encoding-error)) + `(encoding-error + ,',',code ,',',encoding ,',',src ,',',i + +default-substitution-code-point+ ,c))) + (let ((,',code (,,s-getter ,',src ,',i))) + (declare (type code-point ,',code)) + (block ,',encoding ,@',body))) + ,',dest ,',di) + finally (return (the fixnum (- ,',di ,',d-start)))))))) + +;;; The decoder version of the above macro. +(defmacro define-unibyte-decoder (encoding (octet) &body body) + (with-unique-names (s-getter s-type d-setter d-type + src start end dest d-start i di) + `(define-decoder ,encoding (,s-getter ,s-type ,d-setter ,d-type) + `(named-lambda ,',(symbolicate encoding '#:-unibyte-encoder) + (,',src ,',start ,',end ,',dest ,',d-start) + (declare (type ,,s-type ,',src) + (type ,,d-type ,',dest) + (fixnum ,',start ,',end ,',d-start)) + (loop for ,',i fixnum from ,',start below ,',end + and ,',di fixnum from ,',d-start do + (,,d-setter + (macrolet + ;; this should probably be a function... + ((handle-error (&optional (c ''character-decoding-error)) + `(decoding-error + (vector ,',',octet) ,',',encoding ,',',src ,',',i + +default-substitution-code-point+ ,c))) + (let ((,',octet (,,s-getter ,',src ,',i))) + (declare (type ub8 ,',octet)) + (block ,',encoding ,@',body))) + ,',dest ,',di) + finally (return (the fixnum (- ,',di ,',d-start)))))))) + +;;;; Error Conditions +;;; +;;; For now, we don't define any actual restarts. The only mechanism +;;; for "restarting" a coding error is the +;;; *SUPPRESS-CHARACTER-CODING-ERRORS* special variable which, when +;;; bound to T (the default), suppresses any error and uses a default +;;; replacement character instead. +;;; +;;; If it turns out that other more options are necessary, possible +;;; alternative approaches include: +;;; +;;; a) use a *REPLACEMENT-CHARACTER* special variable that lets us +;;; pick our own replacement character. The encoder must do +;;; additional work to check if this is character is encodable. +;;; +;;; b) offer a restart to pick a replacement character. Same +;;; problem as above. +;;; +;;; Both approaches pose encoding problems when dealing with a +;;; variable-width encodings because different replacement characters +;;; will need different numbers of octets. This is not a problem for +;;; UTF but will be a problem for the CJK charsets. Approach (a) is +;;; nevertheless easier since the replacement character is known in +;;; advance and therefore the octet-counter can account for it. +;;; +;;; For more complex restarts like SBCL's -- that'll let you specify +;;; _several_ replacement characters for a single character error -- +;;; will probably need extra support code outside the encoder/decoder +;;; (i.e. in the string-to-octets function, for example) since the +;;; encoders/decoders deal with pre-allocated fixed-length buffers. +;;; +;;; SBCL has ASCII-specific (MALFORMED-ASCII) and UTF8-specific +;;; errors. Why? Do we want to add some of those too? + +;;; FIXME: We used to deal with this with an extra ERRORP argument for +;;; encoders, decoders, etc... Still undecided on the best way to do +;;; it. We could also use a simple restart instead of this... +;;; +;;; In any case, this is not for the users to bind and it's not +;;; exported from the BABEL package. +(defvar *suppress-character-coding-errors* nil + "If non-NIL, encoding or decoding errors are suppressed and the +the current character encoding's default replacement character is +used.") + +;;; All of Babel's error conditions are subtypes of +;;; CHARACTER-CODING-ERROR. This error hierarchy is based on SBCL's. +(define-condition character-coding-error (error) + ((buffer :initarg :buffer :reader character-coding-error-buffer) + (position :initarg :position :reader character-coding-error-position) + (encoding :initarg :encoding :reader character-coding-error-encoding))) + +(define-condition character-encoding-error (character-coding-error) + ((code :initarg :code :reader character-encoding-error-code)) + (:report (lambda (c s) + (format s "Unable to encode character code point ~A as ~S." + (character-encoding-error-code c) + (character-coding-error-encoding c))))) + +(declaim (inline encoding-error)) +(defun encoding-error (code enc buf pos &optional + (sub +default-substitution-code-point+) + (e 'character-encoding-error)) + (unless *suppress-character-coding-errors* + (error e :encoding enc :buffer buf :position pos :code code)) + sub) + +(define-condition character-decoding-error (character-coding-error) + ((octets :initarg :octets :reader character-decoding-error-octets)) + (:report (lambda (c s) + (format s "Illegal ~S character starting at position ~D." + (character-coding-error-encoding c) + (character-coding-error-position c))))) + +(define-condition end-of-input-in-character (character-decoding-error) + () + (:documentation "Signalled by DECODERs or CODE-POINT-COUNTERs +of variable-width character encodings.")) + +(define-condition character-out-of-range (character-decoding-error) + () + (:documentation + "Signalled when the character being decoded is out of range.")) + +(declaim (inline decoding-error)) +(defun decoding-error (octets enc buf pos &optional + (sub +default-substitution-code-point+) + (e 'character-decoding-error)) + (unless *suppress-character-coding-errors* + (error e :octets octets :encoding enc :buffer buf :position pos)) + sub) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/src/external-format.lisp b/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/src/external-format.lisp new file mode 100644 index 0000000..62bb919 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/src/external-format.lisp @@ -0,0 +1,88 @@ +;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- +;;; +;;; external-format.lisp --- External format classes and functions. +;;; +;;; Copyright (C) 2007, Luis Oliveira +;;; +;;; Permission is hereby granted, free of charge, to any person +;;; obtaining a copy of this software and associated documentation +;;; files (the "Software"), to deal in the Software without +;;; restriction, including without limitation the rights to use, copy, +;;; modify, merge, publish, distribute, sublicense, and/or sell copies +;;; of the Software, and to permit persons to whom the Software is +;;; furnished to do so, subject to the following conditions: +;;; +;;; The above copyright notice and this permission notice shall be +;;; included in all copies or substantial portions of the Software. +;;; +;;; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +;;; EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +;;; MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +;;; NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +;;; HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +;;; WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +;;; OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +;;; DEALINGS IN THE SOFTWARE. + +(in-package #:babel) + +(defvar *default-eol-style* + #+windows :crlf + #-windows :lf + "The end-of-line style used by external formats if none is +explicitly given. Depends on the OS the code is compiled on.") + +(deftype eol-style () + "Possible end-of-line styles." + '(member :cr :lf :crlf)) + +(defclass external-format () + ((encoding :initarg :encoding :reader external-format-encoding + :type character-encoding) + (eol-style :initarg :eol-style :reader external-format-eol-style + :type eol-style :initform *default-eol-style*)) + (:documentation + "An EXTERNAL-FORMAT consists in a combination of a Babel +CHARACTER-ENCODING and an end-of-line style.")) + +(defmethod print-object ((ef external-format) stream) + (print-unreadable-object (ef stream :type t :identity t) + (format stream "~A ~A" + (enc-name (external-format-encoding ef)) + (external-format-eol-style ef)))) + +;;; This interface is still somewhat sketchy. The rest of Babel +;;; doesn't really understand external formats, for instance. +(defun make-external-format (encoding &key (eol-style *default-eol-style*)) + (check-type eol-style eol-style) + (make-instance 'external-format + :encoding (get-character-encoding encoding) + :eol-style eol-style)) + +(defun ensure-external-format (thing) + (etypecase thing + (external-format thing) + (character-encoding (make-instance 'external-format :encoding thing)) + (symbol (make-external-format thing)) + (list (apply #'make-external-format thing)))) + +(defun external-format-equal (ef1 ef2) + (and (eq (external-format-encoding ef1) (external-format-encoding ef2)) + (eq (external-format-eol-style ef1) (external-format-eol-style ef2)))) + +(declaim (inline lookup-mapping)) +(defun lookup-mapping (ht encoding) + "HT should be an hashtable created by +INSTANTIATE-CONCRETE-MAPPINGS. ENCODING should be either an +external format, an encoding object or a keyword symbol +denoting a character encoding name or one of its aliases." + (or (etypecase encoding + (keyword + (gethash encoding ht)) + (babel-encodings::concrete-mapping + encoding) + (character-encoding + (gethash (enc-name encoding) ht)) + (external-format + (gethash (enc-name (external-format-encoding encoding)) ht))) + (error "~S is not a valid encoding designator" encoding))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/src/gbk-map.lisp b/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/src/gbk-map.lisp new file mode 100644 index 0000000..5b7eb4f --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/src/gbk-map.lisp @@ -0,0 +1,2226 @@ +;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- +;;; +;;; gbk-map.lisp --- GBK encoding map. +;;; +;;; Copyright (C) 2011, Li Wenpeng +;;; +;;; Permission is hereby granted, free of charge, to any person +;;; obtaining a copy of this software and associated documentation +;;; files (the "Software"), to deal in the Software without +;;; restriction, including without limitation the rights to use, copy, +;;; modify, merge, publish, distribute, sublicense, and/or sell copies +;;; of the Software, and to permit persons to whom the Software is +;;; furnished to do so, subject to the following conditions: +;;; +;;; The above copyright notice and this permission notice shall be +;;; included in all copies or substantial portions of the Software. +;;; +;;; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +;;; EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +;;; MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +;;; NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +;;; HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +;;; WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +;;; OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +;;; DEALINGS IN THE SOFTWARE. + +(in-package #:babel-encodings) + +(defparameter *gbk-unicode-mapping* + (map 'babel:unicode-string + #'code-char + '(#x554A #x963F #x57C3 #x6328 #x54CE #x5509 #x54C0 #x7691 #x764C #x853C + #x77EE #x827E #x788D #x7231 #x9698 #x978D #x6C28 #x5B89 #x4FFA #x6309 + #x6697 #x5CB8 #x80FA #x6848 #x80AE #x6602 #x76CE #x51F9 #x6556 #x71AC + #x7FF1 #x8884 #x50B2 #x5965 #x61CA #x6FB3 #x82AD #x634C #x6252 #x53ED + #x5427 #x7B06 #x516B #x75A4 #x5DF4 #x62D4 #x8DCB #x9776 #x628A #x8019 + #x575D #x9738 #x7F62 #x7238 #x767D #x67CF #x767E #x6446 #x4F70 #x8D25 + #x62DC #x7A17 #x6591 #x73ED #x642C #x6273 #x822C #x9881 #x677F #x7248 + #x626E #x62CC #x4F34 #x74E3 #x534A #x529E #x7ECA #x90A6 #x5E2E #x6886 + #x699C #x8180 #x7ED1 #x68D2 #x78C5 #x868C #x9551 #x508D #x8C24 #x82DE + #x80DE #x5305 #x8912 #x5265 #x8584 #x96F9 #x4FDD #x5821 #x9971 #x5B9D + #x62B1 #x62A5 #x66B4 #x8C79 #x9C8D #x7206 #x676F #x7891 #x60B2 #x5351 + #x5317 #x8F88 #x80CC #x8D1D #x94A1 #x500D #x72C8 #x5907 #x60EB #x7119 + #x88AB #x5954 #x82EF #x672C #x7B28 #x5D29 #x7EF7 #x752D #x6CF5 #x8E66 + #x8FF8 #x903C #x9F3B #x6BD4 #x9119 #x7B14 #x5F7C #x78A7 #x84D6 #x853D + #x6BD5 #x6BD9 #x6BD6 #x5E01 #x5E87 #x75F9 #x95ED #x655D #x5F0A #x5FC5 + #x8F9F #x58C1 #x81C2 #x907F #x965B #x97AD #x8FB9 #x7F16 #x8D2C #x6241 + #x4FBF #x53D8 #x535E #x8FA8 #x8FA9 #x8FAB #x904D #x6807 #x5F6A #x8198 + #x8868 #x9CD6 #x618B #x522B #x762A #x5F6C #x658C #x6FD2 #x6EE8 #x5BBE + #x6448 #x5175 #x51B0 #x67C4 #x4E19 #x79C9 #x997C #x70B3 #x75C5 #x5E76 + #x73BB #x83E0 #x64AD #x62E8 #x94B5 #x6CE2 #x535A #x52C3 #x640F #x94C2 + #x7B94 #x4F2F #x5E1B #x8236 #x8116 #x818A #x6E24 #x6CCA #x9A73 #x6355 + #x535C #x54FA #x8865 #x57E0 #x4E0D #x5E03 #x6B65 #x7C3F #x90E8 #x6016 + #x64E6 #x731C #x88C1 #x6750 #x624D #x8D22 #x776C #x8E29 #x91C7 #x5F69 + #x83DC #x8521 #x9910 #x53C2 #x8695 #x6B8B #x60ED #x60E8 #x707F #x82CD + #x8231 #x4ED3 #x6CA7 #x85CF #x64CD #x7CD9 #x69FD #x66F9 #x8349 #x5395 + #x7B56 #x4FA7 #x518C #x6D4B #x5C42 #x8E6D #x63D2 #x53C9 #x832C #x8336 + #x67E5 #x78B4 #x643D #x5BDF #x5C94 #x5DEE #x8BE7 #x62C6 #x67F4 #x8C7A + #x6400 #x63BA #x8749 #x998B #x8C17 #x7F20 #x94F2 #x4EA7 #x9610 #x98A4 + #x660C #x7316 #x573A #x5C1D #x5E38 #x957F #x507F #x80A0 #x5382 #x655E + #x7545 #x5531 #x5021 #x8D85 #x6284 #x949E #x671D #x5632 #x6F6E #x5DE2 + #x5435 #x7092 #x8F66 #x626F #x64A4 #x63A3 #x5F7B #x6F88 #x90F4 #x81E3 + #x8FB0 #x5C18 #x6668 #x5FF1 #x6C89 #x9648 #x8D81 #x886C #x6491 #x79F0 + #x57CE #x6A59 #x6210 #x5448 #x4E58 #x7A0B #x60E9 #x6F84 #x8BDA #x627F + #x901E #x9A8B #x79E4 #x5403 #x75F4 #x6301 #x5319 #x6C60 #x8FDF #x5F1B + #x9A70 #x803B #x9F7F #x4F88 #x5C3A #x8D64 #x7FC5 #x65A5 #x70BD #x5145 + #x51B2 #x866B #x5D07 #x5BA0 #x62BD #x916C #x7574 #x8E0C #x7A20 #x6101 + #x7B79 #x4EC7 #x7EF8 #x7785 #x4E11 #x81ED #x521D #x51FA #x6A71 #x53A8 + #x8E87 #x9504 #x96CF #x6EC1 #x9664 #x695A #x7840 #x50A8 #x77D7 #x6410 + #x89E6 #x5904 #x63E3 #x5DDD #x7A7F #x693D #x4F20 #x8239 #x5598 #x4E32 + #x75AE #x7A97 #x5E62 #x5E8A #x95EF #x521B #x5439 #x708A #x6376 #x9524 + #x5782 #x6625 #x693F #x9187 #x5507 #x6DF3 #x7EAF #x8822 #x6233 #x7EF0 + #x75B5 #x8328 #x78C1 #x96CC #x8F9E #x6148 #x74F7 #x8BCD #x6B64 #x523A + #x8D50 #x6B21 #x806A #x8471 #x56F1 #x5306 #x4ECE #x4E1B #x51D1 #x7C97 + #x918B #x7C07 #x4FC3 #x8E7F #x7BE1 #x7A9C #x6467 #x5D14 #x50AC #x8106 + #x7601 #x7CB9 #x6DEC #x7FE0 #x6751 #x5B58 #x5BF8 #x78CB #x64AE #x6413 + #x63AA #x632B #x9519 #x642D #x8FBE #x7B54 #x7629 #x6253 #x5927 #x5446 + #x6B79 #x50A3 #x6234 #x5E26 #x6B86 #x4EE3 #x8D37 #x888B #x5F85 #x902E + #x6020 #x803D #x62C5 #x4E39 #x5355 #x90F8 #x63B8 #x80C6 #x65E6 #x6C2E + #x4F46 #x60EE #x6DE1 #x8BDE #x5F39 #x86CB #x5F53 #x6321 #x515A #x8361 + #x6863 #x5200 #x6363 #x8E48 #x5012 #x5C9B #x7977 #x5BFC #x5230 #x7A3B + #x60BC #x9053 #x76D7 #x5FB7 #x5F97 #x7684 #x8E6C #x706F #x767B #x7B49 + #x77AA #x51F3 #x9093 #x5824 #x4F4E #x6EF4 #x8FEA #x654C #x7B1B #x72C4 + #x6DA4 #x7FDF #x5AE1 #x62B5 #x5E95 #x5730 #x8482 #x7B2C #x5E1D #x5F1F + #x9012 #x7F14 #x98A0 #x6382 #x6EC7 #x7898 #x70B9 #x5178 #x975B #x57AB + #x7535 #x4F43 #x7538 #x5E97 #x60E6 #x5960 #x6DC0 #x6BBF #x7889 #x53FC + #x96D5 #x51CB #x5201 #x6389 #x540A #x9493 #x8C03 #x8DCC #x7239 #x789F + #x8776 #x8FED #x8C0D #x53E0 #x4E01 #x76EF #x53EE #x9489 #x9876 #x9F0E + #x952D #x5B9A #x8BA2 #x4E22 #x4E1C #x51AC #x8463 #x61C2 #x52A8 #x680B + #x4F97 #x606B #x51BB #x6D1E #x515C #x6296 #x6597 #x9661 #x8C46 #x9017 + #x75D8 #x90FD #x7763 #x6BD2 #x728A #x72EC #x8BFB #x5835 #x7779 #x8D4C + #x675C #x9540 #x809A #x5EA6 #x6E21 #x5992 #x7AEF #x77ED #x953B #x6BB5 + #x65AD #x7F0E #x5806 #x5151 #x961F #x5BF9 #x58A9 #x5428 #x8E72 #x6566 + #x987F #x56E4 #x949D #x76FE #x9041 #x6387 #x54C6 #x591A #x593A #x579B + #x8EB2 #x6735 #x8DFA #x8235 #x5241 #x60F0 #x5815 #x86FE #x5CE8 #x9E45 + #x4FC4 #x989D #x8BB9 #x5A25 #x6076 #x5384 #x627C #x904F #x9102 #x997F + #x6069 #x800C #x513F #x8033 #x5C14 #x9975 #x6D31 #x4E8C #x8D30 #x53D1 + #x7F5A #x7B4F #x4F10 #x4E4F #x9600 #x6CD5 #x73D0 #x85E9 #x5E06 #x756A + #x7FFB #x6A0A #x77FE #x9492 #x7E41 #x51E1 #x70E6 #x53CD #x8FD4 #x8303 + #x8D29 #x72AF #x996D #x6CDB #x574A #x82B3 #x65B9 #x80AA #x623F #x9632 + #x59A8 #x4EFF #x8BBF #x7EBA #x653E #x83F2 #x975E #x5561 #x98DE #x80A5 + #x532A #x8BFD #x5420 #x80BA #x5E9F #x6CB8 #x8D39 #x82AC #x915A #x5429 + #x6C1B #x5206 #x7EB7 #x575F #x711A #x6C7E #x7C89 #x594B #x4EFD #x5FFF + #x6124 #x7CAA #x4E30 #x5C01 #x67AB #x8702 #x5CF0 #x950B #x98CE #x75AF + #x70FD #x9022 #x51AF #x7F1D #x8BBD #x5949 #x51E4 #x4F5B #x5426 #x592B + #x6577 #x80A4 #x5B75 #x6276 #x62C2 #x8F90 #x5E45 #x6C1F #x7B26 #x4F0F + #x4FD8 #x670D #x6D6E #x6DAA #x798F #x88B1 #x5F17 #x752B #x629A #x8F85 + #x4FEF #x91DC #x65A7 #x812F #x8151 #x5E9C #x8150 #x8D74 #x526F #x8986 + #x8D4B #x590D #x5085 #x4ED8 #x961C #x7236 #x8179 #x8D1F #x5BCC #x8BA3 + #x9644 #x5987 #x7F1A #x5490 #x5676 #x560E #x8BE5 #x6539 #x6982 #x9499 + #x76D6 #x6E89 #x5E72 #x7518 #x6746 #x67D1 #x7AFF #x809D #x8D76 #x611F + #x79C6 #x6562 #x8D63 #x5188 #x521A #x94A2 #x7F38 #x809B #x7EB2 #x5C97 + #x6E2F #x6760 #x7BD9 #x768B #x9AD8 #x818F #x7F94 #x7CD5 #x641E #x9550 + #x7A3F #x544A #x54E5 #x6B4C #x6401 #x6208 #x9E3D #x80F3 #x7599 #x5272 + #x9769 #x845B #x683C #x86E4 #x9601 #x9694 #x94EC #x4E2A #x5404 #x7ED9 + #x6839 #x8DDF #x8015 #x66F4 #x5E9A #x7FB9 #x57C2 #x803F #x6897 #x5DE5 + #x653B #x529F #x606D #x9F9A #x4F9B #x8EAC #x516C #x5BAB #x5F13 #x5DE9 + #x6C5E #x62F1 #x8D21 #x5171 #x94A9 #x52FE #x6C9F #x82DF #x72D7 #x57A2 + #x6784 #x8D2D #x591F #x8F9C #x83C7 #x5495 #x7B8D #x4F30 #x6CBD #x5B64 + #x59D1 #x9F13 #x53E4 #x86CA #x9AA8 #x8C37 #x80A1 #x6545 #x987E #x56FA + #x96C7 #x522E #x74DC #x5250 #x5BE1 #x6302 #x8902 #x4E56 #x62D0 #x602A + #x68FA #x5173 #x5B98 #x51A0 #x89C2 #x7BA1 #x9986 #x7F50 #x60EF #x704C + #x8D2F #x5149 #x5E7F #x901B #x7470 #x89C4 #x572D #x7845 #x5F52 #x9F9F + #x95FA #x8F68 #x9B3C #x8BE1 #x7678 #x6842 #x67DC #x8DEA #x8D35 #x523D + #x8F8A #x6EDA #x68CD #x9505 #x90ED #x56FD #x679C #x88F9 #x8FC7 #x54C8 + #x9AB8 #x5B69 #x6D77 #x6C26 #x4EA5 #x5BB3 #x9A87 #x9163 #x61A8 #x90AF + #x97E9 #x542B #x6DB5 #x5BD2 #x51FD #x558A #x7F55 #x7FF0 #x64BC #x634D + #x65F1 #x61BE #x608D #x710A #x6C57 #x6C49 #x592F #x676D #x822A #x58D5 + #x568E #x8C6A #x6BEB #x90DD #x597D #x8017 #x53F7 #x6D69 #x5475 #x559D + #x8377 #x83CF #x6838 #x79BE #x548C #x4F55 #x5408 #x76D2 #x8C89 #x9602 + #x6CB3 #x6DB8 #x8D6B #x8910 #x9E64 #x8D3A #x563F #x9ED1 #x75D5 #x5F88 + #x72E0 #x6068 #x54FC #x4EA8 #x6A2A #x8861 #x6052 #x8F70 #x54C4 #x70D8 + #x8679 #x9E3F #x6D2A #x5B8F #x5F18 #x7EA2 #x5589 #x4FAF #x7334 #x543C + #x539A #x5019 #x540E #x547C #x4E4E #x5FFD #x745A #x58F6 #x846B #x80E1 + #x8774 #x72D0 #x7CCA #x6E56 #x5F27 #x864E #x552C #x62A4 #x4E92 #x6CAA + #x6237 #x82B1 #x54D7 #x534E #x733E #x6ED1 #x753B #x5212 #x5316 #x8BDD + #x69D0 #x5F8A #x6000 #x6DEE #x574F #x6B22 #x73AF #x6853 #x8FD8 #x7F13 + #x6362 #x60A3 #x5524 #x75EA #x8C62 #x7115 #x6DA3 #x5BA6 #x5E7B #x8352 + #x614C #x9EC4 #x78FA #x8757 #x7C27 #x7687 #x51F0 #x60F6 #x714C #x6643 + #x5E4C #x604D #x8C0E #x7070 #x6325 #x8F89 #x5FBD #x6062 #x86D4 #x56DE + #x6BC1 #x6094 #x6167 #x5349 #x60E0 #x6666 #x8D3F #x79FD #x4F1A #x70E9 + #x6C47 #x8BB3 #x8BF2 #x7ED8 #x8364 #x660F #x5A5A #x9B42 #x6D51 #x6DF7 + #x8C41 #x6D3B #x4F19 #x706B #x83B7 #x6216 #x60D1 #x970D #x8D27 #x7978 + #x51FB #x573E #x57FA #x673A #x7578 #x7A3D #x79EF #x7B95 #x808C #x9965 + #x8FF9 #x6FC0 #x8BA5 #x9E21 #x59EC #x7EE9 #x7F09 #x5409 #x6781 #x68D8 + #x8F91 #x7C4D #x96C6 #x53CA #x6025 #x75BE #x6C72 #x5373 #x5AC9 #x7EA7 + #x6324 #x51E0 #x810A #x5DF1 #x84DF #x6280 #x5180 #x5B63 #x4F0E #x796D + #x5242 #x60B8 #x6D4E #x5BC4 #x5BC2 #x8BA1 #x8BB0 #x65E2 #x5FCC #x9645 + #x5993 #x7EE7 #x7EAA #x5609 #x67B7 #x5939 #x4F73 #x5BB6 #x52A0 #x835A + #x988A #x8D3E #x7532 #x94BE #x5047 #x7A3C #x4EF7 #x67B6 #x9A7E #x5AC1 + #x6B7C #x76D1 #x575A #x5C16 #x7B3A #x95F4 #x714E #x517C #x80A9 #x8270 + #x5978 #x7F04 #x8327 #x68C0 #x67EC #x78B1 #x7877 #x62E3 #x6361 #x7B80 + #x4FED #x526A #x51CF #x8350 #x69DB #x9274 #x8DF5 #x8D31 #x89C1 #x952E + #x7BAD #x4EF6 #x5065 #x8230 #x5251 #x996F #x6E10 #x6E85 #x6DA7 #x5EFA + #x50F5 #x59DC #x5C06 #x6D46 #x6C5F #x7586 #x848B #x6868 #x5956 #x8BB2 + #x5320 #x9171 #x964D #x8549 #x6912 #x7901 #x7126 #x80F6 #x4EA4 #x90CA + #x6D47 #x9A84 #x5A07 #x56BC #x6405 #x94F0 #x77EB #x4FA5 #x811A #x72E1 + #x89D2 #x997A #x7F34 #x7EDE #x527F #x6559 #x9175 #x8F7F #x8F83 #x53EB + #x7A96 #x63ED #x63A5 #x7686 #x79F8 #x8857 #x9636 #x622A #x52AB #x8282 + #x6854 #x6770 #x6377 #x776B #x7AED #x6D01 #x7ED3 #x89E3 #x59D0 #x6212 + #x85C9 #x82A5 #x754C #x501F #x4ECB #x75A5 #x8BEB #x5C4A #x5DFE #x7B4B + #x65A4 #x91D1 #x4ECA #x6D25 #x895F #x7D27 #x9526 #x4EC5 #x8C28 #x8FDB + #x9773 #x664B #x7981 #x8FD1 #x70EC #x6D78 #x5C3D #x52B2 #x8346 #x5162 + #x830E #x775B #x6676 #x9CB8 #x4EAC #x60CA #x7CBE #x7CB3 #x7ECF #x4E95 + #x8B66 #x666F #x9888 #x9759 #x5883 #x656C #x955C #x5F84 #x75C9 #x9756 + #x7ADF #x7ADE #x51C0 #x70AF #x7A98 #x63EA #x7A76 #x7EA0 #x7396 #x97ED + #x4E45 #x7078 #x4E5D #x9152 #x53A9 #x6551 #x65E7 #x81FC #x8205 #x548E + #x5C31 #x759A #x97A0 #x62D8 #x72D9 #x75BD #x5C45 #x9A79 #x83CA #x5C40 + #x5480 #x77E9 #x4E3E #x6CAE #x805A #x62D2 #x636E #x5DE8 #x5177 #x8DDD + #x8E1E #x952F #x4FF1 #x53E5 #x60E7 #x70AC #x5267 #x6350 #x9E43 #x5A1F + #x5026 #x7737 #x5377 #x7EE2 #x6485 #x652B #x6289 #x6398 #x5014 #x7235 + #x89C9 #x51B3 #x8BC0 #x7EDD #x5747 #x83CC #x94A7 #x519B #x541B #x5CFB + #x4FCA #x7AE3 #x6D5A #x90E1 #x9A8F #x5580 #x5496 #x5361 #x54AF #x5F00 + #x63E9 #x6977 #x51EF #x6168 #x520A #x582A #x52D8 #x574E #x780D #x770B + #x5EB7 #x6177 #x7CE0 #x625B #x6297 #x4EA2 #x7095 #x8003 #x62F7 #x70E4 + #x9760 #x5777 #x82DB #x67EF #x68F5 #x78D5 #x9897 #x79D1 #x58F3 #x54B3 + #x53EF #x6E34 #x514B #x523B #x5BA2 #x8BFE #x80AF #x5543 #x57A6 #x6073 + #x5751 #x542D #x7A7A #x6050 #x5B54 #x63A7 #x62A0 #x53E3 #x6263 #x5BC7 + #x67AF #x54ED #x7A9F #x82E6 #x9177 #x5E93 #x88E4 #x5938 #x57AE #x630E + #x8DE8 #x80EF #x5757 #x7B77 #x4FA9 #x5FEB #x5BBD #x6B3E #x5321 #x7B50 + #x72C2 #x6846 #x77FF #x7736 #x65F7 #x51B5 #x4E8F #x76D4 #x5CBF #x7AA5 + #x8475 #x594E #x9B41 #x5080 #x9988 #x6127 #x6E83 #x5764 #x6606 #x6346 + #x56F0 #x62EC #x6269 #x5ED3 #x9614 #x5783 #x62C9 #x5587 #x8721 #x814A + #x8FA3 #x5566 #x83B1 #x6765 #x8D56 #x84DD #x5A6A #x680F #x62E6 #x7BEE + #x9611 #x5170 #x6F9C #x8C30 #x63FD #x89C8 #x61D2 #x7F06 #x70C2 #x6EE5 + #x7405 #x6994 #x72FC #x5ECA #x90CE #x6717 #x6D6A #x635E #x52B3 #x7262 + #x8001 #x4F6C #x59E5 #x916A #x70D9 #x6D9D #x52D2 #x4E50 #x96F7 #x956D + #x857E #x78CA #x7D2F #x5121 #x5792 #x64C2 #x808B #x7C7B #x6CEA #x68F1 + #x695E #x51B7 #x5398 #x68A8 #x7281 #x9ECE #x7BF1 #x72F8 #x79BB #x6F13 + #x7406 #x674E #x91CC #x9CA4 #x793C #x8389 #x8354 #x540F #x6817 #x4E3D + #x5389 #x52B1 #x783E #x5386 #x5229 #x5088 #x4F8B #x4FD0 #x75E2 #x7ACB + #x7C92 #x6CA5 #x96B6 #x529B #x7483 #x54E9 #x4FE9 #x8054 #x83B2 #x8FDE + #x9570 #x5EC9 #x601C #x6D9F #x5E18 #x655B #x8138 #x94FE #x604B #x70BC + #x7EC3 #x7CAE #x51C9 #x6881 #x7CB1 #x826F #x4E24 #x8F86 #x91CF #x667E + #x4EAE #x8C05 #x64A9 #x804A #x50DA #x7597 #x71CE #x5BE5 #x8FBD #x6F66 + #x4E86 #x6482 #x9563 #x5ED6 #x6599 #x5217 #x88C2 #x70C8 #x52A3 #x730E + #x7433 #x6797 #x78F7 #x9716 #x4E34 #x90BB #x9CDE #x6DCB #x51DB #x8D41 + #x541D #x62CE #x73B2 #x83F1 #x96F6 #x9F84 #x94C3 #x4F36 #x7F9A #x51CC + #x7075 #x9675 #x5CAD #x9886 #x53E6 #x4EE4 #x6E9C #x7409 #x69B4 #x786B + #x998F #x7559 #x5218 #x7624 #x6D41 #x67F3 #x516D #x9F99 #x804B #x5499 + #x7B3C #x7ABF #x9686 #x5784 #x62E2 #x9647 #x697C #x5A04 #x6402 #x7BD3 + #x6F0F #x964B #x82A6 #x5362 #x9885 #x5E90 #x7089 #x63B3 #x5364 #x864F + #x9C81 #x9E93 #x788C #x9732 #x8DEF #x8D42 #x9E7F #x6F5E #x7984 #x5F55 + #x9646 #x622E #x9A74 #x5415 #x94DD #x4FA3 #x65C5 #x5C65 #x5C61 #x7F15 + #x8651 #x6C2F #x5F8B #x7387 #x6EE4 #x7EFF #x5CE6 #x631B #x5B6A #x6EE6 + #x5375 #x4E71 #x63A0 #x7565 #x62A1 #x8F6E #x4F26 #x4ED1 #x6CA6 #x7EB6 + #x8BBA #x841D #x87BA #x7F57 #x903B #x9523 #x7BA9 #x9AA1 #x88F8 #x843D + #x6D1B #x9A86 #x7EDC #x5988 #x9EBB #x739B #x7801 #x8682 #x9A6C #x9A82 + #x561B #x5417 #x57CB #x4E70 #x9EA6 #x5356 #x8FC8 #x8109 #x7792 #x9992 + #x86EE #x6EE1 #x8513 #x66FC #x6162 #x6F2B #x8C29 #x8292 #x832B #x76F2 + #x6C13 #x5FD9 #x83BD #x732B #x8305 #x951A #x6BDB #x77DB #x94C6 #x536F + #x8302 #x5192 #x5E3D #x8C8C #x8D38 #x4E48 #x73AB #x679A #x6885 #x9176 + #x9709 #x7164 #x6CA1 #x7709 #x5A92 #x9541 #x6BCF #x7F8E #x6627 #x5BD0 + #x59B9 #x5A9A #x95E8 #x95F7 #x4EEC #x840C #x8499 #x6AAC #x76DF #x9530 + #x731B #x68A6 #x5B5F #x772F #x919A #x9761 #x7CDC #x8FF7 #x8C1C #x5F25 + #x7C73 #x79D8 #x89C5 #x6CCC #x871C #x5BC6 #x5E42 #x68C9 #x7720 #x7EF5 + #x5195 #x514D #x52C9 #x5A29 #x7F05 #x9762 #x82D7 #x63CF #x7784 #x85D0 + #x79D2 #x6E3A #x5E99 #x5999 #x8511 #x706D #x6C11 #x62BF #x76BF #x654F + #x60AF #x95FD #x660E #x879F #x9E23 #x94ED #x540D #x547D #x8C2C #x6478 + #x6479 #x8611 #x6A21 #x819C #x78E8 #x6469 #x9B54 #x62B9 #x672B #x83AB + #x58A8 #x9ED8 #x6CAB #x6F20 #x5BDE #x964C #x8C0B #x725F #x67D0 #x62C7 + #x7261 #x4EA9 #x59C6 #x6BCD #x5893 #x66AE #x5E55 #x52DF #x6155 #x6728 + #x76EE #x7766 #x7267 #x7A46 #x62FF #x54EA #x5450 #x94A0 #x90A3 #x5A1C + #x7EB3 #x6C16 #x4E43 #x5976 #x8010 #x5948 #x5357 #x7537 #x96BE #x56CA + #x6320 #x8111 #x607C #x95F9 #x6DD6 #x5462 #x9981 #x5185 #x5AE9 #x80FD + #x59AE #x9713 #x502A #x6CE5 #x5C3C #x62DF #x4F60 #x533F #x817B #x9006 + #x6EBA #x852B #x62C8 #x5E74 #x78BE #x64B5 #x637B #x5FF5 #x5A18 #x917F + #x9E1F #x5C3F #x634F #x8042 #x5B7D #x556E #x954A #x954D #x6D85 #x60A8 + #x67E0 #x72DE #x51DD #x5B81 #x62E7 #x6CDE #x725B #x626D #x94AE #x7EBD + #x8113 #x6D53 #x519C #x5F04 #x5974 #x52AA #x6012 #x5973 #x6696 #x8650 + #x759F #x632A #x61E6 #x7CEF #x8BFA #x54E6 #x6B27 #x9E25 #x6BB4 #x85D5 + #x5455 #x5076 #x6CA4 #x556A #x8DB4 #x722C #x5E15 #x6015 #x7436 #x62CD + #x6392 #x724C #x5F98 #x6E43 #x6D3E #x6500 #x6F58 #x76D8 #x78D0 #x76FC + #x7554 #x5224 #x53DB #x4E53 #x5E9E #x65C1 #x802A #x80D6 #x629B #x5486 + #x5228 #x70AE #x888D #x8DD1 #x6CE1 #x5478 #x80DA #x57F9 #x88F4 #x8D54 + #x966A #x914D #x4F69 #x6C9B #x55B7 #x76C6 #x7830 #x62A8 #x70F9 #x6F8E + #x5F6D #x84EC #x68DA #x787C #x7BF7 #x81A8 #x670B #x9E4F #x6367 #x78B0 + #x576F #x7812 #x9739 #x6279 #x62AB #x5288 #x7435 #x6BD7 #x5564 #x813E + #x75B2 #x76AE #x5339 #x75DE #x50FB #x5C41 #x8B6C #x7BC7 #x504F #x7247 + #x9A97 #x98D8 #x6F02 #x74E2 #x7968 #x6487 #x77A5 #x62FC #x9891 #x8D2B + #x54C1 #x8058 #x4E52 #x576A #x82F9 #x840D #x5E73 #x51ED #x74F6 #x8BC4 + #x5C4F #x5761 #x6CFC #x9887 #x5A46 #x7834 #x9B44 #x8FEB #x7C95 #x5256 + #x6251 #x94FA #x4EC6 #x8386 #x8461 #x83E9 #x84B2 #x57D4 #x6734 #x5703 + #x666E #x6D66 #x8C31 #x66DD #x7011 #x671F #x6B3A #x6816 #x621A #x59BB + #x4E03 #x51C4 #x6F06 #x67D2 #x6C8F #x5176 #x68CB #x5947 #x6B67 #x7566 + #x5D0E #x8110 #x9F50 #x65D7 #x7948 #x7941 #x9A91 #x8D77 #x5C82 #x4E5E + #x4F01 #x542F #x5951 #x780C #x5668 #x6C14 #x8FC4 #x5F03 #x6C7D #x6CE3 + #x8BAB #x6390 #x6070 #x6D3D #x7275 #x6266 #x948E #x94C5 #x5343 #x8FC1 + #x7B7E #x4EDF #x8C26 #x4E7E #x9ED4 #x94B1 #x94B3 #x524D #x6F5C #x9063 + #x6D45 #x8C34 #x5811 #x5D4C #x6B20 #x6B49 #x67AA #x545B #x8154 #x7F8C + #x5899 #x8537 #x5F3A #x62A2 #x6A47 #x9539 #x6572 #x6084 #x6865 #x77A7 + #x4E54 #x4FA8 #x5DE7 #x9798 #x64AC #x7FD8 #x5CED #x4FCF #x7A8D #x5207 + #x8304 #x4E14 #x602F #x7A83 #x94A6 #x4FB5 #x4EB2 #x79E6 #x7434 #x52E4 + #x82B9 #x64D2 #x79BD #x5BDD #x6C81 #x9752 #x8F7B #x6C22 #x503E #x537F + #x6E05 #x64CE #x6674 #x6C30 #x60C5 #x9877 #x8BF7 #x5E86 #x743C #x7A77 + #x79CB #x4E18 #x90B1 #x7403 #x6C42 #x56DA #x914B #x6CC5 #x8D8B #x533A + #x86C6 #x66F2 #x8EAF #x5C48 #x9A71 #x6E20 #x53D6 #x5A36 #x9F8B #x8DA3 + #x53BB #x5708 #x98A7 #x6743 #x919B #x6CC9 #x5168 #x75CA #x62F3 #x72AC + #x5238 #x529D #x7F3A #x7094 #x7638 #x5374 #x9E4A #x69B7 #x786E #x96C0 + #x88D9 #x7FA4 #x7136 #x71C3 #x5189 #x67D3 #x74E4 #x58E4 #x6518 #x56B7 + #x8BA9 #x9976 #x6270 #x7ED5 #x60F9 #x70ED #x58EC #x4EC1 #x4EBA #x5FCD + #x97E7 #x4EFB #x8BA4 #x5203 #x598A #x7EAB #x6254 #x4ECD #x65E5 #x620E + #x8338 #x84C9 #x8363 #x878D #x7194 #x6EB6 #x5BB9 #x7ED2 #x5197 #x63C9 + #x67D4 #x8089 #x8339 #x8815 #x5112 #x5B7A #x5982 #x8FB1 #x4E73 #x6C5D + #x5165 #x8925 #x8F6F #x962E #x854A #x745E #x9510 #x95F0 #x6DA6 #x82E5 + #x5F31 #x6492 #x6D12 #x8428 #x816E #x9CC3 #x585E #x8D5B #x4E09 #x53C1 + #x4F1E #x6563 #x6851 #x55D3 #x4E27 #x6414 #x9A9A #x626B #x5AC2 #x745F + #x8272 #x6DA9 #x68EE #x50E7 #x838E #x7802 #x6740 #x5239 #x6C99 #x7EB1 + #x50BB #x5565 #x715E #x7B5B #x6652 #x73CA #x82EB #x6749 #x5C71 #x5220 + #x717D #x886B #x95EA #x9655 #x64C5 #x8D61 #x81B3 #x5584 #x6C55 #x6247 + #x7F2E #x5892 #x4F24 #x5546 #x8D4F #x664C #x4E0A #x5C1A #x88F3 #x68A2 + #x634E #x7A0D #x70E7 #x828D #x52FA #x97F6 #x5C11 #x54E8 #x90B5 #x7ECD + #x5962 #x8D4A #x86C7 #x820C #x820D #x8D66 #x6444 #x5C04 #x6151 #x6D89 + #x793E #x8BBE #x7837 #x7533 #x547B #x4F38 #x8EAB #x6DF1 #x5A20 #x7EC5 + #x795E #x6C88 #x5BA1 #x5A76 #x751A #x80BE #x614E #x6E17 #x58F0 #x751F + #x7525 #x7272 #x5347 #x7EF3 #x7701 #x76DB #x5269 #x80DC #x5723 #x5E08 + #x5931 #x72EE #x65BD #x6E7F #x8BD7 #x5C38 #x8671 #x5341 #x77F3 #x62FE + #x65F6 #x4EC0 #x98DF #x8680 #x5B9E #x8BC6 #x53F2 #x77E2 #x4F7F #x5C4E + #x9A76 #x59CB #x5F0F #x793A #x58EB #x4E16 #x67FF #x4E8B #x62ED #x8A93 + #x901D #x52BF #x662F #x55DC #x566C #x9002 #x4ED5 #x4F8D #x91CA #x9970 + #x6C0F #x5E02 #x6043 #x5BA4 #x89C6 #x8BD5 #x6536 #x624B #x9996 #x5B88 + #x5BFF #x6388 #x552E #x53D7 #x7626 #x517D #x852C #x67A2 #x68B3 #x6B8A + #x6292 #x8F93 #x53D4 #x8212 #x6DD1 #x758F #x4E66 #x8D4E #x5B70 #x719F + #x85AF #x6691 #x66D9 #x7F72 #x8700 #x9ECD #x9F20 #x5C5E #x672F #x8FF0 + #x6811 #x675F #x620D #x7AD6 #x5885 #x5EB6 #x6570 #x6F31 #x6055 #x5237 + #x800D #x6454 #x8870 #x7529 #x5E05 #x6813 #x62F4 #x971C #x53CC #x723D + #x8C01 #x6C34 #x7761 #x7A0E #x542E #x77AC #x987A #x821C #x8BF4 #x7855 + #x6714 #x70C1 #x65AF #x6495 #x5636 #x601D #x79C1 #x53F8 #x4E1D #x6B7B + #x8086 #x5BFA #x55E3 #x56DB #x4F3A #x4F3C #x9972 #x5DF3 #x677E #x8038 + #x6002 #x9882 #x9001 #x5B8B #x8BBC #x8BF5 #x641C #x8258 #x64DE #x55FD + #x82CF #x9165 #x4FD7 #x7D20 #x901F #x7C9F #x50F3 #x5851 #x6EAF #x5BBF + #x8BC9 #x8083 #x9178 #x849C #x7B97 #x867D #x968B #x968F #x7EE5 #x9AD3 + #x788E #x5C81 #x7A57 #x9042 #x96A7 #x795F #x5B59 #x635F #x7B0B #x84D1 + #x68AD #x5506 #x7F29 #x7410 #x7D22 #x9501 #x6240 #x584C #x4ED6 #x5B83 + #x5979 #x5854 #x736D #x631E #x8E4B #x8E0F #x80CE #x82D4 #x62AC #x53F0 + #x6CF0 #x915E #x592A #x6001 #x6C70 #x574D #x644A #x8D2A #x762B #x6EE9 + #x575B #x6A80 #x75F0 #x6F6D #x8C2D #x8C08 #x5766 #x6BEF #x8892 #x78B3 + #x63A2 #x53F9 #x70AD #x6C64 #x5858 #x642A #x5802 #x68E0 #x819B #x5510 + #x7CD6 #x5018 #x8EBA #x6DCC #x8D9F #x70EB #x638F #x6D9B #x6ED4 #x7EE6 + #x8404 #x6843 #x9003 #x6DD8 #x9676 #x8BA8 #x5957 #x7279 #x85E4 #x817E + #x75BC #x8A8A #x68AF #x5254 #x8E22 #x9511 #x63D0 #x9898 #x8E44 #x557C + #x4F53 #x66FF #x568F #x60D5 #x6D95 #x5243 #x5C49 #x5929 #x6DFB #x586B + #x7530 #x751C #x606C #x8214 #x8146 #x6311 #x6761 #x8FE2 #x773A #x8DF3 + #x8D34 #x94C1 #x5E16 #x5385 #x542C #x70C3 #x6C40 #x5EF7 #x505C #x4EAD + #x5EAD #x633A #x8247 #x901A #x6850 #x916E #x77B3 #x540C #x94DC #x5F64 + #x7AE5 #x6876 #x6345 #x7B52 #x7EDF #x75DB #x5077 #x6295 #x5934 #x900F + #x51F8 #x79C3 #x7A81 #x56FE #x5F92 #x9014 #x6D82 #x5C60 #x571F #x5410 + #x5154 #x6E4D #x56E2 #x63A8 #x9893 #x817F #x8715 #x892A #x9000 #x541E + #x5C6F #x81C0 #x62D6 #x6258 #x8131 #x9E35 #x9640 #x9A6E #x9A7C #x692D + #x59A5 #x62D3 #x553E #x6316 #x54C7 #x86D9 #x6D3C #x5A03 #x74E6 #x889C + #x6B6A #x5916 #x8C4C #x5F2F #x6E7E #x73A9 #x987D #x4E38 #x70F7 #x5B8C + #x7897 #x633D #x665A #x7696 #x60CB #x5B9B #x5A49 #x4E07 #x8155 #x6C6A + #x738B #x4EA1 #x6789 #x7F51 #x5F80 #x65FA #x671B #x5FD8 #x5984 #x5A01 + #x5DCD #x5FAE #x5371 #x97E6 #x8FDD #x6845 #x56F4 #x552F #x60DF #x4E3A + #x6F4D #x7EF4 #x82C7 #x840E #x59D4 #x4F1F #x4F2A #x5C3E #x7EAC #x672A + #x851A #x5473 #x754F #x80C3 #x5582 #x9B4F #x4F4D #x6E2D #x8C13 #x5C09 + #x6170 #x536B #x761F #x6E29 #x868A #x6587 #x95FB #x7EB9 #x543B #x7A33 + #x7D0A #x95EE #x55E1 #x7FC1 #x74EE #x631D #x8717 #x6DA1 #x7A9D #x6211 + #x65A1 #x5367 #x63E1 #x6C83 #x5DEB #x545C #x94A8 #x4E4C #x6C61 #x8BEC + #x5C4B #x65E0 #x829C #x68A7 #x543E #x5434 #x6BCB #x6B66 #x4E94 #x6342 + #x5348 #x821E #x4F0D #x4FAE #x575E #x620A #x96FE #x6664 #x7269 #x52FF + #x52A1 #x609F #x8BEF #x6614 #x7199 #x6790 #x897F #x7852 #x77FD #x6670 + #x563B #x5438 #x9521 #x727A #x7A00 #x606F #x5E0C #x6089 #x819D #x5915 + #x60DC #x7184 #x70EF #x6EAA #x6C50 #x7280 #x6A84 #x88AD #x5E2D #x4E60 + #x5AB3 #x559C #x94E3 #x6D17 #x7CFB #x9699 #x620F #x7EC6 #x778E #x867E + #x5323 #x971E #x8F96 #x6687 #x5CE1 #x4FA0 #x72ED #x4E0B #x53A6 #x590F + #x5413 #x6380 #x9528 #x5148 #x4ED9 #x9C9C #x7EA4 #x54B8 #x8D24 #x8854 + #x8237 #x95F2 #x6D8E #x5F26 #x5ACC #x663E #x9669 #x73B0 #x732E #x53BF + #x817A #x9985 #x7FA1 #x5BAA #x9677 #x9650 #x7EBF #x76F8 #x53A2 #x9576 + #x9999 #x7BB1 #x8944 #x6E58 #x4E61 #x7FD4 #x7965 #x8BE6 #x60F3 #x54CD + #x4EAB #x9879 #x5DF7 #x6A61 #x50CF #x5411 #x8C61 #x8427 #x785D #x9704 + #x524A #x54EE #x56A3 #x9500 #x6D88 #x5BB5 #x6DC6 #x6653 #x5C0F #x5B5D + #x6821 #x8096 #x5578 #x7B11 #x6548 #x6954 #x4E9B #x6B47 #x874E #x978B + #x534F #x631F #x643A #x90AA #x659C #x80C1 #x8C10 #x5199 #x68B0 #x5378 + #x87F9 #x61C8 #x6CC4 #x6CFB #x8C22 #x5C51 #x85AA #x82AF #x950C #x6B23 + #x8F9B #x65B0 #x5FFB #x5FC3 #x4FE1 #x8845 #x661F #x8165 #x7329 #x60FA + #x5174 #x5211 #x578B #x5F62 #x90A2 #x884C #x9192 #x5E78 #x674F #x6027 + #x59D3 #x5144 #x51F6 #x80F8 #x5308 #x6C79 #x96C4 #x718A #x4F11 #x4FEE + #x7F9E #x673D #x55C5 #x9508 #x79C0 #x8896 #x7EE3 #x589F #x620C #x9700 + #x865A #x5618 #x987B #x5F90 #x8BB8 #x84C4 #x9157 #x53D9 #x65ED #x5E8F + #x755C #x6064 #x7D6E #x5A7F #x7EEA #x7EED #x8F69 #x55A7 #x5BA3 #x60AC + #x65CB #x7384 #x9009 #x7663 #x7729 #x7EDA #x9774 #x859B #x5B66 #x7A74 + #x96EA #x8840 #x52CB #x718F #x5FAA #x65EC #x8BE2 #x5BFB #x9A6F #x5DE1 + #x6B89 #x6C5B #x8BAD #x8BAF #x900A #x8FC5 #x538B #x62BC #x9E26 #x9E2D + #x5440 #x4E2B #x82BD #x7259 #x869C #x5D16 #x8859 #x6DAF #x96C5 #x54D1 + #x4E9A #x8BB6 #x7109 #x54BD #x9609 #x70DF #x6DF9 #x76D0 #x4E25 #x7814 + #x8712 #x5CA9 #x5EF6 #x8A00 #x989C #x960E #x708E #x6CBF #x5944 #x63A9 + #x773C #x884D #x6F14 #x8273 #x5830 #x71D5 #x538C #x781A #x96C1 #x5501 + #x5F66 #x7130 #x5BB4 #x8C1A #x9A8C #x6B83 #x592E #x9E2F #x79E7 #x6768 + #x626C #x4F6F #x75A1 #x7F8A #x6D0B #x9633 #x6C27 #x4EF0 #x75D2 #x517B + #x6837 #x6F3E #x9080 #x8170 #x5996 #x7476 #x6447 #x5C27 #x9065 #x7A91 + #x8C23 #x59DA #x54AC #x8200 #x836F #x8981 #x8000 #x6930 #x564E #x8036 + #x7237 #x91CE #x51B6 #x4E5F #x9875 #x6396 #x4E1A #x53F6 #x66F3 #x814B + #x591C #x6DB2 #x4E00 #x58F9 #x533B #x63D6 #x94F1 #x4F9D #x4F0A #x8863 + #x9890 #x5937 #x9057 #x79FB #x4EEA #x80F0 #x7591 #x6C82 #x5B9C #x59E8 + #x5F5D #x6905 #x8681 #x501A #x5DF2 #x4E59 #x77E3 #x4EE5 #x827A #x6291 + #x6613 #x9091 #x5C79 #x4EBF #x5F79 #x81C6 #x9038 #x8084 #x75AB #x4EA6 + #x88D4 #x610F #x6BC5 #x5FC6 #x4E49 #x76CA #x6EA2 #x8BE3 #x8BAE #x8C0A + #x8BD1 #x5F02 #x7FFC #x7FCC #x7ECE #x8335 #x836B #x56E0 #x6BB7 #x97F3 + #x9634 #x59FB #x541F #x94F6 #x6DEB #x5BC5 #x996E #x5C39 #x5F15 #x9690 + #x5370 #x82F1 #x6A31 #x5A74 #x9E70 #x5E94 #x7F28 #x83B9 #x8424 #x8425 + #x8367 #x8747 #x8FCE #x8D62 #x76C8 #x5F71 #x9896 #x786C #x6620 #x54DF + #x62E5 #x4F63 #x81C3 #x75C8 #x5EB8 #x96CD #x8E0A #x86F9 #x548F #x6CF3 + #x6D8C #x6C38 #x607F #x52C7 #x7528 #x5E7D #x4F18 #x60A0 #x5FE7 #x5C24 + #x7531 #x90AE #x94C0 #x72B9 #x6CB9 #x6E38 #x9149 #x6709 #x53CB #x53F3 + #x4F51 #x91C9 #x8BF1 #x53C8 #x5E7C #x8FC2 #x6DE4 #x4E8E #x76C2 #x6986 + #x865E #x611A #x8206 #x4F59 #x4FDE #x903E #x9C7C #x6109 #x6E1D #x6E14 + #x9685 #x4E88 #x5A31 #x96E8 #x4E0E #x5C7F #x79B9 #x5B87 #x8BED #x7FBD + #x7389 #x57DF #x828B #x90C1 #x5401 #x9047 #x55BB #x5CEA #x5FA1 #x6108 + #x6B32 #x72F1 #x80B2 #x8A89 #x6D74 #x5BD3 #x88D5 #x9884 #x8C6B #x9A6D + #x9E33 #x6E0A #x51A4 #x5143 #x57A3 #x8881 #x539F #x63F4 #x8F95 #x56ED + #x5458 #x5706 #x733F #x6E90 #x7F18 #x8FDC #x82D1 #x613F #x6028 #x9662 + #x66F0 #x7EA6 #x8D8A #x8DC3 #x94A5 #x5CB3 #x7CA4 #x6708 #x60A6 #x9605 + #x8018 #x4E91 #x90E7 #x5300 #x9668 #x5141 #x8FD0 #x8574 #x915D #x6655 + #x97F5 #x5B55 #x531D #x7838 #x6742 #x683D #x54C9 #x707E #x5BB0 #x8F7D + #x518D #x5728 #x54B1 #x6512 #x6682 #x8D5E #x8D43 #x810F #x846C #x906D + #x7CDF #x51FF #x85FB #x67A3 #x65E9 #x6FA1 #x86A4 #x8E81 #x566A #x9020 + #x7682 #x7076 #x71E5 #x8D23 #x62E9 #x5219 #x6CFD #x8D3C #x600E #x589E + #x618E #x66FE #x8D60 #x624E #x55B3 #x6E23 #x672D #x8F67 #x94E1 #x95F8 + #x7728 #x6805 #x69A8 #x548B #x4E4D #x70B8 #x8BC8 #x6458 #x658B #x5B85 + #x7A84 #x503A #x5BE8 #x77BB #x6BE1 #x8A79 #x7C98 #x6CBE #x76CF #x65A9 + #x8F97 #x5D2D #x5C55 #x8638 #x6808 #x5360 #x6218 #x7AD9 #x6E5B #x7EFD + #x6A1F #x7AE0 #x5F70 #x6F33 #x5F20 #x638C #x6DA8 #x6756 #x4E08 #x5E10 + #x8D26 #x4ED7 #x80C0 #x7634 #x969C #x62DB #x662D #x627E #x6CBC #x8D75 + #x7167 #x7F69 #x5146 #x8087 #x53EC #x906E #x6298 #x54F2 #x86F0 #x8F99 + #x8005 #x9517 #x8517 #x8FD9 #x6D59 #x73CD #x659F #x771F #x7504 #x7827 + #x81FB #x8D1E #x9488 #x4FA6 #x6795 #x75B9 #x8BCA #x9707 #x632F #x9547 + #x9635 #x84B8 #x6323 #x7741 #x5F81 #x72F0 #x4E89 #x6014 #x6574 #x62EF + #x6B63 #x653F #x5E27 #x75C7 #x90D1 #x8BC1 #x829D #x679D #x652F #x5431 + #x8718 #x77E5 #x80A2 #x8102 #x6C41 #x4E4B #x7EC7 #x804C #x76F4 #x690D + #x6B96 #x6267 #x503C #x4F84 #x5740 #x6307 #x6B62 #x8DBE #x53EA #x65E8 + #x7EB8 #x5FD7 #x631A #x63B7 #x81F3 #x81F4 #x7F6E #x5E1C #x5CD9 #x5236 + #x667A #x79E9 #x7A1A #x8D28 #x7099 #x75D4 #x6EDE #x6CBB #x7A92 #x4E2D + #x76C5 #x5FE0 #x949F #x8877 #x7EC8 #x79CD #x80BF #x91CD #x4EF2 #x4F17 + #x821F #x5468 #x5DDE #x6D32 #x8BCC #x7CA5 #x8F74 #x8098 #x5E1A #x5492 + #x76B1 #x5B99 #x663C #x9AA4 #x73E0 #x682A #x86DB #x6731 #x732A #x8BF8 + #x8BDB #x9010 #x7AF9 #x70DB #x716E #x62C4 #x77A9 #x5631 #x4E3B #x8457 + #x67F1 #x52A9 #x86C0 #x8D2E #x94F8 #x7B51 #x4F4F #x6CE8 #x795D #x9A7B + #x6293 #x722A #x62FD #x4E13 #x7816 #x8F6C #x64B0 #x8D5A #x7BC6 #x6869 + #x5E84 #x88C5 #x5986 #x649E #x58EE #x72B6 #x690E #x9525 #x8FFD #x8D58 + #x5760 #x7F00 #x8C06 #x51C6 #x6349 #x62D9 #x5353 #x684C #x7422 #x8301 + #x914C #x5544 #x7740 #x707C #x6D4A #x5179 #x54A8 #x8D44 #x59FF #x6ECB + #x6DC4 #x5B5C #x7D2B #x4ED4 #x7C7D #x6ED3 #x5B50 #x81EA #x6E0D #x5B57 + #x9B03 #x68D5 #x8E2A #x5B97 #x7EFC #x603B #x7EB5 #x90B9 #x8D70 #x594F + #x63CD #x79DF #x8DB3 #x5352 #x65CF #x7956 #x8BC5 #x963B #x7EC4 #x94BB + #x7E82 #x5634 #x9189 #x6700 #x7F6A #x5C0A #x9075 #x6628 #x5DE6 #x4F50 + #x67DE #x505A #x4F5C #x5750 #x5EA7 #x4E8D #x4E0C #x5140 #x4E10 #x5EFF + #x5345 #x4E15 #x4E98 #x4E1E #x9B32 #x5B6C #x5669 #x4E28 #x79BA #x4E3F + #x5315 #x4E47 #x592D #x723B #x536E #x6C10 #x56DF #x80E4 #x9997 #x6BD3 + #x777E #x9F17 #x4E36 #x4E9F #x9F10 #x4E5C #x4E69 #x4E93 #x8288 #x5B5B + #x556C #x560F #x4EC4 #x538D #x539D #x53A3 #x53A5 #x53AE #x9765 #x8D5D + #x531A #x53F5 #x5326 #x532E #x533E #x8D5C #x5366 #x5363 #x5202 #x5208 + #x520E #x522D #x5233 #x523F #x5240 #x524C #x525E #x5261 #x525C #x84AF + #x527D #x5282 #x5281 #x5290 #x5293 #x5182 #x7F54 #x4EBB #x4EC3 #x4EC9 + #x4EC2 #x4EE8 #x4EE1 #x4EEB #x4EDE #x4F1B #x4EF3 #x4F22 #x4F64 #x4EF5 + #x4F25 #x4F27 #x4F09 #x4F2B #x4F5E #x4F67 #x6538 #x4F5A #x4F5D #x4F5F + #x4F57 #x4F32 #x4F3D #x4F76 #x4F74 #x4F91 #x4F89 #x4F83 #x4F8F #x4F7E + #x4F7B #x4FAA #x4F7C #x4FAC #x4F94 #x4FE6 #x4FE8 #x4FEA #x4FC5 #x4FDA + #x4FE3 #x4FDC #x4FD1 #x4FDF #x4FF8 #x5029 #x504C #x4FF3 #x502C #x500F + #x502E #x502D #x4FFE #x501C #x500C #x5025 #x5028 #x507E #x5043 #x5055 + #x5048 #x504E #x506C #x507B #x50A5 #x50A7 #x50A9 #x50BA #x50D6 #x5106 + #x50ED #x50EC #x50E6 #x50EE #x5107 #x510B #x4EDD #x6C3D #x4F58 #x4F65 + #x4FCE #x9FA0 #x6C46 #x7C74 #x516E #x5DFD #x9EC9 #x9998 #x5181 #x5914 + #x52F9 #x530D #x8A07 #x5310 #x51EB #x5919 #x5155 #x4EA0 #x5156 #x4EB3 + #x886E #x88A4 #x4EB5 #x8114 #x88D2 #x7980 #x5B34 #x8803 #x7FB8 #x51AB + #x51B1 #x51BD #x51BC #x51C7 #x5196 #x51A2 #x51A5 #x8BA0 #x8BA6 #x8BA7 + #x8BAA #x8BB4 #x8BB5 #x8BB7 #x8BC2 #x8BC3 #x8BCB #x8BCF #x8BCE #x8BD2 + #x8BD3 #x8BD4 #x8BD6 #x8BD8 #x8BD9 #x8BDC #x8BDF #x8BE0 #x8BE4 #x8BE8 + #x8BE9 #x8BEE #x8BF0 #x8BF3 #x8BF6 #x8BF9 #x8BFC #x8BFF #x8C00 #x8C02 + #x8C04 #x8C07 #x8C0C #x8C0F #x8C11 #x8C12 #x8C14 #x8C15 #x8C16 #x8C19 + #x8C1B #x8C18 #x8C1D #x8C1F #x8C20 #x8C21 #x8C25 #x8C27 #x8C2A #x8C2B + #x8C2E #x8C2F #x8C32 #x8C33 #x8C35 #x8C36 #x5369 #x537A #x961D #x9622 + #x9621 #x9631 #x962A #x963D #x963C #x9642 #x9649 #x9654 #x965F #x9667 + #x966C #x9672 #x9674 #x9688 #x968D #x9697 #x96B0 #x9097 #x909B #x909D + #x9099 #x90AC #x90A1 #x90B4 #x90B3 #x90B6 #x90BA #x90B8 #x90B0 #x90CF + #x90C5 #x90BE #x90D0 #x90C4 #x90C7 #x90D3 #x90E6 #x90E2 #x90DC #x90D7 + #x90DB #x90EB #x90EF #x90FE #x9104 #x9122 #x911E #x9123 #x9131 #x912F + #x9139 #x9143 #x9146 #x520D #x5942 #x52A2 #x52AC #x52AD #x52BE #x54FF + #x52D0 #x52D6 #x52F0 #x53DF #x71EE #x77CD #x5EF4 #x51F5 #x51FC #x9B2F + #x53B6 #x5F01 #x755A #x5DEF #x574C #x57A9 #x57A1 #x587E #x58BC #x58C5 + #x58D1 #x5729 #x572C #x572A #x5733 #x5739 #x572E #x572F #x575C #x573B + #x5742 #x5769 #x5785 #x576B #x5786 #x577C #x577B #x5768 #x576D #x5776 + #x5773 #x57AD #x57A4 #x578C #x57B2 #x57CF #x57A7 #x57B4 #x5793 #x57A0 + #x57D5 #x57D8 #x57DA #x57D9 #x57D2 #x57B8 #x57F4 #x57EF #x57F8 #x57E4 + #x57DD #x580B #x580D #x57FD #x57ED #x5800 #x581E #x5819 #x5844 #x5820 + #x5865 #x586C #x5881 #x5889 #x589A #x5880 #x99A8 #x9F19 #x61FF #x8279 + #x827D #x827F #x828F #x828A #x82A8 #x8284 #x828E #x8291 #x8297 #x8299 + #x82AB #x82B8 #x82BE #x82B0 #x82C8 #x82CA #x82E3 #x8298 #x82B7 #x82AE + #x82CB #x82CC #x82C1 #x82A9 #x82B4 #x82A1 #x82AA #x829F #x82C4 #x82CE + #x82A4 #x82E1 #x8309 #x82F7 #x82E4 #x830F #x8307 #x82DC #x82F4 #x82D2 + #x82D8 #x830C #x82FB #x82D3 #x8311 #x831A #x8306 #x8314 #x8315 #x82E0 + #x82D5 #x831C #x8351 #x835B #x835C #x8308 #x8392 #x833C #x8334 #x8331 + #x839B #x835E #x832F #x834F #x8347 #x8343 #x835F #x8340 #x8317 #x8360 + #x832D #x833A #x8333 #x8366 #x8365 #x8368 #x831B #x8369 #x836C #x836A + #x836D #x836E #x83B0 #x8378 #x83B3 #x83B4 #x83A0 #x83AA #x8393 #x839C + #x8385 #x837C #x83B6 #x83A9 #x837D #x83B8 #x837B #x8398 #x839E #x83A8 + #x83BA #x83BC #x83C1 #x8401 #x83E5 #x83D8 #x5807 #x8418 #x840B #x83DD + #x83FD #x83D6 #x841C #x8438 #x8411 #x8406 #x83D4 #x83DF #x840F #x8403 + #x83F8 #x83F9 #x83EA #x83C5 #x83C0 #x8426 #x83F0 #x83E1 #x845C #x8451 + #x845A #x8459 #x8473 #x8487 #x8488 #x847A #x8489 #x8478 #x843C #x8446 + #x8469 #x8476 #x848C #x848E #x8431 #x846D #x84C1 #x84CD #x84D0 #x84E6 + #x84BD #x84D3 #x84CA #x84BF #x84BA #x84E0 #x84A1 #x84B9 #x84B4 #x8497 + #x84E5 #x84E3 #x850C #x750D #x8538 #x84F0 #x8539 #x851F #x853A #x8556 + #x853B #x84FF #x84FC #x8559 #x8548 #x8568 #x8564 #x855E #x857A #x77A2 + #x8543 #x8572 #x857B #x85A4 #x85A8 #x8587 #x858F #x8579 #x85AE #x859C + #x8585 #x85B9 #x85B7 #x85B0 #x85D3 #x85C1 #x85DC #x85FF #x8627 #x8605 + #x8629 #x8616 #x863C #x5EFE #x5F08 #x593C #x5941 #x8037 #x5955 #x595A + #x5958 #x530F #x5C22 #x5C25 #x5C2C #x5C34 #x624C #x626A #x629F #x62BB + #x62CA #x62DA #x62D7 #x62EE #x6322 #x62F6 #x6339 #x634B #x6343 #x63AD + #x63F6 #x6371 #x637A #x638E #x63B4 #x636D #x63AC #x638A #x6369 #x63AE + #x63BC #x63F2 #x63F8 #x63E0 #x63FF #x63C4 #x63DE #x63CE #x6452 #x63C6 + #x63BE #x6445 #x6441 #x640B #x641B #x6420 #x640C #x6426 #x6421 #x645E + #x6484 #x646D #x6496 #x647A #x64B7 #x64B8 #x6499 #x64BA #x64C0 #x64D0 + #x64D7 #x64E4 #x64E2 #x6509 #x6525 #x652E #x5F0B #x5FD2 #x7519 #x5F11 + #x535F #x53F1 #x53FD #x53E9 #x53E8 #x53FB #x5412 #x5416 #x5406 #x544B + #x5452 #x5453 #x5454 #x5456 #x5443 #x5421 #x5457 #x5459 #x5423 #x5432 + #x5482 #x5494 #x5477 #x5471 #x5464 #x549A #x549B #x5484 #x5476 #x5466 + #x549D #x54D0 #x54AD #x54C2 #x54B4 #x54D2 #x54A7 #x54A6 #x54D3 #x54D4 + #x5472 #x54A3 #x54D5 #x54BB #x54BF #x54CC #x54D9 #x54DA #x54DC #x54A9 + #x54AA #x54A4 #x54DD #x54CF #x54DE #x551B #x54E7 #x5520 #x54FD #x5514 + #x54F3 #x5522 #x5523 #x550F #x5511 #x5527 #x552A #x5567 #x558F #x55B5 + #x5549 #x556D #x5541 #x5555 #x553F #x5550 #x553C #x5537 #x5556 #x5575 + #x5576 #x5577 #x5533 #x5530 #x555C #x558B #x55D2 #x5583 #x55B1 #x55B9 + #x5588 #x5581 #x559F #x557E #x55D6 #x5591 #x557B #x55DF #x55BD #x55BE + #x5594 #x5599 #x55EA #x55F7 #x55C9 #x561F #x55D1 #x55EB #x55EC #x55D4 + #x55E6 #x55DD #x55C4 #x55EF #x55E5 #x55F2 #x55F3 #x55CC #x55CD #x55E8 + #x55F5 #x55E4 #x8F94 #x561E #x5608 #x560C #x5601 #x5624 #x5623 #x55FE + #x5600 #x5627 #x562D #x5658 #x5639 #x5657 #x562C #x564D #x5662 #x5659 + #x565C #x564C #x5654 #x5686 #x5664 #x5671 #x566B #x567B #x567C #x5685 + #x5693 #x56AF #x56D4 #x56D7 #x56DD #x56E1 #x56F5 #x56EB #x56F9 #x56FF + #x5704 #x570A #x5709 #x571C #x5E0F #x5E19 #x5E14 #x5E11 #x5E31 #x5E3B + #x5E3C #x5E37 #x5E44 #x5E54 #x5E5B #x5E5E #x5E61 #x5C8C #x5C7A #x5C8D + #x5C90 #x5C96 #x5C88 #x5C98 #x5C99 #x5C91 #x5C9A #x5C9C #x5CB5 #x5CA2 + #x5CBD #x5CAC #x5CAB #x5CB1 #x5CA3 #x5CC1 #x5CB7 #x5CC4 #x5CD2 #x5CE4 + #x5CCB #x5CE5 #x5D02 #x5D03 #x5D27 #x5D26 #x5D2E #x5D24 #x5D1E #x5D06 + #x5D1B #x5D58 #x5D3E #x5D34 #x5D3D #x5D6C #x5D5B #x5D6F #x5D5D #x5D6B + #x5D4B #x5D4A #x5D69 #x5D74 #x5D82 #x5D99 #x5D9D #x8C73 #x5DB7 #x5DC5 + #x5F73 #x5F77 #x5F82 #x5F87 #x5F89 #x5F8C #x5F95 #x5F99 #x5F9C #x5FA8 + #x5FAD #x5FB5 #x5FBC #x8862 #x5F61 #x72AD #x72B0 #x72B4 #x72B7 #x72B8 + #x72C3 #x72C1 #x72CE #x72CD #x72D2 #x72E8 #x72EF #x72E9 #x72F2 #x72F4 + #x72F7 #x7301 #x72F3 #x7303 #x72FA #x72FB #x7317 #x7313 #x7321 #x730A + #x731E #x731D #x7315 #x7322 #x7339 #x7325 #x732C #x7338 #x7331 #x7350 + #x734D #x7357 #x7360 #x736C #x736F #x737E #x821B #x5925 #x98E7 #x5924 + #x5902 #x9963 #x9967 #x9968 #x9969 #x996A #x996B #x996C #x9974 #x9977 + #x997D #x9980 #x9984 #x9987 #x998A #x998D #x9990 #x9991 #x9993 #x9994 + #x9995 #x5E80 #x5E91 #x5E8B #x5E96 #x5EA5 #x5EA0 #x5EB9 #x5EB5 #x5EBE + #x5EB3 #x8D53 #x5ED2 #x5ED1 #x5EDB #x5EE8 #x5EEA #x81BA #x5FC4 #x5FC9 + #x5FD6 #x5FCF #x6003 #x5FEE #x6004 #x5FE1 #x5FE4 #x5FFE #x6005 #x6006 + #x5FEA #x5FED #x5FF8 #x6019 #x6035 #x6026 #x601B #x600F #x600D #x6029 + #x602B #x600A #x603F #x6021 #x6078 #x6079 #x607B #x607A #x6042 #x606A + #x607D #x6096 #x609A #x60AD #x609D #x6083 #x6092 #x608C #x609B #x60EC + #x60BB #x60B1 #x60DD #x60D8 #x60C6 #x60DA #x60B4 #x6120 #x6126 #x6115 + #x6123 #x60F4 #x6100 #x610E #x612B #x614A #x6175 #x61AC #x6194 #x61A7 + #x61B7 #x61D4 #x61F5 #x5FDD #x96B3 #x95E9 #x95EB #x95F1 #x95F3 #x95F5 + #x95F6 #x95FC #x95FE #x9603 #x9604 #x9606 #x9608 #x960A #x960B #x960C + #x960D #x960F #x9612 #x9615 #x9616 #x9617 #x9619 #x961A #x4E2C #x723F + #x6215 #x6C35 #x6C54 #x6C5C #x6C4A #x6CA3 #x6C85 #x6C90 #x6C94 #x6C8C + #x6C68 #x6C69 #x6C74 #x6C76 #x6C86 #x6CA9 #x6CD0 #x6CD4 #x6CAD #x6CF7 + #x6CF8 #x6CF1 #x6CD7 #x6CB2 #x6CE0 #x6CD6 #x6CFA #x6CEB #x6CEE #x6CB1 + #x6CD3 #x6CEF #x6CFE #x6D39 #x6D27 #x6D0C #x6D43 #x6D48 #x6D07 #x6D04 + #x6D19 #x6D0E #x6D2B #x6D4D #x6D2E #x6D35 #x6D1A #x6D4F #x6D52 #x6D54 + #x6D33 #x6D91 #x6D6F #x6D9E #x6DA0 #x6D5E #x6D93 #x6D94 #x6D5C #x6D60 + #x6D7C #x6D63 #x6E1A #x6DC7 #x6DC5 #x6DDE #x6E0E #x6DBF #x6DE0 #x6E11 + #x6DE6 #x6DDD #x6DD9 #x6E16 #x6DAB #x6E0C #x6DAE #x6E2B #x6E6E #x6E4E + #x6E6B #x6EB2 #x6E5F #x6E86 #x6E53 #x6E54 #x6E32 #x6E25 #x6E44 #x6EDF + #x6EB1 #x6E98 #x6EE0 #x6F2D #x6EE2 #x6EA5 #x6EA7 #x6EBD #x6EBB #x6EB7 + #x6ED7 #x6EB4 #x6ECF #x6E8F #x6EC2 #x6E9F #x6F62 #x6F46 #x6F47 #x6F24 + #x6F15 #x6EF9 #x6F2F #x6F36 #x6F4B #x6F74 #x6F2A #x6F09 #x6F29 #x6F89 + #x6F8D #x6F8C #x6F78 #x6F72 #x6F7C #x6F7A #x6FD1 #x6FC9 #x6FA7 #x6FB9 + #x6FB6 #x6FC2 #x6FE1 #x6FEE #x6FDE #x6FE0 #x6FEF #x701A #x7023 #x701B + #x7039 #x7035 #x704F #x705E #x5B80 #x5B84 #x5B95 #x5B93 #x5BA5 #x5BB8 + #x752F #x9A9E #x6434 #x5BE4 #x5BEE #x8930 #x5BF0 #x8E47 #x8B07 #x8FB6 + #x8FD3 #x8FD5 #x8FE5 #x8FEE #x8FE4 #x8FE9 #x8FE6 #x8FF3 #x8FE8 #x9005 + #x9004 #x900B #x9026 #x9011 #x900D #x9016 #x9021 #x9035 #x9036 #x902D + #x902F #x9044 #x9051 #x9052 #x9050 #x9068 #x9058 #x9062 #x905B #x66B9 + #x9074 #x907D #x9082 #x9088 #x9083 #x908B #x5F50 #x5F57 #x5F56 #x5F58 + #x5C3B #x54AB #x5C50 #x5C59 #x5B71 #x5C63 #x5C66 #x7FBC #x5F2A #x5F29 + #x5F2D #x8274 #x5F3C #x9B3B #x5C6E #x5981 #x5983 #x598D #x59A9 #x59AA + #x59A3 #x5997 #x59CA #x59AB #x599E #x59A4 #x59D2 #x59B2 #x59AF #x59D7 + #x59BE #x5A05 #x5A06 #x59DD #x5A08 #x59E3 #x59D8 #x59F9 #x5A0C #x5A09 + #x5A32 #x5A34 #x5A11 #x5A23 #x5A13 #x5A40 #x5A67 #x5A4A #x5A55 #x5A3C + #x5A62 #x5A75 #x80EC #x5AAA #x5A9B #x5A77 #x5A7A #x5ABE #x5AEB #x5AB2 + #x5AD2 #x5AD4 #x5AB8 #x5AE0 #x5AE3 #x5AF1 #x5AD6 #x5AE6 #x5AD8 #x5ADC + #x5B09 #x5B17 #x5B16 #x5B32 #x5B37 #x5B40 #x5C15 #x5C1C #x5B5A #x5B65 + #x5B73 #x5B51 #x5B53 #x5B62 #x9A75 #x9A77 #x9A78 #x9A7A #x9A7F #x9A7D + #x9A80 #x9A81 #x9A85 #x9A88 #x9A8A #x9A90 #x9A92 #x9A93 #x9A96 #x9A98 + #x9A9B #x9A9C #x9A9D #x9A9F #x9AA0 #x9AA2 #x9AA3 #x9AA5 #x9AA7 #x7E9F + #x7EA1 #x7EA3 #x7EA5 #x7EA8 #x7EA9 #x7EAD #x7EB0 #x7EBE #x7EC0 #x7EC1 + #x7EC2 #x7EC9 #x7ECB #x7ECC #x7ED0 #x7ED4 #x7ED7 #x7EDB #x7EE0 #x7EE1 + #x7EE8 #x7EEB #x7EEE #x7EEF #x7EF1 #x7EF2 #x7F0D #x7EF6 #x7EFA #x7EFB + #x7EFE #x7F01 #x7F02 #x7F03 #x7F07 #x7F08 #x7F0B #x7F0C #x7F0F #x7F11 + #x7F12 #x7F17 #x7F19 #x7F1C #x7F1B #x7F1F #x7F21 #x7F22 #x7F23 #x7F24 + #x7F25 #x7F26 #x7F27 #x7F2A #x7F2B #x7F2C #x7F2D #x7F2F #x7F30 #x7F31 + #x7F32 #x7F33 #x7F35 #x5E7A #x757F #x5DDB #x753E #x9095 #x738E #x7391 + #x73AE #x73A2 #x739F #x73CF #x73C2 #x73D1 #x73B7 #x73B3 #x73C0 #x73C9 + #x73C8 #x73E5 #x73D9 #x987C #x740A #x73E9 #x73E7 #x73DE #x73BA #x73F2 + #x740F #x742A #x745B #x7426 #x7425 #x7428 #x7430 #x742E #x742C #x741B + #x741A #x7441 #x745C #x7457 #x7455 #x7459 #x7477 #x746D #x747E #x749C + #x748E #x7480 #x7481 #x7487 #x748B #x749E #x74A8 #x74A9 #x7490 #x74A7 + #x74D2 #x74BA #x97EA #x97EB #x97EC #x674C #x6753 #x675E #x6748 #x6769 + #x67A5 #x6787 #x676A #x6773 #x6798 #x67A7 #x6775 #x67A8 #x679E #x67AD + #x678B #x6777 #x677C #x67F0 #x6809 #x67D8 #x680A #x67E9 #x67B0 #x680C + #x67D9 #x67B5 #x67DA #x67B3 #x67DD #x6800 #x67C3 #x67B8 #x67E2 #x680E + #x67C1 #x67FD #x6832 #x6833 #x6860 #x6861 #x684E #x6862 #x6844 #x6864 + #x6883 #x681D #x6855 #x6866 #x6841 #x6867 #x6840 #x683E #x684A #x6849 + #x6829 #x68B5 #x688F #x6874 #x6877 #x6893 #x686B #x68C2 #x696E #x68FC + #x691F #x6920 #x68F9 #x6924 #x68F0 #x690B #x6901 #x6957 #x68E3 #x6910 + #x6971 #x6939 #x6960 #x6942 #x695D #x6984 #x696B #x6980 #x6998 #x6978 + #x6934 #x69CC #x6987 #x6988 #x69CE #x6989 #x6966 #x6963 #x6979 #x699B + #x69A7 #x69BB #x69AB #x69AD #x69D4 #x69B1 #x69C1 #x69CA #x69DF #x6995 + #x69E0 #x698D #x69FF #x6A2F #x69ED #x6A17 #x6A18 #x6A65 #x69F2 #x6A44 + #x6A3E #x6AA0 #x6A50 #x6A5B #x6A35 #x6A8E #x6A79 #x6A3D #x6A28 #x6A58 + #x6A7C #x6A91 #x6A90 #x6AA9 #x6A97 #x6AAB #x7337 #x7352 #x6B81 #x6B82 + #x6B87 #x6B84 #x6B92 #x6B93 #x6B8D #x6B9A #x6B9B #x6BA1 #x6BAA #x8F6B + #x8F6D #x8F71 #x8F72 #x8F73 #x8F75 #x8F76 #x8F78 #x8F77 #x8F79 #x8F7A + #x8F7C #x8F7E #x8F81 #x8F82 #x8F84 #x8F87 #x8F8B #x8F8D #x8F8E #x8F8F + #x8F98 #x8F9A #x8ECE #x620B #x6217 #x621B #x621F #x6222 #x6221 #x6225 + #x6224 #x622C #x81E7 #x74EF #x74F4 #x74FF #x750F #x7511 #x7513 #x6534 + #x65EE #x65EF #x65F0 #x660A #x6619 #x6772 #x6603 #x6615 #x6600 #x7085 + #x66F7 #x661D #x6634 #x6631 #x6636 #x6635 #x8006 #x665F #x6654 #x6641 + #x664F #x6656 #x6661 #x6657 #x6677 #x6684 #x668C #x66A7 #x669D #x66BE + #x66DB #x66DC #x66E6 #x66E9 #x8D32 #x8D33 #x8D36 #x8D3B #x8D3D #x8D40 + #x8D45 #x8D46 #x8D48 #x8D49 #x8D47 #x8D4D #x8D55 #x8D59 #x89C7 #x89CA + #x89CB #x89CC #x89CE #x89CF #x89D0 #x89D1 #x726E #x729F #x725D #x7266 + #x726F #x727E #x727F #x7284 #x728B #x728D #x728F #x7292 #x6308 #x6332 + #x63B0 #x643F #x64D8 #x8004 #x6BEA #x6BF3 #x6BFD #x6BF5 #x6BF9 #x6C05 + #x6C07 #x6C06 #x6C0D #x6C15 #x6C18 #x6C19 #x6C1A #x6C21 #x6C29 #x6C24 + #x6C2A #x6C32 #x6535 #x6555 #x656B #x724D #x7252 #x7256 #x7230 #x8662 + #x5216 #x809F #x809C #x8093 #x80BC #x670A #x80BD #x80B1 #x80AB #x80AD + #x80B4 #x80B7 #x80E7 #x80E8 #x80E9 #x80EA #x80DB #x80C2 #x80C4 #x80D9 + #x80CD #x80D7 #x6710 #x80DD #x80EB #x80F1 #x80F4 #x80ED #x810D #x810E + #x80F2 #x80FC #x6715 #x8112 #x8C5A #x8136 #x811E #x812C #x8118 #x8132 + #x8148 #x814C #x8153 #x8174 #x8159 #x815A #x8171 #x8160 #x8169 #x817C + #x817D #x816D #x8167 #x584D #x5AB5 #x8188 #x8182 #x8191 #x6ED5 #x81A3 + #x81AA #x81CC #x6726 #x81CA #x81BB #x81C1 #x81A6 #x6B24 #x6B37 #x6B39 + #x6B43 #x6B46 #x6B59 #x98D1 #x98D2 #x98D3 #x98D5 #x98D9 #x98DA #x6BB3 + #x5F40 #x6BC2 #x89F3 #x6590 #x9F51 #x6593 #x65BC #x65C6 #x65C4 #x65C3 + #x65CC #x65CE #x65D2 #x65D6 #x7080 #x709C #x7096 #x709D #x70BB #x70C0 + #x70B7 #x70AB #x70B1 #x70E8 #x70CA #x7110 #x7113 #x7116 #x712F #x7131 + #x7173 #x715C #x7168 #x7145 #x7172 #x714A #x7178 #x717A #x7198 #x71B3 + #x71B5 #x71A8 #x71A0 #x71E0 #x71D4 #x71E7 #x71F9 #x721D #x7228 #x706C + #x7118 #x7166 #x71B9 #x623E #x623D #x6243 #x6248 #x6249 #x793B #x7940 + #x7946 #x7949 #x795B #x795C #x7953 #x795A #x7962 #x7957 #x7960 #x796F + #x7967 #x797A #x7985 #x798A #x799A #x79A7 #x79B3 #x5FD1 #x5FD0 #x603C + #x605D #x605A #x6067 #x6041 #x6059 #x6063 #x60AB #x6106 #x610D #x615D + #x61A9 #x619D #x61CB #x61D1 #x6206 #x8080 #x807F #x6C93 #x6CF6 #x6DFC + #x77F6 #x77F8 #x7800 #x7809 #x7817 #x7818 #x7811 #x65AB #x782D #x781C + #x781D #x7839 #x783A #x783B #x781F #x783C #x7825 #x782C #x7823 #x7829 + #x784E #x786D #x7856 #x7857 #x7826 #x7850 #x7847 #x784C #x786A #x789B + #x7893 #x789A #x7887 #x789C #x78A1 #x78A3 #x78B2 #x78B9 #x78A5 #x78D4 + #x78D9 #x78C9 #x78EC #x78F2 #x7905 #x78F4 #x7913 #x7924 #x791E #x7934 + #x9F9B #x9EF9 #x9EFB #x9EFC #x76F1 #x7704 #x770D #x76F9 #x7707 #x7708 + #x771A #x7722 #x7719 #x772D #x7726 #x7735 #x7738 #x7750 #x7751 #x7747 + #x7743 #x775A #x7768 #x7762 #x7765 #x777F #x778D #x777D #x7780 #x778C + #x7791 #x779F #x77A0 #x77B0 #x77B5 #x77BD #x753A #x7540 #x754E #x754B + #x7548 #x755B #x7572 #x7579 #x7583 #x7F58 #x7F61 #x7F5F #x8A48 #x7F68 + #x7F74 #x7F71 #x7F79 #x7F81 #x7F7E #x76CD #x76E5 #x8832 #x9485 #x9486 + #x9487 #x948B #x948A #x948C #x948D #x948F #x9490 #x9494 #x9497 #x9495 + #x949A #x949B #x949C #x94A3 #x94A4 #x94AB #x94AA #x94AD #x94AC #x94AF + #x94B0 #x94B2 #x94B4 #x94B6 #x94B7 #x94B8 #x94B9 #x94BA #x94BC #x94BD + #x94BF #x94C4 #x94C8 #x94C9 #x94CA #x94CB #x94CC #x94CD #x94CE #x94D0 + #x94D1 #x94D2 #x94D5 #x94D6 #x94D7 #x94D9 #x94D8 #x94DB #x94DE #x94DF + #x94E0 #x94E2 #x94E4 #x94E5 #x94E7 #x94E8 #x94EA #x94E9 #x94EB #x94EE + #x94EF #x94F3 #x94F4 #x94F5 #x94F7 #x94F9 #x94FC #x94FD #x94FF #x9503 + #x9502 #x9506 #x9507 #x9509 #x950A #x950D #x950E #x950F #x9512 #x9513 + #x9514 #x9515 #x9516 #x9518 #x951B #x951D #x951E #x951F #x9522 #x952A + #x952B #x9529 #x952C #x9531 #x9532 #x9534 #x9536 #x9537 #x9538 #x953C + #x953E #x953F #x9542 #x9535 #x9544 #x9545 #x9546 #x9549 #x954C #x954E + #x954F #x9552 #x9553 #x9554 #x9556 #x9557 #x9558 #x9559 #x955B #x955E + #x955F #x955D #x9561 #x9562 #x9564 #x9565 #x9566 #x9567 #x9568 #x9569 + #x956A #x956B #x956C #x956F #x9571 #x9572 #x9573 #x953A #x77E7 #x77EC + #x96C9 #x79D5 #x79ED #x79E3 #x79EB #x7A06 #x5D47 #x7A03 #x7A02 #x7A1E + #x7A14 #x7A39 #x7A37 #x7A51 #x9ECF #x99A5 #x7A70 #x7688 #x768E #x7693 + #x7699 #x76A4 #x74DE #x74E0 #x752C #x9E20 #x9E22 #x9E28 #x9E29 #x9E2A + #x9E2B #x9E2C #x9E32 #x9E31 #x9E36 #x9E38 #x9E37 #x9E39 #x9E3A #x9E3E + #x9E41 #x9E42 #x9E44 #x9E46 #x9E47 #x9E48 #x9E49 #x9E4B #x9E4C #x9E4E + #x9E51 #x9E55 #x9E57 #x9E5A #x9E5B #x9E5C #x9E5E #x9E63 #x9E66 #x9E67 + #x9E68 #x9E69 #x9E6A #x9E6B #x9E6C #x9E71 #x9E6D #x9E73 #x7592 #x7594 + #x7596 #x75A0 #x759D #x75AC #x75A3 #x75B3 #x75B4 #x75B8 #x75C4 #x75B1 + #x75B0 #x75C3 #x75C2 #x75D6 #x75CD #x75E3 #x75E8 #x75E6 #x75E4 #x75EB + #x75E7 #x7603 #x75F1 #x75FC #x75FF #x7610 #x7600 #x7605 #x760C #x7617 + #x760A #x7625 #x7618 #x7615 #x7619 #x761B #x763C #x7622 #x7620 #x7640 + #x762D #x7630 #x763F #x7635 #x7643 #x763E #x7633 #x764D #x765E #x7654 + #x765C #x7656 #x766B #x766F #x7FCA #x7AE6 #x7A78 #x7A79 #x7A80 #x7A86 + #x7A88 #x7A95 #x7AA6 #x7AA0 #x7AAC #x7AA8 #x7AAD #x7AB3 #x8864 #x8869 + #x8872 #x887D #x887F #x8882 #x88A2 #x88C6 #x88B7 #x88BC #x88C9 #x88E2 + #x88CE #x88E3 #x88E5 #x88F1 #x891A #x88FC #x88E8 #x88FE #x88F0 #x8921 + #x8919 #x8913 #x891B #x890A #x8934 #x892B #x8936 #x8941 #x8966 #x897B + #x758B #x80E5 #x76B2 #x76B4 #x77DC #x8012 #x8014 #x8016 #x801C #x8020 + #x8022 #x8025 #x8026 #x8027 #x8029 #x8028 #x8031 #x800B #x8035 #x8043 + #x8046 #x804D #x8052 #x8069 #x8071 #x8983 #x9878 #x9880 #x9883 #x9889 + #x988C #x988D #x988F #x9894 #x989A #x989B #x989E #x989F #x98A1 #x98A2 + #x98A5 #x98A6 #x864D #x8654 #x866C #x866E #x867F #x867A #x867C #x867B + #x86A8 #x868D #x868B #x86AC #x869D #x86A7 #x86A3 #x86AA #x8693 #x86A9 + #x86B6 #x86C4 #x86B5 #x86CE #x86B0 #x86BA #x86B1 #x86AF #x86C9 #x86CF + #x86B4 #x86E9 #x86F1 #x86F2 #x86ED #x86F3 #x86D0 #x8713 #x86DE #x86F4 + #x86DF #x86D8 #x86D1 #x8703 #x8707 #x86F8 #x8708 #x870A #x870D #x8709 + #x8723 #x873B #x871E #x8725 #x872E #x871A #x873E #x8748 #x8734 #x8731 + #x8729 #x8737 #x873F #x8782 #x8722 #x877D #x877E #x877B #x8760 #x8770 + #x874C #x876E #x878B #x8753 #x8763 #x877C #x8764 #x8759 #x8765 #x8793 + #x87AF #x87A8 #x87D2 #x87C6 #x8788 #x8785 #x87AD #x8797 #x8783 #x87AB + #x87E5 #x87AC #x87B5 #x87B3 #x87CB #x87D3 #x87BD #x87D1 #x87C0 #x87CA + #x87DB #x87EA #x87E0 #x87EE #x8816 #x8813 #x87FE #x880A #x881B #x8821 + #x8839 #x883C #x7F36 #x7F42 #x7F44 #x7F45 #x8210 #x7AFA #x7AFD #x7B08 + #x7B03 #x7B04 #x7B15 #x7B0A #x7B2B #x7B0F #x7B47 #x7B38 #x7B2A #x7B19 + #x7B2E #x7B31 #x7B20 #x7B25 #x7B24 #x7B33 #x7B3E #x7B1E #x7B58 #x7B5A + #x7B45 #x7B75 #x7B4C #x7B5D #x7B60 #x7B6E #x7B7B #x7B62 #x7B72 #x7B71 + #x7B90 #x7BA6 #x7BA7 #x7BB8 #x7BAC #x7B9D #x7BA8 #x7B85 #x7BAA #x7B9C + #x7BA2 #x7BAB #x7BB4 #x7BD1 #x7BC1 #x7BCC #x7BDD #x7BDA #x7BE5 #x7BE6 + #x7BEA #x7C0C #x7BFE #x7BFC #x7C0F #x7C16 #x7C0B #x7C1F #x7C2A #x7C26 + #x7C38 #x7C41 #x7C40 #x81FE #x8201 #x8202 #x8204 #x81EC #x8844 #x8221 + #x8222 #x8223 #x822D #x822F #x8228 #x822B #x8238 #x823B #x8233 #x8234 + #x823E #x8244 #x8249 #x824B #x824F #x825A #x825F #x8268 #x887E #x8885 + #x8888 #x88D8 #x88DF #x895E #x7F9D #x7F9F #x7FA7 #x7FAF #x7FB0 #x7FB2 + #x7C7C #x6549 #x7C91 #x7C9D #x7C9C #x7C9E #x7CA2 #x7CB2 #x7CBC #x7CBD + #x7CC1 #x7CC7 #x7CCC #x7CCD #x7CC8 #x7CC5 #x7CD7 #x7CE8 #x826E #x66A8 + #x7FBF #x7FCE #x7FD5 #x7FE5 #x7FE1 #x7FE6 #x7FE9 #x7FEE #x7FF3 #x7CF8 + #x7D77 #x7DA6 #x7DAE #x7E47 #x7E9B #x9EB8 #x9EB4 #x8D73 #x8D84 #x8D94 + #x8D91 #x8DB1 #x8D67 #x8D6D #x8C47 #x8C49 #x914A #x9150 #x914E #x914F + #x9164 #x9162 #x9161 #x9170 #x9169 #x916F #x917D #x917E #x9172 #x9174 + #x9179 #x918C #x9185 #x9190 #x918D #x9191 #x91A2 #x91A3 #x91AA #x91AD + #x91AE #x91AF #x91B5 #x91B4 #x91BA #x8C55 #x9E7E #x8DB8 #x8DEB #x8E05 + #x8E59 #x8E69 #x8DB5 #x8DBF #x8DBC #x8DBA #x8DC4 #x8DD6 #x8DD7 #x8DDA + #x8DDE #x8DCE #x8DCF #x8DDB #x8DC6 #x8DEC #x8DF7 #x8DF8 #x8DE3 #x8DF9 + #x8DFB #x8DE4 #x8E09 #x8DFD #x8E14 #x8E1D #x8E1F #x8E2C #x8E2E #x8E23 + #x8E2F #x8E3A #x8E40 #x8E39 #x8E35 #x8E3D #x8E31 #x8E49 #x8E41 #x8E42 + #x8E51 #x8E52 #x8E4A #x8E70 #x8E76 #x8E7C #x8E6F #x8E74 #x8E85 #x8E8F + #x8E94 #x8E90 #x8E9C #x8E9E #x8C78 #x8C82 #x8C8A #x8C85 #x8C98 #x8C94 + #x659B #x89D6 #x89DE #x89DA #x89DC #x89E5 #x89EB #x89EF #x8A3E #x8B26 + #x9753 #x96E9 #x96F3 #x96EF #x9706 #x9701 #x9708 #x970F #x970E #x972A + #x972D #x9730 #x973E #x9F80 #x9F83 #x9F85 #x9F86 #x9F87 #x9F88 #x9F89 + #x9F8A #x9F8C #x9EFE #x9F0B #x9F0D #x96B9 #x96BC #x96BD #x96CE #x96D2 + #x77BF #x96E0 #x928E #x92AE #x92C8 #x933E #x936A #x93CA #x938F #x943E + #x946B #x9C7F #x9C82 #x9C85 #x9C86 #x9C87 #x9C88 #x7A23 #x9C8B #x9C8E + #x9C90 #x9C91 #x9C92 #x9C94 #x9C95 #x9C9A #x9C9B #x9C9E #x9C9F #x9CA0 + #x9CA1 #x9CA2 #x9CA3 #x9CA5 #x9CA6 #x9CA7 #x9CA8 #x9CA9 #x9CAB #x9CAD + #x9CAE #x9CB0 #x9CB1 #x9CB2 #x9CB3 #x9CB4 #x9CB5 #x9CB6 #x9CB7 #x9CBA + #x9CBB #x9CBC #x9CBD #x9CC4 #x9CC5 #x9CC6 #x9CC7 #x9CCA #x9CCB #x9CCC + #x9CCD #x9CCE #x9CCF #x9CD0 #x9CD3 #x9CD4 #x9CD5 #x9CD7 #x9CD8 #x9CD9 + #x9CDC #x9CDD #x9CDF #x9CE2 #x977C #x9785 #x9791 #x9792 #x9794 #x97AF + #x97AB #x97A3 #x97B2 #x97B4 #x9AB1 #x9AB0 #x9AB7 #x9E58 #x9AB6 #x9ABA + #x9ABC #x9AC1 #x9AC0 #x9AC5 #x9AC2 #x9ACB #x9ACC #x9AD1 #x9B45 #x9B43 + #x9B47 #x9B49 #x9B48 #x9B4D #x9B51 #x98E8 #x990D #x992E #x9955 #x9954 + #x9ADF #x9AE1 #x9AE6 #x9AEF #x9AEB #x9AFB #x9AED #x9AF9 #x9B08 #x9B0F + #x9B13 #x9B1F #x9B23 #x9EBD #x9EBE #x7E3B #x9E82 #x9E87 #x9E88 #x9E8B + #x9E92 #x93D6 #x9E9D #x9E9F #x9EDB #x9EDC #x9EDD #x9EE0 #x9EDF #x9EE2 + #x9EE9 #x9EE7 #x9EE5 #x9EEA #x9EEF #x9F22 #x9F2C #x9F2F #x9F39 #x9F37 + #x9F3D #x9F3E #x9F44 #x4E02 #x4E04 #x4E05 #x4E06 #x4E0F #x4E12 #x4E17 + #x4E1F #x4E20 #x4E21 #x4E23 #x4E26 #x4E29 #x4E2E #x4E2F #x4E31 #x4E33 + #x4E35 #x4E37 #x4E3C #x4E40 #x4E41 #x4E42 #x4E44 #x4E46 #x4E4A #x4E51 + #x4E55 #x4E57 #x4E5A #x4E5B #x4E62 #x4E63 #x4E64 #x4E65 #x4E67 #x4E68 + #x4E6A #x4E6B #x4E6C #x4E6D #x4E6E #x4E6F #x4E72 #x4E74 #x4E75 #x4E76 + #x4E77 #x4E78 #x4E79 #x4E7A #x4E7B #x4E7C #x4E7D #x4E7F #x4E80 #x4E81 + #x4E82 #x4E83 #x4E84 #x4E85 #x4E87 #x4E8A #x4E90 #x4E96 #x4E97 #x4E99 + #x4E9C #x4E9D #x4E9E #x4EA3 #x4EAA #x4EAF #x4EB0 #x4EB1 #x4EB4 #x4EB6 + #x4EB7 #x4EB8 #x4EB9 #x4EBC #x4EBD #x4EBE #x4EC8 #x4ECC #x4ECF #x4ED0 + #x4ED2 #x4EDA #x4EDB #x4EDC #x4EE0 #x4EE2 #x4EE6 #x4EE7 #x4EE9 #x4EED + #x4EEE #x4EEF #x4EF1 #x4EF4 #x4EF8 #x4EF9 #x4EFA #x4EFC #x4EFE #x4F00 + #x4F02 #x4F03 #x4F04 #x4F05 #x4F06 #x4F07 #x4F08 #x4F0B #x4F0C #x4F12 + #x4F13 #x4F14 #x4F15 #x4F16 #x4F1C #x4F1D #x4F21 #x4F23 #x4F28 #x4F29 + #x4F2C #x4F2D #x4F2E #x4F31 #x4F33 #x4F35 #x4F37 #x4F39 #x4F3B #x4F3E + #x4F3F #x4F40 #x4F41 #x4F42 #x4F44 #x4F45 #x4F47 #x4F48 #x4F49 #x4F4A + #x4F4B #x4F4C #x4F52 #x4F54 #x4F56 #x4F61 #x4F62 #x4F66 #x4F68 #x4F6A + #x4F6B #x4F6D #x4F6E #x4F71 #x4F72 #x4F75 #x4F77 #x4F78 #x4F79 #x4F7A + #x4F7D #x4F80 #x4F81 #x4F82 #x4F85 #x4F86 #x4F87 #x4F8A #x4F8C #x4F8E + #x4F90 #x4F92 #x4F93 #x4F95 #x4F96 #x4F98 #x4F99 #x4F9A #x4F9C #x4F9E + #x4F9F #x4FA1 #x4FA2 #x4FA4 #x4FAB #x4FAD #x4FB0 #x4FB1 #x4FB2 #x4FB3 + #x4FB4 #x4FB6 #x4FB7 #x4FB8 #x4FB9 #x4FBA #x4FBB #x4FBC #x4FBD #x4FBE + #x4FC0 #x4FC1 #x4FC2 #x4FC6 #x4FC7 #x4FC8 #x4FC9 #x4FCB #x4FCC #x4FCD + #x4FD2 #x4FD3 #x4FD4 #x4FD5 #x4FD6 #x4FD9 #x4FDB #x4FE0 #x4FE2 #x4FE4 + #x4FE5 #x4FE7 #x4FEB #x4FEC #x4FF0 #x4FF2 #x4FF4 #x4FF5 #x4FF6 #x4FF7 + #x4FF9 #x4FFB #x4FFC #x4FFD #x4FFF #x5000 #x5001 #x5002 #x5003 #x5004 + #x5005 #x5006 #x5007 #x5008 #x5009 #x500A #x500B #x500E #x5010 #x5011 + #x5013 #x5015 #x5016 #x5017 #x501B #x501D #x501E #x5020 #x5022 #x5023 + #x5024 #x5027 #x502B #x502F #x5030 #x5031 #x5032 #x5033 #x5034 #x5035 + #x5036 #x5037 #x5038 #x5039 #x503B #x503D #x503F #x5040 #x5041 #x5042 + #x5044 #x5045 #x5046 #x5049 #x504A #x504B #x504D #x5050 #x5051 #x5052 + #x5053 #x5054 #x5056 #x5057 #x5058 #x5059 #x505B #x505D #x505E #x505F + #x5060 #x5061 #x5062 #x5063 #x5064 #x5066 #x5067 #x5068 #x5069 #x506A + #x506B #x506D #x506E #x506F #x5070 #x5071 #x5072 #x5073 #x5074 #x5075 + #x5078 #x5079 #x507A #x507C #x507D #x5081 #x5082 #x5083 #x5084 #x5086 + #x5087 #x5089 #x508A #x508B #x508C #x508E #x508F #x5090 #x5091 #x5092 + #x5093 #x5094 #x5095 #x5096 #x5097 #x5098 #x5099 #x509A #x509B #x509C + #x509D #x509E #x509F #x50A0 #x50A1 #x50A2 #x50A4 #x50A6 #x50AA #x50AB + #x50AD #x50AE #x50AF #x50B0 #x50B1 #x50B3 #x50B4 #x50B5 #x50B6 #x50B7 + #x50B8 #x50B9 #x50BC #x50BD #x50BE #x50BF #x50C0 #x50C1 #x50C2 #x50C3 + #x50C4 #x50C5 #x50C6 #x50C7 #x50C8 #x50C9 #x50CA #x50CB #x50CC #x50CD + #x50CE #x50D0 #x50D1 #x50D2 #x50D3 #x50D4 #x50D5 #x50D7 #x50D8 #x50D9 + #x50DB #x50DC #x50DD #x50DE #x50DF #x50E0 #x50E1 #x50E2 #x50E3 #x50E4 + #x50E5 #x50E8 #x50E9 #x50EA #x50EB #x50EF #x50F0 #x50F1 #x50F2 #x50F4 + #x50F6 #x50F7 #x50F8 #x50F9 #x50FA #x50FC #x50FD #x50FE #x50FF #x5100 + #x5101 #x5102 #x5103 #x5104 #x5105 #x5108 #x5109 #x510A #x510C #x510D + #x510E #x510F #x5110 #x5111 #x5113 #x5114 #x5115 #x5116 #x5117 #x5118 + #x5119 #x511A #x511B #x511C #x511D #x511E #x511F #x5120 #x5122 #x5123 + #x5124 #x5125 #x5126 #x5127 #x5128 #x5129 #x512A #x512B #x512C #x512D + #x512E #x512F #x5130 #x5131 #x5132 #x5133 #x5134 #x5135 #x5136 #x5137 + #x5138 #x5139 #x513A #x513B #x513C #x513D #x513E #x5142 #x5147 #x514A + #x514C #x514E #x514F #x5150 #x5152 #x5153 #x5157 #x5158 #x5159 #x515B + #x515D #x515E #x515F #x5160 #x5161 #x5163 #x5164 #x5166 #x5167 #x5169 + #x516A #x516F #x5172 #x517A #x517E #x517F #x5183 #x5184 #x5186 #x5187 + #x518A #x518B #x518E #x518F #x5190 #x5191 #x5193 #x5194 #x5198 #x519A + #x519D #x519E #x519F #x51A1 #x51A3 #x51A6 #x51A7 #x51A8 #x51A9 #x51AA + #x51AD #x51AE #x51B4 #x51B8 #x51B9 #x51BA #x51BE #x51BF #x51C1 #x51C2 + #x51C3 #x51C5 #x51C8 #x51CA #x51CD #x51CE #x51D0 #x51D2 #x51D3 #x51D4 + #x51D5 #x51D6 #x51D7 #x51D8 #x51D9 #x51DA #x51DC #x51DE #x51DF #x51E2 + #x51E3 #x51E5 #x51E6 #x51E7 #x51E8 #x51E9 #x51EA #x51EC #x51EE #x51F1 + #x51F2 #x51F4 #x51F7 #x51FE #x5204 #x5205 #x5209 #x520B #x520C #x520F + #x5210 #x5213 #x5214 #x5215 #x521C #x521E #x521F #x5221 #x5222 #x5223 + #x5225 #x5226 #x5227 #x522A #x522C #x522F #x5231 #x5232 #x5234 #x5235 + #x523C #x523E #x5244 #x5245 #x5246 #x5247 #x5248 #x5249 #x524B #x524E + #x524F #x5252 #x5253 #x5255 #x5257 #x5258 #x5259 #x525A #x525B #x525D + #x525F #x5260 #x5262 #x5263 #x5264 #x5266 #x5268 #x526B #x526C #x526D + #x526E #x5270 #x5271 #x5273 #x5274 #x5275 #x5276 #x5277 #x5278 #x5279 + #x527A #x527B #x527C #x527E #x5280 #x5283 #x5284 #x5285 #x5286 #x5287 + #x5289 #x528A #x528B #x528C #x528D #x528E #x528F #x5291 #x5292 #x5294 + #x5295 #x5296 #x5297 #x5298 #x5299 #x529A #x529C #x52A4 #x52A5 #x52A6 + #x52A7 #x52AE #x52AF #x52B0 #x52B4 #x52B5 #x52B6 #x52B7 #x52B8 #x52B9 + #x52BA #x52BB #x52BC #x52BD #x52C0 #x52C1 #x52C2 #x52C4 #x52C5 #x52C6 + #x52C8 #x52CA #x52CC #x52CD #x52CE #x52CF #x52D1 #x52D3 #x52D4 #x52D5 + #x52D7 #x52D9 #x52DA #x52DB #x52DC #x52DD #x52DE #x52E0 #x52E1 #x52E2 + #x52E3 #x52E5 #x52E6 #x52E7 #x52E8 #x52E9 #x52EA #x52EB #x52EC #x52ED + #x52EE #x52EF #x52F1 #x52F2 #x52F3 #x52F4 #x52F5 #x52F6 #x52F7 #x52F8 + #x52FB #x52FC #x52FD #x5301 #x5302 #x5303 #x5304 #x5307 #x5309 #x530A + #x530B #x530C #x530E #x5311 #x5312 #x5313 #x5314 #x5318 #x531B #x531C + #x531E #x531F #x5322 #x5324 #x5325 #x5327 #x5328 #x5329 #x532B #x532C + #x532D #x532F #x5330 #x5331 #x5332 #x5333 #x5334 #x5335 #x5336 #x5337 + #x5338 #x533C #x533D #x5340 #x5342 #x5344 #x5346 #x534B #x534C #x534D + #x5350 #x5354 #x5358 #x5359 #x535B #x535D #x5365 #x5368 #x536A #x536C + #x536D #x5372 #x5376 #x5379 #x537B #x537C #x537D #x537E #x5380 #x5381 + #x5383 #x5387 #x5388 #x538A #x538E #x538F #x5390 #x5391 #x5392 #x5393 + #x5394 #x5396 #x5397 #x5399 #x539B #x539C #x539E #x53A0 #x53A1 #x53A4 + #x53A7 #x53AA #x53AB #x53AC #x53AD #x53AF #x53B0 #x53B1 #x53B2 #x53B3 + #x53B4 #x53B5 #x53B7 #x53B8 #x53B9 #x53BA #x53BC #x53BD #x53BE #x53C0 + #x53C3 #x53C4 #x53C5 #x53C6 #x53C7 #x53CE #x53CF #x53D0 #x53D2 #x53D3 + #x53D5 #x53DA #x53DC #x53DD #x53DE #x53E1 #x53E2 #x53E7 #x53F4 #x53FA + #x53FE #x53FF #x5400 #x5402 #x5405 #x5407 #x540B #x5414 #x5418 #x5419 + #x541A #x541C #x5422 #x5424 #x5425 #x542A #x5430 #x5433 #x5436 #x5437 + #x543A #x543D #x543F #x5441 #x5442 #x5444 #x5445 #x5447 #x5449 #x544C + #x544D #x544E #x544F #x5451 #x545A #x545D #x545E #x545F #x5460 #x5461 + #x5463 #x5465 #x5467 #x5469 #x546A #x546B #x546C #x546D #x546E #x546F + #x5470 #x5474 #x5479 #x547A #x547E #x547F #x5481 #x5483 #x5485 #x5487 + #x5488 #x5489 #x548A #x548D #x5491 #x5493 #x5497 #x5498 #x549C #x549E + #x549F #x54A0 #x54A1 #x54A2 #x54A5 #x54AE #x54B0 #x54B2 #x54B5 #x54B6 + #x54B7 #x54B9 #x54BA #x54BC #x54BE #x54C3 #x54C5 #x54CA #x54CB #x54D6 + #x54D8 #x54DB #x54E0 #x54E1 #x54E2 #x54E3 #x54E4 #x54EB #x54EC #x54EF + #x54F0 #x54F1 #x54F4 #x54F5 #x54F6 #x54F7 #x54F8 #x54F9 #x54FB #x54FE + #x5500 #x5502 #x5503 #x5504 #x5505 #x5508 #x550A #x550B #x550C #x550D + #x550E #x5512 #x5513 #x5515 #x5516 #x5517 #x5518 #x5519 #x551A #x551C + #x551D #x551E #x551F #x5521 #x5525 #x5526 #x5528 #x5529 #x552B #x552D + #x5532 #x5534 #x5535 #x5536 #x5538 #x5539 #x553A #x553B #x553D #x5540 + #x5542 #x5545 #x5547 #x5548 #x554B #x554C #x554D #x554E #x554F #x5551 + #x5552 #x5553 #x5554 #x5557 #x5558 #x5559 #x555A #x555B #x555D #x555E + #x555F #x5560 #x5562 #x5563 #x5568 #x5569 #x556B #x556F #x5570 #x5571 + #x5572 #x5573 #x5574 #x5579 #x557A #x557D #x557F #x5585 #x5586 #x558C + #x558D #x558E #x5590 #x5592 #x5593 #x5595 #x5596 #x5597 #x559A #x559B + #x559E #x55A0 #x55A1 #x55A2 #x55A3 #x55A4 #x55A5 #x55A6 #x55A8 #x55A9 + #x55AA #x55AB #x55AC #x55AD #x55AE #x55AF #x55B0 #x55B2 #x55B4 #x55B6 + #x55B8 #x55BA #x55BC #x55BF #x55C0 #x55C1 #x55C2 #x55C3 #x55C6 #x55C7 + #x55C8 #x55CA #x55CB #x55CE #x55CF #x55D0 #x55D5 #x55D7 #x55D8 #x55D9 + #x55DA #x55DB #x55DE #x55E0 #x55E2 #x55E7 #x55E9 #x55ED #x55EE #x55F0 + #x55F1 #x55F4 #x55F6 #x55F8 #x55F9 #x55FA #x55FB #x55FC #x55FF #x5602 + #x5603 #x5604 #x5605 #x5606 #x5607 #x560A #x560B #x560D #x5610 #x5611 + #x5612 #x5613 #x5614 #x5615 #x5616 #x5617 #x5619 #x561A #x561C #x561D + #x5620 #x5621 #x5622 #x5625 #x5626 #x5628 #x5629 #x562A #x562B #x562E + #x562F #x5630 #x5633 #x5635 #x5637 #x5638 #x563A #x563C #x563D #x563E + #x5640 #x5641 #x5642 #x5643 #x5644 #x5645 #x5646 #x5647 #x5648 #x5649 + #x564A #x564B #x564F #x5650 #x5651 #x5652 #x5653 #x5655 #x5656 #x565A + #x565B #x565D #x565E #x565F #x5660 #x5661 #x5663 #x5665 #x5666 #x5667 + #x566D #x566E #x566F #x5670 #x5672 #x5673 #x5674 #x5675 #x5677 #x5678 + #x5679 #x567A #x567D #x567E #x567F #x5680 #x5681 #x5682 #x5683 #x5684 + #x5687 #x5688 #x5689 #x568A #x568B #x568C #x568D #x5690 #x5691 #x5692 + #x5694 #x5695 #x5696 #x5697 #x5698 #x5699 #x569A #x569B #x569C #x569D + #x569E #x569F #x56A0 #x56A1 #x56A2 #x56A4 #x56A5 #x56A6 #x56A7 #x56A8 + #x56A9 #x56AA #x56AB #x56AC #x56AD #x56AE #x56B0 #x56B1 #x56B2 #x56B3 + #x56B4 #x56B5 #x56B6 #x56B8 #x56B9 #x56BA #x56BB #x56BD #x56BE #x56BF + #x56C0 #x56C1 #x56C2 #x56C3 #x56C4 #x56C5 #x56C6 #x56C7 #x56C8 #x56C9 + #x56CB #x56CC #x56CD #x56CE #x56CF #x56D0 #x56D1 #x56D2 #x56D3 #x56D5 + #x56D6 #x56D8 #x56D9 #x56DC #x56E3 #x56E5 #x56E6 #x56E7 #x56E8 #x56E9 + #x56EA #x56EC #x56EE #x56EF #x56F2 #x56F3 #x56F6 #x56F7 #x56F8 #x56FB + #x56FC #x5700 #x5701 #x5702 #x5705 #x5707 #x570B #x570C #x570D #x570E + #x570F #x5710 #x5711 #x5712 #x5713 #x5714 #x5715 #x5716 #x5717 #x5718 + #x5719 #x571A #x571B #x571D #x571E #x5720 #x5721 #x5722 #x5724 #x5725 + #x5726 #x5727 #x572B #x5731 #x5732 #x5734 #x5735 #x5736 #x5737 #x5738 + #x573C #x573D #x573F #x5741 #x5743 #x5744 #x5745 #x5746 #x5748 #x5749 + #x574B #x5752 #x5753 #x5754 #x5755 #x5756 #x5758 #x5759 #x5762 #x5763 + #x5765 #x5767 #x576C #x576E #x5770 #x5771 #x5772 #x5774 #x5775 #x5778 + #x5779 #x577A #x577D #x577E #x577F #x5780 #x5781 #x5787 #x5788 #x5789 + #x578A #x578D #x578E #x578F #x5790 #x5791 #x5794 #x5795 #x5796 #x5797 + #x5798 #x5799 #x579A #x579C #x579D #x579E #x579F #x57A5 #x57A8 #x57AA + #x57AC #x57AF #x57B0 #x57B1 #x57B3 #x57B5 #x57B6 #x57B7 #x57B9 #x57BA + #x57BB #x57BC #x57BD #x57BE #x57BF #x57C0 #x57C1 #x57C4 #x57C5 #x57C6 + #x57C7 #x57C8 #x57C9 #x57CA #x57CC #x57CD #x57D0 #x57D1 #x57D3 #x57D6 + #x57D7 #x57DB #x57DC #x57DE #x57E1 #x57E2 #x57E3 #x57E5 #x57E6 #x57E7 + #x57E8 #x57E9 #x57EA #x57EB #x57EC #x57EE #x57F0 #x57F1 #x57F2 #x57F3 + #x57F5 #x57F6 #x57F7 #x57FB #x57FC #x57FE #x57FF #x5801 #x5803 #x5804 + #x5805 #x5808 #x5809 #x580A #x580C #x580E #x580F #x5810 #x5812 #x5813 + #x5814 #x5816 #x5817 #x5818 #x581A #x581B #x581C #x581D #x581F #x5822 + #x5823 #x5825 #x5826 #x5827 #x5828 #x5829 #x582B #x582C #x582D #x582E + #x582F #x5831 #x5832 #x5833 #x5834 #x5836 #x5837 #x5838 #x5839 #x583A + #x583B #x583C #x583D #x583E #x583F #x5840 #x5841 #x5842 #x5843 #x5845 + #x5846 #x5847 #x5848 #x5849 #x584A #x584B #x584E #x584F #x5850 #x5852 + #x5853 #x5855 #x5856 #x5857 #x5859 #x585A #x585B #x585C #x585D #x585F + #x5860 #x5861 #x5862 #x5863 #x5864 #x5866 #x5867 #x5868 #x5869 #x586A + #x586D #x586E #x586F #x5870 #x5871 #x5872 #x5873 #x5874 #x5875 #x5876 + #x5877 #x5878 #x5879 #x587A #x587B #x587C #x587D #x587F #x5882 #x5884 + #x5886 #x5887 #x5888 #x588A #x588B #x588C #x588D #x588E #x588F #x5890 + #x5891 #x5894 #x5895 #x5896 #x5897 #x5898 #x589B #x589C #x589D #x58A0 + #x58A1 #x58A2 #x58A3 #x58A4 #x58A5 #x58A6 #x58A7 #x58AA #x58AB #x58AC + #x58AD #x58AE #x58AF #x58B0 #x58B1 #x58B2 #x58B3 #x58B4 #x58B5 #x58B6 + #x58B7 #x58B8 #x58B9 #x58BA #x58BB #x58BD #x58BE #x58BF #x58C0 #x58C2 + #x58C3 #x58C4 #x58C6 #x58C7 #x58C8 #x58C9 #x58CA #x58CB #x58CC #x58CD + #x58CE #x58CF #x58D0 #x58D2 #x58D3 #x58D4 #x58D6 #x58D7 #x58D8 #x58D9 + #x58DA #x58DB #x58DC #x58DD #x58DE #x58DF #x58E0 #x58E1 #x58E2 #x58E3 + #x58E5 #x58E6 #x58E7 #x58E8 #x58E9 #x58EA #x58ED #x58EF #x58F1 #x58F2 + #x58F4 #x58F5 #x58F7 #x58F8 #x58FA #x58FB #x58FC #x58FD #x58FE #x58FF + #x5900 #x5901 #x5903 #x5905 #x5906 #x5908 #x5909 #x590A #x590B #x590C + #x590E #x5910 #x5911 #x5912 #x5913 #x5917 #x5918 #x591B #x591D #x591E + #x5920 #x5921 #x5922 #x5923 #x5926 #x5928 #x592C #x5930 #x5932 #x5933 + #x5935 #x5936 #x593B #x593D #x593E #x593F #x5940 #x5943 #x5945 #x5946 + #x594A #x594C #x594D #x5950 #x5952 #x5953 #x5959 #x595B #x595C #x595D + #x595E #x595F #x5961 #x5963 #x5964 #x5966 #x5967 #x5968 #x5969 #x596A + #x596B #x596C #x596D #x596E #x596F #x5970 #x5971 #x5972 #x5975 #x5977 + #x597A #x597B #x597C #x597E #x597F #x5980 #x5985 #x5989 #x598B #x598C + #x598E #x598F #x5990 #x5991 #x5994 #x5995 #x5998 #x599A #x599B #x599C + #x599D #x599F #x59A0 #x59A1 #x59A2 #x59A6 #x59A7 #x59AC #x59AD #x59B0 + #x59B1 #x59B3 #x59B4 #x59B5 #x59B6 #x59B7 #x59B8 #x59BA #x59BC #x59BD + #x59BF #x59C0 #x59C1 #x59C2 #x59C3 #x59C4 #x59C5 #x59C7 #x59C8 #x59C9 + #x59CC #x59CD #x59CE #x59CF #x59D5 #x59D6 #x59D9 #x59DB #x59DE #x59DF + #x59E0 #x59E1 #x59E2 #x59E4 #x59E6 #x59E7 #x59E9 #x59EA #x59EB #x59ED + #x59EE #x59EF #x59F0 #x59F1 #x59F2 #x59F3 #x59F4 #x59F5 #x59F6 #x59F7 + #x59F8 #x59FA #x59FC #x59FD #x59FE #x5A00 #x5A02 #x5A0A #x5A0B #x5A0D + #x5A0E #x5A0F #x5A10 #x5A12 #x5A14 #x5A15 #x5A16 #x5A17 #x5A19 #x5A1A + #x5A1B #x5A1D #x5A1E #x5A21 #x5A22 #x5A24 #x5A26 #x5A27 #x5A28 #x5A2A + #x5A2B #x5A2C #x5A2D #x5A2E #x5A2F #x5A30 #x5A33 #x5A35 #x5A37 #x5A38 + #x5A39 #x5A3A #x5A3B #x5A3D #x5A3E #x5A3F #x5A41 #x5A42 #x5A43 #x5A44 + #x5A45 #x5A47 #x5A48 #x5A4B #x5A4C #x5A4D #x5A4E #x5A4F #x5A50 #x5A51 + #x5A52 #x5A53 #x5A54 #x5A56 #x5A57 #x5A58 #x5A59 #x5A5B #x5A5C #x5A5D + #x5A5E #x5A5F #x5A60 #x5A61 #x5A63 #x5A64 #x5A65 #x5A66 #x5A68 #x5A69 + #x5A6B #x5A6C #x5A6D #x5A6E #x5A6F #x5A70 #x5A71 #x5A72 #x5A73 #x5A78 + #x5A79 #x5A7B #x5A7C #x5A7D #x5A7E #x5A80 #x5A81 #x5A82 #x5A83 #x5A84 + #x5A85 #x5A86 #x5A87 #x5A88 #x5A89 #x5A8A #x5A8B #x5A8C #x5A8D #x5A8E + #x5A8F #x5A90 #x5A91 #x5A93 #x5A94 #x5A95 #x5A96 #x5A97 #x5A98 #x5A99 + #x5A9C #x5A9D #x5A9E #x5A9F #x5AA0 #x5AA1 #x5AA2 #x5AA3 #x5AA4 #x5AA5 + #x5AA6 #x5AA7 #x5AA8 #x5AA9 #x5AAB #x5AAC #x5AAD #x5AAE #x5AAF #x5AB0 + #x5AB1 #x5AB4 #x5AB6 #x5AB7 #x5AB9 #x5ABA #x5ABB #x5ABC #x5ABD #x5ABF + #x5AC0 #x5AC3 #x5AC4 #x5AC5 #x5AC6 #x5AC7 #x5AC8 #x5ACA #x5ACB #x5ACD + #x5ACE #x5ACF #x5AD0 #x5AD1 #x5AD3 #x5AD5 #x5AD7 #x5AD9 #x5ADA #x5ADB + #x5ADD #x5ADE #x5ADF #x5AE2 #x5AE4 #x5AE5 #x5AE7 #x5AE8 #x5AEA #x5AEC + #x5AED #x5AEE #x5AEF #x5AF0 #x5AF2 #x5AF3 #x5AF4 #x5AF5 #x5AF6 #x5AF7 + #x5AF8 #x5AF9 #x5AFA #x5AFB #x5AFC #x5AFD #x5AFE #x5AFF #x5B00 #x5B01 + #x5B02 #x5B03 #x5B04 #x5B05 #x5B06 #x5B07 #x5B08 #x5B0A #x5B0B #x5B0C + #x5B0D #x5B0E #x5B0F #x5B10 #x5B11 #x5B12 #x5B13 #x5B14 #x5B15 #x5B18 + #x5B19 #x5B1A #x5B1B #x5B1C #x5B1D #x5B1E #x5B1F #x5B20 #x5B21 #x5B22 + #x5B23 #x5B24 #x5B25 #x5B26 #x5B27 #x5B28 #x5B29 #x5B2A #x5B2B #x5B2C + #x5B2D #x5B2E #x5B2F #x5B30 #x5B31 #x5B33 #x5B35 #x5B36 #x5B38 #x5B39 + #x5B3A #x5B3B #x5B3C #x5B3D #x5B3E #x5B3F #x5B41 #x5B42 #x5B43 #x5B44 + #x5B45 #x5B46 #x5B47 #x5B48 #x5B49 #x5B4A #x5B4B #x5B4C #x5B4D #x5B4E + #x5B4F #x5B52 #x5B56 #x5B5E #x5B60 #x5B61 #x5B67 #x5B68 #x5B6B #x5B6D + #x5B6E #x5B6F #x5B72 #x5B74 #x5B76 #x5B77 #x5B78 #x5B79 #x5B7B #x5B7C + #x5B7E #x5B7F #x5B82 #x5B86 #x5B8A #x5B8D #x5B8E #x5B90 #x5B91 #x5B92 + #x5B94 #x5B96 #x5B9F #x5BA7 #x5BA8 #x5BA9 #x5BAC #x5BAD #x5BAE #x5BAF + #x5BB1 #x5BB2 #x5BB7 #x5BBA #x5BBB #x5BBC #x5BC0 #x5BC1 #x5BC3 #x5BC8 + #x5BC9 #x5BCA #x5BCB #x5BCD #x5BCE #x5BCF #x5BD1 #x5BD4 #x5BD5 #x5BD6 + #x5BD7 #x5BD8 #x5BD9 #x5BDA #x5BDB #x5BDC #x5BE0 #x5BE2 #x5BE3 #x5BE6 + #x5BE7 #x5BE9 #x5BEA #x5BEB #x5BEC #x5BED #x5BEF #x5BF1 #x5BF2 #x5BF3 + #x5BF4 #x5BF5 #x5BF6 #x5BF7 #x5BFD #x5BFE #x5C00 #x5C02 #x5C03 #x5C05 + #x5C07 #x5C08 #x5C0B #x5C0C #x5C0D #x5C0E #x5C10 #x5C12 #x5C13 #x5C17 + #x5C19 #x5C1B #x5C1E #x5C1F #x5C20 #x5C21 #x5C23 #x5C26 #x5C28 #x5C29 + #x5C2A #x5C2B #x5C2D #x5C2E #x5C2F #x5C30 #x5C32 #x5C33 #x5C35 #x5C36 + #x5C37 #x5C43 #x5C44 #x5C46 #x5C47 #x5C4C #x5C4D #x5C52 #x5C53 #x5C54 + #x5C56 #x5C57 #x5C58 #x5C5A #x5C5B #x5C5C #x5C5D #x5C5F #x5C62 #x5C64 + #x5C67 #x5C68 #x5C69 #x5C6A #x5C6B #x5C6C #x5C6D #x5C70 #x5C72 #x5C73 + #x5C74 #x5C75 #x5C76 #x5C77 #x5C78 #x5C7B #x5C7C #x5C7D #x5C7E #x5C80 + #x5C83 #x5C84 #x5C85 #x5C86 #x5C87 #x5C89 #x5C8A #x5C8B #x5C8E #x5C8F + #x5C92 #x5C93 #x5C95 #x5C9D #x5C9E #x5C9F #x5CA0 #x5CA1 #x5CA4 #x5CA5 + #x5CA6 #x5CA7 #x5CA8 #x5CAA #x5CAE #x5CAF #x5CB0 #x5CB2 #x5CB4 #x5CB6 + #x5CB9 #x5CBA #x5CBB #x5CBC #x5CBE #x5CC0 #x5CC2 #x5CC3 #x5CC5 #x5CC6 + #x5CC7 #x5CC8 #x5CC9 #x5CCA #x5CCC #x5CCD #x5CCE #x5CCF #x5CD0 #x5CD1 + #x5CD3 #x5CD4 #x5CD5 #x5CD6 #x5CD7 #x5CD8 #x5CDA #x5CDB #x5CDC #x5CDD + #x5CDE #x5CDF #x5CE0 #x5CE2 #x5CE3 #x5CE7 #x5CE9 #x5CEB #x5CEC #x5CEE + #x5CEF #x5CF1 #x5CF2 #x5CF3 #x5CF4 #x5CF5 #x5CF6 #x5CF7 #x5CF8 #x5CF9 + #x5CFA #x5CFC #x5CFD #x5CFE #x5CFF #x5D00 #x5D01 #x5D04 #x5D05 #x5D08 + #x5D09 #x5D0A #x5D0B #x5D0C #x5D0D #x5D0F #x5D10 #x5D11 #x5D12 #x5D13 + #x5D15 #x5D17 #x5D18 #x5D19 #x5D1A #x5D1C #x5D1D #x5D1F #x5D20 #x5D21 + #x5D22 #x5D23 #x5D25 #x5D28 #x5D2A #x5D2B #x5D2C #x5D2F #x5D30 #x5D31 + #x5D32 #x5D33 #x5D35 #x5D36 #x5D37 #x5D38 #x5D39 #x5D3A #x5D3B #x5D3C + #x5D3F #x5D40 #x5D41 #x5D42 #x5D43 #x5D44 #x5D45 #x5D46 #x5D48 #x5D49 + #x5D4D #x5D4E #x5D4F #x5D50 #x5D51 #x5D52 #x5D53 #x5D54 #x5D55 #x5D56 + #x5D57 #x5D59 #x5D5A #x5D5C #x5D5E #x5D5F #x5D60 #x5D61 #x5D62 #x5D63 + #x5D64 #x5D65 #x5D66 #x5D67 #x5D68 #x5D6A #x5D6D #x5D6E #x5D70 #x5D71 + #x5D72 #x5D73 #x5D75 #x5D76 #x5D77 #x5D78 #x5D79 #x5D7A #x5D7B #x5D7C + #x5D7D #x5D7E #x5D7F #x5D80 #x5D81 #x5D83 #x5D84 #x5D85 #x5D86 #x5D87 + #x5D88 #x5D89 #x5D8A #x5D8B #x5D8C #x5D8D #x5D8E #x5D8F #x5D90 #x5D91 + #x5D92 #x5D93 #x5D94 #x5D95 #x5D96 #x5D97 #x5D98 #x5D9A #x5D9B #x5D9C + #x5D9E #x5D9F #x5DA0 #x5DA1 #x5DA2 #x5DA3 #x5DA4 #x5DA5 #x5DA6 #x5DA7 + #x5DA8 #x5DA9 #x5DAA #x5DAB #x5DAC #x5DAD #x5DAE #x5DAF #x5DB0 #x5DB1 + #x5DB2 #x5DB3 #x5DB4 #x5DB5 #x5DB6 #x5DB8 #x5DB9 #x5DBA #x5DBB #x5DBC + #x5DBD #x5DBE #x5DBF #x5DC0 #x5DC1 #x5DC2 #x5DC3 #x5DC4 #x5DC6 #x5DC7 + #x5DC8 #x5DC9 #x5DCA #x5DCB #x5DCC #x5DCE #x5DCF #x5DD0 #x5DD1 #x5DD2 + #x5DD3 #x5DD4 #x5DD5 #x5DD6 #x5DD7 #x5DD8 #x5DD9 #x5DDA #x5DDC #x5DDF + #x5DE0 #x5DE3 #x5DE4 #x5DEA #x5DEC #x5DED #x5DF0 #x5DF5 #x5DF6 #x5DF8 + #x5DF9 #x5DFA #x5DFB #x5DFC #x5DFF #x5E00 #x5E04 #x5E07 #x5E09 #x5E0A + #x5E0B #x5E0D #x5E0E #x5E12 #x5E13 #x5E17 #x5E1E #x5E1F #x5E20 #x5E21 + #x5E22 #x5E23 #x5E24 #x5E25 #x5E28 #x5E29 #x5E2A #x5E2B #x5E2C #x5E2F + #x5E30 #x5E32 #x5E33 #x5E34 #x5E35 #x5E36 #x5E39 #x5E3A #x5E3E #x5E3F + #x5E40 #x5E41 #x5E43 #x5E46 #x5E47 #x5E48 #x5E49 #x5E4A #x5E4B #x5E4D + #x5E4E #x5E4F #x5E50 #x5E51 #x5E52 #x5E53 #x5E56 #x5E57 #x5E58 #x5E59 + #x5E5A #x5E5C #x5E5D #x5E5F #x5E60 #x5E63 #x5E64 #x5E65 #x5E66 #x5E67 + #x5E68 #x5E69 #x5E6A #x5E6B #x5E6C #x5E6D #x5E6E #x5E6F #x5E70 #x5E71 + #x5E75 #x5E77 #x5E79 #x5E7E #x5E81 #x5E82 #x5E83 #x5E85 #x5E88 #x5E89 + #x5E8C #x5E8D #x5E8E #x5E92 #x5E98 #x5E9B #x5E9D #x5EA1 #x5EA2 #x5EA3 + #x5EA4 #x5EA8 #x5EA9 #x5EAA #x5EAB #x5EAC #x5EAE #x5EAF #x5EB0 #x5EB1 + #x5EB2 #x5EB4 #x5EBA #x5EBB #x5EBC #x5EBD #x5EBF #x5EC0 #x5EC1 #x5EC2 + #x5EC3 #x5EC4 #x5EC5 #x5EC6 #x5EC7 #x5EC8 #x5ECB #x5ECC #x5ECD #x5ECE + #x5ECF #x5ED0 #x5ED4 #x5ED5 #x5ED7 #x5ED8 #x5ED9 #x5EDA #x5EDC #x5EDD + #x5EDE #x5EDF #x5EE0 #x5EE1 #x5EE2 #x5EE3 #x5EE4 #x5EE5 #x5EE6 #x5EE7 + #x5EE9 #x5EEB #x5EEC #x5EED #x5EEE #x5EEF #x5EF0 #x5EF1 #x5EF2 #x5EF3 + #x5EF5 #x5EF8 #x5EF9 #x5EFB #x5EFC #x5EFD #x5F05 #x5F06 #x5F07 #x5F09 + #x5F0C #x5F0D #x5F0E #x5F10 #x5F12 #x5F14 #x5F16 #x5F19 #x5F1A #x5F1C + #x5F1D #x5F1E #x5F21 #x5F22 #x5F23 #x5F24 #x5F28 #x5F2B #x5F2C #x5F2E + #x5F30 #x5F32 #x5F33 #x5F34 #x5F35 #x5F36 #x5F37 #x5F38 #x5F3B #x5F3D + #x5F3E #x5F3F #x5F41 #x5F42 #x5F43 #x5F44 #x5F45 #x5F46 #x5F47 #x5F48 + #x5F49 #x5F4A #x5F4B #x5F4C #x5F4D #x5F4E #x5F4F #x5F51 #x5F54 #x5F59 + #x5F5A #x5F5B #x5F5C #x5F5E #x5F5F #x5F60 #x5F63 #x5F65 #x5F67 #x5F68 + #x5F6B #x5F6E #x5F6F #x5F72 #x5F74 #x5F75 #x5F76 #x5F78 #x5F7A #x5F7D + #x5F7E #x5F7F #x5F83 #x5F86 #x5F8D #x5F8E #x5F8F #x5F91 #x5F93 #x5F94 + #x5F96 #x5F9A #x5F9B #x5F9D #x5F9E #x5F9F #x5FA0 #x5FA2 #x5FA3 #x5FA4 + #x5FA5 #x5FA6 #x5FA7 #x5FA9 #x5FAB #x5FAC #x5FAF #x5FB0 #x5FB1 #x5FB2 + #x5FB3 #x5FB4 #x5FB6 #x5FB8 #x5FB9 #x5FBA #x5FBB #x5FBE #x5FBF #x5FC0 + #x5FC1 #x5FC2 #x5FC7 #x5FC8 #x5FCA #x5FCB #x5FCE #x5FD3 #x5FD4 #x5FD5 + #x5FDA #x5FDB #x5FDC #x5FDE #x5FDF #x5FE2 #x5FE3 #x5FE5 #x5FE6 #x5FE8 + #x5FE9 #x5FEC #x5FEF #x5FF0 #x5FF2 #x5FF3 #x5FF4 #x5FF6 #x5FF7 #x5FF9 + #x5FFA #x5FFC #x6007 #x6008 #x6009 #x600B #x600C #x6010 #x6011 #x6013 + #x6017 #x6018 #x601A #x601E #x601F #x6022 #x6023 #x6024 #x602C #x602D + #x602E #x6030 #x6031 #x6032 #x6033 #x6034 #x6036 #x6037 #x6038 #x6039 + #x603A #x603D #x603E #x6040 #x6044 #x6045 #x6046 #x6047 #x6048 #x6049 + #x604A #x604C #x604E #x604F #x6051 #x6053 #x6054 #x6056 #x6057 #x6058 + #x605B #x605C #x605E #x605F #x6060 #x6061 #x6065 #x6066 #x606E #x6071 + #x6072 #x6074 #x6075 #x6077 #x607E #x6080 #x6081 #x6082 #x6085 #x6086 + #x6087 #x6088 #x608A #x608B #x608E #x608F #x6090 #x6091 #x6093 #x6095 + #x6097 #x6098 #x6099 #x609C #x609E #x60A1 #x60A2 #x60A4 #x60A5 #x60A7 + #x60A9 #x60AA #x60AE #x60B0 #x60B3 #x60B5 #x60B6 #x60B7 #x60B9 #x60BA + #x60BD #x60BE #x60BF #x60C0 #x60C1 #x60C2 #x60C3 #x60C4 #x60C7 #x60C8 + #x60C9 #x60CC #x60CD #x60CE #x60CF #x60D0 #x60D2 #x60D3 #x60D4 #x60D6 + #x60D7 #x60D9 #x60DB #x60DE #x60E1 #x60E2 #x60E3 #x60E4 #x60E5 #x60EA + #x60F1 #x60F2 #x60F5 #x60F7 #x60F8 #x60FB #x60FC #x60FD #x60FE #x60FF + #x6102 #x6103 #x6104 #x6105 #x6107 #x610A #x610B #x610C #x6110 #x6111 + #x6112 #x6113 #x6114 #x6116 #x6117 #x6118 #x6119 #x611B #x611C #x611D + #x611E #x6121 #x6122 #x6125 #x6128 #x6129 #x612A #x612C #x612D #x612E + #x612F #x6130 #x6131 #x6132 #x6133 #x6134 #x6135 #x6136 #x6137 #x6138 + #x6139 #x613A #x613B #x613C #x613D #x613E #x6140 #x6141 #x6142 #x6143 + #x6144 #x6145 #x6146 #x6147 #x6149 #x614B #x614D #x614F #x6150 #x6152 + #x6153 #x6154 #x6156 #x6157 #x6158 #x6159 #x615A #x615B #x615C #x615E + #x615F #x6160 #x6161 #x6163 #x6164 #x6165 #x6166 #x6169 #x616A #x616B + #x616C #x616D #x616E #x616F #x6171 #x6172 #x6173 #x6174 #x6176 #x6178 + #x6179 #x617A #x617B #x617C #x617D #x617E #x617F #x6180 #x6181 #x6182 + #x6183 #x6184 #x6185 #x6186 #x6187 #x6188 #x6189 #x618A #x618C #x618D + #x618F #x6190 #x6191 #x6192 #x6193 #x6195 #x6196 #x6197 #x6198 #x6199 + #x619A #x619B #x619C #x619E #x619F #x61A0 #x61A1 #x61A2 #x61A3 #x61A4 + #x61A5 #x61A6 #x61AA #x61AB #x61AD #x61AE #x61AF #x61B0 #x61B1 #x61B2 + #x61B3 #x61B4 #x61B5 #x61B6 #x61B8 #x61B9 #x61BA #x61BB #x61BC #x61BD + #x61BF #x61C0 #x61C1 #x61C3 #x61C4 #x61C5 #x61C6 #x61C7 #x61C9 #x61CC + #x61CD #x61CE #x61CF #x61D0 #x61D3 #x61D5 #x61D6 #x61D7 #x61D8 #x61D9 + #x61DA #x61DB #x61DC #x61DD #x61DE #x61DF #x61E0 #x61E1 #x61E2 #x61E3 + #x61E4 #x61E5 #x61E7 #x61E8 #x61E9 #x61EA #x61EB #x61EC #x61ED #x61EE + #x61EF #x61F0 #x61F1 #x61F2 #x61F3 #x61F4 #x61F6 #x61F7 #x61F8 #x61F9 + #x61FA #x61FB #x61FC #x61FD #x61FE #x6200 #x6201 #x6202 #x6203 #x6204 + #x6205 #x6207 #x6209 #x6213 #x6214 #x6219 #x621C #x621D #x621E #x6220 + #x6223 #x6226 #x6227 #x6228 #x6229 #x622B #x622D #x622F #x6230 #x6231 + #x6232 #x6235 #x6236 #x6238 #x6239 #x623A #x623B #x623C #x6242 #x6244 + #x6245 #x6246 #x624A #x624F #x6250 #x6255 #x6256 #x6257 #x6259 #x625A + #x625C #x625D #x625E #x625F #x6260 #x6261 #x6262 #x6264 #x6265 #x6268 + #x6271 #x6272 #x6274 #x6275 #x6277 #x6278 #x627A #x627B #x627D #x6281 + #x6282 #x6283 #x6285 #x6286 #x6287 #x6288 #x628B #x628C #x628D #x628E + #x628F #x6290 #x6294 #x6299 #x629C #x629D #x629E #x62A3 #x62A6 #x62A7 + #x62A9 #x62AA #x62AD #x62AE #x62AF #x62B0 #x62B2 #x62B3 #x62B4 #x62B6 + #x62B7 #x62B8 #x62BA #x62BE #x62C0 #x62C1 #x62C3 #x62CB #x62CF #x62D1 + #x62D5 #x62DD #x62DE #x62E0 #x62E1 #x62E4 #x62EA #x62EB #x62F0 #x62F2 + #x62F5 #x62F8 #x62F9 #x62FA #x62FB #x6300 #x6303 #x6304 #x6305 #x6306 + #x630A #x630B #x630C #x630D #x630F #x6310 #x6312 #x6313 #x6314 #x6315 + #x6317 #x6318 #x6319 #x631C #x6326 #x6327 #x6329 #x632C #x632D #x632E + #x6330 #x6331 #x6333 #x6334 #x6335 #x6336 #x6337 #x6338 #x633B #x633C + #x633E #x633F #x6340 #x6341 #x6344 #x6347 #x6348 #x634A #x6351 #x6352 + #x6353 #x6354 #x6356 #x6357 #x6358 #x6359 #x635A #x635B #x635C #x635D + #x6360 #x6364 #x6365 #x6366 #x6368 #x636A #x636B #x636C #x636F #x6370 + #x6372 #x6373 #x6374 #x6375 #x6378 #x6379 #x637C #x637D #x637E #x637F + #x6381 #x6383 #x6384 #x6385 #x6386 #x638B #x638D #x6391 #x6393 #x6394 + #x6395 #x6397 #x6399 #x639A #x639B #x639C #x639D #x639E #x639F #x63A1 + #x63A4 #x63A6 #x63AB #x63AF #x63B1 #x63B2 #x63B5 #x63B6 #x63B9 #x63BB + #x63BD #x63BF #x63C0 #x63C1 #x63C2 #x63C3 #x63C5 #x63C7 #x63C8 #x63CA + #x63CB #x63CC #x63D1 #x63D3 #x63D4 #x63D5 #x63D7 #x63D8 #x63D9 #x63DA + #x63DB #x63DC #x63DD #x63DF #x63E2 #x63E4 #x63E5 #x63E6 #x63E7 #x63E8 + #x63EB #x63EC #x63EE #x63EF #x63F0 #x63F1 #x63F3 #x63F5 #x63F7 #x63F9 + #x63FA #x63FB #x63FC #x63FE #x6403 #x6404 #x6406 #x6407 #x6408 #x6409 + #x640A #x640D #x640E #x6411 #x6412 #x6415 #x6416 #x6417 #x6418 #x6419 + #x641A #x641D #x641F #x6422 #x6423 #x6424 #x6425 #x6427 #x6428 #x6429 + #x642B #x642E #x642F #x6430 #x6431 #x6432 #x6433 #x6435 #x6436 #x6437 + #x6438 #x6439 #x643B #x643C #x643E #x6440 #x6442 #x6443 #x6449 #x644B + #x644C #x644D #x644E #x644F #x6450 #x6451 #x6453 #x6455 #x6456 #x6457 + #x6459 #x645A #x645B #x645C #x645D #x645F #x6460 #x6461 #x6462 #x6463 + #x6464 #x6465 #x6466 #x6468 #x646A #x646B #x646C #x646E #x646F #x6470 + #x6471 #x6472 #x6473 #x6474 #x6475 #x6476 #x6477 #x647B #x647C #x647D + #x647E #x647F #x6480 #x6481 #x6483 #x6486 #x6488 #x6489 #x648A #x648B + #x648C #x648D #x648E #x648F #x6490 #x6493 #x6494 #x6497 #x6498 #x649A + #x649B #x649C #x649D #x649F #x64A0 #x64A1 #x64A2 #x64A3 #x64A5 #x64A6 + #x64A7 #x64A8 #x64AA #x64AB #x64AF #x64B1 #x64B2 #x64B3 #x64B4 #x64B6 + #x64B9 #x64BB #x64BD #x64BE #x64BF #x64C1 #x64C3 #x64C4 #x64C6 #x64C7 + #x64C8 #x64C9 #x64CA #x64CB #x64CC #x64CF #x64D1 #x64D3 #x64D4 #x64D5 + #x64D6 #x64D9 #x64DA #x64DB #x64DC #x64DD #x64DF #x64E0 #x64E1 #x64E3 + #x64E5 #x64E7 #x64E8 #x64E9 #x64EA #x64EB #x64EC #x64ED #x64EE #x64EF + #x64F0 #x64F1 #x64F2 #x64F3 #x64F4 #x64F5 #x64F6 #x64F7 #x64F8 #x64F9 + #x64FA #x64FB #x64FC #x64FD #x64FE #x64FF #x6501 #x6502 #x6503 #x6504 + #x6505 #x6506 #x6507 #x6508 #x650A #x650B #x650C #x650D #x650E #x650F + #x6510 #x6511 #x6513 #x6514 #x6515 #x6516 #x6517 #x6519 #x651A #x651B + #x651C #x651D #x651E #x651F #x6520 #x6521 #x6522 #x6523 #x6524 #x6526 + #x6527 #x6528 #x6529 #x652A #x652C #x652D #x6530 #x6531 #x6532 #x6533 + #x6537 #x653A #x653C #x653D #x6540 #x6541 #x6542 #x6543 #x6544 #x6546 + #x6547 #x654A #x654B #x654D #x654E #x6550 #x6552 #x6553 #x6554 #x6557 + #x6558 #x655A #x655C #x655F #x6560 #x6561 #x6564 #x6565 #x6567 #x6568 + #x6569 #x656A #x656D #x656E #x656F #x6571 #x6573 #x6575 #x6576 #x6578 + #x6579 #x657A #x657B #x657C #x657D #x657E #x657F #x6580 #x6581 #x6582 + #x6583 #x6584 #x6585 #x6586 #x6588 #x6589 #x658A #x658D #x658E #x658F + #x6592 #x6594 #x6595 #x6596 #x6598 #x659A #x659D #x659E #x65A0 #x65A2 + #x65A3 #x65A6 #x65A8 #x65AA #x65AC #x65AE #x65B1 #x65B2 #x65B3 #x65B4 + #x65B5 #x65B6 #x65B7 #x65B8 #x65BA #x65BB #x65BE #x65BF #x65C0 #x65C2 + #x65C7 #x65C8 #x65C9 #x65CA #x65CD #x65D0 #x65D1 #x65D3 #x65D4 #x65D5 + #x65D8 #x65D9 #x65DA #x65DB #x65DC #x65DD #x65DE #x65DF #x65E1 #x65E3 + #x65E4 #x65EA #x65EB #x65F2 #x65F3 #x65F4 #x65F5 #x65F8 #x65F9 #x65FB + #x65FC #x65FD #x65FE #x65FF #x6601 #x6604 #x6605 #x6607 #x6608 #x6609 + #x660B #x660D #x6610 #x6611 #x6612 #x6616 #x6617 #x6618 #x661A #x661B + #x661C #x661E #x6621 #x6622 #x6623 #x6624 #x6626 #x6629 #x662A #x662B + #x662C #x662E #x6630 #x6632 #x6633 #x6637 #x6638 #x6639 #x663A #x663B + #x663D #x663F #x6640 #x6642 #x6644 #x6645 #x6646 #x6647 #x6648 #x6649 + #x664A #x664D #x664E #x6650 #x6651 #x6658 #x6659 #x665B #x665C #x665D + #x665E #x6660 #x6662 #x6663 #x6665 #x6667 #x6669 #x666A #x666B #x666C + #x666D #x6671 #x6672 #x6673 #x6675 #x6678 #x6679 #x667B #x667C #x667D + #x667F #x6680 #x6681 #x6683 #x6685 #x6686 #x6688 #x6689 #x668A #x668B + #x668D #x668E #x668F #x6690 #x6692 #x6693 #x6694 #x6695 #x6698 #x6699 + #x669A #x669B #x669C #x669E #x669F #x66A0 #x66A1 #x66A2 #x66A3 #x66A4 + #x66A5 #x66A6 #x66A9 #x66AA #x66AB #x66AC #x66AD #x66AF #x66B0 #x66B1 + #x66B2 #x66B3 #x66B5 #x66B6 #x66B7 #x66B8 #x66BA #x66BB #x66BC #x66BD + #x66BF #x66C0 #x66C1 #x66C2 #x66C3 #x66C4 #x66C5 #x66C6 #x66C7 #x66C8 + #x66C9 #x66CA #x66CB #x66CC #x66CD #x66CE #x66CF #x66D0 #x66D1 #x66D2 + #x66D3 #x66D4 #x66D5 #x66D6 #x66D7 #x66D8 #x66DA #x66DE #x66DF #x66E0 + #x66E1 #x66E2 #x66E3 #x66E4 #x66E5 #x66E7 #x66E8 #x66EA #x66EB #x66EC + #x66ED #x66EE #x66EF #x66F1 #x66F5 #x66F6 #x66F8 #x66FA #x66FB #x66FD + #x6701 #x6702 #x6703 #x6704 #x6705 #x6706 #x6707 #x670C #x670E #x670F + #x6711 #x6712 #x6713 #x6716 #x6718 #x6719 #x671A #x671C #x671E #x6720 + #x6721 #x6722 #x6723 #x6724 #x6725 #x6727 #x6729 #x672E #x6730 #x6732 + #x6733 #x6736 #x6737 #x6738 #x6739 #x673B #x673C #x673E #x673F #x6741 + #x6744 #x6745 #x6747 #x674A #x674B #x674D #x6752 #x6754 #x6755 #x6757 + #x6758 #x6759 #x675A #x675B #x675D #x6762 #x6763 #x6764 #x6766 #x6767 + #x676B #x676C #x676E #x6771 #x6774 #x6776 #x6778 #x6779 #x677A #x677B + #x677D #x6780 #x6782 #x6783 #x6785 #x6786 #x6788 #x678A #x678C #x678D + #x678E #x678F #x6791 #x6792 #x6793 #x6794 #x6796 #x6799 #x679B #x679F + #x67A0 #x67A1 #x67A4 #x67A6 #x67A9 #x67AC #x67AE #x67B1 #x67B2 #x67B4 + #x67B9 #x67BA #x67BB #x67BC #x67BD #x67BE #x67BF #x67C0 #x67C2 #x67C5 + #x67C6 #x67C7 #x67C8 #x67C9 #x67CA #x67CB #x67CC #x67CD #x67CE #x67D5 + #x67D6 #x67D7 #x67DB #x67DF #x67E1 #x67E3 #x67E4 #x67E6 #x67E7 #x67E8 + #x67EA #x67EB #x67ED #x67EE #x67F2 #x67F5 #x67F6 #x67F7 #x67F8 #x67F9 + #x67FA #x67FB #x67FC #x67FE #x6801 #x6802 #x6803 #x6804 #x6806 #x680D + #x6810 #x6812 #x6814 #x6815 #x6818 #x6819 #x681A #x681B #x681C #x681E + #x681F #x6820 #x6822 #x6823 #x6824 #x6825 #x6826 #x6827 #x6828 #x682B + #x682C #x682D #x682E #x682F #x6830 #x6831 #x6834 #x6835 #x6836 #x683A + #x683B #x683F #x6847 #x684B #x684D #x684F #x6852 #x6856 #x6857 #x6858 + #x6859 #x685A #x685B #x685C #x685D #x685E #x685F #x686A #x686C #x686D + #x686E #x686F #x6870 #x6871 #x6872 #x6873 #x6875 #x6878 #x6879 #x687A + #x687B #x687C #x687D #x687E #x687F #x6880 #x6882 #x6884 #x6887 #x6888 + #x6889 #x688A #x688B #x688C #x688D #x688E #x6890 #x6891 #x6892 #x6894 + #x6895 #x6896 #x6898 #x6899 #x689A #x689B #x689C #x689D #x689E #x689F + #x68A0 #x68A1 #x68A3 #x68A4 #x68A5 #x68A9 #x68AA #x68AB #x68AC #x68AE + #x68B1 #x68B2 #x68B4 #x68B6 #x68B7 #x68B8 #x68B9 #x68BA #x68BB #x68BC + #x68BD #x68BE #x68BF #x68C1 #x68C3 #x68C4 #x68C5 #x68C6 #x68C7 #x68C8 + #x68CA #x68CC #x68CE #x68CF #x68D0 #x68D1 #x68D3 #x68D4 #x68D6 #x68D7 + #x68D9 #x68DB #x68DC #x68DD #x68DE #x68DF #x68E1 #x68E2 #x68E4 #x68E5 + #x68E6 #x68E7 #x68E8 #x68E9 #x68EA #x68EB #x68EC #x68ED #x68EF #x68F2 + #x68F3 #x68F4 #x68F6 #x68F7 #x68F8 #x68FB #x68FD #x68FE #x68FF #x6900 + #x6902 #x6903 #x6904 #x6906 #x6907 #x6908 #x6909 #x690A #x690C #x690F + #x6911 #x6913 #x6914 #x6915 #x6916 #x6917 #x6918 #x6919 #x691A #x691B + #x691C #x691D #x691E #x6921 #x6922 #x6923 #x6925 #x6926 #x6927 #x6928 + #x6929 #x692A #x692B #x692C #x692E #x692F #x6931 #x6932 #x6933 #x6935 + #x6936 #x6937 #x6938 #x693A #x693B #x693C #x693E #x6940 #x6941 #x6943 + #x6944 #x6945 #x6946 #x6947 #x6948 #x6949 #x694A #x694B #x694C #x694D + #x694E #x694F #x6950 #x6951 #x6952 #x6953 #x6955 #x6956 #x6958 #x6959 + #x695B #x695C #x695F #x6961 #x6962 #x6964 #x6965 #x6967 #x6968 #x6969 + #x696A #x696C #x696D #x696F #x6970 #x6972 #x6973 #x6974 #x6975 #x6976 + #x697A #x697B #x697D #x697E #x697F #x6981 #x6983 #x6985 #x698A #x698B + #x698C #x698E #x698F #x6990 #x6991 #x6992 #x6993 #x6996 #x6997 #x6999 + #x699A #x699D #x699E #x699F #x69A0 #x69A1 #x69A2 #x69A3 #x69A4 #x69A5 + #x69A6 #x69A9 #x69AA #x69AC #x69AE #x69AF #x69B0 #x69B2 #x69B3 #x69B5 + #x69B6 #x69B8 #x69B9 #x69BA #x69BC #x69BD #x69BE #x69BF #x69C0 #x69C2 + #x69C3 #x69C4 #x69C5 #x69C6 #x69C7 #x69C8 #x69C9 #x69CB #x69CD #x69CF + #x69D1 #x69D2 #x69D3 #x69D5 #x69D6 #x69D7 #x69D8 #x69D9 #x69DA #x69DC + #x69DD #x69DE #x69E1 #x69E2 #x69E3 #x69E4 #x69E5 #x69E6 #x69E7 #x69E8 + #x69E9 #x69EA #x69EB #x69EC #x69EE #x69EF #x69F0 #x69F1 #x69F3 #x69F4 + #x69F5 #x69F6 #x69F7 #x69F8 #x69F9 #x69FA #x69FB #x69FC #x69FE #x6A00 + #x6A01 #x6A02 #x6A03 #x6A04 #x6A05 #x6A06 #x6A07 #x6A08 #x6A09 #x6A0B + #x6A0C #x6A0D #x6A0E #x6A0F #x6A10 #x6A11 #x6A12 #x6A13 #x6A14 #x6A15 + #x6A16 #x6A19 #x6A1A #x6A1B #x6A1C #x6A1D #x6A1E #x6A20 #x6A22 #x6A23 + #x6A24 #x6A25 #x6A26 #x6A27 #x6A29 #x6A2B #x6A2C #x6A2D #x6A2E #x6A30 + #x6A32 #x6A33 #x6A34 #x6A36 #x6A37 #x6A38 #x6A39 #x6A3A #x6A3B #x6A3C + #x6A3F #x6A40 #x6A41 #x6A42 #x6A43 #x6A45 #x6A46 #x6A48 #x6A49 #x6A4A + #x6A4B #x6A4C #x6A4D #x6A4E #x6A4F #x6A51 #x6A52 #x6A53 #x6A54 #x6A55 + #x6A56 #x6A57 #x6A5A #x6A5C #x6A5D #x6A5E #x6A5F #x6A60 #x6A62 #x6A63 + #x6A64 #x6A66 #x6A67 #x6A68 #x6A69 #x6A6A #x6A6B #x6A6C #x6A6D #x6A6E + #x6A6F #x6A70 #x6A72 #x6A73 #x6A74 #x6A75 #x6A76 #x6A77 #x6A78 #x6A7A + #x6A7B #x6A7D #x6A7E #x6A7F #x6A81 #x6A82 #x6A83 #x6A85 #x6A86 #x6A87 + #x6A88 #x6A89 #x6A8A #x6A8B #x6A8C #x6A8D #x6A8F #x6A92 #x6A93 #x6A94 + #x6A95 #x6A96 #x6A98 #x6A99 #x6A9A #x6A9B #x6A9C #x6A9D #x6A9E #x6A9F + #x6AA1 #x6AA2 #x6AA3 #x6AA4 #x6AA5 #x6AA6 #x6AA7 #x6AA8 #x6AAA #x6AAD + #x6AAE #x6AAF #x6AB0 #x6AB1 #x6AB2 #x6AB3 #x6AB4 #x6AB5 #x6AB6 #x6AB7 + #x6AB8 #x6AB9 #x6ABA #x6ABB #x6ABC #x6ABD #x6ABE #x6ABF #x6AC0 #x6AC1 + #x6AC2 #x6AC3 #x6AC4 #x6AC5 #x6AC6 #x6AC7 #x6AC8 #x6AC9 #x6ACA #x6ACB + #x6ACC #x6ACD #x6ACE #x6ACF #x6AD0 #x6AD1 #x6AD2 #x6AD3 #x6AD4 #x6AD5 + #x6AD6 #x6AD7 #x6AD8 #x6AD9 #x6ADA #x6ADB #x6ADC #x6ADD #x6ADE #x6ADF + #x6AE0 #x6AE1 #x6AE2 #x6AE3 #x6AE4 #x6AE5 #x6AE6 #x6AE7 #x6AE8 #x6AE9 + #x6AEA #x6AEB #x6AEC #x6AED #x6AEE #x6AEF #x6AF0 #x6AF1 #x6AF2 #x6AF3 + #x6AF4 #x6AF5 #x6AF6 #x6AF7 #x6AF8 #x6AF9 #x6AFA #x6AFB #x6AFC #x6AFD + #x6AFE #x6AFF #x6B00 #x6B01 #x6B02 #x6B03 #x6B04 #x6B05 #x6B06 #x6B07 + #x6B08 #x6B09 #x6B0A #x6B0B #x6B0C #x6B0D #x6B0E #x6B0F #x6B10 #x6B11 + #x6B12 #x6B13 #x6B14 #x6B15 #x6B16 #x6B17 #x6B18 #x6B19 #x6B1A #x6B1B + #x6B1C #x6B1D #x6B1E #x6B1F #x6B25 #x6B26 #x6B28 #x6B29 #x6B2A #x6B2B + #x6B2C #x6B2D #x6B2E #x6B2F #x6B30 #x6B31 #x6B33 #x6B34 #x6B35 #x6B36 + #x6B38 #x6B3B #x6B3C #x6B3D #x6B3F #x6B40 #x6B41 #x6B42 #x6B44 #x6B45 + #x6B48 #x6B4A #x6B4B #x6B4D #x6B4E #x6B4F #x6B50 #x6B51 #x6B52 #x6B53 + #x6B54 #x6B55 #x6B56 #x6B57 #x6B58 #x6B5A #x6B5B #x6B5C #x6B5D #x6B5E + #x6B5F #x6B60 #x6B61 #x6B68 #x6B69 #x6B6B #x6B6C #x6B6D #x6B6E #x6B6F + #x6B70 #x6B71 #x6B72 #x6B73 #x6B74 #x6B75 #x6B76 #x6B77 #x6B78 #x6B7A + #x6B7D #x6B7E #x6B7F #x6B80 #x6B85 #x6B88 #x6B8C #x6B8E #x6B8F #x6B90 + #x6B91 #x6B94 #x6B95 #x6B97 #x6B98 #x6B99 #x6B9C #x6B9D #x6B9E #x6B9F + #x6BA0 #x6BA2 #x6BA3 #x6BA4 #x6BA5 #x6BA6 #x6BA7 #x6BA8 #x6BA9 #x6BAB + #x6BAC #x6BAD #x6BAE #x6BAF #x6BB0 #x6BB1 #x6BB2 #x6BB6 #x6BB8 #x6BB9 + #x6BBA #x6BBB #x6BBC #x6BBD #x6BBE #x6BC0 #x6BC3 #x6BC4 #x6BC6 #x6BC7 + #x6BC8 #x6BC9 #x6BCA #x6BCC #x6BCE #x6BD0 #x6BD1 #x6BD8 #x6BDA #x6BDC + #x6BDD #x6BDE #x6BDF #x6BE0 #x6BE2 #x6BE3 #x6BE4 #x6BE5 #x6BE6 #x6BE7 + #x6BE8 #x6BE9 #x6BEC #x6BED #x6BEE #x6BF0 #x6BF1 #x6BF2 #x6BF4 #x6BF6 + #x6BF7 #x6BF8 #x6BFA #x6BFB #x6BFC #x6BFE #x6BFF #x6C00 #x6C01 #x6C02 + #x6C03 #x6C04 #x6C08 #x6C09 #x6C0A #x6C0B #x6C0C #x6C0E #x6C12 #x6C17 + #x6C1C #x6C1D #x6C1E #x6C20 #x6C23 #x6C25 #x6C2B #x6C2C #x6C2D #x6C31 + #x6C33 #x6C36 #x6C37 #x6C39 #x6C3A #x6C3B #x6C3C #x6C3E #x6C3F #x6C43 + #x6C44 #x6C45 #x6C48 #x6C4B #x6C4C #x6C4D #x6C4E #x6C4F #x6C51 #x6C52 + #x6C53 #x6C56 #x6C58 #x6C59 #x6C5A #x6C62 #x6C63 #x6C65 #x6C66 #x6C67 + #x6C6B #x6C6C #x6C6D #x6C6E #x6C6F #x6C71 #x6C73 #x6C75 #x6C77 #x6C78 + #x6C7A #x6C7B #x6C7C #x6C7F #x6C80 #x6C84 #x6C87 #x6C8A #x6C8B #x6C8D + #x6C8E #x6C91 #x6C92 #x6C95 #x6C96 #x6C97 #x6C98 #x6C9A #x6C9C #x6C9D + #x6C9E #x6CA0 #x6CA2 #x6CA8 #x6CAC #x6CAF #x6CB0 #x6CB4 #x6CB5 #x6CB6 + #x6CB7 #x6CBA #x6CC0 #x6CC1 #x6CC2 #x6CC3 #x6CC6 #x6CC7 #x6CC8 #x6CCB + #x6CCD #x6CCE #x6CCF #x6CD1 #x6CD2 #x6CD8 #x6CD9 #x6CDA #x6CDC #x6CDD + #x6CDF #x6CE4 #x6CE6 #x6CE7 #x6CE9 #x6CEC #x6CED #x6CF2 #x6CF4 #x6CF9 + #x6CFF #x6D00 #x6D02 #x6D03 #x6D05 #x6D06 #x6D08 #x6D09 #x6D0A #x6D0D + #x6D0F #x6D10 #x6D11 #x6D13 #x6D14 #x6D15 #x6D16 #x6D18 #x6D1C #x6D1D + #x6D1F #x6D20 #x6D21 #x6D22 #x6D23 #x6D24 #x6D26 #x6D28 #x6D29 #x6D2C + #x6D2D #x6D2F #x6D30 #x6D34 #x6D36 #x6D37 #x6D38 #x6D3A #x6D3F #x6D40 + #x6D42 #x6D44 #x6D49 #x6D4C #x6D50 #x6D55 #x6D56 #x6D57 #x6D58 #x6D5B + #x6D5D #x6D5F #x6D61 #x6D62 #x6D64 #x6D65 #x6D67 #x6D68 #x6D6B #x6D6C + #x6D6D #x6D70 #x6D71 #x6D72 #x6D73 #x6D75 #x6D76 #x6D79 #x6D7A #x6D7B + #x6D7D #x6D7E #x6D7F #x6D80 #x6D81 #x6D83 #x6D84 #x6D86 #x6D87 #x6D8A + #x6D8B #x6D8D #x6D8F #x6D90 #x6D92 #x6D96 #x6D97 #x6D98 #x6D99 #x6D9A + #x6D9C #x6DA2 #x6DA5 #x6DAC #x6DAD #x6DB0 #x6DB1 #x6DB3 #x6DB4 #x6DB6 + #x6DB7 #x6DB9 #x6DBA #x6DBB #x6DBC #x6DBD #x6DBE #x6DC1 #x6DC2 #x6DC3 + #x6DC8 #x6DC9 #x6DCA #x6DCD #x6DCE #x6DCF #x6DD0 #x6DD2 #x6DD3 #x6DD4 + #x6DD5 #x6DD7 #x6DDA #x6DDB #x6DDC #x6DDF #x6DE2 #x6DE3 #x6DE5 #x6DE7 + #x6DE8 #x6DE9 #x6DEA #x6DED #x6DEF #x6DF0 #x6DF2 #x6DF4 #x6DF5 #x6DF6 + #x6DF8 #x6DFA #x6DFD #x6DFE #x6DFF #x6E00 #x6E01 #x6E02 #x6E03 #x6E04 + #x6E06 #x6E07 #x6E08 #x6E09 #x6E0B #x6E0F #x6E12 #x6E13 #x6E15 #x6E18 + #x6E19 #x6E1B #x6E1C #x6E1E #x6E1F #x6E22 #x6E26 #x6E27 #x6E28 #x6E2A + #x6E2C #x6E2E #x6E30 #x6E31 #x6E33 #x6E35 #x6E36 #x6E37 #x6E39 #x6E3B + #x6E3C #x6E3D #x6E3E #x6E3F #x6E40 #x6E41 #x6E42 #x6E45 #x6E46 #x6E47 + #x6E48 #x6E49 #x6E4A #x6E4B #x6E4C #x6E4F #x6E50 #x6E51 #x6E52 #x6E55 + #x6E57 #x6E59 #x6E5A #x6E5C #x6E5D #x6E5E #x6E60 #x6E61 #x6E62 #x6E63 + #x6E64 #x6E65 #x6E66 #x6E67 #x6E68 #x6E69 #x6E6A #x6E6C #x6E6D #x6E6F + #x6E70 #x6E71 #x6E72 #x6E73 #x6E74 #x6E75 #x6E76 #x6E77 #x6E78 #x6E79 + #x6E7A #x6E7B #x6E7C #x6E7D #x6E80 #x6E81 #x6E82 #x6E84 #x6E87 #x6E88 + #x6E8A #x6E8B #x6E8C #x6E8D #x6E8E #x6E91 #x6E92 #x6E93 #x6E94 #x6E95 + #x6E96 #x6E97 #x6E99 #x6E9A #x6E9B #x6E9D #x6E9E #x6EA0 #x6EA1 #x6EA3 + #x6EA4 #x6EA6 #x6EA8 #x6EA9 #x6EAB #x6EAC #x6EAD #x6EAE #x6EB0 #x6EB3 + #x6EB5 #x6EB8 #x6EB9 #x6EBC #x6EBE #x6EBF #x6EC0 #x6EC3 #x6EC4 #x6EC5 + #x6EC6 #x6EC8 #x6EC9 #x6ECA #x6ECC #x6ECD #x6ECE #x6ED0 #x6ED2 #x6ED6 + #x6ED8 #x6ED9 #x6EDB #x6EDC #x6EDD #x6EE3 #x6EE7 #x6EEA #x6EEB #x6EEC + #x6EED #x6EEE #x6EEF #x6EF0 #x6EF1 #x6EF2 #x6EF3 #x6EF5 #x6EF6 #x6EF7 + #x6EF8 #x6EFA #x6EFB #x6EFC #x6EFD #x6EFE #x6EFF #x6F00 #x6F01 #x6F03 + #x6F04 #x6F05 #x6F07 #x6F08 #x6F0A #x6F0B #x6F0C #x6F0D #x6F0E #x6F10 + #x6F11 #x6F12 #x6F16 #x6F17 #x6F18 #x6F19 #x6F1A #x6F1B #x6F1C #x6F1D + #x6F1E #x6F1F #x6F21 #x6F22 #x6F23 #x6F25 #x6F26 #x6F27 #x6F28 #x6F2C + #x6F2E #x6F30 #x6F32 #x6F34 #x6F35 #x6F37 #x6F38 #x6F39 #x6F3A #x6F3B + #x6F3C #x6F3D #x6F3F #x6F40 #x6F41 #x6F42 #x6F43 #x6F44 #x6F45 #x6F48 + #x6F49 #x6F4A #x6F4C #x6F4E #x6F4F #x6F50 #x6F51 #x6F52 #x6F53 #x6F54 + #x6F55 #x6F56 #x6F57 #x6F59 #x6F5A #x6F5B #x6F5D #x6F5F #x6F60 #x6F61 + #x6F63 #x6F64 #x6F65 #x6F67 #x6F68 #x6F69 #x6F6A #x6F6B #x6F6C #x6F6F + #x6F70 #x6F71 #x6F73 #x6F75 #x6F76 #x6F77 #x6F79 #x6F7B #x6F7D #x6F7E + #x6F7F #x6F80 #x6F81 #x6F82 #x6F83 #x6F85 #x6F86 #x6F87 #x6F8A #x6F8B + #x6F8F #x6F90 #x6F91 #x6F92 #x6F93 #x6F94 #x6F95 #x6F96 #x6F97 #x6F98 + #x6F99 #x6F9A #x6F9B #x6F9D #x6F9E #x6F9F #x6FA0 #x6FA2 #x6FA3 #x6FA4 + #x6FA5 #x6FA6 #x6FA8 #x6FA9 #x6FAA #x6FAB #x6FAC #x6FAD #x6FAE #x6FAF + #x6FB0 #x6FB1 #x6FB2 #x6FB4 #x6FB5 #x6FB7 #x6FB8 #x6FBA #x6FBB #x6FBC + #x6FBD #x6FBE #x6FBF #x6FC1 #x6FC3 #x6FC4 #x6FC5 #x6FC6 #x6FC7 #x6FC8 + #x6FCA #x6FCB #x6FCC #x6FCD #x6FCE #x6FCF #x6FD0 #x6FD3 #x6FD4 #x6FD5 + #x6FD6 #x6FD7 #x6FD8 #x6FD9 #x6FDA #x6FDB #x6FDC #x6FDD #x6FDF #x6FE2 + #x6FE3 #x6FE4 #x6FE5 #x6FE6 #x6FE7 #x6FE8 #x6FE9 #x6FEA #x6FEB #x6FEC + #x6FED #x6FF0 #x6FF1 #x6FF2 #x6FF3 #x6FF4 #x6FF5 #x6FF6 #x6FF7 #x6FF8 + #x6FF9 #x6FFA #x6FFB #x6FFC #x6FFD #x6FFE #x6FFF #x7000 #x7001 #x7002 + #x7003 #x7004 #x7005 #x7006 #x7007 #x7008 #x7009 #x700A #x700B #x700C + #x700D #x700E #x700F #x7010 #x7012 #x7013 #x7014 #x7015 #x7016 #x7017 + #x7018 #x7019 #x701C #x701D #x701E #x701F #x7020 #x7021 #x7022 #x7024 + #x7025 #x7026 #x7027 #x7028 #x7029 #x702A #x702B #x702C #x702D #x702E + #x702F #x7030 #x7031 #x7032 #x7033 #x7034 #x7036 #x7037 #x7038 #x703A + #x703B #x703C #x703D #x703E #x703F #x7040 #x7041 #x7042 #x7043 #x7044 + #x7045 #x7046 #x7047 #x7048 #x7049 #x704A #x704B #x704D #x704E #x7050 + #x7051 #x7052 #x7053 #x7054 #x7055 #x7056 #x7057 #x7058 #x7059 #x705A + #x705B #x705C #x705D #x705F #x7060 #x7061 #x7062 #x7063 #x7064 #x7065 + #x7066 #x7067 #x7068 #x7069 #x706A #x706E #x7071 #x7072 #x7073 #x7074 + #x7077 #x7079 #x707A #x707B #x707D #x7081 #x7082 #x7083 #x7084 #x7086 + #x7087 #x7088 #x708B #x708C #x708D #x708F #x7090 #x7091 #x7093 #x7097 + #x7098 #x709A #x709B #x709E #x709F #x70A0 #x70A1 #x70A2 #x70A3 #x70A4 + #x70A5 #x70A6 #x70A7 #x70A8 #x70A9 #x70AA #x70B0 #x70B2 #x70B4 #x70B5 + #x70B6 #x70BA #x70BE #x70BF #x70C4 #x70C5 #x70C6 #x70C7 #x70C9 #x70CB + #x70CC #x70CD #x70CE #x70CF #x70D0 #x70D1 #x70D2 #x70D3 #x70D4 #x70D5 + #x70D6 #x70D7 #x70DA #x70DC #x70DD #x70DE #x70E0 #x70E1 #x70E2 #x70E3 + #x70E5 #x70EA #x70EE #x70F0 #x70F1 #x70F2 #x70F3 #x70F4 #x70F5 #x70F6 + #x70F8 #x70FA #x70FB #x70FC #x70FE #x70FF #x7100 #x7101 #x7102 #x7103 + #x7104 #x7105 #x7106 #x7107 #x7108 #x710B #x710C #x710D #x710E #x710F + #x7111 #x7112 #x7114 #x7117 #x711B #x711C #x711D #x711E #x711F #x7120 + #x7121 #x7122 #x7123 #x7124 #x7125 #x7127 #x7128 #x7129 #x712A #x712B + #x712C #x712D #x712E #x7132 #x7133 #x7134 #x7135 #x7137 #x7138 #x7139 + #x713A #x713B #x713C #x713D #x713E #x713F #x7140 #x7141 #x7142 #x7143 + #x7144 #x7146 #x7147 #x7148 #x7149 #x714B #x714D #x714F #x7150 #x7151 + #x7152 #x7153 #x7154 #x7155 #x7156 #x7157 #x7158 #x7159 #x715A #x715B + #x715D #x715F #x7160 #x7161 #x7162 #x7163 #x7165 #x7169 #x716A #x716B + #x716C #x716D #x716F #x7170 #x7171 #x7174 #x7175 #x7176 #x7177 #x7179 + #x717B #x717C #x717E #x717F #x7180 #x7181 #x7182 #x7183 #x7185 #x7186 + #x7187 #x7188 #x7189 #x718B #x718C #x718D #x718E #x7190 #x7191 #x7192 + #x7193 #x7195 #x7196 #x7197 #x719A #x719B #x719C #x719D #x719E #x71A1 + #x71A2 #x71A3 #x71A4 #x71A5 #x71A6 #x71A7 #x71A9 #x71AA #x71AB #x71AD + #x71AE #x71AF #x71B0 #x71B1 #x71B2 #x71B4 #x71B6 #x71B7 #x71B8 #x71BA + #x71BB #x71BC #x71BD #x71BE #x71BF #x71C0 #x71C1 #x71C2 #x71C4 #x71C5 + #x71C6 #x71C7 #x71C8 #x71C9 #x71CA #x71CB #x71CC #x71CD #x71CF #x71D0 + #x71D1 #x71D2 #x71D3 #x71D6 #x71D7 #x71D8 #x71D9 #x71DA #x71DB #x71DC + #x71DD #x71DE #x71DF #x71E1 #x71E2 #x71E3 #x71E4 #x71E6 #x71E8 #x71E9 + #x71EA #x71EB #x71EC #x71ED #x71EF #x71F0 #x71F1 #x71F2 #x71F3 #x71F4 + #x71F5 #x71F6 #x71F7 #x71F8 #x71FA #x71FB #x71FC #x71FD #x71FE #x71FF + #x7200 #x7201 #x7202 #x7203 #x7204 #x7205 #x7207 #x7208 #x7209 #x720A + #x720B #x720C #x720D #x720E #x720F #x7210 #x7211 #x7212 #x7213 #x7214 + #x7215 #x7216 #x7217 #x7218 #x7219 #x721A #x721B #x721C #x721E #x721F + #x7220 #x7221 #x7222 #x7223 #x7224 #x7225 #x7226 #x7227 #x7229 #x722B + #x722D #x722E #x722F #x7232 #x7233 #x7234 #x723A #x723C #x723E #x7240 + #x7241 #x7242 #x7243 #x7244 #x7245 #x7246 #x7249 #x724A #x724B #x724E + #x724F #x7250 #x7251 #x7253 #x7254 #x7255 #x7257 #x7258 #x725A #x725C + #x725E #x7260 #x7263 #x7264 #x7265 #x7268 #x726A #x726B #x726C #x726D + #x7270 #x7271 #x7273 #x7274 #x7276 #x7277 #x7278 #x727B #x727C #x727D + #x7282 #x7283 #x7285 #x7286 #x7287 #x7288 #x7289 #x728C #x728E #x7290 + #x7291 #x7293 #x7294 #x7295 #x7296 #x7297 #x7298 #x7299 #x729A #x729B + #x729C #x729D #x729E #x72A0 #x72A1 #x72A2 #x72A3 #x72A4 #x72A5 #x72A6 + #x72A7 #x72A8 #x72A9 #x72AA #x72AB #x72AE #x72B1 #x72B2 #x72B3 #x72B5 + #x72BA #x72BB #x72BC #x72BD #x72BE #x72BF #x72C0 #x72C5 #x72C6 #x72C7 + #x72C9 #x72CA #x72CB #x72CC #x72CF #x72D1 #x72D3 #x72D4 #x72D5 #x72D6 + #x72D8 #x72DA #x72DB #x72DC #x72DD #x72DF #x72E2 #x72E3 #x72E4 #x72E5 + #x72E6 #x72E7 #x72EA #x72EB #x72F5 #x72F6 #x72F9 #x72FD #x72FE #x72FF + #x7300 #x7302 #x7304 #x7305 #x7306 #x7307 #x7308 #x7309 #x730B #x730C + #x730D #x730F #x7310 #x7311 #x7312 #x7314 #x7318 #x7319 #x731A #x731F + #x7320 #x7323 #x7324 #x7326 #x7327 #x7328 #x732D #x732F #x7330 #x7332 + #x7333 #x7335 #x7336 #x733A #x733B #x733C #x733D #x7340 #x7341 #x7342 + #x7343 #x7344 #x7345 #x7346 #x7347 #x7348 #x7349 #x734A #x734B #x734C + #x734E #x734F #x7351 #x7353 #x7354 #x7355 #x7356 #x7358 #x7359 #x735A + #x735B #x735C #x735D #x735E #x735F #x7361 #x7362 #x7363 #x7364 #x7365 + #x7366 #x7367 #x7368 #x7369 #x736A #x736B #x736E #x7370 #x7371 #x7372 + #x7373 #x7374 #x7375 #x7376 #x7377 #x7378 #x7379 #x737A #x737B #x737C + #x737D #x737F #x7380 #x7381 #x7382 #x7383 #x7385 #x7386 #x7388 #x738A + #x738C #x738D #x738F #x7390 #x7392 #x7393 #x7394 #x7395 #x7397 #x7398 + #x7399 #x739A #x739C #x739D #x739E #x73A0 #x73A1 #x73A3 #x73A4 #x73A5 + #x73A6 #x73A7 #x73A8 #x73AA #x73AC #x73AD #x73B1 #x73B4 #x73B5 #x73B6 + #x73B8 #x73B9 #x73BC #x73BD #x73BE #x73BF #x73C1 #x73C3 #x73C4 #x73C5 + #x73C6 #x73C7 #x73CB #x73CC #x73CE #x73D2 #x73D3 #x73D4 #x73D5 #x73D6 + #x73D7 #x73D8 #x73DA #x73DB #x73DC #x73DD #x73DF #x73E1 #x73E2 #x73E3 + #x73E4 #x73E6 #x73E8 #x73EA #x73EB #x73EC #x73EE #x73EF #x73F0 #x73F1 + #x73F3 #x73F4 #x73F5 #x73F6 #x73F7 #x73F8 #x73F9 #x73FA #x73FB #x73FC + #x73FD #x73FE #x73FF #x7400 #x7401 #x7402 #x7404 #x7407 #x7408 #x740B + #x740C #x740D #x740E #x7411 #x7412 #x7413 #x7414 #x7415 #x7416 #x7417 + #x7418 #x7419 #x741C #x741D #x741E #x741F #x7420 #x7421 #x7423 #x7424 + #x7427 #x7429 #x742B #x742D #x742F #x7431 #x7432 #x7437 #x7438 #x7439 + #x743A #x743B #x743D #x743E #x743F #x7440 #x7442 #x7443 #x7444 #x7445 + #x7446 #x7447 #x7448 #x7449 #x744A #x744B #x744C #x744D #x744E #x744F + #x7450 #x7451 #x7452 #x7453 #x7454 #x7456 #x7458 #x745D #x7460 #x7461 + #x7462 #x7463 #x7464 #x7465 #x7466 #x7467 #x7468 #x7469 #x746A #x746B + #x746C #x746E #x746F #x7471 #x7472 #x7473 #x7474 #x7475 #x7478 #x7479 + #x747A #x747B #x747C #x747D #x747F #x7482 #x7484 #x7485 #x7486 #x7488 + #x7489 #x748A #x748C #x748D #x748F #x7491 #x7492 #x7493 #x7494 #x7495 + #x7496 #x7497 #x7498 #x7499 #x749A #x749B #x749D #x749F #x74A0 #x74A1 + #x74A2 #x74A3 #x74A4 #x74A5 #x74A6 #x74AA #x74AB #x74AC #x74AD #x74AE + #x74AF #x74B0 #x74B1 #x74B2 #x74B3 #x74B4 #x74B5 #x74B6 #x74B7 #x74B8 + #x74B9 #x74BB #x74BC #x74BD #x74BE #x74BF #x74C0 #x74C1 #x74C2 #x74C3 + #x74C4 #x74C5 #x74C6 #x74C7 #x74C8 #x74C9 #x74CA #x74CB #x74CC #x74CD + #x74CE #x74CF #x74D0 #x74D1 #x74D3 #x74D4 #x74D5 #x74D6 #x74D7 #x74D8 + #x74D9 #x74DA #x74DB #x74DD #x74DF #x74E1 #x74E5 #x74E7 #x74E8 #x74E9 + #x74EA #x74EB #x74EC #x74ED #x74F0 #x74F1 #x74F2 #x74F3 #x74F5 #x74F8 + #x74F9 #x74FA #x74FB #x74FC #x74FD #x74FE #x7500 #x7501 #x7502 #x7503 + #x7505 #x7506 #x7507 #x7508 #x7509 #x750A #x750B #x750C #x750E #x7510 + #x7512 #x7514 #x7515 #x7516 #x7517 #x751B #x751D #x751E #x7520 #x7521 + #x7522 #x7523 #x7524 #x7526 #x7527 #x752A #x752E #x7534 #x7536 #x7539 + #x753C #x753D #x753F #x7541 #x7542 #x7543 #x7544 #x7546 #x7547 #x7549 + #x754A #x754D #x7550 #x7551 #x7552 #x7553 #x7555 #x7556 #x7557 #x7558 + #x755D #x755E #x755F #x7560 #x7561 #x7562 #x7563 #x7564 #x7567 #x7568 + #x7569 #x756B #x756C #x756D #x756E #x756F #x7570 #x7571 #x7573 #x7575 + #x7576 #x7577 #x757A #x757B #x757C #x757D #x757E #x7580 #x7581 #x7582 + #x7584 #x7585 #x7587 #x7588 #x7589 #x758A #x758C #x758D #x758E #x7590 + #x7593 #x7595 #x7598 #x759B #x759C #x759E #x75A2 #x75A6 #x75A7 #x75A8 + #x75A9 #x75AA #x75AD #x75B6 #x75B7 #x75BA #x75BB #x75BF #x75C0 #x75C1 + #x75C6 #x75CB #x75CC #x75CE #x75CF #x75D0 #x75D1 #x75D3 #x75D7 #x75D9 + #x75DA #x75DC #x75DD #x75DF #x75E0 #x75E1 #x75E5 #x75E9 #x75EC #x75ED + #x75EE #x75EF #x75F2 #x75F3 #x75F5 #x75F6 #x75F7 #x75F8 #x75FA #x75FB + #x75FD #x75FE #x7602 #x7604 #x7606 #x7607 #x7608 #x7609 #x760B #x760D + #x760E #x760F #x7611 #x7612 #x7613 #x7614 #x7616 #x761A #x761C #x761D + #x761E #x7621 #x7623 #x7627 #x7628 #x762C #x762E #x762F #x7631 #x7632 + #x7636 #x7637 #x7639 #x763A #x763B #x763D #x7641 #x7642 #x7644 #x7645 + #x7646 #x7647 #x7648 #x7649 #x764A #x764B #x764E #x764F #x7650 #x7651 + #x7652 #x7653 #x7655 #x7657 #x7658 #x7659 #x765A #x765B #x765D #x765F + #x7660 #x7661 #x7662 #x7664 #x7665 #x7666 #x7667 #x7668 #x7669 #x766A + #x766C #x766D #x766E #x7670 #x7671 #x7672 #x7673 #x7674 #x7675 #x7676 + #x7677 #x7679 #x767A #x767C #x767F #x7680 #x7681 #x7683 #x7685 #x7689 + #x768A #x768C #x768D #x768F #x7690 #x7692 #x7694 #x7695 #x7697 #x7698 + #x769A #x769B #x769C #x769D #x769E #x769F #x76A0 #x76A1 #x76A2 #x76A3 + #x76A5 #x76A6 #x76A7 #x76A8 #x76A9 #x76AA #x76AB #x76AC #x76AD #x76AF + #x76B0 #x76B3 #x76B5 #x76B6 #x76B7 #x76B8 #x76B9 #x76BA #x76BB #x76BC + #x76BD #x76BE #x76C0 #x76C1 #x76C3 #x76C4 #x76C7 #x76C9 #x76CB #x76CC + #x76D3 #x76D5 #x76D9 #x76DA #x76DC #x76DD #x76DE #x76E0 #x76E1 #x76E2 + #x76E3 #x76E4 #x76E6 #x76E7 #x76E8 #x76E9 #x76EA #x76EB #x76EC #x76ED + #x76F0 #x76F3 #x76F5 #x76F6 #x76F7 #x76FA #x76FB #x76FD #x76FF #x7700 + #x7702 #x7703 #x7705 #x7706 #x770A #x770C #x770E #x770F #x7710 #x7711 + #x7712 #x7713 #x7714 #x7715 #x7716 #x7717 #x7718 #x771B #x771C #x771D + #x771E #x7721 #x7723 #x7724 #x7725 #x7727 #x772A #x772B #x772C #x772E + #x7730 #x7731 #x7732 #x7733 #x7734 #x7739 #x773B #x773D #x773E #x773F + #x7742 #x7744 #x7745 #x7746 #x7748 #x7749 #x774A #x774B #x774C #x774D + #x774E #x774F #x7752 #x7753 #x7754 #x7755 #x7756 #x7757 #x7758 #x7759 + #x775C #x775D #x775E #x775F #x7760 #x7764 #x7767 #x7769 #x776A #x776D + #x776E #x776F #x7770 #x7771 #x7772 #x7773 #x7774 #x7775 #x7776 #x7777 + #x7778 #x777A #x777B #x777C #x7781 #x7782 #x7783 #x7786 #x7787 #x7788 + #x7789 #x778A #x778B #x778F #x7790 #x7793 #x7794 #x7795 #x7796 #x7797 + #x7798 #x7799 #x779A #x779B #x779C #x779D #x779E #x77A1 #x77A3 #x77A4 + #x77A6 #x77A8 #x77AB #x77AD #x77AE #x77AF #x77B1 #x77B2 #x77B4 #x77B6 + #x77B7 #x77B8 #x77B9 #x77BA #x77BC #x77BE #x77C0 #x77C1 #x77C2 #x77C3 + #x77C4 #x77C5 #x77C6 #x77C7 #x77C8 #x77C9 #x77CA #x77CB #x77CC #x77CE + #x77CF #x77D0 #x77D1 #x77D2 #x77D3 #x77D4 #x77D5 #x77D6 #x77D8 #x77D9 + #x77DA #x77DD #x77DE #x77DF #x77E0 #x77E1 #x77E4 #x77E6 #x77E8 #x77EA + #x77EF #x77F0 #x77F1 #x77F2 #x77F4 #x77F5 #x77F7 #x77F9 #x77FA #x77FB + #x77FC #x7803 #x7804 #x7805 #x7806 #x7807 #x7808 #x780A #x780B #x780E + #x780F #x7810 #x7813 #x7815 #x7819 #x781B #x781E #x7820 #x7821 #x7822 + #x7824 #x7828 #x782A #x782B #x782E #x782F #x7831 #x7832 #x7833 #x7835 + #x7836 #x783D #x783F #x7841 #x7842 #x7843 #x7844 #x7846 #x7848 #x7849 + #x784A #x784B #x784D #x784F #x7851 #x7853 #x7854 #x7858 #x7859 #x785A + #x785B #x785C #x785E #x785F #x7860 #x7861 #x7862 #x7863 #x7864 #x7865 + #x7866 #x7867 #x7868 #x7869 #x786F #x7870 #x7871 #x7872 #x7873 #x7874 + #x7875 #x7876 #x7878 #x7879 #x787A #x787B #x787D #x787E #x787F #x7880 + #x7881 #x7882 #x7883 #x7884 #x7885 #x7886 #x7888 #x788A #x788B #x788F + #x7890 #x7892 #x7894 #x7895 #x7896 #x7899 #x789D #x789E #x78A0 #x78A2 + #x78A4 #x78A6 #x78A8 #x78A9 #x78AA #x78AB #x78AC #x78AD #x78AE #x78AF + #x78B5 #x78B6 #x78B7 #x78B8 #x78BA #x78BB #x78BC #x78BD #x78BF #x78C0 + #x78C2 #x78C3 #x78C4 #x78C6 #x78C7 #x78C8 #x78CC #x78CD #x78CE #x78CF + #x78D1 #x78D2 #x78D3 #x78D6 #x78D7 #x78D8 #x78DA #x78DB #x78DC #x78DD + #x78DE #x78DF #x78E0 #x78E1 #x78E2 #x78E3 #x78E4 #x78E5 #x78E6 #x78E7 + #x78E9 #x78EA #x78EB #x78ED #x78EE #x78EF #x78F0 #x78F1 #x78F3 #x78F5 + #x78F6 #x78F8 #x78F9 #x78FB #x78FC #x78FD #x78FE #x78FF #x7900 #x7902 + #x7903 #x7904 #x7906 #x7907 #x7908 #x7909 #x790A #x790B #x790C #x790D + #x790E #x790F #x7910 #x7911 #x7912 #x7914 #x7915 #x7916 #x7917 #x7918 + #x7919 #x791A #x791B #x791C #x791D #x791F #x7920 #x7921 #x7922 #x7923 + #x7925 #x7926 #x7927 #x7928 #x7929 #x792A #x792B #x792C #x792D #x792E + #x792F #x7930 #x7931 #x7932 #x7933 #x7935 #x7936 #x7937 #x7938 #x7939 + #x793D #x793F #x7942 #x7943 #x7944 #x7945 #x7947 #x794A #x794B #x794C + #x794D #x794E #x794F #x7950 #x7951 #x7952 #x7954 #x7955 #x7958 #x7959 + #x7961 #x7963 #x7964 #x7966 #x7969 #x796A #x796B #x796C #x796E #x7970 + #x7971 #x7972 #x7973 #x7974 #x7975 #x7976 #x7979 #x797B #x797C #x797D + #x797E #x797F #x7982 #x7983 #x7986 #x7987 #x7988 #x7989 #x798B #x798C + #x798D #x798E #x7990 #x7991 #x7992 #x7993 #x7994 #x7995 #x7996 #x7997 + #x7998 #x7999 #x799B #x799C #x799D #x799E #x799F #x79A0 #x79A1 #x79A2 + #x79A3 #x79A4 #x79A5 #x79A6 #x79A8 #x79A9 #x79AA #x79AB #x79AC #x79AD + #x79AE #x79AF #x79B0 #x79B1 #x79B2 #x79B4 #x79B5 #x79B6 #x79B7 #x79B8 + #x79BC #x79BF #x79C2 #x79C4 #x79C5 #x79C7 #x79C8 #x79CA #x79CC #x79CE + #x79CF #x79D0 #x79D3 #x79D4 #x79D6 #x79D7 #x79D9 #x79DA #x79DB #x79DC + #x79DD #x79DE #x79E0 #x79E1 #x79E2 #x79E5 #x79E8 #x79EA #x79EC #x79EE + #x79F1 #x79F2 #x79F3 #x79F4 #x79F5 #x79F6 #x79F7 #x79F9 #x79FA #x79FC + #x79FE #x79FF #x7A01 #x7A04 #x7A05 #x7A07 #x7A08 #x7A09 #x7A0A #x7A0C + #x7A0F #x7A10 #x7A11 #x7A12 #x7A13 #x7A15 #x7A16 #x7A18 #x7A19 #x7A1B + #x7A1C #x7A1D #x7A1F #x7A21 #x7A22 #x7A24 #x7A25 #x7A26 #x7A27 #x7A28 + #x7A29 #x7A2A #x7A2B #x7A2C #x7A2D #x7A2E #x7A2F #x7A30 #x7A31 #x7A32 + #x7A34 #x7A35 #x7A36 #x7A38 #x7A3A #x7A3E #x7A40 #x7A41 #x7A42 #x7A43 + #x7A44 #x7A45 #x7A47 #x7A48 #x7A49 #x7A4A #x7A4B #x7A4C #x7A4D #x7A4E + #x7A4F #x7A50 #x7A52 #x7A53 #x7A54 #x7A55 #x7A56 #x7A58 #x7A59 #x7A5A + #x7A5B #x7A5C #x7A5D #x7A5E #x7A5F #x7A60 #x7A61 #x7A62 #x7A63 #x7A64 + #x7A65 #x7A66 #x7A67 #x7A68 #x7A69 #x7A6A #x7A6B #x7A6C #x7A6D #x7A6E + #x7A6F #x7A71 #x7A72 #x7A73 #x7A75 #x7A7B #x7A7C #x7A7D #x7A7E #x7A82 + #x7A85 #x7A87 #x7A89 #x7A8A #x7A8B #x7A8C #x7A8E #x7A8F #x7A90 #x7A93 + #x7A94 #x7A99 #x7A9A #x7A9B #x7A9E #x7AA1 #x7AA2 #x7AA3 #x7AA4 #x7AA7 + #x7AA9 #x7AAA #x7AAB #x7AAE #x7AAF #x7AB0 #x7AB1 #x7AB2 #x7AB4 #x7AB5 + #x7AB6 #x7AB7 #x7AB8 #x7AB9 #x7ABA #x7ABB #x7ABC #x7ABD #x7ABE #x7AC0 + #x7AC1 #x7AC2 #x7AC3 #x7AC4 #x7AC5 #x7AC6 #x7AC7 #x7AC8 #x7AC9 #x7ACA + #x7ACC #x7ACD #x7ACE #x7ACF #x7AD0 #x7AD1 #x7AD2 #x7AD3 #x7AD4 #x7AD5 + #x7AD7 #x7AD8 #x7ADA #x7ADB #x7ADC #x7ADD #x7AE1 #x7AE2 #x7AE4 #x7AE7 + #x7AE8 #x7AE9 #x7AEA #x7AEB #x7AEC #x7AEE #x7AF0 #x7AF1 #x7AF2 #x7AF3 + #x7AF4 #x7AF5 #x7AF6 #x7AF7 #x7AF8 #x7AFB #x7AFC #x7AFE #x7B00 #x7B01 + #x7B02 #x7B05 #x7B07 #x7B09 #x7B0C #x7B0D #x7B0E #x7B10 #x7B12 #x7B13 + #x7B16 #x7B17 #x7B18 #x7B1A #x7B1C #x7B1D #x7B1F #x7B21 #x7B22 #x7B23 + #x7B27 #x7B29 #x7B2D #x7B2F #x7B30 #x7B32 #x7B34 #x7B35 #x7B36 #x7B37 + #x7B39 #x7B3B #x7B3D #x7B3F #x7B40 #x7B41 #x7B42 #x7B43 #x7B44 #x7B46 + #x7B48 #x7B4A #x7B4D #x7B4E #x7B53 #x7B55 #x7B57 #x7B59 #x7B5C #x7B5E + #x7B5F #x7B61 #x7B63 #x7B64 #x7B65 #x7B66 #x7B67 #x7B68 #x7B69 #x7B6A + #x7B6B #x7B6C #x7B6D #x7B6F #x7B70 #x7B73 #x7B74 #x7B76 #x7B78 #x7B7A + #x7B7C #x7B7D #x7B7F #x7B81 #x7B82 #x7B83 #x7B84 #x7B86 #x7B87 #x7B88 + #x7B89 #x7B8A #x7B8B #x7B8C #x7B8E #x7B8F #x7B91 #x7B92 #x7B93 #x7B96 + #x7B98 #x7B99 #x7B9A #x7B9B #x7B9E #x7B9F #x7BA0 #x7BA3 #x7BA4 #x7BA5 + #x7BAE #x7BAF #x7BB0 #x7BB2 #x7BB3 #x7BB5 #x7BB6 #x7BB7 #x7BB9 #x7BBA + #x7BBB #x7BBC #x7BBD #x7BBE #x7BBF #x7BC0 #x7BC2 #x7BC3 #x7BC4 #x7BC5 + #x7BC8 #x7BC9 #x7BCA #x7BCB #x7BCD #x7BCE #x7BCF #x7BD0 #x7BD2 #x7BD4 + #x7BD5 #x7BD6 #x7BD7 #x7BD8 #x7BDB #x7BDC #x7BDE #x7BDF #x7BE0 #x7BE2 + #x7BE3 #x7BE4 #x7BE7 #x7BE8 #x7BE9 #x7BEB #x7BEC #x7BED #x7BEF #x7BF0 + #x7BF2 #x7BF3 #x7BF4 #x7BF5 #x7BF6 #x7BF8 #x7BF9 #x7BFA #x7BFB #x7BFD + #x7BFF #x7C00 #x7C01 #x7C02 #x7C03 #x7C04 #x7C05 #x7C06 #x7C08 #x7C09 + #x7C0A #x7C0D #x7C0E #x7C10 #x7C11 #x7C12 #x7C13 #x7C14 #x7C15 #x7C17 + #x7C18 #x7C19 #x7C1A #x7C1B #x7C1C #x7C1D #x7C1E #x7C20 #x7C21 #x7C22 + #x7C23 #x7C24 #x7C25 #x7C28 #x7C29 #x7C2B #x7C2C #x7C2D #x7C2E #x7C2F + #x7C30 #x7C31 #x7C32 #x7C33 #x7C34 #x7C35 #x7C36 #x7C37 #x7C39 #x7C3A + #x7C3B #x7C3C #x7C3D #x7C3E #x7C42 #x7C43 #x7C44 #x7C45 #x7C46 #x7C47 + #x7C48 #x7C49 #x7C4A #x7C4B #x7C4C #x7C4E #x7C4F #x7C50 #x7C51 #x7C52 + #x7C53 #x7C54 #x7C55 #x7C56 #x7C57 #x7C58 #x7C59 #x7C5A #x7C5B #x7C5C + #x7C5D #x7C5E #x7C5F #x7C60 #x7C61 #x7C62 #x7C63 #x7C64 #x7C65 #x7C66 + #x7C67 #x7C68 #x7C69 #x7C6A #x7C6B #x7C6C #x7C6D #x7C6E #x7C6F #x7C70 + #x7C71 #x7C72 #x7C75 #x7C76 #x7C77 #x7C78 #x7C79 #x7C7A #x7C7E #x7C7F + #x7C80 #x7C81 #x7C82 #x7C83 #x7C84 #x7C85 #x7C86 #x7C87 #x7C88 #x7C8A + #x7C8B #x7C8C #x7C8D #x7C8E #x7C8F #x7C90 #x7C93 #x7C94 #x7C96 #x7C99 + #x7C9A #x7C9B #x7CA0 #x7CA1 #x7CA3 #x7CA6 #x7CA7 #x7CA8 #x7CA9 #x7CAB + #x7CAC #x7CAD #x7CAF #x7CB0 #x7CB4 #x7CB5 #x7CB6 #x7CB7 #x7CB8 #x7CBA + #x7CBB #x7CBF #x7CC0 #x7CC2 #x7CC3 #x7CC4 #x7CC6 #x7CC9 #x7CCB #x7CCE + #x7CCF #x7CD0 #x7CD1 #x7CD2 #x7CD3 #x7CD4 #x7CD8 #x7CDA #x7CDB #x7CDD + #x7CDE #x7CE1 #x7CE2 #x7CE3 #x7CE4 #x7CE5 #x7CE6 #x7CE7 #x7CE9 #x7CEA + #x7CEB #x7CEC #x7CED #x7CEE #x7CF0 #x7CF1 #x7CF2 #x7CF3 #x7CF4 #x7CF5 + #x7CF6 #x7CF7 #x7CF9 #x7CFA #x7CFC #x7CFD #x7CFE #x7CFF #x7D00 #x7D01 + #x7D02 #x7D03 #x7D04 #x7D05 #x7D06 #x7D07 #x7D08 #x7D09 #x7D0B #x7D0C + #x7D0D #x7D0E #x7D0F #x7D10 #x7D11 #x7D12 #x7D13 #x7D14 #x7D15 #x7D16 + #x7D17 #x7D18 #x7D19 #x7D1A #x7D1B #x7D1C #x7D1D #x7D1E #x7D1F #x7D21 + #x7D23 #x7D24 #x7D25 #x7D26 #x7D28 #x7D29 #x7D2A #x7D2C #x7D2D #x7D2E + #x7D30 #x7D31 #x7D32 #x7D33 #x7D34 #x7D35 #x7D36 #x7D37 #x7D38 #x7D39 + #x7D3A #x7D3B #x7D3C #x7D3D #x7D3E #x7D3F #x7D40 #x7D41 #x7D42 #x7D43 + #x7D44 #x7D45 #x7D46 #x7D47 #x7D48 #x7D49 #x7D4A #x7D4B #x7D4C #x7D4D + #x7D4E #x7D4F #x7D50 #x7D51 #x7D52 #x7D53 #x7D54 #x7D55 #x7D56 #x7D57 + #x7D58 #x7D59 #x7D5A #x7D5B #x7D5C #x7D5D #x7D5E #x7D5F #x7D60 #x7D61 + #x7D62 #x7D63 #x7D64 #x7D65 #x7D66 #x7D67 #x7D68 #x7D69 #x7D6A #x7D6B + #x7D6C #x7D6D #x7D6F #x7D70 #x7D71 #x7D72 #x7D73 #x7D74 #x7D75 #x7D76 + #x7D78 #x7D79 #x7D7A #x7D7B #x7D7C #x7D7D #x7D7E #x7D7F #x7D80 #x7D81 + #x7D82 #x7D83 #x7D84 #x7D85 #x7D86 #x7D87 #x7D88 #x7D89 #x7D8A #x7D8B + #x7D8C #x7D8D #x7D8E #x7D8F #x7D90 #x7D91 #x7D92 #x7D93 #x7D94 #x7D95 + #x7D96 #x7D97 #x7D98 #x7D99 #x7D9A #x7D9B #x7D9C #x7D9D #x7D9E #x7D9F + #x7DA0 #x7DA1 #x7DA2 #x7DA3 #x7DA4 #x7DA5 #x7DA7 #x7DA8 #x7DA9 #x7DAA + #x7DAB #x7DAC #x7DAD #x7DAF #x7DB0 #x7DB1 #x7DB2 #x7DB3 #x7DB4 #x7DB5 + #x7DB6 #x7DB7 #x7DB8 #x7DB9 #x7DBA #x7DBB #x7DBC #x7DBD #x7DBE #x7DBF + #x7DC0 #x7DC1 #x7DC2 #x7DC3 #x7DC4 #x7DC5 #x7DC6 #x7DC7 #x7DC8 #x7DC9 + #x7DCA #x7DCB #x7DCC #x7DCD #x7DCE #x7DCF #x7DD0 #x7DD1 #x7DD2 #x7DD3 + #x7DD4 #x7DD5 #x7DD6 #x7DD7 #x7DD8 #x7DD9 #x7DDA #x7DDB #x7DDC #x7DDD + #x7DDE #x7DDF #x7DE0 #x7DE1 #x7DE2 #x7DE3 #x7DE4 #x7DE5 #x7DE6 #x7DE7 + #x7DE8 #x7DE9 #x7DEA #x7DEB #x7DEC #x7DED #x7DEE #x7DEF #x7DF0 #x7DF1 + #x7DF2 #x7DF3 #x7DF4 #x7DF5 #x7DF6 #x7DF7 #x7DF8 #x7DF9 #x7DFA #x7DFB + #x7DFC #x7DFD #x7DFE #x7DFF #x7E00 #x7E01 #x7E02 #x7E03 #x7E04 #x7E05 + #x7E06 #x7E07 #x7E08 #x7E09 #x7E0A #x7E0B #x7E0C #x7E0D #x7E0E #x7E0F + #x7E10 #x7E11 #x7E12 #x7E13 #x7E14 #x7E15 #x7E16 #x7E17 #x7E18 #x7E19 + #x7E1A #x7E1B #x7E1C #x7E1D #x7E1E #x7E1F #x7E20 #x7E21 #x7E22 #x7E23 + #x7E24 #x7E25 #x7E26 #x7E27 #x7E28 #x7E29 #x7E2A #x7E2B #x7E2C #x7E2D + #x7E2E #x7E2F #x7E30 #x7E31 #x7E32 #x7E33 #x7E34 #x7E35 #x7E36 #x7E37 + #x7E38 #x7E39 #x7E3A #x7E3C #x7E3D #x7E3E #x7E3F #x7E40 #x7E42 #x7E43 + #x7E44 #x7E45 #x7E46 #x7E48 #x7E49 #x7E4A #x7E4B #x7E4C #x7E4D #x7E4E + #x7E4F #x7E50 #x7E51 #x7E52 #x7E53 #x7E54 #x7E55 #x7E56 #x7E57 #x7E58 + #x7E59 #x7E5A #x7E5B #x7E5C #x7E5D #x7E5E #x7E5F #x7E60 #x7E61 #x7E62 + #x7E63 #x7E64 #x7E65 #x7E66 #x7E67 #x7E68 #x7E69 #x7E6A #x7E6B #x7E6C + #x7E6D #x7E6E #x7E6F #x7E70 #x7E71 #x7E72 #x7E73 #x7E74 #x7E75 #x7E76 + #x7E77 #x7E78 #x7E79 #x7E7A #x7E7B #x7E7C #x7E7D #x7E7E #x7E7F #x7E80 + #x7E81 #x7E83 #x7E84 #x7E85 #x7E86 #x7E87 #x7E88 #x7E89 #x7E8A #x7E8B + #x7E8C #x7E8D #x7E8E #x7E8F #x7E90 #x7E91 #x7E92 #x7E93 #x7E94 #x7E95 + #x7E96 #x7E97 #x7E98 #x7E99 #x7E9A #x7E9C #x7E9D #x7E9E #x7EAE #x7EB4 + #x7EBB #x7EBC #x7ED6 #x7EE4 #x7EEC #x7EF9 #x7F0A #x7F10 #x7F1E #x7F37 + #x7F39 #x7F3B #x7F3C #x7F3D #x7F3E #x7F3F #x7F40 #x7F41 #x7F43 #x7F46 + #x7F47 #x7F48 #x7F49 #x7F4A #x7F4B #x7F4C #x7F4D #x7F4E #x7F4F #x7F52 + #x7F53 #x7F56 #x7F59 #x7F5B #x7F5C #x7F5D #x7F5E #x7F60 #x7F63 #x7F64 + #x7F65 #x7F66 #x7F67 #x7F6B #x7F6C #x7F6D #x7F6F #x7F70 #x7F73 #x7F75 + #x7F76 #x7F77 #x7F78 #x7F7A #x7F7B #x7F7C #x7F7D #x7F7F #x7F80 #x7F82 + #x7F83 #x7F84 #x7F85 #x7F86 #x7F87 #x7F88 #x7F89 #x7F8B #x7F8D #x7F8F + #x7F90 #x7F91 #x7F92 #x7F93 #x7F95 #x7F96 #x7F97 #x7F98 #x7F99 #x7F9B + #x7F9C #x7FA0 #x7FA2 #x7FA3 #x7FA5 #x7FA6 #x7FA8 #x7FA9 #x7FAA #x7FAB + #x7FAC #x7FAD #x7FAE #x7FB1 #x7FB3 #x7FB4 #x7FB5 #x7FB6 #x7FB7 #x7FBA + #x7FBB #x7FBE #x7FC0 #x7FC2 #x7FC3 #x7FC4 #x7FC6 #x7FC7 #x7FC8 #x7FC9 + #x7FCB #x7FCD #x7FCF #x7FD0 #x7FD1 #x7FD2 #x7FD3 #x7FD6 #x7FD7 #x7FD9 + #x7FDA #x7FDB #x7FDC #x7FDD #x7FDE #x7FE2 #x7FE3 #x7FE4 #x7FE7 #x7FE8 + #x7FEA #x7FEB #x7FEC #x7FED #x7FEF #x7FF2 #x7FF4 #x7FF5 #x7FF6 #x7FF7 + #x7FF8 #x7FF9 #x7FFA #x7FFD #x7FFE #x7FFF #x8002 #x8007 #x8008 #x8009 + #x800A #x800E #x800F #x8011 #x8013 #x801A #x801B #x801D #x801E #x801F + #x8021 #x8023 #x8024 #x802B #x802C #x802D #x802E #x802F #x8030 #x8032 + #x8034 #x8039 #x803A #x803C #x803E #x8040 #x8041 #x8044 #x8045 #x8047 + #x8048 #x8049 #x804E #x804F #x8050 #x8051 #x8053 #x8055 #x8056 #x8057 + #x8059 #x805B #x805C #x805D #x805E #x805F #x8060 #x8061 #x8062 #x8063 + #x8064 #x8065 #x8066 #x8067 #x8068 #x806B #x806C #x806D #x806E #x806F + #x8070 #x8072 #x8073 #x8074 #x8075 #x8076 #x8077 #x8078 #x8079 #x807A + #x807B #x807C #x807D #x807E #x8081 #x8082 #x8085 #x8088 #x808A #x808D + #x808E #x808F #x8090 #x8091 #x8092 #x8094 #x8095 #x8097 #x8099 #x809E + #x80A3 #x80A6 #x80A7 #x80A8 #x80AC #x80B0 #x80B3 #x80B5 #x80B6 #x80B8 + #x80B9 #x80BB #x80C5 #x80C7 #x80C8 #x80C9 #x80CA #x80CB #x80CF #x80D0 + #x80D1 #x80D2 #x80D3 #x80D4 #x80D5 #x80D8 #x80DF #x80E0 #x80E2 #x80E3 + #x80E6 #x80EE #x80F5 #x80F7 #x80F9 #x80FB #x80FE #x80FF #x8100 #x8101 + #x8103 #x8104 #x8105 #x8107 #x8108 #x810B #x810C #x8115 #x8117 #x8119 + #x811B #x811C #x811D #x811F #x8120 #x8121 #x8122 #x8123 #x8124 #x8125 + #x8126 #x8127 #x8128 #x8129 #x812A #x812B #x812D #x812E #x8130 #x8133 + #x8134 #x8135 #x8137 #x8139 #x813A #x813B #x813C #x813D #x813F #x8140 + #x8141 #x8142 #x8143 #x8144 #x8145 #x8147 #x8149 #x814D #x814E #x814F + #x8152 #x8156 #x8157 #x8158 #x815B #x815C #x815D #x815E #x815F #x8161 + #x8162 #x8163 #x8164 #x8166 #x8168 #x816A #x816B #x816C #x816F #x8172 + #x8173 #x8175 #x8176 #x8177 #x8178 #x8181 #x8183 #x8184 #x8185 #x8186 + #x8187 #x8189 #x818B #x818C #x818D #x818E #x8190 #x8192 #x8193 #x8194 + #x8195 #x8196 #x8197 #x8199 #x819A #x819E #x819F #x81A0 #x81A1 #x81A2 + #x81A4 #x81A5 #x81A7 #x81A9 #x81AB #x81AC #x81AD #x81AE #x81AF #x81B0 + #x81B1 #x81B2 #x81B4 #x81B5 #x81B6 #x81B7 #x81B8 #x81B9 #x81BC #x81BD + #x81BE #x81BF #x81C4 #x81C5 #x81C7 #x81C8 #x81C9 #x81CB #x81CD #x81CE + #x81CF #x81D0 #x81D1 #x81D2 #x81D3 #x81D4 #x81D5 #x81D6 #x81D7 #x81D8 + #x81D9 #x81DA #x81DB #x81DC #x81DD #x81DE #x81DF #x81E0 #x81E1 #x81E2 + #x81E4 #x81E5 #x81E6 #x81E8 #x81E9 #x81EB #x81EE #x81EF #x81F0 #x81F1 + #x81F2 #x81F5 #x81F6 #x81F7 #x81F8 #x81F9 #x81FA #x81FD #x81FF #x8203 + #x8207 #x8208 #x8209 #x820A #x820B #x820E #x820F #x8211 #x8213 #x8215 + #x8216 #x8217 #x8218 #x8219 #x821A #x821D #x8220 #x8224 #x8225 #x8226 + #x8227 #x8229 #x822E #x8232 #x823A #x823C #x823D #x823F #x8240 #x8241 + #x8242 #x8243 #x8245 #x8246 #x8248 #x824A #x824C #x824D #x824E #x8250 + #x8251 #x8252 #x8253 #x8254 #x8255 #x8256 #x8257 #x8259 #x825B #x825C + #x825D #x825E #x8260 #x8261 #x8262 #x8263 #x8264 #x8265 #x8266 #x8267 + #x8269 #x826A #x826B #x826C #x826D #x8271 #x8275 #x8276 #x8277 #x8278 + #x827B #x827C #x8280 #x8281 #x8283 #x8285 #x8286 #x8287 #x8289 #x828C + #x8290 #x8293 #x8294 #x8295 #x8296 #x829A #x829B #x829E #x82A0 #x82A2 + #x82A3 #x82A7 #x82B2 #x82B5 #x82B6 #x82BA #x82BB #x82BC #x82BF #x82C0 + #x82C2 #x82C3 #x82C5 #x82C6 #x82C9 #x82D0 #x82D6 #x82D9 #x82DA #x82DD + #x82E2 #x82E7 #x82E8 #x82E9 #x82EA #x82EC #x82ED #x82EE #x82F0 #x82F2 + #x82F3 #x82F5 #x82F6 #x82F8 #x82FA #x82FC #x82FD #x82FE #x82FF #x8300 + #x830A #x830B #x830D #x8310 #x8312 #x8313 #x8316 #x8318 #x8319 #x831D + #x831E #x831F #x8320 #x8321 #x8322 #x8323 #x8324 #x8325 #x8326 #x8329 + #x832A #x832E #x8330 #x8332 #x8337 #x833B #x833D #x833E #x833F #x8341 + #x8342 #x8344 #x8345 #x8348 #x834A #x834B #x834C #x834D #x834E #x8353 + #x8355 #x8356 #x8357 #x8358 #x8359 #x835D #x8362 #x8370 #x8371 #x8372 + #x8373 #x8374 #x8375 #x8376 #x8379 #x837A #x837E #x837F #x8380 #x8381 + #x8382 #x8383 #x8384 #x8387 #x8388 #x838A #x838B #x838C #x838D #x838F + #x8390 #x8391 #x8394 #x8395 #x8396 #x8397 #x8399 #x839A #x839D #x839F + #x83A1 #x83A2 #x83A3 #x83A4 #x83A5 #x83A6 #x83A7 #x83AC #x83AD #x83AE + #x83AF #x83B5 #x83BB #x83BE #x83BF #x83C2 #x83C3 #x83C4 #x83C6 #x83C8 + #x83C9 #x83CB #x83CD #x83CE #x83D0 #x83D1 #x83D2 #x83D3 #x83D5 #x83D7 + #x83D9 #x83DA #x83DB #x83DE #x83E2 #x83E3 #x83E4 #x83E6 #x83E7 #x83E8 + #x83EB #x83EC #x83ED #x83EE #x83EF #x83F3 #x83F4 #x83F5 #x83F6 #x83F7 + #x83FA #x83FB #x83FC #x83FE #x83FF #x8400 #x8402 #x8405 #x8407 #x8408 + #x8409 #x840A #x8410 #x8412 #x8413 #x8414 #x8415 #x8416 #x8417 #x8419 + #x841A #x841B #x841E #x841F #x8420 #x8421 #x8422 #x8423 #x8429 #x842A + #x842B #x842C #x842D #x842E #x842F #x8430 #x8432 #x8433 #x8434 #x8435 + #x8436 #x8437 #x8439 #x843A #x843B #x843E #x843F #x8440 #x8441 #x8442 + #x8443 #x8444 #x8445 #x8447 #x8448 #x8449 #x844A #x844B #x844C #x844D + #x844E #x844F #x8450 #x8452 #x8453 #x8454 #x8455 #x8456 #x8458 #x845D + #x845E #x845F #x8460 #x8462 #x8464 #x8465 #x8466 #x8467 #x8468 #x846A + #x846E #x846F #x8470 #x8472 #x8474 #x8477 #x8479 #x847B #x847C #x847D + #x847E #x847F #x8480 #x8481 #x8483 #x8484 #x8485 #x8486 #x848A #x848D + #x848F #x8490 #x8491 #x8492 #x8493 #x8494 #x8495 #x8496 #x8498 #x849A + #x849B #x849D #x849E #x849F #x84A0 #x84A2 #x84A3 #x84A4 #x84A5 #x84A6 + #x84A7 #x84A8 #x84A9 #x84AA #x84AB #x84AC #x84AD #x84AE #x84B0 #x84B1 + #x84B3 #x84B5 #x84B6 #x84B7 #x84BB #x84BC #x84BE #x84C0 #x84C2 #x84C3 + #x84C5 #x84C6 #x84C7 #x84C8 #x84CB #x84CC #x84CE #x84CF #x84D2 #x84D4 + #x84D5 #x84D7 #x84D8 #x84D9 #x84DA #x84DB #x84DC #x84DE #x84E1 #x84E2 + #x84E4 #x84E7 #x84E8 #x84E9 #x84EA #x84EB #x84ED #x84EE #x84EF #x84F1 + #x84F2 #x84F3 #x84F4 #x84F5 #x84F6 #x84F7 #x84F8 #x84F9 #x84FA #x84FB + #x84FD #x84FE #x8500 #x8501 #x8502 #x8503 #x8504 #x8505 #x8506 #x8507 + #x8508 #x8509 #x850A #x850B #x850D #x850E #x850F #x8510 #x8512 #x8514 + #x8515 #x8516 #x8518 #x8519 #x851B #x851C #x851D #x851E #x8520 #x8522 + #x8523 #x8524 #x8525 #x8526 #x8527 #x8528 #x8529 #x852A #x852D #x852E + #x852F #x8530 #x8531 #x8532 #x8533 #x8534 #x8535 #x8536 #x853E #x853F + #x8540 #x8541 #x8542 #x8544 #x8545 #x8546 #x8547 #x854B #x854C #x854D + #x854E #x854F #x8550 #x8551 #x8552 #x8553 #x8554 #x8555 #x8557 #x8558 + #x855A #x855B #x855C #x855D #x855F #x8560 #x8561 #x8562 #x8563 #x8565 + #x8566 #x8567 #x8569 #x856A #x856B #x856C #x856D #x856E #x856F #x8570 + #x8571 #x8573 #x8575 #x8576 #x8577 #x8578 #x857C #x857D #x857F #x8580 + #x8581 #x8582 #x8583 #x8586 #x8588 #x8589 #x858A #x858B #x858C #x858D + #x858E #x8590 #x8591 #x8592 #x8593 #x8594 #x8595 #x8596 #x8597 #x8598 + #x8599 #x859A #x859D #x859E #x859F #x85A0 #x85A1 #x85A2 #x85A3 #x85A5 + #x85A6 #x85A7 #x85A9 #x85AB #x85AC #x85AD #x85B1 #x85B2 #x85B3 #x85B4 + #x85B5 #x85B6 #x85B8 #x85BA #x85BB #x85BC #x85BD #x85BE #x85BF #x85C0 + #x85C2 #x85C3 #x85C4 #x85C5 #x85C6 #x85C7 #x85C8 #x85CA #x85CB #x85CC + #x85CD #x85CE #x85D1 #x85D2 #x85D4 #x85D6 #x85D7 #x85D8 #x85D9 #x85DA + #x85DB #x85DD #x85DE #x85DF #x85E0 #x85E1 #x85E2 #x85E3 #x85E5 #x85E6 + #x85E7 #x85E8 #x85EA #x85EB #x85EC #x85ED #x85EE #x85EF #x85F0 #x85F1 + #x85F2 #x85F3 #x85F4 #x85F5 #x85F6 #x85F7 #x85F8 #x85F9 #x85FA #x85FC + #x85FD #x85FE #x8600 #x8601 #x8602 #x8603 #x8604 #x8606 #x8607 #x8608 + #x8609 #x860A #x860B #x860C #x860D #x860E #x860F #x8610 #x8612 #x8613 + #x8614 #x8615 #x8617 #x8618 #x8619 #x861A #x861B #x861C #x861D #x861E + #x861F #x8620 #x8621 #x8622 #x8623 #x8624 #x8625 #x8626 #x8628 #x862A + #x862B #x862C #x862D #x862E #x862F #x8630 #x8631 #x8632 #x8633 #x8634 + #x8635 #x8636 #x8637 #x8639 #x863A #x863B #x863D #x863E #x863F #x8640 + #x8641 #x8642 #x8643 #x8644 #x8645 #x8646 #x8647 #x8648 #x8649 #x864A + #x864B #x864C #x8652 #x8653 #x8655 #x8656 #x8657 #x8658 #x8659 #x865B + #x865C #x865D #x865F #x8660 #x8661 #x8663 #x8664 #x8665 #x8666 #x8667 + #x8668 #x8669 #x866A #x866D #x866F #x8670 #x8672 #x8673 #x8674 #x8675 + #x8676 #x8677 #x8678 #x8683 #x8684 #x8685 #x8686 #x8687 #x8688 #x8689 + #x868E #x868F #x8690 #x8691 #x8692 #x8694 #x8696 #x8697 #x8698 #x8699 + #x869A #x869B #x869E #x869F #x86A0 #x86A1 #x86A2 #x86A5 #x86A6 #x86AB + #x86AD #x86AE #x86B2 #x86B3 #x86B7 #x86B8 #x86B9 #x86BB #x86BC #x86BD + #x86BE #x86BF #x86C1 #x86C2 #x86C3 #x86C5 #x86C8 #x86CC #x86CD #x86D2 + #x86D3 #x86D5 #x86D6 #x86D7 #x86DA #x86DC #x86DD #x86E0 #x86E1 #x86E2 + #x86E3 #x86E5 #x86E6 #x86E7 #x86E8 #x86EA #x86EB #x86EC #x86EF #x86F5 + #x86F6 #x86F7 #x86FA #x86FB #x86FC #x86FD #x86FF #x8701 #x8704 #x8705 + #x8706 #x870B #x870C #x870E #x870F #x8710 #x8711 #x8714 #x8716 #x8719 + #x871B #x871D #x871F #x8720 #x8724 #x8726 #x8727 #x8728 #x872A #x872B + #x872C #x872D #x872F #x8730 #x8732 #x8733 #x8735 #x8736 #x8738 #x8739 + #x873A #x873C #x873D #x8740 #x8741 #x8742 #x8743 #x8744 #x8745 #x8746 + #x874A #x874B #x874D #x874F #x8750 #x8751 #x8752 #x8754 #x8755 #x8756 + #x8758 #x875A #x875B #x875C #x875D #x875E #x875F #x8761 #x8762 #x8766 + #x8767 #x8768 #x8769 #x876A #x876B #x876C #x876D #x876F #x8771 #x8772 + #x8773 #x8775 #x8777 #x8778 #x8779 #x877A #x877F #x8780 #x8781 #x8784 + #x8786 #x8787 #x8789 #x878A #x878C #x878E #x878F #x8790 #x8791 #x8792 + #x8794 #x8795 #x8796 #x8798 #x8799 #x879A #x879B #x879C #x879D #x879E + #x87A0 #x87A1 #x87A2 #x87A3 #x87A4 #x87A5 #x87A6 #x87A7 #x87A9 #x87AA + #x87AE #x87B0 #x87B1 #x87B2 #x87B4 #x87B6 #x87B7 #x87B8 #x87B9 #x87BB + #x87BC #x87BE #x87BF #x87C1 #x87C2 #x87C3 #x87C4 #x87C5 #x87C7 #x87C8 + #x87C9 #x87CC #x87CD #x87CE #x87CF #x87D0 #x87D4 #x87D5 #x87D6 #x87D7 + #x87D8 #x87D9 #x87DA #x87DC #x87DD #x87DE #x87DF #x87E1 #x87E2 #x87E3 + #x87E4 #x87E6 #x87E7 #x87E8 #x87E9 #x87EB #x87EC #x87ED #x87EF #x87F0 + #x87F1 #x87F2 #x87F3 #x87F4 #x87F5 #x87F6 #x87F7 #x87F8 #x87FA #x87FB + #x87FC #x87FD #x87FF #x8800 #x8801 #x8802 #x8804 #x8805 #x8806 #x8807 + #x8808 #x8809 #x880B #x880C #x880D #x880E #x880F #x8810 #x8811 #x8812 + #x8814 #x8817 #x8818 #x8819 #x881A #x881C #x881D #x881E #x881F #x8820 + #x8823 #x8824 #x8825 #x8826 #x8827 #x8828 #x8829 #x882A #x882B #x882C + #x882D #x882E #x882F #x8830 #x8831 #x8833 #x8834 #x8835 #x8836 #x8837 + #x8838 #x883A #x883B #x883D #x883E #x883F #x8841 #x8842 #x8843 #x8846 + #x8847 #x8848 #x8849 #x884A #x884B #x884E #x884F #x8850 #x8851 #x8852 + #x8853 #x8855 #x8856 #x8858 #x885A #x885B #x885C #x885D #x885E #x885F + #x8860 #x8866 #x8867 #x886A #x886D #x886F #x8871 #x8873 #x8874 #x8875 + #x8876 #x8878 #x8879 #x887A #x887B #x887C #x8880 #x8883 #x8886 #x8887 + #x8889 #x888A #x888C #x888E #x888F #x8890 #x8891 #x8893 #x8894 #x8895 + #x8897 #x8898 #x8899 #x889A #x889B #x889D #x889E #x889F #x88A0 #x88A1 + #x88A3 #x88A5 #x88A6 #x88A7 #x88A8 #x88A9 #x88AA #x88AC #x88AE #x88AF + #x88B0 #x88B2 #x88B3 #x88B4 #x88B5 #x88B6 #x88B8 #x88B9 #x88BA #x88BB + #x88BD #x88BE #x88BF #x88C0 #x88C3 #x88C4 #x88C7 #x88C8 #x88CA #x88CB + #x88CC #x88CD #x88CF #x88D0 #x88D1 #x88D3 #x88D6 #x88D7 #x88DA #x88DB + #x88DC #x88DD #x88DE #x88E0 #x88E1 #x88E6 #x88E7 #x88E9 #x88EA #x88EB + #x88EC #x88ED #x88EE #x88EF #x88F2 #x88F5 #x88F6 #x88F7 #x88FA #x88FB + #x88FD #x88FF #x8900 #x8901 #x8903 #x8904 #x8905 #x8906 #x8907 #x8908 + #x8909 #x890B #x890C #x890D #x890E #x890F #x8911 #x8914 #x8915 #x8916 + #x8917 #x8918 #x891C #x891D #x891E #x891F #x8920 #x8922 #x8923 #x8924 + #x8926 #x8927 #x8928 #x8929 #x892C #x892D #x892E #x892F #x8931 #x8932 + #x8933 #x8935 #x8937 #x8938 #x8939 #x893A #x893B #x893C #x893D #x893E + #x893F #x8940 #x8942 #x8943 #x8945 #x8946 #x8947 #x8948 #x8949 #x894A + #x894B #x894C #x894D #x894E #x894F #x8950 #x8951 #x8952 #x8953 #x8954 + #x8955 #x8956 #x8957 #x8958 #x8959 #x895A #x895B #x895C #x895D #x8960 + #x8961 #x8962 #x8963 #x8964 #x8965 #x8967 #x8968 #x8969 #x896A #x896B + #x896C #x896D #x896E #x896F #x8970 #x8971 #x8972 #x8973 #x8974 #x8975 + #x8976 #x8977 #x8978 #x8979 #x897A #x897C #x897D #x897E #x8980 #x8982 + #x8984 #x8985 #x8987 #x8988 #x8989 #x898A #x898B #x898C #x898D #x898E + #x898F #x8990 #x8991 #x8992 #x8993 #x8994 #x8995 #x8996 #x8997 #x8998 + #x8999 #x899A #x899B #x899C #x899D #x899E #x899F #x89A0 #x89A1 #x89A2 + #x89A3 #x89A4 #x89A5 #x89A6 #x89A7 #x89A8 #x89A9 #x89AA #x89AB #x89AC + #x89AD #x89AE #x89AF #x89B0 #x89B1 #x89B2 #x89B3 #x89B4 #x89B5 #x89B6 + #x89B7 #x89B8 #x89B9 #x89BA #x89BB #x89BC #x89BD #x89BE #x89BF #x89C0 + #x89C3 #x89CD #x89D3 #x89D4 #x89D5 #x89D7 #x89D8 #x89D9 #x89DB #x89DD + #x89DF #x89E0 #x89E1 #x89E2 #x89E4 #x89E7 #x89E8 #x89E9 #x89EA #x89EC + #x89ED #x89EE #x89F0 #x89F1 #x89F2 #x89F4 #x89F5 #x89F6 #x89F7 #x89F8 + #x89F9 #x89FA #x89FB #x89FC #x89FD #x89FE #x89FF #x8A01 #x8A02 #x8A03 + #x8A04 #x8A05 #x8A06 #x8A08 #x8A09 #x8A0A #x8A0B #x8A0C #x8A0D #x8A0E + #x8A0F #x8A10 #x8A11 #x8A12 #x8A13 #x8A14 #x8A15 #x8A16 #x8A17 #x8A18 + #x8A19 #x8A1A #x8A1B #x8A1C #x8A1D #x8A1E #x8A1F #x8A20 #x8A21 #x8A22 + #x8A23 #x8A24 #x8A25 #x8A26 #x8A27 #x8A28 #x8A29 #x8A2A #x8A2B #x8A2C + #x8A2D #x8A2E #x8A2F #x8A30 #x8A31 #x8A32 #x8A33 #x8A34 #x8A35 #x8A36 + #x8A37 #x8A38 #x8A39 #x8A3A #x8A3B #x8A3C #x8A3D #x8A3F #x8A40 #x8A41 + #x8A42 #x8A43 #x8A44 #x8A45 #x8A46 #x8A47 #x8A49 #x8A4A #x8A4B #x8A4C + #x8A4D #x8A4E #x8A4F #x8A50 #x8A51 #x8A52 #x8A53 #x8A54 #x8A55 #x8A56 + #x8A57 #x8A58 #x8A59 #x8A5A #x8A5B #x8A5C #x8A5D #x8A5E #x8A5F #x8A60 + #x8A61 #x8A62 #x8A63 #x8A64 #x8A65 #x8A66 #x8A67 #x8A68 #x8A69 #x8A6A + #x8A6B #x8A6C #x8A6D #x8A6E #x8A6F #x8A70 #x8A71 #x8A72 #x8A73 #x8A74 + #x8A75 #x8A76 #x8A77 #x8A78 #x8A7A #x8A7B #x8A7C #x8A7D #x8A7E #x8A7F + #x8A80 #x8A81 #x8A82 #x8A83 #x8A84 #x8A85 #x8A86 #x8A87 #x8A88 #x8A8B + #x8A8C #x8A8D #x8A8E #x8A8F #x8A90 #x8A91 #x8A92 #x8A94 #x8A95 #x8A96 + #x8A97 #x8A98 #x8A99 #x8A9A #x8A9B #x8A9C #x8A9D #x8A9E #x8A9F #x8AA0 + #x8AA1 #x8AA2 #x8AA3 #x8AA4 #x8AA5 #x8AA6 #x8AA7 #x8AA8 #x8AA9 #x8AAA + #x8AAB #x8AAC #x8AAD #x8AAE #x8AAF #x8AB0 #x8AB1 #x8AB2 #x8AB3 #x8AB4 + #x8AB5 #x8AB6 #x8AB7 #x8AB8 #x8AB9 #x8ABA #x8ABB #x8ABC #x8ABD #x8ABE + #x8ABF #x8AC0 #x8AC1 #x8AC2 #x8AC3 #x8AC4 #x8AC5 #x8AC6 #x8AC7 #x8AC8 + #x8AC9 #x8ACA #x8ACB #x8ACC #x8ACD #x8ACE #x8ACF #x8AD0 #x8AD1 #x8AD2 + #x8AD3 #x8AD4 #x8AD5 #x8AD6 #x8AD7 #x8AD8 #x8AD9 #x8ADA #x8ADB #x8ADC + #x8ADD #x8ADE #x8ADF #x8AE0 #x8AE1 #x8AE2 #x8AE3 #x8AE4 #x8AE5 #x8AE6 + #x8AE7 #x8AE8 #x8AE9 #x8AEA #x8AEB #x8AEC #x8AED #x8AEE #x8AEF #x8AF0 + #x8AF1 #x8AF2 #x8AF3 #x8AF4 #x8AF5 #x8AF6 #x8AF7 #x8AF8 #x8AF9 #x8AFA + #x8AFB #x8AFC #x8AFD #x8AFE #x8AFF #x8B00 #x8B01 #x8B02 #x8B03 #x8B04 + #x8B05 #x8B06 #x8B08 #x8B09 #x8B0A #x8B0B #x8B0C #x8B0D #x8B0E #x8B0F + #x8B10 #x8B11 #x8B12 #x8B13 #x8B14 #x8B15 #x8B16 #x8B17 #x8B18 #x8B19 + #x8B1A #x8B1B #x8B1C #x8B1D #x8B1E #x8B1F #x8B20 #x8B21 #x8B22 #x8B23 + #x8B24 #x8B25 #x8B27 #x8B28 #x8B29 #x8B2A #x8B2B #x8B2C #x8B2D #x8B2E + #x8B2F #x8B30 #x8B31 #x8B32 #x8B33 #x8B34 #x8B35 #x8B36 #x8B37 #x8B38 + #x8B39 #x8B3A #x8B3B #x8B3C #x8B3D #x8B3E #x8B3F #x8B40 #x8B41 #x8B42 + #x8B43 #x8B44 #x8B45 #x8B46 #x8B47 #x8B48 #x8B49 #x8B4A #x8B4B #x8B4C + #x8B4D #x8B4E #x8B4F #x8B50 #x8B51 #x8B52 #x8B53 #x8B54 #x8B55 #x8B56 + #x8B57 #x8B58 #x8B59 #x8B5A #x8B5B #x8B5C #x8B5D #x8B5E #x8B5F #x8B60 + #x8B61 #x8B62 #x8B63 #x8B64 #x8B65 #x8B67 #x8B68 #x8B69 #x8B6A #x8B6B + #x8B6D #x8B6E #x8B6F #x8B70 #x8B71 #x8B72 #x8B73 #x8B74 #x8B75 #x8B76 + #x8B77 #x8B78 #x8B79 #x8B7A #x8B7B #x8B7C #x8B7D #x8B7E #x8B7F #x8B80 + #x8B81 #x8B82 #x8B83 #x8B84 #x8B85 #x8B86 #x8B87 #x8B88 #x8B89 #x8B8A + #x8B8B #x8B8C #x8B8D #x8B8E #x8B8F #x8B90 #x8B91 #x8B92 #x8B93 #x8B94 + #x8B95 #x8B96 #x8B97 #x8B98 #x8B99 #x8B9A #x8B9B #x8B9C #x8B9D #x8B9E + #x8B9F #x8BAC #x8BB1 #x8BBB #x8BC7 #x8BD0 #x8BEA #x8C09 #x8C1E #x8C38 + #x8C39 #x8C3A #x8C3B #x8C3C #x8C3D #x8C3E #x8C3F #x8C40 #x8C42 #x8C43 + #x8C44 #x8C45 #x8C48 #x8C4A #x8C4B #x8C4D #x8C4E #x8C4F #x8C50 #x8C51 + #x8C52 #x8C53 #x8C54 #x8C56 #x8C57 #x8C58 #x8C59 #x8C5B #x8C5C #x8C5D + #x8C5E #x8C5F #x8C60 #x8C63 #x8C64 #x8C65 #x8C66 #x8C67 #x8C68 #x8C69 + #x8C6C #x8C6D #x8C6E #x8C6F #x8C70 #x8C71 #x8C72 #x8C74 #x8C75 #x8C76 + #x8C77 #x8C7B #x8C7C #x8C7D #x8C7E #x8C7F #x8C80 #x8C81 #x8C83 #x8C84 + #x8C86 #x8C87 #x8C88 #x8C8B #x8C8D #x8C8E #x8C8F #x8C90 #x8C91 #x8C92 + #x8C93 #x8C95 #x8C96 #x8C97 #x8C99 #x8C9A #x8C9B #x8C9C #x8C9D #x8C9E + #x8C9F #x8CA0 #x8CA1 #x8CA2 #x8CA3 #x8CA4 #x8CA5 #x8CA6 #x8CA7 #x8CA8 + #x8CA9 #x8CAA #x8CAB #x8CAC #x8CAD #x8CAE #x8CAF #x8CB0 #x8CB1 #x8CB2 + #x8CB3 #x8CB4 #x8CB5 #x8CB6 #x8CB7 #x8CB8 #x8CB9 #x8CBA #x8CBB #x8CBC + #x8CBD #x8CBE #x8CBF #x8CC0 #x8CC1 #x8CC2 #x8CC3 #x8CC4 #x8CC5 #x8CC6 + #x8CC7 #x8CC8 #x8CC9 #x8CCA #x8CCB #x8CCC #x8CCD #x8CCE #x8CCF #x8CD0 + #x8CD1 #x8CD2 #x8CD3 #x8CD4 #x8CD5 #x8CD6 #x8CD7 #x8CD8 #x8CD9 #x8CDA + #x8CDB #x8CDC #x8CDD #x8CDE #x8CDF #x8CE0 #x8CE1 #x8CE2 #x8CE3 #x8CE4 + #x8CE5 #x8CE6 #x8CE7 #x8CE8 #x8CE9 #x8CEA #x8CEB #x8CEC #x8CED #x8CEE + #x8CEF #x8CF0 #x8CF1 #x8CF2 #x8CF3 #x8CF4 #x8CF5 #x8CF6 #x8CF7 #x8CF8 + #x8CF9 #x8CFA #x8CFB #x8CFC #x8CFD #x8CFE #x8CFF #x8D00 #x8D01 #x8D02 + #x8D03 #x8D04 #x8D05 #x8D06 #x8D07 #x8D08 #x8D09 #x8D0A #x8D0B #x8D0C + #x8D0D #x8D0E #x8D0F #x8D10 #x8D11 #x8D12 #x8D13 #x8D14 #x8D15 #x8D16 + #x8D17 #x8D18 #x8D19 #x8D1A #x8D1B #x8D1C #x8D20 #x8D51 #x8D52 #x8D57 + #x8D5F #x8D65 #x8D68 #x8D69 #x8D6A #x8D6C #x8D6E #x8D6F #x8D71 #x8D72 + #x8D78 #x8D79 #x8D7A #x8D7B #x8D7C #x8D7D #x8D7E #x8D7F #x8D80 #x8D82 + #x8D83 #x8D86 #x8D87 #x8D88 #x8D89 #x8D8C #x8D8D #x8D8E #x8D8F #x8D90 + #x8D92 #x8D93 #x8D95 #x8D96 #x8D97 #x8D98 #x8D99 #x8D9A #x8D9B #x8D9C + #x8D9D #x8D9E #x8DA0 #x8DA1 #x8DA2 #x8DA4 #x8DA5 #x8DA6 #x8DA7 #x8DA8 + #x8DA9 #x8DAA #x8DAB #x8DAC #x8DAD #x8DAE #x8DAF #x8DB0 #x8DB2 #x8DB6 + #x8DB7 #x8DB9 #x8DBB #x8DBD #x8DC0 #x8DC1 #x8DC2 #x8DC5 #x8DC7 #x8DC8 + #x8DC9 #x8DCA #x8DCD #x8DD0 #x8DD2 #x8DD3 #x8DD4 #x8DD5 #x8DD8 #x8DD9 + #x8DDC #x8DE0 #x8DE1 #x8DE2 #x8DE5 #x8DE6 #x8DE7 #x8DE9 #x8DED #x8DEE + #x8DF0 #x8DF1 #x8DF2 #x8DF4 #x8DF6 #x8DFC #x8DFE #x8DFF #x8E00 #x8E01 + #x8E02 #x8E03 #x8E04 #x8E06 #x8E07 #x8E08 #x8E0B #x8E0D #x8E0E #x8E10 + #x8E11 #x8E12 #x8E13 #x8E15 #x8E16 #x8E17 #x8E18 #x8E19 #x8E1A #x8E1B + #x8E1C #x8E20 #x8E21 #x8E24 #x8E25 #x8E26 #x8E27 #x8E28 #x8E2B #x8E2D + #x8E30 #x8E32 #x8E33 #x8E34 #x8E36 #x8E37 #x8E38 #x8E3B #x8E3C #x8E3E + #x8E3F #x8E43 #x8E45 #x8E46 #x8E4C #x8E4D #x8E4E #x8E4F #x8E50 #x8E53 + #x8E54 #x8E55 #x8E56 #x8E57 #x8E58 #x8E5A #x8E5B #x8E5C #x8E5D #x8E5E + #x8E5F #x8E60 #x8E61 #x8E62 #x8E63 #x8E64 #x8E65 #x8E67 #x8E68 #x8E6A + #x8E6B #x8E6E #x8E71 #x8E73 #x8E75 #x8E77 #x8E78 #x8E79 #x8E7A #x8E7B + #x8E7D #x8E7E #x8E80 #x8E82 #x8E83 #x8E84 #x8E86 #x8E88 #x8E89 #x8E8A + #x8E8B #x8E8C #x8E8D #x8E8E #x8E91 #x8E92 #x8E93 #x8E95 #x8E96 #x8E97 + #x8E98 #x8E99 #x8E9A #x8E9B #x8E9D #x8E9F #x8EA0 #x8EA1 #x8EA2 #x8EA3 + #x8EA4 #x8EA5 #x8EA6 #x8EA7 #x8EA8 #x8EA9 #x8EAA #x8EAD #x8EAE #x8EB0 + #x8EB1 #x8EB3 #x8EB4 #x8EB5 #x8EB6 #x8EB7 #x8EB8 #x8EB9 #x8EBB #x8EBC + #x8EBD #x8EBE #x8EBF #x8EC0 #x8EC1 #x8EC2 #x8EC3 #x8EC4 #x8EC5 #x8EC6 + #x8EC7 #x8EC8 #x8EC9 #x8ECA #x8ECB #x8ECC #x8ECD #x8ECF #x8ED0 #x8ED1 + #x8ED2 #x8ED3 #x8ED4 #x8ED5 #x8ED6 #x8ED7 #x8ED8 #x8ED9 #x8EDA #x8EDB + #x8EDC #x8EDD #x8EDE #x8EDF #x8EE0 #x8EE1 #x8EE2 #x8EE3 #x8EE4 #x8EE5 + #x8EE6 #x8EE7 #x8EE8 #x8EE9 #x8EEA #x8EEB #x8EEC #x8EED #x8EEE #x8EEF + #x8EF0 #x8EF1 #x8EF2 #x8EF3 #x8EF4 #x8EF5 #x8EF6 #x8EF7 #x8EF8 #x8EF9 + #x8EFA #x8EFB #x8EFC #x8EFD #x8EFE #x8EFF #x8F00 #x8F01 #x8F02 #x8F03 + #x8F04 #x8F05 #x8F06 #x8F07 #x8F08 #x8F09 #x8F0A #x8F0B #x8F0C #x8F0D + #x8F0E #x8F0F #x8F10 #x8F11 #x8F12 #x8F13 #x8F14 #x8F15 #x8F16 #x8F17 + #x8F18 #x8F19 #x8F1A #x8F1B #x8F1C #x8F1D #x8F1E #x8F1F #x8F20 #x8F21 + #x8F22 #x8F23 #x8F24 #x8F25 #x8F26 #x8F27 #x8F28 #x8F29 #x8F2A #x8F2B + #x8F2C #x8F2D #x8F2E #x8F2F #x8F30 #x8F31 #x8F32 #x8F33 #x8F34 #x8F35 + #x8F36 #x8F37 #x8F38 #x8F39 #x8F3A #x8F3B #x8F3C #x8F3D #x8F3E #x8F3F + #x8F40 #x8F41 #x8F42 #x8F43 #x8F44 #x8F45 #x8F46 #x8F47 #x8F48 #x8F49 + #x8F4A #x8F4B #x8F4C #x8F4D #x8F4E #x8F4F #x8F50 #x8F51 #x8F52 #x8F53 + #x8F54 #x8F55 #x8F56 #x8F57 #x8F58 #x8F59 #x8F5A #x8F5B #x8F5C #x8F5D + #x8F5E #x8F5F #x8F60 #x8F61 #x8F62 #x8F63 #x8F64 #x8F65 #x8F6A #x8F80 + #x8F8C #x8F92 #x8F9D #x8FA0 #x8FA1 #x8FA2 #x8FA4 #x8FA5 #x8FA6 #x8FA7 + #x8FAA #x8FAC #x8FAD #x8FAE #x8FAF #x8FB2 #x8FB3 #x8FB4 #x8FB5 #x8FB7 + #x8FB8 #x8FBA #x8FBB #x8FBC #x8FBF #x8FC0 #x8FC3 #x8FC6 #x8FC9 #x8FCA + #x8FCB #x8FCC #x8FCD #x8FCF #x8FD2 #x8FD6 #x8FD7 #x8FDA #x8FE0 #x8FE1 + #x8FE3 #x8FE7 #x8FEC #x8FEF #x8FF1 #x8FF2 #x8FF4 #x8FF5 #x8FF6 #x8FFA + #x8FFB #x8FFC #x8FFE #x8FFF #x9007 #x9008 #x900C #x900E #x9013 #x9015 + #x9018 #x9019 #x901C #x9023 #x9024 #x9025 #x9027 #x9028 #x9029 #x902A + #x902B #x902C #x9030 #x9031 #x9032 #x9033 #x9034 #x9037 #x9039 #x903A + #x903D #x903F #x9040 #x9043 #x9045 #x9046 #x9048 #x9049 #x904A #x904B + #x904C #x904E #x9054 #x9055 #x9056 #x9059 #x905A #x905C #x905D #x905E + #x905F #x9060 #x9061 #x9064 #x9066 #x9067 #x9069 #x906A #x906B #x906C + #x906F #x9070 #x9071 #x9072 #x9073 #x9076 #x9077 #x9078 #x9079 #x907A + #x907B #x907C #x907E #x9081 #x9084 #x9085 #x9086 #x9087 #x9089 #x908A + #x908C #x908D #x908E #x908F #x9090 #x9092 #x9094 #x9096 #x9098 #x909A + #x909C #x909E #x909F #x90A0 #x90A4 #x90A5 #x90A7 #x90A8 #x90A9 #x90AB + #x90AD #x90B2 #x90B7 #x90BC #x90BD #x90BF #x90C0 #x90C2 #x90C3 #x90C6 + #x90C8 #x90C9 #x90CB #x90CC #x90CD #x90D2 #x90D4 #x90D5 #x90D6 #x90D8 + #x90D9 #x90DA #x90DE #x90DF #x90E0 #x90E3 #x90E4 #x90E5 #x90E9 #x90EA + #x90EC #x90EE #x90F0 #x90F1 #x90F2 #x90F3 #x90F5 #x90F6 #x90F7 #x90F9 + #x90FA #x90FB #x90FC #x90FF #x9100 #x9101 #x9103 #x9105 #x9106 #x9107 + #x9108 #x9109 #x910A #x910B #x910C #x910D #x910E #x910F #x9110 #x9111 + #x9112 #x9113 #x9114 #x9115 #x9116 #x9117 #x9118 #x911A #x911B #x911C + #x911D #x911F #x9120 #x9121 #x9124 #x9125 #x9126 #x9127 #x9128 #x9129 + #x912A #x912B #x912C #x912D #x912E #x9130 #x9132 #x9133 #x9134 #x9135 + #x9136 #x9137 #x9138 #x913A #x913B #x913C #x913D #x913E #x913F #x9140 + #x9141 #x9142 #x9144 #x9145 #x9147 #x9148 #x9151 #x9153 #x9154 #x9155 + #x9156 #x9158 #x9159 #x915B #x915C #x915F #x9160 #x9166 #x9167 #x9168 + #x916B #x916D #x9173 #x917A #x917B #x917C #x9180 #x9181 #x9182 #x9183 + #x9184 #x9186 #x9188 #x918A #x918E #x918F #x9193 #x9194 #x9195 #x9196 + #x9197 #x9198 #x9199 #x919C #x919D #x919E #x919F #x91A0 #x91A1 #x91A4 + #x91A5 #x91A6 #x91A7 #x91A8 #x91A9 #x91AB #x91AC #x91B0 #x91B1 #x91B2 + #x91B3 #x91B6 #x91B7 #x91B8 #x91B9 #x91BB #x91BC #x91BD #x91BE #x91BF + #x91C0 #x91C1 #x91C2 #x91C3 #x91C4 #x91C5 #x91C6 #x91C8 #x91CB #x91D0 + #x91D2 #x91D3 #x91D4 #x91D5 #x91D6 #x91D7 #x91D8 #x91D9 #x91DA #x91DB + #x91DD #x91DE #x91DF #x91E0 #x91E1 #x91E2 #x91E3 #x91E4 #x91E5 #x91E6 + #x91E7 #x91E8 #x91E9 #x91EA #x91EB #x91EC #x91ED #x91EE #x91EF #x91F0 + #x91F1 #x91F2 #x91F3 #x91F4 #x91F5 #x91F6 #x91F7 #x91F8 #x91F9 #x91FA + #x91FB #x91FC #x91FD #x91FE #x91FF #x9200 #x9201 #x9202 #x9203 #x9204 + #x9205 #x9206 #x9207 #x9208 #x9209 #x920A #x920B #x920C #x920D #x920E + #x920F #x9210 #x9211 #x9212 #x9213 #x9214 #x9215 #x9216 #x9217 #x9218 + #x9219 #x921A #x921B #x921C #x921D #x921E #x921F #x9220 #x9221 #x9222 + #x9223 #x9224 #x9225 #x9226 #x9227 #x9228 #x9229 #x922A #x922B #x922C + #x922D #x922E #x922F #x9230 #x9231 #x9232 #x9233 #x9234 #x9235 #x9236 + #x9237 #x9238 #x9239 #x923A #x923B #x923C #x923D #x923E #x923F #x9240 + #x9241 #x9242 #x9243 #x9244 #x9245 #x9246 #x9247 #x9248 #x9249 #x924A + #x924B #x924C #x924D #x924E #x924F #x9250 #x9251 #x9252 #x9253 #x9254 + #x9255 #x9256 #x9257 #x9258 #x9259 #x925A #x925B #x925C #x925D #x925E + #x925F #x9260 #x9261 #x9262 #x9263 #x9264 #x9265 #x9266 #x9267 #x9268 + #x9269 #x926A #x926B #x926C #x926D #x926E #x926F #x9270 #x9271 #x9272 + #x9273 #x9275 #x9276 #x9277 #x9278 #x9279 #x927A #x927B #x927C #x927D + #x927E #x927F #x9280 #x9281 #x9282 #x9283 #x9284 #x9285 #x9286 #x9287 + #x9288 #x9289 #x928A #x928B #x928C #x928D #x928F #x9290 #x9291 #x9292 + #x9293 #x9294 #x9295 #x9296 #x9297 #x9298 #x9299 #x929A #x929B #x929C + #x929D #x929E #x929F #x92A0 #x92A1 #x92A2 #x92A3 #x92A4 #x92A5 #x92A6 + #x92A7 #x92A8 #x92A9 #x92AA #x92AB #x92AC #x92AD #x92AF #x92B0 #x92B1 + #x92B2 #x92B3 #x92B4 #x92B5 #x92B6 #x92B7 #x92B8 #x92B9 #x92BA #x92BB + #x92BC #x92BD #x92BE #x92BF #x92C0 #x92C1 #x92C2 #x92C3 #x92C4 #x92C5 + #x92C6 #x92C7 #x92C9 #x92CA #x92CB #x92CC #x92CD #x92CE #x92CF #x92D0 + #x92D1 #x92D2 #x92D3 #x92D4 #x92D5 #x92D6 #x92D7 #x92D8 #x92D9 #x92DA + #x92DB #x92DC #x92DD #x92DE #x92DF #x92E0 #x92E1 #x92E2 #x92E3 #x92E4 + #x92E5 #x92E6 #x92E7 #x92E8 #x92E9 #x92EA #x92EB #x92EC #x92ED #x92EE + #x92EF #x92F0 #x92F1 #x92F2 #x92F3 #x92F4 #x92F5 #x92F6 #x92F7 #x92F8 + #x92F9 #x92FA #x92FB #x92FC #x92FD #x92FE #x92FF #x9300 #x9301 #x9302 + #x9303 #x9304 #x9305 #x9306 #x9307 #x9308 #x9309 #x930A #x930B #x930C + #x930D #x930E #x930F #x9310 #x9311 #x9312 #x9313 #x9314 #x9315 #x9316 + #x9317 #x9318 #x9319 #x931A #x931B #x931C #x931D #x931E #x931F #x9320 + #x9321 #x9322 #x9323 #x9324 #x9325 #x9326 #x9327 #x9328 #x9329 #x932A + #x932B #x932C #x932D #x932E #x932F #x9330 #x9331 #x9332 #x9333 #x9334 + #x9335 #x9336 #x9337 #x9338 #x9339 #x933A #x933B #x933C #x933D #x933F + #x9340 #x9341 #x9342 #x9343 #x9344 #x9345 #x9346 #x9347 #x9348 #x9349 + #x934A #x934B #x934C #x934D #x934E #x934F #x9350 #x9351 #x9352 #x9353 + #x9354 #x9355 #x9356 #x9357 #x9358 #x9359 #x935A #x935B #x935C #x935D + #x935E #x935F #x9360 #x9361 #x9362 #x9363 #x9364 #x9365 #x9366 #x9367 + #x9368 #x9369 #x936B #x936C #x936D #x936E #x936F #x9370 #x9371 #x9372 + #x9373 #x9374 #x9375 #x9376 #x9377 #x9378 #x9379 #x937A #x937B #x937C + #x937D #x937E #x937F #x9380 #x9381 #x9382 #x9383 #x9384 #x9385 #x9386 + #x9387 #x9388 #x9389 #x938A #x938B #x938C #x938D #x938E #x9390 #x9391 + #x9392 #x9393 #x9394 #x9395 #x9396 #x9397 #x9398 #x9399 #x939A #x939B + #x939C #x939D #x939E #x939F #x93A0 #x93A1 #x93A2 #x93A3 #x93A4 #x93A5 + #x93A6 #x93A7 #x93A8 #x93A9 #x93AA #x93AB #x93AC #x93AD #x93AE #x93AF + #x93B0 #x93B1 #x93B2 #x93B3 #x93B4 #x93B5 #x93B6 #x93B7 #x93B8 #x93B9 + #x93BA #x93BB #x93BC #x93BD #x93BE #x93BF #x93C0 #x93C1 #x93C2 #x93C3 + #x93C4 #x93C5 #x93C6 #x93C7 #x93C8 #x93C9 #x93CB #x93CC #x93CD #x93CE + #x93CF #x93D0 #x93D1 #x93D2 #x93D3 #x93D4 #x93D5 #x93D7 #x93D8 #x93D9 + #x93DA #x93DB #x93DC #x93DD #x93DE #x93DF #x93E0 #x93E1 #x93E2 #x93E3 + #x93E4 #x93E5 #x93E6 #x93E7 #x93E8 #x93E9 #x93EA #x93EB #x93EC #x93ED + #x93EE #x93EF #x93F0 #x93F1 #x93F2 #x93F3 #x93F4 #x93F5 #x93F6 #x93F7 + #x93F8 #x93F9 #x93FA #x93FB #x93FC #x93FD #x93FE #x93FF #x9400 #x9401 + #x9402 #x9403 #x9404 #x9405 #x9406 #x9407 #x9408 #x9409 #x940A #x940B + #x940C #x940D #x940E #x940F #x9410 #x9411 #x9412 #x9413 #x9414 #x9415 + #x9416 #x9417 #x9418 #x9419 #x941A #x941B #x941C #x941D #x941E #x941F + #x9420 #x9421 #x9422 #x9423 #x9424 #x9425 #x9426 #x9427 #x9428 #x9429 + #x942A #x942B #x942C #x942D #x942E #x942F #x9430 #x9431 #x9432 #x9433 + #x9434 #x9435 #x9436 #x9437 #x9438 #x9439 #x943A #x943B #x943C #x943D + #x943F #x9440 #x9441 #x9442 #x9443 #x9444 #x9445 #x9446 #x9447 #x9448 + #x9449 #x944A #x944B #x944C #x944D #x944E #x944F #x9450 #x9451 #x9452 + #x9453 #x9454 #x9455 #x9456 #x9457 #x9458 #x9459 #x945A #x945B #x945C + #x945D #x945E #x945F #x9460 #x9461 #x9462 #x9463 #x9464 #x9465 #x9466 + #x9467 #x9468 #x9469 #x946A #x946C #x946D #x946E #x946F #x9470 #x9471 + #x9472 #x9473 #x9474 #x9475 #x9476 #x9477 #x9478 #x9479 #x947A #x947B + #x947C #x947D #x947E #x947F #x9480 #x9481 #x9482 #x9483 #x9484 #x9491 + #x9496 #x9498 #x94C7 #x94CF #x94D3 #x94D4 #x94DA #x94E6 #x94FB #x951C + #x9520 #x9527 #x9533 #x953D #x9543 #x9548 #x954B #x9555 #x955A #x9560 + #x956E #x9574 #x9575 #x9577 #x9578 #x9579 #x957A #x957B #x957C #x957D + #x957E #x9580 #x9581 #x9582 #x9583 #x9584 #x9585 #x9586 #x9587 #x9588 + #x9589 #x958A #x958B #x958C #x958D #x958E #x958F #x9590 #x9591 #x9592 + #x9593 #x9594 #x9595 #x9596 #x9597 #x9598 #x9599 #x959A #x959B #x959C + #x959D #x959E #x959F #x95A0 #x95A1 #x95A2 #x95A3 #x95A4 #x95A5 #x95A6 + #x95A7 #x95A8 #x95A9 #x95AA #x95AB #x95AC #x95AD #x95AE #x95AF #x95B0 + #x95B1 #x95B2 #x95B3 #x95B4 #x95B5 #x95B6 #x95B7 #x95B8 #x95B9 #x95BA + #x95BB #x95BC #x95BD #x95BE #x95BF #x95C0 #x95C1 #x95C2 #x95C3 #x95C4 + #x95C5 #x95C6 #x95C7 #x95C8 #x95C9 #x95CA #x95CB #x95CC #x95CD #x95CE + #x95CF #x95D0 #x95D1 #x95D2 #x95D3 #x95D4 #x95D5 #x95D6 #x95D7 #x95D8 + #x95D9 #x95DA #x95DB #x95DC #x95DD #x95DE #x95DF #x95E0 #x95E1 #x95E2 + #x95E3 #x95E4 #x95E5 #x95E6 #x95E7 #x95EC #x95FF #x9607 #x9613 #x9618 + #x961B #x961E #x9620 #x9623 #x9624 #x9625 #x9626 #x9627 #x9628 #x9629 + #x962B #x962C #x962D #x962F #x9630 #x9637 #x9638 #x9639 #x963A #x963E + #x9641 #x9643 #x964A #x964E #x964F #x9651 #x9652 #x9653 #x9656 #x9657 + #x9658 #x9659 #x965A #x965C #x965D #x965E #x9660 #x9663 #x9665 #x9666 + #x966B #x966D #x966E #x966F #x9670 #x9671 #x9673 #x9678 #x9679 #x967A + #x967B #x967C #x967D #x967E #x967F #x9680 #x9681 #x9682 #x9683 #x9684 + #x9687 #x9689 #x968A #x968C #x968E #x9691 #x9692 #x9693 #x9695 #x9696 + #x969A #x969B #x969D #x969E #x969F #x96A0 #x96A1 #x96A2 #x96A3 #x96A4 + #x96A5 #x96A6 #x96A8 #x96A9 #x96AA #x96AB #x96AC #x96AD #x96AE #x96AF + #x96B1 #x96B2 #x96B4 #x96B5 #x96B7 #x96B8 #x96BA #x96BB #x96BF #x96C2 + #x96C3 #x96C8 #x96CA #x96CB #x96D0 #x96D1 #x96D3 #x96D4 #x96D6 #x96D7 + #x96D8 #x96D9 #x96DA #x96DB #x96DC #x96DD #x96DE #x96DF #x96E1 #x96E2 + #x96E3 #x96E4 #x96E5 #x96E6 #x96E7 #x96EB #x96EC #x96ED #x96EE #x96F0 + #x96F1 #x96F2 #x96F4 #x96F5 #x96F8 #x96FA #x96FB #x96FC #x96FD #x96FF + #x9702 #x9703 #x9705 #x970A #x970B #x970C #x9710 #x9711 #x9712 #x9714 + #x9715 #x9717 #x9718 #x9719 #x971A #x971B #x971D #x971F #x9720 #x9721 + #x9722 #x9723 #x9724 #x9725 #x9726 #x9727 #x9728 #x9729 #x972B #x972C + #x972E #x972F #x9731 #x9733 #x9734 #x9735 #x9736 #x9737 #x973A #x973B + #x973C #x973D #x973F #x9740 #x9741 #x9742 #x9743 #x9744 #x9745 #x9746 + #x9747 #x9748 #x9749 #x974A #x974B #x974C #x974D #x974E #x974F #x9750 + #x9751 #x9754 #x9755 #x9757 #x9758 #x975A #x975C #x975D #x975F #x9763 + #x9764 #x9766 #x9767 #x9768 #x976A #x976B #x976C #x976D #x976E #x976F + #x9770 #x9771 #x9772 #x9775 #x9777 #x9778 #x9779 #x977A #x977B #x977D + #x977E #x977F #x9780 #x9781 #x9782 #x9783 #x9784 #x9786 #x9787 #x9788 + #x9789 #x978A #x978C #x978E #x978F #x9790 #x9793 #x9795 #x9796 #x9797 + #x9799 #x979A #x979B #x979C #x979D #x979E #x979F #x97A1 #x97A2 #x97A4 + #x97A5 #x97A6 #x97A7 #x97A8 #x97A9 #x97AA #x97AC #x97AE #x97B0 #x97B1 + #x97B3 #x97B5 #x97B6 #x97B7 #x97B8 #x97B9 #x97BA #x97BB #x97BC #x97BD + #x97BE #x97BF #x97C0 #x97C1 #x97C2 #x97C3 #x97C4 #x97C5 #x97C6 #x97C7 + #x97C8 #x97C9 #x97CA #x97CB #x97CC #x97CD #x97CE #x97CF #x97D0 #x97D1 + #x97D2 #x97D3 #x97D4 #x97D5 #x97D6 #x97D7 #x97D8 #x97D9 #x97DA #x97DB + #x97DC #x97DD #x97DE #x97DF #x97E0 #x97E1 #x97E2 #x97E3 #x97E4 #x97E5 + #x97E8 #x97EE #x97EF #x97F0 #x97F1 #x97F2 #x97F4 #x97F7 #x97F8 #x97F9 + #x97FA #x97FB #x97FC #x97FD #x97FE #x97FF #x9800 #x9801 #x9802 #x9803 + #x9804 #x9805 #x9806 #x9807 #x9808 #x9809 #x980A #x980B #x980C #x980D + #x980E #x980F #x9810 #x9811 #x9812 #x9813 #x9814 #x9815 #x9816 #x9817 + #x9818 #x9819 #x981A #x981B #x981C #x981D #x981E #x981F #x9820 #x9821 + #x9822 #x9823 #x9824 #x9825 #x9826 #x9827 #x9828 #x9829 #x982A #x982B + #x982C #x982D #x982E #x982F #x9830 #x9831 #x9832 #x9833 #x9834 #x9835 + #x9836 #x9837 #x9838 #x9839 #x983A #x983B #x983C #x983D #x983E #x983F + #x9840 #x9841 #x9842 #x9843 #x9844 #x9845 #x9846 #x9847 #x9848 #x9849 + #x984A #x984B #x984C #x984D #x984E #x984F #x9850 #x9851 #x9852 #x9853 + #x9854 #x9855 #x9856 #x9857 #x9858 #x9859 #x985A #x985B #x985C #x985D + #x985E #x985F #x9860 #x9861 #x9862 #x9863 #x9864 #x9865 #x9866 #x9867 + #x9868 #x9869 #x986A #x986B #x986C #x986D #x986E #x986F #x9870 #x9871 + #x9872 #x9873 #x9874 #x988B #x988E #x9892 #x9895 #x9899 #x98A3 #x98A8 + #x98A9 #x98AA #x98AB #x98AC #x98AD #x98AE #x98AF #x98B0 #x98B1 #x98B2 + #x98B3 #x98B4 #x98B5 #x98B6 #x98B7 #x98B8 #x98B9 #x98BA #x98BB #x98BC + #x98BD #x98BE #x98BF #x98C0 #x98C1 #x98C2 #x98C3 #x98C4 #x98C5 #x98C6 + #x98C7 #x98C8 #x98C9 #x98CA #x98CB #x98CC #x98CD #x98CF #x98D0 #x98D4 + #x98D6 #x98D7 #x98DB #x98DC #x98DD #x98E0 #x98E1 #x98E2 #x98E3 #x98E4 + #x98E5 #x98E6 #x98E9 #x98EA #x98EB #x98EC #x98ED #x98EE #x98EF #x98F0 + #x98F1 #x98F2 #x98F3 #x98F4 #x98F5 #x98F6 #x98F7 #x98F8 #x98F9 #x98FA + #x98FB #x98FC #x98FD #x98FE #x98FF #x9900 #x9901 #x9902 #x9903 #x9904 + #x9905 #x9906 #x9907 #x9908 #x9909 #x990A #x990B #x990C #x990E #x990F + #x9911 #x9912 #x9913 #x9914 #x9915 #x9916 #x9917 #x9918 #x9919 #x991A + #x991B #x991C #x991D #x991E #x991F #x9920 #x9921 #x9922 #x9923 #x9924 + #x9925 #x9926 #x9927 #x9928 #x9929 #x992A #x992B #x992C #x992D #x992F + #x9930 #x9931 #x9932 #x9933 #x9934 #x9935 #x9936 #x9937 #x9938 #x9939 + #x993A #x993B #x993C #x993D #x993E #x993F #x9940 #x9941 #x9942 #x9943 + #x9944 #x9945 #x9946 #x9947 #x9948 #x9949 #x994A #x994B #x994C #x994D + #x994E #x994F #x9950 #x9951 #x9952 #x9953 #x9956 #x9957 #x9958 #x9959 + #x995A #x995B #x995C #x995D #x995E #x995F #x9960 #x9961 #x9962 #x9964 + #x9966 #x9973 #x9978 #x9979 #x997B #x997E #x9982 #x9983 #x9989 #x998C + #x998E #x999A #x999B #x999C #x999D #x999E #x999F #x99A0 #x99A1 #x99A2 + #x99A3 #x99A4 #x99A6 #x99A7 #x99A9 #x99AA #x99AB #x99AC #x99AD #x99AE + #x99AF #x99B0 #x99B1 #x99B2 #x99B3 #x99B4 #x99B5 #x99B6 #x99B7 #x99B8 + #x99B9 #x99BA #x99BB #x99BC #x99BD #x99BE #x99BF #x99C0 #x99C1 #x99C2 + #x99C3 #x99C4 #x99C5 #x99C6 #x99C7 #x99C8 #x99C9 #x99CA #x99CB #x99CC + #x99CD #x99CE #x99CF #x99D0 #x99D1 #x99D2 #x99D3 #x99D4 #x99D5 #x99D6 + #x99D7 #x99D8 #x99D9 #x99DA #x99DB #x99DC #x99DD #x99DE #x99DF #x99E0 + #x99E1 #x99E2 #x99E3 #x99E4 #x99E5 #x99E6 #x99E7 #x99E8 #x99E9 #x99EA + #x99EB #x99EC #x99ED #x99EE #x99EF #x99F0 #x99F1 #x99F2 #x99F3 #x99F4 + #x99F5 #x99F6 #x99F7 #x99F8 #x99F9 #x99FA #x99FB #x99FC #x99FD #x99FE + #x99FF #x9A00 #x9A01 #x9A02 #x9A03 #x9A04 #x9A05 #x9A06 #x9A07 #x9A08 + #x9A09 #x9A0A #x9A0B #x9A0C #x9A0D #x9A0E #x9A0F #x9A10 #x9A11 #x9A12 + #x9A13 #x9A14 #x9A15 #x9A16 #x9A17 #x9A18 #x9A19 #x9A1A #x9A1B #x9A1C + #x9A1D #x9A1E #x9A1F #x9A20 #x9A21 #x9A22 #x9A23 #x9A24 #x9A25 #x9A26 + #x9A27 #x9A28 #x9A29 #x9A2A #x9A2B #x9A2C #x9A2D #x9A2E #x9A2F #x9A30 + #x9A31 #x9A32 #x9A33 #x9A34 #x9A35 #x9A36 #x9A37 #x9A38 #x9A39 #x9A3A + #x9A3B #x9A3C #x9A3D #x9A3E #x9A3F #x9A40 #x9A41 #x9A42 #x9A43 #x9A44 + #x9A45 #x9A46 #x9A47 #x9A48 #x9A49 #x9A4A #x9A4B #x9A4C #x9A4D #x9A4E + #x9A4F #x9A50 #x9A51 #x9A52 #x9A53 #x9A54 #x9A55 #x9A56 #x9A57 #x9A58 + #x9A59 #x9A5A #x9A5B #x9A5C #x9A5D #x9A5E #x9A5F #x9A60 #x9A61 #x9A62 + #x9A63 #x9A64 #x9A65 #x9A66 #x9A67 #x9A68 #x9A69 #x9A6A #x9A6B #x9A72 + #x9A83 #x9A89 #x9A8D #x9A8E #x9A94 #x9A95 #x9A99 #x9AA6 #x9AA9 #x9AAA + #x9AAB #x9AAC #x9AAD #x9AAE #x9AAF #x9AB2 #x9AB3 #x9AB4 #x9AB5 #x9AB9 + #x9ABB #x9ABD #x9ABE #x9ABF #x9AC3 #x9AC4 #x9AC6 #x9AC7 #x9AC8 #x9AC9 + #x9ACA #x9ACD #x9ACE #x9ACF #x9AD0 #x9AD2 #x9AD4 #x9AD5 #x9AD6 #x9AD7 + #x9AD9 #x9ADA #x9ADB #x9ADC #x9ADD #x9ADE #x9AE0 #x9AE2 #x9AE3 #x9AE4 + #x9AE5 #x9AE7 #x9AE8 #x9AE9 #x9AEA #x9AEC #x9AEE #x9AF0 #x9AF1 #x9AF2 + #x9AF3 #x9AF4 #x9AF5 #x9AF6 #x9AF7 #x9AF8 #x9AFA #x9AFC #x9AFD #x9AFE + #x9AFF #x9B00 #x9B01 #x9B02 #x9B04 #x9B05 #x9B06 #x9B07 #x9B09 #x9B0A + #x9B0B #x9B0C #x9B0D #x9B0E #x9B10 #x9B11 #x9B12 #x9B14 #x9B15 #x9B16 + #x9B17 #x9B18 #x9B19 #x9B1A #x9B1B #x9B1C #x9B1D #x9B1E #x9B20 #x9B21 + #x9B22 #x9B24 #x9B25 #x9B26 #x9B27 #x9B28 #x9B29 #x9B2A #x9B2B #x9B2C + #x9B2D #x9B2E #x9B30 #x9B31 #x9B33 #x9B34 #x9B35 #x9B36 #x9B37 #x9B38 + #x9B39 #x9B3A #x9B3D #x9B3E #x9B3F #x9B40 #x9B46 #x9B4A #x9B4B #x9B4C + #x9B4E #x9B50 #x9B52 #x9B53 #x9B55 #x9B56 #x9B57 #x9B58 #x9B59 #x9B5A + #x9B5B #x9B5C #x9B5D #x9B5E #x9B5F #x9B60 #x9B61 #x9B62 #x9B63 #x9B64 + #x9B65 #x9B66 #x9B67 #x9B68 #x9B69 #x9B6A #x9B6B #x9B6C #x9B6D #x9B6E + #x9B6F #x9B70 #x9B71 #x9B72 #x9B73 #x9B74 #x9B75 #x9B76 #x9B77 #x9B78 + #x9B79 #x9B7A #x9B7B #x9B7C #x9B7D #x9B7E #x9B7F #x9B80 #x9B81 #x9B82 + #x9B83 #x9B84 #x9B85 #x9B86 #x9B87 #x9B88 #x9B89 #x9B8A #x9B8B #x9B8C + #x9B8D #x9B8E #x9B8F #x9B90 #x9B91 #x9B92 #x9B93 #x9B94 #x9B95 #x9B96 + #x9B97 #x9B98 #x9B99 #x9B9A #x9B9B #x9B9C #x9B9D #x9B9E #x9B9F #x9BA0 + #x9BA1 #x9BA2 #x9BA3 #x9BA4 #x9BA5 #x9BA6 #x9BA7 #x9BA8 #x9BA9 #x9BAA + #x9BAB #x9BAC #x9BAD #x9BAE #x9BAF #x9BB0 #x9BB1 #x9BB2 #x9BB3 #x9BB4 + #x9BB5 #x9BB6 #x9BB7 #x9BB8 #x9BB9 #x9BBA #x9BBB #x9BBC #x9BBD #x9BBE + #x9BBF #x9BC0 #x9BC1 #x9BC2 #x9BC3 #x9BC4 #x9BC5 #x9BC6 #x9BC7 #x9BC8 + #x9BC9 #x9BCA #x9BCB #x9BCC #x9BCD #x9BCE #x9BCF #x9BD0 #x9BD1 #x9BD2 + #x9BD3 #x9BD4 #x9BD5 #x9BD6 #x9BD7 #x9BD8 #x9BD9 #x9BDA #x9BDB #x9BDC + #x9BDD #x9BDE #x9BDF #x9BE0 #x9BE1 #x9BE2 #x9BE3 #x9BE4 #x9BE5 #x9BE6 + #x9BE7 #x9BE8 #x9BE9 #x9BEA #x9BEB #x9BEC #x9BED #x9BEE #x9BEF #x9BF0 + #x9BF1 #x9BF2 #x9BF3 #x9BF4 #x9BF5 #x9BF6 #x9BF7 #x9BF8 #x9BF9 #x9BFA + #x9BFB #x9BFC #x9BFD #x9BFE #x9BFF #x9C00 #x9C01 #x9C02 #x9C03 #x9C04 + #x9C05 #x9C06 #x9C07 #x9C08 #x9C09 #x9C0A #x9C0B #x9C0C #x9C0D #x9C0E + #x9C0F #x9C10 #x9C11 #x9C12 #x9C13 #x9C14 #x9C15 #x9C16 #x9C17 #x9C18 + #x9C19 #x9C1A #x9C1B #x9C1C #x9C1D #x9C1E #x9C1F #x9C20 #x9C21 #x9C22 + #x9C23 #x9C24 #x9C25 #x9C26 #x9C27 #x9C28 #x9C29 #x9C2A #x9C2B #x9C2C + #x9C2D #x9C2E #x9C2F #x9C30 #x9C31 #x9C32 #x9C33 #x9C34 #x9C35 #x9C36 + #x9C37 #x9C38 #x9C39 #x9C3A #x9C3B #x9C3C #x9C3D #x9C3E #x9C3F #x9C40 + #x9C41 #x9C42 #x9C43 #x9C44 #x9C45 #x9C46 #x9C47 #x9C48 #x9C49 #x9C4A + #x9C4B #x9C4C #x9C4D #x9C4E #x9C4F #x9C50 #x9C51 #x9C52 #x9C53 #x9C54 + #x9C55 #x9C56 #x9C57 #x9C58 #x9C59 #x9C5A #x9C5B #x9C5C #x9C5D #x9C5E + #x9C5F #x9C60 #x9C61 #x9C62 #x9C63 #x9C64 #x9C65 #x9C66 #x9C67 #x9C68 + #x9C69 #x9C6A #x9C6B #x9C6C #x9C6D #x9C6E #x9C6F #x9C70 #x9C71 #x9C72 + #x9C73 #x9C74 #x9C75 #x9C76 #x9C77 #x9C78 #x9C79 #x9C7A #x9C7B #x9C7D + #x9C7E #x9C80 #x9C83 #x9C84 #x9C89 #x9C8A #x9C8C #x9C8F #x9C93 #x9C96 + #x9C97 #x9C98 #x9C99 #x9C9D #x9CAA #x9CAC #x9CAF #x9CB9 #x9CBE #x9CBF + #x9CC0 #x9CC1 #x9CC2 #x9CC8 #x9CC9 #x9CD1 #x9CD2 #x9CDA #x9CDB #x9CE0 + #x9CE1 #x9CE3 #x9CE4 #x9CE5 #x9CE6 #x9CE7 #x9CE8 #x9CE9 #x9CEA #x9CEB + #x9CEC #x9CED #x9CEE #x9CEF #x9CF0 #x9CF1 #x9CF2 #x9CF3 #x9CF4 #x9CF5 + #x9CF6 #x9CF7 #x9CF8 #x9CF9 #x9CFA #x9CFB #x9CFC #x9CFD #x9CFE #x9CFF + #x9D00 #x9D01 #x9D02 #x9D03 #x9D04 #x9D05 #x9D06 #x9D07 #x9D08 #x9D09 + #x9D0A #x9D0B #x9D0C #x9D0D #x9D0E #x9D0F #x9D10 #x9D11 #x9D12 #x9D13 + #x9D14 #x9D15 #x9D16 #x9D17 #x9D18 #x9D19 #x9D1A #x9D1B #x9D1C #x9D1D + #x9D1E #x9D1F #x9D20 #x9D21 #x9D22 #x9D23 #x9D24 #x9D25 #x9D26 #x9D27 + #x9D28 #x9D29 #x9D2A #x9D2B #x9D2C #x9D2D #x9D2E #x9D2F #x9D30 #x9D31 + #x9D32 #x9D33 #x9D34 #x9D35 #x9D36 #x9D37 #x9D38 #x9D39 #x9D3A #x9D3B + #x9D3C #x9D3D #x9D3E #x9D3F #x9D40 #x9D41 #x9D42 #x9D43 #x9D44 #x9D45 + #x9D46 #x9D47 #x9D48 #x9D49 #x9D4A #x9D4B #x9D4C #x9D4D #x9D4E #x9D4F + #x9D50 #x9D51 #x9D52 #x9D53 #x9D54 #x9D55 #x9D56 #x9D57 #x9D58 #x9D59 + #x9D5A #x9D5B #x9D5C #x9D5D #x9D5E #x9D5F #x9D60 #x9D61 #x9D62 #x9D63 + #x9D64 #x9D65 #x9D66 #x9D67 #x9D68 #x9D69 #x9D6A #x9D6B #x9D6C #x9D6D + #x9D6E #x9D6F #x9D70 #x9D71 #x9D72 #x9D73 #x9D74 #x9D75 #x9D76 #x9D77 + #x9D78 #x9D79 #x9D7A #x9D7B #x9D7C #x9D7D #x9D7E #x9D7F #x9D80 #x9D81 + #x9D82 #x9D83 #x9D84 #x9D85 #x9D86 #x9D87 #x9D88 #x9D89 #x9D8A #x9D8B + #x9D8C #x9D8D #x9D8E #x9D8F #x9D90 #x9D91 #x9D92 #x9D93 #x9D94 #x9D95 + #x9D96 #x9D97 #x9D98 #x9D99 #x9D9A #x9D9B #x9D9C #x9D9D #x9D9E #x9D9F + #x9DA0 #x9DA1 #x9DA2 #x9DA3 #x9DA4 #x9DA5 #x9DA6 #x9DA7 #x9DA8 #x9DA9 + #x9DAA #x9DAB #x9DAC #x9DAD #x9DAE #x9DAF #x9DB0 #x9DB1 #x9DB2 #x9DB3 + #x9DB4 #x9DB5 #x9DB6 #x9DB7 #x9DB8 #x9DB9 #x9DBA #x9DBB #x9DBC #x9DBD + #x9DBE #x9DBF #x9DC0 #x9DC1 #x9DC2 #x9DC3 #x9DC4 #x9DC5 #x9DC6 #x9DC7 + #x9DC8 #x9DC9 #x9DCA #x9DCB #x9DCC #x9DCD #x9DCE #x9DCF #x9DD0 #x9DD1 + #x9DD2 #x9DD3 #x9DD4 #x9DD5 #x9DD6 #x9DD7 #x9DD8 #x9DD9 #x9DDA #x9DDB + #x9DDC #x9DDD #x9DDE #x9DDF #x9DE0 #x9DE1 #x9DE2 #x9DE3 #x9DE4 #x9DE5 + #x9DE6 #x9DE7 #x9DE8 #x9DE9 #x9DEA #x9DEB #x9DEC #x9DED #x9DEE #x9DEF + #x9DF0 #x9DF1 #x9DF2 #x9DF3 #x9DF4 #x9DF5 #x9DF6 #x9DF7 #x9DF8 #x9DF9 + #x9DFA #x9DFB #x9DFC #x9DFD #x9DFE #x9DFF #x9E00 #x9E01 #x9E02 #x9E03 + #x9E04 #x9E05 #x9E06 #x9E07 #x9E08 #x9E09 #x9E0A #x9E0B #x9E0C #x9E0D + #x9E0E #x9E0F #x9E10 #x9E11 #x9E12 #x9E13 #x9E14 #x9E15 #x9E16 #x9E17 + #x9E18 #x9E19 #x9E1A #x9E1B #x9E1C #x9E1D #x9E1E #x9E24 #x9E27 #x9E2E + #x9E30 #x9E34 #x9E3B #x9E3C #x9E40 #x9E4D #x9E50 #x9E52 #x9E53 #x9E54 + #x9E56 #x9E59 #x9E5D #x9E5F #x9E60 #x9E61 #x9E62 #x9E65 #x9E6E #x9E6F + #x9E72 #x9E74 #x9E75 #x9E76 #x9E77 #x9E78 #x9E79 #x9E7A #x9E7B #x9E7C + #x9E7D #x9E80 #x9E81 #x9E83 #x9E84 #x9E85 #x9E86 #x9E89 #x9E8A #x9E8C + #x9E8D #x9E8E #x9E8F #x9E90 #x9E91 #x9E94 #x9E95 #x9E96 #x9E97 #x9E98 + #x9E99 #x9E9A #x9E9B #x9E9C #x9E9E #x9EA0 #x9EA1 #x9EA2 #x9EA3 #x9EA4 + #x9EA5 #x9EA7 #x9EA8 #x9EA9 #x9EAA #x9EAB #x9EAC #x9EAD #x9EAE #x9EAF + #x9EB0 #x9EB1 #x9EB2 #x9EB3 #x9EB5 #x9EB6 #x9EB7 #x9EB9 #x9EBA #x9EBC + #x9EBF #x9EC0 #x9EC1 #x9EC2 #x9EC3 #x9EC5 #x9EC6 #x9EC7 #x9EC8 #x9ECA + #x9ECB #x9ECC #x9ED0 #x9ED2 #x9ED3 #x9ED5 #x9ED6 #x9ED7 #x9ED9 #x9EDA + #x9EDE #x9EE1 #x9EE3 #x9EE4 #x9EE6 #x9EE8 #x9EEB #x9EEC #x9EED #x9EEE + #x9EF0 #x9EF1 #x9EF2 #x9EF3 #x9EF4 #x9EF5 #x9EF6 #x9EF7 #x9EF8 #x9EFA + #x9EFD #x9EFF #x9F00 #x9F01 #x9F02 #x9F03 #x9F04 #x9F05 #x9F06 #x9F07 + #x9F08 #x9F09 #x9F0A #x9F0C #x9F0F #x9F11 #x9F12 #x9F14 #x9F15 #x9F16 + #x9F18 #x9F1A #x9F1B #x9F1C #x9F1D #x9F1E #x9F1F #x9F21 #x9F23 #x9F24 + #x9F25 #x9F26 #x9F27 #x9F28 #x9F29 #x9F2A #x9F2B #x9F2D #x9F2E #x9F30 + #x9F31 #x9F32 #x9F33 #x9F34 #x9F35 #x9F36 #x9F38 #x9F3A #x9F3C #x9F3F + #x9F40 #x9F41 #x9F42 #x9F43 #x9F45 #x9F46 #x9F47 #x9F48 #x9F49 #x9F4A + #x9F4B #x9F4C #x9F4D #x9F4E #x9F4F #x9F52 #x9F53 #x9F54 #x9F55 #x9F56 + #x9F57 #x9F58 #x9F59 #x9F5A #x9F5B #x9F5C #x9F5D #x9F5E #x9F5F #x9F60 + #x9F61 #x9F62 #x9F63 #x9F64 #x9F65 #x9F66 #x9F67 #x9F68 #x9F69 #x9F6A + #x9F6B #x9F6C #x9F6D #x9F6E #x9F6F #x9F70 #x9F71 #x9F72 #x9F73 #x9F74 + #x9F75 #x9F76 #x9F77 #x9F78 #x9F79 #x9F7A #x9F7B #x9F7C #x9F7D #x9F7E + #x9F81 #x9F82 #x9F8D #x9F8E #x9F8F #x9F90 #x9F91 #x9F92 #x9F93 #x9F94 + #x9F95 #x9F96 #x9F97 #x9F98 #x9F9C #x9F9D #x9F9E #x9FA1 #x9FA2 #x9FA3 + #x9FA4 #x9FA5 #x3000 #x3001 #x3002 #x00B7 #x02C9 #x02C7 #x00A8 #x3003 + #x3005 #x2014 #xFF5E #x2016 #x2026 #x2018 #x2019 #x201C #x201D #x3014 + #x3015 #x3008 #x3009 #x300A #x300B #x300C #x300D #x300E #x300F #x3016 + #x3017 #x3010 #x3011 #x00B1 #x00D7 #x00F7 #x2236 #x2227 #x2228 #x2211 + #x220F #x222A #x2229 #x2208 #x2237 #x221A #x22A5 #x2225 #x2220 #x2312 + #x2299 #x222B #x222E #x2261 #x224C #x2248 #x223D #x221D #x2260 #x226E + #x226F #x2264 #x2265 #x221E #x2235 #x2234 #x2642 #x2640 #x00B0 #x2032 + #x2033 #x2103 #xFF04 #x00A4 #xFFE0 #xFFE1 #x2030 #x00A7 #x2116 #x2606 + #x2605 #x25CB #x25CF #x25CE #x25C7 #x25C6 #x25A1 #x25A0 #x25B3 #x25B2 + #x203B #x2192 #x2190 #x2191 #x2193 #x3013 #x2170 #x2171 #x2172 #x2173 + #x2174 #x2175 #x2176 #x2177 #x2178 #x2179 #xE766 #xE767 #xE768 #xE769 + #xE76A #xE76B #x2488 #x2489 #x248A #x248B #x248C #x248D #x248E #x248F + #x2490 #x2491 #x2492 #x2493 #x2494 #x2495 #x2496 #x2497 #x2498 #x2499 + #x249A #x249B #x2474 #x2475 #x2476 #x2477 #x2478 #x2479 #x247A #x247B + #x247C #x247D #x247E #x247F #x2480 #x2481 #x2482 #x2483 #x2484 #x2485 + #x2486 #x2487 #x2460 #x2461 #x2462 #x2463 #x2464 #x2465 #x2466 #x2467 + #x2468 #x2469 #xE76C #xE76D #x3220 #x3221 #x3222 #x3223 #x3224 #x3225 + #x3226 #x3227 #x3228 #x3229 #xE76E #xE76F #x2160 #x2161 #x2162 #x2163 + #x2164 #x2165 #x2166 #x2167 #x2168 #x2169 #x216A #x216B #xE770 #xE771 + #xFF01 #xFF02 #xFF03 #xFFE5 #xFF05 #xFF06 #xFF07 #xFF08 #xFF09 #xFF0A + #xFF0B #xFF0C #xFF0D #xFF0E #xFF0F #xFF10 #xFF11 #xFF12 #xFF13 #xFF14 + #xFF15 #xFF16 #xFF17 #xFF18 #xFF19 #xFF1A #xFF1B #xFF1C #xFF1D #xFF1E + #xFF1F #xFF20 #xFF21 #xFF22 #xFF23 #xFF24 #xFF25 #xFF26 #xFF27 #xFF28 + #xFF29 #xFF2A #xFF2B #xFF2C #xFF2D #xFF2E #xFF2F #xFF30 #xFF31 #xFF32 + #xFF33 #xFF34 #xFF35 #xFF36 #xFF37 #xFF38 #xFF39 #xFF3A #xFF3B #xFF3C + #xFF3D #xFF3E #xFF3F #xFF40 #xFF41 #xFF42 #xFF43 #xFF44 #xFF45 #xFF46 + #xFF47 #xFF48 #xFF49 #xFF4A #xFF4B #xFF4C #xFF4D #xFF4E #xFF4F #xFF50 + #xFF51 #xFF52 #xFF53 #xFF54 #xFF55 #xFF56 #xFF57 #xFF58 #xFF59 #xFF5A + #xFF5B #xFF5C #xFF5D #xFFE3 #x3041 #x3042 #x3043 #x3044 #x3045 #x3046 + #x3047 #x3048 #x3049 #x304A #x304B #x304C #x304D #x304E #x304F #x3050 + #x3051 #x3052 #x3053 #x3054 #x3055 #x3056 #x3057 #x3058 #x3059 #x305A + #x305B #x305C #x305D #x305E #x305F #x3060 #x3061 #x3062 #x3063 #x3064 + #x3065 #x3066 #x3067 #x3068 #x3069 #x306A #x306B #x306C #x306D #x306E + #x306F #x3070 #x3071 #x3072 #x3073 #x3074 #x3075 #x3076 #x3077 #x3078 + #x3079 #x307A #x307B #x307C #x307D #x307E #x307F #x3080 #x3081 #x3082 + #x3083 #x3084 #x3085 #x3086 #x3087 #x3088 #x3089 #x308A #x308B #x308C + #x308D #x308E #x308F #x3090 #x3091 #x3092 #x3093 #xE772 #xE773 #xE774 + #xE775 #xE776 #xE777 #xE778 #xE779 #xE77A #xE77B #xE77C #x30A1 #x30A2 + #x30A3 #x30A4 #x30A5 #x30A6 #x30A7 #x30A8 #x30A9 #x30AA #x30AB #x30AC + #x30AD #x30AE #x30AF #x30B0 #x30B1 #x30B2 #x30B3 #x30B4 #x30B5 #x30B6 + #x30B7 #x30B8 #x30B9 #x30BA #x30BB #x30BC #x30BD #x30BE #x30BF #x30C0 + #x30C1 #x30C2 #x30C3 #x30C4 #x30C5 #x30C6 #x30C7 #x30C8 #x30C9 #x30CA + #x30CB #x30CC #x30CD #x30CE #x30CF #x30D0 #x30D1 #x30D2 #x30D3 #x30D4 + #x30D5 #x30D6 #x30D7 #x30D8 #x30D9 #x30DA #x30DB #x30DC #x30DD #x30DE + #x30DF #x30E0 #x30E1 #x30E2 #x30E3 #x30E4 #x30E5 #x30E6 #x30E7 #x30E8 + #x30E9 #x30EA #x30EB #x30EC #x30ED #x30EE #x30EF #x30F0 #x30F1 #x30F2 + #x30F3 #x30F4 #x30F5 #x30F6 #xE77D #xE77E #xE77F #xE780 #xE781 #xE782 + #xE783 #xE784 #x0391 #x0392 #x0393 #x0394 #x0395 #x0396 #x0397 #x0398 + #x0399 #x039A #x039B #x039C #x039D #x039E #x039F #x03A0 #x03A1 #x03A3 + #x03A4 #x03A5 #x03A6 #x03A7 #x03A8 #x03A9 #xE785 #xE786 #xE787 #xE788 + #xE789 #xE78A #xE78B #xE78C #x03B1 #x03B2 #x03B3 #x03B4 #x03B5 #x03B6 + #x03B7 #x03B8 #x03B9 #x03BA #x03BB #x03BC #x03BD #x03BE #x03BF #x03C0 + #x03C1 #x03C3 #x03C4 #x03C5 #x03C6 #x03C7 #x03C8 #x03C9 #xE78D #xE78E + #xE78F #xE790 #xE791 #xE792 #xE793 #xFE35 #xFE36 #xFE39 #xFE3A #xFE3F + #xFE40 #xFE3D #xFE3E #xFE41 #xFE42 #xFE43 #xFE44 #xE794 #xE795 #xFE3B + #xFE3C #xFE37 #xFE38 #xFE31 #xE796 #xFE33 #xFE34 #xE797 #xE798 #xE799 + #xE79A #xE79B #xE79C #xE79D #xE79E #xE79F #x0410 #x0411 #x0412 #x0413 + #x0414 #x0415 #x0401 #x0416 #x0417 #x0418 #x0419 #x041A #x041B #x041C + #x041D #x041E #x041F #x0420 #x0421 #x0422 #x0423 #x0424 #x0425 #x0426 + #x0427 #x0428 #x0429 #x042A #x042B #x042C #x042D #x042E #x042F #xE7A0 + #xE7A1 #xE7A2 #xE7A3 #xE7A4 #xE7A5 #xE7A6 #xE7A7 #xE7A8 #xE7A9 #xE7AA + #xE7AB #xE7AC #xE7AD #xE7AE #x0430 #x0431 #x0432 #x0433 #x0434 #x0435 + #x0451 #x0436 #x0437 #x0438 #x0439 #x043A #x043B #x043C #x043D #x043E + #x043F #x0440 #x0441 #x0442 #x0443 #x0444 #x0445 #x0446 #x0447 #x0448 + #x0449 #x044A #x044B #x044C #x044D #x044E #x044F #xE7AF #xE7B0 #xE7B1 + #xE7B2 #xE7B3 #xE7B4 #xE7B5 #xE7B6 #xE7B7 #xE7B8 #xE7B9 #xE7BA #xE7BB + #x0101 #x00E1 #x01CE #x00E0 #x0113 #x00E9 #x011B #x00E8 #x012B #x00ED + #x01D0 #x00EC #x014D #x00F3 #x01D2 #x00F2 #x016B #x00FA #x01D4 #x00F9 + #x01D6 #x01D8 #x01DA #x01DC #x00FC #x00EA #x0251 #xE7C7 #x0144 #x0148 + #xE7C8 #x0261 #xE7C9 #xE7CA #xE7CB #xE7CC #x3105 #x3106 #x3107 #x3108 + #x3109 #x310A #x310B #x310C #x310D #x310E #x310F #x3110 #x3111 #x3112 + #x3113 #x3114 #x3115 #x3116 #x3117 #x3118 #x3119 #x311A #x311B #x311C + #x311D #x311E #x311F #x3120 #x3121 #x3122 #x3123 #x3124 #x3125 #x3126 + #x3127 #x3128 #x3129 #xE7CD #xE7CE #xE7CF #xE7D0 #xE7D1 #xE7D2 #xE7D3 + #xE7D4 #xE7D5 #xE7D6 #xE7D7 #xE7D8 #xE7D9 #xE7DA #xE7DB #xE7DC #xE7DD + #xE7DE #xE7DF #xE7E0 #xE7E1 #xE7FE #xE7FF #xE800 #x2500 #x2501 #x2502 + #x2503 #x2504 #x2505 #x2506 #x2507 #x2508 #x2509 #x250A #x250B #x250C + #x250D #x250E #x250F #x2510 #x2511 #x2512 #x2513 #x2514 #x2515 #x2516 + #x2517 #x2518 #x2519 #x251A #x251B #x251C #x251D #x251E #x251F #x2520 + #x2521 #x2522 #x2523 #x2524 #x2525 #x2526 #x2527 #x2528 #x2529 #x252A + #x252B #x252C #x252D #x252E #x252F #x2530 #x2531 #x2532 #x2533 #x2534 + #x2535 #x2536 #x2537 #x2538 #x2539 #x253A #x253B #x253C #x253D #x253E + #x253F #x2540 #x2541 #x2542 #x2543 #x2544 #x2545 #x2546 #x2547 #x2548 + #x2549 #x254A #x254B #xE801 #xE802 #xE803 #xE804 #xE805 #xE806 #xE807 + #xE808 #xE809 #xE80A #xE80B #xE80C #xE80D #xE80E #xE80F #x02CA #x02CB + #x02D9 #x2013 #x2015 #x2025 #x2035 #x2105 #x2109 #x2196 #x2197 #x2198 + #x2199 #x2215 #x221F #x2223 #x2252 #x2266 #x2267 #x22BF #x2550 #x2551 + #x2552 #x2553 #x2554 #x2555 #x2556 #x2557 #x2558 #x2559 #x255A #x255B + #x255C #x255D #x255E #x255F #x2560 #x2561 #x2562 #x2563 #x2564 #x2565 + #x2566 #x2567 #x2568 #x2569 #x256A #x256B #x256C #x256D #x256E #x256F + #x2570 #x2571 #x2572 #x2573 #x2581 #x2582 #x2583 #x2584 #x2585 #x2586 + #x2587 #x2588 #x2589 #x258A #x258B #x258C #x258D #x258E #x258F #x2593 + #x2594 #x2595 #x25BC #x25BD #x25E2 #x25E3 #x25E4 #x25E5 #x2609 #x2295 + #x3012 #x301D #x301E #xE7BC #xE7BD #xE7BE #xE7BF #xE7C0 #xE7C1 #xE7C2 + #xE7C3 #xE7C4 #xE7C5 #xE7C6 #x3021 #x3022 #x3023 #x3024 #x3025 #x3026 + #x3027 #x3028 #x3029 #x32A3 #x338E #x338F #x339C #x339D #x339E #x33A1 + #x33C4 #x33CE #x33D1 #x33D2 #x33D5 #xFE30 #xFFE2 #xFFE4 #xE7E2 #x2121 + #x3231 #xE7E3 #x2010 #xE7E4 #xE7E5 #xE7E6 #x30FC #x309B #x309C #x30FD + #x30FE #x3006 #x309D #x309E #xFE49 #xFE4A #xFE4B #xFE4C #xFE4D #xFE4E + #xFE4F #xFE50 #xFE51 #xFE52 #xFE54 #xFE55 #xFE56 #xFE57 #xFE59 #xFE5A + #xFE5B #xFE5C #xFE5D #xFE5E #xFE5F #xFE60 #xFE61 #xFE62 #xFE63 #xFE64 + #xFE65 #xFE66 #xFE68 #xFE69 #xFE6A #xFE6B #xE7E7 #xE7E8 #xE7E9 #xE7EA + #xE7EB #xE7EC #xE7ED #xE7EE #xE7EF #xE7F0 #xE7F1 #xE7F2 #xE7F3 #x3007 + #xE7F4 #xE7F5 #xE7F6 #xE7F7 #xE7F8 #xE7F9 #xE7FA #xE7FB #xE7FC #xE7FD + #x0020))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/src/jpn-table.lisp b/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/src/jpn-table.lisp new file mode 100644 index 0000000..f0cf849 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/src/jpn-table.lisp @@ -0,0 +1,17637 @@ +;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- +;;; +;;; jpn-table.lisp --- Unicode tables for Japanese encodings. +;;; + +(in-package #:babel-encodings) + +(defvar *cp932-only* + '((#xFC4B #x9ED1) + (#xFC4A #x9E19) + (#xFC49 #xFA2D) + (#xFC48 #x9D6B) + (#xFC47 #x9D70) + (#xFC46 #x9C00) + (#xFC45 #x9BBB) + (#xFC44 #x9BB1) + (#xFC43 #x9B8F) + (#xFC42 #x9B72) + (#xFC41 #x9B75) + (#xFC40 #x9ADC) + (#xFBFC #x9AD9) + (#xFBFB #x9A4E) + (#xFBFA #x999E) + (#xFBF9 #xFA2C) + (#xFBF8 #x9927) + (#xFBF7 #xFA2B) + (#xFBF6 #xFA2A) + (#xFBF5 #x9865) + (#xFBF4 #x9857) + (#xFBF3 #x9755) + (#xFBF2 #x9751) + (#xFBF1 #x974F) + (#xFBF0 #x974D) + (#xFBEF #x9743) + (#xFBEE #x973B) + (#xFBED #x9733) + (#xFBEC #x96AF) + (#xFBEB #x969D) + (#xFBEA #xFA29) + (#xFBE9 #xF9DC) + (#xFBE8 #x9592) + (#xFBE7 #x9448) + (#xFBE6 #x9445) + (#xFBE5 #x9431) + (#xFBE4 #x93F8) + (#xFBE3 #x93DE) + (#xFBE2 #x93C6) + (#xFBE1 #x93A4) + (#xFBE0 #x9357) + (#xFBDF #x9370) + (#xFBDE #x9302) + (#xFBDD #x931D) + (#xFBDC #x92FF) + (#xFBDB #x931E) + (#xFBDA #xFA28) + (#xFBD9 #x92FB) + (#xFBD8 #x9321) + (#xFBD7 #x9325) + (#xFBD6 #x92D3) + (#xFBD5 #x92E0) + (#xFBD4 #x92D5) + (#xFBD3 #xFA27) + (#xFBD2 #x92D0) + (#xFBD1 #x92D9) + (#xFBD0 #x92D7) + (#xFBCF #x92E7) + (#xFBCE #x9278) + (#xFBCD #x9277) + (#xFBCC #x92A7) + (#xFBCB #x9267) + (#xFBCA #x9239) + (#xFBC9 #x9251) + (#xFBC8 #x9259) + (#xFBC7 #x924E) + (#xFBC6 #x923C) + (#xFBC5 #x9240) + (#xFBC4 #x923A) + (#xFBC3 #x920A) + (#xFBC2 #x9210) + (#xFBC1 #x9206) + (#xFBC0 #x91E5) + (#xFBBF #x91E4) + (#xFBBE #x91EE) + (#xFBBD #x91ED) + (#xFBBC #x91DE) + (#xFBBB #x91D7) + (#xFBBA #x91DA) + (#xFBB9 #x9127) + (#xFBB8 #x9115) + (#xFBB7 #xFA26) + (#xFBB6 #x90DE) + (#xFBB5 #x9067) + (#xFBB4 #xFA25) + (#xFBB3 #xFA24) + (#xFBB2 #x8ECF) + (#xFBB1 #xFA23) + (#xFBB0 #x8D76) + (#xFBAF #x8D12) + (#xFBAE #x8CF4) + (#xFBAD #x8CF0) + (#xFBAC #x8B7F) + (#xFBAB #x8B53) + (#xFBAA #x8AF6) + (#xFBA9 #xFA22) + (#xFBA8 #x8ADF) + (#xFBA7 #x8ABE) + (#xFBA6 #x8AA7) + (#xFBA5 #x8A79) + (#xFBA4 #x8A37) + (#xFBA3 #x8A12) + (#xFBA2 #x88F5) + (#xFBA1 #x8807) + (#xFBA0 #xFA21) + (#xFB9F #xFA20) + (#xFB9E #x85B0) + (#xFB9D #xFA1F) + (#xFB9C #x856B) + (#xFB9B #x8559) + (#xFB9A #x8553) + (#xFB99 #x84B4) + (#xFB98 #x8448) + (#xFB97 #x83F6) + (#xFB96 #x83C7) + (#xFB95 #x837F) + (#xFB94 #x8362) + (#xFB93 #x8301) + (#xFB92 #xFA1E) + (#xFB91 #x7FA1) + (#xFB90 #x7F47) + (#xFB8F #x7E52) + (#xFB8E #x7DD6) + (#xFB8D #x7DA0) + (#xFB8C #x7DB7) + (#xFB8B #x7D5C) + (#xFB8A #x7D48) + (#xFB89 #xFA1D) + (#xFB88 #x7B9E) + (#xFB87 #x7AEB) + (#xFB86 #xFA1C) + (#xFB85 #x7AE7) + (#xFB84 #x7AD1) + (#xFB83 #x799B) + (#xFB82 #xFA1B) + (#xFB81 #x7994) + (#xFB80 #xFA1A) + (#xFB7E #xFA19) + (#xFB7D #xFA18) + (#xFB7C #x7930) + (#xFB7B #x787A) + (#xFB7A #x7864) + (#xFB79 #x784E) + (#xFB78 #x7821) + (#xFB77 #x52AF) + (#xFB76 #x7746) + (#xFB75 #xFA17) + (#xFB74 #x76A6) + (#xFB73 #x769B) + (#xFB72 #x769E) + (#xFB71 #x769C) + (#xFB70 #x7682) + (#xFB6F #x756F) + (#xFB6E #x7501) + (#xFB6D #x749F) + (#xFB6C #x7489) + (#xFB6B #x7462) + (#xFB6A #x742E) + (#xFB69 #x7429) + (#xFB68 #x742A) + (#xFB67 #x7426) + (#xFB66 #x73F5) + (#xFB65 #x7407) + (#xFB64 #x73D2) + (#xFB63 #x73E3) + (#xFB62 #x73D6) + (#xFB61 #x73C9) + (#xFB60 #x73BD) + (#xFB5F #x7377) + (#xFB5E #xFA16) + (#xFB5D #x7324) + (#xFB5C #x72BE) + (#xFB5B #x72B1) + (#xFB5A #x71FE) + (#xFB59 #x71C1) + (#xFB58 #xFA15) + (#xFB57 #x7147) + (#xFB56 #x7146) + (#xFB55 #x715C) + (#xFB54 #x7104) + (#xFB53 #x710F) + (#xFB52 #x70AB) + (#xFB51 #x7085) + (#xFB50 #x7028) + (#xFB4F #x7007) + (#xFB4E #x7005) + (#xFB4D #x6FF5) + (#xFB4C #x6FB5) + (#xFB4B #x6F88) + (#xFB4A #x6EBF) + (#xFB49 #x6E3C) + (#xFB48 #x6E27) + (#xFB47 #x6E5C) + (#xFB46 #x6E39) + (#xFB45 #x6DFC) + (#xFB44 #x6DF2) + (#xFB43 #x6DF8) + (#xFB42 #x6DCF) + (#xFB41 #x6DAC) + (#xFB40 #x6D96) + (#xFAFC #x6D6F) + (#xFAFB #x6D87) + (#xFAFA #x6D04) + (#xFAF9 #x6CDA) + (#xFAF8 #x6C6F) + (#xFAF7 #x6C86) + (#xFAF6 #x6C5C) + (#xFAF5 #x6C3F) + (#xFAF4 #x6BD6) + (#xFAF3 #x6AE4) + (#xFAF2 #x6AE2) + (#xFAF1 #x6A7E) + (#xFAF0 #x6A73) + (#xFAEF #x6A46) + (#xFAEE #x6A6B) + (#xFAED #x6A30) + (#xFAEC #x69E2) + (#xFAEB #x6998) + (#xFAEA #xFA14) + (#xFAE9 #x6968) + (#xFAE8 #xFA13) + (#xFAE7 #x68CF) + (#xFAE6 #x6844) + (#xFAE5 #x6801) + (#xFAE4 #x67C0) + (#xFAE3 #x6852) + (#xFAE2 #x67BB) + (#xFAE1 #x6766) + (#xFAE0 #xF929) + (#xFADF #x670E) + (#xFADE #x66FA) + (#xFADD #x66BF) + (#xFADC #x66B2) + (#xFADB #x66A0) + (#xFADA #x6699) + (#xFAD9 #x6673) + (#xFAD8 #xFA12) + (#xFAD7 #x6659) + (#xFAD6 #x6657) + (#xFAD5 #x6665) + (#xFAD4 #x6624) + (#xFAD3 #x661E) + (#xFAD2 #x662E) + (#xFAD1 #x6609) + (#xFAD0 #x663B) + (#xFACF #x6615) + (#xFACE #x6600) + (#xFACD #x654E) + (#xFACC #x64CE) + (#xFACB #x649D) + (#xFACA #x6460) + (#xFAC9 #x63F5) + (#xFAC8 #x62A6) + (#xFAC7 #x6213) + (#xFAC6 #x6198) + (#xFAC5 #x6130) + (#xFAC4 #x6137) + (#xFAC3 #x6111) + (#xFAC2 #x60F2) + (#xFAC1 #x6120) + (#xFAC0 #x60D5) + (#xFABF #x60DE) + (#xFABE #x608A) + (#xFABD #x6085) + (#xFABC #x605D) + (#xFABB #x5FDE) + (#xFABA #x5FB7) + (#xFAB9 #x5F67) + (#xFAB8 #x5F34) + (#xFAB7 #x5F21) + (#xFAB6 #x5DD0) + (#xFAB5 #x5DB9) + (#xFAB4 #x5DB8) + (#xFAB3 #x5D6D) + (#xFAB2 #x5D42) + (#xFAB1 #xFA11) + (#xFAB0 #x5D53) + (#xFAAF #x5D27) + (#xFAAE #x5CF5) + (#xFAAD #x5CBA) + (#xFAAC #x5CA6) + (#xFAAB #x5C1E) + (#xFAAA #x5BEC) + (#xFAA9 #x5BD8) + (#xFAA8 #x752F) + (#xFAA7 #x5BC0) + (#xFAA6 #x5B56) + (#xFAA5 #x59BA) + (#xFAA4 #x59A4) + (#xFAA3 #x5963) + (#xFAA2 #x595D) + (#xFAA1 #x595B) + (#xFAA0 #x5953) + (#xFA9F #x590B) + (#xFA9E #x58B2) + (#xFA9D #x589E) + (#xFA9C #xFA10) + (#xFA9B #xFA0F) + (#xFA9A #x57C7) + (#xFA99 #x57C8) + (#xFA98 #x57AC) + (#xFA97 #x5765) + (#xFA96 #x5759) + (#xFA95 #x5586) + (#xFA94 #x54FF) + (#xFA93 #x54A9) + (#xFA92 #x548A) + (#xFA91 #x549C) + (#xFA90 #xFA0E) + (#xFA8F #x53DD) + (#xFA8E #x53B2) + (#xFA8D #x5393) + (#xFA8C #x5372) + (#xFA8B #x5324) + (#xFA8A #x5307) + (#xFA89 #x5300) + (#xFA88 #x52DB) + (#xFA87 #x52C0) + (#xFA86 #x52A6) + (#xFA85 #x529C) + (#xFA84 #x5215) + (#xFA83 #x51EC) + (#xFA82 #x51BE) + (#xFA81 #x519D) + (#xFA80 #x5164) + (#xFA7E #x514A) + (#xFA7D #x50D8) + (#xFA7C #x50F4) + (#xFA7B #x5094) + (#xFA7A #x5042) + (#xFA79 #x5070) + (#xFA78 #x5046) + (#xFA77 #x501E) + (#xFA76 #x4FFF) + (#xFA75 #x5022) + (#xFA74 #x5040) + (#xFA73 #x4FCD) + (#xFA72 #x4F94) + (#xFA71 #x4F9A) + (#xFA70 #x4F8A) + (#xFA6F #x4F92) + (#xFA6E #x4F56) + (#xFA6D #x4F39) + (#xFA6C #x4F03) + (#xFA6B #x4F00) + (#xFA6A #x4EFC) + (#xFA69 #x4EE1) + (#xFA68 #x4E28) + (#xFA67 #x5F45) + (#xFA66 #x66FB) + (#xFA65 #x92F9) + (#xFA64 #x68C8) + (#xFA63 #x6631) + (#xFA62 #x70BB) + (#xFA61 #x4FC9) + (#xFA60 #x84DC) + (#xFA5F #x9288) + (#xFA5E #x9348) + (#xFA5D #x891C) + (#xFA5C #x7E8A) + (#xFA5B #x2235) + (#xFA5A #x2121) + (#xFA59 #x2116) + (#xFA58 #x3231) + (#xFA57 #xFF02) + (#xFA56 #xFF07) + (#xFA55 #xFFE4) + (#xFA54 #xFFE2) + (#xFA53 #x2169) + (#xFA52 #x2168) + (#xFA51 #x2167) + (#xFA50 #x2166) + (#xFA4F #x2165) + (#xFA4E #x2164) + (#xFA4D #x2163) + (#xFA4C #x2162) + (#xFA4B #x2161) + (#xFA4A #x2160) + (#xFA49 #x2179) + (#xFA48 #x2178) + (#xFA47 #x2177) + (#xFA46 #x2176) + (#xFA45 #x2175) + (#xFA44 #x2174) + (#xFA43 #x2173) + (#xFA42 #x2172) + (#xFA41 #x2171) + (#xFA40 #x2170) + (#xF9FC #xE757) + (#xF9FB #xE756) + (#xF9FA #xE755) + (#xF9F9 #xE754) + (#xF9F8 #xE753) + (#xF9F7 #xE752) + (#xF9F6 #xE751) + (#xF9F5 #xE750) + (#xF9F4 #xE74F) + (#xF9F3 #xE74E) + (#xF9F2 #xE74D) + (#xF9F1 #xE74C) + (#xF9F0 #xE74B) + (#xF9EF #xE74A) + (#xF9EE #xE749) + (#xF9ED #xE748) + (#xF9EC #xE747) + (#xF9EB #xE746) + (#xF9EA #xE745) + (#xF9E9 #xE744) + (#xF9E8 #xE743) + (#xF9E7 #xE742) + (#xF9E6 #xE741) + (#xF9E5 #xE740) + (#xF9E4 #xE73F) + (#xF9E3 #xE73E) + (#xF9E2 #xE73D) + (#xF9E1 #xE73C) + (#xF9E0 #xE73B) + (#xF9DF #xE73A) + (#xF9DE #xE739) + (#xF9DD #xE738) + (#xF9DC #xE737) + (#xF9DB #xE736) + (#xF9DA #xE735) + (#xF9D9 #xE734) + (#xF9D8 #xE733) + (#xF9D7 #xE732) + (#xF9D6 #xE731) + (#xF9D5 #xE730) + (#xF9D4 #xE72F) + (#xF9D3 #xE72E) + (#xF9D2 #xE72D) + (#xF9D1 #xE72C) + (#xF9D0 #xE72B) + (#xF9CF #xE72A) + (#xF9CE #xE729) + (#xF9CD #xE728) + (#xF9CC #xE727) + (#xF9CB #xE726) + (#xF9CA #xE725) + (#xF9C9 #xE724) + (#xF9C8 #xE723) + (#xF9C7 #xE722) + (#xF9C6 #xE721) + (#xF9C5 #xE720) + (#xF9C4 #xE71F) + (#xF9C3 #xE71E) + (#xF9C2 #xE71D) + (#xF9C1 #xE71C) + (#xF9C0 #xE71B) + (#xF9BF #xE71A) + (#xF9BE #xE719) + (#xF9BD #xE718) + (#xF9BC #xE717) + (#xF9BB #xE716) + (#xF9BA #xE715) + (#xF9B9 #xE714) + (#xF9B8 #xE713) + (#xF9B7 #xE712) + (#xF9B6 #xE711) + (#xF9B5 #xE710) + (#xF9B4 #xE70F) + (#xF9B3 #xE70E) + (#xF9B2 #xE70D) + (#xF9B1 #xE70C) + (#xF9B0 #xE70B) + (#xF9AF #xE70A) + (#xF9AE #xE709) + (#xF9AD #xE708) + (#xF9AC #xE707) + (#xF9AB #xE706) + (#xF9AA #xE705) + (#xF9A9 #xE704) + (#xF9A8 #xE703) + (#xF9A7 #xE702) + (#xF9A6 #xE701) + (#xF9A5 #xE700) + (#xF9A4 #xE6FF) + (#xF9A3 #xE6FE) + (#xF9A2 #xE6FD) + (#xF9A1 #xE6FC) + (#xF9A0 #xE6FB) + (#xF99F #xE6FA) + (#xF99E #xE6F9) + (#xF99D #xE6F8) + (#xF99C #xE6F7) + (#xF99B #xE6F6) + (#xF99A #xE6F5) + (#xF999 #xE6F4) + (#xF998 #xE6F3) + (#xF997 #xE6F2) + (#xF996 #xE6F1) + (#xF995 #xE6F0) + (#xF994 #xE6EF) + (#xF993 #xE6EE) + (#xF992 #xE6ED) + (#xF991 #xE6EC) + (#xF990 #xE6EB) + (#xF98F #xE6EA) + (#xF98E #xE6E9) + (#xF98D #xE6E8) + (#xF98C #xE6E7) + (#xF98B #xE6E6) + (#xF98A #xE6E5) + (#xF989 #xE6E4) + (#xF988 #xE6E3) + (#xF987 #xE6E2) + (#xF986 #xE6E1) + (#xF985 #xE6E0) + (#xF984 #xE6DF) + (#xF983 #xE6DE) + (#xF982 #xE6DD) + (#xF981 #xE6DC) + (#xF980 #xE6DB) + (#xF97E #xE6DA) + (#xF97D #xE6D9) + (#xF97C #xE6D8) + (#xF97B #xE6D7) + (#xF97A #xE6D6) + (#xF979 #xE6D5) + (#xF978 #xE6D4) + (#xF977 #xE6D3) + (#xF976 #xE6D2) + (#xF975 #xE6D1) + (#xF974 #xE6D0) + (#xF973 #xE6CF) + (#xF972 #xE6CE) + (#xF971 #xE6CD) + (#xF970 #xE6CC) + (#xF96F #xE6CB) + (#xF96E #xE6CA) + (#xF96D #xE6C9) + (#xF96C #xE6C8) + (#xF96B #xE6C7) + (#xF96A #xE6C6) + (#xF969 #xE6C5) + (#xF968 #xE6C4) + (#xF967 #xE6C3) + (#xF966 #xE6C2) + (#xF965 #xE6C1) + (#xF964 #xE6C0) + (#xF963 #xE6BF) + (#xF962 #xE6BE) + (#xF961 #xE6BD) + (#xF960 #xE6BC) + (#xF95F #xE6BB) + (#xF95E #xE6BA) + (#xF95D #xE6B9) + (#xF95C #xE6B8) + (#xF95B #xE6B7) + (#xF95A #xE6B6) + (#xF959 #xE6B5) + (#xF958 #xE6B4) + (#xF957 #xE6B3) + (#xF956 #xE6B2) + (#xF955 #xE6B1) + (#xF954 #xE6B0) + (#xF953 #xE6AF) + (#xF952 #xE6AE) + (#xF951 #xE6AD) + (#xF950 #xE6AC) + (#xF94F #xE6AB) + (#xF94E #xE6AA) + (#xF94D #xE6A9) + (#xF94C #xE6A8) + (#xF94B #xE6A7) + (#xF94A #xE6A6) + (#xF949 #xE6A5) + (#xF948 #xE6A4) + (#xF947 #xE6A3) + (#xF946 #xE6A2) + (#xF945 #xE6A1) + (#xF944 #xE6A0) + (#xF943 #xE69F) + (#xF942 #xE69E) + (#xF941 #xE69D) + (#xF940 #xE69C) + (#xF8FC #xE69B) + (#xF8FB #xE69A) + (#xF8FA #xE699) + (#xF8F9 #xE698) + (#xF8F8 #xE697) + (#xF8F7 #xE696) + (#xF8F6 #xE695) + (#xF8F5 #xE694) + (#xF8F4 #xE693) + (#xF8F3 #xE692) + (#xF8F2 #xE691) + (#xF8F1 #xE690) + (#xF8F0 #xE68F) + (#xF8EF #xE68E) + (#xF8EE #xE68D) + (#xF8ED #xE68C) + (#xF8EC #xE68B) + (#xF8EB #xE68A) + (#xF8EA #xE689) + (#xF8E9 #xE688) + (#xF8E8 #xE687) + (#xF8E7 #xE686) + (#xF8E6 #xE685) + (#xF8E5 #xE684) + (#xF8E4 #xE683) + (#xF8E3 #xE682) + (#xF8E2 #xE681) + (#xF8E1 #xE680) + (#xF8E0 #xE67F) + (#xF8DF #xE67E) + (#xF8DE #xE67D) + (#xF8DD #xE67C) + (#xF8DC #xE67B) + (#xF8DB #xE67A) + (#xF8DA #xE679) + (#xF8D9 #xE678) + (#xF8D8 #xE677) + (#xF8D7 #xE676) + (#xF8D6 #xE675) + (#xF8D5 #xE674) + (#xF8D4 #xE673) + (#xF8D3 #xE672) + (#xF8D2 #xE671) + (#xF8D1 #xE670) + (#xF8D0 #xE66F) + (#xF8CF #xE66E) + (#xF8CE #xE66D) + (#xF8CD #xE66C) + (#xF8CC #xE66B) + (#xF8CB #xE66A) + (#xF8CA #xE669) + (#xF8C9 #xE668) + (#xF8C8 #xE667) + (#xF8C7 #xE666) + (#xF8C6 #xE665) + (#xF8C5 #xE664) + (#xF8C4 #xE663) + (#xF8C3 #xE662) + (#xF8C2 #xE661) + (#xF8C1 #xE660) + (#xF8C0 #xE65F) + (#xF8BF #xE65E) + (#xF8BE #xE65D) + (#xF8BD #xE65C) + (#xF8BC #xE65B) + (#xF8BB #xE65A) + (#xF8BA #xE659) + (#xF8B9 #xE658) + (#xF8B8 #xE657) + (#xF8B7 #xE656) + (#xF8B6 #xE655) + (#xF8B5 #xE654) + (#xF8B4 #xE653) + (#xF8B3 #xE652) + (#xF8B2 #xE651) + (#xF8B1 #xE650) + (#xF8B0 #xE64F) + (#xF8AF #xE64E) + (#xF8AE #xE64D) + (#xF8AD #xE64C) + (#xF8AC #xE64B) + (#xF8AB #xE64A) + (#xF8AA #xE649) + (#xF8A9 #xE648) + (#xF8A8 #xE647) + (#xF8A7 #xE646) + (#xF8A6 #xE645) + (#xF8A5 #xE644) + (#xF8A4 #xE643) + (#xF8A3 #xE642) + (#xF8A2 #xE641) + (#xF8A1 #xE640) + (#xF8A0 #xE63F) + (#xF89F #xE63E) + (#xF89E #xE63D) + (#xF89D #xE63C) + (#xF89C #xE63B) + (#xF89B #xE63A) + (#xF89A #xE639) + (#xF899 #xE638) + (#xF898 #xE637) + (#xF897 #xE636) + (#xF896 #xE635) + (#xF895 #xE634) + (#xF894 #xE633) + (#xF893 #xE632) + (#xF892 #xE631) + (#xF891 #xE630) + (#xF890 #xE62F) + (#xF88F #xE62E) + (#xF88E #xE62D) + (#xF88D #xE62C) + (#xF88C #xE62B) + (#xF88B #xE62A) + (#xF88A #xE629) + (#xF889 #xE628) + (#xF888 #xE627) + (#xF887 #xE626) + (#xF886 #xE625) + (#xF885 #xE624) + (#xF884 #xE623) + (#xF883 #xE622) + (#xF882 #xE621) + (#xF881 #xE620) + (#xF880 #xE61F) + (#xF87E #xE61E) + (#xF87D #xE61D) + (#xF87C #xE61C) + (#xF87B #xE61B) + (#xF87A #xE61A) + (#xF879 #xE619) + (#xF878 #xE618) + (#xF877 #xE617) + (#xF876 #xE616) + (#xF875 #xE615) + (#xF874 #xE614) + (#xF873 #xE613) + (#xF872 #xE612) + (#xF871 #xE611) + (#xF870 #xE610) + (#xF86F #xE60F) + (#xF86E #xE60E) + (#xF86D #xE60D) + (#xF86C #xE60C) + (#xF86B #xE60B) + (#xF86A #xE60A) + (#xF869 #xE609) + (#xF868 #xE608) + (#xF867 #xE607) + (#xF866 #xE606) + (#xF865 #xE605) + (#xF864 #xE604) + (#xF863 #xE603) + (#xF862 #xE602) + (#xF861 #xE601) + (#xF860 #xE600) + (#xF85F #xE5FF) + (#xF85E #xE5FE) + (#xF85D #xE5FD) + (#xF85C #xE5FC) + (#xF85B #xE5FB) + (#xF85A #xE5FA) + (#xF859 #xE5F9) + (#xF858 #xE5F8) + (#xF857 #xE5F7) + (#xF856 #xE5F6) + (#xF855 #xE5F5) + (#xF854 #xE5F4) + (#xF853 #xE5F3) + (#xF852 #xE5F2) + (#xF851 #xE5F1) + (#xF850 #xE5F0) + (#xF84F #xE5EF) + (#xF84E #xE5EE) + (#xF84D #xE5ED) + (#xF84C #xE5EC) + (#xF84B #xE5EB) + (#xF84A #xE5EA) + (#xF849 #xE5E9) + (#xF848 #xE5E8) + (#xF847 #xE5E7) + (#xF846 #xE5E6) + (#xF845 #xE5E5) + (#xF844 #xE5E4) + (#xF843 #xE5E3) + (#xF842 #xE5E2) + (#xF841 #xE5E1) + (#xF840 #xE5E0) + (#xF7FC #xE5DF) + (#xF7FB #xE5DE) + (#xF7FA #xE5DD) + (#xF7F9 #xE5DC) + (#xF7F8 #xE5DB) + (#xF7F7 #xE5DA) + (#xF7F6 #xE5D9) + (#xF7F5 #xE5D8) + (#xF7F4 #xE5D7) + (#xF7F3 #xE5D6) + (#xF7F2 #xE5D5) + (#xF7F1 #xE5D4) + (#xF7F0 #xE5D3) + (#xF7EF #xE5D2) + (#xF7EE #xE5D1) + (#xF7ED #xE5D0) + (#xF7EC #xE5CF) + (#xF7EB #xE5CE) + (#xF7EA #xE5CD) + (#xF7E9 #xE5CC) + (#xF7E8 #xE5CB) + (#xF7E7 #xE5CA) + (#xF7E6 #xE5C9) + (#xF7E5 #xE5C8) + (#xF7E4 #xE5C7) + (#xF7E3 #xE5C6) + (#xF7E2 #xE5C5) + (#xF7E1 #xE5C4) + (#xF7E0 #xE5C3) + (#xF7DF #xE5C2) + (#xF7DE #xE5C1) + (#xF7DD #xE5C0) + (#xF7DC #xE5BF) + (#xF7DB #xE5BE) + (#xF7DA #xE5BD) + (#xF7D9 #xE5BC) + (#xF7D8 #xE5BB) + (#xF7D7 #xE5BA) + (#xF7D6 #xE5B9) + (#xF7D5 #xE5B8) + (#xF7D4 #xE5B7) + (#xF7D3 #xE5B6) + (#xF7D2 #xE5B5) + (#xF7D1 #xE5B4) + (#xF7D0 #xE5B3) + (#xF7CF #xE5B2) + (#xF7CE #xE5B1) + (#xF7CD #xE5B0) + (#xF7CC #xE5AF) + (#xF7CB #xE5AE) + (#xF7CA #xE5AD) + (#xF7C9 #xE5AC) + (#xF7C8 #xE5AB) + (#xF7C7 #xE5AA) + (#xF7C6 #xE5A9) + (#xF7C5 #xE5A8) + (#xF7C4 #xE5A7) + (#xF7C3 #xE5A6) + (#xF7C2 #xE5A5) + (#xF7C1 #xE5A4) + (#xF7C0 #xE5A3) + (#xF7BF #xE5A2) + (#xF7BE #xE5A1) + (#xF7BD #xE5A0) + (#xF7BC #xE59F) + (#xF7BB #xE59E) + (#xF7BA #xE59D) + (#xF7B9 #xE59C) + (#xF7B8 #xE59B) + (#xF7B7 #xE59A) + (#xF7B6 #xE599) + (#xF7B5 #xE598) + (#xF7B4 #xE597) + (#xF7B3 #xE596) + (#xF7B2 #xE595) + (#xF7B1 #xE594) + (#xF7B0 #xE593) + (#xF7AF #xE592) + (#xF7AE #xE591) + (#xF7AD #xE590) + (#xF7AC #xE58F) + (#xF7AB #xE58E) + (#xF7AA #xE58D) + (#xF7A9 #xE58C) + (#xF7A8 #xE58B) + (#xF7A7 #xE58A) + (#xF7A6 #xE589) + (#xF7A5 #xE588) + (#xF7A4 #xE587) + (#xF7A3 #xE586) + (#xF7A2 #xE585) + (#xF7A1 #xE584) + (#xF7A0 #xE583) + (#xF79F #xE582) + (#xF79E #xE581) + (#xF79D #xE580) + (#xF79C #xE57F) + (#xF79B #xE57E) + (#xF79A #xE57D) + (#xF799 #xE57C) + (#xF798 #xE57B) + (#xF797 #xE57A) + (#xF796 #xE579) + (#xF795 #xE578) + (#xF794 #xE577) + (#xF793 #xE576) + (#xF792 #xE575) + (#xF791 #xE574) + (#xF790 #xE573) + (#xF78F #xE572) + (#xF78E #xE571) + (#xF78D #xE570) + (#xF78C #xE56F) + (#xF78B #xE56E) + (#xF78A #xE56D) + (#xF789 #xE56C) + (#xF788 #xE56B) + (#xF787 #xE56A) + (#xF786 #xE569) + (#xF785 #xE568) + (#xF784 #xE567) + (#xF783 #xE566) + (#xF782 #xE565) + (#xF781 #xE564) + (#xF780 #xE563) + (#xF77E #xE562) + (#xF77D #xE561) + (#xF77C #xE560) + (#xF77B #xE55F) + (#xF77A #xE55E) + (#xF779 #xE55D) + (#xF778 #xE55C) + (#xF777 #xE55B) + (#xF776 #xE55A) + (#xF775 #xE559) + (#xF774 #xE558) + (#xF773 #xE557) + (#xF772 #xE556) + (#xF771 #xE555) + (#xF770 #xE554) + (#xF76F #xE553) + (#xF76E #xE552) + (#xF76D #xE551) + (#xF76C #xE550) + (#xF76B #xE54F) + (#xF76A #xE54E) + (#xF769 #xE54D) + (#xF768 #xE54C) + (#xF767 #xE54B) + (#xF766 #xE54A) + (#xF765 #xE549) + (#xF764 #xE548) + (#xF763 #xE547) + (#xF762 #xE546) + (#xF761 #xE545) + (#xF760 #xE544) + (#xF75F #xE543) + (#xF75E #xE542) + (#xF75D #xE541) + (#xF75C #xE540) + (#xF75B #xE53F) + (#xF75A #xE53E) + (#xF759 #xE53D) + (#xF758 #xE53C) + (#xF757 #xE53B) + (#xF756 #xE53A) + (#xF755 #xE539) + (#xF754 #xE538) + (#xF753 #xE537) + (#xF752 #xE536) + (#xF751 #xE535) + (#xF750 #xE534) + (#xF74F #xE533) + (#xF74E #xE532) + (#xF74D #xE531) + (#xF74C #xE530) + (#xF74B #xE52F) + (#xF74A #xE52E) + (#xF749 #xE52D) + (#xF748 #xE52C) + (#xF747 #xE52B) + (#xF746 #xE52A) + (#xF745 #xE529) + (#xF744 #xE528) + (#xF743 #xE527) + (#xF742 #xE526) + (#xF741 #xE525) + (#xF740 #xE524) + (#xF6FC #xE523) + (#xF6FB #xE522) + (#xF6FA #xE521) + (#xF6F9 #xE520) + (#xF6F8 #xE51F) + (#xF6F7 #xE51E) + (#xF6F6 #xE51D) + (#xF6F5 #xE51C) + (#xF6F4 #xE51B) + (#xF6F3 #xE51A) + (#xF6F2 #xE519) + (#xF6F1 #xE518) + (#xF6F0 #xE517) + (#xF6EF #xE516) + (#xF6EE #xE515) + (#xF6ED #xE514) + (#xF6EC #xE513) + (#xF6EB #xE512) + (#xF6EA #xE511) + (#xF6E9 #xE510) + (#xF6E8 #xE50F) + (#xF6E7 #xE50E) + (#xF6E6 #xE50D) + (#xF6E5 #xE50C) + (#xF6E4 #xE50B) + (#xF6E3 #xE50A) + (#xF6E2 #xE509) + (#xF6E1 #xE508) + (#xF6E0 #xE507) + (#xF6DF #xE506) + (#xF6DE #xE505) + (#xF6DD #xE504) + (#xF6DC #xE503) + (#xF6DB #xE502) + (#xF6DA #xE501) + (#xF6D9 #xE500) + (#xF6D8 #xE4FF) + (#xF6D7 #xE4FE) + (#xF6D6 #xE4FD) + (#xF6D5 #xE4FC) + (#xF6D4 #xE4FB) + (#xF6D3 #xE4FA) + (#xF6D2 #xE4F9) + (#xF6D1 #xE4F8) + (#xF6D0 #xE4F7) + (#xF6CF #xE4F6) + (#xF6CE #xE4F5) + (#xF6CD #xE4F4) + (#xF6CC #xE4F3) + (#xF6CB #xE4F2) + (#xF6CA #xE4F1) + (#xF6C9 #xE4F0) + (#xF6C8 #xE4EF) + (#xF6C7 #xE4EE) + (#xF6C6 #xE4ED) + (#xF6C5 #xE4EC) + (#xF6C4 #xE4EB) + (#xF6C3 #xE4EA) + (#xF6C2 #xE4E9) + (#xF6C1 #xE4E8) + (#xF6C0 #xE4E7) + (#xF6BF #xE4E6) + (#xF6BE #xE4E5) + (#xF6BD #xE4E4) + (#xF6BC #xE4E3) + (#xF6BB #xE4E2) + (#xF6BA #xE4E1) + (#xF6B9 #xE4E0) + (#xF6B8 #xE4DF) + (#xF6B7 #xE4DE) + (#xF6B6 #xE4DD) + (#xF6B5 #xE4DC) + (#xF6B4 #xE4DB) + (#xF6B3 #xE4DA) + (#xF6B2 #xE4D9) + (#xF6B1 #xE4D8) + (#xF6B0 #xE4D7) + (#xF6AF #xE4D6) + (#xF6AE #xE4D5) + (#xF6AD #xE4D4) + (#xF6AC #xE4D3) + (#xF6AB #xE4D2) + (#xF6AA #xE4D1) + (#xF6A9 #xE4D0) + (#xF6A8 #xE4CF) + (#xF6A7 #xE4CE) + (#xF6A6 #xE4CD) + (#xF6A5 #xE4CC) + (#xF6A4 #xE4CB) + (#xF6A3 #xE4CA) + (#xF6A2 #xE4C9) + (#xF6A1 #xE4C8) + (#xF6A0 #xE4C7) + (#xF69F #xE4C6) + (#xF69E #xE4C5) + (#xF69D #xE4C4) + (#xF69C #xE4C3) + (#xF69B #xE4C2) + (#xF69A #xE4C1) + (#xF699 #xE4C0) + (#xF698 #xE4BF) + (#xF697 #xE4BE) + (#xF696 #xE4BD) + (#xF695 #xE4BC) + (#xF694 #xE4BB) + (#xF693 #xE4BA) + (#xF692 #xE4B9) + (#xF691 #xE4B8) + (#xF690 #xE4B7) + (#xF68F #xE4B6) + (#xF68E #xE4B5) + (#xF68D #xE4B4) + (#xF68C #xE4B3) + (#xF68B #xE4B2) + (#xF68A #xE4B1) + (#xF689 #xE4B0) + (#xF688 #xE4AF) + (#xF687 #xE4AE) + (#xF686 #xE4AD) + (#xF685 #xE4AC) + (#xF684 #xE4AB) + (#xF683 #xE4AA) + (#xF682 #xE4A9) + (#xF681 #xE4A8) + (#xF680 #xE4A7) + (#xF67E #xE4A6) + (#xF67D #xE4A5) + (#xF67C #xE4A4) + (#xF67B #xE4A3) + (#xF67A #xE4A2) + (#xF679 #xE4A1) + (#xF678 #xE4A0) + (#xF677 #xE49F) + (#xF676 #xE49E) + (#xF675 #xE49D) + (#xF674 #xE49C) + (#xF673 #xE49B) + (#xF672 #xE49A) + (#xF671 #xE499) + (#xF670 #xE498) + (#xF66F #xE497) + (#xF66E #xE496) + (#xF66D #xE495) + (#xF66C #xE494) + (#xF66B #xE493) + (#xF66A #xE492) + (#xF669 #xE491) + (#xF668 #xE490) + (#xF667 #xE48F) + (#xF666 #xE48E) + (#xF665 #xE48D) + (#xF664 #xE48C) + (#xF663 #xE48B) + (#xF662 #xE48A) + (#xF661 #xE489) + (#xF660 #xE488) + (#xF65F #xE487) + (#xF65E #xE486) + (#xF65D #xE485) + (#xF65C #xE484) + (#xF65B #xE483) + (#xF65A #xE482) + (#xF659 #xE481) + (#xF658 #xE480) + (#xF657 #xE47F) + (#xF656 #xE47E) + (#xF655 #xE47D) + (#xF654 #xE47C) + (#xF653 #xE47B) + (#xF652 #xE47A) + (#xF651 #xE479) + (#xF650 #xE478) + (#xF64F #xE477) + (#xF64E #xE476) + (#xF64D #xE475) + (#xF64C #xE474) + (#xF64B #xE473) + (#xF64A #xE472) + (#xF649 #xE471) + (#xF648 #xE470) + (#xF647 #xE46F) + (#xF646 #xE46E) + (#xF645 #xE46D) + (#xF644 #xE46C) + (#xF643 #xE46B) + (#xF642 #xE46A) + (#xF641 #xE469) + (#xF640 #xE468) + (#xF5FC #xE467) + (#xF5FB #xE466) + (#xF5FA #xE465) + (#xF5F9 #xE464) + (#xF5F8 #xE463) + (#xF5F7 #xE462) + (#xF5F6 #xE461) + (#xF5F5 #xE460) + (#xF5F4 #xE45F) + (#xF5F3 #xE45E) + (#xF5F2 #xE45D) + (#xF5F1 #xE45C) + (#xF5F0 #xE45B) + (#xF5EF #xE45A) + (#xF5EE #xE459) + (#xF5ED #xE458) + (#xF5EC #xE457) + (#xF5EB #xE456) + (#xF5EA #xE455) + (#xF5E9 #xE454) + (#xF5E8 #xE453) + (#xF5E7 #xE452) + (#xF5E6 #xE451) + (#xF5E5 #xE450) + (#xF5E4 #xE44F) + (#xF5E3 #xE44E) + (#xF5E2 #xE44D) + (#xF5E1 #xE44C) + (#xF5E0 #xE44B) + (#xF5DF #xE44A) + (#xF5DE #xE449) + (#xF5DD #xE448) + (#xF5DC #xE447) + (#xF5DB #xE446) + (#xF5DA #xE445) + (#xF5D9 #xE444) + (#xF5D8 #xE443) + (#xF5D7 #xE442) + (#xF5D6 #xE441) + (#xF5D5 #xE440) + (#xF5D4 #xE43F) + (#xF5D3 #xE43E) + (#xF5D2 #xE43D) + (#xF5D1 #xE43C) + (#xF5D0 #xE43B) + (#xF5CF #xE43A) + (#xF5CE #xE439) + (#xF5CD #xE438) + (#xF5CC #xE437) + (#xF5CB #xE436) + (#xF5CA #xE435) + (#xF5C9 #xE434) + (#xF5C8 #xE433) + (#xF5C7 #xE432) + (#xF5C6 #xE431) + (#xF5C5 #xE430) + (#xF5C4 #xE42F) + (#xF5C3 #xE42E) + (#xF5C2 #xE42D) + (#xF5C1 #xE42C) + (#xF5C0 #xE42B) + (#xF5BF #xE42A) + (#xF5BE #xE429) + (#xF5BD #xE428) + (#xF5BC #xE427) + (#xF5BB #xE426) + (#xF5BA #xE425) + (#xF5B9 #xE424) + (#xF5B8 #xE423) + (#xF5B7 #xE422) + (#xF5B6 #xE421) + (#xF5B5 #xE420) + (#xF5B4 #xE41F) + (#xF5B3 #xE41E) + (#xF5B2 #xE41D) + (#xF5B1 #xE41C) + (#xF5B0 #xE41B) + (#xF5AF #xE41A) + (#xF5AE #xE419) + (#xF5AD #xE418) + (#xF5AC #xE417) + (#xF5AB #xE416) + (#xF5AA #xE415) + (#xF5A9 #xE414) + (#xF5A8 #xE413) + (#xF5A7 #xE412) + (#xF5A6 #xE411) + (#xF5A5 #xE410) + (#xF5A4 #xE40F) + (#xF5A3 #xE40E) + (#xF5A2 #xE40D) + (#xF5A1 #xE40C) + (#xF5A0 #xE40B) + (#xF59F #xE40A) + (#xF59E #xE409) + (#xF59D #xE408) + (#xF59C #xE407) + (#xF59B #xE406) + (#xF59A #xE405) + (#xF599 #xE404) + (#xF598 #xE403) + (#xF597 #xE402) + (#xF596 #xE401) + (#xF595 #xE400) + (#xF594 #xE3FF) + (#xF593 #xE3FE) + (#xF592 #xE3FD) + (#xF591 #xE3FC) + (#xF590 #xE3FB) + (#xF58F #xE3FA) + (#xF58E #xE3F9) + (#xF58D #xE3F8) + (#xF58C #xE3F7) + (#xF58B #xE3F6) + (#xF58A #xE3F5) + (#xF589 #xE3F4) + (#xF588 #xE3F3) + (#xF587 #xE3F2) + (#xF586 #xE3F1) + (#xF585 #xE3F0) + (#xF584 #xE3EF) + (#xF583 #xE3EE) + (#xF582 #xE3ED) + (#xF581 #xE3EC) + (#xF580 #xE3EB) + (#xF57E #xE3EA) + (#xF57D #xE3E9) + (#xF57C #xE3E8) + (#xF57B #xE3E7) + (#xF57A #xE3E6) + (#xF579 #xE3E5) + (#xF578 #xE3E4) + (#xF577 #xE3E3) + (#xF576 #xE3E2) + (#xF575 #xE3E1) + (#xF574 #xE3E0) + (#xF573 #xE3DF) + (#xF572 #xE3DE) + (#xF571 #xE3DD) + (#xF570 #xE3DC) + (#xF56F #xE3DB) + (#xF56E #xE3DA) + (#xF56D #xE3D9) + (#xF56C #xE3D8) + (#xF56B #xE3D7) + (#xF56A #xE3D6) + (#xF569 #xE3D5) + (#xF568 #xE3D4) + (#xF567 #xE3D3) + (#xF566 #xE3D2) + (#xF565 #xE3D1) + (#xF564 #xE3D0) + (#xF563 #xE3CF) + (#xF562 #xE3CE) + (#xF561 #xE3CD) + (#xF560 #xE3CC) + (#xF55F #xE3CB) + (#xF55E #xE3CA) + (#xF55D #xE3C9) + (#xF55C #xE3C8) + (#xF55B #xE3C7) + (#xF55A #xE3C6) + (#xF559 #xE3C5) + (#xF558 #xE3C4) + (#xF557 #xE3C3) + (#xF556 #xE3C2) + (#xF555 #xE3C1) + (#xF554 #xE3C0) + (#xF553 #xE3BF) + (#xF552 #xE3BE) + (#xF551 #xE3BD) + (#xF550 #xE3BC) + (#xF54F #xE3BB) + (#xF54E #xE3BA) + (#xF54D #xE3B9) + (#xF54C #xE3B8) + (#xF54B #xE3B7) + (#xF54A #xE3B6) + (#xF549 #xE3B5) + (#xF548 #xE3B4) + (#xF547 #xE3B3) + (#xF546 #xE3B2) + (#xF545 #xE3B1) + (#xF544 #xE3B0) + (#xF543 #xE3AF) + (#xF542 #xE3AE) + (#xF541 #xE3AD) + (#xF540 #xE3AC) + (#xF4FC #xE3AB) + (#xF4FB #xE3AA) + (#xF4FA #xE3A9) + (#xF4F9 #xE3A8) + (#xF4F8 #xE3A7) + (#xF4F7 #xE3A6) + (#xF4F6 #xE3A5) + (#xF4F5 #xE3A4) + (#xF4F4 #xE3A3) + (#xF4F3 #xE3A2) + (#xF4F2 #xE3A1) + (#xF4F1 #xE3A0) + (#xF4F0 #xE39F) + (#xF4EF #xE39E) + (#xF4EE #xE39D) + (#xF4ED #xE39C) + (#xF4EC #xE39B) + (#xF4EB #xE39A) + (#xF4EA #xE399) + (#xF4E9 #xE398) + (#xF4E8 #xE397) + (#xF4E7 #xE396) + (#xF4E6 #xE395) + (#xF4E5 #xE394) + (#xF4E4 #xE393) + (#xF4E3 #xE392) + (#xF4E2 #xE391) + (#xF4E1 #xE390) + (#xF4E0 #xE38F) + (#xF4DF #xE38E) + (#xF4DE #xE38D) + (#xF4DD #xE38C) + (#xF4DC #xE38B) + (#xF4DB #xE38A) + (#xF4DA #xE389) + (#xF4D9 #xE388) + (#xF4D8 #xE387) + (#xF4D7 #xE386) + (#xF4D6 #xE385) + (#xF4D5 #xE384) + (#xF4D4 #xE383) + (#xF4D3 #xE382) + (#xF4D2 #xE381) + (#xF4D1 #xE380) + (#xF4D0 #xE37F) + (#xF4CF #xE37E) + (#xF4CE #xE37D) + (#xF4CD #xE37C) + (#xF4CC #xE37B) + (#xF4CB #xE37A) + (#xF4CA #xE379) + (#xF4C9 #xE378) + (#xF4C8 #xE377) + (#xF4C7 #xE376) + (#xF4C6 #xE375) + (#xF4C5 #xE374) + (#xF4C4 #xE373) + (#xF4C3 #xE372) + (#xF4C2 #xE371) + (#xF4C1 #xE370) + (#xF4C0 #xE36F) + (#xF4BF #xE36E) + (#xF4BE #xE36D) + (#xF4BD #xE36C) + (#xF4BC #xE36B) + (#xF4BB #xE36A) + (#xF4BA #xE369) + (#xF4B9 #xE368) + (#xF4B8 #xE367) + (#xF4B7 #xE366) + (#xF4B6 #xE365) + (#xF4B5 #xE364) + (#xF4B4 #xE363) + (#xF4B3 #xE362) + (#xF4B2 #xE361) + (#xF4B1 #xE360) + (#xF4B0 #xE35F) + (#xF4AF #xE35E) + (#xF4AE #xE35D) + (#xF4AD #xE35C) + (#xF4AC #xE35B) + (#xF4AB #xE35A) + (#xF4AA #xE359) + (#xF4A9 #xE358) + (#xF4A8 #xE357) + (#xF4A7 #xE356) + (#xF4A6 #xE355) + (#xF4A5 #xE354) + (#xF4A4 #xE353) + (#xF4A3 #xE352) + (#xF4A2 #xE351) + (#xF4A1 #xE350) + (#xF4A0 #xE34F) + (#xF49F #xE34E) + (#xF49E #xE34D) + (#xF49D #xE34C) + (#xF49C #xE34B) + (#xF49B #xE34A) + (#xF49A #xE349) + (#xF499 #xE348) + (#xF498 #xE347) + (#xF497 #xE346) + (#xF496 #xE345) + (#xF495 #xE344) + (#xF494 #xE343) + (#xF493 #xE342) + (#xF492 #xE341) + (#xF491 #xE340) + (#xF490 #xE33F) + (#xF48F #xE33E) + (#xF48E #xE33D) + (#xF48D #xE33C) + (#xF48C #xE33B) + (#xF48B #xE33A) + (#xF48A #xE339) + (#xF489 #xE338) + (#xF488 #xE337) + (#xF487 #xE336) + (#xF486 #xE335) + (#xF485 #xE334) + (#xF484 #xE333) + (#xF483 #xE332) + (#xF482 #xE331) + (#xF481 #xE330) + (#xF480 #xE32F) + (#xF47E #xE32E) + (#xF47D #xE32D) + (#xF47C #xE32C) + (#xF47B #xE32B) + (#xF47A #xE32A) + (#xF479 #xE329) + (#xF478 #xE328) + (#xF477 #xE327) + (#xF476 #xE326) + (#xF475 #xE325) + (#xF474 #xE324) + (#xF473 #xE323) + (#xF472 #xE322) + (#xF471 #xE321) + (#xF470 #xE320) + (#xF46F #xE31F) + (#xF46E #xE31E) + (#xF46D #xE31D) + (#xF46C #xE31C) + (#xF46B #xE31B) + (#xF46A #xE31A) + (#xF469 #xE319) + (#xF468 #xE318) + (#xF467 #xE317) + (#xF466 #xE316) + (#xF465 #xE315) + (#xF464 #xE314) + (#xF463 #xE313) + (#xF462 #xE312) + (#xF461 #xE311) + (#xF460 #xE310) + (#xF45F #xE30F) + (#xF45E #xE30E) + (#xF45D #xE30D) + (#xF45C #xE30C) + (#xF45B #xE30B) + (#xF45A #xE30A) + (#xF459 #xE309) + (#xF458 #xE308) + (#xF457 #xE307) + (#xF456 #xE306) + (#xF455 #xE305) + (#xF454 #xE304) + (#xF453 #xE303) + (#xF452 #xE302) + (#xF451 #xE301) + (#xF450 #xE300) + (#xF44F #xE2FF) + (#xF44E #xE2FE) + (#xF44D #xE2FD) + (#xF44C #xE2FC) + (#xF44B #xE2FB) + (#xF44A #xE2FA) + (#xF449 #xE2F9) + (#xF448 #xE2F8) + (#xF447 #xE2F7) + (#xF446 #xE2F6) + (#xF445 #xE2F5) + (#xF444 #xE2F4) + (#xF443 #xE2F3) + (#xF442 #xE2F2) + (#xF441 #xE2F1) + (#xF440 #xE2F0) + (#xF3FC #xE2EF) + (#xF3FB #xE2EE) + (#xF3FA #xE2ED) + (#xF3F9 #xE2EC) + (#xF3F8 #xE2EB) + (#xF3F7 #xE2EA) + (#xF3F6 #xE2E9) + (#xF3F5 #xE2E8) + (#xF3F4 #xE2E7) + (#xF3F3 #xE2E6) + (#xF3F2 #xE2E5) + (#xF3F1 #xE2E4) + (#xF3F0 #xE2E3) + (#xF3EF #xE2E2) + (#xF3EE #xE2E1) + (#xF3ED #xE2E0) + (#xF3EC #xE2DF) + (#xF3EB #xE2DE) + (#xF3EA #xE2DD) + (#xF3E9 #xE2DC) + (#xF3E8 #xE2DB) + (#xF3E7 #xE2DA) + (#xF3E6 #xE2D9) + (#xF3E5 #xE2D8) + (#xF3E4 #xE2D7) + (#xF3E3 #xE2D6) + (#xF3E2 #xE2D5) + (#xF3E1 #xE2D4) + (#xF3E0 #xE2D3) + (#xF3DF #xE2D2) + (#xF3DE #xE2D1) + (#xF3DD #xE2D0) + (#xF3DC #xE2CF) + (#xF3DB #xE2CE) + (#xF3DA #xE2CD) + (#xF3D9 #xE2CC) + (#xF3D8 #xE2CB) + (#xF3D7 #xE2CA) + (#xF3D6 #xE2C9) + (#xF3D5 #xE2C8) + (#xF3D4 #xE2C7) + (#xF3D3 #xE2C6) + (#xF3D2 #xE2C5) + (#xF3D1 #xE2C4) + (#xF3D0 #xE2C3) + (#xF3CF #xE2C2) + (#xF3CE #xE2C1) + (#xF3CD #xE2C0) + (#xF3CC #xE2BF) + (#xF3CB #xE2BE) + (#xF3CA #xE2BD) + (#xF3C9 #xE2BC) + (#xF3C8 #xE2BB) + (#xF3C7 #xE2BA) + (#xF3C6 #xE2B9) + (#xF3C5 #xE2B8) + (#xF3C4 #xE2B7) + (#xF3C3 #xE2B6) + (#xF3C2 #xE2B5) + (#xF3C1 #xE2B4) + (#xF3C0 #xE2B3) + (#xF3BF #xE2B2) + (#xF3BE #xE2B1) + (#xF3BD #xE2B0) + (#xF3BC #xE2AF) + (#xF3BB #xE2AE) + (#xF3BA #xE2AD) + (#xF3B9 #xE2AC) + (#xF3B8 #xE2AB) + (#xF3B7 #xE2AA) + (#xF3B6 #xE2A9) + (#xF3B5 #xE2A8) + (#xF3B4 #xE2A7) + (#xF3B3 #xE2A6) + (#xF3B2 #xE2A5) + (#xF3B1 #xE2A4) + (#xF3B0 #xE2A3) + (#xF3AF #xE2A2) + (#xF3AE #xE2A1) + (#xF3AD #xE2A0) + (#xF3AC #xE29F) + (#xF3AB #xE29E) + (#xF3AA #xE29D) + (#xF3A9 #xE29C) + (#xF3A8 #xE29B) + (#xF3A7 #xE29A) + (#xF3A6 #xE299) + (#xF3A5 #xE298) + (#xF3A4 #xE297) + (#xF3A3 #xE296) + (#xF3A2 #xE295) + (#xF3A1 #xE294) + (#xF3A0 #xE293) + (#xF39F #xE292) + (#xF39E #xE291) + (#xF39D #xE290) + (#xF39C #xE28F) + (#xF39B #xE28E) + (#xF39A #xE28D) + (#xF399 #xE28C) + (#xF398 #xE28B) + (#xF397 #xE28A) + (#xF396 #xE289) + (#xF395 #xE288) + (#xF394 #xE287) + (#xF393 #xE286) + (#xF392 #xE285) + (#xF391 #xE284) + (#xF390 #xE283) + (#xF38F #xE282) + (#xF38E #xE281) + (#xF38D #xE280) + (#xF38C #xE27F) + (#xF38B #xE27E) + (#xF38A #xE27D) + (#xF389 #xE27C) + (#xF388 #xE27B) + (#xF387 #xE27A) + (#xF386 #xE279) + (#xF385 #xE278) + (#xF384 #xE277) + (#xF383 #xE276) + (#xF382 #xE275) + (#xF381 #xE274) + (#xF380 #xE273) + (#xF37E #xE272) + (#xF37D #xE271) + (#xF37C #xE270) + (#xF37B #xE26F) + (#xF37A #xE26E) + (#xF379 #xE26D) + (#xF378 #xE26C) + (#xF377 #xE26B) + (#xF376 #xE26A) + (#xF375 #xE269) + (#xF374 #xE268) + (#xF373 #xE267) + (#xF372 #xE266) + (#xF371 #xE265) + (#xF370 #xE264) + (#xF36F #xE263) + (#xF36E #xE262) + (#xF36D #xE261) + (#xF36C #xE260) + (#xF36B #xE25F) + (#xF36A #xE25E) + (#xF369 #xE25D) + (#xF368 #xE25C) + (#xF367 #xE25B) + (#xF366 #xE25A) + (#xF365 #xE259) + (#xF364 #xE258) + (#xF363 #xE257) + (#xF362 #xE256) + (#xF361 #xE255) + (#xF360 #xE254) + (#xF35F #xE253) + (#xF35E #xE252) + (#xF35D #xE251) + (#xF35C #xE250) + (#xF35B #xE24F) + (#xF35A #xE24E) + (#xF359 #xE24D) + (#xF358 #xE24C) + (#xF357 #xE24B) + (#xF356 #xE24A) + (#xF355 #xE249) + (#xF354 #xE248) + (#xF353 #xE247) + (#xF352 #xE246) + (#xF351 #xE245) + (#xF350 #xE244) + (#xF34F #xE243) + (#xF34E #xE242) + (#xF34D #xE241) + (#xF34C #xE240) + (#xF34B #xE23F) + (#xF34A #xE23E) + (#xF349 #xE23D) + (#xF348 #xE23C) + (#xF347 #xE23B) + (#xF346 #xE23A) + (#xF345 #xE239) + (#xF344 #xE238) + (#xF343 #xE237) + (#xF342 #xE236) + (#xF341 #xE235) + (#xF340 #xE234) + (#xF2FC #xE233) + (#xF2FB #xE232) + (#xF2FA #xE231) + (#xF2F9 #xE230) + (#xF2F8 #xE22F) + (#xF2F7 #xE22E) + (#xF2F6 #xE22D) + (#xF2F5 #xE22C) + (#xF2F4 #xE22B) + (#xF2F3 #xE22A) + (#xF2F2 #xE229) + (#xF2F1 #xE228) + (#xF2F0 #xE227) + (#xF2EF #xE226) + (#xF2EE #xE225) + (#xF2ED #xE224) + (#xF2EC #xE223) + (#xF2EB #xE222) + (#xF2EA #xE221) + (#xF2E9 #xE220) + (#xF2E8 #xE21F) + (#xF2E7 #xE21E) + (#xF2E6 #xE21D) + (#xF2E5 #xE21C) + (#xF2E4 #xE21B) + (#xF2E3 #xE21A) + (#xF2E2 #xE219) + (#xF2E1 #xE218) + (#xF2E0 #xE217) + (#xF2DF #xE216) + (#xF2DE #xE215) + (#xF2DD #xE214) + (#xF2DC #xE213) + (#xF2DB #xE212) + (#xF2DA #xE211) + (#xF2D9 #xE210) + (#xF2D8 #xE20F) + (#xF2D7 #xE20E) + (#xF2D6 #xE20D) + (#xF2D5 #xE20C) + (#xF2D4 #xE20B) + (#xF2D3 #xE20A) + (#xF2D2 #xE209) + (#xF2D1 #xE208) + (#xF2D0 #xE207) + (#xF2CF #xE206) + (#xF2CE #xE205) + (#xF2CD #xE204) + (#xF2CC #xE203) + (#xF2CB #xE202) + (#xF2CA #xE201) + (#xF2C9 #xE200) + (#xF2C8 #xE1FF) + (#xF2C7 #xE1FE) + (#xF2C6 #xE1FD) + (#xF2C5 #xE1FC) + (#xF2C4 #xE1FB) + (#xF2C3 #xE1FA) + (#xF2C2 #xE1F9) + (#xF2C1 #xE1F8) + (#xF2C0 #xE1F7) + (#xF2BF #xE1F6) + (#xF2BE #xE1F5) + (#xF2BD #xE1F4) + (#xF2BC #xE1F3) + (#xF2BB #xE1F2) + (#xF2BA #xE1F1) + (#xF2B9 #xE1F0) + (#xF2B8 #xE1EF) + (#xF2B7 #xE1EE) + (#xF2B6 #xE1ED) + (#xF2B5 #xE1EC) + (#xF2B4 #xE1EB) + (#xF2B3 #xE1EA) + (#xF2B2 #xE1E9) + (#xF2B1 #xE1E8) + (#xF2B0 #xE1E7) + (#xF2AF #xE1E6) + (#xF2AE #xE1E5) + (#xF2AD #xE1E4) + (#xF2AC #xE1E3) + (#xF2AB #xE1E2) + (#xF2AA #xE1E1) + (#xF2A9 #xE1E0) + (#xF2A8 #xE1DF) + (#xF2A7 #xE1DE) + (#xF2A6 #xE1DD) + (#xF2A5 #xE1DC) + (#xF2A4 #xE1DB) + (#xF2A3 #xE1DA) + (#xF2A2 #xE1D9) + (#xF2A1 #xE1D8) + (#xF2A0 #xE1D7) + (#xF29F #xE1D6) + (#xF29E #xE1D5) + (#xF29D #xE1D4) + (#xF29C #xE1D3) + (#xF29B #xE1D2) + (#xF29A #xE1D1) + (#xF299 #xE1D0) + (#xF298 #xE1CF) + (#xF297 #xE1CE) + (#xF296 #xE1CD) + (#xF295 #xE1CC) + (#xF294 #xE1CB) + (#xF293 #xE1CA) + (#xF292 #xE1C9) + (#xF291 #xE1C8) + (#xF290 #xE1C7) + (#xF28F #xE1C6) + (#xF28E #xE1C5) + (#xF28D #xE1C4) + (#xF28C #xE1C3) + (#xF28B #xE1C2) + (#xF28A #xE1C1) + (#xF289 #xE1C0) + (#xF288 #xE1BF) + (#xF287 #xE1BE) + (#xF286 #xE1BD) + (#xF285 #xE1BC) + (#xF284 #xE1BB) + (#xF283 #xE1BA) + (#xF282 #xE1B9) + (#xF281 #xE1B8) + (#xF280 #xE1B7) + (#xF27E #xE1B6) + (#xF27D #xE1B5) + (#xF27C #xE1B4) + (#xF27B #xE1B3) + (#xF27A #xE1B2) + (#xF279 #xE1B1) + (#xF278 #xE1B0) + (#xF277 #xE1AF) + (#xF276 #xE1AE) + (#xF275 #xE1AD) + (#xF274 #xE1AC) + (#xF273 #xE1AB) + (#xF272 #xE1AA) + (#xF271 #xE1A9) + (#xF270 #xE1A8) + (#xF26F #xE1A7) + (#xF26E #xE1A6) + (#xF26D #xE1A5) + (#xF26C #xE1A4) + (#xF26B #xE1A3) + (#xF26A #xE1A2) + (#xF269 #xE1A1) + (#xF268 #xE1A0) + (#xF267 #xE19F) + (#xF266 #xE19E) + (#xF265 #xE19D) + (#xF264 #xE19C) + (#xF263 #xE19B) + (#xF262 #xE19A) + (#xF261 #xE199) + (#xF260 #xE198) + (#xF25F #xE197) + (#xF25E #xE196) + (#xF25D #xE195) + (#xF25C #xE194) + (#xF25B #xE193) + (#xF25A #xE192) + (#xF259 #xE191) + (#xF258 #xE190) + (#xF257 #xE18F) + (#xF256 #xE18E) + (#xF255 #xE18D) + (#xF254 #xE18C) + (#xF253 #xE18B) + (#xF252 #xE18A) + (#xF251 #xE189) + (#xF250 #xE188) + (#xF24F #xE187) + (#xF24E #xE186) + (#xF24D #xE185) + (#xF24C #xE184) + (#xF24B #xE183) + (#xF24A #xE182) + (#xF249 #xE181) + (#xF248 #xE180) + (#xF247 #xE17F) + (#xF246 #xE17E) + (#xF245 #xE17D) + (#xF244 #xE17C) + (#xF243 #xE17B) + (#xF242 #xE17A) + (#xF241 #xE179) + (#xF240 #xE178) + (#xF1FC #xE177) + (#xF1FB #xE176) + (#xF1FA #xE175) + (#xF1F9 #xE174) + (#xF1F8 #xE173) + (#xF1F7 #xE172) + (#xF1F6 #xE171) + (#xF1F5 #xE170) + (#xF1F4 #xE16F) + (#xF1F3 #xE16E) + (#xF1F2 #xE16D) + (#xF1F1 #xE16C) + (#xF1F0 #xE16B) + (#xF1EF #xE16A) + (#xF1EE #xE169) + (#xF1ED #xE168) + (#xF1EC #xE167) + (#xF1EB #xE166) + (#xF1EA #xE165) + (#xF1E9 #xE164) + (#xF1E8 #xE163) + (#xF1E7 #xE162) + (#xF1E6 #xE161) + (#xF1E5 #xE160) + (#xF1E4 #xE15F) + (#xF1E3 #xE15E) + (#xF1E2 #xE15D) + (#xF1E1 #xE15C) + (#xF1E0 #xE15B) + (#xF1DF #xE15A) + (#xF1DE #xE159) + (#xF1DD #xE158) + (#xF1DC #xE157) + (#xF1DB #xE156) + (#xF1DA #xE155) + (#xF1D9 #xE154) + (#xF1D8 #xE153) + (#xF1D7 #xE152) + (#xF1D6 #xE151) + (#xF1D5 #xE150) + (#xF1D4 #xE14F) + (#xF1D3 #xE14E) + (#xF1D2 #xE14D) + (#xF1D1 #xE14C) + (#xF1D0 #xE14B) + (#xF1CF #xE14A) + (#xF1CE #xE149) + (#xF1CD #xE148) + (#xF1CC #xE147) + (#xF1CB #xE146) + (#xF1CA #xE145) + (#xF1C9 #xE144) + (#xF1C8 #xE143) + (#xF1C7 #xE142) + (#xF1C6 #xE141) + (#xF1C5 #xE140) + (#xF1C4 #xE13F) + (#xF1C3 #xE13E) + (#xF1C2 #xE13D) + (#xF1C1 #xE13C) + (#xF1C0 #xE13B) + (#xF1BF #xE13A) + (#xF1BE #xE139) + (#xF1BD #xE138) + (#xF1BC #xE137) + (#xF1BB #xE136) + (#xF1BA #xE135) + (#xF1B9 #xE134) + (#xF1B8 #xE133) + (#xF1B7 #xE132) + (#xF1B6 #xE131) + (#xF1B5 #xE130) + (#xF1B4 #xE12F) + (#xF1B3 #xE12E) + (#xF1B2 #xE12D) + (#xF1B1 #xE12C) + (#xF1B0 #xE12B) + (#xF1AF #xE12A) + (#xF1AE #xE129) + (#xF1AD #xE128) + (#xF1AC #xE127) + (#xF1AB #xE126) + (#xF1AA #xE125) + (#xF1A9 #xE124) + (#xF1A8 #xE123) + (#xF1A7 #xE122) + (#xF1A6 #xE121) + (#xF1A5 #xE120) + (#xF1A4 #xE11F) + (#xF1A3 #xE11E) + (#xF1A2 #xE11D) + (#xF1A1 #xE11C) + (#xF1A0 #xE11B) + (#xF19F #xE11A) + (#xF19E #xE119) + (#xF19D #xE118) + (#xF19C #xE117) + (#xF19B #xE116) + (#xF19A #xE115) + (#xF199 #xE114) + (#xF198 #xE113) + (#xF197 #xE112) + (#xF196 #xE111) + (#xF195 #xE110) + (#xF194 #xE10F) + (#xF193 #xE10E) + (#xF192 #xE10D) + (#xF191 #xE10C) + (#xF190 #xE10B) + (#xF18F #xE10A) + (#xF18E #xE109) + (#xF18D #xE108) + (#xF18C #xE107) + (#xF18B #xE106) + (#xF18A #xE105) + (#xF189 #xE104) + (#xF188 #xE103) + (#xF187 #xE102) + (#xF186 #xE101) + (#xF185 #xE100) + (#xF184 #xE0FF) + (#xF183 #xE0FE) + (#xF182 #xE0FD) + (#xF181 #xE0FC) + (#xF180 #xE0FB) + (#xF17E #xE0FA) + (#xF17D #xE0F9) + (#xF17C #xE0F8) + (#xF17B #xE0F7) + (#xF17A #xE0F6) + (#xF179 #xE0F5) + (#xF178 #xE0F4) + (#xF177 #xE0F3) + (#xF176 #xE0F2) + (#xF175 #xE0F1) + (#xF174 #xE0F0) + (#xF173 #xE0EF) + (#xF172 #xE0EE) + (#xF171 #xE0ED) + (#xF170 #xE0EC) + (#xF16F #xE0EB) + (#xF16E #xE0EA) + (#xF16D #xE0E9) + (#xF16C #xE0E8) + (#xF16B #xE0E7) + (#xF16A #xE0E6) + (#xF169 #xE0E5) + (#xF168 #xE0E4) + (#xF167 #xE0E3) + (#xF166 #xE0E2) + (#xF165 #xE0E1) + (#xF164 #xE0E0) + (#xF163 #xE0DF) + (#xF162 #xE0DE) + (#xF161 #xE0DD) + (#xF160 #xE0DC) + (#xF15F #xE0DB) + (#xF15E #xE0DA) + (#xF15D #xE0D9) + (#xF15C #xE0D8) + (#xF15B #xE0D7) + (#xF15A #xE0D6) + (#xF159 #xE0D5) + (#xF158 #xE0D4) + (#xF157 #xE0D3) + (#xF156 #xE0D2) + (#xF155 #xE0D1) + (#xF154 #xE0D0) + (#xF153 #xE0CF) + (#xF152 #xE0CE) + (#xF151 #xE0CD) + (#xF150 #xE0CC) + (#xF14F #xE0CB) + (#xF14E #xE0CA) + (#xF14D #xE0C9) + (#xF14C #xE0C8) + (#xF14B #xE0C7) + (#xF14A #xE0C6) + (#xF149 #xE0C5) + (#xF148 #xE0C4) + (#xF147 #xE0C3) + (#xF146 #xE0C2) + (#xF145 #xE0C1) + (#xF144 #xE0C0) + (#xF143 #xE0BF) + (#xF142 #xE0BE) + (#xF141 #xE0BD) + (#xF140 #xE0BC) + (#xF0FC #xE0BB) + (#xF0FB #xE0BA) + (#xF0FA #xE0B9) + (#xF0F9 #xE0B8) + (#xF0F8 #xE0B7) + (#xF0F7 #xE0B6) + (#xF0F6 #xE0B5) + (#xF0F5 #xE0B4) + (#xF0F4 #xE0B3) + (#xF0F3 #xE0B2) + (#xF0F2 #xE0B1) + (#xF0F1 #xE0B0) + (#xF0F0 #xE0AF) + (#xF0EF #xE0AE) + (#xF0EE #xE0AD) + (#xF0ED #xE0AC) + (#xF0EC #xE0AB) + (#xF0EB #xE0AA) + (#xF0EA #xE0A9) + (#xF0E9 #xE0A8) + (#xF0E8 #xE0A7) + (#xF0E7 #xE0A6) + (#xF0E6 #xE0A5) + (#xF0E5 #xE0A4) + (#xF0E4 #xE0A3) + (#xF0E3 #xE0A2) + (#xF0E2 #xE0A1) + (#xF0E1 #xE0A0) + (#xF0E0 #xE09F) + (#xF0DF #xE09E) + (#xF0DE #xE09D) + (#xF0DD #xE09C) + (#xF0DC #xE09B) + (#xF0DB #xE09A) + (#xF0DA #xE099) + (#xF0D9 #xE098) + (#xF0D8 #xE097) + (#xF0D7 #xE096) + (#xF0D6 #xE095) + (#xF0D5 #xE094) + (#xF0D4 #xE093) + (#xF0D3 #xE092) + (#xF0D2 #xE091) + (#xF0D1 #xE090) + (#xF0D0 #xE08F) + (#xF0CF #xE08E) + (#xF0CE #xE08D) + (#xF0CD #xE08C) + (#xF0CC #xE08B) + (#xF0CB #xE08A) + (#xF0CA #xE089) + (#xF0C9 #xE088) + (#xF0C8 #xE087) + (#xF0C7 #xE086) + (#xF0C6 #xE085) + (#xF0C5 #xE084) + (#xF0C4 #xE083) + (#xF0C3 #xE082) + (#xF0C2 #xE081) + (#xF0C1 #xE080) + (#xF0C0 #xE07F) + (#xF0BF #xE07E) + (#xF0BE #xE07D) + (#xF0BD #xE07C) + (#xF0BC #xE07B) + (#xF0BB #xE07A) + (#xF0BA #xE079) + (#xF0B9 #xE078) + (#xF0B8 #xE077) + (#xF0B7 #xE076) + (#xF0B6 #xE075) + (#xF0B5 #xE074) + (#xF0B4 #xE073) + (#xF0B3 #xE072) + (#xF0B2 #xE071) + (#xF0B1 #xE070) + (#xF0B0 #xE06F) + (#xF0AF #xE06E) + (#xF0AE #xE06D) + (#xF0AD #xE06C) + (#xF0AC #xE06B) + (#xF0AB #xE06A) + (#xF0AA #xE069) + (#xF0A9 #xE068) + (#xF0A8 #xE067) + (#xF0A7 #xE066) + (#xF0A6 #xE065) + (#xF0A5 #xE064) + (#xF0A4 #xE063) + (#xF0A3 #xE062) + (#xF0A2 #xE061) + (#xF0A1 #xE060) + (#xF0A0 #xE05F) + (#xF09F #xE05E) + (#xF09E #xE05D) + (#xF09D #xE05C) + (#xF09C #xE05B) + (#xF09B #xE05A) + (#xF09A #xE059) + (#xF099 #xE058) + (#xF098 #xE057) + (#xF097 #xE056) + (#xF096 #xE055) + (#xF095 #xE054) + (#xF094 #xE053) + (#xF093 #xE052) + (#xF092 #xE051) + (#xF091 #xE050) + (#xF090 #xE04F) + (#xF08F #xE04E) + (#xF08E #xE04D) + (#xF08D #xE04C) + (#xF08C #xE04B) + (#xF08B #xE04A) + (#xF08A #xE049) + (#xF089 #xE048) + (#xF088 #xE047) + (#xF087 #xE046) + (#xF086 #xE045) + (#xF085 #xE044) + (#xF084 #xE043) + (#xF083 #xE042) + (#xF082 #xE041) + (#xF081 #xE040) + (#xF080 #xE03F) + (#xF07E #xE03E) + (#xF07D #xE03D) + (#xF07C #xE03C) + (#xF07B #xE03B) + (#xF07A #xE03A) + (#xF079 #xE039) + (#xF078 #xE038) + (#xF077 #xE037) + (#xF076 #xE036) + (#xF075 #xE035) + (#xF074 #xE034) + (#xF073 #xE033) + (#xF072 #xE032) + (#xF071 #xE031) + (#xF070 #xE030) + (#xF06F #xE02F) + (#xF06E #xE02E) + (#xF06D #xE02D) + (#xF06C #xE02C) + (#xF06B #xE02B) + (#xF06A #xE02A) + (#xF069 #xE029) + (#xF068 #xE028) + (#xF067 #xE027) + (#xF066 #xE026) + (#xF065 #xE025) + (#xF064 #xE024) + (#xF063 #xE023) + (#xF062 #xE022) + (#xF061 #xE021) + (#xF060 #xE020) + (#xF05F #xE01F) + (#xF05E #xE01E) + (#xF05D #xE01D) + (#xF05C #xE01C) + (#xF05B #xE01B) + (#xF05A #xE01A) + (#xF059 #xE019) + (#xF058 #xE018) + (#xF057 #xE017) + (#xF056 #xE016) + (#xF055 #xE015) + (#xF054 #xE014) + (#xF053 #xE013) + (#xF052 #xE012) + (#xF051 #xE011) + (#xF050 #xE010) + (#xF04F #xE00F) + (#xF04E #xE00E) + (#xF04D #xE00D) + (#xF04C #xE00C) + (#xF04B #xE00B) + (#xF04A #xE00A) + (#xF049 #xE009) + (#xF048 #xE008) + (#xF047 #xE007) + (#xF046 #xE006) + (#xF045 #xE005) + (#xF044 #xE004) + (#xF043 #xE003) + (#xF042 #xE002) + (#xF041 #xE001) + (#xF040 #xE000) + (#xEEFC #xFF02) + (#xEEFB #xFF07) + (#xEEFA #xFFE4) + (#xEEF9 #xFFE2) + (#xEEF8 #x2179) + (#xEEF7 #x2178) + (#xEEF6 #x2177) + (#xEEF5 #x2176) + (#xEEF4 #x2175) + (#xEEF3 #x2174) + (#xEEF2 #x2173) + (#xEEF1 #x2172) + (#xEEF0 #x2171) + (#xEEEF #x2170) + (#xEEEC #x9ED1) + (#xEEEB #x9E19) + (#xEEEA #xFA2D) + (#xEEE9 #x9D6B) + (#xEEE8 #x9D70) + (#xEEE7 #x9C00) + (#xEEE6 #x9BBB) + (#xEEE5 #x9BB1) + (#xEEE4 #x9B8F) + (#xEEE3 #x9B72) + (#xEEE2 #x9B75) + (#xEEE1 #x9ADC) + (#xEEE0 #x9AD9) + (#xEEDF #x9A4E) + (#xEEDE #x999E) + (#xEEDD #xFA2C) + (#xEEDC #x9927) + (#xEEDB #xFA2B) + (#xEEDA #xFA2A) + (#xEED9 #x9865) + (#xEED8 #x9857) + (#xEED7 #x9755) + (#xEED6 #x9751) + (#xEED5 #x974F) + (#xEED4 #x974D) + (#xEED3 #x9743) + (#xEED2 #x973B) + (#xEED1 #x9733) + (#xEED0 #x96AF) + (#xEECF #x969D) + (#xEECE #xFA29) + (#xEECD #xF9DC) + (#xEECC #x9592) + (#xEECB #x9448) + (#xEECA #x9445) + (#xEEC9 #x9431) + (#xEEC8 #x93F8) + (#xEEC7 #x93DE) + (#xEEC6 #x93C6) + (#xEEC5 #x93A4) + (#xEEC4 #x9357) + (#xEEC3 #x9370) + (#xEEC2 #x9302) + (#xEEC1 #x931D) + (#xEEC0 #x92FF) + (#xEEBF #x931E) + (#xEEBE #xFA28) + (#xEEBD #x92FB) + (#xEEBC #x9321) + (#xEEBB #x9325) + (#xEEBA #x92D3) + (#xEEB9 #x92E0) + (#xEEB8 #x92D5) + (#xEEB7 #xFA27) + (#xEEB6 #x92D0) + (#xEEB5 #x92D9) + (#xEEB4 #x92D7) + (#xEEB3 #x92E7) + (#xEEB2 #x9278) + (#xEEB1 #x9277) + (#xEEB0 #x92A7) + (#xEEAF #x9267) + (#xEEAE #x9239) + (#xEEAD #x9251) + (#xEEAC #x9259) + (#xEEAB #x924E) + (#xEEAA #x923C) + (#xEEA9 #x9240) + (#xEEA8 #x923A) + (#xEEA7 #x920A) + (#xEEA6 #x9210) + (#xEEA5 #x9206) + (#xEEA4 #x91E5) + (#xEEA3 #x91E4) + (#xEEA2 #x91EE) + (#xEEA1 #x91ED) + (#xEEA0 #x91DE) + (#xEE9F #x91D7) + (#xEE9E #x91DA) + (#xEE9D #x9127) + (#xEE9C #x9115) + (#xEE9B #xFA26) + (#xEE9A #x90DE) + (#xEE99 #x9067) + (#xEE98 #xFA25) + (#xEE97 #xFA24) + (#xEE96 #x8ECF) + (#xEE95 #xFA23) + (#xEE94 #x8D76) + (#xEE93 #x8D12) + (#xEE92 #x8CF4) + (#xEE91 #x8CF0) + (#xEE90 #x8B7F) + (#xEE8F #x8B53) + (#xEE8E #x8AF6) + (#xEE8D #xFA22) + (#xEE8C #x8ADF) + (#xEE8B #x8ABE) + (#xEE8A #x8AA7) + (#xEE89 #x8A79) + (#xEE88 #x8A37) + (#xEE87 #x8A12) + (#xEE86 #x88F5) + (#xEE85 #x8807) + (#xEE84 #xFA21) + (#xEE83 #xFA20) + (#xEE82 #x85B0) + (#xEE81 #xFA1F) + (#xEE80 #x856B) + (#xEE7E #x8559) + (#xEE7D #x8553) + (#xEE7C #x84B4) + (#xEE7B #x8448) + (#xEE7A #x83F6) + (#xEE79 #x83C7) + (#xEE78 #x837F) + (#xEE77 #x8362) + (#xEE76 #x8301) + (#xEE75 #xFA1E) + (#xEE74 #x7FA1) + (#xEE73 #x7F47) + (#xEE72 #x7E52) + (#xEE71 #x7DD6) + (#xEE70 #x7DA0) + (#xEE6F #x7DB7) + (#xEE6E #x7D5C) + (#xEE6D #x7D48) + (#xEE6C #xFA1D) + (#xEE6B #x7B9E) + (#xEE6A #x7AEB) + (#xEE69 #xFA1C) + (#xEE68 #x7AE7) + (#xEE67 #x7AD1) + (#xEE66 #x799B) + (#xEE65 #xFA1B) + (#xEE64 #x7994) + (#xEE63 #xFA1A) + (#xEE62 #xFA19) + (#xEE61 #xFA18) + (#xEE60 #x7930) + (#xEE5F #x787A) + (#xEE5E #x7864) + (#xEE5D #x784E) + (#xEE5C #x7821) + (#xEE5B #x52AF) + (#xEE5A #x7746) + (#xEE59 #xFA17) + (#xEE58 #x76A6) + (#xEE57 #x769B) + (#xEE56 #x769E) + (#xEE55 #x769C) + (#xEE54 #x7682) + (#xEE53 #x756F) + (#xEE52 #x7501) + (#xEE51 #x749F) + (#xEE50 #x7489) + (#xEE4F #x7462) + (#xEE4E #x742E) + (#xEE4D #x7429) + (#xEE4C #x742A) + (#xEE4B #x7426) + (#xEE4A #x73F5) + (#xEE49 #x7407) + (#xEE48 #x73D2) + (#xEE47 #x73E3) + (#xEE46 #x73D6) + (#xEE45 #x73C9) + (#xEE44 #x73BD) + (#xEE43 #x7377) + (#xEE42 #xFA16) + (#xEE41 #x7324) + (#xEE40 #x72BE) + (#xEDFC #x72B1) + (#xEDFB #x71FE) + (#xEDFA #x71C1) + (#xEDF9 #xFA15) + (#xEDF8 #x7147) + (#xEDF7 #x7146) + (#xEDF6 #x715C) + (#xEDF5 #x7104) + (#xEDF4 #x710F) + (#xEDF3 #x70AB) + (#xEDF2 #x7085) + (#xEDF1 #x7028) + (#xEDF0 #x7007) + (#xEDEF #x7005) + (#xEDEE #x6FF5) + (#xEDED #x6FB5) + (#xEDEC #x6F88) + (#xEDEB #x6EBF) + (#xEDEA #x6E3C) + (#xEDE9 #x6E27) + (#xEDE8 #x6E5C) + (#xEDE7 #x6E39) + (#xEDE6 #x6DFC) + (#xEDE5 #x6DF2) + (#xEDE4 #x6DF8) + (#xEDE3 #x6DCF) + (#xEDE2 #x6DAC) + (#xEDE1 #x6D96) + (#xEDE0 #x6D6F) + (#xEDDF #x6D87) + (#xEDDE #x6D04) + (#xEDDD #x6CDA) + (#xEDDC #x6C6F) + (#xEDDB #x6C86) + (#xEDDA #x6C5C) + (#xEDD9 #x6C3F) + (#xEDD8 #x6BD6) + (#xEDD7 #x6AE4) + (#xEDD6 #x6AE2) + (#xEDD5 #x6A7E) + (#xEDD4 #x6A73) + (#xEDD3 #x6A46) + (#xEDD2 #x6A6B) + (#xEDD1 #x6A30) + (#xEDD0 #x69E2) + (#xEDCF #x6998) + (#xEDCE #xFA14) + (#xEDCD #x6968) + (#xEDCC #xFA13) + (#xEDCB #x68CF) + (#xEDCA #x6844) + (#xEDC9 #x6801) + (#xEDC8 #x67C0) + (#xEDC7 #x6852) + (#xEDC6 #x67BB) + (#xEDC5 #x6766) + (#xEDC4 #xF929) + (#xEDC3 #x670E) + (#xEDC2 #x66FA) + (#xEDC1 #x66BF) + (#xEDC0 #x66B2) + (#xEDBF #x66A0) + (#xEDBE #x6699) + (#xEDBD #x6673) + (#xEDBC #xFA12) + (#xEDBB #x6659) + (#xEDBA #x6657) + (#xEDB9 #x6665) + (#xEDB8 #x6624) + (#xEDB7 #x661E) + (#xEDB6 #x662E) + (#xEDB5 #x6609) + (#xEDB4 #x663B) + (#xEDB3 #x6615) + (#xEDB2 #x6600) + (#xEDB1 #x654E) + (#xEDB0 #x64CE) + (#xEDAF #x649D) + (#xEDAE #x6460) + (#xEDAD #x63F5) + (#xEDAC #x62A6) + (#xEDAB #x6213) + (#xEDAA #x6198) + (#xEDA9 #x6130) + (#xEDA8 #x6137) + (#xEDA7 #x6111) + (#xEDA6 #x60F2) + (#xEDA5 #x6120) + (#xEDA4 #x60D5) + (#xEDA3 #x60DE) + (#xEDA2 #x608A) + (#xEDA1 #x6085) + (#xEDA0 #x605D) + (#xED9F #x5FDE) + (#xED9E #x5FB7) + (#xED9D #x5F67) + (#xED9C #x5F34) + (#xED9B #x5F21) + (#xED9A #x5DD0) + (#xED99 #x5DB9) + (#xED98 #x5DB8) + (#xED97 #x5D6D) + (#xED96 #x5D42) + (#xED95 #xFA11) + (#xED94 #x5D53) + (#xED93 #x5D27) + (#xED92 #x5CF5) + (#xED91 #x5CBA) + (#xED90 #x5CA6) + (#xED8F #x5C1E) + (#xED8E #x5BEC) + (#xED8D #x5BD8) + (#xED8C #x752F) + (#xED8B #x5BC0) + (#xED8A #x5B56) + (#xED89 #x59BA) + (#xED88 #x59A4) + (#xED87 #x5963) + (#xED86 #x595D) + (#xED85 #x595B) + (#xED84 #x5953) + (#xED83 #x590B) + (#xED82 #x58B2) + (#xED81 #x589E) + (#xED80 #xFA10) + (#xED7E #xFA0F) + (#xED7D #x57C7) + (#xED7C #x57C8) + (#xED7B #x57AC) + (#xED7A #x5765) + (#xED79 #x5759) + (#xED78 #x5586) + (#xED77 #x54FF) + (#xED76 #x54A9) + (#xED75 #x548A) + (#xED74 #x549C) + (#xED73 #xFA0E) + (#xED72 #x53DD) + (#xED71 #x53B2) + (#xED70 #x5393) + (#xED6F #x5372) + (#xED6E #x5324) + (#xED6D #x5307) + (#xED6C #x5300) + (#xED6B #x52DB) + (#xED6A #x52C0) + (#xED69 #x52A6) + (#xED68 #x529C) + (#xED67 #x5215) + (#xED66 #x51EC) + (#xED65 #x51BE) + (#xED64 #x519D) + (#xED63 #x5164) + (#xED62 #x514A) + (#xED61 #x50D8) + (#xED60 #x50F4) + (#xED5F #x5094) + (#xED5E #x5042) + (#xED5D #x5070) + (#xED5C #x5046) + (#xED5B #x501E) + (#xED5A #x4FFF) + (#xED59 #x5022) + (#xED58 #x5040) + (#xED57 #x4FCD) + (#xED56 #x4F94) + (#xED55 #x4F9A) + (#xED54 #x4F8A) + (#xED53 #x4F92) + (#xED52 #x4F56) + (#xED51 #x4F39) + (#xED50 #x4F03) + (#xED4F #x4F00) + (#xED4E #x4EFC) + (#xED4D #x4EE1) + (#xED4C #x4E28) + (#xED4B #x5F45) + (#xED4A #x66FB) + (#xED49 #x92F9) + (#xED48 #x68C8) + (#xED47 #x6631) + (#xED46 #x70BB) + (#xED45 #x4FC9) + (#xED44 #x84DC) + (#xED43 #x9288) + (#xED42 #x9348) + (#xED41 #x891C) + (#xED40 #x7E8A) + (#xEA9E #x9FA0) + (#xEA40 #x9D5D) + (#xE99E #x9AF7) + (#xE940 #x9871) + (#xE89E #x965E) + (#xE840 #x9319) + (#xE79E #x8FF8) + (#xE740 #x8E47) + (#xE69E #x8B6B) + (#xE640 #x8966) + (#xE59E #x8759) + (#xE540 #x8541) + (#xE49E #x82D9) + (#xE440 #x968B) + (#xE39E #x7F3A) + (#xE340 #x7D02) + (#xE29E #x7B50) + (#xE240 #x78E7) + (#xE19E #x7670) + (#xE140 #x74E0) + (#xE09E #x71FC) + (#xE040 #x6F3E) + (#x9F9E #x6CBE) + (#x9F40 #x6A97) + (#x9E9E #x68CD) + (#x9E40 #x66C4) + (#x9D9E #x64BC) + (#x9D40 #x621E) + (#x9C9E #x609A) + (#x9C40 #x5ED6) + (#x9B9E #x5C53) + (#x9B40 #x5978) + (#x9A9E #x5709) + (#x9A40 #x54AB) + (#x999E #x8FA8) + (#x9940 #x50C9) + (#x9840 #x84EE) + (#x979E #x7483) + (#x9740 #x8AED) + (#x969E #x6E80) + (#x9640 #x6CD5) + (#x959E #x670D) + (#x9540 #x9F3B) + (#x949E #x9EA6) + (#x9440 #x5982) + (#x939E #x5230) + (#x9340 #x90B8) + (#x929E #x5BF5) + (#x9240 #x53E9) + (#x919E #x618E) + (#x9140 #x7E4A) + (#x909E #x88FE) + (#x9040 #x62ED) + (#x8F9E #x511F) + (#x8F40 #x5B97) + (#x8E9E #x6642) + (#x8E40 #x5BDF) + (#x8D9E #x8FBC) + (#x8D40 #x540E) + (#x8C9E #x6372) + (#x8C40 #x6398) + (#x8B9E #x4EAC) + (#x8B40 #x6A5F) + (#x8A9E #x8431) + (#x8A40 #x9B41) + (#x899E #x5FDC) + (#x8940 #x9662) + (#x879C #x222A) + (#x879B #x2229) + (#x879A #x2235) + (#x8799 #x22BF) + (#x8798 #x221F) + (#x8797 #x2220) + (#x8796 #x22A5) + (#x8795 #x221A) + (#x8794 #x2211) + (#x8793 #x222E) + (#x8792 #x222B) + (#x8791 #x2261) + (#x8790 #x2252) + (#x878F #x337C) + (#x878E #x337D) + (#x878D #x337E) + (#x878C #x3239) + (#x878B #x3232) + (#x878A #x3231) + (#x8789 #x32A8) + (#x8788 #x32A7) + (#x8787 #x32A6) + (#x8786 #x32A5) + (#x8785 #x32A4) + (#x8784 #x2121) + (#x8783 #x33CD) + (#x8782 #x2116) + (#x8781 #x301F) + (#x8780 #x301D) + (#x877E #x337B) + (#x8775 #x33A1) + (#x8774 #x33C4) + (#x8773 #x338F) + (#x8772 #x338E) + (#x8771 #x339E) + (#x8770 #x339D) + (#x876F #x339C) + (#x876E #x333B) + (#x876D #x334A) + (#x876C #x332B) + (#x876B #x3323) + (#x876A #x3326) + (#x8769 #x330D) + (#x8768 #x3357) + (#x8767 #x3351) + (#x8766 #x3336) + (#x8765 #x3303) + (#x8764 #x3327) + (#x8763 #x3318) + (#x8762 #x334D) + (#x8761 #x3322) + (#x8760 #x3314) + (#x875F #x3349) + (#x875D #x2169) + (#x875C #x2168) + (#x875B #x2167) + (#x875A #x2166) + (#x8759 #x2165) + (#x8758 #x2164) + (#x8757 #x2163) + (#x8756 #x2162) + (#x8755 #x2161) + (#x8754 #x2160) + (#x8753 #x2473) + (#x8752 #x2472) + (#x8751 #x2471) + (#x8750 #x2470) + (#x874F #x246F) + (#x874E #x246E) + (#x874D #x246D) + (#x874C #x246C) + (#x874B #x246B) + (#x874A #x246A) + (#x8749 #x2469) + (#x8748 #x2468) + (#x8747 #x2467) + (#x8746 #x2466) + (#x8745 #x2465) + (#x8744 #x2464) + (#x8743 #x2463) + (#x8742 #x2462) + (#x8741 #x2461) + (#x8740 #x2460) + (#x8440 #x410) + (#x8340 #x30A1) + (#x819E #x25C7) + (#x8140 #x3000) + )) + +(defvar *eucjp-only* + '((#xFEFE #xE3AB) + (#xFEFD #xE3AA) + (#xFEFC #xE3A9) + (#xFEFB #xE3A8) + (#xFEFA #xE3A7) + (#xFEF9 #xE3A6) + (#xFEF8 #xE3A5) + (#xFEF7 #xE3A4) + (#xFEF6 #xE3A3) + (#xFEF5 #xE3A2) + (#xFEF4 #xE3A1) + (#xFEF3 #xE3A0) + (#xFEF2 #xE39F) + (#xFEF1 #xE39E) + (#xFEF0 #xE39D) + (#xFEEF #xE39C) + (#xFEEE #xE39B) + (#xFEED #xE39A) + (#xFEEC #xE399) + (#xFEEB #xE398) + (#xFEEA #xE397) + (#xFEE9 #xE396) + (#xFEE8 #xE395) + (#xFEE7 #xE394) + (#xFEE6 #xE393) + (#xFEE5 #xE392) + (#xFEE4 #xE391) + (#xFEE3 #xE390) + (#xFEE2 #xE38F) + (#xFEE1 #xE38E) + (#xFEE0 #xE38D) + (#xFEDF #xE38C) + (#xFEDE #xE38B) + (#xFEDD #xE38A) + (#xFEDC #xE389) + (#xFEDB #xE388) + (#xFEDA #xE387) + (#xFED9 #xE386) + (#xFED8 #xE385) + (#xFED7 #xE384) + (#xFED6 #xE383) + (#xFED5 #xE382) + (#xFED4 #xE381) + (#xFED3 #xE380) + (#xFED2 #xE37F) + (#xFED1 #xE37E) + (#xFED0 #xE37D) + (#xFECF #xE37C) + (#xFECE #xE37B) + (#xFECD #xE37A) + (#xFECC #xE379) + (#xFECB #xE378) + (#xFECA #xE377) + (#xFEC9 #xE376) + (#xFEC8 #xE375) + (#xFEC7 #xE374) + (#xFEC6 #xE373) + (#xFEC5 #xE372) + (#xFEC4 #xE371) + (#xFEC3 #xE370) + (#xFEC2 #xE36F) + (#xFEC1 #xE36E) + (#xFEC0 #xE36D) + (#xFEBF #xE36C) + (#xFEBE #xE36B) + (#xFEBD #xE36A) + (#xFEBC #xE369) + (#xFEBB #xE368) + (#xFEBA #xE367) + (#xFEB9 #xE366) + (#xFEB8 #xE365) + (#xFEB7 #xE364) + (#xFEB6 #xE363) + (#xFEB5 #xE362) + (#xFEB4 #xE361) + (#xFEB3 #xE360) + (#xFEB2 #xE35F) + (#xFEB1 #xE35E) + (#xFEB0 #xE35D) + (#xFEAF #xE35C) + (#xFEAE #xE35B) + (#xFEAD #xE35A) + (#xFEAC #xE359) + (#xFEAB #xE358) + (#xFEAA #xE357) + (#xFEA9 #xE356) + (#xFEA8 #xE355) + (#xFEA7 #xE354) + (#xFEA6 #xE353) + (#xFEA5 #xE352) + (#xFEA4 #xE351) + (#xFEA3 #xE350) + (#xFEA2 #xE34F) + (#xFEA1 #xE34E) + (#xFDFE #xE34D) + (#xFDFD #xE34C) + (#xFDFC #xE34B) + (#xFDFB #xE34A) + (#xFDFA #xE349) + (#xFDF9 #xE348) + (#xFDF8 #xE347) + (#xFDF7 #xE346) + (#xFDF6 #xE345) + (#xFDF5 #xE344) + (#xFDF4 #xE343) + (#xFDF3 #xE342) + (#xFDF2 #xE341) + (#xFDF1 #xE340) + (#xFDF0 #xE33F) + (#xFDEF #xE33E) + (#xFDEE #xE33D) + (#xFDED #xE33C) + (#xFDEC #xE33B) + (#xFDEB #xE33A) + (#xFDEA #xE339) + (#xFDE9 #xE338) + (#xFDE8 #xE337) + (#xFDE7 #xE336) + (#xFDE6 #xE335) + (#xFDE5 #xE334) + (#xFDE4 #xE333) + (#xFDE3 #xE332) + (#xFDE2 #xE331) + (#xFDE1 #xE330) + (#xFDE0 #xE32F) + (#xFDDF #xE32E) + (#xFDDE #xE32D) + (#xFDDD #xE32C) + (#xFDDC #xE32B) + (#xFDDB #xE32A) + (#xFDDA #xE329) + (#xFDD9 #xE328) + (#xFDD8 #xE327) + (#xFDD7 #xE326) + (#xFDD6 #xE325) + (#xFDD5 #xE324) + (#xFDD4 #xE323) + (#xFDD3 #xE322) + (#xFDD2 #xE321) + (#xFDD1 #xE320) + (#xFDD0 #xE31F) + (#xFDCF #xE31E) + (#xFDCE #xE31D) + (#xFDCD #xE31C) + (#xFDCC #xE31B) + (#xFDCB #xE31A) + (#xFDCA #xE319) + (#xFDC9 #xE318) + (#xFDC8 #xE317) + (#xFDC7 #xE316) + (#xFDC6 #xE315) + (#xFDC5 #xE314) + (#xFDC4 #xE313) + (#xFDC3 #xE312) + (#xFDC2 #xE311) + (#xFDC1 #xE310) + (#xFDC0 #xE30F) + (#xFDBF #xE30E) + (#xFDBE #xE30D) + (#xFDBD #xE30C) + (#xFDBC #xE30B) + (#xFDBB #xE30A) + (#xFDBA #xE309) + (#xFDB9 #xE308) + (#xFDB8 #xE307) + (#xFDB7 #xE306) + (#xFDB6 #xE305) + (#xFDB5 #xE304) + (#xFDB4 #xE303) + (#xFDB3 #xE302) + (#xFDB2 #xE301) + (#xFDB1 #xE300) + (#xFDB0 #xE2FF) + (#xFDAF #xE2FE) + (#xFDAE #xE2FD) + (#xFDAD #xE2FC) + (#xFDAC #xE2FB) + (#xFDAB #xE2FA) + (#xFDAA #xE2F9) + (#xFDA9 #xE2F8) + (#xFDA8 #xE2F7) + (#xFDA7 #xE2F6) + (#xFDA6 #xE2F5) + (#xFDA5 #xE2F4) + (#xFDA4 #xE2F3) + (#xFDA3 #xE2F2) + (#xFDA2 #xE2F1) + (#xFDA1 #xE2F0) + (#xFCFE #xE2EF) + (#xFCFD #xE2EE) + (#xFCFC #xE2ED) + (#xFCFB #xE2EC) + (#xFCFA #xE2EB) + (#xFCF9 #xE2EA) + (#xFCF8 #xE2E9) + (#xFCF7 #xE2E8) + (#xFCF6 #xE2E7) + (#xFCF5 #xE2E6) + (#xFCF4 #xE2E5) + (#xFCF3 #xE2E4) + (#xFCF2 #xE2E3) + (#xFCF1 #xE2E2) + (#xFCF0 #xE2E1) + (#xFCEF #xE2E0) + (#xFCEE #xE2DF) + (#xFCED #xE2DE) + (#xFCEC #xE2DD) + (#xFCEB #xE2DC) + (#xFCEA #xE2DB) + (#xFCE9 #xE2DA) + (#xFCE8 #xE2D9) + (#xFCE7 #xE2D8) + (#xFCE6 #xE2D7) + (#xFCE5 #xE2D6) + (#xFCE4 #xE2D5) + (#xFCE3 #xE2D4) + (#xFCE2 #xE2D3) + (#xFCE1 #xE2D2) + (#xFCE0 #xE2D1) + (#xFCDF #xE2D0) + (#xFCDE #xE2CF) + (#xFCDD #xE2CE) + (#xFCDC #xE2CD) + (#xFCDB #xE2CC) + (#xFCDA #xE2CB) + (#xFCD9 #xE2CA) + (#xFCD8 #xE2C9) + (#xFCD7 #xE2C8) + (#xFCD6 #xE2C7) + (#xFCD5 #xE2C6) + (#xFCD4 #xE2C5) + (#xFCD3 #xE2C4) + (#xFCD2 #xE2C3) + (#xFCD1 #xE2C2) + (#xFCD0 #xE2C1) + (#xFCCF #xE2C0) + (#xFCCE #xE2BF) + (#xFCCD #xE2BE) + (#xFCCC #xE2BD) + (#xFCCB #xE2BC) + (#xFCCA #xE2BB) + (#xFCC9 #xE2BA) + (#xFCC8 #xE2B9) + (#xFCC7 #xE2B8) + (#xFCC6 #xE2B7) + (#xFCC5 #xE2B6) + (#xFCC4 #xE2B5) + (#xFCC3 #xE2B4) + (#xFCC2 #xE2B3) + (#xFCC1 #xE2B2) + (#xFCC0 #xE2B1) + (#xFCBF #xE2B0) + (#xFCBE #xE2AF) + (#xFCBD #xE2AE) + (#xFCBC #xE2AD) + (#xFCBB #xE2AC) + (#xFCBA #xE2AB) + (#xFCB9 #xE2AA) + (#xFCB8 #xE2A9) + (#xFCB7 #xE2A8) + (#xFCB6 #xE2A7) + (#xFCB5 #xE2A6) + (#xFCB4 #xE2A5) + (#xFCB3 #xE2A4) + (#xFCB2 #xE2A3) + (#xFCB1 #xE2A2) + (#xFCB0 #xE2A1) + (#xFCAF #xE2A0) + (#xFCAE #xE29F) + (#xFCAD #xE29E) + (#xFCAC #xE29D) + (#xFCAB #xE29C) + (#xFCAA #xE29B) + (#xFCA9 #xE29A) + (#xFCA8 #xE299) + (#xFCA7 #xE298) + (#xFCA6 #xE297) + (#xFCA5 #xE296) + (#xFCA4 #xE295) + (#xFCA3 #xE294) + (#xFCA2 #xE293) + (#xFCA1 #xE292) + (#xFBFE #xE291) + (#xFBFD #xE290) + (#xFBFC #xE28F) + (#xFBFB #xE28E) + (#xFBFA #xE28D) + (#xFBF9 #xE28C) + (#xFBF8 #xE28B) + (#xFBF7 #xE28A) + (#xFBF6 #xE289) + (#xFBF5 #xE288) + (#xFBF4 #xE287) + (#xFBF3 #xE286) + (#xFBF2 #xE285) + (#xFBF1 #xE284) + (#xFBF0 #xE283) + (#xFBEF #xE282) + (#xFBEE #xE281) + (#xFBED #xE280) + (#xFBEC #xE27F) + (#xFBEB #xE27E) + (#xFBEA #xE27D) + (#xFBE9 #xE27C) + (#xFBE8 #xE27B) + (#xFBE7 #xE27A) + (#xFBE6 #xE279) + (#xFBE5 #xE278) + (#xFBE4 #xE277) + (#xFBE3 #xE276) + (#xFBE2 #xE275) + (#xFBE1 #xE274) + (#xFBE0 #xE273) + (#xFBDF #xE272) + (#xFBDE #xE271) + (#xFBDD #xE270) + (#xFBDC #xE26F) + (#xFBDB #xE26E) + (#xFBDA #xE26D) + (#xFBD9 #xE26C) + (#xFBD8 #xE26B) + (#xFBD7 #xE26A) + (#xFBD6 #xE269) + (#xFBD5 #xE268) + (#xFBD4 #xE267) + (#xFBD3 #xE266) + (#xFBD2 #xE265) + (#xFBD1 #xE264) + (#xFBD0 #xE263) + (#xFBCF #xE262) + (#xFBCE #xE261) + (#xFBCD #xE260) + (#xFBCC #xE25F) + (#xFBCB #xE25E) + (#xFBCA #xE25D) + (#xFBC9 #xE25C) + (#xFBC8 #xE25B) + (#xFBC7 #xE25A) + (#xFBC6 #xE259) + (#xFBC5 #xE258) + (#xFBC4 #xE257) + (#xFBC3 #xE256) + (#xFBC2 #xE255) + (#xFBC1 #xE254) + (#xFBC0 #xE253) + (#xFBBF #xE252) + (#xFBBE #xE251) + (#xFBBD #xE250) + (#xFBBC #xE24F) + (#xFBBB #xE24E) + (#xFBBA #xE24D) + (#xFBB9 #xE24C) + (#xFBB8 #xE24B) + (#xFBB7 #xE24A) + (#xFBB6 #xE249) + (#xFBB5 #xE248) + (#xFBB4 #xE247) + (#xFBB3 #xE246) + (#xFBB2 #xE245) + (#xFBB1 #xE244) + (#xFBB0 #xE243) + (#xFBAF #xE242) + (#xFBAE #xE241) + (#xFBAD #xE240) + (#xFBAC #xE23F) + (#xFBAB #xE23E) + (#xFBAA #xE23D) + (#xFBA9 #xE23C) + (#xFBA8 #xE23B) + (#xFBA7 #xE23A) + (#xFBA6 #xE239) + (#xFBA5 #xE238) + (#xFBA4 #xE237) + (#xFBA3 #xE236) + (#xFBA2 #xE235) + (#xFBA1 #xE234) + (#xFAFE #xE233) + (#xFAFD #xE232) + (#xFAFC #xE231) + (#xFAFB #xE230) + (#xFAFA #xE22F) + (#xFAF9 #xE22E) + (#xFAF8 #xE22D) + (#xFAF7 #xE22C) + (#xFAF6 #xE22B) + (#xFAF5 #xE22A) + (#xFAF4 #xE229) + (#xFAF3 #xE228) + (#xFAF2 #xE227) + (#xFAF1 #xE226) + (#xFAF0 #xE225) + (#xFAEF #xE224) + (#xFAEE #xE223) + (#xFAED #xE222) + (#xFAEC #xE221) + (#xFAEB #xE220) + (#xFAEA #xE21F) + (#xFAE9 #xE21E) + (#xFAE8 #xE21D) + (#xFAE7 #xE21C) + (#xFAE6 #xE21B) + (#xFAE5 #xE21A) + (#xFAE4 #xE219) + (#xFAE3 #xE218) + (#xFAE2 #xE217) + (#xFAE1 #xE216) + (#xFAE0 #xE215) + (#xFADF #xE214) + (#xFADE #xE213) + (#xFADD #xE212) + (#xFADC #xE211) + (#xFADB #xE210) + (#xFADA #xE20F) + (#xFAD9 #xE20E) + (#xFAD8 #xE20D) + (#xFAD7 #xE20C) + (#xFAD6 #xE20B) + (#xFAD5 #xE20A) + (#xFAD4 #xE209) + (#xFAD3 #xE208) + (#xFAD2 #xE207) + (#xFAD1 #xE206) + (#xFAD0 #xE205) + (#xFACF #xE204) + (#xFACE #xE203) + (#xFACD #xE202) + (#xFACC #xE201) + (#xFACB #xE200) + (#xFACA #xE1FF) + (#xFAC9 #xE1FE) + (#xFAC8 #xE1FD) + (#xFAC7 #xE1FC) + (#xFAC6 #xE1FB) + (#xFAC5 #xE1FA) + (#xFAC4 #xE1F9) + (#xFAC3 #xE1F8) + (#xFAC2 #xE1F7) + (#xFAC1 #xE1F6) + (#xFAC0 #xE1F5) + (#xFABF #xE1F4) + (#xFABE #xE1F3) + (#xFABD #xE1F2) + (#xFABC #xE1F1) + (#xFABB #xE1F0) + (#xFABA #xE1EF) + (#xFAB9 #xE1EE) + (#xFAB8 #xE1ED) + (#xFAB7 #xE1EC) + (#xFAB6 #xE1EB) + (#xFAB5 #xE1EA) + (#xFAB4 #xE1E9) + (#xFAB3 #xE1E8) + (#xFAB2 #xE1E7) + (#xFAB1 #xE1E6) + (#xFAB0 #xE1E5) + (#xFAAF #xE1E4) + (#xFAAE #xE1E3) + (#xFAAD #xE1E2) + (#xFAAC #xE1E1) + (#xFAAB #xE1E0) + (#xFAAA #xE1DF) + (#xFAA9 #xE1DE) + (#xFAA8 #xE1DD) + (#xFAA7 #xE1DC) + (#xFAA6 #xE1DB) + (#xFAA5 #xE1DA) + (#xFAA4 #xE1D9) + (#xFAA3 #xE1D8) + (#xFAA2 #xE1D7) + (#xFAA1 #xE1D6) + (#xF9FE #xE1D5) + (#xF9FD #xE1D4) + (#xF9FC #xE1D3) + (#xF9FB #xE1D2) + (#xF9FA #xE1D1) + (#xF9F9 #xE1D0) + (#xF9F8 #xE1CF) + (#xF9F7 #xE1CE) + (#xF9F6 #xE1CD) + (#xF9F5 #xE1CC) + (#xF9F4 #xE1CB) + (#xF9F3 #xE1CA) + (#xF9F2 #xE1C9) + (#xF9F1 #xE1C8) + (#xF9F0 #xE1C7) + (#xF9EF #xE1C6) + (#xF9EE #xE1C5) + (#xF9ED #xE1C4) + (#xF9EC #xE1C3) + (#xF9EB #xE1C2) + (#xF9EA #xE1C1) + (#xF9E9 #xE1C0) + (#xF9E8 #xE1BF) + (#xF9E7 #xE1BE) + (#xF9E6 #xE1BD) + (#xF9E5 #xE1BC) + (#xF9E4 #xE1BB) + (#xF9E3 #xE1BA) + (#xF9E2 #xE1B9) + (#xF9E1 #xE1B8) + (#xF9E0 #xE1B7) + (#xF9DF #xE1B6) + (#xF9DE #xE1B5) + (#xF9DD #xE1B4) + (#xF9DC #xE1B3) + (#xF9DB #xE1B2) + (#xF9DA #xE1B1) + (#xF9D9 #xE1B0) + (#xF9D8 #xE1AF) + (#xF9D7 #xE1AE) + (#xF9D6 #xE1AD) + (#xF9D5 #xE1AC) + (#xF9D4 #xE1AB) + (#xF9D3 #xE1AA) + (#xF9D2 #xE1A9) + (#xF9D1 #xE1A8) + (#xF9D0 #xE1A7) + (#xF9CF #xE1A6) + (#xF9CE #xE1A5) + (#xF9CD #xE1A4) + (#xF9CC #xE1A3) + (#xF9CB #xE1A2) + (#xF9CA #xE1A1) + (#xF9C9 #xE1A0) + (#xF9C8 #xE19F) + (#xF9C7 #xE19E) + (#xF9C6 #xE19D) + (#xF9C5 #xE19C) + (#xF9C4 #xE19B) + (#xF9C3 #xE19A) + (#xF9C2 #xE199) + (#xF9C1 #xE198) + (#xF9C0 #xE197) + (#xF9BF #xE196) + (#xF9BE #xE195) + (#xF9BD #xE194) + (#xF9BC #xE193) + (#xF9BB #xE192) + (#xF9BA #xE191) + (#xF9B9 #xE190) + (#xF9B8 #xE18F) + (#xF9B7 #xE18E) + (#xF9B6 #xE18D) + (#xF9B5 #xE18C) + (#xF9B4 #xE18B) + (#xF9B3 #xE18A) + (#xF9B2 #xE189) + (#xF9B1 #xE188) + (#xF9B0 #xE187) + (#xF9AF #xE186) + (#xF9AE #xE185) + (#xF9AD #xE184) + (#xF9AC #xE183) + (#xF9AB #xE182) + (#xF9AA #xE181) + (#xF9A9 #xE180) + (#xF9A8 #xE17F) + (#xF9A7 #xE17E) + (#xF9A6 #xE17D) + (#xF9A5 #xE17C) + (#xF9A4 #xE17B) + (#xF9A3 #xE17A) + (#xF9A2 #xE179) + (#xF9A1 #xE178) + (#xF8FE #xE177) + (#xF8FD #xE176) + (#xF8FC #xE175) + (#xF8FB #xE174) + (#xF8FA #xE173) + (#xF8F9 #xE172) + (#xF8F8 #xE171) + (#xF8F7 #xE170) + (#xF8F6 #xE16F) + (#xF8F5 #xE16E) + (#xF8F4 #xE16D) + (#xF8F3 #xE16C) + (#xF8F2 #xE16B) + (#xF8F1 #xE16A) + (#xF8F0 #xE169) + (#xF8EF #xE168) + (#xF8EE #xE167) + (#xF8ED #xE166) + (#xF8EC #xE165) + (#xF8EB #xE164) + (#xF8EA #xE163) + (#xF8E9 #xE162) + (#xF8E8 #xE161) + (#xF8E7 #xE160) + (#xF8E6 #xE15F) + (#xF8E5 #xE15E) + (#xF8E4 #xE15D) + (#xF8E3 #xE15C) + (#xF8E2 #xE15B) + (#xF8E1 #xE15A) + (#xF8E0 #xE159) + (#xF8DF #xE158) + (#xF8DE #xE157) + (#xF8DD #xE156) + (#xF8DC #xE155) + (#xF8DB #xE154) + (#xF8DA #xE153) + (#xF8D9 #xE152) + (#xF8D8 #xE151) + (#xF8D7 #xE150) + (#xF8D6 #xE14F) + (#xF8D5 #xE14E) + (#xF8D4 #xE14D) + (#xF8D3 #xE14C) + (#xF8D2 #xE14B) + (#xF8D1 #xE14A) + (#xF8D0 #xE149) + (#xF8CF #xE148) + (#xF8CE #xE147) + (#xF8CD #xE146) + (#xF8CC #xE145) + (#xF8CB #xE144) + (#xF8CA #xE143) + (#xF8C9 #xE142) + (#xF8C8 #xE141) + (#xF8C7 #xE140) + (#xF8C6 #xE13F) + (#xF8C5 #xE13E) + (#xF8C4 #xE13D) + (#xF8C3 #xE13C) + (#xF8C2 #xE13B) + (#xF8C1 #xE13A) + (#xF8C0 #xE139) + (#xF8BF #xE138) + (#xF8BE #xE137) + (#xF8BD #xE136) + (#xF8BC #xE135) + (#xF8BB #xE134) + (#xF8BA #xE133) + (#xF8B9 #xE132) + (#xF8B8 #xE131) + (#xF8B7 #xE130) + (#xF8B6 #xE12F) + (#xF8B5 #xE12E) + (#xF8B4 #xE12D) + (#xF8B3 #xE12C) + (#xF8B2 #xE12B) + (#xF8B1 #xE12A) + (#xF8B0 #xE129) + (#xF8AF #xE128) + (#xF8AE #xE127) + (#xF8AD #xE126) + (#xF8AC #xE125) + (#xF8AB #xE124) + (#xF8AA #xE123) + (#xF8A9 #xE122) + (#xF8A8 #xE121) + (#xF8A7 #xE120) + (#xF8A6 #xE11F) + (#xF8A5 #xE11E) + (#xF8A4 #xE11D) + (#xF8A3 #xE11C) + (#xF8A2 #xE11B) + (#xF8A1 #xE11A) + (#xF7FE #xE119) + (#xF7FD #xE118) + (#xF7FC #xE117) + (#xF7FB #xE116) + (#xF7FA #xE115) + (#xF7F9 #xE114) + (#xF7F8 #xE113) + (#xF7F7 #xE112) + (#xF7F6 #xE111) + (#xF7F5 #xE110) + (#xF7F4 #xE10F) + (#xF7F3 #xE10E) + (#xF7F2 #xE10D) + (#xF7F1 #xE10C) + (#xF7F0 #xE10B) + (#xF7EF #xE10A) + (#xF7EE #xE109) + (#xF7ED #xE108) + (#xF7EC #xE107) + (#xF7EB #xE106) + (#xF7EA #xE105) + (#xF7E9 #xE104) + (#xF7E8 #xE103) + (#xF7E7 #xE102) + (#xF7E6 #xE101) + (#xF7E5 #xE100) + (#xF7E4 #xE0FF) + (#xF7E3 #xE0FE) + (#xF7E2 #xE0FD) + (#xF7E1 #xE0FC) + (#xF7E0 #xE0FB) + (#xF7DF #xE0FA) + (#xF7DE #xE0F9) + (#xF7DD #xE0F8) + (#xF7DC #xE0F7) + (#xF7DB #xE0F6) + (#xF7DA #xE0F5) + (#xF7D9 #xE0F4) + (#xF7D8 #xE0F3) + (#xF7D7 #xE0F2) + (#xF7D6 #xE0F1) + (#xF7D5 #xE0F0) + (#xF7D4 #xE0EF) + (#xF7D3 #xE0EE) + (#xF7D2 #xE0ED) + (#xF7D1 #xE0EC) + (#xF7D0 #xE0EB) + (#xF7CF #xE0EA) + (#xF7CE #xE0E9) + (#xF7CD #xE0E8) + (#xF7CC #xE0E7) + (#xF7CB #xE0E6) + (#xF7CA #xE0E5) + (#xF7C9 #xE0E4) + (#xF7C8 #xE0E3) + (#xF7C7 #xE0E2) + (#xF7C6 #xE0E1) + (#xF7C5 #xE0E0) + (#xF7C4 #xE0DF) + (#xF7C3 #xE0DE) + (#xF7C2 #xE0DD) + (#xF7C1 #xE0DC) + (#xF7C0 #xE0DB) + (#xF7BF #xE0DA) + (#xF7BE #xE0D9) + (#xF7BD #xE0D8) + (#xF7BC #xE0D7) + (#xF7BB #xE0D6) + (#xF7BA #xE0D5) + (#xF7B9 #xE0D4) + (#xF7B8 #xE0D3) + (#xF7B7 #xE0D2) + (#xF7B6 #xE0D1) + (#xF7B5 #xE0D0) + (#xF7B4 #xE0CF) + (#xF7B3 #xE0CE) + (#xF7B2 #xE0CD) + (#xF7B1 #xE0CC) + (#xF7B0 #xE0CB) + (#xF7AF #xE0CA) + (#xF7AE #xE0C9) + (#xF7AD #xE0C8) + (#xF7AC #xE0C7) + (#xF7AB #xE0C6) + (#xF7AA #xE0C5) + (#xF7A9 #xE0C4) + (#xF7A8 #xE0C3) + (#xF7A7 #xE0C2) + (#xF7A6 #xE0C1) + (#xF7A5 #xE0C0) + (#xF7A4 #xE0BF) + (#xF7A3 #xE0BE) + (#xF7A2 #xE0BD) + (#xF7A1 #xE0BC) + (#xF6FE #xE0BB) + (#xF6FD #xE0BA) + (#xF6FC #xE0B9) + (#xF6FB #xE0B8) + (#xF6FA #xE0B7) + (#xF6F9 #xE0B6) + (#xF6F8 #xE0B5) + (#xF6F7 #xE0B4) + (#xF6F6 #xE0B3) + (#xF6F5 #xE0B2) + (#xF6F4 #xE0B1) + (#xF6F3 #xE0B0) + (#xF6F2 #xE0AF) + (#xF6F1 #xE0AE) + (#xF6F0 #xE0AD) + (#xF6EF #xE0AC) + (#xF6EE #xE0AB) + (#xF6ED #xE0AA) + (#xF6EC #xE0A9) + (#xF6EB #xE0A8) + (#xF6EA #xE0A7) + (#xF6E9 #xE0A6) + (#xF6E8 #xE0A5) + (#xF6E7 #xE0A4) + (#xF6E6 #xE0A3) + (#xF6E5 #xE0A2) + (#xF6E4 #xE0A1) + (#xF6E3 #xE0A0) + (#xF6E2 #xE09F) + (#xF6E1 #xE09E) + (#xF6E0 #xE09D) + (#xF6DF #xE09C) + (#xF6DE #xE09B) + (#xF6DD #xE09A) + (#xF6DC #xE099) + (#xF6DB #xE098) + (#xF6DA #xE097) + (#xF6D9 #xE096) + (#xF6D8 #xE095) + (#xF6D7 #xE094) + (#xF6D6 #xE093) + (#xF6D5 #xE092) + (#xF6D4 #xE091) + (#xF6D3 #xE090) + (#xF6D2 #xE08F) + (#xF6D1 #xE08E) + (#xF6D0 #xE08D) + (#xF6CF #xE08C) + (#xF6CE #xE08B) + (#xF6CD #xE08A) + (#xF6CC #xE089) + (#xF6CB #xE088) + (#xF6CA #xE087) + (#xF6C9 #xE086) + (#xF6C8 #xE085) + (#xF6C7 #xE084) + (#xF6C6 #xE083) + (#xF6C5 #xE082) + (#xF6C4 #xE081) + (#xF6C3 #xE080) + (#xF6C2 #xE07F) + (#xF6C1 #xE07E) + (#xF6C0 #xE07D) + (#xF6BF #xE07C) + (#xF6BE #xE07B) + (#xF6BD #xE07A) + (#xF6BC #xE079) + (#xF6BB #xE078) + (#xF6BA #xE077) + (#xF6B9 #xE076) + (#xF6B8 #xE075) + (#xF6B7 #xE074) + (#xF6B6 #xE073) + (#xF6B5 #xE072) + (#xF6B4 #xE071) + (#xF6B3 #xE070) + (#xF6B2 #xE06F) + (#xF6B1 #xE06E) + (#xF6B0 #xE06D) + (#xF6AF #xE06C) + (#xF6AE #xE06B) + (#xF6AD #xE06A) + (#xF6AC #xE069) + (#xF6AB #xE068) + (#xF6AA #xE067) + (#xF6A9 #xE066) + (#xF6A8 #xE065) + (#xF6A7 #xE064) + (#xF6A6 #xE063) + (#xF6A5 #xE062) + (#xF6A4 #xE061) + (#xF6A3 #xE060) + (#xF6A2 #xE05F) + (#xF6A1 #xE05E) + (#xF5FE #xE05D) + (#xF5FD #xE05C) + (#xF5FC #xE05B) + (#xF5FB #xE05A) + (#xF5FA #xE059) + (#xF5F9 #xE058) + (#xF5F8 #xE057) + (#xF5F7 #xE056) + (#xF5F6 #xE055) + (#xF5F5 #xE054) + (#xF5F4 #xE053) + (#xF5F3 #xE052) + (#xF5F2 #xE051) + (#xF5F1 #xE050) + (#xF5F0 #xE04F) + (#xF5EF #xE04E) + (#xF5EE #xE04D) + (#xF5ED #xE04C) + (#xF5EC #xE04B) + (#xF5EB #xE04A) + (#xF5EA #xE049) + (#xF5E9 #xE048) + (#xF5E8 #xE047) + (#xF5E7 #xE046) + (#xF5E6 #xE045) + (#xF5E5 #xE044) + (#xF5E4 #xE043) + (#xF5E3 #xE042) + (#xF5E2 #xE041) + (#xF5E1 #xE040) + (#xF5E0 #xE03F) + (#xF5DF #xE03E) + (#xF5DE #xE03D) + (#xF5DD #xE03C) + (#xF5DC #xE03B) + (#xF5DB #xE03A) + (#xF5DA #xE039) + (#xF5D9 #xE038) + (#xF5D8 #xE037) + (#xF5D7 #xE036) + (#xF5D6 #xE035) + (#xF5D5 #xE034) + (#xF5D4 #xE033) + (#xF5D3 #xE032) + (#xF5D2 #xE031) + (#xF5D1 #xE030) + (#xF5D0 #xE02F) + (#xF5CF #xE02E) + (#xF5CE #xE02D) + (#xF5CD #xE02C) + (#xF5CC #xE02B) + (#xF5CB #xE02A) + (#xF5CA #xE029) + (#xF5C9 #xE028) + (#xF5C8 #xE027) + (#xF5C7 #xE026) + (#xF5C6 #xE025) + (#xF5C5 #xE024) + (#xF5C4 #xE023) + (#xF5C3 #xE022) + (#xF5C2 #xE021) + (#xF5C1 #xE020) + (#xF5C0 #xE01F) + (#xF5BF #xE01E) + (#xF5BE #xE01D) + (#xF5BD #xE01C) + (#xF5BC #xE01B) + (#xF5BB #xE01A) + (#xF5BA #xE019) + (#xF5B9 #xE018) + (#xF5B8 #xE017) + (#xF5B7 #xE016) + (#xF5B6 #xE015) + (#xF5B5 #xE014) + (#xF5B4 #xE013) + (#xF5B3 #xE012) + (#xF5B2 #xE011) + (#xF5B1 #xE010) + (#xF5B0 #xE00F) + (#xF5AF #xE00E) + (#xF5AE #xE00D) + (#xF5AD #xE00C) + (#xF5AC #xE00B) + (#xF5AB #xE00A) + (#xF5AA #xE009) + (#xF5A9 #xE008) + (#xF5A8 #xE007) + (#xF5A7 #xE006) + (#xF5A6 #xE005) + (#xF5A5 #xE004) + (#xF5A4 #xE003) + (#xF5A3 #xE002) + (#xF5A2 #xE001) + (#xF5A1 #xE000) + )) + +(defvar *eucjp* + '((#x8FA2AF #x2D8) + (#x8FA2B0 #x2C7) + (#x8FA2B1 #xB8) + (#x8FA2B2 #x2D9) + (#x8FA2B3 #x2DD) + (#x8FA2B4 #xAF) + (#x8FA2B5 #x2DB) + (#x8FA2B6 #x2DA) + (#x8FA2B7 #xFF5E) + (#x8FA2B8 #x384) + (#x8FA2B9 #x385) + (#x8FA2C2 #xA1) + (#x8FA2C3 #xA6) + (#x8FA2C4 #xBF) + (#x8FA2EB #xBA) + (#x8FA2EC #xAA) + (#x8FA2ED #xA9) + (#x8FA2EE #xAE) + (#x8FA2EF #x2122) + (#x8FA2F0 #xA4) + (#x8FA2F1 #x2116) + (#x8FA6E1 #x386) + (#x8FA6E2 #x388) + (#x8FA6E3 #x389) + (#x8FA6E4 #x38A) + (#x8FA6E5 #x3AA) + (#x8FA6E7 #x38C) + (#x8FA6E9 #x38E) + (#x8FA6EA #x3AB) + (#x8FA6EC #x38F) + (#x8FA6F1 #x3AC) + (#x8FA6F2 #x3AD) + (#x8FA6F3 #x3AE) + (#x8FA6F4 #x3AF) + (#x8FA6F5 #x3CA) + (#x8FA6F6 #x390) + (#x8FA6F7 #x3CC) + (#x8FA6F8 #x3C2) + (#x8FA6F9 #x3CD) + (#x8FA6FA #x3CB) + (#x8FA6FB #x3B0) + (#x8FA6FC #x3CE) + (#x8FA7C2 #x402) + (#x8FA7C3 #x403) + (#x8FA7C4 #x404) + (#x8FA7C5 #x405) + (#x8FA7C6 #x406) + (#x8FA7C7 #x407) + (#x8FA7C8 #x408) + (#x8FA7C9 #x409) + (#x8FA7CA #x40A) + (#x8FA7CB #x40B) + (#x8FA7CC #x40C) + (#x8FA7CD #x40E) + (#x8FA7CE #x40F) + (#x8FA7F2 #x452) + (#x8FA7F3 #x453) + (#x8FA7F4 #x454) + (#x8FA7F5 #x455) + (#x8FA7F6 #x456) + (#x8FA7F7 #x457) + (#x8FA7F8 #x458) + (#x8FA7F9 #x459) + (#x8FA7FA #x45A) + (#x8FA7FB #x45B) + (#x8FA7FC #x45C) + (#x8FA7FD #x45E) + (#x8FA7FE #x45F) + (#x8FA9A1 #xC6) + (#x8FA9A2 #x110) + (#x8FA9A4 #x126) + (#x8FA9A6 #x132) + (#x8FA9A8 #x141) + (#x8FA9A9 #x13F) + (#x8FA9AB #x14A) + (#x8FA9AC #xD8) + (#x8FA9AD #x152) + (#x8FA9AF #x166) + (#x8FA9B0 #xDE) + (#x8FA9C1 #xE6) + (#x8FA9C2 #x111) + (#x8FA9C3 #xF0) + (#x8FA9C4 #x127) + (#x8FA9C5 #x131) + (#x8FA9C6 #x133) + (#x8FA9C7 #x138) + (#x8FA9C8 #x142) + (#x8FA9C9 #x140) + (#x8FA9CA #x149) + (#x8FA9CB #x14B) + (#x8FA9CC #xF8) + (#x8FA9CD #x153) + (#x8FA9CE #xDF) + (#x8FA9CF #x167) + (#x8FA9D0 #xFE) + (#x8FAAA1 #xC1) + (#x8FAAA2 #xC0) + (#x8FAAA3 #xC4) + (#x8FAAA4 #xC2) + (#x8FAAA5 #x102) + (#x8FAAA6 #x1CD) + (#x8FAAA7 #x100) + (#x8FAAA8 #x104) + (#x8FAAA9 #xC5) + (#x8FAAAA #xC3) + (#x8FAAAB #x106) + (#x8FAAAC #x108) + (#x8FAAAD #x10C) + (#x8FAAAE #xC7) + (#x8FAAAF #x10A) + (#x8FAAB0 #x10E) + (#x8FAAB1 #xC9) + (#x8FAAB2 #xC8) + (#x8FAAB3 #xCB) + (#x8FAAB4 #xCA) + (#x8FAAB5 #x11A) + (#x8FAAB6 #x116) + (#x8FAAB7 #x112) + (#x8FAAB8 #x118) + (#x8FAABA #x11C) + (#x8FAABB #x11E) + (#x8FAABC #x122) + (#x8FAABD #x120) + (#x8FAABE #x124) + (#x8FAABF #xCD) + (#x8FAAC0 #xCC) + (#x8FAAC1 #xCF) + (#x8FAAC2 #xCE) + (#x8FAAC3 #x1CF) + (#x8FAAC4 #x130) + (#x8FAAC5 #x12A) + (#x8FAAC6 #x12E) + (#x8FAAC7 #x128) + (#x8FAAC8 #x134) + (#x8FAAC9 #x136) + (#x8FAACA #x139) + (#x8FAACB #x13D) + (#x8FAACC #x13B) + (#x8FAACD #x143) + (#x8FAACE #x147) + (#x8FAACF #x145) + (#x8FAAD0 #xD1) + (#x8FAAD1 #xD3) + (#x8FAAD2 #xD2) + (#x8FAAD3 #xD6) + (#x8FAAD4 #xD4) + (#x8FAAD5 #x1D1) + (#x8FAAD6 #x150) + (#x8FAAD7 #x14C) + (#x8FAAD8 #xD5) + (#x8FAAD9 #x154) + (#x8FAADA #x158) + (#x8FAADB #x156) + (#x8FAADC #x15A) + (#x8FAADD #x15C) + (#x8FAADE #x160) + (#x8FAADF #x15E) + (#x8FAAE0 #x164) + (#x8FAAE1 #x162) + (#x8FAAE2 #xDA) + (#x8FAAE3 #xD9) + (#x8FAAE4 #xDC) + (#x8FAAE5 #xDB) + (#x8FAAE6 #x16C) + (#x8FAAE7 #x1D3) + (#x8FAAE8 #x170) + (#x8FAAE9 #x16A) + (#x8FAAEA #x172) + (#x8FAAEB #x16E) + (#x8FAAEC #x168) + (#x8FAAED #x1D7) + (#x8FAAEE #x1DB) + (#x8FAAEF #x1D9) + (#x8FAAF0 #x1D5) + (#x8FAAF1 #x174) + (#x8FAAF2 #xDD) + (#x8FAAF3 #x178) + (#x8FAAF4 #x176) + (#x8FAAF5 #x179) + (#x8FAAF6 #x17D) + (#x8FAAF7 #x17B) + (#x8FABA1 #xE1) + (#x8FABA2 #xE0) + (#x8FABA3 #xE4) + (#x8FABA4 #xE2) + (#x8FABA5 #x103) + (#x8FABA6 #x1CE) + (#x8FABA7 #x101) + (#x8FABA8 #x105) + (#x8FABA9 #xE5) + (#x8FABAA #xE3) + (#x8FABAB #x107) + (#x8FABAC #x109) + (#x8FABAD #x10D) + (#x8FABAE #xE7) + (#x8FABAF #x10B) + (#x8FABB0 #x10F) + (#x8FABB1 #xE9) + (#x8FABB2 #xE8) + (#x8FABB3 #xEB) + (#x8FABB4 #xEA) + (#x8FABB5 #x11B) + (#x8FABB6 #x117) + (#x8FABB7 #x113) + (#x8FABB8 #x119) + (#x8FABB9 #x1F5) + (#x8FABBA #x11D) + (#x8FABBB #x11F) + (#x8FABBD #x121) + (#x8FABBE #x125) + (#x8FABBF #xED) + (#x8FABC0 #xEC) + (#x8FABC1 #xEF) + (#x8FABC2 #xEE) + (#x8FABC3 #x1D0) + (#x8FABC5 #x12B) + (#x8FABC6 #x12F) + (#x8FABC7 #x129) + (#x8FABC8 #x135) + (#x8FABC9 #x137) + (#x8FABCA #x13A) + (#x8FABCB #x13E) + (#x8FABCC #x13C) + (#x8FABCD #x144) + (#x8FABCE #x148) + (#x8FABCF #x146) + (#x8FABD0 #xF1) + (#x8FABD1 #xF3) + (#x8FABD2 #xF2) + (#x8FABD3 #xF6) + (#x8FABD4 #xF4) + (#x8FABD5 #x1D2) + (#x8FABD6 #x151) + (#x8FABD7 #x14D) + (#x8FABD8 #xF5) + (#x8FABD9 #x155) + (#x8FABDA #x159) + (#x8FABDB #x157) + (#x8FABDC #x15B) + (#x8FABDD #x15D) + (#x8FABDE #x161) + (#x8FABDF #x15F) + (#x8FABE0 #x165) + (#x8FABE1 #x163) + (#x8FABE2 #xFA) + (#x8FABE3 #xF9) + (#x8FABE4 #xFC) + (#x8FABE5 #xFB) + (#x8FABE6 #x16D) + (#x8FABE7 #x1D4) + (#x8FABE8 #x171) + (#x8FABE9 #x16B) + (#x8FABEA #x173) + (#x8FABEB #x16F) + (#x8FABEC #x169) + (#x8FABED #x1D8) + (#x8FABEE #x1DC) + (#x8FABEF #x1DA) + (#x8FABF0 #x1D6) + (#x8FABF1 #x175) + (#x8FABF2 #xFD) + (#x8FABF3 #xFF) + (#x8FABF4 #x177) + (#x8FABF5 #x17A) + (#x8FABF6 #x17E) + (#x8FABF7 #x17C) + (#x8FB0A1 #x4E02) + (#x8FB0A2 #x4E04) + (#x8FB0A3 #x4E05) + (#x8FB0A4 #x4E0C) + (#x8FB0A5 #x4E12) + (#x8FB0A6 #x4E1F) + (#x8FB0A7 #x4E23) + (#x8FB0A8 #x4E24) + (#x8FB0A9 #x4E28) + (#x8FB0AA #x4E2B) + (#x8FB0AB #x4E2E) + (#x8FB0AC #x4E2F) + (#x8FB0AD #x4E30) + (#x8FB0AE #x4E35) + (#x8FB0AF #x4E40) + (#x8FB0B0 #x4E41) + (#x8FB0B1 #x4E44) + (#x8FB0B2 #x4E47) + (#x8FB0B3 #x4E51) + (#x8FB0B4 #x4E5A) + (#x8FB0B5 #x4E5C) + (#x8FB0B6 #x4E63) + (#x8FB0B7 #x4E68) + (#x8FB0B8 #x4E69) + (#x8FB0B9 #x4E74) + (#x8FB0BA #x4E75) + (#x8FB0BB #x4E79) + (#x8FB0BC #x4E7F) + (#x8FB0BD #x4E8D) + (#x8FB0BE #x4E96) + (#x8FB0BF #x4E97) + (#x8FB0C0 #x4E9D) + (#x8FB0C1 #x4EAF) + (#x8FB0C2 #x4EB9) + (#x8FB0C3 #x4EC3) + (#x8FB0C4 #x4ED0) + (#x8FB0C5 #x4EDA) + (#x8FB0C6 #x4EDB) + (#x8FB0C7 #x4EE0) + (#x8FB0C8 #x4EE1) + (#x8FB0C9 #x4EE2) + (#x8FB0CA #x4EE8) + (#x8FB0CB #x4EEF) + (#x8FB0CC #x4EF1) + (#x8FB0CD #x4EF3) + (#x8FB0CE #x4EF5) + (#x8FB0CF #x4EFD) + (#x8FB0D0 #x4EFE) + (#x8FB0D1 #x4EFF) + (#x8FB0D2 #x4F00) + (#x8FB0D3 #x4F02) + (#x8FB0D4 #x4F03) + (#x8FB0D5 #x4F08) + (#x8FB0D6 #x4F0B) + (#x8FB0D7 #x4F0C) + (#x8FB0D8 #x4F12) + (#x8FB0D9 #x4F15) + (#x8FB0DA #x4F16) + (#x8FB0DB #x4F17) + (#x8FB0DC #x4F19) + (#x8FB0DD #x4F2E) + (#x8FB0DE #x4F31) + (#x8FB0DF #x4F60) + (#x8FB0E0 #x4F33) + (#x8FB0E1 #x4F35) + (#x8FB0E2 #x4F37) + (#x8FB0E3 #x4F39) + (#x8FB0E4 #x4F3B) + (#x8FB0E5 #x4F3E) + (#x8FB0E6 #x4F40) + (#x8FB0E7 #x4F42) + (#x8FB0E8 #x4F48) + (#x8FB0E9 #x4F49) + (#x8FB0EA #x4F4B) + (#x8FB0EB #x4F4C) + (#x8FB0EC #x4F52) + (#x8FB0ED #x4F54) + (#x8FB0EE #x4F56) + (#x8FB0EF #x4F58) + (#x8FB0F0 #x4F5F) + (#x8FB0F1 #x4F63) + (#x8FB0F2 #x4F6A) + (#x8FB0F3 #x4F6C) + (#x8FB0F4 #x4F6E) + (#x8FB0F5 #x4F71) + (#x8FB0F6 #x4F77) + (#x8FB0F7 #x4F78) + (#x8FB0F8 #x4F79) + (#x8FB0F9 #x4F7A) + (#x8FB0FA #x4F7D) + (#x8FB0FB #x4F7E) + (#x8FB0FC #x4F81) + (#x8FB0FD #x4F82) + (#x8FB0FE #x4F84) + (#x8FB1A1 #x4F85) + (#x8FB1A2 #x4F89) + (#x8FB1A3 #x4F8A) + (#x8FB1A4 #x4F8C) + (#x8FB1A5 #x4F8E) + (#x8FB1A6 #x4F90) + (#x8FB1A7 #x4F92) + (#x8FB1A8 #x4F93) + (#x8FB1A9 #x4F94) + (#x8FB1AA #x4F97) + (#x8FB1AB #x4F99) + (#x8FB1AC #x4F9A) + (#x8FB1AD #x4F9E) + (#x8FB1AE #x4F9F) + (#x8FB1AF #x4FB2) + (#x8FB1B0 #x4FB7) + (#x8FB1B1 #x4FB9) + (#x8FB1B2 #x4FBB) + (#x8FB1B3 #x4FBC) + (#x8FB1B4 #x4FBD) + (#x8FB1B5 #x4FBE) + (#x8FB1B6 #x4FC0) + (#x8FB1B7 #x4FC1) + (#x8FB1B8 #x4FC5) + (#x8FB1B9 #x4FC6) + (#x8FB1BA #x4FC8) + (#x8FB1BB #x4FC9) + (#x8FB1BC #x4FCB) + (#x8FB1BD #x4FCC) + (#x8FB1BE #x4FCD) + (#x8FB1BF #x4FCF) + (#x8FB1C0 #x4FD2) + (#x8FB1C1 #x4FDC) + (#x8FB1C2 #x4FE0) + (#x8FB1C3 #x4FE2) + (#x8FB1C4 #x4FF0) + (#x8FB1C5 #x4FF2) + (#x8FB1C6 #x4FFC) + (#x8FB1C7 #x4FFD) + (#x8FB1C8 #x4FFF) + (#x8FB1C9 #x5000) + (#x8FB1CA #x5001) + (#x8FB1CB #x5004) + (#x8FB1CC #x5007) + (#x8FB1CD #x500A) + (#x8FB1CE #x500C) + (#x8FB1CF #x500E) + (#x8FB1D0 #x5010) + (#x8FB1D1 #x5013) + (#x8FB1D2 #x5017) + (#x8FB1D3 #x5018) + (#x8FB1D4 #x501B) + (#x8FB1D5 #x501C) + (#x8FB1D6 #x501D) + (#x8FB1D7 #x501E) + (#x8FB1D8 #x5022) + (#x8FB1D9 #x5027) + (#x8FB1DA #x502E) + (#x8FB1DB #x5030) + (#x8FB1DC #x5032) + (#x8FB1DD #x5033) + (#x8FB1DE #x5035) + (#x8FB1DF #x5040) + (#x8FB1E0 #x5041) + (#x8FB1E1 #x5042) + (#x8FB1E2 #x5045) + (#x8FB1E3 #x5046) + (#x8FB1E4 #x504A) + (#x8FB1E5 #x504C) + (#x8FB1E6 #x504E) + (#x8FB1E7 #x5051) + (#x8FB1E8 #x5052) + (#x8FB1E9 #x5053) + (#x8FB1EA #x5057) + (#x8FB1EB #x5059) + (#x8FB1EC #x505F) + (#x8FB1ED #x5060) + (#x8FB1EE #x5062) + (#x8FB1EF #x5063) + (#x8FB1F0 #x5066) + (#x8FB1F1 #x5067) + (#x8FB1F2 #x506A) + (#x8FB1F3 #x506D) + (#x8FB1F4 #x5070) + (#x8FB1F5 #x5071) + (#x8FB1F6 #x503B) + (#x8FB1F7 #x5081) + (#x8FB1F8 #x5083) + (#x8FB1F9 #x5084) + (#x8FB1FA #x5086) + (#x8FB1FB #x508A) + (#x8FB1FC #x508E) + (#x8FB1FD #x508F) + (#x8FB1FE #x5090) + (#x8FB2A1 #x5092) + (#x8FB2A2 #x5093) + (#x8FB2A3 #x5094) + (#x8FB2A4 #x5096) + (#x8FB2A5 #x509B) + (#x8FB2A6 #x509C) + (#x8FB2A7 #x509E) + (#x8FB2A8 #x509F) + (#x8FB2A9 #x50A0) + (#x8FB2AA #x50A1) + (#x8FB2AB #x50A2) + (#x8FB2AC #x50AA) + (#x8FB2AD #x50AF) + (#x8FB2AE #x50B0) + (#x8FB2AF #x50B9) + (#x8FB2B0 #x50BA) + (#x8FB2B1 #x50BD) + (#x8FB2B2 #x50C0) + (#x8FB2B3 #x50C3) + (#x8FB2B4 #x50C4) + (#x8FB2B5 #x50C7) + (#x8FB2B6 #x50CC) + (#x8FB2B7 #x50CE) + (#x8FB2B8 #x50D0) + (#x8FB2B9 #x50D3) + (#x8FB2BA #x50D4) + (#x8FB2BB #x50D8) + (#x8FB2BC #x50DC) + (#x8FB2BD #x50DD) + (#x8FB2BE #x50DF) + (#x8FB2BF #x50E2) + (#x8FB2C0 #x50E4) + (#x8FB2C1 #x50E6) + (#x8FB2C2 #x50E8) + (#x8FB2C3 #x50E9) + (#x8FB2C4 #x50EF) + (#x8FB2C5 #x50F1) + (#x8FB2C6 #x50F6) + (#x8FB2C7 #x50FA) + (#x8FB2C8 #x50FE) + (#x8FB2C9 #x5103) + (#x8FB2CA #x5106) + (#x8FB2CB #x5107) + (#x8FB2CC #x5108) + (#x8FB2CD #x510B) + (#x8FB2CE #x510C) + (#x8FB2CF #x510D) + (#x8FB2D0 #x510E) + (#x8FB2D1 #x50F2) + (#x8FB2D2 #x5110) + (#x8FB2D3 #x5117) + (#x8FB2D4 #x5119) + (#x8FB2D5 #x511B) + (#x8FB2D6 #x511C) + (#x8FB2D7 #x511D) + (#x8FB2D8 #x511E) + (#x8FB2D9 #x5123) + (#x8FB2DA #x5127) + (#x8FB2DB #x5128) + (#x8FB2DC #x512C) + (#x8FB2DD #x512D) + (#x8FB2DE #x512F) + (#x8FB2DF #x5131) + (#x8FB2E0 #x5133) + (#x8FB2E1 #x5134) + (#x8FB2E2 #x5135) + (#x8FB2E3 #x5138) + (#x8FB2E4 #x5139) + (#x8FB2E5 #x5142) + (#x8FB2E6 #x514A) + (#x8FB2E7 #x514F) + (#x8FB2E8 #x5153) + (#x8FB2E9 #x5155) + (#x8FB2EA #x5157) + (#x8FB2EB #x5158) + (#x8FB2EC #x515F) + (#x8FB2ED #x5164) + (#x8FB2EE #x5166) + (#x8FB2EF #x517E) + (#x8FB2F0 #x5183) + (#x8FB2F1 #x5184) + (#x8FB2F2 #x518B) + (#x8FB2F3 #x518E) + (#x8FB2F4 #x5198) + (#x8FB2F5 #x519D) + (#x8FB2F6 #x51A1) + (#x8FB2F7 #x51A3) + (#x8FB2F8 #x51AD) + (#x8FB2F9 #x51B8) + (#x8FB2FA #x51BA) + (#x8FB2FB #x51BC) + (#x8FB2FC #x51BE) + (#x8FB2FD #x51BF) + (#x8FB2FE #x51C2) + (#x8FB3A1 #x51C8) + (#x8FB3A2 #x51CF) + (#x8FB3A3 #x51D1) + (#x8FB3A4 #x51D2) + (#x8FB3A5 #x51D3) + (#x8FB3A6 #x51D5) + (#x8FB3A7 #x51D8) + (#x8FB3A8 #x51DE) + (#x8FB3A9 #x51E2) + (#x8FB3AA #x51E5) + (#x8FB3AB #x51EE) + (#x8FB3AC #x51F2) + (#x8FB3AD #x51F3) + (#x8FB3AE #x51F4) + (#x8FB3AF #x51F7) + (#x8FB3B0 #x5201) + (#x8FB3B1 #x5202) + (#x8FB3B2 #x5205) + (#x8FB3B3 #x5212) + (#x8FB3B4 #x5213) + (#x8FB3B5 #x5215) + (#x8FB3B6 #x5216) + (#x8FB3B7 #x5218) + (#x8FB3B8 #x5222) + (#x8FB3B9 #x5228) + (#x8FB3BA #x5231) + (#x8FB3BB #x5232) + (#x8FB3BC #x5235) + (#x8FB3BD #x523C) + (#x8FB3BE #x5245) + (#x8FB3BF #x5249) + (#x8FB3C0 #x5255) + (#x8FB3C1 #x5257) + (#x8FB3C2 #x5258) + (#x8FB3C3 #x525A) + (#x8FB3C4 #x525C) + (#x8FB3C5 #x525F) + (#x8FB3C6 #x5260) + (#x8FB3C7 #x5261) + (#x8FB3C8 #x5266) + (#x8FB3C9 #x526E) + (#x8FB3CA #x5277) + (#x8FB3CB #x5278) + (#x8FB3CC #x5279) + (#x8FB3CD #x5280) + (#x8FB3CE #x5282) + (#x8FB3CF #x5285) + (#x8FB3D0 #x528A) + (#x8FB3D1 #x528C) + (#x8FB3D2 #x5293) + (#x8FB3D3 #x5295) + (#x8FB3D4 #x5296) + (#x8FB3D5 #x5297) + (#x8FB3D6 #x5298) + (#x8FB3D7 #x529A) + (#x8FB3D8 #x529C) + (#x8FB3D9 #x52A4) + (#x8FB3DA #x52A5) + (#x8FB3DB #x52A6) + (#x8FB3DC #x52A7) + (#x8FB3DD #x52AF) + (#x8FB3DE #x52B0) + (#x8FB3DF #x52B6) + (#x8FB3E0 #x52B7) + (#x8FB3E1 #x52B8) + (#x8FB3E2 #x52BA) + (#x8FB3E3 #x52BB) + (#x8FB3E4 #x52BD) + (#x8FB3E5 #x52C0) + (#x8FB3E6 #x52C4) + (#x8FB3E7 #x52C6) + (#x8FB3E8 #x52C8) + (#x8FB3E9 #x52CC) + (#x8FB3EA #x52CF) + (#x8FB3EB #x52D1) + (#x8FB3EC #x52D4) + (#x8FB3ED #x52D6) + (#x8FB3EE #x52DB) + (#x8FB3EF #x52DC) + (#x8FB3F0 #x52E1) + (#x8FB3F1 #x52E5) + (#x8FB3F2 #x52E8) + (#x8FB3F3 #x52E9) + (#x8FB3F4 #x52EA) + (#x8FB3F5 #x52EC) + (#x8FB3F6 #x52F0) + (#x8FB3F7 #x52F1) + (#x8FB3F8 #x52F4) + (#x8FB3F9 #x52F6) + (#x8FB3FA #x52F7) + (#x8FB3FB #x5300) + (#x8FB3FC #x5303) + (#x8FB3FD #x530A) + (#x8FB3FE #x530B) + (#x8FB4A1 #x530C) + (#x8FB4A2 #x5311) + (#x8FB4A3 #x5313) + (#x8FB4A4 #x5318) + (#x8FB4A5 #x531B) + (#x8FB4A6 #x531C) + (#x8FB4A7 #x531E) + (#x8FB4A8 #x531F) + (#x8FB4A9 #x5325) + (#x8FB4AA #x5327) + (#x8FB4AB #x5328) + (#x8FB4AC #x5329) + (#x8FB4AD #x532B) + (#x8FB4AE #x532C) + (#x8FB4AF #x532D) + (#x8FB4B0 #x5330) + (#x8FB4B1 #x5332) + (#x8FB4B2 #x5335) + (#x8FB4B3 #x533C) + (#x8FB4B4 #x533D) + (#x8FB4B5 #x533E) + (#x8FB4B6 #x5342) + (#x8FB4B7 #x534C) + (#x8FB4B8 #x534B) + (#x8FB4B9 #x5359) + (#x8FB4BA #x535B) + (#x8FB4BB #x5361) + (#x8FB4BC #x5363) + (#x8FB4BD #x5365) + (#x8FB4BE #x536C) + (#x8FB4BF #x536D) + (#x8FB4C0 #x5372) + (#x8FB4C1 #x5379) + (#x8FB4C2 #x537E) + (#x8FB4C3 #x5383) + (#x8FB4C4 #x5387) + (#x8FB4C5 #x5388) + (#x8FB4C6 #x538E) + (#x8FB4C7 #x5393) + (#x8FB4C8 #x5394) + (#x8FB4C9 #x5399) + (#x8FB4CA #x539D) + (#x8FB4CB #x53A1) + (#x8FB4CC #x53A4) + (#x8FB4CD #x53AA) + (#x8FB4CE #x53AB) + (#x8FB4CF #x53AF) + (#x8FB4D0 #x53B2) + (#x8FB4D1 #x53B4) + (#x8FB4D2 #x53B5) + (#x8FB4D3 #x53B7) + (#x8FB4D4 #x53B8) + (#x8FB4D5 #x53BA) + (#x8FB4D6 #x53BD) + (#x8FB4D7 #x53C0) + (#x8FB4D8 #x53C5) + (#x8FB4D9 #x53CF) + (#x8FB4DA #x53D2) + (#x8FB4DB #x53D3) + (#x8FB4DC #x53D5) + (#x8FB4DD #x53DA) + (#x8FB4DE #x53DD) + (#x8FB4DF #x53DE) + (#x8FB4E0 #x53E0) + (#x8FB4E1 #x53E6) + (#x8FB4E2 #x53E7) + (#x8FB4E3 #x53F5) + (#x8FB4E4 #x5402) + (#x8FB4E5 #x5413) + (#x8FB4E6 #x541A) + (#x8FB4E7 #x5421) + (#x8FB4E8 #x5427) + (#x8FB4E9 #x5428) + (#x8FB4EA #x542A) + (#x8FB4EB #x542F) + (#x8FB4EC #x5431) + (#x8FB4ED #x5434) + (#x8FB4EE #x5435) + (#x8FB4EF #x5443) + (#x8FB4F0 #x5444) + (#x8FB4F1 #x5447) + (#x8FB4F2 #x544D) + (#x8FB4F3 #x544F) + (#x8FB4F4 #x545E) + (#x8FB4F5 #x5462) + (#x8FB4F6 #x5464) + (#x8FB4F7 #x5466) + (#x8FB4F8 #x5467) + (#x8FB4F9 #x5469) + (#x8FB4FA #x546B) + (#x8FB4FB #x546D) + (#x8FB4FC #x546E) + (#x8FB4FD #x5474) + (#x8FB4FE #x547F) + (#x8FB5A1 #x5481) + (#x8FB5A2 #x5483) + (#x8FB5A3 #x5485) + (#x8FB5A4 #x5488) + (#x8FB5A5 #x5489) + (#x8FB5A6 #x548D) + (#x8FB5A7 #x5491) + (#x8FB5A8 #x5495) + (#x8FB5A9 #x5496) + (#x8FB5AA #x549C) + (#x8FB5AB #x549F) + (#x8FB5AC #x54A1) + (#x8FB5AD #x54A6) + (#x8FB5AE #x54A7) + (#x8FB5AF #x54A9) + (#x8FB5B0 #x54AA) + (#x8FB5B1 #x54AD) + (#x8FB5B2 #x54AE) + (#x8FB5B3 #x54B1) + (#x8FB5B4 #x54B7) + (#x8FB5B5 #x54B9) + (#x8FB5B6 #x54BA) + (#x8FB5B7 #x54BB) + (#x8FB5B8 #x54BF) + (#x8FB5B9 #x54C6) + (#x8FB5BA #x54CA) + (#x8FB5BB #x54CD) + (#x8FB5BC #x54CE) + (#x8FB5BD #x54E0) + (#x8FB5BE #x54EA) + (#x8FB5BF #x54EC) + (#x8FB5C0 #x54EF) + (#x8FB5C1 #x54F6) + (#x8FB5C2 #x54FC) + (#x8FB5C3 #x54FE) + (#x8FB5C4 #x54FF) + (#x8FB5C5 #x5500) + (#x8FB5C6 #x5501) + (#x8FB5C7 #x5505) + (#x8FB5C8 #x5508) + (#x8FB5C9 #x5509) + (#x8FB5CA #x550C) + (#x8FB5CB #x550D) + (#x8FB5CC #x550E) + (#x8FB5CD #x5515) + (#x8FB5CE #x552A) + (#x8FB5CF #x552B) + (#x8FB5D0 #x5532) + (#x8FB5D1 #x5535) + (#x8FB5D2 #x5536) + (#x8FB5D3 #x553B) + (#x8FB5D4 #x553C) + (#x8FB5D5 #x553D) + (#x8FB5D6 #x5541) + (#x8FB5D7 #x5547) + (#x8FB5D8 #x5549) + (#x8FB5D9 #x554A) + (#x8FB5DA #x554D) + (#x8FB5DB #x5550) + (#x8FB5DC #x5551) + (#x8FB5DD #x5558) + (#x8FB5DE #x555A) + (#x8FB5DF #x555B) + (#x8FB5E0 #x555E) + (#x8FB5E1 #x5560) + (#x8FB5E2 #x5561) + (#x8FB5E3 #x5564) + (#x8FB5E4 #x5566) + (#x8FB5E5 #x557F) + (#x8FB5E6 #x5581) + (#x8FB5E7 #x5582) + (#x8FB5E8 #x5586) + (#x8FB5E9 #x5588) + (#x8FB5EA #x558E) + (#x8FB5EB #x558F) + (#x8FB5EC #x5591) + (#x8FB5ED #x5592) + (#x8FB5EE #x5593) + (#x8FB5EF #x5594) + (#x8FB5F0 #x5597) + (#x8FB5F1 #x55A3) + (#x8FB5F2 #x55A4) + (#x8FB5F3 #x55AD) + (#x8FB5F4 #x55B2) + (#x8FB5F5 #x55BF) + (#x8FB5F6 #x55C1) + (#x8FB5F7 #x55C3) + (#x8FB5F8 #x55C6) + (#x8FB5F9 #x55C9) + (#x8FB5FA #x55CB) + (#x8FB5FB #x55CC) + (#x8FB5FC #x55CE) + (#x8FB5FD #x55D1) + (#x8FB5FE #x55D2) + (#x8FB6A1 #x55D3) + (#x8FB6A2 #x55D7) + (#x8FB6A3 #x55D8) + (#x8FB6A4 #x55DB) + (#x8FB6A5 #x55DE) + (#x8FB6A6 #x55E2) + (#x8FB6A7 #x55E9) + (#x8FB6A8 #x55F6) + (#x8FB6A9 #x55FF) + (#x8FB6AA #x5605) + (#x8FB6AB #x5608) + (#x8FB6AC #x560A) + (#x8FB6AD #x560D) + (#x8FB6AE #x560E) + (#x8FB6AF #x560F) + (#x8FB6B0 #x5610) + (#x8FB6B1 #x5611) + (#x8FB6B2 #x5612) + (#x8FB6B3 #x5619) + (#x8FB6B4 #x562C) + (#x8FB6B5 #x5630) + (#x8FB6B6 #x5633) + (#x8FB6B7 #x5635) + (#x8FB6B8 #x5637) + (#x8FB6B9 #x5639) + (#x8FB6BA #x563B) + (#x8FB6BB #x563C) + (#x8FB6BC #x563D) + (#x8FB6BD #x563F) + (#x8FB6BE #x5640) + (#x8FB6BF #x5641) + (#x8FB6C0 #x5643) + (#x8FB6C1 #x5644) + (#x8FB6C2 #x5646) + (#x8FB6C3 #x5649) + (#x8FB6C4 #x564B) + (#x8FB6C5 #x564D) + (#x8FB6C6 #x564F) + (#x8FB6C7 #x5654) + (#x8FB6C8 #x565E) + (#x8FB6C9 #x5660) + (#x8FB6CA #x5661) + (#x8FB6CB #x5662) + (#x8FB6CC #x5663) + (#x8FB6CD #x5666) + (#x8FB6CE #x5669) + (#x8FB6CF #x566D) + (#x8FB6D0 #x566F) + (#x8FB6D1 #x5671) + (#x8FB6D2 #x5672) + (#x8FB6D3 #x5675) + (#x8FB6D4 #x5684) + (#x8FB6D5 #x5685) + (#x8FB6D6 #x5688) + (#x8FB6D7 #x568B) + (#x8FB6D8 #x568C) + (#x8FB6D9 #x5695) + (#x8FB6DA #x5699) + (#x8FB6DB #x569A) + (#x8FB6DC #x569D) + (#x8FB6DD #x569E) + (#x8FB6DE #x569F) + (#x8FB6DF #x56A6) + (#x8FB6E0 #x56A7) + (#x8FB6E1 #x56A8) + (#x8FB6E2 #x56A9) + (#x8FB6E3 #x56AB) + (#x8FB6E4 #x56AC) + (#x8FB6E5 #x56AD) + (#x8FB6E6 #x56B1) + (#x8FB6E7 #x56B3) + (#x8FB6E8 #x56B7) + (#x8FB6E9 #x56BE) + (#x8FB6EA #x56C5) + (#x8FB6EB #x56C9) + (#x8FB6EC #x56CA) + (#x8FB6ED #x56CB) + (#x8FB6EE #x56CF) + (#x8FB6EF #x56D0) + (#x8FB6F0 #x56CC) + (#x8FB6F1 #x56CD) + (#x8FB6F2 #x56D9) + (#x8FB6F3 #x56DC) + (#x8FB6F4 #x56DD) + (#x8FB6F5 #x56DF) + (#x8FB6F6 #x56E1) + (#x8FB6F7 #x56E4) + (#x8FB6F8 #x56E5) + (#x8FB6F9 #x56E6) + (#x8FB6FA #x56E7) + (#x8FB6FB #x56E8) + (#x8FB6FC #x56F1) + (#x8FB6FD #x56EB) + (#x8FB6FE #x56ED) + (#x8FB7A1 #x56F6) + (#x8FB7A2 #x56F7) + (#x8FB7A3 #x5701) + (#x8FB7A4 #x5702) + (#x8FB7A5 #x5707) + (#x8FB7A6 #x570A) + (#x8FB7A7 #x570C) + (#x8FB7A8 #x5711) + (#x8FB7A9 #x5715) + (#x8FB7AA #x571A) + (#x8FB7AB #x571B) + (#x8FB7AC #x571D) + (#x8FB7AD #x5720) + (#x8FB7AE #x5722) + (#x8FB7AF #x5723) + (#x8FB7B0 #x5724) + (#x8FB7B1 #x5725) + (#x8FB7B2 #x5729) + (#x8FB7B3 #x572A) + (#x8FB7B4 #x572C) + (#x8FB7B5 #x572E) + (#x8FB7B6 #x572F) + (#x8FB7B7 #x5733) + (#x8FB7B8 #x5734) + (#x8FB7B9 #x573D) + (#x8FB7BA #x573E) + (#x8FB7BB #x573F) + (#x8FB7BC #x5745) + (#x8FB7BD #x5746) + (#x8FB7BE #x574C) + (#x8FB7BF #x574D) + (#x8FB7C0 #x5752) + (#x8FB7C1 #x5762) + (#x8FB7C2 #x5765) + (#x8FB7C3 #x5767) + (#x8FB7C4 #x5768) + (#x8FB7C5 #x576B) + (#x8FB7C6 #x576D) + (#x8FB7C7 #x576E) + (#x8FB7C8 #x576F) + (#x8FB7C9 #x5770) + (#x8FB7CA #x5771) + (#x8FB7CB #x5773) + (#x8FB7CC #x5774) + (#x8FB7CD #x5775) + (#x8FB7CE #x5777) + (#x8FB7CF #x5779) + (#x8FB7D0 #x577A) + (#x8FB7D1 #x577B) + (#x8FB7D2 #x577C) + (#x8FB7D3 #x577E) + (#x8FB7D4 #x5781) + (#x8FB7D5 #x5783) + (#x8FB7D6 #x578C) + (#x8FB7D7 #x5794) + (#x8FB7D8 #x5797) + (#x8FB7D9 #x5799) + (#x8FB7DA #x579A) + (#x8FB7DB #x579C) + (#x8FB7DC #x579D) + (#x8FB7DD #x579E) + (#x8FB7DE #x579F) + (#x8FB7DF #x57A1) + (#x8FB7E0 #x5795) + (#x8FB7E1 #x57A7) + (#x8FB7E2 #x57A8) + (#x8FB7E3 #x57A9) + (#x8FB7E4 #x57AC) + (#x8FB7E5 #x57B8) + (#x8FB7E6 #x57BD) + (#x8FB7E7 #x57C7) + (#x8FB7E8 #x57C8) + (#x8FB7E9 #x57CC) + (#x8FB7EA #x57CF) + (#x8FB7EB #x57D5) + (#x8FB7EC #x57DD) + (#x8FB7ED #x57DE) + (#x8FB7EE #x57E4) + (#x8FB7EF #x57E6) + (#x8FB7F0 #x57E7) + (#x8FB7F1 #x57E9) + (#x8FB7F2 #x57ED) + (#x8FB7F3 #x57F0) + (#x8FB7F4 #x57F5) + (#x8FB7F5 #x57F6) + (#x8FB7F6 #x57F8) + (#x8FB7F7 #x57FD) + (#x8FB7F8 #x57FE) + (#x8FB7F9 #x57FF) + (#x8FB7FA #x5803) + (#x8FB7FB #x5804) + (#x8FB7FC #x5808) + (#x8FB7FD #x5809) + (#x8FB7FE #x57E1) + (#x8FB8A1 #x580C) + (#x8FB8A2 #x580D) + (#x8FB8A3 #x581B) + (#x8FB8A4 #x581E) + (#x8FB8A5 #x581F) + (#x8FB8A6 #x5820) + (#x8FB8A7 #x5826) + (#x8FB8A8 #x5827) + (#x8FB8A9 #x582D) + (#x8FB8AA #x5832) + (#x8FB8AB #x5839) + (#x8FB8AC #x583F) + (#x8FB8AD #x5849) + (#x8FB8AE #x584C) + (#x8FB8AF #x584D) + (#x8FB8B0 #x584F) + (#x8FB8B1 #x5850) + (#x8FB8B2 #x5855) + (#x8FB8B3 #x585F) + (#x8FB8B4 #x5861) + (#x8FB8B5 #x5864) + (#x8FB8B6 #x5867) + (#x8FB8B7 #x5868) + (#x8FB8B8 #x5878) + (#x8FB8B9 #x587C) + (#x8FB8BA #x587F) + (#x8FB8BB #x5880) + (#x8FB8BC #x5881) + (#x8FB8BD #x5887) + (#x8FB8BE #x5888) + (#x8FB8BF #x5889) + (#x8FB8C0 #x588A) + (#x8FB8C1 #x588C) + (#x8FB8C2 #x588D) + (#x8FB8C3 #x588F) + (#x8FB8C4 #x5890) + (#x8FB8C5 #x5894) + (#x8FB8C6 #x5896) + (#x8FB8C7 #x589D) + (#x8FB8C8 #x58A0) + (#x8FB8C9 #x58A1) + (#x8FB8CA #x58A2) + (#x8FB8CB #x58A6) + (#x8FB8CC #x58A9) + (#x8FB8CD #x58B1) + (#x8FB8CE #x58B2) + (#x8FB8CF #x58C4) + (#x8FB8D0 #x58BC) + (#x8FB8D1 #x58C2) + (#x8FB8D2 #x58C8) + (#x8FB8D3 #x58CD) + (#x8FB8D4 #x58CE) + (#x8FB8D5 #x58D0) + (#x8FB8D6 #x58D2) + (#x8FB8D7 #x58D4) + (#x8FB8D8 #x58D6) + (#x8FB8D9 #x58DA) + (#x8FB8DA #x58DD) + (#x8FB8DB #x58E1) + (#x8FB8DC #x58E2) + (#x8FB8DD #x58E9) + (#x8FB8DE #x58F3) + (#x8FB8DF #x5905) + (#x8FB8E0 #x5906) + (#x8FB8E1 #x590B) + (#x8FB8E2 #x590C) + (#x8FB8E3 #x5912) + (#x8FB8E4 #x5913) + (#x8FB8E5 #x5914) + (#x8FB8E6 #x8641) + (#x8FB8E7 #x591D) + (#x8FB8E8 #x5921) + (#x8FB8E9 #x5923) + (#x8FB8EA #x5924) + (#x8FB8EB #x5928) + (#x8FB8EC #x592F) + (#x8FB8ED #x5930) + (#x8FB8EE #x5933) + (#x8FB8EF #x5935) + (#x8FB8F0 #x5936) + (#x8FB8F1 #x593F) + (#x8FB8F2 #x5943) + (#x8FB8F3 #x5946) + (#x8FB8F4 #x5952) + (#x8FB8F5 #x5953) + (#x8FB8F6 #x5959) + (#x8FB8F7 #x595B) + (#x8FB8F8 #x595D) + (#x8FB8F9 #x595E) + (#x8FB8FA #x595F) + (#x8FB8FB #x5961) + (#x8FB8FC #x5963) + (#x8FB8FD #x596B) + (#x8FB8FE #x596D) + (#x8FB9A1 #x596F) + (#x8FB9A2 #x5972) + (#x8FB9A3 #x5975) + (#x8FB9A4 #x5976) + (#x8FB9A5 #x5979) + (#x8FB9A6 #x597B) + (#x8FB9A7 #x597C) + (#x8FB9A8 #x598B) + (#x8FB9A9 #x598C) + (#x8FB9AA #x598E) + (#x8FB9AB #x5992) + (#x8FB9AC #x5995) + (#x8FB9AD #x5997) + (#x8FB9AE #x599F) + (#x8FB9AF #x59A4) + (#x8FB9B0 #x59A7) + (#x8FB9B1 #x59AD) + (#x8FB9B2 #x59AE) + (#x8FB9B3 #x59AF) + (#x8FB9B4 #x59B0) + (#x8FB9B5 #x59B3) + (#x8FB9B6 #x59B7) + (#x8FB9B7 #x59BA) + (#x8FB9B8 #x59BC) + (#x8FB9B9 #x59C1) + (#x8FB9BA #x59C3) + (#x8FB9BB #x59C4) + (#x8FB9BC #x59C8) + (#x8FB9BD #x59CA) + (#x8FB9BE #x59CD) + (#x8FB9BF #x59D2) + (#x8FB9C0 #x59DD) + (#x8FB9C1 #x59DE) + (#x8FB9C2 #x59DF) + (#x8FB9C3 #x59E3) + (#x8FB9C4 #x59E4) + (#x8FB9C5 #x59E7) + (#x8FB9C6 #x59EE) + (#x8FB9C7 #x59EF) + (#x8FB9C8 #x59F1) + (#x8FB9C9 #x59F2) + (#x8FB9CA #x59F4) + (#x8FB9CB #x59F7) + (#x8FB9CC #x5A00) + (#x8FB9CD #x5A04) + (#x8FB9CE #x5A0C) + (#x8FB9CF #x5A0D) + (#x8FB9D0 #x5A0E) + (#x8FB9D1 #x5A12) + (#x8FB9D2 #x5A13) + (#x8FB9D3 #x5A1E) + (#x8FB9D4 #x5A23) + (#x8FB9D5 #x5A24) + (#x8FB9D6 #x5A27) + (#x8FB9D7 #x5A28) + (#x8FB9D8 #x5A2A) + (#x8FB9D9 #x5A2D) + (#x8FB9DA #x5A30) + (#x8FB9DB #x5A44) + (#x8FB9DC #x5A45) + (#x8FB9DD #x5A47) + (#x8FB9DE #x5A48) + (#x8FB9DF #x5A4C) + (#x8FB9E0 #x5A50) + (#x8FB9E1 #x5A55) + (#x8FB9E2 #x5A5E) + (#x8FB9E3 #x5A63) + (#x8FB9E4 #x5A65) + (#x8FB9E5 #x5A67) + (#x8FB9E6 #x5A6D) + (#x8FB9E7 #x5A77) + (#x8FB9E8 #x5A7A) + (#x8FB9E9 #x5A7B) + (#x8FB9EA #x5A7E) + (#x8FB9EB #x5A8B) + (#x8FB9EC #x5A90) + (#x8FB9ED #x5A93) + (#x8FB9EE #x5A96) + (#x8FB9EF #x5A99) + (#x8FB9F0 #x5A9C) + (#x8FB9F1 #x5A9E) + (#x8FB9F2 #x5A9F) + (#x8FB9F3 #x5AA0) + (#x8FB9F4 #x5AA2) + (#x8FB9F5 #x5AA7) + (#x8FB9F6 #x5AAC) + (#x8FB9F7 #x5AB1) + (#x8FB9F8 #x5AB2) + (#x8FB9F9 #x5AB3) + (#x8FB9FA #x5AB5) + (#x8FB9FB #x5AB8) + (#x8FB9FC #x5ABA) + (#x8FB9FD #x5ABB) + (#x8FB9FE #x5ABF) + (#x8FBAA1 #x5AC4) + (#x8FBAA2 #x5AC6) + (#x8FBAA3 #x5AC8) + (#x8FBAA4 #x5ACF) + (#x8FBAA5 #x5ADA) + (#x8FBAA6 #x5ADC) + (#x8FBAA7 #x5AE0) + (#x8FBAA8 #x5AE5) + (#x8FBAA9 #x5AEA) + (#x8FBAAA #x5AEE) + (#x8FBAAB #x5AF5) + (#x8FBAAC #x5AF6) + (#x8FBAAD #x5AFD) + (#x8FBAAE #x5B00) + (#x8FBAAF #x5B01) + (#x8FBAB0 #x5B08) + (#x8FBAB1 #x5B17) + (#x8FBAB2 #x5B34) + (#x8FBAB3 #x5B19) + (#x8FBAB4 #x5B1B) + (#x8FBAB5 #x5B1D) + (#x8FBAB6 #x5B21) + (#x8FBAB7 #x5B25) + (#x8FBAB8 #x5B2D) + (#x8FBAB9 #x5B38) + (#x8FBABA #x5B41) + (#x8FBABB #x5B4B) + (#x8FBABC #x5B4C) + (#x8FBABD #x5B52) + (#x8FBABE #x5B56) + (#x8FBABF #x5B5E) + (#x8FBAC0 #x5B68) + (#x8FBAC1 #x5B6E) + (#x8FBAC2 #x5B6F) + (#x8FBAC3 #x5B7C) + (#x8FBAC4 #x5B7D) + (#x8FBAC5 #x5B7E) + (#x8FBAC6 #x5B7F) + (#x8FBAC7 #x5B81) + (#x8FBAC8 #x5B84) + (#x8FBAC9 #x5B86) + (#x8FBACA #x5B8A) + (#x8FBACB #x5B8E) + (#x8FBACC #x5B90) + (#x8FBACD #x5B91) + (#x8FBACE #x5B93) + (#x8FBACF #x5B94) + (#x8FBAD0 #x5B96) + (#x8FBAD1 #x5BA8) + (#x8FBAD2 #x5BA9) + (#x8FBAD3 #x5BAC) + (#x8FBAD4 #x5BAD) + (#x8FBAD5 #x5BAF) + (#x8FBAD6 #x5BB1) + (#x8FBAD7 #x5BB2) + (#x8FBAD8 #x5BB7) + (#x8FBAD9 #x5BBA) + (#x8FBADA #x5BBC) + (#x8FBADB #x5BC0) + (#x8FBADC #x5BC1) + (#x8FBADD #x5BCD) + (#x8FBADE #x5BCF) + (#x8FBADF #x5BD6) + (#x8FBAE0 #x5BD7) + (#x8FBAE1 #x5BD8) + (#x8FBAE2 #x5BD9) + (#x8FBAE3 #x5BDA) + (#x8FBAE4 #x5BE0) + (#x8FBAE5 #x5BEF) + (#x8FBAE6 #x5BF1) + (#x8FBAE7 #x5BF4) + (#x8FBAE8 #x5BFD) + (#x8FBAE9 #x5C0C) + (#x8FBAEA #x5C17) + (#x8FBAEB #x5C1E) + (#x8FBAEC #x5C1F) + (#x8FBAED #x5C23) + (#x8FBAEE #x5C26) + (#x8FBAEF #x5C29) + (#x8FBAF0 #x5C2B) + (#x8FBAF1 #x5C2C) + (#x8FBAF2 #x5C2E) + (#x8FBAF3 #x5C30) + (#x8FBAF4 #x5C32) + (#x8FBAF5 #x5C35) + (#x8FBAF6 #x5C36) + (#x8FBAF7 #x5C59) + (#x8FBAF8 #x5C5A) + (#x8FBAF9 #x5C5C) + (#x8FBAFA #x5C62) + (#x8FBAFB #x5C63) + (#x8FBAFC #x5C67) + (#x8FBAFD #x5C68) + (#x8FBAFE #x5C69) + (#x8FBBA1 #x5C6D) + (#x8FBBA2 #x5C70) + (#x8FBBA3 #x5C74) + (#x8FBBA4 #x5C75) + (#x8FBBA5 #x5C7A) + (#x8FBBA6 #x5C7B) + (#x8FBBA7 #x5C7C) + (#x8FBBA8 #x5C7D) + (#x8FBBA9 #x5C87) + (#x8FBBAA #x5C88) + (#x8FBBAB #x5C8A) + (#x8FBBAC #x5C8F) + (#x8FBBAD #x5C92) + (#x8FBBAE #x5C9D) + (#x8FBBAF #x5C9F) + (#x8FBBB0 #x5CA0) + (#x8FBBB1 #x5CA2) + (#x8FBBB2 #x5CA3) + (#x8FBBB3 #x5CA6) + (#x8FBBB4 #x5CAA) + (#x8FBBB5 #x5CB2) + (#x8FBBB6 #x5CB4) + (#x8FBBB7 #x5CB5) + (#x8FBBB8 #x5CBA) + (#x8FBBB9 #x5CC9) + (#x8FBBBA #x5CCB) + (#x8FBBBB #x5CD2) + (#x8FBBBC #x5CDD) + (#x8FBBBD #x5CD7) + (#x8FBBBE #x5CEE) + (#x8FBBBF #x5CF1) + (#x8FBBC0 #x5CF2) + (#x8FBBC1 #x5CF4) + (#x8FBBC2 #x5D01) + (#x8FBBC3 #x5D06) + (#x8FBBC4 #x5D0D) + (#x8FBBC5 #x5D12) + (#x8FBBC6 #x5D2B) + (#x8FBBC7 #x5D23) + (#x8FBBC8 #x5D24) + (#x8FBBC9 #x5D26) + (#x8FBBCA #x5D27) + (#x8FBBCB #x5D31) + (#x8FBBCC #x5D34) + (#x8FBBCD #x5D39) + (#x8FBBCE #x5D3D) + (#x8FBBCF #x5D3F) + (#x8FBBD0 #x5D42) + (#x8FBBD1 #x5D43) + (#x8FBBD2 #x5D46) + (#x8FBBD3 #x5D48) + (#x8FBBD4 #x5D55) + (#x8FBBD5 #x5D51) + (#x8FBBD6 #x5D59) + (#x8FBBD7 #x5D4A) + (#x8FBBD8 #x5D5F) + (#x8FBBD9 #x5D60) + (#x8FBBDA #x5D61) + (#x8FBBDB #x5D62) + (#x8FBBDC #x5D64) + (#x8FBBDD #x5D6A) + (#x8FBBDE #x5D6D) + (#x8FBBDF #x5D70) + (#x8FBBE0 #x5D79) + (#x8FBBE1 #x5D7A) + (#x8FBBE2 #x5D7E) + (#x8FBBE3 #x5D7F) + (#x8FBBE4 #x5D81) + (#x8FBBE5 #x5D83) + (#x8FBBE6 #x5D88) + (#x8FBBE7 #x5D8A) + (#x8FBBE8 #x5D92) + (#x8FBBE9 #x5D93) + (#x8FBBEA #x5D94) + (#x8FBBEB #x5D95) + (#x8FBBEC #x5D99) + (#x8FBBED #x5D9B) + (#x8FBBEE #x5D9F) + (#x8FBBEF #x5DA0) + (#x8FBBF0 #x5DA7) + (#x8FBBF1 #x5DAB) + (#x8FBBF2 #x5DB0) + (#x8FBBF3 #x5DB4) + (#x8FBBF4 #x5DB8) + (#x8FBBF5 #x5DB9) + (#x8FBBF6 #x5DC3) + (#x8FBBF7 #x5DC7) + (#x8FBBF8 #x5DCB) + (#x8FBBF9 #x5DD0) + (#x8FBBFA #x5DCE) + (#x8FBBFB #x5DD8) + (#x8FBBFC #x5DD9) + (#x8FBBFD #x5DE0) + (#x8FBBFE #x5DE4) + (#x8FBCA1 #x5DE9) + (#x8FBCA2 #x5DF8) + (#x8FBCA3 #x5DF9) + (#x8FBCA4 #x5E00) + (#x8FBCA5 #x5E07) + (#x8FBCA6 #x5E0D) + (#x8FBCA7 #x5E12) + (#x8FBCA8 #x5E14) + (#x8FBCA9 #x5E15) + (#x8FBCAA #x5E18) + (#x8FBCAB #x5E1F) + (#x8FBCAC #x5E20) + (#x8FBCAD #x5E2E) + (#x8FBCAE #x5E28) + (#x8FBCAF #x5E32) + (#x8FBCB0 #x5E35) + (#x8FBCB1 #x5E3E) + (#x8FBCB2 #x5E4B) + (#x8FBCB3 #x5E50) + (#x8FBCB4 #x5E49) + (#x8FBCB5 #x5E51) + (#x8FBCB6 #x5E56) + (#x8FBCB7 #x5E58) + (#x8FBCB8 #x5E5B) + (#x8FBCB9 #x5E5C) + (#x8FBCBA #x5E5E) + (#x8FBCBB #x5E68) + (#x8FBCBC #x5E6A) + (#x8FBCBD #x5E6B) + (#x8FBCBE #x5E6C) + (#x8FBCBF #x5E6D) + (#x8FBCC0 #x5E6E) + (#x8FBCC1 #x5E70) + (#x8FBCC2 #x5E80) + (#x8FBCC3 #x5E8B) + (#x8FBCC4 #x5E8E) + (#x8FBCC5 #x5EA2) + (#x8FBCC6 #x5EA4) + (#x8FBCC7 #x5EA5) + (#x8FBCC8 #x5EA8) + (#x8FBCC9 #x5EAA) + (#x8FBCCA #x5EAC) + (#x8FBCCB #x5EB1) + (#x8FBCCC #x5EB3) + (#x8FBCCD #x5EBD) + (#x8FBCCE #x5EBE) + (#x8FBCCF #x5EBF) + (#x8FBCD0 #x5EC6) + (#x8FBCD1 #x5ECC) + (#x8FBCD2 #x5ECB) + (#x8FBCD3 #x5ECE) + (#x8FBCD4 #x5ED1) + (#x8FBCD5 #x5ED2) + (#x8FBCD6 #x5ED4) + (#x8FBCD7 #x5ED5) + (#x8FBCD8 #x5EDC) + (#x8FBCD9 #x5EDE) + (#x8FBCDA #x5EE5) + (#x8FBCDB #x5EEB) + (#x8FBCDC #x5F02) + (#x8FBCDD #x5F06) + (#x8FBCDE #x5F07) + (#x8FBCDF #x5F08) + (#x8FBCE0 #x5F0E) + (#x8FBCE1 #x5F19) + (#x8FBCE2 #x5F1C) + (#x8FBCE3 #x5F1D) + (#x8FBCE4 #x5F21) + (#x8FBCE5 #x5F22) + (#x8FBCE6 #x5F23) + (#x8FBCE7 #x5F24) + (#x8FBCE8 #x5F28) + (#x8FBCE9 #x5F2B) + (#x8FBCEA #x5F2C) + (#x8FBCEB #x5F2E) + (#x8FBCEC #x5F30) + (#x8FBCED #x5F34) + (#x8FBCEE #x5F36) + (#x8FBCEF #x5F3B) + (#x8FBCF0 #x5F3D) + (#x8FBCF1 #x5F3F) + (#x8FBCF2 #x5F40) + (#x8FBCF3 #x5F44) + (#x8FBCF4 #x5F45) + (#x8FBCF5 #x5F47) + (#x8FBCF6 #x5F4D) + (#x8FBCF7 #x5F50) + (#x8FBCF8 #x5F54) + (#x8FBCF9 #x5F58) + (#x8FBCFA #x5F5B) + (#x8FBCFB #x5F60) + (#x8FBCFC #x5F63) + (#x8FBCFD #x5F64) + (#x8FBCFE #x5F67) + (#x8FBDA1 #x5F6F) + (#x8FBDA2 #x5F72) + (#x8FBDA3 #x5F74) + (#x8FBDA4 #x5F75) + (#x8FBDA5 #x5F78) + (#x8FBDA6 #x5F7A) + (#x8FBDA7 #x5F7D) + (#x8FBDA8 #x5F7E) + (#x8FBDA9 #x5F89) + (#x8FBDAA #x5F8D) + (#x8FBDAB #x5F8F) + (#x8FBDAC #x5F96) + (#x8FBDAD #x5F9C) + (#x8FBDAE #x5F9D) + (#x8FBDAF #x5FA2) + (#x8FBDB0 #x5FA7) + (#x8FBDB1 #x5FAB) + (#x8FBDB2 #x5FA4) + (#x8FBDB3 #x5FAC) + (#x8FBDB4 #x5FAF) + (#x8FBDB5 #x5FB0) + (#x8FBDB6 #x5FB1) + (#x8FBDB7 #x5FB8) + (#x8FBDB8 #x5FC4) + (#x8FBDB9 #x5FC7) + (#x8FBDBA #x5FC8) + (#x8FBDBB #x5FC9) + (#x8FBDBC #x5FCB) + (#x8FBDBD #x5FD0) + (#x8FBDBE #x5FD1) + (#x8FBDBF #x5FD2) + (#x8FBDC0 #x5FD3) + (#x8FBDC1 #x5FD4) + (#x8FBDC2 #x5FDE) + (#x8FBDC3 #x5FE1) + (#x8FBDC4 #x5FE2) + (#x8FBDC5 #x5FE8) + (#x8FBDC6 #x5FE9) + (#x8FBDC7 #x5FEA) + (#x8FBDC8 #x5FEC) + (#x8FBDC9 #x5FED) + (#x8FBDCA #x5FEE) + (#x8FBDCB #x5FEF) + (#x8FBDCC #x5FF2) + (#x8FBDCD #x5FF3) + (#x8FBDCE #x5FF6) + (#x8FBDCF #x5FFA) + (#x8FBDD0 #x5FFC) + (#x8FBDD1 #x6007) + (#x8FBDD2 #x600A) + (#x8FBDD3 #x600D) + (#x8FBDD4 #x6013) + (#x8FBDD5 #x6014) + (#x8FBDD6 #x6017) + (#x8FBDD7 #x6018) + (#x8FBDD8 #x601A) + (#x8FBDD9 #x601F) + (#x8FBDDA #x6024) + (#x8FBDDB #x602D) + (#x8FBDDC #x6033) + (#x8FBDDD #x6035) + (#x8FBDDE #x6040) + (#x8FBDDF #x6047) + (#x8FBDE0 #x6048) + (#x8FBDE1 #x6049) + (#x8FBDE2 #x604C) + (#x8FBDE3 #x6051) + (#x8FBDE4 #x6054) + (#x8FBDE5 #x6056) + (#x8FBDE6 #x6057) + (#x8FBDE7 #x605D) + (#x8FBDE8 #x6061) + (#x8FBDE9 #x6067) + (#x8FBDEA #x6071) + (#x8FBDEB #x607E) + (#x8FBDEC #x607F) + (#x8FBDED #x6082) + (#x8FBDEE #x6086) + (#x8FBDEF #x6088) + (#x8FBDF0 #x608A) + (#x8FBDF1 #x608E) + (#x8FBDF2 #x6091) + (#x8FBDF3 #x6093) + (#x8FBDF4 #x6095) + (#x8FBDF5 #x6098) + (#x8FBDF6 #x609D) + (#x8FBDF7 #x609E) + (#x8FBDF8 #x60A2) + (#x8FBDF9 #x60A4) + (#x8FBDFA #x60A5) + (#x8FBDFB #x60A8) + (#x8FBDFC #x60B0) + (#x8FBDFD #x60B1) + (#x8FBDFE #x60B7) + (#x8FBEA1 #x60BB) + (#x8FBEA2 #x60BE) + (#x8FBEA3 #x60C2) + (#x8FBEA4 #x60C4) + (#x8FBEA5 #x60C8) + (#x8FBEA6 #x60C9) + (#x8FBEA7 #x60CA) + (#x8FBEA8 #x60CB) + (#x8FBEA9 #x60CE) + (#x8FBEAA #x60CF) + (#x8FBEAB #x60D4) + (#x8FBEAC #x60D5) + (#x8FBEAD #x60D9) + (#x8FBEAE #x60DB) + (#x8FBEAF #x60DD) + (#x8FBEB0 #x60DE) + (#x8FBEB1 #x60E2) + (#x8FBEB2 #x60E5) + (#x8FBEB3 #x60F2) + (#x8FBEB4 #x60F5) + (#x8FBEB5 #x60F8) + (#x8FBEB6 #x60FC) + (#x8FBEB7 #x60FD) + (#x8FBEB8 #x6102) + (#x8FBEB9 #x6107) + (#x8FBEBA #x610A) + (#x8FBEBB #x610C) + (#x8FBEBC #x6110) + (#x8FBEBD #x6111) + (#x8FBEBE #x6112) + (#x8FBEBF #x6113) + (#x8FBEC0 #x6114) + (#x8FBEC1 #x6116) + (#x8FBEC2 #x6117) + (#x8FBEC3 #x6119) + (#x8FBEC4 #x611C) + (#x8FBEC5 #x611E) + (#x8FBEC6 #x6122) + (#x8FBEC7 #x612A) + (#x8FBEC8 #x612B) + (#x8FBEC9 #x6130) + (#x8FBECA #x6131) + (#x8FBECB #x6135) + (#x8FBECC #x6136) + (#x8FBECD #x6137) + (#x8FBECE #x6139) + (#x8FBECF #x6141) + (#x8FBED0 #x6145) + (#x8FBED1 #x6146) + (#x8FBED2 #x6149) + (#x8FBED3 #x615E) + (#x8FBED4 #x6160) + (#x8FBED5 #x616C) + (#x8FBED6 #x6172) + (#x8FBED7 #x6178) + (#x8FBED8 #x617B) + (#x8FBED9 #x617C) + (#x8FBEDA #x617F) + (#x8FBEDB #x6180) + (#x8FBEDC #x6181) + (#x8FBEDD #x6183) + (#x8FBEDE #x6184) + (#x8FBEDF #x618B) + (#x8FBEE0 #x618D) + (#x8FBEE1 #x6192) + (#x8FBEE2 #x6193) + (#x8FBEE3 #x6197) + (#x8FBEE4 #x6198) + (#x8FBEE5 #x619C) + (#x8FBEE6 #x619D) + (#x8FBEE7 #x619F) + (#x8FBEE8 #x61A0) + (#x8FBEE9 #x61A5) + (#x8FBEEA #x61A8) + (#x8FBEEB #x61AA) + (#x8FBEEC #x61AD) + (#x8FBEED #x61B8) + (#x8FBEEE #x61B9) + (#x8FBEEF #x61BC) + (#x8FBEF0 #x61C0) + (#x8FBEF1 #x61C1) + (#x8FBEF2 #x61C2) + (#x8FBEF3 #x61CE) + (#x8FBEF4 #x61CF) + (#x8FBEF5 #x61D5) + (#x8FBEF6 #x61DC) + (#x8FBEF7 #x61DD) + (#x8FBEF8 #x61DE) + (#x8FBEF9 #x61DF) + (#x8FBEFA #x61E1) + (#x8FBEFB #x61E2) + (#x8FBEFC #x61E7) + (#x8FBEFD #x61E9) + (#x8FBEFE #x61E5) + (#x8FBFA1 #x61EC) + (#x8FBFA2 #x61ED) + (#x8FBFA3 #x61EF) + (#x8FBFA4 #x6201) + (#x8FBFA5 #x6203) + (#x8FBFA6 #x6204) + (#x8FBFA7 #x6207) + (#x8FBFA8 #x6213) + (#x8FBFA9 #x6215) + (#x8FBFAA #x621C) + (#x8FBFAB #x6220) + (#x8FBFAC #x6222) + (#x8FBFAD #x6223) + (#x8FBFAE #x6227) + (#x8FBFAF #x6229) + (#x8FBFB0 #x622B) + (#x8FBFB1 #x6239) + (#x8FBFB2 #x623D) + (#x8FBFB3 #x6242) + (#x8FBFB4 #x6243) + (#x8FBFB5 #x6244) + (#x8FBFB6 #x6246) + (#x8FBFB7 #x624C) + (#x8FBFB8 #x6250) + (#x8FBFB9 #x6251) + (#x8FBFBA #x6252) + (#x8FBFBB #x6254) + (#x8FBFBC #x6256) + (#x8FBFBD #x625A) + (#x8FBFBE #x625C) + (#x8FBFBF #x6264) + (#x8FBFC0 #x626D) + (#x8FBFC1 #x626F) + (#x8FBFC2 #x6273) + (#x8FBFC3 #x627A) + (#x8FBFC4 #x627D) + (#x8FBFC5 #x628D) + (#x8FBFC6 #x628E) + (#x8FBFC7 #x628F) + (#x8FBFC8 #x6290) + (#x8FBFC9 #x62A6) + (#x8FBFCA #x62A8) + (#x8FBFCB #x62B3) + (#x8FBFCC #x62B6) + (#x8FBFCD #x62B7) + (#x8FBFCE #x62BA) + (#x8FBFCF #x62BE) + (#x8FBFD0 #x62BF) + (#x8FBFD1 #x62C4) + (#x8FBFD2 #x62CE) + (#x8FBFD3 #x62D5) + (#x8FBFD4 #x62D6) + (#x8FBFD5 #x62DA) + (#x8FBFD6 #x62EA) + (#x8FBFD7 #x62F2) + (#x8FBFD8 #x62F4) + (#x8FBFD9 #x62FC) + (#x8FBFDA #x62FD) + (#x8FBFDB #x6303) + (#x8FBFDC #x6304) + (#x8FBFDD #x630A) + (#x8FBFDE #x630B) + (#x8FBFDF #x630D) + (#x8FBFE0 #x6310) + (#x8FBFE1 #x6313) + (#x8FBFE2 #x6316) + (#x8FBFE3 #x6318) + (#x8FBFE4 #x6329) + (#x8FBFE5 #x632A) + (#x8FBFE6 #x632D) + (#x8FBFE7 #x6335) + (#x8FBFE8 #x6336) + (#x8FBFE9 #x6339) + (#x8FBFEA #x633C) + (#x8FBFEB #x6341) + (#x8FBFEC #x6342) + (#x8FBFED #x6343) + (#x8FBFEE #x6344) + (#x8FBFEF #x6346) + (#x8FBFF0 #x634A) + (#x8FBFF1 #x634B) + (#x8FBFF2 #x634E) + (#x8FBFF3 #x6352) + (#x8FBFF4 #x6353) + (#x8FBFF5 #x6354) + (#x8FBFF6 #x6358) + (#x8FBFF7 #x635B) + (#x8FBFF8 #x6365) + (#x8FBFF9 #x6366) + (#x8FBFFA #x636C) + (#x8FBFFB #x636D) + (#x8FBFFC #x6371) + (#x8FBFFD #x6374) + (#x8FBFFE #x6375) + (#x8FC0A1 #x6378) + (#x8FC0A2 #x637C) + (#x8FC0A3 #x637D) + (#x8FC0A4 #x637F) + (#x8FC0A5 #x6382) + (#x8FC0A6 #x6384) + (#x8FC0A7 #x6387) + (#x8FC0A8 #x638A) + (#x8FC0A9 #x6390) + (#x8FC0AA #x6394) + (#x8FC0AB #x6395) + (#x8FC0AC #x6399) + (#x8FC0AD #x639A) + (#x8FC0AE #x639E) + (#x8FC0AF #x63A4) + (#x8FC0B0 #x63A6) + (#x8FC0B1 #x63AD) + (#x8FC0B2 #x63AE) + (#x8FC0B3 #x63AF) + (#x8FC0B4 #x63BD) + (#x8FC0B5 #x63C1) + (#x8FC0B6 #x63C5) + (#x8FC0B7 #x63C8) + (#x8FC0B8 #x63CE) + (#x8FC0B9 #x63D1) + (#x8FC0BA #x63D3) + (#x8FC0BB #x63D4) + (#x8FC0BC #x63D5) + (#x8FC0BD #x63DC) + (#x8FC0BE #x63E0) + (#x8FC0BF #x63E5) + (#x8FC0C0 #x63EA) + (#x8FC0C1 #x63EC) + (#x8FC0C2 #x63F2) + (#x8FC0C3 #x63F3) + (#x8FC0C4 #x63F5) + (#x8FC0C5 #x63F8) + (#x8FC0C6 #x63F9) + (#x8FC0C7 #x6409) + (#x8FC0C8 #x640A) + (#x8FC0C9 #x6410) + (#x8FC0CA #x6412) + (#x8FC0CB #x6414) + (#x8FC0CC #x6418) + (#x8FC0CD #x641E) + (#x8FC0CE #x6420) + (#x8FC0CF #x6422) + (#x8FC0D0 #x6424) + (#x8FC0D1 #x6425) + (#x8FC0D2 #x6429) + (#x8FC0D3 #x642A) + (#x8FC0D4 #x642F) + (#x8FC0D5 #x6430) + (#x8FC0D6 #x6435) + (#x8FC0D7 #x643D) + (#x8FC0D8 #x643F) + (#x8FC0D9 #x644B) + (#x8FC0DA #x644F) + (#x8FC0DB #x6451) + (#x8FC0DC #x6452) + (#x8FC0DD #x6453) + (#x8FC0DE #x6454) + (#x8FC0DF #x645A) + (#x8FC0E0 #x645B) + (#x8FC0E1 #x645C) + (#x8FC0E2 #x645D) + (#x8FC0E3 #x645F) + (#x8FC0E4 #x6460) + (#x8FC0E5 #x6461) + (#x8FC0E6 #x6463) + (#x8FC0E7 #x646D) + (#x8FC0E8 #x6473) + (#x8FC0E9 #x6474) + (#x8FC0EA #x647B) + (#x8FC0EB #x647D) + (#x8FC0EC #x6485) + (#x8FC0ED #x6487) + (#x8FC0EE #x648F) + (#x8FC0EF #x6490) + (#x8FC0F0 #x6491) + (#x8FC0F1 #x6498) + (#x8FC0F2 #x6499) + (#x8FC0F3 #x649B) + (#x8FC0F4 #x649D) + (#x8FC0F5 #x649F) + (#x8FC0F6 #x64A1) + (#x8FC0F7 #x64A3) + (#x8FC0F8 #x64A6) + (#x8FC0F9 #x64A8) + (#x8FC0FA #x64AC) + (#x8FC0FB #x64B3) + (#x8FC0FC #x64BD) + (#x8FC0FD #x64BE) + (#x8FC0FE #x64BF) + (#x8FC1A1 #x64C4) + (#x8FC1A2 #x64C9) + (#x8FC1A3 #x64CA) + (#x8FC1A4 #x64CB) + (#x8FC1A5 #x64CC) + (#x8FC1A6 #x64CE) + (#x8FC1A7 #x64D0) + (#x8FC1A8 #x64D1) + (#x8FC1A9 #x64D5) + (#x8FC1AA #x64D7) + (#x8FC1AB #x64E4) + (#x8FC1AC #x64E5) + (#x8FC1AD #x64E9) + (#x8FC1AE #x64EA) + (#x8FC1AF #x64ED) + (#x8FC1B0 #x64F0) + (#x8FC1B1 #x64F5) + (#x8FC1B2 #x64F7) + (#x8FC1B3 #x64FB) + (#x8FC1B4 #x64FF) + (#x8FC1B5 #x6501) + (#x8FC1B6 #x6504) + (#x8FC1B7 #x6508) + (#x8FC1B8 #x6509) + (#x8FC1B9 #x650A) + (#x8FC1BA #x650F) + (#x8FC1BB #x6513) + (#x8FC1BC #x6514) + (#x8FC1BD #x6516) + (#x8FC1BE #x6519) + (#x8FC1BF #x651B) + (#x8FC1C0 #x651E) + (#x8FC1C1 #x651F) + (#x8FC1C2 #x6522) + (#x8FC1C3 #x6526) + (#x8FC1C4 #x6529) + (#x8FC1C5 #x652E) + (#x8FC1C6 #x6531) + (#x8FC1C7 #x653A) + (#x8FC1C8 #x653C) + (#x8FC1C9 #x653D) + (#x8FC1CA #x6543) + (#x8FC1CB #x6547) + (#x8FC1CC #x6549) + (#x8FC1CD #x6550) + (#x8FC1CE #x6552) + (#x8FC1CF #x6554) + (#x8FC1D0 #x655F) + (#x8FC1D1 #x6560) + (#x8FC1D2 #x6567) + (#x8FC1D3 #x656B) + (#x8FC1D4 #x657A) + (#x8FC1D5 #x657D) + (#x8FC1D6 #x6581) + (#x8FC1D7 #x6585) + (#x8FC1D8 #x658A) + (#x8FC1D9 #x6592) + (#x8FC1DA #x6595) + (#x8FC1DB #x6598) + (#x8FC1DC #x659D) + (#x8FC1DD #x65A0) + (#x8FC1DE #x65A3) + (#x8FC1DF #x65A6) + (#x8FC1E0 #x65AE) + (#x8FC1E1 #x65B2) + (#x8FC1E2 #x65B3) + (#x8FC1E3 #x65B4) + (#x8FC1E4 #x65BF) + (#x8FC1E5 #x65C2) + (#x8FC1E6 #x65C8) + (#x8FC1E7 #x65C9) + (#x8FC1E8 #x65CE) + (#x8FC1E9 #x65D0) + (#x8FC1EA #x65D4) + (#x8FC1EB #x65D6) + (#x8FC1EC #x65D8) + (#x8FC1ED #x65DF) + (#x8FC1EE #x65F0) + (#x8FC1EF #x65F2) + (#x8FC1F0 #x65F4) + (#x8FC1F1 #x65F5) + (#x8FC1F2 #x65F9) + (#x8FC1F3 #x65FE) + (#x8FC1F4 #x65FF) + (#x8FC1F5 #x6600) + (#x8FC1F6 #x6604) + (#x8FC1F7 #x6608) + (#x8FC1F8 #x6609) + (#x8FC1F9 #x660D) + (#x8FC1FA #x6611) + (#x8FC1FB #x6612) + (#x8FC1FC #x6615) + (#x8FC1FD #x6616) + (#x8FC1FE #x661D) + (#x8FC2A1 #x661E) + (#x8FC2A2 #x6621) + (#x8FC2A3 #x6622) + (#x8FC2A4 #x6623) + (#x8FC2A5 #x6624) + (#x8FC2A6 #x6626) + (#x8FC2A7 #x6629) + (#x8FC2A8 #x662A) + (#x8FC2A9 #x662B) + (#x8FC2AA #x662C) + (#x8FC2AB #x662E) + (#x8FC2AC #x6630) + (#x8FC2AD #x6631) + (#x8FC2AE #x6633) + (#x8FC2AF #x6639) + (#x8FC2B0 #x6637) + (#x8FC2B1 #x6640) + (#x8FC2B2 #x6645) + (#x8FC2B3 #x6646) + (#x8FC2B4 #x664A) + (#x8FC2B5 #x664C) + (#x8FC2B6 #x6651) + (#x8FC2B7 #x664E) + (#x8FC2B8 #x6657) + (#x8FC2B9 #x6658) + (#x8FC2BA #x6659) + (#x8FC2BB #x665B) + (#x8FC2BC #x665C) + (#x8FC2BD #x6660) + (#x8FC2BE #x6661) + (#x8FC2BF #x66FB) + (#x8FC2C0 #x666A) + (#x8FC2C1 #x666B) + (#x8FC2C2 #x666C) + (#x8FC2C3 #x667E) + (#x8FC2C4 #x6673) + (#x8FC2C5 #x6675) + (#x8FC2C6 #x667F) + (#x8FC2C7 #x6677) + (#x8FC2C8 #x6678) + (#x8FC2C9 #x6679) + (#x8FC2CA #x667B) + (#x8FC2CB #x6680) + (#x8FC2CC #x667C) + (#x8FC2CD #x668B) + (#x8FC2CE #x668C) + (#x8FC2CF #x668D) + (#x8FC2D0 #x6690) + (#x8FC2D1 #x6692) + (#x8FC2D2 #x6699) + (#x8FC2D3 #x669A) + (#x8FC2D4 #x669B) + (#x8FC2D5 #x669C) + (#x8FC2D6 #x669F) + (#x8FC2D7 #x66A0) + (#x8FC2D8 #x66A4) + (#x8FC2D9 #x66AD) + (#x8FC2DA #x66B1) + (#x8FC2DB #x66B2) + (#x8FC2DC #x66B5) + (#x8FC2DD #x66BB) + (#x8FC2DE #x66BF) + (#x8FC2DF #x66C0) + (#x8FC2E0 #x66C2) + (#x8FC2E1 #x66C3) + (#x8FC2E2 #x66C8) + (#x8FC2E3 #x66CC) + (#x8FC2E4 #x66CE) + (#x8FC2E5 #x66CF) + (#x8FC2E6 #x66D4) + (#x8FC2E7 #x66DB) + (#x8FC2E8 #x66DF) + (#x8FC2E9 #x66E8) + (#x8FC2EA #x66EB) + (#x8FC2EB #x66EC) + (#x8FC2EC #x66EE) + (#x8FC2ED #x66FA) + (#x8FC2EE #x6705) + (#x8FC2EF #x6707) + (#x8FC2F0 #x670E) + (#x8FC2F1 #x6713) + (#x8FC2F2 #x6719) + (#x8FC2F3 #x671C) + (#x8FC2F4 #x6720) + (#x8FC2F5 #x6722) + (#x8FC2F6 #x6733) + (#x8FC2F7 #x673E) + (#x8FC2F8 #x6745) + (#x8FC2F9 #x6747) + (#x8FC2FA #x6748) + (#x8FC2FB #x674C) + (#x8FC2FC #x6754) + (#x8FC2FD #x6755) + (#x8FC2FE #x675D) + (#x8FC3A1 #x6766) + (#x8FC3A2 #x676C) + (#x8FC3A3 #x676E) + (#x8FC3A4 #x6774) + (#x8FC3A5 #x6776) + (#x8FC3A6 #x677B) + (#x8FC3A7 #x6781) + (#x8FC3A8 #x6784) + (#x8FC3A9 #x678E) + (#x8FC3AA #x678F) + (#x8FC3AB #x6791) + (#x8FC3AC #x6793) + (#x8FC3AD #x6796) + (#x8FC3AE #x6798) + (#x8FC3AF #x6799) + (#x8FC3B0 #x679B) + (#x8FC3B1 #x67B0) + (#x8FC3B2 #x67B1) + (#x8FC3B3 #x67B2) + (#x8FC3B4 #x67B5) + (#x8FC3B5 #x67BB) + (#x8FC3B6 #x67BC) + (#x8FC3B7 #x67BD) + (#x8FC3B8 #x67F9) + (#x8FC3B9 #x67C0) + (#x8FC3BA #x67C2) + (#x8FC3BB #x67C3) + (#x8FC3BC #x67C5) + (#x8FC3BD #x67C8) + (#x8FC3BE #x67C9) + (#x8FC3BF #x67D2) + (#x8FC3C0 #x67D7) + (#x8FC3C1 #x67D9) + (#x8FC3C2 #x67DC) + (#x8FC3C3 #x67E1) + (#x8FC3C4 #x67E6) + (#x8FC3C5 #x67F0) + (#x8FC3C6 #x67F2) + (#x8FC3C7 #x67F6) + (#x8FC3C8 #x67F7) + (#x8FC3C9 #x6852) + (#x8FC3CA #x6814) + (#x8FC3CB #x6819) + (#x8FC3CC #x681D) + (#x8FC3CD #x681F) + (#x8FC3CE #x6828) + (#x8FC3CF #x6827) + (#x8FC3D0 #x682C) + (#x8FC3D1 #x682D) + (#x8FC3D2 #x682F) + (#x8FC3D3 #x6830) + (#x8FC3D4 #x6831) + (#x8FC3D5 #x6833) + (#x8FC3D6 #x683B) + (#x8FC3D7 #x683F) + (#x8FC3D8 #x6844) + (#x8FC3D9 #x6845) + (#x8FC3DA #x684A) + (#x8FC3DB #x684C) + (#x8FC3DC #x6855) + (#x8FC3DD #x6857) + (#x8FC3DE #x6858) + (#x8FC3DF #x685B) + (#x8FC3E0 #x686B) + (#x8FC3E1 #x686E) + (#x8FC3E2 #x686F) + (#x8FC3E3 #x6870) + (#x8FC3E4 #x6871) + (#x8FC3E5 #x6872) + (#x8FC3E6 #x6875) + (#x8FC3E7 #x6879) + (#x8FC3E8 #x687A) + (#x8FC3E9 #x687B) + (#x8FC3EA #x687C) + (#x8FC3EB #x6882) + (#x8FC3EC #x6884) + (#x8FC3ED #x6886) + (#x8FC3EE #x6888) + (#x8FC3EF #x6896) + (#x8FC3F0 #x6898) + (#x8FC3F1 #x689A) + (#x8FC3F2 #x689C) + (#x8FC3F3 #x68A1) + (#x8FC3F4 #x68A3) + (#x8FC3F5 #x68A5) + (#x8FC3F6 #x68A9) + (#x8FC3F7 #x68AA) + (#x8FC3F8 #x68AE) + (#x8FC3F9 #x68B2) + (#x8FC3FA #x68BB) + (#x8FC3FB #x68C5) + (#x8FC3FC #x68C8) + (#x8FC3FD #x68CC) + (#x8FC3FE #x68CF) + (#x8FC4A1 #x68D0) + (#x8FC4A2 #x68D1) + (#x8FC4A3 #x68D3) + (#x8FC4A4 #x68D6) + (#x8FC4A5 #x68D9) + (#x8FC4A6 #x68DC) + (#x8FC4A7 #x68DD) + (#x8FC4A8 #x68E5) + (#x8FC4A9 #x68E8) + (#x8FC4AA #x68EA) + (#x8FC4AB #x68EB) + (#x8FC4AC #x68EC) + (#x8FC4AD #x68ED) + (#x8FC4AE #x68F0) + (#x8FC4AF #x68F1) + (#x8FC4B0 #x68F5) + (#x8FC4B1 #x68F6) + (#x8FC4B2 #x68FB) + (#x8FC4B3 #x68FC) + (#x8FC4B4 #x68FD) + (#x8FC4B5 #x6906) + (#x8FC4B6 #x6909) + (#x8FC4B7 #x690A) + (#x8FC4B8 #x6910) + (#x8FC4B9 #x6911) + (#x8FC4BA #x6913) + (#x8FC4BB #x6916) + (#x8FC4BC #x6917) + (#x8FC4BD #x6931) + (#x8FC4BE #x6933) + (#x8FC4BF #x6935) + (#x8FC4C0 #x6938) + (#x8FC4C1 #x693B) + (#x8FC4C2 #x6942) + (#x8FC4C3 #x6945) + (#x8FC4C4 #x6949) + (#x8FC4C5 #x694E) + (#x8FC4C6 #x6957) + (#x8FC4C7 #x695B) + (#x8FC4C8 #x6963) + (#x8FC4C9 #x6964) + (#x8FC4CA #x6965) + (#x8FC4CB #x6966) + (#x8FC4CC #x6968) + (#x8FC4CD #x6969) + (#x8FC4CE #x696C) + (#x8FC4CF #x6970) + (#x8FC4D0 #x6971) + (#x8FC4D1 #x6972) + (#x8FC4D2 #x697A) + (#x8FC4D3 #x697B) + (#x8FC4D4 #x697F) + (#x8FC4D5 #x6980) + (#x8FC4D6 #x698D) + (#x8FC4D7 #x6992) + (#x8FC4D8 #x6996) + (#x8FC4D9 #x6998) + (#x8FC4DA #x69A1) + (#x8FC4DB #x69A5) + (#x8FC4DC #x69A6) + (#x8FC4DD #x69A8) + (#x8FC4DE #x69AB) + (#x8FC4DF #x69AD) + (#x8FC4E0 #x69AF) + (#x8FC4E1 #x69B7) + (#x8FC4E2 #x69B8) + (#x8FC4E3 #x69BA) + (#x8FC4E4 #x69BC) + (#x8FC4E5 #x69C5) + (#x8FC4E6 #x69C8) + (#x8FC4E7 #x69D1) + (#x8FC4E8 #x69D6) + (#x8FC4E9 #x69D7) + (#x8FC4EA #x69E2) + (#x8FC4EB #x69E5) + (#x8FC4EC #x69EE) + (#x8FC4ED #x69EF) + (#x8FC4EE #x69F1) + (#x8FC4EF #x69F3) + (#x8FC4F0 #x69F5) + (#x8FC4F1 #x69FE) + (#x8FC4F2 #x6A00) + (#x8FC4F3 #x6A01) + (#x8FC4F4 #x6A03) + (#x8FC4F5 #x6A0F) + (#x8FC4F6 #x6A11) + (#x8FC4F7 #x6A15) + (#x8FC4F8 #x6A1A) + (#x8FC4F9 #x6A1D) + (#x8FC4FA #x6A20) + (#x8FC4FB #x6A24) + (#x8FC4FC #x6A28) + (#x8FC4FD #x6A30) + (#x8FC4FE #x6A32) + (#x8FC5A1 #x6A34) + (#x8FC5A2 #x6A37) + (#x8FC5A3 #x6A3B) + (#x8FC5A4 #x6A3E) + (#x8FC5A5 #x6A3F) + (#x8FC5A6 #x6A45) + (#x8FC5A7 #x6A46) + (#x8FC5A8 #x6A49) + (#x8FC5A9 #x6A4A) + (#x8FC5AA #x6A4E) + (#x8FC5AB #x6A50) + (#x8FC5AC #x6A51) + (#x8FC5AD #x6A52) + (#x8FC5AE #x6A55) + (#x8FC5AF #x6A56) + (#x8FC5B0 #x6A5B) + (#x8FC5B1 #x6A64) + (#x8FC5B2 #x6A67) + (#x8FC5B3 #x6A6A) + (#x8FC5B4 #x6A71) + (#x8FC5B5 #x6A73) + (#x8FC5B6 #x6A7E) + (#x8FC5B7 #x6A81) + (#x8FC5B8 #x6A83) + (#x8FC5B9 #x6A86) + (#x8FC5BA #x6A87) + (#x8FC5BB #x6A89) + (#x8FC5BC #x6A8B) + (#x8FC5BD #x6A91) + (#x8FC5BE #x6A9B) + (#x8FC5BF #x6A9D) + (#x8FC5C0 #x6A9E) + (#x8FC5C1 #x6A9F) + (#x8FC5C2 #x6AA5) + (#x8FC5C3 #x6AAB) + (#x8FC5C4 #x6AAF) + (#x8FC5C5 #x6AB0) + (#x8FC5C6 #x6AB1) + (#x8FC5C7 #x6AB4) + (#x8FC5C8 #x6ABD) + (#x8FC5C9 #x6ABE) + (#x8FC5CA #x6ABF) + (#x8FC5CB #x6AC6) + (#x8FC5CC #x6AC9) + (#x8FC5CD #x6AC8) + (#x8FC5CE #x6ACC) + (#x8FC5CF #x6AD0) + (#x8FC5D0 #x6AD4) + (#x8FC5D1 #x6AD5) + (#x8FC5D2 #x6AD6) + (#x8FC5D3 #x6ADC) + (#x8FC5D4 #x6ADD) + (#x8FC5D5 #x6AE4) + (#x8FC5D6 #x6AE7) + (#x8FC5D7 #x6AEC) + (#x8FC5D8 #x6AF0) + (#x8FC5D9 #x6AF1) + (#x8FC5DA #x6AF2) + (#x8FC5DB #x6AFC) + (#x8FC5DC #x6AFD) + (#x8FC5DD #x6B02) + (#x8FC5DE #x6B03) + (#x8FC5DF #x6B06) + (#x8FC5E0 #x6B07) + (#x8FC5E1 #x6B09) + (#x8FC5E2 #x6B0F) + (#x8FC5E3 #x6B10) + (#x8FC5E4 #x6B11) + (#x8FC5E5 #x6B17) + (#x8FC5E6 #x6B1B) + (#x8FC5E7 #x6B1E) + (#x8FC5E8 #x6B24) + (#x8FC5E9 #x6B28) + (#x8FC5EA #x6B2B) + (#x8FC5EB #x6B2C) + (#x8FC5EC #x6B2F) + (#x8FC5ED #x6B35) + (#x8FC5EE #x6B36) + (#x8FC5EF #x6B3B) + (#x8FC5F0 #x6B3F) + (#x8FC5F1 #x6B46) + (#x8FC5F2 #x6B4A) + (#x8FC5F3 #x6B4D) + (#x8FC5F4 #x6B52) + (#x8FC5F5 #x6B56) + (#x8FC5F6 #x6B58) + (#x8FC5F7 #x6B5D) + (#x8FC5F8 #x6B60) + (#x8FC5F9 #x6B67) + (#x8FC5FA #x6B6B) + (#x8FC5FB #x6B6E) + (#x8FC5FC #x6B70) + (#x8FC5FD #x6B75) + (#x8FC5FE #x6B7D) + (#x8FC6A1 #x6B7E) + (#x8FC6A2 #x6B82) + (#x8FC6A3 #x6B85) + (#x8FC6A4 #x6B97) + (#x8FC6A5 #x6B9B) + (#x8FC6A6 #x6B9F) + (#x8FC6A7 #x6BA0) + (#x8FC6A8 #x6BA2) + (#x8FC6A9 #x6BA3) + (#x8FC6AA #x6BA8) + (#x8FC6AB #x6BA9) + (#x8FC6AC #x6BAC) + (#x8FC6AD #x6BAD) + (#x8FC6AE #x6BAE) + (#x8FC6AF #x6BB0) + (#x8FC6B0 #x6BB8) + (#x8FC6B1 #x6BB9) + (#x8FC6B2 #x6BBD) + (#x8FC6B3 #x6BBE) + (#x8FC6B4 #x6BC3) + (#x8FC6B5 #x6BC4) + (#x8FC6B6 #x6BC9) + (#x8FC6B7 #x6BCC) + (#x8FC6B8 #x6BD6) + (#x8FC6B9 #x6BDA) + (#x8FC6BA #x6BE1) + (#x8FC6BB #x6BE3) + (#x8FC6BC #x6BE6) + (#x8FC6BD #x6BE7) + (#x8FC6BE #x6BEE) + (#x8FC6BF #x6BF1) + (#x8FC6C0 #x6BF7) + (#x8FC6C1 #x6BF9) + (#x8FC6C2 #x6BFF) + (#x8FC6C3 #x6C02) + (#x8FC6C4 #x6C04) + (#x8FC6C5 #x6C05) + (#x8FC6C6 #x6C09) + (#x8FC6C7 #x6C0D) + (#x8FC6C8 #x6C0E) + (#x8FC6C9 #x6C10) + (#x8FC6CA #x6C12) + (#x8FC6CB #x6C19) + (#x8FC6CC #x6C1F) + (#x8FC6CD #x6C26) + (#x8FC6CE #x6C27) + (#x8FC6CF #x6C28) + (#x8FC6D0 #x6C2C) + (#x8FC6D1 #x6C2E) + (#x8FC6D2 #x6C33) + (#x8FC6D3 #x6C35) + (#x8FC6D4 #x6C36) + (#x8FC6D5 #x6C3A) + (#x8FC6D6 #x6C3B) + (#x8FC6D7 #x6C3F) + (#x8FC6D8 #x6C4A) + (#x8FC6D9 #x6C4B) + (#x8FC6DA #x6C4D) + (#x8FC6DB #x6C4F) + (#x8FC6DC #x6C52) + (#x8FC6DD #x6C54) + (#x8FC6DE #x6C59) + (#x8FC6DF #x6C5B) + (#x8FC6E0 #x6C5C) + (#x8FC6E1 #x6C6B) + (#x8FC6E2 #x6C6D) + (#x8FC6E3 #x6C6F) + (#x8FC6E4 #x6C74) + (#x8FC6E5 #x6C76) + (#x8FC6E6 #x6C78) + (#x8FC6E7 #x6C79) + (#x8FC6E8 #x6C7B) + (#x8FC6E9 #x6C85) + (#x8FC6EA #x6C86) + (#x8FC6EB #x6C87) + (#x8FC6EC #x6C89) + (#x8FC6ED #x6C94) + (#x8FC6EE #x6C95) + (#x8FC6EF #x6C97) + (#x8FC6F0 #x6C98) + (#x8FC6F1 #x6C9C) + (#x8FC6F2 #x6C9F) + (#x8FC6F3 #x6CB0) + (#x8FC6F4 #x6CB2) + (#x8FC6F5 #x6CB4) + (#x8FC6F6 #x6CC2) + (#x8FC6F7 #x6CC6) + (#x8FC6F8 #x6CCD) + (#x8FC6F9 #x6CCF) + (#x8FC6FA #x6CD0) + (#x8FC6FB #x6CD1) + (#x8FC6FC #x6CD2) + (#x8FC6FD #x6CD4) + (#x8FC6FE #x6CD6) + (#x8FC7A1 #x6CDA) + (#x8FC7A2 #x6CDC) + (#x8FC7A3 #x6CE0) + (#x8FC7A4 #x6CE7) + (#x8FC7A5 #x6CE9) + (#x8FC7A6 #x6CEB) + (#x8FC7A7 #x6CEC) + (#x8FC7A8 #x6CEE) + (#x8FC7A9 #x6CF2) + (#x8FC7AA #x6CF4) + (#x8FC7AB #x6D04) + (#x8FC7AC #x6D07) + (#x8FC7AD #x6D0A) + (#x8FC7AE #x6D0E) + (#x8FC7AF #x6D0F) + (#x8FC7B0 #x6D11) + (#x8FC7B1 #x6D13) + (#x8FC7B2 #x6D1A) + (#x8FC7B3 #x6D26) + (#x8FC7B4 #x6D27) + (#x8FC7B5 #x6D28) + (#x8FC7B6 #x6C67) + (#x8FC7B7 #x6D2E) + (#x8FC7B8 #x6D2F) + (#x8FC7B9 #x6D31) + (#x8FC7BA #x6D39) + (#x8FC7BB #x6D3C) + (#x8FC7BC #x6D3F) + (#x8FC7BD #x6D57) + (#x8FC7BE #x6D5E) + (#x8FC7BF #x6D5F) + (#x8FC7C0 #x6D61) + (#x8FC7C1 #x6D65) + (#x8FC7C2 #x6D67) + (#x8FC7C3 #x6D6F) + (#x8FC7C4 #x6D70) + (#x8FC7C5 #x6D7C) + (#x8FC7C6 #x6D82) + (#x8FC7C7 #x6D87) + (#x8FC7C8 #x6D91) + (#x8FC7C9 #x6D92) + (#x8FC7CA #x6D94) + (#x8FC7CB #x6D96) + (#x8FC7CC #x6D97) + (#x8FC7CD #x6D98) + (#x8FC7CE #x6DAA) + (#x8FC7CF #x6DAC) + (#x8FC7D0 #x6DB4) + (#x8FC7D1 #x6DB7) + (#x8FC7D2 #x6DB9) + (#x8FC7D3 #x6DBD) + (#x8FC7D4 #x6DBF) + (#x8FC7D5 #x6DC4) + (#x8FC7D6 #x6DC8) + (#x8FC7D7 #x6DCA) + (#x8FC7D8 #x6DCE) + (#x8FC7D9 #x6DCF) + (#x8FC7DA #x6DD6) + (#x8FC7DB #x6DDB) + (#x8FC7DC #x6DDD) + (#x8FC7DD #x6DDF) + (#x8FC7DE #x6DE0) + (#x8FC7DF #x6DE2) + (#x8FC7E0 #x6DE5) + (#x8FC7E1 #x6DE9) + (#x8FC7E2 #x6DEF) + (#x8FC7E3 #x6DF0) + (#x8FC7E4 #x6DF4) + (#x8FC7E5 #x6DF6) + (#x8FC7E6 #x6DFC) + (#x8FC7E7 #x6E00) + (#x8FC7E8 #x6E04) + (#x8FC7E9 #x6E1E) + (#x8FC7EA #x6E22) + (#x8FC7EB #x6E27) + (#x8FC7EC #x6E32) + (#x8FC7ED #x6E36) + (#x8FC7EE #x6E39) + (#x8FC7EF #x6E3B) + (#x8FC7F0 #x6E3C) + (#x8FC7F1 #x6E44) + (#x8FC7F2 #x6E45) + (#x8FC7F3 #x6E48) + (#x8FC7F4 #x6E49) + (#x8FC7F5 #x6E4B) + (#x8FC7F6 #x6E4F) + (#x8FC7F7 #x6E51) + (#x8FC7F8 #x6E52) + (#x8FC7F9 #x6E53) + (#x8FC7FA #x6E54) + (#x8FC7FB #x6E57) + (#x8FC7FC #x6E5C) + (#x8FC7FD #x6E5D) + (#x8FC7FE #x6E5E) + (#x8FC8A1 #x6E62) + (#x8FC8A2 #x6E63) + (#x8FC8A3 #x6E68) + (#x8FC8A4 #x6E73) + (#x8FC8A5 #x6E7B) + (#x8FC8A6 #x6E7D) + (#x8FC8A7 #x6E8D) + (#x8FC8A8 #x6E93) + (#x8FC8A9 #x6E99) + (#x8FC8AA #x6EA0) + (#x8FC8AB #x6EA7) + (#x8FC8AC #x6EAD) + (#x8FC8AD #x6EAE) + (#x8FC8AE #x6EB1) + (#x8FC8AF #x6EB3) + (#x8FC8B0 #x6EBB) + (#x8FC8B1 #x6EBF) + (#x8FC8B2 #x6EC0) + (#x8FC8B3 #x6EC1) + (#x8FC8B4 #x6EC3) + (#x8FC8B5 #x6EC7) + (#x8FC8B6 #x6EC8) + (#x8FC8B7 #x6ECA) + (#x8FC8B8 #x6ECD) + (#x8FC8B9 #x6ECE) + (#x8FC8BA #x6ECF) + (#x8FC8BB #x6EEB) + (#x8FC8BC #x6EED) + (#x8FC8BD #x6EEE) + (#x8FC8BE #x6EF9) + (#x8FC8BF #x6EFB) + (#x8FC8C0 #x6EFD) + (#x8FC8C1 #x6F04) + (#x8FC8C2 #x6F08) + (#x8FC8C3 #x6F0A) + (#x8FC8C4 #x6F0C) + (#x8FC8C5 #x6F0D) + (#x8FC8C6 #x6F16) + (#x8FC8C7 #x6F18) + (#x8FC8C8 #x6F1A) + (#x8FC8C9 #x6F1B) + (#x8FC8CA #x6F26) + (#x8FC8CB #x6F29) + (#x8FC8CC #x6F2A) + (#x8FC8CD #x6F2F) + (#x8FC8CE #x6F30) + (#x8FC8CF #x6F33) + (#x8FC8D0 #x6F36) + (#x8FC8D1 #x6F3B) + (#x8FC8D2 #x6F3C) + (#x8FC8D3 #x6F2D) + (#x8FC8D4 #x6F4F) + (#x8FC8D5 #x6F51) + (#x8FC8D6 #x6F52) + (#x8FC8D7 #x6F53) + (#x8FC8D8 #x6F57) + (#x8FC8D9 #x6F59) + (#x8FC8DA #x6F5A) + (#x8FC8DB #x6F5D) + (#x8FC8DC #x6F5E) + (#x8FC8DD #x6F61) + (#x8FC8DE #x6F62) + (#x8FC8DF #x6F68) + (#x8FC8E0 #x6F6C) + (#x8FC8E1 #x6F7D) + (#x8FC8E2 #x6F7E) + (#x8FC8E3 #x6F83) + (#x8FC8E4 #x6F87) + (#x8FC8E5 #x6F88) + (#x8FC8E6 #x6F8B) + (#x8FC8E7 #x6F8C) + (#x8FC8E8 #x6F8D) + (#x8FC8E9 #x6F90) + (#x8FC8EA #x6F92) + (#x8FC8EB #x6F93) + (#x8FC8EC #x6F94) + (#x8FC8ED #x6F96) + (#x8FC8EE #x6F9A) + (#x8FC8EF #x6F9F) + (#x8FC8F0 #x6FA0) + (#x8FC8F1 #x6FA5) + (#x8FC8F2 #x6FA6) + (#x8FC8F3 #x6FA7) + (#x8FC8F4 #x6FA8) + (#x8FC8F5 #x6FAE) + (#x8FC8F6 #x6FAF) + (#x8FC8F7 #x6FB0) + (#x8FC8F8 #x6FB5) + (#x8FC8F9 #x6FB6) + (#x8FC8FA #x6FBC) + (#x8FC8FB #x6FC5) + (#x8FC8FC #x6FC7) + (#x8FC8FD #x6FC8) + (#x8FC8FE #x6FCA) + (#x8FC9A1 #x6FDA) + (#x8FC9A2 #x6FDE) + (#x8FC9A3 #x6FE8) + (#x8FC9A4 #x6FE9) + (#x8FC9A5 #x6FF0) + (#x8FC9A6 #x6FF5) + (#x8FC9A7 #x6FF9) + (#x8FC9A8 #x6FFC) + (#x8FC9A9 #x6FFD) + (#x8FC9AA #x7000) + (#x8FC9AB #x7005) + (#x8FC9AC #x7006) + (#x8FC9AD #x7007) + (#x8FC9AE #x700D) + (#x8FC9AF #x7017) + (#x8FC9B0 #x7020) + (#x8FC9B1 #x7023) + (#x8FC9B2 #x702F) + (#x8FC9B3 #x7034) + (#x8FC9B4 #x7037) + (#x8FC9B5 #x7039) + (#x8FC9B6 #x703C) + (#x8FC9B7 #x7043) + (#x8FC9B8 #x7044) + (#x8FC9B9 #x7048) + (#x8FC9BA #x7049) + (#x8FC9BB #x704A) + (#x8FC9BC #x704B) + (#x8FC9BD #x7054) + (#x8FC9BE #x7055) + (#x8FC9BF #x705D) + (#x8FC9C0 #x705E) + (#x8FC9C1 #x704E) + (#x8FC9C2 #x7064) + (#x8FC9C3 #x7065) + (#x8FC9C4 #x706C) + (#x8FC9C5 #x706E) + (#x8FC9C6 #x7075) + (#x8FC9C7 #x7076) + (#x8FC9C8 #x707E) + (#x8FC9C9 #x7081) + (#x8FC9CA #x7085) + (#x8FC9CB #x7086) + (#x8FC9CC #x7094) + (#x8FC9CD #x7095) + (#x8FC9CE #x7096) + (#x8FC9CF #x7097) + (#x8FC9D0 #x7098) + (#x8FC9D1 #x709B) + (#x8FC9D2 #x70A4) + (#x8FC9D3 #x70AB) + (#x8FC9D4 #x70B0) + (#x8FC9D5 #x70B1) + (#x8FC9D6 #x70B4) + (#x8FC9D7 #x70B7) + (#x8FC9D8 #x70CA) + (#x8FC9D9 #x70D1) + (#x8FC9DA #x70D3) + (#x8FC9DB #x70D4) + (#x8FC9DC #x70D5) + (#x8FC9DD #x70D6) + (#x8FC9DE #x70D8) + (#x8FC9DF #x70DC) + (#x8FC9E0 #x70E4) + (#x8FC9E1 #x70FA) + (#x8FC9E2 #x7103) + (#x8FC9E3 #x7104) + (#x8FC9E4 #x7105) + (#x8FC9E5 #x7106) + (#x8FC9E6 #x7107) + (#x8FC9E7 #x710B) + (#x8FC9E8 #x710C) + (#x8FC9E9 #x710F) + (#x8FC9EA #x711E) + (#x8FC9EB #x7120) + (#x8FC9EC #x712B) + (#x8FC9ED #x712D) + (#x8FC9EE #x712F) + (#x8FC9EF #x7130) + (#x8FC9F0 #x7131) + (#x8FC9F1 #x7138) + (#x8FC9F2 #x7141) + (#x8FC9F3 #x7145) + (#x8FC9F4 #x7146) + (#x8FC9F5 #x7147) + (#x8FC9F6 #x714A) + (#x8FC9F7 #x714B) + (#x8FC9F8 #x7150) + (#x8FC9F9 #x7152) + (#x8FC9FA #x7157) + (#x8FC9FB #x715A) + (#x8FC9FC #x715C) + (#x8FC9FD #x715E) + (#x8FC9FE #x7160) + (#x8FCAA1 #x7168) + (#x8FCAA2 #x7179) + (#x8FCAA3 #x7180) + (#x8FCAA4 #x7185) + (#x8FCAA5 #x7187) + (#x8FCAA6 #x718C) + (#x8FCAA7 #x7192) + (#x8FCAA8 #x719A) + (#x8FCAA9 #x719B) + (#x8FCAAA #x71A0) + (#x8FCAAB #x71A2) + (#x8FCAAC #x71AF) + (#x8FCAAD #x71B0) + (#x8FCAAE #x71B2) + (#x8FCAAF #x71B3) + (#x8FCAB0 #x71BA) + (#x8FCAB1 #x71BF) + (#x8FCAB2 #x71C0) + (#x8FCAB3 #x71C1) + (#x8FCAB4 #x71C4) + (#x8FCAB5 #x71CB) + (#x8FCAB6 #x71CC) + (#x8FCAB7 #x71D3) + (#x8FCAB8 #x71D6) + (#x8FCAB9 #x71D9) + (#x8FCABA #x71DA) + (#x8FCABB #x71DC) + (#x8FCABC #x71F8) + (#x8FCABD #x71FE) + (#x8FCABE #x7200) + (#x8FCABF #x7207) + (#x8FCAC0 #x7208) + (#x8FCAC1 #x7209) + (#x8FCAC2 #x7213) + (#x8FCAC3 #x7217) + (#x8FCAC4 #x721A) + (#x8FCAC5 #x721D) + (#x8FCAC6 #x721F) + (#x8FCAC7 #x7224) + (#x8FCAC8 #x722B) + (#x8FCAC9 #x722F) + (#x8FCACA #x7234) + (#x8FCACB #x7238) + (#x8FCACC #x7239) + (#x8FCACD #x7241) + (#x8FCACE #x7242) + (#x8FCACF #x7243) + (#x8FCAD0 #x7245) + (#x8FCAD1 #x724E) + (#x8FCAD2 #x724F) + (#x8FCAD3 #x7250) + (#x8FCAD4 #x7253) + (#x8FCAD5 #x7255) + (#x8FCAD6 #x7256) + (#x8FCAD7 #x725A) + (#x8FCAD8 #x725C) + (#x8FCAD9 #x725E) + (#x8FCADA #x7260) + (#x8FCADB #x7263) + (#x8FCADC #x7268) + (#x8FCADD #x726B) + (#x8FCADE #x726E) + (#x8FCADF #x726F) + (#x8FCAE0 #x7271) + (#x8FCAE1 #x7277) + (#x8FCAE2 #x7278) + (#x8FCAE3 #x727B) + (#x8FCAE4 #x727C) + (#x8FCAE5 #x727F) + (#x8FCAE6 #x7284) + (#x8FCAE7 #x7289) + (#x8FCAE8 #x728D) + (#x8FCAE9 #x728E) + (#x8FCAEA #x7293) + (#x8FCAEB #x729B) + (#x8FCAEC #x72A8) + (#x8FCAED #x72AD) + (#x8FCAEE #x72AE) + (#x8FCAEF #x72B1) + (#x8FCAF0 #x72B4) + (#x8FCAF1 #x72BE) + (#x8FCAF2 #x72C1) + (#x8FCAF3 #x72C7) + (#x8FCAF4 #x72C9) + (#x8FCAF5 #x72CC) + (#x8FCAF6 #x72D5) + (#x8FCAF7 #x72D6) + (#x8FCAF8 #x72D8) + (#x8FCAF9 #x72DF) + (#x8FCAFA #x72E5) + (#x8FCAFB #x72F3) + (#x8FCAFC #x72F4) + (#x8FCAFD #x72FA) + (#x8FCAFE #x72FB) + (#x8FCBA1 #x72FE) + (#x8FCBA2 #x7302) + (#x8FCBA3 #x7304) + (#x8FCBA4 #x7305) + (#x8FCBA5 #x7307) + (#x8FCBA6 #x730B) + (#x8FCBA7 #x730D) + (#x8FCBA8 #x7312) + (#x8FCBA9 #x7313) + (#x8FCBAA #x7318) + (#x8FCBAB #x7319) + (#x8FCBAC #x731E) + (#x8FCBAD #x7322) + (#x8FCBAE #x7324) + (#x8FCBAF #x7327) + (#x8FCBB0 #x7328) + (#x8FCBB1 #x732C) + (#x8FCBB2 #x7331) + (#x8FCBB3 #x7332) + (#x8FCBB4 #x7335) + (#x8FCBB5 #x733A) + (#x8FCBB6 #x733B) + (#x8FCBB7 #x733D) + (#x8FCBB8 #x7343) + (#x8FCBB9 #x734D) + (#x8FCBBA #x7350) + (#x8FCBBB #x7352) + (#x8FCBBC #x7356) + (#x8FCBBD #x7358) + (#x8FCBBE #x735D) + (#x8FCBBF #x735E) + (#x8FCBC0 #x735F) + (#x8FCBC1 #x7360) + (#x8FCBC2 #x7366) + (#x8FCBC3 #x7367) + (#x8FCBC4 #x7369) + (#x8FCBC5 #x736B) + (#x8FCBC6 #x736C) + (#x8FCBC7 #x736E) + (#x8FCBC8 #x736F) + (#x8FCBC9 #x7371) + (#x8FCBCA #x7377) + (#x8FCBCB #x7379) + (#x8FCBCC #x737C) + (#x8FCBCD #x7380) + (#x8FCBCE #x7381) + (#x8FCBCF #x7383) + (#x8FCBD0 #x7385) + (#x8FCBD1 #x7386) + (#x8FCBD2 #x738E) + (#x8FCBD3 #x7390) + (#x8FCBD4 #x7393) + (#x8FCBD5 #x7395) + (#x8FCBD6 #x7397) + (#x8FCBD7 #x7398) + (#x8FCBD8 #x739C) + (#x8FCBD9 #x739E) + (#x8FCBDA #x739F) + (#x8FCBDB #x73A0) + (#x8FCBDC #x73A2) + (#x8FCBDD #x73A5) + (#x8FCBDE #x73A6) + (#x8FCBDF #x73AA) + (#x8FCBE0 #x73AB) + (#x8FCBE1 #x73AD) + (#x8FCBE2 #x73B5) + (#x8FCBE3 #x73B7) + (#x8FCBE4 #x73B9) + (#x8FCBE5 #x73BC) + (#x8FCBE6 #x73BD) + (#x8FCBE7 #x73BF) + (#x8FCBE8 #x73C5) + (#x8FCBE9 #x73C6) + (#x8FCBEA #x73C9) + (#x8FCBEB #x73CB) + (#x8FCBEC #x73CC) + (#x8FCBED #x73CF) + (#x8FCBEE #x73D2) + (#x8FCBEF #x73D3) + (#x8FCBF0 #x73D6) + (#x8FCBF1 #x73D9) + (#x8FCBF2 #x73DD) + (#x8FCBF3 #x73E1) + (#x8FCBF4 #x73E3) + (#x8FCBF5 #x73E6) + (#x8FCBF6 #x73E7) + (#x8FCBF7 #x73E9) + (#x8FCBF8 #x73F4) + (#x8FCBF9 #x73F5) + (#x8FCBFA #x73F7) + (#x8FCBFB #x73F9) + (#x8FCBFC #x73FA) + (#x8FCBFD #x73FB) + (#x8FCBFE #x73FD) + (#x8FCCA1 #x73FF) + (#x8FCCA2 #x7400) + (#x8FCCA3 #x7401) + (#x8FCCA4 #x7404) + (#x8FCCA5 #x7407) + (#x8FCCA6 #x740A) + (#x8FCCA7 #x7411) + (#x8FCCA8 #x741A) + (#x8FCCA9 #x741B) + (#x8FCCAA #x7424) + (#x8FCCAB #x7426) + (#x8FCCAC #x7428) + (#x8FCCAD #x7429) + (#x8FCCAE #x742A) + (#x8FCCAF #x742B) + (#x8FCCB0 #x742C) + (#x8FCCB1 #x742D) + (#x8FCCB2 #x742E) + (#x8FCCB3 #x742F) + (#x8FCCB4 #x7430) + (#x8FCCB5 #x7431) + (#x8FCCB6 #x7439) + (#x8FCCB7 #x7440) + (#x8FCCB8 #x7443) + (#x8FCCB9 #x7444) + (#x8FCCBA #x7446) + (#x8FCCBB #x7447) + (#x8FCCBC #x744B) + (#x8FCCBD #x744D) + (#x8FCCBE #x7451) + (#x8FCCBF #x7452) + (#x8FCCC0 #x7457) + (#x8FCCC1 #x745D) + (#x8FCCC2 #x7462) + (#x8FCCC3 #x7466) + (#x8FCCC4 #x7467) + (#x8FCCC5 #x7468) + (#x8FCCC6 #x746B) + (#x8FCCC7 #x746D) + (#x8FCCC8 #x746E) + (#x8FCCC9 #x7471) + (#x8FCCCA #x7472) + (#x8FCCCB #x7480) + (#x8FCCCC #x7481) + (#x8FCCCD #x7485) + (#x8FCCCE #x7486) + (#x8FCCCF #x7487) + (#x8FCCD0 #x7489) + (#x8FCCD1 #x748F) + (#x8FCCD2 #x7490) + (#x8FCCD3 #x7491) + (#x8FCCD4 #x7492) + (#x8FCCD5 #x7498) + (#x8FCCD6 #x7499) + (#x8FCCD7 #x749A) + (#x8FCCD8 #x749C) + (#x8FCCD9 #x749F) + (#x8FCCDA #x74A0) + (#x8FCCDB #x74A1) + (#x8FCCDC #x74A3) + (#x8FCCDD #x74A6) + (#x8FCCDE #x74A8) + (#x8FCCDF #x74A9) + (#x8FCCE0 #x74AA) + (#x8FCCE1 #x74AB) + (#x8FCCE2 #x74AE) + (#x8FCCE3 #x74AF) + (#x8FCCE4 #x74B1) + (#x8FCCE5 #x74B2) + (#x8FCCE6 #x74B5) + (#x8FCCE7 #x74B9) + (#x8FCCE8 #x74BB) + (#x8FCCE9 #x74BF) + (#x8FCCEA #x74C8) + (#x8FCCEB #x74C9) + (#x8FCCEC #x74CC) + (#x8FCCED #x74D0) + (#x8FCCEE #x74D3) + (#x8FCCEF #x74D8) + (#x8FCCF0 #x74DA) + (#x8FCCF1 #x74DB) + (#x8FCCF2 #x74DE) + (#x8FCCF3 #x74DF) + (#x8FCCF4 #x74E4) + (#x8FCCF5 #x74E8) + (#x8FCCF6 #x74EA) + (#x8FCCF7 #x74EB) + (#x8FCCF8 #x74EF) + (#x8FCCF9 #x74F4) + (#x8FCCFA #x74FA) + (#x8FCCFB #x74FB) + (#x8FCCFC #x74FC) + (#x8FCCFD #x74FF) + (#x8FCCFE #x7506) + (#x8FCDA1 #x7512) + (#x8FCDA2 #x7516) + (#x8FCDA3 #x7517) + (#x8FCDA4 #x7520) + (#x8FCDA5 #x7521) + (#x8FCDA6 #x7524) + (#x8FCDA7 #x7527) + (#x8FCDA8 #x7529) + (#x8FCDA9 #x752A) + (#x8FCDAA #x752F) + (#x8FCDAB #x7536) + (#x8FCDAC #x7539) + (#x8FCDAD #x753D) + (#x8FCDAE #x753E) + (#x8FCDAF #x753F) + (#x8FCDB0 #x7540) + (#x8FCDB1 #x7543) + (#x8FCDB2 #x7547) + (#x8FCDB3 #x7548) + (#x8FCDB4 #x754E) + (#x8FCDB5 #x7550) + (#x8FCDB6 #x7552) + (#x8FCDB7 #x7557) + (#x8FCDB8 #x755E) + (#x8FCDB9 #x755F) + (#x8FCDBA #x7561) + (#x8FCDBB #x756F) + (#x8FCDBC #x7571) + (#x8FCDBD #x7579) + (#x8FCDBE #x757A) + (#x8FCDBF #x757B) + (#x8FCDC0 #x757C) + (#x8FCDC1 #x757D) + (#x8FCDC2 #x757E) + (#x8FCDC3 #x7581) + (#x8FCDC4 #x7585) + (#x8FCDC5 #x7590) + (#x8FCDC6 #x7592) + (#x8FCDC7 #x7593) + (#x8FCDC8 #x7595) + (#x8FCDC9 #x7599) + (#x8FCDCA #x759C) + (#x8FCDCB #x75A2) + (#x8FCDCC #x75A4) + (#x8FCDCD #x75B4) + (#x8FCDCE #x75BA) + (#x8FCDCF #x75BF) + (#x8FCDD0 #x75C0) + (#x8FCDD1 #x75C1) + (#x8FCDD2 #x75C4) + (#x8FCDD3 #x75C6) + (#x8FCDD4 #x75CC) + (#x8FCDD5 #x75CE) + (#x8FCDD6 #x75CF) + (#x8FCDD7 #x75D7) + (#x8FCDD8 #x75DC) + (#x8FCDD9 #x75DF) + (#x8FCDDA #x75E0) + (#x8FCDDB #x75E1) + (#x8FCDDC #x75E4) + (#x8FCDDD #x75E7) + (#x8FCDDE #x75EC) + (#x8FCDDF #x75EE) + (#x8FCDE0 #x75EF) + (#x8FCDE1 #x75F1) + (#x8FCDE2 #x75F9) + (#x8FCDE3 #x7600) + (#x8FCDE4 #x7602) + (#x8FCDE5 #x7603) + (#x8FCDE6 #x7604) + (#x8FCDE7 #x7607) + (#x8FCDE8 #x7608) + (#x8FCDE9 #x760A) + (#x8FCDEA #x760C) + (#x8FCDEB #x760F) + (#x8FCDEC #x7612) + (#x8FCDED #x7613) + (#x8FCDEE #x7615) + (#x8FCDEF #x7616) + (#x8FCDF0 #x7619) + (#x8FCDF1 #x761B) + (#x8FCDF2 #x761C) + (#x8FCDF3 #x761D) + (#x8FCDF4 #x761E) + (#x8FCDF5 #x7623) + (#x8FCDF6 #x7625) + (#x8FCDF7 #x7626) + (#x8FCDF8 #x7629) + (#x8FCDF9 #x762D) + (#x8FCDFA #x7632) + (#x8FCDFB #x7633) + (#x8FCDFC #x7635) + (#x8FCDFD #x7638) + (#x8FCDFE #x7639) + (#x8FCEA1 #x763A) + (#x8FCEA2 #x763C) + (#x8FCEA3 #x764A) + (#x8FCEA4 #x7640) + (#x8FCEA5 #x7641) + (#x8FCEA6 #x7643) + (#x8FCEA7 #x7644) + (#x8FCEA8 #x7645) + (#x8FCEA9 #x7649) + (#x8FCEAA #x764B) + (#x8FCEAB #x7655) + (#x8FCEAC #x7659) + (#x8FCEAD #x765F) + (#x8FCEAE #x7664) + (#x8FCEAF #x7665) + (#x8FCEB0 #x766D) + (#x8FCEB1 #x766E) + (#x8FCEB2 #x766F) + (#x8FCEB3 #x7671) + (#x8FCEB4 #x7674) + (#x8FCEB5 #x7681) + (#x8FCEB6 #x7685) + (#x8FCEB7 #x768C) + (#x8FCEB8 #x768D) + (#x8FCEB9 #x7695) + (#x8FCEBA #x769B) + (#x8FCEBB #x769C) + (#x8FCEBC #x769D) + (#x8FCEBD #x769F) + (#x8FCEBE #x76A0) + (#x8FCEBF #x76A2) + (#x8FCEC0 #x76A3) + (#x8FCEC1 #x76A4) + (#x8FCEC2 #x76A5) + (#x8FCEC3 #x76A6) + (#x8FCEC4 #x76A7) + (#x8FCEC5 #x76A8) + (#x8FCEC6 #x76AA) + (#x8FCEC7 #x76AD) + (#x8FCEC8 #x76BD) + (#x8FCEC9 #x76C1) + (#x8FCECA #x76C5) + (#x8FCECB #x76C9) + (#x8FCECC #x76CB) + (#x8FCECD #x76CC) + (#x8FCECE #x76CE) + (#x8FCECF #x76D4) + (#x8FCED0 #x76D9) + (#x8FCED1 #x76E0) + (#x8FCED2 #x76E6) + (#x8FCED3 #x76E8) + (#x8FCED4 #x76EC) + (#x8FCED5 #x76F0) + (#x8FCED6 #x76F1) + (#x8FCED7 #x76F6) + (#x8FCED8 #x76F9) + (#x8FCED9 #x76FC) + (#x8FCEDA #x7700) + (#x8FCEDB #x7706) + (#x8FCEDC #x770A) + (#x8FCEDD #x770E) + (#x8FCEDE #x7712) + (#x8FCEDF #x7714) + (#x8FCEE0 #x7715) + (#x8FCEE1 #x7717) + (#x8FCEE2 #x7719) + (#x8FCEE3 #x771A) + (#x8FCEE4 #x771C) + (#x8FCEE5 #x7722) + (#x8FCEE6 #x7728) + (#x8FCEE7 #x772D) + (#x8FCEE8 #x772E) + (#x8FCEE9 #x772F) + (#x8FCEEA #x7734) + (#x8FCEEB #x7735) + (#x8FCEEC #x7736) + (#x8FCEED #x7739) + (#x8FCEEE #x773D) + (#x8FCEEF #x773E) + (#x8FCEF0 #x7742) + (#x8FCEF1 #x7745) + (#x8FCEF2 #x7746) + (#x8FCEF3 #x774A) + (#x8FCEF4 #x774D) + (#x8FCEF5 #x774E) + (#x8FCEF6 #x774F) + (#x8FCEF7 #x7752) + (#x8FCEF8 #x7756) + (#x8FCEF9 #x7757) + (#x8FCEFA #x775C) + (#x8FCEFB #x775E) + (#x8FCEFC #x775F) + (#x8FCEFD #x7760) + (#x8FCEFE #x7762) + (#x8FCFA1 #x7764) + (#x8FCFA2 #x7767) + (#x8FCFA3 #x776A) + (#x8FCFA4 #x776C) + (#x8FCFA5 #x7770) + (#x8FCFA6 #x7772) + (#x8FCFA7 #x7773) + (#x8FCFA8 #x7774) + (#x8FCFA9 #x777A) + (#x8FCFAA #x777D) + (#x8FCFAB #x7780) + (#x8FCFAC #x7784) + (#x8FCFAD #x778C) + (#x8FCFAE #x778D) + (#x8FCFAF #x7794) + (#x8FCFB0 #x7795) + (#x8FCFB1 #x7796) + (#x8FCFB2 #x779A) + (#x8FCFB3 #x779F) + (#x8FCFB4 #x77A2) + (#x8FCFB5 #x77A7) + (#x8FCFB6 #x77AA) + (#x8FCFB7 #x77AE) + (#x8FCFB8 #x77AF) + (#x8FCFB9 #x77B1) + (#x8FCFBA #x77B5) + (#x8FCFBB #x77BE) + (#x8FCFBC #x77C3) + (#x8FCFBD #x77C9) + (#x8FCFBE #x77D1) + (#x8FCFBF #x77D2) + (#x8FCFC0 #x77D5) + (#x8FCFC1 #x77D9) + (#x8FCFC2 #x77DE) + (#x8FCFC3 #x77DF) + (#x8FCFC4 #x77E0) + (#x8FCFC5 #x77E4) + (#x8FCFC6 #x77E6) + (#x8FCFC7 #x77EA) + (#x8FCFC8 #x77EC) + (#x8FCFC9 #x77F0) + (#x8FCFCA #x77F1) + (#x8FCFCB #x77F4) + (#x8FCFCC #x77F8) + (#x8FCFCD #x77FB) + (#x8FCFCE #x7805) + (#x8FCFCF #x7806) + (#x8FCFD0 #x7809) + (#x8FCFD1 #x780D) + (#x8FCFD2 #x780E) + (#x8FCFD3 #x7811) + (#x8FCFD4 #x781D) + (#x8FCFD5 #x7821) + (#x8FCFD6 #x7822) + (#x8FCFD7 #x7823) + (#x8FCFD8 #x782D) + (#x8FCFD9 #x782E) + (#x8FCFDA #x7830) + (#x8FCFDB #x7835) + (#x8FCFDC #x7837) + (#x8FCFDD #x7843) + (#x8FCFDE #x7844) + (#x8FCFDF #x7847) + (#x8FCFE0 #x7848) + (#x8FCFE1 #x784C) + (#x8FCFE2 #x784E) + (#x8FCFE3 #x7852) + (#x8FCFE4 #x785C) + (#x8FCFE5 #x785E) + (#x8FCFE6 #x7860) + (#x8FCFE7 #x7861) + (#x8FCFE8 #x7863) + (#x8FCFE9 #x7864) + (#x8FCFEA #x7868) + (#x8FCFEB #x786A) + (#x8FCFEC #x786E) + (#x8FCFED #x787A) + (#x8FCFEE #x787E) + (#x8FCFEF #x788A) + (#x8FCFF0 #x788F) + (#x8FCFF1 #x7894) + (#x8FCFF2 #x7898) + (#x8FCFF3 #x78A1) + (#x8FCFF4 #x789D) + (#x8FCFF5 #x789E) + (#x8FCFF6 #x789F) + (#x8FCFF7 #x78A4) + (#x8FCFF8 #x78A8) + (#x8FCFF9 #x78AC) + (#x8FCFFA #x78AD) + (#x8FCFFB #x78B0) + (#x8FCFFC #x78B1) + (#x8FCFFD #x78B2) + (#x8FCFFE #x78B3) + (#x8FD0A1 #x78BB) + (#x8FD0A2 #x78BD) + (#x8FD0A3 #x78BF) + (#x8FD0A4 #x78C7) + (#x8FD0A5 #x78C8) + (#x8FD0A6 #x78C9) + (#x8FD0A7 #x78CC) + (#x8FD0A8 #x78CE) + (#x8FD0A9 #x78D2) + (#x8FD0AA #x78D3) + (#x8FD0AB #x78D5) + (#x8FD0AC #x78D6) + (#x8FD0AD #x78E4) + (#x8FD0AE #x78DB) + (#x8FD0AF #x78DF) + (#x8FD0B0 #x78E0) + (#x8FD0B1 #x78E1) + (#x8FD0B2 #x78E6) + (#x8FD0B3 #x78EA) + (#x8FD0B4 #x78F2) + (#x8FD0B5 #x78F3) + (#x8FD0B6 #x7900) + (#x8FD0B7 #x78F6) + (#x8FD0B8 #x78F7) + (#x8FD0B9 #x78FA) + (#x8FD0BA #x78FB) + (#x8FD0BB #x78FF) + (#x8FD0BC #x7906) + (#x8FD0BD #x790C) + (#x8FD0BE #x7910) + (#x8FD0BF #x791A) + (#x8FD0C0 #x791C) + (#x8FD0C1 #x791E) + (#x8FD0C2 #x791F) + (#x8FD0C3 #x7920) + (#x8FD0C4 #x7925) + (#x8FD0C5 #x7927) + (#x8FD0C6 #x7929) + (#x8FD0C7 #x792D) + (#x8FD0C8 #x7931) + (#x8FD0C9 #x7934) + (#x8FD0CA #x7935) + (#x8FD0CB #x793B) + (#x8FD0CC #x793D) + (#x8FD0CD #x793F) + (#x8FD0CE #x7944) + (#x8FD0CF #x7945) + (#x8FD0D0 #x7946) + (#x8FD0D1 #x794A) + (#x8FD0D2 #x794B) + (#x8FD0D3 #x794F) + (#x8FD0D4 #x7951) + (#x8FD0D5 #x7954) + (#x8FD0D6 #x7958) + (#x8FD0D7 #x795B) + (#x8FD0D8 #x795C) + (#x8FD0D9 #x7967) + (#x8FD0DA #x7969) + (#x8FD0DB #x796B) + (#x8FD0DC #x7972) + (#x8FD0DD #x7979) + (#x8FD0DE #x797B) + (#x8FD0DF #x797C) + (#x8FD0E0 #x797E) + (#x8FD0E1 #x798B) + (#x8FD0E2 #x798C) + (#x8FD0E3 #x7991) + (#x8FD0E4 #x7993) + (#x8FD0E5 #x7994) + (#x8FD0E6 #x7995) + (#x8FD0E7 #x7996) + (#x8FD0E8 #x7998) + (#x8FD0E9 #x799B) + (#x8FD0EA #x799C) + (#x8FD0EB #x79A1) + (#x8FD0EC #x79A8) + (#x8FD0ED #x79A9) + (#x8FD0EE #x79AB) + (#x8FD0EF #x79AF) + (#x8FD0F0 #x79B1) + (#x8FD0F1 #x79B4) + (#x8FD0F2 #x79B8) + (#x8FD0F3 #x79BB) + (#x8FD0F4 #x79C2) + (#x8FD0F5 #x79C4) + (#x8FD0F6 #x79C7) + (#x8FD0F7 #x79C8) + (#x8FD0F8 #x79CA) + (#x8FD0F9 #x79CF) + (#x8FD0FA #x79D4) + (#x8FD0FB #x79D6) + (#x8FD0FC #x79DA) + (#x8FD0FD #x79DD) + (#x8FD0FE #x79DE) + (#x8FD1A1 #x79E0) + (#x8FD1A2 #x79E2) + (#x8FD1A3 #x79E5) + (#x8FD1A4 #x79EA) + (#x8FD1A5 #x79EB) + (#x8FD1A6 #x79ED) + (#x8FD1A7 #x79F1) + (#x8FD1A8 #x79F8) + (#x8FD1A9 #x79FC) + (#x8FD1AA #x7A02) + (#x8FD1AB #x7A03) + (#x8FD1AC #x7A07) + (#x8FD1AD #x7A09) + (#x8FD1AE #x7A0A) + (#x8FD1AF #x7A0C) + (#x8FD1B0 #x7A11) + (#x8FD1B1 #x7A15) + (#x8FD1B2 #x7A1B) + (#x8FD1B3 #x7A1E) + (#x8FD1B4 #x7A21) + (#x8FD1B5 #x7A27) + (#x8FD1B6 #x7A2B) + (#x8FD1B7 #x7A2D) + (#x8FD1B8 #x7A2F) + (#x8FD1B9 #x7A30) + (#x8FD1BA #x7A34) + (#x8FD1BB #x7A35) + (#x8FD1BC #x7A38) + (#x8FD1BD #x7A39) + (#x8FD1BE #x7A3A) + (#x8FD1BF #x7A44) + (#x8FD1C0 #x7A45) + (#x8FD1C1 #x7A47) + (#x8FD1C2 #x7A48) + (#x8FD1C3 #x7A4C) + (#x8FD1C4 #x7A55) + (#x8FD1C5 #x7A56) + (#x8FD1C6 #x7A59) + (#x8FD1C7 #x7A5C) + (#x8FD1C8 #x7A5D) + (#x8FD1C9 #x7A5F) + (#x8FD1CA #x7A60) + (#x8FD1CB #x7A65) + (#x8FD1CC #x7A67) + (#x8FD1CD #x7A6A) + (#x8FD1CE #x7A6D) + (#x8FD1CF #x7A75) + (#x8FD1D0 #x7A78) + (#x8FD1D1 #x7A7E) + (#x8FD1D2 #x7A80) + (#x8FD1D3 #x7A82) + (#x8FD1D4 #x7A85) + (#x8FD1D5 #x7A86) + (#x8FD1D6 #x7A8A) + (#x8FD1D7 #x7A8B) + (#x8FD1D8 #x7A90) + (#x8FD1D9 #x7A91) + (#x8FD1DA #x7A94) + (#x8FD1DB #x7A9E) + (#x8FD1DC #x7AA0) + (#x8FD1DD #x7AA3) + (#x8FD1DE #x7AAC) + (#x8FD1DF #x7AB3) + (#x8FD1E0 #x7AB5) + (#x8FD1E1 #x7AB9) + (#x8FD1E2 #x7ABB) + (#x8FD1E3 #x7ABC) + (#x8FD1E4 #x7AC6) + (#x8FD1E5 #x7AC9) + (#x8FD1E6 #x7ACC) + (#x8FD1E7 #x7ACE) + (#x8FD1E8 #x7AD1) + (#x8FD1E9 #x7ADB) + (#x8FD1EA #x7AE8) + (#x8FD1EB #x7AE9) + (#x8FD1EC #x7AEB) + (#x8FD1ED #x7AEC) + (#x8FD1EE #x7AF1) + (#x8FD1EF #x7AF4) + (#x8FD1F0 #x7AFB) + (#x8FD1F1 #x7AFD) + (#x8FD1F2 #x7AFE) + (#x8FD1F3 #x7B07) + (#x8FD1F4 #x7B14) + (#x8FD1F5 #x7B1F) + (#x8FD1F6 #x7B23) + (#x8FD1F7 #x7B27) + (#x8FD1F8 #x7B29) + (#x8FD1F9 #x7B2A) + (#x8FD1FA #x7B2B) + (#x8FD1FB #x7B2D) + (#x8FD1FC #x7B2E) + (#x8FD1FD #x7B2F) + (#x8FD1FE #x7B30) + (#x8FD2A1 #x7B31) + (#x8FD2A2 #x7B34) + (#x8FD2A3 #x7B3D) + (#x8FD2A4 #x7B3F) + (#x8FD2A5 #x7B40) + (#x8FD2A6 #x7B41) + (#x8FD2A7 #x7B47) + (#x8FD2A8 #x7B4E) + (#x8FD2A9 #x7B55) + (#x8FD2AA #x7B60) + (#x8FD2AB #x7B64) + (#x8FD2AC #x7B66) + (#x8FD2AD #x7B69) + (#x8FD2AE #x7B6A) + (#x8FD2AF #x7B6D) + (#x8FD2B0 #x7B6F) + (#x8FD2B1 #x7B72) + (#x8FD2B2 #x7B73) + (#x8FD2B3 #x7B77) + (#x8FD2B4 #x7B84) + (#x8FD2B5 #x7B89) + (#x8FD2B6 #x7B8E) + (#x8FD2B7 #x7B90) + (#x8FD2B8 #x7B91) + (#x8FD2B9 #x7B96) + (#x8FD2BA #x7B9B) + (#x8FD2BB #x7B9E) + (#x8FD2BC #x7BA0) + (#x8FD2BD #x7BA5) + (#x8FD2BE #x7BAC) + (#x8FD2BF #x7BAF) + (#x8FD2C0 #x7BB0) + (#x8FD2C1 #x7BB2) + (#x8FD2C2 #x7BB5) + (#x8FD2C3 #x7BB6) + (#x8FD2C4 #x7BBA) + (#x8FD2C5 #x7BBB) + (#x8FD2C6 #x7BBC) + (#x8FD2C7 #x7BBD) + (#x8FD2C8 #x7BC2) + (#x8FD2C9 #x7BC5) + (#x8FD2CA #x7BC8) + (#x8FD2CB #x7BCA) + (#x8FD2CC #x7BD4) + (#x8FD2CD #x7BD6) + (#x8FD2CE #x7BD7) + (#x8FD2CF #x7BD9) + (#x8FD2D0 #x7BDA) + (#x8FD2D1 #x7BDB) + (#x8FD2D2 #x7BE8) + (#x8FD2D3 #x7BEA) + (#x8FD2D4 #x7BF2) + (#x8FD2D5 #x7BF4) + (#x8FD2D6 #x7BF5) + (#x8FD2D7 #x7BF8) + (#x8FD2D8 #x7BF9) + (#x8FD2D9 #x7BFA) + (#x8FD2DA #x7BFC) + (#x8FD2DB #x7BFE) + (#x8FD2DC #x7C01) + (#x8FD2DD #x7C02) + (#x8FD2DE #x7C03) + (#x8FD2DF #x7C04) + (#x8FD2E0 #x7C06) + (#x8FD2E1 #x7C09) + (#x8FD2E2 #x7C0B) + (#x8FD2E3 #x7C0C) + (#x8FD2E4 #x7C0E) + (#x8FD2E5 #x7C0F) + (#x8FD2E6 #x7C19) + (#x8FD2E7 #x7C1B) + (#x8FD2E8 #x7C20) + (#x8FD2E9 #x7C25) + (#x8FD2EA #x7C26) + (#x8FD2EB #x7C28) + (#x8FD2EC #x7C2C) + (#x8FD2ED #x7C31) + (#x8FD2EE #x7C33) + (#x8FD2EF #x7C34) + (#x8FD2F0 #x7C36) + (#x8FD2F1 #x7C39) + (#x8FD2F2 #x7C3A) + (#x8FD2F3 #x7C46) + (#x8FD2F4 #x7C4A) + (#x8FD2F5 #x7C55) + (#x8FD2F6 #x7C51) + (#x8FD2F7 #x7C52) + (#x8FD2F8 #x7C53) + (#x8FD2F9 #x7C59) + (#x8FD2FA #x7C5A) + (#x8FD2FB #x7C5B) + (#x8FD2FC #x7C5C) + (#x8FD2FD #x7C5D) + (#x8FD2FE #x7C5E) + (#x8FD3A1 #x7C61) + (#x8FD3A2 #x7C63) + (#x8FD3A3 #x7C67) + (#x8FD3A4 #x7C69) + (#x8FD3A5 #x7C6D) + (#x8FD3A6 #x7C6E) + (#x8FD3A7 #x7C70) + (#x8FD3A8 #x7C72) + (#x8FD3A9 #x7C79) + (#x8FD3AA #x7C7C) + (#x8FD3AB #x7C7D) + (#x8FD3AC #x7C86) + (#x8FD3AD #x7C87) + (#x8FD3AE #x7C8F) + (#x8FD3AF #x7C94) + (#x8FD3B0 #x7C9E) + (#x8FD3B1 #x7CA0) + (#x8FD3B2 #x7CA6) + (#x8FD3B3 #x7CB0) + (#x8FD3B4 #x7CB6) + (#x8FD3B5 #x7CB7) + (#x8FD3B6 #x7CBA) + (#x8FD3B7 #x7CBB) + (#x8FD3B8 #x7CBC) + (#x8FD3B9 #x7CBF) + (#x8FD3BA #x7CC4) + (#x8FD3BB #x7CC7) + (#x8FD3BC #x7CC8) + (#x8FD3BD #x7CC9) + (#x8FD3BE #x7CCD) + (#x8FD3BF #x7CCF) + (#x8FD3C0 #x7CD3) + (#x8FD3C1 #x7CD4) + (#x8FD3C2 #x7CD5) + (#x8FD3C3 #x7CD7) + (#x8FD3C4 #x7CD9) + (#x8FD3C5 #x7CDA) + (#x8FD3C6 #x7CDD) + (#x8FD3C7 #x7CE6) + (#x8FD3C8 #x7CE9) + (#x8FD3C9 #x7CEB) + (#x8FD3CA #x7CF5) + (#x8FD3CB #x7D03) + (#x8FD3CC #x7D07) + (#x8FD3CD #x7D08) + (#x8FD3CE #x7D09) + (#x8FD3CF #x7D0F) + (#x8FD3D0 #x7D11) + (#x8FD3D1 #x7D12) + (#x8FD3D2 #x7D13) + (#x8FD3D3 #x7D16) + (#x8FD3D4 #x7D1D) + (#x8FD3D5 #x7D1E) + (#x8FD3D6 #x7D23) + (#x8FD3D7 #x7D26) + (#x8FD3D8 #x7D2A) + (#x8FD3D9 #x7D2D) + (#x8FD3DA #x7D31) + (#x8FD3DB #x7D3C) + (#x8FD3DC #x7D3D) + (#x8FD3DD #x7D3E) + (#x8FD3DE #x7D40) + (#x8FD3DF #x7D41) + (#x8FD3E0 #x7D47) + (#x8FD3E1 #x7D48) + (#x8FD3E2 #x7D4D) + (#x8FD3E3 #x7D51) + (#x8FD3E4 #x7D53) + (#x8FD3E5 #x7D57) + (#x8FD3E6 #x7D59) + (#x8FD3E7 #x7D5A) + (#x8FD3E8 #x7D5C) + (#x8FD3E9 #x7D5D) + (#x8FD3EA #x7D65) + (#x8FD3EB #x7D67) + (#x8FD3EC #x7D6A) + (#x8FD3ED #x7D70) + (#x8FD3EE #x7D78) + (#x8FD3EF #x7D7A) + (#x8FD3F0 #x7D7B) + (#x8FD3F1 #x7D7F) + (#x8FD3F2 #x7D81) + (#x8FD3F3 #x7D82) + (#x8FD3F4 #x7D83) + (#x8FD3F5 #x7D85) + (#x8FD3F6 #x7D86) + (#x8FD3F7 #x7D88) + (#x8FD3F8 #x7D8B) + (#x8FD3F9 #x7D8C) + (#x8FD3FA #x7D8D) + (#x8FD3FB #x7D91) + (#x8FD3FC #x7D96) + (#x8FD3FD #x7D97) + (#x8FD3FE #x7D9D) + (#x8FD4A1 #x7D9E) + (#x8FD4A2 #x7DA6) + (#x8FD4A3 #x7DA7) + (#x8FD4A4 #x7DAA) + (#x8FD4A5 #x7DB3) + (#x8FD4A6 #x7DB6) + (#x8FD4A7 #x7DB7) + (#x8FD4A8 #x7DB9) + (#x8FD4A9 #x7DC2) + (#x8FD4AA #x7DC3) + (#x8FD4AB #x7DC4) + (#x8FD4AC #x7DC5) + (#x8FD4AD #x7DC6) + (#x8FD4AE #x7DCC) + (#x8FD4AF #x7DCD) + (#x8FD4B0 #x7DCE) + (#x8FD4B1 #x7DD7) + (#x8FD4B2 #x7DD9) + (#x8FD4B3 #x7E00) + (#x8FD4B4 #x7DE2) + (#x8FD4B5 #x7DE5) + (#x8FD4B6 #x7DE6) + (#x8FD4B7 #x7DEA) + (#x8FD4B8 #x7DEB) + (#x8FD4B9 #x7DED) + (#x8FD4BA #x7DF1) + (#x8FD4BB #x7DF5) + (#x8FD4BC #x7DF6) + (#x8FD4BD #x7DF9) + (#x8FD4BE #x7DFA) + (#x8FD4BF #x7E08) + (#x8FD4C0 #x7E10) + (#x8FD4C1 #x7E11) + (#x8FD4C2 #x7E15) + (#x8FD4C3 #x7E17) + (#x8FD4C4 #x7E1C) + (#x8FD4C5 #x7E1D) + (#x8FD4C6 #x7E20) + (#x8FD4C7 #x7E27) + (#x8FD4C8 #x7E28) + (#x8FD4C9 #x7E2C) + (#x8FD4CA #x7E2D) + (#x8FD4CB #x7E2F) + (#x8FD4CC #x7E33) + (#x8FD4CD #x7E36) + (#x8FD4CE #x7E3F) + (#x8FD4CF #x7E44) + (#x8FD4D0 #x7E45) + (#x8FD4D1 #x7E47) + (#x8FD4D2 #x7E4E) + (#x8FD4D3 #x7E50) + (#x8FD4D4 #x7E52) + (#x8FD4D5 #x7E58) + (#x8FD4D6 #x7E5F) + (#x8FD4D7 #x7E61) + (#x8FD4D8 #x7E62) + (#x8FD4D9 #x7E65) + (#x8FD4DA #x7E6B) + (#x8FD4DB #x7E6E) + (#x8FD4DC #x7E6F) + (#x8FD4DD #x7E73) + (#x8FD4DE #x7E78) + (#x8FD4DF #x7E7E) + (#x8FD4E0 #x7E81) + (#x8FD4E1 #x7E86) + (#x8FD4E2 #x7E87) + (#x8FD4E3 #x7E8A) + (#x8FD4E4 #x7E8D) + (#x8FD4E5 #x7E91) + (#x8FD4E6 #x7E95) + (#x8FD4E7 #x7E98) + (#x8FD4E8 #x7E9A) + (#x8FD4E9 #x7E9D) + (#x8FD4EA #x7E9E) + (#x8FD4EB #x7F3C) + (#x8FD4EC #x7F3B) + (#x8FD4ED #x7F3D) + (#x8FD4EE #x7F3E) + (#x8FD4EF #x7F3F) + (#x8FD4F0 #x7F43) + (#x8FD4F1 #x7F44) + (#x8FD4F2 #x7F47) + (#x8FD4F3 #x7F4F) + (#x8FD4F4 #x7F52) + (#x8FD4F5 #x7F53) + (#x8FD4F6 #x7F5B) + (#x8FD4F7 #x7F5C) + (#x8FD4F8 #x7F5D) + (#x8FD4F9 #x7F61) + (#x8FD4FA #x7F63) + (#x8FD4FB #x7F64) + (#x8FD4FC #x7F65) + (#x8FD4FD #x7F66) + (#x8FD4FE #x7F6D) + (#x8FD5A1 #x7F71) + (#x8FD5A2 #x7F7D) + (#x8FD5A3 #x7F7E) + (#x8FD5A4 #x7F7F) + (#x8FD5A5 #x7F80) + (#x8FD5A6 #x7F8B) + (#x8FD5A7 #x7F8D) + (#x8FD5A8 #x7F8F) + (#x8FD5A9 #x7F90) + (#x8FD5AA #x7F91) + (#x8FD5AB #x7F96) + (#x8FD5AC #x7F97) + (#x8FD5AD #x7F9C) + (#x8FD5AE #x7FA1) + (#x8FD5AF #x7FA2) + (#x8FD5B0 #x7FA6) + (#x8FD5B1 #x7FAA) + (#x8FD5B2 #x7FAD) + (#x8FD5B3 #x7FB4) + (#x8FD5B4 #x7FBC) + (#x8FD5B5 #x7FBF) + (#x8FD5B6 #x7FC0) + (#x8FD5B7 #x7FC3) + (#x8FD5B8 #x7FC8) + (#x8FD5B9 #x7FCE) + (#x8FD5BA #x7FCF) + (#x8FD5BB #x7FDB) + (#x8FD5BC #x7FDF) + (#x8FD5BD #x7FE3) + (#x8FD5BE #x7FE5) + (#x8FD5BF #x7FE8) + (#x8FD5C0 #x7FEC) + (#x8FD5C1 #x7FEE) + (#x8FD5C2 #x7FEF) + (#x8FD5C3 #x7FF2) + (#x8FD5C4 #x7FFA) + (#x8FD5C5 #x7FFD) + (#x8FD5C6 #x7FFE) + (#x8FD5C7 #x7FFF) + (#x8FD5C8 #x8007) + (#x8FD5C9 #x8008) + (#x8FD5CA #x800A) + (#x8FD5CB #x800D) + (#x8FD5CC #x800E) + (#x8FD5CD #x800F) + (#x8FD5CE #x8011) + (#x8FD5CF #x8013) + (#x8FD5D0 #x8014) + (#x8FD5D1 #x8016) + (#x8FD5D2 #x801D) + (#x8FD5D3 #x801E) + (#x8FD5D4 #x801F) + (#x8FD5D5 #x8020) + (#x8FD5D6 #x8024) + (#x8FD5D7 #x8026) + (#x8FD5D8 #x802C) + (#x8FD5D9 #x802E) + (#x8FD5DA #x8030) + (#x8FD5DB #x8034) + (#x8FD5DC #x8035) + (#x8FD5DD #x8037) + (#x8FD5DE #x8039) + (#x8FD5DF #x803A) + (#x8FD5E0 #x803C) + (#x8FD5E1 #x803E) + (#x8FD5E2 #x8040) + (#x8FD5E3 #x8044) + (#x8FD5E4 #x8060) + (#x8FD5E5 #x8064) + (#x8FD5E6 #x8066) + (#x8FD5E7 #x806D) + (#x8FD5E8 #x8071) + (#x8FD5E9 #x8075) + (#x8FD5EA #x8081) + (#x8FD5EB #x8088) + (#x8FD5EC #x808E) + (#x8FD5ED #x809C) + (#x8FD5EE #x809E) + (#x8FD5EF #x80A6) + (#x8FD5F0 #x80A7) + (#x8FD5F1 #x80AB) + (#x8FD5F2 #x80B8) + (#x8FD5F3 #x80B9) + (#x8FD5F4 #x80C8) + (#x8FD5F5 #x80CD) + (#x8FD5F6 #x80CF) + (#x8FD5F7 #x80D2) + (#x8FD5F8 #x80D4) + (#x8FD5F9 #x80D5) + (#x8FD5FA #x80D7) + (#x8FD5FB #x80D8) + (#x8FD5FC #x80E0) + (#x8FD5FD #x80ED) + (#x8FD5FE #x80EE) + (#x8FD6A1 #x80F0) + (#x8FD6A2 #x80F2) + (#x8FD6A3 #x80F3) + (#x8FD6A4 #x80F6) + (#x8FD6A5 #x80F9) + (#x8FD6A6 #x80FA) + (#x8FD6A7 #x80FE) + (#x8FD6A8 #x8103) + (#x8FD6A9 #x810B) + (#x8FD6AA #x8116) + (#x8FD6AB #x8117) + (#x8FD6AC #x8118) + (#x8FD6AD #x811C) + (#x8FD6AE #x811E) + (#x8FD6AF #x8120) + (#x8FD6B0 #x8124) + (#x8FD6B1 #x8127) + (#x8FD6B2 #x812C) + (#x8FD6B3 #x8130) + (#x8FD6B4 #x8135) + (#x8FD6B5 #x813A) + (#x8FD6B6 #x813C) + (#x8FD6B7 #x8145) + (#x8FD6B8 #x8147) + (#x8FD6B9 #x814A) + (#x8FD6BA #x814C) + (#x8FD6BB #x8152) + (#x8FD6BC #x8157) + (#x8FD6BD #x8160) + (#x8FD6BE #x8161) + (#x8FD6BF #x8167) + (#x8FD6C0 #x8168) + (#x8FD6C1 #x8169) + (#x8FD6C2 #x816D) + (#x8FD6C3 #x816F) + (#x8FD6C4 #x8177) + (#x8FD6C5 #x8181) + (#x8FD6C6 #x8190) + (#x8FD6C7 #x8184) + (#x8FD6C8 #x8185) + (#x8FD6C9 #x8186) + (#x8FD6CA #x818B) + (#x8FD6CB #x818E) + (#x8FD6CC #x8196) + (#x8FD6CD #x8198) + (#x8FD6CE #x819B) + (#x8FD6CF #x819E) + (#x8FD6D0 #x81A2) + (#x8FD6D1 #x81AE) + (#x8FD6D2 #x81B2) + (#x8FD6D3 #x81B4) + (#x8FD6D4 #x81BB) + (#x8FD6D5 #x81CB) + (#x8FD6D6 #x81C3) + (#x8FD6D7 #x81C5) + (#x8FD6D8 #x81CA) + (#x8FD6D9 #x81CE) + (#x8FD6DA #x81CF) + (#x8FD6DB #x81D5) + (#x8FD6DC #x81D7) + (#x8FD6DD #x81DB) + (#x8FD6DE #x81DD) + (#x8FD6DF #x81DE) + (#x8FD6E0 #x81E1) + (#x8FD6E1 #x81E4) + (#x8FD6E2 #x81EB) + (#x8FD6E3 #x81EC) + (#x8FD6E4 #x81F0) + (#x8FD6E5 #x81F1) + (#x8FD6E6 #x81F2) + (#x8FD6E7 #x81F5) + (#x8FD6E8 #x81F6) + (#x8FD6E9 #x81F8) + (#x8FD6EA #x81F9) + (#x8FD6EB #x81FD) + (#x8FD6EC #x81FF) + (#x8FD6ED #x8200) + (#x8FD6EE #x8203) + (#x8FD6EF #x820F) + (#x8FD6F0 #x8213) + (#x8FD6F1 #x8214) + (#x8FD6F2 #x8219) + (#x8FD6F3 #x821A) + (#x8FD6F4 #x821D) + (#x8FD6F5 #x8221) + (#x8FD6F6 #x8222) + (#x8FD6F7 #x8228) + (#x8FD6F8 #x8232) + (#x8FD6F9 #x8234) + (#x8FD6FA #x823A) + (#x8FD6FB #x8243) + (#x8FD6FC #x8244) + (#x8FD6FD #x8245) + (#x8FD6FE #x8246) + (#x8FD7A1 #x824B) + (#x8FD7A2 #x824E) + (#x8FD7A3 #x824F) + (#x8FD7A4 #x8251) + (#x8FD7A5 #x8256) + (#x8FD7A6 #x825C) + (#x8FD7A7 #x8260) + (#x8FD7A8 #x8263) + (#x8FD7A9 #x8267) + (#x8FD7AA #x826D) + (#x8FD7AB #x8274) + (#x8FD7AC #x827B) + (#x8FD7AD #x827D) + (#x8FD7AE #x827F) + (#x8FD7AF #x8280) + (#x8FD7B0 #x8281) + (#x8FD7B1 #x8283) + (#x8FD7B2 #x8284) + (#x8FD7B3 #x8287) + (#x8FD7B4 #x8289) + (#x8FD7B5 #x828A) + (#x8FD7B6 #x828E) + (#x8FD7B7 #x8291) + (#x8FD7B8 #x8294) + (#x8FD7B9 #x8296) + (#x8FD7BA #x8298) + (#x8FD7BB #x829A) + (#x8FD7BC #x829B) + (#x8FD7BD #x82A0) + (#x8FD7BE #x82A1) + (#x8FD7BF #x82A3) + (#x8FD7C0 #x82A4) + (#x8FD7C1 #x82A7) + (#x8FD7C2 #x82A8) + (#x8FD7C3 #x82A9) + (#x8FD7C4 #x82AA) + (#x8FD7C5 #x82AE) + (#x8FD7C6 #x82B0) + (#x8FD7C7 #x82B2) + (#x8FD7C8 #x82B4) + (#x8FD7C9 #x82B7) + (#x8FD7CA #x82BA) + (#x8FD7CB #x82BC) + (#x8FD7CC #x82BE) + (#x8FD7CD #x82BF) + (#x8FD7CE #x82C6) + (#x8FD7CF #x82D0) + (#x8FD7D0 #x82D5) + (#x8FD7D1 #x82DA) + (#x8FD7D2 #x82E0) + (#x8FD7D3 #x82E2) + (#x8FD7D4 #x82E4) + (#x8FD7D5 #x82E8) + (#x8FD7D6 #x82EA) + (#x8FD7D7 #x82ED) + (#x8FD7D8 #x82EF) + (#x8FD7D9 #x82F6) + (#x8FD7DA #x82F7) + (#x8FD7DB #x82FD) + (#x8FD7DC #x82FE) + (#x8FD7DD #x8300) + (#x8FD7DE #x8301) + (#x8FD7DF #x8307) + (#x8FD7E0 #x8308) + (#x8FD7E1 #x830A) + (#x8FD7E2 #x830B) + (#x8FD7E3 #x8354) + (#x8FD7E4 #x831B) + (#x8FD7E5 #x831D) + (#x8FD7E6 #x831E) + (#x8FD7E7 #x831F) + (#x8FD7E8 #x8321) + (#x8FD7E9 #x8322) + (#x8FD7EA #x832C) + (#x8FD7EB #x832D) + (#x8FD7EC #x832E) + (#x8FD7ED #x8330) + (#x8FD7EE #x8333) + (#x8FD7EF #x8337) + (#x8FD7F0 #x833A) + (#x8FD7F1 #x833C) + (#x8FD7F2 #x833D) + (#x8FD7F3 #x8342) + (#x8FD7F4 #x8343) + (#x8FD7F5 #x8344) + (#x8FD7F6 #x8347) + (#x8FD7F7 #x834D) + (#x8FD7F8 #x834E) + (#x8FD7F9 #x8351) + (#x8FD7FA #x8355) + (#x8FD7FB #x8356) + (#x8FD7FC #x8357) + (#x8FD7FD #x8370) + (#x8FD7FE #x8378) + (#x8FD8A1 #x837D) + (#x8FD8A2 #x837F) + (#x8FD8A3 #x8380) + (#x8FD8A4 #x8382) + (#x8FD8A5 #x8384) + (#x8FD8A6 #x8386) + (#x8FD8A7 #x838D) + (#x8FD8A8 #x8392) + (#x8FD8A9 #x8394) + (#x8FD8AA #x8395) + (#x8FD8AB #x8398) + (#x8FD8AC #x8399) + (#x8FD8AD #x839B) + (#x8FD8AE #x839C) + (#x8FD8AF #x839D) + (#x8FD8B0 #x83A6) + (#x8FD8B1 #x83A7) + (#x8FD8B2 #x83A9) + (#x8FD8B3 #x83AC) + (#x8FD8B4 #x83BE) + (#x8FD8B5 #x83BF) + (#x8FD8B6 #x83C0) + (#x8FD8B7 #x83C7) + (#x8FD8B8 #x83C9) + (#x8FD8B9 #x83CF) + (#x8FD8BA #x83D0) + (#x8FD8BB #x83D1) + (#x8FD8BC #x83D4) + (#x8FD8BD #x83DD) + (#x8FD8BE #x8353) + (#x8FD8BF #x83E8) + (#x8FD8C0 #x83EA) + (#x8FD8C1 #x83F6) + (#x8FD8C2 #x83F8) + (#x8FD8C3 #x83F9) + (#x8FD8C4 #x83FC) + (#x8FD8C5 #x8401) + (#x8FD8C6 #x8406) + (#x8FD8C7 #x840A) + (#x8FD8C8 #x840F) + (#x8FD8C9 #x8411) + (#x8FD8CA #x8415) + (#x8FD8CB #x8419) + (#x8FD8CC #x83AD) + (#x8FD8CD #x842F) + (#x8FD8CE #x8439) + (#x8FD8CF #x8445) + (#x8FD8D0 #x8447) + (#x8FD8D1 #x8448) + (#x8FD8D2 #x844A) + (#x8FD8D3 #x844D) + (#x8FD8D4 #x844F) + (#x8FD8D5 #x8451) + (#x8FD8D6 #x8452) + (#x8FD8D7 #x8456) + (#x8FD8D8 #x8458) + (#x8FD8D9 #x8459) + (#x8FD8DA #x845A) + (#x8FD8DB #x845C) + (#x8FD8DC #x8460) + (#x8FD8DD #x8464) + (#x8FD8DE #x8465) + (#x8FD8DF #x8467) + (#x8FD8E0 #x846A) + (#x8FD8E1 #x8470) + (#x8FD8E2 #x8473) + (#x8FD8E3 #x8474) + (#x8FD8E4 #x8476) + (#x8FD8E5 #x8478) + (#x8FD8E6 #x847C) + (#x8FD8E7 #x847D) + (#x8FD8E8 #x8481) + (#x8FD8E9 #x8485) + (#x8FD8EA #x8492) + (#x8FD8EB #x8493) + (#x8FD8EC #x8495) + (#x8FD8ED #x849E) + (#x8FD8EE #x84A6) + (#x8FD8EF #x84A8) + (#x8FD8F0 #x84A9) + (#x8FD8F1 #x84AA) + (#x8FD8F2 #x84AF) + (#x8FD8F3 #x84B1) + (#x8FD8F4 #x84B4) + (#x8FD8F5 #x84BA) + (#x8FD8F6 #x84BD) + (#x8FD8F7 #x84BE) + (#x8FD8F8 #x84C0) + (#x8FD8F9 #x84C2) + (#x8FD8FA #x84C7) + (#x8FD8FB #x84C8) + (#x8FD8FC #x84CC) + (#x8FD8FD #x84CF) + (#x8FD8FE #x84D3) + (#x8FD9A1 #x84DC) + (#x8FD9A2 #x84E7) + (#x8FD9A3 #x84EA) + (#x8FD9A4 #x84EF) + (#x8FD9A5 #x84F0) + (#x8FD9A6 #x84F1) + (#x8FD9A7 #x84F2) + (#x8FD9A8 #x84F7) + (#x8FD9A9 #x8532) + (#x8FD9AA #x84FA) + (#x8FD9AB #x84FB) + (#x8FD9AC #x84FD) + (#x8FD9AD #x8502) + (#x8FD9AE #x8503) + (#x8FD9AF #x8507) + (#x8FD9B0 #x850C) + (#x8FD9B1 #x850E) + (#x8FD9B2 #x8510) + (#x8FD9B3 #x851C) + (#x8FD9B4 #x851E) + (#x8FD9B5 #x8522) + (#x8FD9B6 #x8523) + (#x8FD9B7 #x8524) + (#x8FD9B8 #x8525) + (#x8FD9B9 #x8527) + (#x8FD9BA #x852A) + (#x8FD9BB #x852B) + (#x8FD9BC #x852F) + (#x8FD9BD #x8533) + (#x8FD9BE #x8534) + (#x8FD9BF #x8536) + (#x8FD9C0 #x853F) + (#x8FD9C1 #x8546) + (#x8FD9C2 #x854F) + (#x8FD9C3 #x8550) + (#x8FD9C4 #x8551) + (#x8FD9C5 #x8552) + (#x8FD9C6 #x8553) + (#x8FD9C7 #x8556) + (#x8FD9C8 #x8559) + (#x8FD9C9 #x855C) + (#x8FD9CA #x855D) + (#x8FD9CB #x855E) + (#x8FD9CC #x855F) + (#x8FD9CD #x8560) + (#x8FD9CE #x8561) + (#x8FD9CF #x8562) + (#x8FD9D0 #x8564) + (#x8FD9D1 #x856B) + (#x8FD9D2 #x856F) + (#x8FD9D3 #x8579) + (#x8FD9D4 #x857A) + (#x8FD9D5 #x857B) + (#x8FD9D6 #x857D) + (#x8FD9D7 #x857F) + (#x8FD9D8 #x8581) + (#x8FD9D9 #x8585) + (#x8FD9DA #x8586) + (#x8FD9DB #x8589) + (#x8FD9DC #x858B) + (#x8FD9DD #x858C) + (#x8FD9DE #x858F) + (#x8FD9DF #x8593) + (#x8FD9E0 #x8598) + (#x8FD9E1 #x859D) + (#x8FD9E2 #x859F) + (#x8FD9E3 #x85A0) + (#x8FD9E4 #x85A2) + (#x8FD9E5 #x85A5) + (#x8FD9E6 #x85A7) + (#x8FD9E7 #x85B4) + (#x8FD9E8 #x85B6) + (#x8FD9E9 #x85B7) + (#x8FD9EA #x85B8) + (#x8FD9EB #x85BC) + (#x8FD9EC #x85BD) + (#x8FD9ED #x85BE) + (#x8FD9EE #x85BF) + (#x8FD9EF #x85C2) + (#x8FD9F0 #x85C7) + (#x8FD9F1 #x85CA) + (#x8FD9F2 #x85CB) + (#x8FD9F3 #x85CE) + (#x8FD9F4 #x85AD) + (#x8FD9F5 #x85D8) + (#x8FD9F6 #x85DA) + (#x8FD9F7 #x85DF) + (#x8FD9F8 #x85E0) + (#x8FD9F9 #x85E6) + (#x8FD9FA #x85E8) + (#x8FD9FB #x85ED) + (#x8FD9FC #x85F3) + (#x8FD9FD #x85F6) + (#x8FD9FE #x85FC) + (#x8FDAA1 #x85FF) + (#x8FDAA2 #x8600) + (#x8FDAA3 #x8604) + (#x8FDAA4 #x8605) + (#x8FDAA5 #x860D) + (#x8FDAA6 #x860E) + (#x8FDAA7 #x8610) + (#x8FDAA8 #x8611) + (#x8FDAA9 #x8612) + (#x8FDAAA #x8618) + (#x8FDAAB #x8619) + (#x8FDAAC #x861B) + (#x8FDAAD #x861E) + (#x8FDAAE #x8621) + (#x8FDAAF #x8627) + (#x8FDAB0 #x8629) + (#x8FDAB1 #x8636) + (#x8FDAB2 #x8638) + (#x8FDAB3 #x863A) + (#x8FDAB4 #x863C) + (#x8FDAB5 #x863D) + (#x8FDAB6 #x8640) + (#x8FDAB7 #x8642) + (#x8FDAB8 #x8646) + (#x8FDAB9 #x8652) + (#x8FDABA #x8653) + (#x8FDABB #x8656) + (#x8FDABC #x8657) + (#x8FDABD #x8658) + (#x8FDABE #x8659) + (#x8FDABF #x865D) + (#x8FDAC0 #x8660) + (#x8FDAC1 #x8661) + (#x8FDAC2 #x8662) + (#x8FDAC3 #x8663) + (#x8FDAC4 #x8664) + (#x8FDAC5 #x8669) + (#x8FDAC6 #x866C) + (#x8FDAC7 #x866F) + (#x8FDAC8 #x8675) + (#x8FDAC9 #x8676) + (#x8FDACA #x8677) + (#x8FDACB #x867A) + (#x8FDACC #x868D) + (#x8FDACD #x8691) + (#x8FDACE #x8696) + (#x8FDACF #x8698) + (#x8FDAD0 #x869A) + (#x8FDAD1 #x869C) + (#x8FDAD2 #x86A1) + (#x8FDAD3 #x86A6) + (#x8FDAD4 #x86A7) + (#x8FDAD5 #x86A8) + (#x8FDAD6 #x86AD) + (#x8FDAD7 #x86B1) + (#x8FDAD8 #x86B3) + (#x8FDAD9 #x86B4) + (#x8FDADA #x86B5) + (#x8FDADB #x86B7) + (#x8FDADC #x86B8) + (#x8FDADD #x86B9) + (#x8FDADE #x86BF) + (#x8FDADF #x86C0) + (#x8FDAE0 #x86C1) + (#x8FDAE1 #x86C3) + (#x8FDAE2 #x86C5) + (#x8FDAE3 #x86D1) + (#x8FDAE4 #x86D2) + (#x8FDAE5 #x86D5) + (#x8FDAE6 #x86D7) + (#x8FDAE7 #x86DA) + (#x8FDAE8 #x86DC) + (#x8FDAE9 #x86E0) + (#x8FDAEA #x86E3) + (#x8FDAEB #x86E5) + (#x8FDAEC #x86E7) + (#x8FDAED #x8688) + (#x8FDAEE #x86FA) + (#x8FDAEF #x86FC) + (#x8FDAF0 #x86FD) + (#x8FDAF1 #x8704) + (#x8FDAF2 #x8705) + (#x8FDAF3 #x8707) + (#x8FDAF4 #x870B) + (#x8FDAF5 #x870E) + (#x8FDAF6 #x870F) + (#x8FDAF7 #x8710) + (#x8FDAF8 #x8713) + (#x8FDAF9 #x8714) + (#x8FDAFA #x8719) + (#x8FDAFB #x871E) + (#x8FDAFC #x871F) + (#x8FDAFD #x8721) + (#x8FDAFE #x8723) + (#x8FDBA1 #x8728) + (#x8FDBA2 #x872E) + (#x8FDBA3 #x872F) + (#x8FDBA4 #x8731) + (#x8FDBA5 #x8732) + (#x8FDBA6 #x8739) + (#x8FDBA7 #x873A) + (#x8FDBA8 #x873C) + (#x8FDBA9 #x873D) + (#x8FDBAA #x873E) + (#x8FDBAB #x8740) + (#x8FDBAC #x8743) + (#x8FDBAD #x8745) + (#x8FDBAE #x874D) + (#x8FDBAF #x8758) + (#x8FDBB0 #x875D) + (#x8FDBB1 #x8761) + (#x8FDBB2 #x8764) + (#x8FDBB3 #x8765) + (#x8FDBB4 #x876F) + (#x8FDBB5 #x8771) + (#x8FDBB6 #x8772) + (#x8FDBB7 #x877B) + (#x8FDBB8 #x8783) + (#x8FDBB9 #x8784) + (#x8FDBBA #x8785) + (#x8FDBBB #x8786) + (#x8FDBBC #x8787) + (#x8FDBBD #x8788) + (#x8FDBBE #x8789) + (#x8FDBBF #x878B) + (#x8FDBC0 #x878C) + (#x8FDBC1 #x8790) + (#x8FDBC2 #x8793) + (#x8FDBC3 #x8795) + (#x8FDBC4 #x8797) + (#x8FDBC5 #x8798) + (#x8FDBC6 #x8799) + (#x8FDBC7 #x879E) + (#x8FDBC8 #x87A0) + (#x8FDBC9 #x87A3) + (#x8FDBCA #x87A7) + (#x8FDBCB #x87AC) + (#x8FDBCC #x87AD) + (#x8FDBCD #x87AE) + (#x8FDBCE #x87B1) + (#x8FDBCF #x87B5) + (#x8FDBD0 #x87BE) + (#x8FDBD1 #x87BF) + (#x8FDBD2 #x87C1) + (#x8FDBD3 #x87C8) + (#x8FDBD4 #x87C9) + (#x8FDBD5 #x87CA) + (#x8FDBD6 #x87CE) + (#x8FDBD7 #x87D5) + (#x8FDBD8 #x87D6) + (#x8FDBD9 #x87D9) + (#x8FDBDA #x87DA) + (#x8FDBDB #x87DC) + (#x8FDBDC #x87DF) + (#x8FDBDD #x87E2) + (#x8FDBDE #x87E3) + (#x8FDBDF #x87E4) + (#x8FDBE0 #x87EA) + (#x8FDBE1 #x87EB) + (#x8FDBE2 #x87ED) + (#x8FDBE3 #x87F1) + (#x8FDBE4 #x87F3) + (#x8FDBE5 #x87F8) + (#x8FDBE6 #x87FA) + (#x8FDBE7 #x87FF) + (#x8FDBE8 #x8801) + (#x8FDBE9 #x8803) + (#x8FDBEA #x8806) + (#x8FDBEB #x8809) + (#x8FDBEC #x880A) + (#x8FDBED #x880B) + (#x8FDBEE #x8810) + (#x8FDBEF #x8819) + (#x8FDBF0 #x8812) + (#x8FDBF1 #x8813) + (#x8FDBF2 #x8814) + (#x8FDBF3 #x8818) + (#x8FDBF4 #x881A) + (#x8FDBF5 #x881B) + (#x8FDBF6 #x881C) + (#x8FDBF7 #x881E) + (#x8FDBF8 #x881F) + (#x8FDBF9 #x8828) + (#x8FDBFA #x882D) + (#x8FDBFB #x882E) + (#x8FDBFC #x8830) + (#x8FDBFD #x8832) + (#x8FDBFE #x8835) + (#x8FDCA1 #x883A) + (#x8FDCA2 #x883C) + (#x8FDCA3 #x8841) + (#x8FDCA4 #x8843) + (#x8FDCA5 #x8845) + (#x8FDCA6 #x8848) + (#x8FDCA7 #x8849) + (#x8FDCA8 #x884A) + (#x8FDCA9 #x884B) + (#x8FDCAA #x884E) + (#x8FDCAB #x8851) + (#x8FDCAC #x8855) + (#x8FDCAD #x8856) + (#x8FDCAE #x8858) + (#x8FDCAF #x885A) + (#x8FDCB0 #x885C) + (#x8FDCB1 #x885F) + (#x8FDCB2 #x8860) + (#x8FDCB3 #x8864) + (#x8FDCB4 #x8869) + (#x8FDCB5 #x8871) + (#x8FDCB6 #x8879) + (#x8FDCB7 #x887B) + (#x8FDCB8 #x8880) + (#x8FDCB9 #x8898) + (#x8FDCBA #x889A) + (#x8FDCBB #x889B) + (#x8FDCBC #x889C) + (#x8FDCBD #x889F) + (#x8FDCBE #x88A0) + (#x8FDCBF #x88A8) + (#x8FDCC0 #x88AA) + (#x8FDCC1 #x88BA) + (#x8FDCC2 #x88BD) + (#x8FDCC3 #x88BE) + (#x8FDCC4 #x88C0) + (#x8FDCC5 #x88CA) + (#x8FDCC6 #x88CB) + (#x8FDCC7 #x88CC) + (#x8FDCC8 #x88CD) + (#x8FDCC9 #x88CE) + (#x8FDCCA #x88D1) + (#x8FDCCB #x88D2) + (#x8FDCCC #x88D3) + (#x8FDCCD #x88DB) + (#x8FDCCE #x88DE) + (#x8FDCCF #x88E7) + (#x8FDCD0 #x88EF) + (#x8FDCD1 #x88F0) + (#x8FDCD2 #x88F1) + (#x8FDCD3 #x88F5) + (#x8FDCD4 #x88F7) + (#x8FDCD5 #x8901) + (#x8FDCD6 #x8906) + (#x8FDCD7 #x890D) + (#x8FDCD8 #x890E) + (#x8FDCD9 #x890F) + (#x8FDCDA #x8915) + (#x8FDCDB #x8916) + (#x8FDCDC #x8918) + (#x8FDCDD #x8919) + (#x8FDCDE #x891A) + (#x8FDCDF #x891C) + (#x8FDCE0 #x8920) + (#x8FDCE1 #x8926) + (#x8FDCE2 #x8927) + (#x8FDCE3 #x8928) + (#x8FDCE4 #x8930) + (#x8FDCE5 #x8931) + (#x8FDCE6 #x8932) + (#x8FDCE7 #x8935) + (#x8FDCE8 #x8939) + (#x8FDCE9 #x893A) + (#x8FDCEA #x893E) + (#x8FDCEB #x8940) + (#x8FDCEC #x8942) + (#x8FDCED #x8945) + (#x8FDCEE #x8946) + (#x8FDCEF #x8949) + (#x8FDCF0 #x894F) + (#x8FDCF1 #x8952) + (#x8FDCF2 #x8957) + (#x8FDCF3 #x895A) + (#x8FDCF4 #x895B) + (#x8FDCF5 #x895C) + (#x8FDCF6 #x8961) + (#x8FDCF7 #x8962) + (#x8FDCF8 #x8963) + (#x8FDCF9 #x896B) + (#x8FDCFA #x896E) + (#x8FDCFB #x8970) + (#x8FDCFC #x8973) + (#x8FDCFD #x8975) + (#x8FDCFE #x897A) + (#x8FDDA1 #x897B) + (#x8FDDA2 #x897C) + (#x8FDDA3 #x897D) + (#x8FDDA4 #x8989) + (#x8FDDA5 #x898D) + (#x8FDDA6 #x8990) + (#x8FDDA7 #x8994) + (#x8FDDA8 #x8995) + (#x8FDDA9 #x899B) + (#x8FDDAA #x899C) + (#x8FDDAB #x899F) + (#x8FDDAC #x89A0) + (#x8FDDAD #x89A5) + (#x8FDDAE #x89B0) + (#x8FDDAF #x89B4) + (#x8FDDB0 #x89B5) + (#x8FDDB1 #x89B6) + (#x8FDDB2 #x89B7) + (#x8FDDB3 #x89BC) + (#x8FDDB4 #x89D4) + (#x8FDDB5 #x89D5) + (#x8FDDB6 #x89D6) + (#x8FDDB7 #x89D7) + (#x8FDDB8 #x89D8) + (#x8FDDB9 #x89E5) + (#x8FDDBA #x89E9) + (#x8FDDBB #x89EB) + (#x8FDDBC #x89ED) + (#x8FDDBD #x89F1) + (#x8FDDBE #x89F3) + (#x8FDDBF #x89F6) + (#x8FDDC0 #x89F9) + (#x8FDDC1 #x89FD) + (#x8FDDC2 #x89FF) + (#x8FDDC3 #x8A04) + (#x8FDDC4 #x8A05) + (#x8FDDC5 #x8A07) + (#x8FDDC6 #x8A0F) + (#x8FDDC7 #x8A11) + (#x8FDDC8 #x8A12) + (#x8FDDC9 #x8A14) + (#x8FDDCA #x8A15) + (#x8FDDCB #x8A1E) + (#x8FDDCC #x8A20) + (#x8FDDCD #x8A22) + (#x8FDDCE #x8A24) + (#x8FDDCF #x8A26) + (#x8FDDD0 #x8A2B) + (#x8FDDD1 #x8A2C) + (#x8FDDD2 #x8A2F) + (#x8FDDD3 #x8A35) + (#x8FDDD4 #x8A37) + (#x8FDDD5 #x8A3D) + (#x8FDDD6 #x8A3E) + (#x8FDDD7 #x8A40) + (#x8FDDD8 #x8A43) + (#x8FDDD9 #x8A45) + (#x8FDDDA #x8A47) + (#x8FDDDB #x8A49) + (#x8FDDDC #x8A4D) + (#x8FDDDD #x8A4E) + (#x8FDDDE #x8A53) + (#x8FDDDF #x8A56) + (#x8FDDE0 #x8A57) + (#x8FDDE1 #x8A58) + (#x8FDDE2 #x8A5C) + (#x8FDDE3 #x8A5D) + (#x8FDDE4 #x8A61) + (#x8FDDE5 #x8A65) + (#x8FDDE6 #x8A67) + (#x8FDDE7 #x8A75) + (#x8FDDE8 #x8A76) + (#x8FDDE9 #x8A77) + (#x8FDDEA #x8A79) + (#x8FDDEB #x8A7A) + (#x8FDDEC #x8A7B) + (#x8FDDED #x8A7E) + (#x8FDDEE #x8A7F) + (#x8FDDEF #x8A80) + (#x8FDDF0 #x8A83) + (#x8FDDF1 #x8A86) + (#x8FDDF2 #x8A8B) + (#x8FDDF3 #x8A8F) + (#x8FDDF4 #x8A90) + (#x8FDDF5 #x8A92) + (#x8FDDF6 #x8A96) + (#x8FDDF7 #x8A97) + (#x8FDDF8 #x8A99) + (#x8FDDF9 #x8A9F) + (#x8FDDFA #x8AA7) + (#x8FDDFB #x8AA9) + (#x8FDDFC #x8AAE) + (#x8FDDFD #x8AAF) + (#x8FDDFE #x8AB3) + (#x8FDEA1 #x8AB6) + (#x8FDEA2 #x8AB7) + (#x8FDEA3 #x8ABB) + (#x8FDEA4 #x8ABE) + (#x8FDEA5 #x8AC3) + (#x8FDEA6 #x8AC6) + (#x8FDEA7 #x8AC8) + (#x8FDEA8 #x8AC9) + (#x8FDEA9 #x8ACA) + (#x8FDEAA #x8AD1) + (#x8FDEAB #x8AD3) + (#x8FDEAC #x8AD4) + (#x8FDEAD #x8AD5) + (#x8FDEAE #x8AD7) + (#x8FDEAF #x8ADD) + (#x8FDEB0 #x8ADF) + (#x8FDEB1 #x8AEC) + (#x8FDEB2 #x8AF0) + (#x8FDEB3 #x8AF4) + (#x8FDEB4 #x8AF5) + (#x8FDEB5 #x8AF6) + (#x8FDEB6 #x8AFC) + (#x8FDEB7 #x8AFF) + (#x8FDEB8 #x8B05) + (#x8FDEB9 #x8B06) + (#x8FDEBA #x8B0B) + (#x8FDEBB #x8B11) + (#x8FDEBC #x8B1C) + (#x8FDEBD #x8B1E) + (#x8FDEBE #x8B1F) + (#x8FDEBF #x8B0A) + (#x8FDEC0 #x8B2D) + (#x8FDEC1 #x8B30) + (#x8FDEC2 #x8B37) + (#x8FDEC3 #x8B3C) + (#x8FDEC4 #x8B42) + (#x8FDEC5 #x8B43) + (#x8FDEC6 #x8B44) + (#x8FDEC7 #x8B45) + (#x8FDEC8 #x8B46) + (#x8FDEC9 #x8B48) + (#x8FDECA #x8B52) + (#x8FDECB #x8B53) + (#x8FDECC #x8B54) + (#x8FDECD #x8B59) + (#x8FDECE #x8B4D) + (#x8FDECF #x8B5E) + (#x8FDED0 #x8B63) + (#x8FDED1 #x8B6D) + (#x8FDED2 #x8B76) + (#x8FDED3 #x8B78) + (#x8FDED4 #x8B79) + (#x8FDED5 #x8B7C) + (#x8FDED6 #x8B7E) + (#x8FDED7 #x8B81) + (#x8FDED8 #x8B84) + (#x8FDED9 #x8B85) + (#x8FDEDA #x8B8B) + (#x8FDEDB #x8B8D) + (#x8FDEDC #x8B8F) + (#x8FDEDD #x8B94) + (#x8FDEDE #x8B95) + (#x8FDEDF #x8B9C) + (#x8FDEE0 #x8B9E) + (#x8FDEE1 #x8B9F) + (#x8FDEE2 #x8C38) + (#x8FDEE3 #x8C39) + (#x8FDEE4 #x8C3D) + (#x8FDEE5 #x8C3E) + (#x8FDEE6 #x8C45) + (#x8FDEE7 #x8C47) + (#x8FDEE8 #x8C49) + (#x8FDEE9 #x8C4B) + (#x8FDEEA #x8C4F) + (#x8FDEEB #x8C51) + (#x8FDEEC #x8C53) + (#x8FDEED #x8C54) + (#x8FDEEE #x8C57) + (#x8FDEEF #x8C58) + (#x8FDEF0 #x8C5B) + (#x8FDEF1 #x8C5D) + (#x8FDEF2 #x8C59) + (#x8FDEF3 #x8C63) + (#x8FDEF4 #x8C64) + (#x8FDEF5 #x8C66) + (#x8FDEF6 #x8C68) + (#x8FDEF7 #x8C69) + (#x8FDEF8 #x8C6D) + (#x8FDEF9 #x8C73) + (#x8FDEFA #x8C75) + (#x8FDEFB #x8C76) + (#x8FDEFC #x8C7B) + (#x8FDEFD #x8C7E) + (#x8FDEFE #x8C86) + (#x8FDFA1 #x8C87) + (#x8FDFA2 #x8C8B) + (#x8FDFA3 #x8C90) + (#x8FDFA4 #x8C92) + (#x8FDFA5 #x8C93) + (#x8FDFA6 #x8C99) + (#x8FDFA7 #x8C9B) + (#x8FDFA8 #x8C9C) + (#x8FDFA9 #x8CA4) + (#x8FDFAA #x8CB9) + (#x8FDFAB #x8CBA) + (#x8FDFAC #x8CC5) + (#x8FDFAD #x8CC6) + (#x8FDFAE #x8CC9) + (#x8FDFAF #x8CCB) + (#x8FDFB0 #x8CCF) + (#x8FDFB1 #x8CD6) + (#x8FDFB2 #x8CD5) + (#x8FDFB3 #x8CD9) + (#x8FDFB4 #x8CDD) + (#x8FDFB5 #x8CE1) + (#x8FDFB6 #x8CE8) + (#x8FDFB7 #x8CEC) + (#x8FDFB8 #x8CEF) + (#x8FDFB9 #x8CF0) + (#x8FDFBA #x8CF2) + (#x8FDFBB #x8CF5) + (#x8FDFBC #x8CF7) + (#x8FDFBD #x8CF8) + (#x8FDFBE #x8CFE) + (#x8FDFBF #x8CFF) + (#x8FDFC0 #x8D01) + (#x8FDFC1 #x8D03) + (#x8FDFC2 #x8D09) + (#x8FDFC3 #x8D12) + (#x8FDFC4 #x8D17) + (#x8FDFC5 #x8D1B) + (#x8FDFC6 #x8D65) + (#x8FDFC7 #x8D69) + (#x8FDFC8 #x8D6C) + (#x8FDFC9 #x8D6E) + (#x8FDFCA #x8D7F) + (#x8FDFCB #x8D82) + (#x8FDFCC #x8D84) + (#x8FDFCD #x8D88) + (#x8FDFCE #x8D8D) + (#x8FDFCF #x8D90) + (#x8FDFD0 #x8D91) + (#x8FDFD1 #x8D95) + (#x8FDFD2 #x8D9E) + (#x8FDFD3 #x8D9F) + (#x8FDFD4 #x8DA0) + (#x8FDFD5 #x8DA6) + (#x8FDFD6 #x8DAB) + (#x8FDFD7 #x8DAC) + (#x8FDFD8 #x8DAF) + (#x8FDFD9 #x8DB2) + (#x8FDFDA #x8DB5) + (#x8FDFDB #x8DB7) + (#x8FDFDC #x8DB9) + (#x8FDFDD #x8DBB) + (#x8FDFDE #x8DC0) + (#x8FDFDF #x8DC5) + (#x8FDFE0 #x8DC6) + (#x8FDFE1 #x8DC7) + (#x8FDFE2 #x8DC8) + (#x8FDFE3 #x8DCA) + (#x8FDFE4 #x8DCE) + (#x8FDFE5 #x8DD1) + (#x8FDFE6 #x8DD4) + (#x8FDFE7 #x8DD5) + (#x8FDFE8 #x8DD7) + (#x8FDFE9 #x8DD9) + (#x8FDFEA #x8DE4) + (#x8FDFEB #x8DE5) + (#x8FDFEC #x8DE7) + (#x8FDFED #x8DEC) + (#x8FDFEE #x8DF0) + (#x8FDFEF #x8DBC) + (#x8FDFF0 #x8DF1) + (#x8FDFF1 #x8DF2) + (#x8FDFF2 #x8DF4) + (#x8FDFF3 #x8DFD) + (#x8FDFF4 #x8E01) + (#x8FDFF5 #x8E04) + (#x8FDFF6 #x8E05) + (#x8FDFF7 #x8E06) + (#x8FDFF8 #x8E0B) + (#x8FDFF9 #x8E11) + (#x8FDFFA #x8E14) + (#x8FDFFB #x8E16) + (#x8FDFFC #x8E20) + (#x8FDFFD #x8E21) + (#x8FDFFE #x8E22) + (#x8FE0A1 #x8E23) + (#x8FE0A2 #x8E26) + (#x8FE0A3 #x8E27) + (#x8FE0A4 #x8E31) + (#x8FE0A5 #x8E33) + (#x8FE0A6 #x8E36) + (#x8FE0A7 #x8E37) + (#x8FE0A8 #x8E38) + (#x8FE0A9 #x8E39) + (#x8FE0AA #x8E3D) + (#x8FE0AB #x8E40) + (#x8FE0AC #x8E41) + (#x8FE0AD #x8E4B) + (#x8FE0AE #x8E4D) + (#x8FE0AF #x8E4E) + (#x8FE0B0 #x8E4F) + (#x8FE0B1 #x8E54) + (#x8FE0B2 #x8E5B) + (#x8FE0B3 #x8E5C) + (#x8FE0B4 #x8E5D) + (#x8FE0B5 #x8E5E) + (#x8FE0B6 #x8E61) + (#x8FE0B7 #x8E62) + (#x8FE0B8 #x8E69) + (#x8FE0B9 #x8E6C) + (#x8FE0BA #x8E6D) + (#x8FE0BB #x8E6F) + (#x8FE0BC #x8E70) + (#x8FE0BD #x8E71) + (#x8FE0BE #x8E79) + (#x8FE0BF #x8E7A) + (#x8FE0C0 #x8E7B) + (#x8FE0C1 #x8E82) + (#x8FE0C2 #x8E83) + (#x8FE0C3 #x8E89) + (#x8FE0C4 #x8E90) + (#x8FE0C5 #x8E92) + (#x8FE0C6 #x8E95) + (#x8FE0C7 #x8E9A) + (#x8FE0C8 #x8E9B) + (#x8FE0C9 #x8E9D) + (#x8FE0CA #x8E9E) + (#x8FE0CB #x8EA2) + (#x8FE0CC #x8EA7) + (#x8FE0CD #x8EA9) + (#x8FE0CE #x8EAD) + (#x8FE0CF #x8EAE) + (#x8FE0D0 #x8EB3) + (#x8FE0D1 #x8EB5) + (#x8FE0D2 #x8EBA) + (#x8FE0D3 #x8EBB) + (#x8FE0D4 #x8EC0) + (#x8FE0D5 #x8EC1) + (#x8FE0D6 #x8EC3) + (#x8FE0D7 #x8EC4) + (#x8FE0D8 #x8EC7) + (#x8FE0D9 #x8ECF) + (#x8FE0DA #x8ED1) + (#x8FE0DB #x8ED4) + (#x8FE0DC #x8EDC) + (#x8FE0DD #x8EE8) + (#x8FE0DE #x8EEE) + (#x8FE0DF #x8EF0) + (#x8FE0E0 #x8EF1) + (#x8FE0E1 #x8EF7) + (#x8FE0E2 #x8EF9) + (#x8FE0E3 #x8EFA) + (#x8FE0E4 #x8EED) + (#x8FE0E5 #x8F00) + (#x8FE0E6 #x8F02) + (#x8FE0E7 #x8F07) + (#x8FE0E8 #x8F08) + (#x8FE0E9 #x8F0F) + (#x8FE0EA #x8F10) + (#x8FE0EB #x8F16) + (#x8FE0EC #x8F17) + (#x8FE0ED #x8F18) + (#x8FE0EE #x8F1E) + (#x8FE0EF #x8F20) + (#x8FE0F0 #x8F21) + (#x8FE0F1 #x8F23) + (#x8FE0F2 #x8F25) + (#x8FE0F3 #x8F27) + (#x8FE0F4 #x8F28) + (#x8FE0F5 #x8F2C) + (#x8FE0F6 #x8F2D) + (#x8FE0F7 #x8F2E) + (#x8FE0F8 #x8F34) + (#x8FE0F9 #x8F35) + (#x8FE0FA #x8F36) + (#x8FE0FB #x8F37) + (#x8FE0FC #x8F3A) + (#x8FE0FD #x8F40) + (#x8FE0FE #x8F41) + (#x8FE1A1 #x8F43) + (#x8FE1A2 #x8F47) + (#x8FE1A3 #x8F4F) + (#x8FE1A4 #x8F51) + (#x8FE1A5 #x8F52) + (#x8FE1A6 #x8F53) + (#x8FE1A7 #x8F54) + (#x8FE1A8 #x8F55) + (#x8FE1A9 #x8F58) + (#x8FE1AA #x8F5D) + (#x8FE1AB #x8F5E) + (#x8FE1AC #x8F65) + (#x8FE1AD #x8F9D) + (#x8FE1AE #x8FA0) + (#x8FE1AF #x8FA1) + (#x8FE1B0 #x8FA4) + (#x8FE1B1 #x8FA5) + (#x8FE1B2 #x8FA6) + (#x8FE1B3 #x8FB5) + (#x8FE1B4 #x8FB6) + (#x8FE1B5 #x8FB8) + (#x8FE1B6 #x8FBE) + (#x8FE1B7 #x8FC0) + (#x8FE1B8 #x8FC1) + (#x8FE1B9 #x8FC6) + (#x8FE1BA #x8FCA) + (#x8FE1BB #x8FCB) + (#x8FE1BC #x8FCD) + (#x8FE1BD #x8FD0) + (#x8FE1BE #x8FD2) + (#x8FE1BF #x8FD3) + (#x8FE1C0 #x8FD5) + (#x8FE1C1 #x8FE0) + (#x8FE1C2 #x8FE3) + (#x8FE1C3 #x8FE4) + (#x8FE1C4 #x8FE8) + (#x8FE1C5 #x8FEE) + (#x8FE1C6 #x8FF1) + (#x8FE1C7 #x8FF5) + (#x8FE1C8 #x8FF6) + (#x8FE1C9 #x8FFB) + (#x8FE1CA #x8FFE) + (#x8FE1CB #x9002) + (#x8FE1CC #x9004) + (#x8FE1CD #x9008) + (#x8FE1CE #x900C) + (#x8FE1CF #x9018) + (#x8FE1D0 #x901B) + (#x8FE1D1 #x9028) + (#x8FE1D2 #x9029) + (#x8FE1D3 #x902F) + (#x8FE1D4 #x902A) + (#x8FE1D5 #x902C) + (#x8FE1D6 #x902D) + (#x8FE1D7 #x9033) + (#x8FE1D8 #x9034) + (#x8FE1D9 #x9037) + (#x8FE1DA #x903F) + (#x8FE1DB #x9043) + (#x8FE1DC #x9044) + (#x8FE1DD #x904C) + (#x8FE1DE #x905B) + (#x8FE1DF #x905D) + (#x8FE1E0 #x9062) + (#x8FE1E1 #x9066) + (#x8FE1E2 #x9067) + (#x8FE1E3 #x906C) + (#x8FE1E4 #x9070) + (#x8FE1E5 #x9074) + (#x8FE1E6 #x9079) + (#x8FE1E7 #x9085) + (#x8FE1E8 #x9088) + (#x8FE1E9 #x908B) + (#x8FE1EA #x908C) + (#x8FE1EB #x908E) + (#x8FE1EC #x9090) + (#x8FE1ED #x9095) + (#x8FE1EE #x9097) + (#x8FE1EF #x9098) + (#x8FE1F0 #x9099) + (#x8FE1F1 #x909B) + (#x8FE1F2 #x90A0) + (#x8FE1F3 #x90A1) + (#x8FE1F4 #x90A2) + (#x8FE1F5 #x90A5) + (#x8FE1F6 #x90B0) + (#x8FE1F7 #x90B2) + (#x8FE1F8 #x90B3) + (#x8FE1F9 #x90B4) + (#x8FE1FA #x90B6) + (#x8FE1FB #x90BD) + (#x8FE1FC #x90CC) + (#x8FE1FD #x90BE) + (#x8FE1FE #x90C3) + (#x8FE2A1 #x90C4) + (#x8FE2A2 #x90C5) + (#x8FE2A3 #x90C7) + (#x8FE2A4 #x90C8) + (#x8FE2A5 #x90D5) + (#x8FE2A6 #x90D7) + (#x8FE2A7 #x90D8) + (#x8FE2A8 #x90D9) + (#x8FE2A9 #x90DC) + (#x8FE2AA #x90DD) + (#x8FE2AB #x90DF) + (#x8FE2AC #x90E5) + (#x8FE2AD #x90D2) + (#x8FE2AE #x90F6) + (#x8FE2AF #x90EB) + (#x8FE2B0 #x90EF) + (#x8FE2B1 #x90F0) + (#x8FE2B2 #x90F4) + (#x8FE2B3 #x90FE) + (#x8FE2B4 #x90FF) + (#x8FE2B5 #x9100) + (#x8FE2B6 #x9104) + (#x8FE2B7 #x9105) + (#x8FE2B8 #x9106) + (#x8FE2B9 #x9108) + (#x8FE2BA #x910D) + (#x8FE2BB #x9110) + (#x8FE2BC #x9114) + (#x8FE2BD #x9116) + (#x8FE2BE #x9117) + (#x8FE2BF #x9118) + (#x8FE2C0 #x911A) + (#x8FE2C1 #x911C) + (#x8FE2C2 #x911E) + (#x8FE2C3 #x9120) + (#x8FE2C4 #x9125) + (#x8FE2C5 #x9122) + (#x8FE2C6 #x9123) + (#x8FE2C7 #x9127) + (#x8FE2C8 #x9129) + (#x8FE2C9 #x912E) + (#x8FE2CA #x912F) + (#x8FE2CB #x9131) + (#x8FE2CC #x9134) + (#x8FE2CD #x9136) + (#x8FE2CE #x9137) + (#x8FE2CF #x9139) + (#x8FE2D0 #x913A) + (#x8FE2D1 #x913C) + (#x8FE2D2 #x913D) + (#x8FE2D3 #x9143) + (#x8FE2D4 #x9147) + (#x8FE2D5 #x9148) + (#x8FE2D6 #x914F) + (#x8FE2D7 #x9153) + (#x8FE2D8 #x9157) + (#x8FE2D9 #x9159) + (#x8FE2DA #x915A) + (#x8FE2DB #x915B) + (#x8FE2DC #x9161) + (#x8FE2DD #x9164) + (#x8FE2DE #x9167) + (#x8FE2DF #x916D) + (#x8FE2E0 #x9174) + (#x8FE2E1 #x9179) + (#x8FE2E2 #x917A) + (#x8FE2E3 #x917B) + (#x8FE2E4 #x9181) + (#x8FE2E5 #x9183) + (#x8FE2E6 #x9185) + (#x8FE2E7 #x9186) + (#x8FE2E8 #x918A) + (#x8FE2E9 #x918E) + (#x8FE2EA #x9191) + (#x8FE2EB #x9193) + (#x8FE2EC #x9194) + (#x8FE2ED #x9195) + (#x8FE2EE #x9198) + (#x8FE2EF #x919E) + (#x8FE2F0 #x91A1) + (#x8FE2F1 #x91A6) + (#x8FE2F2 #x91A8) + (#x8FE2F3 #x91AC) + (#x8FE2F4 #x91AD) + (#x8FE2F5 #x91AE) + (#x8FE2F6 #x91B0) + (#x8FE2F7 #x91B1) + (#x8FE2F8 #x91B2) + (#x8FE2F9 #x91B3) + (#x8FE2FA #x91B6) + (#x8FE2FB #x91BB) + (#x8FE2FC #x91BC) + (#x8FE2FD #x91BD) + (#x8FE2FE #x91BF) + (#x8FE3A1 #x91C2) + (#x8FE3A2 #x91C3) + (#x8FE3A3 #x91C5) + (#x8FE3A4 #x91D3) + (#x8FE3A5 #x91D4) + (#x8FE3A6 #x91D7) + (#x8FE3A7 #x91D9) + (#x8FE3A8 #x91DA) + (#x8FE3A9 #x91DE) + (#x8FE3AA #x91E4) + (#x8FE3AB #x91E5) + (#x8FE3AC #x91E9) + (#x8FE3AD #x91EA) + (#x8FE3AE #x91EC) + (#x8FE3AF #x91ED) + (#x8FE3B0 #x91EE) + (#x8FE3B1 #x91EF) + (#x8FE3B2 #x91F0) + (#x8FE3B3 #x91F1) + (#x8FE3B4 #x91F7) + (#x8FE3B5 #x91F9) + (#x8FE3B6 #x91FB) + (#x8FE3B7 #x91FD) + (#x8FE3B8 #x9200) + (#x8FE3B9 #x9201) + (#x8FE3BA #x9204) + (#x8FE3BB #x9205) + (#x8FE3BC #x9206) + (#x8FE3BD #x9207) + (#x8FE3BE #x9209) + (#x8FE3BF #x920A) + (#x8FE3C0 #x920C) + (#x8FE3C1 #x9210) + (#x8FE3C2 #x9212) + (#x8FE3C3 #x9213) + (#x8FE3C4 #x9216) + (#x8FE3C5 #x9218) + (#x8FE3C6 #x921C) + (#x8FE3C7 #x921D) + (#x8FE3C8 #x9223) + (#x8FE3C9 #x9224) + (#x8FE3CA #x9225) + (#x8FE3CB #x9226) + (#x8FE3CC #x9228) + (#x8FE3CD #x922E) + (#x8FE3CE #x922F) + (#x8FE3CF #x9230) + (#x8FE3D0 #x9233) + (#x8FE3D1 #x9235) + (#x8FE3D2 #x9236) + (#x8FE3D3 #x9238) + (#x8FE3D4 #x9239) + (#x8FE3D5 #x923A) + (#x8FE3D6 #x923C) + (#x8FE3D7 #x923E) + (#x8FE3D8 #x9240) + (#x8FE3D9 #x9242) + (#x8FE3DA #x9243) + (#x8FE3DB #x9246) + (#x8FE3DC #x9247) + (#x8FE3DD #x924A) + (#x8FE3DE #x924D) + (#x8FE3DF #x924E) + (#x8FE3E0 #x924F) + (#x8FE3E1 #x9251) + (#x8FE3E2 #x9258) + (#x8FE3E3 #x9259) + (#x8FE3E4 #x925C) + (#x8FE3E5 #x925D) + (#x8FE3E6 #x9260) + (#x8FE3E7 #x9261) + (#x8FE3E8 #x9265) + (#x8FE3E9 #x9267) + (#x8FE3EA #x9268) + (#x8FE3EB #x9269) + (#x8FE3EC #x926E) + (#x8FE3ED #x926F) + (#x8FE3EE #x9270) + (#x8FE3EF #x9275) + (#x8FE3F0 #x9276) + (#x8FE3F1 #x9277) + (#x8FE3F2 #x9278) + (#x8FE3F3 #x9279) + (#x8FE3F4 #x927B) + (#x8FE3F5 #x927C) + (#x8FE3F6 #x927D) + (#x8FE3F7 #x927F) + (#x8FE3F8 #x9288) + (#x8FE3F9 #x9289) + (#x8FE3FA #x928A) + (#x8FE3FB #x928D) + (#x8FE3FC #x928E) + (#x8FE3FD #x9292) + (#x8FE3FE #x9297) + (#x8FE4A1 #x9299) + (#x8FE4A2 #x929F) + (#x8FE4A3 #x92A0) + (#x8FE4A4 #x92A4) + (#x8FE4A5 #x92A5) + (#x8FE4A6 #x92A7) + (#x8FE4A7 #x92A8) + (#x8FE4A8 #x92AB) + (#x8FE4A9 #x92AF) + (#x8FE4AA #x92B2) + (#x8FE4AB #x92B6) + (#x8FE4AC #x92B8) + (#x8FE4AD #x92BA) + (#x8FE4AE #x92BB) + (#x8FE4AF #x92BC) + (#x8FE4B0 #x92BD) + (#x8FE4B1 #x92BF) + (#x8FE4B2 #x92C0) + (#x8FE4B3 #x92C1) + (#x8FE4B4 #x92C2) + (#x8FE4B5 #x92C3) + (#x8FE4B6 #x92C5) + (#x8FE4B7 #x92C6) + (#x8FE4B8 #x92C7) + (#x8FE4B9 #x92C8) + (#x8FE4BA #x92CB) + (#x8FE4BB #x92CC) + (#x8FE4BC #x92CD) + (#x8FE4BD #x92CE) + (#x8FE4BE #x92D0) + (#x8FE4BF #x92D3) + (#x8FE4C0 #x92D5) + (#x8FE4C1 #x92D7) + (#x8FE4C2 #x92D8) + (#x8FE4C3 #x92D9) + (#x8FE4C4 #x92DC) + (#x8FE4C5 #x92DD) + (#x8FE4C6 #x92DF) + (#x8FE4C7 #x92E0) + (#x8FE4C8 #x92E1) + (#x8FE4C9 #x92E3) + (#x8FE4CA #x92E5) + (#x8FE4CB #x92E7) + (#x8FE4CC #x92E8) + (#x8FE4CD #x92EC) + (#x8FE4CE #x92EE) + (#x8FE4CF #x92F0) + (#x8FE4D0 #x92F9) + (#x8FE4D1 #x92FB) + (#x8FE4D2 #x92FF) + (#x8FE4D3 #x9300) + (#x8FE4D4 #x9302) + (#x8FE4D5 #x9308) + (#x8FE4D6 #x930D) + (#x8FE4D7 #x9311) + (#x8FE4D8 #x9314) + (#x8FE4D9 #x9315) + (#x8FE4DA #x931C) + (#x8FE4DB #x931D) + (#x8FE4DC #x931E) + (#x8FE4DD #x931F) + (#x8FE4DE #x9321) + (#x8FE4DF #x9324) + (#x8FE4E0 #x9325) + (#x8FE4E1 #x9327) + (#x8FE4E2 #x9329) + (#x8FE4E3 #x932A) + (#x8FE4E4 #x9333) + (#x8FE4E5 #x9334) + (#x8FE4E6 #x9336) + (#x8FE4E7 #x9337) + (#x8FE4E8 #x9347) + (#x8FE4E9 #x9348) + (#x8FE4EA #x9349) + (#x8FE4EB #x9350) + (#x8FE4EC #x9351) + (#x8FE4ED #x9352) + (#x8FE4EE #x9355) + (#x8FE4EF #x9357) + (#x8FE4F0 #x9358) + (#x8FE4F1 #x935A) + (#x8FE4F2 #x935E) + (#x8FE4F3 #x9364) + (#x8FE4F4 #x9365) + (#x8FE4F5 #x9367) + (#x8FE4F6 #x9369) + (#x8FE4F7 #x936A) + (#x8FE4F8 #x936D) + (#x8FE4F9 #x936F) + (#x8FE4FA #x9370) + (#x8FE4FB #x9371) + (#x8FE4FC #x9373) + (#x8FE4FD #x9374) + (#x8FE4FE #x9376) + (#x8FE5A1 #x937A) + (#x8FE5A2 #x937D) + (#x8FE5A3 #x937F) + (#x8FE5A4 #x9380) + (#x8FE5A5 #x9381) + (#x8FE5A6 #x9382) + (#x8FE5A7 #x9388) + (#x8FE5A8 #x938A) + (#x8FE5A9 #x938B) + (#x8FE5AA #x938D) + (#x8FE5AB #x938F) + (#x8FE5AC #x9392) + (#x8FE5AD #x9395) + (#x8FE5AE #x9398) + (#x8FE5AF #x939B) + (#x8FE5B0 #x939E) + (#x8FE5B1 #x93A1) + (#x8FE5B2 #x93A3) + (#x8FE5B3 #x93A4) + (#x8FE5B4 #x93A6) + (#x8FE5B5 #x93A8) + (#x8FE5B6 #x93AB) + (#x8FE5B7 #x93B4) + (#x8FE5B8 #x93B5) + (#x8FE5B9 #x93B6) + (#x8FE5BA #x93BA) + (#x8FE5BB #x93A9) + (#x8FE5BC #x93C1) + (#x8FE5BD #x93C4) + (#x8FE5BE #x93C5) + (#x8FE5BF #x93C6) + (#x8FE5C0 #x93C7) + (#x8FE5C1 #x93C9) + (#x8FE5C2 #x93CA) + (#x8FE5C3 #x93CB) + (#x8FE5C4 #x93CC) + (#x8FE5C5 #x93CD) + (#x8FE5C6 #x93D3) + (#x8FE5C7 #x93D9) + (#x8FE5C8 #x93DC) + (#x8FE5C9 #x93DE) + (#x8FE5CA #x93DF) + (#x8FE5CB #x93E2) + (#x8FE5CC #x93E6) + (#x8FE5CD #x93E7) + (#x8FE5CE #x93F9) + (#x8FE5CF #x93F7) + (#x8FE5D0 #x93F8) + (#x8FE5D1 #x93FA) + (#x8FE5D2 #x93FB) + (#x8FE5D3 #x93FD) + (#x8FE5D4 #x9401) + (#x8FE5D5 #x9402) + (#x8FE5D6 #x9404) + (#x8FE5D7 #x9408) + (#x8FE5D8 #x9409) + (#x8FE5D9 #x940D) + (#x8FE5DA #x940E) + (#x8FE5DB #x940F) + (#x8FE5DC #x9415) + (#x8FE5DD #x9416) + (#x8FE5DE #x9417) + (#x8FE5DF #x941F) + (#x8FE5E0 #x942E) + (#x8FE5E1 #x942F) + (#x8FE5E2 #x9431) + (#x8FE5E3 #x9432) + (#x8FE5E4 #x9433) + (#x8FE5E5 #x9434) + (#x8FE5E6 #x943B) + (#x8FE5E7 #x943F) + (#x8FE5E8 #x943D) + (#x8FE5E9 #x9443) + (#x8FE5EA #x9445) + (#x8FE5EB #x9448) + (#x8FE5EC #x944A) + (#x8FE5ED #x944C) + (#x8FE5EE #x9455) + (#x8FE5EF #x9459) + (#x8FE5F0 #x945C) + (#x8FE5F1 #x945F) + (#x8FE5F2 #x9461) + (#x8FE5F3 #x9463) + (#x8FE5F4 #x9468) + (#x8FE5F5 #x946B) + (#x8FE5F6 #x946D) + (#x8FE5F7 #x946E) + (#x8FE5F8 #x946F) + (#x8FE5F9 #x9471) + (#x8FE5FA #x9472) + (#x8FE5FB #x9484) + (#x8FE5FC #x9483) + (#x8FE5FD #x9578) + (#x8FE5FE #x9579) + (#x8FE6A1 #x957E) + (#x8FE6A2 #x9584) + (#x8FE6A3 #x9588) + (#x8FE6A4 #x958C) + (#x8FE6A5 #x958D) + (#x8FE6A6 #x958E) + (#x8FE6A7 #x959D) + (#x8FE6A8 #x959E) + (#x8FE6A9 #x959F) + (#x8FE6AA #x95A1) + (#x8FE6AB #x95A6) + (#x8FE6AC #x95A9) + (#x8FE6AD #x95AB) + (#x8FE6AE #x95AC) + (#x8FE6AF #x95B4) + (#x8FE6B0 #x95B6) + (#x8FE6B1 #x95BA) + (#x8FE6B2 #x95BD) + (#x8FE6B3 #x95BF) + (#x8FE6B4 #x95C6) + (#x8FE6B5 #x95C8) + (#x8FE6B6 #x95C9) + (#x8FE6B7 #x95CB) + (#x8FE6B8 #x95D0) + (#x8FE6B9 #x95D1) + (#x8FE6BA #x95D2) + (#x8FE6BB #x95D3) + (#x8FE6BC #x95D9) + (#x8FE6BD #x95DA) + (#x8FE6BE #x95DD) + (#x8FE6BF #x95DE) + (#x8FE6C0 #x95DF) + (#x8FE6C1 #x95E0) + (#x8FE6C2 #x95E4) + (#x8FE6C3 #x95E6) + (#x8FE6C4 #x961D) + (#x8FE6C5 #x961E) + (#x8FE6C6 #x9622) + (#x8FE6C7 #x9624) + (#x8FE6C8 #x9625) + (#x8FE6C9 #x9626) + (#x8FE6CA #x962C) + (#x8FE6CB #x9631) + (#x8FE6CC #x9633) + (#x8FE6CD #x9637) + (#x8FE6CE #x9638) + (#x8FE6CF #x9639) + (#x8FE6D0 #x963A) + (#x8FE6D1 #x963C) + (#x8FE6D2 #x963D) + (#x8FE6D3 #x9641) + (#x8FE6D4 #x9652) + (#x8FE6D5 #x9654) + (#x8FE6D6 #x9656) + (#x8FE6D7 #x9657) + (#x8FE6D8 #x9658) + (#x8FE6D9 #x9661) + (#x8FE6DA #x966E) + (#x8FE6DB #x9674) + (#x8FE6DC #x967B) + (#x8FE6DD #x967C) + (#x8FE6DE #x967E) + (#x8FE6DF #x967F) + (#x8FE6E0 #x9681) + (#x8FE6E1 #x9682) + (#x8FE6E2 #x9683) + (#x8FE6E3 #x9684) + (#x8FE6E4 #x9689) + (#x8FE6E5 #x9691) + (#x8FE6E6 #x9696) + (#x8FE6E7 #x969A) + (#x8FE6E8 #x969D) + (#x8FE6E9 #x969F) + (#x8FE6EA #x96A4) + (#x8FE6EB #x96A5) + (#x8FE6EC #x96A6) + (#x8FE6ED #x96A9) + (#x8FE6EE #x96AE) + (#x8FE6EF #x96AF) + (#x8FE6F0 #x96B3) + (#x8FE6F1 #x96BA) + (#x8FE6F2 #x96CA) + (#x8FE6F3 #x96D2) + (#x8FE6F4 #x5DB2) + (#x8FE6F5 #x96D8) + (#x8FE6F6 #x96DA) + (#x8FE6F7 #x96DD) + (#x8FE6F8 #x96DE) + (#x8FE6F9 #x96DF) + (#x8FE6FA #x96E9) + (#x8FE6FB #x96EF) + (#x8FE6FC #x96F1) + (#x8FE6FD #x96FA) + (#x8FE6FE #x9702) + (#x8FE7A1 #x9703) + (#x8FE7A2 #x9705) + (#x8FE7A3 #x9709) + (#x8FE7A4 #x971A) + (#x8FE7A5 #x971B) + (#x8FE7A6 #x971D) + (#x8FE7A7 #x9721) + (#x8FE7A8 #x9722) + (#x8FE7A9 #x9723) + (#x8FE7AA #x9728) + (#x8FE7AB #x9731) + (#x8FE7AC #x9733) + (#x8FE7AD #x9741) + (#x8FE7AE #x9743) + (#x8FE7AF #x974A) + (#x8FE7B0 #x974E) + (#x8FE7B1 #x974F) + (#x8FE7B2 #x9755) + (#x8FE7B3 #x9757) + (#x8FE7B4 #x9758) + (#x8FE7B5 #x975A) + (#x8FE7B6 #x975B) + (#x8FE7B7 #x9763) + (#x8FE7B8 #x9767) + (#x8FE7B9 #x976A) + (#x8FE7BA #x976E) + (#x8FE7BB #x9773) + (#x8FE7BC #x9776) + (#x8FE7BD #x9777) + (#x8FE7BE #x9778) + (#x8FE7BF #x977B) + (#x8FE7C0 #x977D) + (#x8FE7C1 #x977F) + (#x8FE7C2 #x9780) + (#x8FE7C3 #x9789) + (#x8FE7C4 #x9795) + (#x8FE7C5 #x9796) + (#x8FE7C6 #x9797) + (#x8FE7C7 #x9799) + (#x8FE7C8 #x979A) + (#x8FE7C9 #x979E) + (#x8FE7CA #x979F) + (#x8FE7CB #x97A2) + (#x8FE7CC #x97AC) + (#x8FE7CD #x97AE) + (#x8FE7CE #x97B1) + (#x8FE7CF #x97B2) + (#x8FE7D0 #x97B5) + (#x8FE7D1 #x97B6) + (#x8FE7D2 #x97B8) + (#x8FE7D3 #x97B9) + (#x8FE7D4 #x97BA) + (#x8FE7D5 #x97BC) + (#x8FE7D6 #x97BE) + (#x8FE7D7 #x97BF) + (#x8FE7D8 #x97C1) + (#x8FE7D9 #x97C4) + (#x8FE7DA #x97C5) + (#x8FE7DB #x97C7) + (#x8FE7DC #x97C9) + (#x8FE7DD #x97CA) + (#x8FE7DE #x97CC) + (#x8FE7DF #x97CD) + (#x8FE7E0 #x97CE) + (#x8FE7E1 #x97D0) + (#x8FE7E2 #x97D1) + (#x8FE7E3 #x97D4) + (#x8FE7E4 #x97D7) + (#x8FE7E5 #x97D8) + (#x8FE7E6 #x97D9) + (#x8FE7E7 #x97DD) + (#x8FE7E8 #x97DE) + (#x8FE7E9 #x97E0) + (#x8FE7EA #x97DB) + (#x8FE7EB #x97E1) + (#x8FE7EC #x97E4) + (#x8FE7ED #x97EF) + (#x8FE7EE #x97F1) + (#x8FE7EF #x97F4) + (#x8FE7F0 #x97F7) + (#x8FE7F1 #x97F8) + (#x8FE7F2 #x97FA) + (#x8FE7F3 #x9807) + (#x8FE7F4 #x980A) + (#x8FE7F5 #x9819) + (#x8FE7F6 #x980D) + (#x8FE7F7 #x980E) + (#x8FE7F8 #x9814) + (#x8FE7F9 #x9816) + (#x8FE7FA #x981C) + (#x8FE7FB #x981E) + (#x8FE7FC #x9820) + (#x8FE7FD #x9823) + (#x8FE7FE #x9826) + (#x8FE8A1 #x982B) + (#x8FE8A2 #x982E) + (#x8FE8A3 #x982F) + (#x8FE8A4 #x9830) + (#x8FE8A5 #x9832) + (#x8FE8A6 #x9833) + (#x8FE8A7 #x9835) + (#x8FE8A8 #x9825) + (#x8FE8A9 #x983E) + (#x8FE8AA #x9844) + (#x8FE8AB #x9847) + (#x8FE8AC #x984A) + (#x8FE8AD #x9851) + (#x8FE8AE #x9852) + (#x8FE8AF #x9853) + (#x8FE8B0 #x9856) + (#x8FE8B1 #x9857) + (#x8FE8B2 #x9859) + (#x8FE8B3 #x985A) + (#x8FE8B4 #x9862) + (#x8FE8B5 #x9863) + (#x8FE8B6 #x9865) + (#x8FE8B7 #x9866) + (#x8FE8B8 #x986A) + (#x8FE8B9 #x986C) + (#x8FE8BA #x98AB) + (#x8FE8BB #x98AD) + (#x8FE8BC #x98AE) + (#x8FE8BD #x98B0) + (#x8FE8BE #x98B4) + (#x8FE8BF #x98B7) + (#x8FE8C0 #x98B8) + (#x8FE8C1 #x98BA) + (#x8FE8C2 #x98BB) + (#x8FE8C3 #x98BF) + (#x8FE8C4 #x98C2) + (#x8FE8C5 #x98C5) + (#x8FE8C6 #x98C8) + (#x8FE8C7 #x98CC) + (#x8FE8C8 #x98E1) + (#x8FE8C9 #x98E3) + (#x8FE8CA #x98E5) + (#x8FE8CB #x98E6) + (#x8FE8CC #x98E7) + (#x8FE8CD #x98EA) + (#x8FE8CE #x98F3) + (#x8FE8CF #x98F6) + (#x8FE8D0 #x9902) + (#x8FE8D1 #x9907) + (#x8FE8D2 #x9908) + (#x8FE8D3 #x9911) + (#x8FE8D4 #x9915) + (#x8FE8D5 #x9916) + (#x8FE8D6 #x9917) + (#x8FE8D7 #x991A) + (#x8FE8D8 #x991B) + (#x8FE8D9 #x991C) + (#x8FE8DA #x991F) + (#x8FE8DB #x9922) + (#x8FE8DC #x9926) + (#x8FE8DD #x9927) + (#x8FE8DE #x992B) + (#x8FE8DF #x9931) + (#x8FE8E0 #x9932) + (#x8FE8E1 #x9933) + (#x8FE8E2 #x9934) + (#x8FE8E3 #x9935) + (#x8FE8E4 #x9939) + (#x8FE8E5 #x993A) + (#x8FE8E6 #x993B) + (#x8FE8E7 #x993C) + (#x8FE8E8 #x9940) + (#x8FE8E9 #x9941) + (#x8FE8EA #x9946) + (#x8FE8EB #x9947) + (#x8FE8EC #x9948) + (#x8FE8ED #x994D) + (#x8FE8EE #x994E) + (#x8FE8EF #x9954) + (#x8FE8F0 #x9958) + (#x8FE8F1 #x9959) + (#x8FE8F2 #x995B) + (#x8FE8F3 #x995C) + (#x8FE8F4 #x995E) + (#x8FE8F5 #x995F) + (#x8FE8F6 #x9960) + (#x8FE8F7 #x999B) + (#x8FE8F8 #x999D) + (#x8FE8F9 #x999F) + (#x8FE8FA #x99A6) + (#x8FE8FB #x99B0) + (#x8FE8FC #x99B1) + (#x8FE8FD #x99B2) + (#x8FE8FE #x99B5) + (#x8FE9A1 #x99B9) + (#x8FE9A2 #x99BA) + (#x8FE9A3 #x99BD) + (#x8FE9A4 #x99BF) + (#x8FE9A5 #x99C3) + (#x8FE9A6 #x99C9) + (#x8FE9A7 #x99D3) + (#x8FE9A8 #x99D4) + (#x8FE9A9 #x99D9) + (#x8FE9AA #x99DA) + (#x8FE9AB #x99DC) + (#x8FE9AC #x99DE) + (#x8FE9AD #x99E7) + (#x8FE9AE #x99EA) + (#x8FE9AF #x99EB) + (#x8FE9B0 #x99EC) + (#x8FE9B1 #x99F0) + (#x8FE9B2 #x99F4) + (#x8FE9B3 #x99F5) + (#x8FE9B4 #x99F9) + (#x8FE9B5 #x99FD) + (#x8FE9B6 #x99FE) + (#x8FE9B7 #x9A02) + (#x8FE9B8 #x9A03) + (#x8FE9B9 #x9A04) + (#x8FE9BA #x9A0B) + (#x8FE9BB #x9A0C) + (#x8FE9BC #x9A10) + (#x8FE9BD #x9A11) + (#x8FE9BE #x9A16) + (#x8FE9BF #x9A1E) + (#x8FE9C0 #x9A20) + (#x8FE9C1 #x9A22) + (#x8FE9C2 #x9A23) + (#x8FE9C3 #x9A24) + (#x8FE9C4 #x9A27) + (#x8FE9C5 #x9A2D) + (#x8FE9C6 #x9A2E) + (#x8FE9C7 #x9A33) + (#x8FE9C8 #x9A35) + (#x8FE9C9 #x9A36) + (#x8FE9CA #x9A38) + (#x8FE9CB #x9A47) + (#x8FE9CC #x9A41) + (#x8FE9CD #x9A44) + (#x8FE9CE #x9A4A) + (#x8FE9CF #x9A4B) + (#x8FE9D0 #x9A4C) + (#x8FE9D1 #x9A4E) + (#x8FE9D2 #x9A51) + (#x8FE9D3 #x9A54) + (#x8FE9D4 #x9A56) + (#x8FE9D5 #x9A5D) + (#x8FE9D6 #x9AAA) + (#x8FE9D7 #x9AAC) + (#x8FE9D8 #x9AAE) + (#x8FE9D9 #x9AAF) + (#x8FE9DA #x9AB2) + (#x8FE9DB #x9AB4) + (#x8FE9DC #x9AB5) + (#x8FE9DD #x9AB6) + (#x8FE9DE #x9AB9) + (#x8FE9DF #x9ABB) + (#x8FE9E0 #x9ABE) + (#x8FE9E1 #x9ABF) + (#x8FE9E2 #x9AC1) + (#x8FE9E3 #x9AC3) + (#x8FE9E4 #x9AC6) + (#x8FE9E5 #x9AC8) + (#x8FE9E6 #x9ACE) + (#x8FE9E7 #x9AD0) + (#x8FE9E8 #x9AD2) + (#x8FE9E9 #x9AD5) + (#x8FE9EA #x9AD6) + (#x8FE9EB #x9AD7) + (#x8FE9EC #x9ADB) + (#x8FE9ED #x9ADC) + (#x8FE9EE #x9AE0) + (#x8FE9EF #x9AE4) + (#x8FE9F0 #x9AE5) + (#x8FE9F1 #x9AE7) + (#x8FE9F2 #x9AE9) + (#x8FE9F3 #x9AEC) + (#x8FE9F4 #x9AF2) + (#x8FE9F5 #x9AF3) + (#x8FE9F6 #x9AF5) + (#x8FE9F7 #x9AF9) + (#x8FE9F8 #x9AFA) + (#x8FE9F9 #x9AFD) + (#x8FE9FA #x9AFF) + (#x8FE9FB #x9B00) + (#x8FE9FC #x9B01) + (#x8FE9FD #x9B02) + (#x8FE9FE #x9B03) + (#x8FEAA1 #x9B04) + (#x8FEAA2 #x9B05) + (#x8FEAA3 #x9B08) + (#x8FEAA4 #x9B09) + (#x8FEAA5 #x9B0B) + (#x8FEAA6 #x9B0C) + (#x8FEAA7 #x9B0D) + (#x8FEAA8 #x9B0E) + (#x8FEAA9 #x9B10) + (#x8FEAAA #x9B12) + (#x8FEAAB #x9B16) + (#x8FEAAC #x9B19) + (#x8FEAAD #x9B1B) + (#x8FEAAE #x9B1C) + (#x8FEAAF #x9B20) + (#x8FEAB0 #x9B26) + (#x8FEAB1 #x9B2B) + (#x8FEAB2 #x9B2D) + (#x8FEAB3 #x9B33) + (#x8FEAB4 #x9B34) + (#x8FEAB5 #x9B35) + (#x8FEAB6 #x9B37) + (#x8FEAB7 #x9B39) + (#x8FEAB8 #x9B3A) + (#x8FEAB9 #x9B3D) + (#x8FEABA #x9B48) + (#x8FEABB #x9B4B) + (#x8FEABC #x9B4C) + (#x8FEABD #x9B55) + (#x8FEABE #x9B56) + (#x8FEABF #x9B57) + (#x8FEAC0 #x9B5B) + (#x8FEAC1 #x9B5E) + (#x8FEAC2 #x9B61) + (#x8FEAC3 #x9B63) + (#x8FEAC4 #x9B65) + (#x8FEAC5 #x9B66) + (#x8FEAC6 #x9B68) + (#x8FEAC7 #x9B6A) + (#x8FEAC8 #x9B6B) + (#x8FEAC9 #x9B6C) + (#x8FEACA #x9B6D) + (#x8FEACB #x9B6E) + (#x8FEACC #x9B73) + (#x8FEACD #x9B75) + (#x8FEACE #x9B77) + (#x8FEACF #x9B78) + (#x8FEAD0 #x9B79) + (#x8FEAD1 #x9B7F) + (#x8FEAD2 #x9B80) + (#x8FEAD3 #x9B84) + (#x8FEAD4 #x9B85) + (#x8FEAD5 #x9B86) + (#x8FEAD6 #x9B87) + (#x8FEAD7 #x9B89) + (#x8FEAD8 #x9B8A) + (#x8FEAD9 #x9B8B) + (#x8FEADA #x9B8D) + (#x8FEADB #x9B8F) + (#x8FEADC #x9B90) + (#x8FEADD #x9B94) + (#x8FEADE #x9B9A) + (#x8FEADF #x9B9D) + (#x8FEAE0 #x9B9E) + (#x8FEAE1 #x9BA6) + (#x8FEAE2 #x9BA7) + (#x8FEAE3 #x9BA9) + (#x8FEAE4 #x9BAC) + (#x8FEAE5 #x9BB0) + (#x8FEAE6 #x9BB1) + (#x8FEAE7 #x9BB2) + (#x8FEAE8 #x9BB7) + (#x8FEAE9 #x9BB8) + (#x8FEAEA #x9BBB) + (#x8FEAEB #x9BBC) + (#x8FEAEC #x9BBE) + (#x8FEAED #x9BBF) + (#x8FEAEE #x9BC1) + (#x8FEAEF #x9BC7) + (#x8FEAF0 #x9BC8) + (#x8FEAF1 #x9BCE) + (#x8FEAF2 #x9BD0) + (#x8FEAF3 #x9BD7) + (#x8FEAF4 #x9BD8) + (#x8FEAF5 #x9BDD) + (#x8FEAF6 #x9BDF) + (#x8FEAF7 #x9BE5) + (#x8FEAF8 #x9BE7) + (#x8FEAF9 #x9BEA) + (#x8FEAFA #x9BEB) + (#x8FEAFB #x9BEF) + (#x8FEAFC #x9BF3) + (#x8FEAFD #x9BF7) + (#x8FEAFE #x9BF8) + (#x8FEBA1 #x9BF9) + (#x8FEBA2 #x9BFA) + (#x8FEBA3 #x9BFD) + (#x8FEBA4 #x9BFF) + (#x8FEBA5 #x9C00) + (#x8FEBA6 #x9C02) + (#x8FEBA7 #x9C0B) + (#x8FEBA8 #x9C0F) + (#x8FEBA9 #x9C11) + (#x8FEBAA #x9C16) + (#x8FEBAB #x9C18) + (#x8FEBAC #x9C19) + (#x8FEBAD #x9C1A) + (#x8FEBAE #x9C1C) + (#x8FEBAF #x9C1E) + (#x8FEBB0 #x9C22) + (#x8FEBB1 #x9C23) + (#x8FEBB2 #x9C26) + (#x8FEBB3 #x9C27) + (#x8FEBB4 #x9C28) + (#x8FEBB5 #x9C29) + (#x8FEBB6 #x9C2A) + (#x8FEBB7 #x9C31) + (#x8FEBB8 #x9C35) + (#x8FEBB9 #x9C36) + (#x8FEBBA #x9C37) + (#x8FEBBB #x9C3D) + (#x8FEBBC #x9C41) + (#x8FEBBD #x9C43) + (#x8FEBBE #x9C44) + (#x8FEBBF #x9C45) + (#x8FEBC0 #x9C49) + (#x8FEBC1 #x9C4A) + (#x8FEBC2 #x9C4E) + (#x8FEBC3 #x9C4F) + (#x8FEBC4 #x9C50) + (#x8FEBC5 #x9C53) + (#x8FEBC6 #x9C54) + (#x8FEBC7 #x9C56) + (#x8FEBC8 #x9C58) + (#x8FEBC9 #x9C5B) + (#x8FEBCA #x9C5D) + (#x8FEBCB #x9C5E) + (#x8FEBCC #x9C5F) + (#x8FEBCD #x9C63) + (#x8FEBCE #x9C69) + (#x8FEBCF #x9C6A) + (#x8FEBD0 #x9C5C) + (#x8FEBD1 #x9C6B) + (#x8FEBD2 #x9C68) + (#x8FEBD3 #x9C6E) + (#x8FEBD4 #x9C70) + (#x8FEBD5 #x9C72) + (#x8FEBD6 #x9C75) + (#x8FEBD7 #x9C77) + (#x8FEBD8 #x9C7B) + (#x8FEBD9 #x9CE6) + (#x8FEBDA #x9CF2) + (#x8FEBDB #x9CF7) + (#x8FEBDC #x9CF9) + (#x8FEBDD #x9D0B) + (#x8FEBDE #x9D02) + (#x8FEBDF #x9D11) + (#x8FEBE0 #x9D17) + (#x8FEBE1 #x9D18) + (#x8FEBE2 #x9D1C) + (#x8FEBE3 #x9D1D) + (#x8FEBE4 #x9D1E) + (#x8FEBE5 #x9D2F) + (#x8FEBE6 #x9D30) + (#x8FEBE7 #x9D32) + (#x8FEBE8 #x9D33) + (#x8FEBE9 #x9D34) + (#x8FEBEA #x9D3A) + (#x8FEBEB #x9D3C) + (#x8FEBEC #x9D45) + (#x8FEBED #x9D3D) + (#x8FEBEE #x9D42) + (#x8FEBEF #x9D43) + (#x8FEBF0 #x9D47) + (#x8FEBF1 #x9D4A) + (#x8FEBF2 #x9D53) + (#x8FEBF3 #x9D54) + (#x8FEBF4 #x9D5F) + (#x8FEBF5 #x9D63) + (#x8FEBF6 #x9D62) + (#x8FEBF7 #x9D65) + (#x8FEBF8 #x9D69) + (#x8FEBF9 #x9D6A) + (#x8FEBFA #x9D6B) + (#x8FEBFB #x9D70) + (#x8FEBFC #x9D76) + (#x8FEBFD #x9D77) + (#x8FEBFE #x9D7B) + (#x8FECA1 #x9D7C) + (#x8FECA2 #x9D7E) + (#x8FECA3 #x9D83) + (#x8FECA4 #x9D84) + (#x8FECA5 #x9D86) + (#x8FECA6 #x9D8A) + (#x8FECA7 #x9D8D) + (#x8FECA8 #x9D8E) + (#x8FECA9 #x9D92) + (#x8FECAA #x9D93) + (#x8FECAB #x9D95) + (#x8FECAC #x9D96) + (#x8FECAD #x9D97) + (#x8FECAE #x9D98) + (#x8FECAF #x9DA1) + (#x8FECB0 #x9DAA) + (#x8FECB1 #x9DAC) + (#x8FECB2 #x9DAE) + (#x8FECB3 #x9DB1) + (#x8FECB4 #x9DB5) + (#x8FECB5 #x9DB9) + (#x8FECB6 #x9DBC) + (#x8FECB7 #x9DBF) + (#x8FECB8 #x9DC3) + (#x8FECB9 #x9DC7) + (#x8FECBA #x9DC9) + (#x8FECBB #x9DCA) + (#x8FECBC #x9DD4) + (#x8FECBD #x9DD5) + (#x8FECBE #x9DD6) + (#x8FECBF #x9DD7) + (#x8FECC0 #x9DDA) + (#x8FECC1 #x9DDE) + (#x8FECC2 #x9DDF) + (#x8FECC3 #x9DE0) + (#x8FECC4 #x9DE5) + (#x8FECC5 #x9DE7) + (#x8FECC6 #x9DE9) + (#x8FECC7 #x9DEB) + (#x8FECC8 #x9DEE) + (#x8FECC9 #x9DF0) + (#x8FECCA #x9DF3) + (#x8FECCB #x9DF4) + (#x8FECCC #x9DFE) + (#x8FECCD #x9E0A) + (#x8FECCE #x9E02) + (#x8FECCF #x9E07) + (#x8FECD0 #x9E0E) + (#x8FECD1 #x9E10) + (#x8FECD2 #x9E11) + (#x8FECD3 #x9E12) + (#x8FECD4 #x9E15) + (#x8FECD5 #x9E16) + (#x8FECD6 #x9E19) + (#x8FECD7 #x9E1C) + (#x8FECD8 #x9E1D) + (#x8FECD9 #x9E7A) + (#x8FECDA #x9E7B) + (#x8FECDB #x9E7C) + (#x8FECDC #x9E80) + (#x8FECDD #x9E82) + (#x8FECDE #x9E83) + (#x8FECDF #x9E84) + (#x8FECE0 #x9E85) + (#x8FECE1 #x9E87) + (#x8FECE2 #x9E8E) + (#x8FECE3 #x9E8F) + (#x8FECE4 #x9E96) + (#x8FECE5 #x9E98) + (#x8FECE6 #x9E9B) + (#x8FECE7 #x9E9E) + (#x8FECE8 #x9EA4) + (#x8FECE9 #x9EA8) + (#x8FECEA #x9EAC) + (#x8FECEB #x9EAE) + (#x8FECEC #x9EAF) + (#x8FECED #x9EB0) + (#x8FECEE #x9EB3) + (#x8FECEF #x9EB4) + (#x8FECF0 #x9EB5) + (#x8FECF1 #x9EC6) + (#x8FECF2 #x9EC8) + (#x8FECF3 #x9ECB) + (#x8FECF4 #x9ED5) + (#x8FECF5 #x9EDF) + (#x8FECF6 #x9EE4) + (#x8FECF7 #x9EE7) + (#x8FECF8 #x9EEC) + (#x8FECF9 #x9EED) + (#x8FECFA #x9EEE) + (#x8FECFB #x9EF0) + (#x8FECFC #x9EF1) + (#x8FECFD #x9EF2) + (#x8FECFE #x9EF5) + (#x8FEDA1 #x9EF8) + (#x8FEDA2 #x9EFF) + (#x8FEDA3 #x9F02) + (#x8FEDA4 #x9F03) + (#x8FEDA5 #x9F09) + (#x8FEDA6 #x9F0F) + (#x8FEDA7 #x9F10) + (#x8FEDA8 #x9F11) + (#x8FEDA9 #x9F12) + (#x8FEDAA #x9F14) + (#x8FEDAB #x9F16) + (#x8FEDAC #x9F17) + (#x8FEDAD #x9F19) + (#x8FEDAE #x9F1A) + (#x8FEDAF #x9F1B) + (#x8FEDB0 #x9F1F) + (#x8FEDB1 #x9F22) + (#x8FEDB2 #x9F26) + (#x8FEDB3 #x9F2A) + (#x8FEDB4 #x9F2B) + (#x8FEDB5 #x9F2F) + (#x8FEDB6 #x9F31) + (#x8FEDB7 #x9F32) + (#x8FEDB8 #x9F34) + (#x8FEDB9 #x9F37) + (#x8FEDBA #x9F39) + (#x8FEDBB #x9F3A) + (#x8FEDBC #x9F3C) + (#x8FEDBD #x9F3D) + (#x8FEDBE #x9F3F) + (#x8FEDBF #x9F41) + (#x8FEDC0 #x9F43) + (#x8FEDC1 #x9F44) + (#x8FEDC2 #x9F45) + (#x8FEDC3 #x9F46) + (#x8FEDC4 #x9F47) + (#x8FEDC5 #x9F53) + (#x8FEDC6 #x9F55) + (#x8FEDC7 #x9F56) + (#x8FEDC8 #x9F57) + (#x8FEDC9 #x9F58) + (#x8FEDCA #x9F5A) + (#x8FEDCB #x9F5D) + (#x8FEDCC #x9F5E) + (#x8FEDCD #x9F68) + (#x8FEDCE #x9F69) + (#x8FEDCF #x9F6D) + (#x8FEDD0 #x9F6E) + (#x8FEDD1 #x9F6F) + (#x8FEDD2 #x9F70) + (#x8FEDD3 #x9F71) + (#x8FEDD4 #x9F73) + (#x8FEDD5 #x9F75) + (#x8FEDD6 #x9F7A) + (#x8FEDD7 #x9F7D) + (#x8FEDD8 #x9F8F) + (#x8FEDD9 #x9F90) + (#x8FEDDA #x9F91) + (#x8FEDDB #x9F92) + (#x8FEDDC #x9F94) + (#x8FEDDD #x9F96) + (#x8FEDDE #x9F97) + (#x8FEDDF #x9F9E) + (#x8FEDE0 #x9FA1) + (#x8FEDE1 #x9FA2) + (#x8FEDE2 #x9FA3) + (#x8FEDE3 #x9FA5) + (#x8FF5A1 #xE3AC) + (#x8FF5A2 #xE3AD) + (#x8FF5A3 #xE3AE) + (#x8FF5A4 #xE3AF) + (#x8FF5A5 #xE3B0) + (#x8FF5A6 #xE3B1) + (#x8FF5A7 #xE3B2) + (#x8FF5A8 #xE3B3) + (#x8FF5A9 #xE3B4) + (#x8FF5AA #xE3B5) + (#x8FF5AB #xE3B6) + (#x8FF5AC #xE3B7) + (#x8FF5AD #xE3B8) + (#x8FF5AE #xE3B9) + (#x8FF5AF #xE3BA) + (#x8FF5B0 #xE3BB) + (#x8FF5B1 #xE3BC) + (#x8FF5B2 #xE3BD) + (#x8FF5B3 #xE3BE) + (#x8FF5B4 #xE3BF) + (#x8FF5B5 #xE3C0) + (#x8FF5B6 #xE3C1) + (#x8FF5B7 #xE3C2) + (#x8FF5B8 #xE3C3) + (#x8FF5B9 #xE3C4) + (#x8FF5BA #xE3C5) + (#x8FF5BB #xE3C6) + (#x8FF5BC #xE3C7) + (#x8FF5BD #xE3C8) + (#x8FF5BE #xE3C9) + (#x8FF5BF #xE3CA) + (#x8FF5C0 #xE3CB) + (#x8FF5C1 #xE3CC) + (#x8FF5C2 #xE3CD) + (#x8FF5C3 #xE3CE) + (#x8FF5C4 #xE3CF) + (#x8FF5C5 #xE3D0) + (#x8FF5C6 #xE3D1) + (#x8FF5C7 #xE3D2) + (#x8FF5C8 #xE3D3) + (#x8FF5C9 #xE3D4) + (#x8FF5CA #xE3D5) + (#x8FF5CB #xE3D6) + (#x8FF5CC #xE3D7) + (#x8FF5CD #xE3D8) + (#x8FF5CE #xE3D9) + (#x8FF5CF #xE3DA) + (#x8FF5D0 #xE3DB) + (#x8FF5D1 #xE3DC) + (#x8FF5D2 #xE3DD) + (#x8FF5D3 #xE3DE) + (#x8FF5D4 #xE3DF) + (#x8FF5D5 #xE3E0) + (#x8FF5D6 #xE3E1) + (#x8FF5D7 #xE3E2) + (#x8FF5D8 #xE3E3) + (#x8FF5D9 #xE3E4) + (#x8FF5DA #xE3E5) + (#x8FF5DB #xE3E6) + (#x8FF5DC #xE3E7) + (#x8FF5DD #xE3E8) + (#x8FF5DE #xE3E9) + (#x8FF5DF #xE3EA) + (#x8FF5E0 #xE3EB) + (#x8FF5E1 #xE3EC) + (#x8FF5E2 #xE3ED) + (#x8FF5E3 #xE3EE) + (#x8FF5E4 #xE3EF) + (#x8FF5E5 #xE3F0) + (#x8FF5E6 #xE3F1) + (#x8FF5E7 #xE3F2) + (#x8FF5E8 #xE3F3) + (#x8FF5E9 #xE3F4) + (#x8FF5EA #xE3F5) + (#x8FF5EB #xE3F6) + (#x8FF5EC #xE3F7) + (#x8FF5ED #xE3F8) + (#x8FF5EE #xE3F9) + (#x8FF5EF #xE3FA) + (#x8FF5F0 #xE3FB) + (#x8FF5F1 #xE3FC) + (#x8FF5F2 #xE3FD) + (#x8FF5F3 #xE3FE) + (#x8FF5F4 #xE3FF) + (#x8FF5F5 #xE400) + (#x8FF5F6 #xE401) + (#x8FF5F7 #xE402) + (#x8FF5F8 #xE403) + (#x8FF5F9 #xE404) + (#x8FF5FA #xE405) + (#x8FF5FB #xE406) + (#x8FF5FC #xE407) + (#x8FF5FD #xE408) + (#x8FF5FE #xE409) + (#x8FF6A1 #xE40A) + (#x8FF6A2 #xE40B) + (#x8FF6A3 #xE40C) + (#x8FF6A4 #xE40D) + (#x8FF6A5 #xE40E) + (#x8FF6A6 #xE40F) + (#x8FF6A7 #xE410) + (#x8FF6A8 #xE411) + (#x8FF6A9 #xE412) + (#x8FF6AA #xE413) + (#x8FF6AB #xE414) + (#x8FF6AC #xE415) + (#x8FF6AD #xE416) + (#x8FF6AE #xE417) + (#x8FF6AF #xE418) + (#x8FF6B0 #xE419) + (#x8FF6B1 #xE41A) + (#x8FF6B2 #xE41B) + (#x8FF6B3 #xE41C) + (#x8FF6B4 #xE41D) + (#x8FF6B5 #xE41E) + (#x8FF6B6 #xE41F) + (#x8FF6B7 #xE420) + (#x8FF6B8 #xE421) + (#x8FF6B9 #xE422) + (#x8FF6BA #xE423) + (#x8FF6BB #xE424) + (#x8FF6BC #xE425) + (#x8FF6BD #xE426) + (#x8FF6BE #xE427) + (#x8FF6BF #xE428) + (#x8FF6C0 #xE429) + (#x8FF6C1 #xE42A) + (#x8FF6C2 #xE42B) + (#x8FF6C3 #xE42C) + (#x8FF6C4 #xE42D) + (#x8FF6C5 #xE42E) + (#x8FF6C6 #xE42F) + (#x8FF6C7 #xE430) + (#x8FF6C8 #xE431) + (#x8FF6C9 #xE432) + (#x8FF6CA #xE433) + (#x8FF6CB #xE434) + (#x8FF6CC #xE435) + (#x8FF6CD #xE436) + (#x8FF6CE #xE437) + (#x8FF6CF #xE438) + (#x8FF6D0 #xE439) + (#x8FF6D1 #xE43A) + (#x8FF6D2 #xE43B) + (#x8FF6D3 #xE43C) + (#x8FF6D4 #xE43D) + (#x8FF6D5 #xE43E) + (#x8FF6D6 #xE43F) + (#x8FF6D7 #xE440) + (#x8FF6D8 #xE441) + (#x8FF6D9 #xE442) + (#x8FF6DA #xE443) + (#x8FF6DB #xE444) + (#x8FF6DC #xE445) + (#x8FF6DD #xE446) + (#x8FF6DE #xE447) + (#x8FF6DF #xE448) + (#x8FF6E0 #xE449) + (#x8FF6E1 #xE44A) + (#x8FF6E2 #xE44B) + (#x8FF6E3 #xE44C) + (#x8FF6E4 #xE44D) + (#x8FF6E5 #xE44E) + (#x8FF6E6 #xE44F) + (#x8FF6E7 #xE450) + (#x8FF6E8 #xE451) + (#x8FF6E9 #xE452) + (#x8FF6EA #xE453) + (#x8FF6EB #xE454) + (#x8FF6EC #xE455) + (#x8FF6ED #xE456) + (#x8FF6EE #xE457) + (#x8FF6EF #xE458) + (#x8FF6F0 #xE459) + (#x8FF6F1 #xE45A) + (#x8FF6F2 #xE45B) + (#x8FF6F3 #xE45C) + (#x8FF6F4 #xE45D) + (#x8FF6F5 #xE45E) + (#x8FF6F6 #xE45F) + (#x8FF6F7 #xE460) + (#x8FF6F8 #xE461) + (#x8FF6F9 #xE462) + (#x8FF6FA #xE463) + (#x8FF6FB #xE464) + (#x8FF6FC #xE465) + (#x8FF6FD #xE466) + (#x8FF6FE #xE467) + (#x8FF7A1 #xE468) + (#x8FF7A2 #xE469) + (#x8FF7A3 #xE46A) + (#x8FF7A4 #xE46B) + (#x8FF7A5 #xE46C) + (#x8FF7A6 #xE46D) + (#x8FF7A7 #xE46E) + (#x8FF7A8 #xE46F) + (#x8FF7A9 #xE470) + (#x8FF7AA #xE471) + (#x8FF7AB #xE472) + (#x8FF7AC #xE473) + (#x8FF7AD #xE474) + (#x8FF7AE #xE475) + (#x8FF7AF #xE476) + (#x8FF7B0 #xE477) + (#x8FF7B1 #xE478) + (#x8FF7B2 #xE479) + (#x8FF7B3 #xE47A) + (#x8FF7B4 #xE47B) + (#x8FF7B5 #xE47C) + (#x8FF7B6 #xE47D) + (#x8FF7B7 #xE47E) + (#x8FF7B8 #xE47F) + (#x8FF7B9 #xE480) + (#x8FF7BA #xE481) + (#x8FF7BB #xE482) + (#x8FF7BC #xE483) + (#x8FF7BD #xE484) + (#x8FF7BE #xE485) + (#x8FF7BF #xE486) + (#x8FF7C0 #xE487) + (#x8FF7C1 #xE488) + (#x8FF7C2 #xE489) + (#x8FF7C3 #xE48A) + (#x8FF7C4 #xE48B) + (#x8FF7C5 #xE48C) + (#x8FF7C6 #xE48D) + (#x8FF7C7 #xE48E) + (#x8FF7C8 #xE48F) + (#x8FF7C9 #xE490) + (#x8FF7CA #xE491) + (#x8FF7CB #xE492) + (#x8FF7CC #xE493) + (#x8FF7CD #xE494) + (#x8FF7CE #xE495) + (#x8FF7CF #xE496) + (#x8FF7D0 #xE497) + (#x8FF7D1 #xE498) + (#x8FF7D2 #xE499) + (#x8FF7D3 #xE49A) + (#x8FF7D4 #xE49B) + (#x8FF7D5 #xE49C) + (#x8FF7D6 #xE49D) + (#x8FF7D7 #xE49E) + (#x8FF7D8 #xE49F) + (#x8FF7D9 #xE4A0) + (#x8FF7DA #xE4A1) + (#x8FF7DB #xE4A2) + (#x8FF7DC #xE4A3) + (#x8FF7DD #xE4A4) + (#x8FF7DE #xE4A5) + (#x8FF7DF #xE4A6) + (#x8FF7E0 #xE4A7) + (#x8FF7E1 #xE4A8) + (#x8FF7E2 #xE4A9) + (#x8FF7E3 #xE4AA) + (#x8FF7E4 #xE4AB) + (#x8FF7E5 #xE4AC) + (#x8FF7E6 #xE4AD) + (#x8FF7E7 #xE4AE) + (#x8FF7E8 #xE4AF) + (#x8FF7E9 #xE4B0) + (#x8FF7EA #xE4B1) + (#x8FF7EB #xE4B2) + (#x8FF7EC #xE4B3) + (#x8FF7ED #xE4B4) + (#x8FF7EE #xE4B5) + (#x8FF7EF #xE4B6) + (#x8FF7F0 #xE4B7) + (#x8FF7F1 #xE4B8) + (#x8FF7F2 #xE4B9) + (#x8FF7F3 #xE4BA) + (#x8FF7F4 #xE4BB) + (#x8FF7F5 #xE4BC) + (#x8FF7F6 #xE4BD) + (#x8FF7F7 #xE4BE) + (#x8FF7F8 #xE4BF) + (#x8FF7F9 #xE4C0) + (#x8FF7FA #xE4C1) + (#x8FF7FB #xE4C2) + (#x8FF7FC #xE4C3) + (#x8FF7FD #xE4C4) + (#x8FF7FE #xE4C5) + (#x8FF8A1 #xE4C6) + (#x8FF8A2 #xE4C7) + (#x8FF8A3 #xE4C8) + (#x8FF8A4 #xE4C9) + (#x8FF8A5 #xE4CA) + (#x8FF8A6 #xE4CB) + (#x8FF8A7 #xE4CC) + (#x8FF8A8 #xE4CD) + (#x8FF8A9 #xE4CE) + (#x8FF8AA #xE4CF) + (#x8FF8AB #xE4D0) + (#x8FF8AC #xE4D1) + (#x8FF8AD #xE4D2) + (#x8FF8AE #xE4D3) + (#x8FF8AF #xE4D4) + (#x8FF8B0 #xE4D5) + (#x8FF8B1 #xE4D6) + (#x8FF8B2 #xE4D7) + (#x8FF8B3 #xE4D8) + (#x8FF8B4 #xE4D9) + (#x8FF8B5 #xE4DA) + (#x8FF8B6 #xE4DB) + (#x8FF8B7 #xE4DC) + (#x8FF8B8 #xE4DD) + (#x8FF8B9 #xE4DE) + (#x8FF8BA #xE4DF) + (#x8FF8BB #xE4E0) + (#x8FF8BC #xE4E1) + (#x8FF8BD #xE4E2) + (#x8FF8BE #xE4E3) + (#x8FF8BF #xE4E4) + (#x8FF8C0 #xE4E5) + (#x8FF8C1 #xE4E6) + (#x8FF8C2 #xE4E7) + (#x8FF8C3 #xE4E8) + (#x8FF8C4 #xE4E9) + (#x8FF8C5 #xE4EA) + (#x8FF8C6 #xE4EB) + (#x8FF8C7 #xE4EC) + (#x8FF8C8 #xE4ED) + (#x8FF8C9 #xE4EE) + (#x8FF8CA #xE4EF) + (#x8FF8CB #xE4F0) + (#x8FF8CC #xE4F1) + (#x8FF8CD #xE4F2) + (#x8FF8CE #xE4F3) + (#x8FF8CF #xE4F4) + (#x8FF8D0 #xE4F5) + (#x8FF8D1 #xE4F6) + (#x8FF8D2 #xE4F7) + (#x8FF8D3 #xE4F8) + (#x8FF8D4 #xE4F9) + (#x8FF8D5 #xE4FA) + (#x8FF8D6 #xE4FB) + (#x8FF8D7 #xE4FC) + (#x8FF8D8 #xE4FD) + (#x8FF8D9 #xE4FE) + (#x8FF8DA #xE4FF) + (#x8FF8DB #xE500) + (#x8FF8DC #xE501) + (#x8FF8DD #xE502) + (#x8FF8DE #xE503) + (#x8FF8DF #xE504) + (#x8FF8E0 #xE505) + (#x8FF8E1 #xE506) + (#x8FF8E2 #xE507) + (#x8FF8E3 #xE508) + (#x8FF8E4 #xE509) + (#x8FF8E5 #xE50A) + (#x8FF8E6 #xE50B) + (#x8FF8E7 #xE50C) + (#x8FF8E8 #xE50D) + (#x8FF8E9 #xE50E) + (#x8FF8EA #xE50F) + (#x8FF8EB #xE510) + (#x8FF8EC #xE511) + (#x8FF8ED #xE512) + (#x8FF8EE #xE513) + (#x8FF8EF #xE514) + (#x8FF8F0 #xE515) + (#x8FF8F1 #xE516) + (#x8FF8F2 #xE517) + (#x8FF8F3 #xE518) + (#x8FF8F4 #xE519) + (#x8FF8F5 #xE51A) + (#x8FF8F6 #xE51B) + (#x8FF8F7 #xE51C) + (#x8FF8F8 #xE51D) + (#x8FF8F9 #xE51E) + (#x8FF8FA #xE51F) + (#x8FF8FB #xE520) + (#x8FF8FC #xE521) + (#x8FF8FD #xE522) + (#x8FF8FE #xE523) + (#x8FF9A1 #xE524) + (#x8FF9A2 #xE525) + (#x8FF9A3 #xE526) + (#x8FF9A4 #xE527) + (#x8FF9A5 #xE528) + (#x8FF9A6 #xE529) + (#x8FF9A7 #xE52A) + (#x8FF9A8 #xE52B) + (#x8FF9A9 #xE52C) + (#x8FF9AA #xE52D) + (#x8FF9AB #xE52E) + (#x8FF9AC #xE52F) + (#x8FF9AD #xE530) + (#x8FF9AE #xE531) + (#x8FF9AF #xE532) + (#x8FF9B0 #xE533) + (#x8FF9B1 #xE534) + (#x8FF9B2 #xE535) + (#x8FF9B3 #xE536) + (#x8FF9B4 #xE537) + (#x8FF9B5 #xE538) + (#x8FF9B6 #xE539) + (#x8FF9B7 #xE53A) + (#x8FF9B8 #xE53B) + (#x8FF9B9 #xE53C) + (#x8FF9BA #xE53D) + (#x8FF9BB #xE53E) + (#x8FF9BC #xE53F) + (#x8FF9BD #xE540) + (#x8FF9BE #xE541) + (#x8FF9BF #xE542) + (#x8FF9C0 #xE543) + (#x8FF9C1 #xE544) + (#x8FF9C2 #xE545) + (#x8FF9C3 #xE546) + (#x8FF9C4 #xE547) + (#x8FF9C5 #xE548) + (#x8FF9C6 #xE549) + (#x8FF9C7 #xE54A) + (#x8FF9C8 #xE54B) + (#x8FF9C9 #xE54C) + (#x8FF9CA #xE54D) + (#x8FF9CB #xE54E) + (#x8FF9CC #xE54F) + (#x8FF9CD #xE550) + (#x8FF9CE #xE551) + (#x8FF9CF #xE552) + (#x8FF9D0 #xE553) + (#x8FF9D1 #xE554) + (#x8FF9D2 #xE555) + (#x8FF9D3 #xE556) + (#x8FF9D4 #xE557) + (#x8FF9D5 #xE558) + (#x8FF9D6 #xE559) + (#x8FF9D7 #xE55A) + (#x8FF9D8 #xE55B) + (#x8FF9D9 #xE55C) + (#x8FF9DA #xE55D) + (#x8FF9DB #xE55E) + (#x8FF9DC #xE55F) + (#x8FF9DD #xE560) + (#x8FF9DE #xE561) + (#x8FF9DF #xE562) + (#x8FF9E0 #xE563) + (#x8FF9E1 #xE564) + (#x8FF9E2 #xE565) + (#x8FF9E3 #xE566) + (#x8FF9E4 #xE567) + (#x8FF9E5 #xE568) + (#x8FF9E6 #xE569) + (#x8FF9E7 #xE56A) + (#x8FF9E8 #xE56B) + (#x8FF9E9 #xE56C) + (#x8FF9EA #xE56D) + (#x8FF9EB #xE56E) + (#x8FF9EC #xE56F) + (#x8FF9ED #xE570) + (#x8FF9EE #xE571) + (#x8FF9EF #xE572) + (#x8FF9F0 #xE573) + (#x8FF9F1 #xE574) + (#x8FF9F2 #xE575) + (#x8FF9F3 #xE576) + (#x8FF9F4 #xE577) + (#x8FF9F5 #xE578) + (#x8FF9F6 #xE579) + (#x8FF9F7 #xE57A) + (#x8FF9F8 #xE57B) + (#x8FF9F9 #xE57C) + (#x8FF9FA #xE57D) + (#x8FF9FB #xE57E) + (#x8FF9FC #xE57F) + (#x8FF9FD #xE580) + (#x8FF9FE #xE581) + (#x8FFAA1 #xE582) + (#x8FFAA2 #xE583) + (#x8FFAA3 #xE584) + (#x8FFAA4 #xE585) + (#x8FFAA5 #xE586) + (#x8FFAA6 #xE587) + (#x8FFAA7 #xE588) + (#x8FFAA8 #xE589) + (#x8FFAA9 #xE58A) + (#x8FFAAA #xE58B) + (#x8FFAAB #xE58C) + (#x8FFAAC #xE58D) + (#x8FFAAD #xE58E) + (#x8FFAAE #xE58F) + (#x8FFAAF #xE590) + (#x8FFAB0 #xE591) + (#x8FFAB1 #xE592) + (#x8FFAB2 #xE593) + (#x8FFAB3 #xE594) + (#x8FFAB4 #xE595) + (#x8FFAB5 #xE596) + (#x8FFAB6 #xE597) + (#x8FFAB7 #xE598) + (#x8FFAB8 #xE599) + (#x8FFAB9 #xE59A) + (#x8FFABA #xE59B) + (#x8FFABB #xE59C) + (#x8FFABC #xE59D) + (#x8FFABD #xE59E) + (#x8FFABE #xE59F) + (#x8FFABF #xE5A0) + (#x8FFAC0 #xE5A1) + (#x8FFAC1 #xE5A2) + (#x8FFAC2 #xE5A3) + (#x8FFAC3 #xE5A4) + (#x8FFAC4 #xE5A5) + (#x8FFAC5 #xE5A6) + (#x8FFAC6 #xE5A7) + (#x8FFAC7 #xE5A8) + (#x8FFAC8 #xE5A9) + (#x8FFAC9 #xE5AA) + (#x8FFACA #xE5AB) + (#x8FFACB #xE5AC) + (#x8FFACC #xE5AD) + (#x8FFACD #xE5AE) + (#x8FFACE #xE5AF) + (#x8FFACF #xE5B0) + (#x8FFAD0 #xE5B1) + (#x8FFAD1 #xE5B2) + (#x8FFAD2 #xE5B3) + (#x8FFAD3 #xE5B4) + (#x8FFAD4 #xE5B5) + (#x8FFAD5 #xE5B6) + (#x8FFAD6 #xE5B7) + (#x8FFAD7 #xE5B8) + (#x8FFAD8 #xE5B9) + (#x8FFAD9 #xE5BA) + (#x8FFADA #xE5BB) + (#x8FFADB #xE5BC) + (#x8FFADC #xE5BD) + (#x8FFADD #xE5BE) + (#x8FFADE #xE5BF) + (#x8FFADF #xE5C0) + (#x8FFAE0 #xE5C1) + (#x8FFAE1 #xE5C2) + (#x8FFAE2 #xE5C3) + (#x8FFAE3 #xE5C4) + (#x8FFAE4 #xE5C5) + (#x8FFAE5 #xE5C6) + (#x8FFAE6 #xE5C7) + (#x8FFAE7 #xE5C8) + (#x8FFAE8 #xE5C9) + (#x8FFAE9 #xE5CA) + (#x8FFAEA #xE5CB) + (#x8FFAEB #xE5CC) + (#x8FFAEC #xE5CD) + (#x8FFAED #xE5CE) + (#x8FFAEE #xE5CF) + (#x8FFAEF #xE5D0) + (#x8FFAF0 #xE5D1) + (#x8FFAF1 #xE5D2) + (#x8FFAF2 #xE5D3) + (#x8FFAF3 #xE5D4) + (#x8FFAF4 #xE5D5) + (#x8FFAF5 #xE5D6) + (#x8FFAF6 #xE5D7) + (#x8FFAF7 #xE5D8) + (#x8FFAF8 #xE5D9) + (#x8FFAF9 #xE5DA) + (#x8FFAFA #xE5DB) + (#x8FFAFB #xE5DC) + (#x8FFAFC #xE5DD) + (#x8FFAFD #xE5DE) + (#x8FFAFE #xE5DF) + (#x8FFBA1 #xE5E0) + (#x8FFBA2 #xE5E1) + (#x8FFBA3 #xE5E2) + (#x8FFBA4 #xE5E3) + (#x8FFBA5 #xE5E4) + (#x8FFBA6 #xE5E5) + (#x8FFBA7 #xE5E6) + (#x8FFBA8 #xE5E7) + (#x8FFBA9 #xE5E8) + (#x8FFBAA #xE5E9) + (#x8FFBAB #xE5EA) + (#x8FFBAC #xE5EB) + (#x8FFBAD #xE5EC) + (#x8FFBAE #xE5ED) + (#x8FFBAF #xE5EE) + (#x8FFBB0 #xE5EF) + (#x8FFBB1 #xE5F0) + (#x8FFBB2 #xE5F1) + (#x8FFBB3 #xE5F2) + (#x8FFBB4 #xE5F3) + (#x8FFBB5 #xE5F4) + (#x8FFBB6 #xE5F5) + (#x8FFBB7 #xE5F6) + (#x8FFBB8 #xE5F7) + (#x8FFBB9 #xE5F8) + (#x8FFBBA #xE5F9) + (#x8FFBBB #xE5FA) + (#x8FFBBC #xE5FB) + (#x8FFBBD #xE5FC) + (#x8FFBBE #xE5FD) + (#x8FFBBF #xE5FE) + (#x8FFBC0 #xE5FF) + (#x8FFBC1 #xE600) + (#x8FFBC2 #xE601) + (#x8FFBC3 #xE602) + (#x8FFBC4 #xE603) + (#x8FFBC5 #xE604) + (#x8FFBC6 #xE605) + (#x8FFBC7 #xE606) + (#x8FFBC8 #xE607) + (#x8FFBC9 #xE608) + (#x8FFBCA #xE609) + (#x8FFBCB #xE60A) + (#x8FFBCC #xE60B) + (#x8FFBCD #xE60C) + (#x8FFBCE #xE60D) + (#x8FFBCF #xE60E) + (#x8FFBD0 #xE60F) + (#x8FFBD1 #xE610) + (#x8FFBD2 #xE611) + (#x8FFBD3 #xE612) + (#x8FFBD4 #xE613) + (#x8FFBD5 #xE614) + (#x8FFBD6 #xE615) + (#x8FFBD7 #xE616) + (#x8FFBD8 #xE617) + (#x8FFBD9 #xE618) + (#x8FFBDA #xE619) + (#x8FFBDB #xE61A) + (#x8FFBDC #xE61B) + (#x8FFBDD #xE61C) + (#x8FFBDE #xE61D) + (#x8FFBDF #xE61E) + (#x8FFBE0 #xE61F) + (#x8FFBE1 #xE620) + (#x8FFBE2 #xE621) + (#x8FFBE3 #xE622) + (#x8FFBE4 #xE623) + (#x8FFBE5 #xE624) + (#x8FFBE6 #xE625) + (#x8FFBE7 #xE626) + (#x8FFBE8 #xE627) + (#x8FFBE9 #xE628) + (#x8FFBEA #xE629) + (#x8FFBEB #xE62A) + (#x8FFBEC #xE62B) + (#x8FFBED #xE62C) + (#x8FFBEE #xE62D) + (#x8FFBEF #xE62E) + (#x8FFBF0 #xE62F) + (#x8FFBF1 #xE630) + (#x8FFBF2 #xE631) + (#x8FFBF3 #xE632) + (#x8FFBF4 #xE633) + (#x8FFBF5 #xE634) + (#x8FFBF6 #xE635) + (#x8FFBF7 #xE636) + (#x8FFBF8 #xE637) + (#x8FFBF9 #xE638) + (#x8FFBFA #xE639) + (#x8FFBFB #xE63A) + (#x8FFBFC #xE63B) + (#x8FFBFD #xE63C) + (#x8FFBFE #xE63D) + (#x8FFCA1 #xE63E) + (#x8FFCA2 #xE63F) + (#x8FFCA3 #xE640) + (#x8FFCA4 #xE641) + (#x8FFCA5 #xE642) + (#x8FFCA6 #xE643) + (#x8FFCA7 #xE644) + (#x8FFCA8 #xE645) + (#x8FFCA9 #xE646) + (#x8FFCAA #xE647) + (#x8FFCAB #xE648) + (#x8FFCAC #xE649) + (#x8FFCAD #xE64A) + (#x8FFCAE #xE64B) + (#x8FFCAF #xE64C) + (#x8FFCB0 #xE64D) + (#x8FFCB1 #xE64E) + (#x8FFCB2 #xE64F) + (#x8FFCB3 #xE650) + (#x8FFCB4 #xE651) + (#x8FFCB5 #xE652) + (#x8FFCB6 #xE653) + (#x8FFCB7 #xE654) + (#x8FFCB8 #xE655) + (#x8FFCB9 #xE656) + (#x8FFCBA #xE657) + (#x8FFCBB #xE658) + (#x8FFCBC #xE659) + (#x8FFCBD #xE65A) + (#x8FFCBE #xE65B) + (#x8FFCBF #xE65C) + (#x8FFCC0 #xE65D) + (#x8FFCC1 #xE65E) + (#x8FFCC2 #xE65F) + (#x8FFCC3 #xE660) + (#x8FFCC4 #xE661) + (#x8FFCC5 #xE662) + (#x8FFCC6 #xE663) + (#x8FFCC7 #xE664) + (#x8FFCC8 #xE665) + (#x8FFCC9 #xE666) + (#x8FFCCA #xE667) + (#x8FFCCB #xE668) + (#x8FFCCC #xE669) + (#x8FFCCD #xE66A) + (#x8FFCCE #xE66B) + (#x8FFCCF #xE66C) + (#x8FFCD0 #xE66D) + (#x8FFCD1 #xE66E) + (#x8FFCD2 #xE66F) + (#x8FFCD3 #xE670) + (#x8FFCD4 #xE671) + (#x8FFCD5 #xE672) + (#x8FFCD6 #xE673) + (#x8FFCD7 #xE674) + (#x8FFCD8 #xE675) + (#x8FFCD9 #xE676) + (#x8FFCDA #xE677) + (#x8FFCDB #xE678) + (#x8FFCDC #xE679) + (#x8FFCDD #xE67A) + (#x8FFCDE #xE67B) + (#x8FFCDF #xE67C) + (#x8FFCE0 #xE67D) + (#x8FFCE1 #xE67E) + (#x8FFCE2 #xE67F) + (#x8FFCE3 #xE680) + (#x8FFCE4 #xE681) + (#x8FFCE5 #xE682) + (#x8FFCE6 #xE683) + (#x8FFCE7 #xE684) + (#x8FFCE8 #xE685) + (#x8FFCE9 #xE686) + (#x8FFCEA #xE687) + (#x8FFCEB #xE688) + (#x8FFCEC #xE689) + (#x8FFCED #xE68A) + (#x8FFCEE #xE68B) + (#x8FFCEF #xE68C) + (#x8FFCF0 #xE68D) + (#x8FFCF1 #xE68E) + (#x8FFCF2 #xE68F) + (#x8FFCF3 #xE690) + (#x8FFCF4 #xE691) + (#x8FFCF5 #xE692) + (#x8FFCF6 #xE693) + (#x8FFCF7 #xE694) + (#x8FFCF8 #xE695) + (#x8FFCF9 #xE696) + (#x8FFCFA #xE697) + (#x8FFCFB #xE698) + (#x8FFCFC #xE699) + (#x8FFCFD #xE69A) + (#x8FFCFE #xE69B) + (#x8FFDA1 #xE69C) + (#x8FFDA2 #xE69D) + (#x8FFDA3 #xE69E) + (#x8FFDA4 #xE69F) + (#x8FFDA5 #xE6A0) + (#x8FFDA6 #xE6A1) + (#x8FFDA7 #xE6A2) + (#x8FFDA8 #xE6A3) + (#x8FFDA9 #xE6A4) + (#x8FFDAA #xE6A5) + (#x8FFDAB #xE6A6) + (#x8FFDAC #xE6A7) + (#x8FFDAD #xE6A8) + (#x8FFDAE #xE6A9) + (#x8FFDAF #xE6AA) + (#x8FFDB0 #xE6AB) + (#x8FFDB1 #xE6AC) + (#x8FFDB2 #xE6AD) + (#x8FFDB3 #xE6AE) + (#x8FFDB4 #xE6AF) + (#x8FFDB5 #xE6B0) + (#x8FFDB6 #xE6B1) + (#x8FFDB7 #xE6B2) + (#x8FFDB8 #xE6B3) + (#x8FFDB9 #xE6B4) + (#x8FFDBA #xE6B5) + (#x8FFDBB #xE6B6) + (#x8FFDBC #xE6B7) + (#x8FFDBD #xE6B8) + (#x8FFDBE #xE6B9) + (#x8FFDBF #xE6BA) + (#x8FFDC0 #xE6BB) + (#x8FFDC1 #xE6BC) + (#x8FFDC2 #xE6BD) + (#x8FFDC3 #xE6BE) + (#x8FFDC4 #xE6BF) + (#x8FFDC5 #xE6C0) + (#x8FFDC6 #xE6C1) + (#x8FFDC7 #xE6C2) + (#x8FFDC8 #xE6C3) + (#x8FFDC9 #xE6C4) + (#x8FFDCA #xE6C5) + (#x8FFDCB #xE6C6) + (#x8FFDCC #xE6C7) + (#x8FFDCD #xE6C8) + (#x8FFDCE #xE6C9) + (#x8FFDCF #xE6CA) + (#x8FFDD0 #xE6CB) + (#x8FFDD1 #xE6CC) + (#x8FFDD2 #xE6CD) + (#x8FFDD3 #xE6CE) + (#x8FFDD4 #xE6CF) + (#x8FFDD5 #xE6D0) + (#x8FFDD6 #xE6D1) + (#x8FFDD7 #xE6D2) + (#x8FFDD8 #xE6D3) + (#x8FFDD9 #xE6D4) + (#x8FFDDA #xE6D5) + (#x8FFDDB #xE6D6) + (#x8FFDDC #xE6D7) + (#x8FFDDD #xE6D8) + (#x8FFDDE #xE6D9) + (#x8FFDDF #xE6DA) + (#x8FFDE0 #xE6DB) + (#x8FFDE1 #xE6DC) + (#x8FFDE2 #xE6DD) + (#x8FFDE3 #xE6DE) + (#x8FFDE4 #xE6DF) + (#x8FFDE5 #xE6E0) + (#x8FFDE6 #xE6E1) + (#x8FFDE7 #xE6E2) + (#x8FFDE8 #xE6E3) + (#x8FFDE9 #xE6E4) + (#x8FFDEA #xE6E5) + (#x8FFDEB #xE6E6) + (#x8FFDEC #xE6E7) + (#x8FFDED #xE6E8) + (#x8FFDEE #xE6E9) + (#x8FFDEF #xE6EA) + (#x8FFDF0 #xE6EB) + (#x8FFDF1 #xE6EC) + (#x8FFDF2 #xE6ED) + (#x8FFDF3 #xE6EE) + (#x8FFDF4 #xE6EF) + (#x8FFDF5 #xE6F0) + (#x8FFDF6 #xE6F1) + (#x8FFDF7 #xE6F2) + (#x8FFDF8 #xE6F3) + (#x8FFDF9 #xE6F4) + (#x8FFDFA #xE6F5) + (#x8FFDFB #xE6F6) + (#x8FFDFC #xE6F7) + (#x8FFDFD #xE6F8) + (#x8FFDFE #xE6F9) + (#x8FFEA1 #xE6FA) + (#x8FFEA2 #xE6FB) + (#x8FFEA3 #xE6FC) + (#x8FFEA4 #xE6FD) + (#x8FFEA5 #xE6FE) + (#x8FFEA6 #xE6FF) + (#x8FFEA7 #xE700) + (#x8FFEA8 #xE701) + (#x8FFEA9 #xE702) + (#x8FFEAA #xE703) + (#x8FFEAB #xE704) + (#x8FFEAC #xE705) + (#x8FFEAD #xE706) + (#x8FFEAE #xE707) + (#x8FFEAF #xE708) + (#x8FFEB0 #xE709) + (#x8FFEB1 #xE70A) + (#x8FFEB2 #xE70B) + (#x8FFEB3 #xE70C) + (#x8FFEB4 #xE70D) + (#x8FFEB5 #xE70E) + (#x8FFEB6 #xE70F) + (#x8FFEB7 #xE710) + (#x8FFEB8 #xE711) + (#x8FFEB9 #xE712) + (#x8FFEBA #xE713) + (#x8FFEBB #xE714) + (#x8FFEBC #xE715) + (#x8FFEBD #xE716) + (#x8FFEBE #xE717) + (#x8FFEBF #xE718) + (#x8FFEC0 #xE719) + (#x8FFEC1 #xE71A) + (#x8FFEC2 #xE71B) + (#x8FFEC3 #xE71C) + (#x8FFEC4 #xE71D) + (#x8FFEC5 #xE71E) + (#x8FFEC6 #xE71F) + (#x8FFEC7 #xE720) + (#x8FFEC8 #xE721) + (#x8FFEC9 #xE722) + (#x8FFECA #xE723) + (#x8FFECB #xE724) + (#x8FFECC #xE725) + (#x8FFECD #xE726) + (#x8FFECE #xE727) + (#x8FFECF #xE728) + (#x8FFED0 #xE729) + (#x8FFED1 #xE72A) + (#x8FFED2 #xE72B) + (#x8FFED3 #xE72C) + (#x8FFED4 #xE72D) + (#x8FFED5 #xE72E) + (#x8FFED6 #xE72F) + (#x8FFED7 #xE730) + (#x8FFED8 #xE731) + (#x8FFED9 #xE732) + (#x8FFEDA #xE733) + (#x8FFEDB #xE734) + (#x8FFEDC #xE735) + (#x8FFEDD #xE736) + (#x8FFEDE #xE737) + (#x8FFEDF #xE738) + (#x8FFEE0 #xE739) + (#x8FFEE1 #xE73A) + (#x8FFEE2 #xE73B) + (#x8FFEE3 #xE73C) + (#x8FFEE4 #xE73D) + (#x8FFEE5 #xE73E) + (#x8FFEE6 #xE73F) + (#x8FFEE7 #xE740) + (#x8FFEE8 #xE741) + (#x8FFEE9 #xE742) + (#x8FFEEA #xE743) + (#x8FFEEB #xE744) + (#x8FFEEC #xE745) + (#x8FFEED #xE746) + (#x8FFEEE #xE747) + (#x8FFEEF #xE748) + (#x8FFEF0 #xE749) + (#x8FFEF1 #xE74A) + (#x8FFEF2 #xE74B) + (#x8FFEF3 #xE74C) + (#x8FFEF4 #xE74D) + (#x8FFEF5 #xE74E) + (#x8FFEF6 #xE74F) + (#x8FFEF7 #xE750) + (#x8FFEF8 #xE751) + (#x8FFEF9 #xE752) + (#x8FFEFA #xE753) + (#x8FFEFB #xE754) + (#x8FFEFC #xE755) + (#x8FFEFD #xE756) + (#x8FFEFE #xE757) + (#xA1A1 #x3000) + (#xA1A2 #x3001) + (#xA1A3 #x3002) + (#xA1A4 #xFF0C) + (#xA1A5 #xFF0E) + (#xA1A6 #x30FB) + (#xA1A7 #xFF1A) + (#xA1A8 #xFF1B) + (#xA1A9 #xFF1F) + (#xA1AA #xFF01) + (#xA1AB #x309B) + (#xA1AC #x309C) + (#xA1AD #xB4) + (#xA1AE #xFF40) + (#xA1AF #xA8) + (#xA1B0 #xFF3E) + (#xA1B1 #xFFE3) + (#xA1B2 #xFF3F) + (#xA1B3 #x30FD) + (#xA1B4 #x30FE) + (#xA1B5 #x309D) + (#xA1B6 #x309E) + (#xA1B7 #x3003) + (#xA1B8 #x4EDD) + (#xA1B9 #x3005) + (#xA1BA #x3006) + (#xA1BB #x3007) + (#xA1BC #x30FC) + (#xA1BD #x2015) + (#xA1BE #x2010) + (#xA1BF #xFF0F) + (#xA1C0 #xFF3C) + (#xA1C1 #x301C) + (#xA1C2 #x2016) + (#xA1C3 #xFF5C) + (#xA1C4 #x2026) + (#xA1C5 #x2025) + (#xA1C6 #x2018) + (#xA1C7 #x2019) + (#xA1C8 #x201C) + (#xA1C9 #x201D) + (#xA1CA #xFF08) + (#xA1CB #xFF09) + (#xA1CC #x3014) + (#xA1CD #x3015) + (#xA1CE #xFF3B) + (#xA1CF #xFF3D) + (#xA1D0 #xFF5B) + (#xA1D1 #xFF5D) + (#xA1D2 #x3008) + (#xA1D3 #x3009) + (#xA1D4 #x300A) + (#xA1D5 #x300B) + (#xA1D6 #x300C) + (#xA1D7 #x300D) + (#xA1D8 #x300E) + (#xA1D9 #x300F) + (#xA1DA #x3010) + (#xA1DB #x3011) + (#xA1DC #xFF0B) + (#xA1DD #x2212) + (#xA1DE #xB1) + (#xA1DF #xD7) + (#xA1E0 #xF7) + (#xA1E1 #xFF1D) + (#xA1E2 #x2260) + (#xA1E3 #xFF1C) + (#xA1E4 #xFF1E) + (#xA1E5 #x2266) + (#xA1E6 #x2267) + (#xA1E7 #x221E) + (#xA1E8 #x2234) + (#xA1E9 #x2642) + (#xA1EA #x2640) + (#xA1EB #xB0) + (#xA1EC #x2032) + (#xA1ED #x2033) + (#xA1EE #x2103) + (#xA1EF #xFFE5) + (#xA1F0 #xFF04) + (#xA1F1 #xA2) + (#xA1F2 #xA3) + (#xA1F3 #xFF05) + (#xA1F4 #xFF03) + (#xA1F5 #xFF06) + (#xA1F6 #xFF0A) + (#xA1F7 #xFF20) + (#xA1F8 #xA7) + (#xA1F9 #x2606) + (#xA1FA #x2605) + (#xA1FB #x25CB) + (#xA1FC #x25CF) + (#xA1FD #x25CE) + (#xA1FE #x25C7) + (#xA2A1 #x25C6) + (#xA2A2 #x25A1) + (#xA2A3 #x25A0) + (#xA2A4 #x25B3) + (#xA2A5 #x25B2) + (#xA2A6 #x25BD) + (#xA2A7 #x25BC) + (#xA2A8 #x203B) + (#xA2A9 #x3012) + (#xA2AA #x2192) + (#xA2AB #x2190) + (#xA2AC #x2191) + (#xA2AD #x2193) + (#xA2AE #x3013) + (#xA2BA #x2208) + (#xA2BB #x220B) + (#xA2BC #x2286) + (#xA2BD #x2287) + (#xA2BE #x2282) + (#xA2BF #x2283) + (#xA2C0 #x222A) + (#xA2C1 #x2229) + (#xA2CA #x2227) + (#xA2CB #x2228) + (#xA2CC #xAC) + (#xA2CD #x21D2) + (#xA2CE #x21D4) + (#xA2CF #x2200) + (#xA2D0 #x2203) + (#xA2DC #x2220) + (#xA2DD #x22A5) + (#xA2DE #x2312) + (#xA2DF #x2202) + (#xA2E0 #x2207) + (#xA2E1 #x2261) + (#xA2E2 #x2252) + (#xA2E3 #x226A) + (#xA2E4 #x226B) + (#xA2E5 #x221A) + (#xA2E6 #x223D) + (#xA2E7 #x221D) + (#xA2E8 #x2235) + (#xA2E9 #x222B) + (#xA2EA #x222C) + (#xA2F2 #x212B) + (#xA2F3 #x2030) + (#xA2F4 #x266F) + (#xA2F5 #x266D) + (#xA2F6 #x266A) + (#xA2F7 #x2020) + (#xA2F8 #x2021) + (#xA2F9 #xB6) + (#xA2FE #x25EF) + (#xA3B0 #xFF10) + (#xA3B1 #xFF11) + (#xA3B2 #xFF12) + (#xA3B3 #xFF13) + (#xA3B4 #xFF14) + (#xA3B5 #xFF15) + (#xA3B6 #xFF16) + (#xA3B7 #xFF17) + (#xA3B8 #xFF18) + (#xA3B9 #xFF19) + (#xA3C1 #xFF21) + (#xA3C2 #xFF22) + (#xA3C3 #xFF23) + (#xA3C4 #xFF24) + (#xA3C5 #xFF25) + (#xA3C6 #xFF26) + (#xA3C7 #xFF27) + (#xA3C8 #xFF28) + (#xA3C9 #xFF29) + (#xA3CA #xFF2A) + (#xA3CB #xFF2B) + (#xA3CC #xFF2C) + (#xA3CD #xFF2D) + (#xA3CE #xFF2E) + (#xA3CF #xFF2F) + (#xA3D0 #xFF30) + (#xA3D1 #xFF31) + (#xA3D2 #xFF32) + (#xA3D3 #xFF33) + (#xA3D4 #xFF34) + (#xA3D5 #xFF35) + (#xA3D6 #xFF36) + (#xA3D7 #xFF37) + (#xA3D8 #xFF38) + (#xA3D9 #xFF39) + (#xA3DA #xFF3A) + (#xA3E1 #xFF41) + (#xA3E2 #xFF42) + (#xA3E3 #xFF43) + (#xA3E4 #xFF44) + (#xA3E5 #xFF45) + (#xA3E6 #xFF46) + (#xA3E7 #xFF47) + (#xA3E8 #xFF48) + (#xA3E9 #xFF49) + (#xA3EA #xFF4A) + (#xA3EB #xFF4B) + (#xA3EC #xFF4C) + (#xA3ED #xFF4D) + (#xA3EE #xFF4E) + (#xA3EF #xFF4F) + (#xA3F0 #xFF50) + (#xA3F1 #xFF51) + (#xA3F2 #xFF52) + (#xA3F3 #xFF53) + (#xA3F4 #xFF54) + (#xA3F5 #xFF55) + (#xA3F6 #xFF56) + (#xA3F7 #xFF57) + (#xA3F8 #xFF58) + (#xA3F9 #xFF59) + (#xA3FA #xFF5A) + (#xA4A1 #x3041) + (#xA4A2 #x3042) + (#xA4A3 #x3043) + (#xA4A4 #x3044) + (#xA4A5 #x3045) + (#xA4A6 #x3046) + (#xA4A7 #x3047) + (#xA4A8 #x3048) + (#xA4A9 #x3049) + (#xA4AA #x304A) + (#xA4AB #x304B) + (#xA4AC #x304C) + (#xA4AD #x304D) + (#xA4AE #x304E) + (#xA4AF #x304F) + (#xA4B0 #x3050) + (#xA4B1 #x3051) + (#xA4B2 #x3052) + (#xA4B3 #x3053) + (#xA4B4 #x3054) + (#xA4B5 #x3055) + (#xA4B6 #x3056) + (#xA4B7 #x3057) + (#xA4B8 #x3058) + (#xA4B9 #x3059) + (#xA4BA #x305A) + (#xA4BB #x305B) + (#xA4BC #x305C) + (#xA4BD #x305D) + (#xA4BE #x305E) + (#xA4BF #x305F) + (#xA4C0 #x3060) + (#xA4C1 #x3061) + (#xA4C2 #x3062) + (#xA4C3 #x3063) + (#xA4C4 #x3064) + (#xA4C5 #x3065) + (#xA4C6 #x3066) + (#xA4C7 #x3067) + (#xA4C8 #x3068) + (#xA4C9 #x3069) + (#xA4CA #x306A) + (#xA4CB #x306B) + (#xA4CC #x306C) + (#xA4CD #x306D) + (#xA4CE #x306E) + (#xA4CF #x306F) + (#xA4D0 #x3070) + (#xA4D1 #x3071) + (#xA4D2 #x3072) + (#xA4D3 #x3073) + (#xA4D4 #x3074) + (#xA4D5 #x3075) + (#xA4D6 #x3076) + (#xA4D7 #x3077) + (#xA4D8 #x3078) + (#xA4D9 #x3079) + (#xA4DA #x307A) + (#xA4DB #x307B) + (#xA4DC #x307C) + (#xA4DD #x307D) + (#xA4DE #x307E) + (#xA4DF #x307F) + (#xA4E0 #x3080) + (#xA4E1 #x3081) + (#xA4E2 #x3082) + (#xA4E3 #x3083) + (#xA4E4 #x3084) + (#xA4E5 #x3085) + (#xA4E6 #x3086) + (#xA4E7 #x3087) + (#xA4E8 #x3088) + (#xA4E9 #x3089) + (#xA4EA #x308A) + (#xA4EB #x308B) + (#xA4EC #x308C) + (#xA4ED #x308D) + (#xA4EE #x308E) + (#xA4EF #x308F) + (#xA4F0 #x3090) + (#xA4F1 #x3091) + (#xA4F2 #x3092) + (#xA4F3 #x3093) + (#xA5A1 #x30A1) + (#xA5A2 #x30A2) + (#xA5A3 #x30A3) + (#xA5A4 #x30A4) + (#xA5A5 #x30A5) + (#xA5A6 #x30A6) + (#xA5A7 #x30A7) + (#xA5A8 #x30A8) + (#xA5A9 #x30A9) + (#xA5AA #x30AA) + (#xA5AB #x30AB) + (#xA5AC #x30AC) + (#xA5AD #x30AD) + (#xA5AE #x30AE) + (#xA5AF #x30AF) + (#xA5B0 #x30B0) + (#xA5B1 #x30B1) + (#xA5B2 #x30B2) + (#xA5B3 #x30B3) + (#xA5B4 #x30B4) + (#xA5B5 #x30B5) + (#xA5B6 #x30B6) + (#xA5B7 #x30B7) + (#xA5B8 #x30B8) + (#xA5B9 #x30B9) + (#xA5BA #x30BA) + (#xA5BB #x30BB) + (#xA5BC #x30BC) + (#xA5BD #x30BD) + (#xA5BE #x30BE) + (#xA5BF #x30BF) + (#xA5C0 #x30C0) + (#xA5C1 #x30C1) + (#xA5C2 #x30C2) + (#xA5C3 #x30C3) + (#xA5C4 #x30C4) + (#xA5C5 #x30C5) + (#xA5C6 #x30C6) + (#xA5C7 #x30C7) + (#xA5C8 #x30C8) + (#xA5C9 #x30C9) + (#xA5CA #x30CA) + (#xA5CB #x30CB) + (#xA5CC #x30CC) + (#xA5CD #x30CD) + (#xA5CE #x30CE) + (#xA5CF #x30CF) + (#xA5D0 #x30D0) + (#xA5D1 #x30D1) + (#xA5D2 #x30D2) + (#xA5D3 #x30D3) + (#xA5D4 #x30D4) + (#xA5D5 #x30D5) + (#xA5D6 #x30D6) + (#xA5D7 #x30D7) + (#xA5D8 #x30D8) + (#xA5D9 #x30D9) + (#xA5DA #x30DA) + (#xA5DB #x30DB) + (#xA5DC #x30DC) + (#xA5DD #x30DD) + (#xA5DE #x30DE) + (#xA5DF #x30DF) + (#xA5E0 #x30E0) + (#xA5E1 #x30E1) + (#xA5E2 #x30E2) + (#xA5E3 #x30E3) + (#xA5E4 #x30E4) + (#xA5E5 #x30E5) + (#xA5E6 #x30E6) + (#xA5E7 #x30E7) + (#xA5E8 #x30E8) + (#xA5E9 #x30E9) + (#xA5EA #x30EA) + (#xA5EB #x30EB) + (#xA5EC #x30EC) + (#xA5ED #x30ED) + (#xA5EE #x30EE) + (#xA5EF #x30EF) + (#xA5F0 #x30F0) + (#xA5F1 #x30F1) + (#xA5F2 #x30F2) + (#xA5F3 #x30F3) + (#xA5F4 #x30F4) + (#xA5F5 #x30F5) + (#xA5F6 #x30F6) + (#xA6A1 #x391) + (#xA6A2 #x392) + (#xA6A3 #x393) + (#xA6A4 #x394) + (#xA6A5 #x395) + (#xA6A6 #x396) + (#xA6A7 #x397) + (#xA6A8 #x398) + (#xA6A9 #x399) + (#xA6AA #x39A) + (#xA6AB #x39B) + (#xA6AC #x39C) + (#xA6AD #x39D) + (#xA6AE #x39E) + (#xA6AF #x39F) + (#xA6B0 #x3A0) + (#xA6B1 #x3A1) + (#xA6B2 #x3A3) + (#xA6B3 #x3A4) + (#xA6B4 #x3A5) + (#xA6B5 #x3A6) + (#xA6B6 #x3A7) + (#xA6B7 #x3A8) + (#xA6B8 #x3A9) + (#xA6C1 #x3B1) + (#xA6C2 #x3B2) + (#xA6C3 #x3B3) + (#xA6C4 #x3B4) + (#xA6C5 #x3B5) + (#xA6C6 #x3B6) + (#xA6C7 #x3B7) + (#xA6C8 #x3B8) + (#xA6C9 #x3B9) + (#xA6CA #x3BA) + (#xA6CB #x3BB) + (#xA6CC #x3BC) + (#xA6CD #x3BD) + (#xA6CE #x3BE) + (#xA6CF #x3BF) + (#xA6D0 #x3C0) + (#xA6D1 #x3C1) + (#xA6D2 #x3C3) + (#xA6D3 #x3C4) + (#xA6D4 #x3C5) + (#xA6D5 #x3C6) + (#xA6D6 #x3C7) + (#xA6D7 #x3C8) + (#xA6D8 #x3C9) + (#xA7A1 #x410) + (#xA7A2 #x411) + (#xA7A3 #x412) + (#xA7A4 #x413) + (#xA7A5 #x414) + (#xA7A6 #x415) + (#xA7A7 #x401) + (#xA7A8 #x416) + (#xA7A9 #x417) + (#xA7AA #x418) + (#xA7AB #x419) + (#xA7AC #x41A) + (#xA7AD #x41B) + (#xA7AE #x41C) + (#xA7AF #x41D) + (#xA7B0 #x41E) + (#xA7B1 #x41F) + (#xA7B2 #x420) + (#xA7B3 #x421) + (#xA7B4 #x422) + (#xA7B5 #x423) + (#xA7B6 #x424) + (#xA7B7 #x425) + (#xA7B8 #x426) + (#xA7B9 #x427) + (#xA7BA #x428) + (#xA7BB #x429) + (#xA7BC #x42A) + (#xA7BD #x42B) + (#xA7BE #x42C) + (#xA7BF #x42D) + (#xA7C0 #x42E) + (#xA7C1 #x42F) + (#xA7D1 #x430) + (#xA7D2 #x431) + (#xA7D3 #x432) + (#xA7D4 #x433) + (#xA7D5 #x434) + (#xA7D6 #x435) + (#xA7D7 #x451) + (#xA7D8 #x436) + (#xA7D9 #x437) + (#xA7DA #x438) + (#xA7DB #x439) + (#xA7DC #x43A) + (#xA7DD #x43B) + (#xA7DE #x43C) + (#xA7DF #x43D) + (#xA7E0 #x43E) + (#xA7E1 #x43F) + (#xA7E2 #x440) + (#xA7E3 #x441) + (#xA7E4 #x442) + (#xA7E5 #x443) + (#xA7E6 #x444) + (#xA7E7 #x445) + (#xA7E8 #x446) + (#xA7E9 #x447) + (#xA7EA #x448) + (#xA7EB #x449) + (#xA7EC #x44A) + (#xA7ED #x44B) + (#xA7EE #x44C) + (#xA7EF #x44D) + (#xA7F0 #x44E) + (#xA7F1 #x44F) + (#xA8A1 #x2500) + (#xA8A2 #x2502) + (#xA8A3 #x250C) + (#xA8A4 #x2510) + (#xA8A5 #x2518) + (#xA8A6 #x2514) + (#xA8A7 #x251C) + (#xA8A8 #x252C) + (#xA8A9 #x2524) + (#xA8AA #x2534) + (#xA8AB #x253C) + (#xA8AC #x2501) + (#xA8AD #x2503) + (#xA8AE #x250F) + (#xA8AF #x2513) + (#xA8B0 #x251B) + (#xA8B1 #x2517) + (#xA8B2 #x2523) + (#xA8B3 #x2533) + (#xA8B4 #x252B) + (#xA8B5 #x253B) + (#xA8B6 #x254B) + (#xA8B7 #x2520) + (#xA8B8 #x252F) + (#xA8B9 #x2528) + (#xA8BA #x2537) + (#xA8BB #x253F) + (#xA8BC #x251D) + (#xA8BD #x2530) + (#xA8BE #x2525) + (#xA8BF #x2538) + (#xA8C0 #x2542) + (#xB0A1 #x4E9C) + (#xB0A2 #x5516) + (#xB0A3 #x5A03) + (#xB0A4 #x963F) + (#xB0A5 #x54C0) + (#xB0A6 #x611B) + (#xB0A7 #x6328) + (#xB0A8 #x59F6) + (#xB0A9 #x9022) + (#xB0AA #x8475) + (#xB0AB #x831C) + (#xB0AC #x7A50) + (#xB0AD #x60AA) + (#xB0AE #x63E1) + (#xB0AF #x6E25) + (#xB0B0 #x65ED) + (#xB0B1 #x8466) + (#xB0B2 #x82A6) + (#xB0B3 #x9BF5) + (#xB0B4 #x6893) + (#xB0B5 #x5727) + (#xB0B6 #x65A1) + (#xB0B7 #x6271) + (#xB0B8 #x5B9B) + (#xB0B9 #x59D0) + (#xB0BA #x867B) + (#xB0BB #x98F4) + (#xB0BC #x7D62) + (#xB0BD #x7DBE) + (#xB0BE #x9B8E) + (#xB0BF #x6216) + (#xB0C0 #x7C9F) + (#xB0C1 #x88B7) + (#xB0C2 #x5B89) + (#xB0C3 #x5EB5) + (#xB0C4 #x6309) + (#xB0C5 #x6697) + (#xB0C6 #x6848) + (#xB0C7 #x95C7) + (#xB0C8 #x978D) + (#xB0C9 #x674F) + (#xB0CA #x4EE5) + (#xB0CB #x4F0A) + (#xB0CC #x4F4D) + (#xB0CD #x4F9D) + (#xB0CE #x5049) + (#xB0CF #x56F2) + (#xB0D0 #x5937) + (#xB0D1 #x59D4) + (#xB0D2 #x5A01) + (#xB0D3 #x5C09) + (#xB0D4 #x60DF) + (#xB0D5 #x610F) + (#xB0D6 #x6170) + (#xB0D7 #x6613) + (#xB0D8 #x6905) + (#xB0D9 #x70BA) + (#xB0DA #x754F) + (#xB0DB #x7570) + (#xB0DC #x79FB) + (#xB0DD #x7DAD) + (#xB0DE #x7DEF) + (#xB0DF #x80C3) + (#xB0E0 #x840E) + (#xB0E1 #x8863) + (#xB0E2 #x8B02) + (#xB0E3 #x9055) + (#xB0E4 #x907A) + (#xB0E5 #x533B) + (#xB0E6 #x4E95) + (#xB0E7 #x4EA5) + (#xB0E8 #x57DF) + (#xB0E9 #x80B2) + (#xB0EA #x90C1) + (#xB0EB #x78EF) + (#xB0EC #x4E00) + (#xB0ED #x58F1) + (#xB0EE #x6EA2) + (#xB0EF #x9038) + (#xB0F0 #x7A32) + (#xB0F1 #x8328) + (#xB0F2 #x828B) + (#xB0F3 #x9C2F) + (#xB0F4 #x5141) + (#xB0F5 #x5370) + (#xB0F6 #x54BD) + (#xB0F7 #x54E1) + (#xB0F8 #x56E0) + (#xB0F9 #x59FB) + (#xB0FA #x5F15) + (#xB0FB #x98F2) + (#xB0FC #x6DEB) + (#xB0FD #x80E4) + (#xB0FE #x852D) + (#xB1A1 #x9662) + (#xB1A2 #x9670) + (#xB1A3 #x96A0) + (#xB1A4 #x97FB) + (#xB1A5 #x540B) + (#xB1A6 #x53F3) + (#xB1A7 #x5B87) + (#xB1A8 #x70CF) + (#xB1A9 #x7FBD) + (#xB1AA #x8FC2) + (#xB1AB #x96E8) + (#xB1AC #x536F) + (#xB1AD #x9D5C) + (#xB1AE #x7ABA) + (#xB1AF #x4E11) + (#xB1B0 #x7893) + (#xB1B1 #x81FC) + (#xB1B2 #x6E26) + (#xB1B3 #x5618) + (#xB1B4 #x5504) + (#xB1B5 #x6B1D) + (#xB1B6 #x851A) + (#xB1B7 #x9C3B) + (#xB1B8 #x59E5) + (#xB1B9 #x53A9) + (#xB1BA #x6D66) + (#xB1BB #x74DC) + (#xB1BC #x958F) + (#xB1BD #x5642) + (#xB1BE #x4E91) + (#xB1BF #x904B) + (#xB1C0 #x96F2) + (#xB1C1 #x834F) + (#xB1C2 #x990C) + (#xB1C3 #x53E1) + (#xB1C4 #x55B6) + (#xB1C5 #x5B30) + (#xB1C6 #x5F71) + (#xB1C7 #x6620) + (#xB1C8 #x66F3) + (#xB1C9 #x6804) + (#xB1CA #x6C38) + (#xB1CB #x6CF3) + (#xB1CC #x6D29) + (#xB1CD #x745B) + (#xB1CE #x76C8) + (#xB1CF #x7A4E) + (#xB1D0 #x9834) + (#xB1D1 #x82F1) + (#xB1D2 #x885B) + (#xB1D3 #x8A60) + (#xB1D4 #x92ED) + (#xB1D5 #x6DB2) + (#xB1D6 #x75AB) + (#xB1D7 #x76CA) + (#xB1D8 #x99C5) + (#xB1D9 #x60A6) + (#xB1DA #x8B01) + (#xB1DB #x8D8A) + (#xB1DC #x95B2) + (#xB1DD #x698E) + (#xB1DE #x53AD) + (#xB1DF #x5186) + (#xB1E0 #x5712) + (#xB1E1 #x5830) + (#xB1E2 #x5944) + (#xB1E3 #x5BB4) + (#xB1E4 #x5EF6) + (#xB1E5 #x6028) + (#xB1E6 #x63A9) + (#xB1E7 #x63F4) + (#xB1E8 #x6CBF) + (#xB1E9 #x6F14) + (#xB1EA #x708E) + (#xB1EB #x7114) + (#xB1EC #x7159) + (#xB1ED #x71D5) + (#xB1EE #x733F) + (#xB1EF #x7E01) + (#xB1F0 #x8276) + (#xB1F1 #x82D1) + (#xB1F2 #x8597) + (#xB1F3 #x9060) + (#xB1F4 #x925B) + (#xB1F5 #x9D1B) + (#xB1F6 #x5869) + (#xB1F7 #x65BC) + (#xB1F8 #x6C5A) + (#xB1F9 #x7525) + (#xB1FA #x51F9) + (#xB1FB #x592E) + (#xB1FC #x5965) + (#xB1FD #x5F80) + (#xB1FE #x5FDC) + (#xB2A1 #x62BC) + (#xB2A2 #x65FA) + (#xB2A3 #x6A2A) + (#xB2A4 #x6B27) + (#xB2A5 #x6BB4) + (#xB2A6 #x738B) + (#xB2A7 #x7FC1) + (#xB2A8 #x8956) + (#xB2A9 #x9D2C) + (#xB2AA #x9D0E) + (#xB2AB #x9EC4) + (#xB2AC #x5CA1) + (#xB2AD #x6C96) + (#xB2AE #x837B) + (#xB2AF #x5104) + (#xB2B0 #x5C4B) + (#xB2B1 #x61B6) + (#xB2B2 #x81C6) + (#xB2B3 #x6876) + (#xB2B4 #x7261) + (#xB2B5 #x4E59) + (#xB2B6 #x4FFA) + (#xB2B7 #x5378) + (#xB2B8 #x6069) + (#xB2B9 #x6E29) + (#xB2BA #x7A4F) + (#xB2BB #x97F3) + (#xB2BC #x4E0B) + (#xB2BD #x5316) + (#xB2BE #x4EEE) + (#xB2BF #x4F55) + (#xB2C0 #x4F3D) + (#xB2C1 #x4FA1) + (#xB2C2 #x4F73) + (#xB2C3 #x52A0) + (#xB2C4 #x53EF) + (#xB2C5 #x5609) + (#xB2C6 #x590F) + (#xB2C7 #x5AC1) + (#xB2C8 #x5BB6) + (#xB2C9 #x5BE1) + (#xB2CA #x79D1) + (#xB2CB #x6687) + (#xB2CC #x679C) + (#xB2CD #x67B6) + (#xB2CE #x6B4C) + (#xB2CF #x6CB3) + (#xB2D0 #x706B) + (#xB2D1 #x73C2) + (#xB2D2 #x798D) + (#xB2D3 #x79BE) + (#xB2D4 #x7A3C) + (#xB2D5 #x7B87) + (#xB2D6 #x82B1) + (#xB2D7 #x82DB) + (#xB2D8 #x8304) + (#xB2D9 #x8377) + (#xB2DA #x83EF) + (#xB2DB #x83D3) + (#xB2DC #x8766) + (#xB2DD #x8AB2) + (#xB2DE #x5629) + (#xB2DF #x8CA8) + (#xB2E0 #x8FE6) + (#xB2E1 #x904E) + (#xB2E2 #x971E) + (#xB2E3 #x868A) + (#xB2E4 #x4FC4) + (#xB2E5 #x5CE8) + (#xB2E6 #x6211) + (#xB2E7 #x7259) + (#xB2E8 #x753B) + (#xB2E9 #x81E5) + (#xB2EA #x82BD) + (#xB2EB #x86FE) + (#xB2EC #x8CC0) + (#xB2ED #x96C5) + (#xB2EE #x9913) + (#xB2EF #x99D5) + (#xB2F0 #x4ECB) + (#xB2F1 #x4F1A) + (#xB2F2 #x89E3) + (#xB2F3 #x56DE) + (#xB2F4 #x584A) + (#xB2F5 #x58CA) + (#xB2F6 #x5EFB) + (#xB2F7 #x5FEB) + (#xB2F8 #x602A) + (#xB2F9 #x6094) + (#xB2FA #x6062) + (#xB2FB #x61D0) + (#xB2FC #x6212) + (#xB2FD #x62D0) + (#xB2FE #x6539) + (#xB3A1 #x9B41) + (#xB3A2 #x6666) + (#xB3A3 #x68B0) + (#xB3A4 #x6D77) + (#xB3A5 #x7070) + (#xB3A6 #x754C) + (#xB3A7 #x7686) + (#xB3A8 #x7D75) + (#xB3A9 #x82A5) + (#xB3AA #x87F9) + (#xB3AB #x958B) + (#xB3AC #x968E) + (#xB3AD #x8C9D) + (#xB3AE #x51F1) + (#xB3AF #x52BE) + (#xB3B0 #x5916) + (#xB3B1 #x54B3) + (#xB3B2 #x5BB3) + (#xB3B3 #x5D16) + (#xB3B4 #x6168) + (#xB3B5 #x6982) + (#xB3B6 #x6DAF) + (#xB3B7 #x788D) + (#xB3B8 #x84CB) + (#xB3B9 #x8857) + (#xB3BA #x8A72) + (#xB3BB #x93A7) + (#xB3BC #x9AB8) + (#xB3BD #x6D6C) + (#xB3BE #x99A8) + (#xB3BF #x86D9) + (#xB3C0 #x57A3) + (#xB3C1 #x67FF) + (#xB3C2 #x86CE) + (#xB3C3 #x920E) + (#xB3C4 #x5283) + (#xB3C5 #x5687) + (#xB3C6 #x5404) + (#xB3C7 #x5ED3) + (#xB3C8 #x62E1) + (#xB3C9 #x64B9) + (#xB3CA #x683C) + (#xB3CB #x6838) + (#xB3CC #x6BBB) + (#xB3CD #x7372) + (#xB3CE #x78BA) + (#xB3CF #x7A6B) + (#xB3D0 #x899A) + (#xB3D1 #x89D2) + (#xB3D2 #x8D6B) + (#xB3D3 #x8F03) + (#xB3D4 #x90ED) + (#xB3D5 #x95A3) + (#xB3D6 #x9694) + (#xB3D7 #x9769) + (#xB3D8 #x5B66) + (#xB3D9 #x5CB3) + (#xB3DA #x697D) + (#xB3DB #x984D) + (#xB3DC #x984E) + (#xB3DD #x639B) + (#xB3DE #x7B20) + (#xB3DF #x6A2B) + (#xB3E0 #x6A7F) + (#xB3E1 #x68B6) + (#xB3E2 #x9C0D) + (#xB3E3 #x6F5F) + (#xB3E4 #x5272) + (#xB3E5 #x559D) + (#xB3E6 #x6070) + (#xB3E7 #x62EC) + (#xB3E8 #x6D3B) + (#xB3E9 #x6E07) + (#xB3EA #x6ED1) + (#xB3EB #x845B) + (#xB3EC #x8910) + (#xB3ED #x8F44) + (#xB3EE #x4E14) + (#xB3EF #x9C39) + (#xB3F0 #x53F6) + (#xB3F1 #x691B) + (#xB3F2 #x6A3A) + (#xB3F3 #x9784) + (#xB3F4 #x682A) + (#xB3F5 #x515C) + (#xB3F6 #x7AC3) + (#xB3F7 #x84B2) + (#xB3F8 #x91DC) + (#xB3F9 #x938C) + (#xB3FA #x565B) + (#xB3FB #x9D28) + (#xB3FC #x6822) + (#xB3FD #x8305) + (#xB3FE #x8431) + (#xB4A1 #x7CA5) + (#xB4A2 #x5208) + (#xB4A3 #x82C5) + (#xB4A4 #x74E6) + (#xB4A5 #x4E7E) + (#xB4A6 #x4F83) + (#xB4A7 #x51A0) + (#xB4A8 #x5BD2) + (#xB4A9 #x520A) + (#xB4AA #x52D8) + (#xB4AB #x52E7) + (#xB4AC #x5DFB) + (#xB4AD #x559A) + (#xB4AE #x582A) + (#xB4AF #x59E6) + (#xB4B0 #x5B8C) + (#xB4B1 #x5B98) + (#xB4B2 #x5BDB) + (#xB4B3 #x5E72) + (#xB4B4 #x5E79) + (#xB4B5 #x60A3) + (#xB4B6 #x611F) + (#xB4B7 #x6163) + (#xB4B8 #x61BE) + (#xB4B9 #x63DB) + (#xB4BA #x6562) + (#xB4BB #x67D1) + (#xB4BC #x6853) + (#xB4BD #x68FA) + (#xB4BE #x6B3E) + (#xB4BF #x6B53) + (#xB4C0 #x6C57) + (#xB4C1 #x6F22) + (#xB4C2 #x6F97) + (#xB4C3 #x6F45) + (#xB4C4 #x74B0) + (#xB4C5 #x7518) + (#xB4C6 #x76E3) + (#xB4C7 #x770B) + (#xB4C8 #x7AFF) + (#xB4C9 #x7BA1) + (#xB4CA #x7C21) + (#xB4CB #x7DE9) + (#xB4CC #x7F36) + (#xB4CD #x7FF0) + (#xB4CE #x809D) + (#xB4CF #x8266) + (#xB4D0 #x839E) + (#xB4D1 #x89B3) + (#xB4D2 #x8ACC) + (#xB4D3 #x8CAB) + (#xB4D4 #x9084) + (#xB4D5 #x9451) + (#xB4D6 #x9593) + (#xB4D7 #x9591) + (#xB4D8 #x95A2) + (#xB4D9 #x9665) + (#xB4DA #x97D3) + (#xB4DB #x9928) + (#xB4DC #x8218) + (#xB4DD #x4E38) + (#xB4DE #x542B) + (#xB4DF #x5CB8) + (#xB4E0 #x5DCC) + (#xB4E1 #x73A9) + (#xB4E2 #x764C) + (#xB4E3 #x773C) + (#xB4E4 #x5CA9) + (#xB4E5 #x7FEB) + (#xB4E6 #x8D0B) + (#xB4E7 #x96C1) + (#xB4E8 #x9811) + (#xB4E9 #x9854) + (#xB4EA #x9858) + (#xB4EB #x4F01) + (#xB4EC #x4F0E) + (#xB4ED #x5371) + (#xB4EE #x559C) + (#xB4EF #x5668) + (#xB4F0 #x57FA) + (#xB4F1 #x5947) + (#xB4F2 #x5B09) + (#xB4F3 #x5BC4) + (#xB4F4 #x5C90) + (#xB4F5 #x5E0C) + (#xB4F6 #x5E7E) + (#xB4F7 #x5FCC) + (#xB4F8 #x63EE) + (#xB4F9 #x673A) + (#xB4FA #x65D7) + (#xB4FB #x65E2) + (#xB4FC #x671F) + (#xB4FD #x68CB) + (#xB4FE #x68C4) + (#xB5A1 #x6A5F) + (#xB5A2 #x5E30) + (#xB5A3 #x6BC5) + (#xB5A4 #x6C17) + (#xB5A5 #x6C7D) + (#xB5A6 #x757F) + (#xB5A7 #x7948) + (#xB5A8 #x5B63) + (#xB5A9 #x7A00) + (#xB5AA #x7D00) + (#xB5AB #x5FBD) + (#xB5AC #x898F) + (#xB5AD #x8A18) + (#xB5AE #x8CB4) + (#xB5AF #x8D77) + (#xB5B0 #x8ECC) + (#xB5B1 #x8F1D) + (#xB5B2 #x98E2) + (#xB5B3 #x9A0E) + (#xB5B4 #x9B3C) + (#xB5B5 #x4E80) + (#xB5B6 #x507D) + (#xB5B7 #x5100) + (#xB5B8 #x5993) + (#xB5B9 #x5B9C) + (#xB5BA #x622F) + (#xB5BB #x6280) + (#xB5BC #x64EC) + (#xB5BD #x6B3A) + (#xB5BE #x72A0) + (#xB5BF #x7591) + (#xB5C0 #x7947) + (#xB5C1 #x7FA9) + (#xB5C2 #x87FB) + (#xB5C3 #x8ABC) + (#xB5C4 #x8B70) + (#xB5C5 #x63AC) + (#xB5C6 #x83CA) + (#xB5C7 #x97A0) + (#xB5C8 #x5409) + (#xB5C9 #x5403) + (#xB5CA #x55AB) + (#xB5CB #x6854) + (#xB5CC #x6A58) + (#xB5CD #x8A70) + (#xB5CE #x7827) + (#xB5CF #x6775) + (#xB5D0 #x9ECD) + (#xB5D1 #x5374) + (#xB5D2 #x5BA2) + (#xB5D3 #x811A) + (#xB5D4 #x8650) + (#xB5D5 #x9006) + (#xB5D6 #x4E18) + (#xB5D7 #x4E45) + (#xB5D8 #x4EC7) + (#xB5D9 #x4F11) + (#xB5DA #x53CA) + (#xB5DB #x5438) + (#xB5DC #x5BAE) + (#xB5DD #x5F13) + (#xB5DE #x6025) + (#xB5DF #x6551) + (#xB5E0 #x673D) + (#xB5E1 #x6C42) + (#xB5E2 #x6C72) + (#xB5E3 #x6CE3) + (#xB5E4 #x7078) + (#xB5E5 #x7403) + (#xB5E6 #x7A76) + (#xB5E7 #x7AAE) + (#xB5E8 #x7B08) + (#xB5E9 #x7D1A) + (#xB5EA #x7CFE) + (#xB5EB #x7D66) + (#xB5EC #x65E7) + (#xB5ED #x725B) + (#xB5EE #x53BB) + (#xB5EF #x5C45) + (#xB5F0 #x5DE8) + (#xB5F1 #x62D2) + (#xB5F2 #x62E0) + (#xB5F3 #x6319) + (#xB5F4 #x6E20) + (#xB5F5 #x865A) + (#xB5F6 #x8A31) + (#xB5F7 #x8DDD) + (#xB5F8 #x92F8) + (#xB5F9 #x6F01) + (#xB5FA #x79A6) + (#xB5FB #x9B5A) + (#xB5FC #x4EA8) + (#xB5FD #x4EAB) + (#xB5FE #x4EAC) + (#xB6A1 #x4F9B) + (#xB6A2 #x4FA0) + (#xB6A3 #x50D1) + (#xB6A4 #x5147) + (#xB6A5 #x7AF6) + (#xB6A6 #x5171) + (#xB6A7 #x51F6) + (#xB6A8 #x5354) + (#xB6A9 #x5321) + (#xB6AA #x537F) + (#xB6AB #x53EB) + (#xB6AC #x55AC) + (#xB6AD #x5883) + (#xB6AE #x5CE1) + (#xB6AF #x5F37) + (#xB6B0 #x5F4A) + (#xB6B1 #x602F) + (#xB6B2 #x6050) + (#xB6B3 #x606D) + (#xB6B4 #x631F) + (#xB6B5 #x6559) + (#xB6B6 #x6A4B) + (#xB6B7 #x6CC1) + (#xB6B8 #x72C2) + (#xB6B9 #x72ED) + (#xB6BA #x77EF) + (#xB6BB #x80F8) + (#xB6BC #x8105) + (#xB6BD #x8208) + (#xB6BE #x854E) + (#xB6BF #x90F7) + (#xB6C0 #x93E1) + (#xB6C1 #x97FF) + (#xB6C2 #x9957) + (#xB6C3 #x9A5A) + (#xB6C4 #x4EF0) + (#xB6C5 #x51DD) + (#xB6C6 #x5C2D) + (#xB6C7 #x6681) + (#xB6C8 #x696D) + (#xB6C9 #x5C40) + (#xB6CA #x66F2) + (#xB6CB #x6975) + (#xB6CC #x7389) + (#xB6CD #x6850) + (#xB6CE #x7C81) + (#xB6CF #x50C5) + (#xB6D0 #x52E4) + (#xB6D1 #x5747) + (#xB6D2 #x5DFE) + (#xB6D3 #x9326) + (#xB6D4 #x65A4) + (#xB6D5 #x6B23) + (#xB6D6 #x6B3D) + (#xB6D7 #x7434) + (#xB6D8 #x7981) + (#xB6D9 #x79BD) + (#xB6DA #x7B4B) + (#xB6DB #x7DCA) + (#xB6DC #x82B9) + (#xB6DD #x83CC) + (#xB6DE #x887F) + (#xB6DF #x895F) + (#xB6E0 #x8B39) + (#xB6E1 #x8FD1) + (#xB6E2 #x91D1) + (#xB6E3 #x541F) + (#xB6E4 #x9280) + (#xB6E5 #x4E5D) + (#xB6E6 #x5036) + (#xB6E7 #x53E5) + (#xB6E8 #x533A) + (#xB6E9 #x72D7) + (#xB6EA #x7396) + (#xB6EB #x77E9) + (#xB6EC #x82E6) + (#xB6ED #x8EAF) + (#xB6EE #x99C6) + (#xB6EF #x99C8) + (#xB6F0 #x99D2) + (#xB6F1 #x5177) + (#xB6F2 #x611A) + (#xB6F3 #x865E) + (#xB6F4 #x55B0) + (#xB6F5 #x7A7A) + (#xB6F6 #x5076) + (#xB6F7 #x5BD3) + (#xB6F8 #x9047) + (#xB6F9 #x9685) + (#xB6FA #x4E32) + (#xB6FB #x6ADB) + (#xB6FC #x91E7) + (#xB6FD #x5C51) + (#xB6FE #x5C48) + (#xB7A1 #x6398) + (#xB7A2 #x7A9F) + (#xB7A3 #x6C93) + (#xB7A4 #x9774) + (#xB7A5 #x8F61) + (#xB7A6 #x7AAA) + (#xB7A7 #x718A) + (#xB7A8 #x9688) + (#xB7A9 #x7C82) + (#xB7AA #x6817) + (#xB7AB #x7E70) + (#xB7AC #x6851) + (#xB7AD #x936C) + (#xB7AE #x52F2) + (#xB7AF #x541B) + (#xB7B0 #x85AB) + (#xB7B1 #x8A13) + (#xB7B2 #x7FA4) + (#xB7B3 #x8ECD) + (#xB7B4 #x90E1) + (#xB7B5 #x5366) + (#xB7B6 #x8888) + (#xB7B7 #x7941) + (#xB7B8 #x4FC2) + (#xB7B9 #x50BE) + (#xB7BA #x5211) + (#xB7BB #x5144) + (#xB7BC #x5553) + (#xB7BD #x572D) + (#xB7BE #x73EA) + (#xB7BF #x578B) + (#xB7C0 #x5951) + (#xB7C1 #x5F62) + (#xB7C2 #x5F84) + (#xB7C3 #x6075) + (#xB7C4 #x6176) + (#xB7C5 #x6167) + (#xB7C6 #x61A9) + (#xB7C7 #x63B2) + (#xB7C8 #x643A) + (#xB7C9 #x656C) + (#xB7CA #x666F) + (#xB7CB #x6842) + (#xB7CC #x6E13) + (#xB7CD #x7566) + (#xB7CE #x7A3D) + (#xB7CF #x7CFB) + (#xB7D0 #x7D4C) + (#xB7D1 #x7D99) + (#xB7D2 #x7E4B) + (#xB7D3 #x7F6B) + (#xB7D4 #x830E) + (#xB7D5 #x834A) + (#xB7D6 #x86CD) + (#xB7D7 #x8A08) + (#xB7D8 #x8A63) + (#xB7D9 #x8B66) + (#xB7DA #x8EFD) + (#xB7DB #x981A) + (#xB7DC #x9D8F) + (#xB7DD #x82B8) + (#xB7DE #x8FCE) + (#xB7DF #x9BE8) + (#xB7E0 #x5287) + (#xB7E1 #x621F) + (#xB7E2 #x6483) + (#xB7E3 #x6FC0) + (#xB7E4 #x9699) + (#xB7E5 #x6841) + (#xB7E6 #x5091) + (#xB7E7 #x6B20) + (#xB7E8 #x6C7A) + (#xB7E9 #x6F54) + (#xB7EA #x7A74) + (#xB7EB #x7D50) + (#xB7EC #x8840) + (#xB7ED #x8A23) + (#xB7EE #x6708) + (#xB7EF #x4EF6) + (#xB7F0 #x5039) + (#xB7F1 #x5026) + (#xB7F2 #x5065) + (#xB7F3 #x517C) + (#xB7F4 #x5238) + (#xB7F5 #x5263) + (#xB7F6 #x55A7) + (#xB7F7 #x570F) + (#xB7F8 #x5805) + (#xB7F9 #x5ACC) + (#xB7FA #x5EFA) + (#xB7FB #x61B2) + (#xB7FC #x61F8) + (#xB7FD #x62F3) + (#xB7FE #x6372) + (#xB8A1 #x691C) + (#xB8A2 #x6A29) + (#xB8A3 #x727D) + (#xB8A4 #x72AC) + (#xB8A5 #x732E) + (#xB8A6 #x7814) + (#xB8A7 #x786F) + (#xB8A8 #x7D79) + (#xB8A9 #x770C) + (#xB8AA #x80A9) + (#xB8AB #x898B) + (#xB8AC #x8B19) + (#xB8AD #x8CE2) + (#xB8AE #x8ED2) + (#xB8AF #x9063) + (#xB8B0 #x9375) + (#xB8B1 #x967A) + (#xB8B2 #x9855) + (#xB8B3 #x9A13) + (#xB8B4 #x9E78) + (#xB8B5 #x5143) + (#xB8B6 #x539F) + (#xB8B7 #x53B3) + (#xB8B8 #x5E7B) + (#xB8B9 #x5F26) + (#xB8BA #x6E1B) + (#xB8BB #x6E90) + (#xB8BC #x7384) + (#xB8BD #x73FE) + (#xB8BE #x7D43) + (#xB8BF #x8237) + (#xB8C0 #x8A00) + (#xB8C1 #x8AFA) + (#xB8C2 #x9650) + (#xB8C3 #x4E4E) + (#xB8C4 #x500B) + (#xB8C5 #x53E4) + (#xB8C6 #x547C) + (#xB8C7 #x56FA) + (#xB8C8 #x59D1) + (#xB8C9 #x5B64) + (#xB8CA #x5DF1) + (#xB8CB #x5EAB) + (#xB8CC #x5F27) + (#xB8CD #x6238) + (#xB8CE #x6545) + (#xB8CF #x67AF) + (#xB8D0 #x6E56) + (#xB8D1 #x72D0) + (#xB8D2 #x7CCA) + (#xB8D3 #x88B4) + (#xB8D4 #x80A1) + (#xB8D5 #x80E1) + (#xB8D6 #x83F0) + (#xB8D7 #x864E) + (#xB8D8 #x8A87) + (#xB8D9 #x8DE8) + (#xB8DA #x9237) + (#xB8DB #x96C7) + (#xB8DC #x9867) + (#xB8DD #x9F13) + (#xB8DE #x4E94) + (#xB8DF #x4E92) + (#xB8E0 #x4F0D) + (#xB8E1 #x5348) + (#xB8E2 #x5449) + (#xB8E3 #x543E) + (#xB8E4 #x5A2F) + (#xB8E5 #x5F8C) + (#xB8E6 #x5FA1) + (#xB8E7 #x609F) + (#xB8E8 #x68A7) + (#xB8E9 #x6A8E) + (#xB8EA #x745A) + (#xB8EB #x7881) + (#xB8EC #x8A9E) + (#xB8ED #x8AA4) + (#xB8EE #x8B77) + (#xB8EF #x9190) + (#xB8F0 #x4E5E) + (#xB8F1 #x9BC9) + (#xB8F2 #x4EA4) + (#xB8F3 #x4F7C) + (#xB8F4 #x4FAF) + (#xB8F5 #x5019) + (#xB8F6 #x5016) + (#xB8F7 #x5149) + (#xB8F8 #x516C) + (#xB8F9 #x529F) + (#xB8FA #x52B9) + (#xB8FB #x52FE) + (#xB8FC #x539A) + (#xB8FD #x53E3) + (#xB8FE #x5411) + (#xB9A1 #x540E) + (#xB9A2 #x5589) + (#xB9A3 #x5751) + (#xB9A4 #x57A2) + (#xB9A5 #x597D) + (#xB9A6 #x5B54) + (#xB9A7 #x5B5D) + (#xB9A8 #x5B8F) + (#xB9A9 #x5DE5) + (#xB9AA #x5DE7) + (#xB9AB #x5DF7) + (#xB9AC #x5E78) + (#xB9AD #x5E83) + (#xB9AE #x5E9A) + (#xB9AF #x5EB7) + (#xB9B0 #x5F18) + (#xB9B1 #x6052) + (#xB9B2 #x614C) + (#xB9B3 #x6297) + (#xB9B4 #x62D8) + (#xB9B5 #x63A7) + (#xB9B6 #x653B) + (#xB9B7 #x6602) + (#xB9B8 #x6643) + (#xB9B9 #x66F4) + (#xB9BA #x676D) + (#xB9BB #x6821) + (#xB9BC #x6897) + (#xB9BD #x69CB) + (#xB9BE #x6C5F) + (#xB9BF #x6D2A) + (#xB9C0 #x6D69) + (#xB9C1 #x6E2F) + (#xB9C2 #x6E9D) + (#xB9C3 #x7532) + (#xB9C4 #x7687) + (#xB9C5 #x786C) + (#xB9C6 #x7A3F) + (#xB9C7 #x7CE0) + (#xB9C8 #x7D05) + (#xB9C9 #x7D18) + (#xB9CA #x7D5E) + (#xB9CB #x7DB1) + (#xB9CC #x8015) + (#xB9CD #x8003) + (#xB9CE #x80AF) + (#xB9CF #x80B1) + (#xB9D0 #x8154) + (#xB9D1 #x818F) + (#xB9D2 #x822A) + (#xB9D3 #x8352) + (#xB9D4 #x884C) + (#xB9D5 #x8861) + (#xB9D6 #x8B1B) + (#xB9D7 #x8CA2) + (#xB9D8 #x8CFC) + (#xB9D9 #x90CA) + (#xB9DA #x9175) + (#xB9DB #x9271) + (#xB9DC #x783F) + (#xB9DD #x92FC) + (#xB9DE #x95A4) + (#xB9DF #x964D) + (#xB9E0 #x9805) + (#xB9E1 #x9999) + (#xB9E2 #x9AD8) + (#xB9E3 #x9D3B) + (#xB9E4 #x525B) + (#xB9E5 #x52AB) + (#xB9E6 #x53F7) + (#xB9E7 #x5408) + (#xB9E8 #x58D5) + (#xB9E9 #x62F7) + (#xB9EA #x6FE0) + (#xB9EB #x8C6A) + (#xB9EC #x8F5F) + (#xB9ED #x9EB9) + (#xB9EE #x514B) + (#xB9EF #x523B) + (#xB9F0 #x544A) + (#xB9F1 #x56FD) + (#xB9F2 #x7A40) + (#xB9F3 #x9177) + (#xB9F4 #x9D60) + (#xB9F5 #x9ED2) + (#xB9F6 #x7344) + (#xB9F7 #x6F09) + (#xB9F8 #x8170) + (#xB9F9 #x7511) + (#xB9FA #x5FFD) + (#xB9FB #x60DA) + (#xB9FC #x9AA8) + (#xB9FD #x72DB) + (#xB9FE #x8FBC) + (#xBAA1 #x6B64) + (#xBAA2 #x9803) + (#xBAA3 #x4ECA) + (#xBAA4 #x56F0) + (#xBAA5 #x5764) + (#xBAA6 #x58BE) + (#xBAA7 #x5A5A) + (#xBAA8 #x6068) + (#xBAA9 #x61C7) + (#xBAAA #x660F) + (#xBAAB #x6606) + (#xBAAC #x6839) + (#xBAAD #x68B1) + (#xBAAE #x6DF7) + (#xBAAF #x75D5) + (#xBAB0 #x7D3A) + (#xBAB1 #x826E) + (#xBAB2 #x9B42) + (#xBAB3 #x4E9B) + (#xBAB4 #x4F50) + (#xBAB5 #x53C9) + (#xBAB6 #x5506) + (#xBAB7 #x5D6F) + (#xBAB8 #x5DE6) + (#xBAB9 #x5DEE) + (#xBABA #x67FB) + (#xBABB #x6C99) + (#xBABC #x7473) + (#xBABD #x7802) + (#xBABE #x8A50) + (#xBABF #x9396) + (#xBAC0 #x88DF) + (#xBAC1 #x5750) + (#xBAC2 #x5EA7) + (#xBAC3 #x632B) + (#xBAC4 #x50B5) + (#xBAC5 #x50AC) + (#xBAC6 #x518D) + (#xBAC7 #x6700) + (#xBAC8 #x54C9) + (#xBAC9 #x585E) + (#xBACA #x59BB) + (#xBACB #x5BB0) + (#xBACC #x5F69) + (#xBACD #x624D) + (#xBACE #x63A1) + (#xBACF #x683D) + (#xBAD0 #x6B73) + (#xBAD1 #x6E08) + (#xBAD2 #x707D) + (#xBAD3 #x91C7) + (#xBAD4 #x7280) + (#xBAD5 #x7815) + (#xBAD6 #x7826) + (#xBAD7 #x796D) + (#xBAD8 #x658E) + (#xBAD9 #x7D30) + (#xBADA #x83DC) + (#xBADB #x88C1) + (#xBADC #x8F09) + (#xBADD #x969B) + (#xBADE #x5264) + (#xBADF #x5728) + (#xBAE0 #x6750) + (#xBAE1 #x7F6A) + (#xBAE2 #x8CA1) + (#xBAE3 #x51B4) + (#xBAE4 #x5742) + (#xBAE5 #x962A) + (#xBAE6 #x583A) + (#xBAE7 #x698A) + (#xBAE8 #x80B4) + (#xBAE9 #x54B2) + (#xBAEA #x5D0E) + (#xBAEB #x57FC) + (#xBAEC #x7895) + (#xBAED #x9DFA) + (#xBAEE #x4F5C) + (#xBAEF #x524A) + (#xBAF0 #x548B) + (#xBAF1 #x643E) + (#xBAF2 #x6628) + (#xBAF3 #x6714) + (#xBAF4 #x67F5) + (#xBAF5 #x7A84) + (#xBAF6 #x7B56) + (#xBAF7 #x7D22) + (#xBAF8 #x932F) + (#xBAF9 #x685C) + (#xBAFA #x9BAD) + (#xBAFB #x7B39) + (#xBAFC #x5319) + (#xBAFD #x518A) + (#xBAFE #x5237) + (#xBBA1 #x5BDF) + (#xBBA2 #x62F6) + (#xBBA3 #x64AE) + (#xBBA4 #x64E6) + (#xBBA5 #x672D) + (#xBBA6 #x6BBA) + (#xBBA7 #x85A9) + (#xBBA8 #x96D1) + (#xBBA9 #x7690) + (#xBBAA #x9BD6) + (#xBBAB #x634C) + (#xBBAC #x9306) + (#xBBAD #x9BAB) + (#xBBAE #x76BF) + (#xBBAF #x6652) + (#xBBB0 #x4E09) + (#xBBB1 #x5098) + (#xBBB2 #x53C2) + (#xBBB3 #x5C71) + (#xBBB4 #x60E8) + (#xBBB5 #x6492) + (#xBBB6 #x6563) + (#xBBB7 #x685F) + (#xBBB8 #x71E6) + (#xBBB9 #x73CA) + (#xBBBA #x7523) + (#xBBBB #x7B97) + (#xBBBC #x7E82) + (#xBBBD #x8695) + (#xBBBE #x8B83) + (#xBBBF #x8CDB) + (#xBBC0 #x9178) + (#xBBC1 #x9910) + (#xBBC2 #x65AC) + (#xBBC3 #x66AB) + (#xBBC4 #x6B8B) + (#xBBC5 #x4ED5) + (#xBBC6 #x4ED4) + (#xBBC7 #x4F3A) + (#xBBC8 #x4F7F) + (#xBBC9 #x523A) + (#xBBCA #x53F8) + (#xBBCB #x53F2) + (#xBBCC #x55E3) + (#xBBCD #x56DB) + (#xBBCE #x58EB) + (#xBBCF #x59CB) + (#xBBD0 #x59C9) + (#xBBD1 #x59FF) + (#xBBD2 #x5B50) + (#xBBD3 #x5C4D) + (#xBBD4 #x5E02) + (#xBBD5 #x5E2B) + (#xBBD6 #x5FD7) + (#xBBD7 #x601D) + (#xBBD8 #x6307) + (#xBBD9 #x652F) + (#xBBDA #x5B5C) + (#xBBDB #x65AF) + (#xBBDC #x65BD) + (#xBBDD #x65E8) + (#xBBDE #x679D) + (#xBBDF #x6B62) + (#xBBE0 #x6B7B) + (#xBBE1 #x6C0F) + (#xBBE2 #x7345) + (#xBBE3 #x7949) + (#xBBE4 #x79C1) + (#xBBE5 #x7CF8) + (#xBBE6 #x7D19) + (#xBBE7 #x7D2B) + (#xBBE8 #x80A2) + (#xBBE9 #x8102) + (#xBBEA #x81F3) + (#xBBEB #x8996) + (#xBBEC #x8A5E) + (#xBBED #x8A69) + (#xBBEE #x8A66) + (#xBBEF #x8A8C) + (#xBBF0 #x8AEE) + (#xBBF1 #x8CC7) + (#xBBF2 #x8CDC) + (#xBBF3 #x96CC) + (#xBBF4 #x98FC) + (#xBBF5 #x6B6F) + (#xBBF6 #x4E8B) + (#xBBF7 #x4F3C) + (#xBBF8 #x4F8D) + (#xBBF9 #x5150) + (#xBBFA #x5B57) + (#xBBFB #x5BFA) + (#xBBFC #x6148) + (#xBBFD #x6301) + (#xBBFE #x6642) + (#xBCA1 #x6B21) + (#xBCA2 #x6ECB) + (#xBCA3 #x6CBB) + (#xBCA4 #x723E) + (#xBCA5 #x74BD) + (#xBCA6 #x75D4) + (#xBCA7 #x78C1) + (#xBCA8 #x793A) + (#xBCA9 #x800C) + (#xBCAA #x8033) + (#xBCAB #x81EA) + (#xBCAC #x8494) + (#xBCAD #x8F9E) + (#xBCAE #x6C50) + (#xBCAF #x9E7F) + (#xBCB0 #x5F0F) + (#xBCB1 #x8B58) + (#xBCB2 #x9D2B) + (#xBCB3 #x7AFA) + (#xBCB4 #x8EF8) + (#xBCB5 #x5B8D) + (#xBCB6 #x96EB) + (#xBCB7 #x4E03) + (#xBCB8 #x53F1) + (#xBCB9 #x57F7) + (#xBCBA #x5931) + (#xBCBB #x5AC9) + (#xBCBC #x5BA4) + (#xBCBD #x6089) + (#xBCBE #x6E7F) + (#xBCBF #x6F06) + (#xBCC0 #x75BE) + (#xBCC1 #x8CEA) + (#xBCC2 #x5B9F) + (#xBCC3 #x8500) + (#xBCC4 #x7BE0) + (#xBCC5 #x5072) + (#xBCC6 #x67F4) + (#xBCC7 #x829D) + (#xBCC8 #x5C61) + (#xBCC9 #x854A) + (#xBCCA #x7E1E) + (#xBCCB #x820E) + (#xBCCC #x5199) + (#xBCCD #x5C04) + (#xBCCE #x6368) + (#xBCCF #x8D66) + (#xBCD0 #x659C) + (#xBCD1 #x716E) + (#xBCD2 #x793E) + (#xBCD3 #x7D17) + (#xBCD4 #x8005) + (#xBCD5 #x8B1D) + (#xBCD6 #x8ECA) + (#xBCD7 #x906E) + (#xBCD8 #x86C7) + (#xBCD9 #x90AA) + (#xBCDA #x501F) + (#xBCDB #x52FA) + (#xBCDC #x5C3A) + (#xBCDD #x6753) + (#xBCDE #x707C) + (#xBCDF #x7235) + (#xBCE0 #x914C) + (#xBCE1 #x91C8) + (#xBCE2 #x932B) + (#xBCE3 #x82E5) + (#xBCE4 #x5BC2) + (#xBCE5 #x5F31) + (#xBCE6 #x60F9) + (#xBCE7 #x4E3B) + (#xBCE8 #x53D6) + (#xBCE9 #x5B88) + (#xBCEA #x624B) + (#xBCEB #x6731) + (#xBCEC #x6B8A) + (#xBCED #x72E9) + (#xBCEE #x73E0) + (#xBCEF #x7A2E) + (#xBCF0 #x816B) + (#xBCF1 #x8DA3) + (#xBCF2 #x9152) + (#xBCF3 #x9996) + (#xBCF4 #x5112) + (#xBCF5 #x53D7) + (#xBCF6 #x546A) + (#xBCF7 #x5BFF) + (#xBCF8 #x6388) + (#xBCF9 #x6A39) + (#xBCFA #x7DAC) + (#xBCFB #x9700) + (#xBCFC #x56DA) + (#xBCFD #x53CE) + (#xBCFE #x5468) + (#xBDA1 #x5B97) + (#xBDA2 #x5C31) + (#xBDA3 #x5DDE) + (#xBDA4 #x4FEE) + (#xBDA5 #x6101) + (#xBDA6 #x62FE) + (#xBDA7 #x6D32) + (#xBDA8 #x79C0) + (#xBDA9 #x79CB) + (#xBDAA #x7D42) + (#xBDAB #x7E4D) + (#xBDAC #x7FD2) + (#xBDAD #x81ED) + (#xBDAE #x821F) + (#xBDAF #x8490) + (#xBDB0 #x8846) + (#xBDB1 #x8972) + (#xBDB2 #x8B90) + (#xBDB3 #x8E74) + (#xBDB4 #x8F2F) + (#xBDB5 #x9031) + (#xBDB6 #x914B) + (#xBDB7 #x916C) + (#xBDB8 #x96C6) + (#xBDB9 #x919C) + (#xBDBA #x4EC0) + (#xBDBB #x4F4F) + (#xBDBC #x5145) + (#xBDBD #x5341) + (#xBDBE #x5F93) + (#xBDBF #x620E) + (#xBDC0 #x67D4) + (#xBDC1 #x6C41) + (#xBDC2 #x6E0B) + (#xBDC3 #x7363) + (#xBDC4 #x7E26) + (#xBDC5 #x91CD) + (#xBDC6 #x9283) + (#xBDC7 #x53D4) + (#xBDC8 #x5919) + (#xBDC9 #x5BBF) + (#xBDCA #x6DD1) + (#xBDCB #x795D) + (#xBDCC #x7E2E) + (#xBDCD #x7C9B) + (#xBDCE #x587E) + (#xBDCF #x719F) + (#xBDD0 #x51FA) + (#xBDD1 #x8853) + (#xBDD2 #x8FF0) + (#xBDD3 #x4FCA) + (#xBDD4 #x5CFB) + (#xBDD5 #x6625) + (#xBDD6 #x77AC) + (#xBDD7 #x7AE3) + (#xBDD8 #x821C) + (#xBDD9 #x99FF) + (#xBDDA #x51C6) + (#xBDDB #x5FAA) + (#xBDDC #x65EC) + (#xBDDD #x696F) + (#xBDDE #x6B89) + (#xBDDF #x6DF3) + (#xBDE0 #x6E96) + (#xBDE1 #x6F64) + (#xBDE2 #x76FE) + (#xBDE3 #x7D14) + (#xBDE4 #x5DE1) + (#xBDE5 #x9075) + (#xBDE6 #x9187) + (#xBDE7 #x9806) + (#xBDE8 #x51E6) + (#xBDE9 #x521D) + (#xBDEA #x6240) + (#xBDEB #x6691) + (#xBDEC #x66D9) + (#xBDED #x6E1A) + (#xBDEE #x5EB6) + (#xBDEF #x7DD2) + (#xBDF0 #x7F72) + (#xBDF1 #x66F8) + (#xBDF2 #x85AF) + (#xBDF3 #x85F7) + (#xBDF4 #x8AF8) + (#xBDF5 #x52A9) + (#xBDF6 #x53D9) + (#xBDF7 #x5973) + (#xBDF8 #x5E8F) + (#xBDF9 #x5F90) + (#xBDFA #x6055) + (#xBDFB #x92E4) + (#xBDFC #x9664) + (#xBDFD #x50B7) + (#xBDFE #x511F) + (#xBEA1 #x52DD) + (#xBEA2 #x5320) + (#xBEA3 #x5347) + (#xBEA4 #x53EC) + (#xBEA5 #x54E8) + (#xBEA6 #x5546) + (#xBEA7 #x5531) + (#xBEA8 #x5617) + (#xBEA9 #x5968) + (#xBEAA #x59BE) + (#xBEAB #x5A3C) + (#xBEAC #x5BB5) + (#xBEAD #x5C06) + (#xBEAE #x5C0F) + (#xBEAF #x5C11) + (#xBEB0 #x5C1A) + (#xBEB1 #x5E84) + (#xBEB2 #x5E8A) + (#xBEB3 #x5EE0) + (#xBEB4 #x5F70) + (#xBEB5 #x627F) + (#xBEB6 #x6284) + (#xBEB7 #x62DB) + (#xBEB8 #x638C) + (#xBEB9 #x6377) + (#xBEBA #x6607) + (#xBEBB #x660C) + (#xBEBC #x662D) + (#xBEBD #x6676) + (#xBEBE #x677E) + (#xBEBF #x68A2) + (#xBEC0 #x6A1F) + (#xBEC1 #x6A35) + (#xBEC2 #x6CBC) + (#xBEC3 #x6D88) + (#xBEC4 #x6E09) + (#xBEC5 #x6E58) + (#xBEC6 #x713C) + (#xBEC7 #x7126) + (#xBEC8 #x7167) + (#xBEC9 #x75C7) + (#xBECA #x7701) + (#xBECB #x785D) + (#xBECC #x7901) + (#xBECD #x7965) + (#xBECE #x79F0) + (#xBECF #x7AE0) + (#xBED0 #x7B11) + (#xBED1 #x7CA7) + (#xBED2 #x7D39) + (#xBED3 #x8096) + (#xBED4 #x83D6) + (#xBED5 #x848B) + (#xBED6 #x8549) + (#xBED7 #x885D) + (#xBED8 #x88F3) + (#xBED9 #x8A1F) + (#xBEDA #x8A3C) + (#xBEDB #x8A54) + (#xBEDC #x8A73) + (#xBEDD #x8C61) + (#xBEDE #x8CDE) + (#xBEDF #x91A4) + (#xBEE0 #x9266) + (#xBEE1 #x937E) + (#xBEE2 #x9418) + (#xBEE3 #x969C) + (#xBEE4 #x9798) + (#xBEE5 #x4E0A) + (#xBEE6 #x4E08) + (#xBEE7 #x4E1E) + (#xBEE8 #x4E57) + (#xBEE9 #x5197) + (#xBEEA #x5270) + (#xBEEB #x57CE) + (#xBEEC #x5834) + (#xBEED #x58CC) + (#xBEEE #x5B22) + (#xBEEF #x5E38) + (#xBEF0 #x60C5) + (#xBEF1 #x64FE) + (#xBEF2 #x6761) + (#xBEF3 #x6756) + (#xBEF4 #x6D44) + (#xBEF5 #x72B6) + (#xBEF6 #x7573) + (#xBEF7 #x7A63) + (#xBEF8 #x84B8) + (#xBEF9 #x8B72) + (#xBEFA #x91B8) + (#xBEFB #x9320) + (#xBEFC #x5631) + (#xBEFD #x57F4) + (#xBEFE #x98FE) + (#xBFA1 #x62ED) + (#xBFA2 #x690D) + (#xBFA3 #x6B96) + (#xBFA4 #x71ED) + (#xBFA5 #x7E54) + (#xBFA6 #x8077) + (#xBFA7 #x8272) + (#xBFA8 #x89E6) + (#xBFA9 #x98DF) + (#xBFAA #x8755) + (#xBFAB #x8FB1) + (#xBFAC #x5C3B) + (#xBFAD #x4F38) + (#xBFAE #x4FE1) + (#xBFAF #x4FB5) + (#xBFB0 #x5507) + (#xBFB1 #x5A20) + (#xBFB2 #x5BDD) + (#xBFB3 #x5BE9) + (#xBFB4 #x5FC3) + (#xBFB5 #x614E) + (#xBFB6 #x632F) + (#xBFB7 #x65B0) + (#xBFB8 #x664B) + (#xBFB9 #x68EE) + (#xBFBA #x699B) + (#xBFBB #x6D78) + (#xBFBC #x6DF1) + (#xBFBD #x7533) + (#xBFBE #x75B9) + (#xBFBF #x771F) + (#xBFC0 #x795E) + (#xBFC1 #x79E6) + (#xBFC2 #x7D33) + (#xBFC3 #x81E3) + (#xBFC4 #x82AF) + (#xBFC5 #x85AA) + (#xBFC6 #x89AA) + (#xBFC7 #x8A3A) + (#xBFC8 #x8EAB) + (#xBFC9 #x8F9B) + (#xBFCA #x9032) + (#xBFCB #x91DD) + (#xBFCC #x9707) + (#xBFCD #x4EBA) + (#xBFCE #x4EC1) + (#xBFCF #x5203) + (#xBFD0 #x5875) + (#xBFD1 #x58EC) + (#xBFD2 #x5C0B) + (#xBFD3 #x751A) + (#xBFD4 #x5C3D) + (#xBFD5 #x814E) + (#xBFD6 #x8A0A) + (#xBFD7 #x8FC5) + (#xBFD8 #x9663) + (#xBFD9 #x976D) + (#xBFDA #x7B25) + (#xBFDB #x8ACF) + (#xBFDC #x9808) + (#xBFDD #x9162) + (#xBFDE #x56F3) + (#xBFDF #x53A8) + (#xBFE0 #x9017) + (#xBFE1 #x5439) + (#xBFE2 #x5782) + (#xBFE3 #x5E25) + (#xBFE4 #x63A8) + (#xBFE5 #x6C34) + (#xBFE6 #x708A) + (#xBFE7 #x7761) + (#xBFE8 #x7C8B) + (#xBFE9 #x7FE0) + (#xBFEA #x8870) + (#xBFEB #x9042) + (#xBFEC #x9154) + (#xBFED #x9310) + (#xBFEE #x9318) + (#xBFEF #x968F) + (#xBFF0 #x745E) + (#xBFF1 #x9AC4) + (#xBFF2 #x5D07) + (#xBFF3 #x5D69) + (#xBFF4 #x6570) + (#xBFF5 #x67A2) + (#xBFF6 #x8DA8) + (#xBFF7 #x96DB) + (#xBFF8 #x636E) + (#xBFF9 #x6749) + (#xBFFA #x6919) + (#xBFFB #x83C5) + (#xBFFC #x9817) + (#xBFFD #x96C0) + (#xBFFE #x88FE) + (#xC0A1 #x6F84) + (#xC0A2 #x647A) + (#xC0A3 #x5BF8) + (#xC0A4 #x4E16) + (#xC0A5 #x702C) + (#xC0A6 #x755D) + (#xC0A7 #x662F) + (#xC0A8 #x51C4) + (#xC0A9 #x5236) + (#xC0AA #x52E2) + (#xC0AB #x59D3) + (#xC0AC #x5F81) + (#xC0AD #x6027) + (#xC0AE #x6210) + (#xC0AF #x653F) + (#xC0B0 #x6574) + (#xC0B1 #x661F) + (#xC0B2 #x6674) + (#xC0B3 #x68F2) + (#xC0B4 #x6816) + (#xC0B5 #x6B63) + (#xC0B6 #x6E05) + (#xC0B7 #x7272) + (#xC0B8 #x751F) + (#xC0B9 #x76DB) + (#xC0BA #x7CBE) + (#xC0BB #x8056) + (#xC0BC #x58F0) + (#xC0BD #x88FD) + (#xC0BE #x897F) + (#xC0BF #x8AA0) + (#xC0C0 #x8A93) + (#xC0C1 #x8ACB) + (#xC0C2 #x901D) + (#xC0C3 #x9192) + (#xC0C4 #x9752) + (#xC0C5 #x9759) + (#xC0C6 #x6589) + (#xC0C7 #x7A0E) + (#xC0C8 #x8106) + (#xC0C9 #x96BB) + (#xC0CA #x5E2D) + (#xC0CB #x60DC) + (#xC0CC #x621A) + (#xC0CD #x65A5) + (#xC0CE #x6614) + (#xC0CF #x6790) + (#xC0D0 #x77F3) + (#xC0D1 #x7A4D) + (#xC0D2 #x7C4D) + (#xC0D3 #x7E3E) + (#xC0D4 #x810A) + (#xC0D5 #x8CAC) + (#xC0D6 #x8D64) + (#xC0D7 #x8DE1) + (#xC0D8 #x8E5F) + (#xC0D9 #x78A9) + (#xC0DA #x5207) + (#xC0DB #x62D9) + (#xC0DC #x63A5) + (#xC0DD #x6442) + (#xC0DE #x6298) + (#xC0DF #x8A2D) + (#xC0E0 #x7A83) + (#xC0E1 #x7BC0) + (#xC0E2 #x8AAC) + (#xC0E3 #x96EA) + (#xC0E4 #x7D76) + (#xC0E5 #x820C) + (#xC0E6 #x8749) + (#xC0E7 #x4ED9) + (#xC0E8 #x5148) + (#xC0E9 #x5343) + (#xC0EA #x5360) + (#xC0EB #x5BA3) + (#xC0EC #x5C02) + (#xC0ED #x5C16) + (#xC0EE #x5DDD) + (#xC0EF #x6226) + (#xC0F0 #x6247) + (#xC0F1 #x64B0) + (#xC0F2 #x6813) + (#xC0F3 #x6834) + (#xC0F4 #x6CC9) + (#xC0F5 #x6D45) + (#xC0F6 #x6D17) + (#xC0F7 #x67D3) + (#xC0F8 #x6F5C) + (#xC0F9 #x714E) + (#xC0FA #x717D) + (#xC0FB #x65CB) + (#xC0FC #x7A7F) + (#xC0FD #x7BAD) + (#xC0FE #x7DDA) + (#xC1A1 #x7E4A) + (#xC1A2 #x7FA8) + (#xC1A3 #x817A) + (#xC1A4 #x821B) + (#xC1A5 #x8239) + (#xC1A6 #x85A6) + (#xC1A7 #x8A6E) + (#xC1A8 #x8CCE) + (#xC1A9 #x8DF5) + (#xC1AA #x9078) + (#xC1AB #x9077) + (#xC1AC #x92AD) + (#xC1AD #x9291) + (#xC1AE #x9583) + (#xC1AF #x9BAE) + (#xC1B0 #x524D) + (#xC1B1 #x5584) + (#xC1B2 #x6F38) + (#xC1B3 #x7136) + (#xC1B4 #x5168) + (#xC1B5 #x7985) + (#xC1B6 #x7E55) + (#xC1B7 #x81B3) + (#xC1B8 #x7CCE) + (#xC1B9 #x564C) + (#xC1BA #x5851) + (#xC1BB #x5CA8) + (#xC1BC #x63AA) + (#xC1BD #x66FE) + (#xC1BE #x66FD) + (#xC1BF #x695A) + (#xC1C0 #x72D9) + (#xC1C1 #x758F) + (#xC1C2 #x758E) + (#xC1C3 #x790E) + (#xC1C4 #x7956) + (#xC1C5 #x79DF) + (#xC1C6 #x7C97) + (#xC1C7 #x7D20) + (#xC1C8 #x7D44) + (#xC1C9 #x8607) + (#xC1CA #x8A34) + (#xC1CB #x963B) + (#xC1CC #x9061) + (#xC1CD #x9F20) + (#xC1CE #x50E7) + (#xC1CF #x5275) + (#xC1D0 #x53CC) + (#xC1D1 #x53E2) + (#xC1D2 #x5009) + (#xC1D3 #x55AA) + (#xC1D4 #x58EE) + (#xC1D5 #x594F) + (#xC1D6 #x723D) + (#xC1D7 #x5B8B) + (#xC1D8 #x5C64) + (#xC1D9 #x531D) + (#xC1DA #x60E3) + (#xC1DB #x60F3) + (#xC1DC #x635C) + (#xC1DD #x6383) + (#xC1DE #x633F) + (#xC1DF #x63BB) + (#xC1E0 #x64CD) + (#xC1E1 #x65E9) + (#xC1E2 #x66F9) + (#xC1E3 #x5DE3) + (#xC1E4 #x69CD) + (#xC1E5 #x69FD) + (#xC1E6 #x6F15) + (#xC1E7 #x71E5) + (#xC1E8 #x4E89) + (#xC1E9 #x75E9) + (#xC1EA #x76F8) + (#xC1EB #x7A93) + (#xC1EC #x7CDF) + (#xC1ED #x7DCF) + (#xC1EE #x7D9C) + (#xC1EF #x8061) + (#xC1F0 #x8349) + (#xC1F1 #x8358) + (#xC1F2 #x846C) + (#xC1F3 #x84BC) + (#xC1F4 #x85FB) + (#xC1F5 #x88C5) + (#xC1F6 #x8D70) + (#xC1F7 #x9001) + (#xC1F8 #x906D) + (#xC1F9 #x9397) + (#xC1FA #x971C) + (#xC1FB #x9A12) + (#xC1FC #x50CF) + (#xC1FD #x5897) + (#xC1FE #x618E) + (#xC2A1 #x81D3) + (#xC2A2 #x8535) + (#xC2A3 #x8D08) + (#xC2A4 #x9020) + (#xC2A5 #x4FC3) + (#xC2A6 #x5074) + (#xC2A7 #x5247) + (#xC2A8 #x5373) + (#xC2A9 #x606F) + (#xC2AA #x6349) + (#xC2AB #x675F) + (#xC2AC #x6E2C) + (#xC2AD #x8DB3) + (#xC2AE #x901F) + (#xC2AF #x4FD7) + (#xC2B0 #x5C5E) + (#xC2B1 #x8CCA) + (#xC2B2 #x65CF) + (#xC2B3 #x7D9A) + (#xC2B4 #x5352) + (#xC2B5 #x8896) + (#xC2B6 #x5176) + (#xC2B7 #x63C3) + (#xC2B8 #x5B58) + (#xC2B9 #x5B6B) + (#xC2BA #x5C0A) + (#xC2BB #x640D) + (#xC2BC #x6751) + (#xC2BD #x905C) + (#xC2BE #x4ED6) + (#xC2BF #x591A) + (#xC2C0 #x592A) + (#xC2C1 #x6C70) + (#xC2C2 #x8A51) + (#xC2C3 #x553E) + (#xC2C4 #x5815) + (#xC2C5 #x59A5) + (#xC2C6 #x60F0) + (#xC2C7 #x6253) + (#xC2C8 #x67C1) + (#xC2C9 #x8235) + (#xC2CA #x6955) + (#xC2CB #x9640) + (#xC2CC #x99C4) + (#xC2CD #x9A28) + (#xC2CE #x4F53) + (#xC2CF #x5806) + (#xC2D0 #x5BFE) + (#xC2D1 #x8010) + (#xC2D2 #x5CB1) + (#xC2D3 #x5E2F) + (#xC2D4 #x5F85) + (#xC2D5 #x6020) + (#xC2D6 #x614B) + (#xC2D7 #x6234) + (#xC2D8 #x66FF) + (#xC2D9 #x6CF0) + (#xC2DA #x6EDE) + (#xC2DB #x80CE) + (#xC2DC #x817F) + (#xC2DD #x82D4) + (#xC2DE #x888B) + (#xC2DF #x8CB8) + (#xC2E0 #x9000) + (#xC2E1 #x902E) + (#xC2E2 #x968A) + (#xC2E3 #x9EDB) + (#xC2E4 #x9BDB) + (#xC2E5 #x4EE3) + (#xC2E6 #x53F0) + (#xC2E7 #x5927) + (#xC2E8 #x7B2C) + (#xC2E9 #x918D) + (#xC2EA #x984C) + (#xC2EB #x9DF9) + (#xC2EC #x6EDD) + (#xC2ED #x7027) + (#xC2EE #x5353) + (#xC2EF #x5544) + (#xC2F0 #x5B85) + (#xC2F1 #x6258) + (#xC2F2 #x629E) + (#xC2F3 #x62D3) + (#xC2F4 #x6CA2) + (#xC2F5 #x6FEF) + (#xC2F6 #x7422) + (#xC2F7 #x8A17) + (#xC2F8 #x9438) + (#xC2F9 #x6FC1) + (#xC2FA #x8AFE) + (#xC2FB #x8338) + (#xC2FC #x51E7) + (#xC2FD #x86F8) + (#xC2FE #x53EA) + (#xC3A1 #x53E9) + (#xC3A2 #x4F46) + (#xC3A3 #x9054) + (#xC3A4 #x8FB0) + (#xC3A5 #x596A) + (#xC3A6 #x8131) + (#xC3A7 #x5DFD) + (#xC3A8 #x7AEA) + (#xC3A9 #x8FBF) + (#xC3AA #x68DA) + (#xC3AB #x8C37) + (#xC3AC #x72F8) + (#xC3AD #x9C48) + (#xC3AE #x6A3D) + (#xC3AF #x8AB0) + (#xC3B0 #x4E39) + (#xC3B1 #x5358) + (#xC3B2 #x5606) + (#xC3B3 #x5766) + (#xC3B4 #x62C5) + (#xC3B5 #x63A2) + (#xC3B6 #x65E6) + (#xC3B7 #x6B4E) + (#xC3B8 #x6DE1) + (#xC3B9 #x6E5B) + (#xC3BA #x70AD) + (#xC3BB #x77ED) + (#xC3BC #x7AEF) + (#xC3BD #x7BAA) + (#xC3BE #x7DBB) + (#xC3BF #x803D) + (#xC3C0 #x80C6) + (#xC3C1 #x86CB) + (#xC3C2 #x8A95) + (#xC3C3 #x935B) + (#xC3C4 #x56E3) + (#xC3C5 #x58C7) + (#xC3C6 #x5F3E) + (#xC3C7 #x65AD) + (#xC3C8 #x6696) + (#xC3C9 #x6A80) + (#xC3CA #x6BB5) + (#xC3CB #x7537) + (#xC3CC #x8AC7) + (#xC3CD #x5024) + (#xC3CE #x77E5) + (#xC3CF #x5730) + (#xC3D0 #x5F1B) + (#xC3D1 #x6065) + (#xC3D2 #x667A) + (#xC3D3 #x6C60) + (#xC3D4 #x75F4) + (#xC3D5 #x7A1A) + (#xC3D6 #x7F6E) + (#xC3D7 #x81F4) + (#xC3D8 #x8718) + (#xC3D9 #x9045) + (#xC3DA #x99B3) + (#xC3DB #x7BC9) + (#xC3DC #x755C) + (#xC3DD #x7AF9) + (#xC3DE #x7B51) + (#xC3DF #x84C4) + (#xC3E0 #x9010) + (#xC3E1 #x79E9) + (#xC3E2 #x7A92) + (#xC3E3 #x8336) + (#xC3E4 #x5AE1) + (#xC3E5 #x7740) + (#xC3E6 #x4E2D) + (#xC3E7 #x4EF2) + (#xC3E8 #x5B99) + (#xC3E9 #x5FE0) + (#xC3EA #x62BD) + (#xC3EB #x663C) + (#xC3EC #x67F1) + (#xC3ED #x6CE8) + (#xC3EE #x866B) + (#xC3EF #x8877) + (#xC3F0 #x8A3B) + (#xC3F1 #x914E) + (#xC3F2 #x92F3) + (#xC3F3 #x99D0) + (#xC3F4 #x6A17) + (#xC3F5 #x7026) + (#xC3F6 #x732A) + (#xC3F7 #x82E7) + (#xC3F8 #x8457) + (#xC3F9 #x8CAF) + (#xC3FA #x4E01) + (#xC3FB #x5146) + (#xC3FC #x51CB) + (#xC3FD #x558B) + (#xC3FE #x5BF5) + (#xC4A1 #x5E16) + (#xC4A2 #x5E33) + (#xC4A3 #x5E81) + (#xC4A4 #x5F14) + (#xC4A5 #x5F35) + (#xC4A6 #x5F6B) + (#xC4A7 #x5FB4) + (#xC4A8 #x61F2) + (#xC4A9 #x6311) + (#xC4AA #x66A2) + (#xC4AB #x671D) + (#xC4AC #x6F6E) + (#xC4AD #x7252) + (#xC4AE #x753A) + (#xC4AF #x773A) + (#xC4B0 #x8074) + (#xC4B1 #x8139) + (#xC4B2 #x8178) + (#xC4B3 #x8776) + (#xC4B4 #x8ABF) + (#xC4B5 #x8ADC) + (#xC4B6 #x8D85) + (#xC4B7 #x8DF3) + (#xC4B8 #x929A) + (#xC4B9 #x9577) + (#xC4BA #x9802) + (#xC4BB #x9CE5) + (#xC4BC #x52C5) + (#xC4BD #x6357) + (#xC4BE #x76F4) + (#xC4BF #x6715) + (#xC4C0 #x6C88) + (#xC4C1 #x73CD) + (#xC4C2 #x8CC3) + (#xC4C3 #x93AE) + (#xC4C4 #x9673) + (#xC4C5 #x6D25) + (#xC4C6 #x589C) + (#xC4C7 #x690E) + (#xC4C8 #x69CC) + (#xC4C9 #x8FFD) + (#xC4CA #x939A) + (#xC4CB #x75DB) + (#xC4CC #x901A) + (#xC4CD #x585A) + (#xC4CE #x6802) + (#xC4CF #x63B4) + (#xC4D0 #x69FB) + (#xC4D1 #x4F43) + (#xC4D2 #x6F2C) + (#xC4D3 #x67D8) + (#xC4D4 #x8FBB) + (#xC4D5 #x8526) + (#xC4D6 #x7DB4) + (#xC4D7 #x9354) + (#xC4D8 #x693F) + (#xC4D9 #x6F70) + (#xC4DA #x576A) + (#xC4DB #x58F7) + (#xC4DC #x5B2C) + (#xC4DD #x7D2C) + (#xC4DE #x722A) + (#xC4DF #x540A) + (#xC4E0 #x91E3) + (#xC4E1 #x9DB4) + (#xC4E2 #x4EAD) + (#xC4E3 #x4F4E) + (#xC4E4 #x505C) + (#xC4E5 #x5075) + (#xC4E6 #x5243) + (#xC4E7 #x8C9E) + (#xC4E8 #x5448) + (#xC4E9 #x5824) + (#xC4EA #x5B9A) + (#xC4EB #x5E1D) + (#xC4EC #x5E95) + (#xC4ED #x5EAD) + (#xC4EE #x5EF7) + (#xC4EF #x5F1F) + (#xC4F0 #x608C) + (#xC4F1 #x62B5) + (#xC4F2 #x633A) + (#xC4F3 #x63D0) + (#xC4F4 #x68AF) + (#xC4F5 #x6C40) + (#xC4F6 #x7887) + (#xC4F7 #x798E) + (#xC4F8 #x7A0B) + (#xC4F9 #x7DE0) + (#xC4FA #x8247) + (#xC4FB #x8A02) + (#xC4FC #x8AE6) + (#xC4FD #x8E44) + (#xC4FE #x9013) + (#xC5A1 #x90B8) + (#xC5A2 #x912D) + (#xC5A3 #x91D8) + (#xC5A4 #x9F0E) + (#xC5A5 #x6CE5) + (#xC5A6 #x6458) + (#xC5A7 #x64E2) + (#xC5A8 #x6575) + (#xC5A9 #x6EF4) + (#xC5AA #x7684) + (#xC5AB #x7B1B) + (#xC5AC #x9069) + (#xC5AD #x93D1) + (#xC5AE #x6EBA) + (#xC5AF #x54F2) + (#xC5B0 #x5FB9) + (#xC5B1 #x64A4) + (#xC5B2 #x8F4D) + (#xC5B3 #x8FED) + (#xC5B4 #x9244) + (#xC5B5 #x5178) + (#xC5B6 #x586B) + (#xC5B7 #x5929) + (#xC5B8 #x5C55) + (#xC5B9 #x5E97) + (#xC5BA #x6DFB) + (#xC5BB #x7E8F) + (#xC5BC #x751C) + (#xC5BD #x8CBC) + (#xC5BE #x8EE2) + (#xC5BF #x985B) + (#xC5C0 #x70B9) + (#xC5C1 #x4F1D) + (#xC5C2 #x6BBF) + (#xC5C3 #x6FB1) + (#xC5C4 #x7530) + (#xC5C5 #x96FB) + (#xC5C6 #x514E) + (#xC5C7 #x5410) + (#xC5C8 #x5835) + (#xC5C9 #x5857) + (#xC5CA #x59AC) + (#xC5CB #x5C60) + (#xC5CC #x5F92) + (#xC5CD #x6597) + (#xC5CE #x675C) + (#xC5CF #x6E21) + (#xC5D0 #x767B) + (#xC5D1 #x83DF) + (#xC5D2 #x8CED) + (#xC5D3 #x9014) + (#xC5D4 #x90FD) + (#xC5D5 #x934D) + (#xC5D6 #x7825) + (#xC5D7 #x783A) + (#xC5D8 #x52AA) + (#xC5D9 #x5EA6) + (#xC5DA #x571F) + (#xC5DB #x5974) + (#xC5DC #x6012) + (#xC5DD #x5012) + (#xC5DE #x515A) + (#xC5DF #x51AC) + (#xC5E0 #x51CD) + (#xC5E1 #x5200) + (#xC5E2 #x5510) + (#xC5E3 #x5854) + (#xC5E4 #x5858) + (#xC5E5 #x5957) + (#xC5E6 #x5B95) + (#xC5E7 #x5CF6) + (#xC5E8 #x5D8B) + (#xC5E9 #x60BC) + (#xC5EA #x6295) + (#xC5EB #x642D) + (#xC5EC #x6771) + (#xC5ED #x6843) + (#xC5EE #x68BC) + (#xC5EF #x68DF) + (#xC5F0 #x76D7) + (#xC5F1 #x6DD8) + (#xC5F2 #x6E6F) + (#xC5F3 #x6D9B) + (#xC5F4 #x706F) + (#xC5F5 #x71C8) + (#xC5F6 #x5F53) + (#xC5F7 #x75D8) + (#xC5F8 #x7977) + (#xC5F9 #x7B49) + (#xC5FA #x7B54) + (#xC5FB #x7B52) + (#xC5FC #x7CD6) + (#xC5FD #x7D71) + (#xC5FE #x5230) + (#xC6A1 #x8463) + (#xC6A2 #x8569) + (#xC6A3 #x85E4) + (#xC6A4 #x8A0E) + (#xC6A5 #x8B04) + (#xC6A6 #x8C46) + (#xC6A7 #x8E0F) + (#xC6A8 #x9003) + (#xC6A9 #x900F) + (#xC6AA #x9419) + (#xC6AB #x9676) + (#xC6AC #x982D) + (#xC6AD #x9A30) + (#xC6AE #x95D8) + (#xC6AF #x50CD) + (#xC6B0 #x52D5) + (#xC6B1 #x540C) + (#xC6B2 #x5802) + (#xC6B3 #x5C0E) + (#xC6B4 #x61A7) + (#xC6B5 #x649E) + (#xC6B6 #x6D1E) + (#xC6B7 #x77B3) + (#xC6B8 #x7AE5) + (#xC6B9 #x80F4) + (#xC6BA #x8404) + (#xC6BB #x9053) + (#xC6BC #x9285) + (#xC6BD #x5CE0) + (#xC6BE #x9D07) + (#xC6BF #x533F) + (#xC6C0 #x5F97) + (#xC6C1 #x5FB3) + (#xC6C2 #x6D9C) + (#xC6C3 #x7279) + (#xC6C4 #x7763) + (#xC6C5 #x79BF) + (#xC6C6 #x7BE4) + (#xC6C7 #x6BD2) + (#xC6C8 #x72EC) + (#xC6C9 #x8AAD) + (#xC6CA #x6803) + (#xC6CB #x6A61) + (#xC6CC #x51F8) + (#xC6CD #x7A81) + (#xC6CE #x6934) + (#xC6CF #x5C4A) + (#xC6D0 #x9CF6) + (#xC6D1 #x82EB) + (#xC6D2 #x5BC5) + (#xC6D3 #x9149) + (#xC6D4 #x701E) + (#xC6D5 #x5678) + (#xC6D6 #x5C6F) + (#xC6D7 #x60C7) + (#xC6D8 #x6566) + (#xC6D9 #x6C8C) + (#xC6DA #x8C5A) + (#xC6DB #x9041) + (#xC6DC #x9813) + (#xC6DD #x5451) + (#xC6DE #x66C7) + (#xC6DF #x920D) + (#xC6E0 #x5948) + (#xC6E1 #x90A3) + (#xC6E2 #x5185) + (#xC6E3 #x4E4D) + (#xC6E4 #x51EA) + (#xC6E5 #x8599) + (#xC6E6 #x8B0E) + (#xC6E7 #x7058) + (#xC6E8 #x637A) + (#xC6E9 #x934B) + (#xC6EA #x6962) + (#xC6EB #x99B4) + (#xC6EC #x7E04) + (#xC6ED #x7577) + (#xC6EE #x5357) + (#xC6EF #x6960) + (#xC6F0 #x8EDF) + (#xC6F1 #x96E3) + (#xC6F2 #x6C5D) + (#xC6F3 #x4E8C) + (#xC6F4 #x5C3C) + (#xC6F5 #x5F10) + (#xC6F6 #x8FE9) + (#xC6F7 #x5302) + (#xC6F8 #x8CD1) + (#xC6F9 #x8089) + (#xC6FA #x8679) + (#xC6FB #x5EFF) + (#xC6FC #x65E5) + (#xC6FD #x4E73) + (#xC6FE #x5165) + (#xC7A1 #x5982) + (#xC7A2 #x5C3F) + (#xC7A3 #x97EE) + (#xC7A4 #x4EFB) + (#xC7A5 #x598A) + (#xC7A6 #x5FCD) + (#xC7A7 #x8A8D) + (#xC7A8 #x6FE1) + (#xC7A9 #x79B0) + (#xC7AA #x7962) + (#xC7AB #x5BE7) + (#xC7AC #x8471) + (#xC7AD #x732B) + (#xC7AE #x71B1) + (#xC7AF #x5E74) + (#xC7B0 #x5FF5) + (#xC7B1 #x637B) + (#xC7B2 #x649A) + (#xC7B3 #x71C3) + (#xC7B4 #x7C98) + (#xC7B5 #x4E43) + (#xC7B6 #x5EFC) + (#xC7B7 #x4E4B) + (#xC7B8 #x57DC) + (#xC7B9 #x56A2) + (#xC7BA #x60A9) + (#xC7BB #x6FC3) + (#xC7BC #x7D0D) + (#xC7BD #x80FD) + (#xC7BE #x8133) + (#xC7BF #x81BF) + (#xC7C0 #x8FB2) + (#xC7C1 #x8997) + (#xC7C2 #x86A4) + (#xC7C3 #x5DF4) + (#xC7C4 #x628A) + (#xC7C5 #x64AD) + (#xC7C6 #x8987) + (#xC7C7 #x6777) + (#xC7C8 #x6CE2) + (#xC7C9 #x6D3E) + (#xC7CA #x7436) + (#xC7CB #x7834) + (#xC7CC #x5A46) + (#xC7CD #x7F75) + (#xC7CE #x82AD) + (#xC7CF #x99AC) + (#xC7D0 #x4FF3) + (#xC7D1 #x5EC3) + (#xC7D2 #x62DD) + (#xC7D3 #x6392) + (#xC7D4 #x6557) + (#xC7D5 #x676F) + (#xC7D6 #x76C3) + (#xC7D7 #x724C) + (#xC7D8 #x80CC) + (#xC7D9 #x80BA) + (#xC7DA #x8F29) + (#xC7DB #x914D) + (#xC7DC #x500D) + (#xC7DD #x57F9) + (#xC7DE #x5A92) + (#xC7DF #x6885) + (#xC7E0 #x6973) + (#xC7E1 #x7164) + (#xC7E2 #x72FD) + (#xC7E3 #x8CB7) + (#xC7E4 #x58F2) + (#xC7E5 #x8CE0) + (#xC7E6 #x966A) + (#xC7E7 #x9019) + (#xC7E8 #x877F) + (#xC7E9 #x79E4) + (#xC7EA #x77E7) + (#xC7EB #x8429) + (#xC7EC #x4F2F) + (#xC7ED #x5265) + (#xC7EE #x535A) + (#xC7EF #x62CD) + (#xC7F0 #x67CF) + (#xC7F1 #x6CCA) + (#xC7F2 #x767D) + (#xC7F3 #x7B94) + (#xC7F4 #x7C95) + (#xC7F5 #x8236) + (#xC7F6 #x8584) + (#xC7F7 #x8FEB) + (#xC7F8 #x66DD) + (#xC7F9 #x6F20) + (#xC7FA #x7206) + (#xC7FB #x7E1B) + (#xC7FC #x83AB) + (#xC7FD #x99C1) + (#xC7FE #x9EA6) + (#xC8A1 #x51FD) + (#xC8A2 #x7BB1) + (#xC8A3 #x7872) + (#xC8A4 #x7BB8) + (#xC8A5 #x8087) + (#xC8A6 #x7B48) + (#xC8A7 #x6AE8) + (#xC8A8 #x5E61) + (#xC8A9 #x808C) + (#xC8AA #x7551) + (#xC8AB #x7560) + (#xC8AC #x516B) + (#xC8AD #x9262) + (#xC8AE #x6E8C) + (#xC8AF #x767A) + (#xC8B0 #x9197) + (#xC8B1 #x9AEA) + (#xC8B2 #x4F10) + (#xC8B3 #x7F70) + (#xC8B4 #x629C) + (#xC8B5 #x7B4F) + (#xC8B6 #x95A5) + (#xC8B7 #x9CE9) + (#xC8B8 #x567A) + (#xC8B9 #x5859) + (#xC8BA #x86E4) + (#xC8BB #x96BC) + (#xC8BC #x4F34) + (#xC8BD #x5224) + (#xC8BE #x534A) + (#xC8BF #x53CD) + (#xC8C0 #x53DB) + (#xC8C1 #x5E06) + (#xC8C2 #x642C) + (#xC8C3 #x6591) + (#xC8C4 #x677F) + (#xC8C5 #x6C3E) + (#xC8C6 #x6C4E) + (#xC8C7 #x7248) + (#xC8C8 #x72AF) + (#xC8C9 #x73ED) + (#xC8CA #x7554) + (#xC8CB #x7E41) + (#xC8CC #x822C) + (#xC8CD #x85E9) + (#xC8CE #x8CA9) + (#xC8CF #x7BC4) + (#xC8D0 #x91C6) + (#xC8D1 #x7169) + (#xC8D2 #x9812) + (#xC8D3 #x98EF) + (#xC8D4 #x633D) + (#xC8D5 #x6669) + (#xC8D6 #x756A) + (#xC8D7 #x76E4) + (#xC8D8 #x78D0) + (#xC8D9 #x8543) + (#xC8DA #x86EE) + (#xC8DB #x532A) + (#xC8DC #x5351) + (#xC8DD #x5426) + (#xC8DE #x5983) + (#xC8DF #x5E87) + (#xC8E0 #x5F7C) + (#xC8E1 #x60B2) + (#xC8E2 #x6249) + (#xC8E3 #x6279) + (#xC8E4 #x62AB) + (#xC8E5 #x6590) + (#xC8E6 #x6BD4) + (#xC8E7 #x6CCC) + (#xC8E8 #x75B2) + (#xC8E9 #x76AE) + (#xC8EA #x7891) + (#xC8EB #x79D8) + (#xC8EC #x7DCB) + (#xC8ED #x7F77) + (#xC8EE #x80A5) + (#xC8EF #x88AB) + (#xC8F0 #x8AB9) + (#xC8F1 #x8CBB) + (#xC8F2 #x907F) + (#xC8F3 #x975E) + (#xC8F4 #x98DB) + (#xC8F5 #x6A0B) + (#xC8F6 #x7C38) + (#xC8F7 #x5099) + (#xC8F8 #x5C3E) + (#xC8F9 #x5FAE) + (#xC8FA #x6787) + (#xC8FB #x6BD8) + (#xC8FC #x7435) + (#xC8FD #x7709) + (#xC8FE #x7F8E) + (#xC9A1 #x9F3B) + (#xC9A2 #x67CA) + (#xC9A3 #x7A17) + (#xC9A4 #x5339) + (#xC9A5 #x758B) + (#xC9A6 #x9AED) + (#xC9A7 #x5F66) + (#xC9A8 #x819D) + (#xC9A9 #x83F1) + (#xC9AA #x8098) + (#xC9AB #x5F3C) + (#xC9AC #x5FC5) + (#xC9AD #x7562) + (#xC9AE #x7B46) + (#xC9AF #x903C) + (#xC9B0 #x6867) + (#xC9B1 #x59EB) + (#xC9B2 #x5A9B) + (#xC9B3 #x7D10) + (#xC9B4 #x767E) + (#xC9B5 #x8B2C) + (#xC9B6 #x4FF5) + (#xC9B7 #x5F6A) + (#xC9B8 #x6A19) + (#xC9B9 #x6C37) + (#xC9BA #x6F02) + (#xC9BB #x74E2) + (#xC9BC #x7968) + (#xC9BD #x8868) + (#xC9BE #x8A55) + (#xC9BF #x8C79) + (#xC9C0 #x5EDF) + (#xC9C1 #x63CF) + (#xC9C2 #x75C5) + (#xC9C3 #x79D2) + (#xC9C4 #x82D7) + (#xC9C5 #x9328) + (#xC9C6 #x92F2) + (#xC9C7 #x849C) + (#xC9C8 #x86ED) + (#xC9C9 #x9C2D) + (#xC9CA #x54C1) + (#xC9CB #x5F6C) + (#xC9CC #x658C) + (#xC9CD #x6D5C) + (#xC9CE #x7015) + (#xC9CF #x8CA7) + (#xC9D0 #x8CD3) + (#xC9D1 #x983B) + (#xC9D2 #x654F) + (#xC9D3 #x74F6) + (#xC9D4 #x4E0D) + (#xC9D5 #x4ED8) + (#xC9D6 #x57E0) + (#xC9D7 #x592B) + (#xC9D8 #x5A66) + (#xC9D9 #x5BCC) + (#xC9DA #x51A8) + (#xC9DB #x5E03) + (#xC9DC #x5E9C) + (#xC9DD #x6016) + (#xC9DE #x6276) + (#xC9DF #x6577) + (#xC9E0 #x65A7) + (#xC9E1 #x666E) + (#xC9E2 #x6D6E) + (#xC9E3 #x7236) + (#xC9E4 #x7B26) + (#xC9E5 #x8150) + (#xC9E6 #x819A) + (#xC9E7 #x8299) + (#xC9E8 #x8B5C) + (#xC9E9 #x8CA0) + (#xC9EA #x8CE6) + (#xC9EB #x8D74) + (#xC9EC #x961C) + (#xC9ED #x9644) + (#xC9EE #x4FAE) + (#xC9EF #x64AB) + (#xC9F0 #x6B66) + (#xC9F1 #x821E) + (#xC9F2 #x8461) + (#xC9F3 #x856A) + (#xC9F4 #x90E8) + (#xC9F5 #x5C01) + (#xC9F6 #x6953) + (#xC9F7 #x98A8) + (#xC9F8 #x847A) + (#xC9F9 #x8557) + (#xC9FA #x4F0F) + (#xC9FB #x526F) + (#xC9FC #x5FA9) + (#xC9FD #x5E45) + (#xC9FE #x670D) + (#xCAA1 #x798F) + (#xCAA2 #x8179) + (#xCAA3 #x8907) + (#xCAA4 #x8986) + (#xCAA5 #x6DF5) + (#xCAA6 #x5F17) + (#xCAA7 #x6255) + (#xCAA8 #x6CB8) + (#xCAA9 #x4ECF) + (#xCAAA #x7269) + (#xCAAB #x9B92) + (#xCAAC #x5206) + (#xCAAD #x543B) + (#xCAAE #x5674) + (#xCAAF #x58B3) + (#xCAB0 #x61A4) + (#xCAB1 #x626E) + (#xCAB2 #x711A) + (#xCAB3 #x596E) + (#xCAB4 #x7C89) + (#xCAB5 #x7CDE) + (#xCAB6 #x7D1B) + (#xCAB7 #x96F0) + (#xCAB8 #x6587) + (#xCAB9 #x805E) + (#xCABA #x4E19) + (#xCABB #x4F75) + (#xCABC #x5175) + (#xCABD #x5840) + (#xCABE #x5E63) + (#xCABF #x5E73) + (#xCAC0 #x5F0A) + (#xCAC1 #x67C4) + (#xCAC2 #x4E26) + (#xCAC3 #x853D) + (#xCAC4 #x9589) + (#xCAC5 #x965B) + (#xCAC6 #x7C73) + (#xCAC7 #x9801) + (#xCAC8 #x50FB) + (#xCAC9 #x58C1) + (#xCACA #x7656) + (#xCACB #x78A7) + (#xCACC #x5225) + (#xCACD #x77A5) + (#xCACE #x8511) + (#xCACF #x7B86) + (#xCAD0 #x504F) + (#xCAD1 #x5909) + (#xCAD2 #x7247) + (#xCAD3 #x7BC7) + (#xCAD4 #x7DE8) + (#xCAD5 #x8FBA) + (#xCAD6 #x8FD4) + (#xCAD7 #x904D) + (#xCAD8 #x4FBF) + (#xCAD9 #x52C9) + (#xCADA #x5A29) + (#xCADB #x5F01) + (#xCADC #x97AD) + (#xCADD #x4FDD) + (#xCADE #x8217) + (#xCADF #x92EA) + (#xCAE0 #x5703) + (#xCAE1 #x6355) + (#xCAE2 #x6B69) + (#xCAE3 #x752B) + (#xCAE4 #x88DC) + (#xCAE5 #x8F14) + (#xCAE6 #x7A42) + (#xCAE7 #x52DF) + (#xCAE8 #x5893) + (#xCAE9 #x6155) + (#xCAEA #x620A) + (#xCAEB #x66AE) + (#xCAEC #x6BCD) + (#xCAED #x7C3F) + (#xCAEE #x83E9) + (#xCAEF #x5023) + (#xCAF0 #x4FF8) + (#xCAF1 #x5305) + (#xCAF2 #x5446) + (#xCAF3 #x5831) + (#xCAF4 #x5949) + (#xCAF5 #x5B9D) + (#xCAF6 #x5CF0) + (#xCAF7 #x5CEF) + (#xCAF8 #x5D29) + (#xCAF9 #x5E96) + (#xCAFA #x62B1) + (#xCAFB #x6367) + (#xCAFC #x653E) + (#xCAFD #x65B9) + (#xCAFE #x670B) + (#xCBA1 #x6CD5) + (#xCBA2 #x6CE1) + (#xCBA3 #x70F9) + (#xCBA4 #x7832) + (#xCBA5 #x7E2B) + (#xCBA6 #x80DE) + (#xCBA7 #x82B3) + (#xCBA8 #x840C) + (#xCBA9 #x84EC) + (#xCBAA #x8702) + (#xCBAB #x8912) + (#xCBAC #x8A2A) + (#xCBAD #x8C4A) + (#xCBAE #x90A6) + (#xCBAF #x92D2) + (#xCBB0 #x98FD) + (#xCBB1 #x9CF3) + (#xCBB2 #x9D6C) + (#xCBB3 #x4E4F) + (#xCBB4 #x4EA1) + (#xCBB5 #x508D) + (#xCBB6 #x5256) + (#xCBB7 #x574A) + (#xCBB8 #x59A8) + (#xCBB9 #x5E3D) + (#xCBBA #x5FD8) + (#xCBBB #x5FD9) + (#xCBBC #x623F) + (#xCBBD #x66B4) + (#xCBBE #x671B) + (#xCBBF #x67D0) + (#xCBC0 #x68D2) + (#xCBC1 #x5192) + (#xCBC2 #x7D21) + (#xCBC3 #x80AA) + (#xCBC4 #x81A8) + (#xCBC5 #x8B00) + (#xCBC6 #x8C8C) + (#xCBC7 #x8CBF) + (#xCBC8 #x927E) + (#xCBC9 #x9632) + (#xCBCA #x5420) + (#xCBCB #x982C) + (#xCBCC #x5317) + (#xCBCD #x50D5) + (#xCBCE #x535C) + (#xCBCF #x58A8) + (#xCBD0 #x64B2) + (#xCBD1 #x6734) + (#xCBD2 #x7267) + (#xCBD3 #x7766) + (#xCBD4 #x7A46) + (#xCBD5 #x91E6) + (#xCBD6 #x52C3) + (#xCBD7 #x6CA1) + (#xCBD8 #x6B86) + (#xCBD9 #x5800) + (#xCBDA #x5E4C) + (#xCBDB #x5954) + (#xCBDC #x672C) + (#xCBDD #x7FFB) + (#xCBDE #x51E1) + (#xCBDF #x76C6) + (#xCBE0 #x6469) + (#xCBE1 #x78E8) + (#xCBE2 #x9B54) + (#xCBE3 #x9EBB) + (#xCBE4 #x57CB) + (#xCBE5 #x59B9) + (#xCBE6 #x6627) + (#xCBE7 #x679A) + (#xCBE8 #x6BCE) + (#xCBE9 #x54E9) + (#xCBEA #x69D9) + (#xCBEB #x5E55) + (#xCBEC #x819C) + (#xCBED #x6795) + (#xCBEE #x9BAA) + (#xCBEF #x67FE) + (#xCBF0 #x9C52) + (#xCBF1 #x685D) + (#xCBF2 #x4EA6) + (#xCBF3 #x4FE3) + (#xCBF4 #x53C8) + (#xCBF5 #x62B9) + (#xCBF6 #x672B) + (#xCBF7 #x6CAB) + (#xCBF8 #x8FC4) + (#xCBF9 #x4FAD) + (#xCBFA #x7E6D) + (#xCBFB #x9EBF) + (#xCBFC #x4E07) + (#xCBFD #x6162) + (#xCBFE #x6E80) + (#xCCA1 #x6F2B) + (#xCCA2 #x8513) + (#xCCA3 #x5473) + (#xCCA4 #x672A) + (#xCCA5 #x9B45) + (#xCCA6 #x5DF3) + (#xCCA7 #x7B95) + (#xCCA8 #x5CAC) + (#xCCA9 #x5BC6) + (#xCCAA #x871C) + (#xCCAB #x6E4A) + (#xCCAC #x84D1) + (#xCCAD #x7A14) + (#xCCAE #x8108) + (#xCCAF #x5999) + (#xCCB0 #x7C8D) + (#xCCB1 #x6C11) + (#xCCB2 #x7720) + (#xCCB3 #x52D9) + (#xCCB4 #x5922) + (#xCCB5 #x7121) + (#xCCB6 #x725F) + (#xCCB7 #x77DB) + (#xCCB8 #x9727) + (#xCCB9 #x9D61) + (#xCCBA #x690B) + (#xCCBB #x5A7F) + (#xCCBC #x5A18) + (#xCCBD #x51A5) + (#xCCBE #x540D) + (#xCCBF #x547D) + (#xCCC0 #x660E) + (#xCCC1 #x76DF) + (#xCCC2 #x8FF7) + (#xCCC3 #x9298) + (#xCCC4 #x9CF4) + (#xCCC5 #x59EA) + (#xCCC6 #x725D) + (#xCCC7 #x6EC5) + (#xCCC8 #x514D) + (#xCCC9 #x68C9) + (#xCCCA #x7DBF) + (#xCCCB #x7DEC) + (#xCCCC #x9762) + (#xCCCD #x9EBA) + (#xCCCE #x6478) + (#xCCCF #x6A21) + (#xCCD0 #x8302) + (#xCCD1 #x5984) + (#xCCD2 #x5B5F) + (#xCCD3 #x6BDB) + (#xCCD4 #x731B) + (#xCCD5 #x76F2) + (#xCCD6 #x7DB2) + (#xCCD7 #x8017) + (#xCCD8 #x8499) + (#xCCD9 #x5132) + (#xCCDA #x6728) + (#xCCDB #x9ED9) + (#xCCDC #x76EE) + (#xCCDD #x6762) + (#xCCDE #x52FF) + (#xCCDF #x9905) + (#xCCE0 #x5C24) + (#xCCE1 #x623B) + (#xCCE2 #x7C7E) + (#xCCE3 #x8CB0) + (#xCCE4 #x554F) + (#xCCE5 #x60B6) + (#xCCE6 #x7D0B) + (#xCCE7 #x9580) + (#xCCE8 #x5301) + (#xCCE9 #x4E5F) + (#xCCEA #x51B6) + (#xCCEB #x591C) + (#xCCEC #x723A) + (#xCCED #x8036) + (#xCCEE #x91CE) + (#xCCEF #x5F25) + (#xCCF0 #x77E2) + (#xCCF1 #x5384) + (#xCCF2 #x5F79) + (#xCCF3 #x7D04) + (#xCCF4 #x85AC) + (#xCCF5 #x8A33) + (#xCCF6 #x8E8D) + (#xCCF7 #x9756) + (#xCCF8 #x67F3) + (#xCCF9 #x85AE) + (#xCCFA #x9453) + (#xCCFB #x6109) + (#xCCFC #x6108) + (#xCCFD #x6CB9) + (#xCCFE #x7652) + (#xCDA1 #x8AED) + (#xCDA2 #x8F38) + (#xCDA3 #x552F) + (#xCDA4 #x4F51) + (#xCDA5 #x512A) + (#xCDA6 #x52C7) + (#xCDA7 #x53CB) + (#xCDA8 #x5BA5) + (#xCDA9 #x5E7D) + (#xCDAA #x60A0) + (#xCDAB #x6182) + (#xCDAC #x63D6) + (#xCDAD #x6709) + (#xCDAE #x67DA) + (#xCDAF #x6E67) + (#xCDB0 #x6D8C) + (#xCDB1 #x7336) + (#xCDB2 #x7337) + (#xCDB3 #x7531) + (#xCDB4 #x7950) + (#xCDB5 #x88D5) + (#xCDB6 #x8A98) + (#xCDB7 #x904A) + (#xCDB8 #x9091) + (#xCDB9 #x90F5) + (#xCDBA #x96C4) + (#xCDBB #x878D) + (#xCDBC #x5915) + (#xCDBD #x4E88) + (#xCDBE #x4F59) + (#xCDBF #x4E0E) + (#xCDC0 #x8A89) + (#xCDC1 #x8F3F) + (#xCDC2 #x9810) + (#xCDC3 #x50AD) + (#xCDC4 #x5E7C) + (#xCDC5 #x5996) + (#xCDC6 #x5BB9) + (#xCDC7 #x5EB8) + (#xCDC8 #x63DA) + (#xCDC9 #x63FA) + (#xCDCA #x64C1) + (#xCDCB #x66DC) + (#xCDCC #x694A) + (#xCDCD #x69D8) + (#xCDCE #x6D0B) + (#xCDCF #x6EB6) + (#xCDD0 #x7194) + (#xCDD1 #x7528) + (#xCDD2 #x7AAF) + (#xCDD3 #x7F8A) + (#xCDD4 #x8000) + (#xCDD5 #x8449) + (#xCDD6 #x84C9) + (#xCDD7 #x8981) + (#xCDD8 #x8B21) + (#xCDD9 #x8E0A) + (#xCDDA #x9065) + (#xCDDB #x967D) + (#xCDDC #x990A) + (#xCDDD #x617E) + (#xCDDE #x6291) + (#xCDDF #x6B32) + (#xCDE0 #x6C83) + (#xCDE1 #x6D74) + (#xCDE2 #x7FCC) + (#xCDE3 #x7FFC) + (#xCDE4 #x6DC0) + (#xCDE5 #x7F85) + (#xCDE6 #x87BA) + (#xCDE7 #x88F8) + (#xCDE8 #x6765) + (#xCDE9 #x83B1) + (#xCDEA #x983C) + (#xCDEB #x96F7) + (#xCDEC #x6D1B) + (#xCDED #x7D61) + (#xCDEE #x843D) + (#xCDEF #x916A) + (#xCDF0 #x4E71) + (#xCDF1 #x5375) + (#xCDF2 #x5D50) + (#xCDF3 #x6B04) + (#xCDF4 #x6FEB) + (#xCDF5 #x85CD) + (#xCDF6 #x862D) + (#xCDF7 #x89A7) + (#xCDF8 #x5229) + (#xCDF9 #x540F) + (#xCDFA #x5C65) + (#xCDFB #x674E) + (#xCDFC #x68A8) + (#xCDFD #x7406) + (#xCDFE #x7483) + (#xCEA1 #x75E2) + (#xCEA2 #x88CF) + (#xCEA3 #x88E1) + (#xCEA4 #x91CC) + (#xCEA5 #x96E2) + (#xCEA6 #x9678) + (#xCEA7 #x5F8B) + (#xCEA8 #x7387) + (#xCEA9 #x7ACB) + (#xCEAA #x844E) + (#xCEAB #x63A0) + (#xCEAC #x7565) + (#xCEAD #x5289) + (#xCEAE #x6D41) + (#xCEAF #x6E9C) + (#xCEB0 #x7409) + (#xCEB1 #x7559) + (#xCEB2 #x786B) + (#xCEB3 #x7C92) + (#xCEB4 #x9686) + (#xCEB5 #x7ADC) + (#xCEB6 #x9F8D) + (#xCEB7 #x4FB6) + (#xCEB8 #x616E) + (#xCEB9 #x65C5) + (#xCEBA #x865C) + (#xCEBB #x4E86) + (#xCEBC #x4EAE) + (#xCEBD #x50DA) + (#xCEBE #x4E21) + (#xCEBF #x51CC) + (#xCEC0 #x5BEE) + (#xCEC1 #x6599) + (#xCEC2 #x6881) + (#xCEC3 #x6DBC) + (#xCEC4 #x731F) + (#xCEC5 #x7642) + (#xCEC6 #x77AD) + (#xCEC7 #x7A1C) + (#xCEC8 #x7CE7) + (#xCEC9 #x826F) + (#xCECA #x8AD2) + (#xCECB #x907C) + (#xCECC #x91CF) + (#xCECD #x9675) + (#xCECE #x9818) + (#xCECF #x529B) + (#xCED0 #x7DD1) + (#xCED1 #x502B) + (#xCED2 #x5398) + (#xCED3 #x6797) + (#xCED4 #x6DCB) + (#xCED5 #x71D0) + (#xCED6 #x7433) + (#xCED7 #x81E8) + (#xCED8 #x8F2A) + (#xCED9 #x96A3) + (#xCEDA #x9C57) + (#xCEDB #x9E9F) + (#xCEDC #x7460) + (#xCEDD #x5841) + (#xCEDE #x6D99) + (#xCEDF #x7D2F) + (#xCEE0 #x985E) + (#xCEE1 #x4EE4) + (#xCEE2 #x4F36) + (#xCEE3 #x4F8B) + (#xCEE4 #x51B7) + (#xCEE5 #x52B1) + (#xCEE6 #x5DBA) + (#xCEE7 #x601C) + (#xCEE8 #x73B2) + (#xCEE9 #x793C) + (#xCEEA #x82D3) + (#xCEEB #x9234) + (#xCEEC #x96B7) + (#xCEED #x96F6) + (#xCEEE #x970A) + (#xCEEF #x9E97) + (#xCEF0 #x9F62) + (#xCEF1 #x66A6) + (#xCEF2 #x6B74) + (#xCEF3 #x5217) + (#xCEF4 #x52A3) + (#xCEF5 #x70C8) + (#xCEF6 #x88C2) + (#xCEF7 #x5EC9) + (#xCEF8 #x604B) + (#xCEF9 #x6190) + (#xCEFA #x6F23) + (#xCEFB #x7149) + (#xCEFC #x7C3E) + (#xCEFD #x7DF4) + (#xCEFE #x806F) + (#xCFA1 #x84EE) + (#xCFA2 #x9023) + (#xCFA3 #x932C) + (#xCFA4 #x5442) + (#xCFA5 #x9B6F) + (#xCFA6 #x6AD3) + (#xCFA7 #x7089) + (#xCFA8 #x8CC2) + (#xCFA9 #x8DEF) + (#xCFAA #x9732) + (#xCFAB #x52B4) + (#xCFAC #x5A41) + (#xCFAD #x5ECA) + (#xCFAE #x5F04) + (#xCFAF #x6717) + (#xCFB0 #x697C) + (#xCFB1 #x6994) + (#xCFB2 #x6D6A) + (#xCFB3 #x6F0F) + (#xCFB4 #x7262) + (#xCFB5 #x72FC) + (#xCFB6 #x7BED) + (#xCFB7 #x8001) + (#xCFB8 #x807E) + (#xCFB9 #x874B) + (#xCFBA #x90CE) + (#xCFBB #x516D) + (#xCFBC #x9E93) + (#xCFBD #x7984) + (#xCFBE #x808B) + (#xCFBF #x9332) + (#xCFC0 #x8AD6) + (#xCFC1 #x502D) + (#xCFC2 #x548C) + (#xCFC3 #x8A71) + (#xCFC4 #x6B6A) + (#xCFC5 #x8CC4) + (#xCFC6 #x8107) + (#xCFC7 #x60D1) + (#xCFC8 #x67A0) + (#xCFC9 #x9DF2) + (#xCFCA #x4E99) + (#xCFCB #x4E98) + (#xCFCC #x9C10) + (#xCFCD #x8A6B) + (#xCFCE #x85C1) + (#xCFCF #x8568) + (#xCFD0 #x6900) + (#xCFD1 #x6E7E) + (#xCFD2 #x7897) + (#xCFD3 #x8155) + (#xD0A1 #x5F0C) + (#xD0A2 #x4E10) + (#xD0A3 #x4E15) + (#xD0A4 #x4E2A) + (#xD0A5 #x4E31) + (#xD0A6 #x4E36) + (#xD0A7 #x4E3C) + (#xD0A8 #x4E3F) + (#xD0A9 #x4E42) + (#xD0AA #x4E56) + (#xD0AB #x4E58) + (#xD0AC #x4E82) + (#xD0AD #x4E85) + (#xD0AE #x8C6B) + (#xD0AF #x4E8A) + (#xD0B0 #x8212) + (#xD0B1 #x5F0D) + (#xD0B2 #x4E8E) + (#xD0B3 #x4E9E) + (#xD0B4 #x4E9F) + (#xD0B5 #x4EA0) + (#xD0B6 #x4EA2) + (#xD0B7 #x4EB0) + (#xD0B8 #x4EB3) + (#xD0B9 #x4EB6) + (#xD0BA #x4ECE) + (#xD0BB #x4ECD) + (#xD0BC #x4EC4) + (#xD0BD #x4EC6) + (#xD0BE #x4EC2) + (#xD0BF #x4ED7) + (#xD0C0 #x4EDE) + (#xD0C1 #x4EED) + (#xD0C2 #x4EDF) + (#xD0C3 #x4EF7) + (#xD0C4 #x4F09) + (#xD0C5 #x4F5A) + (#xD0C6 #x4F30) + (#xD0C7 #x4F5B) + (#xD0C8 #x4F5D) + (#xD0C9 #x4F57) + (#xD0CA #x4F47) + (#xD0CB #x4F76) + (#xD0CC #x4F88) + (#xD0CD #x4F8F) + (#xD0CE #x4F98) + (#xD0CF #x4F7B) + (#xD0D0 #x4F69) + (#xD0D1 #x4F70) + (#xD0D2 #x4F91) + (#xD0D3 #x4F6F) + (#xD0D4 #x4F86) + (#xD0D5 #x4F96) + (#xD0D6 #x5118) + (#xD0D7 #x4FD4) + (#xD0D8 #x4FDF) + (#xD0D9 #x4FCE) + (#xD0DA #x4FD8) + (#xD0DB #x4FDB) + (#xD0DC #x4FD1) + (#xD0DD #x4FDA) + (#xD0DE #x4FD0) + (#xD0DF #x4FE4) + (#xD0E0 #x4FE5) + (#xD0E1 #x501A) + (#xD0E2 #x5028) + (#xD0E3 #x5014) + (#xD0E4 #x502A) + (#xD0E5 #x5025) + (#xD0E6 #x5005) + (#xD0E7 #x4F1C) + (#xD0E8 #x4FF6) + (#xD0E9 #x5021) + (#xD0EA #x5029) + (#xD0EB #x502C) + (#xD0EC #x4FFE) + (#xD0ED #x4FEF) + (#xD0EE #x5011) + (#xD0EF #x5006) + (#xD0F0 #x5043) + (#xD0F1 #x5047) + (#xD0F2 #x6703) + (#xD0F3 #x5055) + (#xD0F4 #x5050) + (#xD0F5 #x5048) + (#xD0F6 #x505A) + (#xD0F7 #x5056) + (#xD0F8 #x506C) + (#xD0F9 #x5078) + (#xD0FA #x5080) + (#xD0FB #x509A) + (#xD0FC #x5085) + (#xD0FD #x50B4) + (#xD0FE #x50B2) + (#xD1A1 #x50C9) + (#xD1A2 #x50CA) + (#xD1A3 #x50B3) + (#xD1A4 #x50C2) + (#xD1A5 #x50D6) + (#xD1A6 #x50DE) + (#xD1A7 #x50E5) + (#xD1A8 #x50ED) + (#xD1A9 #x50E3) + (#xD1AA #x50EE) + (#xD1AB #x50F9) + (#xD1AC #x50F5) + (#xD1AD #x5109) + (#xD1AE #x5101) + (#xD1AF #x5102) + (#xD1B0 #x5116) + (#xD1B1 #x5115) + (#xD1B2 #x5114) + (#xD1B3 #x511A) + (#xD1B4 #x5121) + (#xD1B5 #x513A) + (#xD1B6 #x5137) + (#xD1B7 #x513C) + (#xD1B8 #x513B) + (#xD1B9 #x513F) + (#xD1BA #x5140) + (#xD1BB #x5152) + (#xD1BC #x514C) + (#xD1BD #x5154) + (#xD1BE #x5162) + (#xD1BF #x7AF8) + (#xD1C0 #x5169) + (#xD1C1 #x516A) + (#xD1C2 #x516E) + (#xD1C3 #x5180) + (#xD1C4 #x5182) + (#xD1C5 #x56D8) + (#xD1C6 #x518C) + (#xD1C7 #x5189) + (#xD1C8 #x518F) + (#xD1C9 #x5191) + (#xD1CA #x5193) + (#xD1CB #x5195) + (#xD1CC #x5196) + (#xD1CD #x51A4) + (#xD1CE #x51A6) + (#xD1CF #x51A2) + (#xD1D0 #x51A9) + (#xD1D1 #x51AA) + (#xD1D2 #x51AB) + (#xD1D3 #x51B3) + (#xD1D4 #x51B1) + (#xD1D5 #x51B2) + (#xD1D6 #x51B0) + (#xD1D7 #x51B5) + (#xD1D8 #x51BD) + (#xD1D9 #x51C5) + (#xD1DA #x51C9) + (#xD1DB #x51DB) + (#xD1DC #x51E0) + (#xD1DD #x8655) + (#xD1DE #x51E9) + (#xD1DF #x51ED) + (#xD1E0 #x51F0) + (#xD1E1 #x51F5) + (#xD1E2 #x51FE) + (#xD1E3 #x5204) + (#xD1E4 #x520B) + (#xD1E5 #x5214) + (#xD1E6 #x520E) + (#xD1E7 #x5227) + (#xD1E8 #x522A) + (#xD1E9 #x522E) + (#xD1EA #x5233) + (#xD1EB #x5239) + (#xD1EC #x524F) + (#xD1ED #x5244) + (#xD1EE #x524B) + (#xD1EF #x524C) + (#xD1F0 #x525E) + (#xD1F1 #x5254) + (#xD1F2 #x526A) + (#xD1F3 #x5274) + (#xD1F4 #x5269) + (#xD1F5 #x5273) + (#xD1F6 #x527F) + (#xD1F7 #x527D) + (#xD1F8 #x528D) + (#xD1F9 #x5294) + (#xD1FA #x5292) + (#xD1FB #x5271) + (#xD1FC #x5288) + (#xD1FD #x5291) + (#xD1FE #x8FA8) + (#xD2A1 #x8FA7) + (#xD2A2 #x52AC) + (#xD2A3 #x52AD) + (#xD2A4 #x52BC) + (#xD2A5 #x52B5) + (#xD2A6 #x52C1) + (#xD2A7 #x52CD) + (#xD2A8 #x52D7) + (#xD2A9 #x52DE) + (#xD2AA #x52E3) + (#xD2AB #x52E6) + (#xD2AC #x98ED) + (#xD2AD #x52E0) + (#xD2AE #x52F3) + (#xD2AF #x52F5) + (#xD2B0 #x52F8) + (#xD2B1 #x52F9) + (#xD2B2 #x5306) + (#xD2B3 #x5308) + (#xD2B4 #x7538) + (#xD2B5 #x530D) + (#xD2B6 #x5310) + (#xD2B7 #x530F) + (#xD2B8 #x5315) + (#xD2B9 #x531A) + (#xD2BA #x5323) + (#xD2BB #x532F) + (#xD2BC #x5331) + (#xD2BD #x5333) + (#xD2BE #x5338) + (#xD2BF #x5340) + (#xD2C0 #x5346) + (#xD2C1 #x5345) + (#xD2C2 #x4E17) + (#xD2C3 #x5349) + (#xD2C4 #x534D) + (#xD2C5 #x51D6) + (#xD2C6 #x535E) + (#xD2C7 #x5369) + (#xD2C8 #x536E) + (#xD2C9 #x5918) + (#xD2CA #x537B) + (#xD2CB #x5377) + (#xD2CC #x5382) + (#xD2CD #x5396) + (#xD2CE #x53A0) + (#xD2CF #x53A6) + (#xD2D0 #x53A5) + (#xD2D1 #x53AE) + (#xD2D2 #x53B0) + (#xD2D3 #x53B6) + (#xD2D4 #x53C3) + (#xD2D5 #x7C12) + (#xD2D6 #x96D9) + (#xD2D7 #x53DF) + (#xD2D8 #x66FC) + (#xD2D9 #x71EE) + (#xD2DA #x53EE) + (#xD2DB #x53E8) + (#xD2DC #x53ED) + (#xD2DD #x53FA) + (#xD2DE #x5401) + (#xD2DF #x543D) + (#xD2E0 #x5440) + (#xD2E1 #x542C) + (#xD2E2 #x542D) + (#xD2E3 #x543C) + (#xD2E4 #x542E) + (#xD2E5 #x5436) + (#xD2E6 #x5429) + (#xD2E7 #x541D) + (#xD2E8 #x544E) + (#xD2E9 #x548F) + (#xD2EA #x5475) + (#xD2EB #x548E) + (#xD2EC #x545F) + (#xD2ED #x5471) + (#xD2EE #x5477) + (#xD2EF #x5470) + (#xD2F0 #x5492) + (#xD2F1 #x547B) + (#xD2F2 #x5480) + (#xD2F3 #x5476) + (#xD2F4 #x5484) + (#xD2F5 #x5490) + (#xD2F6 #x5486) + (#xD2F7 #x54C7) + (#xD2F8 #x54A2) + (#xD2F9 #x54B8) + (#xD2FA #x54A5) + (#xD2FB #x54AC) + (#xD2FC #x54C4) + (#xD2FD #x54C8) + (#xD2FE #x54A8) + (#xD3A1 #x54AB) + (#xD3A2 #x54C2) + (#xD3A3 #x54A4) + (#xD3A4 #x54BE) + (#xD3A5 #x54BC) + (#xD3A6 #x54D8) + (#xD3A7 #x54E5) + (#xD3A8 #x54E6) + (#xD3A9 #x550F) + (#xD3AA #x5514) + (#xD3AB #x54FD) + (#xD3AC #x54EE) + (#xD3AD #x54ED) + (#xD3AE #x54FA) + (#xD3AF #x54E2) + (#xD3B0 #x5539) + (#xD3B1 #x5540) + (#xD3B2 #x5563) + (#xD3B3 #x554C) + (#xD3B4 #x552E) + (#xD3B5 #x555C) + (#xD3B6 #x5545) + (#xD3B7 #x5556) + (#xD3B8 #x5557) + (#xD3B9 #x5538) + (#xD3BA #x5533) + (#xD3BB #x555D) + (#xD3BC #x5599) + (#xD3BD #x5580) + (#xD3BE #x54AF) + (#xD3BF #x558A) + (#xD3C0 #x559F) + (#xD3C1 #x557B) + (#xD3C2 #x557E) + (#xD3C3 #x5598) + (#xD3C4 #x559E) + (#xD3C5 #x55AE) + (#xD3C6 #x557C) + (#xD3C7 #x5583) + (#xD3C8 #x55A9) + (#xD3C9 #x5587) + (#xD3CA #x55A8) + (#xD3CB #x55DA) + (#xD3CC #x55C5) + (#xD3CD #x55DF) + (#xD3CE #x55C4) + (#xD3CF #x55DC) + (#xD3D0 #x55E4) + (#xD3D1 #x55D4) + (#xD3D2 #x5614) + (#xD3D3 #x55F7) + (#xD3D4 #x5616) + (#xD3D5 #x55FE) + (#xD3D6 #x55FD) + (#xD3D7 #x561B) + (#xD3D8 #x55F9) + (#xD3D9 #x564E) + (#xD3DA #x5650) + (#xD3DB #x71DF) + (#xD3DC #x5634) + (#xD3DD #x5636) + (#xD3DE #x5632) + (#xD3DF #x5638) + (#xD3E0 #x566B) + (#xD3E1 #x5664) + (#xD3E2 #x562F) + (#xD3E3 #x566C) + (#xD3E4 #x566A) + (#xD3E5 #x5686) + (#xD3E6 #x5680) + (#xD3E7 #x568A) + (#xD3E8 #x56A0) + (#xD3E9 #x5694) + (#xD3EA #x568F) + (#xD3EB #x56A5) + (#xD3EC #x56AE) + (#xD3ED #x56B6) + (#xD3EE #x56B4) + (#xD3EF #x56C2) + (#xD3F0 #x56BC) + (#xD3F1 #x56C1) + (#xD3F2 #x56C3) + (#xD3F3 #x56C0) + (#xD3F4 #x56C8) + (#xD3F5 #x56CE) + (#xD3F6 #x56D1) + (#xD3F7 #x56D3) + (#xD3F8 #x56D7) + (#xD3F9 #x56EE) + (#xD3FA #x56F9) + (#xD3FB #x5700) + (#xD3FC #x56FF) + (#xD3FD #x5704) + (#xD3FE #x5709) + (#xD4A1 #x5708) + (#xD4A2 #x570B) + (#xD4A3 #x570D) + (#xD4A4 #x5713) + (#xD4A5 #x5718) + (#xD4A6 #x5716) + (#xD4A7 #x55C7) + (#xD4A8 #x571C) + (#xD4A9 #x5726) + (#xD4AA #x5737) + (#xD4AB #x5738) + (#xD4AC #x574E) + (#xD4AD #x573B) + (#xD4AE #x5740) + (#xD4AF #x574F) + (#xD4B0 #x5769) + (#xD4B1 #x57C0) + (#xD4B2 #x5788) + (#xD4B3 #x5761) + (#xD4B4 #x577F) + (#xD4B5 #x5789) + (#xD4B6 #x5793) + (#xD4B7 #x57A0) + (#xD4B8 #x57B3) + (#xD4B9 #x57A4) + (#xD4BA #x57AA) + (#xD4BB #x57B0) + (#xD4BC #x57C3) + (#xD4BD #x57C6) + (#xD4BE #x57D4) + (#xD4BF #x57D2) + (#xD4C0 #x57D3) + (#xD4C1 #x580A) + (#xD4C2 #x57D6) + (#xD4C3 #x57E3) + (#xD4C4 #x580B) + (#xD4C5 #x5819) + (#xD4C6 #x581D) + (#xD4C7 #x5872) + (#xD4C8 #x5821) + (#xD4C9 #x5862) + (#xD4CA #x584B) + (#xD4CB #x5870) + (#xD4CC #x6BC0) + (#xD4CD #x5852) + (#xD4CE #x583D) + (#xD4CF #x5879) + (#xD4D0 #x5885) + (#xD4D1 #x58B9) + (#xD4D2 #x589F) + (#xD4D3 #x58AB) + (#xD4D4 #x58BA) + (#xD4D5 #x58DE) + (#xD4D6 #x58BB) + (#xD4D7 #x58B8) + (#xD4D8 #x58AE) + (#xD4D9 #x58C5) + (#xD4DA #x58D3) + (#xD4DB #x58D1) + (#xD4DC #x58D7) + (#xD4DD #x58D9) + (#xD4DE #x58D8) + (#xD4DF #x58E5) + (#xD4E0 #x58DC) + (#xD4E1 #x58E4) + (#xD4E2 #x58DF) + (#xD4E3 #x58EF) + (#xD4E4 #x58FA) + (#xD4E5 #x58F9) + (#xD4E6 #x58FB) + (#xD4E7 #x58FC) + (#xD4E8 #x58FD) + (#xD4E9 #x5902) + (#xD4EA #x590A) + (#xD4EB #x5910) + (#xD4EC #x591B) + (#xD4ED #x68A6) + (#xD4EE #x5925) + (#xD4EF #x592C) + (#xD4F0 #x592D) + (#xD4F1 #x5932) + (#xD4F2 #x5938) + (#xD4F3 #x593E) + (#xD4F4 #x7AD2) + (#xD4F5 #x5955) + (#xD4F6 #x5950) + (#xD4F7 #x594E) + (#xD4F8 #x595A) + (#xD4F9 #x5958) + (#xD4FA #x5962) + (#xD4FB #x5960) + (#xD4FC #x5967) + (#xD4FD #x596C) + (#xD4FE #x5969) + (#xD5A1 #x5978) + (#xD5A2 #x5981) + (#xD5A3 #x599D) + (#xD5A4 #x4F5E) + (#xD5A5 #x4FAB) + (#xD5A6 #x59A3) + (#xD5A7 #x59B2) + (#xD5A8 #x59C6) + (#xD5A9 #x59E8) + (#xD5AA #x59DC) + (#xD5AB #x598D) + (#xD5AC #x59D9) + (#xD5AD #x59DA) + (#xD5AE #x5A25) + (#xD5AF #x5A1F) + (#xD5B0 #x5A11) + (#xD5B1 #x5A1C) + (#xD5B2 #x5A09) + (#xD5B3 #x5A1A) + (#xD5B4 #x5A40) + (#xD5B5 #x5A6C) + (#xD5B6 #x5A49) + (#xD5B7 #x5A35) + (#xD5B8 #x5A36) + (#xD5B9 #x5A62) + (#xD5BA #x5A6A) + (#xD5BB #x5A9A) + (#xD5BC #x5ABC) + (#xD5BD #x5ABE) + (#xD5BE #x5ACB) + (#xD5BF #x5AC2) + (#xD5C0 #x5ABD) + (#xD5C1 #x5AE3) + (#xD5C2 #x5AD7) + (#xD5C3 #x5AE6) + (#xD5C4 #x5AE9) + (#xD5C5 #x5AD6) + (#xD5C6 #x5AFA) + (#xD5C7 #x5AFB) + (#xD5C8 #x5B0C) + (#xD5C9 #x5B0B) + (#xD5CA #x5B16) + (#xD5CB #x5B32) + (#xD5CC #x5AD0) + (#xD5CD #x5B2A) + (#xD5CE #x5B36) + (#xD5CF #x5B3E) + (#xD5D0 #x5B43) + (#xD5D1 #x5B45) + (#xD5D2 #x5B40) + (#xD5D3 #x5B51) + (#xD5D4 #x5B55) + (#xD5D5 #x5B5A) + (#xD5D6 #x5B5B) + (#xD5D7 #x5B65) + (#xD5D8 #x5B69) + (#xD5D9 #x5B70) + (#xD5DA #x5B73) + (#xD5DB #x5B75) + (#xD5DC #x5B78) + (#xD5DD #x6588) + (#xD5DE #x5B7A) + (#xD5DF #x5B80) + (#xD5E0 #x5B83) + (#xD5E1 #x5BA6) + (#xD5E2 #x5BB8) + (#xD5E3 #x5BC3) + (#xD5E4 #x5BC7) + (#xD5E5 #x5BC9) + (#xD5E6 #x5BD4) + (#xD5E7 #x5BD0) + (#xD5E8 #x5BE4) + (#xD5E9 #x5BE6) + (#xD5EA #x5BE2) + (#xD5EB #x5BDE) + (#xD5EC #x5BE5) + (#xD5ED #x5BEB) + (#xD5EE #x5BF0) + (#xD5EF #x5BF6) + (#xD5F0 #x5BF3) + (#xD5F1 #x5C05) + (#xD5F2 #x5C07) + (#xD5F3 #x5C08) + (#xD5F4 #x5C0D) + (#xD5F5 #x5C13) + (#xD5F6 #x5C20) + (#xD5F7 #x5C22) + (#xD5F8 #x5C28) + (#xD5F9 #x5C38) + (#xD5FA #x5C39) + (#xD5FB #x5C41) + (#xD5FC #x5C46) + (#xD5FD #x5C4E) + (#xD5FE #x5C53) + (#xD6A1 #x5C50) + (#xD6A2 #x5C4F) + (#xD6A3 #x5B71) + (#xD6A4 #x5C6C) + (#xD6A5 #x5C6E) + (#xD6A6 #x4E62) + (#xD6A7 #x5C76) + (#xD6A8 #x5C79) + (#xD6A9 #x5C8C) + (#xD6AA #x5C91) + (#xD6AB #x5C94) + (#xD6AC #x599B) + (#xD6AD #x5CAB) + (#xD6AE #x5CBB) + (#xD6AF #x5CB6) + (#xD6B0 #x5CBC) + (#xD6B1 #x5CB7) + (#xD6B2 #x5CC5) + (#xD6B3 #x5CBE) + (#xD6B4 #x5CC7) + (#xD6B5 #x5CD9) + (#xD6B6 #x5CE9) + (#xD6B7 #x5CFD) + (#xD6B8 #x5CFA) + (#xD6B9 #x5CED) + (#xD6BA #x5D8C) + (#xD6BB #x5CEA) + (#xD6BC #x5D0B) + (#xD6BD #x5D15) + (#xD6BE #x5D17) + (#xD6BF #x5D5C) + (#xD6C0 #x5D1F) + (#xD6C1 #x5D1B) + (#xD6C2 #x5D11) + (#xD6C3 #x5D14) + (#xD6C4 #x5D22) + (#xD6C5 #x5D1A) + (#xD6C6 #x5D19) + (#xD6C7 #x5D18) + (#xD6C8 #x5D4C) + (#xD6C9 #x5D52) + (#xD6CA #x5D4E) + (#xD6CB #x5D4B) + (#xD6CC #x5D6C) + (#xD6CD #x5D73) + (#xD6CE #x5D76) + (#xD6CF #x5D87) + (#xD6D0 #x5D84) + (#xD6D1 #x5D82) + (#xD6D2 #x5DA2) + (#xD6D3 #x5D9D) + (#xD6D4 #x5DAC) + (#xD6D5 #x5DAE) + (#xD6D6 #x5DBD) + (#xD6D7 #x5D90) + (#xD6D8 #x5DB7) + (#xD6D9 #x5DBC) + (#xD6DA #x5DC9) + (#xD6DB #x5DCD) + (#xD6DC #x5DD3) + (#xD6DD #x5DD2) + (#xD6DE #x5DD6) + (#xD6DF #x5DDB) + (#xD6E0 #x5DEB) + (#xD6E1 #x5DF2) + (#xD6E2 #x5DF5) + (#xD6E3 #x5E0B) + (#xD6E4 #x5E1A) + (#xD6E5 #x5E19) + (#xD6E6 #x5E11) + (#xD6E7 #x5E1B) + (#xD6E8 #x5E36) + (#xD6E9 #x5E37) + (#xD6EA #x5E44) + (#xD6EB #x5E43) + (#xD6EC #x5E40) + (#xD6ED #x5E4E) + (#xD6EE #x5E57) + (#xD6EF #x5E54) + (#xD6F0 #x5E5F) + (#xD6F1 #x5E62) + (#xD6F2 #x5E64) + (#xD6F3 #x5E47) + (#xD6F4 #x5E75) + (#xD6F5 #x5E76) + (#xD6F6 #x5E7A) + (#xD6F7 #x9EBC) + (#xD6F8 #x5E7F) + (#xD6F9 #x5EA0) + (#xD6FA #x5EC1) + (#xD6FB #x5EC2) + (#xD6FC #x5EC8) + (#xD6FD #x5ED0) + (#xD6FE #x5ECF) + (#xD7A1 #x5ED6) + (#xD7A2 #x5EE3) + (#xD7A3 #x5EDD) + (#xD7A4 #x5EDA) + (#xD7A5 #x5EDB) + (#xD7A6 #x5EE2) + (#xD7A7 #x5EE1) + (#xD7A8 #x5EE8) + (#xD7A9 #x5EE9) + (#xD7AA #x5EEC) + (#xD7AB #x5EF1) + (#xD7AC #x5EF3) + (#xD7AD #x5EF0) + (#xD7AE #x5EF4) + (#xD7AF #x5EF8) + (#xD7B0 #x5EFE) + (#xD7B1 #x5F03) + (#xD7B2 #x5F09) + (#xD7B3 #x5F5D) + (#xD7B4 #x5F5C) + (#xD7B5 #x5F0B) + (#xD7B6 #x5F11) + (#xD7B7 #x5F16) + (#xD7B8 #x5F29) + (#xD7B9 #x5F2D) + (#xD7BA #x5F38) + (#xD7BB #x5F41) + (#xD7BC #x5F48) + (#xD7BD #x5F4C) + (#xD7BE #x5F4E) + (#xD7BF #x5F2F) + (#xD7C0 #x5F51) + (#xD7C1 #x5F56) + (#xD7C2 #x5F57) + (#xD7C3 #x5F59) + (#xD7C4 #x5F61) + (#xD7C5 #x5F6D) + (#xD7C6 #x5F73) + (#xD7C7 #x5F77) + (#xD7C8 #x5F83) + (#xD7C9 #x5F82) + (#xD7CA #x5F7F) + (#xD7CB #x5F8A) + (#xD7CC #x5F88) + (#xD7CD #x5F91) + (#xD7CE #x5F87) + (#xD7CF #x5F9E) + (#xD7D0 #x5F99) + (#xD7D1 #x5F98) + (#xD7D2 #x5FA0) + (#xD7D3 #x5FA8) + (#xD7D4 #x5FAD) + (#xD7D5 #x5FBC) + (#xD7D6 #x5FD6) + (#xD7D7 #x5FFB) + (#xD7D8 #x5FE4) + (#xD7D9 #x5FF8) + (#xD7DA #x5FF1) + (#xD7DB #x5FDD) + (#xD7DC #x60B3) + (#xD7DD #x5FFF) + (#xD7DE #x6021) + (#xD7DF #x6060) + (#xD7E0 #x6019) + (#xD7E1 #x6010) + (#xD7E2 #x6029) + (#xD7E3 #x600E) + (#xD7E4 #x6031) + (#xD7E5 #x601B) + (#xD7E6 #x6015) + (#xD7E7 #x602B) + (#xD7E8 #x6026) + (#xD7E9 #x600F) + (#xD7EA #x603A) + (#xD7EB #x605A) + (#xD7EC #x6041) + (#xD7ED #x606A) + (#xD7EE #x6077) + (#xD7EF #x605F) + (#xD7F0 #x604A) + (#xD7F1 #x6046) + (#xD7F2 #x604D) + (#xD7F3 #x6063) + (#xD7F4 #x6043) + (#xD7F5 #x6064) + (#xD7F6 #x6042) + (#xD7F7 #x606C) + (#xD7F8 #x606B) + (#xD7F9 #x6059) + (#xD7FA #x6081) + (#xD7FB #x608D) + (#xD7FC #x60E7) + (#xD7FD #x6083) + (#xD7FE #x609A) + (#xD8A1 #x6084) + (#xD8A2 #x609B) + (#xD8A3 #x6096) + (#xD8A4 #x6097) + (#xD8A5 #x6092) + (#xD8A6 #x60A7) + (#xD8A7 #x608B) + (#xD8A8 #x60E1) + (#xD8A9 #x60B8) + (#xD8AA #x60E0) + (#xD8AB #x60D3) + (#xD8AC #x60B4) + (#xD8AD #x5FF0) + (#xD8AE #x60BD) + (#xD8AF #x60C6) + (#xD8B0 #x60B5) + (#xD8B1 #x60D8) + (#xD8B2 #x614D) + (#xD8B3 #x6115) + (#xD8B4 #x6106) + (#xD8B5 #x60F6) + (#xD8B6 #x60F7) + (#xD8B7 #x6100) + (#xD8B8 #x60F4) + (#xD8B9 #x60FA) + (#xD8BA #x6103) + (#xD8BB #x6121) + (#xD8BC #x60FB) + (#xD8BD #x60F1) + (#xD8BE #x610D) + (#xD8BF #x610E) + (#xD8C0 #x6147) + (#xD8C1 #x613E) + (#xD8C2 #x6128) + (#xD8C3 #x6127) + (#xD8C4 #x614A) + (#xD8C5 #x613F) + (#xD8C6 #x613C) + (#xD8C7 #x612C) + (#xD8C8 #x6134) + (#xD8C9 #x613D) + (#xD8CA #x6142) + (#xD8CB #x6144) + (#xD8CC #x6173) + (#xD8CD #x6177) + (#xD8CE #x6158) + (#xD8CF #x6159) + (#xD8D0 #x615A) + (#xD8D1 #x616B) + (#xD8D2 #x6174) + (#xD8D3 #x616F) + (#xD8D4 #x6165) + (#xD8D5 #x6171) + (#xD8D6 #x615F) + (#xD8D7 #x615D) + (#xD8D8 #x6153) + (#xD8D9 #x6175) + (#xD8DA #x6199) + (#xD8DB #x6196) + (#xD8DC #x6187) + (#xD8DD #x61AC) + (#xD8DE #x6194) + (#xD8DF #x619A) + (#xD8E0 #x618A) + (#xD8E1 #x6191) + (#xD8E2 #x61AB) + (#xD8E3 #x61AE) + (#xD8E4 #x61CC) + (#xD8E5 #x61CA) + (#xD8E6 #x61C9) + (#xD8E7 #x61F7) + (#xD8E8 #x61C8) + (#xD8E9 #x61C3) + (#xD8EA #x61C6) + (#xD8EB #x61BA) + (#xD8EC #x61CB) + (#xD8ED #x7F79) + (#xD8EE #x61CD) + (#xD8EF #x61E6) + (#xD8F0 #x61E3) + (#xD8F1 #x61F6) + (#xD8F2 #x61FA) + (#xD8F3 #x61F4) + (#xD8F4 #x61FF) + (#xD8F5 #x61FD) + (#xD8F6 #x61FC) + (#xD8F7 #x61FE) + (#xD8F8 #x6200) + (#xD8F9 #x6208) + (#xD8FA #x6209) + (#xD8FB #x620D) + (#xD8FC #x620C) + (#xD8FD #x6214) + (#xD8FE #x621B) + (#xD9A1 #x621E) + (#xD9A2 #x6221) + (#xD9A3 #x622A) + (#xD9A4 #x622E) + (#xD9A5 #x6230) + (#xD9A6 #x6232) + (#xD9A7 #x6233) + (#xD9A8 #x6241) + (#xD9A9 #x624E) + (#xD9AA #x625E) + (#xD9AB #x6263) + (#xD9AC #x625B) + (#xD9AD #x6260) + (#xD9AE #x6268) + (#xD9AF #x627C) + (#xD9B0 #x6282) + (#xD9B1 #x6289) + (#xD9B2 #x627E) + (#xD9B3 #x6292) + (#xD9B4 #x6293) + (#xD9B5 #x6296) + (#xD9B6 #x62D4) + (#xD9B7 #x6283) + (#xD9B8 #x6294) + (#xD9B9 #x62D7) + (#xD9BA #x62D1) + (#xD9BB #x62BB) + (#xD9BC #x62CF) + (#xD9BD #x62FF) + (#xD9BE #x62C6) + (#xD9BF #x64D4) + (#xD9C0 #x62C8) + (#xD9C1 #x62DC) + (#xD9C2 #x62CC) + (#xD9C3 #x62CA) + (#xD9C4 #x62C2) + (#xD9C5 #x62C7) + (#xD9C6 #x629B) + (#xD9C7 #x62C9) + (#xD9C8 #x630C) + (#xD9C9 #x62EE) + (#xD9CA #x62F1) + (#xD9CB #x6327) + (#xD9CC #x6302) + (#xD9CD #x6308) + (#xD9CE #x62EF) + (#xD9CF #x62F5) + (#xD9D0 #x6350) + (#xD9D1 #x633E) + (#xD9D2 #x634D) + (#xD9D3 #x641C) + (#xD9D4 #x634F) + (#xD9D5 #x6396) + (#xD9D6 #x638E) + (#xD9D7 #x6380) + (#xD9D8 #x63AB) + (#xD9D9 #x6376) + (#xD9DA #x63A3) + (#xD9DB #x638F) + (#xD9DC #x6389) + (#xD9DD #x639F) + (#xD9DE #x63B5) + (#xD9DF #x636B) + (#xD9E0 #x6369) + (#xD9E1 #x63BE) + (#xD9E2 #x63E9) + (#xD9E3 #x63C0) + (#xD9E4 #x63C6) + (#xD9E5 #x63E3) + (#xD9E6 #x63C9) + (#xD9E7 #x63D2) + (#xD9E8 #x63F6) + (#xD9E9 #x63C4) + (#xD9EA #x6416) + (#xD9EB #x6434) + (#xD9EC #x6406) + (#xD9ED #x6413) + (#xD9EE #x6426) + (#xD9EF #x6436) + (#xD9F0 #x651D) + (#xD9F1 #x6417) + (#xD9F2 #x6428) + (#xD9F3 #x640F) + (#xD9F4 #x6467) + (#xD9F5 #x646F) + (#xD9F6 #x6476) + (#xD9F7 #x644E) + (#xD9F8 #x652A) + (#xD9F9 #x6495) + (#xD9FA #x6493) + (#xD9FB #x64A5) + (#xD9FC #x64A9) + (#xD9FD #x6488) + (#xD9FE #x64BC) + (#xDAA1 #x64DA) + (#xDAA2 #x64D2) + (#xDAA3 #x64C5) + (#xDAA4 #x64C7) + (#xDAA5 #x64BB) + (#xDAA6 #x64D8) + (#xDAA7 #x64C2) + (#xDAA8 #x64F1) + (#xDAA9 #x64E7) + (#xDAAA #x8209) + (#xDAAB #x64E0) + (#xDAAC #x64E1) + (#xDAAD #x62AC) + (#xDAAE #x64E3) + (#xDAAF #x64EF) + (#xDAB0 #x652C) + (#xDAB1 #x64F6) + (#xDAB2 #x64F4) + (#xDAB3 #x64F2) + (#xDAB4 #x64FA) + (#xDAB5 #x6500) + (#xDAB6 #x64FD) + (#xDAB7 #x6518) + (#xDAB8 #x651C) + (#xDAB9 #x6505) + (#xDABA #x6524) + (#xDABB #x6523) + (#xDABC #x652B) + (#xDABD #x6534) + (#xDABE #x6535) + (#xDABF #x6537) + (#xDAC0 #x6536) + (#xDAC1 #x6538) + (#xDAC2 #x754B) + (#xDAC3 #x6548) + (#xDAC4 #x6556) + (#xDAC5 #x6555) + (#xDAC6 #x654D) + (#xDAC7 #x6558) + (#xDAC8 #x655E) + (#xDAC9 #x655D) + (#xDACA #x6572) + (#xDACB #x6578) + (#xDACC #x6582) + (#xDACD #x6583) + (#xDACE #x8B8A) + (#xDACF #x659B) + (#xDAD0 #x659F) + (#xDAD1 #x65AB) + (#xDAD2 #x65B7) + (#xDAD3 #x65C3) + (#xDAD4 #x65C6) + (#xDAD5 #x65C1) + (#xDAD6 #x65C4) + (#xDAD7 #x65CC) + (#xDAD8 #x65D2) + (#xDAD9 #x65DB) + (#xDADA #x65D9) + (#xDADB #x65E0) + (#xDADC #x65E1) + (#xDADD #x65F1) + (#xDADE #x6772) + (#xDADF #x660A) + (#xDAE0 #x6603) + (#xDAE1 #x65FB) + (#xDAE2 #x6773) + (#xDAE3 #x6635) + (#xDAE4 #x6636) + (#xDAE5 #x6634) + (#xDAE6 #x661C) + (#xDAE7 #x664F) + (#xDAE8 #x6644) + (#xDAE9 #x6649) + (#xDAEA #x6641) + (#xDAEB #x665E) + (#xDAEC #x665D) + (#xDAED #x6664) + (#xDAEE #x6667) + (#xDAEF #x6668) + (#xDAF0 #x665F) + (#xDAF1 #x6662) + (#xDAF2 #x6670) + (#xDAF3 #x6683) + (#xDAF4 #x6688) + (#xDAF5 #x668E) + (#xDAF6 #x6689) + (#xDAF7 #x6684) + (#xDAF8 #x6698) + (#xDAF9 #x669D) + (#xDAFA #x66C1) + (#xDAFB #x66B9) + (#xDAFC #x66C9) + (#xDAFD #x66BE) + (#xDAFE #x66BC) + (#xDBA1 #x66C4) + (#xDBA2 #x66B8) + (#xDBA3 #x66D6) + (#xDBA4 #x66DA) + (#xDBA5 #x66E0) + (#xDBA6 #x663F) + (#xDBA7 #x66E6) + (#xDBA8 #x66E9) + (#xDBA9 #x66F0) + (#xDBAA #x66F5) + (#xDBAB #x66F7) + (#xDBAC #x670F) + (#xDBAD #x6716) + (#xDBAE #x671E) + (#xDBAF #x6726) + (#xDBB0 #x6727) + (#xDBB1 #x9738) + (#xDBB2 #x672E) + (#xDBB3 #x673F) + (#xDBB4 #x6736) + (#xDBB5 #x6741) + (#xDBB6 #x6738) + (#xDBB7 #x6737) + (#xDBB8 #x6746) + (#xDBB9 #x675E) + (#xDBBA #x6760) + (#xDBBB #x6759) + (#xDBBC #x6763) + (#xDBBD #x6764) + (#xDBBE #x6789) + (#xDBBF #x6770) + (#xDBC0 #x67A9) + (#xDBC1 #x677C) + (#xDBC2 #x676A) + (#xDBC3 #x678C) + (#xDBC4 #x678B) + (#xDBC5 #x67A6) + (#xDBC6 #x67A1) + (#xDBC7 #x6785) + (#xDBC8 #x67B7) + (#xDBC9 #x67EF) + (#xDBCA #x67B4) + (#xDBCB #x67EC) + (#xDBCC #x67B3) + (#xDBCD #x67E9) + (#xDBCE #x67B8) + (#xDBCF #x67E4) + (#xDBD0 #x67DE) + (#xDBD1 #x67DD) + (#xDBD2 #x67E2) + (#xDBD3 #x67EE) + (#xDBD4 #x67B9) + (#xDBD5 #x67CE) + (#xDBD6 #x67C6) + (#xDBD7 #x67E7) + (#xDBD8 #x6A9C) + (#xDBD9 #x681E) + (#xDBDA #x6846) + (#xDBDB #x6829) + (#xDBDC #x6840) + (#xDBDD #x684D) + (#xDBDE #x6832) + (#xDBDF #x684E) + (#xDBE0 #x68B3) + (#xDBE1 #x682B) + (#xDBE2 #x6859) + (#xDBE3 #x6863) + (#xDBE4 #x6877) + (#xDBE5 #x687F) + (#xDBE6 #x689F) + (#xDBE7 #x688F) + (#xDBE8 #x68AD) + (#xDBE9 #x6894) + (#xDBEA #x689D) + (#xDBEB #x689B) + (#xDBEC #x6883) + (#xDBED #x6AAE) + (#xDBEE #x68B9) + (#xDBEF #x6874) + (#xDBF0 #x68B5) + (#xDBF1 #x68A0) + (#xDBF2 #x68BA) + (#xDBF3 #x690F) + (#xDBF4 #x688D) + (#xDBF5 #x687E) + (#xDBF6 #x6901) + (#xDBF7 #x68CA) + (#xDBF8 #x6908) + (#xDBF9 #x68D8) + (#xDBFA #x6922) + (#xDBFB #x6926) + (#xDBFC #x68E1) + (#xDBFD #x690C) + (#xDBFE #x68CD) + (#xDCA1 #x68D4) + (#xDCA2 #x68E7) + (#xDCA3 #x68D5) + (#xDCA4 #x6936) + (#xDCA5 #x6912) + (#xDCA6 #x6904) + (#xDCA7 #x68D7) + (#xDCA8 #x68E3) + (#xDCA9 #x6925) + (#xDCAA #x68F9) + (#xDCAB #x68E0) + (#xDCAC #x68EF) + (#xDCAD #x6928) + (#xDCAE #x692A) + (#xDCAF #x691A) + (#xDCB0 #x6923) + (#xDCB1 #x6921) + (#xDCB2 #x68C6) + (#xDCB3 #x6979) + (#xDCB4 #x6977) + (#xDCB5 #x695C) + (#xDCB6 #x6978) + (#xDCB7 #x696B) + (#xDCB8 #x6954) + (#xDCB9 #x697E) + (#xDCBA #x696E) + (#xDCBB #x6939) + (#xDCBC #x6974) + (#xDCBD #x693D) + (#xDCBE #x6959) + (#xDCBF #x6930) + (#xDCC0 #x6961) + (#xDCC1 #x695E) + (#xDCC2 #x695D) + (#xDCC3 #x6981) + (#xDCC4 #x696A) + (#xDCC5 #x69B2) + (#xDCC6 #x69AE) + (#xDCC7 #x69D0) + (#xDCC8 #x69BF) + (#xDCC9 #x69C1) + (#xDCCA #x69D3) + (#xDCCB #x69BE) + (#xDCCC #x69CE) + (#xDCCD #x5BE8) + (#xDCCE #x69CA) + (#xDCCF #x69DD) + (#xDCD0 #x69BB) + (#xDCD1 #x69C3) + (#xDCD2 #x69A7) + (#xDCD3 #x6A2E) + (#xDCD4 #x6991) + (#xDCD5 #x69A0) + (#xDCD6 #x699C) + (#xDCD7 #x6995) + (#xDCD8 #x69B4) + (#xDCD9 #x69DE) + (#xDCDA #x69E8) + (#xDCDB #x6A02) + (#xDCDC #x6A1B) + (#xDCDD #x69FF) + (#xDCDE #x6B0A) + (#xDCDF #x69F9) + (#xDCE0 #x69F2) + (#xDCE1 #x69E7) + (#xDCE2 #x6A05) + (#xDCE3 #x69B1) + (#xDCE4 #x6A1E) + (#xDCE5 #x69ED) + (#xDCE6 #x6A14) + (#xDCE7 #x69EB) + (#xDCE8 #x6A0A) + (#xDCE9 #x6A12) + (#xDCEA #x6AC1) + (#xDCEB #x6A23) + (#xDCEC #x6A13) + (#xDCED #x6A44) + (#xDCEE #x6A0C) + (#xDCEF #x6A72) + (#xDCF0 #x6A36) + (#xDCF1 #x6A78) + (#xDCF2 #x6A47) + (#xDCF3 #x6A62) + (#xDCF4 #x6A59) + (#xDCF5 #x6A66) + (#xDCF6 #x6A48) + (#xDCF7 #x6A38) + (#xDCF8 #x6A22) + (#xDCF9 #x6A90) + (#xDCFA #x6A8D) + (#xDCFB #x6AA0) + (#xDCFC #x6A84) + (#xDCFD #x6AA2) + (#xDCFE #x6AA3) + (#xDDA1 #x6A97) + (#xDDA2 #x8617) + (#xDDA3 #x6ABB) + (#xDDA4 #x6AC3) + (#xDDA5 #x6AC2) + (#xDDA6 #x6AB8) + (#xDDA7 #x6AB3) + (#xDDA8 #x6AAC) + (#xDDA9 #x6ADE) + (#xDDAA #x6AD1) + (#xDDAB #x6ADF) + (#xDDAC #x6AAA) + (#xDDAD #x6ADA) + (#xDDAE #x6AEA) + (#xDDAF #x6AFB) + (#xDDB0 #x6B05) + (#xDDB1 #x8616) + (#xDDB2 #x6AFA) + (#xDDB3 #x6B12) + (#xDDB4 #x6B16) + (#xDDB5 #x9B31) + (#xDDB6 #x6B1F) + (#xDDB7 #x6B38) + (#xDDB8 #x6B37) + (#xDDB9 #x76DC) + (#xDDBA #x6B39) + (#xDDBB #x98EE) + (#xDDBC #x6B47) + (#xDDBD #x6B43) + (#xDDBE #x6B49) + (#xDDBF #x6B50) + (#xDDC0 #x6B59) + (#xDDC1 #x6B54) + (#xDDC2 #x6B5B) + (#xDDC3 #x6B5F) + (#xDDC4 #x6B61) + (#xDDC5 #x6B78) + (#xDDC6 #x6B79) + (#xDDC7 #x6B7F) + (#xDDC8 #x6B80) + (#xDDC9 #x6B84) + (#xDDCA #x6B83) + (#xDDCB #x6B8D) + (#xDDCC #x6B98) + (#xDDCD #x6B95) + (#xDDCE #x6B9E) + (#xDDCF #x6BA4) + (#xDDD0 #x6BAA) + (#xDDD1 #x6BAB) + (#xDDD2 #x6BAF) + (#xDDD3 #x6BB2) + (#xDDD4 #x6BB1) + (#xDDD5 #x6BB3) + (#xDDD6 #x6BB7) + (#xDDD7 #x6BBC) + (#xDDD8 #x6BC6) + (#xDDD9 #x6BCB) + (#xDDDA #x6BD3) + (#xDDDB #x6BDF) + (#xDDDC #x6BEC) + (#xDDDD #x6BEB) + (#xDDDE #x6BF3) + (#xDDDF #x6BEF) + (#xDDE0 #x9EBE) + (#xDDE1 #x6C08) + (#xDDE2 #x6C13) + (#xDDE3 #x6C14) + (#xDDE4 #x6C1B) + (#xDDE5 #x6C24) + (#xDDE6 #x6C23) + (#xDDE7 #x6C5E) + (#xDDE8 #x6C55) + (#xDDE9 #x6C62) + (#xDDEA #x6C6A) + (#xDDEB #x6C82) + (#xDDEC #x6C8D) + (#xDDED #x6C9A) + (#xDDEE #x6C81) + (#xDDEF #x6C9B) + (#xDDF0 #x6C7E) + (#xDDF1 #x6C68) + (#xDDF2 #x6C73) + (#xDDF3 #x6C92) + (#xDDF4 #x6C90) + (#xDDF5 #x6CC4) + (#xDDF6 #x6CF1) + (#xDDF7 #x6CD3) + (#xDDF8 #x6CBD) + (#xDDF9 #x6CD7) + (#xDDFA #x6CC5) + (#xDDFB #x6CDD) + (#xDDFC #x6CAE) + (#xDDFD #x6CB1) + (#xDDFE #x6CBE) + (#xDEA1 #x6CBA) + (#xDEA2 #x6CDB) + (#xDEA3 #x6CEF) + (#xDEA4 #x6CD9) + (#xDEA5 #x6CEA) + (#xDEA6 #x6D1F) + (#xDEA7 #x884D) + (#xDEA8 #x6D36) + (#xDEA9 #x6D2B) + (#xDEAA #x6D3D) + (#xDEAB #x6D38) + (#xDEAC #x6D19) + (#xDEAD #x6D35) + (#xDEAE #x6D33) + (#xDEAF #x6D12) + (#xDEB0 #x6D0C) + (#xDEB1 #x6D63) + (#xDEB2 #x6D93) + (#xDEB3 #x6D64) + (#xDEB4 #x6D5A) + (#xDEB5 #x6D79) + (#xDEB6 #x6D59) + (#xDEB7 #x6D8E) + (#xDEB8 #x6D95) + (#xDEB9 #x6FE4) + (#xDEBA #x6D85) + (#xDEBB #x6DF9) + (#xDEBC #x6E15) + (#xDEBD #x6E0A) + (#xDEBE #x6DB5) + (#xDEBF #x6DC7) + (#xDEC0 #x6DE6) + (#xDEC1 #x6DB8) + (#xDEC2 #x6DC6) + (#xDEC3 #x6DEC) + (#xDEC4 #x6DDE) + (#xDEC5 #x6DCC) + (#xDEC6 #x6DE8) + (#xDEC7 #x6DD2) + (#xDEC8 #x6DC5) + (#xDEC9 #x6DFA) + (#xDECA #x6DD9) + (#xDECB #x6DE4) + (#xDECC #x6DD5) + (#xDECD #x6DEA) + (#xDECE #x6DEE) + (#xDECF #x6E2D) + (#xDED0 #x6E6E) + (#xDED1 #x6E2E) + (#xDED2 #x6E19) + (#xDED3 #x6E72) + (#xDED4 #x6E5F) + (#xDED5 #x6E3E) + (#xDED6 #x6E23) + (#xDED7 #x6E6B) + (#xDED8 #x6E2B) + (#xDED9 #x6E76) + (#xDEDA #x6E4D) + (#xDEDB #x6E1F) + (#xDEDC #x6E43) + (#xDEDD #x6E3A) + (#xDEDE #x6E4E) + (#xDEDF #x6E24) + (#xDEE0 #x6EFF) + (#xDEE1 #x6E1D) + (#xDEE2 #x6E38) + (#xDEE3 #x6E82) + (#xDEE4 #x6EAA) + (#xDEE5 #x6E98) + (#xDEE6 #x6EC9) + (#xDEE7 #x6EB7) + (#xDEE8 #x6ED3) + (#xDEE9 #x6EBD) + (#xDEEA #x6EAF) + (#xDEEB #x6EC4) + (#xDEEC #x6EB2) + (#xDEED #x6ED4) + (#xDEEE #x6ED5) + (#xDEEF #x6E8F) + (#xDEF0 #x6EA5) + (#xDEF1 #x6EC2) + (#xDEF2 #x6E9F) + (#xDEF3 #x6F41) + (#xDEF4 #x6F11) + (#xDEF5 #x704C) + (#xDEF6 #x6EEC) + (#xDEF7 #x6EF8) + (#xDEF8 #x6EFE) + (#xDEF9 #x6F3F) + (#xDEFA #x6EF2) + (#xDEFB #x6F31) + (#xDEFC #x6EEF) + (#xDEFD #x6F32) + (#xDEFE #x6ECC) + (#xDFA1 #x6F3E) + (#xDFA2 #x6F13) + (#xDFA3 #x6EF7) + (#xDFA4 #x6F86) + (#xDFA5 #x6F7A) + (#xDFA6 #x6F78) + (#xDFA7 #x6F81) + (#xDFA8 #x6F80) + (#xDFA9 #x6F6F) + (#xDFAA #x6F5B) + (#xDFAB #x6FF3) + (#xDFAC #x6F6D) + (#xDFAD #x6F82) + (#xDFAE #x6F7C) + (#xDFAF #x6F58) + (#xDFB0 #x6F8E) + (#xDFB1 #x6F91) + (#xDFB2 #x6FC2) + (#xDFB3 #x6F66) + (#xDFB4 #x6FB3) + (#xDFB5 #x6FA3) + (#xDFB6 #x6FA1) + (#xDFB7 #x6FA4) + (#xDFB8 #x6FB9) + (#xDFB9 #x6FC6) + (#xDFBA #x6FAA) + (#xDFBB #x6FDF) + (#xDFBC #x6FD5) + (#xDFBD #x6FEC) + (#xDFBE #x6FD4) + (#xDFBF #x6FD8) + (#xDFC0 #x6FF1) + (#xDFC1 #x6FEE) + (#xDFC2 #x6FDB) + (#xDFC3 #x7009) + (#xDFC4 #x700B) + (#xDFC5 #x6FFA) + (#xDFC6 #x7011) + (#xDFC7 #x7001) + (#xDFC8 #x700F) + (#xDFC9 #x6FFE) + (#xDFCA #x701B) + (#xDFCB #x701A) + (#xDFCC #x6F74) + (#xDFCD #x701D) + (#xDFCE #x7018) + (#xDFCF #x701F) + (#xDFD0 #x7030) + (#xDFD1 #x703E) + (#xDFD2 #x7032) + (#xDFD3 #x7051) + (#xDFD4 #x7063) + (#xDFD5 #x7099) + (#xDFD6 #x7092) + (#xDFD7 #x70AF) + (#xDFD8 #x70F1) + (#xDFD9 #x70AC) + (#xDFDA #x70B8) + (#xDFDB #x70B3) + (#xDFDC #x70AE) + (#xDFDD #x70DF) + (#xDFDE #x70CB) + (#xDFDF #x70DD) + (#xDFE0 #x70D9) + (#xDFE1 #x7109) + (#xDFE2 #x70FD) + (#xDFE3 #x711C) + (#xDFE4 #x7119) + (#xDFE5 #x7165) + (#xDFE6 #x7155) + (#xDFE7 #x7188) + (#xDFE8 #x7166) + (#xDFE9 #x7162) + (#xDFEA #x714C) + (#xDFEB #x7156) + (#xDFEC #x716C) + (#xDFED #x718F) + (#xDFEE #x71FB) + (#xDFEF #x7184) + (#xDFF0 #x7195) + (#xDFF1 #x71A8) + (#xDFF2 #x71AC) + (#xDFF3 #x71D7) + (#xDFF4 #x71B9) + (#xDFF5 #x71BE) + (#xDFF6 #x71D2) + (#xDFF7 #x71C9) + (#xDFF8 #x71D4) + (#xDFF9 #x71CE) + (#xDFFA #x71E0) + (#xDFFB #x71EC) + (#xDFFC #x71E7) + (#xDFFD #x71F5) + (#xDFFE #x71FC) + (#xE0A1 #x71F9) + (#xE0A2 #x71FF) + (#xE0A3 #x720D) + (#xE0A4 #x7210) + (#xE0A5 #x721B) + (#xE0A6 #x7228) + (#xE0A7 #x722D) + (#xE0A8 #x722C) + (#xE0A9 #x7230) + (#xE0AA #x7232) + (#xE0AB #x723B) + (#xE0AC #x723C) + (#xE0AD #x723F) + (#xE0AE #x7240) + (#xE0AF #x7246) + (#xE0B0 #x724B) + (#xE0B1 #x7258) + (#xE0B2 #x7274) + (#xE0B3 #x727E) + (#xE0B4 #x7282) + (#xE0B5 #x7281) + (#xE0B6 #x7287) + (#xE0B7 #x7292) + (#xE0B8 #x7296) + (#xE0B9 #x72A2) + (#xE0BA #x72A7) + (#xE0BB #x72B9) + (#xE0BC #x72B2) + (#xE0BD #x72C3) + (#xE0BE #x72C6) + (#xE0BF #x72C4) + (#xE0C0 #x72CE) + (#xE0C1 #x72D2) + (#xE0C2 #x72E2) + (#xE0C3 #x72E0) + (#xE0C4 #x72E1) + (#xE0C5 #x72F9) + (#xE0C6 #x72F7) + (#xE0C7 #x500F) + (#xE0C8 #x7317) + (#xE0C9 #x730A) + (#xE0CA #x731C) + (#xE0CB #x7316) + (#xE0CC #x731D) + (#xE0CD #x7334) + (#xE0CE #x732F) + (#xE0CF #x7329) + (#xE0D0 #x7325) + (#xE0D1 #x733E) + (#xE0D2 #x734E) + (#xE0D3 #x734F) + (#xE0D4 #x9ED8) + (#xE0D5 #x7357) + (#xE0D6 #x736A) + (#xE0D7 #x7368) + (#xE0D8 #x7370) + (#xE0D9 #x7378) + (#xE0DA #x7375) + (#xE0DB #x737B) + (#xE0DC #x737A) + (#xE0DD #x73C8) + (#xE0DE #x73B3) + (#xE0DF #x73CE) + (#xE0E0 #x73BB) + (#xE0E1 #x73C0) + (#xE0E2 #x73E5) + (#xE0E3 #x73EE) + (#xE0E4 #x73DE) + (#xE0E5 #x74A2) + (#xE0E6 #x7405) + (#xE0E7 #x746F) + (#xE0E8 #x7425) + (#xE0E9 #x73F8) + (#xE0EA #x7432) + (#xE0EB #x743A) + (#xE0EC #x7455) + (#xE0ED #x743F) + (#xE0EE #x745F) + (#xE0EF #x7459) + (#xE0F0 #x7441) + (#xE0F1 #x745C) + (#xE0F2 #x7469) + (#xE0F3 #x7470) + (#xE0F4 #x7463) + (#xE0F5 #x746A) + (#xE0F6 #x7476) + (#xE0F7 #x747E) + (#xE0F8 #x748B) + (#xE0F9 #x749E) + (#xE0FA #x74A7) + (#xE0FB #x74CA) + (#xE0FC #x74CF) + (#xE0FD #x74D4) + (#xE0FE #x73F1) + (#xE1A1 #x74E0) + (#xE1A2 #x74E3) + (#xE1A3 #x74E7) + (#xE1A4 #x74E9) + (#xE1A5 #x74EE) + (#xE1A6 #x74F2) + (#xE1A7 #x74F0) + (#xE1A8 #x74F1) + (#xE1A9 #x74F8) + (#xE1AA #x74F7) + (#xE1AB #x7504) + (#xE1AC #x7503) + (#xE1AD #x7505) + (#xE1AE #x750C) + (#xE1AF #x750E) + (#xE1B0 #x750D) + (#xE1B1 #x7515) + (#xE1B2 #x7513) + (#xE1B3 #x751E) + (#xE1B4 #x7526) + (#xE1B5 #x752C) + (#xE1B6 #x753C) + (#xE1B7 #x7544) + (#xE1B8 #x754D) + (#xE1B9 #x754A) + (#xE1BA #x7549) + (#xE1BB #x755B) + (#xE1BC #x7546) + (#xE1BD #x755A) + (#xE1BE #x7569) + (#xE1BF #x7564) + (#xE1C0 #x7567) + (#xE1C1 #x756B) + (#xE1C2 #x756D) + (#xE1C3 #x7578) + (#xE1C4 #x7576) + (#xE1C5 #x7586) + (#xE1C6 #x7587) + (#xE1C7 #x7574) + (#xE1C8 #x758A) + (#xE1C9 #x7589) + (#xE1CA #x7582) + (#xE1CB #x7594) + (#xE1CC #x759A) + (#xE1CD #x759D) + (#xE1CE #x75A5) + (#xE1CF #x75A3) + (#xE1D0 #x75C2) + (#xE1D1 #x75B3) + (#xE1D2 #x75C3) + (#xE1D3 #x75B5) + (#xE1D4 #x75BD) + (#xE1D5 #x75B8) + (#xE1D6 #x75BC) + (#xE1D7 #x75B1) + (#xE1D8 #x75CD) + (#xE1D9 #x75CA) + (#xE1DA #x75D2) + (#xE1DB #x75D9) + (#xE1DC #x75E3) + (#xE1DD #x75DE) + (#xE1DE #x75FE) + (#xE1DF #x75FF) + (#xE1E0 #x75FC) + (#xE1E1 #x7601) + (#xE1E2 #x75F0) + (#xE1E3 #x75FA) + (#xE1E4 #x75F2) + (#xE1E5 #x75F3) + (#xE1E6 #x760B) + (#xE1E7 #x760D) + (#xE1E8 #x7609) + (#xE1E9 #x761F) + (#xE1EA #x7627) + (#xE1EB #x7620) + (#xE1EC #x7621) + (#xE1ED #x7622) + (#xE1EE #x7624) + (#xE1EF #x7634) + (#xE1F0 #x7630) + (#xE1F1 #x763B) + (#xE1F2 #x7647) + (#xE1F3 #x7648) + (#xE1F4 #x7646) + (#xE1F5 #x765C) + (#xE1F6 #x7658) + (#xE1F7 #x7661) + (#xE1F8 #x7662) + (#xE1F9 #x7668) + (#xE1FA #x7669) + (#xE1FB #x766A) + (#xE1FC #x7667) + (#xE1FD #x766C) + (#xE1FE #x7670) + (#xE2A1 #x7672) + (#xE2A2 #x7676) + (#xE2A3 #x7678) + (#xE2A4 #x767C) + (#xE2A5 #x7680) + (#xE2A6 #x7683) + (#xE2A7 #x7688) + (#xE2A8 #x768B) + (#xE2A9 #x768E) + (#xE2AA #x7696) + (#xE2AB #x7693) + (#xE2AC #x7699) + (#xE2AD #x769A) + (#xE2AE #x76B0) + (#xE2AF #x76B4) + (#xE2B0 #x76B8) + (#xE2B1 #x76B9) + (#xE2B2 #x76BA) + (#xE2B3 #x76C2) + (#xE2B4 #x76CD) + (#xE2B5 #x76D6) + (#xE2B6 #x76D2) + (#xE2B7 #x76DE) + (#xE2B8 #x76E1) + (#xE2B9 #x76E5) + (#xE2BA #x76E7) + (#xE2BB #x76EA) + (#xE2BC #x862F) + (#xE2BD #x76FB) + (#xE2BE #x7708) + (#xE2BF #x7707) + (#xE2C0 #x7704) + (#xE2C1 #x7729) + (#xE2C2 #x7724) + (#xE2C3 #x771E) + (#xE2C4 #x7725) + (#xE2C5 #x7726) + (#xE2C6 #x771B) + (#xE2C7 #x7737) + (#xE2C8 #x7738) + (#xE2C9 #x7747) + (#xE2CA #x775A) + (#xE2CB #x7768) + (#xE2CC #x776B) + (#xE2CD #x775B) + (#xE2CE #x7765) + (#xE2CF #x777F) + (#xE2D0 #x777E) + (#xE2D1 #x7779) + (#xE2D2 #x778E) + (#xE2D3 #x778B) + (#xE2D4 #x7791) + (#xE2D5 #x77A0) + (#xE2D6 #x779E) + (#xE2D7 #x77B0) + (#xE2D8 #x77B6) + (#xE2D9 #x77B9) + (#xE2DA #x77BF) + (#xE2DB #x77BC) + (#xE2DC #x77BD) + (#xE2DD #x77BB) + (#xE2DE #x77C7) + (#xE2DF #x77CD) + (#xE2E0 #x77D7) + (#xE2E1 #x77DA) + (#xE2E2 #x77DC) + (#xE2E3 #x77E3) + (#xE2E4 #x77EE) + (#xE2E5 #x77FC) + (#xE2E6 #x780C) + (#xE2E7 #x7812) + (#xE2E8 #x7926) + (#xE2E9 #x7820) + (#xE2EA #x792A) + (#xE2EB #x7845) + (#xE2EC #x788E) + (#xE2ED #x7874) + (#xE2EE #x7886) + (#xE2EF #x787C) + (#xE2F0 #x789A) + (#xE2F1 #x788C) + (#xE2F2 #x78A3) + (#xE2F3 #x78B5) + (#xE2F4 #x78AA) + (#xE2F5 #x78AF) + (#xE2F6 #x78D1) + (#xE2F7 #x78C6) + (#xE2F8 #x78CB) + (#xE2F9 #x78D4) + (#xE2FA #x78BE) + (#xE2FB #x78BC) + (#xE2FC #x78C5) + (#xE2FD #x78CA) + (#xE2FE #x78EC) + (#xE3A1 #x78E7) + (#xE3A2 #x78DA) + (#xE3A3 #x78FD) + (#xE3A4 #x78F4) + (#xE3A5 #x7907) + (#xE3A6 #x7912) + (#xE3A7 #x7911) + (#xE3A8 #x7919) + (#xE3A9 #x792C) + (#xE3AA #x792B) + (#xE3AB #x7940) + (#xE3AC #x7960) + (#xE3AD #x7957) + (#xE3AE #x795F) + (#xE3AF #x795A) + (#xE3B0 #x7955) + (#xE3B1 #x7953) + (#xE3B2 #x797A) + (#xE3B3 #x797F) + (#xE3B4 #x798A) + (#xE3B5 #x799D) + (#xE3B6 #x79A7) + (#xE3B7 #x9F4B) + (#xE3B8 #x79AA) + (#xE3B9 #x79AE) + (#xE3BA #x79B3) + (#xE3BB #x79B9) + (#xE3BC #x79BA) + (#xE3BD #x79C9) + (#xE3BE #x79D5) + (#xE3BF #x79E7) + (#xE3C0 #x79EC) + (#xE3C1 #x79E1) + (#xE3C2 #x79E3) + (#xE3C3 #x7A08) + (#xE3C4 #x7A0D) + (#xE3C5 #x7A18) + (#xE3C6 #x7A19) + (#xE3C7 #x7A20) + (#xE3C8 #x7A1F) + (#xE3C9 #x7980) + (#xE3CA #x7A31) + (#xE3CB #x7A3B) + (#xE3CC #x7A3E) + (#xE3CD #x7A37) + (#xE3CE #x7A43) + (#xE3CF #x7A57) + (#xE3D0 #x7A49) + (#xE3D1 #x7A61) + (#xE3D2 #x7A62) + (#xE3D3 #x7A69) + (#xE3D4 #x9F9D) + (#xE3D5 #x7A70) + (#xE3D6 #x7A79) + (#xE3D7 #x7A7D) + (#xE3D8 #x7A88) + (#xE3D9 #x7A97) + (#xE3DA #x7A95) + (#xE3DB #x7A98) + (#xE3DC #x7A96) + (#xE3DD #x7AA9) + (#xE3DE #x7AC8) + (#xE3DF #x7AB0) + (#xE3E0 #x7AB6) + (#xE3E1 #x7AC5) + (#xE3E2 #x7AC4) + (#xE3E3 #x7ABF) + (#xE3E4 #x9083) + (#xE3E5 #x7AC7) + (#xE3E6 #x7ACA) + (#xE3E7 #x7ACD) + (#xE3E8 #x7ACF) + (#xE3E9 #x7AD5) + (#xE3EA #x7AD3) + (#xE3EB #x7AD9) + (#xE3EC #x7ADA) + (#xE3ED #x7ADD) + (#xE3EE #x7AE1) + (#xE3EF #x7AE2) + (#xE3F0 #x7AE6) + (#xE3F1 #x7AED) + (#xE3F2 #x7AF0) + (#xE3F3 #x7B02) + (#xE3F4 #x7B0F) + (#xE3F5 #x7B0A) + (#xE3F6 #x7B06) + (#xE3F7 #x7B33) + (#xE3F8 #x7B18) + (#xE3F9 #x7B19) + (#xE3FA #x7B1E) + (#xE3FB #x7B35) + (#xE3FC #x7B28) + (#xE3FD #x7B36) + (#xE3FE #x7B50) + (#xE4A1 #x7B7A) + (#xE4A2 #x7B04) + (#xE4A3 #x7B4D) + (#xE4A4 #x7B0B) + (#xE4A5 #x7B4C) + (#xE4A6 #x7B45) + (#xE4A7 #x7B75) + (#xE4A8 #x7B65) + (#xE4A9 #x7B74) + (#xE4AA #x7B67) + (#xE4AB #x7B70) + (#xE4AC #x7B71) + (#xE4AD #x7B6C) + (#xE4AE #x7B6E) + (#xE4AF #x7B9D) + (#xE4B0 #x7B98) + (#xE4B1 #x7B9F) + (#xE4B2 #x7B8D) + (#xE4B3 #x7B9C) + (#xE4B4 #x7B9A) + (#xE4B5 #x7B8B) + (#xE4B6 #x7B92) + (#xE4B7 #x7B8F) + (#xE4B8 #x7B5D) + (#xE4B9 #x7B99) + (#xE4BA #x7BCB) + (#xE4BB #x7BC1) + (#xE4BC #x7BCC) + (#xE4BD #x7BCF) + (#xE4BE #x7BB4) + (#xE4BF #x7BC6) + (#xE4C0 #x7BDD) + (#xE4C1 #x7BE9) + (#xE4C2 #x7C11) + (#xE4C3 #x7C14) + (#xE4C4 #x7BE6) + (#xE4C5 #x7BE5) + (#xE4C6 #x7C60) + (#xE4C7 #x7C00) + (#xE4C8 #x7C07) + (#xE4C9 #x7C13) + (#xE4CA #x7BF3) + (#xE4CB #x7BF7) + (#xE4CC #x7C17) + (#xE4CD #x7C0D) + (#xE4CE #x7BF6) + (#xE4CF #x7C23) + (#xE4D0 #x7C27) + (#xE4D1 #x7C2A) + (#xE4D2 #x7C1F) + (#xE4D3 #x7C37) + (#xE4D4 #x7C2B) + (#xE4D5 #x7C3D) + (#xE4D6 #x7C4C) + (#xE4D7 #x7C43) + (#xE4D8 #x7C54) + (#xE4D9 #x7C4F) + (#xE4DA #x7C40) + (#xE4DB #x7C50) + (#xE4DC #x7C58) + (#xE4DD #x7C5F) + (#xE4DE #x7C64) + (#xE4DF #x7C56) + (#xE4E0 #x7C65) + (#xE4E1 #x7C6C) + (#xE4E2 #x7C75) + (#xE4E3 #x7C83) + (#xE4E4 #x7C90) + (#xE4E5 #x7CA4) + (#xE4E6 #x7CAD) + (#xE4E7 #x7CA2) + (#xE4E8 #x7CAB) + (#xE4E9 #x7CA1) + (#xE4EA #x7CA8) + (#xE4EB #x7CB3) + (#xE4EC #x7CB2) + (#xE4ED #x7CB1) + (#xE4EE #x7CAE) + (#xE4EF #x7CB9) + (#xE4F0 #x7CBD) + (#xE4F1 #x7CC0) + (#xE4F2 #x7CC5) + (#xE4F3 #x7CC2) + (#xE4F4 #x7CD8) + (#xE4F5 #x7CD2) + (#xE4F6 #x7CDC) + (#xE4F7 #x7CE2) + (#xE4F8 #x9B3B) + (#xE4F9 #x7CEF) + (#xE4FA #x7CF2) + (#xE4FB #x7CF4) + (#xE4FC #x7CF6) + (#xE4FD #x7CFA) + (#xE4FE #x7D06) + (#xE5A1 #x7D02) + (#xE5A2 #x7D1C) + (#xE5A3 #x7D15) + (#xE5A4 #x7D0A) + (#xE5A5 #x7D45) + (#xE5A6 #x7D4B) + (#xE5A7 #x7D2E) + (#xE5A8 #x7D32) + (#xE5A9 #x7D3F) + (#xE5AA #x7D35) + (#xE5AB #x7D46) + (#xE5AC #x7D73) + (#xE5AD #x7D56) + (#xE5AE #x7D4E) + (#xE5AF #x7D72) + (#xE5B0 #x7D68) + (#xE5B1 #x7D6E) + (#xE5B2 #x7D4F) + (#xE5B3 #x7D63) + (#xE5B4 #x7D93) + (#xE5B5 #x7D89) + (#xE5B6 #x7D5B) + (#xE5B7 #x7D8F) + (#xE5B8 #x7D7D) + (#xE5B9 #x7D9B) + (#xE5BA #x7DBA) + (#xE5BB #x7DAE) + (#xE5BC #x7DA3) + (#xE5BD #x7DB5) + (#xE5BE #x7DC7) + (#xE5BF #x7DBD) + (#xE5C0 #x7DAB) + (#xE5C1 #x7E3D) + (#xE5C2 #x7DA2) + (#xE5C3 #x7DAF) + (#xE5C4 #x7DDC) + (#xE5C5 #x7DB8) + (#xE5C6 #x7D9F) + (#xE5C7 #x7DB0) + (#xE5C8 #x7DD8) + (#xE5C9 #x7DDD) + (#xE5CA #x7DE4) + (#xE5CB #x7DDE) + (#xE5CC #x7DFB) + (#xE5CD #x7DF2) + (#xE5CE #x7DE1) + (#xE5CF #x7E05) + (#xE5D0 #x7E0A) + (#xE5D1 #x7E23) + (#xE5D2 #x7E21) + (#xE5D3 #x7E12) + (#xE5D4 #x7E31) + (#xE5D5 #x7E1F) + (#xE5D6 #x7E09) + (#xE5D7 #x7E0B) + (#xE5D8 #x7E22) + (#xE5D9 #x7E46) + (#xE5DA #x7E66) + (#xE5DB #x7E3B) + (#xE5DC #x7E35) + (#xE5DD #x7E39) + (#xE5DE #x7E43) + (#xE5DF #x7E37) + (#xE5E0 #x7E32) + (#xE5E1 #x7E3A) + (#xE5E2 #x7E67) + (#xE5E3 #x7E5D) + (#xE5E4 #x7E56) + (#xE5E5 #x7E5E) + (#xE5E6 #x7E59) + (#xE5E7 #x7E5A) + (#xE5E8 #x7E79) + (#xE5E9 #x7E6A) + (#xE5EA #x7E69) + (#xE5EB #x7E7C) + (#xE5EC #x7E7B) + (#xE5ED #x7E83) + (#xE5EE #x7DD5) + (#xE5EF #x7E7D) + (#xE5F0 #x8FAE) + (#xE5F1 #x7E7F) + (#xE5F2 #x7E88) + (#xE5F3 #x7E89) + (#xE5F4 #x7E8C) + (#xE5F5 #x7E92) + (#xE5F6 #x7E90) + (#xE5F7 #x7E93) + (#xE5F8 #x7E94) + (#xE5F9 #x7E96) + (#xE5FA #x7E8E) + (#xE5FB #x7E9B) + (#xE5FC #x7E9C) + (#xE5FD #x7F38) + (#xE5FE #x7F3A) + (#xE6A1 #x7F45) + (#xE6A2 #x7F4C) + (#xE6A3 #x7F4D) + (#xE6A4 #x7F4E) + (#xE6A5 #x7F50) + (#xE6A6 #x7F51) + (#xE6A7 #x7F55) + (#xE6A8 #x7F54) + (#xE6A9 #x7F58) + (#xE6AA #x7F5F) + (#xE6AB #x7F60) + (#xE6AC #x7F68) + (#xE6AD #x7F69) + (#xE6AE #x7F67) + (#xE6AF #x7F78) + (#xE6B0 #x7F82) + (#xE6B1 #x7F86) + (#xE6B2 #x7F83) + (#xE6B3 #x7F88) + (#xE6B4 #x7F87) + (#xE6B5 #x7F8C) + (#xE6B6 #x7F94) + (#xE6B7 #x7F9E) + (#xE6B8 #x7F9D) + (#xE6B9 #x7F9A) + (#xE6BA #x7FA3) + (#xE6BB #x7FAF) + (#xE6BC #x7FB2) + (#xE6BD #x7FB9) + (#xE6BE #x7FAE) + (#xE6BF #x7FB6) + (#xE6C0 #x7FB8) + (#xE6C1 #x8B71) + (#xE6C2 #x7FC5) + (#xE6C3 #x7FC6) + (#xE6C4 #x7FCA) + (#xE6C5 #x7FD5) + (#xE6C6 #x7FD4) + (#xE6C7 #x7FE1) + (#xE6C8 #x7FE6) + (#xE6C9 #x7FE9) + (#xE6CA #x7FF3) + (#xE6CB #x7FF9) + (#xE6CC #x98DC) + (#xE6CD #x8006) + (#xE6CE #x8004) + (#xE6CF #x800B) + (#xE6D0 #x8012) + (#xE6D1 #x8018) + (#xE6D2 #x8019) + (#xE6D3 #x801C) + (#xE6D4 #x8021) + (#xE6D5 #x8028) + (#xE6D6 #x803F) + (#xE6D7 #x803B) + (#xE6D8 #x804A) + (#xE6D9 #x8046) + (#xE6DA #x8052) + (#xE6DB #x8058) + (#xE6DC #x805A) + (#xE6DD #x805F) + (#xE6DE #x8062) + (#xE6DF #x8068) + (#xE6E0 #x8073) + (#xE6E1 #x8072) + (#xE6E2 #x8070) + (#xE6E3 #x8076) + (#xE6E4 #x8079) + (#xE6E5 #x807D) + (#xE6E6 #x807F) + (#xE6E7 #x8084) + (#xE6E8 #x8086) + (#xE6E9 #x8085) + (#xE6EA #x809B) + (#xE6EB #x8093) + (#xE6EC #x809A) + (#xE6ED #x80AD) + (#xE6EE #x5190) + (#xE6EF #x80AC) + (#xE6F0 #x80DB) + (#xE6F1 #x80E5) + (#xE6F2 #x80D9) + (#xE6F3 #x80DD) + (#xE6F4 #x80C4) + (#xE6F5 #x80DA) + (#xE6F6 #x80D6) + (#xE6F7 #x8109) + (#xE6F8 #x80EF) + (#xE6F9 #x80F1) + (#xE6FA #x811B) + (#xE6FB #x8129) + (#xE6FC #x8123) + (#xE6FD #x812F) + (#xE6FE #x814B) + (#xE7A1 #x968B) + (#xE7A2 #x8146) + (#xE7A3 #x813E) + (#xE7A4 #x8153) + (#xE7A5 #x8151) + (#xE7A6 #x80FC) + (#xE7A7 #x8171) + (#xE7A8 #x816E) + (#xE7A9 #x8165) + (#xE7AA #x8166) + (#xE7AB #x8174) + (#xE7AC #x8183) + (#xE7AD #x8188) + (#xE7AE #x818A) + (#xE7AF #x8180) + (#xE7B0 #x8182) + (#xE7B1 #x81A0) + (#xE7B2 #x8195) + (#xE7B3 #x81A4) + (#xE7B4 #x81A3) + (#xE7B5 #x815F) + (#xE7B6 #x8193) + (#xE7B7 #x81A9) + (#xE7B8 #x81B0) + (#xE7B9 #x81B5) + (#xE7BA #x81BE) + (#xE7BB #x81B8) + (#xE7BC #x81BD) + (#xE7BD #x81C0) + (#xE7BE #x81C2) + (#xE7BF #x81BA) + (#xE7C0 #x81C9) + (#xE7C1 #x81CD) + (#xE7C2 #x81D1) + (#xE7C3 #x81D9) + (#xE7C4 #x81D8) + (#xE7C5 #x81C8) + (#xE7C6 #x81DA) + (#xE7C7 #x81DF) + (#xE7C8 #x81E0) + (#xE7C9 #x81E7) + (#xE7CA #x81FA) + (#xE7CB #x81FB) + (#xE7CC #x81FE) + (#xE7CD #x8201) + (#xE7CE #x8202) + (#xE7CF #x8205) + (#xE7D0 #x8207) + (#xE7D1 #x820A) + (#xE7D2 #x820D) + (#xE7D3 #x8210) + (#xE7D4 #x8216) + (#xE7D5 #x8229) + (#xE7D6 #x822B) + (#xE7D7 #x8238) + (#xE7D8 #x8233) + (#xE7D9 #x8240) + (#xE7DA #x8259) + (#xE7DB #x8258) + (#xE7DC #x825D) + (#xE7DD #x825A) + (#xE7DE #x825F) + (#xE7DF #x8264) + (#xE7E0 #x8262) + (#xE7E1 #x8268) + (#xE7E2 #x826A) + (#xE7E3 #x826B) + (#xE7E4 #x822E) + (#xE7E5 #x8271) + (#xE7E6 #x8277) + (#xE7E7 #x8278) + (#xE7E8 #x827E) + (#xE7E9 #x828D) + (#xE7EA #x8292) + (#xE7EB #x82AB) + (#xE7EC #x829F) + (#xE7ED #x82BB) + (#xE7EE #x82AC) + (#xE7EF #x82E1) + (#xE7F0 #x82E3) + (#xE7F1 #x82DF) + (#xE7F2 #x82D2) + (#xE7F3 #x82F4) + (#xE7F4 #x82F3) + (#xE7F5 #x82FA) + (#xE7F6 #x8393) + (#xE7F7 #x8303) + (#xE7F8 #x82FB) + (#xE7F9 #x82F9) + (#xE7FA #x82DE) + (#xE7FB #x8306) + (#xE7FC #x82DC) + (#xE7FD #x8309) + (#xE7FE #x82D9) + (#xE8A1 #x8335) + (#xE8A2 #x8334) + (#xE8A3 #x8316) + (#xE8A4 #x8332) + (#xE8A5 #x8331) + (#xE8A6 #x8340) + (#xE8A7 #x8339) + (#xE8A8 #x8350) + (#xE8A9 #x8345) + (#xE8AA #x832F) + (#xE8AB #x832B) + (#xE8AC #x8317) + (#xE8AD #x8318) + (#xE8AE #x8385) + (#xE8AF #x839A) + (#xE8B0 #x83AA) + (#xE8B1 #x839F) + (#xE8B2 #x83A2) + (#xE8B3 #x8396) + (#xE8B4 #x8323) + (#xE8B5 #x838E) + (#xE8B6 #x8387) + (#xE8B7 #x838A) + (#xE8B8 #x837C) + (#xE8B9 #x83B5) + (#xE8BA #x8373) + (#xE8BB #x8375) + (#xE8BC #x83A0) + (#xE8BD #x8389) + (#xE8BE #x83A8) + (#xE8BF #x83F4) + (#xE8C0 #x8413) + (#xE8C1 #x83EB) + (#xE8C2 #x83CE) + (#xE8C3 #x83FD) + (#xE8C4 #x8403) + (#xE8C5 #x83D8) + (#xE8C6 #x840B) + (#xE8C7 #x83C1) + (#xE8C8 #x83F7) + (#xE8C9 #x8407) + (#xE8CA #x83E0) + (#xE8CB #x83F2) + (#xE8CC #x840D) + (#xE8CD #x8422) + (#xE8CE #x8420) + (#xE8CF #x83BD) + (#xE8D0 #x8438) + (#xE8D1 #x8506) + (#xE8D2 #x83FB) + (#xE8D3 #x846D) + (#xE8D4 #x842A) + (#xE8D5 #x843C) + (#xE8D6 #x855A) + (#xE8D7 #x8484) + (#xE8D8 #x8477) + (#xE8D9 #x846B) + (#xE8DA #x84AD) + (#xE8DB #x846E) + (#xE8DC #x8482) + (#xE8DD #x8469) + (#xE8DE #x8446) + (#xE8DF #x842C) + (#xE8E0 #x846F) + (#xE8E1 #x8479) + (#xE8E2 #x8435) + (#xE8E3 #x84CA) + (#xE8E4 #x8462) + (#xE8E5 #x84B9) + (#xE8E6 #x84BF) + (#xE8E7 #x849F) + (#xE8E8 #x84D9) + (#xE8E9 #x84CD) + (#xE8EA #x84BB) + (#xE8EB #x84DA) + (#xE8EC #x84D0) + (#xE8ED #x84C1) + (#xE8EE #x84C6) + (#xE8EF #x84D6) + (#xE8F0 #x84A1) + (#xE8F1 #x8521) + (#xE8F2 #x84FF) + (#xE8F3 #x84F4) + (#xE8F4 #x8517) + (#xE8F5 #x8518) + (#xE8F6 #x852C) + (#xE8F7 #x851F) + (#xE8F8 #x8515) + (#xE8F9 #x8514) + (#xE8FA #x84FC) + (#xE8FB #x8540) + (#xE8FC #x8563) + (#xE8FD #x8558) + (#xE8FE #x8548) + (#xE9A1 #x8541) + (#xE9A2 #x8602) + (#xE9A3 #x854B) + (#xE9A4 #x8555) + (#xE9A5 #x8580) + (#xE9A6 #x85A4) + (#xE9A7 #x8588) + (#xE9A8 #x8591) + (#xE9A9 #x858A) + (#xE9AA #x85A8) + (#xE9AB #x856D) + (#xE9AC #x8594) + (#xE9AD #x859B) + (#xE9AE #x85EA) + (#xE9AF #x8587) + (#xE9B0 #x859C) + (#xE9B1 #x8577) + (#xE9B2 #x857E) + (#xE9B3 #x8590) + (#xE9B4 #x85C9) + (#xE9B5 #x85BA) + (#xE9B6 #x85CF) + (#xE9B7 #x85B9) + (#xE9B8 #x85D0) + (#xE9B9 #x85D5) + (#xE9BA #x85DD) + (#xE9BB #x85E5) + (#xE9BC #x85DC) + (#xE9BD #x85F9) + (#xE9BE #x860A) + (#xE9BF #x8613) + (#xE9C0 #x860B) + (#xE9C1 #x85FE) + (#xE9C2 #x85FA) + (#xE9C3 #x8606) + (#xE9C4 #x8622) + (#xE9C5 #x861A) + (#xE9C6 #x8630) + (#xE9C7 #x863F) + (#xE9C8 #x864D) + (#xE9C9 #x4E55) + (#xE9CA #x8654) + (#xE9CB #x865F) + (#xE9CC #x8667) + (#xE9CD #x8671) + (#xE9CE #x8693) + (#xE9CF #x86A3) + (#xE9D0 #x86A9) + (#xE9D1 #x86AA) + (#xE9D2 #x868B) + (#xE9D3 #x868C) + (#xE9D4 #x86B6) + (#xE9D5 #x86AF) + (#xE9D6 #x86C4) + (#xE9D7 #x86C6) + (#xE9D8 #x86B0) + (#xE9D9 #x86C9) + (#xE9DA #x8823) + (#xE9DB #x86AB) + (#xE9DC #x86D4) + (#xE9DD #x86DE) + (#xE9DE #x86E9) + (#xE9DF #x86EC) + (#xE9E0 #x86DF) + (#xE9E1 #x86DB) + (#xE9E2 #x86EF) + (#xE9E3 #x8712) + (#xE9E4 #x8706) + (#xE9E5 #x8708) + (#xE9E6 #x8700) + (#xE9E7 #x8703) + (#xE9E8 #x86FB) + (#xE9E9 #x8711) + (#xE9EA #x8709) + (#xE9EB #x870D) + (#xE9EC #x86F9) + (#xE9ED #x870A) + (#xE9EE #x8734) + (#xE9EF #x873F) + (#xE9F0 #x8737) + (#xE9F1 #x873B) + (#xE9F2 #x8725) + (#xE9F3 #x8729) + (#xE9F4 #x871A) + (#xE9F5 #x8760) + (#xE9F6 #x875F) + (#xE9F7 #x8778) + (#xE9F8 #x874C) + (#xE9F9 #x874E) + (#xE9FA #x8774) + (#xE9FB #x8757) + (#xE9FC #x8768) + (#xE9FD #x876E) + (#xE9FE #x8759) + (#xEAA1 #x8753) + (#xEAA2 #x8763) + (#xEAA3 #x876A) + (#xEAA4 #x8805) + (#xEAA5 #x87A2) + (#xEAA6 #x879F) + (#xEAA7 #x8782) + (#xEAA8 #x87AF) + (#xEAA9 #x87CB) + (#xEAAA #x87BD) + (#xEAAB #x87C0) + (#xEAAC #x87D0) + (#xEAAD #x96D6) + (#xEAAE #x87AB) + (#xEAAF #x87C4) + (#xEAB0 #x87B3) + (#xEAB1 #x87C7) + (#xEAB2 #x87C6) + (#xEAB3 #x87BB) + (#xEAB4 #x87EF) + (#xEAB5 #x87F2) + (#xEAB6 #x87E0) + (#xEAB7 #x880F) + (#xEAB8 #x880D) + (#xEAB9 #x87FE) + (#xEABA #x87F6) + (#xEABB #x87F7) + (#xEABC #x880E) + (#xEABD #x87D2) + (#xEABE #x8811) + (#xEABF #x8816) + (#xEAC0 #x8815) + (#xEAC1 #x8822) + (#xEAC2 #x8821) + (#xEAC3 #x8831) + (#xEAC4 #x8836) + (#xEAC5 #x8839) + (#xEAC6 #x8827) + (#xEAC7 #x883B) + (#xEAC8 #x8844) + (#xEAC9 #x8842) + (#xEACA #x8852) + (#xEACB #x8859) + (#xEACC #x885E) + (#xEACD #x8862) + (#xEACE #x886B) + (#xEACF #x8881) + (#xEAD0 #x887E) + (#xEAD1 #x889E) + (#xEAD2 #x8875) + (#xEAD3 #x887D) + (#xEAD4 #x88B5) + (#xEAD5 #x8872) + (#xEAD6 #x8882) + (#xEAD7 #x8897) + (#xEAD8 #x8892) + (#xEAD9 #x88AE) + (#xEADA #x8899) + (#xEADB #x88A2) + (#xEADC #x888D) + (#xEADD #x88A4) + (#xEADE #x88B0) + (#xEADF #x88BF) + (#xEAE0 #x88B1) + (#xEAE1 #x88C3) + (#xEAE2 #x88C4) + (#xEAE3 #x88D4) + (#xEAE4 #x88D8) + (#xEAE5 #x88D9) + (#xEAE6 #x88DD) + (#xEAE7 #x88F9) + (#xEAE8 #x8902) + (#xEAE9 #x88FC) + (#xEAEA #x88F4) + (#xEAEB #x88E8) + (#xEAEC #x88F2) + (#xEAED #x8904) + (#xEAEE #x890C) + (#xEAEF #x890A) + (#xEAF0 #x8913) + (#xEAF1 #x8943) + (#xEAF2 #x891E) + (#xEAF3 #x8925) + (#xEAF4 #x892A) + (#xEAF5 #x892B) + (#xEAF6 #x8941) + (#xEAF7 #x8944) + (#xEAF8 #x893B) + (#xEAF9 #x8936) + (#xEAFA #x8938) + (#xEAFB #x894C) + (#xEAFC #x891D) + (#xEAFD #x8960) + (#xEAFE #x895E) + (#xEBA1 #x8966) + (#xEBA2 #x8964) + (#xEBA3 #x896D) + (#xEBA4 #x896A) + (#xEBA5 #x896F) + (#xEBA6 #x8974) + (#xEBA7 #x8977) + (#xEBA8 #x897E) + (#xEBA9 #x8983) + (#xEBAA #x8988) + (#xEBAB #x898A) + (#xEBAC #x8993) + (#xEBAD #x8998) + (#xEBAE #x89A1) + (#xEBAF #x89A9) + (#xEBB0 #x89A6) + (#xEBB1 #x89AC) + (#xEBB2 #x89AF) + (#xEBB3 #x89B2) + (#xEBB4 #x89BA) + (#xEBB5 #x89BD) + (#xEBB6 #x89BF) + (#xEBB7 #x89C0) + (#xEBB8 #x89DA) + (#xEBB9 #x89DC) + (#xEBBA #x89DD) + (#xEBBB #x89E7) + (#xEBBC #x89F4) + (#xEBBD #x89F8) + (#xEBBE #x8A03) + (#xEBBF #x8A16) + (#xEBC0 #x8A10) + (#xEBC1 #x8A0C) + (#xEBC2 #x8A1B) + (#xEBC3 #x8A1D) + (#xEBC4 #x8A25) + (#xEBC5 #x8A36) + (#xEBC6 #x8A41) + (#xEBC7 #x8A5B) + (#xEBC8 #x8A52) + (#xEBC9 #x8A46) + (#xEBCA #x8A48) + (#xEBCB #x8A7C) + (#xEBCC #x8A6D) + (#xEBCD #x8A6C) + (#xEBCE #x8A62) + (#xEBCF #x8A85) + (#xEBD0 #x8A82) + (#xEBD1 #x8A84) + (#xEBD2 #x8AA8) + (#xEBD3 #x8AA1) + (#xEBD4 #x8A91) + (#xEBD5 #x8AA5) + (#xEBD6 #x8AA6) + (#xEBD7 #x8A9A) + (#xEBD8 #x8AA3) + (#xEBD9 #x8AC4) + (#xEBDA #x8ACD) + (#xEBDB #x8AC2) + (#xEBDC #x8ADA) + (#xEBDD #x8AEB) + (#xEBDE #x8AF3) + (#xEBDF #x8AE7) + (#xEBE0 #x8AE4) + (#xEBE1 #x8AF1) + (#xEBE2 #x8B14) + (#xEBE3 #x8AE0) + (#xEBE4 #x8AE2) + (#xEBE5 #x8AF7) + (#xEBE6 #x8ADE) + (#xEBE7 #x8ADB) + (#xEBE8 #x8B0C) + (#xEBE9 #x8B07) + (#xEBEA #x8B1A) + (#xEBEB #x8AE1) + (#xEBEC #x8B16) + (#xEBED #x8B10) + (#xEBEE #x8B17) + (#xEBEF #x8B20) + (#xEBF0 #x8B33) + (#xEBF1 #x97AB) + (#xEBF2 #x8B26) + (#xEBF3 #x8B2B) + (#xEBF4 #x8B3E) + (#xEBF5 #x8B28) + (#xEBF6 #x8B41) + (#xEBF7 #x8B4C) + (#xEBF8 #x8B4F) + (#xEBF9 #x8B4E) + (#xEBFA #x8B49) + (#xEBFB #x8B56) + (#xEBFC #x8B5B) + (#xEBFD #x8B5A) + (#xEBFE #x8B6B) + (#xECA1 #x8B5F) + (#xECA2 #x8B6C) + (#xECA3 #x8B6F) + (#xECA4 #x8B74) + (#xECA5 #x8B7D) + (#xECA6 #x8B80) + (#xECA7 #x8B8C) + (#xECA8 #x8B8E) + (#xECA9 #x8B92) + (#xECAA #x8B93) + (#xECAB #x8B96) + (#xECAC #x8B99) + (#xECAD #x8B9A) + (#xECAE #x8C3A) + (#xECAF #x8C41) + (#xECB0 #x8C3F) + (#xECB1 #x8C48) + (#xECB2 #x8C4C) + (#xECB3 #x8C4E) + (#xECB4 #x8C50) + (#xECB5 #x8C55) + (#xECB6 #x8C62) + (#xECB7 #x8C6C) + (#xECB8 #x8C78) + (#xECB9 #x8C7A) + (#xECBA #x8C82) + (#xECBB #x8C89) + (#xECBC #x8C85) + (#xECBD #x8C8A) + (#xECBE #x8C8D) + (#xECBF #x8C8E) + (#xECC0 #x8C94) + (#xECC1 #x8C7C) + (#xECC2 #x8C98) + (#xECC3 #x621D) + (#xECC4 #x8CAD) + (#xECC5 #x8CAA) + (#xECC6 #x8CBD) + (#xECC7 #x8CB2) + (#xECC8 #x8CB3) + (#xECC9 #x8CAE) + (#xECCA #x8CB6) + (#xECCB #x8CC8) + (#xECCC #x8CC1) + (#xECCD #x8CE4) + (#xECCE #x8CE3) + (#xECCF #x8CDA) + (#xECD0 #x8CFD) + (#xECD1 #x8CFA) + (#xECD2 #x8CFB) + (#xECD3 #x8D04) + (#xECD4 #x8D05) + (#xECD5 #x8D0A) + (#xECD6 #x8D07) + (#xECD7 #x8D0F) + (#xECD8 #x8D0D) + (#xECD9 #x8D10) + (#xECDA #x9F4E) + (#xECDB #x8D13) + (#xECDC #x8CCD) + (#xECDD #x8D14) + (#xECDE #x8D16) + (#xECDF #x8D67) + (#xECE0 #x8D6D) + (#xECE1 #x8D71) + (#xECE2 #x8D73) + (#xECE3 #x8D81) + (#xECE4 #x8D99) + (#xECE5 #x8DC2) + (#xECE6 #x8DBE) + (#xECE7 #x8DBA) + (#xECE8 #x8DCF) + (#xECE9 #x8DDA) + (#xECEA #x8DD6) + (#xECEB #x8DCC) + (#xECEC #x8DDB) + (#xECED #x8DCB) + (#xECEE #x8DEA) + (#xECEF #x8DEB) + (#xECF0 #x8DDF) + (#xECF1 #x8DE3) + (#xECF2 #x8DFC) + (#xECF3 #x8E08) + (#xECF4 #x8E09) + (#xECF5 #x8DFF) + (#xECF6 #x8E1D) + (#xECF7 #x8E1E) + (#xECF8 #x8E10) + (#xECF9 #x8E1F) + (#xECFA #x8E42) + (#xECFB #x8E35) + (#xECFC #x8E30) + (#xECFD #x8E34) + (#xECFE #x8E4A) + (#xEDA1 #x8E47) + (#xEDA2 #x8E49) + (#xEDA3 #x8E4C) + (#xEDA4 #x8E50) + (#xEDA5 #x8E48) + (#xEDA6 #x8E59) + (#xEDA7 #x8E64) + (#xEDA8 #x8E60) + (#xEDA9 #x8E2A) + (#xEDAA #x8E63) + (#xEDAB #x8E55) + (#xEDAC #x8E76) + (#xEDAD #x8E72) + (#xEDAE #x8E7C) + (#xEDAF #x8E81) + (#xEDB0 #x8E87) + (#xEDB1 #x8E85) + (#xEDB2 #x8E84) + (#xEDB3 #x8E8B) + (#xEDB4 #x8E8A) + (#xEDB5 #x8E93) + (#xEDB6 #x8E91) + (#xEDB7 #x8E94) + (#xEDB8 #x8E99) + (#xEDB9 #x8EAA) + (#xEDBA #x8EA1) + (#xEDBB #x8EAC) + (#xEDBC #x8EB0) + (#xEDBD #x8EC6) + (#xEDBE #x8EB1) + (#xEDBF #x8EBE) + (#xEDC0 #x8EC5) + (#xEDC1 #x8EC8) + (#xEDC2 #x8ECB) + (#xEDC3 #x8EDB) + (#xEDC4 #x8EE3) + (#xEDC5 #x8EFC) + (#xEDC6 #x8EFB) + (#xEDC7 #x8EEB) + (#xEDC8 #x8EFE) + (#xEDC9 #x8F0A) + (#xEDCA #x8F05) + (#xEDCB #x8F15) + (#xEDCC #x8F12) + (#xEDCD #x8F19) + (#xEDCE #x8F13) + (#xEDCF #x8F1C) + (#xEDD0 #x8F1F) + (#xEDD1 #x8F1B) + (#xEDD2 #x8F0C) + (#xEDD3 #x8F26) + (#xEDD4 #x8F33) + (#xEDD5 #x8F3B) + (#xEDD6 #x8F39) + (#xEDD7 #x8F45) + (#xEDD8 #x8F42) + (#xEDD9 #x8F3E) + (#xEDDA #x8F4C) + (#xEDDB #x8F49) + (#xEDDC #x8F46) + (#xEDDD #x8F4E) + (#xEDDE #x8F57) + (#xEDDF #x8F5C) + (#xEDE0 #x8F62) + (#xEDE1 #x8F63) + (#xEDE2 #x8F64) + (#xEDE3 #x8F9C) + (#xEDE4 #x8F9F) + (#xEDE5 #x8FA3) + (#xEDE6 #x8FAD) + (#xEDE7 #x8FAF) + (#xEDE8 #x8FB7) + (#xEDE9 #x8FDA) + (#xEDEA #x8FE5) + (#xEDEB #x8FE2) + (#xEDEC #x8FEA) + (#xEDED #x8FEF) + (#xEDEE #x9087) + (#xEDEF #x8FF4) + (#xEDF0 #x9005) + (#xEDF1 #x8FF9) + (#xEDF2 #x8FFA) + (#xEDF3 #x9011) + (#xEDF4 #x9015) + (#xEDF5 #x9021) + (#xEDF6 #x900D) + (#xEDF7 #x901E) + (#xEDF8 #x9016) + (#xEDF9 #x900B) + (#xEDFA #x9027) + (#xEDFB #x9036) + (#xEDFC #x9035) + (#xEDFD #x9039) + (#xEDFE #x8FF8) + (#xEEA1 #x904F) + (#xEEA2 #x9050) + (#xEEA3 #x9051) + (#xEEA4 #x9052) + (#xEEA5 #x900E) + (#xEEA6 #x9049) + (#xEEA7 #x903E) + (#xEEA8 #x9056) + (#xEEA9 #x9058) + (#xEEAA #x905E) + (#xEEAB #x9068) + (#xEEAC #x906F) + (#xEEAD #x9076) + (#xEEAE #x96A8) + (#xEEAF #x9072) + (#xEEB0 #x9082) + (#xEEB1 #x907D) + (#xEEB2 #x9081) + (#xEEB3 #x9080) + (#xEEB4 #x908A) + (#xEEB5 #x9089) + (#xEEB6 #x908F) + (#xEEB7 #x90A8) + (#xEEB8 #x90AF) + (#xEEB9 #x90B1) + (#xEEBA #x90B5) + (#xEEBB #x90E2) + (#xEEBC #x90E4) + (#xEEBD #x6248) + (#xEEBE #x90DB) + (#xEEBF #x9102) + (#xEEC0 #x9112) + (#xEEC1 #x9119) + (#xEEC2 #x9132) + (#xEEC3 #x9130) + (#xEEC4 #x914A) + (#xEEC5 #x9156) + (#xEEC6 #x9158) + (#xEEC7 #x9163) + (#xEEC8 #x9165) + (#xEEC9 #x9169) + (#xEECA #x9173) + (#xEECB #x9172) + (#xEECC #x918B) + (#xEECD #x9189) + (#xEECE #x9182) + (#xEECF #x91A2) + (#xEED0 #x91AB) + (#xEED1 #x91AF) + (#xEED2 #x91AA) + (#xEED3 #x91B5) + (#xEED4 #x91B4) + (#xEED5 #x91BA) + (#xEED6 #x91C0) + (#xEED7 #x91C1) + (#xEED8 #x91C9) + (#xEED9 #x91CB) + (#xEEDA #x91D0) + (#xEEDB #x91D6) + (#xEEDC #x91DF) + (#xEEDD #x91E1) + (#xEEDE #x91DB) + (#xEEDF #x91FC) + (#xEEE0 #x91F5) + (#xEEE1 #x91F6) + (#xEEE2 #x921E) + (#xEEE3 #x91FF) + (#xEEE4 #x9214) + (#xEEE5 #x922C) + (#xEEE6 #x9215) + (#xEEE7 #x9211) + (#xEEE8 #x925E) + (#xEEE9 #x9257) + (#xEEEA #x9245) + (#xEEEB #x9249) + (#xEEEC #x9264) + (#xEEED #x9248) + (#xEEEE #x9295) + (#xEEEF #x923F) + (#xEEF0 #x924B) + (#xEEF1 #x9250) + (#xEEF2 #x929C) + (#xEEF3 #x9296) + (#xEEF4 #x9293) + (#xEEF5 #x929B) + (#xEEF6 #x925A) + (#xEEF7 #x92CF) + (#xEEF8 #x92B9) + (#xEEF9 #x92B7) + (#xEEFA #x92E9) + (#xEEFB #x930F) + (#xEEFC #x92FA) + (#xEEFD #x9344) + (#xEEFE #x932E) + (#xEFA1 #x9319) + (#xEFA2 #x9322) + (#xEFA3 #x931A) + (#xEFA4 #x9323) + (#xEFA5 #x933A) + (#xEFA6 #x9335) + (#xEFA7 #x933B) + (#xEFA8 #x935C) + (#xEFA9 #x9360) + (#xEFAA #x937C) + (#xEFAB #x936E) + (#xEFAC #x9356) + (#xEFAD #x93B0) + (#xEFAE #x93AC) + (#xEFAF #x93AD) + (#xEFB0 #x9394) + (#xEFB1 #x93B9) + (#xEFB2 #x93D6) + (#xEFB3 #x93D7) + (#xEFB4 #x93E8) + (#xEFB5 #x93E5) + (#xEFB6 #x93D8) + (#xEFB7 #x93C3) + (#xEFB8 #x93DD) + (#xEFB9 #x93D0) + (#xEFBA #x93C8) + (#xEFBB #x93E4) + (#xEFBC #x941A) + (#xEFBD #x9414) + (#xEFBE #x9413) + (#xEFBF #x9403) + (#xEFC0 #x9407) + (#xEFC1 #x9410) + (#xEFC2 #x9436) + (#xEFC3 #x942B) + (#xEFC4 #x9435) + (#xEFC5 #x9421) + (#xEFC6 #x943A) + (#xEFC7 #x9441) + (#xEFC8 #x9452) + (#xEFC9 #x9444) + (#xEFCA #x945B) + (#xEFCB #x9460) + (#xEFCC #x9462) + (#xEFCD #x945E) + (#xEFCE #x946A) + (#xEFCF #x9229) + (#xEFD0 #x9470) + (#xEFD1 #x9475) + (#xEFD2 #x9477) + (#xEFD3 #x947D) + (#xEFD4 #x945A) + (#xEFD5 #x947C) + (#xEFD6 #x947E) + (#xEFD7 #x9481) + (#xEFD8 #x947F) + (#xEFD9 #x9582) + (#xEFDA #x9587) + (#xEFDB #x958A) + (#xEFDC #x9594) + (#xEFDD #x9596) + (#xEFDE #x9598) + (#xEFDF #x9599) + (#xEFE0 #x95A0) + (#xEFE1 #x95A8) + (#xEFE2 #x95A7) + (#xEFE3 #x95AD) + (#xEFE4 #x95BC) + (#xEFE5 #x95BB) + (#xEFE6 #x95B9) + (#xEFE7 #x95BE) + (#xEFE8 #x95CA) + (#xEFE9 #x6FF6) + (#xEFEA #x95C3) + (#xEFEB #x95CD) + (#xEFEC #x95CC) + (#xEFED #x95D5) + (#xEFEE #x95D4) + (#xEFEF #x95D6) + (#xEFF0 #x95DC) + (#xEFF1 #x95E1) + (#xEFF2 #x95E5) + (#xEFF3 #x95E2) + (#xEFF4 #x9621) + (#xEFF5 #x9628) + (#xEFF6 #x962E) + (#xEFF7 #x962F) + (#xEFF8 #x9642) + (#xEFF9 #x964C) + (#xEFFA #x964F) + (#xEFFB #x964B) + (#xEFFC #x9677) + (#xEFFD #x965C) + (#xEFFE #x965E) + (#xF0A1 #x965D) + (#xF0A2 #x965F) + (#xF0A3 #x9666) + (#xF0A4 #x9672) + (#xF0A5 #x966C) + (#xF0A6 #x968D) + (#xF0A7 #x9698) + (#xF0A8 #x9695) + (#xF0A9 #x9697) + (#xF0AA #x96AA) + (#xF0AB #x96A7) + (#xF0AC #x96B1) + (#xF0AD #x96B2) + (#xF0AE #x96B0) + (#xF0AF #x96B4) + (#xF0B0 #x96B6) + (#xF0B1 #x96B8) + (#xF0B2 #x96B9) + (#xF0B3 #x96CE) + (#xF0B4 #x96CB) + (#xF0B5 #x96C9) + (#xF0B6 #x96CD) + (#xF0B7 #x894D) + (#xF0B8 #x96DC) + (#xF0B9 #x970D) + (#xF0BA #x96D5) + (#xF0BB #x96F9) + (#xF0BC #x9704) + (#xF0BD #x9706) + (#xF0BE #x9708) + (#xF0BF #x9713) + (#xF0C0 #x970E) + (#xF0C1 #x9711) + (#xF0C2 #x970F) + (#xF0C3 #x9716) + (#xF0C4 #x9719) + (#xF0C5 #x9724) + (#xF0C6 #x972A) + (#xF0C7 #x9730) + (#xF0C8 #x9739) + (#xF0C9 #x973D) + (#xF0CA #x973E) + (#xF0CB #x9744) + (#xF0CC #x9746) + (#xF0CD #x9748) + (#xF0CE #x9742) + (#xF0CF #x9749) + (#xF0D0 #x975C) + (#xF0D1 #x9760) + (#xF0D2 #x9764) + (#xF0D3 #x9766) + (#xF0D4 #x9768) + (#xF0D5 #x52D2) + (#xF0D6 #x976B) + (#xF0D7 #x9771) + (#xF0D8 #x9779) + (#xF0D9 #x9785) + (#xF0DA #x977C) + (#xF0DB #x9781) + (#xF0DC #x977A) + (#xF0DD #x9786) + (#xF0DE #x978B) + (#xF0DF #x978F) + (#xF0E0 #x9790) + (#xF0E1 #x979C) + (#xF0E2 #x97A8) + (#xF0E3 #x97A6) + (#xF0E4 #x97A3) + (#xF0E5 #x97B3) + (#xF0E6 #x97B4) + (#xF0E7 #x97C3) + (#xF0E8 #x97C6) + (#xF0E9 #x97C8) + (#xF0EA #x97CB) + (#xF0EB #x97DC) + (#xF0EC #x97ED) + (#xF0ED #x9F4F) + (#xF0EE #x97F2) + (#xF0EF #x7ADF) + (#xF0F0 #x97F6) + (#xF0F1 #x97F5) + (#xF0F2 #x980F) + (#xF0F3 #x980C) + (#xF0F4 #x9838) + (#xF0F5 #x9824) + (#xF0F6 #x9821) + (#xF0F7 #x9837) + (#xF0F8 #x983D) + (#xF0F9 #x9846) + (#xF0FA #x984F) + (#xF0FB #x984B) + (#xF0FC #x986B) + (#xF0FD #x986F) + (#xF0FE #x9870) + (#xF1A1 #x9871) + (#xF1A2 #x9874) + (#xF1A3 #x9873) + (#xF1A4 #x98AA) + (#xF1A5 #x98AF) + (#xF1A6 #x98B1) + (#xF1A7 #x98B6) + (#xF1A8 #x98C4) + (#xF1A9 #x98C3) + (#xF1AA #x98C6) + (#xF1AB #x98E9) + (#xF1AC #x98EB) + (#xF1AD #x9903) + (#xF1AE #x9909) + (#xF1AF #x9912) + (#xF1B0 #x9914) + (#xF1B1 #x9918) + (#xF1B2 #x9921) + (#xF1B3 #x991D) + (#xF1B4 #x991E) + (#xF1B5 #x9924) + (#xF1B6 #x9920) + (#xF1B7 #x992C) + (#xF1B8 #x992E) + (#xF1B9 #x993D) + (#xF1BA #x993E) + (#xF1BB #x9942) + (#xF1BC #x9949) + (#xF1BD #x9945) + (#xF1BE #x9950) + (#xF1BF #x994B) + (#xF1C0 #x9951) + (#xF1C1 #x9952) + (#xF1C2 #x994C) + (#xF1C3 #x9955) + (#xF1C4 #x9997) + (#xF1C5 #x9998) + (#xF1C6 #x99A5) + (#xF1C7 #x99AD) + (#xF1C8 #x99AE) + (#xF1C9 #x99BC) + (#xF1CA #x99DF) + (#xF1CB #x99DB) + (#xF1CC #x99DD) + (#xF1CD #x99D8) + (#xF1CE #x99D1) + (#xF1CF #x99ED) + (#xF1D0 #x99EE) + (#xF1D1 #x99F1) + (#xF1D2 #x99F2) + (#xF1D3 #x99FB) + (#xF1D4 #x99F8) + (#xF1D5 #x9A01) + (#xF1D6 #x9A0F) + (#xF1D7 #x9A05) + (#xF1D8 #x99E2) + (#xF1D9 #x9A19) + (#xF1DA #x9A2B) + (#xF1DB #x9A37) + (#xF1DC #x9A45) + (#xF1DD #x9A42) + (#xF1DE #x9A40) + (#xF1DF #x9A43) + (#xF1E0 #x9A3E) + (#xF1E1 #x9A55) + (#xF1E2 #x9A4D) + (#xF1E3 #x9A5B) + (#xF1E4 #x9A57) + (#xF1E5 #x9A5F) + (#xF1E6 #x9A62) + (#xF1E7 #x9A65) + (#xF1E8 #x9A64) + (#xF1E9 #x9A69) + (#xF1EA #x9A6B) + (#xF1EB #x9A6A) + (#xF1EC #x9AAD) + (#xF1ED #x9AB0) + (#xF1EE #x9ABC) + (#xF1EF #x9AC0) + (#xF1F0 #x9ACF) + (#xF1F1 #x9AD1) + (#xF1F2 #x9AD3) + (#xF1F3 #x9AD4) + (#xF1F4 #x9ADE) + (#xF1F5 #x9ADF) + (#xF1F6 #x9AE2) + (#xF1F7 #x9AE3) + (#xF1F8 #x9AE6) + (#xF1F9 #x9AEF) + (#xF1FA #x9AEB) + (#xF1FB #x9AEE) + (#xF1FC #x9AF4) + (#xF1FD #x9AF1) + (#xF1FE #x9AF7) + (#xF2A1 #x9AFB) + (#xF2A2 #x9B06) + (#xF2A3 #x9B18) + (#xF2A4 #x9B1A) + (#xF2A5 #x9B1F) + (#xF2A6 #x9B22) + (#xF2A7 #x9B23) + (#xF2A8 #x9B25) + (#xF2A9 #x9B27) + (#xF2AA #x9B28) + (#xF2AB #x9B29) + (#xF2AC #x9B2A) + (#xF2AD #x9B2E) + (#xF2AE #x9B2F) + (#xF2AF #x9B32) + (#xF2B0 #x9B44) + (#xF2B1 #x9B43) + (#xF2B2 #x9B4F) + (#xF2B3 #x9B4D) + (#xF2B4 #x9B4E) + (#xF2B5 #x9B51) + (#xF2B6 #x9B58) + (#xF2B7 #x9B74) + (#xF2B8 #x9B93) + (#xF2B9 #x9B83) + (#xF2BA #x9B91) + (#xF2BB #x9B96) + (#xF2BC #x9B97) + (#xF2BD #x9B9F) + (#xF2BE #x9BA0) + (#xF2BF #x9BA8) + (#xF2C0 #x9BB4) + (#xF2C1 #x9BC0) + (#xF2C2 #x9BCA) + (#xF2C3 #x9BB9) + (#xF2C4 #x9BC6) + (#xF2C5 #x9BCF) + (#xF2C6 #x9BD1) + (#xF2C7 #x9BD2) + (#xF2C8 #x9BE3) + (#xF2C9 #x9BE2) + (#xF2CA #x9BE4) + (#xF2CB #x9BD4) + (#xF2CC #x9BE1) + (#xF2CD #x9C3A) + (#xF2CE #x9BF2) + (#xF2CF #x9BF1) + (#xF2D0 #x9BF0) + (#xF2D1 #x9C15) + (#xF2D2 #x9C14) + (#xF2D3 #x9C09) + (#xF2D4 #x9C13) + (#xF2D5 #x9C0C) + (#xF2D6 #x9C06) + (#xF2D7 #x9C08) + (#xF2D8 #x9C12) + (#xF2D9 #x9C0A) + (#xF2DA #x9C04) + (#xF2DB #x9C2E) + (#xF2DC #x9C1B) + (#xF2DD #x9C25) + (#xF2DE #x9C24) + (#xF2DF #x9C21) + (#xF2E0 #x9C30) + (#xF2E1 #x9C47) + (#xF2E2 #x9C32) + (#xF2E3 #x9C46) + (#xF2E4 #x9C3E) + (#xF2E5 #x9C5A) + (#xF2E6 #x9C60) + (#xF2E7 #x9C67) + (#xF2E8 #x9C76) + (#xF2E9 #x9C78) + (#xF2EA #x9CE7) + (#xF2EB #x9CEC) + (#xF2EC #x9CF0) + (#xF2ED #x9D09) + (#xF2EE #x9D08) + (#xF2EF #x9CEB) + (#xF2F0 #x9D03) + (#xF2F1 #x9D06) + (#xF2F2 #x9D2A) + (#xF2F3 #x9D26) + (#xF2F4 #x9DAF) + (#xF2F5 #x9D23) + (#xF2F6 #x9D1F) + (#xF2F7 #x9D44) + (#xF2F8 #x9D15) + (#xF2F9 #x9D12) + (#xF2FA #x9D41) + (#xF2FB #x9D3F) + (#xF2FC #x9D3E) + (#xF2FD #x9D46) + (#xF2FE #x9D48) + (#xF3A1 #x9D5D) + (#xF3A2 #x9D5E) + (#xF3A3 #x9D64) + (#xF3A4 #x9D51) + (#xF3A5 #x9D50) + (#xF3A6 #x9D59) + (#xF3A7 #x9D72) + (#xF3A8 #x9D89) + (#xF3A9 #x9D87) + (#xF3AA #x9DAB) + (#xF3AB #x9D6F) + (#xF3AC #x9D7A) + (#xF3AD #x9D9A) + (#xF3AE #x9DA4) + (#xF3AF #x9DA9) + (#xF3B0 #x9DB2) + (#xF3B1 #x9DC4) + (#xF3B2 #x9DC1) + (#xF3B3 #x9DBB) + (#xF3B4 #x9DB8) + (#xF3B5 #x9DBA) + (#xF3B6 #x9DC6) + (#xF3B7 #x9DCF) + (#xF3B8 #x9DC2) + (#xF3B9 #x9DD9) + (#xF3BA #x9DD3) + (#xF3BB #x9DF8) + (#xF3BC #x9DE6) + (#xF3BD #x9DED) + (#xF3BE #x9DEF) + (#xF3BF #x9DFD) + (#xF3C0 #x9E1A) + (#xF3C1 #x9E1B) + (#xF3C2 #x9E1E) + (#xF3C3 #x9E75) + (#xF3C4 #x9E79) + (#xF3C5 #x9E7D) + (#xF3C6 #x9E81) + (#xF3C7 #x9E88) + (#xF3C8 #x9E8B) + (#xF3C9 #x9E8C) + (#xF3CA #x9E92) + (#xF3CB #x9E95) + (#xF3CC #x9E91) + (#xF3CD #x9E9D) + (#xF3CE #x9EA5) + (#xF3CF #x9EA9) + (#xF3D0 #x9EB8) + (#xF3D1 #x9EAA) + (#xF3D2 #x9EAD) + (#xF3D3 #x9761) + (#xF3D4 #x9ECC) + (#xF3D5 #x9ECE) + (#xF3D6 #x9ECF) + (#xF3D7 #x9ED0) + (#xF3D8 #x9ED4) + (#xF3D9 #x9EDC) + (#xF3DA #x9EDE) + (#xF3DB #x9EDD) + (#xF3DC #x9EE0) + (#xF3DD #x9EE5) + (#xF3DE #x9EE8) + (#xF3DF #x9EEF) + (#xF3E0 #x9EF4) + (#xF3E1 #x9EF6) + (#xF3E2 #x9EF7) + (#xF3E3 #x9EF9) + (#xF3E4 #x9EFB) + (#xF3E5 #x9EFC) + (#xF3E6 #x9EFD) + (#xF3E7 #x9F07) + (#xF3E8 #x9F08) + (#xF3E9 #x76B7) + (#xF3EA #x9F15) + (#xF3EB #x9F21) + (#xF3EC #x9F2C) + (#xF3ED #x9F3E) + (#xF3EE #x9F4A) + (#xF3EF #x9F52) + (#xF3F0 #x9F54) + (#xF3F1 #x9F63) + (#xF3F2 #x9F5F) + (#xF3F3 #x9F60) + (#xF3F4 #x9F61) + (#xF3F5 #x9F66) + (#xF3F6 #x9F67) + (#xF3F7 #x9F6C) + (#xF3F8 #x9F6A) + (#xF3F9 #x9F77) + (#xF3FA #x9F72) + (#xF3FB #x9F76) + (#xF3FC #x9F95) + (#xF3FD #x9F9C) + (#xF3FE #x9FA0) + (#xF4A1 #x582F) + (#xF4A2 #x69C7) + (#xF4A3 #x9059) + (#xF4A4 #x7464) + (#xF4A5 #x51DC) + (#xF4A6 #x7199) + )) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/src/packages.lisp b/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/src/packages.lisp new file mode 100644 index 0000000..ace36e8 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/src/packages.lisp @@ -0,0 +1,115 @@ +;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- +;;; +;;; package.lisp --- Package definition for Babel +;;; +;;; Copyright (C) 2007, Luis Oliveira +;;; +;;; Permission is hereby granted, free of charge, to any person +;;; obtaining a copy of this software and associated documentation +;;; files (the "Software"), to deal in the Software without +;;; restriction, including without limitation the rights to use, copy, +;;; modify, merge, publish, distribute, sublicense, and/or sell copies +;;; of the Software, and to permit persons to whom the Software is +;;; furnished to do so, subject to the following conditions: +;;; +;;; The above copyright notice and this permission notice shall be +;;; included in all copies or substantial portions of the Software. +;;; +;;; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +;;; EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +;;; MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +;;; NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +;;; HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +;;; WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +;;; OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +;;; DEALINGS IN THE SOFTWARE. + +(in-package #:cl-user) + +(defpackage #:babel-encodings + (:use #:common-lisp #:alexandria) + (:export + ;; character encoding objects + #:list-character-encodings + #:character-encoding + #:*default-character-encoding* + #:get-character-encoding + #:enc-name + #:enc-aliases + #:enc-code-unit-size + #:enc-max-units-per-char + #:enc-native-endianness + #:enc-decode-literal-code-unit-limit + #:enc-encode-literal-code-unit-limit + #:enc-use-bom + #:enc-bom-encoding + #:enc-nul-encoding + #:enc-default-replacement + #:ambiguous-encoding-p + ;; concrete mappings + #:instantiate-concrete-mappings + #:encoder + #:decoder + #:octet-counter + #:code-point-counter + #:lookup-mapping + #:with-simple-vector + #:with-checked-simple-vector + #:*suppress-character-coding-errors* + ;; errors + #:character-coding-error + #:character-coding-error-encoding ; accessor + #:character-coding-error-buffer ; accessor + #:character-coding-error-position ; accessor + #:character-decoding-error + #:character-decoding-error-octets ; accessor + #:character-encoding-error + #:character-encoding-error-code ; accessor + #:end-of-input-in-character + #:character-out-of-range + #:invalid-utf8-starter-byte + #:invalid-utf8-continuation-byte + #:overlong-utf8-sequence)) + +(defpackage #:babel + (:use #:common-lisp #:babel-encodings #:alexandria) + (:import-from #:babel-encodings) + (:export + ;; types + #:unicode-char + #:unicode-char-code-limit + #:unicode-string + #:simple-unicode-string + ;; fixed sharp-backslash reader + #:enable-sharp-backslash-syntax + #:set-sharp-backslash-syntax-in-readtable + ;; external formats + #:external-format + #:make-external-format + #:ensure-external-format + #:external-format-encoding + #:external-format-eol-style + #:external-format-equal + #:*default-eol-style* + ;; general user API + #:*default-character-encoding* + #:list-character-encodings + #:string-to-octets + #:octets-to-string + #:concatenate-strings-to-octets + #:string-size-in-octets + #:vector-size-in-chars + ;; errors + #:character-coding-error + #:character-coding-error-encoding ; accessor + #:character-coding-error-buffer ; accessor + #:character-coding-error-position ; accessor + #:character-decoding-error + #:character-decoding-error-octets ; accessor + #:character-encoding-error + #:character-encoding-error-code ; accessor + #:end-of-input-in-character + #:character-out-of-range + #:invalid-utf8-starter-byte + #:invalid-utf8-continuation-byte + #:overlong-utf8-sequence)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/src/sharp-backslash.lisp b/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/src/sharp-backslash.lisp new file mode 100644 index 0000000..d4e772e --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/src/sharp-backslash.lisp @@ -0,0 +1,82 @@ +;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- +;;; +;;; sharp-backslash.lisp --- Alternative #\ dispatch code. +;;; +;;; Copyright (C) 2007-2009, Luis Oliveira +;;; +;;; Permission is hereby granted, free of charge, to any person +;;; obtaining a copy of this software and associated documentation +;;; files (the "Software"), to deal in the Software without +;;; restriction, including without limitation the rights to use, copy, +;;; modify, merge, publish, distribute, sublicense, and/or sell copies +;;; of the Software, and to permit persons to whom the Software is +;;; furnished to do so, subject to the following conditions: +;;; +;;; The above copyright notice and this permission notice shall be +;;; included in all copies or substantial portions of the Software. +;;; +;;; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +;;; EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +;;; MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +;;; NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +;;; HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +;;; WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +;;; OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +;;; DEALINGS IN THE SOFTWARE. + +(in-package #:babel) + +#-allegro +(defun sharp-backslash-reader (original-reader stream char numarg) + (let ((1st-char (read-char stream))) + (if (and (char-equal 1st-char #\u) + ;; because #\z is not a digit char... + (digit-char-p (peek-char nil stream nil #\z) 16)) + ;; something better than READ would be nice here + (let ((token (let ((*read-base* 16)) (read stream)))) + (if (typep token 'babel-encodings::code-point) + (code-char token) + (if *read-suppress* + nil + (simple-reader-error + stream "Unrecognized character name: u~A" token)))) + (funcall original-reader + (make-concatenated-stream (make-string-input-stream + (string 1st-char)) + stream) + char + numarg)))) + +;;; Allegro's PEEK-CHAR seems broken in some situations, and the code +;;; above would generate an error about too many calls to UNREAD-CHAR. +;;; Then Allegro's original SHARP-BACKSLASH wants to UNREAD-CHAR +;;; twice, very weird. This is the best workaround I could think of. +;;; It sucks. +#+allegro +(defun sharp-backslash-reader (original-reader stream char numarg) + (let* ((1st-char (read-char stream)) + (rest (ignore-errors (excl::read-extended-token stream))) + (code (when (and rest (char-equal 1st-char #\u)) + (ignore-errors (parse-integer rest :radix 16))))) + (if code + (code-char code) + (with-input-from-string + (s (concatenate 'string "#\\" (string 1st-char) rest)) + (read-char s) + (read-char s) + (funcall original-reader s char numarg))))) + +(defun make-sharp-backslash-reader () + (let ((original-sharp-backslash (get-dispatch-macro-character #\# #\\))) + (lambda (stream char numarg) + (sharp-backslash-reader original-sharp-backslash stream char numarg)))) + +(defmacro enable-sharp-backslash-syntax () + `(eval-when (:compile-toplevel :execute) + (setf *readtable* (copy-readtable *readtable*)) + (set-sharp-backslash-syntax-in-readtable) + (values))) + +(defun set-sharp-backslash-syntax-in-readtable () + (set-dispatch-macro-character #\# #\\ (make-sharp-backslash-reader)) + (values)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/src/streams.lisp b/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/src/streams.lisp new file mode 100644 index 0000000..266d34b --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/src/streams.lisp @@ -0,0 +1,436 @@ +;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- +;;; +;;; streams.lisp --- Conversions between strings and UB8 vectors. +;;; +;;; Copyright (c) 2005-2007, Dr. Edmund Weitz. All rights reserved. +;;; Copyright (c) 2008, Attila Lendvai. All rights reserved. +;;; +;;; Redistribution and use in source and binary forms, with or without +;;; modification, are permitted provided that the following conditions +;;; are met: +;;; +;;; * Redistributions of source code must retain the above copyright +;;; notice, this list of conditions and the following disclaimer. +;;; +;;; * Redistributions in binary form must reproduce the above +;;; copyright notice, this list of conditions and the following +;;; disclaimer in the documentation and/or other materials +;;; provided with the distribution. +;;; +;;; THIS SOFTWARE IS PROVIDED BY THE AUTHOR 'AS IS' AND ANY EXPRESSED +;;; OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +;;; WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +;;; ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY +;;; DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +;;; DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +;;; GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +;;; INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +;;; WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +;;; NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +;;; SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +;;; STATUS +;;; +;;; - in-memory output streams support binary/bivalent/character +;;; element-types and file-position + +;;; TODO +;;; +;;; - filter-stream types/mixins that can wrap a binary stream and +;;; turn it into a bivalent/character stream +;;; - in-memory input streams with file-position similar to in-memory +;;; output streams +;;; - in-memory input/output streams? + +(in-package #:babel) + +(defpackage #:babel-streams + (:use #:common-lisp #:babel #:trivial-gray-streams #:alexandria) + (:export + #:in-memory-stream + #:vector-output-stream + #:vector-input-stream + #:make-in-memory-output-stream + #:make-in-memory-input-stream + #:get-output-stream-sequence + #:with-output-to-sequence + #:with-input-from-sequence)) + +(in-package :babel-streams) + +(declaim (inline check-if-open check-if-accepts-octets + check-if-accepts-characters stream-accepts-characters? + stream-accepts-octets? vector-extend + extend-vector-output-stream-buffer)) + +(defgeneric get-output-stream-sequence (stream &key &allow-other-keys)) + +;;;; Some utilities (on top due to inlining) + +(defun vector-extend (extension vector &key (start 0) (end (length extension))) + ;; copied over from cl-quasi-quote + (declare (optimize speed) + (type vector extension vector) + (type array-index start end)) + (let* ((original-length (length vector)) + (extension-length (- end start)) + (new-length (+ original-length extension-length)) + (original-dimension (array-dimension vector 0))) + (when (< original-dimension new-length) + (setf vector + (adjust-array vector (max (* 2 original-dimension) new-length)))) + (setf (fill-pointer vector) new-length) + (replace vector extension :start1 original-length :start2 start :end2 end) + vector)) + +(defclass in-memory-stream (trivial-gray-stream-mixin) + ((element-type ; :default means bivalent + :initform :default :initarg :element-type :accessor element-type-of) + (external-format + :initform (ensure-external-format *default-character-encoding*) + :initarg :external-format :accessor external-format-of) + #+cmu + (open-p + :initform t :accessor in-memory-stream-open-p + :documentation "For CMUCL we have to keep track of this manually.")) + (:documentation "An IN-MEMORY-STREAM is a binary stream that reads octets + from or writes octets to a sequence in RAM.")) + +(defmethod stream-element-type ((self in-memory-stream)) + ;; stream-element-type is a CL symbol, we may not install an accessor on it. + ;; so, go through this extra step. + (element-type-of self)) + +(defun stream-accepts-octets? (stream) + (let ((element-type (element-type-of stream))) + (or (eq element-type :default) + (equal element-type '(unsigned-byte 8)) + (subtypep element-type '(unsigned-byte 8))))) + +(defun stream-accepts-characters? (stream) + (let ((element-type (element-type-of stream))) + (member element-type '(:default character base-char)))) + +(defclass in-memory-input-stream (in-memory-stream fundamental-binary-input-stream) + () + (:documentation "An IN-MEMORY-INPUT-STREAM is a binary stream that reads + octets from a sequence in RAM.")) + +#+cmu +(defmethod output-stream-p ((stream in-memory-input-stream)) + "Explicitly states whether this is an output stream." + (declare (optimize speed)) + nil) + +(defclass in-memory-output-stream (in-memory-stream + fundamental-binary-output-stream) + () + (:documentation "An IN-MEMORY-OUTPUT-STREAM is a binary stream that + writes octets to a sequence in RAM.")) + +#+cmu +(defmethod input-stream-p ((stream in-memory-output-stream)) + "Explicitly states whether this is an input stream." + (declare (optimize speed)) + nil) + +(defun make-in-memory-output-stream (&key (element-type :default) + external-format + initial-buffer-size) + "Returns a binary output stream which accepts objects of type +ELEMENT-TYPE \(a subtype of OCTET) and makes available a sequence that +contains the octes that were actually output." + (declare (optimize speed)) + (unless external-format + (setf external-format *default-character-encoding*)) + (when (eq element-type :bivalent) + (setf element-type :default)) + (make-instance 'vector-output-stream + :vector (make-vector-stream-buffer + :element-type + (cond + ((or (eq element-type :default) + (equal element-type '(unsigned-byte 8))) + '(unsigned-byte 8)) + ((eq element-type 'character) + 'character) + ((subtypep element-type '(unsigned-byte 8)) + '(unsigned-byte 8)) + (t (error "Illegal element-type ~S" element-type))) + :initial-size initial-buffer-size) + :element-type element-type + :external-format (ensure-external-format external-format))) + +(defun make-in-memory-input-stream (data &key (element-type :default) + external-format) + "Returns a binary input stream which provides the elements of DATA when read." + (declare (optimize speed)) + (unless external-format + (setf external-format *default-character-encoding*)) + (when (eq element-type :bivalent) + (setf element-type :default)) + (make-instance 'vector-input-stream + :vector data + :element-type element-type + :end (length data) + :external-format (ensure-external-format external-format))) + +(defclass vector-stream () + ((vector + :initarg :vector :accessor vector-stream-vector + :documentation "The underlying vector of the stream which \(for output) + must always be adjustable and have a fill pointer.") + (index + :initform 0 :initarg :index :accessor vector-stream-index + :type (integer 0 #.array-dimension-limit) + :documentation "An index into the underlying vector denoting the + current position.")) + (:documentation + "A VECTOR-STREAM is a mixin for IN-MEMORY streams where the underlying + sequence is a vector.")) + +(defclass vector-input-stream (vector-stream in-memory-input-stream) + ((end + :initarg :end :accessor vector-stream-end + :type (integer 0 #.array-dimension-limit) + :documentation "An index into the underlying vector denoting the end + of the available data.")) + (:documentation "A binary input stream that gets its data from an + associated vector of octets.")) + +(defclass vector-output-stream (vector-stream in-memory-output-stream) + () + (:documentation + "A binary output stream that writes its data to an associated vector.")) + +(define-condition in-memory-stream-error (stream-error) + () + (:documentation "Superclass for all errors related to IN-MEMORY streams.")) + +(define-condition in-memory-stream-closed-error (in-memory-stream-error) + () + (:report (lambda (condition stream) + (format stream "~S is closed." + (stream-error-stream condition)))) + (:documentation "An error that is signalled when someone is trying to read + from or write to a closed IN-MEMORY stream.")) + +(define-condition wrong-element-type-stream-error (stream-error) + ((expected-type :accessor expected-type-of :initarg :expected-type)) + (:report (lambda (condition output) + (let ((stream (stream-error-stream condition))) + (format output "The element-type of ~S is ~S while expecting ~ + a stream that accepts ~S." + stream (element-type-of stream) + (expected-type-of condition)))))) + +(defun wrong-element-type-stream-error (stream expected-type) + (error 'wrong-element-type-stream-error + :stream stream :expected-type expected-type)) + +#+cmu +(defmethod open-stream-p ((stream in-memory-stream)) + "Returns a true value if STREAM is open. See ANSI standard." + (declare (optimize speed)) + (in-memory-stream-open-p stream)) + +#+cmu +(defmethod close ((stream in-memory-stream) &key abort) + "Closes the stream STREAM. See ANSI standard." + (declare (ignore abort) (optimize speed)) + (prog1 + (in-memory-stream-open-p stream) + (setf (in-memory-stream-open-p stream) nil))) + +(defun check-if-open (stream) + "Checks if STREAM is open and signals an error otherwise." + (declare (optimize speed)) + (unless (open-stream-p stream) + (error 'in-memory-stream-closed-error :stream stream))) + +(defun check-if-accepts-octets (stream) + (declare (optimize speed)) + (unless (stream-accepts-octets? stream) + (wrong-element-type-stream-error stream '(unsigned-byte 8)))) + +(defun check-if-accepts-characters (stream) + (declare (optimize speed)) + (unless (stream-accepts-characters? stream) + (wrong-element-type-stream-error stream 'character))) + +(defmethod stream-read-byte ((stream vector-input-stream)) + "Reads one byte and increments INDEX pointer unless we're beyond END pointer." + (declare (optimize speed)) + (check-if-open stream) + (let ((index (vector-stream-index stream))) + (cond ((< index (vector-stream-end stream)) + (incf (vector-stream-index stream)) + (aref (vector-stream-vector stream) index)) + (t :eof)))) + +#+#:ignore +(defmethod stream-read-char ((stream vector-input-stream)) + ;; TODO + ) + +(defmethod stream-listen ((stream vector-input-stream)) + "Checking whether INDEX is beyond END." + (declare (optimize speed)) + (check-if-open stream) + (< (vector-stream-index stream) (vector-stream-end stream))) + +(defmethod stream-read-sequence ((stream vector-input-stream) + sequence start end &key) + (declare (optimize speed) (type array-index start end)) + ;; TODO check the sequence type, assert for the element-type and use + ;; the external-format. + (loop with vector-end of-type array-index = (vector-stream-end stream) + with vector = (vector-stream-vector stream) + for index from start below end + for vector-index of-type array-index = (vector-stream-index stream) + while (< vector-index vector-end) + do (setf (elt sequence index) + (aref vector vector-index)) + (incf (vector-stream-index stream)) + finally (return index))) + +(defmethod stream-write-byte ((stream vector-output-stream) byte) + "Writes a byte \(octet) by extending the underlying vector." + (declare (optimize speed)) + (check-if-open stream) + (check-if-accepts-octets stream) + (vector-push-extend byte (vector-stream-vector stream)) + (incf (vector-stream-index stream)) + byte) + +(defun extend-vector-output-stream-buffer (extension stream &key (start 0) + (end (length extension))) + (declare (optimize speed) + (type array-index start end) + (type vector extension)) + (vector-extend extension (vector-stream-vector stream) :start start :end end) + (incf (vector-stream-index stream) (- end start)) + (values)) + +(defmethod stream-write-char ((stream vector-output-stream) char) + (declare (optimize speed)) + (check-if-open stream) + (check-if-accepts-characters stream) + ;; TODO this is naiive here, there's room for optimization + (let ((octets (string-to-octets (string char) + :encoding (external-format-of stream)))) + (extend-vector-output-stream-buffer octets stream)) + char) + +(defmethod stream-write-sequence ((stream vector-output-stream) + sequence start end &key) + "Just calls VECTOR-PUSH-EXTEND repeatedly." + (declare (optimize speed) + (type array-index start end)) + (etypecase sequence + (string + (if (stream-accepts-octets? stream) + ;; TODO this is naiive here, there's room for optimization + (let ((octets (string-to-octets sequence + :encoding (external-format-of stream) + :start start + :end end))) + (extend-vector-output-stream-buffer octets stream)) + (progn + (assert (stream-accepts-characters? stream)) + (extend-vector-output-stream-buffer sequence stream + :start start :end end)))) + ((vector (unsigned-byte 8)) + ;; specialized branch to help inlining + (check-if-accepts-octets stream) + (extend-vector-output-stream-buffer sequence stream :start start :end end)) + (vector + (check-if-accepts-octets stream) + (extend-vector-output-stream-buffer sequence stream :start start :end end))) + sequence) + +(defmethod stream-write-string ((stream vector-output-stream) + string &optional (start 0) (end (length string))) + (stream-write-sequence stream string start (or end (length string)))) + +(defmethod stream-line-column ((stream vector-output-stream)) + "Dummy line-column method that always returns NIL. Needed for +character output streams." + nil) + +(defmethod stream-file-position ((stream vector-stream)) + "Simply returns the index into the underlying vector." + (declare (optimize speed)) + (vector-stream-index stream)) + +(defun make-vector-stream-buffer (&key (element-type '(unsigned-byte 8)) + initial-size) + "Creates and returns an array which can be used as the underlying vector + for a VECTOR-OUTPUT-STREAM." + (declare (optimize speed) + (type (or null array-index) initial-size)) + (make-array (the array-index (or initial-size 32)) + :adjustable t + :fill-pointer 0 + :element-type element-type)) + +(defmethod get-output-stream-sequence ((stream in-memory-output-stream) &key (return-as 'vector)) + "Returns a vector containing, in order, all the octets that have +been output to the IN-MEMORY stream STREAM. This operation clears any +octets on STREAM, so the vector contains only those octets which have +been output since the last call to GET-OUTPUT-STREAM-SEQUENCE or since +the creation of the stream, whichever occurred most recently. If +AS-LIST is true the return value is coerced to a list." + (declare (optimize speed)) + (prog1 + (ecase return-as + (vector (vector-stream-vector stream)) + (string (octets-to-string (vector-stream-vector stream) + :encoding (external-format-of stream))) + (list (coerce (vector-stream-vector stream) 'list))) + (setf (vector-stream-vector stream) (make-vector-stream-buffer)))) + +(defmacro with-output-to-sequence + ((var &key (return-as ''vector) (element-type '':default) + (external-format '*default-character-encoding*) initial-buffer-size) + &body body) + "Creates an IN-MEMORY output stream, binds VAR to this stream and +then executes the code in BODY. The stream stores data of type +ELEMENT-TYPE \(a subtype of OCTET). The stream is automatically closed +on exit from WITH-OUTPUT-TO-SEQUENCE, no matter whether the exit is +normal or abnormal. The return value of this macro is a vector \(or a +list if AS-LIST is true) containing the octets that were sent to the +stream within BODY." + (multiple-value-bind (body declarations) (parse-body body) + ;; this is here to stop SBCL complaining about binding them to NIL + `(let ((,var (make-in-memory-output-stream + :element-type ,element-type + :external-format ,external-format + :initial-buffer-size ,initial-buffer-size))) + ,@declarations + (unwind-protect + (progn + ,@body + (get-output-stream-sequence ,var :return-as ,return-as)) + (close ,var))))) + +(defmacro with-input-from-sequence + ((var data &key (element-type '':default) + (external-format '*default-character-encoding*)) + &body body) + "Creates an IN-MEMORY input stream that will return the values +available in DATA, binds VAR to this stream and then executes the code +in BODY. The stream stores data of type ELEMENT-TYPE \(a subtype of +OCTET). The stream is automatically closed on exit from +WITH-INPUT-FROM-SEQUENCE, no matter whether the exit is normal or +abnormal. The return value of this macro is the return value of BODY." + (multiple-value-bind (body declarations) (parse-body body) + ;; this is here to stop SBCL complaining about binding them to NIL + `(let ((,var (make-in-memory-input-stream + ,data :element-type ,element-type + :external-format ,external-format))) + ,@declarations + (unwind-protect + (progn + ,@body) + (close ,var))))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/src/strings.lisp b/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/src/strings.lisp new file mode 100644 index 0000000..ba02089 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/src/strings.lisp @@ -0,0 +1,353 @@ +;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- +;;; +;;; strings.lisp --- Conversions between strings and UB8 vectors. +;;; +;;; Copyright (C) 2007, Luis Oliveira +;;; +;;; Permission is hereby granted, free of charge, to any person +;;; obtaining a copy of this software and associated documentation +;;; files (the "Software"), to deal in the Software without +;;; restriction, including without limitation the rights to use, copy, +;;; modify, merge, publish, distribute, sublicense, and/or sell copies +;;; of the Software, and to permit persons to whom the Software is +;;; furnished to do so, subject to the following conditions: +;;; +;;; The above copyright notice and this permission notice shall be +;;; included in all copies or substantial portions of the Software. +;;; +;;; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +;;; EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +;;; MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +;;; NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +;;; HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +;;; WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +;;; OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +;;; DEALINGS IN THE SOFTWARE. + +(in-package #:babel) + +;;; The usefulness of this string/octets interface of Babel's is very +;;; limited on Lisps with 8-bit characters which will in effect only +;;; support the latin-1 subset of Unicode. That is, all encodings are +;;; supported but we can only store the first 256 code points in Lisp +;;; strings. Support for using other 8-bit encodings for strings on +;;; these Lisps could be added with an extra encoding/decoding step. +;;; Supporting other encodings with larger code units would be silly +;;; (it would break expectations about common string operations) and +;;; better done with something like Closure's runes. + +;;; Can we handle unicode fully? +(eval-when (:compile-toplevel :load-toplevel :execute) + ;; The EVAL is just here to avoid warnings... + (case (eval char-code-limit) + (#x100 (pushnew '8-bit-chars *features*)) + (#x10000 (pushnew 'ucs-2-chars *features*)) + (#x110000 #| yay |#) + ;; This is here mostly because if the CHAR-CODE-LIMIT is bigger + ;; than #x11000, strange things might happen but we probably + ;; shouldn't descriminate against other, smaller, values. + (t (error "Strange CHAR-CODE-LIMIT (#x~X), bailing out." + char-code-limit)))) + +;;; Adapted from Ironclad. TODO: check if it's worthwhile adding +;;; implementation-specific accessors such as SAP-REF-* for SBCL. +(defmacro ub-get (vector index &optional (bytes 1) (endianness :ne)) + (let ((big-endian (member endianness + '(:be #+big-endian :ne #+little-endian :re)))) + (once-only (vector index) + `(logand + ,(1- (ash 1 (* 8 bytes))) + (logior + ,@(loop for i from 0 below bytes + for offset = (if big-endian i (- bytes i 1)) + for shift = (if big-endian + (* (- bytes i 1) 8) + (* offset 8)) + collect `(ash (aref ,vector (+ ,index ,offset)) ,shift))))))) + +(defmacro ub-set (value vector index &optional (bytes 1) (endianness :ne)) + (let ((big-endian (member endianness + '(:be #+big-endian :ne #+little-endian :re)))) + `(progn + ,@(loop for i from 1 to bytes + for offset = (if big-endian (- bytes i) (1- i)) collect + `(setf (aref ,vector (+ ,index ,offset)) + (ldb (byte 8 ,(* 8 (1- i))) ,value))) + (values)))) + +(defmacro string-get (string index) + `(char-code (schar ,string ,index))) + +(defmacro string-set (code string index) + `(setf (schar ,string ,index) (code-char ,code))) + +;;; SIMPLE-BASE-STRING would also be a subtype of SIMPLE-STRING so we +;;; don't use that because on SBCL BASE-CHARs can only hold ASCII. +;;; Also, with (> SPEED SAFETY) (setf (schar base-str n) big-char) +;;; will quietly work, sort of. +;;; +;;; XXX: test this on various lisps. + +(defconstant unicode-char-code-limit + char-code-limit + "An alias for CL:CHAR-CODE-LIMIT which might be lower than +#x110000 on some Lisps.") + +(deftype unicode-char () + "This character type can hold any characters whose CHAR-CODEs +are less than UNICODE-CHAR-CODE-LIMIT." + #+lispworks 'lw:simple-char + #-lispworks 'character) + +(deftype simple-unicode-string () + "Alias for (SIMPLE-ARRAY UNICODE-CHAR (*))." + '(simple-array unicode-char (*))) + +(deftype unicode-string () + "Alias for (VECTOR UNICODE-CHAR *)." + '(vector unicode-char *)) + +(defparameter *string-vector-mappings* + (instantiate-concrete-mappings + ;; :optimize ((speed 3) (safety 0) (debug 0) (compilation-speed 0)) + :octet-seq-setter ub-set + :octet-seq-getter ub-get + :octet-seq-type (simple-array (unsigned-byte 8) (*)) + :code-point-seq-setter string-set + :code-point-seq-getter string-get + :code-point-seq-type simple-unicode-string)) + +#+sbcl +(defparameter *simple-base-string-vector-mappings* + (instantiate-concrete-mappings + ;; :optimize ((speed 3) (safety 0) (debug 0) (compilation-speed 0)) + :instantiate-decoders nil + :octet-seq-setter ub-set + :octet-seq-getter ub-get + :octet-seq-type (simple-array (unsigned-byte 8) (*)) + :code-point-seq-setter string-set + :code-point-seq-getter string-get + :code-point-seq-type simple-base-string)) + +;;; Do we want a more a specific error condition here? +(defun check-vector-bounds (vector start end) + (unless (<= 0 start end (length vector)) + (error "Invalid start (~A) and end (~A) values for vector of length ~A." + start end (length vector)))) + +(defmacro with-simple-vector (((v vector) (s start) (e end)) &body body) + "If VECTOR is a displaced or adjustable array, binds V to the +underlying simple vector, adds an adequate offset to START and +END and binds those offset values to S and E. Otherwise, if +VECTOR is already a simple array, it's simply bound to V with no +further changes. + +START and END are unchecked and assumed to be within bounds. + +Note that in some Lisps, a slow copying implementation is +necessary to obtain a simple vector thus V will be bound to a +copy of VECTOR coerced to a simple-vector. Therefore, you +shouldn't attempt to modify V." + #+sbcl + `(sb-kernel:with-array-data ((,v ,vector) (,s ,start) (,e ,end)) + ,@body) + #+(or cmu scl) + `(lisp::with-array-data ((,v ,vector) (,s ,start) (,e ,end)) + ,@body) + #+openmcl + (with-unique-names (offset) + `(multiple-value-bind (,v ,offset) + (ccl::array-data-and-offset ,vector) + (let ((,s (+ ,start ,offset)) + (,e (+ ,end ,offset))) + ,@body))) + #+allegro + (with-unique-names (offset) + `(excl::with-underlying-simple-vector (,vector ,v ,offset) + (let ((,e (+ ,end ,offset)) + (,s (+ ,start ,offset))) + ,@body))) + ;; slow, copying implementation + #-(or sbcl cmu scl openmcl allegro) + (once-only (vector) + `(funcall (if (adjustable-array-p ,vector) + #'call-with-array-data/copy + #'call-with-array-data/fast) + ,vector ,start ,end + (lambda (,v ,s ,e) ,@body)))) + +#-(or sbcl cmu scl openmcl allegro) +(progn + ;; Stolen from f2cl. + (defun array-data-and-offset (array) + (loop with offset = 0 do + (multiple-value-bind (displaced-to index-offset) + (array-displacement array) + (when (null displaced-to) + (return-from array-data-and-offset + (values array offset))) + (incf offset index-offset) + (setf array displaced-to)))) + + (defun call-with-array-data/fast (vector start end fn) + (multiple-value-bind (data offset) + (array-data-and-offset vector) + (funcall fn data (+ offset start) (+ offset end)))) + + (defun call-with-array-data/copy (vector start end fn) + (funcall fn (replace (make-array (- end start) :element-type + (array-element-type vector)) + vector :start2 start :end2 end) + 0 (- end start)))) + +(defmacro with-checked-simple-vector (((v vector) (s start) (e end)) &body body) + "Like WITH-SIMPLE-VECTOR but bound-checks START and END." + (once-only (vector start) + `(let ((,e (or ,end (length ,vector)))) + (check-vector-bounds ,vector ,start ,e) + (with-simple-vector ((,v ,vector) (,s ,start) (,e ,e)) + ,@body)))) + +;;; Future features these functions should have: +;;; +;;; * null-terminate +;;; * specify target vector/string + offset +;;; * documentation :) + +(declaim (inline octets-to-string string-to-octets string-size-in-octets + vector-size-in-chars concatenate-strings-to-octets + bom-vector)) + +(defun octets-to-string (vector &key (start 0) end + (errorp (not *suppress-character-coding-errors*)) + (encoding *default-character-encoding*)) + (check-type vector (vector (unsigned-byte 8))) + (with-checked-simple-vector ((vector vector) (start start) (end end)) + (declare (type (simple-array (unsigned-byte 8) (*)) vector)) + (let ((*suppress-character-coding-errors* (not errorp)) + (mapping (lookup-mapping *string-vector-mappings* encoding))) + (multiple-value-bind (size new-end) + (funcall (code-point-counter mapping) vector start end -1) + ;; TODO we could optimize ASCII here: the result should + ;; be a simple-base-string filled using code-char... + (let ((string (make-string size :element-type 'unicode-char))) + (funcall (decoder mapping) vector start new-end string 0) + string))))) + +(defun bom-vector (encoding use-bom) + (check-type use-bom (member :default t nil)) + (the simple-vector + (if (null use-bom) + #() + (let ((enc (typecase encoding + (external-format (external-format-encoding encoding)) + (t (get-character-encoding encoding))))) + (if (or (eq use-bom t) + (and (eq use-bom :default) (enc-use-bom enc))) + ;; VALUES avoids a "type assertion too complex to check" note. + (values (enc-bom-encoding enc)) + #()))))) + +(defun string-to-octets (string &key (encoding *default-character-encoding*) + (start 0) end (use-bom :default) + (errorp (not *suppress-character-coding-errors*))) + (declare (optimize (speed 3) (safety 2))) + (let ((*suppress-character-coding-errors* (not errorp))) + (etypecase string + ;; On some lisps (e.g. clisp and ccl) all strings are BASE-STRING and all + ;; characters are BASE-CHAR. So, only enable this optimization for + ;; selected targets. + #+sbcl + (simple-base-string + (unless end + (setf end (length string))) + (check-vector-bounds string start end) + (let* ((mapping (lookup-mapping *simple-base-string-vector-mappings* + encoding)) + (bom (bom-vector encoding use-bom)) + (bom-length (length bom)) + ;; OPTIMIZE: we could use the (length string) information here + ;; because it's a simple-base-string where each character <= 127 + (result (make-array + (+ (the array-index + (funcall (the function (octet-counter mapping)) + string start end -1)) + bom-length) + :element-type '(unsigned-byte 8)))) + (replace result bom) + (funcall (the function (encoder mapping)) + string start end result bom-length) + result)) + (string + ;; FIXME: we shouldn't really need that coercion to UNICODE-STRING + ;; but we kind of because it's declared all over. To avoid that, + ;; we'd need different types for input and output strings. Or maybe + ;; this is not a problem; figure that out. + (with-checked-simple-vector ((string (coerce string 'unicode-string)) + (start start) (end end)) + (declare (type simple-unicode-string string)) + (let* ((mapping (lookup-mapping *string-vector-mappings* encoding)) + (bom (bom-vector encoding use-bom)) + (bom-length (length bom)) + (result (make-array + (+ (the array-index + (funcall (the function (octet-counter mapping)) + string start end -1)) + bom-length) + :element-type '(unsigned-byte 8)))) + (replace result bom) + (funcall (the function (encoder mapping)) + string start end result bom-length) + result)))))) + +(defun concatenate-strings-to-octets (encoding &rest strings) + "Optimized equivalent of +\(string-to-octets \(apply #'concatenate 'string strings) + :encoding encoding)" + (declare (dynamic-extent strings)) + (let* ((mapping (lookup-mapping *string-vector-mappings* encoding)) + (octet-counter (octet-counter mapping)) + (vector (make-array + (the array-index + (reduce #'+ strings + :key (lambda (string) + (funcall octet-counter + string 0 (length string) -1)))) + :element-type '(unsigned-byte 8))) + (current-index 0)) + (declare (type array-index current-index)) + (dolist (string strings) + (check-type string string) + (with-checked-simple-vector ((string (coerce string 'unicode-string)) + (start 0) (end (length string))) + (declare (type simple-unicode-string string)) + (incf current-index + (funcall (encoder mapping) + string start end vector current-index)))) + vector)) + +(defun string-size-in-octets (string &key (start 0) end (max -1 maxp) + (errorp (not *suppress-character-coding-errors*)) + (encoding *default-character-encoding*)) + (check-type string string) + (with-checked-simple-vector ((string (coerce string 'unicode-string)) + (start start) (end end)) + (declare (type simple-unicode-string string)) + (let ((mapping (lookup-mapping *string-vector-mappings* encoding)) + (*suppress-character-coding-errors* (not errorp))) + (when maxp (assert (plusp max))) + (funcall (octet-counter mapping) string start end max)))) + +(defun vector-size-in-chars (vector &key (start 0) end (max -1 maxp) + (errorp (not *suppress-character-coding-errors*)) + (encoding *default-character-encoding*)) + (check-type vector (vector (unsigned-byte 8))) + (with-checked-simple-vector ((vector vector) (start start) (end end)) + (declare (type (simple-array (unsigned-byte 8) (*)) vector)) + (let ((mapping (lookup-mapping *string-vector-mappings* encoding)) + (*suppress-character-coding-errors* (not errorp))) + (when maxp (assert (plusp max))) + (funcall (code-point-counter mapping) vector start end max)))) + +(declaim (notinline octets-to-string string-to-octets string-size-in-octets + vector-size-in-chars concatenate-strings-to-octets)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/tests/ascii.txt b/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/tests/ascii.txt new file mode 100644 index 0000000..d430ef4 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/tests/ascii.txt @@ -0,0 +1,212 @@ + +UTF-8 encoded sample plain-text file + + +Markus Kuhn [maks kun] 2002-07-25 + + +The ASCII compatible UTF-8 encoding used in this plain-text file +is defined in Unicode, ISO 10646-1, and RFC 2279. + + +Using Unicode/UTF-8, you can write in emails and source code things such as + +Mathematics and sciences: + + Eda = Q, n , f(i) = g(i), + a+b + x: x = x, = ( ), + c + , + + < a b c d (A B), + a-b + 2H + O 2HO, R = 4.7 k, 200 mm i=1 + +Linguistics and dictionaries: + + i ntnnl fntk sosien + Y [psiln], Yen [jn], Yoga [jog] + +APL: + + ((VV)=V)/V,V + +Nicer typography in plain text files: + + + + single and double quotes + + Curly apostrophes: Weve been here + + Latin-1 apostrophe and accents: '` + + deutsche Anfhrungszeichen + + , , , , 34, , 5/+5, , + + ASCII safety test: 1lI|, 0OD, 8B + + the euro symbol: 14.95 + + + +Combining characters: + + STARGTE SG-1, a = v = r, a b + +Greek (in Polytonic): + + The Greek anthem: + + + , + + . + + + + + , , ! + + From a speech of Demosthenes in the 4th century BC: + + , , + + + , + , + . + , , + . , + + , , + + , + . , + + , + . + + , + +Georgian: + + From a Unicode conference invitation: + + Unicode- + , 10-12 , + . , . + Unicode-, + , Unicode- + , , , + . + +Russian: + + From a Unicode conference invitation: + + + Unicode, 10-12 1997 . + + Unicode, , + Unicode + , , . + +Thai (UCS Level 2): + + Excerpt from a poetry on The Romance of The Three Kingdoms (a Chinese + classic 'San Gua'): + + [----------------------------|------------------------] + + + + + + + + + + (The above is a two-column text. If combining characters are handled + correctly, the lines of the second column should be aligned with the + | character above.) + +Ethiopian: + + Proverbs in the Amharic language: + + + + + + + + + + + + + + + + + + + + +Runes: + + + + (Old English, which transcribed into Latin reads 'He cwaeth that he + bude thaem lande northweardum with tha Westsae.' and means 'He said + that he lived in the northern land near the Western Sea.') + +Braille: + + + + + + + + + + + + + + + + + + + + + + + (The first couple of paragraphs of "A Christmas Carol" by Dickens) + +Compact font selection example text: + + ABCDEFGHIJKLMNOPQRSTUVWXYZ /0123456789 + abcdefghijklmnopqrstuvwxyz + + + +Greetings in various languages: + + Hello world, , + +Box drawing alignment tests: + + + + + + + + + diff --git a/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/tests/ascii.txt-utf8 b/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/tests/ascii.txt-utf8 new file mode 100644 index 0000000..d430ef4 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/tests/ascii.txt-utf8 @@ -0,0 +1,212 @@ + +UTF-8 encoded sample plain-text file + + +Markus Kuhn [maks kun] 2002-07-25 + + +The ASCII compatible UTF-8 encoding used in this plain-text file +is defined in Unicode, ISO 10646-1, and RFC 2279. + + +Using Unicode/UTF-8, you can write in emails and source code things such as + +Mathematics and sciences: + + Eda = Q, n , f(i) = g(i), + a+b + x: x = x, = ( ), + c + , + + < a b c d (A B), + a-b + 2H + O 2HO, R = 4.7 k, 200 mm i=1 + +Linguistics and dictionaries: + + i ntnnl fntk sosien + Y [psiln], Yen [jn], Yoga [jog] + +APL: + + ((VV)=V)/V,V + +Nicer typography in plain text files: + + + + single and double quotes + + Curly apostrophes: Weve been here + + Latin-1 apostrophe and accents: '` + + deutsche Anfhrungszeichen + + , , , , 34, , 5/+5, , + + ASCII safety test: 1lI|, 0OD, 8B + + the euro symbol: 14.95 + + + +Combining characters: + + STARGTE SG-1, a = v = r, a b + +Greek (in Polytonic): + + The Greek anthem: + + + , + + . + + + + + , , ! + + From a speech of Demosthenes in the 4th century BC: + + , , + + + , + , + . + , , + . , + + , , + + , + . , + + , + . + + , + +Georgian: + + From a Unicode conference invitation: + + Unicode- + , 10-12 , + . , . + Unicode-, + , Unicode- + , , , + . + +Russian: + + From a Unicode conference invitation: + + + Unicode, 10-12 1997 . + + Unicode, , + Unicode + , , . + +Thai (UCS Level 2): + + Excerpt from a poetry on The Romance of The Three Kingdoms (a Chinese + classic 'San Gua'): + + [----------------------------|------------------------] + + + + + + + + + + (The above is a two-column text. If combining characters are handled + correctly, the lines of the second column should be aligned with the + | character above.) + +Ethiopian: + + Proverbs in the Amharic language: + + + + + + + + + + + + + + + + + + + + +Runes: + + + + (Old English, which transcribed into Latin reads 'He cwaeth that he + bude thaem lande northweardum with tha Westsae.' and means 'He said + that he lived in the northern land near the Western Sea.') + +Braille: + + + + + + + + + + + + + + + + + + + + + + + (The first couple of paragraphs of "A Christmas Carol" by Dickens) + +Compact font selection example text: + + ABCDEFGHIJKLMNOPQRSTUVWXYZ /0123456789 + abcdefghijklmnopqrstuvwxyz + + + +Greetings in various languages: + + Hello world, , + +Box drawing alignment tests: + + + + + + + + + diff --git a/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/tests/benchmarks.lisp b/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/tests/benchmarks.lisp new file mode 100644 index 0000000..1b1d294 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/tests/benchmarks.lisp @@ -0,0 +1,43 @@ +;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- +;;; +;;; benchmarks.lisp --- Benchmarks, Babel vs. other implementations. +;;; +;;; Copyright (C) 2007, Luis Oliveira +;;; +;;; Permission is hereby granted, free of charge, to any person +;;; obtaining a copy of this software and associated documentation +;;; files (the "Software"), to deal in the Software without +;;; restriction, including without limitation the rights to use, copy, +;;; modify, merge, publish, distribute, sublicense, and/or sell copies +;;; of the Software, and to permit persons to whom the Software is +;;; furnished to do so, subject to the following conditions: +;;; +;;; The above copyright notice and this permission notice shall be +;;; included in all copies or substantial portions of the Software. +;;; +;;; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +;;; EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +;;; MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +;;; NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +;;; HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +;;; WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +;;; OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +;;; DEALINGS IN THE SOFTWARE. + +(defpackage #:babel-benchmarks + (:use #:cl #:babel)) +(in-package #:babel-benchmarks) + +(defun benchmark (enc file-name file-type &optional (n 100)) + (let* ((octets (read-test-file file-name file-type)) + (string (octets-to-string octets :encoding enc))) + (write-line ";; testing SB-EXT:STRING-TO-OCTETS") + (time (loop repeat n do + (sb-ext:string-to-octets string :external-format enc))) + (write-line ";; testing BABEL:STRING-TO-OCTETS") + (time (loop repeat n do (string-to-octets string :encoding enc))) + (write-line ";; testing SB-EXT:OCTETS-TO-STRING") + (time (loop repeat n do + (sb-ext:octets-to-string octets :external-format enc))) + (write-line ";; testing BABEL:OCTETS-TO-STRING") + (time (loop repeat n do (octets-to-string octets :encoding enc))))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/tests/ebcdic-us.txt b/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/tests/ebcdic-us.txt new file mode 100644 index 0000000..910ad2d --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/tests/ebcdic-us.txt @@ -0,0 +1 @@ +%äãÆ`ø@…•ƒ–„…„@¢”—“…@—“‰•`£…§£@†‰“…%%%Ô™’¤¢@Ò¤ˆ•@”’¢@’¤•@Lˆ££—zaa¦¦¦Kƒ“Kƒ”KƒK¤’a¡”‡’òõan@@òððò`ð÷`òõ%%%㈅@ÁâÃÉÉ@ƒ–”—£‰‚“…@äãÆ`ø@…•ƒ–„‰•‡@¤¢…„@‰•@£ˆ‰¢@—“‰•`£…§£@†‰“…%‰¢@„…†‰•…„@‰•@䕉ƒ–„…k@ÉâÖ@ñðöôö`ñk@•„@ÙÆÃ@òò÷ùK%%%䢉•‡@䕉ƒ–„…aäãÆ`øk@¨–¤@ƒ•@¦™‰£…@‰•@…”‰“¢@•„@¢–¤™ƒ…@ƒ–„…@£ˆ‰•‡¢@¢¤ƒˆ@¢%%Ô£ˆ…”£‰ƒ¢@•„@¢ƒ‰…•ƒ…¢z%%@@@Å„@~@Øk@@•@@k@@†M‰]@~@@‡M‰]k@@@@@@%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@N‚@%@@§z@§@~@§k@@@_@~@_M_@@]k@@@@@%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ƒ@@@%@@@@@@@@@@@@k@@@@@@@@@@@@@@@@@@@@@@@@@@%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%@@@L@@@‚@@ƒ@@„@@@@MÁ@@Â]k@@@@@@@@@@@@%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@`‚%@@òÈ@N@Ö@@òÈÖk@Ù@~@ôK÷@’k@@òðð@””@@@@@‰~ñ@@@@%%Ó‰•‡¤‰¢£‰ƒ¢@•„@„‰ƒ£‰–•™‰…¢z%%@@‰@•£••“@†•£’@¢–¢‰…•%@@è@—¢‰“•k@è…•@‘•k@è–‡@‘–‡%%Á×Óz%%@@MMåå]~å]aåkå@@@@%%Õ‰ƒ…™@£¨—–‡™—ˆ¨@‰•@—“‰•@£…§£@†‰“…¢z%%@@%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%@@@@@@¢‰•‡“…@•„@„–¤‚“…@˜¤–£…¢@@@@@@@@@%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%@@@@@@䙓¨@—–¢£™–—ˆ…¢z@æ…¥…@‚……•@ˆ…™…@%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%@@@@@@Ó£‰•`ñ@—–¢£™–—ˆ…@•„@ƒƒ…•£¢z@}y@@%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%@@@@@@„…¤£¢ƒˆ…@Á•†ˆ™¤•‡¢©…‰ƒˆ…•@@@@@@@%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%@@@@@@k@k@k@k@óôk@k@õaNõk@k@@@@@@@%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%@@@@@@ÁâÃÉÉ@¢†…£¨@£…¢£z@ñ“ÉOk@ðÖÄk@øÂ@@@@@%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%@@@@@@£ˆ…@…¤™–@¢¨”‚–“z@@ñôKùõ@@@@@@@@@@@%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%@@%%Ö”‚‰•‰•‡@ƒˆ™ƒ£…™¢z%%@@âãÁÙÇãÅ@âÇ`ñk@@~@¥@~@™k@@@‚%%Ç™……’@M‰•@×–“¨£–•‰ƒ]z%%@@㈅@Ç™……’@•£ˆ…”z%%@@@@@@%@@@@@k%@@@@@@%@@@@@@@K%%@@@@@%@@@@@%@@@@@%@@k@@k@Z%%@@Æ™–”@@¢—……ƒˆ@–†@Ä…”–¢£ˆ…•…¢@‰•@£ˆ…@ô£ˆ@ƒ…•£¤™¨@ÂÃz%%@@@@@@k@@@k%@@@@@@@@@@@%@@@@@@@@@@%@@@@@k@@@%@@@@k@@@@@@%@@@@@K@@@@@%@@@@@@@@k@@@k%@@@@@@@K@@k@@%@@@@@@@@@@@@%@@k@@@@@@@k@@%@@@@@@@@@%@@@@@@k@@@%@@K@@@@@k@@@@%@@@@@@@@@@@%@@@@@k@@@@%@@@@@K%%@@k@@%%Ç…–™‡‰•z%%@@Æ™–”@@䕉ƒ–„…@ƒ–•†…™…•ƒ…@‰•¥‰££‰–•z%%@@@@@@䕉ƒ–„…`@@%@@@k@@@ñð`ñò@k%@@K@k@K@@@@%@@@@@@@@䕉ƒ–„…`k%@@@@k@䕉ƒ–„…`@%@@@k@@@k@k%@@@@@@@K%%Ù¤¢¢‰•z%%@@Æ™–”@@䕉ƒ–„…@ƒ–•†…™…•ƒ…@‰•¥‰££‰–•z%%@@@@@@@@%@@䕉ƒ–„…k@@@ñð`ñò@@ñùù÷@@@@@K%@@@@@@@@@@%@@@@䕉ƒ–„…k@@@k@@%@@@䕉ƒ–„…@@@@@@%@@k@k@@@@@K%%㈉@MäÃâ@Ó…¥…“@ò]z%%@@ŧƒ…™—£@†™–”@@—–…£™¨@–•@㈅@Ù–”•ƒ…@–†@㈅@㈙……@Ò‰•‡„–”¢@M@ȉ•…¢…%@@ƒ“¢¢‰ƒ@}â•@Ǥ}]z%%@@````````````````````````````O````````````````````````%@@@@@@@%@@@@@@@@@%@@@@@@@@@@@@@@@%@@@@@@@@@@@%@@@@@@@@@@%@@@@@@@@@@@@%@@@@@@@@@@@@@@%@@@@@@@@@@@@@@%%@@M㈅@‚–¥…@‰¢@@£¦–`ƒ–“¤”•@£…§£K@Ɇ@ƒ–”‚‰•‰•‡@ƒˆ™ƒ£…™¢@™…@ˆ•„“…„%@@ƒ–™™…ƒ£“¨k@£ˆ…@“‰•…¢@–†@£ˆ…@¢…ƒ–•„@ƒ–“¤”•@¢ˆ–¤“„@‚…@“‰‡•…„@¦‰£ˆ@£ˆ…%@@O@ƒˆ™ƒ£…™@‚–¥…K]%%Å£ˆ‰–—‰•z%%@@×™–¥…™‚¢@‰•@£ˆ…@Á”ˆ™‰ƒ@“•‡¤‡…z%%@@@@@%@@@@@%@@@@@%@@@@@@@%@@@@@%@@@@@%@@@%@@@@@@%@@@@@%@@@@@@@%@@@@@@%@@@@@@@%@@@@@%@@@@@@@%@@@@@@@%@@@@@%@@@@@@%@@@@@%%Ù¤•…¢z%%@@@@@@@@@@@@@%%@@MÖ“„@Å•‡“‰¢ˆk@¦ˆ‰ƒˆ@£™•¢ƒ™‰‚…„@‰•£–@Ó£‰•@™…„¢@}È…@ƒ¦…£ˆ@£ˆ£@ˆ…%@@‚¤„…@£ˆ…”@“•„…@•–™£ˆ¦…™„¤”@¦‰£ˆ@£ˆ@æ…¢£¢…K}@•„@”…•¢@}È…@¢‰„%@@£ˆ£@ˆ…@“‰¥…„@‰•@£ˆ…@•–™£ˆ…™•@“•„@•…™@£ˆ…@æ…¢£…™•@â…K}]%%™‰““…z%%@@@@@@%%@@@@@@@@@@@%@@@@@@@@@@%@@@@@@@@@%@@@@@@@@@%@@@@@@@@@@%@@@@@@@%%@@@@@@@@@%%@@@@@@@@@@@@%@@@@@@@@@%@@@@@@@@@@%@@@@@@@@@@%@@@@@@@@@@%@@@@@@@@@%@@@@@@@@@@@%@@@@@@@@@%@@@@@@@@%%@@M㈅@†‰™¢£@ƒ–¤—“…@–†@—™‡™—ˆ¢@–†@Á@È™‰¢£”¢@Ù–“@‚¨@ĉƒ’…•¢]%%Ö”—ƒ£@†–•£@¢…“…ƒ£‰–•@…§”—“…@£…§£z%%@@ÁÂÃÄÅÆÇÈÉÑÒÓÔÕÖרÙâãäåæçèé@aðñòóôõö÷øù%@@‚ƒ„…†‡ˆ‰‘’“”•–—˜™¢£¤¥¦§¨©@%@@@@%@@@@@%%Ç™……£‰•‡¢@‰•@¥™‰–¤¢@“•‡¤‡…¢z%%@@È…““–@¦–™“„k@@k@%%–§@„™¦‰•‡@“‰‡•”…•£@£…¢£¢z@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%@@@@@@@@@@@@@@@@@@@@@@@@%@@@@@@@@@@@@@@@@@@@@%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%@@@@@@@@@@@@@@@@@@@@@@@@@@@%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%@@@@@@@@@@@@@@@@@@@@@%@@@@@@@@@@@@@@@@@@@@%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@% \ No newline at end of file diff --git a/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/tests/ebcdic-us.txt-utf8 b/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/tests/ebcdic-us.txt-utf8 new file mode 100644 index 0000000..e7ea1ac --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/tests/ebcdic-us.txt-utf8 @@ -0,0 +1,212 @@ + +UTF-8 encoded sample plain-text file + + +Markus Kuhn maks kun 2002-07-25 + + +The ASCII compatible UTF-8 encoding used in this plain-text file +is defined in Unicode, ISO 10646-1, and RFC 2279. + + +Using Unicode/UTF-8, you can write in emails and source code things such as + +Mathematics and sciences: + + Eda = Q, n , f(i) = g(i), + a+b + x: x = x, ¬ = ¬(¬ ), + c + , + + < a b c d (A B), + a-b + 2H + O 2HO, R = 4.7 k, 200 mm i=1 + +Linguistics and dictionaries: + + i ntnnl fntk sosien + Y psiln, Yen jn, Yoga jog + +APL: + + ((VV)=V)/V,V + +Nicer typography in plain text files: + + + + single and double quotes + + Curly apostrophes: Weve been here + + Latin-1 apostrophe and accents: '` + + deutsche Anfhrungszeichen + + , , , , 34, , 5/+5, , + + ASCII safety test: 1lI|, 0OD, 8B + + the euro symbol: 14.95 + + + +Combining characters: + + STARGTE SG-1, a = v = r, a b + +Greek (in Polytonic): + + The Greek anthem: + + + , + + . + + + + + , , ! + + From a speech of Demosthenes in the 4th century BC: + + , , + + + , + , + . + , , + . , + + , , + + , + . , + + , + . + + , + +Georgian: + + From a Unicode conference invitation: + + Unicode- + , 10-12 , + . , . + Unicode-, + , Unicode- + , , , + . + +Russian: + + From a Unicode conference invitation: + + + Unicode, 10-12 1997 . + + Unicode, , + Unicode + , , . + +Thai (UCS Level 2): + + Excerpt from a poetry on The Romance of The Three Kingdoms (a Chinese + classic 'San Gua'): + + ----------------------------|------------------------ + + + + + + + + + + (The above is a two-column text. If combining characters are handled + correctly, the lines of the second column should be aligned with the + | character above.) + +Ethiopian: + + Proverbs in the Amharic language: + + + + + + + + + + + + + + + + + + + + +Runes: + + + + (Old English, which transcribed into Latin reads 'He cwaeth that he + bude thaem lande northweardum with tha Westsae.' and means 'He said + that he lived in the northern land near the Western Sea.') + +Braille: + + + + + + + + + + + + + + + + + + + + + + + (The first couple of paragraphs of "A Christmas Carol" by Dickens) + +Compact font selection example text: + + ABCDEFGHIJKLMNOPQRSTUVWXYZ /0123456789 + abcdefghijklmnopqrstuvwxyz + + + +Greetings in various languages: + + Hello world, , + +Box drawing alignment tests: + + + + + + + + + diff --git a/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/tests/gen-test-files.sh b/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/tests/gen-test-files.sh new file mode 100644 index 0000000..cd0e343 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/tests/gen-test-files.sh @@ -0,0 +1,37 @@ +#!/bin/sh +# -*- indent-tabs-mode: nil -*- +# +# gen-test-files.sh --- Generates test files with iconv. +# +# Copyright (C) 2007, Luis Oliveira +# +# Permission is hereby granted, free of charge, to any person +# obtaining a copy of this software and associated documentation +# files (the "Software"), to deal in the Software without +# restriction, including without limitation the rights to use, copy, +# modify, merge, publish, distribute, sublicense, and/or sell copies +# of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be +# included in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +# DEALINGS IN THE SOFTWARE. + +INPUT_FILE="utf-8.txt" +INPUT_ENC="utf-8" +CHARSETS=('ebcdic-us' 'ascii' 'iso-8859-1' 'utf-16' 'utf-32') + +echo "Converting $INPUT_FILE..." +for c in ${CHARSETS[@]}; do + echo " ${c}.txt"; + iconv -c -f $INPUT_ENC -t $c $INPUT_FILE > ${c}.txt; + iconv -f $c -t 'utf-8' ${c}.txt > ${c}.txt-utf8; +done diff --git a/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/tests/streams.lisp b/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/tests/streams.lisp new file mode 100644 index 0000000..9dd53df --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/tests/streams.lisp @@ -0,0 +1,45 @@ +;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- +;;; +;;; streams.lisp --- Unit and regression tests for Babel streams. +;;; +;;; Copyright (C) 2007, Attila Lendva +;;; +;;; Permission is hereby granted, free of charge, to any person +;;; obtaining a copy of this software and associated documentation +;;; files (the "Software"), to deal in the Software without +;;; restriction, including without limitation the rights to use, copy, +;;; modify, merge, publish, distribute, sublicense, and/or sell copies +;;; of the Software, and to permit persons to whom the Software is +;;; furnished to do so, subject to the following conditions: +;;; +;;; The above copyright notice and this permission notice shall be +;;; included in all copies or substantial portions of the Software. +;;; +;;; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +;;; EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +;;; MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +;;; NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +;;; HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +;;; WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +;;; OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +;;; DEALINGS IN THE SOFTWARE. + +(in-package #:babel-tests) + +(eval-when (:compile-toplevel :load-toplevel :execute) + (use-package :babel-streams)) + +(deftest in-memory-vector-stream + (with-output-to-sequence (output) + ;; TODO use a better test lib and inject asserts for the file position + ;(print (file-position output)) + (write-sequence "éáőűú" output) + ;(print (file-position output)) + (write-char #\ű output) + ;(print (file-position output)) + (write-byte 12 output) + (write-sequence (string-to-octets "körte") output) + (write-string "körte" output) + ;(print (file-position output)) + ) + #(195 169 195 161 197 145 197 177 195 186 197 177 12 107 195 182 114 116 101)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/tests/tests.lisp b/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/tests/tests.lisp new file mode 100644 index 0000000..82c29bb --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/tests/tests.lisp @@ -0,0 +1,912 @@ +;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- +;;; +;;; tests.lisp --- Unit and regression tests for Babel. +;;; +;;; Copyright (C) 2007-2009, Luis Oliveira +;;; +;;; Permission is hereby granted, free of charge, to any person +;;; obtaining a copy of this software and associated documentation +;;; files (the "Software"), to deal in the Software without +;;; restriction, including without limitation the rights to use, copy, +;;; modify, merge, publish, distribute, sublicense, and/or sell copies +;;; of the Software, and to permit persons to whom the Software is +;;; furnished to do so, subject to the following conditions: +;;; +;;; The above copyright notice and this permission notice shall be +;;; included in all copies or substantial portions of the Software. +;;; +;;; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +;;; EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +;;; MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +;;; NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +;;; HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +;;; WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +;;; OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +;;; DEALINGS IN THE SOFTWARE. + +(in-package #:cl-user) +(defpackage #:babel-tests + (:use #:common-lisp #:babel #:babel-encodings #:hu.dwim.stefil) + (:import-from #:alexandria #:ignore-some-conditions) + (:export #:run)) +(in-package #:babel-tests) + +(defun indented-format (level stream format-control &rest format-arguments) + (let ((line-prefix (make-string level :initial-element #\Space))) + (let ((output (format nil "~?~%" format-control format-arguments))) + (with-input-from-string (s output) + (loop for line = (read-line s nil nil) until (null line) + do (format stream "~A~A~%" line-prefix line)))))) + +;; adapted from https://github.com/luismbo/stefil/blob/master/source/suite.lisp +(defun describe-failed-tests (&key (result *last-test-result*) (stream t)) + "Prints out a report for RESULT in STREAM. + +RESULT defaults to `*last-test-result*' and STREAM defaults to t" + (let ((descs (hu.dwim.stefil::failure-descriptions-of result))) + (cond ((zerop (length descs)) + (format stream "~&~%[no failures!]")) + (t + (format stream "~&~%Test failures:~%") + (dotimes (i (length descs)) + (let ((desc (aref descs i)) + format-control format-arguments) + ;; XXX: most of Stefil's conditions specialise DESCRIBE-OBJECT + ;; with nice human-readable messages. We should add any missing + ;; ones (like UNEXPECTED-ERROR) and ditch this code. + (etypecase desc + (hu.dwim.stefil::unexpected-error + (let ((c (hu.dwim.stefil::condition-of desc))) + (typecase c + (simple-condition + (setf format-control (simple-condition-format-control c)) + (setf format-arguments + (simple-condition-format-arguments c))) + (t + (setf format-control "~S" + format-arguments (list c)))))) + (hu.dwim.stefil::failed-assertion + (setf format-control (hu.dwim.stefil::format-control-of desc) + format-arguments (hu.dwim.stefil::format-arguments-of desc))) + (hu.dwim.stefil::missing-condition + (setf format-control "~A" + format-arguments (list (with-output-to-string (stream) + (describe desc stream))))) + (null + (setf format-control "Test succeeded!"))) + (format stream "~%Failure ~A: ~A when running ~S~%~%" + (1+ i) + (type-of desc) + (hu.dwim.stefil::name-of (hu.dwim.stefil::test-of (first (hu.dwim.stefil::test-context-backtrace-of desc))))) + (indented-format 4 stream "~?" format-control format-arguments))))))) + +(defun run () + (let ((test-run (without-debugging (babel-tests)))) + (print test-run) + (describe-failed-tests :result test-run) + (values (zerop (length (hu.dwim.stefil::failure-descriptions-of test-run))) + test-run))) + +(defsuite* (babel-tests :in root-suite)) + +(defun ub8v (&rest contents) + (make-array (length contents) :element-type '(unsigned-byte 8) + :initial-contents contents)) + +(defun make-ub8-vector (size) + (make-array size :element-type '(unsigned-byte 8) + :initial-element 0)) + +(defmacro returns (form &rest values) + "Asserts, through EQUALP, that FORM returns VALUES." + `(is (equalp (multiple-value-list ,form) (list ,@values)))) + +(defmacro defstest (name form &body return-values) + "Similar to RT's DEFTEST." + `(deftest ,name () + (returns ,form ,@(mapcar (lambda (x) `',x) return-values)))) + +(defun fail (control-string &rest arguments) + (hu.dwim.stefil::record/failure 'hu.dwim.stefil::failed-assertion + :format-control control-string + :format-arguments arguments)) + +(defun expected (expected &key got) + (fail "expected ~A, got ~A instead" expected got)) + +(enable-sharp-backslash-syntax) + +;;;; Simple tests using ASCII + +(defstest enc.ascii.1 + (string-to-octets "abc" :encoding :ascii) + #(97 98 99)) + +(defstest enc.ascii.2 + (string-to-octets (string #\uED) :encoding :ascii :errorp nil) + #(#x1a)) + +(deftest enc.ascii.3 () + (handler-case + (string-to-octets (string #\uED) :encoding :ascii :errorp t) + (character-encoding-error (c) + (is (eql 0 (character-coding-error-position c))) + (is (eq :ascii (character-coding-error-encoding c))) + (is (eql #xed (character-encoding-error-code c)))) + (:no-error (result) + (expected 'character-encoding-error :got result)))) + +(defstest dec.ascii.1 + (octets-to-string (ub8v 97 98 99) :encoding :ascii) + "abc") + +(deftest dec.ascii.2 () + (handler-case + (octets-to-string (ub8v 97 128 99) :encoding :ascii :errorp t) + (character-decoding-error (c) + (is (equalp #(128) (character-decoding-error-octets c))) + (is (eql 1 (character-coding-error-position c))) + (is (eq :ascii (character-coding-error-encoding c)))) + (:no-error (result) + (expected 'character-decoding-error :got result)))) + +(defstest dec.ascii.3 + (octets-to-string (ub8v 97 255 98 99) :encoding :ascii :errorp nil) + #(#\a #\Sub #\b #\c)) + +(defstest oct-count.ascii.1 + (string-size-in-octets "abc" :encoding :ascii) + 3 3) + +(defstest char-count.ascii.1 + (vector-size-in-chars (ub8v 97 98 99) :encoding :ascii) + 3 3) + +;;;; UTF-8 + +(defstest char-count.utf-8.1 + ;; "ni hao" in hanzi with the last octet missing + (vector-size-in-chars (ub8v 228 189 160 229 165) :errorp nil) + 2 5) + +(deftest char-count.utf-8.2 () + ;; same as above with the last 2 octets missing + (handler-case + (vector-size-in-chars (ub8v 228 189 160 229) :errorp t) + (end-of-input-in-character (c) + (is (equalp #(229) (character-decoding-error-octets c))) + (is (eql 3 (character-coding-error-position c))) + (is (eq :utf-8 (character-coding-error-encoding c)))) + (:no-error (result) + (expected 'end-of-input-in-character :got result)))) + +;;; Lispworks bug? +;; #+lispworks +;; (pushnew 'dec.utf-8.1 rtest::*expected-failures*) + +(defstest dec.utf-8.1 + (octets-to-string (ub8v 228 189 160 229) :errorp nil) + #(#\u4f60 #\ufffd)) + +(deftest dec.utf-8.2 () + (handler-case + (octets-to-string (ub8v 228 189 160 229) :errorp t) + (end-of-input-in-character (c) + (is (equalp #(229) (character-decoding-error-octets c))) + (is (eql 3 (character-coding-error-position c))) + (is (eq :utf-8 (character-coding-error-encoding c)))) + (:no-error (result) + (expected 'end-of-input-in-character :got result)))) + +;;;; UTF-16 + +;;; Test that the BOM is not being counted as a character. +(deftest char-count.utf-16.bom () + (is (eql (vector-size-in-chars (ub8v #xfe #xff #x00 #x55 #x00 #x54 #x00 #x46) + :encoding :utf-16) + 3)) + (is (eql (vector-size-in-chars (ub8v #xff #xfe #x00 #x55 #x00 #x54 #x00 #x46) + :encoding :utf-16) + 3))) + +;;;; UTF-32 + +;;; RT: check that UTF-32 characters without a BOM are treated as +;;; little-endian. +(deftest endianness.utf-32.no-bom () + (is (string= "a" (octets-to-string (ub8v 0 0 0 97) :encoding :utf-32)))) + +;;;; MORE TESTS + +(defparameter *standard-characters* + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!$\"'(),_-./:;?+<=>#%&*@[\\]{|}`^~") + +;;; Testing consistency by encoding and decoding a simple string for +;;; all character encodings. +(deftest rw-equiv.1 () + (let ((compatible-encodings (remove :ebcdic-international (list-character-encodings)))) + (dolist (*default-character-encoding* compatible-encodings) + (let ((octets (string-to-octets *standard-characters*))) + (is (string= (octets-to-string octets) *standard-characters*)))))) + +;;; FIXME: assumes little-endianness. Easily fixable when we +;;; implement the BE and LE variants of :UTF-16. +(deftest concatenate-strings-to-octets-equiv.1 () + (let ((foo (octets-to-string (ub8v 102 195 186 195 186) + :encoding :utf-8)) + (bar (octets-to-string (ub8v 98 195 161 114) + :encoding :utf-8))) + ;; note: FOO and BAR are not ascii + (is (equalp (concatenate-strings-to-octets :utf-8 foo bar) + (ub8v 102 195 186 195 186 98 195 161 114))) + (is (equalp (concatenate-strings-to-octets :utf-16 foo bar) + (ub8v 102 0 250 0 250 0 98 0 225 0 114 0))))) + +;;;; Testing against files generated by GNU iconv. + +(defun test-file (name type) + (uiop:subpathname (asdf:system-relative-pathname "babel-tests" "tests/") + name :type type)) + +(defun read-test-file (name type) + (with-open-file (in (test-file name type) :element-type '(unsigned-byte 8)) + (let* ((data (loop for byte = (read-byte in nil nil) + until (null byte) collect byte))) + (make-array (length data) :element-type '(unsigned-byte 8) + :initial-contents data)))) + +(deftest test-encoding (enc &optional input-enc-name) + (let* ((*default-character-encoding* enc) + (enc-name (string-downcase (symbol-name enc))) + (utf8-octets (read-test-file enc-name "txt-utf8")) + (foo-octets (read-test-file (or input-enc-name enc-name) "txt")) + (utf8-string (octets-to-string utf8-octets :encoding :utf-8 :errorp t)) + (foo-string (octets-to-string foo-octets :errorp t))) + (is (string= utf8-string foo-string)) + (is (= (length foo-string) (vector-size-in-chars foo-octets :errorp t))) + (unless (member enc '(:utf-16 :utf-32)) + ;; FIXME: skipping UTF-16 and UTF-32 because of the BOMs and + ;; because the input might not be in native-endian order so the + ;; comparison will fail there. + (let ((new-octets (string-to-octets foo-string :errorp t))) + (is (equalp new-octets foo-octets)) + (is (eql (length foo-octets) + (string-size-in-octets foo-string :errorp t))))))) + +(deftest iconv-test () + (dolist (enc '(:ascii :ebcdic-us :utf-8 :utf-16 :utf-32)) + (case enc + (:utf-16 (test-encoding :utf-16 "utf-16-with-le-bom")) + (:utf-32 (test-encoding :utf-32 "utf-32-with-le-bom"))) + (test-encoding enc))) + +;;; RT: accept encoding objects in LOOKUP-MAPPING etc. +(defstest encoding-objects.1 + (string-to-octets "abc" :encoding (get-character-encoding :ascii)) + #(97 98 99)) + +(defmacro with-sharp-backslash-syntax (&body body) + `(let ((*readtable* (copy-readtable *readtable*))) + (set-sharp-backslash-syntax-in-readtable) + ,@body)) + +(defstest sharp-backslash.1 + (with-sharp-backslash-syntax + (loop for string in '("#\\a" "#\\u" "#\\ued") + collect (char-code (read-from-string string)))) + (97 117 #xed)) + +(deftest sharp-backslash.2 () + (signals reader-error (with-sharp-backslash-syntax + (read-from-string "#\\u12zz")))) + +(deftest test-read-from-string (string object position) + "Test that (read-from-string STRING) returns values OBJECT and POSITION." + (multiple-value-bind (obj pos) + (read-from-string string) + (is (eql object obj)) + (is (eql position pos)))) + +;;; RT: our #\ reader didn't honor *READ-SUPPRESS*. +(deftest sharp-backslash.3 () + (with-sharp-backslash-syntax + (let ((*read-suppress* t)) + (test-read-from-string "#\\ujunk" nil 7) + (test-read-from-string "#\\u12zz" nil 7)))) + +;;; RT: the slow implementation of with-simple-vector was buggy. +(defstest string-to-octets.1 + (code-char (aref (string-to-octets "abc" :start 1 :end 2) 0)) + #\b) + +(defstest simple-base-string.1 + (string-to-octets (coerce "abc" 'base-string) :encoding :ascii) + #(97 98 99)) + +;;; For now, disable this tests for Lisps that are strict about +;;; non-character code points. In the future, simply mark them as +;;; expected failures. +#-(or abcl ccl) +(progn + (defstest utf-8b.1 + (string-to-octets (coerce #(#\a #\b #\udcf0) 'unicode-string) + :encoding :utf-8b) + #(97 98 #xf0)) + + #+#:temporarily-disabled + (defstest utf-8b.2 + (octets-to-string (ub8v 97 98 #xcd) :encoding :utf-8b) + #(#\a #\b #\udccd)) + + (defstest utf-8b.3 + (octets-to-string (ub8v 97 #xf0 #xf1 #xff #x01) :encoding :utf-8b) + #(#\a #\udcf0 #\udcf1 #\udcff #\udc01)) + + (deftest utf-8b.4 () + (let* ((octets (coerce (loop repeat 8192 collect (random (+ #x82))) + '(array (unsigned-byte 8) (*)))) + (string (octets-to-string octets :encoding :utf-8b))) + (is (equalp octets (string-to-octets string :encoding :utf-8b)))))) + +;;; The following tests have been adapted from SBCL's +;;; tests/octets.pure.lisp file. + +(deftest ensure-roundtrip-ascii () + (let ((octets (make-ub8-vector 128))) + (dotimes (i 128) + (setf (aref octets i) i)) + (let* ((str (octets-to-string octets :encoding :ascii)) + (oct2 (string-to-octets str :encoding :ascii))) + (is (= (length octets) (length oct2))) + (is (every #'= octets oct2))))) + +(deftest test-8bit-roundtrip (enc) + (let ((octets (make-ub8-vector 256))) + (dotimes (i 256) + (setf (aref octets i) i)) + (let* ((str (octets-to-string octets :encoding enc))) + ;; remove the undefined code-points because they translate + ;; to #xFFFD and string-to-octets raises an error when + ;; encoding #xFFFD + (multiple-value-bind (filtered-str filtered-octets) + (let ((s (make-array 0 :element-type 'character + :adjustable t :fill-pointer 0)) + (o (make-array 0 :element-type '(unsigned-byte 16) + :adjustable t :fill-pointer 0))) + (loop for i below 256 + for c = (aref str i) + when (/= (char-code c) #xFFFD) + do (vector-push-extend c s) + (vector-push-extend (aref octets i) o)) + (values s o)) + (let ((oct2 (string-to-octets filtered-str :encoding enc))) + (is (eql (length filtered-octets) (length oct2))) + (is (every #'eql filtered-octets oct2))))))) + +(defparameter *iso-8859-charsets* + '(:iso-8859-1 :iso-8859-2 :iso-8859-3 :iso-8859-4 :iso-8859-5 :iso-8859-6 + :iso-8859-7 :iso-8859-8 :iso-8859-9 :iso-8859-10 :iso-8859-11 :iso-8859-13 + :iso-8859-14 :iso-8859-15 :iso-8859-16)) + +;;; Don't actually see what comes out, but there shouldn't be any +;;; errors. +(deftest iso-8859-roundtrip-no-checking () + (loop for enc in *iso-8859-charsets* do (test-8bit-roundtrip enc))) + +(deftest ensure-roundtrip-latin () + (loop for enc in '(:latin1 :latin9) do (test-8bit-roundtrip enc))) + +;;; Latin-9 chars; the previous test checked roundtrip from +;;; octets->char and back, now test that the latin-9 characters did in +;;; fact appear during that trip. +(deftest ensure-roundtrip-latin9 () + (let ((l9c (map 'string #'code-char '(8364 352 353 381 382 338 339 376)))) + (is (string= (octets-to-string (string-to-octets l9c :encoding :latin9) + :encoding :latin9) + l9c)))) + +;; Expected to fail on Lisps that are strict about non-character code +;; points. Mark this as an expected failure when Stefil supports such +;; a feature. +#-(or abcl ccl) +(deftest code-char-nilness () + (is (loop for i below unicode-char-code-limit + never (null (code-char i))))) + +(deftest test-unicode-roundtrip (enc) + (let ((string (make-string unicode-char-code-limit))) + (dotimes (i unicode-char-code-limit) + (setf (char string i) + (if (or (<= #xD800 i #xDFFF) + (<= #xFDD0 i #xFDEF) + (eql (logand i #xFFFF) #xFFFF) + (eql (logand i #xFFFF) #xFFFE)) + #\? ; don't try to encode non-characters. + (code-char i)))) + (let ((string2 (octets-to-string + (string-to-octets string :encoding enc :errorp t) + :encoding enc :errorp t))) + (is (eql (length string2) (length string))) + (is (string= string string2))))) + +(deftest ensure-roundtrip.utf8 () + (test-unicode-roundtrip :utf-8)) + +(deftest ensure-roundtrip.utf16 () + (test-unicode-roundtrip :utf-16)) + +(deftest ensure-roundtrip.utf32 () + (test-unicode-roundtrip :utf-32)) + +#+sbcl +(progn + (deftest test-encode-against-sbcl (enc) + (let ((string (make-string unicode-char-code-limit))) + (dotimes (i unicode-char-code-limit) + (setf (char string i) (code-char i))) + (loop for ch across string + for babel = (string-to-octets (string ch) :encoding enc) + for sbcl = (sb-ext:string-to-octets (string ch) + :external-format enc) + do (is (equalp babel sbcl))))) + + ;; not run automatically because it's a bit slow (1114112 assertions) + (deftest (test-encode-against-sbcl.utf-8 :auto-call nil) () + (test-encode-against-sbcl :utf-8))) + +(deftest non-ascii-bytes () + (let ((octets (make-array 128 + :element-type '(unsigned-byte 8) + :initial-contents (loop for i from 128 below 256 + collect i)))) + (is (string= (octets-to-string octets :encoding :ascii :errorp nil) + (make-string 128 :initial-element #\Sub))))) + +(deftest non-ascii-chars () + (let ((string (make-array 128 + :element-type 'character + :initial-contents (loop for i from 128 below 256 + collect (code-char i))))) + (is (equalp (string-to-octets string :encoding :ascii :errorp nil) + (make-array 128 :initial-element (char-code #\Sub)))))) + +;;;; The following UTF-8 decoding tests are adapted from +;;;; . + +(deftest utf8-decode-test (octets expected-results expected-errors) + (let ((string (octets-to-string (coerce octets '(vector (unsigned-byte 8) *)) + :encoding :utf-8 :errorp nil))) + (is (string= expected-results string)) + (is (= (count #\ufffd string) expected-errors)))) + +(deftest utf8-decode-tests (octets expected-results) + (setf expected-results (coerce expected-results '(simple-array character (*)))) + (let ((expected-errors (count #\? expected-results)) + (expected-results (substitute #\ufffd #\? expected-results))) + (utf8-decode-test octets expected-results expected-errors) + (utf8-decode-test (concatenate 'vector '(34) octets '(34)) + (format nil "\"~A\"" expected-results) + expected-errors))) + +(deftest utf8-too-big-characters () + (utf8-decode-tests #(#xf4 #x90 #x80 #x80) "?") ; #x110000 + (utf8-decode-tests #(#xf7 #xbf #xbf #xbf) "?") ; #x1fffff + (utf8-decode-tests #(#xf8 #x88 #x80 #x80 #x80) "?") ; #x200000 + (utf8-decode-tests #(#xfb #xbf #xbf #xbf #xbf) "?") ; #x3ffffff + (utf8-decode-tests #(#xfc #x84 #x80 #x80 #x80 #x80) "?") ; #x4000000e + (utf8-decode-tests #(#xfd #xbf #xbf #xbf #xbf #xbf) "?")) ; #x7fffffff + +(deftest utf8-unexpected-continuation-bytes () + (utf8-decode-tests #(#x80) "?") + (utf8-decode-tests #(#xbf) "?") + (utf8-decode-tests #(#x80 #xbf) "??") + (utf8-decode-tests #(#x80 #xbf #x80) "???") + (utf8-decode-tests #(#x80 #xbf #x80 #xbf) "????") + (utf8-decode-tests #(#x80 #xbf #x80 #xbf #x80) "?????") + (utf8-decode-tests #(#x80 #xbf #x80 #xbf #x80 #xbf) "??????") + (utf8-decode-tests #(#x80 #xbf #x80 #xbf #x80 #xbf #x80) "???????")) + +;;; All 64 continuation bytes in a row. +(deftest utf8-continuation-bytes () + (apply #'utf8-decode-tests + (loop for i from #x80 to #xbf + collect i into bytes + collect #\? into chars + finally (return (list bytes + (coerce chars 'string)))))) + +(deftest utf8-lonely-start-characters () + (flet ((lsc (first last) + (apply #'utf8-decode-tests + (loop for i from first to last + nconc (list i 32) into bytes + nconc (list #\? #\Space) into chars + finally (return (list bytes (coerce chars 'string))))) + (apply #'utf8-decode-tests + (loop for i from first to last + collect i into bytes + collect #\? into chars + finally (return + (list bytes (coerce chars 'string))))))) + (lsc #xc0 #xdf) ; 2-byte sequence start chars + (lsc #xe0 #xef) ; 3-byte + (lsc #xf0 #xf7) ; 4-byte + (lsc #xf8 #xfb) ; 5-byte + (lsc #xfc #xfd))) ; 6-byte + +;;; Otherwise incomplete sequences (last continuation byte missing) +(deftest utf8-incomplete-sequences () + (utf8-decode-tests #0=#(#xc0) "?") + (utf8-decode-tests #1=#(#xe0 #x80) "?") + (utf8-decode-tests #2=#(#xf0 #x80 #x80) "?") + (utf8-decode-tests #3=#(#xf8 #x80 #x80 #x80) "?") + (utf8-decode-tests #4=#(#xfc #x80 #x80 #x80 #x80) "?") + (utf8-decode-tests #5=#(#xdf) "?") + (utf8-decode-tests #6=#(#xef #xbf) "?") + (utf8-decode-tests #7=#(#xf7 #xbf #xbf) "?") + (utf8-decode-tests #8=#(#xfb #xbf #xbf #xbf) "?") + (utf8-decode-tests #9=#(#xfd #xbf #xbf #xbf #xbf) "?") + ;; All ten previous tests concatenated + (utf8-decode-tests (concatenate 'vector + #0# #1# #2# #3# #4# #5# #6# #7# #8# #9#) + "??????????")) + +(deftest utf8-random-impossible-bytes () + (utf8-decode-tests #(#xfe) "?") + (utf8-decode-tests #(#xff) "?") + (utf8-decode-tests #(#xfe #xfe #xff #xff) "????")) + +(deftest utf8-overlong-sequences-/ () + (utf8-decode-tests #(#xc0 #xaf) "?") + (utf8-decode-tests #(#xe0 #x80 #xaf) "?") + (utf8-decode-tests #(#xf0 #x80 #x80 #xaf) "?") + (utf8-decode-tests #(#xf8 #x80 #x80 #x80 #xaf) "?") + (utf8-decode-tests #(#xfc #x80 #x80 #x80 #x80 #xaf) "?")) + +(deftest utf8-overlong-sequences-rubout () + (utf8-decode-tests #(#xc1 #xbf) "?") + (utf8-decode-tests #(#xe0 #x9f #xbf) "?") + (utf8-decode-tests #(#xf0 #x8f #xbf #xbf) "?") + (utf8-decode-tests #(#xf8 #x87 #xbf #xbf #xbf) "?") + (utf8-decode-tests #(#xfc #x83 #xbf #xbf #xbf #xbf) "?")) + +(deftest utf8-overlong-sequences-null () + (utf8-decode-tests #(#xc0 #x80) "?") + (utf8-decode-tests #(#xe0 #x80 #x80) "?") + (utf8-decode-tests #(#xf0 #x80 #x80 #x80) "?") + (utf8-decode-tests #(#xf8 #x80 #x80 #x80 #x80) "?") + (utf8-decode-tests #(#xfc #x80 #x80 #x80 #x80 #x80) "?")) + +;;;; End of adapted SBCL tests. + +;;; Expected to fail, for now. +#+#:ignore +(deftest utf8-illegal-code-positions () + ;; single UTF-16 surrogates + (utf8-decode-tests #(#xed #xa0 #x80) "?") + (utf8-decode-tests #(#xed #xad #xbf) "?") + (utf8-decode-tests #(#xed #xae #x80) "?") + (utf8-decode-tests #(#xed #xaf #xbf) "?") + (utf8-decode-tests #(#xed #xb0 #x80) "?") + (utf8-decode-tests #(#xed #xbe #x80) "?") + (utf8-decode-tests #(#xed #xbf #xbf) "?") + ;; paired UTF-16 surrogates + (utf8-decode-tests #(ed a0 80 ed b0 80) "??") + (utf8-decode-tests #(ed a0 80 ed bf bf) "??") + (utf8-decode-tests #(ed ad bf ed b0 80) "??") + (utf8-decode-tests #(ed ad bf ed bf bf) "??") + (utf8-decode-tests #(ed ae 80 ed b0 80) "??") + (utf8-decode-tests #(ed ae 80 ed bf bf) "??") + (utf8-decode-tests #(ed af bf ed b0 80) "??") + (utf8-decode-tests #(ed af bf ed bf bf) "??") + ;; other illegal code positions + (utf8-decode-tests #(#xef #xbf #xbe) "?") ; #\uFFFE + (utf8-decode-tests #(#xef #xbf #xbf) "?")) ; #\uFFFF + +;;; A list of the ISO-8859 encodings where each element is a cons with +;;; the car being a keyword denoting the encoding and the cdr being a +;;; vector enumerating the corresponding character codes. +;;; +;;; It was auto-generated from files which can be found at +;;; . +;;; +;;; Taken from flexi-streams. +(defparameter *iso-8859-tables* + '((:iso-8859-1 . + #(0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 + 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 + 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 + 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 + 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 + 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 + 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 + 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 + 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 + 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 + 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 + 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 + 243 244 245 246 247 248 249 250 251 252 253 254 255)) + + (:iso-8859-2 . + #(0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 + 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 + 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 + 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 + 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 + 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 + 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 + 153 154 155 156 157 158 159 160 260 728 321 164 317 346 167 168 352 350 + 356 377 173 381 379 176 261 731 322 180 318 347 711 184 353 351 357 378 + 733 382 380 340 193 194 258 196 313 262 199 268 201 280 203 282 205 206 + 270 272 323 327 211 212 336 214 215 344 366 218 368 220 221 354 223 341 + 225 226 259 228 314 263 231 269 233 281 235 283 237 238 271 273 324 328 + 243 244 337 246 247 345 367 250 369 252 253 355 729)) + + (:iso-8859-3 . + #(0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 + 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 + 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 + 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 + 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 + 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 + 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 + 153 154 155 156 157 158 159 160 294 728 163 164 65533 292 167 168 304 + 350 286 308 173 65533 379 176 295 178 179 180 181 293 183 184 305 351 + 287 309 189 65533 380 192 193 194 65533 196 266 264 199 200 201 202 203 + 204 205 206 207 65533 209 210 211 212 288 214 215 284 217 218 219 220 + 364 348 223 224 225 226 65533 228 267 265 231 232 233 234 235 236 237 + 238 239 65533 241 242 243 244 289 246 247 285 249 250 251 252 365 349 + 729)) + + (:iso-8859-4 . + #(0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 + 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 + 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 + 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 + 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 + 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 + 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 + 153 154 155 156 157 158 159 160 260 312 342 164 296 315 167 168 352 274 + 290 358 173 381 175 176 261 731 343 180 297 316 711 184 353 275 291 359 + 330 382 331 256 193 194 195 196 197 198 302 268 201 280 203 278 205 206 + 298 272 325 332 310 212 213 214 215 216 370 218 219 220 360 362 223 257 + 225 226 227 228 229 230 303 269 233 281 235 279 237 238 299 273 326 333 + 311 244 245 246 247 248 371 250 251 252 361 363 729)) + + (:iso-8859-5 . + #(0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 + 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 + 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 + 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 + 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 + 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 + 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 + 153 154 155 156 157 158 159 160 1025 1026 1027 1028 1029 1030 1031 1032 + 1033 1034 1035 1036 173 1038 1039 1040 1041 1042 1043 1044 1045 1046 + 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 + 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 + 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 + 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 + 1103 8470 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 + 167 1118 1119)) + + (:iso-8859-6 . + #(0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 + 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 + 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 + 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 + 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 + 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 + 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 + 153 154 155 156 157 158 159 160 65533 65533 65533 164 65533 65533 65533 + 65533 65533 65533 65533 1548 173 65533 65533 65533 65533 65533 65533 + 65533 65533 65533 65533 65533 65533 65533 1563 65533 65533 65533 1567 + 65533 1569 1570 1571 1572 1573 1574 1575 1576 1577 1578 1579 1580 1581 + 1582 1583 1584 1585 1586 1587 1588 1589 1590 1591 1592 1593 1594 65533 + 65533 65533 65533 65533 1600 1601 1602 1603 1604 1605 1606 1607 1608 + 1609 1610 1611 1612 1613 1614 1615 1616 1617 1618 65533 65533 65533 + 65533 65533 65533 65533 65533 65533 65533 65533 65533 65533)) + + (:iso-8859-7 . + #(0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 + 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 + 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 + 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 + 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 + 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 + 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 + 153 154 155 156 157 158 159 160 8216 8217 163 8364 8367 166 167 168 169 + 890 171 172 173 65533 8213 176 177 178 179 900 901 902 183 904 905 906 + 187 908 189 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 + 925 926 927 928 929 65533 931 932 933 934 935 936 937 938 939 940 941 + 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 + 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 65533)) + + (:iso-8859-8 . + #(0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 + 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 + 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 + 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 + 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 + 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 + 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 + 153 154 155 156 157 158 159 160 65533 162 163 164 165 166 167 168 169 + 215 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 247 187 + 188 189 190 65533 65533 65533 65533 65533 65533 65533 65533 65533 65533 + 65533 65533 65533 65533 65533 65533 65533 65533 65533 65533 65533 65533 + 65533 65533 65533 65533 65533 65533 65533 65533 65533 65533 8215 1488 + 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 + 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 65533 65533 + 8206 8207 65533)) + + (:iso-8859-9 . + #(0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 + 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 + 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 + 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 + 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 + 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 + 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 + 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 + 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 + 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 + 207 286 209 210 211 212 213 214 215 216 217 218 219 220 304 350 223 224 + 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 287 241 242 + 243 244 245 246 247 248 249 250 251 252 305 351 255)) + + (:iso-8859-10 . + #(0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 + 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 + 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 + 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 + 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 + 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 + 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 + 153 154 155 156 157 158 159 160 260 274 290 298 296 310 167 315 272 352 + 358 381 173 362 330 176 261 275 291 299 297 311 183 316 273 353 359 382 + 8213 363 331 256 193 194 195 196 197 198 302 268 201 280 203 278 205 206 + 207 208 325 332 211 212 213 214 360 216 370 218 219 220 221 222 223 257 + 225 226 227 228 229 230 303 269 233 281 235 279 237 238 239 240 326 333 + 243 244 245 246 361 248 371 250 251 252 253 254 312)) + + (:iso-8859-11 . + #(0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 + 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 + 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 + 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 + 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 + 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 + 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 + 153 154 155 156 157 158 159 160 3585 3586 3587 3588 3589 3590 3591 3592 + 3593 3594 3595 3596 3597 3598 3599 3600 3601 3602 3603 3604 3605 3606 + 3607 3608 3609 3610 3611 3612 3613 3614 3615 3616 3617 3618 3619 3620 + 3621 3622 3623 3624 3625 3626 3627 3628 3629 3630 3631 3632 3633 3634 + 3635 3636 3637 3638 3639 3640 3641 3642 65533 65533 65533 65533 3647 + 3648 3649 3650 3651 3652 3653 3654 3655 3656 3657 3658 3659 3660 3661 + 3662 3663 3664 3665 3666 3667 3668 3669 3670 3671 3672 3673 3674 3675 + 65533 65533 65533 65533)) + + (:iso-8859-13 . + #(0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 + 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 + 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 + 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 + 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 + 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 + 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 + 153 154 155 156 157 158 159 160 8221 162 163 164 8222 166 167 216 169 + 342 171 172 173 174 198 176 177 178 179 8220 181 182 183 248 185 343 187 + 188 189 190 230 260 302 256 262 196 197 280 274 268 201 377 278 290 310 + 298 315 352 323 325 211 332 213 214 215 370 321 346 362 220 379 381 223 + 261 303 257 263 228 229 281 275 269 233 378 279 291 311 299 316 353 324 + 326 243 333 245 246 247 371 322 347 363 252 380 382 8217)) + + (:iso-8859-14 . + #(0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 + 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 + 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 + 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 + 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 + 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 + 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 + 153 154 155 156 157 158 159 160 7682 7683 163 266 267 7690 167 7808 169 + 7810 7691 7922 173 174 376 7710 7711 288 289 7744 7745 182 7766 7809 + 7767 7811 7776 7923 7812 7813 7777 192 193 194 195 196 197 198 199 200 + 201 202 203 204 205 206 207 372 209 210 211 212 213 214 7786 216 217 218 + 219 220 221 374 223 224 225 226 227 228 229 230 231 232 233 234 235 236 + 237 238 239 373 241 242 243 244 245 246 7787 248 249 250 251 252 253 375 + 255)) + + (:iso-8859-15 . + #(0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 + 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 + 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 + 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 + 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 + 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 + 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 + 153 154 155 156 157 158 159 160 161 162 163 8364 165 352 167 353 169 170 + 171 172 173 174 175 176 177 178 179 381 181 182 183 382 185 186 187 338 + 339 376 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 + 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 + 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 + 243 244 245 246 247 248 249 250 251 252 253 254 255)) + + (:iso-8859-16 . + #(0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 + 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 + 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 + 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 + 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 + 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 + 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 + 153 154 155 156 157 158 159 160 260 261 321 8364 8222 352 167 353 169 + 536 171 377 173 378 379 176 177 268 322 381 8221 182 183 382 269 537 187 + 338 339 376 380 192 193 194 258 196 262 198 199 200 201 202 203 204 205 + 206 207 272 323 210 211 212 336 214 346 368 217 218 219 220 280 538 223 + 224 225 226 259 228 263 230 231 232 233 234 235 236 237 238 239 273 324 + 242 243 244 337 246 347 369 249 250 251 252 281 539 255)))) + +(deftest iso-8859-decode-check () + (loop for enc in *iso-8859-charsets* + for octets = (let ((octets (make-ub8-vector 256))) + (dotimes (i 256 octets) + (setf (aref octets i) i))) + for string = (octets-to-string octets :encoding enc) + do (is (equalp (map 'vector #'char-code string) + (cdr (assoc enc *iso-8859-tables*)))))) + +(deftest character-out-of-range.utf-32 () + (signals character-out-of-range + (octets-to-string (ub8v 0 0 #xfe #xff 0 #x11 0 0) + :encoding :utf-32 :errorp t))) + +;;; RT: encoders and decoders were returning bogus values. +(deftest encoder/decoder-retvals (encoding &optional (test-string (coerce "abc" '(simple-array character (*))))) + (let* ((mapping (lookup-mapping babel::*string-vector-mappings* encoding)) + (strlen (length test-string)) + ;; encoding + (octet-precount (funcall (octet-counter mapping) + test-string 0 strlen -1)) + (array (make-array octet-precount :element-type '(unsigned-byte 8))) + (encoded-octet-count (funcall (encoder mapping) + test-string 0 strlen array 0)) + ;; decoding + (string (make-string strlen)) + (char-precount (funcall (code-point-counter mapping) + array 0 octet-precount -1)) + (char-count (funcall (decoder mapping) + array 0 octet-precount string 0))) + (is (= octet-precount encoded-octet-count)) + (is (= char-precount char-count)) + (is (string= test-string string)))) + +(deftest encoder-and-decoder-return-values () + (mapcar 'encoder/decoder-retvals + (remove-if 'ambiguous-encoding-p + (list-character-encodings)))) + +(deftest code-point-sweep (encoding) + (finishes + (dotimes (i char-code-limit) + (let ((char (ignore-errors (code-char i)))) + (when char + (ignore-some-conditions (character-encoding-error) + (string-to-octets (string char) :encoding encoding))))))) + +#+enable-slow-babel-tests +(deftest code-point-sweep-all-encodings () + (mapc #'code-point-sweep (list-character-encodings))) + +(deftest octet-sweep (encoding) + (finishes + (loop for b1 upto #xff do + (loop for b2 upto #xff do + (loop for b3 upto #xff do + (loop for b4 upto #xff do + (ignore-some-conditions (character-decoding-error) + (octets-to-string (ub8v b1 b2 b3 b4) :encoding encoding)))))))) + +#+enable-slow-babel-tests +(deftest octet-sweep-all-encodings () + (mapc #'octet-sweep (list-character-encodings))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/tests/utf-16-with-le-bom.txt b/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/tests/utf-16-with-le-bom.txt new file mode 100644 index 0000000000000000000000000000000000000000..7c40274dc6d53fe89cbf1e73217c93475deedfab GIT binary patch literal 15244 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 JI$xEG0RTxZe*ypi literal 0 HcmV?d00001 diff --git a/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/tests/utf-16.txt b/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/tests/utf-16.txt new file mode 100644 index 0000000000000000000000000000000000000000..ca4a8e6123f7109931ca3126274b3d61f5fde48c GIT binary patch literal 15244 zcmezOpMi@Zlp%z{jX{^efr~?_e7`PaG84?+a7_u2k8HyPc7`z!u88R61 z7!(+ynNBd|G9)r>X2@ph0?TDHlrmjl$YY3QP++iO$Y3a8C}AjIuwu|>&}S$ILp_FM zh8zYE3G$5|Ln1>mgC0XELpFmxLmfjdLpnn?gAs!%gFb^DgMxwxg93vQg8_p9gAs!+ zg8_p%gDzMWR1_dQK5MN0UoUSz(G8r@>>Xi5y6d2MO zAR-_?D=66MtlTrf4%rj=JIFH)YP%EXY!u!%vNA&Fr# zgM#vW<)zB2Aa*J-FjOdUD9SQeF(@c=FjOdWLVY2m%%vp6P@&8X@+I>|1_dQ`1_g#S z%$p$c3~LxP7}kKrH5e3_H!)~})InSivlH%122?vCs;Ems>{Q+kN?QsY5VMi}sVK^z zpwz~opeU-)z@VVi#Gs(40;Q#(v@DcnLihw?4lYu81t@G$Wx;l?frKrp40U)Ae}YpV zG*zL7tErLH!kjllp7qxCFTxW~VYJ?xD7V{RvG&AT`v+a630MBq|g#=rSZJ6r$K^ z#NeUO#Gt^S&7i>G4`L~v0hdf5QGaj@20>G*34MwhV?aQRM~7%aqrGO9dZr36;)J3NBYc_10_00tjK3CN(qpurHPT+9&0pvhpXT&!FIX6ZA8 zDNbO}VF-hVkh$UnZ|0W^T&kT6vZg!zh^v}z!#=?Y2=3JMb7I0MyO zISi=^lHfWET+1rRFrd@$>gWS&G z%uvcu#E=7yKTu5OGZZtFFcdN5gJTs^k18n0Foc7BR>lBo5hgLDLenIuRaC@~3i27c z>C|yE%oKFf!EX0qfV90pEmKe~$L4-e=?RVtaQhF`=E!3x0k;km7}OcIFo4Qc1$5J4 zwo->iHyz}51u1ZAyAL@Eh^Ti4nQrXZdo zSdD@jvWw77N0y_Ujcz)~?F`5*cu+qljUknx1f2RoeH&2Pw*t4Da~M1sYC!I0FktX! zZ~?O{7@QEULN^^DgO8<}i)cx~S)d*cfsz31c1Y_N)UF2Q*?e$Mt&$;^A&DWMAqUjz zQ)L3X9aKwNGMF+bD6C;n0E-bY9iNL4a;gPz7b9A|AXnfrJ&FdUdw?pWhI3}f2m2h< z0|H@Ce+86}K>bHhPY)EEMc{l6>cN3r7|amD;K&ff;Lbdo8Pub5Wl&%UW^hO98A196 zWz6i*)p>#x1od1Xahi)z$-G#;h(UpQGxJ{NlgtO@%bB+^pJY&wXJ9@cU%{Zjd_=y4 zc`t(k^Dg;H<`c}@A+-_n5$65!&lnV#4>KQN-pIUzc_)+)Q+h|)+1Uj_;V`2vtG<^#+J<-ai>0huq)z`U1v3-dvc3z<(c zquO$ud87O_kQ^ws<Kz&w7%?d8V89?Ruq zhrnK#Pvu$Q;c^HXOFNjiGw%h52uL?Ht;oBAOa+JP5pXPSl{a8M1dmNnNEb41X5PcR z5u^^1UYYkZZ(`mpU(9?0l!8HV4RSYw%sZGjg2QT=d^z)O=AFz3m=7@T2bnAH2ueku^b83_P(A{uQHc9=KyCr0 zMdmHwJOT0(JS61zLwy7fEl|D$xr9LhlscLB%a?+D#k?0BYM|D>f_y5-HJ~t-cV#}n zd=lh$<~{NyU>#eTcQPNAuLS3~9UwK3G{C%Hz6@#;$o@*^BOqTx+z$$O=3VmNz~&rg z-UW^iWFK#lF9xgBV^Cn;FCV}R;)8P7e)%x4|5-pej~SG6_dwIr7UumRSIa+RKFqw6 zc`wxF{qlzJus8xz$-Ghi8Q5Q-I4K6lD9E2%K`xP30;>g=W%7Z{2jnZkc?)75C`{q; zCa(@s&%6no9(FTtm9J*r3JM``d_hwu*xk@v0WBXvt_Q^|$S0sO@gOMVn2*R8g2Ni( zhCt>$^4GwAWCW+&gHU-;DDP#^V^EM6VBRcW!=L~P6L5|J!+=-VMrcpz;n{HbL_1M)^SIBl5>UK9d(=J`Pd?(kIWre3PnGynF(~|CI`_yIGVcbZ6mb3lg~BGN+56?qn71%*1mz}q0Z7>_FTlJ9 zltMwNUA~a{Ajr?4um$_25L8k#?}Yk#vpg(Dw}M;_if2%4Lv7l_d`upe3c)ro@0EWB zRtF9_P!0g+wgd9T%%GUw$$S_b1E8=4*JaG$)GcoaPQ82OE8wZ@0JtXG&AgF$6Z2MR z>?y+Hk$J1U8K~?6n+>b`Ksln8`3R^~1NjFjSAlG*0>uIIVdkUEdze9CbsU_|U?tIE zaG43IIiV>6TDQPT8;}{GR1V4?o0zvUZ(`mkUk=H&;B;Nce2{sc{9%yI%ts($f|MFS zem{s=I?0!Vd;!WKDCN{va43UHc2M~RDt)1`Ebj~sTTmTb2`{%msj-+DQX_!E6;$@` z2Zc5$)IhNgDuLw7z&b%?7c@;l@{c?N^Fik0P__f}LFOHhR0Hx8^M2+X@*tBTWhN-K zfkN&GC`W=z5(RlhP;Qrh29HxDe}Ypz)Gp?&;QVnEo);X!xpOD;UQj9oy9|`Oc7kIX zQAWc`cuya6#Y|NR|OK!+<>6uM1MapdfHt;EKQnf$LzC9tvC#xFYaC;JUyCffoXI1s;IZ z2;7C_T!EVccLnYUJOQh?B5(&{uD~_0&dUN91VFkU3cL{j*?&>sg1}`^+6B7`WXCOm z8v?K3uDuO*?{$GI0v81?fcqW>;P$i;*hL_}JQ8>aYi|lX1(m4+AU!w0_P!9f0XF** z*exLOJ0L#_fW-9}6tKILK|$b!z!iZH0ym*9e8`{x)(`USWw5;u1?~zw5dgXLuE0a6 zudfI^6?iCc53KSL*u5ZqpwPVn4sDRn9|(Y4auIC50@%lwprQ9l-~z~h0w8yTbUzTd zBXC9Fk-!ZG1%b;T83xqUp$qmIIF+O5fy5#x{4aprcMTD*5OV}>3EUO9DS$2uY8hbI zAOP|KDAn8+xGV5n02G&yc!1b@7wTJxosR`>F(?Q;1g8X$4?uBw5fspSV*-@6o(O;h;Q3fu;#^Q&OrgM0(ZCl>_nKvTkPfqMcs1RjG;ejtF|KOlEOX0n37b8VopR2t`L z7I78>76%qn7Go9*7DpB*76%p!76%q*7E2Z<7E=~S79R!$7DpCS7E2a)76TSX1_c&d z76S$a77?(lKZ_HKGm9UC0*efbDT^7435zpGp2dO1j>Uw<7AhyjV#i|3;=*DIw#k;o zjl}}2$DYLwlD^T>pALfpixrC1s0HqFxX8Xy|yeCEEeD% zp8|sd3pN+STww^-W6I*hpupk*4lO$tD;5hDOR%d!VQ0*sz~akd#p1|f4^|8E2go*% ze?g`jvDmTLgTu&?#el_zL4n1X#hS&A#gN5-#hS&3#g@em1jg5$!0#g@gC z1?)o>(7ZQljsk@l$P6p685S(&EC%3kwqQ^Isb;Z2G6f<7iW881$ZA2RKwJkh%ag^F z1r#oz__ct#2IOuF78|e(Tox_8@8VMt{FjW>g4Q;Zmp$5LDwD!{YHMGOVdwFsc`YFG~(G%o=f(<@>C^`1fX zuL6AjJ_tN&1S%0gBf+r#ImmWU-3_8abvcOb4Ib4=2an(9GJwYFHNdki&fpn)(ENKb zLn=t{e<*NhmP5Gn6tUGN_}tKAJ(7Ojtv*KG0YhXpBOEL4nVo zL4nVaPlnHfPm)iB&xB8sPmj+K%yZz=;xp&-;M3((}p97yXpF5Q8!6(OO#^=EY z8V7`i9!Nh7^GSi-Daq%+rwBHMosWahjE|j9ozH|%8tgAoxOpJk7{Pvnx`fY(Pmhm- z&xFsL4`hNepDCXbA0wYQpCO+dnDpRN=hNmh~Iv4Fw?DI6TYIzj%I1c!hWp9`NBp9`NVI21u?L6?t% z&j=jLEPUFicJnEN!w(d@pilT?Z2P1g8OA zJ_~RvQR1`Ua|HVzlwLgf9Qj1~82K1Mv4Zd?g2m^|$HnK#r^RQ)rw)!sP)dWv92cJ? zSdVPz&vL@(Cj5N7Ww4(R6%C*sq&fdaq?M!ZHADhe2ic@DQJ2Gg^?&9sFr~0 zMRElf*f;E8Upnx~@oDgJfMcB<63=|{;Pe4XnV^*F!l%vW2@MBPK8XL7`K0)i`HY~k zCJ%NK2cINZR2l3JC4_y*EIt)JS5S=bIrFjbDf6-LdGZ6ifuq7=X%F&=@4BYy*v4mN1kvy#6DnTp0Kx=3` z!K0a=6+56g2T)H3gmI0$gJ#}9rKti#2Dmg#0k4osfrJFumLl*ddNM-^c>WR8#)XZA z=739I$S5gf3>78=Ds@3FfXwNESO~WkGh~2gTXVoGoItabAUA-_N@oC-*eML4RZ5^W zN}zQ`5EH@W8bb|etqItjp!sZ&iy-sdh>+4_&;*C1D|nPP6FfhP-d_v=j|79lwTK}J zTxWp72Q&)~8ue9RaAe4Z+5ws!P+-UbhYM&GLLx&tLn>mFSI9s}TIelH^l`tp> zB?!3*NeC+l&4sBJ<`D*&@>+;PC`G7{K|#n-NLE-?XflI>&;+5gFjYbygc!iOMTK~U zBpDQhT!m5?6oit6-U=%SD}!C5EK~|oAoqU_X2oI?bRUR3IcFR18;RBvc@zAHEftz7%nB1@P!Q%6(tw5|$ae)opM^dM z=_2_M4RDJ)+IEfq2q z;uewxrA=WDaCl1ytp=O0Ku8Ykf(20V(?YsJtKoJQ2u&5{7UBcPM1im;H0F7Q%s_q; z_JpfDA@o_8RR|R7(%_Ix5@G}SL0CgbSI87BzCfr{h+D`2DHVdkT~~+|q)sS7*jGqf z$QG=US7loq-Lks zL8ytV7!<&=PsKoM1|j8;27^BXr1WwH&;5hSE>NikDjUneEl}6s1;kxkPKdR z2`cMAr5mWc0nI;xTF;R2C(zt7s1#0QNCB5f>I@#>H5|zdPgVJ8K@jBXGjIFl1c&B8|bAhsCEel&v}7XUVu!} zV*sr{1o;5u>RhnyJQVkV=H@dQV6_Fv4utzaC1)nMZvfH_@-xJZpmuv6cq|X39#n#Z zd=GOm$h{C(B2>d%1ydUgb_vLJkka0X0aPD=Ryu>$Lc_=LG<-A|HPkf(85A^ZG#E96 zKsB_6uZD~UyM~~KrG|k9AA^EMvWBPz54g@yU{FBFGAL+RX)uCSNNNabFltDG^lQjz zh%zW>Flz{ENNb3I)o^K8Y8WvnXjE!ggKgph>yZVklhiQQVAha>l>Zur8jKop8iE?? z8rBR78jKpu8paxO3f_1|}Um9#8$aYl?ehpC#Sq23S1C2zmU!*kz!LH}l z5Y-R|hpDWFrG}-3h=w#c%mkq}DQbvn@PSQ*#2>$gDmdg}p(+VB4P=L$hNuRp2LK7v zPz`nskSILOz{4CAf1uO@O&eglL3~EAy`V4<*HF;_`34mJ2orrZL^LEd#26Gbyr3#& zH4MOR;RUBMknbRFv z(;PVFkW(kWhKz=s2A2kxhN=cTI6r`FLiP(JZ9+l;m!BYh;ML&LPzJjY6pE1C2Ff3x z^emzQ^1XJ2t#-XTY}>e z>Q)Uw4ITys4SsNnC-o1hNOFlo4quQ zHDonFzJir)Aot6HLj{~e!2Yb%FowDr^71pa!o7zXr(dkkrJe!LGrsVF{K4mugU(sFr^i5WOSN{tD2_Al+v)M5wK4WPBJpdJ)NPKm*hL4g4@Mg-amQOr;R-m3tTcLwVM ztL4BiYr489D04E_uO41o+m z44{=!p$uUR;S3QBkql7`3Jm%T1`LJ_MhwObCJd$wW(?*G77Wl5fdSMfN(Q$K(iqag zZIUd8Y=#_ge-X55w2%Q3dZi3y4CM?J43!L33qRVJ{T(^Ugh!y#)nRhd+SR0CAAR0C8);UdAR462T*460#J5oWMCPGEDG z!8VGkI;*;xm`sFtbPsFtW!sd}qcs4A%1sA@1MsLHB(tEz%jg0N~gg96lbg&@}< zxsOS;2<&zyxci_h>Qw`wb~Ax!2nLa$wWc7os>}=ua5c;z8P$5Q9K?ORs;;VTppXLF z586SdpjyeGpen9vt}4x-pemwjp(+8A17X!3up2PLFF`etK|!^cK|wW66*T6qpem!9 z1k%Bvpc=2L0%EDksM@G9Kru`tTa`f-6k6F(HOi{?s&%S1sx_+is-XQR3aX;2(yC&r zQXmr`Sd~YWMU@2cJ7cxF{)1-W09n?XUf7f<*Vg5{_Yezi#9H&Jz>>Lk@ks*_bG zt9Gb%Fes>k+d8Uj3<_ZP`GZ`o%Fdtwc3&SfKLo0Zs4}RgsxqibfZ_;j9%y}TifVvr zEGUk^A`#H^77Z7PRAo?gP-Re!fr>DL%>jj=1Sp;v6jVubPe0T>AiD!pGr{>2w1*QE z@1Rx1CgA)Dj(_NSV~7Z-%v8W4A`Z@()?gAmTcA2!wMBKB>TJ~p)j6P$0H-J)RUc5A x0*8;ds;{aqIHhre_WU!JMXRc%n6p*mBwMRh&{7XUSPe*ypi literal 0 HcmV?d00001 diff --git a/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/tests/utf-16.txt-utf8 b/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/tests/utf-16.txt-utf8 new file mode 100644 index 0000000..4363f27 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/tests/utf-16.txt-utf8 @@ -0,0 +1,212 @@ + +UTF-8 encoded sample plain-text file +‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾ + +Markus Kuhn [ˈmaʳkÊŠs kuËn] — 2002-07-25 + + +The ASCII compatible UTF-8 encoding used in this plain-text file +is defined in Unicode, ISO 10646-1, and RFC 2279. + + +Using Unicode/UTF-8, you can write in emails and source code things such as + +Mathematics and sciences: + + ∮ Eâ‹…da = Q, n → ∞, ∑ f(i) = ∠g(i), ⎧⎡⎛┌─────â”⎞⎤⎫ + ⎪⎢⎜│a²+b³ ⎟⎥⎪ + ∀x∈â„: ⌈x⌉ = −⌊−x⌋, α ∧ ¬β = ¬(¬α ∨ β), ⎪⎢⎜│───── ⎟⎥⎪ + ⎪⎢⎜⎷ c₈ ⎟⎥⎪ + â„• ⊆ â„•â‚€ ⊂ ℤ ⊂ ℚ ⊂ ℠⊂ â„‚, ⎨⎢⎜ ⎟⎥⎬ + ⎪⎢⎜ ∞ ⎟⎥⎪ + ⊥ < a ≠ b ≡ c ≤ d ≪ ⊤ ⇒ (⟦A⟧ ⇔ ⟪B⟫), ⎪⎢⎜ ⎲ ⎟⎥⎪ + ⎪⎢⎜ ⎳aâ±-bâ±âŽŸâŽ¥âŽª + 2Hâ‚‚ + Oâ‚‚ ⇌ 2Hâ‚‚O, R = 4.7 kΩ, ⌀ 200 mm ⎩⎣âŽi=1 ⎠⎦⎭ + +Linguistics and dictionaries: + + ði ıntəˈnæʃənÉ™l fəˈnÉ›tık É™soÊŠsiˈeıʃn + Y [ˈÊpsilÉ”n], Yen [jÉ›n], Yoga [ˈjoËgÉ‘] + +APL: + + ((Vâ³V)=â³â´V)/Vâ†,V ⌷â†â³â†’â´âˆ†âˆ‡âŠƒâ€¾âŽâ•⌈ + +Nicer typography in plain text files: + + â•”â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•— + â•‘ â•‘ + â•‘ • ‘single’ and “double†quotes â•‘ + â•‘ â•‘ + â•‘ • Curly apostrophes: “We’ve been here†║ + â•‘ â•‘ + â•‘ • Latin-1 apostrophe and accents: '´` â•‘ + â•‘ â•‘ + â•‘ • ‚deutsche‘ „Anführungszeichen“ â•‘ + â•‘ â•‘ + â•‘ • †, ‡, ‰, •, 3–4, —, −5/+5, â„¢, … â•‘ + â•‘ â•‘ + â•‘ • ASCII safety test: 1lI|, 0OD, 8B â•‘ + â•‘ ╭─────────╮ â•‘ + â•‘ • the euro symbol: │ 14.95 € │ â•‘ + â•‘ ╰─────────╯ â•‘ + ╚â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â• + +Combining characters: + + STARGΛ̊TE SG-1, a = v̇ = r̈, a⃑ ⊥ b⃑ + +Greek (in Polytonic): + + The Greek anthem: + + Σὲ γνωÏίζω ἀπὸ τὴν κόψη + τοῦ σπαθιοῦ τὴν Ï„ÏομεÏá½µ, + σὲ γνωÏίζω ἀπὸ τὴν ὄψη + ποὺ μὲ βία μετÏάει τὴ γῆ. + + ᾿Απ᾿ τὰ κόκκαλα βγαλμένη + τῶν ῾Ελλήνων τὰ ἱεÏá½± + καὶ σὰν Ï€Ïῶτα ἀνδÏειωμένη + χαῖÏε, ὦ χαῖÏε, ᾿ΕλευθεÏιά! + + From a speech of Demosthenes in the 4th century BC: + + Οá½Ï‡á½¶ ταá½Ï„á½° παÏίσταταί μοι γιγνώσκειν, ὦ ἄνδÏες ᾿Αθηναῖοι, + ὅταν τ᾿ εἰς τὰ Ï€Ïάγματα ἀποβλέψω καὶ ὅταν Ï€Ïὸς τοὺς + λόγους οὓς ἀκούω· τοὺς μὲν Î³á½°Ï Î»á½¹Î³Î¿Ï…Ï‚ πεÏá½¶ τοῦ + τιμωÏήσασθαι Φίλιππον á½Ïá¿¶ γιγνομένους, τὰ δὲ Ï€Ïάγματ᾿ + εἰς τοῦτο Ï€Ïοήκοντα, ὥσθ᾿ ὅπως μὴ πεισόμεθ᾿ αá½Ï„οὶ + Ï€ÏότεÏον κακῶς σκέψασθαι δέον. οá½Î´á½³Î½ οὖν ἄλλο μοι δοκοῦσιν + οἱ τὰ τοιαῦτα λέγοντες á¼¢ τὴν ὑπόθεσιν, πεÏá½¶ á¼§Ï‚ βουλεύεσθαι, + οá½Ï‡á½¶ τὴν οὖσαν παÏιστάντες ὑμῖν á¼Î¼Î±Ïτάνειν. á¼Î³á½¼ δέ, ὅτι μέν + ποτ᾿ á¼Î¾á¿†Î½ τῇ πόλει καὶ τὰ αὑτῆς ἔχειν ἀσφαλῶς καὶ Φίλιππον + τιμωÏήσασθαι, καὶ μάλ᾿ ἀκÏιβῶς οἶδα· á¼Ï€á¾¿ á¼Î¼Î¿á¿¦ γάÏ, οὠπάλαι + γέγονεν ταῦτ᾿ ἀμφότεÏα· νῦν μέντοι πέπεισμαι τοῦθ᾿ ἱκανὸν + Ï€Ïολαβεῖν ἡμῖν εἶναι τὴν Ï€Ïώτην, ὅπως τοὺς συμμάχους + σώσομεν. á¼á½°Î½ Î³á½°Ï Ï„Î¿á¿¦Ï„Î¿ βεβαίως ὑπάÏξῃ, τότε καὶ πεÏá½¶ τοῦ + τίνα τιμωÏήσεταί τις καὶ ὃν Ï„Ïόπον á¼Î¾á½³ÏƒÏ„αι σκοπεῖν· Ï€Ïὶν δὲ + τὴν á¼€Ïχὴν á½€Ïθῶς ὑποθέσθαι, μάταιον ἡγοῦμαι πεÏá½¶ τῆς + τελευτῆς á½Î½Ï„ινοῦν ποιεῖσθαι λόγον. + + Δημοσθένους, Γ´ ᾿Ολυνθιακὸς + +Georgian: + + From a Unicode conference invitation: + + გთხáƒáƒ•თ áƒáƒ®áƒšáƒáƒ•ე გáƒáƒ˜áƒáƒ áƒáƒ— რეგისტრáƒáƒªáƒ˜áƒ Unicode-ის მეáƒáƒ—ე სáƒáƒ”რთáƒáƒ¨áƒáƒ áƒ˜áƒ¡áƒ + კáƒáƒœáƒ¤áƒ”რენციáƒáƒ–ე დáƒáƒ¡áƒáƒ¡áƒ¬áƒ áƒ”ბáƒáƒ“, რáƒáƒ›áƒ”ლიც გáƒáƒ˜áƒ›áƒáƒ áƒ—ებრ10-12 მáƒáƒ áƒ¢áƒ¡, + ქ. მáƒáƒ˜áƒœáƒªáƒ¨áƒ˜, გერმáƒáƒœáƒ˜áƒáƒ¨áƒ˜. კáƒáƒœáƒ¤áƒ”რენცირშეჰკრებს ერთáƒáƒ“ მსáƒáƒ¤áƒšáƒ˜áƒáƒ¡ + ექსპერტებს ისეთ დáƒáƒ áƒ’ებში რáƒáƒ’áƒáƒ áƒ˜áƒªáƒáƒ ინტერნეტი დრUnicode-ი, + ინტერნáƒáƒªáƒ˜áƒáƒœáƒáƒšáƒ˜áƒ–áƒáƒªáƒ˜áƒ დრლáƒáƒ™áƒáƒšáƒ˜áƒ–áƒáƒªáƒ˜áƒ, Unicode-ის გáƒáƒ›áƒáƒ§áƒ”ნებრ+ áƒáƒžáƒ”რáƒáƒªáƒ˜áƒ£áƒš სისტემებსáƒ, დრგáƒáƒ›áƒáƒ§áƒ”ნებით პრáƒáƒ’რáƒáƒ›áƒ”ბში, შრიფტებში, + ტექსტების დáƒáƒ›áƒ£áƒ¨áƒáƒ•ებáƒáƒ¡áƒ დრმრáƒáƒ•áƒáƒšáƒ”ნáƒáƒ•áƒáƒœ კáƒáƒ›áƒžáƒ˜áƒ£áƒ¢áƒ”რულ სისტემებში. + +Russian: + + From a Unicode conference invitation: + + ЗарегиÑтрируйтеÑÑŒ ÑÐµÐ¹Ñ‡Ð°Ñ Ð½Ð° ДеÑÑтую Международную Конференцию по + Unicode, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ ÑоÑтоитÑÑ 10-12 марта 1997 года в Майнце в Германии. + ÐšÐ¾Ð½Ñ„ÐµÑ€ÐµÐ½Ñ†Ð¸Ñ Ñоберет широкий круг ÑкÑпертов по вопроÑам глобального + Интернета и Unicode, локализации и интернационализации, воплощению и + применению Unicode в различных операционных ÑиÑтемах и программных + приложениÑÑ…, шрифтах, верÑтке и многоÑзычных компьютерных ÑиÑтемах. + +Thai (UCS Level 2): + + Excerpt from a poetry on The Romance of The Three Kingdoms (a Chinese + classic 'San Gua'): + + [----------------------------|------------------------] + ๠à¹à¸œà¹ˆà¸™à¸”ินฮั่นเสื่อมโทรมà¹à¸ªà¸™à¸ªà¸±à¸‡à¹€à¸§à¸Š พระปà¸à¹€à¸à¸¨à¸à¸­à¸‡à¸šà¸¹à¹Šà¸à¸¹à¹‰à¸‚ึ้นใหม่ + สิบสองà¸à¸©à¸±à¸•ริย์à¸à¹ˆà¸­à¸™à¸«à¸™à¹‰à¸²à¹à¸¥à¸–ัดไป สององค์ไซร้โง่เขลาเบาปัà¸à¸à¸² + ทรงนับถือขันทีเป็นที่พึ่ง บ้านเมืองจึงวิปริตเป็นนัà¸à¸«à¸™à¸² + โฮจิ๋นเรียà¸à¸—ัพทั่วหัวเมืองมา หมายจะฆ่ามดชั่วตัวสำคัภ+ เหมือนขับไสไล่เสือจาà¸à¹€à¸„หา รับหมาป่าเข้ามาเลยอาสัภ+ à¸à¹ˆà¸²à¸¢à¸­à¹‰à¸­à¸‡à¸­à¸¸à¹‰à¸™à¸¢à¸¸à¹à¸¢à¸à¹ƒà¸«à¹‰à¹à¸•à¸à¸à¸±à¸™ ใช้สาวนั้นเป็นชนวนชื่นชวนใจ + พลันลิฉุยà¸à¸¸à¸¢à¸à¸µà¸à¸¥à¸±à¸šà¸à¹ˆà¸­à¹€à¸«à¸•ุ ช่างอาเพศจริงหนาฟ้าร้องไห้ + ต้องรบราฆ่าฟันจนบรรลัย ฤๅหาใครค้ำชูà¸à¸¹à¹‰à¸šà¸£à¸£à¸¥à¸±à¸‡à¸à¹Œ ฯ + + (The above is a two-column text. If combining characters are handled + correctly, the lines of the second column should be aligned with the + | character above.) + +Ethiopian: + + Proverbs in the Amharic language: + + ሰማይ አይታረስ ንጉሥ አይከሰስᢠ+ ብላ ካለአእንደአባቴ በቆመጠáŠá¢ + ጌጥ ያለቤቱ á‰áˆáŒ¥áŠ“ áŠá‹á¢ + ደሀ በሕáˆáˆ™ ቅቤ ባይጠጣ ንጣት በገደለá‹á¢ + የአá ወለáˆá‰³ በቅቤ አይታሽáˆá¢ + አይጥ በበላ ዳዋ ተመታᢠ+ ሲተረጉሙ ይደረáŒáˆ™á¢ + ቀስ በቀስᥠዕንá‰áˆ‹áˆ በእáŒáˆ© ይሄዳáˆá¢ + ድር ቢያብር አንበሳ ያስርᢠ+ ሰዠእንደቤቱ እንጅ እንደ ጉረቤቱ አይተዳደርáˆá¢ + እáŒá‹œáˆ­ የከáˆá‰°á‹áŠ• ጉሮሮ ሳይዘጋዠአይድርáˆá¢ + የጎረቤት ሌባᥠቢያዩት ይስቅ ባያዩት ያጠáˆá‰…ᢠ+ ሥራ ከመáታት áˆáŒ„ን ላá‹á‰³á‰µá¢ + ዓባይ ማደሪያ የለá‹á¥ áŒáŠ•á‹µ ይዞ ይዞራáˆá¢ + የእስላሠአገሩ መካ የአሞራ አገሩ ዋርካᢠ+ ተንጋሎ ቢተበተመáˆáˆ¶ ባá‰á¢ + ወዳጅህ ማር ቢሆን ጨርስህ አትላሰá‹á¢ + እáŒáˆ­áˆ…ን በáራሽህ áˆáŠ­ ዘርጋᢠ+ +Runes: + + ᚻᛖ ᚳᚹᚫᚦ ᚦᚫᛠᚻᛖ ᛒᚢᛞᛖ ᚩᚾ ᚦᚫᛗ ᛚᚪᚾᛞᛖ ᚾᚩᚱᚦᚹᛖᚪᚱᛞᚢᛗ áš¹á›áš¦ ᚦᚪ ᚹᛖᛥᚫ + + (Old English, which transcribed into Latin reads 'He cwaeth that he + bude thaem lande northweardum with tha Westsae.' and means 'He said + that he lived in the northern land near the Western Sea.') + +Braille: + + ⡌â â §â ‘ â ¼â â ’ â¡â œâ ‡â ‘⠹⠰⠎ ⡣⠕⠌ + + â¡â œâ ‡â ‘â ¹ â ºâ â Ž ⠙⠑â â ™â ’ â žâ • ⠃⠑⠛⠔ ⠺⠊⠹⠲ ⡹⠻⠑ â Šâ Ž â â • ⠙⠳⠃⠞ + â ±â â žâ ‘â §â » â â ƒâ ³â ž â ¹â â žâ ² ⡹⠑ ⠗⠑⠛⠊⠌⠻ â •â ‹ ⠙⠊⠎ ⠃⠥⠗⠊â â ‡ â ºâ â Ž + â Žâ Šâ ›â â « ⠃⠹ ⠹⠑ ⠊⠇⠻⠛⠹â â â â ‚ ⠹⠑ ⠊⠇⠻⠅⠂ ⠹⠑ â ¥â â ™â »â žâ â …⠻⠂ + â â â ™ ⠹⠑ â ¡â Šâ ‘â ‹ â â ³â —â â »â ² ⡎⠊⠗⠕⠕⠛⠑ â Žâ Šâ ›â â « â Šâ žâ ² â¡â â ™ + ⡎⠊⠗⠕⠕⠛⠑⠰⠎ â â â â ‘ â ºâ â Ž ⠛⠕⠕⠙ â ¥â â •â  â °â¡¡â â â ›â ‘â ‚ â ‹â •â — â â â ¹â ¹â ”â › ⠙⠑ + â ¡â •â Žâ ‘ â žâ • â â ¥â ž ⠙⠊⠎ â ™â â â ™ â žâ •â ² + + ⡕⠇⠙ â¡â œâ ‡â ‘â ¹ â ºâ â Ž â â Ž ⠙⠑â â ™ â â Ž â  â ™â •â •â —â ¤â â â Šâ ‡â ² + + â¡â ”⠙⠖ ⡊ ⠙⠕â â °â ž â â ‘â â  â žâ • â Žâ â ¹ â ¹â â ž ⡊ â …â â ªâ ‚ â •â ‹ â â ¹ + â ªâ  â …â â ªâ ‡â «â ›â ‘â ‚ â ±â â ž ⠹⠻⠑ â Šâ Ž â â œâ žâ Šâ Šâ ¥â ‡â œâ ‡â ¹ ⠙⠑â â ™ â â ƒâ ³â ž + â  â ™â •â •â —â ¤â â â Šâ ‡â ² ⡊ â â Šâ £â ž â ™â â §â ‘ ⠃⠑⠲ ⠔⠊⠇⠔⠫⠂ â â ¹â Žâ ‘⠇⠋⠂ â žâ • + ⠗⠑⠛⠜⠙ â  â Šâ •â ‹â ‹â ”â ¤â â â Šâ ‡ â â Ž ⠹⠑ ⠙⠑â â ™â ‘â Œ â â Šâ ‘â Šâ ‘ â •â ‹ â Šâ —â •â â â •â â ›â »â ¹ + â ” ⠹⠑ â žâ —â â ™â ‘â ² ⡃⠥⠞ ⠹⠑ â ºâ Šâ Žâ ™â •â  â •â ‹ ⠳⠗ â â â Šâ ‘⠌⠕⠗⠎ + â Šâ Ž â ” ⠹⠑ â Žâ Šâ â Šâ ‡â ‘â † â â â ™ â â ¹ â ¥â â ™â â ‡â ‡â ªâ « â ™â â â ™â Ž + â ©â â ‡â ‡ â â •â ž ⠙⠊⠌⠥⠗⠃ â Šâ žâ ‚ â •â — ⠹⠑ ⡊⠳â â žâ —⠹⠰⠎ ⠙⠕â â ‘ â ‹â •â —â ² ⡹⠳ + ⠺⠊⠇⠇ ⠹⠻⠑⠋⠕⠗⠑ â â »â â Šâ ž â â ‘ â žâ • â —â ‘â â ‘â â žâ ‚ â ‘â â â ™â â žâ Šâ Šâ â ‡â ‡â ¹â ‚ â ¹â â ž + â¡â œâ ‡â ‘â ¹ â ºâ â Ž â â Ž ⠙⠑â â ™ â â Ž â  â ™â •â •â —â ¤â â â Šâ ‡â ² + + (The first couple of paragraphs of "A Christmas Carol" by Dickens) + +Compact font selection example text: + + ABCDEFGHIJKLMNOPQRSTUVWXYZ /0123456789 + abcdefghijklmnopqrstuvwxyz £©µÀÆÖÞßéöÿ + –—‘“â€â€žâ€ â€¢â€¦â€°â„¢Å“ŠŸž€ ΑΒΓΔΩαβγδω ÐБВГДабвгд + ∀∂∈â„∧∪≡∞ ↑↗↨↻⇣ â”┼╔╘░►☺♀ ï¬ï¿½â‘€â‚‚ἠḂӥẄÉËâŽ×Աრ+ +Greetings in various languages: + + Hello world, ΚαλημέÏα κόσμε, コンニãƒãƒ + +Box drawing alignment tests: â–ˆ + â–‰ + â•”â•â•╦â•â•â•— ┌──┬──┠╭──┬──╮ ╭──┬──╮ â”â”â”┳â”â”┓ ┎┒â”┑ â•· â•» â”┯┓ ┌┰┠▊ ╱╲╱╲╳╳╳ + ║┌─╨─â”â•‘ │╔â•â•§â•╗│ │╒â•╪â•╕│ │╓─â•─╖│ ┃┌─╂─â”┃ ┗╃╄┙ ╶┼╴╺╋╸┠┼┨ â”╋┥ â–‹ ╲╱╲╱╳╳╳ + ║│╲ ╱│║ │║ ║│ ││ │ ││ │║ ┃ ║│ ┃│ â•¿ │┃ â”╅╆┓ ╵ ╹ â”—â”·â”› └┸┘ â–Œ ╱╲╱╲╳╳╳ + â• â•¡ ╳ ╞╣ ├╢ ╟┤ ├┼─┼─┼┤ ├╫─╂─╫┤ ┣┿╾┼╼┿┫ ┕┛┖┚ ┌┄┄┠╎ â”┅┅┓ ┋ ■╲╱╲╱╳╳╳ + ║│╱ ╲│║ │║ ║│ ││ │ ││ │║ ┃ ║│ ┃│ ╽ │┃ ░░▒▒▓▓██ ┊ ┆ ╎ ╠┇ ┋ â–Ž + ║└─╥─┘║ │╚â•╤â•â•│ │╘â•╪â•╛│ │╙─╀─╜│ ┃└─╂─┘┃ ░░▒▒▓▓██ ┊ ┆ ╎ ╠┇ ┋ â– + ╚â•â•â•©â•â•╠└──┴──┘ ╰──┴──╯ ╰──┴──╯ â”—â”â”â”»â”â”â”› ▗▄▖▛▀▜ └╌╌┘ ╎ â”—â•â•â”› ┋ â–▂▃▄▅▆▇█ + â–▀▘▙▄▟ diff --git a/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/tests/utf-32-with-le-bom.txt b/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/tests/utf-32-with-le-bom.txt new file mode 100644 index 0000000000000000000000000000000000000000..815e37b99cac82fba3f54a47348f6bd192d58947 GIT binary patch literal 30488 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 HL(>HS$N_%> literal 0 HcmV?d00001 diff --git a/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/tests/utf-32.txt b/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/tests/utf-32.txt new file mode 100644 index 0000000000000000000000000000000000000000..fc2824ce9ee91fafd21bd861e1a057ad823cc9b3 GIT binary patch literal 30488 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 literal 0 HcmV?d00001 diff --git a/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/tests/utf-32.txt-utf8 b/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/tests/utf-32.txt-utf8 new file mode 100644 index 0000000..4363f27 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/tests/utf-32.txt-utf8 @@ -0,0 +1,212 @@ + +UTF-8 encoded sample plain-text file +‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾ + +Markus Kuhn [ˈmaʳkÊŠs kuËn] — 2002-07-25 + + +The ASCII compatible UTF-8 encoding used in this plain-text file +is defined in Unicode, ISO 10646-1, and RFC 2279. + + +Using Unicode/UTF-8, you can write in emails and source code things such as + +Mathematics and sciences: + + ∮ Eâ‹…da = Q, n → ∞, ∑ f(i) = ∠g(i), ⎧⎡⎛┌─────â”⎞⎤⎫ + ⎪⎢⎜│a²+b³ ⎟⎥⎪ + ∀x∈â„: ⌈x⌉ = −⌊−x⌋, α ∧ ¬β = ¬(¬α ∨ β), ⎪⎢⎜│───── ⎟⎥⎪ + ⎪⎢⎜⎷ c₈ ⎟⎥⎪ + â„• ⊆ â„•â‚€ ⊂ ℤ ⊂ ℚ ⊂ ℠⊂ â„‚, ⎨⎢⎜ ⎟⎥⎬ + ⎪⎢⎜ ∞ ⎟⎥⎪ + ⊥ < a ≠ b ≡ c ≤ d ≪ ⊤ ⇒ (⟦A⟧ ⇔ ⟪B⟫), ⎪⎢⎜ ⎲ ⎟⎥⎪ + ⎪⎢⎜ ⎳aâ±-bâ±âŽŸâŽ¥âŽª + 2Hâ‚‚ + Oâ‚‚ ⇌ 2Hâ‚‚O, R = 4.7 kΩ, ⌀ 200 mm ⎩⎣âŽi=1 ⎠⎦⎭ + +Linguistics and dictionaries: + + ði ıntəˈnæʃənÉ™l fəˈnÉ›tık É™soÊŠsiˈeıʃn + Y [ˈÊpsilÉ”n], Yen [jÉ›n], Yoga [ˈjoËgÉ‘] + +APL: + + ((Vâ³V)=â³â´V)/Vâ†,V ⌷â†â³â†’â´âˆ†âˆ‡âŠƒâ€¾âŽâ•⌈ + +Nicer typography in plain text files: + + â•”â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•— + â•‘ â•‘ + â•‘ • ‘single’ and “double†quotes â•‘ + â•‘ â•‘ + â•‘ • Curly apostrophes: “We’ve been here†║ + â•‘ â•‘ + â•‘ • Latin-1 apostrophe and accents: '´` â•‘ + â•‘ â•‘ + â•‘ • ‚deutsche‘ „Anführungszeichen“ â•‘ + â•‘ â•‘ + â•‘ • †, ‡, ‰, •, 3–4, —, −5/+5, â„¢, … â•‘ + â•‘ â•‘ + â•‘ • ASCII safety test: 1lI|, 0OD, 8B â•‘ + â•‘ ╭─────────╮ â•‘ + â•‘ • the euro symbol: │ 14.95 € │ â•‘ + â•‘ ╰─────────╯ â•‘ + ╚â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â• + +Combining characters: + + STARGΛ̊TE SG-1, a = v̇ = r̈, a⃑ ⊥ b⃑ + +Greek (in Polytonic): + + The Greek anthem: + + Σὲ γνωÏίζω ἀπὸ τὴν κόψη + τοῦ σπαθιοῦ τὴν Ï„ÏομεÏá½µ, + σὲ γνωÏίζω ἀπὸ τὴν ὄψη + ποὺ μὲ βία μετÏάει τὴ γῆ. + + ᾿Απ᾿ τὰ κόκκαλα βγαλμένη + τῶν ῾Ελλήνων τὰ ἱεÏá½± + καὶ σὰν Ï€Ïῶτα ἀνδÏειωμένη + χαῖÏε, ὦ χαῖÏε, ᾿ΕλευθεÏιά! + + From a speech of Demosthenes in the 4th century BC: + + Οá½Ï‡á½¶ ταá½Ï„á½° παÏίσταταί μοι γιγνώσκειν, ὦ ἄνδÏες ᾿Αθηναῖοι, + ὅταν τ᾿ εἰς τὰ Ï€Ïάγματα ἀποβλέψω καὶ ὅταν Ï€Ïὸς τοὺς + λόγους οὓς ἀκούω· τοὺς μὲν Î³á½°Ï Î»á½¹Î³Î¿Ï…Ï‚ πεÏá½¶ τοῦ + τιμωÏήσασθαι Φίλιππον á½Ïá¿¶ γιγνομένους, τὰ δὲ Ï€Ïάγματ᾿ + εἰς τοῦτο Ï€Ïοήκοντα, ὥσθ᾿ ὅπως μὴ πεισόμεθ᾿ αá½Ï„οὶ + Ï€ÏότεÏον κακῶς σκέψασθαι δέον. οá½Î´á½³Î½ οὖν ἄλλο μοι δοκοῦσιν + οἱ τὰ τοιαῦτα λέγοντες á¼¢ τὴν ὑπόθεσιν, πεÏá½¶ á¼§Ï‚ βουλεύεσθαι, + οá½Ï‡á½¶ τὴν οὖσαν παÏιστάντες ὑμῖν á¼Î¼Î±Ïτάνειν. á¼Î³á½¼ δέ, ὅτι μέν + ποτ᾿ á¼Î¾á¿†Î½ τῇ πόλει καὶ τὰ αὑτῆς ἔχειν ἀσφαλῶς καὶ Φίλιππον + τιμωÏήσασθαι, καὶ μάλ᾿ ἀκÏιβῶς οἶδα· á¼Ï€á¾¿ á¼Î¼Î¿á¿¦ γάÏ, οὠπάλαι + γέγονεν ταῦτ᾿ ἀμφότεÏα· νῦν μέντοι πέπεισμαι τοῦθ᾿ ἱκανὸν + Ï€Ïολαβεῖν ἡμῖν εἶναι τὴν Ï€Ïώτην, ὅπως τοὺς συμμάχους + σώσομεν. á¼á½°Î½ Î³á½°Ï Ï„Î¿á¿¦Ï„Î¿ βεβαίως ὑπάÏξῃ, τότε καὶ πεÏá½¶ τοῦ + τίνα τιμωÏήσεταί τις καὶ ὃν Ï„Ïόπον á¼Î¾á½³ÏƒÏ„αι σκοπεῖν· Ï€Ïὶν δὲ + τὴν á¼€Ïχὴν á½€Ïθῶς ὑποθέσθαι, μάταιον ἡγοῦμαι πεÏá½¶ τῆς + τελευτῆς á½Î½Ï„ινοῦν ποιεῖσθαι λόγον. + + Δημοσθένους, Γ´ ᾿Ολυνθιακὸς + +Georgian: + + From a Unicode conference invitation: + + გთხáƒáƒ•თ áƒáƒ®áƒšáƒáƒ•ე გáƒáƒ˜áƒáƒ áƒáƒ— რეგისტრáƒáƒªáƒ˜áƒ Unicode-ის მეáƒáƒ—ე სáƒáƒ”რთáƒáƒ¨áƒáƒ áƒ˜áƒ¡áƒ + კáƒáƒœáƒ¤áƒ”რენციáƒáƒ–ე დáƒáƒ¡áƒáƒ¡áƒ¬áƒ áƒ”ბáƒáƒ“, რáƒáƒ›áƒ”ლიც გáƒáƒ˜áƒ›áƒáƒ áƒ—ებრ10-12 მáƒáƒ áƒ¢áƒ¡, + ქ. მáƒáƒ˜áƒœáƒªáƒ¨áƒ˜, გერმáƒáƒœáƒ˜áƒáƒ¨áƒ˜. კáƒáƒœáƒ¤áƒ”რენცირშეჰკრებს ერთáƒáƒ“ მსáƒáƒ¤áƒšáƒ˜áƒáƒ¡ + ექსპერტებს ისეთ დáƒáƒ áƒ’ებში რáƒáƒ’áƒáƒ áƒ˜áƒªáƒáƒ ინტერნეტი დრUnicode-ი, + ინტერნáƒáƒªáƒ˜áƒáƒœáƒáƒšáƒ˜áƒ–áƒáƒªáƒ˜áƒ დრლáƒáƒ™áƒáƒšáƒ˜áƒ–áƒáƒªáƒ˜áƒ, Unicode-ის გáƒáƒ›áƒáƒ§áƒ”ნებრ+ áƒáƒžáƒ”რáƒáƒªáƒ˜áƒ£áƒš სისტემებსáƒ, დრგáƒáƒ›áƒáƒ§áƒ”ნებით პრáƒáƒ’რáƒáƒ›áƒ”ბში, შრიფტებში, + ტექსტების დáƒáƒ›áƒ£áƒ¨áƒáƒ•ებáƒáƒ¡áƒ დრმრáƒáƒ•áƒáƒšáƒ”ნáƒáƒ•áƒáƒœ კáƒáƒ›áƒžáƒ˜áƒ£áƒ¢áƒ”რულ სისტემებში. + +Russian: + + From a Unicode conference invitation: + + ЗарегиÑтрируйтеÑÑŒ ÑÐµÐ¹Ñ‡Ð°Ñ Ð½Ð° ДеÑÑтую Международную Конференцию по + Unicode, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ ÑоÑтоитÑÑ 10-12 марта 1997 года в Майнце в Германии. + ÐšÐ¾Ð½Ñ„ÐµÑ€ÐµÐ½Ñ†Ð¸Ñ Ñоберет широкий круг ÑкÑпертов по вопроÑам глобального + Интернета и Unicode, локализации и интернационализации, воплощению и + применению Unicode в различных операционных ÑиÑтемах и программных + приложениÑÑ…, шрифтах, верÑтке и многоÑзычных компьютерных ÑиÑтемах. + +Thai (UCS Level 2): + + Excerpt from a poetry on The Romance of The Three Kingdoms (a Chinese + classic 'San Gua'): + + [----------------------------|------------------------] + ๠à¹à¸œà¹ˆà¸™à¸”ินฮั่นเสื่อมโทรมà¹à¸ªà¸™à¸ªà¸±à¸‡à¹€à¸§à¸Š พระปà¸à¹€à¸à¸¨à¸à¸­à¸‡à¸šà¸¹à¹Šà¸à¸¹à¹‰à¸‚ึ้นใหม่ + สิบสองà¸à¸©à¸±à¸•ริย์à¸à¹ˆà¸­à¸™à¸«à¸™à¹‰à¸²à¹à¸¥à¸–ัดไป สององค์ไซร้โง่เขลาเบาปัà¸à¸à¸² + ทรงนับถือขันทีเป็นที่พึ่ง บ้านเมืองจึงวิปริตเป็นนัà¸à¸«à¸™à¸² + โฮจิ๋นเรียà¸à¸—ัพทั่วหัวเมืองมา หมายจะฆ่ามดชั่วตัวสำคัภ+ เหมือนขับไสไล่เสือจาà¸à¹€à¸„หา รับหมาป่าเข้ามาเลยอาสัภ+ à¸à¹ˆà¸²à¸¢à¸­à¹‰à¸­à¸‡à¸­à¸¸à¹‰à¸™à¸¢à¸¸à¹à¸¢à¸à¹ƒà¸«à¹‰à¹à¸•à¸à¸à¸±à¸™ ใช้สาวนั้นเป็นชนวนชื่นชวนใจ + พลันลิฉุยà¸à¸¸à¸¢à¸à¸µà¸à¸¥à¸±à¸šà¸à¹ˆà¸­à¹€à¸«à¸•ุ ช่างอาเพศจริงหนาฟ้าร้องไห้ + ต้องรบราฆ่าฟันจนบรรลัย ฤๅหาใครค้ำชูà¸à¸¹à¹‰à¸šà¸£à¸£à¸¥à¸±à¸‡à¸à¹Œ ฯ + + (The above is a two-column text. If combining characters are handled + correctly, the lines of the second column should be aligned with the + | character above.) + +Ethiopian: + + Proverbs in the Amharic language: + + ሰማይ አይታረስ ንጉሥ አይከሰስᢠ+ ብላ ካለአእንደአባቴ በቆመጠáŠá¢ + ጌጥ ያለቤቱ á‰áˆáŒ¥áŠ“ áŠá‹á¢ + ደሀ በሕáˆáˆ™ ቅቤ ባይጠጣ ንጣት በገደለá‹á¢ + የአá ወለáˆá‰³ በቅቤ አይታሽáˆá¢ + አይጥ በበላ ዳዋ ተመታᢠ+ ሲተረጉሙ ይደረáŒáˆ™á¢ + ቀስ በቀስᥠዕንá‰áˆ‹áˆ በእáŒáˆ© ይሄዳáˆá¢ + ድር ቢያብር አንበሳ ያስርᢠ+ ሰዠእንደቤቱ እንጅ እንደ ጉረቤቱ አይተዳደርáˆá¢ + እáŒá‹œáˆ­ የከáˆá‰°á‹áŠ• ጉሮሮ ሳይዘጋዠአይድርáˆá¢ + የጎረቤት ሌባᥠቢያዩት ይስቅ ባያዩት ያጠáˆá‰…ᢠ+ ሥራ ከመáታት áˆáŒ„ን ላá‹á‰³á‰µá¢ + ዓባይ ማደሪያ የለá‹á¥ áŒáŠ•á‹µ ይዞ ይዞራáˆá¢ + የእስላሠአገሩ መካ የአሞራ አገሩ ዋርካᢠ+ ተንጋሎ ቢተበተመáˆáˆ¶ ባá‰á¢ + ወዳጅህ ማር ቢሆን ጨርስህ አትላሰá‹á¢ + እáŒáˆ­áˆ…ን በáራሽህ áˆáŠ­ ዘርጋᢠ+ +Runes: + + ᚻᛖ ᚳᚹᚫᚦ ᚦᚫᛠᚻᛖ ᛒᚢᛞᛖ ᚩᚾ ᚦᚫᛗ ᛚᚪᚾᛞᛖ ᚾᚩᚱᚦᚹᛖᚪᚱᛞᚢᛗ áš¹á›áš¦ ᚦᚪ ᚹᛖᛥᚫ + + (Old English, which transcribed into Latin reads 'He cwaeth that he + bude thaem lande northweardum with tha Westsae.' and means 'He said + that he lived in the northern land near the Western Sea.') + +Braille: + + ⡌â â §â ‘ â ¼â â ’ â¡â œâ ‡â ‘⠹⠰⠎ ⡣⠕⠌ + + â¡â œâ ‡â ‘â ¹ â ºâ â Ž ⠙⠑â â ™â ’ â žâ • ⠃⠑⠛⠔ ⠺⠊⠹⠲ ⡹⠻⠑ â Šâ Ž â â • ⠙⠳⠃⠞ + â ±â â žâ ‘â §â » â â ƒâ ³â ž â ¹â â žâ ² ⡹⠑ ⠗⠑⠛⠊⠌⠻ â •â ‹ ⠙⠊⠎ ⠃⠥⠗⠊â â ‡ â ºâ â Ž + â Žâ Šâ ›â â « ⠃⠹ ⠹⠑ ⠊⠇⠻⠛⠹â â â â ‚ ⠹⠑ ⠊⠇⠻⠅⠂ ⠹⠑ â ¥â â ™â »â žâ â …⠻⠂ + â â â ™ ⠹⠑ â ¡â Šâ ‘â ‹ â â ³â —â â »â ² ⡎⠊⠗⠕⠕⠛⠑ â Žâ Šâ ›â â « â Šâ žâ ² â¡â â ™ + ⡎⠊⠗⠕⠕⠛⠑⠰⠎ â â â â ‘ â ºâ â Ž ⠛⠕⠕⠙ â ¥â â •â  â °â¡¡â â â ›â ‘â ‚ â ‹â •â — â â â ¹â ¹â ”â › ⠙⠑ + â ¡â •â Žâ ‘ â žâ • â â ¥â ž ⠙⠊⠎ â ™â â â ™ â žâ •â ² + + ⡕⠇⠙ â¡â œâ ‡â ‘â ¹ â ºâ â Ž â â Ž ⠙⠑â â ™ â â Ž â  â ™â •â •â —â ¤â â â Šâ ‡â ² + + â¡â ”⠙⠖ ⡊ ⠙⠕â â °â ž â â ‘â â  â žâ • â Žâ â ¹ â ¹â â ž ⡊ â …â â ªâ ‚ â •â ‹ â â ¹ + â ªâ  â …â â ªâ ‡â «â ›â ‘â ‚ â ±â â ž ⠹⠻⠑ â Šâ Ž â â œâ žâ Šâ Šâ ¥â ‡â œâ ‡â ¹ ⠙⠑â â ™ â â ƒâ ³â ž + â  â ™â •â •â —â ¤â â â Šâ ‡â ² ⡊ â â Šâ £â ž â ™â â §â ‘ ⠃⠑⠲ ⠔⠊⠇⠔⠫⠂ â â ¹â Žâ ‘⠇⠋⠂ â žâ • + ⠗⠑⠛⠜⠙ â  â Šâ •â ‹â ‹â ”â ¤â â â Šâ ‡ â â Ž ⠹⠑ ⠙⠑â â ™â ‘â Œ â â Šâ ‘â Šâ ‘ â •â ‹ â Šâ —â •â â â •â â ›â »â ¹ + â ” ⠹⠑ â žâ —â â ™â ‘â ² ⡃⠥⠞ ⠹⠑ â ºâ Šâ Žâ ™â •â  â •â ‹ ⠳⠗ â â â Šâ ‘⠌⠕⠗⠎ + â Šâ Ž â ” ⠹⠑ â Žâ Šâ â Šâ ‡â ‘â † â â â ™ â â ¹ â ¥â â ™â â ‡â ‡â ªâ « â ™â â â ™â Ž + â ©â â ‡â ‡ â â •â ž ⠙⠊⠌⠥⠗⠃ â Šâ žâ ‚ â •â — ⠹⠑ ⡊⠳â â žâ —⠹⠰⠎ ⠙⠕â â ‘ â ‹â •â —â ² ⡹⠳ + ⠺⠊⠇⠇ ⠹⠻⠑⠋⠕⠗⠑ â â »â â Šâ ž â â ‘ â žâ • â —â ‘â â ‘â â žâ ‚ â ‘â â â ™â â žâ Šâ Šâ â ‡â ‡â ¹â ‚ â ¹â â ž + â¡â œâ ‡â ‘â ¹ â ºâ â Ž â â Ž ⠙⠑â â ™ â â Ž â  â ™â •â •â —â ¤â â â Šâ ‡â ² + + (The first couple of paragraphs of "A Christmas Carol" by Dickens) + +Compact font selection example text: + + ABCDEFGHIJKLMNOPQRSTUVWXYZ /0123456789 + abcdefghijklmnopqrstuvwxyz £©µÀÆÖÞßéöÿ + –—‘“â€â€žâ€ â€¢â€¦â€°â„¢Å“ŠŸž€ ΑΒΓΔΩαβγδω ÐБВГДабвгд + ∀∂∈â„∧∪≡∞ ↑↗↨↻⇣ â”┼╔╘░►☺♀ ï¬ï¿½â‘€â‚‚ἠḂӥẄÉËâŽ×Աრ+ +Greetings in various languages: + + Hello world, ΚαλημέÏα κόσμε, コンニãƒãƒ + +Box drawing alignment tests: â–ˆ + â–‰ + â•”â•â•╦â•â•â•— ┌──┬──┠╭──┬──╮ ╭──┬──╮ â”â”â”┳â”â”┓ ┎┒â”┑ â•· â•» â”┯┓ ┌┰┠▊ ╱╲╱╲╳╳╳ + ║┌─╨─â”â•‘ │╔â•â•§â•╗│ │╒â•╪â•╕│ │╓─â•─╖│ ┃┌─╂─â”┃ ┗╃╄┙ ╶┼╴╺╋╸┠┼┨ â”╋┥ â–‹ ╲╱╲╱╳╳╳ + ║│╲ ╱│║ │║ ║│ ││ │ ││ │║ ┃ ║│ ┃│ â•¿ │┃ â”╅╆┓ ╵ ╹ â”—â”·â”› └┸┘ â–Œ ╱╲╱╲╳╳╳ + â• â•¡ ╳ ╞╣ ├╢ ╟┤ ├┼─┼─┼┤ ├╫─╂─╫┤ ┣┿╾┼╼┿┫ ┕┛┖┚ ┌┄┄┠╎ â”┅┅┓ ┋ ■╲╱╲╱╳╳╳ + ║│╱ ╲│║ │║ ║│ ││ │ ││ │║ ┃ ║│ ┃│ ╽ │┃ ░░▒▒▓▓██ ┊ ┆ ╎ ╠┇ ┋ â–Ž + ║└─╥─┘║ │╚â•╤â•â•│ │╘â•╪â•╛│ │╙─╀─╜│ ┃└─╂─┘┃ ░░▒▒▓▓██ ┊ ┆ ╎ ╠┇ ┋ â– + ╚â•â•â•©â•â•╠└──┴──┘ ╰──┴──╯ ╰──┴──╯ â”—â”â”â”»â”â”â”› ▗▄▖▛▀▜ └╌╌┘ ╎ â”—â•â•â”› ┋ â–▂▃▄▅▆▇█ + â–▀▘▙▄▟ diff --git a/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/tests/utf-8.txt b/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/tests/utf-8.txt new file mode 100644 index 0000000..4363f27 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/tests/utf-8.txt @@ -0,0 +1,212 @@ + +UTF-8 encoded sample plain-text file +‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾ + +Markus Kuhn [ˈmaʳkÊŠs kuËn] — 2002-07-25 + + +The ASCII compatible UTF-8 encoding used in this plain-text file +is defined in Unicode, ISO 10646-1, and RFC 2279. + + +Using Unicode/UTF-8, you can write in emails and source code things such as + +Mathematics and sciences: + + ∮ Eâ‹…da = Q, n → ∞, ∑ f(i) = ∠g(i), ⎧⎡⎛┌─────â”⎞⎤⎫ + ⎪⎢⎜│a²+b³ ⎟⎥⎪ + ∀x∈â„: ⌈x⌉ = −⌊−x⌋, α ∧ ¬β = ¬(¬α ∨ β), ⎪⎢⎜│───── ⎟⎥⎪ + ⎪⎢⎜⎷ c₈ ⎟⎥⎪ + â„• ⊆ â„•â‚€ ⊂ ℤ ⊂ ℚ ⊂ ℠⊂ â„‚, ⎨⎢⎜ ⎟⎥⎬ + ⎪⎢⎜ ∞ ⎟⎥⎪ + ⊥ < a ≠ b ≡ c ≤ d ≪ ⊤ ⇒ (⟦A⟧ ⇔ ⟪B⟫), ⎪⎢⎜ ⎲ ⎟⎥⎪ + ⎪⎢⎜ ⎳aâ±-bâ±âŽŸâŽ¥âŽª + 2Hâ‚‚ + Oâ‚‚ ⇌ 2Hâ‚‚O, R = 4.7 kΩ, ⌀ 200 mm ⎩⎣âŽi=1 ⎠⎦⎭ + +Linguistics and dictionaries: + + ði ıntəˈnæʃənÉ™l fəˈnÉ›tık É™soÊŠsiˈeıʃn + Y [ˈÊpsilÉ”n], Yen [jÉ›n], Yoga [ˈjoËgÉ‘] + +APL: + + ((Vâ³V)=â³â´V)/Vâ†,V ⌷â†â³â†’â´âˆ†âˆ‡âŠƒâ€¾âŽâ•⌈ + +Nicer typography in plain text files: + + â•”â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•— + â•‘ â•‘ + â•‘ • ‘single’ and “double†quotes â•‘ + â•‘ â•‘ + â•‘ • Curly apostrophes: “We’ve been here†║ + â•‘ â•‘ + â•‘ • Latin-1 apostrophe and accents: '´` â•‘ + â•‘ â•‘ + â•‘ • ‚deutsche‘ „Anführungszeichen“ â•‘ + â•‘ â•‘ + â•‘ • †, ‡, ‰, •, 3–4, —, −5/+5, â„¢, … â•‘ + â•‘ â•‘ + â•‘ • ASCII safety test: 1lI|, 0OD, 8B â•‘ + â•‘ ╭─────────╮ â•‘ + â•‘ • the euro symbol: │ 14.95 € │ â•‘ + â•‘ ╰─────────╯ â•‘ + ╚â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â• + +Combining characters: + + STARGΛ̊TE SG-1, a = v̇ = r̈, a⃑ ⊥ b⃑ + +Greek (in Polytonic): + + The Greek anthem: + + Σὲ γνωÏίζω ἀπὸ τὴν κόψη + τοῦ σπαθιοῦ τὴν Ï„ÏομεÏá½µ, + σὲ γνωÏίζω ἀπὸ τὴν ὄψη + ποὺ μὲ βία μετÏάει τὴ γῆ. + + ᾿Απ᾿ τὰ κόκκαλα βγαλμένη + τῶν ῾Ελλήνων τὰ ἱεÏá½± + καὶ σὰν Ï€Ïῶτα ἀνδÏειωμένη + χαῖÏε, ὦ χαῖÏε, ᾿ΕλευθεÏιά! + + From a speech of Demosthenes in the 4th century BC: + + Οá½Ï‡á½¶ ταá½Ï„á½° παÏίσταταί μοι γιγνώσκειν, ὦ ἄνδÏες ᾿Αθηναῖοι, + ὅταν τ᾿ εἰς τὰ Ï€Ïάγματα ἀποβλέψω καὶ ὅταν Ï€Ïὸς τοὺς + λόγους οὓς ἀκούω· τοὺς μὲν Î³á½°Ï Î»á½¹Î³Î¿Ï…Ï‚ πεÏá½¶ τοῦ + τιμωÏήσασθαι Φίλιππον á½Ïá¿¶ γιγνομένους, τὰ δὲ Ï€Ïάγματ᾿ + εἰς τοῦτο Ï€Ïοήκοντα, ὥσθ᾿ ὅπως μὴ πεισόμεθ᾿ αá½Ï„οὶ + Ï€ÏότεÏον κακῶς σκέψασθαι δέον. οá½Î´á½³Î½ οὖν ἄλλο μοι δοκοῦσιν + οἱ τὰ τοιαῦτα λέγοντες á¼¢ τὴν ὑπόθεσιν, πεÏá½¶ á¼§Ï‚ βουλεύεσθαι, + οá½Ï‡á½¶ τὴν οὖσαν παÏιστάντες ὑμῖν á¼Î¼Î±Ïτάνειν. á¼Î³á½¼ δέ, ὅτι μέν + ποτ᾿ á¼Î¾á¿†Î½ τῇ πόλει καὶ τὰ αὑτῆς ἔχειν ἀσφαλῶς καὶ Φίλιππον + τιμωÏήσασθαι, καὶ μάλ᾿ ἀκÏιβῶς οἶδα· á¼Ï€á¾¿ á¼Î¼Î¿á¿¦ γάÏ, οὠπάλαι + γέγονεν ταῦτ᾿ ἀμφότεÏα· νῦν μέντοι πέπεισμαι τοῦθ᾿ ἱκανὸν + Ï€Ïολαβεῖν ἡμῖν εἶναι τὴν Ï€Ïώτην, ὅπως τοὺς συμμάχους + σώσομεν. á¼á½°Î½ Î³á½°Ï Ï„Î¿á¿¦Ï„Î¿ βεβαίως ὑπάÏξῃ, τότε καὶ πεÏá½¶ τοῦ + τίνα τιμωÏήσεταί τις καὶ ὃν Ï„Ïόπον á¼Î¾á½³ÏƒÏ„αι σκοπεῖν· Ï€Ïὶν δὲ + τὴν á¼€Ïχὴν á½€Ïθῶς ὑποθέσθαι, μάταιον ἡγοῦμαι πεÏá½¶ τῆς + τελευτῆς á½Î½Ï„ινοῦν ποιεῖσθαι λόγον. + + Δημοσθένους, Γ´ ᾿Ολυνθιακὸς + +Georgian: + + From a Unicode conference invitation: + + გთხáƒáƒ•თ áƒáƒ®áƒšáƒáƒ•ე გáƒáƒ˜áƒáƒ áƒáƒ— რეგისტრáƒáƒªáƒ˜áƒ Unicode-ის მეáƒáƒ—ე სáƒáƒ”რთáƒáƒ¨áƒáƒ áƒ˜áƒ¡áƒ + კáƒáƒœáƒ¤áƒ”რენციáƒáƒ–ე დáƒáƒ¡áƒáƒ¡áƒ¬áƒ áƒ”ბáƒáƒ“, რáƒáƒ›áƒ”ლიც გáƒáƒ˜áƒ›áƒáƒ áƒ—ებრ10-12 მáƒáƒ áƒ¢áƒ¡, + ქ. მáƒáƒ˜áƒœáƒªáƒ¨áƒ˜, გერმáƒáƒœáƒ˜áƒáƒ¨áƒ˜. კáƒáƒœáƒ¤áƒ”რენცირშეჰკრებს ერთáƒáƒ“ მსáƒáƒ¤áƒšáƒ˜áƒáƒ¡ + ექსპერტებს ისეთ დáƒáƒ áƒ’ებში რáƒáƒ’áƒáƒ áƒ˜áƒªáƒáƒ ინტერნეტი დრUnicode-ი, + ინტერნáƒáƒªáƒ˜áƒáƒœáƒáƒšáƒ˜áƒ–áƒáƒªáƒ˜áƒ დრლáƒáƒ™áƒáƒšáƒ˜áƒ–áƒáƒªáƒ˜áƒ, Unicode-ის გáƒáƒ›áƒáƒ§áƒ”ნებრ+ áƒáƒžáƒ”რáƒáƒªáƒ˜áƒ£áƒš სისტემებსáƒ, დრგáƒáƒ›áƒáƒ§áƒ”ნებით პრáƒáƒ’რáƒáƒ›áƒ”ბში, შრიფტებში, + ტექსტების დáƒáƒ›áƒ£áƒ¨áƒáƒ•ებáƒáƒ¡áƒ დრმრáƒáƒ•áƒáƒšáƒ”ნáƒáƒ•áƒáƒœ კáƒáƒ›áƒžáƒ˜áƒ£áƒ¢áƒ”რულ სისტემებში. + +Russian: + + From a Unicode conference invitation: + + ЗарегиÑтрируйтеÑÑŒ ÑÐµÐ¹Ñ‡Ð°Ñ Ð½Ð° ДеÑÑтую Международную Конференцию по + Unicode, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ ÑоÑтоитÑÑ 10-12 марта 1997 года в Майнце в Германии. + ÐšÐ¾Ð½Ñ„ÐµÑ€ÐµÐ½Ñ†Ð¸Ñ Ñоберет широкий круг ÑкÑпертов по вопроÑам глобального + Интернета и Unicode, локализации и интернационализации, воплощению и + применению Unicode в различных операционных ÑиÑтемах и программных + приложениÑÑ…, шрифтах, верÑтке и многоÑзычных компьютерных ÑиÑтемах. + +Thai (UCS Level 2): + + Excerpt from a poetry on The Romance of The Three Kingdoms (a Chinese + classic 'San Gua'): + + [----------------------------|------------------------] + ๠à¹à¸œà¹ˆà¸™à¸”ินฮั่นเสื่อมโทรมà¹à¸ªà¸™à¸ªà¸±à¸‡à¹€à¸§à¸Š พระปà¸à¹€à¸à¸¨à¸à¸­à¸‡à¸šà¸¹à¹Šà¸à¸¹à¹‰à¸‚ึ้นใหม่ + สิบสองà¸à¸©à¸±à¸•ริย์à¸à¹ˆà¸­à¸™à¸«à¸™à¹‰à¸²à¹à¸¥à¸–ัดไป สององค์ไซร้โง่เขลาเบาปัà¸à¸à¸² + ทรงนับถือขันทีเป็นที่พึ่ง บ้านเมืองจึงวิปริตเป็นนัà¸à¸«à¸™à¸² + โฮจิ๋นเรียà¸à¸—ัพทั่วหัวเมืองมา หมายจะฆ่ามดชั่วตัวสำคัภ+ เหมือนขับไสไล่เสือจาà¸à¹€à¸„หา รับหมาป่าเข้ามาเลยอาสัภ+ à¸à¹ˆà¸²à¸¢à¸­à¹‰à¸­à¸‡à¸­à¸¸à¹‰à¸™à¸¢à¸¸à¹à¸¢à¸à¹ƒà¸«à¹‰à¹à¸•à¸à¸à¸±à¸™ ใช้สาวนั้นเป็นชนวนชื่นชวนใจ + พลันลิฉุยà¸à¸¸à¸¢à¸à¸µà¸à¸¥à¸±à¸šà¸à¹ˆà¸­à¹€à¸«à¸•ุ ช่างอาเพศจริงหนาฟ้าร้องไห้ + ต้องรบราฆ่าฟันจนบรรลัย ฤๅหาใครค้ำชูà¸à¸¹à¹‰à¸šà¸£à¸£à¸¥à¸±à¸‡à¸à¹Œ ฯ + + (The above is a two-column text. If combining characters are handled + correctly, the lines of the second column should be aligned with the + | character above.) + +Ethiopian: + + Proverbs in the Amharic language: + + ሰማይ አይታረስ ንጉሥ አይከሰስᢠ+ ብላ ካለአእንደአባቴ በቆመጠáŠá¢ + ጌጥ ያለቤቱ á‰áˆáŒ¥áŠ“ áŠá‹á¢ + ደሀ በሕáˆáˆ™ ቅቤ ባይጠጣ ንጣት በገደለá‹á¢ + የአá ወለáˆá‰³ በቅቤ አይታሽáˆá¢ + አይጥ በበላ ዳዋ ተመታᢠ+ ሲተረጉሙ ይደረáŒáˆ™á¢ + ቀስ በቀስᥠዕንá‰áˆ‹áˆ በእáŒáˆ© ይሄዳáˆá¢ + ድር ቢያብር አንበሳ ያስርᢠ+ ሰዠእንደቤቱ እንጅ እንደ ጉረቤቱ አይተዳደርáˆá¢ + እáŒá‹œáˆ­ የከáˆá‰°á‹áŠ• ጉሮሮ ሳይዘጋዠአይድርáˆá¢ + የጎረቤት ሌባᥠቢያዩት ይስቅ ባያዩት ያጠáˆá‰…ᢠ+ ሥራ ከመáታት áˆáŒ„ን ላá‹á‰³á‰µá¢ + ዓባይ ማደሪያ የለá‹á¥ áŒáŠ•á‹µ ይዞ ይዞራáˆá¢ + የእስላሠአገሩ መካ የአሞራ አገሩ ዋርካᢠ+ ተንጋሎ ቢተበተመáˆáˆ¶ ባá‰á¢ + ወዳጅህ ማር ቢሆን ጨርስህ አትላሰá‹á¢ + እáŒáˆ­áˆ…ን በáራሽህ áˆáŠ­ ዘርጋᢠ+ +Runes: + + ᚻᛖ ᚳᚹᚫᚦ ᚦᚫᛠᚻᛖ ᛒᚢᛞᛖ ᚩᚾ ᚦᚫᛗ ᛚᚪᚾᛞᛖ ᚾᚩᚱᚦᚹᛖᚪᚱᛞᚢᛗ áš¹á›áš¦ ᚦᚪ ᚹᛖᛥᚫ + + (Old English, which transcribed into Latin reads 'He cwaeth that he + bude thaem lande northweardum with tha Westsae.' and means 'He said + that he lived in the northern land near the Western Sea.') + +Braille: + + ⡌â â §â ‘ â ¼â â ’ â¡â œâ ‡â ‘⠹⠰⠎ ⡣⠕⠌ + + â¡â œâ ‡â ‘â ¹ â ºâ â Ž ⠙⠑â â ™â ’ â žâ • ⠃⠑⠛⠔ ⠺⠊⠹⠲ ⡹⠻⠑ â Šâ Ž â â • ⠙⠳⠃⠞ + â ±â â žâ ‘â §â » â â ƒâ ³â ž â ¹â â žâ ² ⡹⠑ ⠗⠑⠛⠊⠌⠻ â •â ‹ ⠙⠊⠎ ⠃⠥⠗⠊â â ‡ â ºâ â Ž + â Žâ Šâ ›â â « ⠃⠹ ⠹⠑ ⠊⠇⠻⠛⠹â â â â ‚ ⠹⠑ ⠊⠇⠻⠅⠂ ⠹⠑ â ¥â â ™â »â žâ â …⠻⠂ + â â â ™ ⠹⠑ â ¡â Šâ ‘â ‹ â â ³â —â â »â ² ⡎⠊⠗⠕⠕⠛⠑ â Žâ Šâ ›â â « â Šâ žâ ² â¡â â ™ + ⡎⠊⠗⠕⠕⠛⠑⠰⠎ â â â â ‘ â ºâ â Ž ⠛⠕⠕⠙ â ¥â â •â  â °â¡¡â â â ›â ‘â ‚ â ‹â •â — â â â ¹â ¹â ”â › ⠙⠑ + â ¡â •â Žâ ‘ â žâ • â â ¥â ž ⠙⠊⠎ â ™â â â ™ â žâ •â ² + + ⡕⠇⠙ â¡â œâ ‡â ‘â ¹ â ºâ â Ž â â Ž ⠙⠑â â ™ â â Ž â  â ™â •â •â —â ¤â â â Šâ ‡â ² + + â¡â ”⠙⠖ ⡊ ⠙⠕â â °â ž â â ‘â â  â žâ • â Žâ â ¹ â ¹â â ž ⡊ â …â â ªâ ‚ â •â ‹ â â ¹ + â ªâ  â …â â ªâ ‡â «â ›â ‘â ‚ â ±â â ž ⠹⠻⠑ â Šâ Ž â â œâ žâ Šâ Šâ ¥â ‡â œâ ‡â ¹ ⠙⠑â â ™ â â ƒâ ³â ž + â  â ™â •â •â —â ¤â â â Šâ ‡â ² ⡊ â â Šâ £â ž â ™â â §â ‘ ⠃⠑⠲ ⠔⠊⠇⠔⠫⠂ â â ¹â Žâ ‘⠇⠋⠂ â žâ • + ⠗⠑⠛⠜⠙ â  â Šâ •â ‹â ‹â ”â ¤â â â Šâ ‡ â â Ž ⠹⠑ ⠙⠑â â ™â ‘â Œ â â Šâ ‘â Šâ ‘ â •â ‹ â Šâ —â •â â â •â â ›â »â ¹ + â ” ⠹⠑ â žâ —â â ™â ‘â ² ⡃⠥⠞ ⠹⠑ â ºâ Šâ Žâ ™â •â  â •â ‹ ⠳⠗ â â â Šâ ‘⠌⠕⠗⠎ + â Šâ Ž â ” ⠹⠑ â Žâ Šâ â Šâ ‡â ‘â † â â â ™ â â ¹ â ¥â â ™â â ‡â ‡â ªâ « â ™â â â ™â Ž + â ©â â ‡â ‡ â â •â ž ⠙⠊⠌⠥⠗⠃ â Šâ žâ ‚ â •â — ⠹⠑ ⡊⠳â â žâ —⠹⠰⠎ ⠙⠕â â ‘ â ‹â •â —â ² ⡹⠳ + ⠺⠊⠇⠇ ⠹⠻⠑⠋⠕⠗⠑ â â »â â Šâ ž â â ‘ â žâ • â —â ‘â â ‘â â žâ ‚ â ‘â â â ™â â žâ Šâ Šâ â ‡â ‡â ¹â ‚ â ¹â â ž + â¡â œâ ‡â ‘â ¹ â ºâ â Ž â â Ž ⠙⠑â â ™ â â Ž â  â ™â •â •â —â ¤â â â Šâ ‡â ² + + (The first couple of paragraphs of "A Christmas Carol" by Dickens) + +Compact font selection example text: + + ABCDEFGHIJKLMNOPQRSTUVWXYZ /0123456789 + abcdefghijklmnopqrstuvwxyz £©µÀÆÖÞßéöÿ + –—‘“â€â€žâ€ â€¢â€¦â€°â„¢Å“ŠŸž€ ΑΒΓΔΩαβγδω ÐБВГДабвгд + ∀∂∈â„∧∪≡∞ ↑↗↨↻⇣ â”┼╔╘░►☺♀ ï¬ï¿½â‘€â‚‚ἠḂӥẄÉËâŽ×Աრ+ +Greetings in various languages: + + Hello world, ΚαλημέÏα κόσμε, コンニãƒãƒ + +Box drawing alignment tests: â–ˆ + â–‰ + â•”â•â•╦â•â•â•— ┌──┬──┠╭──┬──╮ ╭──┬──╮ â”â”â”┳â”â”┓ ┎┒â”┑ â•· â•» â”┯┓ ┌┰┠▊ ╱╲╱╲╳╳╳ + ║┌─╨─â”â•‘ │╔â•â•§â•╗│ │╒â•╪â•╕│ │╓─â•─╖│ ┃┌─╂─â”┃ ┗╃╄┙ ╶┼╴╺╋╸┠┼┨ â”╋┥ â–‹ ╲╱╲╱╳╳╳ + ║│╲ ╱│║ │║ ║│ ││ │ ││ │║ ┃ ║│ ┃│ â•¿ │┃ â”╅╆┓ ╵ ╹ â”—â”·â”› └┸┘ â–Œ ╱╲╱╲╳╳╳ + â• â•¡ ╳ ╞╣ ├╢ ╟┤ ├┼─┼─┼┤ ├╫─╂─╫┤ ┣┿╾┼╼┿┫ ┕┛┖┚ ┌┄┄┠╎ â”┅┅┓ ┋ ■╲╱╲╱╳╳╳ + ║│╱ ╲│║ │║ ║│ ││ │ ││ │║ ┃ ║│ ┃│ ╽ │┃ ░░▒▒▓▓██ ┊ ┆ ╎ ╠┇ ┋ â–Ž + ║└─╥─┘║ │╚â•╤â•â•│ │╘â•╪â•╛│ │╙─╀─╜│ ┃└─╂─┘┃ ░░▒▒▓▓██ ┊ ┆ ╎ ╠┇ ┋ â– + ╚â•â•â•©â•â•╠└──┴──┘ ╰──┴──╯ ╰──┴──╯ â”—â”â”â”»â”â”â”› ▗▄▖▛▀▜ └╌╌┘ ╎ â”—â•â•â”› ┋ â–▂▃▄▅▆▇█ + â–▀▘▙▄▟ diff --git a/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/tests/utf-8.txt-utf8 b/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/tests/utf-8.txt-utf8 new file mode 100644 index 0000000..4363f27 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/babel-20191130-git/tests/utf-8.txt-utf8 @@ -0,0 +1,212 @@ + +UTF-8 encoded sample plain-text file +‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾ + +Markus Kuhn [ˈmaʳkÊŠs kuËn] — 2002-07-25 + + +The ASCII compatible UTF-8 encoding used in this plain-text file +is defined in Unicode, ISO 10646-1, and RFC 2279. + + +Using Unicode/UTF-8, you can write in emails and source code things such as + +Mathematics and sciences: + + ∮ Eâ‹…da = Q, n → ∞, ∑ f(i) = ∠g(i), ⎧⎡⎛┌─────â”⎞⎤⎫ + ⎪⎢⎜│a²+b³ ⎟⎥⎪ + ∀x∈â„: ⌈x⌉ = −⌊−x⌋, α ∧ ¬β = ¬(¬α ∨ β), ⎪⎢⎜│───── ⎟⎥⎪ + ⎪⎢⎜⎷ c₈ ⎟⎥⎪ + â„• ⊆ â„•â‚€ ⊂ ℤ ⊂ ℚ ⊂ ℠⊂ â„‚, ⎨⎢⎜ ⎟⎥⎬ + ⎪⎢⎜ ∞ ⎟⎥⎪ + ⊥ < a ≠ b ≡ c ≤ d ≪ ⊤ ⇒ (⟦A⟧ ⇔ ⟪B⟫), ⎪⎢⎜ ⎲ ⎟⎥⎪ + ⎪⎢⎜ ⎳aâ±-bâ±âŽŸâŽ¥âŽª + 2Hâ‚‚ + Oâ‚‚ ⇌ 2Hâ‚‚O, R = 4.7 kΩ, ⌀ 200 mm ⎩⎣âŽi=1 ⎠⎦⎭ + +Linguistics and dictionaries: + + ði ıntəˈnæʃənÉ™l fəˈnÉ›tık É™soÊŠsiˈeıʃn + Y [ˈÊpsilÉ”n], Yen [jÉ›n], Yoga [ˈjoËgÉ‘] + +APL: + + ((Vâ³V)=â³â´V)/Vâ†,V ⌷â†â³â†’â´âˆ†âˆ‡âŠƒâ€¾âŽâ•⌈ + +Nicer typography in plain text files: + + â•”â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•— + â•‘ â•‘ + â•‘ • ‘single’ and “double†quotes â•‘ + â•‘ â•‘ + â•‘ • Curly apostrophes: “We’ve been here†║ + â•‘ â•‘ + â•‘ • Latin-1 apostrophe and accents: '´` â•‘ + â•‘ â•‘ + â•‘ • ‚deutsche‘ „Anführungszeichen“ â•‘ + â•‘ â•‘ + â•‘ • †, ‡, ‰, •, 3–4, —, −5/+5, â„¢, … â•‘ + â•‘ â•‘ + â•‘ • ASCII safety test: 1lI|, 0OD, 8B â•‘ + â•‘ ╭─────────╮ â•‘ + â•‘ • the euro symbol: │ 14.95 € │ â•‘ + â•‘ ╰─────────╯ â•‘ + ╚â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â• + +Combining characters: + + STARGΛ̊TE SG-1, a = v̇ = r̈, a⃑ ⊥ b⃑ + +Greek (in Polytonic): + + The Greek anthem: + + Σὲ γνωÏίζω ἀπὸ τὴν κόψη + τοῦ σπαθιοῦ τὴν Ï„ÏομεÏá½µ, + σὲ γνωÏίζω ἀπὸ τὴν ὄψη + ποὺ μὲ βία μετÏάει τὴ γῆ. + + ᾿Απ᾿ τὰ κόκκαλα βγαλμένη + τῶν ῾Ελλήνων τὰ ἱεÏá½± + καὶ σὰν Ï€Ïῶτα ἀνδÏειωμένη + χαῖÏε, ὦ χαῖÏε, ᾿ΕλευθεÏιά! + + From a speech of Demosthenes in the 4th century BC: + + Οá½Ï‡á½¶ ταá½Ï„á½° παÏίσταταί μοι γιγνώσκειν, ὦ ἄνδÏες ᾿Αθηναῖοι, + ὅταν τ᾿ εἰς τὰ Ï€Ïάγματα ἀποβλέψω καὶ ὅταν Ï€Ïὸς τοὺς + λόγους οὓς ἀκούω· τοὺς μὲν Î³á½°Ï Î»á½¹Î³Î¿Ï…Ï‚ πεÏá½¶ τοῦ + τιμωÏήσασθαι Φίλιππον á½Ïá¿¶ γιγνομένους, τὰ δὲ Ï€Ïάγματ᾿ + εἰς τοῦτο Ï€Ïοήκοντα, ὥσθ᾿ ὅπως μὴ πεισόμεθ᾿ αá½Ï„οὶ + Ï€ÏότεÏον κακῶς σκέψασθαι δέον. οá½Î´á½³Î½ οὖν ἄλλο μοι δοκοῦσιν + οἱ τὰ τοιαῦτα λέγοντες á¼¢ τὴν ὑπόθεσιν, πεÏá½¶ á¼§Ï‚ βουλεύεσθαι, + οá½Ï‡á½¶ τὴν οὖσαν παÏιστάντες ὑμῖν á¼Î¼Î±Ïτάνειν. á¼Î³á½¼ δέ, ὅτι μέν + ποτ᾿ á¼Î¾á¿†Î½ τῇ πόλει καὶ τὰ αὑτῆς ἔχειν ἀσφαλῶς καὶ Φίλιππον + τιμωÏήσασθαι, καὶ μάλ᾿ ἀκÏιβῶς οἶδα· á¼Ï€á¾¿ á¼Î¼Î¿á¿¦ γάÏ, οὠπάλαι + γέγονεν ταῦτ᾿ ἀμφότεÏα· νῦν μέντοι πέπεισμαι τοῦθ᾿ ἱκανὸν + Ï€Ïολαβεῖν ἡμῖν εἶναι τὴν Ï€Ïώτην, ὅπως τοὺς συμμάχους + σώσομεν. á¼á½°Î½ Î³á½°Ï Ï„Î¿á¿¦Ï„Î¿ βεβαίως ὑπάÏξῃ, τότε καὶ πεÏá½¶ τοῦ + τίνα τιμωÏήσεταί τις καὶ ὃν Ï„Ïόπον á¼Î¾á½³ÏƒÏ„αι σκοπεῖν· Ï€Ïὶν δὲ + τὴν á¼€Ïχὴν á½€Ïθῶς ὑποθέσθαι, μάταιον ἡγοῦμαι πεÏá½¶ τῆς + τελευτῆς á½Î½Ï„ινοῦν ποιεῖσθαι λόγον. + + Δημοσθένους, Γ´ ᾿Ολυνθιακὸς + +Georgian: + + From a Unicode conference invitation: + + გთხáƒáƒ•თ áƒáƒ®áƒšáƒáƒ•ე გáƒáƒ˜áƒáƒ áƒáƒ— რეგისტრáƒáƒªáƒ˜áƒ Unicode-ის მეáƒáƒ—ე სáƒáƒ”რთáƒáƒ¨áƒáƒ áƒ˜áƒ¡áƒ + კáƒáƒœáƒ¤áƒ”რენციáƒáƒ–ე დáƒáƒ¡áƒáƒ¡áƒ¬áƒ áƒ”ბáƒáƒ“, რáƒáƒ›áƒ”ლიც გáƒáƒ˜áƒ›áƒáƒ áƒ—ებრ10-12 მáƒáƒ áƒ¢áƒ¡, + ქ. მáƒáƒ˜áƒœáƒªáƒ¨áƒ˜, გერმáƒáƒœáƒ˜áƒáƒ¨áƒ˜. კáƒáƒœáƒ¤áƒ”რენცირშეჰკრებს ერთáƒáƒ“ მსáƒáƒ¤áƒšáƒ˜áƒáƒ¡ + ექსპერტებს ისეთ დáƒáƒ áƒ’ებში რáƒáƒ’áƒáƒ áƒ˜áƒªáƒáƒ ინტერნეტი დრUnicode-ი, + ინტერნáƒáƒªáƒ˜áƒáƒœáƒáƒšáƒ˜áƒ–áƒáƒªáƒ˜áƒ დრლáƒáƒ™áƒáƒšáƒ˜áƒ–áƒáƒªáƒ˜áƒ, Unicode-ის გáƒáƒ›áƒáƒ§áƒ”ნებრ+ áƒáƒžáƒ”რáƒáƒªáƒ˜áƒ£áƒš სისტემებსáƒ, დრგáƒáƒ›áƒáƒ§áƒ”ნებით პრáƒáƒ’რáƒáƒ›áƒ”ბში, შრიფტებში, + ტექსტების დáƒáƒ›áƒ£áƒ¨áƒáƒ•ებáƒáƒ¡áƒ დრმრáƒáƒ•áƒáƒšáƒ”ნáƒáƒ•áƒáƒœ კáƒáƒ›áƒžáƒ˜áƒ£áƒ¢áƒ”რულ სისტემებში. + +Russian: + + From a Unicode conference invitation: + + ЗарегиÑтрируйтеÑÑŒ ÑÐµÐ¹Ñ‡Ð°Ñ Ð½Ð° ДеÑÑтую Международную Конференцию по + Unicode, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ ÑоÑтоитÑÑ 10-12 марта 1997 года в Майнце в Германии. + ÐšÐ¾Ð½Ñ„ÐµÑ€ÐµÐ½Ñ†Ð¸Ñ Ñоберет широкий круг ÑкÑпертов по вопроÑам глобального + Интернета и Unicode, локализации и интернационализации, воплощению и + применению Unicode в различных операционных ÑиÑтемах и программных + приложениÑÑ…, шрифтах, верÑтке и многоÑзычных компьютерных ÑиÑтемах. + +Thai (UCS Level 2): + + Excerpt from a poetry on The Romance of The Three Kingdoms (a Chinese + classic 'San Gua'): + + [----------------------------|------------------------] + ๠à¹à¸œà¹ˆà¸™à¸”ินฮั่นเสื่อมโทรมà¹à¸ªà¸™à¸ªà¸±à¸‡à¹€à¸§à¸Š พระปà¸à¹€à¸à¸¨à¸à¸­à¸‡à¸šà¸¹à¹Šà¸à¸¹à¹‰à¸‚ึ้นใหม่ + สิบสองà¸à¸©à¸±à¸•ริย์à¸à¹ˆà¸­à¸™à¸«à¸™à¹‰à¸²à¹à¸¥à¸–ัดไป สององค์ไซร้โง่เขลาเบาปัà¸à¸à¸² + ทรงนับถือขันทีเป็นที่พึ่ง บ้านเมืองจึงวิปริตเป็นนัà¸à¸«à¸™à¸² + โฮจิ๋นเรียà¸à¸—ัพทั่วหัวเมืองมา หมายจะฆ่ามดชั่วตัวสำคัภ+ เหมือนขับไสไล่เสือจาà¸à¹€à¸„หา รับหมาป่าเข้ามาเลยอาสัภ+ à¸à¹ˆà¸²à¸¢à¸­à¹‰à¸­à¸‡à¸­à¸¸à¹‰à¸™à¸¢à¸¸à¹à¸¢à¸à¹ƒà¸«à¹‰à¹à¸•à¸à¸à¸±à¸™ ใช้สาวนั้นเป็นชนวนชื่นชวนใจ + พลันลิฉุยà¸à¸¸à¸¢à¸à¸µà¸à¸¥à¸±à¸šà¸à¹ˆà¸­à¹€à¸«à¸•ุ ช่างอาเพศจริงหนาฟ้าร้องไห้ + ต้องรบราฆ่าฟันจนบรรลัย ฤๅหาใครค้ำชูà¸à¸¹à¹‰à¸šà¸£à¸£à¸¥à¸±à¸‡à¸à¹Œ ฯ + + (The above is a two-column text. If combining characters are handled + correctly, the lines of the second column should be aligned with the + | character above.) + +Ethiopian: + + Proverbs in the Amharic language: + + ሰማይ አይታረስ ንጉሥ አይከሰስᢠ+ ብላ ካለአእንደአባቴ በቆመጠáŠá¢ + ጌጥ ያለቤቱ á‰áˆáŒ¥áŠ“ áŠá‹á¢ + ደሀ በሕáˆáˆ™ ቅቤ ባይጠጣ ንጣት በገደለá‹á¢ + የአá ወለáˆá‰³ በቅቤ አይታሽáˆá¢ + አይጥ በበላ ዳዋ ተመታᢠ+ ሲተረጉሙ ይደረáŒáˆ™á¢ + ቀስ በቀስᥠዕንá‰áˆ‹áˆ በእáŒáˆ© ይሄዳáˆá¢ + ድር ቢያብር አንበሳ ያስርᢠ+ ሰዠእንደቤቱ እንጅ እንደ ጉረቤቱ አይተዳደርáˆá¢ + እáŒá‹œáˆ­ የከáˆá‰°á‹áŠ• ጉሮሮ ሳይዘጋዠአይድርáˆá¢ + የጎረቤት ሌባᥠቢያዩት ይስቅ ባያዩት ያጠáˆá‰…ᢠ+ ሥራ ከመáታት áˆáŒ„ን ላá‹á‰³á‰µá¢ + ዓባይ ማደሪያ የለá‹á¥ áŒáŠ•á‹µ ይዞ ይዞራáˆá¢ + የእስላሠአገሩ መካ የአሞራ አገሩ ዋርካᢠ+ ተንጋሎ ቢተበተመáˆáˆ¶ ባá‰á¢ + ወዳጅህ ማር ቢሆን ጨርስህ አትላሰá‹á¢ + እáŒáˆ­áˆ…ን በáራሽህ áˆáŠ­ ዘርጋᢠ+ +Runes: + + ᚻᛖ ᚳᚹᚫᚦ ᚦᚫᛠᚻᛖ ᛒᚢᛞᛖ ᚩᚾ ᚦᚫᛗ ᛚᚪᚾᛞᛖ ᚾᚩᚱᚦᚹᛖᚪᚱᛞᚢᛗ áš¹á›áš¦ ᚦᚪ ᚹᛖᛥᚫ + + (Old English, which transcribed into Latin reads 'He cwaeth that he + bude thaem lande northweardum with tha Westsae.' and means 'He said + that he lived in the northern land near the Western Sea.') + +Braille: + + ⡌â â §â ‘ â ¼â â ’ â¡â œâ ‡â ‘⠹⠰⠎ ⡣⠕⠌ + + â¡â œâ ‡â ‘â ¹ â ºâ â Ž ⠙⠑â â ™â ’ â žâ • ⠃⠑⠛⠔ ⠺⠊⠹⠲ ⡹⠻⠑ â Šâ Ž â â • ⠙⠳⠃⠞ + â ±â â žâ ‘â §â » â â ƒâ ³â ž â ¹â â žâ ² ⡹⠑ ⠗⠑⠛⠊⠌⠻ â •â ‹ ⠙⠊⠎ ⠃⠥⠗⠊â â ‡ â ºâ â Ž + â Žâ Šâ ›â â « ⠃⠹ ⠹⠑ ⠊⠇⠻⠛⠹â â â â ‚ ⠹⠑ ⠊⠇⠻⠅⠂ ⠹⠑ â ¥â â ™â »â žâ â …⠻⠂ + â â â ™ ⠹⠑ â ¡â Šâ ‘â ‹ â â ³â —â â »â ² ⡎⠊⠗⠕⠕⠛⠑ â Žâ Šâ ›â â « â Šâ žâ ² â¡â â ™ + ⡎⠊⠗⠕⠕⠛⠑⠰⠎ â â â â ‘ â ºâ â Ž ⠛⠕⠕⠙ â ¥â â •â  â °â¡¡â â â ›â ‘â ‚ â ‹â •â — â â â ¹â ¹â ”â › ⠙⠑ + â ¡â •â Žâ ‘ â žâ • â â ¥â ž ⠙⠊⠎ â ™â â â ™ â žâ •â ² + + ⡕⠇⠙ â¡â œâ ‡â ‘â ¹ â ºâ â Ž â â Ž ⠙⠑â â ™ â â Ž â  â ™â •â •â —â ¤â â â Šâ ‡â ² + + â¡â ”⠙⠖ ⡊ ⠙⠕â â °â ž â â ‘â â  â žâ • â Žâ â ¹ â ¹â â ž ⡊ â …â â ªâ ‚ â •â ‹ â â ¹ + â ªâ  â …â â ªâ ‡â «â ›â ‘â ‚ â ±â â ž ⠹⠻⠑ â Šâ Ž â â œâ žâ Šâ Šâ ¥â ‡â œâ ‡â ¹ ⠙⠑â â ™ â â ƒâ ³â ž + â  â ™â •â •â —â ¤â â â Šâ ‡â ² ⡊ â â Šâ £â ž â ™â â §â ‘ ⠃⠑⠲ ⠔⠊⠇⠔⠫⠂ â â ¹â Žâ ‘⠇⠋⠂ â žâ • + ⠗⠑⠛⠜⠙ â  â Šâ •â ‹â ‹â ”â ¤â â â Šâ ‡ â â Ž ⠹⠑ ⠙⠑â â ™â ‘â Œ â â Šâ ‘â Šâ ‘ â •â ‹ â Šâ —â •â â â •â â ›â »â ¹ + â ” ⠹⠑ â žâ —â â ™â ‘â ² ⡃⠥⠞ ⠹⠑ â ºâ Šâ Žâ ™â •â  â •â ‹ ⠳⠗ â â â Šâ ‘⠌⠕⠗⠎ + â Šâ Ž â ” ⠹⠑ â Žâ Šâ â Šâ ‡â ‘â † â â â ™ â â ¹ â ¥â â ™â â ‡â ‡â ªâ « â ™â â â ™â Ž + â ©â â ‡â ‡ â â •â ž ⠙⠊⠌⠥⠗⠃ â Šâ žâ ‚ â •â — ⠹⠑ ⡊⠳â â žâ —⠹⠰⠎ ⠙⠕â â ‘ â ‹â •â —â ² ⡹⠳ + ⠺⠊⠇⠇ ⠹⠻⠑⠋⠕⠗⠑ â â »â â Šâ ž â â ‘ â žâ • â —â ‘â â ‘â â žâ ‚ â ‘â â â ™â â žâ Šâ Šâ â ‡â ‡â ¹â ‚ â ¹â â ž + â¡â œâ ‡â ‘â ¹ â ºâ â Ž â â Ž ⠙⠑â â ™ â â Ž â  â ™â •â •â —â ¤â â â Šâ ‡â ² + + (The first couple of paragraphs of "A Christmas Carol" by Dickens) + +Compact font selection example text: + + ABCDEFGHIJKLMNOPQRSTUVWXYZ /0123456789 + abcdefghijklmnopqrstuvwxyz £©µÀÆÖÞßéöÿ + –—‘“â€â€žâ€ â€¢â€¦â€°â„¢Å“ŠŸž€ ΑΒΓΔΩαβγδω ÐБВГДабвгд + ∀∂∈â„∧∪≡∞ ↑↗↨↻⇣ â”┼╔╘░►☺♀ ï¬ï¿½â‘€â‚‚ἠḂӥẄÉËâŽ×Աრ+ +Greetings in various languages: + + Hello world, ΚαλημέÏα κόσμε, コンニãƒãƒ + +Box drawing alignment tests: â–ˆ + â–‰ + â•”â•â•╦â•â•â•— ┌──┬──┠╭──┬──╮ ╭──┬──╮ â”â”â”┳â”â”┓ ┎┒â”┑ â•· â•» â”┯┓ ┌┰┠▊ ╱╲╱╲╳╳╳ + ║┌─╨─â”â•‘ │╔â•â•§â•╗│ │╒â•╪â•╕│ │╓─â•─╖│ ┃┌─╂─â”┃ ┗╃╄┙ ╶┼╴╺╋╸┠┼┨ â”╋┥ â–‹ ╲╱╲╱╳╳╳ + ║│╲ ╱│║ │║ ║│ ││ │ ││ │║ ┃ ║│ ┃│ â•¿ │┃ â”╅╆┓ ╵ ╹ â”—â”·â”› └┸┘ â–Œ ╱╲╱╲╳╳╳ + â• â•¡ ╳ ╞╣ ├╢ ╟┤ ├┼─┼─┼┤ ├╫─╂─╫┤ ┣┿╾┼╼┿┫ ┕┛┖┚ ┌┄┄┠╎ â”┅┅┓ ┋ ■╲╱╲╱╳╳╳ + ║│╱ ╲│║ │║ ║│ ││ │ ││ │║ ┃ ║│ ┃│ ╽ │┃ ░░▒▒▓▓██ ┊ ┆ ╎ ╠┇ ┋ â–Ž + ║└─╥─┘║ │╚â•╤â•â•│ │╘â•╪â•╛│ │╙─╀─╜│ ┃└─╂─┘┃ ░░▒▒▓▓██ ┊ ┆ ╎ ╠┇ ┋ â– + ╚â•â•â•©â•â•╠└──┴──┘ ╰──┴──╯ ╰──┴──╯ â”—â”â”â”»â”â”â”› ▗▄▖▛▀▜ └╌╌┘ ╎ â”—â•â•â”› ┋ â–▂▃▄▅▆▇█ + â–▀▘▙▄▟ diff --git a/sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/.travis.yml b/sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/.travis.yml new file mode 100644 index 0000000..93b85c7 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/.travis.yml @@ -0,0 +1,46 @@ +language: lisp + +env: + matrix: + - LISP=allegro + - LISP=ccl + - LISP=ccl32 + - LISP=sbcl + - LISP=sbcl32 + - LISP=abcl + - LISP=cmucl + - LISP=ecl + +matrix: + allow_failures: + - env: LISP=abcl + - env: LISP=cmucl + - env: LISP=ecl + +notifications: + email: + on_success: change + on_failure: always + irc: + channels: + - "chat.freenode.net#iolib" + on_success: change + on_failure: always + use_notice: true + skip_join: true + +install: + - curl -L https://raw.githubusercontent.com/sionescu/cl-travis/master/install.sh | sh + - cl -e "(cl:in-package :cl-user) + (dolist (p '(:fiveam)) + (ql:quickload p :verbose t))" + +script: + - cl -e "(cl:in-package :cl-user) + (prin1 (lisp-implementation-type)) (terpri) (prin1 (lisp-implementation-version)) (terpri) + (ql:quickload :bordeaux-threads/test :verbose t) + (uiop:quit (if (some (lambda (x) (typep x '5am::test-failure)) + (5am:run :bordeaux-threads)) + 1 0))" + +sudo: required diff --git a/sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/CONTRIBUTORS b/sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/CONTRIBUTORS new file mode 100644 index 0000000..5b63524 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/CONTRIBUTORS @@ -0,0 +1,19 @@ +-*- outline -*- + +Based on original Bordeaux-MP spec by Dan Barlow + +Contributors: + +* Attila Lendvai + - better handling of unsupported Lisps +* Vladimir Sekissov + - fixes for CMUCL implementation +* Pierre Thierry + - added license information +* Stelian Ionescu + - finished conversion from generic functions + - enabled running thread-safe code in unthreaded lisps +* Douglas Crosher + - added Scieneer Common Lisp support +* Daniel KochmaÅ„ski + - semaphores implementation diff --git a/sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/LICENSE b/sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/LICENSE new file mode 100644 index 0000000..3ce400f --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/LICENSE @@ -0,0 +1,20 @@ +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. diff --git a/sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/README b/sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/README new file mode 100644 index 0000000..1531578 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/README @@ -0,0 +1,2 @@ +You can find API documentation on the project's wiki: + http://trac.common-lisp.net/bordeaux-threads/wiki/ApiDocumentation diff --git a/sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/bordeaux-threads.asd b/sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/bordeaux-threads.asd new file mode 100644 index 0000000..8db0d2e --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/bordeaux-threads.asd @@ -0,0 +1,76 @@ +;;;; -*- Mode: Lisp; indent-tabs-mode: nil -*- + +#| +Copyright 2006,2007 Greg Pfeil + +Distributed under the MIT license (see LICENSE file) +|# + +#.(unless (or #+asdf3.1 (version<= "3.1" (asdf-version))) + (error "You need ASDF >= 3.1 to load this system correctly.")) + +(eval-when (:compile-toplevel :load-toplevel :execute) + #+(or armedbear + (and allegro multiprocessing) + (and clasp threads) + (and clisp mt) + (and openmcl openmcl-native-threads) + (and cmu mp) + corman + (and ecl threads) + genera + mkcl + lispworks + (and digitool ccl-5.1) + (and sbcl sb-thread) + scl) + (pushnew :thread-support *features*)) + +(defsystem :bordeaux-threads + :author "Greg Pfeil " + :licence "MIT" + :description "Bordeaux Threads makes writing portable multi-threaded apps simple." + :version (:read-file-form "version.sexp") + :depends-on (:alexandria + #+(and allegro (version>= 9)) (:require "smputil") + #+(and allegro (not (version>= 9))) (:require "process") + #+corman (:require "threads")) + :components ((:static-file "version.sexp") + (:module "src" + :serial t + :components + ((:file "pkgdcl") + (:file "bordeaux-threads") + (:file #+(and thread-support armedbear) "impl-abcl" + #+(and thread-support allegro) "impl-allegro" + #+(and thread-support clasp) "impl-clasp" + #+(and thread-support clisp) "impl-clisp" + #+(and thread-support openmcl) "impl-clozure" + #+(and thread-support cmu) "impl-cmucl" + #+(and thread-support corman) "impl-corman" + #+(and thread-support ecl) "impl-ecl" + #+(and thread-support genera) "impl-genera" + #+(and thread-support mkcl) "impl-mkcl" + #+(and thread-support lispworks) "impl-lispworks" + #+(and thread-support digitool) "impl-mcl" + #+(and thread-support sbcl) "impl-sbcl" + #+(and thread-support scl) "impl-scl" + #-thread-support "impl-null") + #+(and thread-support lispworks (or lispworks4 lispworks5)) + (:file "impl-lispworks-condition-variables") + #+(and thread-support digitool) + (:file "condition-variables") + (:file "default-implementations"))))) + +(defsystem :bordeaux-threads/test + :author "Greg Pfeil " + :description "Bordeaux Threads test suite." + :licence "MIT" + :version (:read-file-form "version.sexp") + :depends-on (:bordeaux-threads :fiveam) + :components ((:module "test" + :components ((:file "bordeaux-threads-test"))))) + +(defmethod perform ((o test-op) (c (eql (find-system :bordeaux-threads)))) + (load-system :bordeaux-threads/test) + (symbol-call :5am :run! :bordeaux-threads)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/site/index.html b/sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/site/index.html new file mode 100644 index 0000000..dfc5fc6 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/site/index.html @@ -0,0 +1,55 @@ + + + + + + + + Bordeaux Threads project + + + + + +

+ +

Based on an original proposal by Dan Barlow (Bordeaux-MP) this + library is meant to make writing portable multi-threaded apps + simple.

+ +

Read the current API documentation.

+ +

Supports all major Common Lisp implementations: SBCL, CCL, + Lispworks, Allegro, ABCL, ECL, Clisp.
The MKCL, Corman, + MCL and Scieneer backends are not tested frequently(if ever) and + might not work.

+ +

For discussion, use the mailing + list bordeaux-threads-devel + or the #lisp IRC channel on Freenode.

+ +

Source repository

+ +

Bordeaux-threads is developed + at Github. The + repository is also mirrored + to Gitlab + and Bitbucket.

+ + + + + + diff --git a/sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/site/style.css b/sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/site/style.css new file mode 100644 index 0000000..5617a85 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/site/style.css @@ -0,0 +1,86 @@ +/* +Copyright 2006,2007 Greg Pfeil + +Distributed under the MIT license (see LICENSE file) +*/ + +tbody { + border-top: thin dotted black; +} + +.failure { + background-color: #ff0; +} + +.nonexistant { + background-color: #ccc; +} + +.perfect { + background-color: #0f0; +} + +.error { + background-color: #f00; +} + +.header { + font-size: medium; + background-color:#336699; + color:#ffffff; + border-style:solid; + border-width: 5px; + border-color:#002244; + padding: 1mm 1mm 1mm 5mm; +} + +.footer { + font-size: small; + font-style: italic; + text-align: right; + background-color:#336699; + color:#ffffff; + border-style:solid; + border-width: 2px; + border-color:#002244; + padding: 1mm 1mm 1mm 1mm; +} + +.footer a:link { + font-weight:bold; + color:#ffffff; + background-color: #336699; + text-decoration:underline; +} + +.footer a:visited { + font-weight:bold; + color:#ffffff; + background-color: #336699; + text-decoration:underline; +} + +.footer a:hover { + font-weight:bold; + color:#002244; + background-color: #336699; + text-decoration:underline; } + +.check {font-size: x-small; + text-align:right;} + +.check a:link { font-weight:bold; + color:#a0a0ff; + background-color: #FFFFFF; + text-decoration:underline; } + +.check a:visited { font-weight:bold; + color:#a0a0ff; + background-color: #FFFFFF; + text-decoration:underline; } + +.check a:hover { font-weight:bold; + color:#000000; + background-color: #FFFFFF; + text-decoration:underline; } + diff --git a/sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/src/bordeaux-threads.lisp b/sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/src/bordeaux-threads.lisp new file mode 100644 index 0000000..5aeb7d8 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/src/bordeaux-threads.lisp @@ -0,0 +1,170 @@ +;;;; -*- indent-tabs-mode: nil -*- + +#| +Copyright 2006, 2007 Greg Pfeil + +Distributed under the MIT license (see LICENSE file) +|# + +(in-package #:bordeaux-threads) + +(defvar *supports-threads-p* nil + "This should be set to T if the running instance has thread support.") + +(defun mark-supported () + (setf *supports-threads-p* t) + (pushnew :bordeaux-threads *features*)) + +(define-condition bordeaux-mp-condition (error) + ((message :initarg :message :reader message)) + (:report (lambda (condition stream) + (format stream (message condition))))) + +(defgeneric make-threading-support-error () + (:documentation "Creates a BORDEAUX-THREADS condition which specifies + whether there is no BORDEAUX-THREADS support for the implementation, no + threads enabled for the system, or no support for a particular + function.") + (:method () + (make-condition + 'bordeaux-mp-condition + :message (if *supports-threads-p* + "There is no support for this method on this implementation." + "There is no thread support in this instance.")))) + +;;; Timeouts + +#-sbcl +(define-condition timeout (serious-condition) + ((length :initform nil + :initarg :length + :reader timeout-length)) + (:report (lambda (c s) + (if (timeout-length c) + (format s "A timeout set to ~A seconds occurred." + (timeout-length c)) + (format s "A timeout occurred."))))) + +#-sbcl +(defmacro with-timeout ((timeout) &body body) + "Execute `BODY' and signal a condition of type TIMEOUT if the execution of +BODY does not complete within `TIMEOUT' seconds. On implementations which do not +support WITH-TIMEOUT natively and don't support threads either it has no effect." + (declare (ignorable timeout body)) + #+thread-support + (let ((ok-tag (gensym "OK")) + (timeout-tag (gensym "TIMEOUT")) + (caller (gensym "CALLER"))) + (once-only (timeout) + `(multiple-value-prog1 + (catch ',ok-tag + (catch ',timeout-tag + (let ((,caller (current-thread))) + (make-thread #'(lambda () + (sleep ,timeout) + (interrupt-thread ,caller + #'(lambda () + (ignore-errors + (throw ',timeout-tag nil))))) + :name (format nil "WITH-TIMEOUT thread serving: ~S." + (thread-name ,caller))) + (throw ',ok-tag (progn ,@body)))) + (error 'timeout :length ,timeout))))) + #-thread-support + `(error (make-threading-support-error))) + +;;; Semaphores + +;;; We provide this structure definition unconditionally regardless of the fact +;;; it may not be used not to prevent warnings from compiling default functions +;;; for semaphore in default-implementations.lisp. +(defstruct %semaphore + lock + condition-variable + counter) + +#-(or ccl sbcl) +(deftype semaphore () + '%semaphore) + +;;; Thread Creation + +;;; See default-implementations.lisp for MAKE-THREAD. + +;; Forms are evaluated in the new thread or in the calling thread? +(defvar *default-special-bindings* nil + "This variable holds an alist associating special variable symbols + to forms to evaluate. Special variables named in this list will + be locally bound in the new thread before it begins executing user code. + + This variable may be rebound around calls to MAKE-THREAD to + add/alter default bindings. The effect of mutating this list is + undefined, but earlier forms take precedence over later forms for + the same symbol, so defaults may be overridden by consing to the + head of the list.") + +(defmacro defbindings (name docstring &body initforms) + (check-type docstring string) + `(defparameter ,name + (list + ,@(loop for (special form) in initforms + collect `(cons ',special ',form))) + ,docstring)) + +;; Forms are evaluated in the new thread or in the calling thread? +(defbindings *standard-io-bindings* + "Standard bindings of printer/reader control variables as per CL:WITH-STANDARD-IO-SYNTAX." + (*package* (find-package :common-lisp-user)) + (*print-array* t) + (*print-base* 10) + (*print-case* :upcase) + (*print-circle* nil) + (*print-escape* t) + (*print-gensym* t) + (*print-length* nil) + (*print-level* nil) + (*print-lines* nil) + (*print-miser-width* nil) + (*print-pprint-dispatch* (copy-pprint-dispatch nil)) + (*print-pretty* nil) + (*print-radix* nil) + (*print-readably* t) + (*print-right-margin* nil) + (*random-state* (make-random-state t)) + (*read-base* 10) + (*read-default-float-format* 'single-float) + (*read-eval* t) + (*read-suppress* nil) + (*readtable* (copy-readtable nil))) + +(defun binding-default-specials (function special-bindings) + "Return a closure that binds the symbols in SPECIAL-BINDINGS and calls +FUNCTION." + (let ((specials (remove-duplicates special-bindings :from-end t :key #'car))) + (lambda () + (progv (mapcar #'car specials) + (loop for (nil . form) in specials collect (eval form)) + (funcall function))))) + +;;; FIXME: This test won't work if CURRENT-THREAD +;;; conses a new object each time +(defun signal-error-if-current-thread (thread) + (when (eq thread (current-thread)) + (error 'bordeaux-mp-condition + :message "Cannot destroy the current thread"))) + +(defparameter *no-condition-wait-timeout-message* + "CONDITION-WAIT with :TIMEOUT is not available for this Lisp implementation.") + +(defun signal-error-if-condition-wait-timeout (timeout) + (when timeout + (error 'bordeaux-mp-condition + :message *no-condition-wait-timeout-message*))) + +(defmacro define-condition-wait-compiler-macro () + `(define-compiler-macro condition-wait + (&whole whole condition-variable lock &key timeout) + (declare (ignore condition-variable lock)) + (when timeout + (simple-style-warning *no-condition-wait-timeout-message*)) + whole)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/src/condition-variables.lisp b/sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/src/condition-variables.lisp new file mode 100644 index 0000000..33b090b --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/src/condition-variables.lisp @@ -0,0 +1,38 @@ +;;;; -*- indent-tabs-mode: nil -*- + +#| +Copyright 2006, 2007 Greg Pfeil + +Distributed under the MIT license (see LICENSE file) +|# + +(in-package #:bordeaux-threads) + +;;; This file provides a portable implementation of condition +;;; variables (given a working WITH-LOCK-HELD and THREAD-YIELD), and +;;; should be used if there is no condition variable implementation in +;;; the host Lisp. + +(defstruct condition-var + name + lock + active) + +(defun condition-wait (condition-variable lock &key timeout) + (signal-error-if-condition-wait-timeout timeout) + (check-type condition-variable condition-var) + (setf (condition-var-active condition-variable) nil) + (release-lock lock) + (do () + ((when (condition-var-active condition-variable) + (acquire-lock lock) + t)) + (thread-yield)) + t) + +(define-condition-wait-compiler-macro) + +(defun condition-notify (condition-variable) + (check-type condition-variable condition-var) + (with-lock-held ((condition-var-lock condition-variable)) + (setf (condition-var-active condition-variable) t))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/src/default-implementations.lisp b/sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/src/default-implementations.lisp new file mode 100644 index 0000000..c148ac3 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/src/default-implementations.lisp @@ -0,0 +1,361 @@ +;;;; -*- indent-tabs-mode: nil -*- + +(in-package #:bordeaux-threads) + +;;; Helper macros + +(defmacro defdfun (name args doc &body body) + `(eval-when (:compile-toplevel :load-toplevel :execute) + (unless (fboundp ',name) + (defun ,name ,args ,@body)) + (setf (documentation ',name 'function) + (or (documentation ',name 'function) ,doc)))) + +(defmacro defdmacro (name args doc &body body) + `(eval-when (:compile-toplevel :load-toplevel :execute) + (unless (fboundp ',name) + (defmacro ,name ,args ,@body)) + (setf (documentation ',name 'function) + (or (documentation ',name 'function) ,doc)))) + +;;; Thread Creation + +(defdfun start-multiprocessing () + "If the host implementation uses user-level threads, start the +scheduler and multiprocessing, otherwise do nothing. +It is safe to call repeatedly." + nil) + +(defdfun make-thread (function &key name + (initial-bindings *default-special-bindings*)) + "Creates and returns a thread named NAME, which will call the + function FUNCTION with no arguments: when FUNCTION returns, the + thread terminates. NAME defaults to \"Anonymous thread\" if unsupplied. + + On systems that do not support multi-threading, MAKE-THREAD will + signal an error. + + The interaction between threads and dynamic variables is in some + cases complex, and depends on whether the variable has only a global + binding (as established by e.g. DEFVAR/DEFPARAMETER/top-level SETQ) + or has been bound locally (e.g. with LET or LET*) in the calling + thread. + + - Global bindings are shared between threads: the initial value of a + global variable in the new thread will be the same as in the + parent, and an assignment to such a variable in any thread will be + visible to all threads in which the global binding is visible. + + - Local bindings, such as the ones introduced by INITIAL-BINDINGS, + are local to the thread they are introduced in, except that + + - Local bindings in the the caller of MAKE-THREAD may or may not be + shared with the new thread that it creates: this is + implementation-defined. Portable code should not depend on + particular behaviour in this case, nor should it assign to such + variables without first rebinding them in the new thread." + (%make-thread (binding-default-specials function initial-bindings) + (or name "Anonymous thread"))) + +(defdfun %make-thread (function name) + "The actual implementation-dependent function that creates threads." + (declare (ignore function name)) + (error (make-threading-support-error))) + +(defdfun current-thread () + "Returns the thread object for the calling + thread. This is the same kind of object as would be returned by + MAKE-THREAD." + nil) + +(defdfun threadp (object) + "Returns true if object is a thread, otherwise NIL." + (declare (ignore object)) + nil) + +(defdfun thread-name (thread) + "Returns the name of the thread, as supplied to MAKE-THREAD." + (declare (ignore thread)) + "Main thread") + +;;; Resource contention: locks and recursive locks + +(defdfun lock-p (object) + "Returns T if OBJECT is a lock; returns NIL otherwise." + (declare (ignore object)) + nil) + +(defdfun recursive-lock-p (object) + "Returns T if OBJECT is a recursive lock; returns NIL otherwise." + (declare (ignore object)) + nil) + +(defdfun make-lock (&optional name) + "Creates a lock (a mutex) whose name is NAME. If the system does not + support multiple threads this will still return some object, but it + may not be used for very much." + ;; In CLIM-SYS this is a freshly consed list (NIL). I don't know if + ;; there's some good reason it should be said structure or that it + ;; be freshly consed - EQ comparison of locks? + (declare (ignore name)) + (list nil)) + +(defdfun acquire-lock (lock &optional wait-p) + "Acquire the lock LOCK for the calling thread. + WAIT-P governs what happens if the lock is not available: if WAIT-P + is true, the calling thread will wait until the lock is available + and then acquire it; if WAIT-P is NIL, ACQUIRE-LOCK will return + immediately. ACQUIRE-LOCK returns true if the lock was acquired and + NIL otherwise. + + This specification does not define what happens if a thread + attempts to acquire a lock that it already holds. For applications + that require locks to be safe when acquired recursively, see instead + MAKE-RECURSIVE-LOCK and friends." + (declare (ignore lock wait-p)) + t) + +(defdfun release-lock (lock) + "Release LOCK. It is an error to call this unless + the lock has previously been acquired (and not released) by the same + thread. If other threads are waiting for the lock, the + ACQUIRE-LOCK call in one of them will now be able to continue. + + This function has no interesting return value." + (declare (ignore lock)) + (values)) + +(defdmacro with-lock-held ((place) &body body) + "Evaluates BODY with the lock named by PLACE, the value of which + is a lock created by MAKE-LOCK. Before the forms in BODY are + evaluated, the lock is acquired as if by using ACQUIRE-LOCK. After the + forms in BODY have been evaluated, or if a non-local control transfer + is caused (e.g. by THROW or SIGNAL), the lock is released as if by + RELEASE-LOCK. + + Note that if the debugger is entered, it is unspecified whether the + lock is released at debugger entry or at debugger exit when execution + is restarted." + `(when (acquire-lock ,place t) + (unwind-protect + (locally ,@body) + (release-lock ,place)))) + +(defdfun make-recursive-lock (&optional name) + "Create and return a recursive lock whose name is NAME. A recursive + lock differs from an ordinary lock in that a thread that already + holds the recursive lock can acquire it again without blocking. The + thread must then release the lock twice before it becomes available + for another thread." + (declare (ignore name)) + (list nil)) + +(defdfun acquire-recursive-lock (lock) + "As for ACQUIRE-LOCK, but for recursive locks." + (declare (ignore lock)) + t) + +(defdfun release-recursive-lock (lock) + "Release the recursive LOCK. The lock will only + become free after as many Release operations as there have been + Acquire operations. See RELEASE-LOCK for other information." + (declare (ignore lock)) + (values)) + +(defdmacro with-recursive-lock-held ((place &key timeout) &body body) + "Evaluates BODY with the recursive lock named by PLACE, which is a +reference to a recursive lock created by MAKE-RECURSIVE-LOCK. See +WITH-LOCK-HELD etc etc" + (declare (ignore timeout)) + `(when (acquire-recursive-lock ,place) + (unwind-protect + (locally ,@body) + (release-recursive-lock ,place)))) + +;;; Resource contention: condition variables + +;;; A condition variable provides a mechanism for threads to put +;;; themselves to sleep while waiting for the state of something to +;;; change, then to be subsequently woken by another thread which has +;;; changed the state. +;;; +;;; A condition variable must be used in conjunction with a lock to +;;; protect access to the state of the object of interest. The +;;; procedure is as follows: +;;; +;;; Suppose two threads A and B, and some kind of notional event +;;; channel C. A is consuming events in C, and B is producing them. +;;; CV is a condition-variable +;;; +;;; 1) A acquires the lock that safeguards access to C +;;; 2) A threads and removes all events that are available in C +;;; 3) When C is empty, A calls CONDITION-WAIT, which atomically +;;; releases the lock and puts A to sleep on CV +;;; 4) Wait to be notified; CONDITION-WAIT will acquire the lock again +;;; before returning +;;; 5) Loop back to step 2, for as long as threading should continue +;;; +;;; When B generates an event E, it +;;; 1) acquires the lock guarding C +;;; 2) adds E to the channel +;;; 3) calls CONDITION-NOTIFY on CV to wake any sleeping thread +;;; 4) releases the lock +;;; +;;; To avoid the "lost wakeup" problem, the implementation must +;;; guarantee that CONDITION-WAIT in thread A atomically releases the +;;; lock and sleeps. If this is not guaranteed there is the +;;; possibility that thread B can add an event and call +;;; CONDITION-NOTIFY between the lock release and the sleep - in this +;;; case the notify call would not see A, which would be left sleeping +;;; despite there being an event available. + +(defdfun thread-yield () + "Allows other threads to run. It may be necessary or desirable to + call this periodically in some implementations; others may schedule + threads automatically. On systems that do not support + multi-threading, this does nothing." + (values)) + +(defdfun make-condition-variable (&key name) + "Returns a new condition-variable object for use + with CONDITION-WAIT and CONDITION-NOTIFY." + (declare (ignore name)) + nil) + +(defdfun condition-wait (condition-variable lock &key timeout) + "Atomically release LOCK and enqueue the calling + thread waiting for CONDITION-VARIABLE. The thread will resume when + another thread has notified it using CONDITION-NOTIFY; it may also + resume if interrupted by some external event or in other + implementation-dependent circumstances: the caller must always test + on waking that there is threading to be done, instead of assuming + that it can go ahead. + + It is an error to call function this unless from the thread that + holds LOCK. + + If TIMEOUT is nil or not provided, the system always reacquires LOCK + before returning to the caller. In this case T is returned. + + If TIMEOUT is non-nil, the call will return after at most TIMEOUT + seconds (approximately), whether or not a notification has occurred. + Either NIL or T will be returned. A return of NIL indicates that the + lock is no longer held and that the timeout has expired. A return of + T indicates that the lock is held, in which case the timeout may or + may not have expired. + + **NOTE**: The behavior of CONDITION-WAIT with TIMEOUT diverges from + the POSIX function pthread_cond_timedwait. The former may return + without the lock being held while the latter always returns with the + lock held. + + In an implementation that does not support multiple threads, this + function signals an error." + (declare (ignore condition-variable lock timeout)) + (error (make-threading-support-error))) + +(defdfun condition-notify (condition-variable) + "Notify at least one of the threads waiting for + CONDITION-VARIABLE. It is implementation-dependent whether one or + more than one (and possibly all) threads are woken, but if the + implementation is capable of waking only a single thread (not all + are) this is probably preferable for efficiency reasons. The order + of wakeup is unspecified and does not necessarily relate to the + order that the threads went to sleep in. + + CONDITION-NOTIFY has no useful return value. In an implementation + that does not support multiple threads, it has no effect." + (declare (ignore condition-variable)) + (values)) + +;;; Resource contention: semaphores + +(defdfun make-semaphore (&key name (count 0)) + "Create a semaphore with the supplied NAME and initial counter value COUNT." + (make-%semaphore :lock (make-lock name) + :condition-variable (make-condition-variable :name name) + :counter count)) + +(defdfun signal-semaphore (semaphore &key (count 1)) + "Increment SEMAPHORE by COUNT. If there are threads waiting on this +semaphore, then COUNT of them are woken up." + (with-lock-held ((%semaphore-lock semaphore)) + (incf (%semaphore-counter semaphore) count) + (dotimes (v count) + (condition-notify (%semaphore-condition-variable semaphore)))) + (values)) + +(defdfun wait-on-semaphore (semaphore &key timeout) + "Decrement the count of SEMAPHORE by 1 if the count would not be negative. + +Else blocks until the semaphore can be decremented. Returns generalized boolean +T on success. + +If TIMEOUT is given, it is the maximum number of seconds to wait. If the count +cannot be decremented in that time, returns NIL without decrementing the count." + (with-lock-held ((%semaphore-lock semaphore)) + (if (>= (%semaphore-counter semaphore) 1) + (decf (%semaphore-counter semaphore)) + (let ((deadline (when timeout + (+ (get-internal-real-time) + (* timeout internal-time-units-per-second))))) + ;; we need this loop because of a spurious wakeup possibility + (loop until (>= (%semaphore-counter semaphore) 1) + do (cond + ((null (condition-wait (%semaphore-condition-variable semaphore) + (%semaphore-lock semaphore) + :timeout timeout)) + (return-from wait-on-semaphore)) + ;; unfortunately cv-wait may return T on timeout too + ((and deadline (>= (get-internal-real-time) deadline)) + (return-from wait-on-semaphore)) + (timeout + (setf timeout (/ (- deadline (get-internal-real-time)) + internal-time-units-per-second))))) + (decf (%semaphore-counter semaphore)))))) + +(defdfun semaphore-p (object) + "Returns T if OBJECT is a semaphore; returns NIL otherwise." + (typep object 'semaphore)) + +;;; Introspection/debugging + +;;; The following functions may be provided for debugging purposes, +;;; but are not advised to be called from normal user code. + +(defdfun all-threads () + "Returns a sequence of all of the threads. This may not + be freshly-allocated, so the caller should not modify it." + (error (make-threading-support-error))) + +(defdfun interrupt-thread (thread function) + "Interrupt THREAD and cause it to evaluate FUNCTION + before continuing with the interrupted path of execution. This may + not be a good idea if THREAD is holding locks or doing anything + important. On systems that do not support multiple threads, this + function signals an error." + (declare (ignore thread function)) + (error (make-threading-support-error))) + +(defdfun destroy-thread (thread) + "Terminates the thread THREAD, which is an object + as returned by MAKE-THREAD. This should be used with caution: it is + implementation-defined whether the thread runs cleanup forms or + releases its locks first. + + Destroying the calling thread is an error." + (declare (ignore thread)) + (error (make-threading-support-error))) + +(defdfun thread-alive-p (thread) + "Returns true if THREAD is alive, that is, if + DESTROY-THREAD has not been called on it." + (declare (ignore thread)) + (error (make-threading-support-error))) + +(defdfun join-thread (thread) + "Wait until THREAD terminates. If THREAD has already terminated, + return immediately. The return values of the thread function are + returned." + (declare (ignore thread)) + (error (make-threading-support-error))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/src/impl-abcl.lisp b/sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/src/impl-abcl.lisp new file mode 100644 index 0000000..c9ccb36 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/src/impl-abcl.lisp @@ -0,0 +1,150 @@ +;;;; -*- indent-tabs-mode: nil -*- + +#| +Copyright 2006, 2007 Greg Pfeil + +Reimplemented with java.util.concurrent.locks.ReentrantLock by Mark Evenson 2011. + +Distributed under the MIT license (see LICENSE file) +|# + +(in-package #:bordeaux-threads) + +;;; the implementation of the Armed Bear thread interface can be found in +;;; src/org/armedbear/lisp/LispThread.java + +(deftype thread () + 'threads:thread) + +;;; Thread Creation + +(defun %make-thread (function name) + (threads:make-thread function :name name)) + +(defun current-thread () + (threads:current-thread)) + +(defun thread-name (thread) + (threads:thread-name thread)) + +(defun threadp (object) + (typep object 'thread)) + +;;; Resource contention: locks and recursive locks + +(defstruct mutex name lock) +(defstruct (mutex-recursive (:include mutex))) + +;; Making methods constants in this manner avoids the runtime expense of +;; introspection involved in JCALL with string arguments. +(defconstant +lock+ + (jmethod "java.util.concurrent.locks.ReentrantLock" "lock")) +(defconstant +try-lock+ + (jmethod "java.util.concurrent.locks.ReentrantLock" "tryLock")) +(defconstant +is-held-by-current-thread+ + (jmethod "java.util.concurrent.locks.ReentrantLock" "isHeldByCurrentThread")) +(defconstant +unlock+ + (jmethod "java.util.concurrent.locks.ReentrantLock" "unlock")) +(defconstant +get-hold-count+ + (jmethod "java.util.concurrent.locks.ReentrantLock" "getHoldCount")) + +(deftype lock () 'mutex) + +(deftype recursive-lock () 'mutex-recursive) + +(defun lock-p (object) + (typep object 'mutex)) + +(defun recursive-lock-p (object) + (typep object 'mutex-recursive)) + +(defun make-lock (&optional name) + (make-mutex + :name (or name "Anonymous lock") + :lock (jnew "java.util.concurrent.locks.ReentrantLock"))) + +(defun acquire-lock (lock &optional (wait-p t)) + (check-type lock mutex) + (when (jcall +is-held-by-current-thread+ (mutex-lock lock)) + (error "Non-recursive lock being reacquired by owner.")) + (cond + (wait-p + (jcall +lock+ (mutex-lock lock)) + t) + (t (jcall +try-lock+ (mutex-lock lock))))) + +(defun release-lock (lock) + (check-type lock mutex) + (unless (jcall +is-held-by-current-thread+ (mutex-lock lock)) + (error "Attempt to release lock not held by calling thread.")) + (jcall +unlock+ (mutex-lock lock)) + (values)) + +(defun make-recursive-lock (&optional name) + (make-mutex-recursive + :name (or name "Anonymous lock") + :lock (jnew "java.util.concurrent.locks.ReentrantLock"))) + +(defun acquire-recursive-lock (lock &optional (wait-p t)) + (check-type lock mutex-recursive) + (cond + (wait-p + (jcall +lock+ (mutex-recursive-lock lock)) + t) + (t (jcall +try-lock+ (mutex-recursive-lock lock))))) + +(defun release-recursive-lock (lock) + (check-type lock mutex-recursive) + (unless (jcall +is-held-by-current-thread+ (mutex-lock lock)) + (error "Attempt to release lock not held by calling thread.")) + (jcall +unlock+ (mutex-lock lock)) + (values)) + +;;; Resource contention: condition variables + +(defun thread-yield () + (java:jstatic "yield" "java.lang.Thread")) + +(defstruct condition-variable + (name "Anonymous condition variable")) + +(defun condition-wait (condition lock &key timeout) + (threads:synchronized-on condition + (release-lock lock) + (if timeout + ;; Since giving a zero time value to threads:object-wait means + ;; an indefinite wait, use some arbitrary small number. + (threads:object-wait condition + (if (zerop timeout) + least-positive-single-float + timeout)) + (threads:object-wait condition))) + (acquire-lock lock) + t) + +(defun condition-notify (condition) + (threads:synchronized-on condition + (threads:object-notify condition))) + +;;; Introspection/debugging + +(defun all-threads () + (let ((threads ())) + (threads:mapcar-threads (lambda (thread) + (push thread threads))) + (reverse threads))) + +(defun interrupt-thread (thread function &rest args) + (apply #'threads:interrupt-thread thread function args)) + +(defun destroy-thread (thread) + (signal-error-if-current-thread thread) + (threads:destroy-thread thread)) + +(defun thread-alive-p (thread) + (threads:thread-alive-p thread)) + +(defun join-thread (thread) + (threads:thread-join thread)) + +(mark-supported) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/src/impl-allegro.lisp b/sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/src/impl-allegro.lisp new file mode 100644 index 0000000..e648bde --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/src/impl-allegro.lisp @@ -0,0 +1,143 @@ +;;;; -*- indent-tabs-mode: nil -*- + +#| +Copyright 2006, 2007 Greg Pfeil + +Distributed under the MIT license (see LICENSE file) +|# + +(in-package #:bordeaux-threads) + +;;; documentation on the Allegro Multiprocessing interface can be found at +;;; http://www.franz.com/support/documentation/8.1/doc/multiprocessing.htm + +;;; Resource contention: locks and recursive locks + +(deftype lock () 'mp:process-lock) + +(deftype recursive-lock () 'mp:process-lock) + +(defun lock-p (object) + (typep object 'mp:process-lock)) + +(defun recursive-lock-p (object) + (typep object 'mp:process-lock)) + +(defun make-lock (&optional name) + (mp:make-process-lock :name (or name "Anonymous lock"))) + +(defun make-recursive-lock (&optional name) + (mp:make-process-lock :name (or name "Anonymous recursive lock"))) + +(defun acquire-lock (lock &optional (wait-p t)) + (mp:process-lock lock mp:*current-process* "Lock" (if wait-p nil 0))) + +(defun release-lock (lock) + (mp:process-unlock lock)) + +(defmacro with-lock-held ((place) &body body) + `(mp:with-process-lock (,place :norecursive t) + ,@body)) + +(defmacro with-recursive-lock-held ((place &key timeout) &body body) + `(mp:with-process-lock (,place :timeout ,timeout) + ,@body)) + +;;; Resource contention: condition variables + +(defun make-condition-variable (&key name) + (declare (ignorable name)) + #-(version>= 9) + (mp:make-gate nil) + #+(version>= 9) + (mp:make-condition-variable :name name)) + +(defun condition-wait (condition-variable lock &key timeout) + #-(version>= 9) + (progn + (release-lock lock) + (if timeout + (mp:process-wait-with-timeout "wait for message" timeout + #'mp:gate-open-p condition-variable) + (mp:process-wait "wait for message" #'mp:gate-open-p condition-variable)) + (acquire-lock lock) + (mp:close-gate condition-variable)) + #+(version>= 9) + (mp:condition-variable-wait condition-variable lock :timeout timeout) + t) + +(defun condition-notify (condition-variable) + #-(version>= 9) + (mp:open-gate condition-variable) + #+(version>= 9) + (mp:condition-variable-signal condition-variable)) + +(defun thread-yield () + (mp:process-allow-schedule)) + +(deftype thread () + 'mp:process) + +;;; Thread Creation + +(defun start-multiprocessing () + (mp:start-scheduler)) + +(defun %make-thread (function name) + #+smp + (mp:process-run-function name function) + #-smp + (mp:process-run-function + name + (lambda () + (let ((return-values + (multiple-value-list (funcall function)))) + (setf (getf (mp:process-property-list mp:*current-process*) + 'return-values) + return-values) + (values-list return-values))))) + +(defun current-thread () + mp:*current-process*) + +(defun threadp (object) + (typep object 'mp:process)) + +(defun thread-name (thread) + (mp:process-name thread)) + +;;; Timeouts + +(defmacro with-timeout ((timeout) &body body) + (once-only (timeout) + `(mp:with-timeout (,timeout (error 'timeout :length ,timeout)) + ,@body))) + +;;; Introspection/debugging + +(defun all-threads () + mp:*all-processes*) + +(defun interrupt-thread (thread function &rest args) + (apply #'mp:process-interrupt thread function args)) + +(defun destroy-thread (thread) + (signal-error-if-current-thread thread) + (mp:process-kill thread)) + +(defun thread-alive-p (thread) + (mp:process-alive-p thread)) + +(defun join-thread (thread) + #+smp + (values-list (mp:process-join thread)) + #-smp + (progn + (mp:process-wait (format nil "Waiting for thread ~A to complete" thread) + (complement #'mp:process-alive-p) + thread) + (let ((return-values + (getf (mp:process-property-list thread) 'return-values))) + (values-list return-values)))) + +(mark-supported) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/src/impl-clasp.lisp b/sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/src/impl-clasp.lisp new file mode 100644 index 0000000..e268ac1 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/src/impl-clasp.lisp @@ -0,0 +1,111 @@ +;;;; -*- indent-tabs-mode: nil -*- + +#| +Copyright 2006, 2007 Greg Pfeil + +Distributed under the MIT license (see LICENSE file) +|# + +(in-package #:bordeaux-threads) + +;;; documentation on the ECL Multiprocessing interface can be found at +;;; http://ecls.sourceforge.net/cgi-bin/view/Main/MultiProcessing + +(deftype thread () + 'mp:process) + +;;; Thread Creation + +(defun %make-thread (function name) + (mp:process-run-function name function bordeaux-threads:*default-special-bindings*)) + +(defun current-thread () + mp:*current-process*) + +(defun threadp (object) + (typep object 'mp:process)) + +(defun thread-name (thread) + (mp:process-name thread)) + +;;; Resource contention: locks and recursive locks + +(deftype lock () 'mp:mutex) + +(deftype recursive-lock () + '(and mp:mutex (satisfies mp:recursive-lock-p))) + +(defun lock-p (object) + (typep object 'mp:mutex)) + +(defun recursive-lock-p (object) + (and (typep object 'mp:lock) + (mp:recursive-lock-p object))) + +(defun make-lock (&optional name) + (mp:make-lock :name (or name :anonymous))) + +(defun acquire-lock (lock &optional (wait-p t)) + (mp:get-lock lock wait-p)) + +(defun release-lock (lock) + (mp:giveup-lock lock)) + + +(defmacro with-lock-held ((place) &body body) + `(mp:with-lock (,place) ,@body)) + +(defun make-recursive-lock (&optional name) + (mp:make-recursive-mutex (or name :anonymous-recursive-lock))) + +(defun acquire-recursive-lock (lock &optional (wait-p t)) + (mp:get-lock lock wait-p)) + +(defun release-recursive-lock (lock) + (mp:giveup-lock lock)) + +(defmacro with-recursive-lock-held ((place) &body body) + `(mp:with-lock (,place) ,@body)) + +;;; Resource contention: condition variables + +(defun make-condition-variable (&key name) + (declare (ignore name)) + (mp:make-condition-variable)) + +(defun condition-wait (condition-variable lock &key timeout) + (if timeout + (mp:condition-variable-timedwait condition-variable lock timeout) + (mp:condition-variable-wait condition-variable lock)) + t) + +(defun condition-notify (condition-variable) + (mp:condition-variable-signal condition-variable)) + +(defun thread-yield () + (mp:process-yield)) + +;;; Introspection/debugging + +(defun all-threads () + (mp:all-processes)) + +(defun interrupt-thread (thread function &rest args) + (flet ((apply-function () + (if args + (lambda () (apply function args)) + function))) + (declare (dynamic-extent #'apply-function)) + (mp:interrupt-process thread (apply-function)))) + +(defun destroy-thread (thread) + (signal-error-if-current-thread thread) + (mp:process-kill thread)) + +(defun thread-alive-p (thread) + (mp:process-active-p thread)) + +(defun join-thread (thread) + (mp:process-join thread)) + +(mark-supported) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/src/impl-clisp.lisp b/sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/src/impl-clisp.lisp new file mode 100644 index 0000000..7ae8cab --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/src/impl-clisp.lisp @@ -0,0 +1,105 @@ +;;;; -*- indent-tabs-mode: nil -*- + +#| +Copyright 2006, 2007 Greg Pfeil + +Distributed under the MIT license (see LICENSE file) +|# + +(in-package #:bordeaux-threads) + +(deftype thread () + 'mt:thread) + +;;; Thread Creation +(defun %make-thread (function name) + (mt:make-thread function + :name name + :initial-bindings mt:*default-special-bindings*)) + +(defun current-thread () + (mt:current-thread)) + +(defun threadp (object) + (mt:threadp object)) + +(defun thread-name (thread) + (mt:thread-name thread)) + +;;; Resource contention: locks and recursive locks + +(deftype lock () 'mt:mutex) + +(deftype recursive-lock () + '(and mt:mutex (satisfies mt:mutex-recursive-p))) + +(defun lock-p (object) + (typep object 'mt:mutex)) + +(defun recursive-lock-p (object) + (and (typep object 'mt:mutex) + (mt:mutex-recursive-p object))) + +(defun make-lock (&optional name) + (mt:make-mutex :name (or name "Anonymous lock"))) + +(defun acquire-lock (lock &optional (wait-p t)) + (mt:mutex-lock lock :timeout (if wait-p nil 0))) + +(defun release-lock (lock) + (mt:mutex-unlock lock)) + +(defmacro with-lock-held ((place) &body body) + `(mt:with-mutex-lock (,place) ,@body)) + +(defun make-recursive-lock (&optional name) + (mt:make-mutex :name (or name "Anonymous recursive lock") + :recursive-p t)) + +(defmacro with-recursive-lock-held ((place) &body body) + `(mt:with-mutex-lock (,place) ,@body)) + +;;; Resource contention: condition variables + +(defun make-condition-variable (&key name) + (mt:make-exemption :name (or name "Anonymous condition variable"))) + +(defun condition-wait (condition-variable lock &key timeout) + (mt:exemption-wait condition-variable lock :timeout timeout) + t) + +(defun condition-notify (condition-variable) + (mt:exemption-signal condition-variable)) + +(defun thread-yield () + (mt:thread-yield)) + +;;; Timeouts + +(defmacro with-timeout ((timeout) &body body) + (once-only (timeout) + `(mt:with-timeout (,timeout (error 'timeout :length ,timeout)) + ,@body))) + +;;; Introspection/debugging + +;;; VTZ: mt:list-threads returns all threads that are not garbage collected. +(defun all-threads () + (delete-if-not #'mt:thread-active-p (mt:list-threads))) + +(defun interrupt-thread (thread function &rest args) + (mt:thread-interrupt thread :function function :arguments args)) + +(defun destroy-thread (thread) + ;;; VTZ: actually we can kill ourselelf. + ;;; suicide is part of our contemporary life :) + (signal-error-if-current-thread thread) + (mt:thread-interrupt thread :function t)) + +(defun thread-alive-p (thread) + (mt:thread-active-p thread)) + +(defun join-thread (thread) + (mt:thread-join thread)) + +(mark-supported) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/src/impl-clozure.lisp b/sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/src/impl-clozure.lisp new file mode 100644 index 0000000..f9dc61b --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/src/impl-clozure.lisp @@ -0,0 +1,130 @@ +;;;; -*- indent-tabs-mode: nil -*- + +#| +Copyright 2006, 2007 Greg Pfeil + +Distributed under the MIT license (see LICENSE file) +|# + +(in-package #:bordeaux-threads) + +;;; documentation on the OpenMCL Threads interface can be found at +;;; http://openmcl.clozure.com/Doc/Programming-with-Threads.html + +(deftype thread () + 'ccl:process) + +;;; Thread Creation + +(defun %make-thread (function name) + (ccl:process-run-function name function)) + +(defun current-thread () + ccl:*current-process*) + +(defun threadp (object) + (typep object 'ccl:process)) + +(defun thread-name (thread) + (ccl:process-name thread)) + +;;; Resource contention: locks and recursive locks + +(deftype lock () 'ccl:lock) + +(deftype recursive-lock () 'ccl:lock) + +(defun lock-p (object) + (typep object 'ccl:lock)) + +(defun recursive-lock-p (object) + (typep object 'ccl:lock)) + +(defun make-lock (&optional name) + (ccl:make-lock (or name "Anonymous lock"))) + +(defun acquire-lock (lock &optional (wait-p t)) + (if wait-p + (ccl:grab-lock lock) + (ccl:try-lock lock))) + +(defun release-lock (lock) + (ccl:release-lock lock)) + +(defmacro with-lock-held ((place) &body body) + `(ccl:with-lock-grabbed (,place) + ,@body)) + +(defun make-recursive-lock (&optional name) + (ccl:make-lock (or name "Anonymous recursive lock"))) + +(defun acquire-recursive-lock (lock) + (ccl:grab-lock lock)) + +(defun release-recursive-lock (lock) + (ccl:release-lock lock)) + +(defmacro with-recursive-lock-held ((place) &body body) + `(ccl:with-lock-grabbed (,place) + ,@body)) + +;;; Resource contention: condition variables + +(defun make-condition-variable (&key name) + (declare (ignore name)) + (ccl:make-semaphore)) + +(defun condition-wait (condition-variable lock &key timeout) + (release-lock lock) + (unwind-protect + (if timeout + (ccl:timed-wait-on-semaphore condition-variable timeout) + (ccl:wait-on-semaphore condition-variable)) + (acquire-lock lock t)) + t) + +(defun condition-notify (condition-variable) + (ccl:signal-semaphore condition-variable)) + +(defun thread-yield () + (ccl:process-allow-schedule)) + +;;; Semaphores + +(deftype semaphore () + 'ccl:semaphore) + +(defun make-semaphore (&key name (count 0)) + (declare (ignore name)) + (let ((semaphore (ccl:make-semaphore))) + (dotimes (c count) (ccl:signal-semaphore semaphore)) + semaphore)) + +(defun signal-semaphore (semaphore &key (count 1)) + (dotimes (c count) (ccl:signal-semaphore semaphore))) + +(defun wait-on-semaphore (semaphore &key timeout) + (if timeout + (ccl:timed-wait-on-semaphore semaphore timeout) + (ccl:wait-on-semaphore semaphore))) + +;;; Introspection/debugging + +(defun all-threads () + (ccl:all-processes)) + +(defun interrupt-thread (thread function &rest args) + (declare (dynamic-extent args)) + (apply #'ccl:process-interrupt thread function args)) + +(defun destroy-thread (thread) + (signal-error-if-current-thread thread) + (ccl:process-kill thread)) + +(defun thread-alive-p (thread) + (not (ccl:process-exhausted-p thread))) + +(defun join-thread (thread) + (ccl:join-process thread)) + +(mark-supported) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/src/impl-cmucl.lisp b/sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/src/impl-cmucl.lisp new file mode 100644 index 0000000..d3a6de2 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/src/impl-cmucl.lisp @@ -0,0 +1,161 @@ +;;;; -*- indent-tabs-mode: nil -*- + +#| +Copyright 2006, 2007 Greg Pfeil + +Distributed under the MIT license (see LICENSE file) +|# + +(in-package #:bordeaux-threads) + +(deftype thread () + 'mp::process) + +;;; Thread Creation + +(defun start-multiprocessing () + (mp::startup-idle-and-top-level-loops)) + +(defun %make-thread (function name) + #+#.(cl:if (cl:find-symbol (cl:string '#:process-join) :mp) '(and) '(or)) + (mp:make-process function :name name) + #-#.(cl:if (cl:find-symbol (cl:string '#:process-join) :mp) '(and) '(or)) + (mp:make-process (lambda () + (let ((return-values + (multiple-value-list (funcall function)))) + (setf (getf (mp:process-property-list mp:*current-process*) + 'return-values) + return-values) + (values-list return-values))) + :name name)) + +(defun current-thread () + mp:*current-process*) + +(defmethod threadp (object) + (mp:processp object)) + +(defun thread-name (thread) + (mp:process-name thread)) + +;;; Resource contention: locks and recursive locks + +(deftype lock () 'mp::error-check-lock) + +(deftype recursive-lock () 'mp::recursive-lock) + +(defun lock-p (object) + (typep object 'mp::error-check-lock)) + +(defun recursive-lock-p (object) + (typep object 'mp::recursive-lock)) + +(defun make-lock (&optional name) + (mp:make-lock (or name "Anonymous lock") + :kind :error-check)) + +(defun acquire-lock (lock &optional (wait-p t)) + (if wait-p + (mp::lock-wait lock "Lock wait") + (mp::lock-wait-with-timeout lock "Lock wait" 0))) + +(defun release-lock (lock) + (setf (mp::lock-process lock) nil)) + +(defmacro with-lock-held ((place) &body body) + `(mp:with-lock-held (,place "Lock wait") ,@body)) + +(defun make-recursive-lock (&optional name) + (mp:make-lock (or name "Anonymous recursive lock") + :kind :recursive)) + +(defun acquire-recursive-lock (lock &optional (wait-p t)) + (acquire-lock lock)) + +(defun release-recursive-lock (lock) + (release-lock lock)) + +(defmacro with-recursive-lock-held ((place &key timeout) &body body) + `(mp:with-lock-held (,place "Lock Wait" :timeout ,timeout) ,@body)) + +;;; Note that the locks _are_ recursive, but not "balanced", and only +;;; checked if they are being held by the same process by with-lock-held. +;;; The default with-lock-held in bordeaux-mp.lisp sort of works, in that +;;; it will wait for recursive locks by the same process as well. + +;;; Resource contention: condition variables + +;;; There's some stuff in x86-vm.lisp that might be worth investigating +;;; whether to build on. There's also process-wait and friends. + +(defstruct condition-var + "CMUCL doesn't have conditions, so we need to create our own type." + name + lock + active) + +(defun make-condition-variable (&key name) + (make-condition-var :lock (make-lock) + :name (or name "Anonymous condition variable"))) + +(defun condition-wait (condition-variable lock &key timeout) + (signal-error-if-condition-wait-timeout timeout) + (check-type condition-variable condition-var) + (with-lock-held ((condition-var-lock condition-variable)) + (setf (condition-var-active condition-variable) nil)) + (release-lock lock) + (mp:process-wait "Condition Wait" + #'(lambda () (condition-var-active condition-variable))) + (acquire-lock lock) + t) + +(define-condition-wait-compiler-macro) + +(defun condition-notify (condition-variable) + (check-type condition-variable condition-var) + (with-lock-held ((condition-var-lock condition-variable)) + (setf (condition-var-active condition-variable) t)) + (thread-yield)) + +(defun thread-yield () + (mp:process-yield)) + +;;; Timeouts + +(defmacro with-timeout ((timeout) &body body) + (once-only (timeout) + `(mp:with-timeout (,timeout (error 'timeout :length ,timeout)) + ,@body))) + +;;; Introspection/debugging + +(defun all-threads () + (mp:all-processes)) + +(defun interrupt-thread (thread function &rest args) + (flet ((apply-function () + (if args + (lambda () (apply function args)) + function))) + (declare (dynamic-extent #'apply-function)) + (mp:process-interrupt thread (apply-function)))) + +(defun destroy-thread (thread) + (signal-error-if-current-thread thread) + (mp:destroy-process thread)) + +(defun thread-alive-p (thread) + (mp:process-active-p thread)) + +(defun join-thread (thread) + #+#.(cl:if (cl:find-symbol (cl:string '#:process-join) :mp) '(and) '(or)) + (mp:process-join thread) + #-#.(cl:if (cl:find-symbol (cl:string '#:process-join) :mp) '(and) '(or)) + (progn + (mp:process-wait (format nil "Waiting for thread ~A to complete" thread) + (lambda () (not (mp:process-alive-p thread)))) + (let ((return-values + (getf (mp:process-property-list thread) 'return-values))) + (values-list return-values)))) + +(mark-supported) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/src/impl-corman.lisp b/sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/src/impl-corman.lisp new file mode 100644 index 0000000..dad4524 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/src/impl-corman.lisp @@ -0,0 +1,26 @@ +;;;; -*- indent-tabs-mode: nil -*- + +#| +Copyright 2006, 2007 Greg Pfeil + +Distributed under the MIT license (see LICENSE file) +|# + +(in-package #:bordeaux-threads) + +;;; Thread Creation + +(defun %make-thread (function name) + (declare (ignore name)) + (threads:create-thread function)) + +(defun current-thread () + threads:*current-thread*) + +;;; Introspection/debugging + +(defun destroy-thread (thread) + (signal-error-if-current-thread thread) + (threads:terminate-thread thread)) + +(mark-supported) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/src/impl-ecl.lisp b/sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/src/impl-ecl.lisp new file mode 100644 index 0000000..50c4f27 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/src/impl-ecl.lisp @@ -0,0 +1,111 @@ +;;;; -*- indent-tabs-mode: nil -*- + +#| +Copyright 2006, 2007 Greg Pfeil + +Distributed under the MIT license (see LICENSE file) +|# + +(in-package #:bordeaux-threads) + +;;; documentation on the ECL Multiprocessing interface can be found at +;;; http://ecls.sourceforge.net/cgi-bin/view/Main/MultiProcessing + +(deftype thread () + 'mp:process) + +;;; Thread Creation + +(defun %make-thread (function name) + (mp:process-run-function name function)) + +(defun current-thread () + mp::*current-process*) + +(defun threadp (object) + (typep object 'mp:process)) + +(defun thread-name (thread) + (mp:process-name thread)) + +;;; Resource contention: locks and recursive locks + +(deftype lock () 'mp:lock) + +(deftype recursive-lock () + '(and mp:lock (satisfies mp:recursive-lock-p))) + +(defun lock-p (object) + (typep object 'mp:lock)) + +(defun recursive-lock-p (object) + (and (typep object 'mp:lock) + (mp:recursive-lock-p object))) + +(defun make-lock (&optional name) + (mp:make-lock :name (or name "Anonymous lock"))) + +(defun acquire-lock (lock &optional (wait-p t)) + (mp:get-lock lock wait-p)) + +(defun release-lock (lock) + (mp:giveup-lock lock)) + +(defmacro with-lock-held ((place) &body body) + `(mp:with-lock (,place) ,@body)) + +(defun make-recursive-lock (&optional name) + (mp:make-lock :name (or name "Anonymous recursive lock") :recursive t)) + +(defun acquire-recursive-lock (lock &optional (wait-p t)) + (mp:get-lock lock wait-p)) + +(defun release-recursive-lock (lock) + (mp:giveup-lock lock)) + +(defmacro with-recursive-lock-held ((place) &body body) + `(mp:with-lock (,place) ,@body)) + +;;; Resource contention: condition variables + +(defun make-condition-variable (&key name) + (declare (ignore name)) + (mp:make-condition-variable)) + +(defun condition-wait (condition-variable lock &key timeout) + (if timeout + (handler-case (with-timeout (timeout) + (mp:condition-variable-wait condition-variable lock)) + (timeout () nil)) + (mp:condition-variable-wait condition-variable lock))) + +(defun condition-notify (condition-variable) + (mp:condition-variable-signal condition-variable)) + +(defun thread-yield () + (mp:process-yield)) + +;;; Introspection/debugging + +(defun all-threads () + (mp:all-processes)) + +(defun interrupt-thread (thread function &rest args) + (flet ((apply-function () + (if args + (lambda () (apply function args)) + function))) + (declare (dynamic-extent #'apply-function)) + (mp:interrupt-process thread (apply-function)))) + +(defun destroy-thread (thread) + (signal-error-if-current-thread thread) + (mp:process-kill thread)) + +(defun thread-alive-p (thread) + (mp:process-active-p thread)) + +(defun join-thread (thread) + (mp:process-join thread)) + +(mark-supported) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/src/impl-genera.lisp b/sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/src/impl-genera.lisp new file mode 100644 index 0000000..c8c3e6c --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/src/impl-genera.lisp @@ -0,0 +1,136 @@ +;;;; -*- Mode: LISP; Syntax: Ansi-Common-Lisp; Package: BORDEAUX-THREADS; Base: 10; -*- + +#| +Distributed under the MIT license (see LICENSE file) +|# + +(in-package #:bordeaux-threads) + +(deftype thread () + 'process:process) + +;;; Thread Creation + +(defun %make-thread (function name) + (process:process-run-function name function)) + +(defun current-thread () + scl:*current-process*) + +(defun threadp (object) + (process:process-p object)) + +(defun thread-name (thread) + (process:process-name thread)) + +;;; Resource contention: locks and recursive locks + +(defstruct (lock (:constructor make-lock-internal)) + lock + lock-argument) + +(defun make-lock (&optional name) + (let ((lock (process:make-lock (or name "Anonymous lock")))) + (make-lock-internal :lock lock + :lock-argument nil))) + +(defun acquire-lock (lock &optional (wait-p t)) + (check-type lock lock) + (setf (lock-lock-argument lock) (process:make-lock-argument (lock-lock lock))) + (if wait-p + (process:lock (lock-lock lock) (lock-lock-argument lock)) + (process:with-no-other-processes + (when (process:lock-lockable-p (lock-lock lock)) + (process:lock (lock-lock lock) (lock-lock-argument lock)))))) + +(defun release-lock (lock) + (check-type lock lock) + (process:unlock (lock-lock lock) (scl:shiftf (lock-lock-argument lock) nil))) + +(defmacro with-lock-held ((place) &body body) + `(process:with-lock ((lock-lock ,place)) + ,@body)) + +(defstruct (recursive-lock (:constructor make-recursive-lock-internal)) + lock + lock-arguments) + +(defun make-recursive-lock (&optional name) + (make-recursive-lock-internal :lock (process:make-lock (or name "Anonymous recursive lock") + :recursive t) + :lock-arguments nil)) + +(defun acquire-recursive-lock (lock) + (check-type lock recursive-lock) + (process:lock (recursive-lock-lock lock) + (car (push (process:make-lock-argument (recursive-lock-lock lock)) + (recursive-lock-lock-arguments lock))))) + +(defun release-recursive-lock (lock) + (check-type lock recursive-lock) + (process:unlock (recursive-lock-lock lock) (pop (recursive-lock-lock-arguments lock)))) + +(defmacro with-recursive-lock-held ((place) &body body) + `(process:with-lock ((recursive-lock-lock ,place)) + ,@body)) + +;;; Resource contention: condition variables + +(eval-when (:compile-toplevel :load-toplevel :execute) +(defstruct (condition-variable (:constructor %make-condition-variable)) + name + (waiters nil)) +) + +(defun make-condition-variable (&key name) + (%make-condition-variable :name name)) + +(defun condition-wait (condition-variable lock) + (check-type condition-variable condition-variable) + (check-type lock lock) + (process:with-no-other-processes + (let ((waiter (cons scl:*current-process* nil))) + (process:atomic-updatef (condition-variable-waiters condition-variable) + #'(lambda (waiters) + (append waiters (scl:ncons waiter)))) + (process:without-lock ((lock-lock lock)) + (process:process-block (format nil "Waiting~@[ on ~A~]" + (condition-variable-name condition-variable)) + #'(lambda (waiter) + (not (null (cdr waiter)))) + waiter))))) + +(defun condition-notify (condition-variable) + (check-type condition-variable condition-variable) + (let ((waiter (process:atomic-pop (condition-variable-waiters condition-variable)))) + (when waiter + (setf (cdr waiter) t) + (process:wakeup (car waiter)))) + (values)) + +(defun thread-yield () + (scl:process-allow-schedule)) + +;;; Introspection/debugging + +(defun all-threads () + process:*all-processes*) + +(defun interrupt-thread (thread function &rest args) + (declare (dynamic-extent args)) + (apply #'process:process-interrupt thread function args)) + +(defun destroy-thread (thread) + (signal-error-if-current-thread thread) + (process:process-kill thread :without-aborts :force)) + +(defun thread-alive-p (thread) + (process:process-active-p thread)) + +(defun join-thread (thread) + (process:process-wait (format nil "Join ~S" thread) + #'(lambda (thread) + (not (process:process-active-p thread))) + thread)) + +(mark-supported) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/src/impl-lispworks-condition-variables.lisp b/sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/src/impl-lispworks-condition-variables.lisp new file mode 100644 index 0000000..d33123d --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/src/impl-lispworks-condition-variables.lisp @@ -0,0 +1,144 @@ +;;;; -*- indent-tabs-mode: nil -*- + +(in-package #:bordeaux-threads) + +;; Lispworks condition support is simulated, albeit via a lightweight wrapper over +;; its own polling-based wait primitive. Waiters register with the condition variable, +;; and use MP:process-wait which queries for permission to proceed at its own (usspecified) interval. +;; http://www.lispworks.com/documentation/lw51/LWRM/html/lwref-445.htm +;; A wakeup callback (on notify) is provided to lighten this query to not have to do a hash lookup +;; on every poll (or have to serialize on the condition variable) and a mechanism is put +;; in place to unregister any waiter that exits wait for other reasons, +;; and to resend any (single) notification that may have been consumed before this (corner +;; case). Much of the complexity present is to support single notification (as recommended in +;; the spec); but a distinct condition-notify-all is provided for reference. +;; Single-notification follows a first-in first-out ordering +;; +;; Performance: With 1000 threads waiting on one condition-variable, the steady-state hit (at least +;; as tested on a 3GHz Win32 box) is noise - hovering at 0% on Task manager. +;; While not true zero like a true native solution, the use of the Lispworks native checks appear +;; fast enough to be an equivalent substitute (thread count will cause issue before the +;; waiting overhead becomes significant) +(defstruct (condition-variable (:constructor make-lw-condition (name))) + name + (lock (mp:make-lock :name "For condition-variable") :type mp:lock :read-only t) + (wait-tlist (cons nil nil) :type cons :read-only t) + (wait-hash (make-hash-table :test 'eq) :type hash-table :read-only t) + ;; unconsumed-notifications is to track :remove-from-consideration + ;; for entries that may have exited prematurely - notification is sent through + ;; to someone else, and offender is removed from hash and list + (unconsumed-notifications (make-hash-table :test 'eq) :type hash-table :read-only t)) + +(defun make-condition-variable (&key name) + (make-lw-condition name)) + +(defmacro with-cv-access (condition-variable &body body) + (let ((cv-sym (gensym)) + (slots '(lock wait-tlist wait-hash unconsumed-notifications))) + `(let ((,cv-sym ,condition-variable)) + (with-slots ,slots + ,cv-sym + (macrolet ((locked (&body body) `(mp:with-lock (lock) ,@body))) + (labels ((,(gensym) () ,@slots))) ; Trigger expansion of the symbol-macrolets to ignore + ,@body))))) + +(defmacro defcvfun (function-name (condition-variable &rest args) &body body) + `(defun ,function-name (,condition-variable ,@args) + (with-cv-access ,condition-variable + ,@body))) +#+lispworks (editor:setup-indent "defcvfun" 2 2 7) ; indent defcvfun + +; utility function thath assumes process is locked on condition-variable's lock. +(defcvfun do-notify-single (condition-variable) ; assumes already locked + (let ((id (caar wait-tlist))) + (when id + (pop (car wait-tlist)) + (unless (car wait-tlist) ; check for empty + (setf (cdr wait-tlist) nil)) + (funcall (gethash id wait-hash)) ; call waiter-wakeup + (remhash id wait-hash) ; absence of entry = permission to proceed + (setf (gethash id unconsumed-notifications) t)))) + +;; Added for completeness/to show how it's done in this paradigm; but +;; The symbol for this call is not exposed in the api +(defcvfun condition-notify-all (condition-variable) + (locked + (loop for waiter-wakeup being the hash-values in wait-hash do (funcall waiter-wakeup)) + (clrhash wait-hash) + (clrhash unconsumed-notifications) ; don't care as everyone just got notified + (setf (car wait-tlist) nil) + (setf (cdr wait-tlist) nil))) + +;; Currently implemented so as to notify only one waiting thread +(defcvfun condition-notify (condition-variable) + (locked (do-notify-single condition-variable))) + +(defun delete-from-tlist (tlist element) + (let ((deleter + (lambda () + (setf (car tlist) (cdar tlist)) + (unless (car tlist) + (setf (cdr tlist) nil))))) + (loop for cons in (car tlist) do + (if (eq element (car cons)) + (progn + (funcall deleter) + (return nil)) + (let ((cons cons)) + (setq deleter + (lambda () + (setf (cdr cons) (cddr cons)) + (unless (cdr cons) + (setf (cdr tlist) cons))))))))) + +(defun add-to-tlist-tail (tlist element) + (let ((new-link (cons element nil))) + (cond + ((car tlist) + (setf (cddr tlist) new-link) + (setf (cdr tlist) new-link)) + (t + (setf (car tlist) new-link) + (setf (cdr tlist) new-link))))) + +(defcvfun condition-wait (condition-variable lock- &key timeout) + (signal-error-if-condition-wait-timeout timeout) + (mp:process-unlock lock-) + (unwind-protect ; for the re-taking of the lock. Guarding all of the code + (let ((wakeup-allowed-to-proceed nil) + (wakeup-lock (mp:make-lock :name "wakeup lock for condition-wait"))) + ;; wakeup-allowed-to-proceed is an optimisation to avoid having to serialize all waiters and + ;; search the hashtable. That it is locked is for safety/completeness, although + ;; as wakeup-allowed-to-proceed only transitions nil -> t, and that missing it once or twice is + ;; moot in this situation, it would be redundant even if ever a Lispworks implementation ever became + ;; non-atomic in its assigments + (let ((id (cons nil nil)) + (clean-exit nil)) + (locked + (add-to-tlist-tail wait-tlist id) + (setf (gethash id wait-hash) (lambda () (mp:with-lock (wakeup-lock) (setq wakeup-allowed-to-proceed t))))) + (unwind-protect + (progn + (mp:process-wait + "Waiting for notification" + (lambda () + (when (mp:with-lock (wakeup-lock) wakeup-allowed-to-proceed) + (locked (not (gethash id wait-hash)))))) + (locked (remhash id unconsumed-notifications)) + (setq clean-exit t)) ; Notification was consumed + ;; Have to call remove-from-consideration just in case process was interrupted + ;; rather than having condition met + (unless clean-exit ; clean-exit is just an optimization + (locked + (when (gethash id wait-hash) ; not notified - must have been interrupted + ;; Have to unsubscribe + (remhash id wait-hash) + (delete-from-tlist wait-tlist id)) + ;; note - it's possible to be removed from wait-hash/wait-tlist (in notify-single); but still have an unconsumed notification! + (when (gethash id unconsumed-notifications) ; Must have exited for reasons unrelated to notification + (remhash id unconsumed-notifications) ; Have to pass on the notification to an eligible waiter + (do-notify-single condition-variable))))))) + (mp:process-lock lock-)) + t) + +(define-condition-wait-compiler-macro) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/src/impl-lispworks.lisp b/sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/src/impl-lispworks.lisp new file mode 100644 index 0000000..b12fc94 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/src/impl-lispworks.lisp @@ -0,0 +1,143 @@ +;;;; -*- indent-tabs-mode: nil -*- + +#| +Copyright 2006, 2007 Greg Pfeil + +Distributed under the MIT license (see LICENSE file) +|# + +(in-package #:bordeaux-threads) + +;;; documentation on the LispWorks Multiprocessing interface can be found at +;;; http://www.lispworks.com/documentation/lw445/LWUG/html/lwuser-156.htm + +(deftype thread () + 'mp:process) + +;;; Thread Creation + +(defun start-multiprocessing () + (mp:initialize-multiprocessing)) + +(defun %make-thread (function name) + (mp:process-run-function + name nil + (lambda () + (let ((return-values + (multiple-value-list (funcall function)))) + (setf (mp:process-property 'return-values) + return-values) + (values-list return-values))))) + +(defun current-thread () + #-#.(cl:if (cl:find-symbol (cl:string '#:get-current-process) :mp) '(and) '(or)) + mp:*current-process* + ;; introduced in LispWorks 5.1 + #+#.(cl:if (cl:find-symbol (cl:string '#:get-current-process) :mp) '(and) '(or)) + (mp:get-current-process)) + +(defun threadp (object) + (mp:process-p object)) + +(defun thread-name (thread) + (mp:process-name thread)) + +;;; Resource contention: locks and recursive locks + + +(deftype lock () 'mp:lock) + +#-(or lispworks4 lispworks5) +(deftype recursive-lock () + '(and mp:lock (satisfies mp:lock-recursive-p))) + +(defun lock-p (object) + (typep object 'mp:lock)) + +(defun recursive-lock-p (object) + #+(or lispworks4 lispworks5) + nil + #-(or lispworks4 lispworks5) ; version 6+ + (and (typep object 'mp:lock) + (mp:lock-recursive-p object))) + +(defun make-lock (&optional name) + (mp:make-lock :name (or name "Anonymous lock") + #-(or lispworks4 lispworks5) :recursivep + #-(or lispworks4 lispworks5) nil)) + +(defun acquire-lock (lock &optional (wait-p t)) + (mp:process-lock lock nil + (cond ((null wait-p) 0) + ((numberp wait-p) wait-p) + (t nil)))) + +(defun release-lock (lock) + (mp:process-unlock lock)) + +(defmacro with-lock-held ((place) &body body) + `(mp:with-lock (,place) ,@body)) + +(defun make-recursive-lock (&optional name) + (mp:make-lock :name (or name "Anonymous recursive lock") + #-(or lispworks4 lispworks5) :recursivep + #-(or lispworks4 lispworks5) t)) + +(defun acquire-recursive-lock (lock &optional (wait-p t)) + (acquire-lock lock wait-p)) + +(defun release-recursive-lock (lock) + (release-lock lock)) + +(defmacro with-recursive-lock-held ((place) &body body) + `(mp:with-lock (,place) ,@body)) + +;;; Resource contention: condition variables + +#+(or lispworks6 lispworks7) +(defun make-condition-variable (&key name) + (mp:make-condition-variable :name (or name "Anonymous condition variable"))) + +#+(or lispworks6 lispworks7) +(defun condition-wait (condition-variable lock &key timeout) + (mp:condition-variable-wait condition-variable lock :timeout timeout) + t) + +#+(or lispworks6 lispworks7) +(defun condition-notify (condition-variable) + (mp:condition-variable-signal condition-variable)) + +(defun thread-yield () + (mp:process-allow-scheduling)) + +;;; Introspection/debugging + +(defun all-threads () + (mp:list-all-processes)) + +(defun interrupt-thread (thread function &rest args) + (apply #'mp:process-interrupt thread function args)) + +(defun destroy-thread (thread) + (signal-error-if-current-thread thread) + (mp:process-kill thread)) + +(defun thread-alive-p (thread) + (mp:process-alive-p thread)) + +(declaim (inline %join-thread)) +(defun %join-thread (thread) + #-#.(cl:if (cl:find-symbol (cl:string '#:process-join) :mp) '(and) '(or)) + (mp:process-wait (format nil "Waiting for thread ~A to complete" thread) + (complement #'mp:process-alive-p) + thread) + #+#.(cl:if (cl:find-symbol (cl:string '#:process-join) :mp) '(and) '(or)) + (mp:process-join thread)) + +(defun join-thread (thread) + (%join-thread thread) + (let ((return-values + (mp:process-property 'return-values thread))) + (values-list return-values))) + +(mark-supported) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/src/impl-mcl.lisp b/sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/src/impl-mcl.lisp new file mode 100644 index 0000000..d8e83cf --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/src/impl-mcl.lisp @@ -0,0 +1,68 @@ +;;;; -*- indent-tabs-mode: nil -*- + +#| +Copyright 2006, 2007 Greg Pfeil + +Distributed under the MIT license (see LICENSE file) +|# + +(in-package #:bordeaux-threads) + +(deftype thread () + 'ccl::process) + +;;; Thread Creation + +(defun %make-thread (function name) + (ccl:process-run-function name function)) + +(defun current-thread () + ccl:*current-process*) + +(defun threadp (object) + (ccl::processp object)) + +(defun thread-name (thread) + (ccl:process-name thread)) + +;;; Resource contention: locks and recursive locks + +(deftype lock () 'ccl:lock) + +(defun lock-p (object) + (typep object 'ccl:lock)) + +(defun make-lock (&optional name) + (ccl:make-lock (or name "Anonymous lock"))) + +(defun acquire-lock (lock &optional (wait-p t)) + (if wait-p + (ccl:process-lock lock ccl:*current-process*) + ;; this is broken, but it's better than a no-op + (ccl:without-interrupts + (when (null (ccl::lock.value lock)) + (ccl:process-lock lock ccl:*current-process*))))) + +(defun release-lock (lock) + (ccl:process-unlock lock)) + +(defmacro with-lock-held ((place) &body body) + `(ccl:with-lock-grabbed (,place) ,@body)) + +(defun thread-yield () + (ccl:process-allow-schedule)) + +;;; Introspection/debugging + +(defun all-threads () + ccl:*all-processes*) + +(defun interrupt-thread (thread function &rest args) + (declare (dynamic-extent args)) + (apply #'ccl:process-interrupt thread function args)) + +(defun destroy-thread (thread) + (signal-error-if-current-thread thread) + (ccl:process-kill thread)) + +(mark-supported) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/src/impl-mkcl.lisp b/sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/src/impl-mkcl.lisp new file mode 100644 index 0000000..2ac678c --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/src/impl-mkcl.lisp @@ -0,0 +1,109 @@ +;;;; -*- indent-tabs-mode: nil -*- + +#| +Copyright 2006, 2007 Greg Pfeil +Copyright 2010 Jean-Claude Beaudoin. + +Distributed under the MIT license (see LICENSE file) +|# + +(in-package #:bordeaux-threads) + +(deftype thread () + 'mt:thread) + +;;; Thread Creation + +(defun %make-thread (function name) + (mt:thread-run-function name function)) + +(defun current-thread () + mt::*thread*) + +(defun threadp (object) + (typep object 'mt:thread)) + +(defun thread-name (thread) + (mt:thread-name thread)) + +;;; Resource contention: locks and recursive locks + +(deftype lock () 'mt:lock) + +(deftype recursive-lock () + '(and mt:lock (satisfies mt:recursive-lock-p))) + +(defun lock-p (object) + (typep object 'mt:lock)) + +(defun recursive-lock-p (object) + (and (typep object 'mt:lock) + (mt:recursive-lock-p object))) + +(defun make-lock (&optional name) + (mt:make-lock :name (or name "Anonymous lock"))) + +(defun acquire-lock (lock &optional (wait-p t)) + (mt:get-lock lock wait-p)) + +(defun release-lock (lock) + (mt:giveup-lock lock)) + +(defmacro with-lock-held ((place) &body body) + `(mt:with-lock (,place) ,@body)) + +(defun make-recursive-lock (&optional name) + (mt:make-lock :name (or name "Anonymous recursive lock") :recursive t)) + +(defun acquire-recursive-lock (lock &optional (wait-p t)) + (mt:get-lock lock wait-p)) + +(defun release-recursive-lock (lock) + (mt:giveup-lock lock)) + +(defmacro with-recursive-lock-held ((place) &body body) + `(mt:with-lock (,place) ,@body)) + +;;; Resource contention: condition variables + +(defun make-condition-variable (&key name) + (declare (ignore name)) + (mt:make-condition-variable)) + +(defun condition-wait (condition-variable lock &key timeout) + (signal-error-if-condition-wait-timeout timeout) + (mt:condition-wait condition-variable lock) + t) + +(define-condition-wait-compiler-macro) + +(defun condition-notify (condition-variable) + (mt:condition-signal condition-variable)) + +(defun thread-yield () + (mt:thread-yield)) + +;;; Introspection/debugging + +(defun all-threads () + (mt:all-threads)) + +(defun interrupt-thread (thread function &rest args) + (flet ((apply-function () + (if args + (lambda () (apply function args)) + function))) + (declare (dynamic-extent #'apply-function)) + (mt:interrupt-thread thread (apply-function)))) + +(defun destroy-thread (thread) + (signal-error-if-current-thread thread) + (mt:thread-kill thread)) + +(defun thread-alive-p (thread) + (mt:thread-active-p thread)) + +(defun join-thread (thread) + (mt:thread-join thread)) + +(mark-supported) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/src/impl-null.lisp b/sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/src/impl-null.lisp new file mode 100644 index 0000000..2cf4bbb --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/src/impl-null.lisp @@ -0,0 +1,3 @@ +;;;; -*- indent-tabs-mode: nil -*- + +(in-package #:bordeaux-threads) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/src/impl-sbcl.lisp b/sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/src/impl-sbcl.lisp new file mode 100644 index 0000000..a1b8850 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/src/impl-sbcl.lisp @@ -0,0 +1,130 @@ +;;;; -*- indent-tabs-mode: nil -*- + +#| +Copyright 2006, 2007 Greg Pfeil + +Distributed under the MIT license (see LICENSE file) +|# + +(in-package #:bordeaux-threads) + +;;; documentation on the SBCL Threads interface can be found at +;;; http://www.sbcl.org/manual/Threading.html + +(deftype thread () + 'sb-thread:thread) + +;;; Thread Creation + +(defun %make-thread (function name) + (sb-thread:make-thread function :name name)) + +(defun current-thread () + sb-thread:*current-thread*) + +(defun threadp (object) + (typep object 'sb-thread:thread)) + +(defun thread-name (thread) + (sb-thread:thread-name thread)) + +;;; Resource contention: locks and recursive locks + +(deftype lock () 'sb-thread:mutex) + +(deftype recursive-lock () 'sb-thread:mutex) + +(defun lock-p (object) + (typep object 'sb-thread:mutex)) + +(defun recursive-lock-p (object) + (typep object 'sb-thread:mutex)) + +(defun make-lock (&optional name) + (sb-thread:make-mutex :name (or name "Anonymous lock"))) + +(defun acquire-lock (lock &optional (wait-p t)) + #+#.(cl:if (cl:find-symbol (cl:string '#:grab-mutex) :sb-thread) '(and) '(or)) + (sb-thread:grab-mutex lock :waitp wait-p) + #-#.(cl:if (cl:find-symbol (cl:string '#:grab-mutex) :sb-thread) '(and) '(or)) + (sb-thread:get-mutex lock nil wait-p)) + +(defun release-lock (lock) + (sb-thread:release-mutex lock)) + +(defmacro with-lock-held ((place) &body body) + `(sb-thread:with-mutex (,place) ,@body)) + +(defun make-recursive-lock (&optional name) + (sb-thread:make-mutex :name (or name "Anonymous recursive lock"))) + +;;; XXX acquire-recursive-lock and release-recursive-lock are actually +;;; complicated because we can't use control stack tricks. We need to +;;; actually count something to check that the acquire/releases are +;;; balanced + +(defmacro with-recursive-lock-held ((place) &body body) + `(sb-thread:with-recursive-lock (,place) + ,@body)) + +;;; Resource contention: condition variables + +(defun make-condition-variable (&key name) + (sb-thread:make-waitqueue :name (or name "Anonymous condition variable"))) + +(defun condition-wait (condition-variable lock &key timeout) + (sb-thread:condition-wait condition-variable lock :timeout timeout)) + +(defun condition-notify (condition-variable) + (sb-thread:condition-notify condition-variable)) + +(defun thread-yield () + (sb-thread:release-foreground)) + +;;; Timeouts + +(deftype timeout () + 'sb-ext:timeout) + +(defmacro with-timeout ((timeout) &body body) + `(sb-ext:with-timeout ,timeout + ,@body)) + +;;; Semaphores + +(deftype semaphore () + 'sb-thread:semaphore) + +(defun make-semaphore (&key name (count 0)) + (sb-thread:make-semaphore :name name :count count)) + +(defun signal-semaphore (semaphore &key (count 1)) + (sb-thread:signal-semaphore semaphore count)) + +(defun wait-on-semaphore (semaphore &key timeout) + (sb-thread:wait-on-semaphore semaphore :timeout timeout)) + +;;; Introspection/debugging + +(defun all-threads () + (sb-thread:list-all-threads)) + +(defun interrupt-thread (thread function &rest args) + (flet ((apply-function () + (if args + (lambda () (apply function args)) + function))) + (declare (dynamic-extent #'apply-function)) + (sb-thread:interrupt-thread thread (apply-function)))) + +(defun destroy-thread (thread) + (signal-error-if-current-thread thread) + (sb-thread:terminate-thread thread)) + +(defun thread-alive-p (thread) + (sb-thread:thread-alive-p thread)) + +(defun join-thread (thread) + (sb-thread:join-thread thread)) + +(mark-supported) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/src/impl-scl.lisp b/sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/src/impl-scl.lisp new file mode 100644 index 0000000..11715e1 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/src/impl-scl.lisp @@ -0,0 +1,103 @@ +;;;; -*- indent-tabs-mode: nil -*- + +#| +Copyright 2008 Scieneer Pty Ltd + +Distributed under the MIT license (see LICENSE file) +|# + +(in-package #:bordeaux-threads) + +(deftype thread () + 'thread:thread) + +(defun %make-thread (function name) + (thread:thread-create function :name name)) + +(defun current-thread () + thread:*thread*) + +(defun threadp (object) + (typep object 'thread:thread)) + +(defun thread-name (thread) + (thread:thread-name thread)) + +;;; Resource contention: locks and recursive locks + +(deftype lock () 'thread:lock) + +(deftype recursive-lock () 'thread:recursive-lock) + +(defun lock-p (object) + (typep object 'thread:lock)) + +(defun recursive-lock-p (object) + (typep object 'thread:recursive-lock)) + +(defun make-lock (&optional name) + (thread:make-lock (or name "Anonymous lock"))) + +(defun acquire-lock (lock &optional (wait-p t)) + (thread::acquire-lock lock nil wait-p)) + +(defun release-lock (lock) + (thread::release-lock lock)) + +(defmacro with-lock-held ((place) &body body) + `(thread:with-lock-held (,place) ,@body)) + +(defun make-recursive-lock (&optional name) + (thread:make-lock (or name "Anonymous recursive lock") + :type :recursive)) + +;;; XXX acquire-recursive-lock and release-recursive-lock are actually +;;; complicated because we can't use control stack tricks. We need to +;;; actually count something to check that the acquire/releases are +;;; balanced + +(defmacro with-recursive-lock-held ((place) &body body) + `(thread:with-lock-held (,place) + ,@body)) + +;;; Resource contention: condition variables + +(defun make-condition-variable (&key name) + (thread:make-cond-var (or name "Anonymous condition variable"))) + +(defun condition-wait (condition-variable lock &key timeout) + (if timeout + (thread:cond-var-timedwait condition-variable lock timeout) + (thread:cond-var-wait condition-variable lock)) + t) + +(defun condition-notify (condition-variable) + (thread:cond-var-broadcast condition-variable)) + +(defun thread-yield () + (mp:process-yield)) + +;;; Introspection/debugging + +(defun all-threads () + (mp:all-processes)) + +(defun interrupt-thread (thread function &rest args) + (flet ((apply-function () + (if args + (lambda () (apply function args)) + function))) + (declare (dynamic-extent #'apply-function)) + (thread:thread-interrupt thread (apply-function)))) + +(defun destroy-thread (thread) + (thread:destroy-thread thread)) + +(defun thread-alive-p (thread) + (mp:process-alive-p thread)) + +(defun join-thread (thread) + (mp:process-wait (format nil "Waiting for thread ~A to complete" thread) + (lambda () (not (mp:process-alive-p thread))))) + +(mark-supported) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/src/pkgdcl.lisp b/sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/src/pkgdcl.lisp new file mode 100644 index 0000000..1c1e45d --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/src/pkgdcl.lisp @@ -0,0 +1,66 @@ +;;;; -*- indent-tabs-mode: nil -*- + +(cl:defpackage :bordeaux-threads + (:nicknames #:bt) + (:use #:cl #:alexandria) + #+abcl + (:import-from :java #:jnew #:jcall #:jmethod) + (:export #:thread #:make-thread #:current-thread #:threadp #:thread-name + #:start-multiprocessing + #:*default-special-bindings* #:*standard-io-bindings* + #:*supports-threads-p* + + #:lock #:make-lock #:lock-p + #:acquire-lock #:release-lock #:with-lock-held + + #:recursive-lock #:make-recursive-lock #:recursive-lock-p + #:acquire-recursive-lock #:release-recursive-lock #:with-recursive-lock-held + + #:make-condition-variable #:condition-wait #:condition-notify + + #:make-semaphore #:signal-semaphore #:wait-on-semaphore #:semaphore #:semaphore-p + + #:with-timeout #:timeout + + #:all-threads #:interrupt-thread #:destroy-thread #:thread-alive-p + #:join-thread #:thread-yield) + (:documentation "BORDEAUX-THREADS is a proposed standard for a minimal + MP/threading interface. It is similar to the CLIM-SYS threading and + lock support, but for the following broad differences: + + 1) Some behaviours are defined in additional detail: attention has + been given to special variable interaction, whether and when + cleanup forms are run. Some behaviours are defined in less + detail: an implementation that does not support multiple + threads is not required to use a new list (nil) for a lock, for + example. + + 2) Many functions which would be difficult, dangerous or inefficient + to provide on some implementations have been removed. Chiefly + these are functions such as thread-wait which expect for + efficiency that the thread scheduler is written in Lisp and + 'hookable', which can't sensibly be done if the scheduler is + external to the Lisp image, or the system has more than one CPU. + + 3) Unbalanced ACQUIRE-LOCK and RELEASE-LOCK functions have been + added. + + 4) Posix-style condition variables have been added, as it's not + otherwise possible to implement them correctly using the other + operations that are specified. + + Threads may be implemented using whatever applicable techniques are + provided by the operating system: user-space scheduling, + kernel-based LWPs or anything else that does the job. + + Some parts of this specification can also be implemented in a Lisp + that does not support multiple threads. Thread creation and some + thread inspection operations will not work, but the locking + functions are still present (though they may do nothing) so that + thread-safe code can be compiled on both multithread and + single-thread implementations without need of conditionals. + + To avoid conflict with existing MP/threading interfaces in + implementations, these symbols live in the BORDEAUX-THREADS package. + Implementations and/or users may also make them visible or exported + in other more traditionally named packages.")) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/test/bordeaux-threads-test.lisp b/sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/test/bordeaux-threads-test.lisp new file mode 100644 index 0000000..730f90c --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/test/bordeaux-threads-test.lisp @@ -0,0 +1,251 @@ +#| +Copyright 2006,2007 Greg Pfeil + +Distributed under the MIT license (see LICENSE file) +|# + +(defpackage bordeaux-threads/test + (:use #:cl #:bordeaux-threads #:fiveam) + (:shadow #:with-timeout)) + +(in-package #:bordeaux-threads/test) + +(def-suite :bordeaux-threads) +(def-fixture using-lock () + (let ((lock (make-lock))) + (&body))) +(in-suite :bordeaux-threads) + +(test should-have-current-thread + (is (current-thread))) + +(test current-thread-identity + (let* ((box (list nil)) + (thread (make-thread (lambda () + (setf (car box) (current-thread)))))) + (join-thread thread) + (is (eql (car box) thread)))) + +(test join-thread-return-value + (is (eql 0 (join-thread (make-thread (lambda () 0)))))) + +(test should-identify-threads-correctly + (is (threadp (current-thread))) + (is (threadp (make-thread (lambda () t) :name "foo"))) + (is (not (threadp (make-lock))))) + +(test should-retrieve-thread-name + (is (equal "foo" (thread-name (make-thread (lambda () t) :name "foo"))))) + +(test interrupt-thread + (let* ((box (list nil)) + (thread (make-thread (lambda () + (setf (car box) + (catch 'new-thread + (sleep 60) + 'not-interrupted)))))) + (sleep 1) + (interrupt-thread thread (lambda () + (throw 'new-thread 'interrupted))) + (join-thread thread) + (is (eql 'interrupted (car box))))) + +(test should-lock-without-contention + (with-fixture using-lock () + (is (acquire-lock lock t)) + (release-lock lock) + (is (acquire-lock lock nil)) + (release-lock lock))) + +(defun set-equal (set-a set-b) + (and (null (set-difference set-a set-b)) + (null (set-difference set-b set-a)))) + +(test default-special-bindings + (locally (declare (special *a* *c*)) + (let* ((the-as 50) (the-bs 150) (*b* 42) + some-a some-b some-other-a some-other-b + (*default-special-bindings* + `((*a* . (funcall ,(lambda () (incf the-as)))) + (*b* . (funcall ,(lambda () (incf the-bs)))) + ,@*default-special-bindings*)) + (threads (list (make-thread + (lambda () + (setf some-a *a* some-b *b*))) + (make-thread + (lambda () + (setf some-other-a *a* + some-other-b *b*)))))) + (declare (special *b*)) + (thread-yield) + (is (not (boundp '*a*))) + (loop while (some #'thread-alive-p threads) + do (thread-yield)) + (is (set-equal (list some-a some-other-a) '(51 52))) + (is (set-equal (list some-b some-other-b) '(151 152))) + (is (not (boundp '*a*)))))) + + +(defparameter *shared* 0) +(defparameter *lock* (make-lock)) + +(test should-have-thread-interaction + ;; this simple test generates N process. Each process grabs and + ;; releases the lock until SHARED has some value, it then + ;; increments SHARED. the outer code first sets shared 1 which + ;; gets the thing running and then waits for SHARED to reach some + ;; value. this should, i think, stress test locks. + (setf *shared* 0) + (flet ((worker (i) + (loop + do (with-lock-held (*lock*) + (when (= i *shared*) + (incf *shared*) + (return))) + (thread-yield) + (sleep 0.001)))) + (let* ((procs (loop + for i from 1 upto 2 + ;; create a new binding to protect against implementations that + ;; mutate instead of binding the loop variable + collect (let ((i i)) + (make-thread (lambda () + (funcall #'worker i)) + :name (format nil "Proc #~D" i)))))) + (with-lock-held (*lock*) + (incf *shared*)) + (block test + (loop + until (with-lock-held (*lock*) + (= (1+ (length procs)) *shared*)) + do (with-lock-held (*lock*) + (is (>= (1+ (length procs)) *shared*))) + (thread-yield) + (sleep 0.001)))))) + + +(defparameter *condition-variable* (make-condition-variable)) + +(test condition-variable + (setf *shared* 0) + (flet ((worker (i) + (with-lock-held (*lock*) + (loop + until (= i *shared*) + do (condition-wait *condition-variable* *lock*)) + (incf *shared*)) + (condition-notify *condition-variable*))) + (let ((num-procs 100)) + (dotimes (i num-procs) + ;; create a new binding to protect against implementations that + ;; mutate instead of binding the loop variable + (let ((i i)) + (make-thread (lambda () + (funcall #'worker i)) + :name (format nil "Proc #~D" i)))) + (with-lock-held (*lock*) + (loop + until (= num-procs *shared*) + do (condition-wait *condition-variable* *lock*))) + (is (equal num-procs *shared*))))) + +;; Generally safe sanity check for the locks and single-notify +#+(and lispworks (not lispworks6)) +(test condition-variable-lw + (let ((condition-variable (make-condition-variable :name "Test")) + (test-lock (make-lock)) + (completed nil)) + (dotimes (id 6) + (let ((id id)) + (make-thread (lambda () + (with-lock-held (test-lock) + (condition-wait condition-variable test-lock) + (push id completed) + (condition-notify condition-variable)))))) + (sleep 2) + (if completed + (print "Failed: Premature passage through condition-wait") + (print "Successfully waited on condition")) + (condition-notify condition-variable) + (sleep 2) + (if (and completed + (eql (length completed) 6) + (equal (sort completed #'<) + (loop for id from 0 to 5 collect id))) + (print "Success: All elements notified") + (print (format nil "Failed: Of 6 expected elements, only ~A proceeded" completed))) + (bt::with-cv-access condition-variable + (if (and + (not (or (car wait-tlist) (cdr wait-tlist))) + (zerop (hash-table-count wait-hash)) + (zerop (hash-table-count unconsumed-notifications))) + (print "Success: condition variable restored to initial state") + (print "Error: condition variable retains residue from completed waiters"))) + (setq completed nil) + (dotimes (id 6) + (let ((id id)) + (make-thread (lambda () + (with-lock-held (test-lock) + (condition-wait condition-variable test-lock) + (push id completed)))))) + (sleep 2) + (condition-notify condition-variable) + (sleep 2) + (if (= (length completed) 1) + (print "Success: Notify-single only notified a single waiter to restart") + (format t "Failure: Notify-single restarted ~A items" (length completed))) + (condition-notify condition-variable) + (sleep 2) + (if (= (length completed) 2) + (print "Success: second Notify-single only notified a single waiter to restart") + (format t "Failure: Two Notify-singles restarted ~A items" (length completed))) + (loop for i from 0 to 5 do (condition-notify condition-variable)) + (print "Note: In the case of any failures, assume there are outstanding waiting threads") + (values))) + +#+(or abcl allegro clisp clozure ecl lispworks6 sbcl scl) +(test condition-wait-timeout + (let ((lock (make-lock)) + (cvar (make-condition-variable)) + (flag nil)) + (make-thread (lambda () (sleep 0.4) (setf flag t))) + (with-lock-held (lock) + (condition-wait cvar lock :timeout 0.2) + (is (null flag)) + (sleep 0.4) + (is (eq t flag))))) + +(test semaphore-signal + (let ((sem (make-semaphore))) + (make-thread (lambda () (sleep 0.4) (signal-semaphore sem))) + (is (not (null (wait-on-semaphore sem)))))) + +(test semaphore-signal-n-of-m + (let* ((sem (make-semaphore :count 1)) + (lock (make-lock)) + (count 0) + (waiter (lambda () + (wait-on-semaphore sem) + (with-lock-held (lock) (incf count))))) + (make-thread (lambda () (sleep 0.2) (signal-semaphore sem :count 3))) + (dotimes (v 5) (make-thread waiter)) + (sleep 0.3) + (is (= count 4)) + ;; release other waiters + (signal-semaphore sem :count 10) + (sleep 0.1) + (is (= count 5)))) + +(test semaphore-wait-timeout + (let ((sem (make-semaphore)) + (flag nil)) + (make-thread (lambda () (sleep 0.4) (setf flag t))) + (is (null (wait-on-semaphore sem :timeout 0.2))) + (is (null flag)) + (sleep 0.4) + (is (eq t flag)))) + +(test semaphore-typed + (is (typep (bt:make-semaphore) 'bt:semaphore)) + (is (bt:semaphore-p (bt:make-semaphore))) + (is (null (bt:semaphore-p (bt:make-lock))))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/version.sexp b/sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/version.sexp new file mode 100644 index 0000000..822e921 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/bordeaux-threads-v0.8.7/version.sexp @@ -0,0 +1,2 @@ +;; -*- lisp -*- +"0.8.7" diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/.gitignore b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/.gitignore new file mode 100644 index 0000000..1395ff4 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/.gitignore @@ -0,0 +1,28 @@ +*~ +*.o +*.dylib +*.dll +*.bundle +*.so +*.fasl +*.xfasl +.DS_Store +doc/*.aux +doc/manual/ +doc/spec/ +doc/*.log +doc/*.info +doc/*.aux +doc/*.cp +doc/*.fn +doc/*.fns +doc/*.ky +doc/*.pg +doc/*.toc +doc/*.tps +doc/*.tp +doc/*.vr +doc/*.dvi +doc/*.cps +doc/*.vrs +doc/dir diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/.travis.yml b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/.travis.yml new file mode 100644 index 0000000..1d154f4 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/.travis.yml @@ -0,0 +1,38 @@ +branches: + only: + - master + +language: lisp + +env: + matrix: + #- LISP=abcl + #- LISP=allegro + - LISP=sbcl + - LISP=sbcl32 + - LISP=ccl + - LISP=ccl32 + #- LISP=clisp + #- LISP=clisp32 + #- LISP=cmucl + #- LISP=ecl + +matrix: + allow_failures: + - env: LISP=ccl32 + +install: + - curl -L https://github.com/luismbo/cl-travis/raw/master/install.sh | sh + - if [ "${LISP:(-2)}" = "32" ]; then + sudo apt-get install -y libc6-dev-i386 libffi-dev:i386; + fi + - git clone --depth=1 git://github.com/trivial-features/trivial-features.git ~/lisp/trivial-features + - git clone https://gitlab.common-lisp.net/alexandria/alexandria.git ~/lisp/alexandria + - git clone --depth=1 git://github.com/cl-babel/babel.git ~/lisp/babel + +script: + - cl -e '(ql:quickload :cffi-tests) + (when (cffi-tests:run-all-cffi-tests) + (uiop:quit 1))' + +sudo: required diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/COPYRIGHT b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/COPYRIGHT new file mode 100644 index 0000000..67a5f68 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/COPYRIGHT @@ -0,0 +1,21 @@ +Copyright (C) 2005-2007, James Bielman + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, copy, +modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/HEADER b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/HEADER new file mode 100644 index 0000000..7181d31 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/HEADER @@ -0,0 +1,28 @@ +;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- +;;; +;;; filename --- description +;;; +;;; Copyright (C) 2007, James Bielman +;;; +;;; Permission is hereby granted, free of charge, to any person +;;; obtaining a copy of this software and associated documentation +;;; files (the "Software"), to deal in the Software without +;;; restriction, including without limitation the rights to use, copy, +;;; modify, merge, publish, distribute, sublicense, and/or sell copies +;;; of the Software, and to permit persons to whom the Software is +;;; furnished to do so, subject to the following conditions: +;;; +;;; The above copyright notice and this permission notice shall be +;;; included in all copies or substantial portions of the Software. +;;; +;;; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +;;; EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +;;; MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +;;; NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +;;; HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +;;; WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +;;; OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +;;; DEALINGS IN THE SOFTWARE. +;;; + + diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/Makefile b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/Makefile new file mode 100644 index 0000000..f0da0db --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/Makefile @@ -0,0 +1,72 @@ +# -*- Mode: Makefile; tab-width: 3; indent-tabs-mode: t -*- +# +# Makefile --- Make targets for various tasks. +# +# Copyright (C) 2005-2006, James Bielman +# +# Permission is hereby granted, free of charge, to any person +# obtaining a copy of this software and associated documentation +# files (the "Software"), to deal in the Software without +# restriction, including without limitation the rights to use, copy, +# modify, merge, publish, distribute, sublicense, and/or sell copies +# of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be +# included in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +# DEALINGS IN THE SOFTWARE. +# + +# This way you can easily run the tests for different versions +# of each lisp with, e.g. ALLEGRO=/path/to/some/lisp make test-allegro +CMUCL ?= lisp +OPENMCL ?= openmcl +SBCL ?= sbcl +CLISP ?= clisp +ALLEGRO ?= alisp +SCL ?= scl +ECL ?= ecl + +shlibs: + @$(MAKE) -wC tests shlibs + +clean: + @$(MAKE) -wC tests clean + find . -name ".fasls" | xargs rm -rf + find . \( -name "*.dfsl" -o -name "*.fasl" -o -name "*.fas" -o -name "*.lib" -o -name "*.x86f" -o -name "*.amd64f" -o -name "*.sparcf" -o -name "*.sparc64f" -o -name "*.hpf" -o -name "*.hp64f" -o -name "*.ppcf" -o -name "*.nfasl" -o -name "*.ufsl" -o -name "*.fsl" -o -name "*.lx64fsl" \) -exec rm {} \; + +test-openmcl: + @-$(OPENMCL) --load tests/run-tests.lisp + +test-sbcl: + @-$(SBCL) --noinform --load tests/run-tests.lisp + +test-cmucl: + @-$(CMUCL) -load tests/run-tests.lisp + +test-scl: + @-$(SCL) -load tests/run-tests.lisp + +test-clisp: + @-$(CLISP) -q -x '(load "tests/run-tests.lisp")' + +test-clisp-modern: + @-$(CLISP) -modern -q -x '(load "tests/run-tests.lisp")' + +test-allegro: + @-$(ALLEGRO) -L tests/run-tests.lisp + +test-ecl: + @-$(ECL) --quiet --load tests/run-tests.lisp + +test: test-openmcl test-sbcl test-cmucl test-clisp test-ecl + +# vim: ft=make ts=3 noet diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/README.md b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/README.md new file mode 100644 index 0000000..91e2135 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/README.md @@ -0,0 +1,19 @@ +[![Build Status](https://travis-ci.org/cffi/cffi.svg?branch=master)](https://travis-ci.org/cffi/cffi) + +CFFI, the Common Foreign Function Interface, purports to be a portable +foreign function interface for Common Lisp. The CFFI library is +composed of a Lisp-implementation-specific backend in the CFFI-SYS +package, and a portable frontend in the CFFI package. + +The CFFI-SYS backend package defines a low-level interface to the +native FFI support in the Lisp implementation. It offers operators for +allocating and dereferencing foreign memory, calling foreign +functions, and loading shared libraries. The CFFI frontend provides a +declarative interface for defining foreign functions, structures, +typedefs, enumerated types, etc. It is implemented in portable ANSI CL +making use of the low-level operators exported by CFFI-SYS. + +Please consult [the manual][1] for further details, including +installation instructions. + +[1]: http://common-lisp.net/project/cffi/manual/html_node/ diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/TODO b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/TODO new file mode 100644 index 0000000..ff25df1 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/TODO @@ -0,0 +1,115 @@ +-*- Text -*- + +This is a collection of TODO items and ideas in no particular order. + +### Testing + +-> Test uffi-compat with more UFFI libraries. +-> Write more FOREIGN-GLOBALS.SET.* tests. +-> Finish tests/random-tester.lisp +-> Write benchmarks comparing CFFI vs. native FFIs and also demonstrating + performance of each platform. +-> Write more STRUCT.ALIGNMENT.* tests (namely involving the :LONG-LONG + and :UNSIGNED-LONG-LONG types) and test them in more ABIs. +-> Run tests with the different kinds of shared libraries available on + MacOS X. + +### Ports + +-> Finish GCL port, port to MCL. +-> Update Corman port. [2007-02-22 LO] + +### Features + +-> Implement a declarative interface for FOREIGN-FUNCALL-PTR, similar to + DEFCUN/FOREIGN-FUNCALL. +-> Implement the proposed interfaces (see doc/). +-> Extend FOREIGN-SLOT-VALUE and make it accept multiple "indices" for + directly accessing structs inside structs, arrays inside structs, etc... +-> Implement EXPLAIN-FOREIGN-SLOT-VALUE. +-> Implement :in/:out/:in-out for DEFCFUN (and FOREIGN-FUNCALL?). +-> Add support for multiple memory allocation schemes (like CLISP), namely + support for allocating with malloc() (so that it can be freed on the C + side)> +-> Extend DEFCVAR's symbol macro in order to handle memory (de)allocation + automatically (see CLISP). +-> Implement byte swapping routines (see /usr/include/linux/byteorder) +-> Warn about :void in places where it doesn't make sense. + +### Underspecified Semantics + +-> (setf (mem-ref ptr offset) ) +-> Review the interface for coherence across Lisps with regard to + behaviour in "exceptional" situations. Eg: threads, dumping cores, + accessing foreign symbols that don't exist, etc... +-> On Lispworks a Lisp float is a double and therefore won't necessarily + fit in a C float. Figure out a way to handle this. +-> Allegro: callbacks' return values. +-> Lack of uniformity with regard to pointers. Allegro: 0 -> NULL. + CLISP/Lispworks: NIL -> NULL. +-> Some lisps will accept a lisp float being passed to :double + and a lisp double to :float. We should either coerce on lisps that + don't accept this or check-type on lisps that do. Probably the former + is better since on lispworks/x86 double == float. + +### Possible Optimizations + +-> More compiler macros on some of the CFFI-SYS implementations. +-> Optimize UFFI-COMPAT when the vector stuff is implemented. +-> Being able to declare that some C int will always fit in a Lisp + fixnum. Allegro has a :fixnum ftype and CMUCL/SBCL can use + (unsigned-byte 29) others could perhaps behave like :int? +-> An option for defcfun to expand into a compiler macro which would + allow the macroexpansion-time translators to look at the forms + passed to the functions. + +### Known Issues + +-> CLISP FASL portability is broken. Fix this by placing LOAD-TIME-VALUE + forms in the right places and moving other calculations to load-time. + (eg: calculating struct size/alignment.) Ideally we'd only move them + to load-time when we actually care about fasl portability. + (defmacro maybe-load-time-value (form) + (if + `(load-time-value ,form) + form)) +-> cffi-tests.asd's :c-test-lib component is causing the whole testsuite + to be recompiled everytime. Figure that out. +-> The (if (constantp foo) (do-something-with (eval foo)) ...) pattern + used in many places throughout the code is apparently not 100% safe. +-> On ECL platforms without DFFI we need to build a non-linked version + of libtest. +-> foreign-enum-keyword/value should have their own error condition? + [2007-02-22 LO] + +### Documentation + +-> Fill the missing sections in the CFFI User Manual. +-> Update the CFFI-SYS Specification. +-> have two versions of the manual on the website + +### CFFI-Grovel + +-> Look into making the C output more concise. + +### CFFI-Toolchain + +-> Port the toolchain parameter detection to more implementations +-> Port the static linking support to more implementations +-> Add a mechanism to configure and/or detect dynamic libraries against + which to link for instance. + It could be a variable in which flags are accumulated, + or an autodetection after loading everything, see + https://github.com/borodust/cl-bodge/blob/0.3.0/distribution/build.lisp#L79 + +### CFFI/C2FFI + +-> Generate wrappers for C inline function definitions (and maybe for some + #define's?) +-> It would be nice if c2ffi emitted its output in a stable order + for details see https://github.com/rpav/c2ffi/issues/28 +-> Handle va_list. For now it's treated as any other argument. + +### Other + +-> Type-checking pointer interface. diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/cffi-examples.asd b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/cffi-examples.asd new file mode 100644 index 0000000..4208923 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/cffi-examples.asd @@ -0,0 +1,37 @@ +;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- +;;; +;;; cffi-examples.asd --- ASDF system definition for CFFI examples. +;;; +;;; Copyright (C) 2005-2006, James Bielman +;;; +;;; Permission is hereby granted, free of charge, to any person +;;; obtaining a copy of this software and associated documentation +;;; files (the "Software"), to deal in the Software without +;;; restriction, including without limitation the rights to use, copy, +;;; modify, merge, publish, distribute, sublicense, and/or sell copies +;;; of the Software, and to permit persons to whom the Software is +;;; furnished to do so, subject to the following conditions: +;;; +;;; The above copyright notice and this permission notice shall be +;;; included in all copies or substantial portions of the Software. +;;; +;;; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +;;; EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +;;; MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +;;; NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +;;; HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +;;; WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +;;; OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +;;; DEALINGS IN THE SOFTWARE. +;;; + +(defsystem cffi-examples + :description "CFFI Examples" + :author "James Bielman " + :components + ((:module examples + :components + ((:file "examples") + (:file "gethostname") + (:file "gettimeofday")))) + :depends-on (cffi)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/cffi-grovel.asd b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/cffi-grovel.asd new file mode 100644 index 0000000..cca587e --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/cffi-grovel.asd @@ -0,0 +1,41 @@ +;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- +;;; +;;; cffi-grovel.asd --- ASDF system definition for cffi-grovel. +;;; +;;; Copyright (C) 2007, Luis Oliveira +;;; +;;; Permission is hereby granted, free of charge, to any person +;;; obtaining a copy of this software and associated documentation +;;; files (the "Software"), to deal in the Software without +;;; restriction, including without limitation the rights to use, copy, +;;; modify, merge, publish, distribute, sublicense, and/or sell copies +;;; of the Software, and to permit persons to whom the Software is +;;; furnished to do so, subject to the following conditions: +;;; +;;; The above copyright notice and this permission notice shall be +;;; included in all copies or substantial portions of the Software. +;;; +;;; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +;;; EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +;;; MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +;;; NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +;;; HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +;;; WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +;;; OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +;;; DEALINGS IN THE SOFTWARE. +;;; + +(defsystem "cffi-grovel" + :description "The CFFI Groveller" + :author "Dan Knapp " + :depends-on ("cffi" "cffi-toolchain" "alexandria") + :licence "MIT" + :components + ((:module "grovel" + :components + ((:static-file "common.h") + (:file "package") + (:file "grovel" :depends-on ("package")) + (:file "asdf" :depends-on ("grovel")))))) + +;; vim: ft=lisp et diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/cffi-libffi.asd b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/cffi-libffi.asd new file mode 100644 index 0000000..ef2fb2c --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/cffi-libffi.asd @@ -0,0 +1,48 @@ +;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- +;;; +;;; cffi-libffi.asd --- Foreign Structures By Value +;;; +;;; Copyright (C) 2011 Liam M. Healy +;;; +;;; Permission is hereby granted, free of charge, to any person +;;; obtaining a copy of this software and associated documentation +;;; files (the "Software"), to deal in the Software without +;;; restriction, including without limitation the rights to use, copy, +;;; modify, merge, publish, distribute, sublicense, and/or sell copies +;;; of the Software, and to permit persons to whom the Software is +;;; furnished to do so, subject to the following conditions: +;;; +;;; The above copyright notice and this permission notice shall be +;;; included in all copies or substantial portions of the Software. +;;; +;;; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +;;; EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +;;; MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +;;; NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +;;; HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +;;; WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +;;; OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +;;; DEALINGS IN THE SOFTWARE. +;;; + +(in-package :asdf) + +(eval-when (:compile-toplevel :execute) + (asdf:oos 'asdf:load-op :cffi-grovel) + (asdf:oos 'asdf:load-op :trivial-features)) + +(defsystem cffi-libffi + :description "Foreign structures by value" + :author "Liam Healy " + :maintainer "Liam Healy " + :defsystem-depends-on (#:trivial-features #:cffi-grovel) + :components + ((:module libffi + :serial t + :components + ((:file "libffi") + (cffi-grovel:grovel-file "libffi-types") + (:file "libffi-functions") + (:file "type-descriptors") + (:file "funcall")))) + :depends-on (#:cffi #:cffi-grovel #:trivial-features)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/cffi-tests.asd b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/cffi-tests.asd new file mode 100644 index 0000000..618d7d5 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/cffi-tests.asd @@ -0,0 +1,91 @@ +;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- +;;; +;;; cffi-tests.asd --- ASDF system definition for CFFI unit tests. +;;; +;;; Copyright (C) 2005-2006, James Bielman +;;; Copyright (C) 2005-2011, Luis Oliveira +;;; +;;; Permission is hereby granted, free of charge, to any person +;;; obtaining a copy of this software and associated documentation +;;; files (the "Software"), to deal in the Software without +;;; restriction, including without limitation the rights to use, copy, +;;; modify, merge, publish, distribute, sublicense, and/or sell copies +;;; of the Software, and to permit persons to whom the Software is +;;; furnished to do so, subject to the following conditions: +;;; +;;; The above copyright notice and this permission notice shall be +;;; included in all copies or substantial portions of the Software. +;;; +;;; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +;;; EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +;;; MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +;;; NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +;;; HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +;;; WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +;;; OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +;;; DEALINGS IN THE SOFTWARE. +;;; + +(load-systems "trivial-features" "cffi-grovel") + +(defclass c-test-lib (c-source-file) + ()) + +(defmethod perform ((o load-op) (c c-test-lib)) + nil) + +(defmethod perform ((o load-source-op) (c c-test-lib)) + nil) + +(defmethod output-files ((o compile-op) (c c-test-lib)) + (let ((p (component-pathname c))) + (values + (list (make-pathname :defaults p :type (asdf/bundle:bundle-pathname-type :object)) + (make-pathname :defaults p :type (asdf/bundle:bundle-pathname-type :shared-library))) + t))) + +(defmethod perform ((o compile-op) (c c-test-lib)) + (let ((cffi-toolchain:*cc-flags* `(,@cffi-toolchain:*cc-flags* "-Wall" "-std=c99" "-pedantic"))) + (destructuring-bind (obj dll) (output-files o c) + (cffi-toolchain:cc-compile obj (input-files o c)) + (cffi-toolchain:link-shared-library dll (list obj))))) + +(defsystem "cffi-tests" + :description "Unit tests for CFFI." + :depends-on ("cffi-grovel" "cffi-libffi" "bordeaux-threads" #-ecl "rt" #+ecl (:require "rt")) + :components + ((:module "tests" + :components + ((:c-test-lib "libtest") + (:c-test-lib "libtest2") + (:c-test-lib "libfsbv") + (:file "package") + (:file "bindings" :depends-on ("package" "libtest" "libtest2" "libfsbv")) + (:file "funcall" :depends-on ("bindings")) + (:file "defcfun" :depends-on ("bindings")) + (:file "callbacks" :depends-on ("bindings")) + (:file "foreign-globals" :depends-on ("package")) + (:file "memory" :depends-on ("package")) + (:file "strings" :depends-on ("package")) + (:file "arrays" :depends-on ("package")) + (:file "struct" :depends-on ("package")) + (:file "union" :depends-on ("package")) + (:file "enum" :depends-on ("package")) + (:file "fsbv" :depends-on ("bindings" "enum")) + (:file "misc-types" :depends-on ("bindings")) + (:file "misc" :depends-on ("bindings")) + (:file "test-asdf" :depends-on ("package")) + (:file "grovel" :depends-on ("package"))))) + :perform (test-op (o c) (symbol-call :cffi-tests '#:run-all-cffi-tests))) + +(defsystem "cffi-tests/example" + :defsystem-depends-on ("cffi-grovel") + :entry-point "cffi-example::entry-point" + :components + ((:module "examples" :components + ((:file "package") + (:cffi-wrapper-file "wrapper-example" :depends-on ("package")) + (:cffi-grovel-file "grovel-example" :depends-on ("package")) + (:file "main-example" :depends-on ("package")))))) + +;;; vim: ft=lisp et diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/cffi-toolchain.asd b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/cffi-toolchain.asd new file mode 100644 index 0000000..f3864f1 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/cffi-toolchain.asd @@ -0,0 +1,48 @@ +;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- +;;; +;;; cffi-toolchain.asd --- ASDF system definition for cffi-toolchain. +;;; +;;; Copyright (C) 2007, Luis Oliveira +;;; +;;; Permission is hereby granted, free of charge, to any person +;;; obtaining a copy of this software and associated documentation +;;; files (the "Software"), to deal in the Software without +;;; restriction, including without limitation the rights to use, copy, +;;; modify, merge, publish, distribute, sublicense, and/or sell copies +;;; of the Software, and to permit persons to whom the Software is +;;; furnished to do so, subject to the following conditions: +;;; +;;; The above copyright notice and this permission notice shall be +;;; included in all copies or substantial portions of the Software. +;;; +;;; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +;;; EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +;;; MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +;;; NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +;;; HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +;;; WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +;;; OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +;;; DEALINGS IN THE SOFTWARE. +;;; + +;; Make sure to upgrade ASDF before the #.(if ...) below may be read. +(load-system "asdf") +#-asdf3.1 (error "CFFI-toolchain requires ASDF 3.1!") + +(defsystem "cffi-toolchain" + :description "The CFFI toolchain" + :long-description "Portable abstractions for using the C compiler, linker, etc." + :author "Francois-Rene Rideau " + :depends-on ((:version "asdf" "3.1.2") "cffi") + :licence "MIT" + :components + ((:module "toolchain" + :components + (;; This is a plain copy of bundle.lisp from ASDF 3.2.0 + ;; in case your asdf isn't up to snuff. + (:file "bundle" :if-feature (#.(if (version< "3.1.8" (asdf-version)) :or :and))) + (:file "package") + (:file "c-toolchain" :depends-on ("package")) + (:file "static-link" :depends-on ("bundle" "c-toolchain")))))) + +;; vim: ft=lisp et diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/cffi-uffi-compat.asd b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/cffi-uffi-compat.asd new file mode 100644 index 0000000..3ea9b77 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/cffi-uffi-compat.asd @@ -0,0 +1,41 @@ +;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- +;;; +;;; cffi-uffi-compat.asd --- ASDF system definition for CFFI-UFFI-COMPAT. +;;; +;;; Copyright (C) 2005-2006, James Bielman +;;; +;;; Permission is hereby granted, free of charge, to any person +;;; obtaining a copy of this software and associated documentation +;;; files (the "Software"), to deal in the Software without +;;; restriction, including without limitation the rights to use, copy, +;;; modify, merge, publish, distribute, sublicense, and/or sell copies +;;; of the Software, and to permit persons to whom the Software is +;;; furnished to do so, subject to the following conditions: +;;; +;;; The above copyright notice and this permission notice shall be +;;; included in all copies or substantial portions of the Software. +;;; +;;; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +;;; EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +;;; MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +;;; NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +;;; HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +;;; WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +;;; OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +;;; DEALINGS IN THE SOFTWARE. +;;; + +(defpackage #:cffi-uffi-compat-system + (:use #:cl #:asdf)) +(in-package #:cffi-uffi-compat-system) + +(defsystem cffi-uffi-compat + :description "UFFI Compatibility Layer for CFFI" + :author "James Bielman " + :components + ((:module uffi-compat + :components + ((:file "uffi-compat")))) + :depends-on (cffi)) + +;; vim: ft=lisp et diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/cffi.asd b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/cffi.asd new file mode 100644 index 0000000..491698a --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/cffi.asd @@ -0,0 +1,101 @@ +;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- +;;; +;;; cffi.asd --- ASDF system definition for CFFI. +;;; +;;; Copyright (C) 2005-2006, James Bielman +;;; Copyright (C) 2005-2010, Luis Oliveira +;;; +;;; Permission is hereby granted, free of charge, to any person +;;; obtaining a copy of this software and associated documentation +;;; files (the "Software"), to deal in the Software without +;;; restriction, including without limitation the rights to use, copy, +;;; modify, merge, publish, distribute, sublicense, and/or sell copies +;;; of the Software, and to permit persons to whom the Software is +;;; furnished to do so, subject to the following conditions: +;;; +;;; The above copyright notice and this permission notice shall be +;;; included in all copies or substantial portions of the Software. +;;; +;;; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +;;; EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +;;; MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +;;; NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +;;; HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +;;; WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +;;; OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +;;; DEALINGS IN THE SOFTWARE. +;;; + +(in-package :asdf) + +#-(or openmcl mcl sbcl cmucl scl clisp lispworks ecl allegro cormanlisp abcl mkcl clasp) +(error "Sorry, this Lisp is not yet supported. Patches welcome!") + +(defsystem "cffi" + :description "The Common Foreign Function Interface" + :author "James Bielman " + :maintainer "Luis Oliveira " + :licence "MIT" + :depends-on (:uiop :alexandria :trivial-features :babel) + :in-order-to ((test-op (load-op :cffi-tests))) + :perform (test-op (o c) (operate 'asdf:test-op :cffi-tests)) + :components + ((:module "src" + :serial t + :components + (#+openmcl (:file "cffi-openmcl") + #+mcl (:file "cffi-mcl") + #+sbcl (:file "cffi-sbcl") + #+cmucl (:file "cffi-cmucl") + #+scl (:file "cffi-scl") + #+clisp (:file "cffi-clisp") + #+lispworks (:file "cffi-lispworks") + #+ecl (:file "cffi-ecl") + #+allegro (:file "cffi-allegro") + #+cormanlisp (:file "cffi-corman") + #+abcl (:file "cffi-abcl") + #+mkcl (:file "cffi-mkcl") + #+clasp (:file "cffi-clasp") + (:file "package") + (:file "utils") + (:file "libraries") + (:file "early-types") + (:file "types") + (:file "enum") + (:file "strings") + (:file "structures") + (:file "functions") + (:file "foreign-vars") + (:file "features"))))) + +;; when you get CFFI from git, its defsystem doesn't have a version, +;; so we assume it satisfies any version requirements whatsoever. +(defmethod version-satisfies ((c (eql (find-system :cffi))) version) + (declare (ignorable version)) + (or (null (component-version c)) + (call-next-method))) + +(defsystem "cffi/c2ffi" + :description "CFFI definition generator from the FFI spec generated by c2ffi. This system is enough to use the ASDF machinery (as a :defsystem-depends-on)." + :author "Attila Lendvai " + :depends-on (:alexandria + :cffi) + :licence "MIT" + :components + ((:module "src/c2ffi" + :components + ((:file "package") + (:file "c2ffi" :depends-on ("package")) + (:file "asdf" :depends-on ("package" "c2ffi")))))) + +(defsystem "cffi/c2ffi-generator" + :description "This system gets loaded lazily when the CFFI bindings need to be regenerated." + :author "Attila Lendvai " + :depends-on (:cffi/c2ffi + :cl-ppcre + :cl-json) + :licence "MIT" + :components + ((:module "src/c2ffi" + :components + ((:file "generator"))))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/doc/Makefile b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/doc/Makefile new file mode 100644 index 0000000..7a285cf --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/doc/Makefile @@ -0,0 +1,46 @@ +# -*- Mode: Makefile; tab-width: 3; indent-tabs-mode: t -*- +# +# Makefile --- Make targets for generating the documentation. +# +# Copyright (C) 2005-2007, Luis Oliveira +# +# Permission is hereby granted, free of charge, to any person +# obtaining a copy of this software and associated documentation +# files (the "Software"), to deal in the Software without +# restriction, including without limitation the rights to use, copy, +# modify, merge, publish, distribute, sublicense, and/or sell copies +# of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be +# included in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +# DEALINGS IN THE SOFTWARE. +# + +export LC_ALL=C + +all: manual spec + +manual: cffi-manual.texinfo style.css + sh gendocs.sh -o manual --html "--css-include=style.css" cffi-manual "CFFI User Manual" + +spec: cffi-sys-spec.texinfo style.css + sh gendocs.sh -o spec --html "--css-include=style.css" cffi-sys-spec "CFFI-SYS Interface Specification" + +clean: + find . \( -name "*.info" -o -name "*.aux" -o -name "*.cp" -o -name "*.fn" -o -name "*.fns" -o -name "*.ky" -o -name "*.log" -o -name "*.pg" -o -name "*.toc" -o -name "*.tp" -o -name "*.vr" -o -name "*.dvi" -o -name "*.cps" -o -name "*.vrs" \) -exec rm {} \; + rm -rf manual spec dir + +upload-docs: manual spec + rsync -av --delete -e ssh manual spec common-lisp.net:/project/cffi/public_html/ +# scp -r manual spec common-lisp.net:/project/cffi/public_html/ + +# vim: ft=make ts=3 noet diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/doc/allegro-internals.txt b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/doc/allegro-internals.txt new file mode 100644 index 0000000..64c0d7e --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/doc/allegro-internals.txt @@ -0,0 +1,132 @@ +July 2005 +These details were kindly provided by Duane Rettig of Franz. + +Regarding the following snippet of the macro expansion of +FF:DEF-FOREIGN-CALL: + + (SYSTEM::FF-FUNCALL + (LOAD-TIME-VALUE (EXCL::DETERMINE-FOREIGN-ADDRESS + '("foo" :LANGUAGE :C) 2 NIL)) + '(:INT (INTEGER * *)) ARG1 + '(:DOUBLE (DOUBLE-FLOAT * *)) ARG2 + '(:INT (INTEGER * *))) + +" +... in Allegro CL, if you define a foreign call FOO with C entry point +"foo" and with :call-direct t in the arguments, and if other things are +satisfied, then if a lisp function BAR is compiled which has a call to +FOO, that call will not go through ff-funcall (and thus a large amount +of argument manipulation and processing) but will instead set up its +arguments directly on the stack, and will then perform the "call" more +or less directly, through the "entry vec" (a small structure which +keeps track of a foreign entry's address and status)." + +This is the code that generates what the compiler expects to see: + +(setq call-direct-form + (if* call-direct + then `(setf (get ',lispname 'sys::direct-ff-call) + (list ',external-name + ,callback + ,convention + ',returning + ',arg-types + ,arg-checking + ,entry-vec-flags)) + else `(remprop ',lispname 'sys::direct-ff-call))) + +Thus generating something like: + + (EVAL-WHEN (COMPILE LOAD EVAL) + (SETF (GET 'FOO 'SYSTEM::DIRECT-FF-CALL) + (LIST '("foo" :LANGUAGE :C) T :C + '(:INT (INTEGER * *)) + '((:INT (INTEGER * *)) + (:FLOAT (SINGLE-FLOAT * *))) + T + 2 ; this magic value is explained later + ))) + +" +(defun determine-foreign-address (name &optional (flags 0) method-index) + ;; return an entry-vec struct suitable for the foreign-call of name. + ;; + ;; name is either a string, which is taken without conversion, or + ;; a list consisting of a string to convert or a conversion function + ;; call. + ;; flags is an integer representing the flags to place into the entry-vec. + ;; method-index, if non-nil, is a word-index into a vtbl (virtual table). + ;; If method-index is true, then the name must be a string uniquely + ;; represented by the index and by the flags field. + +Note that not all architectures implement the :method-index argument +to def-foreign-call, but your interface likely won't support it +anyway, so just leave it nil. As for the flags, they are constants +stored into the entry-vec returned by d-f-a and are given here: + +(defconstant ep-flag-call-semidirect 1) ; Real address stored in alt-address slot +(defconstant ep-flag-never-release 2) ; Never release the heap +(defconstant ep-flag-always-release 4) ; Always release the heap +(defconstant ep-flag-release-when-ok 8) ; Release the heap unless without-interrupts + +(defconstant ep-flag-tramp-calls #x70) ; Make calls through special trampolines +(defconstant ep-flag-tramp-shift 4) + +(defconstant ep-flag-variable-address #x100) ; Entry-point contains address of C var +(defconstant ep-flag-strings-convert #x200) ; Convert strings automatically + +(defconstant ep-flag-get-errno #x1000) ;; [rfe5060]: Get errno value after call +(defconstant ep-flag-get-last-error #x2000) ;; [rfe5060]: call GetLastError after call +;; Leave #x4000 and #x8000 open for expansion + +Mostly, you'll give the value 2 (never release the heap), but if you +give 4 or 8, then d-f-a will automatically set the 1 bit as well, +which takes the call through a heap-release/reacquire process. + +Some docs for entry-vec are: + +;; -- entry vec -- +;; An entry-vec is an entry-point descriptor, usually a pointer into +;; a shared-library. It is represented as a 5-element struct of type +;; foreign-vector. The reason for this represntation is +;; that it allows the entry point to be stored in a table, called +;; the .saved-entry-points. table, and to be used by a foreign +;; function. When the location of the foreign function to which the entry +;; point refers changes, it is simply a matter of changing the value in entry +;; point vector and the foreign call code sees it immediately. There is +;; even an address that can be put in the entry point vector that denotes +;; a missing foreign function, thus lookup can happen dynamically. + +(defstruct (entry-vec + (:type (vector excl::foreign (*))) + (:constructor make-entry-vec-boa ())) + name ; entry point name + (address 0) ; jump address for foreign code + (handle 0) ; shared-lib handle + (flags 0) ; ep-* flags + (alt-address 0) ; sometimes holds the real func addr + ) + +[...] +" + +Regarding the arguments to SYSTEM::FF-FUNCALL: + '(:int (integer * *)) argN + +"The type-spec is as it is given in the def-foreign-call +syntax, with a C type optionally followed by a lisp type, +followed optionally by a user-conversion function name[...]" + + +Getting the alignment: + +CL-USER(2): (ff:get-foreign-type :int) +#S(FOREIGN-FUNCTIONS::IFOREIGN-TYPE + :ATTRIBUTES NIL + :SFTYPE + #S(FOREIGN-FUNCTIONS::SIZED-FTYPE-PRIM + :KIND :INT + :WIDTH 4 + :OFFSET 0 + :ALIGN 4) + ...) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/doc/cffi-manual.texinfo b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/doc/cffi-manual.texinfo new file mode 100644 index 0000000..03c71d4 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/doc/cffi-manual.texinfo @@ -0,0 +1,7113 @@ +\input texinfo @c -*- Mode: Texinfo; Mode: auto-fill -*- +@c %**start of header +@setfilename cffi.info +@settitle CFFI User Manual +@exampleindent 2 + +@c @documentencoding utf-8 + +@c Style notes: +@c +@c * The reference section names and "See Also" list are roman, not +@c @code. This is to follow the format of CLHS. +@c +@c * How it looks in HTML is the priority. + +@c ============================= Macros ============================= +@c The following macros are used throughout this manual. + +@macro Function {args} +@defun \args\ +@end defun +@end macro + +@macro Macro {args} +@defmac \args\ +@end defmac +@end macro + +@macro Accessor {args} +@deffn {Accessor} \args\ +@end deffn +@end macro + +@macro GenericFunction {args} +@deffn {Generic Function} \args\ +@end deffn +@end macro + +@macro ForeignType {args} +@deftp {Foreign Type} \args\ +@end deftp +@end macro + +@macro Variable {args} +@defvr {Special Variable} \args\ +@end defvr +@end macro + +@macro Condition {args} +@deftp {Condition Type} \args\ +@end deftp +@end macro + +@macro cffi +@acronym{CFFI} +@end macro + +@macro impnote {text} +@quotation +@strong{Implementor's note:} @emph{\text\} +@end quotation +@end macro + +@c Info "requires" that x-refs end in a period or comma, or ) in the +@c case of @pxref. So the following implements that requirement for +@c the "See also" subheadings that permeate this manual, but only in +@c Info mode. +@ifinfo +@macro seealso {name} +@ref{\name\}. +@end macro +@end ifinfo + +@ifnotinfo +@alias seealso = ref +@end ifnotinfo + +@c Typeset comments in roman font for the TeX output. +@iftex +@alias lispcmt = r +@end iftex +@ifnottex +@alias lispcmt = asis +@end ifnottex + +@alias res = result + +@c ============================= Macros ============================= + + +@c Show types, functions, and concepts in the same index. +@syncodeindex tp cp +@syncodeindex fn cp + +@copying +Copyright @copyright{} 2005 James Bielman @* +Copyright @copyright{} 2005-2015 Lu@'{@dotless{i}}s Oliveira + @* +Copyright @copyright{} 2005-2006 Dan Knapp @* +Copyright @copyright{} 2005-2006 Emily Backes @* +Copyright @copyright{} 2006 Stephen Compall + +@quotation +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +``Software''), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +@sc{The software is provided ``as is'', without warranty of any kind, +express or implied, including but not limited to the warranties of +merchantability, fitness for a particular purpose and noninfringement. +In no event shall the authors or copyright holders be liable for any +claim, damages or other liability, whether in an action of contract, +tort or otherwise, arising from, out of or in connection with the +software or the use or other dealings in the software.} +@end quotation +@end copying +@c %**end of header + +@dircategory Software development +@direntry +* CFFI Manual: (cffi-manual). CFFI Manual. +@end direntry + +@titlepage +@title CFFI User Manual +@c @subtitle Version X.X +@c @author James Bielman + +@page +@vskip 0pt plus 1filll +@insertcopying +@end titlepage + +@contents + +@ifnottex +@node Top, Introduction, (dir), (dir) +@top cffi +@insertcopying +@end ifnottex + +@menu +* Introduction:: What is CFFI? +* Installation:: +* Implementation Support:: +* Tutorial:: Interactive intro to using CFFI. +* Wrapper generators:: CFFI forms from munging C source code. +* Foreign Types:: +* Pointers:: +* Strings:: +* Variables:: +* Functions:: +* Libraries:: +* Callbacks:: +* The Groveller:: +* Static Linking:: +* Limitations:: +* Platform-specific features:: Details about the underlying system. +* Glossary:: List of CFFI-specific terms and meanings. +* Comprehensive Index:: + +@detailmenu + --- Dictionary --- + +Foreign Types + +* convert-from-foreign:: Outside interface to backward type translator. +* convert-to-foreign:: Outside interface to forward type translator. +* defbitfield:: Defines a bitfield. +* defcstruct:: Defines a C structure type. +* defcunion:: Defines a C union type. +* defctype:: Defines a foreign typedef. +* defcenum:: Defines a C enumeration. +* define-foreign-type:: Defines a foreign type specifier. +* define-parse-method:: Specifies how a type should be parsed. +@c * explain-foreign-slot-value:: +* foreign-bitfield-symbols:: Returns a list of symbols for a bitfield type. +* foreign-bitfield-value:: Calculates a value for a bitfield type. +* foreign-enum-keyword:: Finds a keyword in an enum type. +* foreign-enum-value:: Finds a value in an enum type. +* foreign-slot-names:: Returns a list of slot names in a foreign struct. +* foreign-slot-offset:: Returns the offset of a slot in a foreign struct. +* foreign-slot-pointer:: Returns a pointer to a slot in a foreign struct. +* foreign-slot-value:: Returns the value of a slot in a foreign struct. +* foreign-type-alignment:: Returns the alignment of a foreign type. +* foreign-type-size:: Returns the size of a foreign type. +* free-converted-object:: Outside interface to typed object deallocators. +* free-translated-object:: Defines how to free a oreign object. +* translate-from-foreign:: Defines a foreign-to-Lisp object translation. +* translate-to-foreign:: Defines a Lisp-to-foreign object translation. +* with-foreign-object:: Allocates a foreign object with dynamic extent. +* with-foreign-objects:: Plural form of @code{with-foreign-object}. +* with-foreign-slots:: Accesses the slots of a foreign structure. + +Pointers + +* foreign-free:: Deallocates memory. +* foreign-alloc:: Allocates memory. +* foreign-symbol-pointer:: Returns a pointer to a foreign symbol. +* inc-pointer:: Increments the address held by a pointer. +* incf-pointer:: Increments the pointer address in a place. +* make-pointer:: Returns a pointer to a given address. +* mem-aptr:: The pointer to an element of an array. +* mem-aref:: Accesses the value of an index in an array. +* mem-ref:: Dereferences a pointer. +* null-pointer:: Returns a NULL pointer. +* null-pointer-p:: Tests a pointer for NULL value. +* pointerp:: Tests whether an object is a pointer or not. +* pointer-address:: Returns the address pointed to by a pointer. +* pointer-eq:: Tests if two pointers point to the same address. +* with-foreign-pointer:: Allocates memory with dynamic extent. + +Strings + +* *default-foreign-encoding*:: Default encoding for the string types. +* foreign-string-alloc:: Converts a Lisp string to a foreign string. +* foreign-string-free:: Deallocates memory used by a foreign string. +* foreign-string-to-lisp:: Converts a foreign string to a Lisp string. +* lisp-string-to-foreign:: Copies a Lisp string into a foreign string. +* with-foreign-string:: Allocates a foreign string with dynamic extent. +* with-foreign-strings:: Plural form of @code{with-foreign-string}. +* with-foreign-pointer-as-string:: Similar to CL's with-output-to-string. + +Variables + +* defcvar:: Defines a C global variable. +* get-var-pointer:: Returns a pointer to a defined global variable. + +Functions + +* defcfun:: Defines a foreign function. +* foreign-funcall:: Performs a call to a foreign function. +* foreign-funcall-pointer:: Performs a call through a foreign pointer. +* translate-camelcase-name:: Converts a camelCase foreign name to/from a Lisp name. +* translate-name-from-foreign:: Converts a foreign name to a Lisp name. +* translate-name-to-foreign:: Converts a Lisp name to a foreign name. +* translate-underscore-separated-name:: Converts an underscore_separated foreign name to/from a Lisp name. + +Libraries + +* close-foreign-library:: Closes a foreign library. +* *darwin-framework-directories*:: Search path for Darwin frameworks. +* define-foreign-library:: Explain how to load a foreign library. +* *foreign-library-directories*:: Search path for shared libraries. +* load-foreign-library:: Load a foreign library. +* load-foreign-library-error:: Signalled on failure of its namesake. +@c * reload-foreign-libraries:: Reload foreign libraries. +* use-foreign-library:: Load a foreign library when needed. + +Callbacks + +* callback:: Returns a pointer to a defined callback. +* defcallback:: Defines a Lisp callback. +* get-callback:: Returns a pointer to a defined callback. + +@end detailmenu +@end menu + + + + +@c =================================================================== +@c CHAPTER: Introduction + +@node Introduction, Installation, Top, Top +@chapter Introduction + +@cffi{} is the Common Foreign Function Interface for @acronym{ANSI} +Common Lisp systems. By @dfn{foreign function} we mean a function +written in another programming language and having different data and +calling conventions than Common Lisp, namely, C. @cffi{} allows you +to call foreign functions and access foreign variables, all without +leaving the Lisp image. + +We consider this manual ever a work in progress. If you have +difficulty with anything @cffi{}-specific presented in the manual, +please contact @email{cffi-devel@@common-lisp.net,the developers} with +details. + + +@heading Motivation + +@xref{Tutorial-Comparison,, What makes Lisp different}, for +an argument in favor of @acronym{FFI} in general. + +@cffi{}'s primary role in any image is to mediate between Lisp +developers and the widely varying @acronym{FFI}s present in the +various Lisp implementations it supports. With @cffi{}, you can +define foreign function interfaces while still maintaining portability +between implementations. It is not the first Common Lisp package with +this objective; however, it is meant to be a more malleable framework +than similar packages. + + +@heading Design Philosophy + +@itemize +@item +Pointers do not carry around type information. Instead, type +information is supplied when pointers are dereferenced. + +@item +A type safe pointer interface can be developed on top of an +untyped one. It is difficult to do the opposite. + +@item +Functions are better than macros. When a macro could be used +for performance, use a compiler-macro instead. +@end itemize + + +@c =================================================================== +@c CHAPTER: Installation + +@node Installation, Implementation Support, Introduction, Top +@chapter Installation + +@cffi{} can be obtained through one of the following means available +through its @uref{http://common-lisp.net/project/cffi/,,website}: + +@itemize +@item +@uref{http://common-lisp.net/project/cffi/releases/?M=D,,official release +tarballs} + +@item +@uref{http://common-lisp.net/gitweb?p=projects/cffi/cffi.git,,git +repository} + +@c snapshots have been disabled as of +@c @item +@c @uref{http://common-lisp.net/project/cffi/tarballs/?M=D,,nightly-generated +@c snapshots} + +@end itemize + +In addition, you will need to obtain and install the following +dependencies: + +@itemize +@item +@uref{http://common-lisp.net/project/babel/,,Babel}, a charset +encoding/decoding library. + +@item +@uref{http://common-lisp.net/project/alexandria/,,Alexandria}, a +collection of portable public-domain utilities. + +@item +@uref{http://www.cliki.net/trivial-features,,trivial-features}, a +portability layer that ensures consistent @code{*features*} across +multiple Common Lisp implementations. + +@end itemize + +Furthermore, if you wish to run the testsuite, +@uref{http://www.cliki.net/rt,,RT} is required. + +You may find mechanisms such as +@uref{https://www.quicklisp.org/beta/,Quicklisp} (recommended) +or @uref{http://common-lisp.net/project/clbuild/,,clbuild} (for advanced +uses) helpful in getting and managing @cffi{} and its +dependencies. + + +@c =================================================================== +@c CHAPTER: Implementation Support + +@node Implementation Support, Tutorial, Installation, Top +@chapter Implementation Support + +@cffi{} supports various free and commercial Lisp implementations: +@acronym{ABCL}, Allegro CL, Clasp, @sc{clisp}, Clozure CL, +@acronym{CMUCL}, Corman CL, @acronym{ECL}, @acronym{GCL}, LispWorks, +@acronym{MCL}, @acronym{SBCL} and the Scieneer CL. + +In general, you should work with the latest versions of each +implementation since those will usually be tested against recent +versions of CFFI more often and might include necessary features or +bug fixes. Reasonable patches for compatibility with earlier versions +are welcome nevertheless. + +@section Limitations + +Some features are not supported in all implementations. +@c TODO: describe these features here. +@c flat-namespace too + +@subheading Allegro CL + +@itemize +@item +Does not support the @code{:long-long} type natively. +@item +Unicode support is limited to the Basic Multilingual Plane (16-bit +code points). +@end itemize + +@subheading Clasp + +@itemize +@item +Only supports a flat namespace. +@end itemize + +@subheading CMUCL + +@itemize +@item +No Unicode support. (8-bit code points) +@end itemize + +@subheading Corman CL + +@itemize +@item +Does not support @code{foreign-funcall}. +@end itemize + +@subheading @acronym{ECL} + +@itemize +@item +On platforms where ECL's dynamic FFI is not supported (ie. when +@code{:dffi} is not present in @code{*features*}), +@code{cffi:load-foreign-library} does not work and you must use ECL's +own @code{ffi:load-foreign-library} with a constant string argument. +@end itemize + +@subheading Lispworks + +@itemize +@item +Does not completely support the @code{:long-long} type natively in +32-bit platforms. +@item +Unicode support is limited to the Basic Multilingual Plane (16-bit +code points). +@end itemize + +@subheading @acronym{SBCL} + +@itemize +@item +Not all platforms support callbacks. + +@end itemize + + +@c =================================================================== +@c CHAPTER: An Introduction to Foreign Interfaces and CFFI + +@c This macro is merely a marker that I don't think I'll use after +@c all. +@macro tutorialsource {text} +@c \text\ +@end macro + +@c because I don't want to type this over and over +@macro clikicffi +http://www.cliki.net/CFFI +@end macro +@c TeX puts spurious newlines in when you use the above macro +@c in @examples &c. So it is expanded below in some places. + + +@node Tutorial, Wrapper generators, Implementation Support, Top +@chapter An Introduction to Foreign Interfaces and @acronym{CFFI} + +@c Above, I don't use the cffi macro because it breaks TeX. + +@cindex tutorial, @cffi{} +Users of many popular languages bearing semantic similarity to Lisp, +such as Perl and Python, are accustomed to having access to popular C +libraries, such as @acronym{GTK}, by way of ``bindings''. In Lisp, we +do something similar, but take a fundamentally different approach. +This tutorial first explains this difference, then explains how you +can use @cffi{}, a powerful system for calling out to C and C++ and +access C data from many Common Lisp implementations. + +@cindex foreign functions and data +The concept can be generalized to other languages; at the time of +writing, only @cffi{}'s C support is fairly complete. Therefore, we +will interchangeably refer to @dfn{foreign functions} and @dfn{foreign +data}, and ``C functions'' and ``C data''. At no time will the word +``foreign'' carry its usual, non-programming meaning. + +This tutorial expects you to have a working understanding of both +Common Lisp and C, including the Common Lisp macro system. + +@menu +* Tutorial-Comparison:: Why FFI? +* Tutorial-Getting a URL:: An FFI use case. +* Tutorial-Loading:: Load libcurl.so. +* Tutorial-Initializing:: Call a function in libcurl.so. +* Tutorial-easy_setopt:: An advanced libcurl function. +* Tutorial-Abstraction:: Why breaking it is necessary. +* Tutorial-Lisp easy_setopt:: Semi-Lispy option interface. +* Tutorial-Memory:: In C, you collect the garbage. +* Tutorial-Callbacks:: Make useful C function pointers. +* Tutorial-Completion:: Minimal get-url functionality. +* Tutorial-Types:: Defining new foreign types. +* Tutorial-Conclusion:: What's next? +@end menu + + +@node Tutorial-Comparison, Tutorial-Getting a URL, Tutorial, Tutorial +@section What makes Lisp different + +The following sums up how bindings to foreign libraries are usually +implemented in other languages, then in Common Lisp: + +@table @asis +@item Perl, Python, Java, other one-implementation languages +@cindex @acronym{SWIG} +@cindex Perl +@cindex Python +Bindings are implemented as shared objects written in C. In some +cases, the C code is generated by a tool, such as @acronym{SWIG}, but +the result is the same: a new C library that manually translates +between the language implementation's objects, such as @code{PyObject} +in Python, and whatever C object is called for, often using C +functions provided by the implementation. It also translates between +the calling conventions of the language and C. + +@item Common Lisp +@cindex @acronym{SLIME} +Bindings are written in Lisp. They can be created at-will by Lisp +programs. Lisp programmers can write new bindings and add them to the +image, using a listener such as @acronym{SLIME}, as easily as with +regular Lisp definitions. The only foreign library to load is the one +being wrapped---the one with the pure C interface; no C or other +non-Lisp compilation is required. +@end table + +@cindex advantages of @acronym{FFI} +@cindex benefits of @acronym{FFI} +We believe the advantages of the Common Lisp approach far outweigh any +disadvantages. Incremental development with a listener can be as +productive for C binding development as it is with other Lisp +development. Keeping it ``in the [Lisp] family'', as it were, makes +it much easier for you and other Lisp programmers to load and use the +bindings. Common Lisp implementations such as @acronym{CMUCL}, freed +from having to provide a C interface to their own objects, are thus +freed to be implemented in another language (as @acronym{CMUCL} is) +while still allowing programmers to call foreign functions. + +@cindex minimal bindings +Perhaps the greatest advantage is that using an @acronym{FFI} doesn't +obligate you to become a professional binding developer. Writers of +bindings for other languages usually end up maintaining or failing to +maintain complete bindings to the foreign library. Using an +@acronym{FFI}, however, means if you only need one or two functions, +you can write bindings for only those functions, and be assured that +you can just as easily add to the bindings if need be. + +@cindex C abstractions +@cindex abstractions in C +The removal of the C compiler, or C interpretation of any kind, +creates the main disadvantage: some of C's ``abstractions'' are not +available, violating information encapsulation. For example, +@code{struct}s that must be passed on the stack, or used as return +values, without corresponding functional abstractions to create and +manage the @code{struct}s, must be declared explicitly in Lisp. This +is fine for structs whose contents are ``public'', but is not so +pleasant when a struct is supposed to be ``opaque'' by convention, +even though it is not so defined.@footnote{Admittedly, this is an +advanced issue, and we encourage you to leave this text until you are +more familiar with how @cffi{} works.} + +Without an abstraction to create the struct, Lisp needs to be able to +lay out the struct in memory, so must know its internal details. + +@cindex workaround for C +In these cases, you can create a minimal C library to provide the +missing abstractions, without destroying all the advantages of the +Common Lisp approach discussed above. In the case of @code{struct}s, +you can write simple, pure C functions that tell you how many bytes a +struct requires or allocate new structs, read and write fields of the +struct, or whatever operations are supposed to be +public.@footnote{This does not apply to structs whose contents are +intended to be part of the public library interface. In those cases, +a pure Lisp struct definition is always preferred. In fact, many +prefer to stay in Lisp and break the encapsulation anyway, placing the +burden of correct library interface definition on the library.} +@ref{The Groveller} automates this and other processes. + +Another disadvantage appears when you would rather use the foreign +language than Lisp. However, someone who prefers C to Lisp is not a +likely candidate for developing a Lisp interface to a C library. + + +@node Tutorial-Getting a URL, Tutorial-Loading, Tutorial-Comparison, Tutorial +@section Getting a @acronym{URL} + +@cindex c@acronym{URL} +The widely available @code{libcurl} is a library for downloading files +over protocols like @acronym{HTTP}. We will use @code{libcurl} with +@cffi{} to download a web page. + +Please note that there are many other ways to download files from the +web, not least the @sc{cl-curl} project to provide bindings to +@code{libcurl} via a similar @acronym{FFI}.@footnote{Specifically, +@acronym{UFFI}, an older @acronym{FFI} that takes a somewhat different +approach compared to @cffi{}. I believe that these days (December +2005) @cffi{} is more portable and actively developed, though not as +mature yet. Consensus in the free @sc{unix} Common Lisp community +seems to be that @cffi{} is preferred for new development, though +@acronym{UFFI} will likely go on for quite some time as many projects +already use it. @cffi{} includes the @code{UFFI-COMPAT} package for +complete compatibility with @acronym{UFFI}.} + +@uref{http://curl.haxx.se/libcurl/c/libcurl-tutorial.html,,libcurl-tutorial(3)} +is a tutorial for @code{libcurl} programming in C. We will follow +that to develop a binding to download a file. We will also use +@file{curl.h}, @file{easy.h}, and the @command{man} pages for the +@code{libcurl} function, all available in the @samp{curl-dev} package +or equivalent for your system, or in the c@acronym{URL} source code +package. If you have the development package, the headers should be +installed in @file{/usr/include/curl/}, and the @command{man} pages +may be accessed through your favorite @command{man} facility. + + +@node Tutorial-Loading, Tutorial-Initializing, Tutorial-Getting a URL, Tutorial +@section Loading foreign libraries + +@cindex loading @cffi{} +@cindex requiring @cffi{} +First of all, we will create a package to work in. You can save these +forms in a file, or just send them to the listener as they are. If +creating bindings for an @acronym{ASDF} package of yours, you will +want to add @code{:cffi} to the @code{:depends-on} list in your +@file{.asd} file. Otherwise, just use the @code{asdf:load-system} function to +load @cffi{}. + +@tutorialsource{Initialization} +@lisp +(asdf:load-system :cffi) + +;;; @lispcmt{Nothing special about the "CFFI-USER" package. We're just} +;;; @lispcmt{using it as a substitute for your own CL package.} +(defpackage :cffi-user + (:use :common-lisp :cffi)) + +(in-package :cffi-user) + +(define-foreign-library libcurl + (:darwin (:or "libcurl.3.dylib" "libcurl.dylib")) + (:unix (:or "libcurl.so.3" "libcurl.so")) + (t (:default "libcurl"))) + +(use-foreign-library libcurl) +@end lisp + +@cindex foreign library load +@cindex library, foreign +Using @code{define-foreign-library} and @code{use-foreign-library}, we +have loaded @code{libcurl} into Lisp, much as the linker does when you +start a C program, or @code{common-lisp:load} does with a Lisp source +file or @acronym{FASL} file. We special-cased for @sc{unix} machines +to always load a particular version, the one this tutorial was tested +with; for those who don't care, the @code{define-foreign-library} +clause @code{(t (:default "libcurl"))} should be satisfactory, and +will adapt to various operating systems. + + +@node Tutorial-Initializing, Tutorial-easy_setopt, Tutorial-Loading, Tutorial +@section Initializing @code{libcurl} + +@cindex function definition +After the introductory matter, the tutorial goes on to present the +first function you should use. + +@example +CURLcode curl_global_init(long flags); +@end example + +@noindent +Let's pick this apart into appropriate Lisp code: + +@tutorialsource{First CURLcode} +@lisp +;;; @lispcmt{A CURLcode is the universal error code. curl/curl.h says} +;;; @lispcmt{no return code will ever be removed, and new ones will be} +;;; @lispcmt{added to the end.} +(defctype curl-code :int) + +;;; @lispcmt{Initialize libcurl with FLAGS.} +(defcfun "curl_global_init" curl-code + (flags :long)) +@end lisp + +@impnote{By default, CFFI assumes the UNIX viewpoint that there is one +C symbol namespace, containing all symbols in all loaded objects. +This is not so on Windows and Darwin, but we emulate UNIX's behaviour +there. @ref{defcfun} for more details.} + +Note the parallels with the original C declaration. We've defined +@code{curl-code} as a wrapping type for @code{:int}; right now, it +only marks it as special, but later we will do something more +interesting with it. The point is that we don't have to do it yet. + +@cindex calling foreign functions +Looking at @file{curl.h}, @code{CURL_GLOBAL_NOTHING}, a possible value +for @code{flags} above, is defined as @samp{0}. So we can now call +the function: + +@example +@sc{cffi-user>} (curl-global-init 0) +@result{} 0 +@end example + +@cindex looks like it worked +Looking at @file{curl.h} again, @code{0} means @code{CURLE_OK}, so it +looks like the call succeeded. Note that @cffi{} converted the +function name to a Lisp-friendly name. You can specify your own name +if you want; use @code{("curl_global_init" @var{your-name-here})} as +the @var{name} argument to @code{defcfun}. + +The tutorial goes on to have us allocate a handle. For good measure, +we should also include the deallocator. Let's look at these +functions: + +@example +CURL *curl_easy_init( ); +void curl_easy_cleanup(CURL *handle); +@end example + +Advanced users may want to define special pointer types; we will +explore this possibility later. For now, just treat every pointer as +the same: + +@tutorialsource{curl_easy handles} +@lisp +(defcfun "curl_easy_init" :pointer) + +(defcfun "curl_easy_cleanup" :void + (easy-handle :pointer)) +@end lisp + +Now we can continue with the tutorial: + +@example +@sc{cffi-user>} (defparameter *easy-handle* (curl-easy-init)) +@result{} *EASY-HANDLE* +@sc{cffi-user>} *easy-handle* +@result{} # +@end example + +@cindex pointers in Lisp +Note the print representation of a pointer. It changes depending on +what Lisp you are using, but that doesn't make any difference to +@cffi{}. + + +@node Tutorial-easy_setopt, Tutorial-Abstraction, Tutorial-Initializing, Tutorial +@section Setting download options + +The @code{libcurl} tutorial says we'll want to set many options before +performing any download actions. This is done through +@code{curl_easy_setopt}: + +@c That is literally ..., not an ellipsis. +@example +CURLcode curl_easy_setopt(CURL *curl, CURLoption option, ...); +@end example + +@cindex varargs +@cindex foreign arguments +We've introduced a new twist: variable arguments. There is no obvious +translation to the @code{defcfun} form, particularly as there are four +possible argument types. Because of the way C works, we could define +four wrappers around @code{curl_easy_setopt}, one for each type; in +this case, however, we'll use the general-purpose macro +@code{foreign-funcall} to call this function. + +@cindex enumeration, C +To make things easier on ourselves, we'll create an enumeration of the +kinds of options we want to set. The @code{enum CURLoption} isn't the +most straightforward, but reading the @code{CINIT} C macro definition +should be enlightening. + +@tutorialsource{CURLoption enumeration} +@lisp +(defmacro define-curl-options (name type-offsets &rest enum-args) + "As with CFFI:DEFCENUM, except each of ENUM-ARGS is as follows: + + (NAME TYPE NUMBER) + +Where the arguments are as they are with the CINIT macro defined +in curl.h, except NAME is a keyword. + +TYPE-OFFSETS is a plist of TYPEs to their integer offsets, as +defined by the CURLOPTTYPE_LONG et al constants in curl.h." + (flet ((enumerated-value (type offset) + (+ (getf type-offsets type) offset))) + `(progn + (defcenum ,name + ,@@(loop for (name type number) in enum-args + collect (list name (enumerated-value type number)))) + ',name))) ;@lispcmt{for REPL users' sanity} + +(define-curl-options curl-option + (long 0 objectpoint 10000 functionpoint 20000 off-t 30000) + (:noprogress long 43) + (:nosignal long 99) + (:errorbuffer objectpoint 10) + (:url objectpoint 2)) +@end lisp + +With some well-placed Emacs @code{query-replace-regexp}s, you could +probably similarly define the entire @code{CURLoption} enumeration. I +have selected to transcribe a few that we will use in this tutorial. + +If you're having trouble following the macrology, just macroexpand the +@code{curl-option} definition, or see the following macroexpansion, +conveniently downcased and reformatted: + +@tutorialsource{DEFINE-CURL-OPTIONS macroexpansion} +@lisp +(progn + (defcenum curl-option + (:noprogress 43) + (:nosignal 99) + (:errorbuffer 10010) + (:url 10002)) + 'curl-option) +@end lisp + +@noindent +That seems more than reasonable. You may notice that we only use the +@var{type} to compute the real enumeration offset; we will also need +the type information later. + +First, however, let's make sure a simple call to the foreign function +works: + +@example +@sc{cffi-user>} (foreign-funcall "curl_easy_setopt" + :pointer *easy-handle* + curl-option :nosignal :long 1 curl-code) +@result{} 0 +@end example + +@code{foreign-funcall}, despite its surface simplicity, can be used to +call any C function. Its first argument is a string, naming the +function to be called. Next, for each argument, we pass the name of +the C type, which is the same as in @code{defcfun}, followed by a Lisp +object representing the data to be passed as the argument. The final +argument is the return type, for which we use the @code{curl-code} +type defined earlier. + +@code{defcfun} just puts a convenient fa@,cade on +@code{foreign-funcall}.@footnote{This isn't entirely true; some Lisps +don't support @code{foreign-funcall}, so @code{defcfun} is implemented +without it. @code{defcfun} may also perform optimizations that +@code{foreign-funcall} cannot.} Our earlier call to +@code{curl-global-init} could have been written as follows: + +@example +@sc{cffi-user>} (foreign-funcall "curl_global_init" :long 0 + curl-code) +@result{} 0 +@end example + +Before we continue, we will take a look at what @cffi{} can and can't +do, and why this is so. + + +@node Tutorial-Abstraction, Tutorial-Lisp easy_setopt, Tutorial-easy_setopt, Tutorial +@section Breaking the abstraction + +@cindex breaking the abstraction +@cindex abstraction breaking +In @ref{Tutorial-Comparison,, What makes Lisp different}, we mentioned +that writing an @acronym{FFI} sometimes requires depending on +information not provided as part of the interface. The easy option +@code{CURLOPT_WRITEDATA}, which we will not provide as part of the +Lisp interface, illustrates this issue. + +Strictly speaking, the @code{curl-option} enumeration is not +necessary; we could have used @code{:int 99} instead of +@code{curl-option :nosignal} in our call to @code{curl_easy_setopt} +above. We defined it anyway, in part to hide the fact that we are +breaking the abstraction that the C @code{enum} provides. If the +c@acronym{URL} developers decide to change those numbers later, we +must change the Lisp enumeration, because enumeration values are not +provided in the compiled C library, @code{libcurl.so.3}. + +@cffi{} works because the most useful things in C libraries --- +non-static functions and non-static variables --- are included +accessibly in @code{libcurl.so.3}. A C compiler that violated this +would be considered a worthless compiler. + +The other thing @code{define-curl-options} does is give the ``type'' +of the third argument passed to @code{curl_easy_setopt}. Using this +information, we can tell that the @code{:nosignal} option should +accept a long integer argument. We can implicitly assume @code{t} +@equiv{} 1 and @code{nil} @equiv{} 0, as it is in C, which takes care +of the fact that @code{CURLOPT_NOSIGNAL} is really asking for a +boolean. + +The ``type'' of @code{CURLOPT_WRITEDATA} is @code{objectpoint}. +However, it is really looking for a @code{FILE*}. +@code{CURLOPT_ERRORBUFFER} is looking for a @code{char*}, so there is +no obvious @cffi{} type but @code{:pointer}. + +The first thing to note is that nowhere in the C interface includes +this information; it can only be found in the manual. We could +disjoin these clearly different types ourselves, by splitting +@code{objectpoint} into @code{filepoint} and @code{charpoint}, but we +are still breaking the abstraction, because we have to augment the +entire enumeration form with this additional +information.@footnote{Another possibility is to allow the caller to +specify the desired C type of the third argument. This is essentially +what happens in a call to the function written in C.} + +@cindex streams and C +@cindex @sc{file}* and streams +The second is that the @code{CURLOPT_WRITEDATA} argument is completely +incompatible with the desired Lisp data, a +stream.@footnote{@xref{Other Kinds of Streams,,, libc, GNU C Library +Reference}, for a @acronym{GNU}-only way to extend the @code{FILE*} +type. You could use this to convert Lisp streams to the needed C +data. This would be quite involved and far outside the scope of this +tutorial.} It is probably acceptable if we are controlling every file +we might want to use as this argument, in which case we can just call +the foreign function @code{fopen}. Regardless, though, we can't write +to arbitrary streams, which is exactly what we want to do for this +application. + +Finally, note that the @code{curl_easy_setopt} interface itself is a +hack, intended to work around some of the drawbacks of C. The +definition of @code{Curl_setopt}, while long, is far less cluttered +than the equivalent disjoint-function set would be; in addition, +setting a new option in an old @code{libcurl} can generate a run-time +error rather than breaking the compile. Lisp can just as concisely +generate functions as compare values, and the ``undefined function'' +error is just as useful as any explicit error we could define here +might be. + + +@node Tutorial-Lisp easy_setopt, Tutorial-Memory, Tutorial-Abstraction, Tutorial +@section Option functions in Lisp + +We could use @code{foreign-funcall} directly every time we wanted to +call @code{curl_easy_setopt}. However, we can encapsulate some of the +necessary information with the following. + +@lisp +;;; @lispcmt{We will use this type later in a more creative way. For} +;;; @lispcmt{now, just consider it a marker that this isn't just any} +;;; @lispcmt{pointer.} +(defctype easy-handle :pointer) + +(defmacro curl-easy-setopt (easy-handle enumerated-name + value-type new-value) + "Call `curl_easy_setopt' on EASY-HANDLE, using ENUMERATED-NAME +as the OPTION. VALUE-TYPE is the CFFI foreign type of the third +argument, and NEW-VALUE is the Lisp data to be translated to the +third argument. VALUE-TYPE is not evaluated." + `(foreign-funcall "curl_easy_setopt" easy-handle ,easy-handle + curl-option ,enumerated-name + ,value-type ,new-value curl-code)) +@end lisp + +Now we define a function for each kind of argument that encodes the +correct @code{value-type} in the above. This can be done reasonably +in the @code{define-curl-options} macroexpansion; after all, that is +where the different options are listed! + +@cindex Lispy C functions +We could make @code{cl:defun} forms in the expansion that simply call +@code{curl-easy-setopt}; however, it is probably easier and clearer to +use @code{defcfun}. @code{define-curl-options} was becoming unwieldy, +so I defined some helpers in this new definition. + +@smalllisp +(defun curry-curl-option-setter (function-name option-keyword) + "Wrap the function named by FUNCTION-NAME with a version that +curries the second argument as OPTION-KEYWORD. + +This function is intended for use in DEFINE-CURL-OPTION-SETTER." + (setf (symbol-function function-name) + (let ((c-function (symbol-function function-name))) + (lambda (easy-handle new-value) + (funcall c-function easy-handle option-keyword + new-value))))) + +(defmacro define-curl-option-setter (name option-type + option-value foreign-type) + "Define (with DEFCFUN) a function NAME that calls +curl_easy_setopt. OPTION-TYPE and OPTION-VALUE are the CFFI +foreign type and value to be passed as the second argument to +easy_setopt, and FOREIGN-TYPE is the CFFI foreign type to be used +for the resultant function's third argument. + +This macro is intended for use in DEFINE-CURL-OPTIONS." + `(progn + (defcfun ("curl_easy_setopt" ,name) curl-code + (easy-handle easy-handle) + (option ,option-type) + (new-value ,foreign-type)) + (curry-curl-option-setter ',name ',option-value))) + +(defmacro define-curl-options (type-name type-offsets &rest enum-args) + "As with CFFI:DEFCENUM, except each of ENUM-ARGS is as follows: + + (NAME TYPE NUMBER) + +Where the arguments are as they are with the CINIT macro defined +in curl.h, except NAME is a keyword. + +TYPE-OFFSETS is a plist of TYPEs to their integer offsets, as +defined by the CURLOPTTYPE_LONG et al constants in curl.h. + +Also, define functions for each option named +set-`TYPE-NAME'-`OPTION-NAME', where OPTION-NAME is the NAME from +the above destructuring." + (flet ((enumerated-value (type offset) + (+ (getf type-offsets type) offset)) + ;; @lispcmt{map PROCEDURE, destructuring each of ENUM-ARGS} + (map-enum-args (procedure) + (mapcar (lambda (arg) (apply procedure arg)) enum-args)) + ;; @lispcmt{build a name like SET-CURL-OPTION-NOSIGNAL} + (make-setter-name (option-name) + (intern (concatenate + 'string "SET-" (symbol-name type-name) + "-" (symbol-name option-name))))) + `(progn + (defcenum ,type-name + ,@@(map-enum-args + (lambda (name type number) + (list name (enumerated-value type number))))) + ,@@(map-enum-args + (lambda (name type number) + (declare (ignore number)) + `(define-curl-option-setter ,(make-setter-name name) + ,type-name ,name ,(ecase type + (long :long) + (objectpoint :pointer) + (functionpoint :pointer) + (off-t :long))))) + ',type-name))) +@end smalllisp + +@noindent +Macroexpanding our @code{define-curl-options} form once more, we +see something different: + +@lisp +(progn + (defcenum curl-option + (:noprogress 43) + (:nosignal 99) + (:errorbuffer 10010) + (:url 10002)) + (define-curl-option-setter set-curl-option-noprogress + curl-option :noprogress :long) + (define-curl-option-setter set-curl-option-nosignal + curl-option :nosignal :long) + (define-curl-option-setter set-curl-option-errorbuffer + curl-option :errorbuffer :pointer) + (define-curl-option-setter set-curl-option-url + curl-option :url :pointer) + 'curl-option) +@end lisp + +@noindent +Macroexpanding one of the new @code{define-curl-option-setter} +forms yields the following: + +@lisp +(progn + (defcfun ("curl_easy_setopt" set-curl-option-nosignal) curl-code + (easy-handle easy-handle) + (option curl-option) + (new-value :long)) + (curry-curl-option-setter 'set-curl-option-nosignal ':nosignal)) +@end lisp + +@noindent +Finally, let's try this out: + +@example +@sc{cffi-user>} (set-curl-option-nosignal *easy-handle* 1) +@result{} 0 +@end example + +@noindent +Looks like it works just as well. This interface is now reasonably +high-level to wash out some of the ugliness of the thinnest possible +@code{curl_easy_setopt} @acronym{FFI}, without obscuring the remaining +C bookkeeping details we will explore. + + +@node Tutorial-Memory, Tutorial-Callbacks, Tutorial-Lisp easy_setopt, Tutorial +@section Memory management + +According to the documentation for @code{curl_easy_setopt}, the type +of the third argument when @var{option} is @code{CURLOPT_ERRORBUFFER} +is @code{char*}. Above, we've defined +@code{set-curl-option-errorbuffer} to accept a @code{:pointer} as the +new option value. However, there is a @cffi{} type @code{:string}, +which translates Lisp strings to C strings when passed as arguments to +foreign function calls. Why not, then, use @code{:string} as the +@cffi{} type of the third argument? There are two reasons, both +related to the necessity of breaking abstraction described in +@ref{Tutorial-Abstraction,, Breaking the abstraction}. + +The first reason also applies to @code{CURLOPT_URL}, which we will use +to illustrate the point. Assuming we have changed the type of the +third argument underlying @code{set-curl-option-url} to +@code{:string}, look at these two equivalent forms. + +@lisp +(set-curl-option-url *easy-handle* "http://www.cliki.net/CFFI") + +@equiv{} (with-foreign-string (url "http://www.cliki.net/CFFI") + (foreign-funcall "curl_easy_setopt" easy-handle *easy-handle* + curl-option :url :pointer url curl-code)) +@end lisp + +@noindent +The latter, in fact, is mostly equivalent to what a foreign function +call's macroexpansion actually does. As you can see, the Lisp string +@code{"@clikicffi{}"} is copied into a @code{char} array and +null-terminated; the pointer to beginning of this array, now a C +string, is passed as a @cffi{} @code{:pointer} to the foreign +function. + +@cindex dynamic extent +@cindex foreign values with dynamic extent +Unfortunately, the C abstraction has failed us, and we must break it. +While @code{:string} works well for many @code{char*} arguments, it +does not for cases like this. As the @code{curl_easy_setopt} +documentation explains, ``The string must remain present until curl no +longer needs it, as it doesn't copy the string.'' The C string +created by @code{with-foreign-string}, however, only has dynamic +extent: it is ``deallocated'' when the body (above containing the +@code{foreign-funcall} form) exits. + +@cindex premature deallocation +If we are supposed to keep the C string around, but it goes away, what +happens when some @code{libcurl} function tries to access the +@acronym{URL} string? We have reentered the dreaded world of C +``undefined behavior''. In some Lisps, it will probably get a chunk +of the Lisp/C stack. You may segfault. You may get some random piece +of other data from the heap. Maybe, in a world where ``dynamic +extent'' is defined to be ``infinite extent'', everything will turn +out fine. Regardless, results are likely to be almost universally +unpleasant.@footnote{``@i{But I thought Lisp was supposed to protect +me from all that buggy C crap!}'' Before asking a question like that, +remember that you are a stranger in a foreign land, whose residents +have a completely different set of values.} + +Returning to the current @code{set-curl-option-url} interface, here is +what we must do: + +@lisp +(let (easy-handle) + (unwind-protect + (with-foreign-string (url "http://www.cliki.net/CFFI") + (setf easy-handle (curl-easy-init)) + (set-curl-option-url easy-handle url) + #|@lispcmt{do more with the easy-handle, like actually get the URL}|#) + (when easy-handle + (curl-easy-cleanup easy-handle)))) +@end lisp + +@c old comment to luis: I go on to say that this isn't obviously +@c extensible to new option settings that require C strings to stick +@c around, as it would involve re-evaluating the unwind-protect form +@c with more dynamic memory allocation. So I plan to show how to +@c write something similar to ObjC's NSAutoreleasePool, to be managed +@c with a simple unwind-protect form. + +@noindent +That is fine for the single string defined here, but for every string +option we want to pass, we have to surround the body of +@code{with-foreign-string} with another @code{with-foreign-string} +wrapper, or else do some extremely error-prone pointer manipulation +and size calculation in advance. We could alleviate some of the pain +with a recursively expanding macro, but this would not remove the need +to modify the block every time we want to add an option, anathema as +it is to a modular interface. + +Before modifying the code to account for this case, consider the other +reason we can't simply use @code{:string} as the foreign type. In C, +a @code{char *} is a @code{char *}, not necessarily a string. The +option @code{CURLOPT_ERRORBUFFER} accepts a @code{char *}, but does +not expect anything about the data there. However, it does expect +that some @code{libcurl} function we call later can write a C string +of up to 255 characters there. We, the callers of the function, are +expected to read the C string at a later time, exactly the opposite of +what @code{:string} implies. + +With the semantics for an input string in mind --- namely, that the +string should be kept around until we @code{curl_easy_cleanup} the +easy handle --- we are ready to extend the Lisp interface: + +@lisp +(defvar *easy-handle-cstrings* (make-hash-table) + "Hashtable of easy handles to lists of C strings that may be +safely freed after the handle is freed.") + +(defun make-easy-handle () + "Answer a new CURL easy interface handle, to which the lifetime +of C strings may be tied. See `add-curl-handle-cstring'." + (let ((easy-handle (curl-easy-init))) + (setf (gethash easy-handle *easy-handle-cstrings*) '()) + easy-handle)) + +(defun free-easy-handle (handle) + "Free CURL easy interface HANDLE and any C strings created to +be its options." + (curl-easy-cleanup handle) + (mapc #'foreign-string-free + (gethash handle *easy-handle-cstrings*)) + (remhash handle *easy-handle-cstrings*)) + +(defun add-curl-handle-cstring (handle cstring) + "Add CSTRING to be freed when HANDLE is, answering CSTRING." + (car (push cstring (gethash handle *easy-handle-cstrings*)))) +@end lisp + +@noindent +Here we have redefined the interface to create and free handles, to +associate a list of allocated C strings with each handle while it +exists. The strategy of using different function names to wrap around +simple foreign functions is more common than the solution implemented +earlier with @code{curry-curl-option-setter}, which was to modify the +function name's function slot.@footnote{There are advantages and +disadvantages to each approach; I chose to @code{(setf +symbol-function)} earlier because it entailed generating fewer magic +function names.} + +Incidentally, the next step is to redefine +@code{curry-curl-option-setter} to allocate C strings for the +appropriate length of time, given a Lisp string as the +@code{new-value} argument: + +@lisp +(defun curry-curl-option-setter (function-name option-keyword) + "Wrap the function named by FUNCTION-NAME with a version that +curries the second argument as OPTION-KEYWORD. + +This function is intended for use in DEFINE-CURL-OPTION-SETTER." + (setf (symbol-function function-name) + (let ((c-function (symbol-function function-name))) + (lambda (easy-handle new-value) + (funcall c-function easy-handle option-keyword + (if (stringp new-value) + (add-curl-handle-cstring + easy-handle + (foreign-string-alloc new-value)) + new-value)))))) +@end lisp + +@noindent +A quick analysis of the code shows that you need only reevaluate the +@code{curl-option} enumeration definition to take advantage of these +new semantics. Now, for good measure, let's reallocate the handle +with the new functions we just defined, and set its @acronym{URL}: + +@example +@sc{cffi-user>} (curl-easy-cleanup *easy-handle*) +@result{} NIL +@sc{cffi-user>} (setf *easy-handle* (make-easy-handle)) +@result{} # +@sc{cffi-user>} (set-curl-option-nosignal *easy-handle* 1) +@result{} 0 +@sc{cffi-user>} (set-curl-option-url *easy-handle* + "http://www.cliki.net/CFFI") +@result{} 0 +@end example + +@cindex strings +For fun, let's inspect the Lisp value of the C string that was created +to hold @code{"@clikicffi{}"}. By virtue of the implementation of +@code{add-curl-handle-cstring}, it should be accessible through the +hash table defined: + +@example +@sc{cffi-user>} (foreign-string-to-lisp + (car (gethash *easy-handle* *easy-handle-cstrings*))) +@result{} "http://www.cliki.net/CFFI" +@end example + +@noindent +Looks like that worked, and @code{libcurl} now knows what +@acronym{URL} we want to retrieve. + +Finally, we turn back to the @code{:errorbuffer} option mentioned at +the beginning of this section. Whereas the abstraction added to +support string inputs works fine for cases like @code{CURLOPT_URL}, it +hides the detail of keeping the C string; for @code{:errorbuffer}, +however, we need that C string. + +In a moment, we'll define something slightly cleaner, but for now, +remember that you can always hack around anything. We're modifying +handle creation, so make sure you free the old handle before +redefining @code{free-easy-handle}. + +@smalllisp +(defvar *easy-handle-errorbuffers* (make-hash-table) + "Hashtable of easy handles to C strings serving as error +writeback buffers.") + +;;; @lispcmt{An extra byte is very little to pay for peace of mind.} +(defparameter *curl-error-size* 257 + "Minimum char[] size used by cURL to report errors.") + +(defun make-easy-handle () + "Answer a new CURL easy interface handle, to which the lifetime +of C strings may be tied. See `add-curl-handle-cstring'." + (let ((easy-handle (curl-easy-init))) + (setf (gethash easy-handle *easy-handle-cstrings*) '()) + (setf (gethash easy-handle *easy-handle-errorbuffers*) + (foreign-alloc :char :count *curl-error-size* + :initial-element 0)) + easy-handle)) + +(defun free-easy-handle (handle) + "Free CURL easy interface HANDLE and any C strings created to +be its options." + (curl-easy-cleanup handle) + (foreign-free (gethash handle *easy-handle-errorbuffers*)) + (remhash handle *easy-handle-errorbuffers*) + (mapc #'foreign-string-free + (gethash handle *easy-handle-cstrings*)) + (remhash handle *easy-handle-cstrings*)) + +(defun get-easy-handle-error (handle) + "Answer a string containing HANDLE's current error message." + (foreign-string-to-lisp + (gethash handle *easy-handle-errorbuffers*))) +@end smalllisp + +Be sure to once again set the options we've set thus far. You may +wish to define yet another wrapper function to do this. + + +@node Tutorial-Callbacks, Tutorial-Completion, Tutorial-Memory, Tutorial +@section Calling Lisp from C + +If you have been reading +@uref{http://curl.haxx.se/libcurl/c/curl_easy_setopt.html,, +@code{curl_easy_setopt(3)}}, you should have noticed that some options +accept a function pointer. In particular, we need one function +pointer to set as @code{CURLOPT_WRITEFUNCTION}, to be called by +@code{libcurl} rather than the reverse, in order to receive data as it +is downloaded. + +A binding writer without the aid of @acronym{FFI} usually approaches +this problem by writing a C function that accepts C data, converts to +the language's internal objects, and calls the callback provided by +the user, again in a reverse of usual practices. + +The @cffi{} approach to callbacks precisely mirrors its differences +with the non-@acronym{FFI} approach on the ``calling C from Lisp'' +side, which we have dealt with exclusively up to now. That is, you +define a callback function in Lisp using @code{defcallback}, and +@cffi{} effectively creates a C function to be passed as a function +pointer. + +@impnote{This is much trickier than calling C functions from Lisp, as +it literally involves somehow generating a new C function that is as +good as any created by the compiler. Therefore, not all Lisps support +them. @xref{Implementation Support}, for information about @cffi{} +support issues in this and other areas. You may want to consider +changing to a Lisp that supports callbacks in order to continue with +this tutorial.} + +@cindex callback definition +@cindex defining callbacks +Defining a callback is very similar to defining a callout; the main +difference is that we must provide some Lisp forms to be evaluated as +part of the callback. Here is the signature for the function the +@code{:writefunction} option takes: + +@example +size_t +@var{function}(void *ptr, size_t size, size_t nmemb, void *stream); +@end example + +@impnote{size_t is almost always an unsigned int. You can get this +and many other types using feature tests for your system by using +cffi-grovel.} + +The above signature trivially translates into a @cffi{} +@code{defcallback} form, as follows. + +@lisp +;;; @lispcmt{Alias in case size_t changes.} +(defctype size :unsigned-int) + +;;; @lispcmt{To be set as the CURLOPT_WRITEFUNCTION of every easy handle.} +(defcallback easy-write size ((ptr :pointer) (size size) + (nmemb size) (stream :pointer)) + (let ((data-size (* size nmemb))) + (handler-case + ;; @lispcmt{We use the dynamically-bound *easy-write-procedure* to} + ;; @lispcmt{call a closure with useful lexical context.} + (progn (funcall (symbol-value '*easy-write-procedure*) + (foreign-string-to-lisp ptr :count data-size)) + data-size) ;@lispcmt{indicates success} + ;; @lispcmt{The WRITEFUNCTION should return something other than the} + ;; @lispcmt{#bytes available to signal an error.} + (error () (if (zerop data-size) 1 0))))) +@end lisp + +First, note the correlation of the first few forms, used to declare +the C function's signature, with the signature in C syntax. We +provide a Lisp name for the function, its return type, and a name and +type for each argument. + +In the body, we call the dynamically-bound +@code{*easy-write-procedure*} with a ``finished'' translation, of +pulling together the raw data and size into a Lisp string, rather than +deal with the data directly. As part of calling +@code{curl_easy_perform} later, we'll bind that variable to a closure +with more useful lexical bindings than the top-level +@code{defcallback} form. + +Finally, we make a halfhearted effort to prevent non-local exits from +unwinding the C stack, covering the most likely case with an +@code{error} handler, which is usually triggered +unexpectedly.@footnote{Unfortunately, we can't protect against +@emph{all} non-local exits, such as @code{return}s and @code{throw}s, +because @code{unwind-protect} cannot be used to ``short-circuit'' a +non-local exit in Common Lisp, due to proposal @code{minimal} in +@uref{http://www.lisp.org/HyperSpec/Issues/iss152-writeup.html, +@acronym{ANSI} issue @sc{Exit-Extent}}. Furthermore, binding an +@code{error} handler prevents higher-up code from invoking restarts +that may be provided under the callback's dynamic context. Such is +the way of compromise.} The reason is that most C code is written to +understand its own idiosyncratic error condition, implemented above in +the case of @code{curl_easy_perform}, and more ``undefined behavior'' +can result if we just wipe C stack frames without allowing them to +execute whatever cleanup actions as they like. + +Using the @code{CURLoption} enumeration in @file{curl.h} once more, we +can describe the new option by modifying and reevaluating +@code{define-curl-options}. + +@lisp +(define-curl-options curl-option + (long 0 objectpoint 10000 functionpoint 20000 off-t 30000) + (:noprogress long 43) + (:nosignal long 99) + (:errorbuffer objectpoint 10) + (:url objectpoint 2) + (:writefunction functionpoint 11)) ;@lispcmt{new item here} +@end lisp + +Finally, we can use the defined callback and the new +@code{set-curl-option-writefunction} to finish configuring the easy +handle, using the @code{callback} macro to retrieve a @cffi{} +@code{:pointer}, which works like a function pointer in C code. + +@example +@sc{cffi-user>} (set-curl-option-writefunction + *easy-handle* (callback easy-write)) +@result{} 0 +@end example + + +@node Tutorial-Completion, Tutorial-Types, Tutorial-Callbacks, Tutorial +@section A complete @acronym{FFI}? + +@c TeX goes insane on @uref{@clikicffi{}} + +With all options finally set and a medium-level interface developed, +we can finish the definition and retrieve +@uref{http://www.cliki.net/CFFI}, as is done in the tutorial. + +@lisp +(defcfun "curl_easy_perform" curl-code + (handle easy-handle)) +@end lisp + +@example +@sc{cffi-user>} (with-output-to-string (contents) + (let ((*easy-write-procedure* + (lambda (string) + (write-string string contents)))) + (declare (special *easy-write-procedure*)) + (curl-easy-perform *easy-handle*))) +@result{} " +" +@end example + +Of course, that itself is slightly unwieldy, so you may want to define +a function around it that simply retrieves a @acronym{URL}. I will +leave synthesis of all the relevant @acronym{REPL} forms presented +thus far into a single function as an exercise for the reader. + +The remaining sections of this tutorial explore some advanced features +of @cffi{}; the definition of new types will receive special +attention. Some of these features are essential for particular +foreign function calls; some are very helpful when trying to develop a +Lispy interface to C. + + +@node Tutorial-Types, Tutorial-Conclusion, Tutorial-Completion, Tutorial +@section Defining new types + +We've occasionally used the @code{defctype} macro in previous sections +as a kind of documentation, much what you'd use @code{typedef} for in +C. We also tried one special kind of type definition, the +@code{defcenum} type. @xref{defcstruct}, for a definition macro that +may come in handy if you need to use C @code{struct}s as data. + +@cindex type definition +@cindex data in Lisp and C +@cindex translating types +However, all of these are mostly sugar for the powerful underlying +foreign type interface called @dfn{type translators}. You can easily +define new translators for any simple named foreign type. Since we've +defined the new type @code{curl-code} to use as the return type for +various @code{libcurl} functions, we can use that to directly convert +c@acronym{URL} errors to Lisp errors. + +@code{defctype}'s purpose is to define simple @code{typedef}-like +aliases. In order to use @dfn{type translators} we must use the +@code{define-foreign-type} macro. So let's redefine @code{curl-code} +using it. + +@lisp +(define-foreign-type curl-code-type () + () + (:actual-type :int) + (:simple-parser curl-code)) +@end lisp + +@code{define-foreign-type} is a thin wrapper around @code{defclass}. +For now, all you need to know in the context of this example is that +it does what @code{(defctype curl-code :int)} would do and, +additionally, defines a new class @code{curl-code-type} which we will +take advantage of shortly. + +The @code{CURLcode} enumeration seems to follow the typical error code +convention of @samp{0} meaning all is well, and each non-zero integer +indicating a different kind of error. We can apply that trivially to +differentiate between normal exits and error exits. + +@lisp +(define-condition curl-code-error (error) + (($code :initarg :curl-code :reader curl-error-code)) + (:report (lambda (c stream) + (format stream "libcurl function returned error ~A" + (curl-error-code c)))) + (:documentation "Signalled when a libcurl function answers +a code other than CURLE_OK.")) + +(defmethod translate-from-foreign (value (type curl-code-type)) + "Raise a CURL-CODE-ERROR if VALUE, a curl-code, is non-zero." + (if (zerop value) + :curle-ok + (error 'curl-code-error :curl-code value))) +@end lisp + +@noindent +The heart of this translator is new method +@code{translate-from-foreign}. By specializing the @var{type} +parameter on @code{curl-code-type}, we immediately modify the behavior +of every function that returns a @code{curl-code} to pass the result +through this new method. + +To see the translator in action, try invoking a function that returns +a @code{curl-code}. You need to reevaluate the respective +@code{defcfun} form so that it picks up the new @code{curl-code} +definition. + +@example +@sc{cffi-user>} (set-curl-option-nosignal *easy-handle* 1) +@result{} :CURLE-OK +@end example + +@noindent +As the result was @samp{0}, the new method returned @code{:curle-ok}, +just as specified.@footnote{It might be better to return +@code{(values)} than @code{:curle-ok} in real code, but this is good +for illustration.} I will leave disjoining the separate +@code{CURLcode}s into condition types and improving the @code{:report} +function as an exercise for you. + +The creation of @code{*easy-handle-cstrings*} and +@code{*easy-handle-errorbuffers*} as properties of @code{easy-handle}s +is a kluge. What we really want is a Lisp structure that stores these +properties along with the C pointer. Unfortunately, +@code{easy-handle} is currently just a fancy name for the foreign type +@code{:pointer}; the actual pointer object varies from Common Lisp +implementation to implementation, needing only to satisfy +@code{pointerp} and be returned from @code{make-pointer} and friends. + +One solution that would allow us to define a new Lisp structure to +represent @code{easy-handle}s would be to write a wrapper around every +function that currently takes an @code{easy-handle}; the wrapper would +extract the pointer and pass it to the foreign function. However, we +can use type translators to more elegantly integrate this +``translation'' into the foreign function calling framework, using +@code{translate-to-foreign}. + +@smalllisp +(defclass easy-handle () + ((pointer :initform (curl-easy-init) + :documentation "Foreign pointer from curl_easy_init") + (error-buffer + :initform (foreign-alloc :char :count *curl-error-size* + :initial-element 0) + :documentation "C string describing last error") + (c-strings :initform '() + :documentation "C strings set as options")) + (:documentation "I am a parameterization you may pass to +curl-easy-perform to perform a cURL network protocol request.")) + +(defmethod initialize-instance :after ((self easy-handle) &key) + (set-curl-option-errorbuffer self (slot-value self 'error-buffer))) + +(defun add-curl-handle-cstring (handle cstring) + "Add CSTRING to be freed when HANDLE is, answering CSTRING." + (car (push cstring (slot-value handle 'c-strings)))) + +(defun get-easy-handle-error (handle) + "Answer a string containing HANDLE's current error message." + (foreign-string-to-lisp + (slot-value handle 'error-buffer))) + +(defun free-easy-handle (handle) + "Free CURL easy interface HANDLE and any C strings created to +be its options." + (with-slots (pointer error-buffer c-strings) handle + (curl-easy-cleanup pointer) + (foreign-free error-buffer) + (mapc #'foreign-string-free c-strings))) + +(define-foreign-type easy-handle-type () + () + (:actual-type :pointer) + (:simple-parser easy-handle)) + +(defmethod translate-to-foreign (handle (type easy-handle-type)) + "Extract the pointer from an easy-HANDLE." + (slot-value handle 'pointer)) +@end smalllisp + +While we changed some of the Lisp functions defined earlier to use +@acronym{CLOS} slots rather than hash tables, the foreign functions +work just as well as they did before. + +@cindex limitations of type translators +The greatest strength, and the greatest limitation, of the type +translator comes from its generalized interface. As stated +previously, we could define all foreign function calls in terms of the +primitive foreign types provided by @cffi{}. The type translator +interface allows us to cleanly specify the relationship between Lisp +and C data, independent of where it appears in a function call. This +independence comes at a price; for example, it cannot be used to +modify translation semantics based on other arguments to a function +call. In these cases, you should rely on other features of Lisp, +rather than the powerful, yet domain-specific, type translator +interface. + + +@node Tutorial-Conclusion, , Tutorial-Types, Tutorial +@section What's next? + +@cffi{} provides a rich and powerful foundation for communicating with +foreign libraries; as we have seen, it is up to you to make that +experience a pleasantly Lispy one. This tutorial does not cover all +the features of @cffi{}; please see the rest of the manual for +details. In particular, if something seems obviously missing, it is +likely that either code or a good reason for lack of code is already +present. + +@impnote{There are some other things in @cffi{} that might deserve +tutorial sections, such as free-translated-object, or structs. Let us +know which ones you care about.} + + +@c =================================================================== +@c CHAPTER: Wrapper generators + +@node Wrapper generators, Foreign Types, Tutorial, Top +@chapter Wrapper generators + +@cffi{}'s interface is designed for human programmers, being aimed at +aesthetic as well as technical sophistication. However, there are a +few programs aimed at translating C and C++ header files, or +approximations thereof, into @cffi{} forms constituting a foreign +interface to the symbols in those files. + +These wrapper generators are known to support output of @cffi{} forms. + +@table @asis +@item @uref{http://www.cliki.net/Verrazano,Verrazano} +Designed specifically for Common Lisp. Uses @acronym{GCC}'s parser +output in @acronym{XML} format to discover functions, variables, and +other header file data. This means you need @acronym{GCC} to generate +forms; on the other hand, the parser employed is mostly compliant with +@acronym{ANSI} C. + +@item @uref{http://www.cliki.net/SWIG,SWIG} +A foreign interface generator originally designed to generate Python +bindings, it has been ported to many other systems, including @cffi{} +in version 1.3.28. Includes its own C declaration munger, not +intended to be fully-compliant with @acronym{ANSI} C. +@end table + +First, this manual does not describe use of these other programs; they +have documentation of their own. If you have problems using a +generated interface, please look at the output @cffi{} forms and +verify that they are a correct @cffi{} interface to the library in +question; if they are correct, contact @cffi{} developers with +details, keeping in mind that they communicate in terms of those forms +rather than any particular wrapper generator. Otherwise, contact the +maintainers of the wrapper generator you are using, provided you can +reasonably expect more accuracy from the generator. + +When is more accuracy an unreasonable expectation? As described in +the tutorial (@pxref{Tutorial-Abstraction,, Breaking the +abstraction}), the information in C declarations is insufficient to +completely describe every interface. In fact, it is quite common to +run into an interface that cannot be handled automatically, and +generators should be excused from generating a complete interface in +these cases. + +As further described in the tutorial, the thinnest Lisp interface to a +C function is not always the most pleasant one. In many cases, you +will want to manually write a Lispier interface to the C functions +that interest you. + +Wrapper generators should be treated as time-savers, not complete +automation of the full foreign interface writing job. Reports of the +amount of work done by generators vary from 30% to 90%. The +incremental development style enabled by @cffi{} generally reduces +this proportion below that for languages like Python. + +@c Where I got the above 30-90% figures: +@c 30%: lemonodor's post about SWIG +@c 90%: Balooga on #lisp. He said 99%, but that's probably an +@c exaggeration (leave it to me to pass judgement :) +@c -stephen + + +@c =================================================================== +@c CHAPTER: Foreign Types + +@node Foreign Types, Pointers, Wrapper generators, Top +@chapter Foreign Types + +Foreign types describe how data is translated back and forth between C +and Lisp. @cffi{} provides various built-in types and allows the user to +define new types. + +@menu +* Built-In Types:: +* Other Types:: +* Defining Foreign Types:: +* Foreign Type Translators:: +* Optimizing Type Translators:: +* Foreign Structure Types:: +* Allocating Foreign Objects:: + +Dictionary + +* convert-from-foreign:: +* convert-to-foreign:: +* defbitfield:: +* defcstruct:: +* defcunion:: +* defctype:: +* defcenum:: +@c * define-type-spec-parser:: +* define-foreign-type:: +* define-parse-method:: +@c * explain-foreign-slot-value: +* foreign-bitfield-symbols:: +* foreign-bitfield-value:: +* foreign-enum-keyword:: +* foreign-enum-value:: +* foreign-slot-names:: +* foreign-slot-offset:: +* foreign-slot-pointer:: +* foreign-slot-value:: +* foreign-type-alignment:: +* foreign-type-size:: +* free-converted-object:: +* free-translated-object:: +* translate-from-foreign:: +* translate-to-foreign:: +* translate-into-foreign-memory:: +* with-foreign-slots:: +@end menu + +@node Built-In Types, Other Types, Foreign Types, Foreign Types +@section Built-In Types + +@ForeignType{:char} +@ForeignType{:unsigned-char} +@ForeignType{:short} +@ForeignType{:unsigned-short} +@ForeignType{:int} +@ForeignType{:unsigned-int} +@ForeignType{:long} +@ForeignType{:unsigned-long} +@ForeignType{:long-long} +@ForeignType{:unsigned-long-long} + +These types correspond to the native C integer types according to the +@acronym{ABI} of the Lisp implementation's host system. + +@code{:long-long} and @code{:unsigned-long-long} are not supported +natively on all implementations. However, they are emulated by +@code{mem-ref} and @code{mem-set}. + +When those types are @strong{not} available, the symbol +@code{cffi-sys::no-long-long} is pushed into @code{*features*}. + +@ForeignType{:uchar} +@ForeignType{:ushort} +@ForeignType{:uint} +@ForeignType{:ulong} +@ForeignType{:llong} +@ForeignType{:ullong} + +For convenience, the above types are provided as shortcuts for +@code{unsigned-char}, @code{unsigned-short}, @code{unsigned-int}, +@code{unsigned-long}, @code{long-long} and @code{unsigned-long-long}, +respectively. + +@ForeignType{:int8} +@ForeignType{:uint8} +@ForeignType{:int16} +@ForeignType{:uint16} +@ForeignType{:int32} +@ForeignType{:uint32} +@ForeignType{:int64} +@ForeignType{:uint64} + +Foreign integer types of specific sizes, corresponding to the C types +defined in @code{stdint.h}. + +@c @ForeignType{:size} +@c @ForeignType{:ssize} +@c @ForeignType{:ptrdiff} +@c @ForeignType{:time} + +@c Foreign integer types corresponding to the standard C types (without +@c the @code{_t} suffix). + +@c @impnote{These are not implemented yet. --luis} + +@c @impnote{I'm sure there are more of these that could be useful, let's +@c add any types that can't be defined portably to this list as +@c necessary. --james} + +@ForeignType{:float} +@ForeignType{:double} + +On all systems, the @code{:float} and @code{:double} types represent a +C @code{float} and @code{double}, respectively. On most but not all +systems, @code{:float} and @code{:double} represent a Lisp +@code{single-float} and @code{double-float}, respectively. It is not +so useful to consider the relationship between Lisp types and C types +as isomorphic, as simply to recognize the relationship, and relative +precision, among each respective category. + +@ForeignType{:long-double} + +This type is only supported on SCL. + +@ForeignType{:pointer &optional type} + +A foreign pointer to an object of any type, corresponding to +@code{void *}. You can optionally specify type of pointer +(e.g. @code{(:pointer :char)}). Although @cffi{} won't do anything +with that information yet, it is useful for documentation purposes. + +@ForeignType{:void} + +No type at all. Only valid as the return type of a function. + +@node Other Types, Defining Foreign Types, Built-In Types, Foreign Types +@section Other Types + +@cffi{} also provides a few useful types that aren't built-in C +types. + +@ForeignType{:string} + +The @code{:string} type performs automatic conversion between Lisp and +C strings. Note that, in the case of functions the converted C string +will have dynamic extent (i.e.@: it will be automatically freed after +the foreign function returns). + +In addition to Lisp strings, this type will accept foreign pointers +and pass them unmodified. + +A method for @ref{free-translated-object} is specialized for this +type. So, for example, foreign strings allocated by this type and +passed to a foreign function will be freed after the function +returns. + +@lisp +CFFI> (foreign-funcall "getenv" :string "SHELL" :string) +@result{} "/bin/bash" + +CFFI> (with-foreign-string (str "abcdef") + (foreign-funcall "strlen" :string str :int)) +@result{} 6 +@end lisp + +@ForeignType{:string+ptr} + +Like @code{:string} but returns a list with two values when convert +from C to Lisp: a Lisp string and the C string's foreign pointer. + +@lisp +CFFI> (foreign-funcall "getenv" :string "SHELL" :string+ptr) +@result{} ("/bin/bash" #.(SB-SYS:INT-SAP #XBFFFFC6F)) +@end lisp + +@ForeignType{:boolean &optional (base-type :int)} + +The @code{:boolean} type converts between a Lisp boolean and a C +boolean. It canonicalizes to @var{base-type} which is @code{:int} by +default. + +@lisp +(convert-to-foreign nil :boolean) @result{} 0 +(convert-to-foreign t :boolean) @result{} 1 +(convert-from-foreign 0 :boolean) @result{} nil +(convert-from-foreign 1 :boolean) @result{} t +@end lisp + +@ForeignType{:bool} + +The @code{:bool} type represents the C99 @code{_Bool} or C++ +@code{bool}. Its size is usually 1 byte except on OSX where it's an +@code{int}. + +@ForeignType{:wrapper base-type &key to-c from-c} + +The @code{:wrapper} type stores two symbols passed to the @var{to-c} +and @var{from-c} arguments. When a value is being translated to or +from C, this type @code{funcall}s the respective symbol. + +@code{:wrapper} types will be typedefs for @var{base-type} and will +inherit its translators, if any. + +Here's an example of how the @code{:boolean} type could be defined in +terms of @code{:wrapper}. + +@lisp +(defun bool-c-to-lisp (value) + (not (zerop value))) + +(defun bool-lisp-to-c (value) + (if value 1 0)) + +(defctype my-bool (:wrapper :int :from-c bool-c-to-lisp + :to-c bool-lisp-to-c)) + +(convert-to-foreign nil 'my-bool) @result{} 0 +(convert-from-foreign 1 'my-bool) @result{} t +@end lisp + +@node Defining Foreign Types, Foreign Type Translators, Other Types, Foreign Types +@section Defining Foreign Types + +You can define simple C-like @code{typedef}s through the +@code{defctype} macro. Defining a typedef is as simple as giving +@code{defctype} a new name and the name of the type to be wrapped. + +@lisp +;;; @lispcmt{Define MY-INT as an alias for the built-in type :INT.} +(defctype my-int :int) +@end lisp + +With this type definition, one can, for instance, declare arguments to +foreign functions as having the type @code{my-int}, and they will be +passed as integers. + +@subheading More complex types + +@cffi{} offers another way to define types through +@code{define-foreign-type}, a thin wrapper macro around +@code{defclass}. As an example, let's go through the steps needed to +define a @code{(my-string &key encoding)} type. First, we need to +define our type class: + +@lisp +(define-foreign-type my-string-type () + ((encoding :reader string-type-encoding :initarg :encoding)) + (:actual-type :pointer)) +@end lisp + +The @code{:actual-type} class option tells CFFI that this type will +ultimately be passed to and received from foreign code as a +@code{:pointer}. Now you need to tell CFFI how to parse a type +specification such as @code{(my-string :encoding :utf8)} into an +instance of @code{my-string-type}. We do that with +@code{define-parse-method}: + +@lisp +(define-parse-method my-string (&key (encoding :utf-8)) + (make-instance 'my-string-type :encoding encoding)) +@end lisp + +The next section describes how make this type actually translate +between C and Lisp strings. + +@node Foreign Type Translators, Optimizing Type Translators, Defining Foreign Types, Foreign Types +@section Foreign Type Translators + +Type translators are used to automatically convert Lisp values to or +from foreign values. For example, using type translators, one can +take the @code{my-string} type defined in the previous section and +specify that it should: + +@itemize +@item +convert C strings to Lisp strings; +@item +convert Lisp strings to newly allocated C strings; +@item +free said C strings when they are no longer needed. +@end itemize + +In order to tell @cffi{} how to automatically convert Lisp values to +foreign values, define a specialized method for the +@code{translate-to-foreign} generic function: + +@lisp +;;; @lispcmt{Define a method that converts Lisp strings to C strings.} +(defmethod translate-to-foreign (string (type my-string-type)) + (foreign-string-alloc string :encoding (string-type-encoding type))) +@end lisp + +@noindent +From now on, whenever an object is passed as a @code{my-string} to a +foreign function, this method will be invoked to convert the Lisp +value. To perform the inverse operation, which is needed for functions +that return a @code{my-string}, specialize the +@code{translate-from-foreign} generic function in the same manner: + +@lisp +;;; @lispcmt{Define a method that converts C strings to Lisp strings.} +(defmethod translate-from-foreign (pointer (type my-string-type)) + (foreign-string-to-lisp pointer :encoding (string-type-encoding type))) +@end lisp + +@noindent +When a @code{translate-to-foreign} method requires allocation of +foreign memory, you must also define a @code{free-translated-object} +method to free the memory once the foreign object is no longer needed, +otherwise you'll be faced with memory leaks. This generic function is +called automatically by @cffi{} when passing objects to foreign +functions. Let's do that: + +@lisp +;;; @lispcmt{Free strings allocated by translate-to-foreign.} +(defmethod free-translated-object (pointer (type my-string-type) param) + (declare (ignore param)) + (foreign-string-free pointer)) +@end lisp + +@noindent +In this specific example, we don't need the @var{param} argument, so +we ignore it. See @ref{free-translated-object}, for an explanation of +its purpose and how you can use it. + +A type translator does not necessarily need to convert the value. For +example, one could define a typedef for @code{:pointer} that ensures, +in the @code{translate-to-foreign} method, that the value is not a +null pointer, signalling an error if a null pointer is passed. This +would prevent some pointer errors when calling foreign functions that +cannot handle null pointers. + +@strong{Please note:} these methods are meant as extensible hooks +only, and you should not call them directly. Use +@code{convert-to-foreign}, @code{convert-from-foreign} and +@code{free-converted-object} instead. + +@xref{Tutorial-Types,, Defining new types}, for another example of +type translators. + +@node Optimizing Type Translators, Foreign Structure Types, Foreign Type Translators, Foreign Types +@section Optimizing Type Translators + +@cindex type translators, optimizing +@cindex compiler macros for type translation +@cindex defining type-translation compiler macros +Being based on generic functions, the type translation mechanism +described above can add a bit of overhead. This is usually not +significant, but we nevertheless provide a way of getting rid of the +overhead for the cases where it matters. + +A good way to understand this issue is to look at the code generated +by @code{defcfun}. Consider the following example using the previously +defined @code{my-string} type: + +@lisp +CFFI> (macroexpand-1 '(defcfun foo my-string (x my-string))) +;; @lispcmt{(simplified, downcased, etc...)} +(defun foo (x) + (multiple-value-bind (#:G2019 #:PARAM3149) + (translate-to-foreign x #) + (unwind-protect + (translate-from-foreign + (foreign-funcall "foo" :pointer #:G2019 :pointer) + #) + (free-translated-object #:G2019 # + #:PARAM3149)))) +@end lisp + +@noindent +In order to get rid of those generic function calls, @cffi{} has +another set of extensible generic functions that provide functionality +similar to @acronym{CL}'s compiler macros: +@code{expand-to-foreign-dyn}, @code{expand-to-foreign} and +@code{expand-from-foreign}. Here's how one could define a +@code{my-boolean} with them: + +@lisp +(define-foreign-type my-boolean-type () + () + (:actual-type :int) + (:simple-parser my-boolean)) + +(defmethod expand-to-foreign (value (type my-boolean-type)) + `(if ,value 1 0)) + +(defmethod expand-from-foreign (value (type my-boolean-type)) + `(not (zerop ,value))) +@end lisp + +@noindent +And here's what the macroexpansion of a function using this type would +look like: + +@lisp +CFFI> (macroexpand-1 '(defcfun bar my-boolean (x my-boolean))) +;; @lispcmt{(simplified, downcased, etc...)} +(defun bar (x) + (let ((#:g3182 (if x 1 0))) + (not (zerop (foreign-funcall "bar" :int #:g3182 :int))))) +@end lisp + +@noindent +No generic function overhead. + +Let's go back to our @code{my-string} type. The expansion interface +has no equivalent of @code{free-translated-object}; you must instead +define a method on @code{expand-to-foreign-dyn}, the third generic +function in this interface. This is especially useful when you can +allocate something much more efficiently if you know the object has +dynamic extent, as is the case with function calls that don't save the +relevant allocated arguments. + +This exactly what we need for the @code{my-string} type: + +@lisp +(defmethod expand-from-foreign (form (type my-string-type)) + `(foreign-string-to-lisp ,form)) + +(defmethod expand-to-foreign-dyn (value var body (type my-string-type)) + (let ((encoding (string-type-encoding type))) + `(with-foreign-string (,var ,value :encoding ',encoding) + ,@@body))) +@end lisp + +@noindent +So let's look at the macro expansion: + +@lisp +CFFI> (macroexpand-1 '(defcfun foo my-string (x my-string))) +;; @lispcmt{(simplified, downcased, etc...)} +(defun foo (x) + (with-foreign-string (#:G2021 X :encoding ':utf-8) + (foreign-string-to-lisp + (foreign-funcall "foo" :pointer #:g2021 :pointer)))) +@end lisp + +@noindent +Again, no generic function overhead. + +@subheading Other details + +To short-circuit expansion and use the @code{translate-*} functions +instead, simply call the next method. Return its result in cases +where your method cannot generate an appropriate replacement for it. +This analogous to the @code{&whole form} mechanism compiler macros +provide. + +The @code{expand-*} methods have precedence over their +@code{translate-*} counterparts and are guaranteed to be used in +@code{defcfun}, @code{foreign-funcall}, @code{defcvar} and +@code{defcallback}. If you define a method on each of the +@code{expand-*} generic functions, you are guaranteed to have full +control over the expressions generated for type translation in these +macros. + +They may or may not be used in other @cffi{} operators that need to +translate between Lisp and C data; you may only assume that +@code{expand-*} methods will probably only be called during Lisp +compilation. + +@code{expand-to-foreign-dyn} has precedence over +@code{expand-to-foreign} and is only used in @code{defcfun} and +@code{foreign-funcall}, only making sense in those contexts. + +@strong{Important note:} this set of generic functions is called at +macroexpansion time. Methods are defined when loaded or evaluated, +not compiled. You are responsible for ensuring that your +@code{expand-*} methods are defined when the @code{foreign-funcall} or +other forms that use them are compiled. One way to do this is to put +the method definitions earlier in the file and inside an appropriate +@code{eval-when} form; another way is to always load a separate Lisp +or @acronym{FASL} file containing your @code{expand-*} definitions +before compiling files with forms that ought to use them. Otherwise, +they will not be found and the runtime translators will be used +instead. + +@node Foreign Structure Types, Allocating Foreign Objects, Optimizing Type Translators, Foreign Types +@section Foreign Structure Types + +For more involved C types than simple aliases to built-in types, such +as you can make with @code{defctype}, @cffi{} allows declaration of +structures and unions with @code{defcstruct} and @code{defcunion}. + +For example, consider this fictional C structure declaration holding +some personal information: + +@example +struct person @{ + int number; + char* reason; +@}; +@end example + +@noindent +The equivalent @code{defcstruct} form follows: + +@lisp +(defcstruct person + (number :int) + (reason :string)) +@end lisp + +@c LMH structure translation +By default, @ref{convert-from-foreign} (and also @ref{mem-ref}) will +make a plist with slot names as keys, and @ref{convert-to-foreign} will +translate such a plist to a foreign structure. A user wishing to define +other translations should use the @code{:class} argument to +@ref{defcstruct}, and then define methods for +@ref{translate-from-foreign} and +@ref{translate-into-foreign-memory} that specialize on this class, +possibly calling @code{call-next-method} to translate from and to the +plists rather than provide a direct interface to the foreign object. +The macro @code{translation-forms-for-class} will generate the forms +necessary to translate a Lisp class into a foreign structure and vice +versa. +@c Write separate function doc section for translation-forms-for-class? +@c Examples, perhaps taken from the tests? + +Please note that this interface is only for those that must know about +the values contained in a relevant struct. If the library you are +interfacing returns an opaque pointer that needs only be passed to +other C library functions, by all means just use @code{:pointer} or a +type-safe definition munged together with @code{defctype} and type +translation. To pass or return a structure by value to a function, load +the cffi-libffi system and specify the structure as @code{(:struct +@var{structure-name})}. To pass or return the pointer, you can use +either @code{:pointer} or @code{(:pointer (:struct +@var{structure-name}))}. + +@subheading Optimizing translate-into-foreign-memory + +Just like how @ref{translate-from-foreign} had +@code{expand-from-foreign} to optimize away the generic function call +and @ref{translate-to-foreign} had the same in +@code{expand-to-foreign}, @ref{translate-into-foreign-memory} has +@code{expand-into-foreign-memory}. + +Let's use our @code{person} struct in an example. However, we are +going to spice it up by using a lisp struct rather than a plist to +represent the person in lisp. + +First we redefine @code{person} very slightly. + +@lisp +(defcstruct (person :class c-person) + (number :int) + (reason :string)) +@end lisp + +By adding @code{:class} we can specialize the @code{translate-*} +methods on the type @code{c-person}. + +Next we define a lisp struct to use instead of the plists. + +@lisp +(defstruct lisp-person + (number 0 :type integer) + (reason "" :type string)) +@end lisp + +And now let's define the type translators we know already: + +@lisp +(defmethod translate-from-foreign (ptr (type c-person)) + (with-foreign-slots ((number reason) ptr (:struct person)) + (make-lisp-person :number number :reason reason))) + +(defmethod expand-from-foreign (ptr (type c-person)) + `(with-foreign-slots ((number reason) ,ptr (:struct person)) + (make-lisp-person :number number :reason reason))) + +(defmethod translate-into-foreign-memory (value (type c-person) ptr) + (with-foreign-slots ((number reason) ptr (:struct person)) + (setf number (lisp-person-number value) + reason (lisp-person-reason value)))) +@end lisp + +At this point everything works, we can convert to and from our +@code{lisp-person} and foreign @code{person}. If we macroexpand + +@lisp +(setf (mem-aref ptr '(:struct person)) x) +@end lisp + +we get something like: + +@lisp +(let ((#:store879 x)) + (translate-into-foreign-memory #:store879 # + (inc-pointer ptr 0)) + #:store879) +@end lisp + +Which is good, but now we can do better and get rid of that generic +function call to @code{translate-into-foreign-memory}. + +@lisp +(defmethod expand-into-foreign-memory (value (type c-person) ptr) + `(with-foreign-slots ((number reason) ,ptr (:struct person)) + (setf number (lisp-person-number ,value) + reason (lisp-person-reason ,value)))) +@end lisp + +Now we can expand again so see the changes: + +@lisp +;; this: +(setf (mem-aref ptr '(:struct person)) x) + +;; expands to this +;; (simplified, downcased, etc..) +(let ((#:store887 x)) + (with-foreign-slots ((number reason) (inc-pointer ptr 0) (:struct person)) + (setf number (lisp-person-number #:store887) + reason (lisp-person-reason #:store887))) #:store887) +@end lisp + +And there we are, no generic function overhead. + +@subheading Compatibility note + +Previous versions of CFFI accepted the +``bare'' @var{structure-name} as a type specification, which was +interpreted as a pointer to the structure. This is deprecated and +produces a style warning. Using this deprecated form means that +@ref{mem-aref} retains its prior meaning and returns a pointer. Using +the @code{(:struct @var{structure-name})} form for the type, +@ref{mem-aref} provides a Lisp object translated from the +structure (by default a plist). Thus the semantics are consistent with all +types in returning the object as represented in Lisp, and not a pointer, +with the exception of the ``bare'' structure compatibility retained. +In order to obtain the pointer, you should use the function @ref{mem-aptr}. + +See @ref{defcstruct} for more details. + +@node Allocating Foreign Objects, convert-from-foreign, Foreign Structure Types, Foreign Types +@section Allocating Foreign Objects + +@c I moved this because I moved with-foreign-object to the Pointers +@c chapter, where foreign-alloc is. + +@xref{Allocating Foreign Memory}. + + +@c =================================================================== +@c CONVERT-FROM-FOREIGN + +@page +@node convert-from-foreign, convert-to-foreign, Allocating Foreign Objects, Foreign Types +@heading convert-from-foreign +@subheading Syntax +@Function{convert-from-foreign foreign-value type @res{} value} + +@subheading Arguments and Values + +@table @var +@item foreign-value +The primitive C value as returned from a primitive foreign function or +from @code{convert-to-foreign}. + +@item type +A @cffi{} type specifier. + +@item value +The Lisp value translated from @var{foreign-value}. +@end table + +@subheading Description + +This is an external interface to the type translation facility. In +the implementation, all foreign functions are ultimately defined as +type translation wrappers around primitive foreign function +invocations. + +This function is available mostly for inspection of the type +translation process, and possibly optimization of special cases of +your foreign function calls. + +Its behavior is better described under @code{translate-from-foreign}'s +documentation. + +@subheading Examples + +@lisp +CFFI-USER> (convert-to-foreign "a boat" :string) +@result{} # +@result{} T +CFFI-USER> (convert-from-foreign * :string) +@result{} "a boat" +@end lisp + +@subheading See Also +@seealso{convert-to-foreign} @* +@seealso{free-converted-object} @* +@seealso{translate-from-foreign} + + +@c =================================================================== +@c CONVERT-TO-FOREIGN + +@page +@node convert-to-foreign, defbitfield, convert-from-foreign, Foreign Types +@heading convert-to-foreign +@subheading Syntax +@Function{convert-to-foreign value type @res{} foreign-value, alloc-params} + +@subheading Arguments and Values + +@table @var +@item value +The Lisp object to be translated to a foreign object. + +@item type +A @cffi{} type specifier. + +@item foreign-value +The primitive C value, ready to be passed to a primitive foreign +function. + +@item alloc-params +Something of a translation state; you must pass it to +@code{free-converted-object} along with the foreign value for that to +work. +@end table + +@subheading Description + +This is an external interface to the type translation facility. In +the implementation, all foreign functions are ultimately defined as +type translation wrappers around primitive foreign function +invocations. + +This function is available mostly for inspection of the type +translation process, and possibly optimization of special cases of +your foreign function calls. + +Its behavior is better described under @code{translate-to-foreign}'s +documentation. + +@subheading Examples + +@lisp +CFFI-USER> (convert-to-foreign t :boolean) +@result{} 1 +@result{} NIL +CFFI-USER> (convert-to-foreign "hello, world" :string) +@result{} # +@result{} T +CFFI-USER> (code-char (mem-aref * :char 5)) +@result{} #\, +@end lisp + +@subheading See Also +@seealso{convert-from-foreign} @* +@seealso{free-converted-object} @* +@seealso{translate-to-foreign} + + +@c =================================================================== +@c DEFBITFIELD + +@page +@node defbitfield, defcstruct, convert-to-foreign, Foreign Types +@heading defbitfield +@subheading Syntax +@Macro{defbitfield name-and-options &body masks} + +masks ::= [docstring] @{ (symbol value) @}* @* +name-and-options ::= name | (name &optional (base-type :int)) + +@subheading Arguments and Values + +@table @var +@item name +The name of the new bitfield type. + +@item docstring +A documentation string, ignored. + +@item base-type +A symbol denoting a foreign type. + +@item symbol +A Lisp symbol. + +@item value +An integer representing a bitmask. +@end table + +@subheading Description +The @code{defbitfield} macro is used to define foreign types that map +lists of symbols to integer values. + +If @var{value} is omitted, it will be computed as follows: find the +greatest @var{value} previously used, including those so computed, +with only a single 1-bit in its binary representation (that is, powers +of two), and left-shift it by one. This rule guarantees that a +computed @var{value} cannot clash with previous values, but may clash +with future explicitly specified values. + +Symbol lists will be automatically converted to values and vice versa +when being passed as arguments to or returned from foreign functions, +respectively. The same applies to any other situations where an object +of a bitfield type is expected. + +Types defined with @code{defbitfield} canonicalize to @var{base-type} +which is @code{:int} by default. + +@subheading Examples +@lisp +(defbitfield open-flags + (:rdonly #x0000) + :wronly ;@lispcmt{#x0001} + :rdwr ;@lispcmt{@dots{}} + :nonblock + :append + (:creat #x0200)) + ;; @lispcmt{etc@dots{}} + +CFFI> (foreign-bitfield-symbols 'open-flags #b1101) +@result{} (:WRONLY :NONBLOCK :APPEND) + +CFFI> (foreign-bitfield-value 'open-flags '(:rdwr :creat)) +@result{} 514 ; #x0202 + +(defcfun ("open" unix-open) :int + (path :string) + (flags open-flags) + (mode :uint16)) ; unportable + +CFFI> (unix-open "/tmp/foo" '(:wronly :creat) #o644) +@result{} # + +;;; @lispcmt{Consider also the following lispier wrapper around open()} +(defun lispier-open (path mode &rest flags) + (unix-open path flags mode)) +@end lisp + +@subheading See Also +@seealso{foreign-bitfield-value} @* +@seealso{foreign-bitfield-symbols} + + +@c =================================================================== +@c DEFCSTRUCT + +@page +@node defcstruct, defcunion, defbitfield, Foreign Types +@heading defcstruct +@subheading Syntax +@Macro{defcstruct name-and-options &body doc-and-slots @res{} name} + +name-and-options ::= structure-name | (structure-name &key size) + +doc-and-slots ::= [docstring] @{ (slot-name slot-type &key count offset) @}* + +@subheading Arguments and Values + +@table @var +@item structure-name +The name of new structure type. + +@item docstring +A documentation string, ignored. + +@item slot-name +A symbol naming the slot. It must be unique among slot names in this +structure. + +@item size +Use this option to override the size (in bytes) of the struct. + +@item slot-type +The type specifier for the slot. + +@item count +Used to declare an array of size @var{count} inside the +structure. Defaults to @code{1} as such an array and a single element +are semantically equivalent. + +@item offset +Overrides the slot's offset. The next slot's offset is calculated +based on this one. +@end table + +@subheading Description +This defines a new @cffi{} aggregate type akin to C @code{struct}s. +In other words, it specifies that foreign objects of the type +@var{structure-name} are groups of different pieces of data, or +``slots'', of the @var{slot-type}s, distinguished from each other by +the @var{slot-name}s. Each structure is located in memory at a +position, and the slots are allocated sequentially beginning at that +point in memory (with some padding allowances as defined by the C +@acronym{ABI}, unless otherwise requested by specifying an +@var{offset} from the beginning of the structure (offset 0). + +In other words, it is isomorphic to the C @code{struct}, giving +several extra features. + +There are two kinds of slots, for the two kinds of @cffi{} types: + +@table @dfn +@item Simple +Contain a single instance of a type that canonicalizes to a built-in +type, such as @code{:long} or @code{:pointer}. Used for simple +@cffi{} types. + +@item Aggregate +Contain an embedded structure or union, or an array of objects. Used +for aggregate @cffi{} types. +@end table + +The use of @acronym{CLOS} terminology for the structure-related +features is intentional; structure definitions are very much like +classes with (far) fewer features. + +@subheading Examples +@lisp +(defcstruct point + "Point structure." + (x :int) + (y :int)) + +CFFI> (with-foreign-object (ptr 'point) + ;; @lispcmt{Initialize the slots} + (setf (foreign-slot-value ptr 'point 'x) 42 + (foreign-slot-value ptr 'point 'y) 42) + ;; @lispcmt{Return a list with the coordinates} + (with-foreign-slots ((x y) ptr point) + (list x y))) +@result{} (42 42) +@end lisp + +@lisp +;; @lispcmt{Using the :size and :offset options to define a partial structure.} +;; @lispcmt{(this is useful when you are interested in only a few slots} +;; @lispcmt{of a big foreign structure)} + +(defcstruct (foo :size 32) + "Some struct with 32 bytes." + ; @lispcmt{<16 bytes we don't care about>} + (x :int :offset 16) ; @lispcmt{an int at offset 16} + (y :int) ; @lispcmt{another int at offset 16+sizeof(int)} + ; @lispcmt{} + (z :char :offset 24)) ; @lispcmt{a char at offset 24} + ; @lispcmt{<7 more bytes ignored (since size is 32)>} + +CFFI> (foreign-type-size 'foo) +@result{} 32 +@end lisp + +@lisp +;;; @lispcmt{Using :count to define arrays inside of a struct.} +(defcstruct video_tuner + (name :char :count 32)) +@end lisp + +@subheading See Also +@seealso{foreign-slot-pointer} @* +@seealso{foreign-slot-value} @* +@seealso{with-foreign-slots} + + +@c =================================================================== +@c DEFCUNION + +@page +@node defcunion, defctype, defcstruct, Foreign Types +@heading defcunion +@subheading Syntax +@Macro{defcunion name &body doc-and-slots @res{} name} + +doc-and-slots ::= [docstring] @{ (slot-name slot-type &key count) @}* + +@subheading Arguments and Values + +@table @var +@item name +The name of new union type. + +@item docstring +A documentation string, ignored. + +@item slot-name +A symbol naming the slot. + +@item slot-type +The type specifier for the slot. + +@item count +Used to declare an array of size @var{count} inside the +structure. +@end table + +@subheading Description +A union is a structure in which all slots have an offset of zero. It +is isomorphic to the C @code{union}. Therefore, you should use the +usual foreign structure operations for accessing a union's slots. + +@subheading Examples +@lisp +(defcunion uint32-bytes + (int-value :unsigned-int) + (bytes :unsigned-char :count 4)) +@end lisp + +@subheading See Also +@seealso{foreign-slot-pointer} @* +@seealso{foreign-slot-value} + + +@c =================================================================== +@c DEFCTYPE + +@page +@node defctype, defcenum, defcunion, Foreign Types +@heading defctype +@subheading Syntax +@Macro{defctype name base-type &optional documentation} + +@subheading Arguments and Values + +@table @var +@item name +The name of the new foreign type. + +@item base-type +A symbol or a list defining the new type. + +@item documentation +A documentation string, currently ignored. +@end table + +@subheading Description +The @code{defctype} macro provides a mechanism similar to C's +@code{typedef} to define new types. The new type inherits +@var{base-type}'s translators, if any. There is no way to define +translations for types defined with @code{defctype}. For that, +you should use @ref{define-foreign-type}. + +@subheading Examples +@lisp +(defctype my-string :string + "My own string type.") + +(defctype long-bools (:boolean :long) + "Booleans that map to C longs.") +@end lisp + +@subheading See Also +@seealso{define-foreign-type} + + +@c =================================================================== +@c DEFCENUM + +@page +@node defcenum, define-foreign-type, defctype, Foreign Types +@heading defcenum +@subheading Syntax +@Macro{defcenum name-and-options &body enum-list} + +enum-list ::= [docstring] @{ keyword | (keyword value) @}* +name-and-options ::= name | (name &optional (base-type :int)) + +@subheading Arguments and Values + +@table @var +@item name +The name of the new enum type. + +@item docstring +A documentation string, ignored. + +@item base-type +A symbol denoting a foreign type. + +@item keyword +A keyword symbol. + +@item value +An index value for a keyword. +@end table + +@subheading Description +The @code{defcenum} macro is used to define foreign types that map +keyword symbols to integer values, similar to the C @code{enum} type. + +If @var{value} is omitted its value will either be 0, if it's the +first entry, or it it will continue the progression from the last +specified value. + +Keywords will be automatically converted to values and vice-versa when +being passed as arguments to or returned from foreign functions, +respectively. The same applies to any other situations where an object +of an @code{enum} type is expected. + +Types defined with @code{defcenum} canonicalize to @var{base-type} +which is @code{:int} by default. + +@subheading Examples +@lisp +(defcenum boolean + :no + :yes) + +CFFI> (foreign-enum-value 'boolean :no) +@result{} 0 +@end lisp + +@lisp +(defcenum numbers + (:one 1) + :two + (:four 4)) + +CFFI> (foreign-enum-keyword 'numbers 2) +@result{} :TWO +@end lisp + +@subheading See Also +@seealso{foreign-enum-value} @* +@seealso{foreign-enum-keyword} + + +@c =================================================================== +@c DEFINE-FOREIGN-TYPE + +@page +@node define-foreign-type, define-parse-method, defcenum, Foreign Types +@heading define-foreign-type +@subheading Syntax +@Macro{define-foreign-type class-name supers slots &rest options @res{} class-name} + +options ::= (@code{:actual-type} @var{type}) | @ + (@code{:simple-parser} @var{symbol}) | @ + @emph{regular defclass option} + +@subheading Arguments and Values + +@table @var +@item class-name +A symbol naming the new foreign type class. + +@item supers +A list of symbols naming the super classes. + +@item slots +A list of slot definitions, passed to @code{defclass}. +@end table + +@subheading Description + +@c TODO rewrite + +The macro @code{define-foreign-type} defines a new class +@var{class-name}. It is a thin wrapper around @code{defclass}. Among +other things, it ensures that @var{class-name} becomes a subclass of +@var{foreign-type}, what you need to know about that is that there's +an initarg @code{:actual-type} which serves the same purpose as +@code{defctype}'s @var{base-type} argument. + +@c TODO mention the type translators here +@c FIX FIX + +@subheading Examples +Taken from @cffi{}'s @code{:boolean} type definition: + +@lisp +(define-foreign-type :boolean (&optional (base-type :int)) + "Boolean type. Maps to an :int by default. Only accepts integer types." + (ecase base-type + ((:char + :unsigned-char + :int + :unsigned-int + :long + :unsigned-long) base-type))) + +CFFI> (canonicalize-foreign-type :boolean) +@result{} :INT +CFFI> (canonicalize-foreign-type '(:boolean :long)) +@result{} :LONG +CFFI> (canonicalize-foreign-type '(:boolean :float)) +;; @lispcmt{@error{} signalled by ECASE.} +@end lisp + +@subheading See Also +@seealso{defctype} @* +@seealso{define-parse-method} + + +@c =================================================================== +@c DEFINE-PARSE-METHOD + +@page +@node define-parse-method, foreign-bitfield-symbols, define-foreign-type, Foreign Types +@heading define-parse-method +@subheading Syntax +@Macro{define-parse-method name lambda-list &body body @res{} name} + +@subheading Arguments and Values + +@table @var +@item type-name +A symbol naming the new foreign type. + +@item lambda-list +A lambda list which is the argument list of the new foreign type. + +@item body +One or more forms that provide a definition of the new foreign type. +@end table + +@subheading Description + + +@c TODO: update example. The boolean type is probably a good choice. + +@subheading Examples +Taken from @cffi{}'s @code{:boolean} type definition: + +@lisp +(define-foreign-type :boolean (&optional (base-type :int)) + "Boolean type. Maps to an :int by default. Only accepts integer types." + (ecase base-type + ((:char + :unsigned-char + :int + :unsigned-int + :long + :unsigned-long) base-type))) + +CFFI> (canonicalize-foreign-type :boolean) +@result{} :INT +CFFI> (canonicalize-foreign-type '(:boolean :long)) +@result{} :LONG +CFFI> (canonicalize-foreign-type '(:boolean :float)) +;; @lispcmt{@error{} signalled by ECASE.} +@end lisp + +@subheading See Also +@seealso{define-foreign-type} + + +@c =================================================================== +@c EXPLAIN-FOREIGN-SLOT-VALUE + +@c @node explain-foreign-slot-value +@c @heading explain-foreign-slot-value +@c @subheading Syntax +@c @Macro{explain-foreign-slot-value ptr type &rest slot-names} + +@c @subheading Arguments and Values + +@c @table @var +@c @item ptr +@c ... + +@c @item type +@c ... + +@c @item slot-names +@c ... +@c @end table + +@c @subheading Description +@c This macro translates the slot access that would occur by calling +@c @code{foreign-slot-value} with the same arguments into an equivalent +@c expression in C and prints it to @code{*standard-output*}. + +@c @emph{Note: this is not implemented yet.} + +@c @subheading Examples +@c @lisp +@c CFFI> (explain-foreign-slot-value ptr 'timeval 'tv-secs) +@c @result{} ptr->tv_secs + +@c CFFI> (explain-foreign-slot-value emp 'employee 'hire-date 'tv-usecs) +@c @result{} emp->hire_date.tv_usecs +@c @end lisp + +@c @subheading See Also + + +@c =================================================================== +@c FOREIGN-BITFIELD-SYMBOLS + +@page +@node foreign-bitfield-symbols, foreign-bitfield-value, define-parse-method, Foreign Types +@heading foreign-bitfield-symbols +@subheading Syntax +@Function{foreign-bitfield-symbols type value @res{} symbols} + +@subheading Arguments and Values + +@table @var +@item type +A bitfield type. + +@item value +An integer. + +@item symbols +A potentially shared list of symbols. +@code{nil}. +@end table + +@subheading Description +The function @code{foreign-bitfield-symbols} returns a possibly shared +list of symbols that correspond to @var{value} in @var{type}. + +@subheading Examples +@lisp +(defbitfield flags + (flag-a 1) + (flag-b 2) + (flag-c 4)) + +CFFI> (foreign-bitfield-symbols 'flags #b101) +@result{} (FLAG-A FLAG-C) +@end lisp + +@subheading See Also +@seealso{defbitfield} @* +@seealso{foreign-bitfield-value} + + +@c =================================================================== +@c FOREIGN-BITFIELD-VALUE + +@page +@node foreign-bitfield-value, foreign-enum-keyword, foreign-bitfield-symbols, Foreign Types +@heading foreign-bitfield-value +@subheading Syntax +@Function{foreign-bitfield-value type symbols @res{} value} + +@subheading Arguments and Values + +@table @var +@item type +A @code{bitfield} type. + +@item symbol +A Lisp symbol. + +@item value +An integer. +@end table + +@subheading Description +The function @code{foreign-bitfield-value} returns the @var{value} that +corresponds to the symbols in the @var{symbols} list. + +@subheading Examples +@lisp +(defbitfield flags + (flag-a 1) + (flag-b 2) + (flag-c 4)) + +CFFI> (foreign-bitfield-value 'flags '(flag-a flag-c)) +@result{} 5 ; #b101 +@end lisp + +@subheading See Also +@seealso{defbitfield} @* +@seealso{foreign-bitfield-symbols} + + +@c =================================================================== +@c FOREIGN-ENUM-KEYWORD + +@page +@node foreign-enum-keyword, foreign-enum-value, foreign-bitfield-value, Foreign Types +@heading foreign-enum-keyword +@subheading Syntax +@Function{foreign-enum-keyword type value &key errorp @res{} keyword} + +@subheading Arguments and Values + +@table @var +@item type +An @code{enum} type. + +@item value +An integer. + +@item errorp +If true (the default), signal an error if @var{value} is not defined +in @var{type}. If false, @code{foreign-enum-keyword} returns +@code{nil}. + +@item keyword +A keyword symbol. +@end table + +@subheading Description +The function @code{foreign-enum-keyword} returns the keyword symbol +that corresponds to @var{value} in @var{type}. + +An error is signaled if @var{type} doesn't contain such @var{value} +and @var{errorp} is true. + +@subheading Examples +@lisp +(defcenum boolean + :no + :yes) + +CFFI> (foreign-enum-keyword 'boolean 1) +@result{} :YES +@end lisp + +@subheading See Also +@seealso{defcenum} @* +@seealso{foreign-enum-value} + + +@c =================================================================== +@c FOREIGN-ENUM-VALUE + +@page +@node foreign-enum-value, foreign-slot-names, foreign-enum-keyword, Foreign Types +@heading foreign-enum-value +@subheading Syntax +@Function{foreign-enum-value type keyword &key errorp @res{} value} + +@subheading Arguments and Values + +@table @var +@item type +An @code{enum} type. + +@item keyword +A keyword symbol. + +@item errorp +If true (the default), signal an error if @var{keyword} is not +defined in @var{type}. If false, @code{foreign-enum-value} returns +@code{nil}. + +@item value +An integer. +@end table + +@subheading Description +The function @code{foreign-enum-value} returns the @var{value} that +corresponds to @var{keyword} in @var{type}. + +An error is signaled if @var{type} doesn't contain such +@var{keyword}, and @var{errorp} is true. + +@subheading Examples +@lisp +(defcenum boolean + :no + :yes) + +CFFI> (foreign-enum-value 'boolean :yes) +@result{} 1 +@end lisp + +@subheading See Also +@seealso{defcenum} @* +@seealso{foreign-enum-keyword} + + +@c =================================================================== +@c FOREIGN-SLOT-NAMES + +@page +@node foreign-slot-names, foreign-slot-offset, foreign-enum-value, Foreign Types +@heading foreign-slot-names +@subheading Syntax +@Function{foreign-slot-names type @res{} names} + +@subheading Arguments and Values + +@table @var +@item type +A foreign struct type. + +@item names +A list. +@end table + +@subheading Description +The function @code{foreign-slot-names} returns a potentially shared +list of slot @var{names} for the given structure @var{type}. This list +has no particular order. + +@subheading Examples +@lisp +(defcstruct timeval + (tv-secs :long) + (tv-usecs :long)) + +CFFI> (foreign-slot-names '(:struct timeval)) +@result{} (TV-SECS TV-USECS) +@end lisp + +@subheading See Also +@seealso{defcstruct} @* +@seealso{foreign-slot-offset} @* +@seealso{foreign-slot-value} @* +@seealso{foreign-slot-pointer} + + +@c =================================================================== +@c FOREIGN-SLOT-OFFSET + +@page +@node foreign-slot-offset, foreign-slot-pointer, foreign-slot-names, Foreign Types +@heading foreign-slot-offset +@subheading Syntax +@Function{foreign-slot-offset type slot-name @res{} offset} + +@subheading Arguments and Values + +@table @var +@item type +A foreign struct type. + +@item slot-name +A symbol. + +@item offset +An integer. +@end table + +@subheading Description +The function @code{foreign-slot-offset} returns the @var{offset} in +bytes of a slot in a foreign struct type. + +@subheading Examples +@lisp +(defcstruct timeval + (tv-secs :long) + (tv-usecs :long)) + +CFFI> (foreign-slot-offset '(:struct timeval) 'tv-secs) +@result{} 0 +CFFI> (foreign-slot-offset '(:struct timeval) 'tv-usecs) +@result{} 4 +@end lisp + +@subheading See Also +@seealso{defcstruct} @* +@seealso{foreign-slot-names} @* +@seealso{foreign-slot-pointer} @* +@seealso{foreign-slot-value} + + +@c =================================================================== +@c FOREIGN-SLOT-POINTER + +@page +@node foreign-slot-pointer, foreign-slot-value, foreign-slot-offset, Foreign Types +@heading foreign-slot-pointer +@subheading Syntax +@Function{foreign-slot-pointer ptr type slot-name @res{} pointer} + +@subheading Arguments and Values + +@table @var +@item ptr +A pointer to a structure. + +@item type +A foreign structure type. + +@item slot-names +A slot name in the @var{type}. + +@item pointer +A pointer to the slot @var{slot-name}. +@end table + +@subheading Description +Returns a pointer to the location of the slot @var{slot-name} in a +foreign object of type @var{type} at @var{ptr}. The returned pointer +points inside the structure. Both the pointer and the memory it points +to have the same extent as @var{ptr}. + +For aggregate slots, this is the same value returned by +@code{foreign-slot-value}. + +@subheading Examples +@lisp +(defcstruct point + "Pointer structure." + (x :int) + (y :int)) + +CFFI> (with-foreign-object (ptr '(:struct point)) + (foreign-slot-pointer ptr '(:struct point) 'x)) +@result{} # +;; @lispcmt{Note: the exact pointer representation varies from lisp to lisp.} +@end lisp + +@subheading See Also +@seealso{defcstruct} @* +@seealso{foreign-slot-value} @* +@seealso{foreign-slot-names} @* +@seealso{foreign-slot-offset} + + +@c =================================================================== +@c FOREIGN-SLOT-VALUE + +@page +@node foreign-slot-value, foreign-type-alignment, foreign-slot-pointer, Foreign Types +@heading foreign-slot-value +@subheading Syntax +@Accessor{foreign-slot-value ptr type slot-name @res{} object} + +@subheading Arguments and Values + +@table @var +@item ptr +A pointer to a structure. + +@item type +A foreign structure type. + +@item slot-name +A symbol naming a slot in the structure type. + +@item object +The object contained in the slot specified by @var{slot-name}. +@end table + +@subheading Description +For simple slots, @code{foreign-slot-value} returns the value of the +object, such as a Lisp integer or pointer. In C, this would be +expressed as @code{ptr->slot}. + +For aggregate slots, a pointer inside the structure to the beginning +of the slot's data is returned. In C, this would be expressed as +@code{&ptr->slot}. This pointer and the memory it points to have the +same extent as @var{ptr}. + +There are compiler macros for @code{foreign-slot-value} and its +@code{setf} expansion that open code the memory access when +@var{type} and @var{slot-names} are constant at compile-time. + +@subheading Examples +@lisp +(defcstruct point + "Pointer structure." + (x :int) + (y :int)) + +CFFI> (with-foreign-object (ptr '(:struct point)) + ;; @lispcmt{Initialize the slots} + (setf (foreign-slot-value ptr '(:struct point) 'x) 42 + (foreign-slot-value ptr '(:struct point) 'y) 42) + ;; @lispcmt{Return a list with the coordinates} + (with-foreign-slots ((x y) ptr (:struct point)) + (list x y))) +@result{} (42 42) +@end lisp + +@subheading See Also +@seealso{defcstruct} @* +@seealso{foreign-slot-names} @* +@seealso{foreign-slot-offset} @* +@seealso{foreign-slot-pointer} @* +@seealso{with-foreign-slots} + + +@c =================================================================== +@c FOREIGN-TYPE-ALIGNMENT + +@page +@node foreign-type-alignment, foreign-type-size, foreign-slot-value, Foreign Types +@heading foreign-type-alignment +@subheading Syntax +@c XXX: This is actually a generic function. +@Function{foreign-type-alignment type @res{} alignment} + +@subheading Arguments and Values + +@table @var +@item type +A foreign type. + +@item alignment +An integer. +@end table + +@subheading Description +The function @code{foreign-type-alignment} returns the +@var{alignment} of @var{type} in bytes. + +@subheading Examples +@lisp +CFFI> (foreign-type-alignment :char) +@result{} 1 +CFFI> (foreign-type-alignment :short) +@result{} 2 +CFFI> (foreign-type-alignment :int) +@result{} 4 +@end lisp + +@lisp +(defcstruct foo + (a :char)) + +CFFI> (foreign-type-alignment '(:struct foo)) +@result{} 1 +@end lisp + +@subheading See Also +@seealso{foreign-type-size} + + +@c =================================================================== +@c FOREIGN-TYPE-SIZE + +@page +@node foreign-type-size, free-converted-object, foreign-type-alignment, Foreign Types +@heading foreign-type-size +@subheading Syntax +@c XXX: this is actually a generic function. +@Function{foreign-type-size type @res{} size} + +@subheading Arguments and Values + +@table @var +@item type +A foreign type. + +@item size +An integer. +@end table + +@subheading Description +The function @code{foreign-type-size} return the @var{size} of +@var{type} in bytes. This includes any padding within and following +the in-memory representation as needed to create an array of +@var{type} objects. + +@subheading Examples +@lisp +(defcstruct foo + (a :double) + (c :char)) + +CFFI> (foreign-type-size :double) +@result{} 8 +CFFI> (foreign-type-size :char) +@result{} 1 +CFFI> (foreign-type-size '(:struct foo)) +@result{} 16 +@end lisp + +@subheading See Also +@seealso{foreign-type-alignment} + + +@c =================================================================== +@c FREE-CONVERTED-OBJECT + +@page +@node free-converted-object, free-translated-object, foreign-type-size, Foreign Types +@heading free-converted-object +@subheading Syntax +@Function{free-converted-object foreign-value type params} + +@subheading Arguments and Values + +@table @var +@item foreign-value +The C object to be freed. + +@item type +A @cffi{} type specifier. + +@item params +The state returned as the second value from @code{convert-to-foreign}; +used to implement the third argument to @code{free-translated-object}. +@end table + +@subheading Description + +The return value is unspecified. + +This is an external interface to the type translation facility. In +the implementation, all foreign functions are ultimately defined as +type translation wrappers around primitive foreign function +invocations. + +This function is available mostly for inspection of the type +translation process, and possibly optimization of special cases of +your foreign function calls. + +Its behavior is better described under @code{free-translated-object}'s +documentation. + +@subheading Examples + +@lisp +CFFI-USER> (convert-to-foreign "a boat" :string) +@result{} # +@result{} T +CFFI-USER> (free-converted-object * :string t) +@result{} NIL +@end lisp + +@subheading See Also +@seealso{convert-from-foreign} @* +@seealso{convert-to-foreign} @* +@seealso{free-translated-object} + + +@c =================================================================== +@c FREE-TRANSLATED-OBJECT + +@c TODO: update + +@page +@node free-translated-object, translate-from-foreign, free-converted-object, Foreign Types +@heading free-translated-object +@subheading Syntax +@GenericFunction{free-translated-object value type-name param} + +@subheading Arguments and Values + +@table @var +@item pointer +The foreign value returned by @code{translate-to-foreign}. + +@item type-name +A symbol naming a foreign type defined by @code{defctype}. + +@item param +The second value, if any, returned by @code{translate-to-foreign}. +@end table + +@subheading Description +This generic function may be specialized by user code to perform +automatic deallocation of foreign objects as they are passed to C +functions. + +Any methods defined on this generic function must EQL-specialize the +@var{type-name} parameter on a symbol defined as a foreign type by +the @code{defctype} macro. + +@subheading See Also +@seealso{Foreign Type Translators} @* +@seealso{translate-to-foreign} + + +@c =================================================================== +@c TRANSLATE-FROM-FOREIGN + +@c TODO: update + +@page +@node translate-from-foreign, translate-to-foreign, free-translated-object, Foreign Types +@heading translate-from-foreign +@subheading Syntax +@GenericFunction{translate-from-foreign foreign-value type-name @ + @res{} lisp-value} + +@subheading Arguments and Values + +@table @var +@item foreign-value +The foreign value to convert to a Lisp object. + +@item type-name +A symbol naming a foreign type defined by @code{defctype}. + +@item lisp-value +The lisp value to pass in place of @code{foreign-value} to Lisp code. +@end table + +@subheading Description +This generic function is invoked by @cffi{} to convert a foreign value to +a Lisp value, such as when returning from a foreign function, passing +arguments to a callback function, or accessing a foreign variable. + +To extend the @cffi{} type system by performing custom translations, this +method may be specialized by @sc{eql}-specializing @code{type-name} on a +symbol naming a foreign type defined with @code{defctype}. This +method should return the appropriate Lisp value to use in place of the +foreign value. + +The results are undefined if the @code{type-name} parameter is +specialized in any way except an @sc{eql} specializer on a foreign type +defined with @code{defctype}. Specifically, translations may not be +defined for built-in types. + +@subheading See Also +@seealso{Foreign Type Translators} @* +@seealso{translate-to-foreign} @* +@seealso{free-translated-object} + + +@c =================================================================== +@c TRANSLATE-TO-FOREIGN + +@c TODO: update + +@page +@node translate-to-foreign, translate-into-foreign-memory, translate-from-foreign, Foreign Types +@heading translate-to-foreign +@subheading Syntax +@GenericFunction{translate-to-foreign lisp-value type-name @ + @res{} foreign-value, alloc-param} + +@subheading Arguments and Values + +@table @var +@item lisp-value +The Lisp value to convert to foreign representation. + +@item type-name +A symbol naming a foreign type defined by @code{defctype}. + +@item foreign-value +The foreign value to pass in place of @code{lisp-value} to foreign code. + +@item alloc-param +If present, this value will be passed to +@code{free-translated-object}. +@end table + +@subheading Description +This generic function is invoked by @cffi{} to convert a Lisp value to a +foreign value, such as when passing arguments to a foreign function, +returning a value from a callback, or setting a foreign variable. A +``foreign value'' is one appropriate for passing to the next-lowest +translator, including the low-level translators that are ultimately +invoked invisibly with @cffi{}. + +To extend the @cffi{} type system by performing custom translations, this +method may be specialized by @sc{eql}-specializing @code{type-name} on a +symbol naming a foreign type defined with @code{defctype}. This +method should return the appropriate foreign value to use in place of +the Lisp value. + +In cases where @cffi{} can determine the lifetime of the foreign object +returned by this method, it will invoke @code{free-translated-object} +on the foreign object at the appropriate time. If +@code{translate-to-foreign} returns a second value, it will be passed +as the @code{param} argument to @code{free-translated-object}. This +can be used to establish communication between the allocation and +deallocation methods. + +The results are undefined if the @code{type-name} parameter is +specialized in any way except an @sc{eql} specializer on a foreign type +defined with @code{defctype}. Specifically, translations may not be +defined for built-in types. + +@subheading See Also +@seealso{Foreign Type Translators} @* +@seealso{translate-from-foreign} @* +@seealso{free-translated-object} + + +@c =================================================================== +@c TRANSLATE-INTO-FOREIGN-MEMORY + +@page +@node translate-into-foreign-memory, with-foreign-slots, translate-to-foreign, Foreign Types +@heading translate-into-foreign-memory +@subheading Syntax +@GenericFunction{translate-into-foreign-memory lisp-value type-name pointer} + +@subheading Arguments and Values + +@table @var +@item lisp-value +The Lisp value to convert to foreign representation. + +@item type-name +A symbol or list @code{(:struct @var{structure-name})} naming a foreign type defined by @code{defctype}. + +@item pointer +The foreign pointer where the translated object should be stored. +@end table + +@subheading Description +Translate the Lisp value into the foreign memory location given by +pointer. The return value is not used. + +@c =================================================================== +@c WITH-FOREIGN-SLOTS + +@page +@node with-foreign-slots, , translate-into-foreign-memory, Foreign Types +@heading with-foreign-slots +@subheading Syntax +@Macro{with-foreign-slots (vars ptr type) &body body} + +@subheading Arguments and Values + +@table @var +@item vars +A list with each element a symbol, or list of length two with the +first element @code{:pointer} and the second a symbol. + +@item ptr +A foreign pointer to a structure. + +@item type +A structure type. + +@item body +A list of forms to be executed. +@end table + +@subheading Description +The @code{with-foreign-slots} macro creates local symbol macros for each +var in @var{vars} to reference foreign slots in @var{ptr} of @var{type}. +If the var is a list starting with @code{:pointer}, it will bind the +pointer to the slot (rather than the value). It is similar to Common +Lisp's @code{with-slots} macro. + +@subheading Examples +@lisp +(defcstruct tm + (sec :int) + (min :int) + (hour :int) + (mday :int) + (mon :int) + (year :int) + (wday :int) + (yday :int) + (isdst :boolean) + (zone :string) + (gmtoff :long)) + +CFFI> (with-foreign-object (time :int) + (setf (mem-ref time :int) + (foreign-funcall "time" :pointer (null-pointer) :int)) + (foreign-funcall "gmtime" :pointer time (:pointer (:struct tm)))) +@result{} # +CFFI> (with-foreign-slots ((sec min hour mday mon year) * (:struct tm)) + (format nil "~A:~A:~A, ~A/~A/~A" + hour min sec (+ 1900 year) mon mday)) +@result{} "7:22:47, 2005/8/2" +@end lisp + +@subheading See Also +@seealso{defcstruct} @* +@seealso{defcunion} @* +@seealso{foreign-slot-value} + + +@c =================================================================== +@c CHAPTER: Pointers + +@node Pointers, Strings, Foreign Types, Top +@chapter Pointers + +All C data in @cffi{} is referenced through pointers. This includes +defined C variables that hold immediate values, and integers. + +To see why this is, consider the case of the C integer. It is not +only an arbitrary representation for an integer, congruent to Lisp's +fixnums; the C integer has a specific bit pattern in memory defined by +the C @acronym{ABI}. Lisp has no such constraint on its fixnums; +therefore, it only makes sense to think of fixnums as C integers if +you assume that @cffi{} converts them when necessary, such as when +storing one for use in a C function call, or as the value of a C +variable. This requires defining an area of memory@footnote{The +definition of @dfn{memory} includes the @acronym{CPU} registers.}, +represented through an effective address, and storing it there. + +Due to this compartmentalization, it only makes sense to manipulate +raw C data in Lisp through pointers to it. For example, while there +may be a Lisp representation of a @code{struct} that is converted to C +at store time, you may only manipulate its raw data through a pointer. +The C compiler does this also, albeit informally. + +@menu +* Basic Pointer Operations:: +* Allocating Foreign Memory:: +* Accessing Foreign Memory:: + +Dictionary + +* foreign-free:: +* foreign-alloc:: +* foreign-symbol-pointer:: +* inc-pointer:: +* incf-pointer:: +* make-pointer:: +* mem-aptr:: +* mem-aref:: +* mem-ref:: +* null-pointer:: +* null-pointer-p:: +* pointerp:: +* pointer-address:: +* pointer-eq:: +* with-foreign-object:: +* with-foreign-objects:: +* with-foreign-pointer:: +@end menu + +@node Basic Pointer Operations, Allocating Foreign Memory, Pointers, Pointers +@section Basic Pointer Operations + +Manipulating pointers proper can be accomplished through most of the +other operations defined in the Pointers dictionary, such as +@code{make-pointer}, @code{pointer-address}, and @code{pointer-eq}. +When using them, keep in mind that they merely manipulate the Lisp +representation of pointers, not the values they point to. + +@deftp {Lisp Type} foreign-pointer +The pointers' representations differ from implementation to +implementation and have different types. @code{foreign-pointer} +provides a portable type alias to each of these types. +@end deftp + + +@node Allocating Foreign Memory, Accessing Foreign Memory, Basic Pointer Operations, Pointers +@section Allocating Foreign Memory + +@cffi{} provides support for stack and heap C memory allocation. +Stack allocation, done with @code{with-foreign-object}, is sometimes +called ``dynamic'' allocation in Lisp, because memory allocated as +such has dynamic extent, much as with @code{let} bindings of special +variables. + +This should not be confused with what C calls ``dynamic'' allocation, +or that done with @code{malloc} and friends. This sort of heap +allocation is done with @code{foreign-alloc}, creating objects that +exist until freed with @code{foreign-free}. + + +@node Accessing Foreign Memory, foreign-free, Allocating Foreign Memory, Pointers +@section Accessing Foreign Memory + +When manipulating raw C data, consider that all pointers are pointing +to an array. When you only want one C value, such as a single +@code{struct}, this array only has one such value. It is worthwhile +to remember that everything is an array, though, because this is also +the semantic that C imposes natively. + +C values are accessed as the @code{setf}-able places defined by +@code{mem-aref} and @code{mem-ref}. Given a pointer and a @cffi{} +type (@pxref{Foreign Types}), either of these will dereference the +pointer, translate the C data there back to Lisp, and return the +result of said translation, performing the reverse operation when +@code{setf}-ing. To decide which one to use, consider whether you +would use the array index operator @code{[@var{n}]} or the pointer +dereference @code{*} in C; use @code{mem-aref} for array indexing and +@code{mem-ref} for pointer dereferencing. + + +@c =================================================================== +@c FOREIGN-FREE + +@page +@node foreign-free, foreign-alloc, Accessing Foreign Memory, Pointers +@heading foreign-free +@subheading Syntax +@Function{foreign-free ptr @res{} undefined} + +@subheading Arguments and Values + +@table @var +@item ptr +A foreign pointer. +@end table + +@subheading Description +The @code{foreign-free} function frees a @code{ptr} previously +allocated by @code{foreign-alloc}. The consequences of freeing a given +pointer twice are undefined. + +@subheading Examples + +@lisp +CFFI> (foreign-alloc :int) +@result{} # +CFFI> (foreign-free *) +@result{} NIL +@end lisp + +@subheading See Also +@seealso{foreign-alloc} @* +@seealso{with-foreign-pointer} + + +@c =================================================================== +@c FOREIGN-ALLOC + +@page +@node foreign-alloc, foreign-symbol-pointer, foreign-free, Pointers +@heading foreign-alloc +@subheading Syntax +@Function{foreign-alloc type &key initial-element initial-contents (count 1) @ + null-terminated-p @res{} pointer} + +@subheading Arguments and Values + +@table @var +@item type +A foreign type. + +@item initial-element +A Lisp object. + +@item initial-contents +A sequence. + +@item count +An integer. Defaults to 1 or the length of @var{initial-contents} if +supplied. + +@item null-terminated-p +A boolean, false by default. + +@item pointer +A foreign pointer to the newly allocated memory. +@end table + +@subheading Description +The @code{foreign-alloc} function allocates enough memory to hold +@var{count} objects of type @var{type} and returns a +@var{pointer}. This memory must be explicitly freed using +@code{foreign-free} once it is no longer needed. + +If @var{initial-element} is supplied, it is used to initialize the +@var{count} objects the newly allocated memory holds. + +If an @var{initial-contents} sequence is supplied, it must have a +length less than or equal to @var{count} and each of its elements +will be used to initialize the contents of the newly allocated +memory. + +If @var{count} is omitted and @var{initial-contents} is specified, it +will default to @code{(length @var{initial-contents})}. + +@var{initial-element} and @var{initial-contents} are mutually +exclusive. + +When @var{null-terminated-p} is true, +@code{(1+ (max @var{count} (length @var{initial-contents})))} elements +are allocated and the last one is set to @code{NULL}. Note that in +this case @var{type} must be a pointer type (ie. a type that +canonicalizes to @code{:pointer}), otherwise an error is signaled. + +@subheading Examples +@lisp +CFFI> (foreign-alloc :char) +@result{} # ; @lispcmt{A pointer to 1 byte of memory.} + +CFFI> (foreign-alloc :char :count 20) +@result{} # ; @lispcmt{A pointer to 20 bytes of memory.} + +CFFI> (foreign-alloc :int :initial-element 12) +@result{} # +CFFI> (mem-ref * :int) +@result{} 12 + +CFFI> (foreign-alloc :int :initial-contents '(1 2 3)) +@result{} # +CFFI> (loop for i from 0 below 3 + collect (mem-aref * :int i)) +@result{} (1 2 3) + +CFFI> (foreign-alloc :int :initial-contents #(1 2 3)) +@result{} # +CFFI> (loop for i from 0 below 3 + collect (mem-aref * :int i)) +@result{} (1 2 3) + +;;; @lispcmt{Allocate a char** pointer that points to newly allocated memory} +;;; @lispcmt{by the :string type translator for the string "foo".} +CFFI> (foreign-alloc :string :initial-element "foo") +@result{} # +@end lisp + +@lisp +;;; @lispcmt{Allocate a null-terminated array of strings.} +;;; @lispcmt{(Note: FOREIGN-STRING-TO-LISP returns NIL when passed a null pointer)} +CFFI> (foreign-alloc :string + :initial-contents '("foo" "bar" "baz") + :null-terminated-p t) +@result{} # +CFFI> (loop for i from 0 below 4 + collect (mem-aref * :string i)) +@result{} ("foo" "bar" "baz" NIL) +CFFI> (progn + (dotimes (i 3) + (foreign-free (mem-aref ** :pointer i))) + (foreign-free **)) +@result{} nil +@end lisp + +@subheading See Also +@seealso{foreign-free} @* +@seealso{with-foreign-object} @* +@seealso{with-foreign-pointer} + + +@c =================================================================== +@c FOREIGN-SYMBOL-POINTER + +@page +@node foreign-symbol-pointer, inc-pointer, foreign-alloc, Pointers +@heading foreign-symbol-pointer +@subheading Syntax +@Function{foreign-symbol-pointer foreign-name &key library @res{} pointer} + +@subheading Arguments and Values + +@table @var +@item foreign-name +A string. + +@item pointer +A foreign pointer, or @code{nil}. + +@item library +A Lisp symbol or an instance of @code{foreign-library}. +@end table + +@subheading Description +The function @code{foreign-symbol-pointer} will return a foreign +pointer corresponding to the foreign symbol denoted by the string +@var{foreign-name}. If a foreign symbol named @var{foreign-name} +doesn't exist, @code{nil} is returned. + +ABI name manglings will be performed on @var{foreign-name} by +@code{foreign-symbol-pointer} if necessary. (eg: adding a leading +underscore on darwin/ppc) + +@var{library} should name a foreign library as defined by +@code{define-foreign-library}, @code{:default} (which is the default) +or an instance of @code{foreign-library} as returned by +@code{load-foreign-library}. + +@strong{Important note:} do not keep these pointers across saved Lisp +cores as the foreign-library may move across sessions. + +@subheading Examples + +@lisp +CFFI> (foreign-symbol-pointer "errno") +@result{} # +CFFI> (foreign-symbol-pointer "strerror") +@result{} # +CFFI> (foreign-funcall-pointer * () :int (mem-ref ** :int) :string) +@result{} "No such file or directory" + +CFFI> (foreign-symbol-pointer "inexistent symbol") +@result{} NIL +@end lisp + +@subheading See Also +@seealso{defcvar} + + +@c =================================================================== +@c INC-POINTER + +@page +@node inc-pointer, incf-pointer, foreign-symbol-pointer, Pointers +@heading inc-pointer +@subheading Syntax +@Function{inc-pointer pointer offset @res{} new-pointer} + +@subheading Arguments and Values + +@table @var +@item pointer +@itemx new-pointer +A foreign pointer. + +@item offset +An integer. +@end table + +@subheading Description +The function @code{inc-pointer} will return a @var{new-pointer} pointing +@var{offset} bytes past @var{pointer}. + +@subheading Examples + +@lisp +CFFI> (foreign-string-alloc "Common Lisp") +@result{} # +CFFI> (inc-pointer * 7) +@result{} # +CFFI> (foreign-string-to-lisp *) +@result{} "Lisp" +@end lisp + +@subheading See Also +@seealso{incf-pointer} @* +@seealso{make-pointer} @* +@seealso{pointerp} @* +@seealso{null-pointer} @* +@seealso{null-pointer-p} + + +@c =================================================================== +@c INCF-POINTER + +@page +@node incf-pointer, make-pointer, inc-pointer, Pointers +@heading incf-pointer +@subheading Syntax +@Macro{incf-pointer place &optional (offset 1) @res{} new-pointer} + +@subheading Arguments and Values + +@table @var +@item place +A @code{setf} place. + +@item new-pointer +A foreign pointer. + +@item offset +An integer. +@end table + +@subheading Description +The @code{incf-pointer} macro takes the foreign pointer from +@var{place} and creates a @var{new-pointer} incremented by +@var{offset} bytes and which is stored in @var{place}. + +@subheading Examples + +@lisp +CFFI> (defparameter *two-words* (foreign-string-alloc "Common Lisp")) +@result{} *TWO-WORDS* +CFFI> (defparameter *one-word* *two-words*) +@result{} *ONE-WORD* +CFFI> (incf-pointer *one-word* 7) +@result{} #.(SB-SYS:INT-SAP #X00600457) +CFFI> (foreign-string-to-lisp *one-word*) +@result{} "Lisp" +CFFI> (foreign-string-to-lisp *two-words*) +@result{} "Common Lisp" +@end lisp + +@subheading See Also +@seealso{inc-pointer} @* +@seealso{make-pointer} @* +@seealso{pointerp} @* +@seealso{null-pointer} @* +@seealso{null-pointer-p} + + +@c =================================================================== +@c MAKE-POINTER + +@page +@node make-pointer, mem-aptr, incf-pointer, Pointers +@heading make-pointer +@subheading Syntax +@Function{make-pointer address @res{} ptr} + +@subheading Arguments and Values + +@table @var +@item address +An integer. + +@item ptr +A foreign pointer. +@end table + +@subheading Description +The function @code{make-pointer} will return a foreign pointer +pointing to @var{address}. + +@subheading Examples + +@lisp +CFFI> (make-pointer 42) +@result{} # +CFFI> (pointerp *) +@result{} T +CFFI> (pointer-address **) +@result{} 42 +CFFI> (inc-pointer *** -42) +@result{} # +CFFI> (null-pointer-p *) +@result{} T +CFFI> (typep ** 'foreign-pointer) +@result{} T +@end lisp + +@subheading See Also +@seealso{inc-pointer} @* +@seealso{null-pointer} @* +@seealso{null-pointer-p} @* +@seealso{pointerp} @* +@seealso{pointer-address} @* +@seealso{pointer-eq} @* +@seealso{mem-ref} + + +@c =================================================================== +@c MEM-APTR + +@page +@node mem-aptr, mem-aref, make-pointer, Pointers +@heading mem-aptr +@subheading Syntax +@Accessor{mem-aptr ptr type &optional (index 0)} + +@subheading Arguments and Values + +@table @var +@item ptr +A foreign pointer. + +@item type +A foreign type. + +@item index +An integer. + +@item new-value +A Lisp value compatible with @var{type}. +@end table + +@subheading Description +The @code{mem-aptr} function finds the pointer to an element of the array. + +@lisp +(mem-aptr ptr type n) + +;; @lispcmt{is identical to:} + +(inc-pointer ptr (* n (foreign-type-size type))) +@end lisp + +@subheading Examples + +@lisp +CFFI> (with-foreign-string (str "Hello, foreign world!") + (mem-aptr str :char 6)) +@result{} #.(SB-SYS:INT-SAP #X0063D4B6) +@end lisp + +@c =================================================================== +@c MEM-AREF + +@page +@node mem-aref, mem-ref, mem-aptr, Pointers +@heading mem-aref +@subheading Syntax +@Accessor{mem-aref ptr type &optional (index 0)} + +(setf (@strong{mem-aref} @emph{ptr type &optional (index 0)) new-value}) + +@subheading Arguments and Values + +@table @var +@item ptr +A foreign pointer. + +@item type +A foreign type. + +@item index +An integer. + +@item new-value +A Lisp value compatible with @var{type}. +@end table + +@subheading Description +The @code{mem-aref} function is similar to @code{mem-ref} but will +automatically calculate the offset from an @var{index}. + +@lisp +(mem-aref ptr type n) + +;; @lispcmt{is identical to:} + +(mem-ref ptr type (* n (foreign-type-size type))) +@end lisp + +@subheading Examples + +@lisp +CFFI> (with-foreign-string (str "Hello, foreign world!") + (mem-aref str :char 6)) +@result{} 32 +CFFI> (code-char *) +@result{} #\Space + +CFFI> (with-foreign-object (array :int 10) + (loop for i below 10 + do (setf (mem-aref array :int i) (random 100))) + (loop for i below 10 collect (mem-aref array :int i))) +@result{} (22 7 22 52 69 1 46 93 90 65) +@end lisp + +@subheading Compatibility Note + +For compatibility with older versions of CFFI, @ref{mem-aref} will +produce a pointer for the deprecated bare structure specification, but +it is consistent with other types for the current specification form +@code{(:struct @var{structure-name})} and provides a Lisp object +translated from the structure (by default a plist). In order to obtain +the pointer, you should use the new function @ref{mem-aptr}. + +@subheading See Also +@seealso{mem-ref} @* +@seealso{mem-aptr} + +@c =================================================================== +@c MEM-REF + +@page +@node mem-ref, null-pointer, mem-aref, Pointers +@heading mem-ref +@subheading Syntax +@Accessor{mem-ref ptr type &optional offset @res{} object} + +@subheading Arguments and Values + +@table @var +@item ptr +A pointer. + +@item type +A foreign type. + +@item offset +An integer (in byte units). + +@item object +The value @var{ptr} points to. +@end table + +@subheading Description +@subheading Examples + +@lisp +CFFI> (with-foreign-string (ptr "Saluton") + (setf (mem-ref ptr :char 3) (char-code #\a)) + (loop for i from 0 below 8 + collect (code-char (mem-ref ptr :char i)))) +@result{} (#\S #\a #\l #\a #\t #\o #\n #\Null) +CFFI> (setq ptr-to-int (foreign-alloc :int)) +@result{} # +CFFI> (mem-ref ptr-to-int :int) +@result{} 1054619 +CFFI> (setf (mem-ref ptr-to-int :int) 1984) +@result{} 1984 +CFFI> (mem-ref ptr-to-int :int) +@result{} 1984 +@end lisp + +@subheading See Also +@seealso{mem-aref} + + +@c =================================================================== +@c NULL-POINTER + +@page +@node null-pointer, null-pointer-p, mem-ref, Pointers +@heading null-pointer +@subheading Syntax +@Function{null-pointer @res{} pointer} + +@subheading Arguments and Values + +@table @var +@item pointer +A @code{NULL} pointer. +@end table + +@subheading Description +The function @code{null-pointer} returns a null pointer. + +@subheading Examples + +@lisp +CFFI> (null-pointer) +@result{} # +CFFI> (pointerp *) +@result{} T +@end lisp + +@subheading See Also +@seealso{null-pointer-p} @* +@seealso{make-pointer} + + +@c =================================================================== +@c NULL-POINTER-P + +@page +@node null-pointer-p, pointerp, null-pointer, Pointers +@heading null-pointer-p +@subheading Syntax +@Function{null-pointer-p ptr @res{} boolean} + +@subheading Arguments and Values + +@table @var +@item ptr +A foreign pointer that may be a null pointer. + +@item boolean +@code{T} or @code{NIL}. +@end table + +@subheading Description +The function @code{null-pointer-p} returns true if @var{ptr} is a null +pointer and false otherwise. + +@subheading Examples + +@lisp +CFFI> (null-pointer-p (null-pointer)) +@result{} T +@end lisp + +@lisp +(defun contains-str-p (big little) + (not (null-pointer-p + (foreign-funcall "strstr" :string big :string little :pointer)))) + +CFFI> (contains-str-p "Popcorns" "corn") +@result{} T +CFFI> (contains-str-p "Popcorns" "salt") +@result{} NIL +@end lisp + +@subheading See Also +@seealso{null-pointer} @* +@seealso{pointerp} + + +@c =================================================================== +@c POINTERP + +@page +@node pointerp, pointer-address, null-pointer-p, Pointers +@heading pointerp +@subheading Syntax +@Function{pointerp ptr @res{} boolean} + +@subheading Arguments and Values + +@table @var +@item ptr +An object that may be a foreign pointer. + +@item boolean +@code{T} or @code{NIL}. +@end table + +@subheading Description +The function @code{pointerp} returns true if @var{ptr} is a foreign +pointer and false otherwise. + +@subheading Implementation-specific Notes +In Allegro CL, foreign pointers are integers thus in this +implementation @code{pointerp} will return true for any ordinary integer. + +@subheading Examples + +@lisp +CFFI> (foreign-alloc 32) +@result{} # +CFFI> (pointerp *) +@result{} T +CFFI> (pointerp "this is not a pointer") +@result{} NIL +@end lisp + +@subheading See Also +@seealso{make-pointer} +@seealso{null-pointer-p} + + +@c =================================================================== +@c POINTER-ADDRESS + +@page +@node pointer-address, pointer-eq, pointerp, Pointers +@heading pointer-address +@subheading Syntax +@Function{pointer-address ptr @res{} address} + +@subheading Arguments and Values + +@table @var +@item ptr +A foreign pointer. + +@item address +An integer. +@end table + +@subheading Description +The function @code{pointer-address} will return the @var{address} of +a foreign pointer @var{ptr}. + +@subheading Examples + +@lisp +CFFI> (pointer-address (null-pointer)) +@result{} 0 +CFFI> (pointer-address (make-pointer 123)) +@result{} 123 +@end lisp + +@subheading See Also +@seealso{make-pointer} @* +@seealso{inc-pointer} @* +@seealso{null-pointer} @* +@seealso{null-pointer-p} @* +@seealso{pointerp} @* +@seealso{pointer-eq} @* +@seealso{mem-ref} + + +@c =================================================================== +@c POINTER-EQ + +@page +@node pointer-eq, with-foreign-object, pointer-address, Pointers +@heading pointer-eq +@subheading Syntax +@Function{pointer-eq ptr1 ptr2 @res{} boolean} + +@subheading Arguments and Values + +@table @var +@item ptr1 +@itemx ptr2 +A foreign pointer. + +@item boolean +@code{T} or @code{NIL}. +@end table + +@subheading Description +The function @code{pointer-eq} returns true if @var{ptr1} and +@var{ptr2} point to the same memory address and false otherwise. + +@subheading Implementation-specific Notes +The representation of foreign pointers varies across the various Lisp +implementations as does the behaviour of the built-in Common Lisp +equality predicates. Comparing two pointers that point to the same +address with @code{EQ} Lisps will return true on some Lisps, others require +more general predicates like @code{EQL} or @code{EQUALP} and finally +some will return false using any of these predicates. Therefore, for +portability, you should use @code{POINTER-EQ}. + +@subheading Examples +This is an example using @acronym{SBCL}, see the +implementation-specific notes above. + +@lisp +CFFI> (eql (null-pointer) (null-pointer)) +@result{} NIL +CFFI> (pointer-eq (null-pointer) (null-pointer)) +@result{} T +@end lisp + +@subheading See Also +@seealso{inc-pointer} + + +@c =================================================================== +@c WITH-FOREIGN-OBJECT + +@page +@node with-foreign-object, with-foreign-pointer, pointer-eq, Pointers +@heading with-foreign-object, with-foreign-objects +@subheading Syntax +@Macro{with-foreign-object (var type &optional count) &body body} + +@anchor{with-foreign-objects} +@Macro{with-foreign-objects (bindings) &body body} + +bindings ::= @{(var type &optional count)@}* + +@subheading Arguments and Values + +@table @var +@item var +A symbol. + +@item type +A foreign type, evaluated. + +@item count +An integer. +@end table + +@subheading Description +The macros @code{with-foreign-object} and @code{with-foreign-objects} +bind @var{var} to a pointer to @var{count} newly allocated objects +of type @var{type} during @var{body}. The buffer has dynamic extent +and may be stack allocated if supported by the host Lisp. + +@subheading Examples + +@lisp +CFFI> (with-foreign-object (array :int 10) + (dotimes (i 10) + (setf (mem-aref array :int i) (random 100))) + (loop for i below 10 + collect (mem-aref array :int i))) +@result{} (22 7 22 52 69 1 46 93 90 65) +@end lisp + +@subheading See Also +@seealso{foreign-alloc} + + +@c =================================================================== +@c WITH-FOREIGN-POINTER + +@page +@node with-foreign-pointer, , with-foreign-object, Pointers +@heading with-foreign-pointer +@subheading Syntax +@Macro{with-foreign-pointer (var size &optional size-var) &body body} + +@subheading Arguments and Values + +@table @var +@item var +@itemx size-var +A symbol. + +@item size +An integer. + +@item body +A list of forms to be executed. +@end table + +@subheading Description +The @code{with-foreign-pointer} macro, binds @var{var} to @var{size} +bytes of foreign memory during @var{body}. The pointer in @var{var} +is invalid beyond the dynamic extend of @var{body} and may be +stack-allocated if supported by the implementation. + +If @var{size-var} is supplied, it will be bound to @var{size} during +@var{body}. + +@subheading Examples + +@lisp +CFFI> (with-foreign-pointer (string 4 size) + (setf (mem-ref string :char (1- size)) 0) + (lisp-string-to-foreign "Popcorns" string size) + (loop for i from 0 below size + collect (code-char (mem-ref string :char i)))) +@result{} (#\P #\o #\p #\Null) +@end lisp + +@subheading See Also +@seealso{foreign-alloc} @* +@seealso{foreign-free} + + +@c =================================================================== +@c CHAPTER: Strings + +@node Strings, Variables, Pointers, Top +@chapter Strings + +As with many languages, Lisp and C have special support for logical +arrays of characters, going so far as to give them a special name, +``strings''. In that spirit, @cffi{} provides special support for +translating between Lisp and C strings. + +The @code{:string} type and the symbols related below also serve as an +example of what you can do portably with @cffi{}; were it not +included, you could write an equally functional @file{strings.lisp} +without referring to any implementation-specific symbols. + +@menu +Dictionary + +* *default-foreign-encoding*:: +* foreign-string-alloc:: +* foreign-string-free:: +* foreign-string-to-lisp:: +* lisp-string-to-foreign:: +* with-foreign-string:: +* with-foreign-strings:: +* with-foreign-pointer-as-string:: +@end menu + + +@c =================================================================== +@c *DEFAULT-FOREIGN-ENCODING* + +@page +@node *default-foreign-encoding*, foreign-string-alloc, Strings, Strings +@heading *default-foreign-encoding* +@subheading Syntax + +@Variable{*default-foreign-encoding*} + +@subheading Value type + +A keyword. + +@subheading Initial value + +@code{:utf-8} + +@subheading Description + +This special variable holds the default foreign encoding. + +@subheading Examples + +@lisp +CFFI> *default-foreign-encoding* +:utf-8 +CFFI> (foreign-funcall "strdup" (:string :encoding :utf-16) "foo" :string) +"f" +CFFI> (let ((*default-foreign-encoding* :utf-16)) + (foreign-funcall "strdup" (:string :encoding :utf-16) "foo" :string)) +"foo" +@end lisp + +@subheading See also + +@seealso{Other Types} (@code{:string} type) @* +@seealso{foreign-string-alloc} @* +@seealso{foreign-string-to-lisp} @* +@seealso{lisp-string-to-foreign} @* +@seealso{with-foreign-string} @* +@seealso{with-foreign-pointer-as-string} + + +@c =================================================================== +@c FOREIGN-STRING-ALLOC + +@page +@node foreign-string-alloc, foreign-string-free, *default-foreign-encoding*, Strings +@heading foreign-string-alloc +@subheading Syntax +@Function{foreign-string-alloc string &key encoding null-terminated-p @ + start end @res{} pointer} + +@subheading Arguments and Values + +@table @emph +@item @var{string} +A Lisp string. + +@item @var{encoding} +Foreign encoding. Defaults to @code{*default-foreign-encoding*}. + +@item @var{null-terminated-p} +Boolean, defaults to true. + +@item @var{start}, @var{end} +Bounding index designators of @var{string}. 0 and @code{nil}, by +default. + +@item @var{pointer} +A pointer to the newly allocated foreign string. +@end table + +@subheading Description +The @code{foreign-string-alloc} function allocates foreign memory +holding a copy of @var{string} converted using the specified +@var{encoding}. @var{Start} specifies an offset into @var{string} and +@var{end} marks the position following the last element of the foreign +string. + +This string must be freed with @code{foreign-string-free}. + +If @var{null-terminated-p} is false, the string will not be +null-terminated. + +@subheading Examples + +@lisp +CFFI> (defparameter *str* (foreign-string-alloc "Hello, foreign world!")) +@result{} # +CFFI> (foreign-funcall "strlen" :pointer *str* :int) +@result{} 21 +@end lisp + +@subheading See Also +@seealso{foreign-string-free} @* +@seealso{with-foreign-string} +@c @seealso{:string} + + +@c =================================================================== +@c FOREIGN-STRING-FREE + +@page +@node foreign-string-free, foreign-string-to-lisp, foreign-string-alloc, Strings +@heading foreign-string-free +@subheading Syntax +@Function{foreign-string-free pointer} + +@subheading Arguments and Values + +@table @var +@item pointer +A pointer to a string allocated by @code{foreign-string-alloc}. +@end table + +@subheading Description +The @code{foreign-string-free} function frees a foreign string +allocated by @code{foreign-string-alloc}. + +@subheading Examples + +@subheading See Also +@seealso{foreign-string-alloc} + + +@c =================================================================== +@c FOREIGN-STRING-TO-LISP + +@page +@node foreign-string-to-lisp, lisp-string-to-foreign, foreign-string-free, Strings +@heading foreign-string-to-lisp +@subheading Syntax +@Function{foreign-string-to-lisp ptr &key offset count max-chars @ + encoding @res{} string} + +@subheading Arguments and Values + +@table @var +@item ptr +A pointer. + +@item offset +An integer greater than or equal to 0. Defauls to 0. + +@item count +Either @code{nil} (the default), or an integer greater than or equal to 0. + +@item max-chars +An integer greater than or equal to 0. +@code{(1- array-total-size-limit)}, by default. + +@item encoding +Foreign encoding. Defaults to @code{*default-foreign-encoding*}. + +@item string +A Lisp string. +@end table + +@subheading Description +The @code{foreign-string-to-lisp} function converts at most +@var{count} octets from @var{ptr} into a Lisp string, using the +defined @var{encoding}. + +If @var{count} is @code{nil} (the default), characters are copied +until @var{max-chars} is reached or a @code{NULL} character is found. + +If @var{ptr} is a null pointer, returns @code{nil}. + +Note that the @code{:string} type will automatically convert between +Lisp strings and foreign strings. + +@subheading Examples + +@lisp +CFFI> (foreign-funcall "getenv" :string "HOME" :pointer) +@result{} # +CFFI> (foreign-string-to-lisp *) +@result{} "/Users/luis" +@end lisp + +@subheading See Also +@seealso{lisp-string-to-foreign} @* +@seealso{foreign-string-alloc} +@c @seealso{:string} + + +@c =================================================================== +@c LISP-STRING-TO-FOREIGN + +@page +@node lisp-string-to-foreign, with-foreign-string, foreign-string-to-lisp, Strings +@heading lisp-string-to-foreign +@subheading Syntax +@Function{lisp-string-to-foreign string buffer bufsize &key start @ + end offset encoding @res{} buffer} + +@subheading Arguments and Values + +@table @emph +@item @var{string} +A Lisp string. + +@item @var{buffer} +A foreign pointer. + +@item @var{bufsize} +An integer. + +@item @var{start}, @var{end} +Bounding index designators of @var{string}. 0 and @code{nil}, by +default. + +@item @var{offset} +An integer greater than or equal to 0. Defauls to 0. + +@item @var{encoding} +Foreign encoding. Defaults to @code{*default-foreign-encoding*}. +@end table + +@subheading Description +The @code{lisp-string-to-foreign} function copies at most +@var{bufsize}-1 octets from a Lisp @var{string} using the specified +@var{encoding} into @var{buffer}+@var{offset}. The foreign string will +be null-terminated. + +@var{Start} specifies an offset into @var{string} and +@var{end} marks the position following the last element of the foreign +string. + +@subheading Examples + +@lisp +CFFI> (with-foreign-pointer-as-string (str 255) + (lisp-string-to-foreign "Hello, foreign world!" str 6)) +@result{} "Hello" +@end lisp + +@subheading See Also +@seealso{foreign-string-alloc} @* +@seealso{foreign-string-to-lisp} @* +@seealso{with-foreign-pointer-as-string} + + +@c =================================================================== +@c WITH-FOREIGN-STRING + +@page +@node with-foreign-string, with-foreign-pointer-as-string, lisp-string-to-foreign, Strings +@heading with-foreign-string, with-foreign-strings +@subheading Syntax +@Macro{with-foreign-string (var-or-vars string &rest args) &body body} + +@anchor{with-foreign-strings} +@Macro{with-foreign-strings (bindings) &body body} + +var-or-vars ::= var | (var &optional octet-size-var) +bindings ::= @{(var-or-vars string &rest args)@}* + +@subheading Arguments and Values + +@table @emph +@item @var{var}, @var{byte-size-var} +A symbol. + +@item @var{string} +A Lisp string. + +@item @var{body} +A list of forms to be executed. +@end table + +@subheading Description +The @code{with-foreign-string} macro will bind @var{var} to a newly +allocated foreign string containing @var{string}. @var{Args} is passed +to the underlying @code{foreign-string-alloc} call. + +If @var{octet-size-var} is provided, it will be bound the length of +foreign string in octets including the null terminator. + +@subheading Examples + +@lisp +CFFI> (with-foreign-string (foo "12345") + (foreign-funcall "strlen" :pointer foo :int)) +@result{} 5 + +CFFI> (let ((array (coerce #(84 117 114 97 110 103 97) + '(array (unsigned-byte 8))))) + (with-foreign-string (foreign-string array) + (foreign-string-to-lisp foreign-string))) +@result{} "Turanga" +@end lisp + +@subheading See Also +@seealso{foreign-string-alloc} @* +@seealso{with-foreign-pointer-as-string} + + +@c =================================================================== +@c WITH-FOREIGN-POINTER-AS-STRING + +@page +@node with-foreign-pointer-as-string, , with-foreign-string, Strings +@heading with-foreign-pointer-as-string +@subheading Syntax +@Macro{with-foreign-pointer-as-string (var size &optional size-var @ + &rest args) &body body @res{} string} + +@subheading Arguments and Values + +@table @var +@item var +A symbol. + +@item string +A Lisp string. + +@item body +List of forms to be executed. +@end table + +@subheading Description +The @code{with-foreign-pointer-as-string} macro is similar to +@code{with-foreign-pointer} except that @var{var} is used as the +returned value of an implicit @code{progn} around @var{body}, after +being converted to a Lisp string using the provided @var{args}. + +@subheading Examples + +@lisp +CFFI> (with-foreign-pointer-as-string (str 6 str-size :encoding :ascii) + (lisp-string-to-foreign "Hello, foreign world!" str str-size)) +@result{} "Hello" +@end lisp + +@subheading See Also +@seealso{foreign-string-alloc} @* +@seealso{with-foreign-string} + + +@c =================================================================== +@c CHAPTER: Variables + +@node Variables, Functions, Strings, Top +@chapter Variables + +@menu +Dictionary + +* defcvar:: +* get-var-pointer:: +@end menu + + +@c =================================================================== +@c DEFCVAR + +@page +@node defcvar, get-var-pointer, Variables, Variables +@heading defcvar +@subheading Syntax +@Macro{defcvar name-and-options type &optional documentation @res{} lisp-name} + +@var{name-and-options} ::= name | (name &key read-only (library :default)) @* +@var{name} ::= lisp-name [foreign-name] | foreign-name [lisp-name] + +@subheading Arguments and Values + +@table @var +@item foreign-name +A string denoting a foreign function. + +@item lisp-name +A symbol naming the Lisp function to be created. + +@item type +A foreign type. + +@item read-only +A boolean. + +@item documentation +A Lisp string; not evaluated. +@end table + +@subheading Description +The @code{defcvar} macro defines a symbol macro @var{lisp-name} that looks +up @var{foreign-name} and dereferences it acording to @var{type}. It +can also be @code{setf}ed, unless @var{read-only} is true, in which +case an error will be signaled. + +When one of @var{lisp-name} or @var{foreign-name} is omitted, the +other is automatically derived using the following rules: + +@itemize +@item +Foreign names are converted to Lisp names by uppercasing, replacing +underscores with hyphens, and wrapping around asterisks. +@item +Lisp names are converted to foreign names by lowercasing, replacing +hyphens with underscores, and removing asterisks, if any. +@end itemize + +@subheading Examples + +@lisp +CFFI> (defcvar "errno" :int) +@result{} *ERRNO* +CFFI> (foreign-funcall "strerror" :int *errno* :string) +@result{} "Inappropriate ioctl for device" +CFFI> (setf *errno* 1) +@result{} 1 +CFFI> (foreign-funcall "strerror" :int *errno* :string) +@result{} "Operation not permitted" +@end lisp + +Trying to modify a read-only foreign variable: + +@lisp +CFFI> (defcvar ("errno" +error-number+ :read-only t) :int) +@result{} +ERROR-NUMBER+ +CFFI> (setf +error-number+ 12) +;; @lispcmt{@error{} Trying to modify read-only foreign var: +ERROR-NUMBER+.} +@end lisp + +@emph{Note that accessing @code{errno} this way won't work with every +implementation of the C standard library.} + +@subheading See Also +@seealso{get-var-pointer} + + +@c =================================================================== +@c GET-VAR-POINTER + +@page +@node get-var-pointer, , defcvar, Variables +@heading get-var-pointer +@subheading Syntax +@Function{get-var-pointer symbol @res{} pointer} + +@subheading Arguments and Values + +@table @var +@item symbol +A symbol denoting a foreign variable defined with @code{defcvar}. + +@item pointer +A foreign pointer. +@end table + +@subheading Description +The function @code{get-var-pointer} will return a @var{pointer} to the +foreign global variable @var{symbol} previously defined with +@code{defcvar}. + +@subheading Examples + +@lisp +CFFI> (defcvar "errno" :int :read-only t) +@result{} *ERRNO* +CFFI> *errno* +@result{} 25 +CFFI> (get-var-pointer '*errno*) +@result{} # +CFFI> (mem-ref * :int) +@result{} 25 +@end lisp + +@subheading See Also +@seealso{defcvar} + + +@c =================================================================== +@c CHAPTER: Functions + +@node Functions, Libraries, Variables, Top +@chapter Functions + +@menu +@c * Defining Foreign Functions:: +@c * Calling Foreign Functions:: + +Dictionary + +* defcfun:: +* foreign-funcall:: +* foreign-funcall-pointer:: +* foreign-funcall-varargs:: +* foreign-funcall-pointer-varargs:: +* translate-camelcase-name:: +* translate-name-from-foreign:: +* translate-name-to-foreign:: +* translate-underscore-separated-name:: +@end menu + +@c @node Calling Foreign Functions +@c @section Calling Foreign Functions + +@c @node Defining Foreign Functions +@c @section Defining Foreign Functions + + +@c =================================================================== +@c DEFCFUN + +@page +@node defcfun, foreign-funcall, Functions, Functions +@heading defcfun +@subheading Syntax +@Macro{defcfun name-and-options return-type &body [docstring] arguments [&rest] @ + @res{} lisp-name} + +@var{name-and-options} ::= @var{name} | (@var{name} &key @var{library} @var{convention}) @* +@var{name} ::= @var{lisp-name} [@var{foreign-name}] | @var{foreign-name} [@var{lisp-name}] @* +@var{arguments} ::= @{ (@var{arg-name} @var{arg-type}) @}* @* + +@subheading Arguments and Values + +@table @var +@item foreign-name +A string denoting a foreign function. + +@item lisp-name +A symbol naming the Lisp function to be created. + +@item arg-name +A symbol. + +@item return-type +@itemx arg-type +A foreign type. + +@item convention +One of @code{:cdecl} (default) or @code{:stdcall}. + +@item library +A symbol designating a foreign library. + +@item docstring +A documentation string. +@end table + +@subheading Description +The @code{defcfun} macro provides a declarative interface for defining +Lisp functions that call foreign functions. + +When one of @var{lisp-name} or @var{foreign-name} is omitted, the +other is automatically derived using the following rules: + +@itemize +@item +Foreign names are converted to Lisp names by uppercasing and replacing +underscores with hyphens. +@item +Lisp names are converted to foreign names by lowercasing and replacing +hyphens with underscores. +@end itemize + +If you place the symbol @code{&rest} in the end of the argument list +after the fixed arguments, @code{defcfun} will treat the foreign +function as a @strong{variadic function}. The variadic arguments +should be passed in a way similar to what @code{foreign-funcall} would +expect. Unlike @code{foreign-funcall} though, @code{defcfun} will take +care of doing argument promotion. Note that in this case +@code{defcfun} will generate a Lisp @emph{macro} instead of a +function and will only work for Lisps that support +@code{foreign-funcall.} + +If a foreign structure is to be passed or returned by value (that is, +the type is of the form @code{(:struct ...)}), then the cffi-libffi system +must be loaded, which in turn depends on +@uref{http://sourceware.org/libffi/,libffi}, including the header files. +Failure to load that system will result in an error. +Variadic functions cannot at present accept or return structures by +value. + +@subheading Examples + +@lisp +(defcfun "strlen" :int + "Calculate the length of a string." + (n :string)) + +CFFI> (strlen "123") +@result{} 3 +@end lisp + +@lisp +(defcfun ("abs" c-abs) :int (n :int)) + +CFFI> (c-abs -42) +@result{} 42 +@end lisp + +Function without arguments: + +@lisp +(defcfun "rand" :int) + +CFFI> (rand) +@result{} 1804289383 +@end lisp + +Variadic function example: + +@lisp +(defcfun "sprintf" :int + (str :pointer) + (control :string) + &rest) + +CFFI> (with-foreign-pointer-as-string (s 100) + (sprintf s "%c %d %.2f %s" :char 90 :short 42 :float pi + :string "super-locrian")) +@result{} "A 42 3.14 super-locrian" +@end lisp + +@subheading See Also +@seealso{foreign-funcall} @* +@seealso{foreign-funcall-pointer} @* +@seealso{foreign-funcall-varargs} @* +@seealso{foreign-funcall-pointer-varargs} + + +@c =================================================================== +@c FOREIGN-FUNCALL + +@page +@node foreign-funcall, foreign-funcall-pointer, defcfun, Functions +@heading foreign-funcall +@subheading Syntax +@Macro{foreign-funcall name-and-options &rest arguments @res{} return-value} + +@var{arguments} ::= @{ @var{arg-type} @var{arg} @}* [@var{return-type}] @* +@var{name-and-options} ::= @var{name} | (@var{name} &key @var{library} @var{convention}) @* + +@subheading Arguments and Values + +@table @var +@item name +A Lisp string. + +@item arg-type +A foreign type. + +@item arg +An argument of type @var{arg-type}. + +@item return-type +A foreign type, @code{:void} by default. + +@item return-value +A lisp object. + +@item library +A lisp symbol; not evaluated. + +@item convention +One of @code{:cdecl} (default) or @code{:stdcall}. +@end table + +@subheading Description +The @code{foreign-funcall} macro is the main primitive for calling +foreign functions. + +If a foreign structure is to be passed or returned by value (that is, +the type is of the form @code{(:struct ...)}), then the cffi-libffi system +must be loaded, which in turn depends on +@uref{http://sourceware.org/libffi/,libffi}, including the header files. +Failure to load that system will result in an error. +Variadic functions cannot at present accept or return structures by +value. + +@emph{Note: The return value of foreign-funcall on functions with a +:void return type is still undefined.} + +@subheading Implementation-specific Notes +@itemize +@item +Corman Lisp does not support @code{foreign-funcall}. On +implementations that @strong{don't} support @code{foreign-funcall} +@code{cffi-sys::no-foreign-funcall} will be present in +@code{*features*}. Note: in these Lisps you can still use the +@code{defcfun} interface. +@end itemize + +@subheading Examples + +@lisp +CFFI> (foreign-funcall "strlen" :string "foo" :int) +@result{} 3 +@end lisp + +Given the C code: + +@example +void print_number(int n) +@{ + printf("N: %d\n", n); +@} +@end example + +@lisp +CFFI> (foreign-funcall "print_number" :int 123456) +@print{} N: 123456 +@result{} NIL +@end lisp + +@noindent +Or, equivalently: + +@lisp +CFFI> (foreign-funcall "print_number" :int 123456 :void) +@print{} N: 123456 +@result{} NIL +@end lisp + +@lisp +CFFI> (foreign-funcall "printf" :string (format nil "%s: %d.~%") + :string "So long and thanks for all the fish" + :int 42 :int) +@print{} So long and thanks for all the fish: 42. +@result{} 41 +@end lisp + +@subheading See Also +@seealso{defcfun} @* +@seealso{foreign-funcall-pointer} + + +@c =================================================================== +@c FOREIGN-FUNCALL-POINTER + +@page +@node foreign-funcall-pointer, foreign-funcall-varargs, foreign-funcall, Functions +@heading foreign-funcall-pointer +@subheading Syntax +@Macro{foreign-funcall-pointer pointer options &rest arguments @res{} return-value} + +@var{arguments} ::= @{ @var{arg-type} @var{arg} @}* [@var{return-type}] @* +@var{options} ::= (&key @var{convention}) @* + +@subheading Arguments and Values + +@table @var +@item pointer +A foreign pointer. + +@item arg-type +A foreign type. + +@item arg +An argument of type @var{arg-type}. + +@item return-type +A foreign type, @code{:void} by default. + +@item return-value +A lisp object. + +@item convention +One of @code{:cdecl} (default) or @code{:stdcall}. +@end table + +@subheading Description +The @code{foreign-funcall} macro is the main primitive for calling +foreign functions. + +@emph{Note: The return value of foreign-funcall on functions with a +:void return type is still undefined.} + +@subheading Implementation-specific Notes +@itemize +@item +Corman Lisp does not support @code{foreign-funcall}. On +implementations that @strong{don't} support @code{foreign-funcall} +@code{cffi-sys::no-foreign-funcall} will be present in +@code{*features*}. Note: in these Lisps you can still use the +@code{defcfun} interface. +@end itemize + +@subheading Examples + +@lisp +CFFI> (foreign-funcall-pointer (foreign-symbol-pointer "abs") () + :int -42 :int) +@result{} 42 +@end lisp + +@subheading See Also +@seealso{defcfun} @* +@seealso{foreign-funcall} + + +@c =================================================================== +@c FOREIGN-FUNCALL-VARARGS + +@page +@node foreign-funcall-varargs, foreign-funcall-pointer-varargs, foreign-funcall-pointer, Functions +@heading foreign-funcall-varargs +@subheading Syntax +@Macro{foreign-funcall-varargs name-and-options (fixed-arguments) &rest arguments @res{} return-value} + +@var{fixed-arguments} ::= @{ @var{arg-type} @var{arg} @}* [@var{return-type}] @* +@var{arguments} ::= @{ @var{arg-type} @var{arg} @}* [@var{return-type}] @* +@var{name-and-options} ::= @var{name} | (@var{name} &key @var{library} @var{convention}) @* + +@subheading Arguments and Values + +@table @var +@item name +A Lisp string. + +@item arg-type +A foreign type. + +@item arg +An argument of type @var{arg-type}. + +@item return-type +A foreign type, @code{:void} by default. + +@item return-value +A lisp object. + +@item library +A lisp symbol; not evaluated. + +@item convention +One of @code{:cdecl} (default) or @code{:stdcall}. +@end table + +@subheading Description +The @code{foreign-funcall-varargs} macro is the main primitive for +calling foreign variadic functions. It behaves similarily to +@code{foreign-funcall} except @code{fixed-arguments} are distinguished +from the remaining arguments. + +@subheading Examples + +@lisp +CFFI> (with-foreign-pointer-as-string (s 100) + (setf (mem-ref s :char) 0) + (foreign-funcall-varargs + "sprintf" (:pointer s :string) "%.2f") + :double (coerce pi 'double-float) :int)) +@result{} 3.14 +@end lisp + + +@c =================================================================== +@c FOREIGN-FUNCALL-POINTER-VARARGS + +@page +@node foreign-funcall-pointer-varargs, translate-camelcase-name, foreign-funcall-varargs, Functions +@heading foreign-funcall-pointer-varargs +@subheading Syntax +@Macro{foreign-funcall-pointer-varargs pointer options (fixed-arguments) &rest arguments @res{} return-value} + +@var{fixed-arguments} ::= @{ @var{arg-type} @var{arg} @}* [@var{return-type}] @* +@var{arguments} ::= @{ @var{arg-type} @var{arg} @}* [@var{return-type}] @* +@var{options} ::= (&key @var{convention}) @* + +@subheading Arguments and Values + +@table @var +@item pointer +A foreign pointer. + +@item arg-type +A foreign type. + +@item arg +An argument of type @var{arg-type}. + +@item return-type +A foreign type, @code{:void} by default. + +@item return-value +A lisp object. + +@item convention +One of @code{:cdecl} (default) or @code{:stdcall}. +@end table + +@subheading Description +The @code{foreign-funcall-pointer-varargs} macro is the main primitive +for calling foreign variadic functions. It behaves similarily to +@code{foreign-funcall-pointer} except @code{fixed-arguments} are +distinguished from the remaining arguments. + +@subheading Examples + +@lisp +CFFI> (with-foreign-pointer-as-string (s 100) + (setf (mem-ref s :char) 0) + (foreign-funcall-pointer-varargs + (foreign-symbol-pointer "sprintf") () (:pointer s :string "%.2f") + :double (coerce pi 'double-float) :int)) +@result{} 3.14 +@end lisp + + +@c =================================================================== +@c TRANSLATE-CAMELCASE-NAME + +@page +@node translate-camelcase-name, translate-name-from-foreign, foreign-funcall-pointer-varargs, Functions +@heading translate-camelcase-name +@subheading Syntax +@Function{translate-camelcase-name name &key upper-initial-p special-words @res{} return-value} + +@subheading Arguments and Values + +@table @var +@item name +Either a symbol or a string. + +@item upper-initial-p +A generalized boolean. + +@item special words +A list of strings. + +@item return-value +If @var{name} is a symbol, this is a string, and vice versa. +@end table + +@subheading Description +@code{translate-camelcase-name} is a helper function for +specializations of @code{translate-name-from-foreign} and +@code{translate-name-to-foreign}. It handles the common case of +converting between foreign camelCase names and lisp +names. @var{upper-initial-p} indicates whether the first letter of the +foreign name should be uppercase. @var{special-words} is a list of +strings that should be treated atomically in translation. This list is +case-sensitive. + +@subheading Examples + +@lisp +CFFI> (translate-camelcase-name some-xml-function) +@result{} "someXmlFunction" +CFFI> (translate-camelcase-name some-xml-function :upper-initial-p t) +@result{} "SomeXmlFunction" +CFFI> (translate-camelcase-name some-xml-function :special-words '("XML")) +@result{} "someXMLFunction" +CFFI> (translate-camelcase-name "someXMLFunction") +@result{} SOME-X-M-L-FUNCTION +CFFI> (translate-camelcase-name "someXMLFunction" :special-words '("XML")) +@result{} SOME-XML-FUNCTION +@end lisp + +@subheading See Also +@seealso{translate-name-from-foreign} @* +@seealso{translate-name-to-foreign} @* +@seealso{translate-underscore-separated-name} + + +@c =================================================================== +@c TRANSLATE-NAME-FROM-FOREIGN + +@page +@node translate-name-from-foreign, translate-name-to-foreign, translate-camelcase-name, Functions +@heading translate-name-from-foreign +@subheading Syntax +@Function{translate-name-from-foreign foreign-name package &optional varp @res{} symbol} + +@subheading Arguments and Values + +@table @var +@item foreign-name +A string denoting a foreign function. + +@item package +A Lisp package + +@item varp +A generalized boolean. + +@item symbol +The Lisp symbol to be used a function name. +@end table + +@subheading Description +@code{translate-name-from-foreign} is used by @ref{defcfun} to handle +the conversion of foreign names to lisp names. By default, it +translates using @ref{translate-underscore-separated-name}. However, +you can create specialized methods on this function to make +translating more closely match the foreign library's naming +conventions. + +Specialize @var{package} on some package. This allows other packages +to load libraries with different naming conventions. + +@subheading Examples + +@lisp +CFFI> (defcfun "someXmlFunction" ...) +@result{} SOMEXMLFUNCTION +CFFI> (defmethod translate-name-from-foreign ((spec string) + (package (eql *package*)) + &optional varp) + (let ((name (translate-camelcase-name spec))) + (if varp (intern (format nil "*~a*" name)) name))) +@result{} #))> +CFFI> (defcfun "someXmlFunction" ...) +@result{} SOME-XML-FUNCTION +@end lisp + +@subheading See Also +@seealso{defcfun} @* +@seealso{translate-camelcase-name} @* +@seealso{translate-name-to-foreign} @* +@seealso{translate-underscore-separated-name} + + +@c =================================================================== +@c TRANSLATE-NAME-TO-FOREIGN + +@page +@node translate-name-to-foreign, translate-underscore-separated-name, translate-name-from-foreign, Functions +@heading translate-name-to-foreign +@subheading Syntax +@Function{translate-name-to-foreign lisp-name package &optional varp @res{} string} + +@subheading Arguments and Values + +@table @var +@item lisp-name +A symbol naming the Lisp function to be created. + +@item package +A Lisp package + +@item varp +A generalized boolean. + +@item string +The string representing the foreign function name. +@end table + +@subheading Description +@code{translate-name-to-foreign} is used by @ref{defcfun} to handle +the conversion of lisp names to foreign names. By default, it +translates using @ref{translate-underscore-separated-name}. However, +you can create specialized methods on this function to make +translating more closely match the foreign library's naming +conventions. + +Specialize @var{package} on some package. This allows other packages +to load libraries with different naming conventions. + +@subheading Examples + +@lisp +CFFI> (defcfun some-xml-function ...) +@result{} "some_xml_function" +CFFI> (defmethod translate-name-to-foreign ((spec symbol) + (package (eql *package*)) + &optional varp) + (let ((name (translate-camelcase-name spec))) + (if varp (subseq name 1 (1- (length name))) name))) +@result{} #))> +CFFI> (defcfun some-xml-function ...) +@result{} "someXmlFunction" +@end lisp + +@subheading See Also +@seealso{defcfun} @* +@seealso{translate-camelcase-name} @* +@seealso{translate-name-from-foreign} @* +@seealso{translate-underscore-separated-name} + + +@c =================================================================== +@c TRANSLATE-UNDERSCORE-SEPARATED-NAME + +@page +@node translate-underscore-separated-name, , translate-name-to-foreign, Functions +@heading translate-underscore-separated-name +@subheading Syntax +@Function{translate-underscore-separated-name name @res{} return-value} + +@subheading Arguments and Values + +@table @var +@item name +Either a symbol or a string. + +@item return-value +If @var{name} is a symbol, this is a string, and vice versa. +@end table + +@subheading Description +@code{translate-underscore-separated-name} is a helper function for +specializations of @ref{translate-name-from-foreign} and +@ref{translate-name-to-foreign}. It handles the common case of +converting between foreign underscore_separated names and lisp names. + +@subheading Examples + +@lisp +CFFI> (translate-underscore-separated-name some-xml-function) +@result{} "some_xml_function" +CFFI> (translate-camelcase-name "some_xml_function") +@result{} SOME-XML-FUNCTION +@end lisp + +@subheading See Also +@seealso{translate-name-from-foreign} @* +@seealso{translate-name-to-foreign} @* +@seealso{translate-camelcase-name} + + +@c =================================================================== +@c CHAPTER: Libraries + +@node Libraries, Callbacks, Functions, Top +@chapter Libraries + +@menu +* Defining a library:: +* Library definition style:: + +Dictionary + +* close-foreign-library:: Close a foreign library. +* *darwin-framework-directories*:: Search path for Darwin frameworks. +* define-foreign-library:: Explain how to load a foreign library. +* *foreign-library-directories*:: Search path for shared libraries. +* load-foreign-library:: Load a foreign library. +* load-foreign-library-error:: Signalled on failure of its namesake. +* use-foreign-library:: Load a foreign library when needed. +@end menu + + +@node Defining a library, Library definition style, Libraries, Libraries +@section Defining a library + +Almost all foreign code you might want to access exists in some kind +of shared library. The meaning of @dfn{shared library} varies among +platforms, but for our purposes, we will consider it to include +@file{.so} files on @sc{unix}, frameworks on Darwin (and derivatives +like Mac @acronym{OS X}), and @file{.dll} files on Windows. + +Bringing one of these libraries into the Lisp image is normally a +two-step process. + +@enumerate +@item +Describe to @cffi{} how to load the library at some future point, +depending on platform and other factors, with a +@code{define-foreign-library} top-level form. + +@item +Load the library so defined with either a top-level +@code{use-foreign-library} form or by calling the function +@code{load-foreign-library}. +@end enumerate + +@xref{Tutorial-Loading,, Loading foreign libraries}, for a working +example of the above two steps. + + +@node Library definition style, close-foreign-library, Defining a library, Libraries +@section Library definition style + +Looking at the @code{libcurl} library definition presented earlier, +you may ask why we did not simply do this: + +@lisp +(define-foreign-library libcurl + (t (:default "libcurl"))) +@end lisp + +@noindent +Indeed, this would work just as well on the computer on which I tested +the tutorial. There are a couple of good reasons to provide the +@file{.so}'s current version number, however. Namely, the versionless +@file{.so} is not packaged on most @sc{unix} systems along with the +actual, fully-versioned library; instead, it is included in the +``development'' package along with C headers and static @file{.a} +libraries. + +The reason @cffi{} does not try to account for this lies in the +meaning of the version numbers. A full treatment of shared library +versions is beyond this manual's scope; see @ref{Versioning,, Library +interface versions, libtool, @acronym{GNU} Libtool}, for helpful +information for the unfamiliar. For our purposes, consider that a +mismatch between the library version with which you tested and the +installed library version may cause undefined +behavior.@footnote{Windows programmers may chafe at adding a +@sc{unix}-specific clause to @code{define-foreign-library}. Instead, +ask why the Windows solution to library incompatibility is ``include +your own version of every library you use with every program''.} + +@impnote{Maybe some notes should go here about OS X, which I know +little about. --stephen} + + +@c =================================================================== +@c CLOSE-FOREIGN-LIBRARY + +@page +@node close-foreign-library, *darwin-framework-directories*, Library definition style, Libraries +@heading close-foreign-library +@subheading Syntax +@Function{close-foreign-library library @res{} success} + +@subheading Arguments and Values + +@table @var +@item library +A symbol or an instance of @code{foreign-library}. + +@item success +A Lisp boolean. +@end table + +@subheading Description + +Closes @var{library} which can be a symbol designating a library +define through @code{define-foreign-library} or an instance of +@code{foreign-library} as returned by @code{load-foreign-library}. + +@c @subheading Examples +@c @xref{Tutorial-Loading,, Loading foreign libraries}. + +@subheading See Also + +@seealso{define-foreign-library} @* +@seealso{load-foreign-library} @* +@seealso{use-foreign-library} + + +@c =================================================================== +@c *DARWIN-FRAMEWORK-DIRECTORIES* + +@page +@node *darwin-framework-directories*, define-foreign-library, close-foreign-library, Libraries +@heading *darwin-framework-directories* +@subheading Syntax + +@Variable{*darwin-framework-directories*} + +@subheading Value type + +A list, in which each element is a string, a pathname, or a simple +Lisp expression. + +@subheading Initial value + +A list containing the following, in order: an expression corresponding +to Darwin path @file{~/Library/Frameworks/}, +@code{#P"/Library/Frameworks/"}, and +@code{#P"/System/Library/Frameworks/"}. + +@subheading Description + +The meaning of ``simple Lisp expression'' is explained in +@ref{*foreign-library-directories*}. In contrast to that variable, +this is not a fallback search path; the default value described above +is intended to be a reasonably complete search path on Darwin systems. + +@subheading Examples + +@lisp +CFFI> (let ((lib (load-foreign-library '(:framework "OpenGL")))) + (foreign-library-pathname lib)) +@result{} #P"/System/Library/Frameworks/OpenGL.framework/OpenGL" +@end lisp + +@subheading See also + +@seealso{*foreign-library-directories*} @* +@seealso{define-foreign-library} + + +@c =================================================================== +@c DEFINE-FOREIGN-LIBRARY + +@page +@node define-foreign-library, *foreign-library-directories*, *darwin-framework-directories*, Libraries +@heading define-foreign-library + +@subheading Syntax + +@Macro{define-foreign-library name-and-options @{ load-clause @}* @res{} name} + +name-and-options ::= name | (name &key convention search-path) +load-clause ::= (feature library &key convention search-path) + +@subheading Arguments and Values + +@table @var +@item name +A symbol. + +@item feature +A feature expression. + +@item library +A library designator. + +@item convention +One of @code{:cdecl} (default) or @code{:stdcall} + +@item search-path +A path or list of paths where the library will be searched if not found in +system-global directories. Paths specified in a load clause take priority over +paths specified as library option, with *foreign-library-directories* having +lowest priority. +@end table + +@subheading Description + +Creates a new library designator called @var{name}. The +@var{load-clause}s describe how to load that designator when passed to +@code{load-foreign-library} or @code{use-foreign-library}. + +When trying to load the library @var{name}, the relevant function +searches the @var{load-clause}s in order for the first one where +@var{feature} evaluates to true. That happens for any of the +following situations: + +@enumerate 1 +@item +If @var{feature} is a symbol present in @code{common-lisp:*features*}. + +@item +If @var{feature} is a list, depending on @code{(first @var{feature})}, +a keyword: + +@table @code +@item :and +All of the feature expressions in @code{(rest @var{feature})} are +true. + +@item :or +At least one of the feature expressions in @code{(rest @var{feature})} +is true. + +@item :not +The feature expression @code{(second @var{feature})} is not true. +@end table + +@item +Finally, if @var{feature} is @code{t}, this @var{load-clause} is +picked unconditionally. +@end enumerate + +Upon finding the first true @var{feature}, the library loader then +loads the @var{library}. The meaning of ``library designator'' is +described in @ref{load-foreign-library}. + +Functions associated to a library defined by +@code{define-foreign-library} (e.g. through @code{defcfun}'s +@code{:library} option, will inherit the library's options. The +precedence is as follows: + +@enumerate 1 +@item +@code{defcfun}/@code{foreign-funcall} specific options; + +@item +@var{load-clause} options; + +@item +global library options (the @var{name-and-options} argument) +@end enumerate + + +@subheading Examples + +@xref{Tutorial-Loading,, Loading foreign libraries}. + + +@subheading See Also + +@seealso{close-foreign-library} @* +@seealso{load-foreign-library} + + +@c =================================================================== +@c *FOREIGN-LIBRARY-DIRECTORIES* + +@page +@node *foreign-library-directories*, load-foreign-library, define-foreign-library, Libraries +@heading *foreign-library-directories* +@subheading Syntax + +@Variable{*foreign-library-directories*} + +@subheading Value type + +A list, in which each element is a string, a pathname, or a simple +Lisp expression. + +@subheading Initial value + +The empty list. + +@subheading Description + +You should not have to use this variable. + +Most, if not all, Lisps supported by @cffi{} have a reasonable default +search algorithm for foreign libraries. For example, Lisps for +@sc{unix} usually call +@uref{http://www.opengroup.org/onlinepubs/009695399/functions/dlopen.html,, +@code{dlopen(3)}}, which in turn looks in the system library +directories. Only if that fails does @cffi{} look for the named +library file in these directories, and load it from there if found. + +Thus, this is intended to be a @cffi{}-only fallback to the library +search configuration provided by your operating system. For example, +if you distribute a foreign library with your Lisp package, you can +add the library's containing directory to this list and portably +expect @cffi{} to find it. + +A @dfn{simple Lisp expression} is intended to provide functionality +commonly used in search paths such as +@acronym{ASDF}'s@footnote{@xref{Using asdf to load systems,,, asdf, +asdf: another system definition facility}, for information on +@code{asdf:*central-registry*}.}, and is defined recursively as +follows:@footnote{See @code{mini-eval} in @file{libraries.lisp} for +the source of this definition. As is always the case with a Lisp +@code{eval}, it's easier to understand the Lisp definition than the +english.} + +@enumerate +@item +A list, whose @samp{first} is a function designator, and whose +@samp{rest} is a list of simple Lisp expressions to be evaluated and +passed to the so-designated function. The result is the result of the +function call. + +@item +A symbol, whose result is its symbol value. + +@item +Anything else evaluates to itself. +@end enumerate + +The result of evaluating the @dfn{simple Lisp expression} should yield +a @emph{designator} for a @emph{list} of @emph{pathname designators}. + +@strong{Note}: in Common Lisp, @code{#p"/foo/bar"} designates the +@emph{bar} file within the @emph{/foo} directory whereas +@code{#p"/foo/bar/"} designates the @emph{/foo/bar} directory. Keep +that in mind when customising the value of +@code{*foreign-library-directories*}. + + +@subheading Examples + +@example +$ ls +@print{} liblibli.so libli.lisp +@end example + +@noindent +In @file{libli.lisp}: + +@lisp +(pushnew #P"/home/sirian/lisp/libli/" *foreign-library-directories* + :test #'equal) + +(load-foreign-library '(:default "liblibli")) +@end lisp + +@noindent +The following example would achieve the same effect: + +@lisp +(pushnew '(merge-pathnames #p"lisp/libli/" (user-homedir-pathname)) + *foreign-library-directories* + :test #'equal) +@result{} ((MERGE-PATHNAMES #P"lisp/libli/" (USER-HOMEDIR-PATHNAME))) + +(load-foreign-library '(:default "liblibli")) +@end lisp + +@subheading See also + +@seealso{*darwin-framework-directories*} @* +@seealso{define-foreign-library} + + +@c =================================================================== +@c LOAD-FOREIGN-LIBRARY + +@page +@node load-foreign-library, load-foreign-library-error, *foreign-library-directories*, Libraries +@heading load-foreign-library +@subheading Syntax +@Function{load-foreign-library library-designator @res{} library} + +@subheading Arguments and Values + +@table @var +@item library-designator +A library designator. + +@item library-designator +An instance of @code{foreign-library}. +@end table + +@subheading Description + +Load the library indicated by @var{library-designator}. A @dfn{library +designator} is defined as follows: + +@enumerate +@item +If a symbol, is considered a name previously defined with +@code{define-foreign-library}. + +@item +If a string or pathname, passed as a namestring directly to the +implementation's foreign library loader. If that fails, search the +directories in @code{*foreign-library-directories*} with +@code{cl:probe-file}; if found, the absolute path is passed to the +implementation's loader. + +@item +If a list, the meaning depends on @code{(first @var{library})}: + +@table @code +@item :framework +The second list element is taken to be a Darwin framework name, which +is then searched in @code{*darwin-framework-directories*}, and loaded +when found. + +@item :or +Each remaining list element, itself a @dfn{library designator}, is loaded in +order, until one succeeds. + +@item :default +The name is transformed according to the platform's naming convention +to shared libraries, and the resultant string is loaded as a @dfn{library +designator}. For example, on @sc{unix}, the name is suffixed with +@file{.so}. +@end table +@end enumerate + +If the library is already loaded it will be reloaded. + +If the load fails, signal a @code{load-foreign-library-error}. + +@strong{Please note:} For system libraries, you should not need to +specify the directory containing the library. Each operating system +has its own idea of a default search path, and you should rely on it +when it is reasonable. + +@subheading Implementation-specific Notes +On ECL platforms where its dynamic FFI is not supported (ie. when +@code{:dffi} is not present in @code{*features*}), +@code{cffi:load-foreign-library} does not work and you must use ECL's +own @code{ffi:load-foreign-library} with a constant string argument. + +@subheading Examples + +@xref{Tutorial-Loading,, Loading foreign libraries}. + +@subheading See Also + +@seealso{close-foreign-library} @* +@seealso{*darwin-framework-directories*} @* +@seealso{define-foreign-library} @* +@seealso{*foreign-library-directories*} @* +@seealso{load-foreign-library-error} @* +@seealso{use-foreign-library} + + +@c =================================================================== +@c LOAD-FOREIGN-LIBRARY-ERROR + +@page +@node load-foreign-library-error, use-foreign-library, load-foreign-library, Libraries +@heading load-foreign-library-error + +@subheading Syntax + +@Condition{load-foreign-library-error} + +@subheading Class precedence list + +@code{load-foreign-library-error}, @code{error}, +@code{serious-condition}, @code{condition}, @code{t} + +@subheading Description + +Signalled when a foreign library load completely fails. The exact +meaning of this varies depending on the real conditions at work, but +almost universally, the implementation's error message is useless. +However, @cffi{} does provide the useful restarts @code{retry} and +@code{use-value}; invoke the @code{retry} restart to try loading the +foreign library again, or the @code{use-value} restart to try loading +a different foreign library designator. + +@subheading See also + +@seealso{load-foreign-library} + + +@c =================================================================== +@c USE-FOREIGN-LIBRARY + +@page +@node use-foreign-library, , load-foreign-library-error, Libraries +@heading use-foreign-library + +@subheading Syntax + +@Macro{use-foreign-library name} + +@subheading Arguments and values + +@table @var +@item name +A library designator; unevaluated. +@end table + + +@subheading Description + +@xref{load-foreign-library}, for the meaning of ``library +designator''. This is intended to be the top-level form used +idiomatically after a @code{define-foreign-library} form to go ahead +and load the library. @c ; it also sets the ``current foreign library''. +Finally, on implementations where the regular evaluation rule is +insufficient for foreign library loading, it loads it at the required +time.@footnote{Namely, @acronym{CMUCL}. See +@code{use-foreign-library} in @file{libraries.lisp} for details.} + +@c current foreign library is a concept created a few hours ago as of +@c this writing. It is not actually used yet, but probably will be. + +@subheading Examples + +@xref{Tutorial-Loading,, Loading foreign libraries}. + + +@subheading See also + +@seealso{load-foreign-library} + + +@c =================================================================== +@c CHAPTER: Callbacks + +@node Callbacks, The Groveller, Libraries, Top +@chapter Callbacks + +@menu +Dictionary + +* callback:: +* defcallback:: +* get-callback:: +@end menu + + +@c =================================================================== +@c CALLBACK + +@page +@node callback, defcallback, Callbacks, Callbacks +@heading callback +@subheading Syntax +@Macro{callback symbol @res{} pointer} + +@subheading Arguments and Values + +@table @var +@item symbol +A symbol denoting a callback. + +@item pointer +@itemx new-value +A pointer. +@end table + +@subheading Description +The @code{callback} macro is analogous to the standard CL special +operator @code{function} and will return a pointer to the callback +denoted by the symbol @var{name}. + +@subheading Examples + +@lisp +CFFI> (defcallback sum :int ((a :int) (b :int)) + (+ a b)) +@result{} SUM +CFFI> (callback sum) +@result{} # +@end lisp + +@subheading See Also +@seealso{get-callback} @* +@seealso{defcallback} + + +@c =================================================================== +@c DEFCALLBACK + +@page +@node defcallback, get-callback, callback, Callbacks +@heading defcallback +@subheading Syntax +@Macro{defcallback name-and-options return-type arguments &body body @res{} name} + +name-and-options ::= name | (name &key convention) +arguments ::= (@{ (arg-name arg-type) @}*) + +@subheading Arguments and Values + +@table @var +@item name +A symbol naming the callback created. + +@item return-type +The foreign type for the callback's return value. + +@item arg-name +A symbol. + +@item arg-type +A foreign type. + +@item convention +One of @code{:cdecl} (default) or @code{:stdcall}. +@end table + +@subheading Description +The @code{defcallback} macro defines a Lisp function that can be called +from C. The arguments passed to this function will be converted to the +appropriate Lisp representation and its return value will be converted +to its C representation. + +This Lisp function can be accessed by the @code{callback} macro or the +@code{get-callback} function. + +@strong{Portability note:} @code{defcallback} will not work correctly +on some Lisps if it's not a top-level form. + +@subheading Examples + +@lisp +(defcfun "qsort" :void + (base :pointer) + (nmemb :int) + (size :int) + (fun-compar :pointer)) + +(defcallback < :int ((a :pointer) (b :pointer)) + (let ((x (mem-ref a :int)) + (y (mem-ref b :int))) + (cond ((> x y) 1) + ((< x y) -1) + (t 0)))) + +CFFI> (with-foreign-object (array :int 10) + ;; @lispcmt{Initialize array.} + (loop for i from 0 and n in '(7 2 10 4 3 5 1 6 9 8) + do (setf (mem-aref array :int i) n)) + ;; @lispcmt{Sort it.} + (qsort array 10 (foreign-type-size :int) (callback <)) + ;; @lispcmt{Return it as a list.} + (loop for i from 0 below 10 + collect (mem-aref array :int i))) +@result{} (1 2 3 4 5 6 7 8 9 10) +@end lisp + +@subheading See Also +@seealso{callback} @* +@seealso{get-callback} + + +@c =================================================================== +@c GET-CALLBACK + +@page +@node get-callback, , defcallback, Callbacks +@heading get-callback +@subheading Syntax +@Accessor{get-callback symbol @res{} pointer} + +@subheading Arguments and Values + +@table @var +@item symbol +A symbol denoting a callback. + +@item pointer +A pointer. +@end table + +@subheading Description +This is the functional version of the @code{callback} macro. It +returns a pointer to the callback named by @var{symbol} suitable, for +example, to pass as arguments to foreign functions. + +@subheading Examples + +@lisp +CFFI> (defcallback sum :int ((a :int) (b :int)) + (+ a b)) +@result{} SUM +CFFI> (get-callback 'sum) +@result{} # +@end lisp + +@subheading See Also +@seealso{callback} @* +@seealso{defcallback} + + +@c =================================================================== +@c CHAPTER: The Groveller + +@node The Groveller, Limitations, Callbacks, Top +@chapter The Groveller + +@cffi{}-Grovel is a tool which makes it easier to write @cffi{} +declarations for libraries that are implemented in C. That is, it +grovels through the system headers, getting information about types +and structures, so you don't have to. This is especially important +for libraries which are implemented in different ways by different +vendors, such as the @sc{unix}/@sc{posix} functions. The @cffi{} +declarations are usually quite different from platform to platform, +but the information you give to @cffi{}-Grovel is the same. Hence, +much less work is required! + +If you use @acronym{ASDF}, @cffi{}-Grovel is integrated, so that it +will run automatically when your system is building. This feature was +inspired by SB-Grovel, a similar @acronym{SBCL}-specific project. +@cffi{}-Grovel can also be used without @acronym{ASDF}. + +@section Building FFIs with CFFI-Grovel + +@cffi{}-Grovel uses a specification file (*.lisp) describing the +features that need groveling. The C compiler is used to retrieve this +data and write a Lisp file (*.cffi.lisp) which contains the necessary +@cffi{} definitions to access the variables, structures, constants, and +enums mentioned in the specification. + +@c This is most similar to the SB-Grovel package, upon which it is +@c based. Unlike SB-Grovel, we do not currently support defining +@c regular foreign functions in the specification file; those are best +@c defined in normal Lisp code. + +@cffi{}-Grovel provides an @acronym{ASDF} component for handling the +necessary calls to the C compiler and resulting file management. + +@c See the included CFFI-Unix package for an example of how to +@c integrate a specification file with ASDF-built packages. + +@menu +* Groveller Syntax:: How grovel files should look like. +* Groveller ASDF Integration:: ASDF components for grovel files. +* Groveller Implementation Notes:: Implementation notes. +* Wrapper for Inline/Static Functions and Macros:: Wrapper +@end menu + +@node Groveller Syntax, Groveller ASDF Integration, The Groveller, The Groveller +@section Specification File Syntax + +The specification files are read by the normal Lisp reader, so they +have syntax very similar to normal Lisp code. In particular, +semicolon-comments and reader-macros will work as expected. + +There are several forms recognized by @cffi{}-Grovel: + +@deffn {Grovel Form} progn &rest forms + +Processes a list of forms. Useful for conditionalizing several +forms. For example: +@end deffn + +@lisp +#+freebsd +(progn + (constant (ev-enable "EV_ENABLE")) + (constant (ev-disable "EV_DISABLE"))) +@end lisp + +@deffn {Grovel Form} include &rest files + +Include the specified files (specified as strings) in the generated C +source code. +@end deffn + +@deffn {Grovel Form} in-package symbol + +Set the package to be used for the final Lisp output. +@end deffn + +@deffn {Grovel Form} ctype lisp-name size-designator + +Define a @cffi{} foreign type for the string in @var{size-designator}, +e.g. @code{(ctype :pid "pid_t")}. +@end deffn + +@deffn {Grovel Form} constant (lisp-name &rest c-names) &key type documentation optional + +Search for the constant named by the first @var{c-name} string found +to be known to the C preprocessor and define it as @var{lisp-name}. + +The @var{type} keyword argument specifies how to grovel the constant: +either @code{integer} (the default) or @code{double-float}. If +@var{optional} is true, no error will be raised if all the +@var{c-names} are unknown. If @var{lisp-name} is a keyword, the actual +constant will be a symbol of the same name interned in the current +package. +@end deffn + +@deffn {Grovel Form} feature lisp-feature-name c-name &key feature-list + +Adds @var{lisp-feature-name} to the list @var{feature-list} if the @var{c-name} +string is known to the C preprocessor. @var{feature-list} defaults +to @code{cl:*features*}. +@end deffn + +@deffn {Grovel Form} define name &optional value + +Defines an additional C preprocessor symbol, which is useful for +altering the behavior of included system headers. +@end deffn + +@deffn {Grovel Form} cc-flags &rest flags + +Adds @var{cc-flags} to the command line arguments used for the C compiler +invocation. +@end deffn + +@deffn {Grovel Form} pkg-config-cflags pkg &key optional + +Adds @var{pkg} to the command line arguments for the external program +@code{pkg-config} and runs it to retrieve the relevant include flags +used for the C compiler invocation. This syntax can be used instead of +hard-coding paths using @code{cc-flags}, and ensures that include +flags are added correctly on the build system. Assumes +@code{pkg-config} is installed and working. @var{pkg} is a string +that identifies an installed @code{pkg-config} package. See the +pkg-config manual for more information. If @var{optional} is true, +failure to execute @code{pkg-config} does @emph{not} abort +compilation. +@end deffn + +@deffn {Grovel Form} cstruct lisp-name c-name slots + +Define a @cffi{} foreign struct with the slot data specfied. Slots +are of the form @code{(lisp-name c-name &key type count (signed t))}. +@end deffn + +@deffn {Grovel Form} cunion lisp-name c-name slots + +Identical to @code{cstruct}, but defines a @cffi{} foreign union. +@end deffn + +@deffn {Grovel Form} cstruct-and-class c-name slots + +Defines a @cffi{} foreign struct, as with @code{cstruct} and defines a +@acronym{CLOS} class to be used with it. This is useful for mapping +foreign structures to application-layer code that shouldn't need to +worry about memory allocation issues. +@end deffn + +@deffn {Grovel Form} cvar namespec type &key read-only + +Defines a foreign variable of the specified type, even if that +variable is potentially a C preprocessor pseudo-variable. e.g. +@code{(cvar ("errno" errno) errno-values)}, assuming that errno-values +is an enum or equivalent to type @code{:int}. + +The @var{namespec} is similar to the one used in @ref{defcvar}. +@end deffn + +@deffn {Grovel Form} cenum name-and-opts &rest elements + +Defines a true C enum, with elements specified as @code{((lisp-name +&rest c-names) &key optional documentation)}. +@var{name-and-opts} can be either a symbol as name, or a list +@code{(name &key base-type define-constants)}. If @var{define-constants} +is non-null, a Lisp constant will be defined for each enum member. +@end deffn + +@deffn {Grovel Form} constantenum name-and-opts &rest elements + +Defines an enumeration of pre-processor constants, with elements +specified as @code{((lisp-name &rest c-names) &key optional +documentation)}. +@var{name-and-opts} can be either a symbol as name, or a list +@code{(name &key base-type define-constants)}. If @var{define-constants} +is non-null, a Lisp constant will be defined for each enum member. + +This example defines @code{:af-inet} to represent the value held by +@code{AF_INET} or @code{PF_INET}, whichever the pre-processor finds +first. Similarly for @code{:af-packet}, but no error will be +signalled if the platform supports neither @code{AF_PACKET} nor +@code{PF_PACKET}. +@end deffn + +@lisp +(constantenum address-family + ((:af-inet "AF_INET" "PF_INET") + :documentation "IPv4 Protocol family") + ((:af-local "AF_UNIX" "AF_LOCAL" "PF_UNIX" "PF_LOCAL") + :documentation "File domain sockets") + ((:af-inet6 "AF_INET6" "PF_INET6") + :documentation "IPv6 Protocol family") + ((:af-packet "AF_PACKET" "PF_PACKET") + :documentation "Raw packet access" + :optional t)) +@end lisp + +@deffn {Grovel Form} bitfield name-and-opts &rest elements + +Defines a bitfield, with elements specified as @code{((lisp-name &rest +c-names) &key optional documentation)}. @var{name-and-opts} can be either a +symbol as name, or a list @code{(name &key base-type)}. For example: +@end deffn + +@lisp +(bitfield flags-ctype + ((:flag-a "FLAG_A") + :documentation "DOCU_A") + ((:flag-b "FLAG_B" "FLAG_B_ALT") + :documentation "DOCU_B") + ((:flag-c "FLAG_C") + :documentation "DOCU_C" + :optional t)) +@end lisp + + +@c =================================================================== +@c SECTION: Groveller ASDF Integration + +@node Groveller ASDF Integration, Groveller Implementation Notes, Groveller Syntax, The Groveller +@section ASDF Integration + +An example software project might contain four files; an +@acronym{ASDF} file, a package definition file, an implementation +file, and a @cffi{}-Grovel specification file. + +The @acronym{ASDF} file defines the system and its dependencies. +Notice the use of @code{eval-when} to ensure @cffi{}-Grovel is present +and the use of @code{(cffi-grovel:grovel-file name &key cc-flags)} +instead of @code{(:file name)}. + +The @file{example-software.asd} file would look like that: + +@lisp +;;; @lispcmt{CFFI-Grovel is needed for processing grovel-file components} +(defsystem "example-software" + :defsystem-depends-on ("cffi-grovel") + :depends-on ("cffi") + :serial t + :components + ((:file "package") + (:cffi-grovel-file "example-grovelling") + (:cffi-wrapper-file "example-wrappers") + (:file "example"))) +@end lisp + +The @file{package.lisp} file would contain one or several +@code{defpackage} forms, to remove circular dependencies and make +building the project easier. Note that you may or may not want to +@code{:use} your internal package. + +@impnote{Note that it's a not a good idea to @code{:use} when names may +clash with, say, CL symbols. +Or you could use @code{uiop:define-package} and its @code{:mix} option.} + +@lisp +(defpackage #:example-internal + (:use) + (:nicknames #:exampleint)) + +(defpackage #:example-software + (:export ...) + (:use #:cl #:cffi #:exampleint)) +@end lisp + +The internal package is created by Lisp code output from the C program +written by @cffi{}-Grovel; if your specification file is +@file{exampleint.lisp}, the @file{exampleint.cffi.lisp} file will contain the +@cffi{} definitions needed by the rest of your project. +@xref{Groveller Syntax}. + +@node Groveller Implementation Notes, Wrapper for Inline/Static Functions and Macros, Groveller ASDF Integration, The Groveller +@section Implementation Notes + +@cffi{}-Grovel will generate many files that not only architecture-specific, +but also implementation-specific, and should not be distributed. +ASDF will generate these files in its output cache; +if you build with multiple architectures (e.g. with NFS/AFS home +directories) or implementations, it is critical for avoiding clashes +to keep this cache in an implementation-dependent directory (as is the +default). + +For @code{foo-internal.lisp}, the resulting @code{foo-internal.c}, +@code{foo-internal}, and @code{foo-internal.cffi.lisp} are all +platform-specific, either because of possible reader-macros in +foo-internal.lisp, or because of varying C environments on the host +system. For this reason, it is not helpful to distribute any of those +files; end users building @cffi{}-Grovel based software will need +@code{cffi}-Grovel anyway. + +@impnote{For now, after some experimentation with @sc{clisp} having no +long-long, it seems appropriate to assert that the generated @code{.c} +files are architecture and operating-system dependent, but +lisp-implementation independent. This way the same @code{.c} file +(and so the same @code{.grovel-tmp.lisp} file) will be shareable +between the implementations running on a given system.} + +@c TODO: document the new wrapper stuff. + +@node Wrapper for Inline/Static Functions and Macros, , Groveller Implementation Notes, The Groveller +@section Wrapper for Inline/Static Functions and Macros + +In a shared library, information in static/inlined functions and +macros are already removed during the compilation. Wrapper file +enables to write an uninlined function wrapping the call to them. + +A wrapper file compilation/loading proceeds as follows: +Unlike groveller which generates C code that emits lisp files +containing cffi definitions, it generates C code, compiles it as a +shared library, loads the library, generate the cffi definitions (as +lisp code) and then loads the lisp code. + +It has asdf integration similar to groveller. + +@lisp +(defsystem "example-software" + :defsystem-depends-on ("cffi-grovel") + :depends-on ("cffi") + :serial t + :components + ((:file "package") + (:cffi-grovel-file "example-grovelling") + (:cffi-wrapper-file "example-wrappers") ;; <<--- this part + (:file "example"))) +@end lisp + +@deffn {Wrapper Form} defwrapper name-and-options return-type &rest args +@end deffn + +@example +static inline int foo(int i) @{ + return 1+i; +@}; +#define bar(i) (1+(i)) +@end example + +@lisp +(in-package :mypackage) +(defwrapper ("foo" foo) :int + (i :int)) +(defwrapper ("bar" bar) :int + (i :int)) +@end lisp + +Other forms are similar to grovel files. + +@deffn {Wrapper Form} progn &rest forms + +Processes a list of forms. Useful for conditionalizing several +forms. For example: +@end deffn + +@lisp +#+freebsd +(progn + (constant (ev-enable "EV_ENABLE")) + (constant (ev-disable "EV_DISABLE"))) +@end lisp + +@deffn {Wrapper Form} include &rest files + +Include the specified files (specified as strings) in the generated C +source code. +@end deffn + +@deffn {Wrapper Form} in-package symbol + +Set the package to be used for the final Lisp output. +@end deffn + +@deffn {Wrapper Form} flags &rest flags + +Adds @var{cc-flags} to the command line arguments used for the C compiler +invocation. +@end deffn + +@deffn {Wrapper Form} proclaim &rest proclaimations +@end deffn +@deffn {Wrapper Form} declaim &rest declaimations +@end deffn + + + +@c =================================================================== +@c CHAPTER: Static Linking + +@node Static Linking, Limitations, The Groveller, Top +@chapter Static Linking + +On recent enough versions of supported implementations (currently, +GNU CLISP 2.49, CMUCL 2015-11, and SBCL 1.2.17), and with a recent +enough ASDF (3.1.2 or later), you can create a statically linked +Lisp executable image that includes all the C extensions +(wrappers and any other objects output by @code{compile-op}) +as well as your Lisp code --- or a standalone application executable. +This makes it easier to deliver your code as a single file. + +To dump a statically linked executable image, use: + +@lisp +(asdf:load-system :cffi-grovel) +(asdf:operate :static-image-op :example-software) +@end lisp + +To dump a statically linked executable standalone application, use: + +@lisp +(asdf:load-system :cffi-grovel) +(asdf:operate :static-program-op :example-software) +@end lisp + +See @uref{https://common-lisp.net/project/asdf/,,the ASDF +manual} for documentation about @code{image-op} and @code{program-op} +which are the parent operation classes that behave similarly except +they don't statically link C code. + +@impnote{There is also an operation @code{:static-runtime-op} to create the +statically linked runtime alone, but it's admittedly not very useful +except as an intermediate step dependency towards building +@code{:static-image-op} or @code{:static-program-op}.} + + + +@c =================================================================== +@c CHAPTER: Limitations + +@node Limitations, Platform-specific features, The Groveller, Top +@chapter Limitations + +These are @cffi{}'s limitations across all platforms; for information +on the warts on particular Lisp implementations, see +@ref{Implementation Support}. + +@itemize @bullet +@item +The tutorial includes a treatment of the primary, intractable +limitation of @cffi{}, or any @acronym{FFI}: that the abstractions +commonly used by C are insufficiently expressive. +@xref{Tutorial-Abstraction,, Breaking the abstraction}, for more +details. + +@end itemize + + +@node Platform-specific features, Glossary, Limitations, Top +@appendix Platform-specific features + +Whenever a backend doesn't support one of @cffi{}'s features, a +specific symbol is pushed onto @code{common-lisp:*features*}. The +meanings of these symbols follow. + +@table @var +@item cffi-sys::flat-namespace +This Lisp has a flat namespace for foreign symbols meaning that you +won't be able to load two different libraries with homograph functions +and successfully differentiate them through the @code{:library} +option to @code{defcfun}, @code{defcvar}, etc@dots{} + +@item cffi-sys::no-foreign-funcall +The macro @code{foreign-funcall} is @strong{not} available. On such +platforms, the only way to call a foreign function is through +@code{defcfun}. @xref{foreign-funcall}, and @ref{defcfun}. + +@item cffi-sys::no-long-long +The C @code{long long} type is @strong{not} available as a foreign +type. + +However, on such platforms @cffi{} provides its own implementation of +the @code{long long} type for all of operations in chapters +@ref{Foreign Types}, @ref{Pointers} and @ref{Variables}. The +functionality described in @ref{Functions} and @ref{Callbacks} will +not be available. + +32-bit Lispworks 5.0+ is an exception. In addition to the @cffi{} +implementation described above, Lispworks itself implements the +@code{long long} type for @ref{Functions}. @ref{Callbacks} are still +missing @code{long long} support, though. + +@item cffi-sys::no-stdcall +This Lisp doesn't support the @code{stdcall} calling convention. Note +that it only makes sense to support @code{stdcall} on (32-bit) x86 +platforms. + +@end table + + +@node Glossary, Comprehensive Index, Platform-specific features, Top +@appendix Glossary + +@table @dfn +@item aggregate type +A @cffi{} type for C data defined as an organization of data of simple +type; in structures and unions, which are themselves aggregate types, +they are represented by value. + +@item foreign value +This has two meanings; in any context, only one makes sense. + +When using type translators, the foreign value is the lower-level Lisp +value derived from the object passed to @code{translate-to-foreign} +(@pxref{translate-to-foreign}). This value should be a Lisp number or +a pointer (satisfies @code{pointerp}), and it can be treated like any +general Lisp object; it only completes the transformation to a true +foreign value when passed through low-level code in the Lisp +implementation, such as the foreign function caller or indirect memory +addressing combined with a data move. + +In other contexts, this refers to a value accessible by C, but which +may only be accessed through @cffi{} functions. The closest you can +get to such a foreign value is through a pointer Lisp object, which +itself counts as a foreign value in only the previous sense. + +@item simple type +A @cffi{} type that is ultimately represented as a builtin type; +@cffi{} only provides extra semantics for Lisp that are invisible to C +code or data. +@end table + +@node Comprehensive Index, , Glossary, Top +@unnumbered Index +@printindex cp + +@bye diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/doc/cffi-sys-spec.texinfo b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/doc/cffi-sys-spec.texinfo new file mode 100644 index 0000000..e3ebf5c --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/doc/cffi-sys-spec.texinfo @@ -0,0 +1,334 @@ +\input texinfo @c -*-texinfo-*- +@c %**start of header +@setfilename cffi-sys.info +@settitle CFFI-SYS Interface Specification + +@c Show types in the same index as the functions. +@synindex tp fn + +@copying +Copyright @copyright{} 2005-2006, James Bielman + +@quotation +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the ``Software''), to deal in the Software without +restriction, including without limitation the rights to use, copy, +modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +@sc{The software is provided ``as is'', without warranty of any kind, +express or implied, including but not limited to the warranties of +merchantability, fitness for a particular purpose and +noninfringement. In no event shall the authors or copyright +holders be liable for any claim, damages or other liability, +whether in an action of contract, tort or otherwise, arising from, +out of or in connection with the software or the use or other +dealings in the software.} +@end quotation +@end copying + +@macro impnote {text} +@emph{Implementor's note: \text\} +@end macro +@c %**end of header + +@dircategory Software development +@direntry +* CFFI Sys spec: (cffi-sys-spec). CFFI Sys spec. +@end direntry + +@titlepage +@title CFFI-SYS Interface Specification +@c @subtitle Version X.X +@c @author James Bielman + +@page +@vskip 0pt plus 1filll +@insertcopying +@end titlepage + +@contents + +@ifnottex +@node Top +@top cffi-sys +@insertcopying +@end ifnottex + +@menu +* Introduction:: +* Built-In Foreign Types:: +* Operations on Foreign Types:: +* Basic Pointer Operations:: +* Foreign Memory Allocation:: +* Memory Access:: +* Foreign Function Calling:: +* Loading Foreign Libraries:: +* Foreign Globals:: +* Symbol Index:: +@end menu + +@node Introduction +@chapter Introduction + +@acronym{CFFI}, the Common Foreign Function Interface, purports to be +a portable foreign function interface for Common Lisp. + +This specification defines a set of low-level primitives that must be +defined for each Lisp implementation supported by @acronym{CFFI}. +These operators are defined in the @code{CFFI-SYS} package. + +The @code{CFFI} package uses the @code{CFFI-SYS} interface +to implement an extensible foreign type system with support for +typedefs, structures, and unions, a declarative interface for +defining foreign function calls, and automatic conversion of +foreign function arguments to/from Lisp types. + +Please note the following conventions that apply to everything in +@code{CFFI-SYS}: + +@itemize @bullet +@item +Functions in @code{CFFI-SYS} that are low-level versions of functions +exported from the @code{CFFI} package begin with a leading +percent-sign (eg. @code{%mem-ref}). + +@item +Where ``foreign type'' is mentioned as the kind of an argument, the +meaning is restricted to that subset of all foreign types defined in +@ref{Built-In Foreign Types}. Support for higher-level types is +always defined in terms of those lower-level types in @code{CFFI} +proper. +@end itemize + + +@node Built-In Foreign Types +@chapter Built-In Foreign Types + +@deftp {Foreign Type} :char +@deftpx {Foreign Type} :unsigned-char +@deftpx {Foreign Type} :short +@deftpx {Foreign Type} :unsigned-short +@deftpx {Foreign Type} :int +@deftpx {Foreign Type} :unsigned-int +@deftpx {Foreign Type} :long +@deftpx {Foreign Type} :unsigned-long +@deftpx {Foreign Type} :long-long +@deftpx {Foreign Type} :unsigned-long-long +These types correspond to the native C integer types according to the +ABI of the system the Lisp implementation is compiled against. +@end deftp + +@deftp {Foreign Type} :int8 +@deftpx {Foreign Type} :uint8 +@deftpx {Foreign Type} :int16 +@deftpx {Foreign Type} :uint16 +@deftpx {Foreign Type} :int32 +@deftpx {Foreign Type} :uint32 +@deftpx {Foreign Type} :int64 +@deftpx {Foreign Type} :uint64 +Foreign integer types of specific sizes, corresponding to the C types +defined in @code{stdint.h}. +@end deftp + +@deftp {Foreign Type} :size +@deftpx {Foreign Type} :ssize +@deftpx {Foreign Type} :ptrdiff +@deftpx {Foreign Type} :time +Foreign integer types corresponding to the standard C types (without +the @code{_t} suffix). +@end deftp + +@impnote{I'm sure there are more of these that could be useful, let's +add any types that can't be defined portably to this list as +necessary.} + +@deftp {Foreign Type} :float +@deftpx {Foreign Type} :double +The @code{:float} type represents a C @code{float} and a Lisp +@code{single-float}. @code{:double} represents a C @code{double} and a +Lisp @code{double-float}. +@end deftp + +@deftp {Foreign Type} :pointer +A foreign pointer to an object of any type, corresponding to +@code{void *}. +@end deftp + +@deftp {Foreign Type} :void +No type at all. Only valid as the return type of a function. +@end deftp + + +@node Operations on Foreign Types +@chapter Operations on Built-in Foreign Types + +@defun %foreign-type-size type @result{} size +Return the @var{size}, in bytes, of objects having foreign type +@var{type}. An error is signalled if @var{type} is not a known +built-in foreign type. +@end defun + +@defun %foreign-type-alignment type @result{} alignment +Return the default alignment in bytes for structure members of foreign +type @var{type}. An error is signalled if @var{type} is not a known +built-in foreign type. + +@impnote{Maybe this should take an optional keyword argument specifying an +alternate alignment system, eg. :mac68k for 68000-compatible alignment +on Darwin.} +@end defun + + +@node Basic Pointer Operations +@chapter Basic Pointer Operations + +@defun pointerp ptr @result{} boolean +Return true if @var{ptr} is a foreign pointer. +@end defun + +@defun null-pointer @result{} pointer +Return a null foreign pointer. +@end defun + +@defun null-pointer-p ptr @result{} boolean +Return true if @var{ptr} is a null foreign pointer. +@end defun + +@defun make-pointer address @result{} pointer +Return a pointer corresponding to the numeric integer @var{address}. +@end defun + +@defun inc-pointer ptr offset @result{} pointer +Return the result of numerically incrementing @var{ptr} by @var{offset}. +@end defun + + +@node Foreign Memory Allocation +@chapter Foreign Memory Allocation + +@defun foreign-alloc size @result{} pointer +Allocate @var{size} bytes of foreign-addressable memory and return +a @var{pointer} to the allocated block. An implementation-specific +error is signalled if the memory cannot be allocated. +@end defun + +@defun foreign-free ptr @result{} unspecified +Free a pointer @var{ptr} allocated by @code{foreign-alloc}. The +results are undefined if @var{ptr} is used after being freed. +@end defun + +@defmac with-foreign-pointer (var size &optional size-var) &body body +Bind @var{var} to a pointer to @var{size} bytes of +foreign-accessible memory during @var{body}. Both @var{ptr} and the +memory block it points to have dynamic extent and may be stack +allocated if supported by the implementation. If @var{size-var} is +supplied, it will be bound to @var{size} during @var{body}. +@end defmac + + +@node Memory Access +@chapter Memory Access + +@deffn {Accessor} %mem-ref ptr type &optional offset +Dereference a pointer @var{offset} bytes from @var{ptr} to an object +for reading (or writing when used with @code{setf}) of built-in type +@var{type}. +@end deffn + +@heading Example + +@lisp +;; An impractical example, since time returns the time as well, +;; but it demonstrates %MEM-REF. Better (simple) examples wanted! +(with-foreign-pointer (p (foreign-type-size :time)) + (foreign-funcall "time" :pointer p :time) + (%mem-ref p :time)) +@end lisp + + +@node Foreign Function Calling +@chapter Foreign Function Calling + +@defmac %foreign-funcall name @{arg-type arg@}* &optional result-type @result{} object +@defmacx %foreign-funcall-pointer ptr @{arg-type arg@}* &optional result-type @result{} object +Invoke a foreign function called @var{name} in the foreign source code. + +Each @var{arg-type} is a foreign type specifier, followed by +@var{arg}, Lisp data to be converted to foreign data of type +@var{arg-type}. @var{result-type} is the foreign type of the +function's return value, and is assumed to be @code{:void} if not +supplied. + +@code{%foreign-funcall-pointer} takes a pointer @var{ptr} to the +function, as returned by @code{foreign-symbol-pointer}, rather than a +string @var{name}. +@end defmac + +@defmac %foreign-funcall-varargs name (@{fixed-type arg@}*) @{vararg-type arg@}* &optional result-type @result{} object +@defmacx %foreign-funcall-varargs-pointer ptr (@{fixed-type arg@}*) @{vararg-type arg@}* &optional result-type @result{} object +Invoke a foreign variadic function called @var{name} in the foreign +source code. + +Each @var{fixed-type} and @var{vararg-type} is a foreign type +specifier, followed by @var{arg}, Lisp data to be converted to foreign +data of type @var{arg-type}. @var{result-type} is the foreign type of +the function's return value, and is assumed to be @code{:void} if not +supplied. + +@code{%foreign-funcall-pointer-varargs} takes a pointer @var{ptr} to +the variadic function, as returned by @code{foreign-symbol-pointer}, +rather than a string @var{name}. + +Both functions have default implementation which call +@code{%foreign-funcall} and @code{%foreign-funcall-pointer} +approprietly. +@end defmac + +@heading Examples + +@lisp +;; Calling a standard C library function: +(%foreign-funcall "sqrtf" :float 16.0 :float) @result{} 4.0 +@end lisp + +@lisp +;; Dynamic allocation of a buffer and passing to a function: +(with-foreign-ptr (buf 255 buf-size) + (%foreign-funcall "gethostname" :pointer buf :size buf-size :int) + ;; Convert buf to a Lisp string using MAKE-STRING and %MEM-REF or + ;; a portable CFFI function such as CFFI:FOREIGN-STRING-TO-LISP. + ) +@end lisp + + +@node Loading Foreign Libraries +@chapter Loading Foreign Libraries + +@defun %load-foreign-library name @result{} unspecified +Load the foreign shared library @var{name}. + +@impnote{There is a lot of behavior to decide here. Currently I lean +toward not requiring NAME to be a full path to the library so +we can search the system library directories (maybe even get +LD_LIBRARY_PATH from the environment) as necessary.} +@end defun + + +@node Foreign Globals +@chapter Foreign Globals + +@defun foreign-symbol-pointer name @result{} pointer +Return a pointer to a foreign symbol @var{name}. +@end defun + +@node Symbol Index +@unnumbered Symbol Index +@printindex fn + +@bye diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/doc/colorize-lisp-examples.lisp b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/doc/colorize-lisp-examples.lisp new file mode 100644 index 0000000..3f37e43 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/doc/colorize-lisp-examples.lisp @@ -0,0 +1,1058 @@ +;;; This is code was taken from lisppaste2 and is a quick hack +;;; to colorize lisp examples in the html generated by Texinfo. +;;; It is not general-purpose utility, though it could easily be +;;; turned into one. + +;;;; colorize-package.lisp + +(defpackage :colorize + (:use :common-lisp) + (:export :scan-string :format-scan :html-colorization + :find-coloring-type :autodetect-coloring-type + :coloring-types :scan :scan-any :advance :call-parent-formatter + :*coloring-css* :make-background-css :*css-background-class* + :colorize-file :colorize-file-to-stream :*version-token*)) + +;;;; coloring-css.lisp + +(in-package :colorize) + +(defparameter *coloring-css* + ".symbol { color: #770055; background-color: transparent; border: 0px; margin: 0px;} +a.symbol:link { color: #229955; background-color : transparent; text-decoration: none; border: 0px; margin: 0px; } +a.symbol:active { color : #229955; background-color : transparent; text-decoration: none; border: 0px; margin: 0px; } +a.symbol:visited { color : #229955; background-color : transparent; text-decoration: none; border: 0px; margin: 0px; } +a.symbol:hover { color : #229955; background-color : transparent; text-decoration: none; border: 0px; margin: 0px; } +.special { color : #FF5000; background-color : inherit; } +.keyword { color : #770000; background-color : inherit; } +.comment { color : #007777; background-color : inherit; } +.string { color : #777777; background-color : inherit; } +.character { color : #0055AA; background-color : inherit; } +.syntaxerror { color : #FF0000; background-color : inherit; } +span.paren1:hover { color : inherit; background-color : #BAFFFF; } +span.paren2:hover { color : inherit; background-color : #FFCACA; } +span.paren3:hover { color : inherit; background-color : #FFFFBA; } +span.paren4:hover { color : inherit; background-color : #CACAFF; } +span.paren5:hover { color : inherit; background-color : #CAFFCA; } +span.paren6:hover { color : inherit; background-color : #FFBAFF; } +") + +(defvar *css-background-class* "lisp-bg") + +(defun for-css (thing) + (if (symbolp thing) (string-downcase (symbol-name thing)) + thing)) + +(defun make-background-css (color &key (class *css-background-class*) (extra nil)) + (format nil ".~A { background-color: ~A; color: black; ~{~A; ~}}~:*~:*~:* +.~A:hover { background-color: ~A; color: black; ~{~A; ~}}~%" + class color + (mapcar #'(lambda (extra) + (format nil "~A : ~{~A ~}" + (for-css (first extra)) + (mapcar #'for-css (cdr extra)))) + extra))) + +;;;; colorize.lisp + +;(in-package :colorize) + +(eval-when (:compile-toplevel :load-toplevel :execute) + (defparameter *coloring-types* nil) + (defparameter *version-token* (gensym))) + +(defclass coloring-type () + ((modes :initarg :modes :accessor coloring-type-modes) + (default-mode :initarg :default-mode :accessor coloring-type-default-mode) + (transition-functions :initarg :transition-functions :accessor coloring-type-transition-functions) + (fancy-name :initarg :fancy-name :accessor coloring-type-fancy-name) + (term-formatter :initarg :term-formatter :accessor coloring-type-term-formatter) + (formatter-initial-values :initarg :formatter-initial-values :accessor coloring-type-formatter-initial-values :initform nil) + (formatter-after-hook :initarg :formatter-after-hook :accessor coloring-type-formatter-after-hook :initform (constantly "")) + (autodetect-function :initarg :autodetect-function :accessor coloring-type-autodetect-function + :initform (constantly nil)) + (parent-type :initarg :parent-type :accessor coloring-type-parent-type + :initform nil) + (visible :initarg :visible :accessor coloring-type-visible + :initform t))) + +(defun find-coloring-type (type) + (if (typep type 'coloring-type) + type + (cdr (assoc (symbol-name type) *coloring-types* :test #'string-equal :key #'symbol-name)))) + +(defun autodetect-coloring-type (name) + (car + (find name *coloring-types* + :key #'cdr + :test #'(lambda (name type) + (and (coloring-type-visible type) + (funcall (coloring-type-autodetect-function type) name)))))) + +(defun coloring-types () + (loop for type-pair in *coloring-types* + if (coloring-type-visible (cdr type-pair)) + collect (cons (car type-pair) + (coloring-type-fancy-name (cdr type-pair))))) + +(defun (setf find-coloring-type) (new-value type) + (if new-value + (let ((found (assoc type *coloring-types*))) + (if found + (setf (cdr found) new-value) + (setf *coloring-types* + (nconc *coloring-types* + (list (cons type new-value)))))) + (setf *coloring-types* (remove type *coloring-types* :key #'car)))) + +(defvar *scan-calls* 0) + +(defvar *reset-position* nil) + +(defmacro with-gensyms ((&rest names) &body body) + `(let ,(mapcar #'(lambda (name) + (list name `(make-symbol ,(symbol-name name)))) names) + ,@body)) + +(defmacro with-scanning-functions (string-param position-place mode-place mode-wait-place &body body) + (with-gensyms (num items position not-preceded-by string item new-mode until advancing) + `(labels ((advance (,num) + (setf ,position-place (+ ,position-place ,num)) + t) + (peek-any (,items &key ,not-preceded-by) + (incf *scan-calls*) + (let* ((,items (if (stringp ,items) + (coerce ,items 'list) ,items)) + (,not-preceded-by (if (characterp ,not-preceded-by) + (string ,not-preceded-by) ,not-preceded-by)) + (,position ,position-place) + (,string ,string-param)) + (let ((,item (and + (< ,position (length ,string)) + (find ,string ,items + :test #'(lambda (,string ,item) + #+nil + (format t "looking for ~S in ~S starting at ~S~%" + ,item ,string ,position) + (if (characterp ,item) + (char= (elt ,string ,position) + ,item) + (search ,item ,string :start2 ,position + :end2 (min (length ,string) + (+ ,position (length ,item)))))))))) + (if (characterp ,item) + (setf ,item (string ,item))) + (if + (if ,item + (if ,not-preceded-by + (if (>= (- ,position (length ,not-preceded-by)) 0) + (not (string= (subseq ,string + (- ,position (length ,not-preceded-by)) + ,position) + ,not-preceded-by)) + t) + t) + nil) + ,item + (progn + (and *reset-position* + (setf ,position-place *reset-position*)) + nil))))) + (scan-any (,items &key ,not-preceded-by) + (let ((,item (peek-any ,items :not-preceded-by ,not-preceded-by))) + (and ,item (advance (length ,item))))) + (peek (,item &key ,not-preceded-by) + (peek-any (list ,item) :not-preceded-by ,not-preceded-by)) + (scan (,item &key ,not-preceded-by) + (scan-any (list ,item) :not-preceded-by ,not-preceded-by))) + (macrolet ((set-mode (,new-mode &key ,until (,advancing t)) + (list 'progn + (list 'setf ',mode-place ,new-mode) + (list 'setf ',mode-wait-place + (list 'lambda (list ',position) + (list 'let (list (list '*reset-position* ',position)) + (list 'values ,until ,advancing))))))) + ,@body)))) + +(defvar *formatter-local-variables*) + +(defmacro define-coloring-type (name fancy-name &key modes default-mode transitions formatters + autodetect parent formatter-variables (formatter-after-hook '(constantly "")) + invisible) + (with-gensyms (parent-type term type string current-mode position position-foobage mode-wait new-position advance) + `(let ((,parent-type (or (find-coloring-type ,parent) + (and ,parent + (error "No such coloring type: ~S" ,parent))))) + (setf (find-coloring-type ,name) + (make-instance 'coloring-type + :fancy-name ',fancy-name + :modes (append ',modes (if ,parent-type (coloring-type-modes ,parent-type))) + :default-mode (or ',default-mode + (if ,parent-type (coloring-type-default-mode ,parent-type))) + ,@(if autodetect + `(:autodetect-function ,autodetect)) + :parent-type ,parent-type + :visible (not ,invisible) + :formatter-initial-values (lambda nil + (list* ,@(mapcar #'(lambda (e) + `(cons ',(car e) ,(second e))) + formatter-variables) + (if ,parent-type + (funcall (coloring-type-formatter-initial-values ,parent-type)) + nil))) + :formatter-after-hook (lambda nil + (symbol-macrolet ,(mapcar #'(lambda (e) + `(,(car e) (cdr (assoc ',(car e) *formatter-local-variables*)))) + formatter-variables) + (concatenate 'string + (funcall ,formatter-after-hook) + (if ,parent-type + (funcall (coloring-type-formatter-after-hook ,parent-type)) + "")))) + :term-formatter + (symbol-macrolet ,(mapcar #'(lambda (e) + `(,(car e) (cdr (assoc ',(car e) *formatter-local-variables*)))) + formatter-variables) + (lambda (,term) + (labels ((call-parent-formatter (&optional (,type (car ,term)) + (,string (cdr ,term))) + (if ,parent-type + (funcall (coloring-type-term-formatter ,parent-type) + (cons ,type ,string)))) + (call-formatter (&optional (,type (car ,term)) + (,string (cdr ,term))) + (funcall + (case (first ,type) + ,@formatters + (t (lambda (,type text) + (call-parent-formatter ,type text)))) + ,type ,string))) + (call-formatter)))) + :transition-functions + (list + ,@(loop for transition in transitions + collect (destructuring-bind (mode &rest table) transition + `(cons ',mode + (lambda (,current-mode ,string ,position) + (let ((,mode-wait (constantly nil)) + (,position-foobage ,position)) + (with-scanning-functions ,string ,position-foobage + ,current-mode ,mode-wait + (let ((*reset-position* ,position)) + (cond ,@table)) + (values ,position-foobage ,current-mode + (lambda (,new-position) + (setf ,position-foobage ,new-position) + (let ((,advance (nth-value 1 (funcall ,mode-wait ,position-foobage)))) + (values ,position-foobage ,advance))))) + ))))))))))) + +(defun full-transition-table (coloring-type-object) + (let ((parent (coloring-type-parent-type coloring-type-object))) + (if parent + (append (coloring-type-transition-functions coloring-type-object) + (full-transition-table parent)) + (coloring-type-transition-functions coloring-type-object)))) + +(defun scan-string (coloring-type string) + (let* ((coloring-type-object (or (find-coloring-type coloring-type) + (error "No such coloring type: ~S" coloring-type))) + (transitions (full-transition-table coloring-type-object)) + (result nil) + (low-bound 0) + (current-mode (coloring-type-default-mode coloring-type-object)) + (mode-stack nil) + (current-wait (constantly nil)) + (wait-stack nil) + (current-position 0) + (*scan-calls* 0)) + (flet ((finish-current (new-position new-mode new-wait &key (extend t) push pop) + (let ((to (if extend new-position current-position))) + (if (> to low-bound) + (setf result (nconc result + (list (cons (cons current-mode mode-stack) + (subseq string low-bound + to)))))) + (setf low-bound to) + (when pop + (pop mode-stack) + (pop wait-stack)) + (when push + (push current-mode mode-stack) + (push current-wait wait-stack)) + (setf current-mode new-mode + current-position new-position + current-wait new-wait)))) + (loop + (if (> current-position (length string)) + (return-from scan-string + (progn + (format *trace-output* "Scan was called ~S times.~%" + *scan-calls*) + (finish-current (length string) nil (constantly nil)) + result)) + (or + (loop for transition in + (mapcar #'cdr + (remove current-mode transitions + :key #'car + :test-not #'(lambda (a b) + (or (eql a b) + (if (listp b) + (member a b)))))) + if + (and transition + (multiple-value-bind + (new-position new-mode new-wait) + (funcall transition current-mode string current-position) + (when (> new-position current-position) + (finish-current new-position new-mode new-wait :extend nil :push t) + t))) + return t) + (multiple-value-bind + (pos advance) + (funcall current-wait current-position) + #+nil + (format t "current-wait returns ~S ~S (mode is ~S, pos is ~S)~%" pos advance current-mode current-position) + (and pos + (when (> pos current-position) + (finish-current (if advance + pos + current-position) + (car mode-stack) + (car wait-stack) + :extend advance + :pop t) + t))) + (progn + (incf current-position))) + ))))) + +(defun format-scan (coloring-type scan) + (let* ((coloring-type-object (or (find-coloring-type coloring-type) + (error "No such coloring type: ~S" coloring-type))) + (color-formatter (coloring-type-term-formatter coloring-type-object)) + (*formatter-local-variables* (funcall (coloring-type-formatter-initial-values coloring-type-object)))) + (format nil "~{~A~}~A" + (mapcar color-formatter scan) + (funcall (coloring-type-formatter-after-hook coloring-type-object))))) + +(defun encode-for-pre (string) + (declare (simple-string string)) + (let ((output (make-array (truncate (length string) 2/3) + :element-type 'character + :adjustable t + :fill-pointer 0))) + (with-output-to-string (out output) + (loop for char across string + do (case char + ((#\&) (write-string "&" out)) + ((#\<) (write-string "<" out)) + ((#\>) (write-string ">" out)) + ((#\") (write-string """ out)) + ((#\RIGHTWARDS_DOUBLE_ARROW) (write-string "⇒" out)) + (t (write-char char out))))) + (coerce output 'simple-string))) + +(defun string-substitute (string substring replacement-string) + "String substitute by Larry Hunter. Obtained from Google" + (let ((substring-length (length substring)) + (last-end 0) + (new-string "")) + (do ((next-start + (search substring string) + (search substring string :start2 last-end))) + ((null next-start) + (concatenate 'string new-string (subseq string last-end))) + (setq new-string + (concatenate 'string + new-string + (subseq string last-end next-start) + replacement-string)) + (setq last-end (+ next-start substring-length))))) + +(defun decode-from-tt (string) + (string-substitute + (string-substitute + (string-substitute + (string-substitute + (string-substitute string "&" "&") + "<" "<") + ">" ">") + "⇒" (string #\RIGHTWARDS_DOUBLE_ARROW)) + """ "\"")) + +(defun html-colorization (coloring-type string) + (format-scan coloring-type + (mapcar #'(lambda (p) + (cons (car p) + (let ((tt (encode-for-pre (cdr p)))) + (if (and (> (length tt) 0) + (char= (elt tt (1- (length tt))) #\>)) + (format nil "~A~%" tt) tt)))) + (scan-string coloring-type string)))) + +(defun colorize-file-to-stream (coloring-type input-file-name s2 &key (wrap t) (css-background "default")) + (let* ((input-file (if (pathname-type (merge-pathnames input-file-name)) + (merge-pathnames input-file-name) + (make-pathname :type "lisp" + :defaults (merge-pathnames input-file-name)))) + (*css-background-class* css-background)) + (with-open-file (s input-file :direction :input) + (let ((lines nil) + (string nil)) + (block done + (loop (let ((line (read-line s nil nil))) + (if line + (push line lines) + (return-from done))))) + (setf string (format nil "~{~A~%~}" + (nreverse lines))) + (if wrap + (format s2 + " + +
+~A +
" + *coloring-css* + (make-background-css "white") + *css-background-class* + (html-colorization coloring-type string)) + (write-string (html-colorization coloring-type string) s2)))))) + +(defun colorize-file (coloring-type input-file-name &optional output-file-name) + (let* ((input-file (if (pathname-type (merge-pathnames input-file-name)) + (merge-pathnames input-file-name) + (make-pathname :type "lisp" + :defaults (merge-pathnames input-file-name)))) + (output-file (or output-file-name + (make-pathname :type "html" + :defaults input-file)))) + (with-open-file (s2 output-file :direction :output :if-exists :supersede) + (colorize-file-to-stream coloring-type input-file-name s2)))) + +;; coloring-types.lisp + +;(in-package :colorize) + +(eval-when (:compile-toplevel :load-toplevel :execute) + (defparameter *version-token* (gensym))) + +(defparameter *symbol-characters* + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ*!%$&+-1234567890") + +(defparameter *non-constituent* + '(#\space #\tab #\newline #\linefeed #\page #\return + #\" #\' #\( #\) #\, #\; #\` #\[ #\])) + +(defparameter *special-forms* + '("let" "load-time-value" "quote" "macrolet" "progn" "progv" "go" "flet" "the" + "if" "throw" "eval-when" "multiple-value-prog1" "unwind-protect" "let*" + "labels" "function" "symbol-macrolet" "block" "tagbody" "catch" "locally" + "return-from" "setq" "multiple-value-call")) + +(defparameter *common-macros* + '("loop" "cond" "lambda")) + +(defparameter *open-parens* '(#\()) +(defparameter *close-parens* '(#\))) + +(define-coloring-type :lisp "Basic Lisp" + :modes (:first-char-on-line :normal :symbol :escaped-symbol :keyword :string :comment + :multiline :character + :single-escaped :in-list :syntax-error) + :default-mode :first-char-on-line + :transitions + (((:in-list) + ((or + (scan-any *symbol-characters*) + (and (scan #\.) (scan-any *symbol-characters*)) + (and (scan #\\) (advance 1))) + (set-mode :symbol + :until (scan-any *non-constituent*) + :advancing nil)) + ((or (scan #\:) (scan "#:")) + (set-mode :keyword + :until (scan-any *non-constituent*) + :advancing nil)) + ((scan "#\\") + (let ((count 0)) + (set-mode :character + :until (progn + (incf count) + (if (> count 1) + (scan-any *non-constituent*))) + :advancing nil))) + ((scan #\") + (set-mode :string + :until (scan #\"))) + ((scan #\;) + (set-mode :comment + :until (scan #\newline))) + ((scan "#|") + (set-mode :multiline + :until (scan "|#"))) + ((scan #\() + (set-mode :in-list + :until (scan #\))))) + ((:normal :first-char-on-line) + ((scan #\() + (set-mode :in-list + :until (scan #\))))) + (:first-char-on-line + ((scan #\;) + (set-mode :comment + :until (scan #\newline))) + ((scan "#|") + (set-mode :multiline + :until (scan "|#"))) + ((advance 1) + (set-mode :normal + :until (scan #\newline)))) + (:multiline + ((scan "#|") + (set-mode :multiline + :until (scan "|#")))) + ((:symbol :keyword :escaped-symbol :string) + ((scan #\\) + (let ((count 0)) + (set-mode :single-escaped + :until (progn + (incf count) + (if (< count 2) + (advance 1)))))))) + :formatter-variables ((paren-counter 0)) + :formatter-after-hook (lambda nil + (format nil "~{~A~}" + (loop for i from paren-counter downto 1 + collect ""))) + :formatters + (((:normal :first-char-on-line) + (lambda (type s) + (declare (ignore type)) + s)) + ((:in-list) + (lambda (type s) + (declare (ignore type)) + (labels ((color-parens (s) + (let ((paren-pos (find-if-not #'null + (mapcar #'(lambda (c) + (position c s)) + (append *open-parens* + *close-parens*))))) + (if paren-pos + (let ((before-paren (subseq s 0 paren-pos)) + (after-paren (subseq s (1+ paren-pos))) + (paren (elt s paren-pos)) + (open nil) + (count 0)) + (when (member paren *open-parens* :test #'char=) + (setf count (mod paren-counter 6)) + (incf paren-counter) + (setf open t)) + (when (member paren *close-parens* :test #'char=) + (decf paren-counter)) + (if open + (format nil "~A~C~A" + before-paren + (1+ count) + paren *css-background-class* + (color-parens after-paren)) + (format nil "~A~C~A" + before-paren + paren (color-parens after-paren)))) + s)))) + (color-parens s)))) + ((:symbol :escaped-symbol) + (lambda (type s) + (declare (ignore type)) + (let* ((colon (position #\: s :from-end t)) + (new-s (or (and colon (subseq s (1+ colon))) s))) + (cond + ((or + (member new-s *common-macros* :test #'string-equal) + (member new-s *special-forms* :test #'string-equal) + (some #'(lambda (e) + (and (> (length new-s) (length e)) + (string-equal e (subseq new-s 0 (length e))))) + '("WITH-" "DEF"))) + (format nil "~A" s)) + ((and (> (length new-s) 2) + (char= (elt new-s 0) #\*) + (char= (elt new-s (1- (length new-s))) #\*)) + (format nil "~A" s)) + (t s))))) + (:keyword (lambda (type s) + (declare (ignore type)) + (format nil "~A" + s))) + ((:comment :multiline) + (lambda (type s) + (declare (ignore type)) + (format nil "~A" + s))) + ((:character) + (lambda (type s) + (declare (ignore type)) + (format nil "~A" + s))) + ((:string) + (lambda (type s) + (declare (ignore type)) + (format nil "~A" + s))) + ((:single-escaped) + (lambda (type s) + (call-formatter (cdr type) s))) + ((:syntax-error) + (lambda (type s) + (declare (ignore type)) + (format nil "~A" + s))))) + +(define-coloring-type :scheme "Scheme" + :autodetect (lambda (text) + (or + (search "scheme" text :test #'char-equal) + (search "chicken" text :test #'char-equal))) + :parent :lisp + :transitions + (((:normal :in-list) + ((scan "...") + (set-mode :symbol + :until (scan-any *non-constituent*) + :advancing nil)) + ((scan #\[) + (set-mode :in-list + :until (scan #\]))))) + :formatters + (((:in-list) + (lambda (type s) + (declare (ignore type s)) + (let ((*open-parens* (cons #\[ *open-parens*)) + (*close-parens* (cons #\] *close-parens*))) + (call-parent-formatter)))) + ((:symbol :escaped-symbol) + (lambda (type s) + (declare (ignore type)) + (let ((result (if (find-package :r5rs-lookup) + (funcall (symbol-function (intern "SYMBOL-LOOKUP" :r5rs-lookup)) + s)))) + (if result + (format nil "
~A" + result (call-parent-formatter)) + (call-parent-formatter))))))) + +(define-coloring-type :elisp "Emacs Lisp" + :autodetect (lambda (name) + (member name '("emacs") + :test #'(lambda (name ext) + (search ext name :test #'char-equal)))) + :parent :lisp + :formatters + (((:symbol :escaped-symbol) + (lambda (type s) + (declare (ignore type)) + (let ((result (if (find-package :elisp-lookup) + (funcall (symbol-function (intern "SYMBOL-LOOKUP" :elisp-lookup)) + s)))) + (if result + (format nil "~A" + result (call-parent-formatter)) + (call-parent-formatter))))))) + +(define-coloring-type :common-lisp "Common Lisp" + :autodetect (lambda (text) + (search "lisp" text :test #'char-equal)) + :parent :lisp + :transitions + (((:normal :in-list) + ((scan #\|) + (set-mode :escaped-symbol + :until (scan #\|))))) + :formatters + (((:symbol :escaped-symbol) + (lambda (type s) + (declare (ignore type)) + (let* ((colon (position #\: s :from-end t :test #'char=)) + (to-lookup (if colon (subseq s (1+ colon)) s)) + (result (if (find-package :clhs-lookup) + (funcall (symbol-function (intern "SYMBOL-LOOKUP" :clhs-lookup)) + to-lookup)))) + (if result + (format nil "~A" + result (call-parent-formatter)) + (call-parent-formatter))))))) + +(define-coloring-type :common-lisp-file "Common Lisp File" + :parent :common-lisp + :default-mode :in-list + :invisible t) + +(defvar *c-open-parens* "([{") +(defvar *c-close-parens* ")]}") + +(defvar *c-reserved-words* + '("auto" "break" "case" "char" "const" + "continue" "default" "do" "double" "else" + "enum" "extern" "float" "for" "goto" + "if" "int" "long" "register" "return" + "short" "signed" "sizeof" "static" "struct" + "switch" "typedef" "union" "unsigned" "void" + "volatile" "while" "__restrict" "_Bool")) + +(defparameter *c-begin-word* "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_0123456789") +(defparameter *c-terminators* '(#\space #\return #\tab #\newline #\. #\/ #\- #\* #\+ #\{ #\} #\( #\) #\' #\" #\[ #\] #\< #\> #\#)) + +(define-coloring-type :basic-c "Basic C" + :modes (:normal :comment :word-ish :paren-ish :string :char :single-escape :preprocessor) + :default-mode :normal + :invisible t + :transitions + ((:normal + ((scan-any *c-begin-word*) + (set-mode :word-ish + :until (scan-any *c-terminators*) + :advancing nil)) + ((scan "/*") + (set-mode :comment + :until (scan "*/"))) + ((or + (scan-any *c-open-parens*) + (scan-any *c-close-parens*)) + (set-mode :paren-ish + :until (advance 1) + :advancing nil)) + ((scan #\") + (set-mode :string + :until (scan #\"))) + ((or (scan "'\\") + (scan #\')) + (set-mode :character + :until (advance 2)))) + (:string + ((scan #\\) + (set-mode :single-escape + :until (advance 1))))) + :formatter-variables + ((paren-counter 0)) + :formatter-after-hook (lambda nil + (format nil "~{~A~}" + (loop for i from paren-counter downto 1 + collect ""))) + :formatters + ((:normal + (lambda (type s) + (declare (ignore type)) + s)) + (:comment + (lambda (type s) + (declare (ignore type)) + (format nil "~A" + s))) + (:string + (lambda (type s) + (declare (ignore type)) + (format nil "~A" + s))) + (:character + (lambda (type s) + (declare (ignore type)) + (format nil "~A" + s))) + (:single-escape + (lambda (type s) + (call-formatter (cdr type) s))) + (:paren-ish + (lambda (type s) + (declare (ignore type)) + (let ((open nil) + (count 0)) + (if (eql (length s) 1) + (progn + (when (member (elt s 0) (coerce *c-open-parens* 'list)) + (setf open t) + (setf count (mod paren-counter 6)) + (incf paren-counter)) + (when (member (elt s 0) (coerce *c-close-parens* 'list)) + (setf open nil) + (decf paren-counter) + (setf count (mod paren-counter 6))) + (if open + (format nil "~A" + (1+ count) s *css-background-class*) + (format nil "~A" + s))) + s)))) + (:word-ish + (lambda (type s) + (declare (ignore type)) + (if (member s *c-reserved-words* :test #'string=) + (format nil "~A" s) + s))) + )) + +(define-coloring-type :c "C" + :parent :basic-c + :transitions + ((:normal + ((scan #\#) + (set-mode :preprocessor + :until (scan-any '(#\return #\newline)))))) + :formatters + ((:preprocessor + (lambda (type s) + (declare (ignore type)) + (format nil "~A" s))))) + +(defvar *c++-reserved-words* + '("asm" "auto" "bool" "break" "case" + "catch" "char" "class" "const" "const_cast" + "continue" "default" "delete" "do" "double" + "dynamic_cast" "else" "enum" "explicit" "export" + "extern" "false" "float" "for" "friend" + "goto" "if" "inline" "int" "long" + "mutable" "namespace" "new" "operator" "private" + "protected" "public" "register" "reinterpret_cast" "return" + "short" "signed" "sizeof" "static" "static_cast" + "struct" "switch" "template" "this" "throw" + "true" "try" "typedef" "typeid" "typename" + "union" "unsigned" "using" "virtual" "void" + "volatile" "wchar_t" "while")) + +(define-coloring-type :c++ "C++" + :parent :c + :transitions + ((:normal + ((scan "//") + (set-mode :comment + :until (scan-any '(#\return #\newline)))))) + :formatters + ((:word-ish + (lambda (type s) + (declare (ignore type)) + (if (member s *c++-reserved-words* :test #'string=) + (format nil "~A" + s) + s))))) + +(defvar *java-reserved-words* + '("abstract" "boolean" "break" "byte" "case" + "catch" "char" "class" "const" "continue" + "default" "do" "double" "else" "extends" + "final" "finally" "float" "for" "goto" + "if" "implements" "import" "instanceof" "int" + "interface" "long" "native" "new" "package" + "private" "protected" "public" "return" "short" + "static" "strictfp" "super" "switch" "synchronized" + "this" "throw" "throws" "transient" "try" + "void" "volatile" "while")) + +(define-coloring-type :java "Java" + :parent :c++ + :formatters + ((:word-ish + (lambda (type s) + (declare (ignore type)) + (if (member s *java-reserved-words* :test #'string=) + (format nil "~A" + s) + s))))) + +(let ((terminate-next nil)) + (define-coloring-type :objective-c "Objective C" + :autodetect (lambda (text) (search "mac" text :test #'char=)) + :modes (:begin-message-send :end-message-send) + :transitions + ((:normal + ((scan #\[) + (set-mode :begin-message-send + :until (advance 1) + :advancing nil)) + ((scan #\]) + (set-mode :end-message-send + :until (advance 1) + :advancing nil)) + ((scan-any *c-begin-word*) + (set-mode :word-ish + :until (or + (and (peek-any '(#\:)) + (setf terminate-next t)) + (and terminate-next (progn + (setf terminate-next nil) + (advance 1))) + (scan-any *c-terminators*)) + :advancing nil))) + (:word-ish + #+nil + ((scan #\:) + (format t "hi~%") + (set-mode :word-ish :until (advance 1) :advancing nil) + (setf terminate-next t)))) + :parent :c++ + :formatter-variables ((is-keyword nil) (in-message-send nil)) + :formatters + ((:begin-message-send + (lambda (type s) + (setf is-keyword nil) + (setf in-message-send t) + (call-formatter (cons :paren-ish type) s))) + (:end-message-send + (lambda (type s) + (setf is-keyword nil) + (setf in-message-send nil) + (call-formatter (cons :paren-ish type) s))) + (:word-ish + (lambda (type s) + (declare (ignore type)) + (prog1 + (let ((result (if (find-package :cocoa-lookup) + (funcall (symbol-function (intern "SYMBOL-LOOKUP" :cocoa-lookup)) + s)))) + (if result + (format nil "~A" + result s) + (if (member s *c-reserved-words* :test #'string=) + (format nil "~A" s) + (if in-message-send + (if is-keyword + (format nil "~A" s) + s) + s)))) + (setf is-keyword (not is-keyword)))))))) + + +;#!/usr/bin/clisp +;#+sbcl +;(require :asdf) +;(asdf:oos 'asdf:load-op :colorize) + +(defmacro with-each-stream-line ((var stream) &body body) + (let ((eof (gensym)) + (eof-value (gensym)) + (strm (gensym))) + `(let ((,strm ,stream) + (,eof ',eof-value)) + (do ((,var (read-line ,strm nil ,eof) (read-line ,strm nil ,eof))) + ((eql ,var ,eof)) + ,@body)))) + +(defun system (control-string &rest args) + "Interpolate ARGS into CONTROL-STRING as if by FORMAT, and +synchronously execute the result using a Bourne-compatible shell, with +output to *verbose-out*. Returns the shell's exit code." + (let ((command (apply #'format nil control-string args))) + (format t "; $ ~A~%" command) + #+sbcl + (sb-impl::process-exit-code + (sb-ext:run-program + "/bin/sh" + (list "-c" command) + :input nil :output *standard-output*)) + #+(or cmucl scl) + (ext:process-exit-code + (ext:run-program + "/bin/sh" + (list "-c" command) + :input nil :output *verbose-out*)) + #+clisp ;XXX not exactly *verbose-out*, I know + (ext:run-shell-command command :output :terminal :wait t) + )) + +(defun strcat (&rest strings) + (apply #'concatenate 'string strings)) + +(defun string-starts-with (start str) + (and (>= (length str) (length start)) + (string-equal start str :end2 (length start)))) + +(defmacro string-append (outputstr &rest args) + `(setq ,outputstr (concatenate 'string ,outputstr ,@args))) + +(defconstant +indent+ 0 + "Indentation used in the examples.") + +(defun texinfo->raw-lisp (code) + "Answer CODE with spurious Texinfo output removed. For use in +preprocessing output in a @lisp block before passing to colorize." + (decode-from-tt + (with-output-to-string (output) + (do* ((last-position 0) + (next-position + #0=(search #1="" code + :start2 last-position :test #'char-equal) + #0#)) + ((eq nil next-position) + (write-string code output :start last-position)) + (write-string code output :start last-position :end next-position) + (let ((end (search #2="" code + :start2 (+ next-position (length #1#)) + :test #'char-equal))) + (assert (integerp end) () + "Missing ~A tag in HTML for @lisp block~%~ + HTML contents of block:~%~A" #2# code) + (write-string code output + :start (+ next-position (length #1#)) + :end end) + (setf last-position (+ end (length #2#)))))))) + +(defun process-file (from to) + (with-open-file (output to :direction :output :if-exists :error) + (with-open-file (input from :direction :input) + (let ((line-processor nil) + (piece-of-code '())) + (labels + ((process-line-inside-pre (line) + (cond ((string-starts-with "" line) + (with-input-from-string + (stream (colorize:html-colorization + :common-lisp + (texinfo->raw-lisp + (apply #'concatenate 'string + (nreverse piece-of-code))))) + (with-each-stream-line (cline stream) + (format output " ~A~%" cline))) + (write-line line output) + (setq piece-of-code '() + line-processor #'process-regular-line)) + (t (let ((to-append (subseq line +indent+))) + (push (if (string= "" to-append) + " " + to-append) piece-of-code) + (push (string #\Newline) piece-of-code))))) + (process-regular-line (line) + (let ((len (some (lambda (test-string) + (when (string-starts-with test-string line) + (length test-string))) + '("
"
+                                 "
"))))
+                 (cond (len
+                         (setq line-processor #'process-line-inside-pre)
+                         (write-string "
" output)
+                         (push (subseq line (+ len +indent+)) piece-of-code)
+                         (push (string #\Newline) piece-of-code))
+                       (t (write-line line output))))))
+          (setf line-processor #'process-regular-line)
+          (with-each-stream-line (line input)
+            (funcall line-processor line)))))))
+
+(defun process-dir (dir)
+  (dolist (html-file (directory dir))
+    (let* ((name (namestring html-file))
+           (temp-name (strcat name ".temp")))
+      (process-file name temp-name)
+      (system "mv ~A ~A" temp-name name))))
+
+;; (go "/tmp/doc/manual/html_node/*.html")
+
+#+clisp
+(progn
+  (assert (first ext:*args*))
+  (process-dir (first ext:*args*)))
+
+#+sbcl
+(progn
+  (assert (second sb-ext:*posix-argv*))
+  (process-dir (second sb-ext:*posix-argv*))
+  (sb-ext:quit))
diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/doc/gendocs.sh b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/doc/gendocs.sh
new file mode 100644
index 0000000..b2bd343
--- /dev/null
+++ b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/doc/gendocs.sh
@@ -0,0 +1,313 @@
+#!/bin/sh
+# gendocs.sh -- generate a GNU manual in many formats.  This script is
+#   mentioned in maintain.texi.  See the help message below for usage details.
+# $Id: gendocs.sh,v 1.16 2005/05/15 00:00:08 karl Exp $
+# 
+# Copyright (C) 2003, 2004, 2005 Free Software Foundation, Inc.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, you can either send email to this
+# program's maintainer or write to: The Free Software Foundation,
+# Inc.; 51 Franklin Street, Fifth Floor; Boston, MA 02110-1301, USA.
+#
+# Original author: Mohit Agarwal.
+# Send bug reports and any other correspondence to bug-texinfo@gnu.org.
+
+#set -e
+
+prog="`basename \"$0\"`"
+srcdir=`pwd`
+
+scripturl="https://github.com/cffi/cffi/blob/master/doc/gendocs.sh"
+templateurl="http://savannah.gnu.org/cgi-bin/viewcvs/texinfo/texinfo/util/gendocs_template"
+
+: ${MAKEINFO="makeinfo"}
+: ${TEXI2DVI="texi2dvi -t @finalout"}
+: ${DVIPS="dvips"}
+: ${DOCBOOK2TXT="docbook2txt"}
+: ${DOCBOOK2HTML="docbook2html"}
+: ${DOCBOOK2PDF="docbook2pdf"}
+: ${DOCBOOK2PS="docbook2ps"}
+: ${GENDOCS_TEMPLATE_DIR="."}
+unset CDPATH
+
+rcs_revision='$Revision: 1.16 $'
+rcs_version=`set - $rcs_revision; echo $2`
+program=`echo $0 | sed -e 's!.*/!!'`
+version="gendocs.sh $rcs_version
+
+Copyright (C) 2005 Free Software Foundation, Inc.
+There is NO warranty.  You may redistribute this software
+under the terms of the GNU General Public License.
+For more information about these matters, see the files named COPYING."
+
+usage="Usage: $prog [OPTION]... PACKAGE MANUAL-TITLE
+
+Generate various output formats from PACKAGE.texinfo (or .texi or .txi) source.
+See the GNU Maintainers document for a more extensive discussion:
+  http://www.gnu.org/prep/maintain_toc.html
+
+Options:
+  -o OUTDIR   write files into OUTDIR, instead of manual/.
+  --docbook   convert to DocBook too (xml, txt, html, pdf and ps).
+  --html ARG  pass indicated ARG to makeinfo for HTML targets.
+  --help      display this help and exit successfully.
+  --version   display version information and exit successfully.
+
+Simple example: $prog emacs \"GNU Emacs Manual\"
+
+Typical sequence:
+  cd YOURPACKAGESOURCE/doc
+  wget \"$scripturl\"
+  wget \"$templateurl\"
+  $prog YOURMANUAL \"GNU YOURMANUAL - One-line description\"
+
+Output will be in a new subdirectory \"manual\" (by default, use -o OUTDIR
+to override).  Move all the new files into your web CVS tree, as
+explained in the Web Pages node of maintain.texi.
+
+MANUAL-TITLE is included as part of the HTML  of the overall
+manual/index.html file.  It should include the name of the package being
+documented.  manual/index.html is created by substitution from the file
+$GENDOCS_TEMPLATE_DIR/gendocs_template.  (Feel free to modify the
+generic template for your own purposes.)
+
+If you have several manuals, you'll need to run this script several
+times with different YOURMANUAL values, specifying a different output
+directory with -o each time.  Then write (by hand) an overall index.html
+with links to them all.
+
+You can set the environment variables MAKEINFO, TEXI2DVI, and DVIPS to
+control the programs that get executed, and GENDOCS_TEMPLATE_DIR to
+control where the gendocs_template file is looked for.
+
+Email bug reports or enhancement requests to bug-texinfo@gnu.org.
+"
+
+calcsize()
+{
+  size="`ls -ksl $1 | awk '{print $1}'`"
+  echo $size
+}
+
+outdir=manual
+html=
+PACKAGE=
+MANUAL_TITLE=
+
+while test $# -gt 0; do
+  case $1 in
+    --help) echo "$usage"; exit 0;;
+    --version) echo "$version"; exit 0;;
+    -o) shift; outdir=$1;;
+    --docbook) docbook=yes;;
+    --html) shift; html=$1;;
+    -*)
+      echo "$0: Unknown or ambiguous option \`$1'." >&2
+      echo "$0: Try \`--help' for more information." >&2
+      exit 1;;
+    *)
+      if test -z "$PACKAGE"; then
+        PACKAGE=$1
+      elif test -z "$MANUAL_TITLE"; then
+        MANUAL_TITLE=$1
+      else
+        echo "$0: extra non-option argument \`$1'." >&2
+        exit 1
+      fi;;
+  esac
+  shift
+done
+
+if test -s $srcdir/$PACKAGE.texinfo; then
+  srcfile=$srcdir/$PACKAGE.texinfo
+elif test -s $srcdir/$PACKAGE.texi; then
+  srcfile=$srcdir/$PACKAGE.texi
+elif test -s $srcdir/$PACKAGE.txi; then
+  srcfile=$srcdir/$PACKAGE.txi
+else
+  echo "$0: cannot find .texinfo or .texi or .txi for $PACKAGE in $srcdir." >&2
+  exit 1
+fi
+
+if test ! -r $GENDOCS_TEMPLATE_DIR/gendocs_template; then
+  echo "$0: cannot read $GENDOCS_TEMPLATE_DIR/gendocs_template." >&2
+  echo "$0: it is available from $templateurl." >&2
+  exit 1
+fi
+
+echo Generating output formats for $srcfile
+
+cmd="${MAKEINFO} -o $PACKAGE.info $srcfile"
+echo "Generating info files... ($cmd)"
+eval $cmd
+install-info $PACKAGE.info dir
+mkdir -p $outdir/
+tar czf $outdir/$PACKAGE.info.tar.gz $PACKAGE.info*
+info_tgz_size="`calcsize $outdir/$PACKAGE.info.tar.gz`"
+# do not mv the info files, there's no point in having them available
+# separately on the web.
+
+cmd="${TEXI2DVI} $srcfile"
+echo "Generating dvi ... ($cmd)"
+eval $cmd
+
+# now, before we compress dvi:
+echo Generating postscript...
+${DVIPS} $PACKAGE -o
+gzip -f -9 $PACKAGE.ps
+ps_gz_size="`calcsize $PACKAGE.ps.gz`"
+mv $PACKAGE.ps.gz $outdir/
+
+# compress/finish dvi:
+gzip -f -9 $PACKAGE.dvi
+dvi_gz_size="`calcsize $PACKAGE.dvi.gz`"
+mv $PACKAGE.dvi.gz $outdir/
+
+cmd="${TEXI2DVI} --pdf $srcfile"
+echo "Generating pdf ... ($cmd)"
+eval $cmd
+pdf_size="`calcsize $PACKAGE.pdf`"
+mv $PACKAGE.pdf $outdir/
+
+cmd="${MAKEINFO} -o $PACKAGE.txt --no-split --no-headers $srcfile"
+echo "Generating ASCII... ($cmd)"
+eval $cmd
+ascii_size="`calcsize $PACKAGE.txt`"
+gzip -f -9 -c $PACKAGE.txt >$outdir/$PACKAGE.txt.gz
+ascii_gz_size="`calcsize $outdir/$PACKAGE.txt.gz`"
+mv $PACKAGE.txt $outdir/
+
+# Print a SED expression that will translate references to MANUAL to
+# the proper page on gnu.org.  This is a horrible shell hack done
+# because \| in sed regexps is a GNU extension.
+monognuorg () {
+    case "$1" in
+	libtool) echo "s!$1.html!http://www.gnu.org/software/$1/manual.html!" ;;
+	*) echo "s!$1.html!http://www.gnu.org/software/$1/manual/html_mono/$1.html!" ;;
+    esac
+}
+polygnuorg () {
+    case "$1" in
+	libtool) echo 's!\.\./'"$1/.*\.html!http://www.gnu.org/software/$1/manual.html!" ;;
+	*) echo 's!\.\./'"$1!http://www.gnu.org/software/$1/manual/html_node!" ;;
+    esac
+}
+
+cmd="${MAKEINFO} --no-split --html -o $PACKAGE.html $html $srcfile"
+echo "Generating monolithic html... ($cmd)"
+rm -rf $PACKAGE.html  # in case a directory is left over
+eval $cmd
+sbcl --no-sysinit --no-userinit --load colorize-lisp-examples.lisp $PACKAGE.html
+#fix libc/libtool xrefs
+sed -e `monognuorg libc` -e `monognuorg libtool` $PACKAGE.html >$outdir/$PACKAGE.html
+rm $PACKAGE.html
+html_mono_size="`calcsize $outdir/$PACKAGE.html`"
+gzip -f -9 -c $outdir/$PACKAGE.html >$outdir/$PACKAGE.html.gz
+html_mono_gz_size="`calcsize $outdir/$PACKAGE.html.gz`"
+
+cmd="${MAKEINFO} --html -o $PACKAGE.html $html $srcfile"
+echo "Generating html by node... ($cmd)"
+eval $cmd
+split_html_dir=$PACKAGE.html
+sbcl --no-userinit --no-sysinit --load colorize-lisp-examples.lisp "${split_html_dir}"/\*.html
+(
+  cd ${split_html_dir} || exit 1
+  #fix libc xrefs
+  for broken_file in *.html; do
+      sed -e `polygnuorg libc` -e `polygnuorg libtool` "$broken_file" > "$broken_file".temp
+      mv -f "$broken_file".temp "$broken_file"
+  done
+  tar -czf ../$outdir/${PACKAGE}.html_node.tar.gz -- *.html
+)
+html_node_tgz_size="`calcsize $outdir/${PACKAGE}.html_node.tar.gz`"
+rm -f $outdir/html_node/*.html
+mkdir -p $outdir/html_node/
+mv ${split_html_dir}/*.html $outdir/html_node/
+rmdir ${split_html_dir}
+
+echo Making .tar.gz for sources...
+srcfiles=`ls *.texinfo *.texi *.txi *.eps 2>/dev/null`
+tar cvzfh $outdir/$PACKAGE.texi.tar.gz $srcfiles
+texi_tgz_size="`calcsize $outdir/$PACKAGE.texi.tar.gz`"
+
+if test -n "$docbook"; then
+  cmd="${MAKEINFO} -o - --docbook $srcfile > ${srcdir}/$PACKAGE-db.xml"
+  echo "Generating docbook XML... $(cmd)"
+  eval $cmd
+  docbook_xml_size="`calcsize $PACKAGE-db.xml`"
+  gzip -f -9 -c $PACKAGE-db.xml >$outdir/$PACKAGE-db.xml.gz
+  docbook_xml_gz_size="`calcsize $outdir/$PACKAGE-db.xml.gz`"
+  mv $PACKAGE-db.xml $outdir/
+
+  cmd="${DOCBOOK2HTML} -o $split_html_db_dir ${outdir}/$PACKAGE-db.xml"
+  echo "Generating docbook HTML... ($cmd)"
+  eval $cmd
+  split_html_db_dir=html_node_db
+  (
+    cd ${split_html_db_dir} || exit 1
+    tar -czf ../$outdir/${PACKAGE}.html_node_db.tar.gz -- *.html
+  )
+  html_node_db_tgz_size="`calcsize $outdir/${PACKAGE}.html_node_db.tar.gz`"
+  rm -f $outdir/html_node_db/*.html
+  mkdir -p $outdir/html_node_db
+  mv ${split_html_db_dir}/*.html $outdir/html_node_db/
+  rmdir ${split_html_db_dir}
+
+  cmd="${DOCBOOK2TXT} ${outdir}/$PACKAGE-db.xml"
+  echo "Generating docbook ASCII... ($cmd)"
+  eval $cmd
+  docbook_ascii_size="`calcsize $PACKAGE-db.txt`"
+  mv $PACKAGE-db.txt $outdir/
+
+  cmd="${DOCBOOK2PS} ${outdir}/$PACKAGE-db.xml"
+  echo "Generating docbook PS... $(cmd)"
+  eval $cmd
+  gzip -f -9 -c $PACKAGE-db.ps >$outdir/$PACKAGE-db.ps.gz
+  docbook_ps_gz_size="`calcsize $outdir/$PACKAGE-db.ps.gz`"
+  mv $PACKAGE-db.ps $outdir/
+
+  cmd="${DOCBOOK2PDF} ${outdir}/$PACKAGE-db.xml"
+  echo "Generating docbook PDF... ($cmd)"
+  eval $cmd
+  docbook_pdf_size="`calcsize $PACKAGE-db.pdf`"
+  mv $PACKAGE-db.pdf $outdir/
+fi
+
+echo Writing index file...
+curdate="`date '+%B %d, %Y'`"
+sed \
+   -e "s!%%TITLE%%!$MANUAL_TITLE!g" \
+   -e "s!%%DATE%%!$curdate!g" \
+   -e "s!%%PACKAGE%%!$PACKAGE!g" \
+   -e "s!%%HTML_MONO_SIZE%%!$html_mono_size!g" \
+   -e "s!%%HTML_MONO_GZ_SIZE%%!$html_mono_gz_size!g" \
+   -e "s!%%HTML_NODE_TGZ_SIZE%%!$html_node_tgz_size!g" \
+   -e "s!%%INFO_TGZ_SIZE%%!$info_tgz_size!g" \
+   -e "s!%%DVI_GZ_SIZE%%!$dvi_gz_size!g" \
+   -e "s!%%PDF_SIZE%%!$pdf_size!g" \
+   -e "s!%%PS_GZ_SIZE%%!$ps_gz_size!g" \
+   -e "s!%%ASCII_SIZE%%!$ascii_size!g" \
+   -e "s!%%ASCII_GZ_SIZE%%!$ascii_gz_size!g" \
+   -e "s!%%TEXI_TGZ_SIZE%%!$texi_tgz_size!g" \
+   -e "s!%%DOCBOOK_HTML_NODE_TGZ_SIZE%%!$html_node_db_tgz_size!g" \
+   -e "s!%%DOCBOOK_ASCII_SIZE%%!$docbook_ascii_size!g" \
+   -e "s!%%DOCBOOK_PS_GZ_SIZE%%!$docbook_ps_gz_size!g" \
+   -e "s!%%DOCBOOK_PDF_SIZE%%!$docbook_pdf_size!g" \
+   -e "s!%%DOCBOOK_XML_SIZE%%!$docbook_xml_size!g" \
+   -e "s!%%DOCBOOK_XML_GZ_SIZE%%!$docbook_xml_gz_size!g" \
+   -e "s,%%SCRIPTURL%%,$scripturl,g" \
+   -e "s!%%SCRIPTNAME%%!$prog!g" \
+$GENDOCS_TEMPLATE_DIR/gendocs_template >$outdir/index.html
+
+echo "Done!  See $outdir/ subdirectory for new files."
diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/doc/gendocs_template b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/doc/gendocs_template
new file mode 100644
index 0000000..5ff3351
--- /dev/null
+++ b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/doc/gendocs_template
@@ -0,0 +1,259 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<!-- $Id: gendocs_template,v 1.7 2005/05/15 00:00:08 karl Exp $ -->
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
+
+<!--
+
+ This template was adapted from Texinfo:
+ http://savannah.gnu.org/cgi-bin/viewcvs/texinfo/texinfo/util/gendocs_template
+
+-->
+
+
+<head>
+<title>%%TITLE%%
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

%%TITLE%%

+ + +
last updated %%DATE%%
+ + + +
+ +

This document is available in the following formats:

+ + + +

(This page was generated by the %%SCRIPTNAME%% +script.)

+ + + + + diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/doc/mem-vector.txt b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/doc/mem-vector.txt new file mode 100644 index 0000000..51b0c4f --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/doc/mem-vector.txt @@ -0,0 +1,75 @@ + +# Block Memory Operations + +Function: mem-fill ptr type count value &optional (offset 0) + +Fill COUNT objects of TYPE, starting at PTR plus offset, with VALUE. + +;; Equivalent to (but possibly more efficient than): +(loop for i below count + for off from offset by (%foreign-type-size type) + do (setf (%mem-ref ptr type off) value)) + +Function: mem-read-vector vector ptr type count &optional (offset 0) + +Copy COUNT objects of TYPE from foreign memory at PTR plus OFFSET into +VECTOR. If VECTOR is not large enough to contain COUNT objects, it +will copy as many objects as necessary to fill the vector. The +results are undefined if the foreign memory block is not large enough +to supply the data to copy. + +TYPE must be a built-in foreign type (integer, float, double, or +pointer). + +Returns the number of objects copied. + +;; Equivalent to (but possibly more efficient than): +(loop for i below (min count (length vector)) + for off from offset by (%foreign-type-size type) + do (setf (aref vector i) (%mem-ref ptr type off)) + finally (return i)) + + +Function: mem-read-c-string string ptr &optional (offset 0) + +Copy a null-terminated C string from PTR plus OFFSET into STRING, a +Lisp string. If STRING is not large enough to contain the data at PTR +it will be truncated. + +Returns the number of characters copied into STRING. + +;; Equivalent to (but possibly more efficient than): +(loop for i below (length string) + for off from offset + for char = (%mem-ref ptr :char off) + until (zerop char) + do (setf (char string i) char) + finally (return i)) + +Function: mem-write-vector vector ptr type &optional + (count (length vector)) (offset 0) + +Copy COUNT objects from VECTOR into objects of TYPE in foreign memory, +starting at PTR plus OFFSET. The results are undefined if PTR does +not point to a memory block large enough to hold the data copied. + +TYPE must be a built-in type (integer, float, double, or pointer). + +Returns the number of objects copied from VECTOR to PTR. + +;; Equivalent to (but possibly more efficient than): +(loop for i below count + for off from offset by (%foreign-type-size type) + do (setf (%mem-ref ptr type off) (aref vector i)) + finally (return i)) + + +Function: mem-write-c-string string ptr &optional (offset 0) + +Copy the characters from a Lisp STRING to PTR plus OFFSET, adding a +final null terminator at the end. The results are undefined if the +memory at PTR is not large enough to accomodate the data. + +This interface is currently equivalent to MEM-WRITE-VECTOR with a TYPE +of :CHAR, but will be useful when proper support for Unicode strings +is implemented. diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/doc/shareable-vectors.txt b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/doc/shareable-vectors.txt new file mode 100644 index 0000000..7418a45 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/doc/shareable-vectors.txt @@ -0,0 +1,44 @@ + +# Shareable Byte Vectors + +Function: make-shareable-byte-vector size + +Create a vector of element type (UNSIGNED-BYTE 8) suitable for passing +to WITH-POINTER-TO-VECTOR-DATA. + +;; Minimal implementation: +(defun make-shareable-byte-vector (size) + (make-array size :element-type '(unsigned-byte 8))) + + +Macro: with-pointer-to-vector-data (ptr-var vector) &body body + +Bind PTR-VAR to a pointer to the data contained in a shareable byte +vector. + +VECTOR must be a shareable vector created by MAKE-SHAREABLE-BYTE-VECTOR. + +PTR-VAR may point directly into the Lisp vector data, or it may point +to a temporary block of foreign memory which will be copied to and +from VECTOR. + +Both the pointer object in PTR-VAR and the memory it points to have +dynamic extent. The results are undefined if foreign code attempts to +access this memory outside this dynamic contour. + +The implementation must guarantee the memory pointed to by PTR-VAR +will not be moved during the dynamic contour of this operator, either +by creating the vector in a static area or temporarily disabling the +garbage collector. + +;; Minimal (copying) implementation: +(defmacro with-pointer-to-vector-data ((ptr-var vector) &body body) + (let ((vector-var (gensym)) + (size-var (gensym))) + `(let* ((,vector-var ,vector) + (,size-var (length ,vector-var))) + (with-foreign-ptr (,ptr-var ,size-var) + (mem-write-vector ,vector-var ,ptr :uint8) + (prog1 + (progn ,@body) + (mem-read-vector ,vector-var ,ptr-var :uint8 ,size-var)))))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/doc/style.css b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/doc/style.css new file mode 100644 index 0000000..87540e2 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/doc/style.css @@ -0,0 +1,48 @@ +body {font-family: Georgia, serif; + line-height: 1.3; + padding-left: 5em; padding-right: 1em; + padding-bottom: 1em; max-width: 60em;} +table {border-collapse: collapse} +span.roman { font-family: century schoolbook, serif; font-weight: normal; } +h1, h2, h3, h4, h5, h6 {font-family: Helvetica, sans-serif} +h4 { margin-top: 2.5em; } +dfn {font-family: inherit; font-variant: italic; font-weight: bolder } +kbd {font-family: monospace; text-decoration: underline} +/*var {font-family: Helvetica, sans-serif; font-variant: slanted}*/ +var {font-variant: slanted;} +td {padding-right: 1em; padding-left: 1em} +sub {font-size: smaller} +.node {padding: 0; margin: 0} + +pre.lisp { font-family: monospace; + background-color: #F4F4F4; border: 1px solid #AAA; + padding-top: 0.5em; padding-bottom: 0.5em; } + +/* coloring */ + +.lisp-bg { background-color: #F4F4F4 ; color: black; } +.lisp-bg:hover { background-color: #F4F4F4 ; color: black; } + +.symbol { font-weight: bold; color: #770055; background-color : transparent; border: 0px; margin: 0px;} +a.symbol:link { font-weight: bold; color : #229955; background-color : transparent; text-decoration: none; border: 0px; margin: 0px; } +a.symbol:active { font-weight: bold; color : #229955; background-color : transparent; text-decoration: none; border: 0px; margin: 0px; } +a.symbol:visited { font-weight: bold; color : #229955; background-color : transparent; text-decoration: none; border: 0px; margin: 0px; } +a.symbol:hover { font-weight: bold; color : #229955; background-color : transparent; text-decoration: none; border: 0px; margin: 0px; } +.special { font-weight: bold; color: #FF5000; background-color: inherit; } +.keyword { font-weight: bold; color: #770000; background-color: inherit; } +.comment { font-weight: normal; color: #007777; background-color: inherit; } +.string { font-weight: bold; color: #777777; background-color: inherit; } +.character { font-weight: bold; color: #0055AA; background-color: inherit; } +.syntaxerror { font-weight: bold; color: #FF0000; background-color: inherit; } +span.paren1 { font-weight: bold; color: #777777; } +span.paren1:hover { color: #777777; background-color: #BAFFFF; } +span.paren2 { color: #777777; } +span.paren2:hover { color: #777777; background-color: #FFCACA; } +span.paren3 { color: #777777; } +span.paren3:hover { color: #777777; background-color: #FFFFBA; } +span.paren4 { color: #777777; } +span.paren4:hover { color: #777777; background-color: #CACAFF; } +span.paren5 { color: #777777; } +span.paren5:hover { color: #777777; background-color: #CAFFCA; } +span.paren6 { color: #777777; } +span.paren6:hover { color: #777777; background-color: #FFBAFF; } diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/examples/examples.lisp b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/examples/examples.lisp new file mode 100644 index 0000000..6093acb --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/examples/examples.lisp @@ -0,0 +1,78 @@ +;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- +;;; +;;; examples.lisp --- Simple test examples of CFFI. +;;; +;;; Copyright (C) 2005-2006, James Bielman +;;; +;;; Permission is hereby granted, free of charge, to any person +;;; obtaining a copy of this software and associated documentation +;;; files (the "Software"), to deal in the Software without +;;; restriction, including without limitation the rights to use, copy, +;;; modify, merge, publish, distribute, sublicense, and/or sell copies +;;; of the Software, and to permit persons to whom the Software is +;;; furnished to do so, subject to the following conditions: +;;; +;;; The above copyright notice and this permission notice shall be +;;; included in all copies or substantial portions of the Software. +;;; +;;; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +;;; EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +;;; MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +;;; NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +;;; HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +;;; WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +;;; OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +;;; DEALINGS IN THE SOFTWARE. +;;; + +(defpackage #:cffi-examples + (:use #:cl #:cffi) + (:export + #:run-examples + #:sqrtf + #:getenv)) + +(in-package #:cffi-examples) + +;; A simple libc function. +(defcfun "sqrtf" :float + (n :float)) + +;; This definition uses the STRING type translator to automatically +;; convert Lisp strings to foreign strings and vice versa. +(defcfun "getenv" :string + (name :string)) + +;; Calling a varargs function. +(defun sprintf-test () + "Test calling a varargs function." + (with-foreign-pointer-as-string ((buf buf-size) 255) + (foreign-funcall + "snprintf" :pointer buf :int buf-size + :string "%d %f #x%x!" :int 666 + :double (coerce pi 'double-float) + :unsigned-int #xcafebabe + :void))) + +;; Defining an emerated type. +(defcenum test-enum + (:invalid 0) + (:positive 1) + (:negative -1)) + +;; Use the absolute value function to test keyword/enum translation. +(defcfun ("abs" c-abs) test-enum + (n test-enum)) + +(defun cffi-version () + (asdf:component-version (asdf:find-system 'cffi))) + +(defun run-examples () + (format t "~&;;; CFFI version ~A on ~A ~A:~%" + (cffi-version) (lisp-implementation-type) + (lisp-implementation-version)) + (format t "~&;; shell: ~A~%" (getenv "SHELL")) + (format t "~&;; sprintf test: ~A~%" (sprintf-test)) + (format t "~&;; (c-abs :positive): ~A~%" (c-abs :positive)) + (format t "~&;; (c-abs :negative): ~A~%" (c-abs :negative)) + (force-output)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/examples/gethostname.lisp b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/examples/gethostname.lisp new file mode 100644 index 0000000..f37d275 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/examples/gethostname.lisp @@ -0,0 +1,51 @@ +;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- +;;; +;;; gethostname.lisp --- A simple CFFI example. +;;; +;;; Copyright (C) 2005-2006, James Bielman +;;; +;;; Permission is hereby granted, free of charge, to any person +;;; obtaining a copy of this software and associated documentation +;;; files (the "Software"), to deal in the Software without +;;; restriction, including without limitation the rights to use, copy, +;;; modify, merge, publish, distribute, sublicense, and/or sell copies +;;; of the Software, and to permit persons to whom the Software is +;;; furnished to do so, subject to the following conditions: +;;; +;;; The above copyright notice and this permission notice shall be +;;; included in all copies or substantial portions of the Software. +;;; +;;; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +;;; EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +;;; MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +;;; NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +;;; HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +;;; WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +;;; OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +;;; DEALINGS IN THE SOFTWARE. +;;; + +;;;# CFFI Example: gethostname binding +;;; +;;; This is a very simple CFFI example that illustrates calling a C +;;; function that fills in a user-supplied string buffer. + +(defpackage #:cffi-example-gethostname + (:use #:common-lisp #:cffi) + (:export #:gethostname)) + +(in-package #:cffi-example-gethostname) + +;;; Define the Lisp function %GETHOSTNAME to call the C 'gethostname' +;;; function, which will fill BUF with up to BUFSIZE characters of the +;;; system's hostname. +(defcfun ("gethostname" %gethostname) :int + (buf :pointer) + (bufsize :int)) + +;;; Define a Lispy interface to 'gethostname'. The utility macro +;;; WITH-FOREIGN-POINTER-AS-STRING is used to allocate a temporary +;;; buffer and return it as a Lisp string. +(defun gethostname () + (with-foreign-pointer-as-string ((buf bufsize) 255) + (%gethostname buf bufsize))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/examples/gettimeofday.lisp b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/examples/gettimeofday.lisp new file mode 100644 index 0000000..1d07cb3 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/examples/gettimeofday.lisp @@ -0,0 +1,93 @@ +;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- +;;; +;;; gettimeofday.lisp --- Example CFFI binding to gettimeofday(2) +;;; +;;; Copyright (C) 2005-2006, James Bielman +;;; +;;; Permission is hereby granted, free of charge, to any person +;;; obtaining a copy of this software and associated documentation +;;; files (the "Software"), to deal in the Software without +;;; restriction, including without limitation the rights to use, copy, +;;; modify, merge, publish, distribute, sublicense, and/or sell copies +;;; of the Software, and to permit persons to whom the Software is +;;; furnished to do so, subject to the following conditions: +;;; +;;; The above copyright notice and this permission notice shall be +;;; included in all copies or substantial portions of the Software. +;;; +;;; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +;;; EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +;;; MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +;;; NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +;;; HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +;;; WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +;;; OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +;;; DEALINGS IN THE SOFTWARE. +;;; + +;;;# CFFI Example: gettimeofday binding +;;; +;;; This example illustrates the use of foreign structures, typedefs, +;;; and using type translators to do checking of input and output +;;; arguments to a foreign function. + +(defpackage #:cffi-example-gettimeofday + (:use #:common-lisp #:cffi) + (:export #:gettimeofday)) + +(in-package #:cffi-example-gettimeofday) + +;;; Define the TIMEVAL structure used by 'gettimeofday'. This assumes +;;; that 'time_t' is a 'long' --- it would be nice if CFFI could +;;; provide a proper :TIME-T type to help make this portable. +(defcstruct timeval + (tv-sec :long) + (tv-usec :long)) + +;;; A NULL-POINTER is a foreign :POINTER that must always be NULL. +;;; Both a NULL pointer and NIL are legal values---any others will +;;; result in a runtime error. +(define-foreign-type null-pointer-type () + () + (:actual-type :pointer) + (:simple-parser null-pointer)) + +;;; This type translator is used to ensure that a NULL-POINTER has a +;;; null value. It also converts NIL to a null pointer. +(defmethod translate-to-foreign (value (type null-pointer-type)) + (cond + ((null value) (null-pointer)) + ((null-pointer-p value) value) + (t (error "~A is not a null pointer." value)))) + +;;; The SYSCALL-RESULT type is an integer type used for the return +;;; value of C functions that return -1 and set errno on errors. +;;; Someday when CFFI has a portable interface for dealing with +;;; 'errno', this error reporting can be more useful. +(define-foreign-type syscall-result-type () + () + (:actual-type :int) + (:simple-parser syscall-result)) + +;;; Type translator to check a SYSCALL-RESULT and signal a Lisp error +;;; if the value is negative. +(defmethod translate-from-foreign (value (type syscall-result-type)) + (if (minusp value) + (error "System call failed with return value ~D." value) + value)) + +;;; Define the Lisp function %GETTIMEOFDAY to call the C function +;;; 'gettimeofday', passing a pointer to the TIMEVAL structure to fill +;;; in. The TZP parameter is deprecated and should be NULL --- we can +;;; enforce this by using our NULL-POINTER type defined above. +(defcfun ("gettimeofday" %gettimeofday) syscall-result + (tp :pointer) + (tzp null-pointer)) + +;;; Define a Lispy interface to 'gettimeofday' that returns the +;;; seconds and microseconds as multiple values. +(defun gettimeofday () + (with-foreign-object (tv 'timeval) + (%gettimeofday tv nil) + (with-foreign-slots ((tv-sec tv-usec) tv timeval) + (values tv-sec tv-usec)))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/examples/grovel-example.lisp b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/examples/grovel-example.lisp new file mode 100644 index 0000000..ea861b3 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/examples/grovel-example.lisp @@ -0,0 +1,20 @@ +(in-package #:cffi-example) + +(define "a0(x)" "+x+x") +(define "a1(x)" "a0(+x+x)") +(define "a2(x)" "a1(+x+x)") +(define "a3(x)" "a2(+x+x)") +(define "a4(x)" "a3(+x+x)") +(define "a5(x)" "a4(+x+x)") + +(define "A0" "a0(1)") +(define "A1" "a1(1)") +(define "A2" "a2(1)") +(define "A3" "a3(1)") +(define "A4" "a4(1)") + +(constant (+a0+ "A0")) +(constant (+a1+ "A1")) +(constant (+a2+ "A2")) +(constant (+a3+ "A3")) +(constant (+a4+ "A4")) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/examples/main-example.lisp b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/examples/main-example.lisp new file mode 100644 index 0000000..59bad2f --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/examples/main-example.lisp @@ -0,0 +1,17 @@ +(in-package #:cffi-example) + +(defcfun "puts" :int + "Put a string to standard output, return non-negative length output, or EOF" + (string :string)) + +(defun check-groveller () + (assert (equal (list +a0+ +a1+ +a2+ +a3+ +a4+) '(2 4 8 16 32))) + (assert (equal (bn 1) 32))) + +(defun entry-point () + (when uiop:*command-line-arguments* + (uiop:format! t "Arguments: ~A~%" (uiop:escape-command uiop:*command-line-arguments*))) + (puts "hello, world!") + (check-groveller) + (uiop:finish-outputs) + (uiop:quit 0)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/examples/mapping.lisp b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/examples/mapping.lisp new file mode 100644 index 0000000..5e9a371 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/examples/mapping.lisp @@ -0,0 +1,76 @@ +;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- +;;; +;;; mapping.lisp --- An example for mapping Lisp objects to ints. +;;; +;;; Copyright (C) 2007, Luis Oliveira +;;; +;;; Permission is hereby granted, free of charge, to any person +;;; obtaining a copy of this software and associated documentation +;;; files (the "Software"), to deal in the Software without +;;; restriction, including without limitation the rights to use, copy, +;;; modify, merge, publish, distribute, sublicense, and/or sell copies +;;; of the Software, and to permit persons to whom the Software is +;;; furnished to do so, subject to the following conditions: +;;; +;;; The above copyright notice and this permission notice shall be +;;; included in all copies or substantial portions of the Software. +;;; +;;; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +;;; EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +;;; MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +;;; NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +;;; HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +;;; WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +;;; OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +;;; DEALINGS IN THE SOFTWARE. +;;; + +;;; This is an example on how to tackle the problem of passing Lisp +;;; object identifiers to foreign code. It is not a great example, +;;; but might be useful nevertheless. +;;; +;;; Requires trivial-garbage: + +(defpackage #:cffi-mapping-test + (:use #:common-lisp #:cffi #:trivial-garbage) + (:export #:run)) + +(in-package #:cffi-mapping-test) + +(define-foreign-type lisp-object-type () + ((weakp :initarg :weakp)) + (:actual-type :unsigned-int)) + +(define-parse-method lisp-object (&key weak-mapping) + (make-instance 'lisp-object-type :weakp weak-mapping)) + +(defvar *regular-hashtable* (make-hash-table)) +(defvar *weak-hashtable* (make-weak-hash-table :weakness :value)) +(defvar *regular-counter* 0) +(defvar *weak-counter* 0) + +(defun increment-counter (value) + (mod (1+ value) (expt 2 (* 8 (foreign-type-size :unsigned-int))))) + +(define-modify-macro incf-counter () increment-counter) + +(defmethod translate-to-foreign (value (type lisp-object-type)) + (with-slots (weakp) type + (let ((id (if weakp + (incf-counter *weak-counter*) + (incf-counter *regular-counter*))) + (ht (if weakp *weak-hashtable* *regular-hashtable*))) + (setf (gethash id ht) value) + id))) + +(defmethod translate-from-foreign (int (type lisp-object-type)) + (with-slots (weakp) type + (gethash int (if weakp *weak-hashtable* *regular-hashtable*)))) + +;;;; Silly example. + +(defctype weak-mapping (lisp-object :weak-mapping t)) + +;;; (run) => # +(defun run () + (foreign-funcall "abs" weak-mapping (lambda (x) x) weak-mapping)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/examples/package.lisp b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/examples/package.lisp new file mode 100644 index 0000000..c6c440b --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/examples/package.lisp @@ -0,0 +1,30 @@ +;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- +;;; +;;; package.lisp --- CFFI-EXAMPLES package definition. +;;; +;;; Copyright (C) 2005-2006, James Bielman +;;; +;;; Permission is hereby granted, free of charge, to any person +;;; obtaining a copy of this software and associated documentation +;;; files (the "Software"), to deal in the Software without +;;; restriction, including without limitation the rights to use, copy, +;;; modify, merge, publish, distribute, sublicense, and/or sell copies +;;; of the Software, and to permit persons to whom the Software is +;;; furnished to do so, subject to the following conditions: +;;; +;;; The above copyright notice and this permission notice shall be +;;; included in all copies or substantial portions of the Software. +;;; +;;; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +;;; EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +;;; MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +;;; NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +;;; HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +;;; WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +;;; OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +;;; DEALINGS IN THE SOFTWARE. +;;; + +(defpackage #:cffi-example + (:use #:cl #:cffi #:cffi-sys) + (:export #:check-groveller #:entry-point)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/examples/run-examples.lisp b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/examples/run-examples.lisp new file mode 100644 index 0000000..5c99910 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/examples/run-examples.lisp @@ -0,0 +1,39 @@ +;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- +;;; +;;; run-examples.lisp --- Simple script to run the examples. +;;; +;;; Copyright (C) 2005-2006, James Bielman +;;; +;;; Permission is hereby granted, free of charge, to any person +;;; obtaining a copy of this software and associated documentation +;;; files (the "Software"), to deal in the Software without +;;; restriction, including without limitation the rights to use, copy, +;;; modify, merge, publish, distribute, sublicense, and/or sell copies +;;; of the Software, and to permit persons to whom the Software is +;;; furnished to do so, subject to the following conditions: +;;; +;;; The above copyright notice and this permission notice shall be +;;; included in all copies or substantial portions of the Software. +;;; +;;; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +;;; EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +;;; MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +;;; NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +;;; HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +;;; WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +;;; OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +;;; DEALINGS IN THE SOFTWARE. +;;; + +(setf *load-verbose* nil *compile-verbose* nil) + +#-asdf +(ignore-errors (require "asdf")) +#-asdf +(load "~/common-lisp/asdf/build/asdf.lisp") + +(asdf:load-system 'cffi-examples :verbose nil) +(cffi-examples:run-examples) +(force-output) + +(quit) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/examples/translator-test.lisp b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/examples/translator-test.lisp new file mode 100644 index 0000000..15b7ce4 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/examples/translator-test.lisp @@ -0,0 +1,88 @@ +;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- +;;; +;;; translator-test.lisp --- Testing type translators. +;;; +;;; Copyright (C) 2005-2006, James Bielman +;;; +;;; Permission is hereby granted, free of charge, to any person +;;; obtaining a copy of this software and associated documentation +;;; files (the "Software"), to deal in the Software without +;;; restriction, including without limitation the rights to use, copy, +;;; modify, merge, publish, distribute, sublicense, and/or sell copies +;;; of the Software, and to permit persons to whom the Software is +;;; furnished to do so, subject to the following conditions: +;;; +;;; The above copyright notice and this permission notice shall be +;;; included in all copies or substantial portions of the Software. +;;; +;;; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +;;; EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +;;; MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +;;; NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +;;; HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +;;; WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +;;; OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +;;; DEALINGS IN THE SOFTWARE. +;;; + +(defpackage #:cffi-translator-test + (:use #:common-lisp #:cffi)) + +(in-package #:cffi-translator-test) + +;;;# Verbose Pointer Translator +;;; +;;; This is a silly type translator that doesn't actually do any +;;; translating, but it prints out a debug message when the pointer is +;;; converted to/from its foreign representation. + +(define-foreign-type verbose-pointer-type () + () + (:actual-type :pointer)) + +(defmethod translate-to-foreign (value (type verbose-pointer-type)) + (format *debug-io* "~&;; to foreign: VERBOSE-POINTER: ~S~%" value) + value) + +(defmethod translate-from-foreign (value (type verbose-pointer-type)) + (format *debug-io* "~&;; from foreign: VERBOSE-POINTER: ~S~%" value) + value) + +;;;# Verbose String Translator +;;; +;;; A VERBOSE-STRING extends VERBOSE-POINTER and converts Lisp strings +;;; C strings. If things are working properly, both type translators +;;; should be called when converting a Lisp string to/from a C string. +;;; +;;; The translators should be called most-specific-first when +;;; translating to C, and most-specific-last when translating from C. + +(define-foreign-type verbose-string-type (verbose-pointer-type) + () + (:simple-parser verbose-string)) + +(defmethod translate-to-foreign ((s string) (type verbose-string-type)) + (let ((value (foreign-string-alloc s))) + (format *debug-io* "~&;; to foreign: VERBOSE-STRING: ~S -> ~S~%" s value) + (values (call-next-method value type) t))) + +(defmethod translate-to-foreign (value (type verbose-string-type)) + (if (pointerp value) + (progn + (format *debug-io* "~&;; to foreign: VERBOSE-STRING: ~S -> ~:*~S~%" value) + (values (call-next-method) nil)) + (error "Cannot convert ~S to a foreign string: it is not a Lisp ~ + string or pointer." value))) + +(defmethod translate-from-foreign (ptr (type verbose-string-type)) + (let ((value (foreign-string-to-lisp (call-next-method)))) + (format *debug-io* "~&;; from foreign: VERBOSE-STRING: ~S -> ~S~%" ptr value) + value)) + +(defmethod free-translated-object (ptr (type verbose-string-type) free-p) + (when free-p + (format *debug-io* "~&;; freeing VERBOSE-STRING: ~S~%" ptr) + (foreign-string-free ptr))) + +(defun test-verbose-string () + (foreign-funcall "getenv" verbose-string "SHELL" verbose-string)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/examples/wrapper-example.lisp b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/examples/wrapper-example.lisp new file mode 100644 index 0000000..f37db29 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/examples/wrapper-example.lisp @@ -0,0 +1,20 @@ +(in-package #:cffi-example) + +(defwrapper* "b0" :long ((x :long)) "return x;") +(defwrapper* "b1" :long ((x :long)) "return x;") +(defwrapper* "b2" :long ((x :long)) "return x;") +(defwrapper* "b3" :long ((x :long)) "return x;") +(defwrapper* "b4" :long ((x :long)) "return x;") + +(define "b0_cffi_wrap(x)" + "b0_cffi_wrap(b1_cffi_wrap(b2_cffi_wrap(b3_cffi_wrap(b4_cffi_wrap(+x+x)))))") +(define "b1_cffi_wrap(x)" + "b0_cffi_wrap(b1_cffi_wrap(b2_cffi_wrap(b3_cffi_wrap(b4_cffi_wrap(+x+x)))))") +(define "b2_cffi_wrap(x)" + "b0_cffi_wrap(b1_cffi_wrap(b2_cffi_wrap(b3_cffi_wrap(b4_cffi_wrap(+x+x)))))") +;;(define "b3_cffi_wrap(x)" +;; "b0_cffi_wrap(b1_cffi_wrap(b2_cffi_wrap(b3_cffi_wrap(b4_cffi_wrap(+x+x)))))") +;;(define "b4_cffi_wrap(x)" +;; "b0_cffi_wrap(b1_cffi_wrap(b2_cffi_wrap(b3_cffi_wrap(b4_cffi_wrap(+x+x)))))") + +(defwrapper* "bn" :long ((x :long)) "return b0_cffi_wrap(x);") diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/grovel/asdf.lisp b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/grovel/asdf.lisp new file mode 100644 index 0000000..11eddc6 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/grovel/asdf.lisp @@ -0,0 +1,152 @@ +;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- +;;; +;;; asdf.lisp --- ASDF components for cffi-grovel. +;;; +;;; Copyright (C) 2005-2006, Dan Knap +;;; Copyright (C) 2005-2006, Emily Backes +;;; Copyright (C) 2007, Stelian Ionescu +;;; Copyright (C) 2007, Luis Oliveira +;;; +;;; Permission is hereby granted, free of charge, to any person +;;; obtaining a copy of this software and associated documentation +;;; files (the "Software"), to deal in the Software without +;;; restriction, including without limitation the rights to use, copy, +;;; modify, merge, publish, distribute, sublicense, and/or sell copies +;;; of the Software, and to permit persons to whom the Software is +;;; furnished to do so, subject to the following conditions: +;;; +;;; The above copyright notice and this permission notice shall be +;;; included in all copies or substantial portions of the Software. +;;; +;;; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +;;; EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +;;; MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +;;; NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +;;; HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +;;; WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +;;; OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +;;; DEALINGS IN THE SOFTWARE. +;;; + +(in-package #:cffi-grovel) + +(defclass cc-flags-mixin () + ((cc-flags :initform nil :accessor cc-flags-of :initarg :cc-flags))) + +(defclass process-op (downward-operation) + () + (:documentation "This ASDF operation performs the steps necessary + to generate a compilable and loadable lisp file from a + PROCESS-OP-INPUT component.")) + +(defclass process-op-input (cl-source-file) + ((generated-lisp-file-type + :initarg :generated-lisp-file-type + :accessor generated-lisp-file-type + :documentation "The :TYPE argument to use for the generated lisp file.")) + (:default-initargs + :generated-lisp-file-type "generated-lisp-file") + (:documentation "This ASDF component represents a file that is + used as input to a function that generates lisp source file. This + component acts as if it is a CL-SOURCE-FILE by applying the + COMPILE-OP and LOAD-SOURCE-OP operations to the file generated by + PROCESS-OP.")) + +(defmethod perform :around ((op process-op) (file cc-flags-mixin)) + (let ((*cc-flags* (append (ensure-list (cc-flags-of file)) + *cc-flags*))) + (call-next-method))) + +(defmethod input-files ((op process-op) (c process-op-input)) + (list (component-pathname c))) + +(defmethod input-files ((op compile-op) (c process-op-input)) + (list (first (output-files 'process-op c)))) + +(defmethod component-depends-on ((op process-op) (c process-op-input)) + `((prepare-op ,c) ,@(call-next-method))) + +(defmethod component-depends-on ((op compile-op) (c process-op-input)) + `((process-op ,c) ,@(call-next-method))) + +(defmethod component-depends-on ((op load-source-op) (c process-op-input)) + `((process-op ,c) ,@(call-next-method))) + +;;;# ASDF component: GROVEL-FILE + +(defclass grovel-file (process-op-input cc-flags-mixin) + () + (:default-initargs + :generated-lisp-file-type "processed-grovel-file") + (:documentation + "This ASDF component represents an input file that is processed + by PROCESS-GROVEL-FILE.")) + +(defmethod output-files ((op process-op) (c grovel-file)) + (let* ((input-file (first (input-files op c))) + (output-file (make-pathname :type (generated-lisp-file-type c) + :defaults input-file)) + (c-file (make-c-file-name output-file "__grovel"))) + (list output-file + c-file + (make-exe-file-name c-file)))) + +(defmethod perform ((op process-op) (c grovel-file)) + (let* ((output-file (first (output-files op c))) + (input-file (first (input-files op c))) + (tmp-file (process-grovel-file input-file output-file))) + (rename-file-overwriting-target tmp-file output-file))) + + +;;;# ASDF component: WRAPPER-FILE + +(defclass wrapper-file (process-op-input cc-flags-mixin) + ((soname :initform nil :initarg :soname :accessor soname-of)) + (:default-initargs + :generated-lisp-file-type "processed-wrapper-file") + (:documentation + "This ASDF component represents an input file that is processed + by PROCESS-WRAPPER-FILE. This generates a foreign library and + matching CFFI bindings that are subsequently compiled and + loaded.")) + +(defun wrapper-soname (c) + (or (soname-of c) + (component-name c))) + +(defmethod output-files ((op process-op) (c wrapper-file)) + (let* ((input-file (first (input-files op c))) + (output-file (make-pathname :type (generated-lisp-file-type c) + :defaults input-file)) + (c-file (make-c-file-name output-file "__wrapper")) + (o-file (make-o-file-name output-file "__wrapper")) + (lib-soname (wrapper-soname c))) + (list output-file + (make-so-file-name (make-soname lib-soname output-file)) + c-file + o-file))) + +;;; Declare the .o and .so files as compilation outputs, +;;; so they get picked up by bundle operations. +#.(when (version<= "3.1.6" (asdf-version)) + '(defmethod output-files ((op compile-op) (c wrapper-file)) + (destructuring-bind (generated-lisp lib-file c-file o-file) (output-files 'process-op c) + (declare (ignore generated-lisp c-file)) + (multiple-value-bind (files translatedp) (call-next-method) + (values (append files (list lib-file o-file)) translatedp))))) + +(defmethod perform ((op process-op) (c wrapper-file)) + (let* ((output-file (first (output-files op c))) + (input-file (first (input-files op c))) + (tmp-file (process-wrapper-file + input-file + :output-defaults output-file + :lib-soname (wrapper-soname c)))) + (unwind-protect + (alexandria:copy-file tmp-file output-file :if-to-exists :supersede) + (delete-file tmp-file)))) + +;; Allow for naked :cffi-grovel-file and :cffi-wrapper-file in asdf definitions. +(setf (find-class 'asdf::cffi-grovel-file) (find-class 'grovel-file)) +(setf (find-class 'asdf::cffi-wrapper-file) (find-class 'wrapper-file)) + diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/grovel/common.h b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/grovel/common.h new file mode 100644 index 0000000..895059f --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/grovel/common.h @@ -0,0 +1,57 @@ +#include +#include +#include +#include +#include + +#ifndef offsetof +#define offsetof(type, slot) ((long) ((char *) &(((type *) 0)->slot))) +#endif +#define getslot(type, slot) (((type *) 0)->slot) +#define sizeofslot(type, slot) (sizeof(getslot(type, slot))) +#define countofslot(type, slot) \ + (sizeof(getslot(type, slot)) / sizeof(getslot(type, slot)[0])) +#define stringify(x) #x +#define indirect_stringify(x) stringify(x) + +#define TYPE_SIGNED_P(type) (((type)-1)<0LL) +#define _64_BIT_VALUE_FITS_SIGNED_P(value) ( (value) <= 0x7FFFFFFFFFFFFFFFLL ) +#define SLOT_SIGNED_P(result, type, slot) \ + do { \ + type slot_signed_p_struct; \ + slot_signed_p_struct.slot = -1; \ + (result) = slot_signed_p_struct.slot < 0; \ + } while (0) + +void type_name(FILE *output, int signed_p, int size) { + if (signed_p) { + switch (size) { + case 1: fprintf(output, ":int8"); break; + case 2: fprintf(output, ":int16"); break; + case 4: fprintf(output, ":int32"); break; + case 8: fprintf(output, ":int64"); break; + default: goto error; + } + } else { + switch(size) { + case 1: fprintf(output, ":uint8"); break; + case 2: fprintf(output, ":uint16"); break; + case 4: fprintf(output, ":uint32"); break; + case 8: fprintf(output, ":uint64"); break; + default: goto error; + } + } + + return; + +error: + fprintf(output, "(cl:error \"No type of size ~D.\" %i)\n", size); +} + +char* print_double_for_lisp(double n) +{ + static char buf[256]; + memset(buf, 0, 256); + snprintf(buf, 255, "(let ((*read-default-float-format* 'double-float)) (coerce (read-from-string \"%.20E\") 'double-float))", n); + return buf; +} diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/grovel/grovel.lisp b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/grovel/grovel.lisp new file mode 100644 index 0000000..727e45d --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/grovel/grovel.lisp @@ -0,0 +1,913 @@ +;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- +;;; +;;; grovel.lisp --- The CFFI Groveller. +;;; +;;; Copyright (C) 2005-2006, Dan Knap +;;; Copyright (C) 2005-2006, Emily Backes +;;; Copyright (C) 2007, Stelian Ionescu +;;; Copyright (C) 2007, Luis Oliveira +;;; +;;; Permission is hereby granted, free of charge, to any person +;;; obtaining a copy of this software and associated documentation +;;; files (the "Software"), to deal in the Software without +;;; restriction, including without limitation the rights to use, copy, +;;; modify, merge, publish, distribute, sublicense, and/or sell copies +;;; of the Software, and to permit persons to whom the Software is +;;; furnished to do so, subject to the following conditions: +;;; +;;; The above copyright notice and this permission notice shall be +;;; included in all copies or substantial portions of the Software. +;;; +;;; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +;;; EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +;;; MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +;;; NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +;;; HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +;;; WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +;;; OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +;;; DEALINGS IN THE SOFTWARE. +;;; + +(in-package #:cffi-grovel) + +;;;# Error Conditions + +(define-condition grovel-error (simple-error) ()) + +(defun grovel-error (format-control &rest format-arguments) + (error 'grovel-error + :format-control format-control + :format-arguments format-arguments)) + +;;; This warning is signalled when cffi-grovel can't find some macro. +;;; Signalled by CONSTANT or CONSTANTENUM. +(define-condition missing-definition (warning) + ((%name :initarg :name :reader name-of)) + (:report (lambda (condition stream) + (format stream "No definition for ~A" + (name-of condition))))) + +;;;# Grovelling + +;;; The header of the intermediate C file. +(defparameter *header* + "/* + * This file has been automatically generated by cffi-grovel. + * Do not edit it by hand. + */ + +") + +;;; C code generated by cffi-grovel is inserted between the contents +;;; of *PROLOGUE* and *POSTSCRIPT*, inside the main function's body. + +(defparameter *prologue* + " +#include + +int main(int argc, char**argv) { + int autotype_tmp; + FILE *output = argc > 1 ? fopen(argv[1], \"w\") : stdout; + fprintf(output, \";;;; This file has been automatically generated by \" + \"cffi-grovel.\\n;;;; Do not edit it by hand.\\n\\n\"); +") + +(defparameter *postscript* + " + if (output != stdout) + fclose(output); + return 0; +} +") + +(defun unescape-for-c (text) + (with-output-to-string (result) + (loop for i below (length text) + for char = (char text i) do + (cond ((eql char #\") (princ "\\\"" result)) + ((eql char #\newline) (princ "\\n" result)) + (t (princ char result)))))) + +(defun c-format (out fmt &rest args) + (let ((text (unescape-for-c (format nil "~?" fmt args)))) + (format out "~& fputs(\"~A\", output);~%" text))) + +(defun c-printf (out fmt &rest args) + (flet ((item (item) + (format out "~A" (unescape-for-c (format nil item))))) + (format out "~& fprintf(output, \"") + (item fmt) + (format out "\"") + (loop for arg in args do + (format out ", ") + (item arg)) + (format out ");~%"))) + +(defun c-print-integer-constant (out arg &optional foreign-type) + (let ((foreign-type (or foreign-type :int))) + (c-format out "#.(cffi-grovel::convert-intmax-constant ") + (format out "~& fprintf(output, \"%\"PRIiMAX, (intmax_t)~A);~%" + arg) + (c-format out " ") + (c-write out `(quote ,foreign-type)) + (c-format out ")"))) + +;;; TODO: handle packages in a better way. One way is to process each +;;; grovel form as it is read (like we already do for wrapper +;;; forms). This way in can expect *PACKAGE* to have sane values. +;;; This would require that "header forms" come before any other +;;; forms. +(defun c-print-symbol (out symbol &optional no-package) + (c-format out + (let ((package (symbol-package symbol))) + (cond + ((eq (find-package '#:keyword) package) ":~(~A~)") + (no-package "~(~A~)") + ((eq (find-package '#:cl) package) "cl:~(~A~)") + (t "~(~A~)"))) + symbol)) + +(defun c-write (out form &optional no-package) + (cond + ((and (listp form) + (eq 'quote (car form))) + (c-format out "'") + (c-write out (cadr form) no-package)) + ((listp form) + (c-format out "(") + (loop for subform in form + for first-p = t then nil + unless first-p do (c-format out " ") + do (c-write out subform no-package)) + (c-format out ")")) + ((symbolp form) + (c-print-symbol out form no-package)))) + +;;; Always NIL for now, add {ENABLE,DISABLE}-AUTO-EXPORT grovel forms +;;; later, if necessary. +(defvar *auto-export* nil) + +(defun c-export (out symbol) + (when (and *auto-export* (not (keywordp symbol))) + (c-format out "(cl:export '") + (c-print-symbol out symbol t) + (c-format out ")~%"))) + +(defun c-section-header (out section-type section-symbol) + (format out "~% /* ~A section for ~S */~%" + section-type + section-symbol)) + +(defun remove-suffix (string suffix) + (let ((suffix-start (- (length string) (length suffix)))) + (if (and (> suffix-start 0) + (string= string suffix :start1 suffix-start)) + (subseq string 0 suffix-start) + string))) + +(defgeneric %process-grovel-form (name out arguments) + (:method (name out arguments) + (declare (ignore out arguments)) + (grovel-error "Unknown Grovel syntax: ~S" name))) + +(defun process-grovel-form (out form) + (%process-grovel-form (form-kind form) out (cdr form))) + +(defun form-kind (form) + ;; Using INTERN here instead of FIND-SYMBOL will result in less + ;; cryptic error messages when an undefined grovel/wrapper form is + ;; found. + (intern (symbol-name (car form)) '#:cffi-grovel)) + +(defvar *header-forms* '(c include define flag typedef)) + +(defun header-form-p (form) + (member (form-kind form) *header-forms*)) + +(defun generate-c-file (input-file output-defaults) + (nest + (with-standard-io-syntax) + (let ((c-file (make-c-file-name output-defaults "__grovel")) + (*print-readably* nil) + (*print-escape* t))) + (with-open-file (out c-file :direction :output :if-exists :supersede)) + (with-open-file (in input-file :direction :input)) + (flet ((read-forms (s) + (do ((forms ()) + (form (read s nil nil) (read s nil nil))) + ((null form) (nreverse forms)) + (labels + ((process-form (f) + (case (form-kind f) + (flag (warn "Groveler clause FLAG is deprecated, use CC-FLAGS instead."))) + (case (form-kind f) + (in-package + (setf *package* (find-package (second f))) + (push f forms)) + (progn + ;; flatten progn forms + (mapc #'process-form (rest f))) + (t (push f forms))))) + (process-form form)))))) + (let* ((forms (read-forms in)) + (header-forms (remove-if-not #'header-form-p forms)) + (body-forms (remove-if #'header-form-p forms))) + (write-string *header* out) + (dolist (form header-forms) + (process-grovel-form out form)) + (write-string *prologue* out) + (dolist (form body-forms) + (process-grovel-form out form)) + (write-string *postscript* out) + c-file))) + +(defun tmp-lisp-file-name (defaults) + (make-pathname :name (strcat (pathname-name defaults) ".grovel-tmp") + :type "lisp" :defaults defaults)) + + + +;;; *PACKAGE* is rebound so that the IN-PACKAGE form can set it during +;;; *the extent of a given grovel file. +(defun process-grovel-file (input-file &optional (output-defaults input-file)) + (with-standard-io-syntax + (let* ((c-file (generate-c-file input-file output-defaults)) + (o-file (make-o-file-name c-file)) + (exe-file (make-exe-file-name c-file)) + (lisp-file (tmp-lisp-file-name c-file)) + (inputs (list (cc-include-grovel-argument) c-file))) + (handler-case + (progn + ;; at least MKCL wants to separate compile and link + (cc-compile o-file inputs) + (link-executable exe-file (list o-file))) + (error (e) + (grovel-error "~a" e))) + (invoke exe-file lisp-file) + lisp-file))) + +;;; OUT is lexically bound to the output stream within BODY. +(defmacro define-grovel-syntax (name lambda-list &body body) + (with-unique-names (name-var args) + `(defmethod %process-grovel-form ((,name-var (eql ',name)) out ,args) + (declare (ignorable out)) + (destructuring-bind ,lambda-list ,args + ,@body)))) + +(define-grovel-syntax c (body) + (format out "~%~A~%" body)) + +(define-grovel-syntax include (&rest includes) + (format out "~{#include <~A>~%~}" includes)) + +(define-grovel-syntax define (name &optional value) + (format out "#define ~A~@[ ~A~]~%" name value)) + +(define-grovel-syntax typedef (base-type new-type) + (format out "typedef ~A ~A;~%" base-type new-type)) + +;;; Is this really needed? +(define-grovel-syntax ffi-typedef (new-type base-type) + (c-format out "(cffi:defctype ~S ~S)~%" new-type base-type)) + +(define-grovel-syntax flag (&rest flags) + (appendf *cc-flags* (parse-command-flags-list flags))) + +(define-grovel-syntax cc-flags (&rest flags) + (appendf *cc-flags* (parse-command-flags-list flags))) + +(define-grovel-syntax pkg-config-cflags (pkg &key optional) + (let ((output-stream (make-string-output-stream)) + (program+args (list "pkg-config" pkg "--cflags"))) + (format *debug-io* "~&;~{ ~a~}~%" program+args) + (handler-case + (progn + (run-program program+args + :output (make-broadcast-stream output-stream *debug-io*) + :error-output output-stream) + (appendf *cc-flags* + (parse-command-flags (get-output-stream-string output-stream)))) + (error (e) + (let ((message (format nil "~a~&~%~a~&" + e (get-output-stream-string output-stream)))) + (cond (optional + (format *debug-io* "~&; ERROR: ~a" message) + (format *debug-io* "~&~%; Attempting to continue anyway.~%")) + (t + (grovel-error "~a" message)))))))) + +;;; This form also has some "read time" effects. See GENERATE-C-FILE. +(define-grovel-syntax in-package (name) + (c-format out "(cl:in-package #:~A)~%~%" name)) + +(define-grovel-syntax ctype (lisp-name size-designator) + (c-section-header out "ctype" lisp-name) + (c-export out lisp-name) + (c-format out "(cffi:defctype ") + (c-print-symbol out lisp-name t) + (c-format out " ") + (format out "~& type_name(output, TYPE_SIGNED_P(~A), ~:[sizeof(~A)~;~D~]);~%" + size-designator + (etypecase size-designator + (string nil) + (integer t)) + size-designator) + (c-format out ")~%") + (unless (keywordp lisp-name) + (c-export out lisp-name)) + (let ((size-of-constant-name (symbolicate '#:size-of- lisp-name))) + (c-export out size-of-constant-name) + (c-format out "(cl:defconstant " + size-of-constant-name lisp-name) + (c-print-symbol out size-of-constant-name) + (c-format out " (cffi:foreign-type-size '") + (c-print-symbol out lisp-name) + (c-format out "))~%"))) + +;;; Syntax differs from anything else in CFFI. Fix? +(define-grovel-syntax constant ((lisp-name &rest c-names) + &key (type 'integer) documentation optional) + (when (keywordp lisp-name) + (setf lisp-name (format-symbol "~A" lisp-name))) + (c-section-header out "constant" lisp-name) + (dolist (c-name c-names) + (format out "~&#ifdef ~A~%" c-name) + (c-export out lisp-name) + (c-format out "(cl:defconstant ") + (c-print-symbol out lisp-name t) + (c-format out " ") + (ecase type + (integer + (format out "~& if(_64_BIT_VALUE_FITS_SIGNED_P(~A))~%" c-name) + (format out " fprintf(output, \"%lli\", (long long signed) ~A);" c-name) + (format out "~& else~%") + (format out " fprintf(output, \"%llu\", (long long unsigned) ~A);" c-name)) + (double-float + (format out "~& fprintf(output, \"%s\", print_double_for_lisp((double)~A));~%" c-name))) + (when documentation + (c-format out " ~S" documentation)) + (c-format out ")~%") + (format out "~&#else~%")) + (unless optional + (c-format out "(cl:warn 'cffi-grovel:missing-definition :name '~A)~%" + lisp-name)) + (dotimes (i (length c-names)) + (format out "~&#endif~%"))) + +(define-grovel-syntax feature (lisp-feature-name c-name &key (feature-list 'cl:*features*)) + (c-section-header out "feature" lisp-feature-name) + (format out "~&#ifdef ~A~%" c-name) + (c-format out "(cl:pushnew '") + (c-print-symbol out lisp-feature-name t) + (c-format out " ") + (c-print-symbol out feature-list) + (c-format out ")~%") + (format out "~&#endif~%")) + +(define-grovel-syntax cunion (union-lisp-name union-c-name &rest slots) + (let ((documentation (when (stringp (car slots)) (pop slots)))) + (c-section-header out "cunion" union-lisp-name) + (c-export out union-lisp-name) + (dolist (slot slots) + (let ((slot-lisp-name (car slot))) + (c-export out slot-lisp-name))) + (c-format out "(cffi:defcunion (") + (c-print-symbol out union-lisp-name t) + (c-printf out " :size %llu)" (format nil "(long long unsigned) sizeof(~A)" union-c-name)) + (when documentation + (c-format out "~% ~S" documentation)) + (dolist (slot slots) + (destructuring-bind (slot-lisp-name slot-c-name &key type count) + slot + (declare (ignore slot-c-name)) + (c-format out "~% (") + (c-print-symbol out slot-lisp-name t) + (c-format out " ") + (c-write out type) + (etypecase count + (integer + (c-format out " :count ~D" count)) + ((eql :auto) + ;; nb, works like :count :auto does in cstruct below + (c-printf out " :count %llu" + (format nil "(long long unsigned) sizeof(~A)" union-c-name))) + (null t)) + (c-format out ")"))) + (c-format out ")~%"))) + +(defun make-from-pointer-function-name (type-name) + (symbolicate '#:make- type-name '#:-from-pointer)) + +;;; DEFINE-C-STRUCT-WRAPPER (in ../src/types.lisp) seems like a much +;;; cleaner way to do this. Unless I can find any advantage in doing +;;; it this way I'll delete this soon. --luis +(define-grovel-syntax cstruct-and-class-item (&rest arguments) + (process-grovel-form out (cons 'cstruct arguments)) + (destructuring-bind (struct-lisp-name struct-c-name &rest slots) + arguments + (declare (ignore struct-c-name)) + (let* ((slot-names (mapcar #'car slots)) + (reader-names (mapcar + (lambda (slot-name) + (intern + (strcat (symbol-name struct-lisp-name) "-" + (symbol-name slot-name)))) + slot-names)) + (initarg-names (mapcar + (lambda (slot-name) + (intern (symbol-name slot-name) "KEYWORD")) + slot-names)) + (slot-decoders (mapcar (lambda (slot) + (destructuring-bind + (lisp-name c-name + &key type count + &allow-other-keys) + slot + (declare (ignore lisp-name c-name)) + (cond ((and (eq type :char) count) + 'cffi:foreign-string-to-lisp) + (t nil)))) + slots)) + (defclass-form + `(defclass ,struct-lisp-name () + ,(mapcar (lambda (slot-name initarg-name reader-name) + `(,slot-name :initarg ,initarg-name + :reader ,reader-name)) + slot-names + initarg-names + reader-names))) + (make-function-name + (make-from-pointer-function-name struct-lisp-name)) + (make-defun-form + ;; this function is then used as a constructor for this class. + `(defun ,make-function-name (pointer) + (cffi:with-foreign-slots + (,slot-names pointer ,struct-lisp-name) + (make-instance ',struct-lisp-name + ,@(loop for slot-name in slot-names + for initarg-name in initarg-names + for slot-decoder in slot-decoders + collect initarg-name + if slot-decoder + collect `(,slot-decoder ,slot-name) + else collect slot-name)))))) + (c-export out make-function-name) + (dolist (reader-name reader-names) + (c-export out reader-name)) + (c-write out defclass-form) + (c-write out make-defun-form)))) + +(define-grovel-syntax cstruct (struct-lisp-name struct-c-name &rest slots) + (let ((documentation (when (stringp (car slots)) (pop slots)))) + (c-section-header out "cstruct" struct-lisp-name) + (c-export out struct-lisp-name) + (dolist (slot slots) + (let ((slot-lisp-name (car slot))) + (c-export out slot-lisp-name))) + (c-format out "(cffi:defcstruct (") + (c-print-symbol out struct-lisp-name t) + (c-printf out " :size %llu)" + (format nil "(long long unsigned) sizeof(~A)" struct-c-name)) + (when documentation + (c-format out "~% ~S" documentation)) + (dolist (slot slots) + (destructuring-bind (slot-lisp-name slot-c-name &key type count) + slot + (c-format out "~% (") + (c-print-symbol out slot-lisp-name t) + (c-format out " ") + (etypecase type + ((eql :auto) + (format out "~& SLOT_SIGNED_P(autotype_tmp, ~A, ~A~@[[0]~]);~@*~%~ + ~& type_name(output, autotype_tmp, sizeofslot(~A, ~A~@[[0]~]));~%" + struct-c-name + slot-c-name + (not (null count)))) + ((or cons symbol) + (c-write out type)) + (string + (c-format out "~A" type))) + (etypecase count + (null t) + (integer + (c-format out " :count ~D" count)) + ((eql :auto) + (c-printf out " :count %llu" + (format nil "(long long unsigned) countofslot(~A, ~A)" + struct-c-name + slot-c-name))) + ((or symbol string) + (format out "~&#ifdef ~A~%" count) + (c-printf out " :count %llu" + (format nil "(long long unsigned) (~A)" count)) + (format out "~&#endif~%"))) + (c-printf out " :offset %lli)" + (format nil "(long long signed) offsetof(~A, ~A)" + struct-c-name + slot-c-name)))) + (c-format out ")~%") + (let ((size-of-constant-name + (symbolicate '#:size-of- struct-lisp-name))) + (c-export out size-of-constant-name) + (c-format out "(cl:defconstant " + size-of-constant-name struct-lisp-name) + (c-print-symbol out size-of-constant-name) + (c-format out " (cffi:foreign-type-size '(:struct ") + (c-print-symbol out struct-lisp-name) + (c-format out ")))~%")))) + +(defmacro define-pseudo-cvar (str name type &key read-only) + (let ((c-parse (let ((*read-eval* nil) + (*readtable* (copy-readtable nil))) + (setf (readtable-case *readtable*) :preserve) + (read-from-string str)))) + (typecase c-parse + (symbol `(cffi:defcvar (,(symbol-name c-parse) ,name + :read-only ,read-only) + ,type)) + (list (unless (and (= (length c-parse) 2) + (null (second c-parse)) + (symbolp (first c-parse)) + (eql #\* (char (symbol-name (first c-parse)) 0))) + (grovel-error "Unable to parse c-string ~s." str)) + (let ((func-name (symbolicate "%" name '#:-accessor))) + `(progn + (declaim (inline ,func-name)) + (cffi:defcfun (,(string-trim "*" (symbol-name (first c-parse))) + ,func-name) :pointer) + (define-symbol-macro ,name + (cffi:mem-ref (,func-name) ',type))))) + (t (grovel-error "Unable to parse c-string ~s." str))))) + +(defun foreign-name-to-symbol (s) + (intern (substitute #\- #\_ (string-upcase s)))) + +(defun choose-lisp-and-foreign-names (string-or-list) + (etypecase string-or-list + (string (values string-or-list (foreign-name-to-symbol string-or-list))) + (list (destructuring-bind (fname lname &rest args) string-or-list + (declare (ignore args)) + (assert (and (stringp fname) (symbolp lname))) + (values fname lname))))) + +(define-grovel-syntax cvar (name type &key read-only) + (multiple-value-bind (c-name lisp-name) + (choose-lisp-and-foreign-names name) + (c-section-header out "cvar" lisp-name) + (c-export out lisp-name) + (c-printf out "(cffi-grovel::define-pseudo-cvar \"%s\" " + (format nil "indirect_stringify(~A)" c-name)) + (c-print-symbol out lisp-name t) + (c-format out " ") + (c-write out type) + (when read-only + (c-format out " :read-only t")) + (c-format out ")~%"))) + +;;; FIXME: where would docs on enum elements go? +(define-grovel-syntax cenum (name &rest enum-list) + (destructuring-bind (name &key base-type define-constants) + (ensure-list name) + (c-section-header out "cenum" name) + (c-export out name) + (c-format out "(cffi:defcenum (") + (c-print-symbol out name t) + (when base-type + (c-printf out " ") + (c-print-symbol out base-type t)) + (c-format out ")") + (dolist (enum enum-list) + (destructuring-bind ((lisp-name &rest c-names) &key documentation) + enum + (declare (ignore documentation)) + (check-type lisp-name keyword) + (loop for c-name in c-names do + (check-type c-name string) + (c-format out " (") + (c-print-symbol out lisp-name) + (c-format out " ") + (c-print-integer-constant out c-name base-type) + (c-format out ")~%")))) + (c-format out ")~%") + (when define-constants + (define-constants-from-enum out enum-list)))) + +(define-grovel-syntax constantenum (name &rest enum-list) + (destructuring-bind (name &key base-type define-constants) + (ensure-list name) + (c-section-header out "constantenum" name) + (c-export out name) + (c-format out "(cffi:defcenum (") + (c-print-symbol out name t) + (when base-type + (c-printf out " ") + (c-print-symbol out base-type t)) + (c-format out ")") + (dolist (enum enum-list) + (destructuring-bind ((lisp-name &rest c-names) + &key optional documentation) enum + (declare (ignore documentation)) + (check-type lisp-name keyword) + (c-format out "~% (") + (c-print-symbol out lisp-name) + (loop for c-name in c-names do + (check-type c-name string) + (format out "~&#ifdef ~A~%" c-name) + (c-format out " ") + (c-print-integer-constant out c-name base-type) + (format out "~&#else~%")) + (unless optional + (c-format out + "~% #.(cl:progn ~ + (cl:warn 'cffi-grovel:missing-definition :name '~A) ~ + -1)" + lisp-name)) + (dotimes (i (length c-names)) + (format out "~&#endif~%")) + (c-format out ")"))) + (c-format out ")~%") + (when define-constants + (define-constants-from-enum out enum-list)))) + +(defun define-constants-from-enum (out enum-list) + (dolist (enum enum-list) + (destructuring-bind ((lisp-name &rest c-names) &rest options) + enum + (%process-grovel-form + 'constant out + `((,(intern (string lisp-name)) ,(car c-names)) + ,@options))))) + +(defun convert-intmax-constant (constant base-type) + "Convert the C CONSTANT to an integer of BASE-TYPE. The constant is +assumed to be an integer printed using the PRIiMAX printf(3) format +string." + ;; | C Constant | Type | Return Value | Notes | + ;; |------------+---------+--------------+---------------------------------------| + ;; | -1 | :int32 | -1 | | + ;; | 0xffffffff | :int32 | -1 | CONSTANT may be a positive integer if | + ;; | | | | sizeof(intmax_t) > sizeof(int32_t) | + ;; | 0xffffffff | :uint32 | 4294967295 | | + ;; | -1 | :uint32 | 4294967295 | | + ;; |------------+---------+--------------+---------------------------------------| + (let* ((canonical-type (cffi::canonicalize-foreign-type base-type)) + (type-bits (* 8 (cffi:foreign-type-size canonical-type))) + (2^n (ash 1 type-bits))) + (ecase canonical-type + ((:unsigned-char :unsigned-short :unsigned-int + :unsigned-long :unsigned-long-long) + (mod constant 2^n)) + ((:char :short :int :long :long-long) + (let ((v (mod constant 2^n))) + (if (logbitp (1- type-bits) v) + (- (mask-field (byte (1- type-bits) 0) v) + (ash 1 (1- type-bits))) + v)))))) + +(defun foreign-type-to-printf-specification (type) + "Return the printf specification associated with the foreign type TYPE." + (ecase (cffi::canonicalize-foreign-type type) + (:char "\"%hhd\"") + (:unsigned-char "\"%hhu\"") + (:short "\"%hd\"") + (:unsigned-short "\"%hu\"") + (:int "\"%d\"") + (:unsigned-int "\"%u\"") + (:long "\"%ld\"") + (:unsigned-long "\"%lu\"") + (:long-long "\"%lld\"") + (:unsigned-long-long "\"%llu\""))) + +;; Defines a bitfield, with elements specified as ((LISP-NAME C-NAME) +;; &key DOCUMENTATION). NAME-AND-OPTS can be either a symbol as name, +;; or a list (NAME &key BASE-TYPE). +(define-grovel-syntax bitfield (name-and-opts &rest masks) + (destructuring-bind (name &key base-type) + (ensure-list name-and-opts) + (c-section-header out "bitfield" name) + (c-export out name) + (c-format out "(cffi:defbitfield (") + (c-print-symbol out name t) + (when base-type + (c-printf out " ") + (c-print-symbol out base-type t)) + (c-format out ")") + (dolist (mask masks) + (destructuring-bind ((lisp-name &rest c-names) + &key optional documentation) mask + (declare (ignore documentation)) + (check-type lisp-name symbol) + (c-format out "~% (") + (c-print-symbol out lisp-name) + (c-format out " ") + (dolist (c-name c-names) + (check-type c-name string) + (format out "~&#ifdef ~A~%" c-name) + (format out "~& fprintf(output, ~A, ~A);~%" + (foreign-type-to-printf-specification (or base-type :int)) + c-name) + (format out "~&#else~%")) + (unless optional + (c-format out + "~% #.(cl:progn ~ + (cl:warn 'cffi-grovel:missing-definition :name '~A) ~ + -1)" + lisp-name)) + (dotimes (i (length c-names)) + (format out "~&#endif~%")) + (c-format out ")"))) + (c-format out ")~%"))) + + +;;;# Wrapper Generation +;;; +;;; Here we generate a C file from a s-exp specification but instead +;;; of compiling and running it, we compile it as a shared library +;;; that can be subsequently loaded with LOAD-FOREIGN-LIBRARY. +;;; +;;; Useful to get at macro functionality, errno, system calls, +;;; functions that handle structures by value, etc... +;;; +;;; Matching CFFI bindings are generated along with said C file. + +(defun process-wrapper-form (out form) + (%process-wrapper-form (form-kind form) out (cdr form))) + +;;; The various operators push Lisp forms onto this list which will be +;;; written out by PROCESS-WRAPPER-FILE once everything is processed. +(defvar *lisp-forms*) + +(defun generate-c-lib-file (input-file output-defaults) + (let ((*lisp-forms* nil) + (c-file (make-c-file-name output-defaults "__wrapper"))) + (with-open-file (out c-file :direction :output :if-exists :supersede) + (with-open-file (in input-file :direction :input) + (write-string *header* out) + (loop for form = (read in nil nil) while form + do (process-wrapper-form out form)))) + (values c-file (nreverse *lisp-forms*)))) + +(defun make-soname (lib-soname output-defaults) + (make-pathname :name lib-soname + :defaults output-defaults)) + +(defun generate-bindings-file (lib-file lib-soname lisp-forms output-defaults) + (with-standard-io-syntax + (let ((lisp-file (tmp-lisp-file-name output-defaults)) + (*print-readably* nil) + (*print-escape* t)) + (with-open-file (out lisp-file :direction :output :if-exists :supersede) + (format out ";;;; This file was automatically generated by cffi-grovel.~%~ + ;;;; Do not edit by hand.~%") + (let ((*package* (find-package '#:cl)) + (named-library-name + (let ((*package* (find-package :keyword)) + (*read-eval* nil)) + (read-from-string lib-soname)))) + (pprint `(progn + (cffi:define-foreign-library + (,named-library-name + :type :grovel-wrapper + :search-path ,(directory-namestring lib-file)) + (t ,(namestring (make-so-file-name lib-soname)))) + (cffi:use-foreign-library ,named-library-name)) + out) + (fresh-line out)) + (dolist (form lisp-forms) + (print form out)) + (terpri out)) + lisp-file))) + +(defun cc-include-grovel-argument () + (format nil "-I~A" (truename (system-source-directory :cffi-grovel)))) + +;;; *PACKAGE* is rebound so that the IN-PACKAGE form can set it during +;;; *the extent of a given wrapper file. +(defun process-wrapper-file (input-file + &key + (output-defaults (make-pathname :defaults input-file :type "processed")) + lib-soname) + (with-standard-io-syntax + (multiple-value-bind (c-file lisp-forms) + (generate-c-lib-file input-file output-defaults) + (let ((lib-file (make-so-file-name (make-soname lib-soname output-defaults))) + (o-file (make-o-file-name output-defaults "__wrapper"))) + (cc-compile o-file (list (cc-include-grovel-argument) c-file)) + (link-shared-library lib-file (list o-file)) + ;; FIXME: hardcoded library path. + (values (generate-bindings-file lib-file lib-soname lisp-forms output-defaults) + lib-file))))) + +(defgeneric %process-wrapper-form (name out arguments) + (:method (name out arguments) + (declare (ignore out arguments)) + (grovel-error "Unknown Grovel syntax: ~S" name))) + +;;; OUT is lexically bound to the output stream within BODY. +(defmacro define-wrapper-syntax (name lambda-list &body body) + (with-unique-names (name-var args) + `(defmethod %process-wrapper-form ((,name-var (eql ',name)) out ,args) + (declare (ignorable out)) + (destructuring-bind ,lambda-list ,args + ,@body)))) + +(define-wrapper-syntax progn (&rest forms) + (dolist (form forms) + (process-wrapper-form out form))) + +(define-wrapper-syntax in-package (name) + (assert (find-package name) (name) + "Wrapper file specified (in-package ~s)~%~ + however that does not name a known package." + name) + (setq *package* (find-package name)) + (push `(in-package ,name) *lisp-forms*)) + +(define-wrapper-syntax c (&rest strings) + (dolist (string strings) + (write-line string out))) + +(define-wrapper-syntax flag (&rest flags) + (appendf *cc-flags* (parse-command-flags-list flags))) + +(define-wrapper-syntax proclaim (&rest proclamations) + (push `(proclaim ,@proclamations) *lisp-forms*)) + +(define-wrapper-syntax declaim (&rest declamations) + (push `(declaim ,@declamations) *lisp-forms*)) + +(define-wrapper-syntax define (name &optional value) + (format out "#define ~A~@[ ~A~]~%" name value)) + +(define-wrapper-syntax include (&rest includes) + (format out "~{#include <~A>~%~}" includes)) + +;;; FIXME: this function is not complete. Should probably follow +;;; typedefs? Should definitely understand pointer types. +(defun c-type-name (typespec) + (let ((spec (ensure-list typespec))) + (if (stringp (car spec)) + (car spec) + (case (car spec) + ((:uchar :unsigned-char) "unsigned char") + ((:unsigned-short :ushort) "unsigned short") + ((:unsigned-int :uint) "unsigned int") + ((:unsigned-long :ulong) "unsigned long") + ((:long-long :llong) "long long") + ((:unsigned-long-long :ullong) "unsigned long long") + (:pointer "void*") + (:string "char*") + (t (cffi::foreign-name (car spec) nil)))))) + +(defun cffi-type (typespec) + (if (and (listp typespec) (stringp (car typespec))) + (second typespec) + typespec)) + +(defun symbol* (s) + (check-type s (and symbol (not null))) + s) + +(define-wrapper-syntax defwrapper (name-and-options rettype &rest args) + (multiple-value-bind (lisp-name foreign-name options) + (cffi::parse-name-and-options name-and-options) + (let* ((foreign-name-wrap (strcat foreign-name "_cffi_wrap")) + (fargs (mapcar (lambda (arg) + (list (c-type-name (second arg)) + (cffi::foreign-name (first arg) nil))) + args)) + (fargnames (mapcar #'second fargs))) + ;; output C code + (format out "~A ~A" (c-type-name rettype) foreign-name-wrap) + (format out "(~{~{~A ~A~}~^, ~})~%" fargs) + (format out "{~% return ~A(~{~A~^, ~});~%}~%~%" foreign-name fargnames) + ;; matching bindings + (push `(cffi:defcfun (,foreign-name-wrap ,lisp-name ,@options) + ,(cffi-type rettype) + ,@(mapcar (lambda (arg) + (list (symbol* (first arg)) + (cffi-type (second arg)))) + args)) + *lisp-forms*)))) + +(define-wrapper-syntax defwrapper* (name-and-options rettype args &rest c-lines) + ;; output C code + (multiple-value-bind (lisp-name foreign-name options) + (cffi::parse-name-and-options name-and-options) + (let ((foreign-name-wrap (strcat foreign-name "_cffi_wrap")) + (fargs (mapcar (lambda (arg) + (list (c-type-name (second arg)) + (cffi::foreign-name (first arg) nil))) + args))) + (format out "~A ~A" (c-type-name rettype) + foreign-name-wrap) + (format out "(~{~{~A ~A~}~^, ~})~%" fargs) + (format out "{~%~{ ~A~%~}}~%~%" c-lines) + ;; matching bindings + (push `(cffi:defcfun (,foreign-name-wrap ,lisp-name ,@options) + ,(cffi-type rettype) + ,@(mapcar (lambda (arg) + (list (symbol* (first arg)) + (cffi-type (second arg)))) + args)) + *lisp-forms*)))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/grovel/package.lisp b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/grovel/package.lisp new file mode 100644 index 0000000..c5c692e --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/grovel/package.lisp @@ -0,0 +1,36 @@ +;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- +;;; +;;; package.lisp --- Groveler DEFPACKAGE. +;;; +;;; Permission is hereby granted, free of charge, to any person +;;; obtaining a copy of this software and associated documentation +;;; files (the "Software"), to deal in the Software without +;;; restriction, including without limitation the rights to use, copy, +;;; modify, merge, publish, distribute, sublicense, and/or sell copies +;;; of the Software, and to permit persons to whom the Software is +;;; furnished to do so, subject to the following conditions: +;;; +;;; The above copyright notice and this permission notice shall be +;;; included in all copies or substantial portions of the Software. +;;; +;;; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +;;; EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +;;; MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +;;; NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +;;; HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +;;; WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +;;; OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +;;; DEALINGS IN THE SOFTWARE. +;;; + +(uiop:define-package #:cffi-grovel + (:mix #:cffi-toolchain #:asdf #:uiop #:alexandria #:common-lisp) + (:export + ;; Class name + #:grovel-file + #:process-grovel-file + #:wrapper-file + #:process-wrapper-file + ;; Error conditions + #:grovel-error + #:missing-definition)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/libffi/funcall.lisp b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/libffi/funcall.lisp new file mode 100644 index 0000000..75e0e75 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/libffi/funcall.lisp @@ -0,0 +1,132 @@ +;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- +;;; +;;; funcall.lisp -- FOREIGN-FUNCALL implementation using libffi +;;; +;;; Copyright (C) 2009, 2010, 2011 Liam M. Healy +;;; +;;; Permission is hereby granted, free of charge, to any person +;;; obtaining a copy of this software and associated documentation +;;; files (the "Software"), to deal in the Software without +;;; restriction, including without limitation the rights to use, copy, +;;; modify, merge, publish, distribute, sublicense, and/or sell copies +;;; of the Software, and to permit persons to whom the Software is +;;; furnished to do so, subject to the following conditions: +;;; +;;; The above copyright notice and this permission notice shall be +;;; included in all copies or substantial portions of the Software. +;;; +;;; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +;;; EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +;;; MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +;;; NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +;;; HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +;;; WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +;;; OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +;;; DEALINGS IN THE SOFTWARE. +;;; + +(in-package #:cffi) + +(define-condition libffi-error (cffi-error) + ((function-name + :initarg :function-name :reader function-name))) + +(define-condition simple-libffi-error (simple-error libffi-error) + ()) + +(defun libffi-error (function-name format-control &rest format-arguments) + (error 'simple-libffi-error + :function-name function-name + :format-control format-control + :format-arguments format-arguments)) + +(defun make-libffi-cif (function-name return-type argument-types + &optional (abi :default-abi)) + "Generate or retrieve the Call InterFace needed to call the function through libffi." + (let* ((argument-count (length argument-types)) + (cif (foreign-alloc '(:struct ffi-cif))) + (ffi-argtypes (foreign-alloc :pointer :count argument-count))) + (loop + :for type :in argument-types + :for index :from 0 + :do (setf (mem-aref ffi-argtypes :pointer index) + (make-libffi-type-descriptor (parse-type type)))) + (unless (eql :ok (libffi/prep-cif cif abi argument-count + (make-libffi-type-descriptor (parse-type return-type)) + ffi-argtypes)) + (libffi-error function-name + "The 'ffi_prep_cif' libffi call failed for function ~S." + function-name)) + cif)) + +(defun free-libffi-cif (ptr) + (foreign-free (foreign-slot-value ptr '(:struct ffi-cif) 'argument-types)) + (foreign-free ptr)) + +(defun translate-objects-ret (symbols function-arguments types return-type call-form) + (translate-objects + symbols + function-arguments + types + return-type + (if (or (eql return-type :void) + (typep (parse-type return-type) 'translatable-foreign-type)) + call-form + ;; built-in types won't be translated by + ;; expand-from-foreign, we have to do it here + `(mem-ref + ,call-form + ',(canonicalize-foreign-type return-type))) + t)) + +(defun foreign-funcall-form/fsbv-with-libffi (function function-arguments symbols types + return-type argument-types + &optional pointerp (abi :default-abi)) + "A body of foreign-funcall calling the libffi function #'call (ffi_call)." + (let ((argument-count (length argument-types))) + `(with-foreign-objects ((argument-values :pointer ,argument-count) + ,@(unless (eql return-type :void) + `((result ',return-type)))) + ,(translate-objects-ret + symbols function-arguments types return-type + ;; NOTE: We must delay the cif creation until the first call + ;; because it's FOREIGN-ALLOC'd, i.e. it gets corrupted by an + ;; image save/restore cycle. This way a lib will remain usable + ;; through a save/restore cycle if the save happens before any + ;; FFI calls will have been made, i.e. nothing is malloc'd yet. + `(progn + (loop + :for arg :in (list ,@symbols) + :for count :from 0 + :do (setf (mem-aref argument-values :pointer count) arg)) + (let* ((libffi-cif-cache (load-time-value (cons 'libffi-cif-cache nil))) + (libffi-cif (or (cdr libffi-cif-cache) + (setf (cdr libffi-cif-cache) + ;; FIXME ideally we should install a finalizer on the cons + ;; that calls FREE-LIBFFI-CIF on the cif (when the function + ;; gets redefined, and the cif becomes unreachable). but a + ;; finite world is full of compromises... - attila + (make-libffi-cif ,function ',return-type + ',argument-types ',abi))))) + (libffi/call libffi-cif + ,(if pointerp + function + `(foreign-symbol-pointer ,function)) + ,(if (eql return-type :void) '(null-pointer) 'result) + argument-values) + ,(if (eql return-type :void) + '(values) + 'result))))))) + +(setf *foreign-structures-by-value* 'foreign-funcall-form/fsbv-with-libffi) + +;; DEPRECATED Its presence encourages the use of #+fsbv which may lead to the +;; situation where a fasl was produced by an image that has fsbv feature +;; and then ends up being loaded into an image later that has no fsbv support +;; loaded. Use explicit ASDF dependencies instead and assume the presence +;; of the feature accordingly. +(pushnew :fsbv *features*) + +;; DEPRECATED This is here only for backwards compatibility until its fate is +;; decided. See the mailing list discussion for details. +(defctype :sizet size-t) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/libffi/libffi-functions.lisp b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/libffi/libffi-functions.lisp new file mode 100644 index 0000000..0c5bd60 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/libffi/libffi-functions.lisp @@ -0,0 +1,43 @@ +;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- +;;; +;;; init.lisp --- Load libffi and define basics +;;; +;;; Copyright (C) 2009, 2010, 2011 Liam Healy +;;; +;;; Permission is hereby granted, free of charge, to any person +;;; obtaining a copy of this software and associated documentation +;;; files (the "Software"), to deal in the Software without +;;; restriction, including without limitation the rights to use, copy, +;;; modify, merge, publish, distribute, sublicense, and/or sell copies +;;; of the Software, and to permit persons to whom the Software is +;;; furnished to do so, subject to the following conditions: +;;; +;;; The above copyright notice and this permission notice shall be +;;; included in all copies or substantial portions of the Software. +;;; +;;; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +;;; EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +;;; MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +;;; NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +;;; HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +;;; WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +;;; OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +;;; DEALINGS IN THE SOFTWARE. +;;; + +(in-package #:cffi) + +;;; See file:///usr/share/doc/libffi-dev/html/The-Basics.html#The-Basics + +(defcfun ("ffi_prep_cif" libffi/prep-cif) status + (ffi-cif :pointer) + (ffi-abi abi) + (nargs :uint) + (rtype :pointer) + (argtypes :pointer)) + +(defcfun ("ffi_call" libffi/call) :void + (ffi-cif :pointer) + (function :pointer) + (rvalue :pointer) + (avalues :pointer)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/libffi/libffi-types.lisp b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/libffi/libffi-types.lisp new file mode 100644 index 0000000..b2ec1dd --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/libffi/libffi-types.lisp @@ -0,0 +1,110 @@ +;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- +;;; +;;; libffi-types.lisp -- CFFI-Grovel definitions for libffi +;;; +;;; Copyright (C) 2009, 2010, 2011, 2017 Liam M. Healy +;;; +;;; Permission is hereby granted, free of charge, to any person +;;; obtaining a copy of this software and associated documentation +;;; files (the "Software"), to deal in the Software without +;;; restriction, including without limitation the rights to use, copy, +;;; modify, merge, publish, distribute, sublicense, and/or sell copies +;;; of the Software, and to permit persons to whom the Software is +;;; furnished to do so, subject to the following conditions: +;;; +;;; The above copyright notice and this permission notice shall be +;;; included in all copies or substantial portions of the Software. +;;; +;;; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +;;; EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +;;; MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +;;; NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +;;; HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +;;; WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +;;; OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +;;; DEALINGS IN THE SOFTWARE. +;;; + +(in-package #:cffi) + +#+linux +(define "_GNU_SOURCE") + +;; When installed through Mac Ports, libffi include files +;; will be found in /opt/local/include. +#+darwin +(cc-flags "-I/opt/local/include/") + +#+openbsd +(cc-flags "-I/usr/local/include") + +#+freebsd +(cc-flags "-I/usr/local/include") + +(pkg-config-cflags "libffi" :optional t) + +#+darwin +(include "ffi/ffi.h") +#-darwin +(include "ffi.h") + +(cenum status + ((:ok "FFI_OK")) + ((:bad-typedef "FFI_BAD_TYPEDEF")) + ((:bad-abi "FFI_BAD_ABI"))) + +#+freebsd +(cenum abi + ((:default-abi "FFI_DEFAULT_ABI"))) + +#+(and windows x86-64) +(cenum abi + ((:default-abi "FFI_DEFAULT_ABI")) + ((:win64 "FFI_WIN64"))) + +#+(and windows (not x86-64)) +(cenum abi + ((:default-abi "FFI_DEFAULT_ABI")) + ((:sysv "FFI_SYSV")) + ((:stdcall "FFI_STDCALL"))) + +#-(or freebsd windows) +(cenum abi + ((:default-abi "FFI_DEFAULT_ABI")) + #-x86-64 + ((:sysv "FFI_SYSV")) + ((:unix64 "FFI_UNIX64"))) + +(ctype ffi-abi "ffi_abi") + +(ctype size-t "size_t") + +(cstruct ffi-type "struct _ffi_type" + (size "size" :type size-t) + (alignment "alignment" :type :unsigned-short) + (type "type" :type :unsigned-short) + (elements "elements" :type :pointer)) + +(cstruct ffi-cif "ffi_cif" + (abi "abi" :type ffi-abi) + (argument-count "nargs" :type :unsigned-int) + (argument-types "arg_types" :type :pointer) + (return-type "rtype" :type :pointer) + (bytes "bytes" :type :unsigned-int) + (flags "flags" :type :unsigned-int)) + +(constant (+type-void+ "FFI_TYPE_VOID")) +(constant (+type-int+ "FFI_TYPE_INT")) +(constant (+type-float+ "FFI_TYPE_FLOAT")) +(constant (+type-double+ "FFI_TYPE_DOUBLE")) +(constant (+type-longdouble+ "FFI_TYPE_LONGDOUBLE")) +(constant (+type-uint8+ "FFI_TYPE_UINT8")) +(constant (+type-sint8+ "FFI_TYPE_SINT8")) +(constant (+type-uint16+ "FFI_TYPE_UINT16")) +(constant (+type-sint16+ "FFI_TYPE_SINT16")) +(constant (+type-uint32+ "FFI_TYPE_UINT32")) +(constant (+type-sint32+ "FFI_TYPE_SINT32")) +(constant (+type-uint64+ "FFI_TYPE_UINT64")) +(constant (+type-sint64+ "FFI_TYPE_SINT64")) +(constant (+type-struct+ "FFI_TYPE_STRUCT")) +(constant (+type-pointer+ "FFI_TYPE_POINTER")) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/libffi/libffi.lisp b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/libffi/libffi.lisp new file mode 100644 index 0000000..0dd2a54 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/libffi/libffi.lisp @@ -0,0 +1,38 @@ +;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- +;;; +;;; libffi.lisp --- Load libffi +;;; +;;; Copyright (C) 2009, 2011 Liam M. Healy +;;; +;;; Permission is hereby granted, free of charge, to any person +;;; obtaining a copy of this software and associated documentation +;;; files (the "Software"), to deal in the Software without +;;; restriction, including without limitation the rights to use, copy, +;;; modify, merge, publish, distribute, sublicense, and/or sell copies +;;; of the Software, and to permit persons to whom the Software is +;;; furnished to do so, subject to the following conditions: +;;; +;;; The above copyright notice and this permission notice shall be +;;; included in all copies or substantial portions of the Software. +;;; +;;; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +;;; EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +;;; MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +;;; NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +;;; HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +;;; WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +;;; OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +;;; DEALINGS IN THE SOFTWARE. +;;; + +(in-package #:cffi) + +(define-foreign-library (libffi) + (:darwin (:or "libffi.dylib" "libffi32.dylib" "/usr/lib/libffi.dylib")) + (:solaris (:or "/usr/lib/amd64/libffi.so" "/usr/lib/libffi.so")) + (:openbsd "libffi.so") + (:unix (:or "libffi.so.7" "libffi32.so.7" "libffi.so.6" "libffi32.so.6" "libffi.so.5" "libffi32.so.5")) + (:windows (:or "libffi-7.dll" "libffi-6.dll" "libffi-5.dll" "libffi.dll")) + (t (:default "libffi"))) + +(load-foreign-library 'libffi) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/libffi/type-descriptors.lisp b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/libffi/type-descriptors.lisp new file mode 100644 index 0000000..6e67e31 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/libffi/type-descriptors.lisp @@ -0,0 +1,106 @@ +;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- +;;; +;;; type-descriptors.lisp --- Build malloc'd libffi type descriptors +;;; +;;; Copyright (C) 2009, 2011 Liam M. Healy +;;; +;;; Permission is hereby granted, free of charge, to any person +;;; obtaining a copy of this software and associated documentation +;;; files (the "Software"), to deal in the Software without +;;; restriction, including without limitation the rights to use, copy, +;;; modify, merge, publish, distribute, sublicense, and/or sell copies +;;; of the Software, and to permit persons to whom the Software is +;;; furnished to do so, subject to the following conditions: +;;; +;;; The above copyright notice and this permission notice shall be +;;; included in all copies or substantial portions of the Software. +;;; +;;; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +;;; EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +;;; MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +;;; NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +;;; HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +;;; WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +;;; OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +;;; DEALINGS IN THE SOFTWARE. +;;; + +(in-package #:cffi) + +(defmacro type-descriptor-ptr (type) + `(foreign-symbol-pointer ,(format nil "ffi_type_~(~A~)" type))) + +(defmacro type-descriptor-ptr/integer (type) + `(foreign-symbol-pointer + ,(format nil "ffi_type_~Aint~D" + (if (string-equal type "unsigned" + :end1 (min 8 (length (string type)))) + "u" "s") + (* 8 (foreign-type-size type))))) + +(defun %make-libffi-type-descriptor/struct (type) + (labels + ((slot-multiplicity (slot) + (if (typep slot 'aggregate-struct-slot) + (slot-count slot) + 1)) + (number-of-items (structure-type) + "Total number of items in the foreign structure." + (loop for val being the hash-value of (structure-slots structure-type) + sum (slot-multiplicity val)))) + (let* ((ptr (foreign-alloc '(:struct ffi-type))) + (nitems (number-of-items type)) + (type-pointer-array + (foreign-alloc :pointer :count (1+ nitems)))) + (loop for slot in (slots-in-order type) + for ltp = (make-libffi-type-descriptor + (parse-type (slot-type slot))) + with slot-counter = 0 + do (if ltp + (loop + repeat (slot-multiplicity slot) + do (setf + (mem-aref + type-pointer-array :pointer slot-counter) + ltp) + (incf slot-counter)) + (libffi-error nil + "Slot type ~A in foreign structure is unknown to libffi." + (unparse-type (slot-type slot))))) + (setf (mem-aref type-pointer-array :pointer nitems) + (null-pointer)) + (macrolet ((store (slot value) + `(setf (foreign-slot-value ptr '(:struct ffi-type) ',slot) ,value))) + (store size 0) + (store alignment 0) + (store type +type-struct+) + (store elements type-pointer-array)) + ptr))) + +(defgeneric make-libffi-type-descriptor (object) + (:documentation "Build a libffi struct that describes the type for libffi. This will be used as a cached static read-only argument when the actual call happens.") + (:method ((object foreign-built-in-type)) + (let ((type-keyword (type-keyword object))) + #.`(case type-keyword + ,@(loop + :for type :in (append *built-in-float-types* + *other-builtin-types*) + :collect `(,type (type-descriptor-ptr ,type))) + ,@(loop + :for type :in *built-in-integer-types* + :collect `(,type (type-descriptor-ptr/integer ,type))) + ;; there's a generic error report in an :around method + ))) + (:method ((type foreign-pointer-type)) + ;; simplify all pointer types into a void* + (type-descriptor-ptr :pointer)) + (:method ((type foreign-struct-type)) + (%make-libffi-type-descriptor/struct type)) + (:method :around (object) + (let ((result (call-next-method))) + (assert result () "~S failed on ~S. That's bad." + 'make-libffi-type-descriptor object) + result)) + (:method ((type foreign-type-alias)) + ;; Set the type pointer on demand for alias types (e.g. typedef, enum, etc) + (make-libffi-type-descriptor (actual-type type)))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/scripts/release.lisp b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/scripts/release.lisp new file mode 100644 index 0000000..ee2c094 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/scripts/release.lisp @@ -0,0 +1,248 @@ +#!/usr/bin/env clisp +;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- + +(defpackage :release-script (:use #:cl #:regexp)) +(in-package :release-script) + +;;;; Configuration ------------------------------------------------------------ + +(defparameter *project-name* "cffi") +(defparameter *asdf-file* (format nil "~A.asd" *project-name*)) + +(defparameter *host* "common-lisp.net") +(defparameter *release-dir* + (format nil "/project/~A/public_html/releases" *project-name*)) + +(defparameter *version-file* "VERSION") +(defparameter *version-file-dir* + (format nil "/project/~A/public_html" *project-name*)) + +;;;; -------------------------------------------------------------------------- + +;;;; Utilities + +(defun ensure-list (x) + (if (listp x) x (list x))) + +(defmacro string-case (expression &body clauses) + `(let ((it ,expression)) ; yes, anaphoric, deal with it. + (cond + ,@(loop for clause in clauses collect + `((or ,@(loop for alternative in (ensure-list (first clause)) + collect (or (eq t alternative) + `(string= it ,alternative)))) + ,@(rest clause)))))) + +(defparameter *development-mode* nil) + +(defun die (format-control &rest format-args) + (format *error-output* "~?" format-control format-args) + (if *development-mode* + (cerror "continue" "die") + (ext:quit 1))) + +(defun numeric-split (string) + (if (digit-char-p (char string 0)) + (multiple-value-bind (number next-position) + (parse-integer string :junk-allowed t) + (cons number (when (< next-position (length string)) + (numeric-split (subseq string next-position))))) + (let ((next-digit-position (position-if #'digit-char-p string))) + (if next-digit-position + (cons (subseq string 0 next-digit-position) + (numeric-split (subseq string next-digit-position))) + (list string))))) + +(defun natural-string-< (s1 s2) + (labels ((aux< (l1 l2) + (cond ((null l1) (not (null l2))) + ((null l2) nil) + (t (destructuring-bind (x . xs) l1 + (destructuring-bind (y . ys) l2 + (cond ((and (numberp x) (stringp y)) + t) + ((and (numberp y) (stringp x)) + nil) + ((and (numberp x) (numberp y)) + (or (< x y) (and (= x y) (aux< xs ys)))) + (t + (or (string-lessp x y) + (and (string-equal x y) + (aux< xs ys))))))))))) + (aux< (numeric-split s1) + (numeric-split s2)))) + +;;;; Running commands + +(defparameter *dry-run* nil) + +(defun cmd? (format-control &rest format-args) + (let ((cmd (format nil "~?" format-control format-args))) + (with-open-stream (s1 (ext:run-shell-command cmd :output :stream)) + (loop for line = (read-line s1 nil nil) + while line + collect line)))) + +;; XXX: quote arguments. +(defun cmd (format-control &rest format-args) + (when *development-mode* + (format *debug-io* "CMD: ~?~%" format-control format-args)) + (let ((ret (ext:run-shell-command (format nil "~?" format-control format-args)))) + (or (null ret) + (zerop ret)))) + +(defun cmd! (format-control &rest format-args) + (or (apply #'cmd format-control format-args) + (die "cmd '~?' failed." format-control format-args))) + +(defun maybe-cmd! (format-control &rest format-args) + (if *dry-run* + (format t "SUPPRESSING: ~?~%" format-control format-args) + (apply #'cmd! format-control format-args))) + +;;;; + +(defun find-current-version () + (subseq (reduce (lambda (x y) (if (natural-string-< x y) y x)) + (or (cmd? "git tag -l v\\*") + (die "no version tags found. Please specify initial version."))) + 1)) + +(defun parse-version (string) + (mapcar (lambda (x) + (parse-integer x :junk-allowed t)) + (loop repeat 3 ; XXX: parameterize + for el in (regexp-split "\\." (find-current-version)) + collect el))) + +(defun check-for-unrecorded-changes (&optional force) + (unless (cmd "git diff --exit-code") + (write-line "Unrecorded changes.") + (if force + (write-line "Continuing anyway.") + (die "Aborting.~@ + Use -f or --force if you want to make a release anyway.")))) + +(defun new-version-number-candidates (current-version) + (labels ((alternatives (before after) + (when after + (cons (append before + (list (1+ (first after))) + (mapcar (constantly 0) (rest after))) + (alternatives (append before (list (first after))) + (rest after)))))) + (loop for alt in (alternatives nil (parse-version current-version)) + collect (format nil "~{~d~^.~}" alt)))) + +(defun ask-user-for-version (current-version next-versions) + (format *query-io* "Current version is ~A. Which will be the next one?~%" + current-version) + (loop for i from 1 and version in next-versions + do (format *query-io* "~T~A) ~A~%" i version)) + (format *query-io* "? ") + (finish-output *query-io*) + (nth (1- (parse-integer (read-line) :junk-allowed t)) + next-versions)) + +(defun git-tag-tree (version) + (write-line "Tagging the tree...") + (maybe-cmd! "git tag \"v~A\"" version)) + +(defun add-version-to-system-file (version path-in path-out) + (let ((defsystem-line (format nil "(defsystem :~A" *project-name*))) + (with-open-file (in path-in :direction :input) + (with-open-file (out path-out :direction :output) + (loop for line = (read-line in nil nil) while line + do (write-line line out) + when (string= defsystem-line line) + do (format out " :version ~s~%" version)))))) + +(defun create-dist (version distname) + (write-line "Creating distribution...") + (cmd! "mkdir \"~a\"" distname) + (cmd! "git archive master | tar xC \"~A\"" distname) + (format t "Updating ~A with new version: ~A~%" *asdf-file* version) + (let* ((asdf-file-path (format nil "~A/~A" distname *asdf-file*)) + (tmp-asdf-file-path (format nil "~a.tmp" asdf-file-path))) + (add-version-to-system-file version asdf-file-path tmp-asdf-file-path) + (cmd! "mv \"~a\" \"~a\"" tmp-asdf-file-path asdf-file-path))) + +(defun tar-and-sign (distname tarball) + (write-line "Creating and signing tarball...") + (cmd! "tar czf \"~a\" \"~a\"" tarball distname) + (cmd! "gpg -b -a \"~a\"" tarball)) + +(defparameter *remote-directory* (format nil "~A:~A" *host* *release-dir*)) + +(defun upload-tarball (tarball signature remote-directory) + (write-line "Copying tarball to web server...") + (maybe-cmd! "scp \"~A\" \"~A\" \"~A\"" tarball signature remote-directory) + (format t "Uploaded ~A and ~A.~%" tarball signature)) + +(defun update-remote-links (tarball signature host release-dir project-name) + (format t "Updating ~A_latest links...~%" project-name) + (maybe-cmd! "ssh \"~A\" ln -sf \"~A\" \"~A/~A_latest.tar.gz\"" + host tarball release-dir project-name) + (maybe-cmd! "ssh \"~A\" ln -sf \"~A\" \"~A/~A_latest.tar.gz.asc\"" + host signature release-dir project-name)) + +(defun upload-version-file (version version-file host version-file-dir) + (format t "Uploading ~A...~%" version-file) + (with-open-file (out version-file :direction :output) + (write-string version out)) + (maybe-cmd! "scp \"~A\" \"~A\":\"~A\"" version-file host version-file-dir) + (maybe-cmd! "rm \"~A\"" version-file)) + +(defun maybe-clean-things-up (tarball signature) + (when (y-or-n-p "Clean local tarball and signature?") + (cmd! "rm \"~A\" \"~A\"" tarball signature))) + +(defun run (force version) + (check-for-unrecorded-changes force) + ;; figure out what version we'll be preparing. + (unless version + (let* ((current-version (find-current-version)) + (next-versions (new-version-number-candidates current-version))) + (setf version (or (ask-user-for-version current-version next-versions) + (die "invalid selection."))))) + (git-tag-tree version) + (let* ((distname (format nil "~A_~A" *project-name* version)) + (tarball (format nil "~A.tar.gz" distname)) + (signature (format nil "~A.asc" tarball))) + ;; package things up. + (create-dist version distname) + (tar-and-sign distname tarball) + ;; upload. + (upload-tarball tarball signature *remote-directory*) + (update-remote-links tarball signature *host* *release-dir* *project-name*) + (when *version-file* + (upload-version-file version *version-file* *host* *version-file-dir*)) + ;; clean up. + (maybe-clean-things-up tarball signature) + ;; documentation. + (write-line "Building and uploading documentation...") + (maybe-cmd! "make -C doc upload-docs") + ;; push tags and any outstanding changes. + (write-line "Pushing tags and changes...") + (maybe-cmd! "git push --tags origin master"))) + + +;;;; Do it to it + +(let ((force nil) + (version nil) + (args ext:*args*)) + (loop while args + do (string-case (pop args) + (("-h" "--help") + (write-line "No help, sorry. Read the source.") + (ext:quit 0)) + (("-f" "--force") + (setf force t)) + (("-v" "--version") + (setf version (pop args))) + (("-n" "--dry-run") + (setf *dry-run* t)) + (t + (die "Unrecognized argument '~a'" it)))) + (run force version)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/c2ffi/asdf.lisp b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/c2ffi/asdf.lisp new file mode 100644 index 0000000..6f7d207 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/c2ffi/asdf.lisp @@ -0,0 +1,211 @@ +;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- +;;; +;;; asdf.lisp --- ASDF components for cffi/c2ffi. +;;; +;;; Copyright (C) 2015, Attila Lendvai +;;; +;;; Permission is hereby granted, free of charge, to any person +;;; obtaining a copy of this software and associated documentation +;;; files (the "Software"), to deal in the Software without +;;; restriction, including without limitation the rights to use, copy, +;;; modify, merge, publish, distribute, sublicense, and/or sell copies +;;; of the Software, and to permit persons to whom the Software is +;;; furnished to do so, subject to the following conditions: +;;; +;;; The above copyright notice and this permission notice shall be +;;; included in all copies or substantial portions of the Software. +;;; +;;; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +;;; EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +;;; MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +;;; NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +;;; HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +;;; WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +;;; OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +;;; DEALINGS IN THE SOFTWARE. +;;; + +(in-package #:cffi/c2ffi) + +(defclass c2ffi-file (cl-source-file) + ((package :initarg :package + :initform nil + :accessor c2ffi-file/package) + (c2ffi-executable :initarg :c2ffi-executable + :accessor c2ffi-file/c2ffi-executable) + (trace-c2ffi :initarg :trace-c2ffi + :accessor c2ffi-file/trace-c2ffi) + (prelude :initform nil + :initarg :prelude + :accessor c2ffi-file/prelude) + (sys-include-paths :initarg :sys-include-paths + :initform nil + :accessor c2ffi-file/sys-include-paths) + (exclude-archs :initarg :exclude-archs + :initform nil + :accessor c2ffi-file/exclude-archs) + ;; The following slots correspond to an arg of the same name for + ;; the generator function. No accessors are needed, they just hold + ;; the data until it gets delegated to the generator function using + ;; SLOT-VALUE and a LOOP. + (ffi-name-transformer :initarg :ffi-name-transformer + :initform 'default-ffi-name-transformer) + (ffi-name-export-predicate :initarg :ffi-name-export-predicate + :initform 'default-ffi-name-export-predicate) + (ffi-type-transformer :initarg :ffi-type-transformer + :initform 'default-ffi-type-transformer) + (callback-factory :initarg :callback-factory + :initform 'default-callback-factory) + (foreign-library-name :initarg :foreign-library-name + :initform nil) + (foreign-library-spec :initarg :foreign-library-spec + :initform nil) + (emit-generated-name-mappings :initarg :emit-generated-name-mappings + :initform :t) + (include-sources :initarg :include-sources + :initform :all) + (exclude-sources :initarg :exclude-sources + :initform nil) + (include-definitions :initarg :include-definitions + :initform :all) + (exclude-definitions :initarg :exclude-definitions + :initform nil)) + (:default-initargs + :type nil) + (:documentation + "The input of this ASDF component is a C header file and the configuration for +the binding generation process. This header file will define the initial scope of +the generation process, which can be further filtered by other configuration +parameters. + +A clang/llvm based external program called 'c2ffi' is used to process this header +file and generate a json spec file for each supported architecture triplet. Normally +these .spec files are only (re)generated by the author of the lib and are checked into +the corresponding source repository. It needs to be done manually by invoking the +following command: + +(cffi/c2ffi:generate-spec :your-system) + +which is a shorthand for: + +(asdf:operate 'cffi/c2ffi::generate-spec-op :your-system) + +The generation of the underlying platform's json file must succeed, but the +generation for the other arch's is allowed to fail +\(see ENSURE-SPEC-FILE-IS-UP-TO-DATE for details). + +During the normal build process the json file is used as the input to generate +a lisp file containing the CFFI definitions (see PROCESS-C2FFI-SPEC-FILE). +This file will be placed next to the .spec file, and will be compiled as any +other lisp file. This process requires loading the ASDF system called +\"cffi/c2ffi-generator\" that has more dependencies than CFFI itself. If you +want to avoid those extra dependencies in your project, then you can check in +these generated lisp files into your source repository, but keep in mind that +you'll need to manually force their regeneration if CFFI/C2FFI itself gets +updated (by e.g. deleting them from the filesystem) .")) + +(defun input-file (operation component) + (let ((files (input-files operation component))) + (assert (length=n-p files 1)) + (first files))) + +(defclass generate-spec-op (downward-operation) + ()) + +(defun generate-spec (system) + (asdf:operate 'generate-spec-op system)) + +(defmethod input-files ((op generate-spec-op) (c c2ffi-file)) + (list (component-pathname c))) + +(defmethod component-depends-on ((op generate-spec-op) (c c2ffi-file)) + `((prepare-op ,c) ,@(call-next-method))) + +(defmethod output-files ((op generate-spec-op) (c c2ffi-file)) + (let* ((input-file (input-file op c)) + (spec-file (spec-path input-file))) + (values + (list spec-file) + ;; Tell ASDF not to apply output translation. + t))) + +(defmethod perform ((op generate-spec-op) (c asdf:component)) + (values)) + +(defmethod perform ((op generate-spec-op) (c c2ffi-file)) + (let ((input-file (input-file op c)) + (*c2ffi-executable* (if (slot-boundp c 'c2ffi-executable) + (c2ffi-file/c2ffi-executable c) + *c2ffi-executable*)) + (*trace-c2ffi* (if (slot-boundp c 'trace-c2ffi) + (c2ffi-file/trace-c2ffi c) + *trace-c2ffi*))) + ;; NOTE: we don't call OUTPUT-FILE here, which may be a violation + ;; of the ASDF contract, that promises that OUTPUT-FILE can be + ;; customized by users. + (ensure-spec-file-is-up-to-date + input-file + :exclude-archs (c2ffi-file/exclude-archs c) + :sys-include-paths (c2ffi-file/sys-include-paths c)))) + +(defclass generate-lisp-op (downward-operation) + ()) + +(defmethod component-depends-on ((op generate-lisp-op) (c c2ffi-file)) + `((load-op ,(find-system "cffi/c2ffi-generator")) + ,@(call-next-method))) + +(defmethod component-depends-on ((op compile-op) (c c2ffi-file)) + `((generate-lisp-op ,c) ,@(call-next-method))) + +(defmethod component-depends-on ((op load-source-op) (c c2ffi-file)) + `((generate-lisp-op ,c) ,@(call-next-method))) + +(defmethod input-files ((op generate-lisp-op) (c c2ffi-file)) + (list (output-file 'generate-spec-op c))) + +(defmethod input-files ((op compile-op) (c c2ffi-file)) + (list (output-file 'generate-lisp-op c))) + +(defmethod output-files ((op generate-lisp-op) (c c2ffi-file)) + (let* ((spec-file (input-file op c)) + (generated-lisp-file (make-pathname :type "lisp" + :defaults spec-file))) + (values + (list generated-lisp-file) + ;; Tell ASDF not to apply output translation. + t))) + +(defmethod perform ((op generate-lisp-op) (c c2ffi-file)) + (let ((spec-file (input-file op c)) + (generated-lisp-file (output-file op c))) + (with-staging-pathname (tmp-output generated-lisp-file) + (format *debug-io* "~&; CFFI/C2FFI is generating the file ~S~%" generated-lisp-file) + (apply 'process-c2ffi-spec-file + spec-file (c2ffi-file/package c) + :output tmp-output + :output-encoding (asdf:component-encoding c) + :prelude (let ((prelude (c2ffi-file/prelude c))) + (if (and (pathnamep prelude) + (not (absolute-pathname-p prelude))) + (merge-pathnames* prelude (component-pathname c)) + prelude)) + ;; The following slots and keyword args have the same name in the ASDF + ;; component and in PROCESS-C2FFI-SPEC-FILE, and this loop copies them. + (loop + :for arg :in '(ffi-name-transformer + ffi-name-export-predicate + ffi-type-transformer + callback-factory + foreign-library-name + foreign-library-spec + emit-generated-name-mappings + include-sources + exclude-sources + include-definitions + exclude-definitions) + :append (list (make-keyword arg) + (slot-value c arg))))))) + +;; Allow for naked :cffi/c2ffi-file in asdf definitions. +(setf (find-class 'asdf::cffi/c2ffi-file) (find-class 'c2ffi-file)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/c2ffi/c2ffi.lisp b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/c2ffi/c2ffi.lisp new file mode 100644 index 0000000..c3a88fa --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/c2ffi/c2ffi.lisp @@ -0,0 +1,194 @@ +;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- +;;; +;;; c2ffi.lisp --- c2ffi related code +;;; +;;; Copyright (C) 2013, Ryan Pavlik +;;; Copyright (C) 2015, Attila Lendvai +;;; +;;; Permission is hereby granted, free of charge, to any person +;;; obtaining a copy of this software and associated documentation +;;; files (the "Software"), to deal in the Software without +;;; restriction, including without limitation the rights to use, copy, +;;; modify, merge, publish, distribute, sublicense, and/or sell copies +;;; of the Software, and to permit persons to whom the Software is +;;; furnished to do so, subject to the following conditions: +;;; +;;; The above copyright notice and this permission notice shall be +;;; included in all copies or substantial portions of the Software. +;;; +;;; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +;;; EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +;;; MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +;;; NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +;;; HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +;;; WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +;;; OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +;;; DEALINGS IN THE SOFTWARE. +;;; + +(in-package #:cffi/c2ffi) + +;;; NOTE: Most of this has been taken over from cl-autowrap. + +;;; Note this is rather untested and not very extensive at the moment; +;;; it should probably work on linux/win/osx though. Patches welcome. + +(defun local-cpu () + #+x86-64 "x86_64" + #+(and (not (or x86-64 freebsd)) x86) "i686" + #+(and (not x86-64) x86 freebsd) "i386" + #+arm "arm") + +(defun local-vendor () + #+(or linux windows) "-pc" + #+darwin "-apple" + #+(not (or linux windows darwin)) "-unknown") + +(defun local-os () + #+linux "-linux" + #+windows "-windows-msvc" + #+darwin "-darwin9" + #+freebsd "-freebsd") + +(defun local-environment () + #+linux "-gnu" + #-linux "") + +(defun local-arch () + (strcat (local-cpu) (local-vendor) (local-os) (local-environment))) + +(defparameter *known-archs* + '("i686-pc-linux-gnu" + "x86_64-pc-linux-gnu" + "i686-pc-windows-msvc" + "x86_64-pc-windows-msvc" + "i686-apple-darwin9" + "x86_64-apple-darwin9" + "i386-unknown-freebsd" + "x86_64-unknown-freebsd")) + +(defvar *c2ffi-executable* "c2ffi") + +(defvar *trace-c2ffi* nil) + +(defun c2ffi-executable-available? () + ;; This is a hack to determine if c2ffi exists; it assumes if it + ;; doesn't exist, we will get a return code other than 0. + (zerop (nth-value 2 (uiop:run-program `(,*c2ffi-executable* "-h") + :ignore-error-status t)))) + +(defun run-program* (program args &key (output (if *trace-c2ffi* *standard-output* nil)) + (error-output (if *trace-c2ffi* *error-output* nil)) + ignore-error-status) + (when *trace-c2ffi* + (format *debug-io* "~&; Invoking: ~A~{ ~A~}~%" program args)) + (zerop (nth-value 2 (uiop:run-program (list* program args) :output output + :error-output error-output + :ignore-error-status ignore-error-status)))) + +(defun generate-spec-with-c2ffi (input-header-file output-spec-path + &key arch sys-include-paths ignore-error-status) + "Run c2ffi on `INPUT-HEADER-FILE`, outputting to `OUTPUT-FILE` and +`MACRO-OUTPUT-FILE`, optionally specifying a target triple `ARCH`." + (uiop:with-temporary-file (:pathname tmp-macro-file + :keep *trace-c2ffi*) + nil ; workaround for an UIOP bug; delme eventually (attila, 2016-01-27). + :close-stream + (let* ((arch (when arch (list "--arch" arch))) + (sys-include-paths (loop + :for dir :in sys-include-paths + :append (list "--sys-include" dir)))) + ;; Invoke c2ffi to first emit C #define's into TMP-MACRO-FILE. We ask c2ffi + ;; to first generate a file of C global variables that are assigned the + ;; value of the corresponding #define's, so that in the second pass below + ;; the C compiler evaluates for us their right hand side and thus we can + ;; get hold of their value. This is a kludge and eventually we could/should + ;; support generating cffi-grovel files, and in grovel mode not rely + ;; on this kludge anymore. + (when (run-program* *c2ffi-executable* (list* (namestring input-header-file) + "--driver" "null" + "--macro-file" (namestring tmp-macro-file) + (append arch sys-include-paths)) + :output *standard-output* + :ignore-error-status ignore-error-status) + ;; Write a tmp header file that #include's the original input file and + ;; the above generated macros file which will form the input for our + ;; final, second pass. + (uiop:with-temporary-file (:stream tmp-include-file-stream + :pathname tmp-include-file + :keep *trace-c2ffi*) + (format tmp-include-file-stream "#include \"~A\"~%" input-header-file) + (format tmp-include-file-stream "#include \"~A\"~%" tmp-macro-file) + :close-stream + ;; Invoke c2ffi again to generate the final output. + (run-program* *c2ffi-executable* (list* (namestring tmp-include-file) + "--output" (namestring output-spec-path) + (append arch sys-include-paths)) + :output *standard-output* + :ignore-error-status ignore-error-status)))))) + +(defun spec-path (base-name &key version (arch (local-arch))) + (check-type base-name pathname) + (make-pathname :defaults base-name + :name (strcat (pathname-name base-name) + (if version + (strcat "-" version) + "") + "." + arch) + :type "spec")) + +(defun find-local-spec (base-name &optional (errorp t)) + (let* ((spec-path (spec-path base-name)) + (probed (probe-file spec-path))) + (if probed + spec-path + (when errorp + (error "c2ffi spec file not found for base name ~S" base-name))))) + +(defun ensure-spec-file-is-up-to-date (header-file-path + &key exclude-archs sys-include-paths version) + (let ((spec-path (find-local-spec header-file-path nil))) + (flet ((regenerate-spec-file () + (let ((local-arch (local-arch))) + (unless (c2ffi-executable-available?) + (error "No spec found for ~S on arch '~A' and c2ffi not found" + header-file-path local-arch)) + (generate-spec-with-c2ffi header-file-path + (spec-path header-file-path + :arch local-arch + :version version) + :arch local-arch + :sys-include-paths sys-include-paths) + ;; Try to run c2ffi for other architectures, but tolerate failure + (dolist (arch *known-archs*) + (unless (or (string= local-arch arch) + (member arch exclude-archs :test #'string=)) + (unless (generate-spec-with-c2ffi header-file-path + (spec-path header-file-path + :arch arch + :version version) + :arch arch + :sys-include-paths sys-include-paths + :ignore-error-status t) + (warn "Failed to generate spec for other arch: ~S" arch)))) + (find-local-spec header-file-path)))) + (if (and spec-path + (uiop:timestamp< (file-write-date header-file-path) + (file-write-date spec-path))) + spec-path ; it's up to date, just return it as is + (restart-case + (regenerate-spec-file) + (touch-old-copy () + :report (lambda (stream) + (format stream "Update the modification time of the out-of-date copy ~S" spec-path)) + ;; Make it only be visible when the spec file exists (but it's out of date) + :test (lambda (condition) + (declare (ignore condition)) + (not (null spec-path))) + ;; Update the last modification time. Yes, it's convoluted and wasteful, + ;; but I can't see any other way. + (with-staging-pathname (tmp-file spec-path) + (copy-file spec-path tmp-file)) + ;; The return value of RESTART-CASE + spec-path)))))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/c2ffi/generator.lisp b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/c2ffi/generator.lisp new file mode 100644 index 0000000..6010957 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/c2ffi/generator.lisp @@ -0,0 +1,838 @@ +;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- +;;; +;;; generator.lisp --- Generate CFFI bindings for a c2ffi output. +;;; +;;; Copyright (C) 2015, Attila Lendvai +;;; +;;; Permission is hereby granted, free of charge, to any person +;;; obtaining a copy of this software and associated documentation +;;; files (the "Software"), to deal in the Software without +;;; restriction, including without limitation the rights to use, copy, +;;; modify, merge, publish, distribute, sublicense, and/or sell copies +;;; of the Software, and to permit persons to whom the Software is +;;; furnished to do so, subject to the following conditions: +;;; +;;; The above copyright notice and this permission notice shall be +;;; included in all copies or substantial portions of the Software. +;;; +;;; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +;;; EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +;;; MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +;;; NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +;;; HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +;;; WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +;;; OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +;;; DEALINGS IN THE SOFTWARE. +;;; + +(in-package #:cffi/c2ffi) + +;;; Output generation happens in one phase, straight into the output +;;; stream. There's minimal look-ahead (for source-location and name) +;;; which is needed to apply user specified filters in time. +;;; +;;; Each CFFI form is also EVAL'd during generation because the CFFI +;;; type lookup/parsing mechanism is used while generating the output. +;;; +;;; Nomenclature: +;;; +;;; - variable names in this file are to be interpreted in the +;;; C,c2ffi,json context, and 'cffi' is added to names that denote +;;; the cffi name. +;;; +;;; Possible improvments: +;;; +;;; - generate an additional grovel file for C inline function +;;; declarations found in header files +;;; +;;; - generate struct-by-value DEFCFUN's into a separate file so that +;;; users can decide whether to depend on libffi, or they can make do +;;; without those definitions + +(defvar *allow-pointer-type-simplification* t) +(defvar *allow-skipping-struct-fields* t) +(defvar *assume-struct-by-value-support* t) +;; Called on the json name and may return a symbol to be used, or a string. +(defvar *ffi-name-transformer* 'default-ffi-name-transformer) +;; Called on the already transformed name to decide whether to export it +(defvar *ffi-name-export-predicate* 'default-ffi-name-export-predicate) +;; Called on the CFFI type, e.g. to turn (:pointer :char) into a :string. +(defvar *ffi-type-transformer* 'default-ffi-type-transformer) +;; May return up to two closures using VALUES. The first one will be called +;; with each emitted form, and the second one once, at the end. They both may +;; return a list of forms that will be emitted using OUTPUT/CODE. +(defvar *callback-factory* 'default-callback-factory) + +(define-constant +generated-file-header+ + ";;; -*- Mode: lisp -*-~%~ + ;;;~%~ + ;;; This file has been automatically generated by cffi/c2ffi. Editing it by hand is not wise.~%~ + ;;;~%~%" + :test 'equal) + +(defvar *c2ffi-output-stream*) + +(defun output/export (names package) + (let ((names (uiop:ensure-list names))) + ;; Make sure we have something PRINT-READABLY as a package name, + ;; i.e. not a SIMPLE-BASE-STRING on SBCL. + (output/code `(export ',names ',(make-symbol (package-name package)))))) + +(defun output/code (form) + (check-type form cons) + (format *c2ffi-output-stream* "~&") + (write form + :stream *c2ffi-output-stream* + :circle t + :pretty t + :escape t + :readably t) + (format *c2ffi-output-stream* "~%~%") + (unless (member (first form) '(cffi:defcfun alexandria:define-constant) :test 'eq) + (eval form))) + +(defun output/string (message-control &rest message-arguments) + (apply 'format *c2ffi-output-stream* message-control message-arguments)) + +;; NOTE: as per c2ffi json output. A notable difference to +;; CFFI::*BUILT-IN-FOREIGN-TYPES* is the presence of :SIGNED-CHAR. +(define-constant +c-builtin-types+ '(":void" ":_Bool" ":char" ":signed-char" ":unsigned-char" ":short" + ":unsigned-short" ":int" ":unsigned-int" ":long" ":unsigned-long" + ":long-long" ":unsigned-long-long" ":float" ":double" ":long-double") + :test 'equal) + +(define-condition unsupported-type (cffi::foreign-type-error) + ((json-definition :initarg :json-definition + :accessor json-definition-of))) + +(defun unsupported-type (json-entry) + (error 'unsupported-type :type-name nil :json-definition json-entry)) + +;;;;;; +;;; Utilities + +(defun compile-rules (rules) + (case rules + (:all rules) + (t (mapcar (lambda (pattern) + (check-type pattern string "Patterns in the inclusion/exclusion rules must be strings.") + (let ((scanner (cl-ppcre:create-scanner pattern))) + (named-lambda cffi/c2ffi/cl-ppcre-rule-matcher + (string) + (funcall scanner string 0 (length string))))) + rules)))) + +(defun include-definition? (name source-location + include-definitions exclude-definitions + include-sources exclude-sources) + (labels + ((covered-by-a-rule? (name rules) + (or (eq rules :all) + (not (null (some (rcurry #'funcall name) rules))))) + (weak? (rules) + (eq :all rules)) + (strong? (name rules) + (and name + (not (weak? rules)) + (covered-by-a-rule? name rules)))) + (let* ((excl-def/weak (weak? exclude-definitions)) + (excl-def/strong (strong? name exclude-definitions)) + (incl-def/weak (weak? include-definitions)) + (incl-def/strong (strong? name include-definitions)) + (excl-src/weak (weak? exclude-sources)) + (excl-src/strong (strong? source-location exclude-sources)) + (incl-src/weak (weak? include-sources)) + (incl-src/strong (strong? source-location include-sources)) + (incl/strong (or incl-def/strong + incl-src/strong)) + (excl/strong (or excl-def/strong + excl-src/strong)) + (incl/weak (or incl-def/weak + incl-src/weak)) + (excl/weak (or excl-def/weak + excl-src/weak))) + (or incl-def/strong + (and (not excl/strong) + (or incl/strong + (and incl/weak + ;; we want src exclude rules to be stronger + (not excl-src/weak)) + (not excl/weak))))))) + +(defun coerce-to-byte-size (bit-size) + (let ((byte-size (/ bit-size 8))) + (unless (integerp byte-size) + (error "Non-byte size encountered where it wasn't expected (~A bits)" bit-size)) + byte-size)) + +(defmacro assume (condition &optional format-control &rest format-arguments) + "Similar to ASSERT, but WARN's only." + `(unless ,condition + ,(if format-control + `(warn ,format-control ,@format-arguments) + `(warn "ASSUME failed: ~S" ',condition)))) + +(defun canonicalize-transformer-hook (hook) + (etypecase hook + ((and (or function symbol) + (not null)) + hook) + (string + (the symbol (safe-read-from-string hook))))) + +;;;;;; +;;; Json access + +(defun json-value (alist key &key (otherwise nil otherwise?)) + (check-type alist list) + (check-type key (and symbol (not null))) + (let* ((entry (assoc key alist)) + (result (cond + (entry + (cdr entry)) + (otherwise? + otherwise) + (t (error "Key ~S not found in json entry ~S." key alist))))) + (if (equal result "") + nil + result))) + +(defmacro with-json-values ((json-entry &rest args) &body body) + (if (null args) + `(progn + ,@body) + (once-only (json-entry) + `(let (,@(loop + :for entry :in args + :collect (let* ((args (ensure-list entry)) + (name (pop args)) + (key (or (pop args) + (make-keyword (symbol-name name))))) + (destructuring-bind + ;; using &optional would trigger a warning (on SBCL) + (&key (otherwise nil otherwise?)) + args + `(,name + (json-value ,json-entry ,key ,@(when otherwise? + `(:otherwise ,otherwise)))))))) + ,@body)))) + +(defun expected-json-keys (alist &rest keys) + (let* ((keys (list* :location keys)) + (outliers (remove-if (lambda (el) + (member (car el) keys :test 'eq)) + alist))) + (when outliers + (warn "Unexpected key(s) in json entry ~S: ~S" alist outliers)))) + +;;;;;; +;;; Namespaces, names and conversions + +;; an alist of (name . hashtable) +(defvar *generated-names*) +(defvar *anon-name-counter*) +(defvar *anon-entities*) + +(defun register-anon-entity (id name) + (check-type id integer) + (check-type name string) + (assert (not (zerop (length name)))) + (setf (gethash id *anon-entities*) name) + name) + +(defun lookup-anon-entity (id) + (or (gethash id *anon-entities*) + (error "Could not find anonymous entity with id ~S." id))) + +(defun generate-anon-name (base-name) + (format nil "~A" + (strcat (symbol-name base-name) + (princ-to-string (incf *anon-name-counter*))))) + +(defun valid-name-or-die (name) + ;; checks for valid json names (*not* CFFI names) + (etypecase name + (string + (assert (not (zerop (length name))))) + (cons + (assert (= 2 (length name))) + (assert (member (first name) '(:struct :union :enum))) + (valid-name-or-die (second name))))) + +(defun call-hook (hook &rest args) + (apply hook + ;; indiscriminately add one keyword arg entry to warn + (append args '(just-a-warning "Make sure your transformer hook has &key &allow-other-keys for future extendability.")))) + +(defun find-cffi-type-or-die (type-name &optional (namespace :default)) + (when (eq namespace :enum) + ;; TODO FIXME this should be cleaned up in CFFI. more about namespace confusion at: + ;; https://bugs.launchpad.net/cffi/+bug/1527947 + (setf namespace :default)) + (cffi::find-type-parser type-name namespace)) + +(define-constant +name-kinds+ '(:struct :union :function :variable :type + :constant :field :argument :enum :member) + :test 'equal) + +(deftype ffi-name-kind () + '#.(list* 'member +name-kinds+)) + +(defun json-name-to-cffi-name (name kind &optional anonymous) + (check-type name string) + (check-type kind ffi-name-kind) + (when *ffi-name-transformer* + (setf name (call-hook *ffi-name-transformer* name kind)) + (unless (or (and (symbolp name) + (not (null name))) + (stringp name)) + (error "The FFI-NAME-TRANSFORMER ~S returned with ~S which is not a valid name." + *ffi-name-transformer* name))) + (let ((cffi-name (if (symbolp name) + name + (intern name)))) + (when (and (not anonymous) + (boundp '*generated-names*)) + ;; TODO FIXME this function also gets called for e.g. argument types of a function. and + ;; if the function ends up *not* getting emitted, e.g. because of a missing type, then + ;; we wrongly record here the missing type in the *generated-names* registry. + (setf (gethash name (cdr (assoc kind *generated-names*))) + cffi-name)) + cffi-name)) + +(defun default-callback-factory (&key &allow-other-keys) + (values)) + +(defun default-ffi-name-transformer (name kind &key &allow-other-keys) + (check-type name string) + (case kind + #+nil + ((:constant :member) + (assert (not (symbolp name))) + (format nil "+~A+" name)) + (t name))) + +(defun change-case-to-readtable-case (name &optional (reatable *readtable*)) + (ecase (readtable-case reatable) + (:upcase (string-upcase name)) + (:downcase (string-downcase name)) + (:preserve name) + ;; (:invert no, you don't) + )) + +(defun camelcased? (name) + (and (>= (length name) 3) + (let ((lower 0) + (upper 0)) + (loop + :for char :across name + :do (cond + ((upper-case-p char) + (incf upper)) + ((lower-case-p char) + (incf lower)))) + (unless (or (zerop lower) + (zerop upper)) + (let ((ratio (/ upper lower))) + (and (<= 0.05 ratio 0.5))))))) + +(defun camelcase-to-dash-separated (name) + (coerce (loop + :for char :across name + :for index :from 0 + :when (and (upper-case-p char) + (not (zerop index))) + :collect #\- + :collect (char-downcase char)) + 'string)) + +(defun maybe-camelcase-to-dash-separated (name) + (if (camelcased? name) + (camelcase-to-dash-separated name) + name)) + +(defun default-ffi-name-export-predicate (symbol &key &allow-other-keys) + (declare (ignore symbol)) + nil) + +(defun default-ffi-type-transformer (type context &key &allow-other-keys) + (declare (ignore context)) + (cond + ((and (consp type) + (eq :pointer (first type))) + (let ((pointed-to-type (second type))) + (if (eq pointed-to-type :char) + :string + type))) + (t + type))) + +(defun function-pointer-type-name () + (symbolicate '#:function-pointer)) + +(defmacro with-allowed-foreign-type-errors ((on-failure-form &key (enabled t)) &body body) + (with-unique-names (type-block) + `(block ,type-block + (handler-bind + ((cffi::foreign-type-error + (lambda (_) + (declare (ignore _)) + (when ,enabled + (return-from ,type-block ,on-failure-form))))) + ,@body)))) + +(defun %json-type-to-cffi-type (json-entry) + (with-json-values (json-entry tag) + (let ((cffi-type + (cond + ((switch (tag :test 'equal) + (":void" :void) + (":_Bool" :bool) + ;; regarding :signed-char see https://stackoverflow.com/questions/436513/char-signed-char-char-unsigned-char + (":char" :char) + (":signed-char" :char) + (":unsigned-char" :unsigned-char) + (":short" :short) + (":unsigned-short" :unsigned-short) + (":int" :int) + (":unsigned-int" :unsigned-int) + (":long" :long) + (":unsigned-long" :unsigned-long) + (":long-long" :long-long) + (":unsigned-long-long" :unsigned-long-long) + (":float" :float) + (":double" :double) + ;; TODO FIXME + ;;(":long-double" :long-double) + ) + ;; return the result of the condition expression + ) + ((or (progn + (assert (not (member tag +c-builtin-types+ :test 'equal)) () + "Not all C basic types are covered! The outlier is: ~S" tag) + nil) + (equal tag ":struct") + (equal tag ":union")) + ;; ":struct" is a "struct foo-struct var" kind of reference + (expected-json-keys json-entry :name :tag :id) + (with-json-values (json-entry name id) + (let* ((kind (if (equal tag ":struct") + :struct + :union)) + (cffi-name (if name + (json-name-to-cffi-name name kind) + (lookup-anon-entity id)))) + (find-cffi-type-or-die cffi-name kind) + `(,kind ,cffi-name)))) + ((or (equal tag "struct") + (equal tag "union")) + ;; "struct" denotes a "struct {} var", or "typedef struct {} my_type" + ;; kind of inline anonymous declaration. Let's call PROCESS-C2FFI-ENTRY + ;; to emit it for us, and return with the generated name (first value) + ;; as if it was a standalone toplevel struct definition. + ;; TODO is it a problem that we don't invoke the CALLBACK-FACTORY stuff here? + (let ((form (process-c2ffi-entry json-entry)) + (kind (if (equal tag "struct") + :struct + :union))) + (assert (and (consp form) + (member (first form) '(cffi:defcstruct cffi:defcunion)))) + `(,kind ,(first (ensure-list (second form)))))) + ((equal tag ":enum") + ;; ":enum" is an "enum foo var" kind of reference + (expected-json-keys json-entry :name :tag :id) + (with-json-values (json-entry name id) + (let ((cffi-name (json-name-to-cffi-name (or name + (lookup-anon-entity id)) + :enum))) + (find-cffi-type-or-die cffi-name :enum) + ;; TODO FIXME this would be the proper one, but CFFI is broken: `(:enum ,cffi-name) + cffi-name))) + ((equal tag "enum") + ;; "enum" is an inline "typedef enum {m1, m2} var" kind of inline declaration + (expected-json-keys json-entry :name :tag :id) + ;; TODO FIXME similarly to struct, but it would be nice to see an example + (error "not yet implemented")) + ((equal tag ":array") + (expected-json-keys json-entry :tag :type :size) + (with-json-values (json-entry type size) + (check-type size integer) + `(:array ,(json-type-to-cffi-type type) ,size))) + ((equal tag ":pointer") + (expected-json-keys json-entry :tag :type :id) + (with-json-values (json-entry type) + `(:pointer ,(with-allowed-foreign-type-errors + (:void :enabled *allow-pointer-type-simplification*) + (json-type-to-cffi-type type))))) + ((equal tag ":function-pointer") + (expected-json-keys json-entry :tag) + (function-pointer-type-name)) + ((equal tag ":function") + (unsupported-type json-entry)) + (t + (assert (not (starts-with #\: tag))) + (let ((cffi-name (json-name-to-cffi-name tag :type))) + ;; TODO FIXME json-name-to-cffi-name collects the mentioned + ;; types to later emit +TYPE-NAMES+, but if this next + ;; find-cffi-type-or-die dies then the entire function is + ;; skipped. + (find-cffi-type-or-die cffi-name) + cffi-name))))) + (assert cffi-type () "Failed to map ~S to a cffi type" json-entry) + cffi-type))) + +(defun should-export-p (symbol) + (and symbol + (symbolp symbol) + (not (keywordp symbol)) + *ffi-name-export-predicate* + (call-hook *ffi-name-export-predicate* symbol))) + +(defun json-type-to-cffi-type (json-entry &optional (context nil context?)) + (let ((cffi-type (%json-type-to-cffi-type json-entry))) + (if context? + (call-hook *ffi-type-transformer* cffi-type context) + cffi-type))) + +;;;;;; +;;; Entry point, the "API" + +(defun process-c2ffi-spec-file (c2ffi-spec-file package-name + &key + (allow-pointer-type-simplification *allow-pointer-type-simplification*) + (allow-skipping-struct-fields *allow-skipping-struct-fields*) + (assume-struct-by-value-support *assume-struct-by-value-support*) + ;; either a pathname or a string (will be copied as is), + ;; or a function that will be funcall'd with one argument + ;; to emit a form (i.e. OUTPUT/CODE). + prelude + (output (make-pathname :name (strcat (pathname-name c2ffi-spec-file) ".cffi-tmp") + :type "lisp" :defaults c2ffi-spec-file)) + (output-encoding asdf:*default-encoding*) + ;; The args following this point are mirrored in the ASDF + ;; component on the same name. + (ffi-name-transformer *ffi-name-transformer*) + (ffi-name-export-predicate *ffi-name-export-predicate*) + ;; as per CFFI:DEFINE-FOREIGN-LIBRARY and CFFI:LOAD-FOREIGN-LIBRARY + (ffi-type-transformer *ffi-type-transformer*) + (callback-factory *callback-factory*) + foreign-library-name + foreign-library-spec + (emit-generated-name-mappings t) + (include-sources :all) + exclude-sources + (include-definitions :all) + exclude-definitions) + "Generates a lisp file with CFFI definitions from C2FFI-SPEC-FILE. +PACKAGE-NAME will be overwritten, it assumes full control over the +target package." + (check-type c2ffi-spec-file (or pathname string)) + (macrolet ((@ (var) + `(setf ,var (compile-rules ,var)))) + (@ include-sources) + (@ exclude-sources) + (@ include-definitions) + (@ exclude-definitions)) + (with-standard-io-syntax + (with-input-from-file (in c2ffi-spec-file :external-format (asdf/driver:encoding-external-format :utf-8)) + (with-output-to-file (*c2ffi-output-stream* output :if-exists :supersede + :external-format (asdf/driver:encoding-external-format output-encoding)) + (let* ((*package* (or (find-package package-name) + (make-package package-name))) + ;; Make sure we use an uninterned symbol, so that it's neutral to READTABLE-CASE. + (package-name (make-symbol (package-name *package*))) + ;; Let's rebind a copy, so that when we are done with + ;; the generation (which also EVAL's the forms) then + ;; the CFFI type repository is also reverted back to + ;; the previous state. This avoids redefinition warning + ;; when the generated file gets compiled and loaded + ;; later. + (cffi::*type-parsers* (copy-hash-table cffi::*type-parsers*)) + (*anon-name-counter* 0) + (*anon-entities* (make-hash-table)) + (*generated-names* (mapcar (lambda (key) + `(,key . ,(make-hash-table :test 'equal))) + +name-kinds+)) + (*allow-pointer-type-simplification* allow-pointer-type-simplification) + (*allow-skipping-struct-fields* allow-skipping-struct-fields) + (*assume-struct-by-value-support* assume-struct-by-value-support) + (*ffi-name-transformer* (canonicalize-transformer-hook ffi-name-transformer)) + (*ffi-name-export-predicate* (canonicalize-transformer-hook ffi-name-export-predicate)) + (*ffi-type-transformer* (canonicalize-transformer-hook ffi-type-transformer)) + (*callback-factory* (canonicalize-transformer-hook callback-factory)) + (*read-default-float-format* 'double-float) + (json (json:decode-json in))) + (output/string +generated-file-header+) + ;; some forms that are always emitted + (mapc 'output/code + ;; Make sure the package exists. We don't even want to :use COMMON-LISP here, + ;; to avoid any possible name clashes. + `((uiop:define-package ,package-name (:use)) + (in-package ,package-name) + (cffi:defctype ,(function-pointer-type-name) :pointer))) + (when (and foreign-library-name + foreign-library-spec) + (when (stringp foreign-library-name) + (setf foreign-library-name (safe-read-from-string foreign-library-name))) + (output/code `(cffi:define-foreign-library ,foreign-library-name + ,@foreign-library-spec)) + ;; TODO: Unconditionally emitting a USE-FOREIGN-LIBRARY may not be smart. + ;; For details see: https://bugs.launchpad.net/cffi/+bug/1593635 + (output/code `(cffi:use-foreign-library ,foreign-library-name))) + (etypecase prelude + (null) + (string + (output/string prelude)) + (pathname + (with-input-from-file (prelude-stream prelude) + (alexandria:copy-stream prelude-stream *c2ffi-output-stream* + :element-type 'character))) + ((or symbol function) + (funcall prelude 'output/code))) + ;; + ;; Let's enumerate the entries + (multiple-value-bind (form-callback epilogue-callback) + (funcall *callback-factory*) + (dolist (json-entry json) + (with-json-values (json-entry name location) + (let ((source-location-file (subseq location + 0 + (or (position #\: location) + 0)))) + (if (include-definition? + name source-location-file + include-definitions exclude-definitions + include-sources exclude-sources) + (progn + (output/string "~&~%;; ~S" location) + (let ((emitted-definition (process-c2ffi-entry json-entry))) + ;; + ;; Call the plugin to let the user emit a form after the given + ;; definition + (when (and emitted-definition + form-callback) + (map nil 'output/code (call-hook form-callback emitted-definition))))) + (output/string "~&;; Skipped ~S due to filters" name))))) + ;; + ;; Call the plugin to let the user append multiple forms after the + ;; emitted definitions + (when epilogue-callback + (map nil 'output/code (call-hook epilogue-callback)))) + ;; + ;; emit optional exports + (maphash + (lambda (package-name symbols) + (output/export (sort (remove-if-not #'should-export-p symbols) #'string<) + package-name)) + (get-all-names-by-package *generated-names*)) + + ;; + ;; emit optional mappings + (when emit-generated-name-mappings + (mapcar (lambda (entry) + (destructuring-bind (kind variable-name) entry + (output/code `(defparameter + ,(intern (symbol-name variable-name)) + ',(hash-table-alist (cdr (assoc kind *generated-names*))))))) + `((:function #:+function-names+) + (:struct #:+struct-names+) + (:union #:+union-names+) + (:variable #:+variable-names+) + (:type #:+type-names+) + (:constant #:+constant-names+) + (:argument #:+argument-names+) + (:field #:+field-names+)))))))) + output) + +(defun get-all-names-by-package (name-collection) + (let ((tables (mapcar #'cdr name-collection)) + all + (grouped (make-hash-table))) + (loop :for table :in tables :do + (loop :for s :being :the :hash-values :of table :do + (push s all))) + (remove-duplicates all :test #'eq) + (loop :for name :in all + :for package-name := (package-name (symbol-package name)) + :do (setf (gethash package-name grouped) + (cons name (gethash package-name grouped)))) + grouped)) + +;;;;;; +;;; Processors for various definitions + +(defvar *c2ffi-entry-processors* (make-hash-table :test 'equal)) + +(defun process-c2ffi-entry (json-entry) + (let* ((kind (json-value json-entry :tag)) + (processor (gethash kind *c2ffi-entry-processors*))) + (if processor + (let ((definition-form + (handler-bind + ((unsupported-type + (lambda (e) + (warn "Skip definition because cannot map ~S to any CFFI type. The definition is ~S" + (json-definition-of e) json-entry) + (return-from process-c2ffi-entry (values)))) + (cffi::undefined-foreign-type-error + (lambda (e) + (output/string "~&;; Skipping definition ~S because of missing type ~S" + json-entry (cffi::foreign-type-error/compound-name e)) + (return-from process-c2ffi-entry (values))))) + (funcall processor json-entry)))) + (when definition-form + (output/code definition-form) + definition-form)) + (progn + (warn "No cffi/c2ffi processor defined for ~A" json-entry) + (values))))) + +(defmacro define-processor (kind args &body body) + `(setf (gethash ,(string-downcase kind) *c2ffi-entry-processors*) + (named-lambda ,(symbolicate 'c2ffi-processor/ kind) (-json-entry-) + (with-json-values (-json-entry- ,@args) + ,@body)))) + +(defun %process-struct-like (json-entry kind definer anon-base-name) + (expected-json-keys json-entry :tag :ns :name :id :bit-size :bit-alignment :fields) + (with-json-values (json-entry tag (struct-name :name) fields bit-size id) + (assert (member tag '(":struct" "struct" ":union" "union") :test 'equal)) + (flet ((process-field (json-entry) + (with-json-values (json-entry (field-name :name) bit-offset type) + (let ((cffi-type (with-allowed-foreign-type-errors + ('failed :enabled *allow-skipping-struct-fields*) + (json-type-to-cffi-type type `(,kind ,struct-name ,field-name))))) + (if (eq cffi-type 'failed) + (output/string "~&;; skipping field due to missing type ~S, full json entry: ~S" type json-entry) + `(,(json-name-to-cffi-name field-name :field) + ,cffi-type + ,@(unless (eq kind :union) + `(:offset ,(coerce-to-byte-size bit-offset))))))))) + `(,definer (,(json-name-to-cffi-name (or struct-name + (register-anon-entity + id + (generate-anon-name anon-base-name))) + kind + (null struct-name)) + :size ,(coerce-to-byte-size bit-size)) + ,@(remove nil (mapcar #'process-field fields)))))) + +(define-processor struct () + (%process-struct-like -json-entry- :struct 'cffi:defcstruct '#:anon-struct-)) + +(define-processor union () + (%process-struct-like -json-entry- :union 'cffi:defcunion '#:anon-union-)) + +(define-processor typedef (name type) + (expected-json-keys -json-entry- :tag :name :ns :type) + `(cffi:defctype ,(json-name-to-cffi-name name :type) + ,(json-type-to-cffi-type type `(:typedef ,name)))) + +(define-processor function (return-type (function-name :name) parameters inline variadic storage-class) + (declare (ignore storage-class)) + ;; TODO does storage-class matter for FFI accessibility? + #+nil + (assume (equal "extern" storage-class) + "Unexpected function STORAGE-CLASS: ~S for function ~S" storage-class function-name) + (expected-json-keys -json-entry- :tag :name :return-type :parameters :variadic :inline :storage-class :ns) + (let ((uses-struct-by-value? nil)) + (flet ((process-arg (json-entry index) + (expected-json-keys json-entry :tag :name :type) + (with-json-values (json-entry tag (argument-name :name) type) + (assert (equal tag "parameter")) + (let* ((cffi-type (json-type-to-cffi-type type `(:function ,function-name ,argument-name))) + (canonicalized-type (cffi::canonicalize-foreign-type cffi-type))) + (when (and (consp canonicalized-type) + (member (first canonicalized-type) '(:struct :union))) + (setf uses-struct-by-value? t)) + `(,(if argument-name + (json-name-to-cffi-name argument-name :argument) + (symbolicate '#:arg (princ-to-string index))) + ,cffi-type))))) + (let ((cffi-args (loop + :for arg :in parameters + :for index :upfrom 1 + :collect (process-arg arg index)))) + (cond + ((and uses-struct-by-value? + (not *assume-struct-by-value-support*)) + (values)) + (inline + ;; TODO inline functions should go into a separate grovel file? + (output/string "~&;; Skipping inline function ~S" function-name) + (values)) + (t `(cffi:defcfun (,function-name ,(json-name-to-cffi-name function-name :function)) + ,(json-type-to-cffi-type return-type `(:function ,function-name :return-type)) + ,@(append cffi-args + (when variadic + '(&rest)))))))))) + +(define-processor extern (name type) + (expected-json-keys -json-entry- :tag :name :type) + `(cffi:defcvar (,name ,(json-name-to-cffi-name name :variable)) + ,(json-type-to-cffi-type type `(:variable ,name)))) + +;; ((TAG . enum) (NS . 0) (NAME . ) (ID . 3) (LOCATION . /usr/include/bits/confname.h:24:1) (FIELDS ((TAG . field) (NAME . _PC_LINK_MAX) (VALUE . 0)) ((TAG . field) (NAME . _PC_MAX_CANON) (VALUE . 1)) ((TAG . field) (NAME . _PC_MAX_INPUT) (VALUE . 2)) ((TAG . field) (NAME . _PC_NAME_MAX) (VALUE . 3)) ((TAG . field) (NAME . _PC_PATH_MAX) (VALUE . 4)) ((TAG . field) (NAME . _PC_PIPE_BUF) (VALUE . 5)) ((TAG . field) (NAME . _PC_CHOWN_RESTRICTED) (VALUE . 6)) ((TAG . field) (NAME . _PC_NO_TRUNC) (VALUE . 7)) ((TAG . field) (NAME . _PC_VDISABLE) (VALUE . 8)) ((TAG . field) (NAME . _PC_SYNC_IO) (VALUE . 9)) ((TAG . field) (NAME . _PC_ASYNC_IO) (VALUE . 10)) ((TAG . field) (NAME . _PC_PRIO_IO) (VALUE . 11)) ((TAG . field) (NAME . _PC_SOCK_MAXBUF) (VALUE . 12)) ((TAG . field) (NAME . _PC_FILESIZEBITS) (VALUE . 13)) ((TAG . field) (NAME . _PC_REC_INCR_XFER_SIZE) (VALUE . 14)) ((TAG . field) (NAME . _PC_REC_MAX_XFER_SIZE) (VALUE . 15)) ((TAG . field) (NAME . _PC_REC_MIN_XFER_SIZE) (VALUE . 16)) ((TAG . field) (NAME . _PC_REC_XFER_ALIGN) (VALUE . 17)) ((TAG . field) (NAME . _PC_ALLOC_SIZE_MIN) (VALUE . 18)) ((TAG . field) (NAME . _PC_SYMLINK_MAX) (VALUE . 19)) ((TAG . field) (NAME . _PC_2_SYMLINKS) (VALUE . 20)))) +(define-processor enum (name fields id) + (let ((bitmasks 0) + (non-bitmasks 0)) + (labels + ((for-bitmask-statistics (name value) + (declare (ignore name)) + (if (cffi::single-bit-p value) + (incf bitmasks) + (incf non-bitmasks))) + (for-enum-body (name value) + `(,(json-name-to-cffi-name name :member) + ,value)) + (process-fields (visitor) + (loop + :for json-entry :in fields + :do (expected-json-keys json-entry :tag :name :value) + :collect + (with-json-values (json-entry tag name value) + (assert (equal tag "field")) + (check-type value integer) + (funcall visitor name value))))) + (process-fields #'for-bitmask-statistics) + `(,(if (> (/ bitmasks + (+ non-bitmasks bitmasks)) + 0.8) + 'cffi:defbitfield + 'cffi:defcenum) + ,(json-name-to-cffi-name (or name + (register-anon-entity + id + (generate-anon-name '#:anon-enum-))) + :enum + (null name)) + ,@(process-fields #'for-enum-body))))) + +(defun make-define-constant-form (name value) + (valid-name-or-die name) + (let ((test-fn (typecase value + (number) + (t 'equal)))) + `(alexandria:define-constant ,(json-name-to-cffi-name name :constant) + ,value ,@(when test-fn `(:test ',test-fn))))) + +(define-processor const (name type (value :value :otherwise nil)) + (expected-json-keys -json-entry- :tag :name :type :value :ns) + (let ((cffi-type (json-type-to-cffi-type type `(:contant ,name)))) + (cond + ((not value) + ;; #define __FOO_H and friends... just ignore them. + (values)) + ((and (member cffi-type '(:int :unsigned-int + :long :unsigned-long + :long-long :unsigned-long-long)) + (integerp value)) + (make-define-constant-form name value)) + ((and (member cffi-type '(:float :double)) + (floatp value)) + (make-define-constant-form name value)) + ((member cffi-type '(:string (:pointer :char)) :test 'equal) + (make-define-constant-form name value)) + (t + (warn "Don't know how to emit a constant of CFFI type ~S, with value ~S (json type is ~S)." cffi-type value type) + (values))))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/c2ffi/package.lisp b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/c2ffi/package.lisp new file mode 100644 index 0000000..8881465 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/c2ffi/package.lisp @@ -0,0 +1,54 @@ +;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- +;;; +;;; Copyright (C) 2015, Attila Lendvai +;;; +;;; Permission is hereby granted, free of charge, to any person +;;; obtaining a copy of this software and associated documentation +;;; files (the "Software"), to deal in the Software without +;;; restriction, including without limitation the rights to use, copy, +;;; modify, merge, publish, distribute, sublicense, and/or sell copies +;;; of the Software, and to permit persons to whom the Software is +;;; furnished to do so, subject to the following conditions: +;;; +;;; The above copyright notice and this permission notice shall be +;;; included in all copies or substantial portions of the Software. +;;; +;;; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +;;; EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +;;; MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +;;; NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +;;; HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +;;; WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +;;; OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +;;; DEALINGS IN THE SOFTWARE. +;;; + +(uiop:define-package #:cffi/c2ffi + (:mix #:uiop + #:alexandria + #:common-lisp) + (:import-from :asdf + #:cl-source-file + #:find-system + #:output-file + #:output-files + #:input-files + #:perform + #:compile-op + #:load-op + #:load-source-op + #:prepare-op + #:component-pathname + #:component-depends-on + #:downward-operation + #:load-system + #:component-loaded-p) + (:export + #:c2ffi-file + #:camelcased? + #:camelcase-to-dash-separated + #:change-case-to-readtable-case + #:default-ffi-name-transformer + #:default-ffi-type-transformer + #:generate-spec + #:maybe-camelcase-to-dash-separated)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/cffi-abcl.lisp b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/cffi-abcl.lisp new file mode 100644 index 0000000..b999915 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/cffi-abcl.lisp @@ -0,0 +1,664 @@ +;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- +;;; +;;; cffi-abcl.lisp --- CFFI-SYS implementation for ABCL/JNA. +;;; +;;; Copyright (C) 2009, Luis Oliveira +;;; Copyright (C) 2012, Mark Evenson +;;; +;;; Permission is hereby granted, free of charge, to any person +;;; obtaining a copy of this software and associated documentation +;;; files (the "Software"), to deal in the Software without +;;; restriction, including without limitation the rights to use, copy, +;;; modify, merge, publish, distribute, sublicense, and/or sell copies +;;; of the Software, and to permit persons to whom the Software is +;;; furnished to do so, subject to the following conditions: +;;; +;;; The above copyright notice and this permission notice shall be +;;; included in all copies or substantial portions of the Software. +;;; +;;; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +;;; EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +;;; MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +;;; NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +;;; HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +;;; WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +;;; OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +;;; DEALINGS IN THE SOFTWARE. +;;; + +;;; This implementation requires the Java Native Access (JNA) library. +;;; +;;; +;;; JNA may be automatically loaded into the current JVM process from +;;; abcl-1.1.0-dev via the contrib mechanism. + +(eval-when (:compile-toplevel :load-toplevel :execute) + (require :abcl-contrib) + (require :jna) + (require :jss)) + +;;; This is a preliminary version that will have to be cleaned up, +;;; optimized, etc. Nevertheless, it passes all of the relevant CFFI +;;; tests except MAKE-POINTER.HIGH. Shareable Vectors are not +;;; implemented yet. + +;;;# Administrivia + +(defpackage #:cffi-sys + (:use #:cl #:java) + (:import-from #:alexandria #:hash-table-values #:length= #:format-symbol) + (:export + #:canonicalize-symbol-name-case + #:foreign-pointer + #:pointerp + #:pointer-eq + #:null-pointer + #:null-pointer-p + #:inc-pointer + #:make-pointer + #:pointer-address + #:%foreign-alloc + #:foreign-free + #:with-foreign-pointer + #:%foreign-funcall + #:%foreign-funcall-pointer + #:%foreign-type-alignment + #:%foreign-type-size + #:%load-foreign-library + #:%close-foreign-library + #:native-namestring + #:%mem-ref + #:%mem-set + ;; #:make-shareable-byte-vector + ;; #:with-pointer-to-vector-data + #:%foreign-symbol-pointer + #:%defcallback + #:%callback + #:with-pointer-to-vector-data + #:make-shareable-byte-vector)) + +(in-package #:cffi-sys) + +;;;# Loading and Closing Foreign Libraries + +(defparameter *loaded-libraries* (make-hash-table)) + +(defun %load-foreign-library (name path) + "Load a foreign library, signals a simple error on failure." + (flet ((load-and-register (name path) + (let ((lib (jstatic "getInstance" "com.sun.jna.NativeLibrary" path))) + (setf (gethash name *loaded-libraries*) lib) + lib)) + (foreign-library-type-p (type) + (find type '("so" "dll" "dylib") :test #'string=)) + (java-error (e) + (error (jcall (jmethod "java.lang.Exception" "getMessage") + (java-exception-cause e))))) + (handler-case + (load-and-register name path) + (java-exception (e) + ;; From JNA http://jna.java.net/javadoc/com/sun/jna/NativeLibrary.html + ;; ``[The name] can be short form (e.g. "c"), an explicit + ;; version (e.g. "libc.so.6"), or the full path to the library + ;; (e.g. "/lib/libc.so.6")'' + ;; + ;; Try to deal with the occurance "libXXX" and "libXXX.so" as + ;; "libXXX.so.6" and "XXX" should have succesfully loaded. + (let ((p (pathname path))) + (if (and (not (pathname-directory p)) + (= (search "lib" (pathname-name p)) 0)) + (let ((short-name (if (foreign-library-type-p (pathname-type p)) + (subseq (pathname-name p) 3) + (pathname-name p)))) + (handler-case + (load-and-register name short-name) + (java-exception (e) (java-error e)))) + (java-error e))))))) + +;;; FIXME. Should remove libraries from the hash table. +(defun %close-foreign-library (handle) + "Closes a foreign library." + #+#:ignore (setf *loaded-libraries* (remove handle *loaded-libraries*)) + (jcall-raw (jmethod "com.sun.jna.NativeLibrary" "dispose") handle)) + +;;; + +;;; FIXME! We should probably define a private-jfield-accessor that does the hard work once! +(let ((get-declared-fields-jmethod (jmethod "java.lang.Class" "getDeclaredFields"))) + (defun private-jfield (class-name field-name instance) + (let ((field (find field-name + (jcall get-declared-fields-jmethod + (jclass class-name)) + :key #'jfield-name + :test #'string=))) + (jcall (jmethod "java.lang.reflect.Field" "setAccessible" "boolean") + field +true+) + (jcall (jmethod "java.lang.reflect.Field" "get" "java.lang.Object") + field instance)))) + +;;; XXX: doesn't match jmethod-arguments. + +(let ((get-declared-methods-jmethod (jmethod "java.lang.Class" "getDeclaredMethods"))) + (defun private-jmethod (class-name method-name) + (let ((method (find method-name + (jcall get-declared-methods-jmethod + (jclass class-name)) + :key #'jmethod-name + :test #'string=))) + (jcall (jmethod "java.lang.reflect.Method" "setAccessible" "boolean") + method +true+) + method))) + +(let ((get-declared-constructors-jmethod (jmethod "java.lang.Class" + "getDeclaredConstructors")) + (set-accessible-jmethod (jmethod "java.lang.reflect.Constructor" "setAccessible" "boolean"))) + (defun private-jconstructor (class-name &rest params) + (let* ((param-classes (mapcar #'jclass params)) + (cons (find-if (lambda (x &aux (cons-params (jconstructor-params x))) + (and (length= param-classes cons-params) + (loop for param in param-classes + and param-x across cons-params + always (string= (jclass-name param) + (jclass-name param-x))))) + (jcall get-declared-constructors-jmethod (jclass class-name))))) + (jcall set-accessible-jmethod cons +true+) + cons))) + +;;;# Symbol Case + +(defun canonicalize-symbol-name-case (name) + (string-upcase name)) + +;;;# Pointers + +(deftype foreign-pointer () + '(satisfies pointerp)) + +(defun pointerp (ptr) + "Return true if PTR is a foreign pointer." + (let ((jclass (jclass-of ptr))) + (when jclass + (jclass-superclass-p (jclass "com.sun.jna.Pointer") jclass)))) + +(let ((jconstructor (private-jconstructor "com.sun.jna.Pointer" "long"))) + (defun make-pointer (address) + "Return a pointer pointing to ADDRESS." + (jnew jconstructor address))) + +(defun make-private-jfield-accessor (class-name field-name) + (let ((field (find field-name + (jcall (jmethod "java.lang.Class" "getDeclaredFields") + (jclass class-name)) + :key #'jfield-name + :test #'string=))) + (jcall (jmethod "java.lang.reflect.Field" "setAccessible" "boolean") + field +true+) + (let ((get-jmethod (jmethod "java.lang.reflect.Field" "get" "java.lang.Object"))) + (lambda (instance) + (jcall get-jmethod field instance))))) + +(let ((accessor (make-private-jfield-accessor "com.sun.jna.Pointer" "peer"))) + (defun %pointer-address (pointer) + (funcall accessor pointer))) + +(defun pointer-address (pointer) + "Return the address pointed to by PTR." + (let ((peer (%pointer-address pointer))) + (if (< peer 0) + (+ #.(ash 1 64) peer) + peer))) + +(defun pointer-eq (ptr1 ptr2) + "Return true if PTR1 and PTR2 point to the same address." + (= (%pointer-address ptr1) (%pointer-address ptr2))) + +(defun null-pointer () + "Construct and return a null pointer." + (make-pointer 0)) + +(defun null-pointer-p (ptr) + "Return true if PTR is a null pointer." + (zerop (%pointer-address ptr))) + +(defun inc-pointer (ptr offset) + "Return a fresh pointer pointing OFFSET bytes past PTR." + (make-pointer (+ (%pointer-address ptr) offset))) + +;;;# Allocation + +(let ((malloc-jmethod (private-jmethod "com.sun.jna.Memory" "malloc"))) + (defun %foreign-alloc (size) + "Allocate SIZE bytes on the heap and return a pointer." + (make-pointer + (jstatic-raw malloc-jmethod nil size)))) + +(let ((free-jmethod (private-jmethod "com.sun.jna.Memory" "free"))) + (defun foreign-free (ptr) + "Free a PTR allocated by FOREIGN-ALLOC." + (jstatic-raw free-jmethod nil (%pointer-address ptr)) + nil)) + +;;; TODO: stack allocation. +(defmacro with-foreign-pointer ((var size &optional size-var) &body body) + "Bind VAR to SIZE bytes of foreign memory during BODY. The pointer +in VAR is invalid beyond the dynamic extent of BODY, and may be +stack-allocated if supported by the implementation. If SIZE-VAR is +supplied, it will be bound to SIZE during BODY." + (unless size-var + (setf size-var (gensym "SIZE"))) + `(let* ((,size-var ,size) + (,var (%foreign-alloc ,size-var))) + (unwind-protect + (progn ,@body) + (foreign-free ,var)))) + +;;;# Shareable Vectors +;;; +;;; This interface is very experimental. WITH-POINTER-TO-VECTOR-DATA +;;; should be defined to perform a copy-in/copy-out if the Lisp +;;; implementation can't do this. + +(defun jna-setter (type) + (ecase type + ((:char :unsigned-char) "setByte") + (:double "setDouble") + (:float "setFloat") + ((:int :unsigned-int) "setInt") + ((:long :unsigned-long) "setNativeLong") + ((:long-long :unsigned-long-long) "setLong") + (:pointer "setPointer") + ((:short :unsigned-short) "setShort"))) + +(defun jna-setter-arg-type (type) + (ecase type + ((:char :unsigned-char) "byte") + (:double "double") + (:float "float") + ((:int :unsigned-int) "int") + ((:long :unsigned-long) "com.sun.jna.NativeLong") + ((:long-long :unsigned-long-long) "long") + (:pointer "com.sun.jna.Pointer") + ((:short :unsigned-short) "short"))) + +(defun jna-getter (type) + (ecase type + ((:char :unsigned-char) "getByte") + (:double "getDouble") + (:float "getFloat") + ((:int :unsigned-int) "getInt") + ((:long :unsigned-long) "getNativeLong") + ((:long-long :unsigned-long-long) "getLong") + (:pointer "getPointer") + ((:short :unsigned-short) "getShort"))) + +(defun make-shareable-byte-vector (size) + "Create a Lisp vector of SIZE bytes can passed to +WITH-POINTER-TO-VECTOR-DATA." + (make-array size :element-type '(unsigned-byte 8))) + +(let ((method (jmethod "com.sun.jna.Pointer" + (jna-setter :char) "long" (jna-setter-arg-type :char)))) + (defun copy-to-foreign-vector (vector foreign-pointer) + (loop for i below (length vector) + do + (jcall-raw method + foreign-pointer i + (aref vector i))))) + +;; hand-roll the jna-getter method instead of calling %mem-ref every time through +(let ((method (jmethod "com.sun.jna.Pointer" (jna-getter :char) "long"))) + (defun copy-from-foreign-vector (vector foreign-pointer) + (loop for i below (length vector) + do (setf (aref vector i) + (java:jobject-lisp-value (jcall-raw method foreign-pointer i)))))) + +(defmacro with-pointer-to-vector-data ((ptr-var vector) &body body) + "Bind PTR-VAR to a foreign pointer to the data in VECTOR." + (let ((vector-sym (gensym "VECTOR"))) + `(let ((,vector-sym ,vector)) + (with-foreign-pointer (,ptr-var (length ,vector-sym)) + (copy-to-foreign-vector ,vector-sym ,ptr-var) + (unwind-protect + (progn ,@body) + (copy-from-foreign-vector ,vector-sym ,ptr-var)))))) + +;;;# Dereferencing + +(defun foreign-type-to-java-class (type) + (jclass + (ecase type + ((:int :unsigned-int) "java.lang.Integer") + ((:long :unsigned-long) "com.sun.jna.NativeLong") + ((:long-long :unsigned-long-long) "java.lang.Long") + (:pointer "com.sun.jna.Pointer") ;; void * is pointer? + (:float "java.lang.Float") + (:double "java.lang.Double") + ((:char :unsigned-char) "java.lang.Byte") + ((:short :unsigned-short) "java.lang.Short")))) + +(defun %foreign-type-size (type) + "Return the size in bytes of a foreign type." + (jstatic "getNativeSize" "com.sun.jna.Native" + (foreign-type-to-java-class type))) + +;;; FIXME. +(defun %foreign-type-alignment (type) + "Return the alignment in bytes of a foreign type." + (%foreign-type-size type)) + +(defun unsigned-type-p (type) + (case type + ((:unsigned-char + :unsigned-int + :unsigned-short + :unsigned-long + :unsigned-long-long) t) + (t nil))) + +(defun lispify-value (value type) + (when (and (eq type :pointer) (or (null (java:jobject-lisp-value value)) + (eq +null+ (java:jobject-lisp-value value)))) + (return-from lispify-value (null-pointer))) + (when (or (eq type :long) (eq type :unsigned-long)) + (setq value (jcall-raw (jmethod "com.sun.jna.NativeLong" "longValue") + (java:jobject-lisp-value value)))) + (let ((bit-size (* 8 (%foreign-type-size type)))) + (let ((lisp-value (java:jobject-lisp-value value))) + (if (and (unsigned-type-p type) + (logbitp (1- bit-size) lisp-value)) + (lognot (logxor lisp-value (1- (expt 2 bit-size)))) + lisp-value)))) + +(defun %mem-ref (ptr type &optional (offset 0)) + (lispify-value + (jcall-raw (jmethod "com.sun.jna.Pointer" (jna-getter type) "long") + ptr offset) + type)) + +(defun %mem-set (value ptr type &optional (offset 0)) + (let* ((bit-size (* 8 (%foreign-type-size type))) + (val (if (and (unsigned-type-p type) (logbitp (1- bit-size) value)) + (lognot (logxor value (1- (expt 2 bit-size)))) + value))) + (jcall-raw (jmethod "com.sun.jna.Pointer" + (jna-setter type) "long" (jna-setter-arg-type type)) + ptr + offset + (if (or (eq type :long) (eq type :unsigned-long)) + (jnew (jconstructor "com.sun.jna.NativeLong" "long") val) + val))) + value) + +;;;# Foreign Globals +(let ((get-symbol-address-jmethod (private-jmethod "com.sun.jna.NativeLibrary" "getSymbolAddress"))) + (defun %foreign-symbol-pointer (name library) + "Returns a pointer to a foreign symbol NAME." + (flet ((find-it (library) + (ignore-errors + (make-pointer + (jcall-raw get-symbol-address-jmethod library name))))) + (if (eq library :default) + (or (find-it + (jstatic "getProcess" "com.sun.jna.NativeLibrary")) + ;; The above should find it, but I'm not exactly sure, so + ;; let's still do it manually just in case. + (loop for lib being the hash-values of *loaded-libraries* + thereis (find-it lib))) + (find-it library))))) + +;;;# Calling Foreign Functions + +(defun find-foreign-function (name library) + (flet ((find-it (library) + (ignore-errors + (jcall-raw (jmethod "com.sun.jna.NativeLibrary" "getFunction" + "java.lang.String") + library name)))) + (if (eq library :default) + (or (find-it + (jstatic "getProcess" "com.sun.jna.NativeLibrary")) + ;; The above should find it, but I'm not exactly sure, so + ;; let's still do it manually just in case. + (loop for lib being the hash-values of *loaded-libraries* + thereis (find-it lib))) + (find-it (gethash library *loaded-libraries*))))) + +(defun convert-calling-convention (convention) + (ecase convention + (:stdcall "ALT_CONVENTION") + (:cdecl "C_CONVENTION"))) + +(defparameter *jna-string-encoding* "UTF-8" + "Encoding for conversion between Java and native strings that occurs within JNA. + +Used with jna-4.0.0 or later.") + +;;; c.f. +(defvar *jna-4.0.0-or-later-p* + (ignore-errors (private-jconstructor "com.sun.jna.Function" + "com.sun.jna.Pointer" "int" "java.lang.String"))) + +(let ((jconstructor + (if *jna-4.0.0-or-later-p* + (private-jconstructor "com.sun.jna.Function" + "com.sun.jna.Pointer" "int" "java.lang.String") + (private-jconstructor "com.sun.jna.Function" + "com.sun.jna.Pointer" "int")))) + (defun make-function-pointer (pointer convention) + (apply + #'jnew jconstructor pointer + (jfield "com.sun.jna.Function" (convert-calling-convention convention)) + (when *jna-4.0.0-or-later-p* + (list *jna-string-encoding*))))) + +(defun lisp-value-to-java (value foreign-type) + (case foreign-type + (:pointer value) + (:void nil) + (t (jnew (ecase foreign-type + ((:int :unsigned-int) (jconstructor "java.lang.Integer" "int")) + ((:long-long :unsigned-long-long) + (jconstructor "java.lang.Long" "long")) + ((:long :unsigned-long) + (jconstructor "com.sun.jna.NativeLong" "long")) + ((:short :unsigned-short) (jconstructor "java.lang.Short" "short")) + ((:char :unsigned-char) (jconstructor "java.lang.Byte" "byte")) + (:float (jconstructor "java.lang.Float" "float")) + (:double (jconstructor "java.lang.Double" "double"))) + value)))) + +(defun %%foreign-funcall (function args arg-types return-type) + (let ((jargs (jnew-array "java.lang.Object" (length args)))) + (loop for arg in args and type in arg-types and i from 0 + do (setf (jarray-ref jargs i) + (lisp-value-to-java arg type))) + (if (eq return-type :void) + (progn + (jcall-raw (jmethod "com.sun.jna.Function" "invoke" "[Ljava.lang.Object;") + function jargs) + (values)) + (lispify-value + (jcall-raw (jmethod "com.sun.jna.Function" "invoke" + "java.lang.Class" "[Ljava.lang.Object;") + function + (foreign-type-to-java-class return-type) + jargs) + return-type)))) + +(defun foreign-funcall-type-and-args (args) + (let ((return-type :void)) + (loop for (type arg) on args by #'cddr + if arg collect type into types + and collect arg into fargs + else do (setf return-type type) + finally (return (values types fargs return-type))))) + +(defmacro %foreign-funcall (name args &key library convention) + (declare (ignore convention)) + (multiple-value-bind (types fargs rettype) + (foreign-funcall-type-and-args args) + `(%%foreign-funcall (find-foreign-function ',name ',library) + (list ,@fargs) ',types ',rettype))) + +(defmacro %foreign-funcall-pointer (ptr args &key convention) + (multiple-value-bind (types fargs rettype) + (foreign-funcall-type-and-args args) + `(%%foreign-funcall (make-function-pointer ,ptr ',convention) + (list ,@fargs) ',types ',rettype))) + +;;;# Callbacks + +(defun foreign-to-callback-type (type) + (ecase type + ((:int :unsigned-int) + :int) + ((:long :unsigned-long) + (jvm::make-jvm-class-name "com.sun.jna.NativeLong")) + ((:long-long :unsigned-long-long) + (jvm::make-jvm-class-name "java.lang.Long")) + (:pointer + (jvm::make-jvm-class-name "com.sun.jna.Pointer")) + (:float + :float) + (:double + :double) + ((:char :unsigned-char) + :byte) + ((:short :unsigned-short) + :short) + (:wchar_t + :int) + (:void + :void))) + +(defvar *callbacks* (make-hash-table)) + +(defmacro convert-args-to-lisp-values (arg-names arg-types &body body) + (let ((gensym-args (loop for name in arg-names + collect (format-symbol t '#:callback-arg-~a- name)))) + `(lambda (,@gensym-args) + (let ,(loop for arg in arg-names + for type in arg-types + for gensym-arg in gensym-args + collecting `(,arg (if (typep ,gensym-arg 'java:java-object) + (lispify-value ,gensym-arg ,type) + ,gensym-arg))) + ,@body)))) + +(defmacro %defcallback (name return-type arg-names arg-types body + &key convention) + (declare (ignore convention)) ;; I'm always up for ignoring convention, but this is probably wrong. + `(setf (gethash ',name *callbacks*) + (jinterface-implementation + (ensure-callback-interface ',return-type ',arg-types) + "callback" + (convert-args-to-lisp-values ,arg-names ,arg-types (lisp-value-to-java ,body ',return-type))))) +;; (lambda (,@arg-names) ,body)))) + +(jvm::define-class-name +callback-object+ "com.sun.jna.Callback") +(defconstant + +dynamic-callback-package+ + "org/armedbear/jna/dynamic/callbacks" + "The slash-delimited Java package in which we create classes dynamically to specify callback interfaces.") + +(defun ensure-callback-interface (returns args) + "Ensure that the jvm interface for the callback exists in the current JVM. + +Returns the fully dot qualified name of the interface." + (let* ((jvm-returns (foreign-to-callback-type returns)) + (jvm-args (mapcar #'foreign-to-callback-type args)) + (interface-name (qualified-callback-interface-classname jvm-returns jvm-args))) + (handler-case + (jss:find-java-class interface-name) + (java-exception (e) + (when (jinstance-of-p (java:java-exception-cause e) + "java.lang.ClassNotFoundException") + (let ((interface-class-bytes (%define-jna-callback-interface jvm-returns jvm-args)) + (simple-interface-name (callback-interface-classname jvm-returns jvm-args))) + (load-class interface-name interface-class-bytes))))) + interface-name)) + +(defun qualified-callback-interface-classname (returns args) + (format nil "~A.~A" + (substitute #\. #\/ +dynamic-callback-package+) + (callback-interface-classname returns args))) + +(defun callback-interface-classname (returns args) + (flet ((stringify (thing) + (typecase thing + (jvm::jvm-class-name + (substitute #\_ #\/ + (jvm::class-name-internal thing))) + (t (string thing))))) + (format nil "~A__~{~A~^__~}" + (stringify returns) + (mapcar #'stringify args)))) + +(defun %define-jna-callback-interface (returns args) + "Returns the Java byte[] array of a class representing a Java + interface descending form +CALLBACK-OBJECT+ which contains the + single function 'callback' which takes ARGS returning RETURNS. + +The fully qualified dotted name of the generated class is returned as +the second value." + (let ((name (callback-interface-classname returns args))) + (values + (define-java-interface name +dynamic-callback-package+ + `(("callback" ,returns ,args)) + `(,+callback-object+)) + (qualified-callback-interface-classname returns args)))) + +(defun define-java-interface (name package methods + &optional (superinterfaces nil)) +"Returns the bytes of the Java class interface called NAME in PACKAGE with METHODS. + +METHODS is a list of (NAME RETURN-TYPE (ARG-TYPES)) entries. NAME is +a string. The values of RETURN-TYPE and the list of ARG-TYPES for the +defined method follow the are either references to Java objects as +created by JVM::MAKE-JVM-CLASS-NAME, or keywords representing Java +primtive types as contained in JVM::MAP-PRIMITIVE-TYPE. + +SUPERINTERFACES optionally contains a list of interfaces that this +interface extends specified as fully qualifed dotted Java names." + (let* ((class-name-string (format nil "~A/~A" package name)) + (class-name (jvm::make-jvm-class-name class-name-string)) + (class (jvm::make-class-interface-file class-name))) + (dolist (superinterface superinterfaces) + (jvm::class-add-superinterface + class + (if (typep superinterface 'jvm::jvm-class-name) + superinterface + (jvm::make-jvm-class-name superinterface)))) + (dolist (method methods) + (let ((name (first method)) + (returns (second method)) + (args (third method))) + (jvm::class-add-method + class + (jvm::make-jvm-method name returns args + :flags '(:public :abstract))))) + (jvm::finalize-class-file class) + (let ((s (sys::%make-byte-array-output-stream))) + (jvm::write-class-file class s) + (sys::%get-output-stream-bytes s)))) + +(defun load-class (name bytes) + "Load the byte[] array BYTES as a Java class called NAME." + (#"loadClassFromByteArray" java::*classloader* name bytes)) + +;;; Test function: unused in CFFI +(defun write-class (class-bytes pathname) + "Write the Java byte[] array CLASS-BYTES to PATHNAME." + (with-open-file (stream pathname + :direction :output + :element-type '(signed-byte 8)) + (dotimes (i (jarray-length class-bytes)) + (write-byte (jarray-ref class-bytes i) stream)))) + +(defun %callback (name) + (or (#"getFunctionPointer" 'com.sun.jna.CallbackReference + (gethash name *callbacks*)) + (error "Undefined callback: ~S" name))) + +(defun native-namestring (pathname) + (namestring pathname)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/cffi-allegro.lisp b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/cffi-allegro.lisp new file mode 100644 index 0000000..d3d79fe --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/cffi-allegro.lisp @@ -0,0 +1,446 @@ +;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- +;;; +;;; cffi-allegro.lisp --- CFFI-SYS implementation for Allegro CL. +;;; +;;; Copyright (C) 2005-2009, Luis Oliveira +;;; +;;; Permission is hereby granted, free of charge, to any person +;;; obtaining a copy of this software and associated documentation +;;; files (the "Software"), to deal in the Software without +;;; restriction, including without limitation the rights to use, copy, +;;; modify, merge, publish, distribute, sublicense, and/or sell copies +;;; of the Software, and to permit persons to whom the Software is +;;; furnished to do so, subject to the following conditions: +;;; +;;; The above copyright notice and this permission notice shall be +;;; included in all copies or substantial portions of the Software. +;;; +;;; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +;;; EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +;;; MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +;;; NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +;;; HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +;;; WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +;;; OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +;;; DEALINGS IN THE SOFTWARE. +;;; + +;;;# Administrivia + +(defpackage #:cffi-sys + (:use #:common-lisp) + (:import-from #:alexandria #:if-let #:with-unique-names #:once-only) + (:export + #:canonicalize-symbol-name-case + #:foreign-pointer + #:pointerp + #:pointer-eq + #:null-pointer + #:null-pointer-p + #:inc-pointer + #:make-pointer + #:pointer-address + #:%foreign-alloc + #:foreign-free + #:with-foreign-pointer + #:%foreign-funcall + #:%foreign-funcall-pointer + #:%foreign-type-alignment + #:%foreign-type-size + #:%load-foreign-library + #:%close-foreign-library + #:native-namestring + #:%mem-ref + #:%mem-set + #:make-shareable-byte-vector + #:with-pointer-to-vector-data + #:%foreign-symbol-pointer + #:defcfun-helper-forms + #:%defcallback + #:%callback)) + +(in-package #:cffi-sys) + +;;;# Mis-features + +#-64bit (pushnew 'no-long-long *features*) +(pushnew 'flat-namespace *features*) + +;;;# Symbol Case + +(defun canonicalize-symbol-name-case (name) + (declare (string name)) + (if (eq excl:*current-case-mode* :case-sensitive-lower) + (string-downcase name) + (string-upcase name))) + +;;;# Basic Pointer Operations + +(deftype foreign-pointer () + 'ff:foreign-address) + +(defun pointerp (ptr) + "Return true if PTR is a foreign pointer." + (ff:foreign-address-p ptr)) + +(defun pointer-eq (ptr1 ptr2) + "Return true if PTR1 and PTR2 point to the same address." + (eql ptr1 ptr2)) + +(defun null-pointer () + "Return a null pointer." + 0) + +(defun null-pointer-p (ptr) + "Return true if PTR is a null pointer." + (zerop ptr)) + +(defun inc-pointer (ptr offset) + "Return a pointer pointing OFFSET bytes past PTR." + (+ ptr offset)) + +(defun make-pointer (address) + "Return a pointer pointing to ADDRESS." + (check-type address ff:foreign-address) + address) + +(defun pointer-address (ptr) + "Return the address pointed to by PTR." + (check-type ptr ff:foreign-address) + ptr) + +;;;# Allocation +;;; +;;; Functions and macros for allocating foreign memory on the stack +;;; and on the heap. The main CFFI package defines macros that wrap +;;; FOREIGN-ALLOC and FOREIGN-FREE in UNWIND-PROTECT for the common usage +;;; when the memory has dynamic extent. + +(defun %foreign-alloc (size) + "Allocate SIZE bytes on the heap and return a pointer." + (ff:allocate-fobject :char :c size)) + +(defun foreign-free (ptr) + "Free a PTR allocated by FOREIGN-ALLOC." + (ff:free-fobject ptr)) + +(defmacro with-foreign-pointer ((var size &optional size-var) &body body) + "Bind VAR to SIZE bytes of foreign memory during BODY. The +pointer in VAR is invalid beyond the dynamic extent of BODY, and +may be stack-allocated if supported by the implementation. If +SIZE-VAR is supplied, it will be bound to SIZE during BODY." + (unless size-var + (setf size-var (gensym "SIZE"))) + #+(version>= 8 1) + (when (and (constantp size) (<= (eval size) ff:*max-stack-fobject-bytes*)) + (return-from with-foreign-pointer + `(let ((,size-var ,(eval size))) + (declare (ignorable ,size-var)) + (ff:with-static-fobject (,var '(:array :char ,(eval size)) + :allocation :foreign-static-gc) + ;; (excl::stack-allocated-p var) => T + (let ((,var (ff:fslot-address ,var))) + ,@body))))) + `(let* ((,size-var ,size) + (,var (ff:allocate-fobject :char :c ,size-var))) + (unwind-protect + (progn ,@body) + (ff:free-fobject ,var)))) + +;;;# Shareable Vectors +;;; +;;; This interface is very experimental. WITH-POINTER-TO-VECTOR-DATA +;;; should be defined to perform a copy-in/copy-out if the Lisp +;;; implementation can't do this. + +(defun make-shareable-byte-vector (size) + "Create a Lisp vector of SIZE bytes can passed to +WITH-POINTER-TO-VECTOR-DATA." + (make-array size :element-type '(unsigned-byte 8) + :allocation :static-reclaimable)) + +(defmacro with-pointer-to-vector-data ((ptr-var vector) &body body) + "Bind PTR-VAR to a foreign pointer to the data in VECTOR." + ;; An array allocated in static-reclamable is a non-simple array in + ;; the normal Lisp allocation area, pointing to a simple array in + ;; the static-reclaimable allocation area. Therefore we have to get + ;; out the simple-array to find the pointer to the actual contents. + (with-unique-names (simple-vec) + `(excl:with-underlying-simple-vector (,vector ,simple-vec) + (let ((,ptr-var (ff:fslot-address-typed :unsigned-char :lisp + ,simple-vec))) + ,@body)))) + +;;;# Dereferencing + +(defun convert-foreign-type (type-keyword) + "Convert a CFFI type keyword to an Allegro type." + (ecase type-keyword + (:char :char) + (:unsigned-char :unsigned-char) + (:short :short) + (:unsigned-short :unsigned-short) + (:int :int) + (:unsigned-int :unsigned-int) + (:long :long) + (:unsigned-long :unsigned-long) + (:long-long + #+64bit :nat + #-64bit (error "this platform does not support :long-long.")) + (:unsigned-long-long + #+64bit :unsigned-nat + #-64bit (error "this platform does not support :unsigned-long-long")) + (:float :float) + (:double :double) + (:pointer :unsigned-nat) + (:void :void))) + +(defun %mem-ref (ptr type &optional (offset 0)) + "Dereference an object of TYPE at OFFSET bytes from PTR." + (unless (zerop offset) + (setf ptr (inc-pointer ptr offset))) + (ff:fslot-value-typed (convert-foreign-type type) :c ptr)) + +;;; Compiler macro to open-code the call to FSLOT-VALUE-TYPED when the +;;; CFFI type is constant. Allegro does its own transformation on the +;;; call that results in efficient code. +(define-compiler-macro %mem-ref (&whole form ptr type &optional (off 0)) + (if (constantp type) + (let ((ptr-form (if (eql off 0) ptr `(+ ,ptr ,off)))) + `(ff:fslot-value-typed ',(convert-foreign-type (eval type)) + :c ,ptr-form)) + form)) + +(defun %mem-set (value ptr type &optional (offset 0)) + "Set the object of TYPE at OFFSET bytes from PTR." + (unless (zerop offset) + (setf ptr (inc-pointer ptr offset))) + (setf (ff:fslot-value-typed (convert-foreign-type type) :c ptr) value)) + +;;; Compiler macro to open-code the call to (SETF FSLOT-VALUE-TYPED) +;;; when the CFFI type is constant. Allegro does its own +;;; transformation on the call that results in efficient code. +(define-compiler-macro %mem-set (&whole form val ptr type &optional (off 0)) + (if (constantp type) + (once-only (val) + (let ((ptr-form (if (eql off 0) ptr `(+ ,ptr ,off)))) + `(setf (ff:fslot-value-typed ',(convert-foreign-type (eval type)) + :c ,ptr-form) ,val))) + form)) + +;;;# Calling Foreign Functions + +(defun %foreign-type-size (type-keyword) + "Return the size in bytes of a foreign type." + (ff:sizeof-fobject (convert-foreign-type type-keyword))) + +(defun %foreign-type-alignment (type-keyword) + "Returns the alignment in bytes of a foreign type." + #+(and powerpc macosx32) + (when (eq type-keyword :double) + (return-from %foreign-type-alignment 8)) + ;; No override necessary for the remaining types.... + (ff::sized-ftype-prim-align + (ff::iforeign-type-sftype + (ff:get-foreign-type + (convert-foreign-type type-keyword))))) + +(defun foreign-funcall-type-and-args (args) + "Returns a list of types, list of args and return type." + (let ((return-type :void)) + (loop for (type arg) on args by #'cddr + if arg collect type into types + and collect arg into fargs + else do (setf return-type type) + finally (return (values types fargs return-type))))) + +(defun convert-to-lisp-type (type) + (ecase type + ((:char :short :int :long :nat) + `(signed-byte ,(* 8 (ff:sizeof-fobject type)))) + ((:unsigned-char :unsigned-short :unsigned-int :unsigned-long :unsigned-nat) + `(unsigned-byte ,(* 8 (ff:sizeof-fobject type)))) + (:float 'single-float) + (:double 'double-float) + (:void 'null))) + +(defun allegro-type-pair (cffi-type) + ;; the :FOREIGN-ADDRESS pseudo-type accepts both pointers and + ;; arrays. We need the latter for shareable byte vector support. + (if (eq cffi-type :pointer) + (list :foreign-address) + (let ((ftype (convert-foreign-type cffi-type))) + (list ftype (convert-to-lisp-type ftype))))) + +#+ignore +(defun note-named-foreign-function (symbol name types rettype) + "Give Allegro's compiler a hint to perform a direct call." + `(eval-when (:compile-toplevel :load-toplevel :execute) + (setf (get ',symbol 'system::direct-ff-call) + (list '(,name :language :c) + t ; callback + :c ; convention + ;; return type '(:c-type lisp-type) + ',(allegro-type-pair rettype) + ;; arg types '({(:c-type lisp-type)}*) + '(,@(mapcar #'allegro-type-pair types)) + nil ; arg-checking + ff::ep-flag-never-release)))) + +(defmacro %foreign-funcall (name args &key convention library) + (declare (ignore convention library)) + (multiple-value-bind (types fargs rettype) + (foreign-funcall-type-and-args args) + `(system::ff-funcall + (load-time-value (excl::determine-foreign-address + '(,name :language :c) + #-(version>= 8 1) ff::ep-flag-never-release + #+(version>= 8 1) ff::ep-flag-always-release + nil ; method-index + )) + ;; arg types {'(:c-type lisp-type) argN}* + ,@(mapcan (lambda (type arg) + `(',(allegro-type-pair type) ,arg)) + types fargs) + ;; return type '(:c-type lisp-type) + ',(allegro-type-pair rettype)))) + +(defun defcfun-helper-forms (name lisp-name rettype args types options) + "Return 2 values for DEFCFUN. A prelude form and a caller form." + (declare (ignore options)) + (let ((ff-name (intern (format nil "%cffi-foreign-function/~A" lisp-name)))) + (values + `(ff:def-foreign-call (,ff-name ,name) + ,(loop for type in types + collect (list* (gensym) (allegro-type-pair type))) + :returning ,(allegro-type-pair rettype) + ;; Don't use call-direct when there are no arguments. + ,@(unless (null args) '(:call-direct t)) + :arg-checking nil + :strings-convert nil + #+(version>= 8 1) ,@'(:release-heap :when-ok + :release-heap-ignorable t) + #+smp ,@'(:release-heap-implies-allow-gc t)) + `(,ff-name ,@args)))) + +;;; See doc/allegro-internals.txt for a clue about entry-vec. +(defmacro %foreign-funcall-pointer (ptr args &key convention) + (declare (ignore convention)) + (multiple-value-bind (types fargs rettype) + (foreign-funcall-type-and-args args) + (with-unique-names (entry-vec) + `(let ((,entry-vec (excl::make-entry-vec-boa))) + (setf (aref ,entry-vec 1) ,ptr) ; set jump address + (system::ff-funcall + ,entry-vec + ;; arg types {'(:c-type lisp-type) argN}* + ,@(mapcan (lambda (type arg) + `(',(allegro-type-pair type) ,arg)) + types fargs) + ;; return type '(:c-type lisp-type) + ',(allegro-type-pair rettype)))))) + +;;;# Callbacks + +;;; The *CALLBACKS* hash table contains information about a callback +;;; for the Allegro FFI. The key is the name of the CFFI callback, +;;; and the value is a cons, the car containing the symbol the +;;; callback was defined on in the CFFI-CALLBACKS package, the cdr +;;; being an Allegro FFI pointer (a fixnum) that can be passed to C +;;; functions. +;;; +;;; These pointers must be restored when a saved Lisp image is loaded. +;;; The RESTORE-CALLBACKS function is added to *RESTART-ACTIONS* to +;;; re-register the callbacks during Lisp startup. +(defvar *callbacks* (make-hash-table)) + +;;; Register a callback in the *CALLBACKS* hash table. +(defun register-callback (cffi-name callback-name) + (setf (gethash cffi-name *callbacks*) + (cons callback-name (ff:register-foreign-callable + callback-name :reuse t)))) + +;;; Restore the saved pointers in *CALLBACKS* when loading an image. +(defun restore-callbacks () + (maphash (lambda (key value) + (register-callback key (car value))) + *callbacks*)) + +;;; Arrange for RESTORE-CALLBACKS to run when a saved image containing +;;; CFFI is restarted. +(eval-when (:load-toplevel :execute) + (pushnew 'restore-callbacks excl:*restart-actions*)) + +;;; Create a package to contain the symbols for callback functions. +(defpackage #:cffi-callbacks + (:use)) + +(defun intern-callback (name) + (intern (format nil "~A::~A" + (if-let (package (symbol-package name)) + (package-name package) + "#") + (symbol-name name)) + '#:cffi-callbacks)) + +(defun convert-calling-convention (convention) + (ecase convention + (:cdecl :c) + (:stdcall :stdcall))) + +(defmacro %defcallback (name rettype arg-names arg-types body + &key convention) + (declare (ignore rettype)) + (let ((cb-name (intern-callback name))) + `(progn + (ff:defun-foreign-callable ,cb-name + ,(mapcar (lambda (sym type) (list sym (convert-foreign-type type))) + arg-names arg-types) + (declare (:convention ,(convert-calling-convention convention))) + ,body) + (register-callback ',name ',cb-name)))) + +;;; Return the saved Lisp callback pointer from *CALLBACKS* for the +;;; CFFI callback named NAME. +(defun %callback (name) + (or (cdr (gethash name *callbacks*)) + (error "Undefined callback: ~S" name))) + +;;;# Loading and Closing Foreign Libraries + +(defun %load-foreign-library (name path) + "Load a foreign library." + ;; ACL 8.0 honors the :FOREIGN option and always tries to foreign load + ;; the argument. However, previous versions do not and will only + ;; foreign load the argument if its type is a member of the + ;; EXCL::*LOAD-FOREIGN-TYPES* list. Therefore, we bind that special + ;; to a list containing whatever type NAME has. + (declare (ignore name)) + (let ((excl::*load-foreign-types* + (list (pathname-type (parse-namestring path))))) + (handler-case + (progn + #+(version>= 7) (load path :foreign t) + #-(version>= 7) (load path)) + (file-error (fe) + (error (change-class fe 'simple-error)))) + path)) + +(defun %close-foreign-library (name) + "Close the foreign library NAME." + (ff:unload-foreign-library name)) + +(defun native-namestring (pathname) + (namestring pathname)) + +;;;# Foreign Globals + +(defun convert-external-name (name) + "Add an underscore to NAME if necessary for the ABI." + #+macosx (concatenate 'string "_" name) + #-macosx name) + +(defun %foreign-symbol-pointer (name library) + "Returns a pointer to a foreign symbol NAME." + (declare (ignore library)) + (prog1 (ff:get-entry-point (convert-external-name name)))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/cffi-clasp.lisp b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/cffi-clasp.lisp new file mode 100644 index 0000000..5591bf1 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/cffi-clasp.lisp @@ -0,0 +1,201 @@ +;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- +;;; +;;; cffi-clasp.lisp --- CFFI-SYS implementation for Clasp. +;;; +;;; Copyright (C) 2017 Frank Goenninger +;;; +;;; Permission is hereby granted, free of charge, to any person +;;; obtaining a copy of this software and associated documentation +;;; files (the "Software"), to deal in the Software without +;;; restriction, including without limitation the rights to use, copy, +;;; modify, merge, publish, distribute, sublicense, and/or sell copies +;;; of the Software, and to permit persons to whom the Software is +;;; furnished to do so, subject to the following conditions: +;;; +;;; The above copyright notice and this permission notice shall be +;;; included in all copies or substantial portions of the Software. +;;; +;;; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +;;; EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +;;; MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +;;; NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +;;; HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +;;; WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +;;; OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +;;; DEALINGS IN THE SOFTWARE. +;;; + +;;;# Administrivia + +(defpackage #:cffi-sys + (:use #:common-lisp #:alexandria) + (:export + #:canonicalize-symbol-name-case + #:foreign-pointer + #:pointerp + #:pointer-eq + #:%foreign-alloc + #:foreign-free + #:with-foreign-pointer + #:null-pointer + #:null-pointer-p + #:inc-pointer + #:make-pointer + #:pointer-address + #:%mem-ref + #:%mem-set + #:%foreign-funcall + #:%foreign-funcall-pointer + #:%foreign-type-alignment + #:%foreign-type-size + #:%load-foreign-library + #:%close-foreign-library + #:native-namestring + #:make-shareable-byte-vector + #:with-pointer-to-vector-data + #:%defcallback + #:%callback + #:%foreign-symbol-pointer)) + +(in-package #:cffi-sys) + +;;;# Mis-features + +(pushnew 'flat-namespace cl:*features*) + +;;;# Symbol Case + +(defun canonicalize-symbol-name-case (name) + (declare (string name)) + (string-upcase name)) + +;;;# Allocation + +(defun %foreign-alloc (size) + "Allocate SIZE bytes of foreign-addressable memory." + (clasp-ffi:%foreign-alloc size)) + +(defun foreign-free (ptr) + "Free a pointer PTR allocated by FOREIGN-ALLOC." + (clasp-ffi:%foreign-free ptr)) + +(defmacro with-foreign-pointer ((var size &optional size-var) &body body) + "Bind VAR to SIZE bytes of foreign memory during BODY. The +pointer in VAR is invalid beyond the dynamic extent of BODY, and +may be stack-allocated if supported by the implementation. If +SIZE-VAR is supplied, it will be bound to SIZE during BODY." + (unless size-var + (setf size-var (gensym "SIZE"))) + `(let* ((,size-var ,size) + (,var (%foreign-alloc ,size-var))) + (unwind-protect + (progn ,@body) + (foreign-free ,var)))) + +;;;# Misc. Pointer Operations + +(deftype foreign-pointer () + 'clasp-ffi:foreign-data) + +(defun null-pointer-p (ptr) + "Test if PTR is a null pointer." + (clasp-ffi:%null-pointer-p ptr)) + +(defun null-pointer () + "Construct and return a null pointer." + (clasp-ffi:%make-nullpointer)) + +(defun make-pointer (address) + "Return a pointer pointing to ADDRESS." + (clasp-ffi:%make-pointer address)) + +(defun inc-pointer (ptr offset) + "Return a pointer OFFSET bytes past PTR." + (clasp-ffi:%inc-pointer ptr offset)) + +(defun pointer-address (ptr) + "Return the address pointed to by PTR." + (clasp-ffi:%foreign-data-address ptr)) + +(defun pointerp (ptr) + "Return true if PTR is a foreign pointer." + (typep ptr 'clasp-ffi:foreign-data)) + +(defun pointer-eq (ptr1 ptr2) + "Return true if PTR1 and PTR2 point to the same address." + (check-type ptr1 clasp-ffi:foreign-data) + (check-type ptr2 clasp-ffi:foreign-data) + (eql (pointer-address ptr1) (pointer-address ptr2))) + + +;;;# Shareable Vectors +;;; +;;; This interface is very experimental. WITH-POINTER-TO-VECTOR-DATA +;;; should be defined to perform a copy-in/copy-out if the Lisp +;;; implementation can't do this. + +(defun make-shareable-byte-vector (size) + "Create a Lisp vector of SIZE bytes that can passed to +WITH-POINTER-TO-VECTOR-DATA." + (make-array size :element-type '(unsigned-byte 8))) + +;; frgo, 2016-07-02: TODO: Implemenent! +;; (defmacro with-pointer-to-vector-data ((ptr-var vector) &body body) +;; "Bind PTR-VAR to a foreign pointer to the data in VECTOR." +;; `(let ((,ptr-var (si:make-foreign-data-from-array ,vector))) +;; ,@body)) + +(defun %foreign-type-size (type-keyword) + "Return the size in bytes of a foreign type." + (clasp-ffi:%foreign-type-size type-keyword)) + +(defun %foreign-type-alignment (type-keyword) + "Return the alignment in bytes of a foreign type." + (clasp-ffi:%foreign-type-alignment type-keyword)) + +;;;# Dereferencing + +(defun %mem-ref (ptr type &optional (offset 0)) + "Dereference an object of TYPE at OFFSET bytes from PTR." + (clasp-ffi:%mem-ref ptr type offset)) + +(defun %mem-set (value ptr type &optional (offset 0)) + "Set an object of TYPE at OFFSET bytes from PTR." + (clasp-ffi:%mem-set ptr type value offset)) + +(defmacro %foreign-funcall (name args &key library convention) + "Call a foreign function." + (declare (ignore library convention)) + `(clasp-ffi:%foreign-funcall ,name ,@args)) + +(defmacro %foreign-funcall-pointer (ptr args &key convention) + "Funcall a pointer to a foreign function." + (declare (ignore convention)) + `(clasp-ffi:%foreign-funcall-pointer ,ptr ,@args)) + +;;;# Foreign Libraries + +(defun %load-foreign-library (name path) + "Load a foreign library." + (clasp-ffi:%load-foreign-library name path)) + +(defun %close-foreign-library (handle) + "Close a foreign library." + (clasp-ffi:%close-foreign-library handle)) + +(defun %foreign-symbol-pointer (name library) + "Returns a pointer to a foreign symbol NAME." + (clasp-ffi:%foreign-symbol-pointer name library)) + +(defun native-namestring (pathname) + (namestring pathname)) + +;;;# Callbacks + +(defmacro %defcallback (name rettype arg-names arg-types body + &key convention) + `(clasp-ffi:%defcallback (,name ,@(when convention `(:convention ,convention))) + ,rettype ,arg-names ,arg-types ,body)) + +(defun %callback (name) + (clasp-ffi:%get-callback name)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/cffi-clisp.lisp b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/cffi-clisp.lisp new file mode 100644 index 0000000..9b92799 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/cffi-clisp.lisp @@ -0,0 +1,432 @@ +;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- +;;; +;;; cffi-clisp.lisp --- CFFI-SYS implementation for CLISP. +;;; +;;; Copyright (C) 2005-2006, James Bielman +;;; Copyright (C) 2005-2006, Joerg Hoehle +;;; +;;; Permission is hereby granted, free of charge, to any person +;;; obtaining a copy of this software and associated documentation +;;; files (the "Software"), to deal in the Software without +;;; restriction, including without limitation the rights to use, copy, +;;; modify, merge, publish, distribute, sublicense, and/or sell copies +;;; of the Software, and to permit persons to whom the Software is +;;; furnished to do so, subject to the following conditions: +;;; +;;; The above copyright notice and this permission notice shall be +;;; included in all copies or substantial portions of the Software. +;;; +;;; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +;;; EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +;;; MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +;;; NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +;;; HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +;;; WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +;;; OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +;;; DEALINGS IN THE SOFTWARE. +;;; + +;;;# Administrivia + +(defpackage #:cffi-sys + (:use #:common-lisp #:alexandria) + (:export + #:canonicalize-symbol-name-case + #:foreign-pointer + #:pointerp + #:pointer-eq + #:null-pointer + #:null-pointer-p + #:inc-pointer + #:make-pointer + #:pointer-address + #:%foreign-alloc + #:foreign-free + #:with-foreign-pointer + #:%foreign-funcall + #:%foreign-funcall-pointer + #:%foreign-type-alignment + #:%foreign-type-size + #:%load-foreign-library + #:%close-foreign-library + #:native-namestring + #:%mem-ref + #:%mem-set + #:make-shareable-byte-vector + #:with-pointer-to-vector-data + #:%foreign-symbol-pointer + #:%defcallback + #:%callback)) + +(in-package #:cffi-sys) + +(eval-when (:compile-toplevel :load-toplevel :execute) + (unless (find-package :ffi) + (error "CFFI requires CLISP compiled with dynamic FFI support."))) + +;;;# Symbol Case + +(defun canonicalize-symbol-name-case (name) + (declare (string name)) + (string-upcase name)) + +;;;# Built-In Foreign Types + +(defun convert-foreign-type (type) + "Convert a CFFI built-in type keyword to a CLisp FFI type." + (ecase type + (:char 'ffi:char) + (:unsigned-char 'ffi:uchar) + (:short 'ffi:short) + (:unsigned-short 'ffi:ushort) + (:int 'ffi:int) + (:unsigned-int 'ffi:uint) + (:long 'ffi:long) + (:unsigned-long 'ffi:ulong) + (:long-long 'ffi:sint64) + (:unsigned-long-long 'ffi:uint64) + (:float 'ffi:single-float) + (:double 'ffi:double-float) + ;; Clisp's FFI:C-POINTER converts NULL to NIL. For now + ;; we have a workaround in the pointer operations... + (:pointer 'ffi:c-pointer) + (:void nil))) + +(defun %foreign-type-size (type) + "Return the size in bytes of objects having foreign type TYPE." + (nth-value 0 (ffi:sizeof (convert-foreign-type type)))) + +;; Remind me to buy a beer for whoever made getting the alignment +;; of foreign types part of the public interface in CLisp. :-) +(defun %foreign-type-alignment (type) + "Return the structure alignment in bytes of foreign TYPE." + #+(and darwin ppc) + (case type + ((:double :long-long :unsigned-long-long) + (return-from %foreign-type-alignment 8))) + ;; Override not necessary for the remaining types... + (nth-value 1 (ffi:sizeof (convert-foreign-type type)))) + +;;;# Basic Pointer Operations + +(deftype foreign-pointer () + 'ffi:foreign-address) + +(defun pointerp (ptr) + "Return true if PTR is a foreign pointer." + (typep ptr 'ffi:foreign-address)) + +(defun pointer-eq (ptr1 ptr2) + "Return true if PTR1 and PTR2 point to the same address." + (eql (ffi:foreign-address-unsigned ptr1) + (ffi:foreign-address-unsigned ptr2))) + +(defun null-pointer () + "Return a null foreign pointer." + (ffi:unsigned-foreign-address 0)) + +(defun null-pointer-p (ptr) + "Return true if PTR is a null foreign pointer." + (zerop (ffi:foreign-address-unsigned ptr))) + +(defun inc-pointer (ptr offset) + "Return a pointer pointing OFFSET bytes past PTR." + (ffi:unsigned-foreign-address + (+ offset (ffi:foreign-address-unsigned ptr)))) + +(defun make-pointer (address) + "Return a pointer pointing to ADDRESS." + (ffi:unsigned-foreign-address address)) + +(defun pointer-address (ptr) + "Return the address pointed to by PTR." + (ffi:foreign-address-unsigned ptr)) + +;;;# Foreign Memory Allocation + +(defun %foreign-alloc (size) + "Allocate SIZE bytes of foreign-addressable memory and return a +pointer to the allocated block. An implementation-specific error +is signalled if the memory cannot be allocated." + (ffi:foreign-address + (ffi:allocate-shallow 'ffi:uint8 :count (if (zerop size) 1 size)))) + +(defun foreign-free (ptr) + "Free a pointer PTR allocated by FOREIGN-ALLOC. The results +are undefined if PTR is used after being freed." + (ffi:foreign-free ptr)) + +(defmacro with-foreign-pointer ((var size &optional size-var) &body body) + "Bind VAR to a pointer to SIZE bytes of foreign-addressable +memory during BODY. Both PTR and the memory block pointed to +have dynamic extent and may be stack allocated if supported by +the implementation. If SIZE-VAR is supplied, it will be bound to +SIZE during BODY." + (unless size-var + (setf size-var (gensym "SIZE"))) + (let ((obj-var (gensym))) + `(let ((,size-var ,size)) + (ffi:with-foreign-object + (,obj-var `(ffi:c-array ffi:uint8 ,,size-var)) + (let ((,var (ffi:foreign-address ,obj-var))) + ,@body))))) + +;;;# Memory Access + +;;; %MEM-REF and its compiler macro work around CLISP's FFI:C-POINTER +;;; type and convert NILs back to null pointers. +(defun %mem-ref (ptr type &optional (offset 0)) + "Dereference a pointer OFFSET bytes from PTR to an object of +built-in foreign TYPE. Returns the object as a foreign pointer +or Lisp number." + (let ((value (ffi:memory-as ptr (convert-foreign-type type) offset))) + (if (eq type :pointer) + (or value (null-pointer)) + value))) + +(define-compiler-macro %mem-ref (&whole form ptr type &optional (offset 0)) + "Compiler macro to open-code when TYPE is constant." + (if (constantp type) + (let* ((ftype (convert-foreign-type (eval type))) + (form `(ffi:memory-as ,ptr ',ftype ,offset))) + (if (eq type :pointer) + `(or ,form (null-pointer)) + form)) + form)) + +(defun %mem-set (value ptr type &optional (offset 0)) + "Set a pointer OFFSET bytes from PTR to an object of built-in +foreign TYPE to VALUE." + (setf (ffi:memory-as ptr (convert-foreign-type type) offset) value)) + +(define-compiler-macro %mem-set + (&whole form value ptr type &optional (offset 0)) + (if (constantp type) + ;; (setf (ffi:memory-as) value) is exported, but not so nice + ;; w.r.t. the left to right evaluation rule + `(ffi::write-memory-as + ,value ,ptr ',(convert-foreign-type (eval type)) ,offset) + form)) + +;;;# Shareable Vectors +;;; +;;; This interface is very experimental. WITH-POINTER-TO-VECTOR-DATA +;;; should be defined to perform a copy-in/copy-out if the Lisp +;;; implementation can't do this. + +(declaim (inline make-shareable-byte-vector)) +(defun make-shareable-byte-vector (size) + "Create a Lisp vector of SIZE bytes can passed to +WITH-POINTER-TO-VECTOR-DATA." + (make-array size :element-type '(unsigned-byte 8))) + +(deftype shareable-byte-vector () + `(vector (unsigned-byte 8))) + +(defmacro with-pointer-to-vector-data ((ptr-var vector) &body body) + "Bind PTR-VAR to a foreign pointer to the data in VECTOR." + (with-unique-names (vector-var size-var) + `(let ((,vector-var ,vector)) + (check-type ,vector-var shareable-byte-vector) + (with-foreign-pointer (,ptr-var (length ,vector-var) ,size-var) + ;; copy-in + (loop for i below ,size-var do + (%mem-set (aref ,vector-var i) ,ptr-var :unsigned-char i)) + (unwind-protect (progn ,@body) + ;; copy-out + (loop for i below ,size-var do + (setf (aref ,vector-var i) + (%mem-ref ,ptr-var :unsigned-char i)))))))) + +;;;# Foreign Function Calling + +(defun parse-foreign-funcall-args (args) + "Return three values, a list of CLISP FFI types, a list of +values to pass to the function, and the CLISP FFI return type." + (let ((return-type nil)) + (loop for (type arg) on args by #'cddr + if arg collect (list (gensym) (convert-foreign-type type)) into types + and collect arg into fargs + else do (setf return-type (convert-foreign-type type)) + finally (return (values types fargs return-type))))) + +(defun convert-calling-convention (convention) + (ecase convention + (:stdcall :stdc-stdcall) + (:cdecl :stdc))) + +(defun c-function-type (arg-types rettype convention) + "Generate the apropriate CLISP foreign type specification. Also +takes care of converting the calling convention names." + `(ffi:c-function (:arguments ,@arg-types) + (:return-type ,rettype) + (:language ,(convert-calling-convention convention)))) + +;;; Quick hack around the fact that the CFFI package is not yet +;;; defined when this file is loaded. I suppose we could arrange for +;;; the CFFI package to be defined a bit earlier, though. +(defun library-handle-form (name) + (flet ((find-cffi-symbol (symbol) + (find-symbol (symbol-name symbol) '#:cffi))) + `(,(find-cffi-symbol '#:foreign-library-handle) + (,(find-cffi-symbol '#:get-foreign-library) ',name)))) + +(eval-when (:compile-toplevel :load-toplevel :execute) + ;; version 2.40 (CVS 2006-09-03, to be more precise) added a + ;; PROPERTIES argument to FFI::FOREIGN-LIBRARY-FUNCTION. + (defun post-2.40-ffi-interface-p () + (let ((f-l-f (find-symbol (string '#:foreign-library-function) '#:ffi))) + (if (and f-l-f (= (length (ext:arglist f-l-f)) 5)) + '(:and) + '(:or)))) + ;; FFI::FOREIGN-LIBRARY-FUNCTION and FFI::FOREIGN-LIBRARY-VARIABLE + ;; were deprecated in 2.41 and removed in 2.45. + (defun post-2.45-ffi-interface-p () + (if (find-symbol (string '#:foreign-library-function) '#:ffi) + '(:or) + '(:and)))) + +#+#.(cffi-sys::post-2.45-ffi-interface-p) +(defun %foreign-funcall-aux (name type library) + `(ffi::find-foreign-function ,name ,type nil ,library nil nil)) + +#-#.(cffi-sys::post-2.45-ffi-interface-p) +(defun %foreign-funcall-aux (name type library) + `(ffi::foreign-library-function + ,name ,library nil + #+#.(cffi-sys::post-2.40-ffi-interface-p) + nil + ,type)) + +(defmacro %foreign-funcall (name args &key library convention) + "Invoke a foreign function called NAME, taking pairs of +foreign-type/value pairs from ARGS. If a single element is left +over at the end of ARGS, it specifies the foreign return type of +the function call." + (multiple-value-bind (types fargs rettype) + (parse-foreign-funcall-args args) + (let* ((fn (%foreign-funcall-aux + name + `(ffi:parse-c-type + ',(c-function-type types rettype convention)) + (if (eq library :default) + :default + (library-handle-form library)))) + (form `(funcall + (load-time-value + (handler-case ,fn + (error (err) + (warn "~A" err)))) + ,@fargs))) + (if (eq rettype 'ffi:c-pointer) + `(or ,form (null-pointer)) + form)))) + +(defmacro %foreign-funcall-pointer (ptr args &key convention) + "Similar to %foreign-funcall but takes a pointer instead of a string." + (multiple-value-bind (types fargs rettype) + (parse-foreign-funcall-args args) + `(funcall (ffi:foreign-function + ,ptr (load-time-value + (ffi:parse-c-type ',(c-function-type + types rettype convention)))) + ,@fargs))) + +;;;# Callbacks + +;;; *CALLBACKS* contains the callbacks defined by the CFFI DEFCALLBACK +;;; macro. The symbol naming the callback is the key, and the value +;;; is a list containing a Lisp function, the parsed CLISP FFI type of +;;; the callback, and a saved pointer that should not persist across +;;; saved images. +(defvar *callbacks* (make-hash-table)) + +;;; Return a CLISP FFI function type for a CFFI callback function +;;; given a return type and list of argument names and types. +(eval-when (:compile-toplevel :load-toplevel :execute) + (defun callback-type (rettype arg-names arg-types convention) + (ffi:parse-c-type + `(ffi:c-function + (:arguments ,@(mapcar (lambda (sym type) + (list sym (convert-foreign-type type))) + arg-names arg-types)) + (:return-type ,(convert-foreign-type rettype)) + (:language ,(convert-calling-convention convention)))))) + +;;; Register and create a callback function. +(defun register-callback (name function parsed-type) + (setf (gethash name *callbacks*) + (list function parsed-type + (ffi:with-foreign-object (ptr 'ffi:c-pointer) + ;; Create callback by converting Lisp function to foreign + (setf (ffi:memory-as ptr parsed-type) function) + (ffi:foreign-value ptr))))) + +;;; Restore all saved callback pointers when restarting the Lisp +;;; image. This is pushed onto CUSTOM:*INIT-HOOKS*. +;;; Needs clisp > 2.35, bugfix 2005-09-29 +(defun restore-callback-pointers () + (maphash + (lambda (name list) + (register-callback name (first list) (second list))) + *callbacks*)) + +;;; Add RESTORE-CALLBACK-POINTERS to the lists of functions to run +;;; when an image is restarted. +(eval-when (:load-toplevel :execute) + (pushnew 'restore-callback-pointers custom:*init-hooks*)) + +;;; Define a callback function NAME to run BODY with arguments +;;; ARG-NAMES translated according to ARG-TYPES and the return type +;;; translated according to RETTYPE. Obtain a pointer that can be +;;; passed to C code for this callback by calling %CALLBACK. +(defmacro %defcallback (name rettype arg-names arg-types body + &key convention) + `(register-callback + ',name + (lambda ,arg-names + ;; Work around CLISP's FFI:C-POINTER type and convert NIL values + ;; back into a null pointers. + (let (,@(loop for name in arg-names + and type in arg-types + when (eq type :pointer) + collect `(,name (or ,name (null-pointer))))) + ,body)) + ,(callback-type rettype arg-names arg-types convention))) + +;;; Look up the name of a callback and return a pointer that can be +;;; passed to a C function. Signals an error if no callback is +;;; defined called NAME. +(defun %callback (name) + (multiple-value-bind (list winp) (gethash name *callbacks*) + (unless winp + (error "Undefined callback: ~S" name)) + (third list))) + +;;;# Loading and Closing Foreign Libraries + +(defun %load-foreign-library (name path) + "Load a foreign library from PATH." + (declare (ignore name)) + #+#.(cffi-sys::post-2.45-ffi-interface-p) + (ffi:open-foreign-library path) + #-#.(cffi-sys::post-2.45-ffi-interface-p) + (ffi::foreign-library path)) + +(defun %close-foreign-library (handle) + "Close a foreign library." + (ffi:close-foreign-library handle)) + +(defun native-namestring (pathname) + (namestring pathname)) + +;;;# Foreign Globals + +(defun %foreign-symbol-pointer (name library) + "Returns a pointer to a foreign symbol NAME." + (prog1 (ignore-errors + (ffi:foreign-address + #+#.(cffi-sys::post-2.45-ffi-interface-p) + (ffi::find-foreign-variable name nil library nil nil) + #-#.(cffi-sys::post-2.45-ffi-interface-p) + (ffi::foreign-library-variable name library nil nil))))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/cffi-cmucl.lisp b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/cffi-cmucl.lisp new file mode 100644 index 0000000..210bb2a --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/cffi-cmucl.lisp @@ -0,0 +1,384 @@ +;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- +;;; +;;; cffi-cmucl.lisp --- CFFI-SYS implementation for CMU CL. +;;; +;;; Copyright (C) 2005-2006, James Bielman +;;; +;;; Permission is hereby granted, free of charge, to any person +;;; obtaining a copy of this software and associated documentation +;;; files (the "Software"), to deal in the Software without +;;; restriction, including without limitation the rights to use, copy, +;;; modify, merge, publish, distribute, sublicense, and/or sell copies +;;; of the Software, and to permit persons to whom the Software is +;;; furnished to do so, subject to the following conditions: +;;; +;;; The above copyright notice and this permission notice shall be +;;; included in all copies or substantial portions of the Software. +;;; +;;; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +;;; EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +;;; MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +;;; NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +;;; HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +;;; WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +;;; OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +;;; DEALINGS IN THE SOFTWARE. +;;; + +;;;# Administrivia + +(defpackage #:cffi-sys + (:use #:common-lisp #:alien #:c-call) + (:import-from #:alexandria #:once-only #:with-unique-names #:if-let) + (:export + #:canonicalize-symbol-name-case + #:foreign-pointer + #:pointerp + #:pointer-eq + #:null-pointer + #:null-pointer-p + #:inc-pointer + #:make-pointer + #:pointer-address + #:%foreign-alloc + #:foreign-free + #:with-foreign-pointer + #:%foreign-funcall + #:%foreign-funcall-pointer + #:%foreign-type-alignment + #:%foreign-type-size + #:%load-foreign-library + #:%close-foreign-library + #:native-namestring + #:%mem-ref + #:%mem-set + #:make-shareable-byte-vector + #:with-pointer-to-vector-data + #:%foreign-symbol-pointer + #:%defcallback + #:%callback)) + +(in-package #:cffi-sys) + +;;;# Misfeatures + +(pushnew 'flat-namespace *features*) + +;;;# Symbol Case + +(defun canonicalize-symbol-name-case (name) + (declare (string name)) + (string-upcase name)) + +;;;# Basic Pointer Operations + +(deftype foreign-pointer () + 'sys:system-area-pointer) + +(declaim (inline pointerp)) +(defun pointerp (ptr) + "Return true if PTR is a foreign pointer." + (sys:system-area-pointer-p ptr)) + +(declaim (inline pointer-eq)) +(defun pointer-eq (ptr1 ptr2) + "Return true if PTR1 and PTR2 point to the same address." + (sys:sap= ptr1 ptr2)) + +(declaim (inline null-pointer)) +(defun null-pointer () + "Construct and return a null pointer." + (sys:int-sap 0)) + +(declaim (inline null-pointer-p)) +(defun null-pointer-p (ptr) + "Return true if PTR is a null pointer." + (zerop (sys:sap-int ptr))) + +(declaim (inline inc-pointer)) +(defun inc-pointer (ptr offset) + "Return a pointer pointing OFFSET bytes past PTR." + (sys:sap+ ptr offset)) + +(declaim (inline make-pointer)) +(defun make-pointer (address) + "Return a pointer pointing to ADDRESS." + (sys:int-sap address)) + +(declaim (inline pointer-address)) +(defun pointer-address (ptr) + "Return the address pointed to by PTR." + (sys:sap-int ptr)) + +(defmacro with-foreign-pointer ((var size &optional size-var) &body body) + "Bind VAR to SIZE bytes of foreign memory during BODY. The +pointer in VAR is invalid beyond the dynamic extent of BODY, and +may be stack-allocated if supported by the implementation. If +SIZE-VAR is supplied, it will be bound to SIZE during BODY." + (unless size-var + (setf size-var (gensym "SIZE"))) + ;; If the size is constant we can stack-allocate. + (if (constantp size) + (let ((alien-var (gensym "ALIEN"))) + `(with-alien ((,alien-var (array (unsigned 8) ,(eval size)))) + (let ((,size-var ,(eval size)) + (,var (alien-sap ,alien-var))) + (declare (ignorable ,size-var)) + ,@body))) + `(let* ((,size-var ,size) + (,var (%foreign-alloc ,size-var))) + (unwind-protect + (progn ,@body) + (foreign-free ,var))))) + +;;;# Allocation +;;; +;;; Functions and macros for allocating foreign memory on the stack +;;; and on the heap. The main CFFI package defines macros that wrap +;;; FOREIGN-ALLOC and FOREIGN-FREE in UNWIND-PROTECT for the common usage +;;; when the memory has dynamic extent. + +(defun %foreign-alloc (size) + "Allocate SIZE bytes on the heap and return a pointer." + (declare (type (unsigned-byte 32) size)) + (alien-funcall + (extern-alien + "malloc" + (function system-area-pointer unsigned)) + size)) + +(defun foreign-free (ptr) + "Free a PTR allocated by FOREIGN-ALLOC." + (declare (type system-area-pointer ptr)) + (alien-funcall + (extern-alien + "free" + (function (values) system-area-pointer)) + ptr)) + +;;;# Shareable Vectors +;;; +;;; This interface is very experimental. WITH-POINTER-TO-VECTOR-DATA +;;; should be defined to perform a copy-in/copy-out if the Lisp +;;; implementation can't do this. + +(defun make-shareable-byte-vector (size) + "Create a Lisp vector of SIZE bytes that can passed to +WITH-POINTER-TO-VECTOR-DATA." + (make-array size :element-type '(unsigned-byte 8))) + +(defmacro with-pointer-to-vector-data ((ptr-var vector) &body body) + "Bind PTR-VAR to a foreign pointer to the data in VECTOR." + `(sys:without-gcing + (let ((,ptr-var (sys:vector-sap ,vector))) + ,@body))) + +;;;# Dereferencing + +;;; Define the %MEM-REF and %MEM-SET functions, as well as compiler +;;; macros that optimize the case where the type keyword is constant +;;; at compile-time. +(defmacro define-mem-accessors (&body pairs) + `(progn + (defun %mem-ref (ptr type &optional (offset 0)) + (ecase type + ,@(loop for (keyword fn) in pairs + collect `(,keyword (,fn ptr offset))))) + (defun %mem-set (value ptr type &optional (offset 0)) + (ecase type + ,@(loop for (keyword fn) in pairs + collect `(,keyword (setf (,fn ptr offset) value))))) + (define-compiler-macro %mem-ref + (&whole form ptr type &optional (offset 0)) + (if (constantp type) + (ecase (eval type) + ,@(loop for (keyword fn) in pairs + collect `(,keyword `(,',fn ,ptr ,offset)))) + form)) + (define-compiler-macro %mem-set + (&whole form value ptr type &optional (offset 0)) + (if (constantp type) + (once-only (value) + (ecase (eval type) + ,@(loop for (keyword fn) in pairs + collect `(,keyword `(setf (,',fn ,ptr ,offset) + ,value))))) + form)))) + +(define-mem-accessors + (:char sys:signed-sap-ref-8) + (:unsigned-char sys:sap-ref-8) + (:short sys:signed-sap-ref-16) + (:unsigned-short sys:sap-ref-16) + (:int sys:signed-sap-ref-32) + (:unsigned-int sys:sap-ref-32) + (:long sys:signed-sap-ref-32) + (:unsigned-long sys:sap-ref-32) + (:long-long sys:signed-sap-ref-64) + (:unsigned-long-long sys:sap-ref-64) + (:float sys:sap-ref-single) + (:double sys:sap-ref-double) + (:pointer sys:sap-ref-sap)) + +;;;# Calling Foreign Functions + +(defun convert-foreign-type (type-keyword) + "Convert a CFFI type keyword to an ALIEN type." + (ecase type-keyword + (:char 'char) + (:unsigned-char 'unsigned-char) + (:short 'short) + (:unsigned-short 'unsigned-short) + (:int 'int) + (:unsigned-int 'unsigned-int) + (:long 'long) + (:unsigned-long 'unsigned-long) + (:long-long '(signed 64)) + (:unsigned-long-long '(unsigned 64)) + (:float 'single-float) + (:double 'double-float) + (:pointer 'system-area-pointer) + (:void 'void))) + +(defun %foreign-type-size (type-keyword) + "Return the size in bytes of a foreign type." + (/ (alien-internals:alien-type-bits + (alien-internals:parse-alien-type + (convert-foreign-type type-keyword))) 8)) + +(defun %foreign-type-alignment (type-keyword) + "Return the alignment in bytes of a foreign type." + (/ (alien-internals:alien-type-alignment + (alien-internals:parse-alien-type + (convert-foreign-type type-keyword))) 8)) + +(defun foreign-funcall-type-and-args (args) + "Return an ALIEN function type for ARGS." + (let ((return-type nil)) + (loop for (type arg) on args by #'cddr + if arg collect (convert-foreign-type type) into types + and collect arg into fargs + else do (setf return-type (convert-foreign-type type)) + finally (return (values types fargs return-type))))) + +(defmacro %%foreign-funcall (name types fargs rettype) + "Internal guts of %FOREIGN-FUNCALL." + `(alien-funcall + (extern-alien ,name (function ,rettype ,@types)) + ,@fargs)) + +(defmacro %foreign-funcall (name args &key library convention) + "Perform a foreign function call, document it more later." + (declare (ignore library convention)) + (multiple-value-bind (types fargs rettype) + (foreign-funcall-type-and-args args) + `(%%foreign-funcall ,name ,types ,fargs ,rettype))) + +(defmacro %foreign-funcall-pointer (ptr args &key convention) + "Funcall a pointer to a foreign function." + (declare (ignore convention)) + (multiple-value-bind (types fargs rettype) + (foreign-funcall-type-and-args args) + (with-unique-names (function) + `(with-alien ((,function (* (function ,rettype ,@types)) ,ptr)) + (alien-funcall ,function ,@fargs))))) + +;;;# Callbacks + +(defvar *callbacks* (make-hash-table)) + +;;; Create a package to contain the symbols for callback functions. We +;;; want to redefine callbacks with the same symbol so the internal data +;;; structures are reused. +(defpackage #:cffi-callbacks + (:use)) + +;;; Intern a symbol in the CFFI-CALLBACKS package used to name the internal +;;; callback for NAME. +(eval-when (:compile-toplevel :load-toplevel :execute) + (defun intern-callback (name) + (intern (format nil "~A::~A" + (if-let (package (symbol-package name)) + (package-name package) + name) + (symbol-name name)) + '#:cffi-callbacks))) + +(defmacro %defcallback (name rettype arg-names arg-types body + &key convention) + (declare (ignore convention)) + (let ((cb-name (intern-callback name))) + `(progn + (def-callback ,cb-name + (,(convert-foreign-type rettype) + ,@(mapcar (lambda (sym type) + (list sym (convert-foreign-type type))) + arg-names arg-types)) + ,body) + (setf (gethash ',name *callbacks*) (callback ,cb-name))))) + +(defun %callback (name) + (multiple-value-bind (pointer winp) + (gethash name *callbacks*) + (unless winp + (error "Undefined callback: ~S" name)) + pointer)) + +;;; CMUCL makes new callback trampolines when it reloads, so we need +;;; to update CFFI's copies. +(defun reset-callbacks () + (loop for k being the hash-keys of *callbacks* + do (setf (gethash k *callbacks*) + (alien::symbol-trampoline (intern-callback k))))) + +;; Needs to be after cmucl's restore-callbacks, so put at the end... +(unless (member 'reset-callbacks ext:*after-save-initializations*) + (setf ext:*after-save-initializations* + (append ext:*after-save-initializations* (list 'reset-callbacks)))) + +;;;# Loading and Closing Foreign Libraries + +;;; Work-around for compiling ffi code without loading the +;;; respective library at compile-time. +(setf c::top-level-lambda-max 0) + +(defun %load-foreign-library (name path) + "Load the foreign library NAME." + ;; On some platforms SYS::LOAD-OBJECT-FILE signals an error when + ;; loading fails, but on others (Linux for instance) it returns + ;; two values: NIL and an error string. + (declare (ignore name)) + (multiple-value-bind (ret message) + (sys::load-object-file path) + (cond + ;; Loading failed. + ((stringp message) (error "~A" message)) + ;; The library was already loaded. + ((null ret) (cdr (rassoc path sys::*global-table* :test #'string=))) + ;; The library has been loaded, but since SYS::LOAD-OBJECT-FILE + ;; returns an alist of *all* loaded libraries along with their addresses + ;; we return only the handler associated with the library just loaded. + (t (cdr (rassoc path ret :test #'string=)))))) + +;;; XXX: doesn't work on Darwin; does not check for errors. I suppose we'd +;;; want something like SBCL's dlclose-or-lose in foreign-load.lisp:66 +(defun %close-foreign-library (handler) + "Closes a foreign library." + (let ((lib (rassoc (ext:unix-namestring handler) sys::*global-table* + :test #'string=))) + (sys::dlclose (car lib)) + (setf (car lib) (sys:int-sap 0)))) + +(defun native-namestring (pathname) + (ext:unix-namestring pathname nil)) + +;;;# Foreign Globals + +(defun %foreign-symbol-pointer (name library) + "Returns a pointer to a foreign symbol NAME." + (declare (ignore library)) + (let ((address (sys:alternate-get-global-address + (vm:extern-alien-name name)))) + (if (zerop address) + nil + (sys:int-sap address)))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/cffi-corman.lisp b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/cffi-corman.lisp new file mode 100644 index 0000000..14e7d61 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/cffi-corman.lisp @@ -0,0 +1,331 @@ +;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- +;;; +;;; cffi-corman.lisp --- CFFI-SYS implementation for Corman Lisp. +;;; +;;; Copyright (C) 2005-2008, Luis Oliveira +;;; +;;; Permission is hereby granted, free of charge, to any person +;;; obtaining a copy of this software and associated documentation +;;; files (the "Software"), to deal in the Software without +;;; restriction, including without limitation the rights to use, copy, +;;; modify, merge, publish, distribute, sublicense, and/or sell copies +;;; of the Software, and to permit persons to whom the Software is +;;; furnished to do so, subject to the following conditions: +;;; +;;; The above copyright notice and this permission notice shall be +;;; included in all copies or substantial portions of the Software. +;;; +;;; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +;;; EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +;;; MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +;;; NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +;;; HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +;;; WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +;;; OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +;;; DEALINGS IN THE SOFTWARE. +;;; + +;;; This port is suffering from bitrot as of 2007-03-29. Corman Lisp +;;; is too funky with ASDF, crashes easily, makes it very painful to +;;; do any testing. -- luis + +;;;# Administrivia + +(defpackage #:cffi-sys + (:use #:common-lisp #:c-types) + (:import-from #:alexandria #:with-unique-names) + (:export + #:canonicalize-symbol-name-case + #:foreign-pointer + #:pointerp + #:pointer-eq + #:null-pointer + #:null-pointer-p + #:inc-pointer + #:make-pointer + #:pointer-address + #:%foreign-alloc + #:foreign-free + #:with-foreign-pointer + #:%foreign-funcall + #:%foreign-type-alignment + #:%foreign-type-size + #:%load-foreign-library + #:native-namestring + #:%mem-ref + #:%mem-set + ;#:make-shareable-byte-vector + ;#:with-pointer-to-vector-data + #:foreign-symbol-pointer + #:defcfun-helper-forms + #:%defcallback + #:%callback)) + +(in-package #:cffi-sys) + +;;;# Misfeatures + +(pushnew 'no-long-long *features*) +(pushnew 'no-foreign-funcall *features*) + +;;;$ Symbol Case + +(defun canonicalize-symbol-name-case (name) + (declare (string name)) + (string-upcase name)) + +;;;# Basic Pointer Operations + +(deftype foreign-pointer () + 'cl::foreign) + +(defun pointerp (ptr) + "Return true if PTR is a foreign pointer." + (cpointerp ptr)) + +(defun pointer-eq (ptr1 ptr2) + "Return true if PTR1 and PTR2 point to the same address." + (cpointer= ptr1 ptr2)) + +(defun null-pointer () + "Return a null pointer." + (create-foreign-ptr)) + +(defun null-pointer-p (ptr) + "Return true if PTR is a null pointer." + (cpointer-null ptr)) + +(defun inc-pointer (ptr offset) + "Return a pointer pointing OFFSET bytes past PTR." + (let ((new-ptr (create-foreign-ptr))) + (setf (cpointer-value new-ptr) + (+ (cpointer-value ptr) offset)) + new-ptr)) + +(defun make-pointer (address) + "Return a pointer pointing to ADDRESS." + (int-to-foreign-ptr address)) + +(defun pointer-address (ptr) + "Return the address pointed to by PTR." + (foreign-ptr-to-int ptr)) + +;;;# Allocation +;;; +;;; Functions and macros for allocating foreign memory on the stack +;;; and on the heap. The main CFFI package defines macros that wrap +;;; FOREIGN-ALLOC and FOREIGN-FREE in UNWIND-PROTECT for the common usage +;;; when the memory has dynamic extent. + +(defun %foreign-alloc (size) + "Allocate SIZE bytes on the heap and return a pointer." + (malloc size)) + +(defun foreign-free (ptr) + "Free a PTR allocated by FOREIGN-ALLOC." + (free ptr)) + +(defmacro with-foreign-pointer ((var size &optional size-var) &body body) + "Bind VAR to SIZE bytes of foreign memory during BODY. The +pointer in VAR is invalid beyond the dynamic extent of BODY, and +may be stack-allocated if supported by the implementation. If +SIZE-VAR is supplied, it will be bound to SIZE during BODY." + (unless size-var + (setf size-var (gensym "SIZE"))) + `(let* ((,size-var ,size) + (,var (malloc ,size-var))) + (unwind-protect + (progn ,@body) + (free ,var)))) + +;;;# Shareable Vectors +;;; +;;; This interface is very experimental. WITH-POINTER-TO-VECTOR-DATA +;;; should be defined to perform a copy-in/copy-out if the Lisp +;;; implementation can't do this. + +;(defun make-shareable-byte-vector (size) +; "Create a Lisp vector of SIZE bytes can passed to +;WITH-POINTER-TO-VECTOR-DATA." +; (make-array size :element-type '(unsigned-byte 8))) +; +;(defmacro with-pointer-to-vector-data ((ptr-var vector) &body body) +; "Bind PTR-VAR to a foreign pointer to the data in VECTOR." +; `(sb-sys:without-gcing +; (let ((,ptr-var (sb-sys:vector-sap ,vector))) +; ,@body))) + +;;;# Dereferencing + +;;; According to the docs, Corman's C Function Definition Parser +;;; converts int to long, so we'll assume that. +(defun convert-foreign-type (type-keyword) + "Convert a CFFI type keyword to a CormanCL type." + (ecase type-keyword + (:char :char) + (:unsigned-char :unsigned-char) + (:short :short) + (:unsigned-short :unsigned-short) + (:int :long) + (:unsigned-int :unsigned-long) + (:long :long) + (:unsigned-long :unsigned-long) + (:float :single-float) + (:double :double-float) + (:pointer :handle) + (:void :void))) + +(defun %mem-ref (ptr type &optional (offset 0)) + "Dereference an object of TYPE at OFFSET bytes from PTR." + (unless (eql offset 0) + (setq ptr (inc-pointer ptr offset))) + (ecase type + (:char (cref (:char *) ptr 0)) + (:unsigned-char (cref (:unsigned-char *) ptr 0)) + (:short (cref (:short *) ptr 0)) + (:unsigned-short (cref (:unsigned-short *) ptr 0)) + (:int (cref (:long *) ptr 0)) + (:unsigned-int (cref (:unsigned-long *) ptr 0)) + (:long (cref (:long *) ptr 0)) + (:unsigned-long (cref (:unsigned-long *) ptr 0)) + (:float (cref (:single-float *) ptr 0)) + (:double (cref (:double-float *) ptr 0)) + (:pointer (cref (:handle *) ptr 0)))) + +;(define-compiler-macro %mem-ref (&whole form ptr type &optional (offset 0)) +; (if (constantp type) +; `(cref (,(convert-foreign-type type) *) ,ptr ,offset) +; form)) + +(defun %mem-set (value ptr type &optional (offset 0)) + "Set the object of TYPE at OFFSET bytes from PTR." + (unless (eql offset 0) + (setq ptr (inc-pointer ptr offset))) + (ecase type + (:char (setf (cref (:char *) ptr 0) value)) + (:unsigned-char (setf (cref (:unsigned-char *) ptr 0) value)) + (:short (setf (cref (:short *) ptr 0) value)) + (:unsigned-short (setf (cref (:unsigned-short *) ptr 0) value)) + (:int (setf (cref (:long *) ptr 0) value)) + (:unsigned-int (setf (cref (:unsigned-long *) ptr 0) value)) + (:long (setf (cref (:long *) ptr 0) value)) + (:unsigned-long (setf (cref (:unsigned-long *) ptr 0) value)) + (:float (setf (cref (:single-float *) ptr 0) value)) + (:double (setf (cref (:double-float *) ptr 0) value)) + (:pointer (setf (cref (:handle *) ptr 0) value)))) + +;;;# Calling Foreign Functions + +(defun %foreign-type-size (type-keyword) + "Return the size in bytes of a foreign type." + (sizeof (convert-foreign-type type-keyword))) + +;;; Couldn't find anything in sys/ffi.lisp and the C declaration parser +;;; doesn't seem to care about alignment so we'll assume that it's the +;;; same as its size. +(defun %foreign-type-alignment (type-keyword) + (sizeof (convert-foreign-type type-keyword))) + +(defun find-dll-containing-function (name) + "Searches for NAME in the loaded DLLs. If found, returns +the DLL's name (a string), else returns NIL." + (dolist (dll ct::*dlls-loaded*) + (when (ignore-errors + (ct::get-dll-proc-address name (ct::dll-record-handle dll))) + (return (ct::dll-record-name dll))))) + +;;; This won't work at all... +#|| +(defmacro %foreign-funcall (name &rest args) + (let ((sym (gensym))) + `(let (,sym) + (ct::install-dll-function ,(find-dll-containing-function name) + ,name ,sym) + (funcall ,sym ,@(loop for (type arg) on args by #'cddr + if arg collect arg))))) +||# + +;;; It *might* be possible to implement by copying most of the code +;;; from Corman's DEFUN-DLL. Alternatively, it could implemented the +;;; same way as Lispworks' foreign-funcall. In practice, nobody uses +;;; Corman with CFFI, apparently. :) +(defmacro %foreign-funcall (name &rest args) + "Call a foreign function NAME passing arguments ARGS." + `(format t "~&;; Calling ~A with args ~S.~%" ,name ',args)) + +(defun defcfun-helper-forms (name lisp-name rettype args types) + "Return 2 values for DEFCFUN. A prelude form and a caller form." + (let ((ff-name (intern (format nil "%cffi-foreign-function/~A" lisp-name))) + ;; XXX This will only work if the dll is already loaded, fix this. + (dll (find-dll-containing-function name))) + (values + `(defun-dll ,ff-name + ,(mapcar (lambda (type) + (list (gensym) (convert-foreign-type type))) + types) + :return-type ,(convert-foreign-type rettype) + :library-name ,dll + :entry-name ,name + ;; we want also :pascal linkage type to access + ;; the win32 api for instance.. + :linkage-type :c) + `(,ff-name ,@args)))) + +;;;# Callbacks + +;;; defun-c-callback vs. defun-direct-c-callback? +;;; same issue as Allegro, no return type declaration, should we coerce? +(defmacro %defcallback (name rettype arg-names arg-types body-form) + (declare (ignore rettype)) + (with-unique-names (cb-sym) + `(progn + (defun-c-callback ,cb-sym + ,(mapcar (lambda (sym type) (list sym (convert-foreign-type type))) + arg-names arg-types) + ,body-form) + (setf (get ',name 'callback-ptr) + (get-callback-procinst ',cb-sym))))) + +;;; Just continue to use the plist for now even though this really +;;; should use a *CALLBACKS* hash table and not define the callbacks +;;; as gensyms. Someone with access to Corman should update this. +(defun %callback (name) + (get name 'callback-ptr)) + +;;;# Loading Foreign Libraries + +(defun %load-foreign-library (name) + "Load the foreign library NAME." + (ct::get-dll-record name)) + +(defun %close-foreign-library (name) + "Close the foreign library NAME." + (error "Not implemented.")) + +(defun native-namestring (pathname) + (namestring pathname)) ; TODO: confirm + +;;;# Foreign Globals + +;;; FFI to GetProcAddress from the Win32 API. +;;; "The GetProcAddress function retrieves the address of an exported +;;; function or variable from the specified dynamic-link library (DLL)." +(defun-dll get-proc-address + ((module HMODULE) + (name LPCSTR)) + :return-type FARPROC + :library-name "Kernel32.dll" + :entry-name "GetProcAddress" + :linkage-type :pascal) + +(defun foreign-symbol-pointer (name) + "Returns a pointer to a foreign symbol NAME." + (let ((str (lisp-string-to-c-string name))) + (unwind-protect + (dolist (dll ct::*dlls-loaded*) + (let ((ptr (get-proc-address + (int-to-foreign-ptr (ct::dll-record-handle dll)) + str))) + (when (not (cpointer-null ptr)) + (return ptr)))) + (free str)))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/cffi-ecl.lisp b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/cffi-ecl.lisp new file mode 100644 index 0000000..0b595ef --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/cffi-ecl.lisp @@ -0,0 +1,454 @@ +;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- +;;; +;;; cffi-ecl.lisp --- ECL backend for CFFI. +;;; +;;; Copyright (C) 2005-2006, James Bielman +;;; +;;; Permission is hereby granted, free of charge, to any person +;;; obtaining a copy of this software and associated documentation +;;; files (the "Software"), to deal in the Software without +;;; restriction, including without limitation the rights to use, copy, +;;; modify, merge, publish, distribute, sublicense, and/or sell copies +;;; of the Software, and to permit persons to whom the Software is +;;; furnished to do so, subject to the following conditions: +;;; +;;; The above copyright notice and this permission notice shall be +;;; included in all copies or substantial portions of the Software. +;;; +;;; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +;;; EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +;;; MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +;;; NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +;;; HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +;;; WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +;;; OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +;;; DEALINGS IN THE SOFTWARE. +;;; + +;;;# Administrivia + +(defpackage #:cffi-sys + (:use #:common-lisp #:alexandria) + (:import-from #:si #:null-pointer-p) + (:export + #:*cffi-ecl-method* + #:canonicalize-symbol-name-case + #:foreign-pointer + #:pointerp + #:pointer-eq + #:%foreign-alloc + #:foreign-free + #:with-foreign-pointer + #:null-pointer + #:null-pointer-p + #:inc-pointer + #:make-pointer + #:pointer-address + #:%mem-ref + #:%mem-set + #:%foreign-funcall + #:%foreign-funcall-pointer + #:%foreign-funcall-varargs + #:%foreign-funcall-pointer-varargs + #:%foreign-type-alignment + #:%foreign-type-size + #:%load-foreign-library + #:%close-foreign-library + #:native-namestring + #:make-shareable-byte-vector + #:with-pointer-to-vector-data + #:%defcallback + #:%callback + #:%foreign-symbol-pointer)) + +(in-package #:cffi-sys) + +;;; +;;; ECL allows many ways of calling a foreign function, and also many +;;; ways of finding the pointer associated to a function name. They +;;; depend on whether the FFI relies on libffi or on the C/C++ compiler, +;;; and whether they use the shared library loader to locate symbols +;;; or they are linked by the linker. +;;; +;;; :DFFI +;;; +;;; ECL uses libffi to call foreign functions. The only way to find out +;;; foreign symbols is by loading shared libraries and using dlopen() +;;; or similar. +;;; +;;; :DLOPEN +;;; +;;; ECL compiles FFI code as C/C++ statements. The names are resolved +;;; at run time by the shared library loader every time the function +;;; is called +;;; +;;; :C/C++ +;;; +;;; ECL compiles FFI code as C/C++ statements, but the name resolution +;;; happens at link time. In this case you have to tell the ECL +;;; compiler which are the right ld-flags (c:*ld-flags*) to link in +;;; the library. +;;; +(defvar *cffi-ecl-method* + #+dffi :dffi + #+(and dlopen (not dffi)) :dlopen + #-(or dffi dlopen) :c/c++ + "The type of code that CFFI generates for ECL: :DFFI when using the +dynamical foreign function interface; :DLOPEN when using C code and +dynamical references to symbols; :C/C++ for C/C++ code with static +references to symbols.") + +;;;# Mis-features + +#-long-long +(pushnew 'no-long-long *features*) +(pushnew 'flat-namespace *features*) + +;;;# Symbol Case + +(defun canonicalize-symbol-name-case (name) + (declare (string name)) + (string-upcase name)) + +;;;# Allocation + +(defun %foreign-alloc (size) + "Allocate SIZE bytes of foreign-addressable memory." + (si:allocate-foreign-data :void size)) + +(defun foreign-free (ptr) + "Free a pointer PTR allocated by FOREIGN-ALLOC." + (si:free-foreign-data ptr)) + +(defmacro with-foreign-pointer ((var size &optional size-var) &body body) + "Bind VAR to SIZE bytes of foreign memory during BODY. The +pointer in VAR is invalid beyond the dynamic extent of BODY, and +may be stack-allocated if supported by the implementation. If +SIZE-VAR is supplied, it will be bound to SIZE during BODY." + (unless size-var + (setf size-var (gensym "SIZE"))) + `(let* ((,size-var ,size) + (,var (%foreign-alloc ,size-var))) + (unwind-protect + (progn ,@body) + (foreign-free ,var)))) + +;;;# Misc. Pointer Operations + +(deftype foreign-pointer () + 'si:foreign-data) + +(defun null-pointer () + "Construct and return a null pointer." + (si:allocate-foreign-data :void 0)) + +(defun inc-pointer (ptr offset) + "Return a pointer OFFSET bytes past PTR." + (ffi:make-pointer (+ (ffi:pointer-address ptr) offset) :void)) + +(defun pointerp (ptr) + "Return true if PTR is a foreign pointer." + (typep ptr 'si:foreign-data)) + +(defun pointer-eq (ptr1 ptr2) + "Return true if PTR1 and PTR2 point to the same address." + (= (ffi:pointer-address ptr1) (ffi:pointer-address ptr2))) + +(defun make-pointer (address) + "Return a pointer pointing to ADDRESS." + (ffi:make-pointer address :void)) + +(defun pointer-address (ptr) + "Return the address pointed to by PTR." + (ffi:pointer-address ptr)) + +;;;# Shareable Vectors +;;; +;;; This interface is very experimental. WITH-POINTER-TO-VECTOR-DATA +;;; should be defined to perform a copy-in/copy-out if the Lisp +;;; implementation can't do this. + +(defun make-shareable-byte-vector (size) + "Create a Lisp vector of SIZE bytes that can passed to +WITH-POINTER-TO-VECTOR-DATA." + (make-array size :element-type '(unsigned-byte 8))) + +(defmacro with-pointer-to-vector-data ((ptr-var vector) &body body) + "Bind PTR-VAR to a foreign pointer to the data in VECTOR." + `(let ((,ptr-var (si:make-foreign-data-from-array ,vector))) + ,@body)) + +;;;# Type Operations + +(defconstant +translation-table+ + '((:char :byte "char") + (:unsigned-char :unsigned-byte "unsigned char") + (:short :short "short") + (:unsigned-short :unsigned-short "unsigned short") + (:int :int "int") + (:unsigned-int :unsigned-int "unsigned int") + (:long :long "long") + (:unsigned-long :unsigned-long "unsigned long") + #+long-long + (:long-long :long-long "long long") + #+long-long + (:unsigned-long-long :unsigned-long-long "unsigned long long") + (:float :float "float") + (:double :double "double") + (:pointer :pointer-void "void*") + (:void :void "void"))) + +(defun cffi-type->ecl-type (type-keyword) + "Convert a CFFI type keyword to an ECL type keyword." + (or (second (find type-keyword +translation-table+ :key #'first)) + (error "~S is not a valid CFFI type" type-keyword))) + +(defun ecl-type->c-type (type-keyword) + "Convert a CFFI type keyword to an valid C type keyword." + (or (third (find type-keyword +translation-table+ :key #'second)) + (error "~S is not a valid CFFI type" type-keyword))) + +(defun %foreign-type-size (type-keyword) + "Return the size in bytes of a foreign type." + (nth-value 0 (ffi:size-of-foreign-type + (cffi-type->ecl-type type-keyword)))) + +(defun %foreign-type-alignment (type-keyword) + "Return the alignment in bytes of a foreign type." + (nth-value 1 (ffi:size-of-foreign-type + (cffi-type->ecl-type type-keyword)))) + +;;;# Dereferencing + +(defun %mem-ref (ptr type &optional (offset 0)) + "Dereference an object of TYPE at OFFSET bytes from PTR." + (let* ((type (cffi-type->ecl-type type)) + (type-size (ffi:size-of-foreign-type type))) + (si:foreign-data-ref-elt + (si:foreign-data-recast ptr (+ offset type-size) :void) offset type))) + +(defun %mem-set (value ptr type &optional (offset 0)) + "Set an object of TYPE at OFFSET bytes from PTR." + (let* ((type (cffi-type->ecl-type type)) + (type-size (ffi:size-of-foreign-type type))) + (si:foreign-data-set-elt + (si:foreign-data-recast ptr (+ offset type-size) :void) + offset type value))) + +;;; Inline versions that use C expressions instead of function calls. + +(defparameter +mem-ref-strings+ + (loop for (cffi-type ecl-type c-string) in +translation-table+ + for string = (format nil "*((~A *)(((char*)#0)+#1))" c-string) + collect (list cffi-type ecl-type string))) + +(defparameter +mem-set-strings+ + (loop for (cffi-type ecl-type c-string) in +translation-table+ + for string = (format nil "*((~A *)(((char*)#0)+#1))=#2" c-string) + collect (list cffi-type ecl-type string))) + +(define-compiler-macro %mem-ref (&whole whole ptr type &optional (offset 0)) + (if (and (constantp type) (constantp offset)) + (let ((record (assoc (eval type) +mem-ref-strings+))) + `(ffi:c-inline (,ptr ,offset) + (:pointer-void :cl-index) ; argument types + ,(second record) ; return type + ,(third record) ; the precomputed expansion + :one-liner t)) + whole)) + +(define-compiler-macro %mem-set (&whole whole value ptr type &optional (offset 0)) + (if (and (constantp type) (constantp offset)) + (let ((record (assoc (eval type) +mem-set-strings+))) + `(ffi:c-inline (,ptr ,offset ,value) ; arguments with type translated + (:pointer-void :cl-index ,(second record)) + :void ; does not return anything + ,(third record) ; precomputed expansion + :one-liner t)) + whole)) + +;;;# Calling Foreign Functions + +(defconstant +ecl-inline-codes+ "#0,#1,#2,#3,#4,#5,#6,#7,#8,#9,#a,#b,#c,#d,#e,#f,#g,#h,#i,#j,#k,#l,#m,#n,#o,#p,#q,#r,#s,#t,#u,#v,#w,#x,#y,#z") + +(defun c-inline-function-call (thing fixed-types types values return-type dynamic-call variadic) + (when dynamic-call + (when (stringp thing) + (setf thing `(%foreign-symbol-pointer ,thing nil))) + (push thing values) + (push :pointer-void types)) + (let* ((decl-args + (format nil "~{~A~^, ~}~A" + (mapcar #'ecl-type->c-type fixed-types) (if (null variadic) "" ", ..."))) + (call-args + (if dynamic-call + ;; #0 is already used in a cast (it is a function pointer) + (subseq +ecl-inline-codes+ 3 (max 3 (1- (* (length values) 3)))) + ;; #0 is not used, so we start from the beginning + (subseq +ecl-inline-codes+ 0 (max 0 (1- (* (length values) 3)))))) + (clines + (if dynamic-call + nil + (format nil "extern ~A ~A(~A);" + (ecl-type->c-type return-type) thing decl-args))) + (call-code + (if dynamic-call + (format nil "((~A (*)(~A))(#0))(~A)" + (ecl-type->c-type return-type) decl-args call-args) + (format nil "~A(~A)" thing call-args)))) + `(progn + (ffi:clines ,@(ensure-list clines)) + (ffi:c-inline ,values ,types ,return-type ,call-code :one-liner t :side-effects t)))) + +(defun dffi-function-pointer-call (pointer types values return-type) + (when (stringp pointer) + (setf pointer `(%foreign-symbol-pointer ,pointer nil))) + #-dffi + `(error "In interpreted code, attempted to call a foreign function~% ~A~%~ + but ECL was built without support for that." ,pointer) + #+dffi + `(si::call-cfun ,pointer ,return-type (list ,@types) (list ,@values))) + +(defun foreign-funcall-parse-args (args) + "Return three values, lists of arg types, values, and result type." + (let ((return-type :void)) + (loop for (type arg) on args by #'cddr + if arg collect (cffi-type->ecl-type type) into types + and collect arg into values + else do (setf return-type (cffi-type->ecl-type type)) + finally (return (values types values return-type))))) + +(defmacro %foreign-funcall (name args &key library convention) + "Call a foreign function." + (declare (ignore library convention)) + (multiple-value-bind (types values return-type) + (foreign-funcall-parse-args args) + `(ext:with-backend + :bytecodes + ,(dffi-function-pointer-call name types values return-type) + :c/c++ + ,(ecase *cffi-ecl-method* + (:dffi (dffi-function-pointer-call name types values return-type)) + (:dlopen (c-inline-function-call name types types values return-type t nil)) + (:c/c++ (c-inline-function-call name types types values return-type nil nil)))))) + +(defmacro %foreign-funcall-pointer (pointer args &key convention) + "Funcall a pointer to a foreign function." + (declare (ignore convention)) + (multiple-value-bind (types values return-type) + (foreign-funcall-parse-args args) + `(ext:with-backend + :bytecodes + ,(dffi-function-pointer-call pointer types values return-type) + :c/c++ + ,(if (eq *cffi-ecl-method* :dffi) + (dffi-function-pointer-call pointer types values return-type) + (c-inline-function-call pointer types types values return-type t nil))))) + +(defmacro %foreign-funcall-varargs (name args varargs &key library convention) + (declare (ignore library convention)) + (multiple-value-bind (fixed-types fixed-values) + (foreign-funcall-parse-args args) + (multiple-value-bind (varargs-types varargs-values return-type) + (foreign-funcall-parse-args varargs) + (let ((all-types (append fixed-types varargs-types)) + (values (append fixed-values varargs-values))) + `(ext:with-backend + :bytecodes + ,(dffi-function-pointer-call name all-types values return-type) + :c/c++ + ,(ecase *cffi-ecl-method* + (:dffi (dffi-function-pointer-call name all-types values return-type)) + (:dlopen (c-inline-function-call name fixed-types all-types values return-type t t)) + (:c/c++ (c-inline-function-call name fixed-types all-types values return-type nil t)))))))) + +(defmacro %foreign-funcall-pointer-varargs (pointer args varargs &key convention) + (declare (ignore convention)) + (multiple-value-bind (fixed-types fixed-values) + (foreign-funcall-parse-args args) + (multiple-value-bind (varargs-types varargs-values return-type) + (foreign-funcall-parse-args varargs) + (let ((all-types (append fixed-types varargs-types)) + (values (append fixed-values varargs-values))) + `(ext:with-backend + :bytecodes + ,(dffi-function-pointer-call pointer all-types values return-type) + :c/c++ + ,(if (eq *cffi-ecl-method* :dffi) + (dffi-function-pointer-call pointer all-types values return-type) + (c-inline-function-call pointer fixed-types all-types values return-type t t))))))) + +;;;# Foreign Libraries + +(defun %load-foreign-library (name path) + "Load a foreign library." + (declare (ignore name)) + #-dffi (error "LOAD-FOREIGN-LIBRARY requires ECL's DFFI support. Use ~ + FFI:LOAD-FOREIGN-LIBRARY with a constant argument instead.") + #+dffi + (handler-case (si:load-foreign-module path) + (file-error () + (error "file error while trying to load `~A'" path)))) + +(defun %close-foreign-library (handle) + "Close a foreign library." + (handler-case (si::unload-foreign-module handle) + (undefined-function () + (restart-case (error "Detected ECL prior to version 15.2.21. ~ + Function CFFI:CLOSE-FOREIGN-LIBRARY isn't implemented yet.") + (ignore () :report "Continue anyway (foreign library will remain opened)."))))) + +(defun native-namestring (pathname) + (namestring pathname)) + +;;;# Callbacks + +;;; Create a package to contain the symbols for callback functions. +;;; We want to redefine callbacks with the same symbol so the internal +;;; data structures are reused. +(defpackage #:cffi-callbacks + (:use)) + +(defvar *callbacks* (make-hash-table)) + +;;; Intern a symbol in the CFFI-CALLBACKS package used to name the +;;; internal callback for NAME. +(eval-when (:compile-toplevel :load-toplevel :execute) + (defun intern-callback (name) + (intern (format nil "~A::~A" + (if-let (package (symbol-package name)) + (package-name package) + "#") + (symbol-name name)) + '#:cffi-callbacks))) + +(defmacro %defcallback (name rettype arg-names arg-types body + &key convention) + (declare (ignore convention)) + (let ((cb-name (intern-callback name)) + (cb-type #.(if (> ext:+ecl-version-number+ 160102) + :default :cdecl))) + `(progn + (ffi:defcallback (,cb-name ,cb-type) + ,(cffi-type->ecl-type rettype) + ,(mapcar #'list arg-names + (mapcar #'cffi-type->ecl-type arg-types)) + ,body) + (setf (gethash ',name *callbacks*) ',cb-name)))) + +(defun %callback (name) + (multiple-value-bind (symbol winp) + (gethash name *callbacks*) + (unless winp + (error "Undefined callback: ~S" name)) + (ffi:callback symbol))) + +;;;# Foreign Globals + +(defun %foreign-symbol-pointer (name library) + "Returns a pointer to a foreign symbol NAME." + (declare (ignore library)) + (handler-case + (si:find-foreign-symbol (coerce name 'base-string) + :default :pointer-void 0) + (error (c) nil))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/cffi-gcl.lisp b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/cffi-gcl.lisp new file mode 100644 index 0000000..4a6bd04 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/cffi-gcl.lisp @@ -0,0 +1,313 @@ +;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- +;;; +;;; cffi-gcl.lisp --- CFFI-SYS implementation for GNU Common Lisp. +;;; +;;; Copyright (C) 2005-2006, Luis Oliveira +;;; +;;; Permission is hereby granted, free of charge, to any person +;;; obtaining a copy of this software and associated documentation +;;; files (the "Software"), to deal in the Software without +;;; restriction, including without limitation the rights to use, copy, +;;; modify, merge, publish, distribute, sublicense, and/or sell copies +;;; of the Software, and to permit persons to whom the Software is +;;; furnished to do so, subject to the following conditions: +;;; +;;; The above copyright notice and this permission notice shall be +;;; included in all copies or substantial portions of the Software. +;;; +;;; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +;;; EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +;;; MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +;;; NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +;;; HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +;;; WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +;;; OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +;;; DEALINGS IN THE SOFTWARE. +;;; + +;;; GCL specific notes: +;;; +;;; On ELF systems, a library can be loaded with the help of this: +;;; http://www.copyleft.de/lisp/gcl-elf-loader.html +;;; +;;; Another way is to link the library when creating a new image: +;;; (compiler::link nil "new_image" "" "-lfoo") +;;; +;;; As GCL's FFI is not dynamic, CFFI declarations will only work +;;; after compiled and loaded. + +;;; *** this port is broken *** +;;; gcl doesn't compile the rest of CFFI anyway.. + +;;;# Administrivia + +(defpackage #:cffi-sys + (:use #:common-lisp #:alexandria) + (:export + #:canonicalize-symbol-name-case + #:pointerp + #:%foreign-alloc + #:foreign-free + #:with-foreign-ptr + #:null-ptr + #:null-ptr-p + #:inc-ptr + #:%mem-ref + #:%mem-set + #:%foreign-funcall + #:%foreign-type-alignment + #:%foreign-type-size + #:%load-foreign-library + ;#:make-shareable-byte-vector + ;#:with-pointer-to-vector-data + #:foreign-var-ptr + #:make-callback)) + +(in-package #:cffi-sys) + +;;;# Mis-*features* +(eval-when (:compile-toplevel :load-toplevel :execute) + (pushnew :cffi/no-foreign-funcall *features*)) + +;;; Symbol case. + +(defun canonicalize-symbol-name-case (name) + (declare (string name)) + (string-upcase name)) + +;;;# Allocation +;;; +;;; Functions and macros for allocating foreign memory on the stack +;;; and on the heap. The main CFFI package defines macros that wrap +;;; FOREIGN-ALLOC and FOREIGN-FREE in UNWIND-PROTECT for the common +;;; usage when the memory has dynamic extent. + +(defentry %foreign-alloc (int) (int "malloc")) + +;(defun foreign-alloc (size) +; "Allocate SIZE bytes on the heap and return a pointer." +; (%foreign-alloc size)) + +(defentry foreign-free (int) (void "free")) + +;(defun foreign-free (ptr) +; "Free a PTR allocated by FOREIGN-ALLOC." +; (%free ptr)) + +(defmacro with-foreign-ptr ((var size &optional size-var) &body body) + "Bind VAR to SIZE bytes of foreign memory during BODY. The +pointer in VAR is invalid beyond the dynamic extent of BODY, and +may be stack-allocated if supported by the implementation. If +SIZE-VAR is supplied, it will be bound to SIZE during BODY." + (unless size-var + (setf size-var (gensym "SIZE"))) + `(let* ((,size-var ,size) + (,var (foreign-alloc ,size-var))) + (unwind-protect + (progn ,@body) + (foreign-free ,var)))) + +;;;# Misc. Pointer Operations + +(defun pointerp (ptr) + "Return true if PTR is a foreign pointer." + (integerp ptr)) + +(defun null-ptr () + "Construct and return a null pointer." + 0) + +(defun null-ptr-p (ptr) + "Return true if PTR is a null pointer." + (= ptr 0)) + +(defun inc-ptr (ptr offset) + "Return a pointer OFFSET bytes past PTR." + (+ ptr offset)) + +;;;# Shareable Vectors +;;; +;;; This interface is very experimental. WITH-POINTER-TO-VECTOR-DATA +;;; should be defined to perform a copy-in/copy-out if the Lisp +;;; implementation can't do this. + +;(defun make-shareable-byte-vector (size) +; "Create a Lisp vector of SIZE bytes that can passed to +;WITH-POINTER-TO-VECTOR-DATA." +; (make-array size :element-type '(unsigned-byte 8))) + +;(defmacro with-pointer-to-vector-data ((ptr-var vector) &body body) +; "Bind PTR-VAR to a foreign pointer to the data in VECTOR." +; `(ccl:with-pointer-to-ivector (,ptr-var ,vector) +; ,@body)) + +;;;# Dereferencing + +(defmacro define-mem-ref/set (type gcl-type &optional c-name) + (unless c-name + (setq c-name (substitute #\_ #\Space type))) + (let ((ref-fn (concatenate 'string "ref_" c-name)) + (set-fn (concatenate 'string "set_" c-name))) + `(progn + ;; ref + (defcfun ,(format nil "~A ~A(~A *ptr)" type ref-fn type) + 0 "return *ptr;") + (defentry ,(intern (string-upcase (substitute #\- #\_ ref-fn))) + (int) (,gcl-type ,ref-fn)) + ;; set + (defcfun ,(format nil "void ~A(~A *ptr, ~A value)" set-fn type type) + 0 "*ptr = value;") + (defentry ,(intern (string-upcase (substitute #\- #\_ set-fn))) + (int ,gcl-type) (void ,set-fn))))) + +(define-mem-ref/set "char" char) +(define-mem-ref/set "unsigned char" char) +(define-mem-ref/set "short" int) +(define-mem-ref/set "unsigned short" int) +(define-mem-ref/set "int" int) +(define-mem-ref/set "unsigned int" int) +(define-mem-ref/set "long" int) +(define-mem-ref/set "unsigned long" int) +(define-mem-ref/set "float" float) +(define-mem-ref/set "double" double) +(define-mem-ref/set "void *" int "ptr") + +(defun %mem-ref (ptr type &optional (offset 0)) + "Dereference an object of TYPE at OFFSET bytes from PTR." + (unless (zerop offset) + (incf ptr offset)) + (ecase type + (:char (ref-char ptr)) + (:unsigned-char (ref-unsigned-char ptr)) + (:short (ref-short ptr)) + (:unsigned-short (ref-unsigned-short ptr)) + (:int (ref-int ptr)) + (:unsigned-int (ref-unsigned-int ptr)) + (:long (ref-long ptr)) + (:unsigned-long (ref-unsigned-long ptr)) + (:float (ref-float ptr)) + (:double (ref-double ptr)) + (:pointer (ref-ptr ptr)))) + +(defun %mem-set (value ptr type &optional (offset 0)) + (unless (zerop offset) + (incf ptr offset)) + (ecase type + (:char (set-char ptr value)) + (:unsigned-char (set-unsigned-char ptr value)) + (:short (set-short ptr value)) + (:unsigned-short (set-unsigned-short ptr value)) + (:int (set-int ptr value)) + (:unsigned-int (set-unsigned-int ptr value)) + (:long (set-long ptr value)) + (:unsigned-long (set-unsigned-long ptr value)) + (:float (set-float ptr value)) + (:double (set-double ptr value)) + (:pointer (set-ptr ptr value))) + value) + +;;;# Calling Foreign Functions + +;; TODO: figure out if these type conversions make any sense... +(defun convert-foreign-type (type-keyword) + "Convert a CFFI type keyword to a GCL type." + (ecase type-keyword + (:char 'char) + (:unsigned-char 'char) + (:short 'int) + (:unsigned-short 'int) + (:int 'int) + (:unsigned-int 'int) + (:long 'int) + (:unsigned-long 'int) + (:float 'float) + (:double 'double) + (:pointer 'int) + (:void 'void))) + +(defparameter +cffi-types+ + '(:char :unsigned-char :short :unsigned-short :int :unsigned-int + :long :unsigned-long :float :double :pointer)) + +(defcfun "int size_of(int type)" 0 + "switch (type) { + case 0: return sizeof(char); + case 1: return sizeof(unsigned char); + case 2: return sizeof(short); + case 3: return sizeof(unsigned short); + case 4: return sizeof(int); + case 5: return sizeof(unsigned int); + case 6: return sizeof(long); + case 7: return sizeof(unsigned long); + case 8: return sizeof(float); + case 9: return sizeof(double); + case 10: return sizeof(void *); + default: return -1; + }") + +(defentry size-of (int) (int "size_of")) + +;; TODO: all this is doable inside the defcfun; figure that out.. +(defun %foreign-type-size (type-keyword) + "Return the size in bytes of a foreign type." + (size-of (position type-keyword +cffi-types+))) + +(defcfun "int align_of(int type)" 0 + "switch (type) { + case 0: return __alignof__(char); + case 1: return __alignof__(unsigned char); + case 2: return __alignof__(short); + case 3: return __alignof__(unsigned short); + case 4: return __alignof__(int); + case 5: return __alignof__(unsigned int); + case 6: return __alignof__(long); + case 7: return __alignof__(unsigned long); + case 8: return __alignof__(float); + case 9: return __alignof__(double); + case 10: return __alignof__(void *); + default: return -1; + }") + +(defentry align-of (int) (int "align_of")) + +;; TODO: like %foreign-type-size +(defun %foreign-type-alignment (type-keyword) + "Return the alignment in bytes of a foreign type." + (align-of (position type-keyword +cffi-types+))) + +#+ignore +(defun convert-external-name (name) + "Add an underscore to NAME if necessary for the ABI." + #+darwinppc-target (concatenate 'string "_" name) + #-darwinppc-target name) + +(defmacro %foreign-funcall (function-name &rest args) + "Perform a foreign function all, document it more later." + `(format t "~&;; Calling ~A with args ~S.~%" ,name ',args)) + +(defun defcfun-helper-forms (name rettype args types) + "Return 2 values for DEFCFUN. A prelude form and a caller form." + (let ((ff-name (intern (format nil "%foreign-function/TildeA:~A" name)))) + (values + `(defentry ,ff-name ,(mapcar #'convert-foreign-type types) + (,(convert-foreign-type rettype) ,name)) + `(,ff-name ,@args)))) + +;;;# Callbacks + +;;; XXX unimplemented +(defmacro make-callback (name rettype arg-names arg-types body-form) + 0) + +;;;# Loading Foreign Libraries + +(defun %load-foreign-library (name) + "_Won't_ load the foreign library NAME." + (declare (ignore name))) + +;;;# Foreign Globals + +;;; XXX unimplemented +(defmacro foreign-var-ptr (name) + "Return a pointer pointing to the foreign symbol NAME." + 0) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/cffi-lispworks.lisp b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/cffi-lispworks.lisp new file mode 100644 index 0000000..d0932b8 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/cffi-lispworks.lisp @@ -0,0 +1,417 @@ +;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- +;;; +;;; cffi-lispworks.lisp --- Lispworks CFFI-SYS implementation. +;;; +;;; Copyright (C) 2005-2006, James Bielman +;;; +;;; Permission is hereby granted, free of charge, to any person +;;; obtaining a copy of this software and associated documentation +;;; files (the "Software"), to deal in the Software without +;;; restriction, including without limitation the rights to use, copy, +;;; modify, merge, publish, distribute, sublicense, and/or sell copies +;;; of the Software, and to permit persons to whom the Software is +;;; furnished to do so, subject to the following conditions: +;;; +;;; The above copyright notice and this permission notice shall be +;;; included in all copies or substantial portions of the Software. +;;; +;;; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +;;; EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +;;; MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +;;; NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +;;; HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +;;; WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +;;; OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +;;; DEALINGS IN THE SOFTWARE. +;;; + +;;;# Administrivia + +(defpackage #:cffi-sys + (:use #:cl #:alexandria) + (:export + #:canonicalize-symbol-name-case + #:foreign-pointer + #:pointerp + #:pointer-eq + #:null-pointer + #:null-pointer-p + #:inc-pointer + #:make-pointer + #:pointer-address + #:%foreign-alloc + #:foreign-free + #:with-foreign-pointer + #:%foreign-funcall + #:%foreign-funcall-pointer + #:%foreign-type-alignment + #:%foreign-type-size + #:%load-foreign-library + #:%close-foreign-library + #:native-namestring + #:%mem-ref + #:%mem-set + #:make-shareable-byte-vector + #:with-pointer-to-vector-data + #:%foreign-symbol-pointer + #:defcfun-helper-forms + #:%defcallback + #:%callback)) + +(in-package #:cffi-sys) + +;;;# Misfeatures + +#-lispworks-64bit (pushnew 'no-long-long *features*) + +;;;# Symbol Case + +(defun canonicalize-symbol-name-case (name) + (declare (string name)) + (string-upcase name)) + +;;;# Basic Pointer Operations + +(deftype foreign-pointer () + 'fli::pointer) + +(defun pointerp (ptr) + "Return true if PTR is a foreign pointer." + (fli:pointerp ptr)) + +(defun pointer-eq (ptr1 ptr2) + "Return true if PTR1 and PTR2 point to the same address." + (fli:pointer-eq ptr1 ptr2)) + +;; We use FLI:MAKE-POINTER here instead of FLI:*NULL-POINTER* since old +;; versions of Lispworks don't seem to have it. +(defun null-pointer () + "Return a null foreign pointer." + (fli:make-pointer :address 0 :type :void)) + +(defun null-pointer-p (ptr) + "Return true if PTR is a null pointer." + (check-type ptr fli::pointer) + (fli:null-pointer-p ptr)) + +;; FLI:INCF-POINTER won't work on FLI pointers to :void so we +;; increment "manually." +(defun inc-pointer (ptr offset) + "Return a pointer OFFSET bytes past PTR." + (fli:make-pointer :type :void :address (+ (fli:pointer-address ptr) offset))) + +(defun make-pointer (address) + "Return a pointer pointing to ADDRESS." + (fli:make-pointer :type :void :address address)) + +(defun pointer-address (ptr) + "Return the address pointed to by PTR." + (fli:pointer-address ptr)) + +;;;# Allocation + +(defun %foreign-alloc (size) + "Allocate SIZE bytes of memory and return a pointer." + (fli:allocate-foreign-object :type :byte :nelems size)) + +(defun foreign-free (ptr) + "Free a pointer PTR allocated by FOREIGN-ALLOC." + (fli:free-foreign-object ptr)) + +(defmacro with-foreign-pointer ((var size &optional size-var) &body body) + "Bind VAR to SIZE bytes of foreign memory during BODY. Both the +pointer in VAR and the memory it points to have dynamic extent and may +be stack allocated if supported by the implementation." + (unless size-var + (setf size-var (gensym "SIZE"))) + `(fli:with-dynamic-foreign-objects () + (let* ((,size-var ,size) + (,var (fli:alloca :type :byte :nelems ,size-var))) + ,@body))) + +;;;# Shareable Vectors + +(defun make-shareable-byte-vector (size) + "Create a shareable byte vector." + #+(or lispworks3 lispworks4 lispworks5.0) + (sys:in-static-area + (make-array size :element-type '(unsigned-byte 8))) + #-(or lispworks3 lispworks4 lispworks5.0) + (make-array size :element-type '(unsigned-byte 8) :allocation :static)) + +(defmacro with-pointer-to-vector-data ((ptr-var vector) &body body) + "Bind PTR-VAR to a pointer at the data in VECTOR." + `(fli:with-dynamic-lisp-array-pointer (,ptr-var ,vector) + ,@body)) + +;;;# Dereferencing + +(defun convert-foreign-type (cffi-type) + "Convert a CFFI type keyword to an FLI type." + (ecase cffi-type + (:char :byte) + (:unsigned-char '(:unsigned :byte)) + (:short :short) + (:unsigned-short '(:unsigned :short)) + (:int :int) + (:unsigned-int '(:unsigned :int)) + (:long :long) + (:unsigned-long '(:unsigned :long)) + ;; On 32-bit platforms, Lispworks 5.0+ supports long-long for + ;; DEFCFUN and FOREIGN-FUNCALL. + (:long-long '(:long :long)) + (:unsigned-long-long '(:unsigned :long :long)) + (:float :float) + (:double :double) + (:pointer :pointer) + (:void :void))) + +;;; Convert a CFFI type keyword to a symbol suitable for passing to +;;; FLI:FOREIGN-TYPED-AREF. +#+#.(cl:if (cl:find-symbol "FOREIGN-TYPED-AREF" "FLI") '(and) '(or)) +(defun convert-foreign-typed-aref-type (cffi-type) + (ecase cffi-type + ((:char :short :int :long #+lispworks-64bit :long-long) + `(signed-byte ,(* 8 (%foreign-type-size cffi-type)))) + ((:unsigned-char :unsigned-short :unsigned-int :unsigned-long + #+lispworks-64bit :unsigned-long-long) + `(unsigned-byte ,(* 8 (%foreign-type-size cffi-type)))) + (:float 'single-float) + (:double 'double-float))) + +(defun %mem-ref (ptr type &optional (offset 0)) + "Dereference an object of type TYPE OFFSET bytes from PTR." + (unless (zerop offset) + (setf ptr (inc-pointer ptr offset))) + (fli:dereference ptr :type (convert-foreign-type type))) + +;; Lispworks 5.0 on 64-bit platforms doesn't have [u]int64 support in +;; FOREIGN-TYPED-AREF. That was implemented in 5.1. +#+(and lispworks-64bit lispworks5.0) +(defun 64-bit-type-p (type) + (member type '(:long :unsigned-long :long-long :unsigned-long-long))) + +;;; In LispWorks versions where FLI:FOREIGN-TYPED-AREF is fbound, use +;;; it instead of FLI:DEREFERENCE in the optimizer for %MEM-REF. +#+#.(cl:if (cl:find-symbol "FOREIGN-TYPED-AREF" "FLI") '(and) '(or)) +(define-compiler-macro %mem-ref (&whole form ptr type &optional (off 0)) + (if (constantp type) + (let ((type (eval type))) + (if (or #+(and lispworks-64bit lispworks5.0) (64-bit-type-p type) + (eql type :pointer)) + (let ((fli-type (convert-foreign-type type)) + (ptr-form (if (eql off 0) ptr `(inc-pointer ,ptr ,off)))) + `(fli:dereference ,ptr-form :type ',fli-type)) + (let ((lisp-type (convert-foreign-typed-aref-type type))) + `(locally + (declare (optimize (speed 3) (safety 0))) + (fli:foreign-typed-aref ',lisp-type ,ptr (the fixnum ,off)))))) + form)) + +;;; Open-code the call to FLI:DEREFERENCE when TYPE is constant at +;;; macroexpansion time, when FLI:FOREIGN-TYPED-AREF is not available. +#-#.(cl:if (cl:find-symbol "FOREIGN-TYPED-AREF" "FLI") '(and) '(or)) +(define-compiler-macro %mem-ref (&whole form ptr type &optional (off 0)) + (if (constantp type) + (let ((ptr-form (if (eql off 0) ptr `(inc-pointer ,ptr ,off))) + (type (convert-foreign-type (eval type)))) + `(fli:dereference ,ptr-form :type ',type)) + form)) + +(defun %mem-set (value ptr type &optional (offset 0)) + "Set the object of TYPE at OFFSET bytes from PTR." + (unless (zerop offset) + (setf ptr (inc-pointer ptr offset))) + (setf (fli:dereference ptr :type (convert-foreign-type type)) value)) + +;;; In LispWorks versions where FLI:FOREIGN-TYPED-AREF is fbound, use +;;; it instead of FLI:DEREFERENCE in the optimizer for %MEM-SET. +#+#.(cl:if (cl:find-symbol "FOREIGN-TYPED-AREF" "FLI") '(and) '(or)) +(define-compiler-macro %mem-set (&whole form val ptr type &optional (off 0)) + (if (constantp type) + (once-only (val) + (let ((type (eval type))) + (if (or #+(and lispworks-64bit lispworks5.0) (64-bit-type-p type) + (eql type :pointer)) + (let ((fli-type (convert-foreign-type type)) + (ptr-form (if (eql off 0) ptr `(inc-pointer ,ptr ,off)))) + `(setf (fli:dereference ,ptr-form :type ',fli-type) ,val)) + (let ((lisp-type (convert-foreign-typed-aref-type type))) + `(locally + (declare (optimize (speed 3) (safety 0))) + (setf (fli:foreign-typed-aref ',lisp-type ,ptr + (the fixnum ,off)) + ,val)))))) + form)) + +;;; Open-code the call to (SETF FLI:DEREFERENCE) when TYPE is constant +;;; at macroexpansion time. +#-#.(cl:if (cl:find-symbol "FOREIGN-TYPED-AREF" "FLI") '(and) '(or)) +(define-compiler-macro %mem-set (&whole form val ptr type &optional (off 0)) + (if (constantp type) + (once-only (val) + (let ((ptr-form (if (eql off 0) ptr `(inc-pointer ,ptr ,off))) + (type (convert-foreign-type (eval type)))) + `(setf (fli:dereference ,ptr-form :type ',type) ,val))) + form)) + +;;;# Foreign Type Operations + +(defun %foreign-type-size (type) + "Return the size in bytes of a foreign type." + (fli:size-of (convert-foreign-type type))) + +(defun %foreign-type-alignment (type) + "Return the structure alignment in bytes of foreign type." + #+(and darwin harp::powerpc) + (when (eq type :double) + (return-from %foreign-type-alignment 8)) + ;; Override not necessary for the remaining types... + (fli:align-of (convert-foreign-type type))) + +;;;# Calling Foreign Functions + +(defvar *foreign-funcallable-cache* (make-hash-table :test 'equal) + "Caches foreign funcallables created by %FOREIGN-FUNCALL or +%FOREIGN-FUNCALL-POINTER. We only need to have one per each +signature.") + +(defun foreign-funcall-type-and-args (args) + "Returns a list of types, list of args and return type." + (let ((return-type :void)) + (loop for (type arg) on args by #'cddr + if arg collect (convert-foreign-type type) into types + and collect arg into fargs + else do (setf return-type (convert-foreign-type type)) + finally (return (values types fargs return-type))))) + +(defun create-foreign-funcallable (types rettype convention) + "Creates a foreign funcallable for the signature TYPES -> RETTYPE." + #+mac (declare (ignore convention)) + (format t "~&Creating foreign funcallable for signature ~S -> ~S~%" + types rettype) + ;; yes, ugly, this most likely wants to be a top-level form... + (let ((internal-name (gensym))) + (funcall + (compile nil + `(lambda () + (fli:define-foreign-funcallable ,internal-name + ,(loop for type in types + collect (list (gensym) type)) + :result-type ,rettype + :language :ansi-c + ;; avoid warning about cdecl not being supported on mac + #-mac ,@(list :calling-convention convention))))) + internal-name)) + +(defun get-foreign-funcallable (types rettype convention) + "Returns a foreign funcallable for the signature TYPES -> RETTYPE - +either from the cache or newly created." + (let ((signature (cons rettype types))) + (or (gethash signature *foreign-funcallable-cache*) + ;; (SETF GETHASH) is supposed to be thread-safe + (setf (gethash signature *foreign-funcallable-cache*) + (create-foreign-funcallable types rettype convention))))) + +(defmacro %%foreign-funcall (foreign-function args convention) + "Does the actual work for %FOREIGN-FUNCALL-POINTER and %FOREIGN-FUNCALL. +Checks if a foreign funcallable which fits ARGS already exists and creates +and caches it if necessary. Finally calls it." + (multiple-value-bind (types fargs rettype) + (foreign-funcall-type-and-args args) + `(funcall (load-time-value + (get-foreign-funcallable ',types ',rettype ',convention)) + ,foreign-function ,@fargs))) + +(defmacro %foreign-funcall (name args &key library convention) + "Calls a foreign function named NAME passing arguments ARGS." + `(%%foreign-funcall + (fli:make-pointer :symbol-name ,name + :module ',(if (eq library :default) nil library)) + ,args ,convention)) + +(defmacro %foreign-funcall-pointer (ptr args &key convention) + "Calls a foreign function pointed at by PTR passing arguments ARGS." + `(%%foreign-funcall ,ptr ,args ,convention)) + +(defun defcfun-helper-forms (name lisp-name rettype args types options) + "Return 2 values for DEFCFUN. A prelude form and a caller form." + (let ((ff-name (intern (format nil "%cffi-foreign-function/~A" lisp-name)))) + (values + `(fli:define-foreign-function (,ff-name ,name :source) + ,(mapcar (lambda (ty) (list (gensym) (convert-foreign-type ty))) + types) + :result-type ,(convert-foreign-type rettype) + :language :ansi-c + :module ',(let ((lib (getf options :library))) + (if (eq lib :default) nil lib)) + ;; avoid warning about cdecl not being supported on mac platforms + #-mac ,@(list :calling-convention (getf options :convention))) + `(,ff-name ,@args)))) + +;;;# Callbacks + +(defvar *callbacks* (make-hash-table)) + +;;; Create a package to contain the symbols for callback functions. We +;;; want to redefine callbacks with the same symbol so the internal data +;;; structures are reused. +(defpackage #:cffi-callbacks + (:use)) + +;;; Intern a symbol in the CFFI-CALLBACKS package used to name the internal +;;; callback for NAME. +(eval-when (:compile-toplevel :load-toplevel :execute) + (defun intern-callback (name) + (intern (format nil "~A::~A" + (if-let (package (symbol-package name)) + (package-name package) + "#") + (symbol-name name)) + '#:cffi-callbacks))) + +(defmacro %defcallback (name rettype arg-names arg-types body + &key convention) + (let ((cb-name (intern-callback name))) + `(progn + (fli:define-foreign-callable + (,cb-name :encode :lisp + :result-type ,(convert-foreign-type rettype) + :calling-convention ,convention + :language :ansi-c + :no-check nil) + ,(mapcar (lambda (sym type) + (list sym (convert-foreign-type type))) + arg-names arg-types) + ,body) + (setf (gethash ',name *callbacks*) ',cb-name)))) + +(defun %callback (name) + (multiple-value-bind (symbol winp) + (gethash name *callbacks*) + (unless winp + (error "Undefined callback: ~S" name)) + (fli:make-pointer :symbol-name symbol :module :callbacks))) + +;;;# Loading Foreign Libraries + +(defun %load-foreign-library (name path) + "Load the foreign library NAME." + (fli:register-module (or name path) :connection-style :immediate + :real-name path)) + +(defun %close-foreign-library (name) + "Close the foreign library NAME." + (fli:disconnect-module name :remove t)) + +(defun native-namestring (pathname) + (namestring pathname)) + +;;;# Foreign Globals + +(defun %foreign-symbol-pointer (name library) + "Returns a pointer to a foreign symbol NAME." + (values + (ignore-errors + (fli:make-pointer :symbol-name name :type :void + :module (if (eq library :default) nil library))))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/cffi-mcl.lisp b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/cffi-mcl.lisp new file mode 100644 index 0000000..cf61eb3 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/cffi-mcl.lisp @@ -0,0 +1,396 @@ +;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- +;;; +;;; cffi-mcl.lisp --- CFFI-SYS implementation for Digitool MCL. +;;; +;;; Copyright 2010 james.anderson@setf.de +;;; Copyright 2005-2006, James Bielman +;;; +;;; Permission is hereby granted, free of charge, to any person +;;; obtaining a copy of this software and associated documentation +;;; files (the "Software"), to deal in the Software without +;;; restriction, including without limitation the rights to use, copy, +;;; modify, merge, publish, distribute, sublicense, and/or sell copies +;;; of the Software, and to permit persons to whom the Software is +;;; furnished to do so, subject to the following conditions: +;;; +;;; The above copyright notice and this permission notice shall be +;;; included in all copies or substantial portions of the Software. +;;; +;;; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +;;; EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +;;; MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +;;; NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +;;; HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +;;; WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +;;; OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +;;; DEALINGS IN THE SOFTWARE. +;;; + +;;; this is a stop-gap emulation. (at least) three things are not right +;;; - integer vector arguments are copied +;;; - return values are not typed +;;; - a shared library must be packaged as a framework and statically loaded +;;; +;;; on the topic of shared libraries, see +;;; http://developer.apple.com/library/mac/#documentation/DeveloperTools/Conceptual/MachOTopics/1-Articles/loading_code.html +;;; which describes how to package a shared library as a framework. +;;; once a framework exists, load it as, eg. +;;; (ccl::add-framework-bundle "fftw.framework" :pathname "ccl:frameworks;" ) + +;;;# Administrivia + +(defpackage #:cffi-sys + (:use #:common-lisp #:ccl) + (:import-from #:alexandria #:once-only #:if-let) + (:export + #:canonicalize-symbol-name-case + #:foreign-pointer + #:pointerp ; ccl:pointerp + #:pointer-eq + #:%foreign-alloc + #:foreign-free + #:with-foreign-pointer + #:null-pointer + #:null-pointer-p + #:inc-pointer + #:make-pointer + #:pointer-address + #:%mem-ref + #:%mem-set + #:%foreign-funcall + #:%foreign-funcall-pointer + #:%foreign-type-alignment + #:%foreign-type-size + #:%load-foreign-library + #:%close-foreign-library + #:native-namestring + #:make-shareable-byte-vector + #:with-pointer-to-vector-data + #:%foreign-symbol-pointer + #:%defcallback + #:%callback)) + +(in-package #:cffi-sys) + +;;;# Misfeatures + +(pushnew 'flat-namespace *features*) + +;;;# Symbol Case + +(defun canonicalize-symbol-name-case (name) + (declare (string name)) + (string-upcase name)) + +;;;# Allocation +;;; +;;; Functions and macros for allocating foreign memory on the stack +;;; and on the heap. The main CFFI package defines macros that wrap +;;; FOREIGN-ALLOC and FOREIGN-FREE in UNWIND-PROTECT for the common +;;; usage when the memory has dynamic extent. + +(defun %foreign-alloc (size) + "Allocate SIZE bytes on the heap and return a pointer." + (#_newPtr size)) + +(defun foreign-free (ptr) + "Free a PTR allocated by FOREIGN-ALLOC." + ;; TODO: Should we make this a dead macptr? + (#_disposePtr ptr)) + +(defmacro with-foreign-pointer ((var size &optional size-var) &body body) + "Bind VAR to SIZE bytes of foreign memory during BODY. The +pointer in VAR is invalid beyond the dynamic extent of BODY, and +may be stack-allocated if supported by the implementation. If +SIZE-VAR is supplied, it will be bound to SIZE during BODY." + (unless size-var + (setf size-var (gensym "SIZE"))) + `(let ((,size-var ,size)) + (ccl:%stack-block ((,var ,size-var)) + ,@body))) + +;;;# Misc. Pointer Operations + +(deftype foreign-pointer () + 'ccl:macptr) + +(defun null-pointer () + "Construct and return a null pointer." + (ccl:%null-ptr)) + +(defun null-pointer-p (ptr) + "Return true if PTR is a null pointer." + (ccl:%null-ptr-p ptr)) + +(defun inc-pointer (ptr offset) + "Return a pointer OFFSET bytes past PTR." + (ccl:%inc-ptr ptr offset)) + +(defun pointer-eq (ptr1 ptr2) + "Return true if PTR1 and PTR2 point to the same address." + (ccl:%ptr-eql ptr1 ptr2)) + +(defun make-pointer (address) + "Return a pointer pointing to ADDRESS." + (ccl:%int-to-ptr address)) + +(defun pointer-address (ptr) + "Return the address pointed to by PTR." + (ccl:%ptr-to-int ptr)) + +;;;# Shareable Vectors +;;; +;;; This interface is very experimental. WITH-POINTER-TO-VECTOR-DATA +;;; should be defined to perform a copy-in/copy-out if the Lisp +;;; implementation can't do this. + +(defun make-shareable-byte-vector (size) + "Create a Lisp vector of SIZE bytes that can passed to +WITH-POINTER-TO-VECTOR-DATA." + (make-array size :element-type '(unsigned-byte 8))) + +;;; from openmcl::macros.lisp + +(defmacro with-pointer-to-vector-data ((ptr ivector) &body body) + "Bind PTR-VAR to a foreign pointer to the data in VECTOR." + (let* ((v (gensym)) + (l (gensym))) + `(let* ((,v ,ivector) + (,l (length ,v))) + (unless (typep ,v 'ccl::ivector) (ccl::report-bad-arg ,v 'ccl::ivector)) + ;;;!!! this, unless it's possible to suppress gc + (let ((,ptr (#_newPtr ,l))) + (unwind-protect (progn (ccl::%copy-ivector-to-ptr ,v 0 ,ptr 0 ,l) + (mutliple-value-prog1 + (locally ,@body) + (ccl::%copy-ptr-to-ivector ,ptr 0 ,v 0 ,l))) + (#_disposePtr ,ptr)))))) + +;;;# Dereferencing + +;;; Define the %MEM-REF and %MEM-SET functions, as well as compiler +;;; macros that optimize the case where the type keyword is constant +;;; at compile-time. +(defmacro define-mem-accessors (&body pairs) + `(progn + (defun %mem-ref (ptr type &optional (offset 0)) + (ecase type + ,@(loop for (keyword fn) in pairs + collect `(,keyword (,fn ptr offset))))) + (defun %mem-set (value ptr type &optional (offset 0)) + (ecase type + ,@(loop for (keyword fn) in pairs + collect `(,keyword (setf (,fn ptr offset) value))))) + (define-compiler-macro %mem-ref + (&whole form ptr type &optional (offset 0)) + (if (constantp type) + (ecase (eval type) + ,@(loop for (keyword fn) in pairs + collect `(,keyword `(,',fn ,ptr ,offset)))) + form)) + (define-compiler-macro %mem-set + (&whole form value ptr type &optional (offset 0)) + (if (constantp type) + (once-only (value) + (ecase (eval type) + ,@(loop for (keyword fn) in pairs + collect `(,keyword `(setf (,',fn ,ptr ,offset) + ,value))))) + form)))) + +(define-mem-accessors + (:char %get-signed-byte) + (:unsigned-char %get-unsigned-byte) + (:short %get-signed-word) + (:unsigned-short %get-unsigned-word) + (:int %get-signed-long) + (:unsigned-int %get-unsigned-long) + (:long %get-signed-long) + (:unsigned-long %get-unsigned-long) + (:long-long ccl::%get-signed-long-long) + (:unsigned-long-long ccl::%get-unsigned-long-long) + (:float %get-single-float) + (:double %get-double-float) + (:pointer %get-ptr)) + + +(defun ccl::%get-unsigned-long-long (ptr offset) + (let ((value 0) (bit 0)) + (dotimes (i 8) + (setf (ldb (byte 8 (shiftf bit (+ bit 8))) value) + (ccl:%get-unsigned-byte ptr (+ offset i)))) + value)) + +(setf (fdefinition 'ccl::%get-signed-long-long) + (fdefinition 'ccl::%get-unsigned-long-long)) + +(defun (setf ccl::%get-unsigned-long-long) (value ptr offset) + (let ((bit 0)) + (dotimes (i 8) + (setf (ccl:%get-unsigned-byte ptr (+ offset i)) + (ldb (byte 8 (shiftf bit (+ bit 8))) value)))) + ptr) + +(setf (fdefinition '(setf ccl::%get-signed-long-long)) + (fdefinition '(setf ccl::%get-unsigned-long-long))) + + +;;;# Calling Foreign Functions + +(defun convert-foreign-type (type-keyword) + "Convert a CFFI type keyword to a ppc-ff-call type." + (ecase type-keyword + (:char :signed-byte) + (:unsigned-char :unsigned-byte) + (:short :signed-short) + (:unsigned-short :unsigned-short) + (:int :signed-fullword) + (:unsigned-int :unsigned-fullword) + (:long :signed-fullword) + (:unsigned-long :unsigned-fullword) + (:long-long :signed-doubleword) + (:unsigned-long-long :unsigned-doubleword) + (:float :single-float) + (:double :double-float) + (:pointer :address) + (:void :void))) + +(defun ppc-ff-call-type=>mactype-name (type-keyword) + (ecase type-keyword + (:signed-byte :sint8) + (:unsigned-byte :uint8) + (:signed-short :sint16) + (:unsigned-short :uint16) + (:signed-halfword :sint16) + (:unsigned-halfword :uint16) + (:signed-fullword :sint32) + (:unsigned-fullword :uint32) + ;(:signed-doubleword :long-long) + ;(:unsigned-doubleword :unsigned-long-long) + (:single-float :single-float) + (:double-float :double-float) + (:address :pointer) + (:void :void))) + + + +(defun %foreign-type-size (type-keyword) + "Return the size in bytes of a foreign type." + (case type-keyword + ((:long-long :unsigned-long-long) 8) + (t (ccl::mactype-record-size + (ccl::find-mactype + (ppc-ff-call-type=>mactype-name (convert-foreign-type type-keyword))))))) + +;; There be dragons here. See the following thread for details: +;; http://clozure.com/pipermail/openmcl-devel/2005-June/002777.html +(defun %foreign-type-alignment (type-keyword) + "Return the alignment in bytes of a foreign type." + (case type-keyword + ((:long-long :unsigned-long-long) 4) + (t (ccl::mactype-record-size + (ccl::find-mactype + (ppc-ff-call-type=>mactype-name (convert-foreign-type type-keyword))))))) + +(defun convert-foreign-funcall-types (args) + "Convert foreign types for a call to FOREIGN-FUNCALL." + (loop for (type arg) on args by #'cddr + collect (convert-foreign-type type) + if arg collect arg)) + +(defun convert-external-name (name) + "no '_' is necessary here, the internal lookup operators handle it" + name) + +(defmacro %foreign-funcall (function-name args &key library convention) + "Perform a foreign function call, document it more later." + (declare (ignore library convention)) + `(ccl::ppc-ff-call + (ccl::macho-address ,(ccl::get-macho-entry-point (convert-external-name function-name))) + ,@(convert-foreign-funcall-types args))) + +(defmacro %foreign-funcall-pointer (ptr args &key convention) + (declare (ignore convention)) + `(ccl::ppc-ff-call ,ptr ,@(convert-foreign-funcall-types args))) + +;;;# Callbacks + +;;; The *CALLBACKS* hash table maps CFFI callback names to OpenMCL "macptr" +;;; entry points. It is safe to store the pointers directly because +;;; OpenMCL will update the address of these pointers when a saved image +;;; is loaded (see CCL::RESTORE-PASCAL-FUNCTIONS). +(defvar *callbacks* (make-hash-table)) + +;;; Create a package to contain the symbols for callback functions. We +;;; want to redefine callbacks with the same symbol so the internal data +;;; structures are reused. +(defpackage #:cffi-callbacks + (:use)) + +;;; Intern a symbol in the CFFI-CALLBACKS package used to name the internal +;;; callback for NAME. +(defun intern-callback (name) + (intern (format nil "~A::~A" + (if-let (package (symbol-package name)) + (package-name package) + "#") + (symbol-name name)) + '#:cffi-callbacks)) + +(defmacro %defcallback (name rettype arg-names arg-types body + &key convention) + (declare (ignore convention)) + (let ((cb-name (intern-callback name))) + `(progn + (ccl::ppc-defpascal ,cb-name + (;; ? ,@(when (eq convention :stdcall) '(:discard-stack-args)) + ,@(mapcan (lambda (sym type) + (list (ppc-ff-call-type=>mactype-name (convert-foreign-type type)) sym)) + arg-names arg-types) + ,(ppc-ff-call-type=>mactype-name (convert-foreign-type rettype))) + ,body) + (setf (gethash ',name *callbacks*) (symbol-value ',cb-name))))) + +(defun %callback (name) + (or (gethash name *callbacks*) + (error "Undefined callback: ~S" name))) + +;;;# Loading Foreign Libraries + +(defun %load-foreign-library (name path) + "Load the foreign library NAME." + (declare (ignore path)) + (setf name (string name)) + ;; for mcl emulate this wrt frameworks + (unless (and (> (length name) 10) + (string-equal name ".framework" :start1 (- (length name) 10))) + (setf name (concatenate 'string name ".framework"))) + ;; if the framework was not registered, add it + (unless (gethash name ccl::*framework-descriptors*) + (ccl::add-framework-bundle name :pathname "ccl:frameworks;" )) + (ccl::load-framework-bundle name)) + +(defun %close-foreign-library (name) + "Close the foreign library NAME." + ;; for mcl do nothing + (declare (ignore name)) + nil) + +(defun native-namestring (pathname) + (ccl::posix-namestring (ccl:full-pathname pathname))) + + +;;;# Foreign Globals + +(deftrap-inline "_findsymbol" + ((map :pointer) + (name :pointer)) + :pointer + ()) + + +(defun %foreign-symbol-pointer (name library) + "Returns a pointer to a foreign symbol NAME." + (declare (ignore library)) + (ccl::macho-address + (ccl::get-macho-entry-point (convert-external-name name)))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/cffi-mkcl.lisp b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/cffi-mkcl.lisp new file mode 100644 index 0000000..0e46503 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/cffi-mkcl.lisp @@ -0,0 +1,342 @@ +;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- +;;; +;;; cffi-mkcl.lisp --- MKCL backend for CFFI. +;;; +;;; Copyright (C) 2010-2012, Jean-Claude Beaudoin +;;; Copyright (C) 2005-2006, James Bielman +;;; +;;; Permission is hereby granted, free of charge, to any person +;;; obtaining a copy of this software and associated documentation +;;; files (the "Software"), to deal in the Software without +;;; restriction, including without limitation the rights to use, copy, +;;; modify, merge, publish, distribute, sublicense, and/or sell copies +;;; of the Software, and to permit persons to whom the Software is +;;; furnished to do so, subject to the following conditions: +;;; +;;; The above copyright notice and this permission notice shall be +;;; included in all copies or substantial portions of the Software. +;;; +;;; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +;;; EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +;;; MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +;;; NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +;;; HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +;;; WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +;;; OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +;;; DEALINGS IN THE SOFTWARE. +;;; + +;;;# Administrivia + +(defpackage #:cffi-sys + (:use #:common-lisp #:alexandria) + (:export + #:canonicalize-symbol-name-case + #:foreign-pointer + #:pointerp + #:pointer-eq + #:null-pointer + #:null-pointer-p + #:inc-pointer + #:make-pointer + #:pointer-address + #:%foreign-alloc + #:foreign-free + #:with-foreign-pointer + #:%foreign-funcall + #:%foreign-funcall-pointer + #:%foreign-type-alignment + #:%foreign-type-size + #:%load-foreign-library + #:%close-foreign-library + #:native-namestring + #:%mem-ref + #:%mem-set + #:make-shareable-byte-vector + #:with-pointer-to-vector-data + #:%foreign-symbol-pointer + #:%defcallback + #:%callback)) + +(in-package #:cffi-sys) + +;;;# Mis-features + +(pushnew 'flat-namespace *features*) + +;;;# Symbol Case + +(defun canonicalize-symbol-name-case (name) + (declare (string name)) + (string-upcase name)) + +;;;# Allocation + +(defun %foreign-alloc (size) + "Allocate SIZE bytes of foreign-addressable memory." + (si:allocate-foreign-data :void size)) + +(defun foreign-free (ptr) + "Free a pointer PTR allocated by FOREIGN-ALLOC." + (si:free-foreign-data ptr) + nil) + +(defmacro with-foreign-pointer ((var size &optional size-var) &body body) + "Bind VAR to SIZE bytes of foreign memory during BODY. The +pointer in VAR is invalid beyond the dynamic extent of BODY, and +may be stack-allocated if supported by the implementation. If +SIZE-VAR is supplied, it will be bound to SIZE during BODY." + (unless size-var + (setf size-var (gensym "SIZE"))) + `(let* ((,size-var ,size) + (,var (%foreign-alloc ,size-var))) + (unwind-protect + (progn ,@body) + (foreign-free ,var)))) + +;;;# Misc. Pointer Operations + +(deftype foreign-pointer () + 'si:foreign) + +(defun null-pointer () + "Construct and return a null pointer." + (si:make-foreign-null-pointer)) + +(defun null-pointer-p (ptr) + "Return true if PTR is a null pointer." + (si:null-pointer-p ptr)) + +(defun inc-pointer (ptr offset) + "Return a pointer OFFSET bytes past PTR." + (ffi:make-pointer (+ (ffi:pointer-address ptr) offset) :void)) + +(defun pointerp (ptr) + "Return true if PTR is a foreign pointer." + ;;(typep ptr 'si:foreign) + (si:foreignp ptr)) + +(defun pointer-eq (ptr1 ptr2) + "Return true if PTR1 and PTR2 point to the same address." + (= (ffi:pointer-address ptr1) (ffi:pointer-address ptr2))) + +(defun make-pointer (address) + "Return a pointer pointing to ADDRESS." + (ffi:make-pointer address :void)) + +(defun pointer-address (ptr) + "Return the address pointed to by PTR." + (ffi:pointer-address ptr)) + +;;;# Shareable Vectors +;;; +;;; This interface is very experimental. WITH-POINTER-TO-VECTOR-DATA +;;; should be defined to perform a copy-in/copy-out if the Lisp +;;; implementation can't do this. + +(defun make-shareable-byte-vector (size) + "Create a Lisp vector of SIZE bytes that can passed to +WITH-POINTER-TO-VECTOR-DATA." + (make-array size :element-type '(unsigned-byte 8))) + +;;; MKCL, built with the Boehm GC never moves allocated data, so this +;;; isn't nearly as hard to do. +(defun %vector-address (vector) + "Return the address of VECTOR's data." + (check-type vector (vector (unsigned-byte 8))) + #-mingw64 + (ffi:c-inline (vector) (object) + :unsigned-long + "(uintptr_t) #0->vector.self.b8" + :side-effects nil + :one-liner t) + #+mingw64 + (ffi:c-inline (vector) (object) + :unsigned-long-long + "(uintptr_t) #0->vector.self.b8" + :side-effects nil + :one-liner t)) + +(defmacro with-pointer-to-vector-data ((ptr-var vector) &body body) + "Bind PTR-VAR to a foreign pointer to the data in VECTOR." + `(let ((,ptr-var (make-pointer (%vector-address ,vector)))) + ,@body)) + +;;;# Dereferencing + +(defun %mem-ref (ptr type &optional (offset 0)) + "Dereference an object of TYPE at OFFSET bytes from PTR." + (let* ((type (cffi-type->mkcl-type type)) + (type-size (ffi:size-of-foreign-type type))) + (si:foreign-ref-elt + (si:foreign-recast ptr (+ offset type-size) :void) offset type))) + +(defun %mem-set (value ptr type &optional (offset 0)) + "Set an object of TYPE at OFFSET bytes from PTR." + (let* ((type (cffi-type->mkcl-type type)) + (type-size (ffi:size-of-foreign-type type))) + (si:foreign-set-elt + (si:foreign-recast ptr (+ offset type-size) :void) + offset type value))) + +;;;# Type Operations + +(defconstant +translation-table+ + '((:char :byte "char") + (:unsigned-char :unsigned-byte "unsigned char") + (:short :short "short") + (:unsigned-short :unsigned-short "unsigned short") + (:int :int "int") + (:unsigned-int :unsigned-int "unsigned int") + (:long :long "long") + (:unsigned-long :unsigned-long "unsigned long") + (:long-long :long-long "long long") + (:unsigned-long-long :unsigned-long-long "unsigned long long") + (:float :float "float") + (:double :double "double") + (:pointer :pointer-void "void*") + (:void :void "void"))) + +(defun cffi-type->mkcl-type (type-keyword) + "Convert a CFFI type keyword to an MKCL type keyword." + (or (second (find type-keyword +translation-table+ :key #'first)) + (error "~S is not a valid CFFI type" type-keyword))) + +(defun mkcl-type->c-type (type-keyword) + "Convert a CFFI type keyword to an valid C type keyword." + (or (third (find type-keyword +translation-table+ :key #'second)) + (error "~S is not a valid CFFI type" type-keyword))) + +(defun %foreign-type-size (type-keyword) + "Return the size in bytes of a foreign type." + (nth-value 0 (ffi:size-of-foreign-type + (cffi-type->mkcl-type type-keyword)))) + +(defun %foreign-type-alignment (type-keyword) + "Return the alignment in bytes of a foreign type." + (nth-value 1 (ffi:size-of-foreign-type + (cffi-type->mkcl-type type-keyword)))) + +;;;# Calling Foreign Functions + +#| +(defconstant +mkcl-inline-codes+ "#0,#1,#2,#3,#4,#5,#6,#7,#8,#9,#a,#b,#c,#d,#e,#f,#g,#h,#i,#j,#k,#l,#m,#n,#o,#p,#q,#r,#s,#t,#u,#v,#w,#x,#y,#z") +|# + +(defun produce-function-pointer-call (pointer types values return-type) +#| + (if (stringp pointer) + (produce-function-pointer-call + `(%foreign-symbol-pointer ,pointer nil) types values return-type) + `(ffi:c-inline + ,(list* pointer values) + ,(list* :pointer-void types) ,return-type + ,(with-output-to-string (s) + (let ((types (mapcar #'mkcl-type->c-type types))) + ;; On AMD64, the following code only works with the extra + ;; argument ",...". If this is not present, functions + ;; like sprintf do not work + (format s "((~A (*)(~@[~{~A,~}...~]))(#0))(~A)" + (mkcl-type->c-type return-type) types + (subseq +mkcl-inline-codes+ 3 + (max 3 (+ 2 (* (length values) 3))))))) + :one-liner t :side-effects t)) +|# + ;; The version here below is definitely not as efficient as the one above + ;; but it has the great vertue of working in all cases, (contrary to the + ;; silent and unsafe limitations of the one above). JCB + ;; I should re-optimize this one day, when I get time... JCB + (progn + (when (stringp pointer) + (setf pointer `(%foreign-symbol-pointer ,pointer nil))) + `(si:call-cfun ,pointer ,return-type (list ,@types) (list ,@values)))) + + +(defun foreign-funcall-parse-args (args) + "Return three values, lists of arg types, values, and result type." + (let ((return-type :void)) + (loop for (type arg) on args by #'cddr + if arg collect (cffi-type->mkcl-type type) into types + and collect arg into values + else do (setf return-type (cffi-type->mkcl-type type)) + finally (return (values types values return-type))))) + +(defmacro %foreign-funcall (name args &key library convention) + "Call a foreign function." + (declare (ignore library convention)) + (multiple-value-bind (types values return-type) + (foreign-funcall-parse-args args) + (produce-function-pointer-call name types values return-type))) + +(defmacro %foreign-funcall-pointer (ptr args &key convention) + "Funcall a pointer to a foreign function." + (declare (ignore convention)) + (multiple-value-bind (types values return-type) + (foreign-funcall-parse-args args) + (produce-function-pointer-call ptr types values return-type))) + +;;;# Foreign Libraries + +(defun %load-foreign-library (name path) + "Load a foreign library." + (declare (ignore name)) + (handler-case (si:load-foreign-module path) + (file-error () + (error "file error while trying to load `~A'" path)))) + +(defun %close-foreign-library (handle) + ;;(declare (ignore handle)) + ;;(error "%CLOSE-FOREIGN-LIBRARY unimplemented.") + (si:unload-foreign-module handle)) + +(defun native-namestring (pathname) + (namestring pathname)) + +;;;# Callbacks + +;;; Create a package to contain the symbols for callback functions. +;;; We want to redefine callbacks with the same symbol so the internal +;;; data structures are reused. +(defpackage #:cffi-callbacks + (:use)) + +(defvar *callbacks* (make-hash-table)) + +;;; Intern a symbol in the CFFI-CALLBACKS package used to name the +;;; internal callback for NAME. +(eval-when (:compile-toplevel :load-toplevel :execute) + (defun intern-callback (name) + (intern (format nil "~A::~A" + (if-let (package (symbol-package name)) + (package-name package) + "#") + (symbol-name name)) + '#:cffi-callbacks))) + +(defmacro %defcallback (name rettype arg-names arg-types body + &key convention) + (declare (ignore convention)) + (let ((cb-name (intern-callback name))) + `(progn + (ffi:defcallback (,cb-name :cdecl) + ,(cffi-type->mkcl-type rettype) + ,(mapcar #'list arg-names + (mapcar #'cffi-type->mkcl-type arg-types)) + ;;(block ,cb-name ,@body) + (block ,cb-name ,body)) + (setf (gethash ',name *callbacks*) ',cb-name)))) + +(defun %callback (name) + (multiple-value-bind (symbol winp) + (gethash name *callbacks*) + (unless winp + (error "Undefined callback: ~S" name)) + (ffi:callback symbol))) + +;;;# Foreign Globals + +(defun %foreign-symbol-pointer (name library) + "Returns a pointer to a foreign symbol NAME." + (declare (ignore library)) + (values (ignore-errors (si:find-foreign-symbol name :default :pointer-void 0)))) + diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/cffi-openmcl.lisp b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/cffi-openmcl.lisp new file mode 100644 index 0000000..5a53ad0 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/cffi-openmcl.lisp @@ -0,0 +1,314 @@ +;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- +;;; +;;; cffi-openmcl.lisp --- CFFI-SYS implementation for OpenMCL. +;;; +;;; Copyright (C) 2005-2006, James Bielman +;;; +;;; Permission is hereby granted, free of charge, to any person +;;; obtaining a copy of this software and associated documentation +;;; files (the "Software"), to deal in the Software without +;;; restriction, including without limitation the rights to use, copy, +;;; modify, merge, publish, distribute, sublicense, and/or sell copies +;;; of the Software, and to permit persons to whom the Software is +;;; furnished to do so, subject to the following conditions: +;;; +;;; The above copyright notice and this permission notice shall be +;;; included in all copies or substantial portions of the Software. +;;; +;;; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +;;; EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +;;; MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +;;; NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +;;; HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +;;; WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +;;; OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +;;; DEALINGS IN THE SOFTWARE. +;;; + +;;;# Administrivia + +(defpackage #:cffi-sys + (:use #:common-lisp #:ccl) + (:import-from #:alexandria #:once-only #:if-let) + (:export + #:canonicalize-symbol-name-case + #:foreign-pointer + #:pointerp ; ccl:pointerp + #:pointer-eq + #:%foreign-alloc + #:foreign-free + #:with-foreign-pointer + #:null-pointer + #:null-pointer-p + #:inc-pointer + #:make-pointer + #:pointer-address + #:%mem-ref + #:%mem-set + #:%foreign-funcall + #:%foreign-funcall-pointer + #:%foreign-type-alignment + #:%foreign-type-size + #:%load-foreign-library + #:%close-foreign-library + #:native-namestring + #:make-shareable-byte-vector + #:with-pointer-to-vector-data + #:%foreign-symbol-pointer + #:%defcallback + #:%callback)) + +(in-package #:cffi-sys) + +;;;# Misfeatures + +(pushnew 'flat-namespace *features*) + +;;;# Symbol Case + +(defun canonicalize-symbol-name-case (name) + (declare (string name)) + (string-upcase name)) + +;;;# Allocation +;;; +;;; Functions and macros for allocating foreign memory on the stack +;;; and on the heap. The main CFFI package defines macros that wrap +;;; FOREIGN-ALLOC and FOREIGN-FREE in UNWIND-PROTECT for the common +;;; usage when the memory has dynamic extent. + +(defun %foreign-alloc (size) + "Allocate SIZE bytes on the heap and return a pointer." + (ccl::malloc size)) + +(defun foreign-free (ptr) + "Free a PTR allocated by FOREIGN-ALLOC." + ;; TODO: Should we make this a dead macptr? + (ccl::free ptr)) + +(defmacro with-foreign-pointer ((var size &optional size-var) &body body) + "Bind VAR to SIZE bytes of foreign memory during BODY. The +pointer in VAR is invalid beyond the dynamic extent of BODY, and +may be stack-allocated if supported by the implementation. If +SIZE-VAR is supplied, it will be bound to SIZE during BODY." + (unless size-var + (setf size-var (gensym "SIZE"))) + `(let ((,size-var ,size)) + (%stack-block ((,var ,size-var)) + ,@body))) + +;;;# Misc. Pointer Operations + +(deftype foreign-pointer () + 'ccl:macptr) + +(defun null-pointer () + "Construct and return a null pointer." + (ccl:%null-ptr)) + +(defun null-pointer-p (ptr) + "Return true if PTR is a null pointer." + (ccl:%null-ptr-p ptr)) + +(defun inc-pointer (ptr offset) + "Return a pointer OFFSET bytes past PTR." + (ccl:%inc-ptr ptr offset)) + +(defun pointer-eq (ptr1 ptr2) + "Return true if PTR1 and PTR2 point to the same address." + (ccl:%ptr-eql ptr1 ptr2)) + +(defun make-pointer (address) + "Return a pointer pointing to ADDRESS." + (ccl:%int-to-ptr address)) + +(defun pointer-address (ptr) + "Return the address pointed to by PTR." + (ccl:%ptr-to-int ptr)) + +;;;# Shareable Vectors +;;; +;;; This interface is very experimental. WITH-POINTER-TO-VECTOR-DATA +;;; should be defined to perform a copy-in/copy-out if the Lisp +;;; implementation can't do this. + +(defun make-shareable-byte-vector (size) + "Create a Lisp vector of SIZE bytes that can passed to +WITH-POINTER-TO-VECTOR-DATA." + (make-array size :element-type '(unsigned-byte 8))) + +(defmacro with-pointer-to-vector-data ((ptr-var vector) &body body) + "Bind PTR-VAR to a foreign pointer to the data in VECTOR." + `(ccl:with-pointer-to-ivector (,ptr-var ,vector) + ,@body)) + +;;;# Dereferencing + +;;; Define the %MEM-REF and %MEM-SET functions, as well as compiler +;;; macros that optimize the case where the type keyword is constant +;;; at compile-time. +(defmacro define-mem-accessors (&body pairs) + `(progn + (defun %mem-ref (ptr type &optional (offset 0)) + (ecase type + ,@(loop for (keyword fn) in pairs + collect `(,keyword (,fn ptr offset))))) + (defun %mem-set (value ptr type &optional (offset 0)) + (ecase type + ,@(loop for (keyword fn) in pairs + collect `(,keyword (setf (,fn ptr offset) value))))) + (define-compiler-macro %mem-ref + (&whole form ptr type &optional (offset 0)) + (if (constantp type) + (ecase (eval type) + ,@(loop for (keyword fn) in pairs + collect `(,keyword `(,',fn ,ptr ,offset)))) + form)) + (define-compiler-macro %mem-set + (&whole form value ptr type &optional (offset 0)) + (if (constantp type) + (once-only (value) + (ecase (eval type) + ,@(loop for (keyword fn) in pairs + collect `(,keyword `(setf (,',fn ,ptr ,offset) + ,value))))) + form)))) + +(define-mem-accessors + (:char %get-signed-byte) + (:unsigned-char %get-unsigned-byte) + (:short %get-signed-word) + (:unsigned-short %get-unsigned-word) + (:int %get-signed-long) + (:unsigned-int %get-unsigned-long) + #+(or 32-bit-target windows-target) (:long %get-signed-long) + #+(and (not windows-target) 64-bit-target) (:long ccl::%%get-signed-longlong) + #+(or 32-bit-target windows-target) (:unsigned-long %get-unsigned-long) + #+(and 64-bit-target (not windows-target)) (:unsigned-long ccl::%%get-unsigned-longlong) + (:long-long ccl::%get-signed-long-long) + (:unsigned-long-long ccl::%get-unsigned-long-long) + (:float %get-single-float) + (:double %get-double-float) + (:pointer %get-ptr)) + +;;;# Calling Foreign Functions + +(defun convert-foreign-type (type-keyword) + "Convert a CFFI type keyword to an OpenMCL type." + (ecase type-keyword + (:char :signed-byte) + (:unsigned-char :unsigned-byte) + (:short :signed-short) + (:unsigned-short :unsigned-short) + (:int :signed-int) + (:unsigned-int :unsigned-int) + (:long :signed-long) + (:unsigned-long :unsigned-long) + (:long-long :signed-doubleword) + (:unsigned-long-long :unsigned-doubleword) + (:float :single-float) + (:double :double-float) + (:pointer :address) + (:void :void))) + +(defun %foreign-type-size (type-keyword) + "Return the size in bytes of a foreign type." + (/ (ccl::foreign-type-bits + (ccl::parse-foreign-type + (convert-foreign-type type-keyword))) + 8)) + +;; There be dragons here. See the following thread for details: +;; http://clozure.com/pipermail/openmcl-devel/2005-June/002777.html +(defun %foreign-type-alignment (type-keyword) + "Return the alignment in bytes of a foreign type." + (/ (ccl::foreign-type-alignment + (ccl::parse-foreign-type + (convert-foreign-type type-keyword))) 8)) + +(defun convert-foreign-funcall-types (args) + "Convert foreign types for a call to FOREIGN-FUNCALL." + (loop for (type arg) on args by #'cddr + collect (convert-foreign-type type) + if arg collect arg)) + +(defun convert-external-name (name) + "Add an underscore to NAME if necessary for the ABI." + #+darwin (concatenate 'string "_" name) + #-darwin name) + +(defmacro %foreign-funcall (function-name args &key library convention) + "Perform a foreign function call, document it more later." + (declare (ignore library convention)) + `(external-call + ,(convert-external-name function-name) + ,@(convert-foreign-funcall-types args))) + +(defmacro %foreign-funcall-pointer (ptr args &key convention) + (declare (ignore convention)) + `(ff-call ,ptr ,@(convert-foreign-funcall-types args))) + +;;;# Callbacks + +;;; The *CALLBACKS* hash table maps CFFI callback names to OpenMCL "macptr" +;;; entry points. It is safe to store the pointers directly because +;;; OpenMCL will update the address of these pointers when a saved image +;;; is loaded (see CCL::RESTORE-PASCAL-FUNCTIONS). +(defvar *callbacks* (make-hash-table)) + +;;; Create a package to contain the symbols for callback functions. We +;;; want to redefine callbacks with the same symbol so the internal data +;;; structures are reused. +(defpackage #:cffi-callbacks + (:use)) + +;;; Intern a symbol in the CFFI-CALLBACKS package used to name the internal +;;; callback for NAME. +(defun intern-callback (name) + (intern (format nil "~A::~A" + (if-let (package (symbol-package name)) + (package-name package) + "#") + (symbol-name name)) + '#:cffi-callbacks)) + +(defmacro %defcallback (name rettype arg-names arg-types body + &key convention) + (let ((cb-name (intern-callback name))) + `(progn + (defcallback ,cb-name + (,@(when (eq convention :stdcall) + '(:discard-stack-args)) + ,@(mapcan (lambda (sym type) + (list (convert-foreign-type type) sym)) + arg-names arg-types) + ,(convert-foreign-type rettype)) + ,body) + (setf (gethash ',name *callbacks*) (symbol-value ',cb-name))))) + +(defun %callback (name) + (or (gethash name *callbacks*) + (error "Undefined callback: ~S" name))) + +;;;# Loading Foreign Libraries + +(defun %load-foreign-library (name path) + "Load the foreign library NAME." + (declare (ignore name)) + (open-shared-library path)) + +(defun %close-foreign-library (name) + "Close the foreign library NAME." + ;; C-S-L sometimes ends in an endless loop + ;; with :COMPLETELY T + (close-shared-library name :completely nil)) + +(defun native-namestring (pathname) + (ccl::native-translated-namestring pathname)) + +;;;# Foreign Globals + +(defun %foreign-symbol-pointer (name library) + "Returns a pointer to a foreign symbol NAME." + (declare (ignore library)) + (foreign-symbol-address (convert-external-name name))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/cffi-sbcl.lisp b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/cffi-sbcl.lisp new file mode 100644 index 0000000..63cdce5 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/cffi-sbcl.lisp @@ -0,0 +1,408 @@ +;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- +;;; +;;; cffi-sbcl.lisp --- CFFI-SYS implementation for SBCL. +;;; +;;; Copyright (C) 2005-2006, James Bielman +;;; +;;; Permission is hereby granted, free of charge, to any person +;;; obtaining a copy of this software and associated documentation +;;; files (the "Software"), to deal in the Software without +;;; restriction, including without limitation the rights to use, copy, +;;; modify, merge, publish, distribute, sublicense, and/or sell copies +;;; of the Software, and to permit persons to whom the Software is +;;; furnished to do so, subject to the following conditions: +;;; +;;; The above copyright notice and this permission notice shall be +;;; included in all copies or substantial portions of the Software. +;;; +;;; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +;;; EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +;;; MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +;;; NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +;;; HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +;;; WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +;;; OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +;;; DEALINGS IN THE SOFTWARE. +;;; + +;;;# Administrivia + +(defpackage #:cffi-sys + (:use #:common-lisp #:sb-alien) + (:import-from #:alexandria + #:once-only #:with-unique-names #:when-let #:removef) + (:export + #:canonicalize-symbol-name-case + #:foreign-pointer + #:pointerp + #:pointer-eq + #:null-pointer + #:null-pointer-p + #:inc-pointer + #:make-pointer + #:pointer-address + #:%foreign-alloc + #:foreign-free + #:with-foreign-pointer + #:%foreign-funcall + #:%foreign-funcall-pointer + #:%foreign-type-alignment + #:%foreign-type-size + #:%load-foreign-library + #:%close-foreign-library + #:native-namestring + #:%mem-ref + #:%mem-set + #:make-shareable-byte-vector + #:with-pointer-to-vector-data + #:%foreign-symbol-pointer + #:%defcallback + #:%callback)) + +(in-package #:cffi-sys) + +;;;# Misfeatures + +(pushnew 'flat-namespace *features*) + +;;;# Symbol Case + +(declaim (inline canonicalize-symbol-name-case)) +(defun canonicalize-symbol-name-case (name) + (declare (string name)) + (string-upcase name)) + +;;;# Basic Pointer Operations + +(deftype foreign-pointer () + 'sb-sys:system-area-pointer) + +(declaim (inline pointerp)) +(defun pointerp (ptr) + "Return true if PTR is a foreign pointer." + (sb-sys:system-area-pointer-p ptr)) + +(declaim (inline pointer-eq)) +(defun pointer-eq (ptr1 ptr2) + "Return true if PTR1 and PTR2 point to the same address." + (declare (type system-area-pointer ptr1 ptr2)) + (sb-sys:sap= ptr1 ptr2)) + +(declaim (inline null-pointer)) +(defun null-pointer () + "Construct and return a null pointer." + (sb-sys:int-sap 0)) + +(declaim (inline null-pointer-p)) +(defun null-pointer-p (ptr) + "Return true if PTR is a null pointer." + (declare (type system-area-pointer ptr)) + (zerop (sb-sys:sap-int ptr))) + +(declaim (inline inc-pointer)) +(defun inc-pointer (ptr offset) + "Return a pointer pointing OFFSET bytes past PTR." + (declare (type system-area-pointer ptr) + (type integer offset)) + (sb-sys:sap+ ptr offset)) + +(declaim (inline make-pointer)) +(defun make-pointer (address) + "Return a pointer pointing to ADDRESS." + ;; (declare (type (unsigned-byte 32) address)) + (sb-sys:int-sap address)) + +(declaim (inline pointer-address)) +(defun pointer-address (ptr) + "Return the address pointed to by PTR." + (declare (type system-area-pointer ptr)) + (sb-sys:sap-int ptr)) + +;;;# Allocation +;;; +;;; Functions and macros for allocating foreign memory on the stack +;;; and on the heap. The main CFFI package defines macros that wrap +;;; FOREIGN-ALLOC and FOREIGN-FREE in UNWIND-PROTECT for the common usage +;;; when the memory has dynamic extent. + +(declaim (inline %foreign-alloc)) +(defun %foreign-alloc (size) + "Allocate SIZE bytes on the heap and return a pointer." + ;; (declare (type (unsigned-byte 32) size)) + (alien-sap (make-alien (unsigned 8) size))) + +(declaim (inline foreign-free)) +(defun foreign-free (ptr) + "Free a PTR allocated by FOREIGN-ALLOC." + (declare (type system-area-pointer ptr) + (optimize speed)) + (free-alien (sap-alien ptr (* (unsigned 8))))) + +(defmacro with-foreign-pointer ((var size &optional size-var) &body body) + "Bind VAR to SIZE bytes of foreign memory during BODY. The +pointer in VAR is invalid beyond the dynamic extent of BODY, and +may be stack-allocated if supported by the implementation. If +SIZE-VAR is supplied, it will be bound to SIZE during BODY." + (unless size-var + (setf size-var (gensym "SIZE"))) + ;; If the size is constant we can stack-allocate. + (if (constantp size) + (let ((alien-var (gensym "ALIEN"))) + `(with-alien ((,alien-var (array (unsigned 8) ,(eval size)))) + (let ((,size-var ,(eval size)) + (,var (alien-sap ,alien-var))) + (declare (ignorable ,size-var)) + ,@body))) + `(let* ((,size-var ,size) + (,var (%foreign-alloc ,size-var))) + (unwind-protect + (progn ,@body) + (foreign-free ,var))))) + +;;;# Shareable Vectors +;;; +;;; This interface is very experimental. WITH-POINTER-TO-VECTOR-DATA +;;; should be defined to perform a copy-in/copy-out if the Lisp +;;; implementation can't do this. + +(declaim (inline make-shareable-byte-vector)) +(defun make-shareable-byte-vector (size) + "Create a Lisp vector of SIZE bytes can passed to +WITH-POINTER-TO-VECTOR-DATA." + ; (declare (type sb-int:index size)) + (make-array size :element-type '(unsigned-byte 8))) + +(defmacro with-pointer-to-vector-data ((ptr-var vector) &body body) + "Bind PTR-VAR to a foreign pointer to the data in VECTOR." + (let ((vector-var (gensym "VECTOR"))) + `(let ((,vector-var ,vector)) + (declare (type (sb-kernel:simple-unboxed-array (*)) ,vector-var)) + (sb-sys:with-pinned-objects (,vector-var) + (let ((,ptr-var (sb-sys:vector-sap ,vector-var))) + ,@body))))) + +;;;# Dereferencing + +;;; Define the %MEM-REF and %MEM-SET functions, as well as compiler +;;; macros that optimize the case where the type keyword is constant +;;; at compile-time. +(defmacro define-mem-accessors (&body pairs) + `(progn + (defun %mem-ref (ptr type &optional (offset 0)) + (ecase type + ,@(loop for (keyword fn) in pairs + collect `(,keyword (,fn ptr offset))))) + (defun %mem-set (value ptr type &optional (offset 0)) + (ecase type + ,@(loop for (keyword fn) in pairs + collect `(,keyword (setf (,fn ptr offset) value))))) + (define-compiler-macro %mem-ref + (&whole form ptr type &optional (offset 0)) + (if (constantp type) + (ecase (eval type) + ,@(loop for (keyword fn) in pairs + collect `(,keyword `(,',fn ,ptr ,offset)))) + form)) + (define-compiler-macro %mem-set + (&whole form value ptr type &optional (offset 0)) + (if (constantp type) + (once-only (value) + (ecase (eval type) + ,@(loop for (keyword fn) in pairs + collect `(,keyword `(setf (,',fn ,ptr ,offset) + ,value))))) + form)))) + +;;; Look up alien type information and build both define-mem-accessors form +;;; and convert-foreign-type function definition. +(defmacro define-type-mapping (accessor-table alien-table) + (let* ((accessible-types + (remove 'void alien-table :key #'second)) + (size-and-signedp-forms + (mapcar (lambda (name) + (list (eval `(alien-size ,(second name))) + (typep -1 `(alien ,(second name))))) + accessible-types))) + `(progn + (define-mem-accessors + ,@(loop for (cffi-keyword alien-type fixed-accessor) + in accessible-types + and (alien-size signedp) + in size-and-signedp-forms + for (signed-ref unsigned-ref) + = (cdr (assoc alien-size accessor-table)) + collect + `(,cffi-keyword + ,(or fixed-accessor + (if signedp signed-ref unsigned-ref) + (error "No accessor found for ~S" + alien-type))))) + (defun convert-foreign-type (type-keyword) + (ecase type-keyword + ,@(loop for (cffi-keyword alien-type) in alien-table + collect `(,cffi-keyword (quote ,alien-type)))))))) + +(define-type-mapping + ((8 sb-sys:signed-sap-ref-8 sb-sys:sap-ref-8) + (16 sb-sys:signed-sap-ref-16 sb-sys:sap-ref-16) + (32 sb-sys:signed-sap-ref-32 sb-sys:sap-ref-32) + (64 sb-sys:signed-sap-ref-64 sb-sys:sap-ref-64)) + ((:char char) + (:unsigned-char unsigned-char) + (:short short) + (:unsigned-short unsigned-short) + (:int int) + (:unsigned-int unsigned-int) + (:long long) + (:unsigned-long unsigned-long) + (:long-long long-long) + (:unsigned-long-long unsigned-long-long) + (:float single-float + sb-sys:sap-ref-single) + (:double double-float + sb-sys:sap-ref-double) + (:pointer system-area-pointer + sb-sys:sap-ref-sap) + (:void void))) + +;;;# Calling Foreign Functions + +(defun %foreign-type-size (type-keyword) + "Return the size in bytes of a foreign type." + (/ (sb-alien-internals:alien-type-bits + (sb-alien-internals:parse-alien-type + (convert-foreign-type type-keyword) nil)) 8)) + +(defun %foreign-type-alignment (type-keyword) + "Return the alignment in bytes of a foreign type." + #+(and darwin ppc (not ppc64)) + (case type-keyword + ((:double :long-long :unsigned-long-long) + (return-from %foreign-type-alignment 8))) + ;; No override necessary for other types... + (/ (sb-alien-internals:alien-type-alignment + (sb-alien-internals:parse-alien-type + (convert-foreign-type type-keyword) nil)) 8)) + +(defun foreign-funcall-type-and-args (args) + "Return an SB-ALIEN function type for ARGS." + (let ((return-type 'void)) + (loop for (type arg) on args by #'cddr + if arg collect (convert-foreign-type type) into types + and collect arg into fargs + else do (setf return-type (convert-foreign-type type)) + finally (return (values types fargs return-type))))) + +(defmacro %%foreign-funcall (name types fargs rettype) + "Internal guts of %FOREIGN-FUNCALL." + `(alien-funcall + (extern-alien ,name (function ,rettype ,@types)) + ,@fargs)) + +(defmacro %foreign-funcall (name args &key library convention) + "Perform a foreign function call, document it more later." + (declare (ignore library convention)) + (multiple-value-bind (types fargs rettype) + (foreign-funcall-type-and-args args) + `(%%foreign-funcall ,name ,types ,fargs ,rettype))) + +(defmacro %foreign-funcall-pointer (ptr args &key convention) + "Funcall a pointer to a foreign function." + (declare (ignore convention)) + (multiple-value-bind (types fargs rettype) + (foreign-funcall-type-and-args args) + (with-unique-names (function) + `(with-alien ((,function (* (function ,rettype ,@types)) ,ptr)) + (alien-funcall ,function ,@fargs))))) + +;;;# Callbacks + +;;; The *CALLBACKS* hash table contains a direct mapping of CFFI +;;; callback names to SYSTEM-AREA-POINTERs obtained by ALIEN-LAMBDA. +;;; SBCL will maintain the addresses of the callbacks across saved +;;; images, so it is safe to store the pointers directly. +(defvar *callbacks* (make-hash-table)) + +(defmacro %defcallback (name rettype arg-names arg-types body + &key convention) + (check-type convention (member :stdcall :cdecl)) + `(setf (gethash ',name *callbacks*) + (alien-sap + (sb-alien::alien-lambda + #+alien-callback-conventions + (,convention ,(convert-foreign-type rettype)) + #-alien-callback-conventions + ,(convert-foreign-type rettype) + ,(mapcar (lambda (sym type) + (list sym (convert-foreign-type type))) + arg-names arg-types) + ,body)))) + +(defun %callback (name) + (or (gethash name *callbacks*) + (error "Undefined callback: ~S" name))) + +;;;# Loading and Closing Foreign Libraries + +#+darwin +(defun call-within-initial-thread (fn &rest args) + (let (result + error + (sem (sb-thread:make-semaphore))) + (sb-thread:interrupt-thread + ;; KLUDGE: find a better way to get the initial thread. + (car (last (sb-thread:list-all-threads))) + (lambda () + (multiple-value-setq (result error) + (ignore-errors (apply fn args))) + (sb-thread:signal-semaphore sem))) + (sb-thread:wait-on-semaphore sem) + (if error + (signal error) + result))) + +(declaim (inline %load-foreign-library)) +(defun %load-foreign-library (name path) + "Load a foreign library." + (declare (ignore name)) + ;; As of MacOS X 10.6.6, loading things like CoreFoundation from a + ;; thread other than the initial one results in a crash. + #+darwin (call-within-initial-thread 'load-shared-object path) + #-darwin (load-shared-object path)) + +;;; SBCL 1.0.21.15 renamed SB-ALIEN::SHARED-OBJECT-FILE but introduced +;;; SB-ALIEN:UNLOAD-SHARED-OBJECT which we can use instead. +(eval-when (:compile-toplevel :load-toplevel :execute) + (defun unload-shared-object-present-p () + (multiple-value-bind (foundp kind) + (find-symbol "UNLOAD-SHARED-OBJECT" "SB-ALIEN") + (if (and foundp (eq kind :external)) + '(:and) + '(:or))))) + +(defun %close-foreign-library (handle) + "Closes a foreign library." + #+#.(cffi-sys::unload-shared-object-present-p) + (sb-alien:unload-shared-object handle) + #-#.(cffi-sys::unload-shared-object-present-p) + (sb-thread:with-mutex (sb-alien::*shared-objects-lock*) + (let ((obj (find (sb-ext:native-namestring handle) + sb-alien::*shared-objects* + :key #'sb-alien::shared-object-file + :test #'string=))) + (when obj + (sb-alien::dlclose-or-lose obj) + (removef sb-alien::*shared-objects* obj) + #+(and linkage-table (not win32)) + (sb-alien::update-linkage-table))))) + +(defun native-namestring (pathname) + (sb-ext:native-namestring pathname)) + +;;;# Foreign Globals + +(defun %foreign-symbol-pointer (name library) + "Returns a pointer to a foreign symbol NAME." + (declare (ignore library)) + (when-let (address (sb-sys:find-foreign-symbol-address name)) + (sb-sys:int-sap address))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/cffi-scl.lisp b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/cffi-scl.lisp new file mode 100644 index 0000000..fe2fdb1 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/cffi-scl.lisp @@ -0,0 +1,322 @@ +;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- +;;; +;;; cffi-scl.lisp --- CFFI-SYS implementation for the Scieneer Common Lisp. +;;; +;;; Copyright (C) 2005-2006, James Bielman +;;; Copyright (C) 2006-2007, Scieneer Pty Ltd. +;;; +;;; Permission is hereby granted, free of charge, to any person +;;; obtaining a copy of this software and associated documentation +;;; files (the "Software"), to deal in the Software without +;;; restriction, including without limitation the rights to use, copy, +;;; modify, merge, publish, distribute, sublicense, and/or sell copies +;;; of the Software, and to permit persons to whom the Software is +;;; furnished to do so, subject to the following conditions: +;;; +;;; The above copyright notice and this permission notice shall be +;;; included in all copies or substantial portions of the Software. +;;; +;;; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +;;; EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +;;; MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +;;; NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +;;; HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +;;; WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +;;; OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +;;; DEALINGS IN THE SOFTWARE. +;;; + +;;;# Administrivia + +(defpackage #:cffi-sys + (:use #:common-lisp #:alien #:c-call) + (:import-from #:alexandria #:once-only #:with-unique-names) + (:export + #:canonicalize-symbol-name-case + #:foreign-pointer + #:pointerp + #:pointer-eq + #:null-pointer + #:null-pointer-p + #:inc-pointer + #:make-pointer + #:pointer-address + #:%foreign-alloc + #:foreign-free + #:with-foreign-pointer + #:%foreign-funcall + #:%foreign-funcall-pointer + #:%foreign-type-alignment + #:%foreign-type-size + #:%load-foreign-library + #:%close-foreign-library + #:native-namestring + #:%mem-ref + #:%mem-set + #:make-shareable-byte-vector + #:with-pointer-to-vector-data + #:%foreign-symbol-pointer + #:%defcallback + #:%callback)) + +(in-package #:cffi-sys) + +;;;# Mis-features + +(pushnew 'flat-namespace *features*) + +;;;# Symbol Case + +(defun canonicalize-symbol-name-case (name) + (declare (string name)) + (if (eq ext:*case-mode* :upper) + (string-upcase name) + (string-downcase name))) + +;;;# Basic Pointer Operations + +(deftype foreign-pointer () + 'sys:system-area-pointer) + +(declaim (inline pointerp)) +(defun pointerp (ptr) + "Return true if 'ptr is a foreign pointer." + (sys:system-area-pointer-p ptr)) + +(declaim (inline pointer-eq)) +(defun pointer-eq (ptr1 ptr2) + "Return true if 'ptr1 and 'ptr2 point to the same address." + (sys:sap= ptr1 ptr2)) + +(declaim (inline null-pointer)) +(defun null-pointer () + "Construct and return a null pointer." + (sys:int-sap 0)) + +(declaim (inline null-pointer-p)) +(defun null-pointer-p (ptr) + "Return true if 'ptr is a null pointer." + (zerop (sys:sap-int ptr))) + +(declaim (inline inc-pointer)) +(defun inc-pointer (ptr offset) + "Return a pointer pointing 'offset bytes past 'ptr." + (sys:sap+ ptr offset)) + +(declaim (inline make-pointer)) +(defun make-pointer (address) + "Return a pointer pointing to 'address." + (sys:int-sap address)) + +(declaim (inline pointer-address)) +(defun pointer-address (ptr) + "Return the address pointed to by 'ptr." + (sys:sap-int ptr)) + +(defmacro with-foreign-pointer ((var size &optional size-var) &body body) + "Bind 'var to 'size bytes of foreign memory during 'body. The + pointer in 'var is invalid beyond the dynamic extent of 'body, and + may be stack-allocated if supported by the implementation. If + 'size-var is supplied, it will be bound to 'size during 'body." + (unless size-var + (setf size-var (gensym (symbol-name '#:size)))) + ;; If the size is constant we can stack-allocate. + (cond ((constantp size) + (let ((alien-var (gensym (symbol-name '#:alien)))) + `(with-alien ((,alien-var (array (unsigned 8) ,(eval size)))) + (let ((,size-var ,size) + (,var (alien-sap ,alien-var))) + (declare (ignorable ,size-var)) + ,@body)))) + (t + `(let ((,size-var ,size)) + (alien:with-bytes (,var ,size-var) + ,@body))))) + +;;;# Allocation +;;; +;;; Functions and macros for allocating foreign memory on the stack and on the +;;; heap. The main CFFI package defines macros that wrap 'foreign-alloc and +;;; 'foreign-free in 'unwind-protect for the common usage when the memory has +;;; dynamic extent. + +(defun %foreign-alloc (size) + "Allocate 'size bytes on the heap and return a pointer." + (declare (type (unsigned-byte #-64bit 32 #+64bit 64) size)) + (alien-funcall (extern-alien "malloc" + (function system-area-pointer unsigned)) + size)) + +(defun foreign-free (ptr) + "Free a 'ptr allocated by 'foreign-alloc." + (declare (type system-area-pointer ptr)) + (alien-funcall (extern-alien "free" + (function (values) system-area-pointer)) + ptr)) + +;;;# Shareable Vectors + +(defun make-shareable-byte-vector (size) + "Create a Lisp vector of 'size bytes that can passed to + 'with-pointer-to-vector-data." + (make-array size :element-type '(unsigned-byte 8))) + +(defmacro with-pointer-to-vector-data ((ptr-var vector) &body body) + "Bind 'ptr-var to a foreign pointer to the data in 'vector." + (let ((vector-var (gensym (symbol-name '#:vector)))) + `(let ((,vector-var ,vector)) + (ext:with-pinned-object (,vector-var) + (let ((,ptr-var (sys:vector-sap ,vector-var))) + ,@body))))) + +;;;# Dereferencing + +;;; Define the %MEM-REF and %MEM-SET functions, as well as compiler +;;; macros that optimize the case where the type keyword is constant +;;; at compile-time. +(defmacro define-mem-accessors (&body pairs) + `(progn + (defun %mem-ref (ptr type &optional (offset 0)) + (ecase type + ,@(loop for (keyword fn) in pairs + collect `(,keyword (,fn ptr offset))))) + (defun %mem-set (value ptr type &optional (offset 0)) + (ecase type + ,@(loop for (keyword fn) in pairs + collect `(,keyword (setf (,fn ptr offset) value))))) + (define-compiler-macro %mem-ref + (&whole form ptr type &optional (offset 0)) + (if (constantp type) + (ecase (eval type) + ,@(loop for (keyword fn) in pairs + collect `(,keyword `(,',fn ,ptr ,offset)))) + form)) + (define-compiler-macro %mem-set + (&whole form value ptr type &optional (offset 0)) + (if (constantp type) + (once-only (value) + (ecase (eval type) + ,@(loop for (keyword fn) in pairs + collect `(,keyword `(setf (,',fn ,ptr ,offset) + ,value))))) + form)))) + +(define-mem-accessors + (:char sys:signed-sap-ref-8) + (:unsigned-char sys:sap-ref-8) + (:short sys:signed-sap-ref-16) + (:unsigned-short sys:sap-ref-16) + (:int sys:signed-sap-ref-32) + (:unsigned-int sys:sap-ref-32) + (:long #-64bit sys:signed-sap-ref-32 #+64bit sys:signed-sap-ref-64) + (:unsigned-long #-64bit sys:sap-ref-32 #+64bit sys:sap-ref-64) + (:long-long sys:signed-sap-ref-64) + (:unsigned-long-long sys:sap-ref-64) + (:float sys:sap-ref-single) + (:double sys:sap-ref-double) + #+long-float (:long-double sys:sap-ref-long) + (:pointer sys:sap-ref-sap)) + +;;;# Calling Foreign Functions + +(defun convert-foreign-type (type-keyword) + "Convert a CFFI type keyword to an ALIEN type." + (ecase type-keyword + (:char 'char) + (:unsigned-char 'unsigned-char) + (:short 'short) + (:unsigned-short 'unsigned-short) + (:int 'int) + (:unsigned-int 'unsigned-int) + (:long 'long) + (:unsigned-long 'unsigned-long) + (:long-long '(signed 64)) + (:unsigned-long-long '(unsigned 64)) + (:float 'single-float) + (:double 'double-float) + #+long-float + (:long-double 'long-float) + (:pointer 'system-area-pointer) + (:void 'void))) + +(defun %foreign-type-size (type-keyword) + "Return the size in bytes of a foreign type." + (values (truncate (alien-internals:alien-type-bits + (alien-internals:parse-alien-type + (convert-foreign-type type-keyword))) + 8))) + +(defun %foreign-type-alignment (type-keyword) + "Return the alignment in bytes of a foreign type." + (values (truncate (alien-internals:alien-type-alignment + (alien-internals:parse-alien-type + (convert-foreign-type type-keyword))) + 8))) + +(defun foreign-funcall-type-and-args (args) + "Return an 'alien function type for 'args." + (let ((return-type nil)) + (loop for (type arg) on args by #'cddr + if arg collect (convert-foreign-type type) into types + and collect arg into fargs + else do (setf return-type (convert-foreign-type type)) + finally (return (values types fargs return-type))))) + +(defmacro %%foreign-funcall (name types fargs rettype) + "Internal guts of '%foreign-funcall." + `(alien-funcall (extern-alien ,name (function ,rettype ,@types)) + ,@fargs)) + +(defmacro %foreign-funcall (name args &key library convention) + "Perform a foreign function call, document it more later." + (declare (ignore library convention)) + (multiple-value-bind (types fargs rettype) + (foreign-funcall-type-and-args args) + `(%%foreign-funcall ,name ,types ,fargs ,rettype))) + +(defmacro %foreign-funcall-pointer (ptr args &key convention) + "Funcall a pointer to a foreign function." + (declare (ignore convention)) + (multiple-value-bind (types fargs rettype) + (foreign-funcall-type-and-args args) + (with-unique-names (function) + `(with-alien ((,function (* (function ,rettype ,@types)) ,ptr)) + (alien-funcall ,function ,@fargs))))) + +;;; Callbacks + +(defmacro %defcallback (name rettype arg-names arg-types body + &key convention) + (declare (ignore convention)) + `(alien:defcallback ,name + (,(convert-foreign-type rettype) + ,@(mapcar (lambda (sym type) + (list sym (convert-foreign-type type))) + arg-names arg-types)) + ,body)) + +(declaim (inline %callback)) +(defun %callback (name) + (alien:callback-sap name)) + +;;;# Loading and Closing Foreign Libraries + +(defun %load-foreign-library (name path) + "Load the foreign library 'name." + (declare (ignore name)) + (ext:load-dynamic-object path)) + +(defun %close-foreign-library (name) + "Closes the foreign library 'name." + (ext:close-dynamic-object name)) + +(defun native-namestring (pathname) + (ext:unix-namestring pathname nil)) + +;;;# Foreign Globals + +(defun %foreign-symbol-pointer (name library) + "Returns a pointer to a foreign symbol 'name." + (declare (ignore library)) + (let ((sap (sys:foreign-symbol-address name))) + (if (zerop (sys:sap-int sap)) nil sap))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/early-types.lisp b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/early-types.lisp new file mode 100644 index 0000000..9920042 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/early-types.lisp @@ -0,0 +1,713 @@ +;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- +;;; +;;; early-types.lisp --- Low-level foreign type operations. +;;; +;;; Copyright (C) 2005-2006, James Bielman +;;; Copyright (C) 2005-2007, Luis Oliveira +;;; +;;; Permission is hereby granted, free of charge, to any person +;;; obtaining a copy of this software and associated documentation +;;; files (the "Software"), to deal in the Software without +;;; restriction, including without limitation the rights to use, copy, +;;; modify, merge, publish, distribute, sublicense, and/or sell copies +;;; of the Software, and to permit persons to whom the Software is +;;; furnished to do so, subject to the following conditions: +;;; +;;; The above copyright notice and this permission notice shall be +;;; included in all copies or substantial portions of the Software. +;;; +;;; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +;;; EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +;;; MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +;;; NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +;;; HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +;;; WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +;;; OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +;;; DEALINGS IN THE SOFTWARE. +;;; + +;;;# Early Type Definitions +;;; +;;; This module contains basic operations on foreign types. These +;;; definitions are in a separate file because they may be used in +;;; compiler macros defined later on. + +(in-package #:cffi) + +;;;# Foreign Types +;;; +;;; Type specifications are of the form (type {args}*). The type +;;; parser can specify how its arguments should look like through a +;;; lambda list. +;;; +;;; "type" is a shortcut for "(type)", ie, no args were specified. +;;; +;;; Examples of such types: boolean, (boolean), (boolean :int) If the +;;; boolean type parser specifies the lambda list: &optional +;;; (base-type :int), then all of the above three type specs would be +;;; parsed to an identical type. +;;; +;;; Type parsers, defined with DEFINE-PARSE-METHOD should return a +;;; subtype of the foreign-type class. + +(defvar *type-parsers* (make-hash-table :test 'equal) + "Hash table of defined type parsers.") + +(define-condition cffi-error (error) + ()) + +(define-condition foreign-type-error (cffi-error) + ((type-name :initarg :type-name + :initform (error "Must specify TYPE-NAME.") + :accessor foreign-type-error/type-name) + (namespace :initarg :namespace + :initform :default + :accessor foreign-type-error/namespace))) + +(defun foreign-type-error/compound-name (e) + (let ((name (foreign-type-error/type-name e)) + (namespace (foreign-type-error/namespace e))) + (if (eq namespace :default) + name + `(,namespace ,name)))) + +(define-condition simple-foreign-type-error (simple-error foreign-type-error) + ()) + +(defun simple-foreign-type-error (type-name namespace format-control &rest format-arguments) + (error 'simple-foreign-type-error + :type-name type-name :namespace namespace + :format-control format-control :format-arguments format-arguments)) + +(define-condition undefined-foreign-type-error (foreign-type-error) + () + (:report (lambda (e stream) + (format stream "Unknown CFFI type ~S" (foreign-type-error/compound-name e))))) + +(defun undefined-foreign-type-error (type-name &optional (namespace :default)) + (error 'undefined-foreign-type-error :type-name type-name :namespace namespace)) + +;; TODO this is not according to the C namespace rules, +;; see bug: https://bugs.launchpad.net/cffi/+bug/1527947 +(deftype c-namespace-name () + '(member :default :struct :union)) + +;; for C namespaces read: https://stackoverflow.com/questions/12579142/type-namespace-in-c +;; (section 6.2.3 Name spaces of identifiers) +;; NOTE: :struct is probably an unfortunate name for the tagged (?) namespace +(defun find-type-parser (symbol &optional (namespace :default)) + "Return the type parser for SYMBOL. NAMESPACE is either :DEFAULT (for +variables, functions, and typedefs) or :STRUCT (for structs, unions, and enums)." + (check-type symbol (and symbol (not null))) + (check-type namespace c-namespace-name) + (or (gethash (cons namespace symbol) *type-parsers*) + (undefined-foreign-type-error symbol namespace))) + +(defun (setf find-type-parser) (func symbol &optional (namespace :default)) + "Set the type parser for SYMBOL." + (check-type symbol (and symbol (not null))) + (check-type namespace c-namespace-name) + ;; TODO Shall we signal a redefinition warning here? + (setf (gethash (cons namespace symbol) *type-parsers*) func)) + +(defun undefine-foreign-type (symbol &optional (namespace :default)) + (remhash (cons namespace symbol) *type-parsers*) + (values)) + +;;; Using a generic function would have been nicer but generates lots +;;; of style warnings in SBCL. (Silly reason, yes.) +(defmacro define-parse-method (name lambda-list &body body) + "Define a type parser on NAME and lists whose CAR is NAME." + (discard-docstring body) + (warn-if-kw-or-belongs-to-cl name) + `(eval-when (:compile-toplevel :load-toplevel :execute) + (setf (find-type-parser ',name) + (lambda ,lambda-list ,@body)) + ',name)) + +;;; Utility function for the simple case where the type takes no +;;; arguments. +(defun notice-foreign-type (name type &optional (namespace :default)) + (setf (find-type-parser name namespace) (lambda () type)) + name) + +;;;# Generic Functions on Types + +(defgeneric canonicalize (foreign-type) + (:documentation + "Return the most primitive foreign type for FOREIGN-TYPE, either a built-in +type--a keyword--or a struct/union type--a list of the form (:STRUCT/:UNION name). +Signals an error if FOREIGN-TYPE is undefined.")) + +(defgeneric aggregatep (foreign-type) + (:documentation + "Return true if FOREIGN-TYPE is an aggregate type.")) + +(defgeneric foreign-type-alignment (foreign-type) + (:documentation + "Return the structure alignment in bytes of a foreign type.")) + +(defgeneric foreign-type-size (foreign-type) + (:documentation + "Return the size in bytes of a foreign type.")) + +(defgeneric unparse-type (foreign-type) + (:documentation + "Unparse FOREIGN-TYPE to a type specification (symbol or list).")) + +;;;# Foreign Types + +(defclass foreign-type () + () + (:documentation "Base class for all foreign types.")) + +(defmethod make-load-form ((type foreign-type) &optional env) + "Return the form used to dump types to a FASL file." + (declare (ignore env)) + `(parse-type ',(unparse-type type))) + +(defmethod foreign-type-size (type) + "Return the size in bytes of a foreign type." + (foreign-type-size (parse-type type))) + +(defclass named-foreign-type (foreign-type) + ((name + ;; Name of this foreign type, a symbol. + :initform (error "Must specify a NAME.") + :initarg :name + :accessor name))) + +(defmethod print-object ((type named-foreign-type) stream) + "Print a FOREIGN-TYPEDEF instance to STREAM unreadably." + (print-unreadable-object (type stream :type t :identity nil) + (format stream "~S" (name type)))) + +;;; Return the type's name which can be passed to PARSE-TYPE. If +;;; that's not the case for some subclass of NAMED-FOREIGN-TYPE then +;;; it should specialize UNPARSE-TYPE. +(defmethod unparse-type ((type named-foreign-type)) + (name type)) + +;;;# Built-In Foreign Types + +(defclass foreign-built-in-type (foreign-type) + ((type-keyword + ;; Keyword in CFFI-SYS representing this type. + :initform (error "A type keyword is required.") + :initarg :type-keyword + :accessor type-keyword)) + (:documentation "A built-in foreign type.")) + +(defmethod canonicalize ((type foreign-built-in-type)) + "Return the built-in type keyword for TYPE." + (type-keyword type)) + +(defmethod aggregatep ((type foreign-built-in-type)) + "Returns false, built-in types are never aggregate types." + nil) + +(defmethod foreign-type-alignment ((type foreign-built-in-type)) + "Return the alignment of a built-in type." + (%foreign-type-alignment (type-keyword type))) + +(defmethod foreign-type-size ((type foreign-built-in-type)) + "Return the size of a built-in type." + (%foreign-type-size (type-keyword type))) + +(defmethod unparse-type ((type foreign-built-in-type)) + "Returns the symbolic representation of a built-in type." + (type-keyword type)) + +(defmethod print-object ((type foreign-built-in-type) stream) + "Print a FOREIGN-TYPE instance to STREAM unreadably." + (print-unreadable-object (type stream :type t :identity nil) + (format stream "~S" (type-keyword type)))) + +(defvar *built-in-foreign-types* nil) + +(defmacro define-built-in-foreign-type (keyword) + "Defines a built-in foreign-type." + `(eval-when (:compile-toplevel :load-toplevel :execute) + (pushnew ,keyword *built-in-foreign-types*) + (notice-foreign-type + ,keyword (make-instance 'foreign-built-in-type :type-keyword ,keyword)))) + +;;;# Foreign Pointer Types + +(defclass foreign-pointer-type (foreign-built-in-type) + ((pointer-type + ;; Type of object pointed at by this pointer, or nil for an + ;; untyped (void) pointer. + :initform nil + :initarg :pointer-type + :accessor pointer-type)) + (:default-initargs :type-keyword :pointer)) + +;;; Define the type parser for the :POINTER type. If no type argument +;;; is provided, a void pointer will be created. +(let ((void-pointer (make-instance 'foreign-pointer-type))) + (define-parse-method :pointer (&optional type) + (if type + (make-instance 'foreign-pointer-type :pointer-type (parse-type type)) + ;; A bit of premature optimization here. + void-pointer))) + +;;; Unparse a foreign pointer type when dumping to a fasl. +(defmethod unparse-type ((type foreign-pointer-type)) + (if (pointer-type type) + `(:pointer ,(unparse-type (pointer-type type))) + :pointer)) + +;;; Print a foreign pointer type unreadably in unparsed form. +(defmethod print-object ((type foreign-pointer-type) stream) + (print-unreadable-object (type stream :type t :identity nil) + (format stream "~S" (unparse-type type)))) + +;;;# Structure Type + +(defgeneric bare-struct-type-p (foreign-type) + (:documentation + "Return true if FOREIGN-TYPE is a bare struct type or an alias of a bare struct type. ")) + +(defmethod bare-struct-type-p ((type foreign-type)) + "Return true if FOREIGN-TYPE is a bare struct type or an alias of a bare struct type. " + nil) + +(defclass foreign-struct-type (named-foreign-type) + ((slots + ;; Hash table of slots in this structure, keyed by name. + :initform (make-hash-table) + :initarg :slots + :accessor slots) + (size + ;; Cached size in bytes of this structure. + :initarg :size + :accessor size) + (alignment + ;; This struct's alignment requirements + :initarg :alignment + :accessor alignment) + (bare + ;; we use this flag to support the (old, deprecated) semantics of + ;; bare struct types. FOO means (:POINTER (:STRUCT FOO) in + ;; functions declarations whereas FOO in a structure definition is + ;; a proper aggregate type: (:STRUCT FOO), etc. + :initform nil + :initarg :bare + :reader bare-struct-type-p))) + +(defun slots-in-order (structure-type) + "A list of the structure's slots in order." + (sort (loop for slots being the hash-value of (structure-slots structure-type) + collect slots) + #'< + :key 'slot-offset)) + +(defmethod canonicalize ((type foreign-struct-type)) + (if (bare-struct-type-p type) + :pointer + `(:struct ,(name type)))) + +(defmethod unparse-type ((type foreign-struct-type)) + (if (bare-struct-type-p type) + (name type) + (canonicalize type))) + +(defmethod aggregatep ((type foreign-struct-type)) + "Returns true, structure types are aggregate." + t) + +(defmethod foreign-type-size ((type foreign-struct-type)) + "Return the size in bytes of a foreign structure type." + (size type)) + +(defmethod foreign-type-alignment ((type foreign-struct-type)) + "Return the alignment requirements for this struct." + (alignment type)) + +(defclass foreign-union-type (foreign-struct-type) ()) + +(defmethod canonicalize ((type foreign-union-type)) + (if (bare-struct-type-p type) + :pointer + `(:union ,(name type)))) + +;;;# Foreign Typedefs + +(defclass foreign-type-alias (foreign-type) + ((actual-type + ;; The FOREIGN-TYPE instance this type is an alias for. + :initarg :actual-type + :accessor actual-type + :initform (error "Must specify an ACTUAL-TYPE."))) + (:documentation "A type that aliases another type.")) + +(defmethod canonicalize ((type foreign-type-alias)) + "Return the built-in type keyword for TYPE." + (canonicalize (actual-type type))) + +(defmethod aggregatep ((type foreign-type-alias)) + "Return true if TYPE's actual type is aggregate." + (aggregatep (actual-type type))) + +(defmethod foreign-type-alignment ((type foreign-type-alias)) + "Return the alignment of a foreign typedef." + (foreign-type-alignment (actual-type type))) + +(defmethod foreign-type-size ((type foreign-type-alias)) + "Return the size in bytes of a foreign typedef." + (foreign-type-size (actual-type type))) + +(defclass foreign-typedef (foreign-type-alias named-foreign-type) + ()) + +(defun follow-typedefs (type) + (if (typep type 'foreign-typedef) + (follow-typedefs (actual-type type)) + type)) + +(defmethod bare-struct-type-p ((type foreign-typedef)) + (bare-struct-type-p (follow-typedefs type))) + +(defun structure-slots (type) + "The hash table of slots for the structure type." + (slots (follow-typedefs type))) + +;;;# Type Translators +;;; +;;; Type translation is done with generic functions at runtime for +;;; subclasses of TRANSLATABLE-FOREIGN-TYPE. +;;; +;;; The main interface for defining type translations is through the +;;; generic functions TRANSLATE-{TO,FROM}-FOREIGN and +;;; FREE-TRANSLATED-OBJECT. + +(defclass translatable-foreign-type (foreign-type) ()) + +;;; ENHANCED-FOREIGN-TYPE is used to define translations on top of +;;; previously defined foreign types. +(defclass enhanced-foreign-type (translatable-foreign-type + foreign-type-alias) + ((unparsed-type :accessor unparsed-type))) + +;;; If actual-type isn't parsed already, let's parse it. This way we +;;; don't have to export PARSE-TYPE and users don't have to worry +;;; about this in DEFINE-FOREIGN-TYPE or DEFINE-PARSE-METHOD. +(defmethod initialize-instance :after ((type enhanced-foreign-type) &key) + (unless (typep (actual-type type) 'foreign-type) + (setf (actual-type type) (parse-type (actual-type type))))) + +(defmethod unparse-type ((type enhanced-foreign-type)) + (unparsed-type type)) + +;;; Checks NAMEs, not object identity. +(defun check-for-typedef-cycles (type) + (let ((seen (make-hash-table :test 'eq))) + (labels ((%check (cur-type) + (when (typep cur-type 'foreign-typedef) + (when (gethash (name cur-type) seen) + (simple-foreign-type-error type :default + "Detected cycle in type ~S." type)) + (setf (gethash (name cur-type) seen) t) + (%check (actual-type cur-type))))) + (%check type)))) + +;;; Only now we define PARSE-TYPE because it needs to do some extra +;;; work for ENHANCED-FOREIGN-TYPES. +(defun parse-type (type) + (let* ((spec (ensure-list type)) + (ptype (apply (find-type-parser (car spec)) (cdr spec)))) + (when (typep ptype 'foreign-typedef) + (check-for-typedef-cycles ptype)) + (when (typep ptype 'enhanced-foreign-type) + (setf (unparsed-type ptype) type)) + ptype)) + +(defun ensure-parsed-base-type (type) + (follow-typedefs + (if (typep type 'foreign-type) + type + (parse-type type)))) + +(defun canonicalize-foreign-type (type) + "Convert TYPE to a built-in type by following aliases. +Signals an error if the type cannot be resolved." + (canonicalize (parse-type type))) + +;;; Translate VALUE to a foreign object of the type represented by +;;; TYPE, which will be a subclass of TRANSLATABLE-FOREIGN-TYPE. +;;; Returns the foreign value and an optional second value which will +;;; be passed to FREE-TRANSLATED-OBJECT as the PARAM argument. +(defgeneric translate-to-foreign (value type) + (:method (value type) + (declare (ignore type)) + value)) + +(defgeneric translate-into-foreign-memory (value type pointer) + (:documentation + "Translate the Lisp value into the foreign memory location given by pointer. Return value is not used.") + (:argument-precedence-order type value pointer)) + +;;; Similar to TRANSLATE-TO-FOREIGN, used exclusively by +;;; (SETF FOREIGN-STRUCT-SLOT-VALUE). +(defgeneric translate-aggregate-to-foreign (ptr value type)) + +;;; Translate the foreign object VALUE from the type repsented by +;;; TYPE, which will be a subclass of TRANSLATABLE-FOREIGN-TYPE. +;;; Returns the converted Lisp value. +(defgeneric translate-from-foreign (value type) + (:argument-precedence-order type value) + (:method (value type) + (declare (ignore type)) + value)) + +;;; Free an object allocated by TRANSLATE-TO-FOREIGN. VALUE is a +;;; foreign object of the type represented by TYPE, which will be a +;;; TRANSLATABLE-FOREIGN-TYPE subclass. PARAM, if present, contains +;;; the second value returned by TRANSLATE-TO-FOREIGN, and is used to +;;; communicate between the two functions. +;;; +;;; FIXME: I don't think this PARAM argument is necessary anymore +;;; because the TYPE object can contain that information. [2008-12-31 LO] +(defgeneric free-translated-object (value type param) + (:method (value type param) + (declare (ignore value type param)))) + +;;;## Macroexpansion Time Translation +;;; +;;; The following EXPAND-* generic functions are similar to their +;;; TRANSLATE-* counterparts but are usually called at macroexpansion +;;; time. They offer a way to optimize the runtime translators. + +;;; This special variable is bound by the various :around methods +;;; below to the respective form generated by the above %EXPAND-* +;;; functions. This way, an expander can "bail out" by calling the +;;; next method. All 6 of the below-defined GFs have a default method +;;; that simply answers the rtf bound by the default :around method. +(defvar *runtime-translator-form*) + +;;; EXPAND-FROM-FOREIGN + +(defgeneric expand-from-foreign (value type) + (:method (value type) + (declare (ignore type)) + value)) + +(defmethod expand-from-foreign :around (value (type translatable-foreign-type)) + (let ((*runtime-translator-form* `(translate-from-foreign ,value ,type))) + (call-next-method))) + +(defmethod expand-from-foreign (value (type translatable-foreign-type)) + (declare (ignore value)) + *runtime-translator-form*) + +;;; EXPAND-TO-FOREIGN + +;; The second return value is used to tell EXPAND-TO-FOREIGN-DYN that +;; an unspecialized method was called. +(defgeneric expand-to-foreign (value type) + (:method (value type) + (declare (ignore type)) + (values value t))) + +(defmethod expand-to-foreign :around (value (type translatable-foreign-type)) + (let ((*runtime-translator-form* `(translate-to-foreign ,value ,type))) + (call-next-method))) + +(defmethod expand-to-foreign (value (type translatable-foreign-type)) + (declare (ignore value)) + (values *runtime-translator-form* t)) + +;;; EXPAND-INTO-FOREIGN-MEMORY + +(defgeneric expand-into-foreign-memory (value type ptr) + (:method (value type ptr) + (declare (ignore type)) + value)) + +(defmethod expand-into-foreign-memory :around + (value (type translatable-foreign-type) ptr) + (let ((*runtime-translator-form* + `(translate-into-foreign-memory ,value ,type ,ptr))) + (call-next-method))) + +(defmethod expand-into-foreign-memory (value (type translatable-foreign-type) ptr) + (declare (ignore value)) + *runtime-translator-form*) + +;;; EXPAND-TO-FOREIGN-DYN + +(defgeneric expand-to-foreign-dyn (value var body type) + (:method (value var body type) + (declare (ignore type)) + `(let ((,var ,value)) ,@body))) + +(defmethod expand-to-foreign-dyn :around + (value var body (type enhanced-foreign-type)) + (let ((*runtime-translator-form* + (with-unique-names (param) + `(multiple-value-bind (,var ,param) + (translate-to-foreign ,value ,type) + (unwind-protect + (progn ,@body) + (free-translated-object ,var ,type ,param)))))) + (call-next-method))) + +;;; If this method is called it means the user hasn't defined a +;;; to-foreign-dyn expansion, so we use the to-foreign expansion. +;;; +;;; However, we do so *only* if there's a specialized +;;; EXPAND-TO-FOREIGN for TYPE because otherwise we want to use the +;;; above *RUNTIME-TRANSLATOR-FORM* which includes a call to +;;; FREE-TRANSLATED-OBJECT. (Or else there would occur no translation +;;; at all.) +(defun foreign-expand-runtime-translator-or-binding (value var body type) + (multiple-value-bind (expansion default-etp-p) + (expand-to-foreign value type) + (if default-etp-p + *runtime-translator-form* + `(let ((,var ,expansion)) + ,@body)))) + +(defmethod expand-to-foreign-dyn (value var body (type enhanced-foreign-type)) + (foreign-expand-runtime-translator-or-binding value var body type)) + +;;; EXPAND-TO-FOREIGN-DYN-INDIRECT +;;; Like expand-to-foreign-dyn, but always give form that returns a +;;; pointer to the object, even if it's directly representable in +;;; CL, e.g. numbers. + +(defgeneric expand-to-foreign-dyn-indirect (value var body type) + (:method (value var body type) + (declare (ignore type)) + `(let ((,var ,value)) ,@body))) + +(defmethod expand-to-foreign-dyn-indirect :around + (value var body (type translatable-foreign-type)) + (let ((*runtime-translator-form* + `(with-foreign-object (,var ',(unparse-type type)) + (translate-into-foreign-memory ,value ,type ,var) + ,@body))) + (call-next-method))) + +(defmethod expand-to-foreign-dyn-indirect + (value var body (type foreign-pointer-type)) + `(with-foreign-object (,var :pointer) + (translate-into-foreign-memory ,value ,type ,var) + ,@body)) + +(defmethod expand-to-foreign-dyn-indirect + (value var body (type foreign-built-in-type)) + `(with-foreign-object (,var ,type) + (translate-into-foreign-memory ,value ,type ,var) + ,@body)) + +(defmethod expand-to-foreign-dyn-indirect + (value var body (type translatable-foreign-type)) + (foreign-expand-runtime-translator-or-binding value var body type)) + +(defmethod expand-to-foreign-dyn-indirect (value var body (type foreign-type-alias)) + (expand-to-foreign-dyn-indirect value var body (actual-type type))) + +;;; User interface for converting values from/to foreign using the +;;; type translators. The compiler macros use the expanders when +;;; possible. + +(defun convert-to-foreign (value type) + (translate-to-foreign value (parse-type type))) + +(define-compiler-macro convert-to-foreign (value type) + (if (constantp type) + (expand-to-foreign value (parse-type (eval type))) + `(translate-to-foreign ,value (parse-type ,type)))) + +(defun convert-from-foreign (value type) + (translate-from-foreign value (parse-type type))) + +(define-compiler-macro convert-from-foreign (value type) + (if (constantp type) + (expand-from-foreign value (parse-type (eval type))) + `(translate-from-foreign ,value (parse-type ,type)))) + +(defun convert-into-foreign-memory (value type ptr) + (translate-into-foreign-memory value (parse-type type) ptr)) + +(define-compiler-macro convert-into-foreign-memory (value type ptr) + (if (constantp type) + (expand-into-foreign-memory value (parse-type (eval type)) ptr) + `(translate-into-foreign-memory ,value (parse-type ,type) ,ptr))) + +(defun free-converted-object (value type param) + (free-translated-object value (parse-type type) param)) + +;;;# Enhanced typedefs + +(defclass enhanced-typedef (foreign-typedef) + ()) + +(defmethod translate-to-foreign (value (type enhanced-typedef)) + (translate-to-foreign value (actual-type type))) + +(defmethod translate-into-foreign-memory (value (type enhanced-typedef) pointer) + (translate-into-foreign-memory value (actual-type type) pointer)) + +(defmethod translate-from-foreign (value (type enhanced-typedef)) + (translate-from-foreign value (actual-type type))) + +(defmethod free-translated-object (value (type enhanced-typedef) param) + (free-translated-object value (actual-type type) param)) + +(defmethod expand-from-foreign (value (type enhanced-typedef)) + (expand-from-foreign value (actual-type type))) + +(defmethod expand-to-foreign (value (type enhanced-typedef)) + (expand-to-foreign value (actual-type type))) + +(defmethod expand-to-foreign-dyn (value var body (type enhanced-typedef)) + (expand-to-foreign-dyn value var body (actual-type type))) + +(defmethod expand-into-foreign-memory (value (type enhanced-typedef) ptr) + (expand-into-foreign-memory value (actual-type type) ptr)) + +;;;# User-defined Types and Translations. + +(defmacro define-foreign-type (name supers slots &rest options) + (multiple-value-bind (new-options simple-parser actual-type initargs) + (let ((keywords '(:simple-parser :actual-type :default-initargs))) + (apply #'values + (remove-if (lambda (opt) (member (car opt) keywords)) options) + (mapcar (lambda (kw) (cdr (assoc kw options))) keywords))) + `(eval-when (:compile-toplevel :load-toplevel :execute) + (defclass ,name ,(or supers '(enhanced-foreign-type)) + ,slots + (:default-initargs ,@(when actual-type `(:actual-type ',actual-type)) + ,@initargs) + ,@new-options) + ,(when simple-parser + `(define-parse-method ,(car simple-parser) (&rest args) + (apply #'make-instance ',name args))) + ',name))) + +(defmacro defctype (name base-type &optional documentation) + "Utility macro for simple C-like typedefs." + (declare (ignore documentation)) + (warn-if-kw-or-belongs-to-cl name) + (let* ((btype (parse-type base-type)) + (dtype (if (typep btype 'enhanced-foreign-type) + 'enhanced-typedef + 'foreign-typedef))) + `(eval-when (:compile-toplevel :load-toplevel :execute) + (notice-foreign-type + ',name (make-instance ',dtype :name ',name :actual-type ,btype))))) + +;;; For Verrazano. We memoize the type this way to help detect cycles. +(defmacro defctype* (name base-type) + "Like DEFCTYPE but defers instantiation until parse-time." + `(eval-when (:compile-toplevel :load-toplevel :execute) + (let (memoized-type) + (define-parse-method ,name () + (unless memoized-type + (setf memoized-type (make-instance 'foreign-typedef :name ',name + :actual-type nil) + (actual-type memoized-type) (parse-type ',base-type))) + memoized-type)))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/enum.lisp b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/enum.lisp new file mode 100644 index 0000000..d5ada97 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/enum.lisp @@ -0,0 +1,369 @@ +;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- +;;; +;;; enum.lisp --- Defining foreign constants as Lisp keywords. +;;; +;;; Copyright (C) 2005-2006, James Bielman +;;; +;;; Permission is hereby granted, free of charge, to any person +;;; obtaining a copy of this software and associated documentation +;;; files (the "Software"), to deal in the Software without +;;; restriction, including without limitation the rights to use, copy, +;;; modify, merge, publish, distribute, sublicense, and/or sell copies +;;; of the Software, and to permit persons to whom the Software is +;;; furnished to do so, subject to the following conditions: +;;; +;;; The above copyright notice and this permission notice shall be +;;; included in all copies or substantial portions of the Software. +;;; +;;; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +;;; EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +;;; MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +;;; NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +;;; HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +;;; WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +;;; OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +;;; DEALINGS IN THE SOFTWARE. +;;; + +(in-package #:cffi) + +;; TODO the accessors names are rather inconsistent: +;; FOREIGN-ENUM-VALUE FOREIGN-BITFIELD-VALUE +;; FOREIGN-ENUM-KEYWORD FOREIGN-BITFIELD-SYMBOLS +;; FOREIGN-ENUM-KEYWORD-LIST FOREIGN-BITFIELD-SYMBOL-LIST +;; I'd rename them to: FOREIGN-*-KEY(S) and FOREIGN-*-ALL-KEYS -- attila + +;; TODO bitfield is a confusing name, because the C standard calls +;; the "int foo : 3" type as a bitfield. Maybe rename to defbitmask? +;; -- attila + +;;;# Foreign Constants as Lisp Keywords +;;; +;;; This module defines the DEFCENUM macro, which provides an +;;; interface for defining a type and associating a set of integer +;;; constants with keyword symbols for that type. +;;; +;;; The keywords are automatically translated to the appropriate +;;; constant for the type by a type translator when passed as +;;; arguments or a return value to a foreign function. + +(defclass foreign-enum (named-foreign-type enhanced-foreign-type) + ((keyword-values + :initform (error "Must specify KEYWORD-VALUES.") + :initarg :keyword-values + :reader keyword-values) + (value-keywords + :initform (error "Must specify VALUE-KEYWORDS.") + :initarg :value-keywords + :reader value-keywords)) + (:documentation "Describes a foreign enumerated type.")) + +(deftype enum-key () + '(and symbol (not null))) + +(defparameter +valid-enum-base-types+ *built-in-integer-types*) + +(defun parse-foreign-enum-like (type-name base-type values + &optional field-mode-p) + (let ((keyword-values (make-hash-table :test 'eq)) + (value-keywords (make-hash-table)) + (field-keywords (list)) + (bit-index->keyword (make-array 0 :adjustable t + :element-type t)) + (default-value (if field-mode-p 1 0)) + (most-extreme-value 0) + (has-negative-value? nil)) + (dolist (pair values) + (destructuring-bind (keyword &optional (value default-value valuep)) + (ensure-list pair) + (check-type keyword enum-key) + ;;(check-type value integer) + (when (> (abs value) (abs most-extreme-value)) + (setf most-extreme-value value)) + (when (minusp value) + (setf has-negative-value? t)) + (if field-mode-p + (if valuep + (when (and (>= value default-value) + (single-bit-p value)) + (setf default-value (ash value 1))) + (setf default-value (ash default-value 1))) + (setf default-value (1+ value))) + (if (gethash keyword keyword-values) + (error "A foreign enum cannot contain duplicate keywords: ~S." + keyword) + (setf (gethash keyword keyword-values) value)) + ;; This is completely arbitrary behaviour: we keep the last + ;; value->keyword mapping. I suppose the opposite would be + ;; just as good (keeping the first). Returning a list with all + ;; the keywords might be a solution too? Suggestions + ;; welcome. --luis + (setf (gethash value value-keywords) keyword) + (when (and field-mode-p + (single-bit-p value)) + (let ((bit-index (1- (integer-length value)))) + (push keyword field-keywords) + (when (<= (array-dimension bit-index->keyword 0) + bit-index) + (setf bit-index->keyword + (adjust-array bit-index->keyword (1+ bit-index) + :initial-element nil))) + (setf (aref bit-index->keyword bit-index) + keyword))))) + (if base-type + (progn + (setf base-type (canonicalize-foreign-type base-type)) + ;; I guess we don't lose much by not strictly adhering to + ;; the C standard here, and some libs out in the wild are + ;; already using e.g. :double. + #+nil + (assert (member base-type +valid-enum-base-types+ :test 'eq) () + "Invalid base type ~S for enum type ~S. Must be one of ~S." + base-type type-name +valid-enum-base-types+)) + ;; details: https://stackoverflow.com/questions/1122096/what-is-the-underlying-type-of-a-c-enum + (let ((bits (integer-length most-extreme-value))) + (setf base-type + (let ((most-uint-bits (load-time-value (* (foreign-type-size :unsigned-int) 8))) + (most-ulong-bits (load-time-value (* (foreign-type-size :unsigned-long) 8))) + (most-ulonglong-bits (load-time-value (* (foreign-type-size :unsigned-long-long) 8)))) + (or (if has-negative-value? + (cond + ((<= (1+ bits) most-uint-bits) + :int) + ((<= (1+ bits) most-ulong-bits) + :long) + ((<= (1+ bits) most-ulonglong-bits) + :long-long)) + (cond + ((<= bits most-uint-bits) + :unsigned-int) + ((<= bits most-ulong-bits) + :unsigned-long) + ((<= bits most-ulonglong-bits) + :unsigned-long-long))) + (error "Enum value ~S of enum ~S is too large to store." + most-extreme-value type-name)))))) + (values base-type keyword-values value-keywords + field-keywords (when field-mode-p + (alexandria:copy-array + bit-index->keyword :adjustable nil + :fill-pointer nil))))) + +(defun make-foreign-enum (type-name base-type values) + "Makes a new instance of the foreign-enum class." + (multiple-value-bind + (base-type keyword-values value-keywords) + (parse-foreign-enum-like type-name base-type values) + (make-instance 'foreign-enum + :name type-name + :actual-type (parse-type base-type) + :keyword-values keyword-values + :value-keywords value-keywords))) + +(defun %defcenum-like (name-and-options enum-list type-factory) + (discard-docstring enum-list) + (destructuring-bind (name &optional base-type) + (ensure-list name-and-options) + (let ((type (funcall type-factory name base-type enum-list))) + `(eval-when (:compile-toplevel :load-toplevel :execute) + (notice-foreign-type ',name + ;; ,type is not enough here, someone needs to + ;; define it when we're being loaded from a fasl. + (,type-factory ',name ',base-type ',enum-list)) + ,@(remove nil + (mapcar (lambda (key) + (unless (keywordp key) + `(defconstant ,key ,(foreign-enum-value type key)))) + (foreign-enum-keyword-list type))))))) + +(defmacro defcenum (name-and-options &body enum-list) + "Define an foreign enumerated type." + (%defcenum-like name-and-options enum-list 'make-foreign-enum)) + +(defun hash-keys-to-list (ht) + (loop for k being the hash-keys in ht collect k)) + +(defun foreign-enum-keyword-list (enum-type) + "Return a list of KEYWORDS defined in ENUM-TYPE." + (hash-keys-to-list (keyword-values (ensure-parsed-base-type enum-type)))) + +;;; These [four] functions could be good canditates for compiler macros +;;; when the value or keyword is constant. I am not going to bother +;;; until someone has a serious performance need to do so though. --jamesjb +(defun %foreign-enum-value (type keyword &key errorp) + (check-type keyword enum-key) + (or (gethash keyword (keyword-values type)) + (when errorp + (error "~S is not defined as a keyword for enum type ~S." + keyword type)))) + +(defun foreign-enum-value (type keyword &key (errorp t)) + "Convert a KEYWORD into an integer according to the enum TYPE." + (let ((type-obj (ensure-parsed-base-type type))) + (if (not (typep type-obj 'foreign-enum)) + (error "~S is not a foreign enum type." type) + (%foreign-enum-value type-obj keyword :errorp errorp)))) + +(defun %foreign-enum-keyword (type value &key errorp) + (check-type value integer) + (or (gethash value (value-keywords type)) + (when errorp + (error "~S is not defined as a value for enum type ~S." + value type)))) + +(defun foreign-enum-keyword (type value &key (errorp t)) + "Convert an integer VALUE into a keyword according to the enum TYPE." + (let ((type-obj (ensure-parsed-base-type type))) + (if (not (typep type-obj 'foreign-enum)) + (error "~S is not a foreign enum type." type) + (%foreign-enum-keyword type-obj value :errorp errorp)))) + +(defmethod translate-to-foreign (value (type foreign-enum)) + (if (typep value 'enum-key) + (%foreign-enum-value type value :errorp t) + value)) + +(defmethod translate-into-foreign-memory + (value (type foreign-enum) pointer) + (setf (mem-aref pointer (unparse-type (actual-type type))) + (translate-to-foreign value type))) + +(defmethod translate-from-foreign (value (type foreign-enum)) + (%foreign-enum-keyword type value :errorp t)) + +(defmethod expand-to-foreign (value (type foreign-enum)) + (once-only (value) + `(if (typep ,value 'enum-key) + (%foreign-enum-value ,type ,value :errorp t) + ,value))) + +;;; There are two expansions necessary for an enum: first, the enum +;;; keyword needs to be translated to an int, and then the int needs +;;; to be made indirect. +(defmethod expand-to-foreign-dyn-indirect (value var body (type foreign-enum)) + (expand-to-foreign-dyn-indirect ; Make the integer indirect + (with-unique-names (feint) + (call-next-method value feint (list feint) type)) ; TRANSLATABLE-FOREIGN-TYPE method + var + body + (actual-type type))) + +;;;# Foreign Bitfields as Lisp keywords +;;; +;;; DEFBITFIELD is an abstraction similar to the one provided by DEFCENUM. +;;; With some changes to DEFCENUM, this could certainly be implemented on +;;; top of it. + +(defclass foreign-bitfield (foreign-enum) + ((field-keywords + :initform (error "Must specify FIELD-KEYWORDS.") + :initarg :field-keywords + :reader field-keywords) + (bit-index->keyword + :initform (error "Must specify BIT-INDEX->KEYWORD") + :initarg :bit-index->keyword + :reader bit-index->keyword)) + (:documentation "Describes a foreign bitfield type.")) + +(defun make-foreign-bitfield (type-name base-type values) + "Makes a new instance of the foreign-bitfield class." + (multiple-value-bind + (base-type keyword-values value-keywords + field-keywords bit-index->keyword) + (parse-foreign-enum-like type-name base-type values t) + (make-instance 'foreign-bitfield + :name type-name + :actual-type (parse-type base-type) + :keyword-values keyword-values + :value-keywords value-keywords + :field-keywords field-keywords + :bit-index->keyword bit-index->keyword))) + +(defmacro defbitfield (name-and-options &body masks) + "Define an foreign enumerated type." + (%defcenum-like name-and-options masks 'make-foreign-bitfield)) + +(defun foreign-bitfield-symbol-list (bitfield-type) + "Return a list of SYMBOLS defined in BITFIELD-TYPE." + (field-keywords (ensure-parsed-base-type bitfield-type))) + +(defun %foreign-bitfield-value (type symbols) + (declare (optimize speed)) + (labels ((process-one (symbol) + (check-type symbol symbol) + (or (gethash symbol (keyword-values type)) + (error "~S is not a valid symbol for bitfield type ~S." + symbol type)))) + (declare (dynamic-extent #'process-one)) + (cond + ((consp symbols) + (reduce #'logior symbols :key #'process-one)) + ((null symbols) + 0) + (t + (process-one symbols))))) + +(defun foreign-bitfield-value (type symbols) + "Convert a list of symbols into an integer according to the TYPE bitfield." + (let ((type-obj (ensure-parsed-base-type type))) + (assert (typep type-obj 'foreign-bitfield) () + "~S is not a foreign bitfield type." type) + (%foreign-bitfield-value type-obj symbols))) + +(define-compiler-macro foreign-bitfield-value (&whole form type symbols) + "Optimize for when TYPE and SYMBOLS are constant." + (declare (notinline foreign-bitfield-value)) + (if (and (constantp type) (constantp symbols)) + (foreign-bitfield-value (eval type) (eval symbols)) + form)) + +(defun %foreign-bitfield-symbols (type value) + (check-type value integer) + (check-type type foreign-bitfield) + (loop + :with bit-index->keyword = (bit-index->keyword type) + :for bit-index :from 0 :below (array-dimension bit-index->keyword 0) + :for mask = 1 :then (ash mask 1) + :for key = (aref bit-index->keyword bit-index) + :when (and key + (= (logand value mask) mask)) + :collect key)) + +(defun foreign-bitfield-symbols (type value) + "Convert an integer VALUE into a list of matching symbols according to +the bitfield TYPE." + (let ((type-obj (ensure-parsed-base-type type))) + (if (not (typep type-obj 'foreign-bitfield)) + (error "~S is not a foreign bitfield type." type) + (%foreign-bitfield-symbols type-obj value)))) + +(define-compiler-macro foreign-bitfield-symbols (&whole form type value) + "Optimize for when TYPE and SYMBOLS are constant." + (declare (notinline foreign-bitfield-symbols)) + (if (and (constantp type) (constantp value)) + `(quote ,(foreign-bitfield-symbols (eval type) (eval value))) + form)) + +(defmethod translate-to-foreign (value (type foreign-bitfield)) + (if (integerp value) + value + (%foreign-bitfield-value type (ensure-list value)))) + +(defmethod translate-from-foreign (value (type foreign-bitfield)) + (%foreign-bitfield-symbols type value)) + +(defmethod expand-to-foreign (value (type foreign-bitfield)) + (flet ((expander (value type) + `(if (integerp ,value) + ,value + (%foreign-bitfield-value ,type (ensure-list ,value))))) + (if (constantp value) + (eval (expander value type)) + (expander value type)))) + +(defmethod expand-from-foreign (value (type foreign-bitfield)) + (flet ((expander (value type) + `(%foreign-bitfield-symbols ,type ,value))) + (if (constantp value) + (eval (expander value type)) + (expander value type)))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/features.lisp b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/features.lisp new file mode 100644 index 0000000..0cdc6ca --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/features.lisp @@ -0,0 +1,111 @@ +;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- +;;; +;;; features.lisp --- CFFI-specific features (DEPRECATED). +;;; +;;; Copyright (C) 2006-2007, Luis Oliveira +;;; +;;; Permission is hereby granted, free of charge, to any person +;;; obtaining a copy of this software and associated documentation +;;; files (the "Software"), to deal in the Software without +;;; restriction, including without limitation the rights to use, copy, +;;; modify, merge, publish, distribute, sublicense, and/or sell copies +;;; of the Software, and to permit persons to whom the Software is +;;; furnished to do so, subject to the following conditions: +;;; +;;; The above copyright notice and this permission notice shall be +;;; included in all copies or substantial portions of the Software. +;;; +;;; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +;;; EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +;;; MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +;;; NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +;;; HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +;;; WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +;;; OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +;;; DEALINGS IN THE SOFTWARE. +;;; + +(in-package #:cl-user) + +(eval-when (:compile-toplevel :load-toplevel :execute) + (pushnew :cffi *features*)) + +;;; CFFI-SYS backends take care of pushing the appropriate features to +;;; *features*. See each cffi-*.lisp file. +;;; +;;; Not anymore, I think we should use TRIVIAL-FEATURES for the +;;; platform features instead. Less pain. CFFI-FEATURES is now +;;; deprecated and this code will stay here for a while for backwards +;;; compatibility purposes, to be removed in a future release. + +(defpackage #:cffi-features + (:use #:cl) + (:export + #:cffi-feature-p + + ;; Features related to the CFFI-SYS backend. Why no-*? This + ;; reflects the hope that these symbols will go away completely + ;; meaning that at some point all lisps will support long-longs, + ;; the foreign-funcall primitive, etc... + #:no-long-long + #:no-foreign-funcall + #:no-stdcall + #:flat-namespace + + ;; Only SCL supports long-double... + ;;#:no-long-double + + ;; Features related to the operating system. + ;; More should be added. + #:darwin + #:unix + #:windows + + ;; Features related to the processor. + ;; More should be added. + #:ppc32 + #:x86 + #:x86-64 + #:sparc + #:sparc64 + #:hppa + #:hppa64)) + +(in-package #:cffi-features) + +(defun cffi-feature-p (feature-expression) + "Matches a FEATURE-EXPRESSION against those symbols in *FEATURES* +that belong to the CFFI-FEATURES package." + (when (eql feature-expression t) + (return-from cffi-feature-p t)) + (let ((features-package (find-package '#:cffi-features))) + (flet ((cffi-feature-eq (name feature-symbol) + (and (eq (symbol-package feature-symbol) features-package) + (string= name (symbol-name feature-symbol))))) + (etypecase feature-expression + (symbol + (not (null (member (symbol-name feature-expression) *features* + :test #'cffi-feature-eq)))) + (cons + (ecase (first feature-expression) + (:and (every #'cffi-feature-p (rest feature-expression))) + (:or (some #'cffi-feature-p (rest feature-expression))) + (:not (not (cffi-feature-p (cadr feature-expression)))))))))) + +;;; for backwards compatibility +(mapc (lambda (sym) (pushnew sym *features*)) + '(#+darwin darwin + #+unix unix + #+windows windows + #+ppc ppc32 + #+x86 x86 + #+x86-64 x86-64 + #+sparc sparc + #+sparc64 sparc64 + #+hppa hppa + #+hppa64 hppa64 + #+cffi-sys::no-long-long no-long-long + #+cffi-sys::flat-namespace flat-namespace + #+cffi-sys::no-foreign-funcall no-foreign-funcall + #+cffi-sys::no-stdcall no-stdcall + )) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/foreign-vars.lisp b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/foreign-vars.lisp new file mode 100644 index 0000000..4b6ba3b --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/foreign-vars.lisp @@ -0,0 +1,90 @@ +;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- +;;; +;;; foreign-vars.lisp --- High-level interface to foreign globals. +;;; +;;; Copyright (C) 2005-2008, Luis Oliveira +;;; +;;; Permission is hereby granted, free of charge, to any person +;;; obtaining a copy of this software and associated documentation +;;; files (the "Software"), to deal in the Software without +;;; restriction, including without limitation the rights to use, copy, +;;; modify, merge, publish, distribute, sublicense, and/or sell copies +;;; of the Software, and to permit persons to whom the Software is +;;; furnished to do so, subject to the following conditions: +;;; +;;; The above copyright notice and this permission notice shall be +;;; included in all copies or substantial portions of the Software. +;;; +;;; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +;;; EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +;;; MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +;;; NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +;;; HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +;;; WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +;;; OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +;;; DEALINGS IN THE SOFTWARE. +;;; + +(in-package #:cffi) + +;;;# Accessing Foreign Globals + +;;; Called by FOREIGN-OPTIONS in functions.lisp. +(defun parse-defcvar-options (options) + (destructuring-bind (&key (library :default) read-only) options + (list :library library :read-only read-only))) + +(defun get-var-pointer (symbol) + "Return a pointer to the foreign global variable relative to SYMBOL." + (foreign-symbol-pointer (get symbol 'foreign-var-name) + :library (get symbol 'foreign-var-library))) + +;;; Note: this will lookup not only variables but also functions. +(defun foreign-symbol-pointer (name &key (library :default)) + (check-type name string) + (%foreign-symbol-pointer + name (if (eq library :default) + :default + (foreign-library-handle + (get-foreign-library library))))) + +(defun fs-pointer-or-lose (foreign-name library) + "Like foreign-symbol-ptr but throws an error instead of +returning nil when foreign-name is not found." + (or (foreign-symbol-pointer foreign-name :library library) + (error "Trying to access undefined foreign variable ~S." foreign-name))) + +(defmacro defcvar (name-and-options type &optional documentation) + "Define a foreign global variable." + (multiple-value-bind (lisp-name foreign-name options) + (parse-name-and-options name-and-options t) + (let ((fn (symbolicate '#:%var-accessor- lisp-name)) + (read-only (getf options :read-only)) + (library (getf options :library))) + ;; We can't really setf an aggregate type. + (when (aggregatep (parse-type type)) + (setq read-only t)) + `(progn + (setf (documentation ',lisp-name 'variable) ,documentation) + ;; Save foreign-name and library for posterior access by + ;; GET-VAR-POINTER. + (setf (get ',lisp-name 'foreign-var-name) ,foreign-name) + (setf (get ',lisp-name 'foreign-var-library) ',library) + ;; Getter + (defun ,fn () + (mem-ref (fs-pointer-or-lose ,foreign-name ',library) ',type)) + ;; Setter + (defun (setf ,fn) (value) + ,(if read-only '(declare (ignore value)) (values)) + ,(if read-only + `(error ,(format nil + "Trying to modify read-only foreign var: ~A." + lisp-name)) + `(setf (mem-ref (fs-pointer-or-lose ,foreign-name ',library) + ',type) + value))) + ;; While most Lisps already expand DEFINE-SYMBOL-MACRO to an + ;; EVAL-WHEN form like this, that is not required by the + ;; standard so we do it ourselves. + (eval-when (:compile-toplevel :load-toplevel :execute) + (define-symbol-macro ,lisp-name (,fn))))))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/functions.lisp b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/functions.lisp new file mode 100644 index 0000000..5499b68 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/functions.lisp @@ -0,0 +1,441 @@ +;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- +;;; +;;; functions.lisp --- High-level interface to foreign functions. +;;; +;;; Copyright (C) 2005-2006, James Bielman +;;; Copyright (C) 2005-2007, Luis Oliveira +;;; +;;; Permission is hereby granted, free of charge, to any person +;;; obtaining a copy of this software and associated documentation +;;; files (the "Software"), to deal in the Software without +;;; restriction, including without limitation the rights to use, copy, +;;; modify, merge, publish, distribute, sublicense, and/or sell copies +;;; of the Software, and to permit persons to whom the Software is +;;; furnished to do so, subject to the following conditions: +;;; +;;; The above copyright notice and this permission notice shall be +;;; included in all copies or substantial portions of the Software. +;;; +;;; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +;;; EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +;;; MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +;;; NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +;;; HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +;;; WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +;;; OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +;;; DEALINGS IN THE SOFTWARE. +;;; + +(in-package #:cffi) + +;;;# Calling Foreign Functions +;;; +;;; FOREIGN-FUNCALL is the main primitive for calling foreign +;;; functions. It converts each argument based on the installed +;;; translators for its type, then passes the resulting list to +;;; CFFI-SYS:%FOREIGN-FUNCALL. +;;; +;;; For implementation-specific reasons, DEFCFUN doesn't use +;;; FOREIGN-FUNCALL directly and might use something else (passed to +;;; TRANSLATE-OBJECTS as the CALL-FORM argument) instead of +;;; CFFI-SYS:%FOREIGN-FUNCALL to call the foreign-function. + +(defun translate-objects (syms args types rettype call-form &optional indirect) + "Helper function for FOREIGN-FUNCALL and DEFCFUN. If 'indirect is T, all arguments are represented by foreign pointers, even those that can be represented by CL objects." + (if (null args) + (expand-from-foreign call-form (parse-type rettype)) + (funcall + (if indirect + #'expand-to-foreign-dyn-indirect + #'expand-to-foreign-dyn) + (car args) (car syms) + (list (translate-objects (cdr syms) (cdr args) + (cdr types) rettype call-form indirect)) + (parse-type (car types))))) + +(defun parse-args-and-types (args) + "Returns 4 values: types, canonicalized types, args and return type." + (let* ((len (length args)) + (return-type (if (oddp len) (lastcar args) :void))) + (loop repeat (floor len 2) + for (type arg) on args by #'cddr + collect type into types + collect (canonicalize-foreign-type type) into ctypes + collect arg into fargs + finally (return (values types ctypes fargs return-type))))) + +;;; While the options passed directly to DEFCFUN/FOREIGN-FUNCALL have +;;; precedence, we also grab its library's options, if possible. +(defun parse-function-options (options &key pointer) + (destructuring-bind (&key (library :default libraryp) + (cconv nil cconv-p) + (calling-convention cconv calling-convention-p) + (convention calling-convention)) + options + (when cconv-p + (warn-obsolete-argument :cconv :convention)) + (when calling-convention-p + (warn-obsolete-argument :calling-convention :convention)) + (list* :convention + (or convention + (when libraryp + (let ((lib-options (foreign-library-options + (get-foreign-library library)))) + (getf lib-options :convention))) + :cdecl) + ;; Don't pass the library option if we're dealing with + ;; FOREIGN-FUNCALL-POINTER. + (unless pointer + (list :library library))))) + +(defun structure-by-value-p (ctype) + "A structure or union is to be called or returned by value." + (let ((actual-type (ensure-parsed-base-type ctype))) + (or (and (typep actual-type 'foreign-struct-type) + (not (bare-struct-type-p actual-type))) + #+cffi::no-long-long (typep actual-type 'emulated-llong-type)))) + +(defun fn-call-by-value-p (argument-types return-type) + "One or more structures in the arguments or return from the function are called by value." + (or (some 'structure-by-value-p argument-types) + (structure-by-value-p return-type))) + +(defvar *foreign-structures-by-value* + (lambda (&rest args) + (declare (ignore args)) + (restart-case + (error "Unable to call structures by value without cffi-libffi loaded.") + (load-cffi-libffi () :report "Load cffi-libffi." + (asdf:operate 'asdf:load-op 'cffi-libffi)))) + "A function that produces a form suitable for calling structures by value.") + +(defun foreign-funcall-form (thing options args pointerp) + (multiple-value-bind (types ctypes fargs rettype) + (parse-args-and-types args) + (let ((syms (make-gensym-list (length fargs))) + (fsbvp (fn-call-by-value-p ctypes rettype))) + (if fsbvp + ;; Structures by value call through *foreign-structures-by-value* + (funcall *foreign-structures-by-value* + thing + fargs + syms + types + rettype + ctypes + pointerp) + (translate-objects + syms fargs types rettype + `(,(if pointerp '%foreign-funcall-pointer '%foreign-funcall) + ;; No structures by value, direct call + ,thing + (,@(mapcan #'list ctypes syms) + ,(canonicalize-foreign-type rettype)) + ,@(parse-function-options options :pointer pointerp))))))) + +(defmacro foreign-funcall (name-and-options &rest args) + "Wrapper around %FOREIGN-FUNCALL that translates its arguments." + (let ((name (car (ensure-list name-and-options))) + (options (cdr (ensure-list name-and-options)))) + (foreign-funcall-form name options args nil))) + +(defmacro foreign-funcall-pointer (pointer options &rest args) + (foreign-funcall-form pointer options args t)) + +(defun promote-varargs-type (builtin-type) + "Default argument promotions." + (case builtin-type + (:float :double) + ((:char :short) :int) + ((:unsigned-char :unsigned-short) :unsigned-int) + (t builtin-type))) + +;; If cffi-sys doesn't provide a %foreign-funcall-varargs macros we +;; define one that use %foreign-funcall. +(eval-when (:compile-toplevel :load-toplevel :execute) + (unless (fboundp '%foreign-funcall-varargs) + (defmacro %foreign-funcall-varargs (name fixed-args varargs + &rest args &key convention library) + (declare (ignore convention library)) + `(%foreign-funcall ,name ,(append fixed-args varargs) ,@args))) + (unless (fboundp '%foreign-funcall-pointer-varargs) + (defmacro %foreign-funcall-pointer-varargs (pointer fixed-args varargs + &rest args &key convention) + (declare (ignore convention)) + `(%foreign-funcall-pointer ,pointer ,(append fixed-args varargs) ,@args)))) + +(defun foreign-funcall-varargs-form (thing options fixed-args varargs pointerp) + (multiple-value-bind (fixed-types fixed-ctypes fixed-fargs) + (parse-args-and-types fixed-args) + (multiple-value-bind (varargs-types varargs-ctypes varargs-fargs rettype) + (parse-args-and-types varargs) + (let ((fixed-syms (make-gensym-list (length fixed-fargs))) + (varargs-syms (make-gensym-list (length varargs-fargs)))) + (translate-objects + (append fixed-syms varargs-syms) + (append fixed-fargs varargs-fargs) + (append fixed-types varargs-types) + rettype + `(,(if pointerp '%foreign-funcall-pointer-varargs '%foreign-funcall-varargs) + ,thing + ,(mapcan #'list fixed-ctypes fixed-syms) + ,(append + (mapcan #'list + (mapcar #'promote-varargs-type varargs-ctypes) + (loop for sym in varargs-syms + and type in varargs-ctypes + if (eq type :float) + collect `(float ,sym 1.0d0) + else collect sym)) + (list (canonicalize-foreign-type rettype))) + ,@options)))))) + +(defmacro foreign-funcall-varargs (name-and-options fixed-args + &rest varargs) + "Wrapper around %FOREIGN-FUNCALL that translates its arguments +and does type promotion for the variadic arguments." + (let ((name (car (ensure-list name-and-options))) + (options (cdr (ensure-list name-and-options)))) + (foreign-funcall-varargs-form name options fixed-args varargs nil))) + +(defmacro foreign-funcall-pointer-varargs (pointer options fixed-args + &rest varargs) + "Wrapper around %FOREIGN-FUNCALL-POINTER that translates its +arguments and does type promotion for the variadic arguments." + (foreign-funcall-varargs-form pointer options fixed-args varargs t)) + +;;;# Defining Foreign Functions +;;; +;;; The DEFCFUN macro provides a declarative interface for defining +;;; Lisp functions that call foreign functions. + +;; If cffi-sys doesn't provide a defcfun-helper-forms, +;; we define one that uses %foreign-funcall. +(eval-when (:compile-toplevel :load-toplevel :execute) + (unless (fboundp 'defcfun-helper-forms) + (defun defcfun-helper-forms (name lisp-name rettype args types options) + (declare (ignore lisp-name)) + (values + '() + `(%foreign-funcall ,name ,(append (mapcan #'list types args) + (list rettype)) + ,@options))))) + +(defun %defcfun (lisp-name foreign-name return-type args options docstring) + (let* ((arg-names (mapcar #'first args)) + (arg-types (mapcar #'second args)) + (syms (make-gensym-list (length args))) + (call-by-value (fn-call-by-value-p arg-types return-type))) + (multiple-value-bind (prelude caller) + (if call-by-value + (values nil nil) + (defcfun-helper-forms + foreign-name lisp-name (canonicalize-foreign-type return-type) + syms (mapcar #'canonicalize-foreign-type arg-types) options)) + `(progn + ,prelude + (defun ,lisp-name ,arg-names + ,@(ensure-list docstring) + ,(if call-by-value + `(foreign-funcall + ,(cons foreign-name options) + ,@(append (mapcan #'list arg-types arg-names) + (list return-type))) + (translate-objects + syms arg-names arg-types return-type caller))))))) + +(defun %defcfun-varargs (lisp-name foreign-name return-type args options doc) + (with-unique-names (varargs) + (let ((arg-names (mapcar #'car args))) + `(defmacro ,lisp-name (,@arg-names &rest ,varargs) + ,@(ensure-list doc) + `(foreign-funcall-varargs + ,'(,foreign-name ,@options) + ,,`(list ,@(loop for (name type) in args + collect `',type collect name)) + ,@,varargs + ,',return-type))))) + +(defgeneric translate-underscore-separated-name (name) + (:method ((name string)) + (values (intern (canonicalize-symbol-name-case (substitute #\- #\_ name))))) + (:method ((name symbol)) + (substitute #\_ #\- (string-downcase (symbol-name name))))) + +(defun collapse-prefix (l special-words) + (unless (null l) + (multiple-value-bind (newpre skip) (check-prefix l special-words) + (cons newpre (collapse-prefix (nthcdr skip l) special-words))))) + +(defun check-prefix (l special-words) + (let ((pl (loop for i from (1- (length l)) downto 0 + collect (apply #'concatenate 'simple-string (butlast l i))))) + (loop for w in special-words + for p = (position-if #'(lambda (s) (string= s w)) pl) + when p do (return-from check-prefix (values (nth p pl) (1+ p)))) + (values (first l) 1))) + +(defgeneric translate-camelcase-name (name &key upper-initial-p special-words) + (:method ((name string) &key upper-initial-p special-words) + (declare (ignore upper-initial-p)) + (values (intern (reduce #'(lambda (s1 s2) + (concatenate 'simple-string s1 "-" s2)) + (mapcar #'string-upcase + (collapse-prefix + (split-if #'(lambda (ch) + (or (upper-case-p ch) + (digit-char-p ch))) + name) + special-words)))))) + (:method ((name symbol) &key upper-initial-p special-words) + (apply #'concatenate + 'string + (loop for str in (split-if #'(lambda (ch) (eq ch #\-)) + (string name) + :elide) + for first-word-p = t then nil + for e = (member str special-words + :test #'equal :key #'string-upcase) + collect (cond + ((and first-word-p (not upper-initial-p)) + (string-downcase str)) + (e (first e)) + (t (string-capitalize str))))))) + +(defgeneric translate-name-from-foreign (foreign-name package &optional varp) + (:method (foreign-name package &optional varp) + (declare (ignore package)) + (let ((sym (translate-underscore-separated-name foreign-name))) + (if varp + (values (intern (format nil "*~A*" + (canonicalize-symbol-name-case + (symbol-name sym))))) + sym)))) + +(defgeneric translate-name-to-foreign (lisp-name package &optional varp) + (:method (lisp-name package &optional varp) + (declare (ignore package)) + (let ((name (translate-underscore-separated-name lisp-name))) + (if varp + (string-trim '(#\*) name) + name)))) + +(defun lisp-name (spec varp) + (check-type spec string) + (translate-name-from-foreign spec *package* varp)) + +(defun foreign-name (spec varp) + (check-type spec (and symbol (not null))) + (translate-name-to-foreign spec *package* varp)) + +(defun foreign-options (opts varp) + (if varp + (funcall 'parse-defcvar-options opts) + (parse-function-options opts))) + +(defun lisp-name-p (name) + (and name (symbolp name) (not (keywordp name)))) + +(defun %parse-name-and-options (spec varp) + (cond + ((stringp spec) + (values (lisp-name spec varp) spec nil)) + ((symbolp spec) + (assert (not (null spec))) + (values spec (foreign-name spec varp) nil)) + ((and (consp spec) (stringp (first spec))) + (destructuring-bind (foreign-name &rest options) + spec + (cond + ((or (null options) + (keywordp (first options))) + (values (lisp-name foreign-name varp) foreign-name options)) + (t + (assert (lisp-name-p (first options))) + (values (first options) foreign-name (rest options)))))) + ((and (consp spec) (lisp-name-p (first spec))) + (destructuring-bind (lisp-name &rest options) + spec + (cond + ((or (null options) + (keywordp (first options))) + (values lisp-name (foreign-name spec varp) options)) + (t + (assert (stringp (first options))) + (values lisp-name (first options) (rest options)))))) + (t + (error "Not a valid foreign function specifier: ~A" spec)))) + +;;; DEFCFUN's first argument has can have the following syntax: +;;; +;;; 1. string +;;; 2. symbol +;;; 3. \( string [symbol] options* ) +;;; 4. \( symbol [string] options* ) +;;; +;;; The string argument denotes the foreign function's name. The +;;; symbol argument is used to name the Lisp function. If one isn't +;;; present, its name is derived from the other. See the user +;;; documentation for an explanation of the derivation rules. +(defun parse-name-and-options (spec &optional varp) + (multiple-value-bind (lisp-name foreign-name options) + (%parse-name-and-options spec varp) + (values lisp-name foreign-name (foreign-options options varp)))) + +;;; If we find a &REST token at the end of ARGS, it means this is a +;;; varargs foreign function therefore we define a lisp macro using +;;; %DEFCFUN-VARARGS. Otherwise, a lisp function is defined with +;;; %DEFCFUN. +(defmacro defcfun (name-and-options return-type &body args) + "Defines a Lisp function that calls a foreign function." + (let ((docstring (when (stringp (car args)) (pop args)))) + (multiple-value-bind (lisp-name foreign-name options) + (parse-name-and-options name-and-options) + (if (eq (lastcar args) '&rest) + (%defcfun-varargs lisp-name foreign-name return-type + (butlast args) options docstring) + (%defcfun lisp-name foreign-name return-type args options + docstring))))) + +;;;# Defining Callbacks + +(defun inverse-translate-objects (args types declarations rettype call) + `(let (,@(loop for arg in args and type in types + collect (list arg (expand-from-foreign + arg (parse-type type))))) + ,@declarations + ,(expand-to-foreign call (parse-type rettype)))) + +(defun parse-defcallback-options (options) + (destructuring-bind (&key (cconv :cdecl cconv-p) + (calling-convention cconv calling-convention-p) + (convention calling-convention)) + options + (when cconv-p + (warn-obsolete-argument :cconv :convention)) + (when calling-convention-p + (warn-obsolete-argument :calling-convention :convention)) + (list :convention convention))) + +(defmacro defcallback (name-and-options return-type args &body body) + (multiple-value-bind (body declarations) + (parse-body body :documentation t) + (let ((arg-names (mapcar #'car args)) + (arg-types (mapcar #'cadr args)) + (name (car (ensure-list name-and-options))) + (options (cdr (ensure-list name-and-options)))) + `(progn + (%defcallback ,name ,(canonicalize-foreign-type return-type) + ,arg-names ,(mapcar #'canonicalize-foreign-type arg-types) + ,(inverse-translate-objects + arg-names arg-types declarations return-type + `(block ,name ,@body)) + ,@(parse-defcallback-options options)) + ',name)))) + +(declaim (inline get-callback)) +(defun get-callback (symbol) + (%callback symbol)) + +(defmacro callback (name) + `(%callback ',name)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/libraries.lisp b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/libraries.lisp new file mode 100644 index 0000000..7a554d1 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/libraries.lisp @@ -0,0 +1,458 @@ +;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- +;;; +;;; libraries.lisp --- Finding and loading foreign libraries. +;;; +;;; Copyright (C) 2005-2006, James Bielman +;;; Copyright (C) 2006-2007, Luis Oliveira +;;; +;;; Permission is hereby granted, free of charge, to any person +;;; obtaining a copy of this software and associated documentation +;;; files (the "Software"), to deal in the Software without +;;; restriction, including without limitation the rights to use, copy, +;;; modify, merge, publish, distribute, sublicense, and/or sell copies +;;; of the Software, and to permit persons to whom the Software is +;;; furnished to do so, subject to the following conditions: +;;; +;;; The above copyright notice and this permission notice shall be +;;; included in all copies or substantial portions of the Software. +;;; +;;; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +;;; EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +;;; MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +;;; NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +;;; HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +;;; WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +;;; OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +;;; DEALINGS IN THE SOFTWARE. +;;; + +(in-package #:cffi) + +;;;# Finding Foreign Libraries +;;; +;;; We offer two ways for the user of a CFFI library to define +;;; his/her own library directories: *FOREIGN-LIBRARY-DIRECTORIES* +;;; for regular libraries and *DARWIN-FRAMEWORK-DIRECTORIES* for +;;; Darwin frameworks. +;;; +;;; These two special variables behave similarly to +;;; ASDF:*CENTRAL-REGISTRY* as its arguments are evaluated before +;;; being used. We used our MINI-EVAL instead of the full-blown EVAL +;;; and the evaluated form should yield a single pathname or a list of +;;; pathnames. +;;; +;;; Only after failing to find a library through the normal ways +;;; (eg: on Linux LD_LIBRARY_PATH, /etc/ld.so.cache, /usr/lib/, /lib) +;;; do we try to find the library ourselves. + +(defun explode-path-environment-variable (name) + (mapcar #'uiop:ensure-directory-pathname + (split-if (lambda (c) (eql #\: c)) + (uiop:getenv name) + :elide))) + +(defun darwin-fallback-library-path () + (or (explode-path-environment-variable "DYLD_FALLBACK_LIBRARY_PATH") + (list (merge-pathnames #p"lib/" (user-homedir-pathname)) + #p"/opt/local/lib/" + #p"/usr/local/lib/" + #p"/usr/lib/"))) + +(defvar *foreign-library-directories* + (if (featurep :darwin) + '((explode-path-environment-variable "LD_LIBRARY_PATH") + (explode-path-environment-variable "DYLD_LIBRARY_PATH") + (uiop:getcwd) + (darwin-fallback-library-path)) + '()) + "List onto which user-defined library paths can be pushed.") + +(defun fallback-darwin-framework-directories () + (or (explode-path-environment-variable "DYLD_FALLBACK_FRAMEWORK_PATH") + (list (uiop:getcwd) + (merge-pathnames #p"Library/Frameworks/" (user-homedir-pathname)) + #p"/Library/Frameworks/" + #p"/System/Library/Frameworks/"))) + +(defvar *darwin-framework-directories* + '((explode-path-environment-variable "DYLD_FRAMEWORK_PATH") + (fallback-darwin-framework-directories)) + "List of directories where Frameworks are searched for.") + +(defun mini-eval (form) + "Simple EVAL-like function to evaluate the elements of +*FOREIGN-LIBRARY-DIRECTORIES* and *DARWIN-FRAMEWORK-DIRECTORIES*." + (typecase form + (cons (apply (car form) (mapcar #'mini-eval (cdr form)))) + (symbol (symbol-value form)) + (t form))) + +(defun parse-directories (list) + (mappend (compose #'ensure-list #'mini-eval) list)) + +(defun find-file (path directories) + "Searches for PATH in a list of DIRECTORIES and returns the first it finds." + (some (lambda (directory) (probe-file (merge-pathnames path directory))) + directories)) + +(defun find-darwin-framework (framework-name) + "Searches for FRAMEWORK-NAME in *DARWIN-FRAMEWORK-DIRECTORIES*." + (dolist (directory (parse-directories *darwin-framework-directories*)) + (let ((path (make-pathname + :name framework-name + :directory + (append (pathname-directory directory) + (list (format nil "~A.framework" framework-name)))))) + (when (probe-file path) + (return-from find-darwin-framework path))))) + +;;;# Defining Foreign Libraries +;;; +;;; Foreign libraries can be defined using the +;;; DEFINE-FOREIGN-LIBRARY macro. Example usage: +;;; +;;; (define-foreign-library opengl +;;; (:darwin (:framework "OpenGL")) +;;; (:unix (:or "libGL.so" "libGL.so.1" +;;; #p"/myhome/mylibGL.so")) +;;; (:windows "opengl32.dll") +;;; ;; an hypothetical example of a particular platform +;;; ((:and :some-system :some-cpu) "libGL-support.lib") +;;; ;; if no other clauses apply, this one will and a type will be +;;; ;; automagically appended to the name passed to :default +;;; (t (:default "libGL"))) +;;; +;;; This information is stored in the *FOREIGN-LIBRARIES* hashtable +;;; and when the library is loaded through LOAD-FOREIGN-LIBRARY (or +;;; USE-FOREIGN-LIBRARY) the first clause matched by FEATUREP is +;;; processed. + +(defvar *foreign-libraries* (make-hash-table :test 'eq) + "Hashtable of defined libraries.") + +(defclass foreign-library () + ((name :initform nil :initarg :name :accessor foreign-library-name) + (type :initform :system :initarg :type) + (spec :initarg :spec) + (options :initform nil :initarg :options) + (handle :initform nil :initarg :handle :accessor foreign-library-handle) + (pathname :initform nil))) + +(defmethod print-object ((library foreign-library) stream) + (with-slots (name pathname) library + (print-unreadable-object (library stream :type t) + (when name + (format stream "~A" name)) + (when pathname + (format stream " ~S" (file-namestring pathname)))))) + +(define-condition foreign-library-undefined-error (error) + ((name :initarg :name :reader fl-name)) + (:report (lambda (c s) + (format s "Undefined foreign library: ~S" + (fl-name c))))) + +(defun get-foreign-library (lib) + "Look up a library by NAME, signalling an error if not found." + (if (typep lib 'foreign-library) + lib + (or (gethash lib *foreign-libraries*) + (error 'foreign-library-undefined-error :name lib)))) + +(defun (setf get-foreign-library) (value name) + (setf (gethash name *foreign-libraries*) value)) + +(defun foreign-library-type (lib) + (slot-value (get-foreign-library lib) 'type)) + +(defun foreign-library-pathname (lib) + (slot-value (get-foreign-library lib) 'pathname)) + +(defun %foreign-library-spec (lib) + (assoc-if (lambda (feature) + (or (eq feature t) + (featurep feature))) + (slot-value lib 'spec))) + +(defun foreign-library-spec (lib) + (second (%foreign-library-spec lib))) + +(defun foreign-library-options (lib) + (append (cddr (%foreign-library-spec lib)) + (slot-value lib 'options))) + +(defun foreign-library-search-path (lib) + (loop for (opt val) on (foreign-library-options lib) by #'cddr + when (eql opt :search-path) + append (ensure-list val) into search-path + finally (return (mapcar #'pathname search-path)))) + +(defun foreign-library-loaded-p (lib) + (not (null (foreign-library-handle (get-foreign-library lib))))) + +(defun list-foreign-libraries (&key (loaded-only t) type) + "Return a list of defined foreign libraries. +If LOADED-ONLY is non-null only loaded libraries are returned. +TYPE restricts the output to a specific library type: if NIL +all libraries are returned." + (let ((libs (hash-table-values *foreign-libraries*))) + (remove-if (lambda (lib) + (or (and type + (not (eql type (foreign-library-type lib)))) + (and loaded-only + (not (foreign-library-loaded-p lib))))) + libs))) + +;; :CONVENTION, :CALLING-CONVENTION and :CCONV are coalesced, +;; the former taking priority +;; options with NULL values are removed +(defun clean-spec-up (spec) + (mapcar (lambda (x) + (list* (first x) (second x) + (let* ((opts (cddr x)) + (cconv (getf opts :cconv)) + (calling-convention (getf opts :calling-convention)) + (convention (getf opts :convention)) + (search-path (getf opts :search-path))) + (remf opts :cconv) (remf opts :calling-convention) + (when cconv + (warn-obsolete-argument :cconv :convention)) + (when calling-convention + (warn-obsolete-argument :calling-convention + :convention)) + (setf (getf opts :convention) + (or convention calling-convention cconv)) + (setf (getf opts :search-path) + (mapcar #'pathname (ensure-list search-path))) + (loop for (opt val) on opts by #'cddr + when val append (list opt val) into new-opts + finally (return new-opts))))) + spec)) + +(defmethod initialize-instance :after + ((lib foreign-library) &key search-path + (cconv :cdecl cconv-p) + (calling-convention cconv calling-convention-p) + (convention calling-convention)) + (with-slots (type options spec) lib + (check-type type (member :system :test :grovel-wrapper)) + (setf spec (clean-spec-up spec)) + (let ((all-options + (apply #'append options (mapcar #'cddr spec)))) + (assert (subsetp (loop for (key . nil) on all-options by #'cddr + collect key) + '(:convention :search-path))) + (when cconv-p + (warn-obsolete-argument :cconv :convention)) + (when calling-convention-p + (warn-obsolete-argument :calling-convention :convention)) + (flet ((set-option (key value) + (when value (setf (getf options key) value)))) + (set-option :convention convention) + (set-option :search-path + (mapcar #'pathname (ensure-list search-path))))))) + +(defun register-foreign-library (name spec &rest options) + (let ((old-handle + (when-let ((old-lib (gethash name *foreign-libraries*))) + (foreign-library-handle old-lib)))) + (setf (get-foreign-library name) + (apply #'make-instance 'foreign-library + :name name + :spec spec + :handle old-handle + options)) + name)) + +(defmacro define-foreign-library (name-and-options &body pairs) + "Defines a foreign library NAME that can be posteriorly used with +the USE-FOREIGN-LIBRARY macro." + (destructuring-bind (name . options) + (ensure-list name-and-options) + (check-type name symbol) + `(register-foreign-library ',name ',pairs ,@options))) + +;;;# LOAD-FOREIGN-LIBRARY-ERROR condition +;;; +;;; The various helper functions that load foreign libraries can +;;; signal this error when something goes wrong. We ignore the host's +;;; error. We should probably reuse its error message. + +(define-condition load-foreign-library-error (simple-error) + ()) + +(defun read-new-value () + (format *query-io* "~&Enter a new value (unevaluated): ") + (force-output *query-io*) + (read *query-io*)) + +(defun fl-error (control &rest arguments) + (error 'load-foreign-library-error + :format-control control + :format-arguments arguments)) + +;;;# Loading Foreign Libraries + +(defun load-darwin-framework (name framework-name) + "Tries to find and load a darwin framework in one of the directories +in *DARWIN-FRAMEWORK-DIRECTORIES*. If unable to find FRAMEWORK-NAME, +it signals a LOAD-FOREIGN-LIBRARY-ERROR." + (let ((framework (find-darwin-framework framework-name))) + (if framework + (load-foreign-library-path name (native-namestring framework)) + (fl-error "Unable to find framework ~A" framework-name)))) + +(defun report-simple-error (name error) + (fl-error "Unable to load foreign library (~A).~% ~A" + name + (format nil "~?" (simple-condition-format-control error) + (simple-condition-format-arguments error)))) + +;;; FIXME: haven't double checked whether all Lisps signal a +;;; SIMPLE-ERROR on %load-foreign-library failure. In any case they +;;; should be throwing a more specific error. +(defun load-foreign-library-path (name path &optional search-path) + "Tries to load PATH using %LOAD-FOREIGN-LIBRARY which should try and +find it using the OS's usual methods. If that fails we try to find it +ourselves." + (handler-case + (values (%load-foreign-library name path) + (pathname path)) + (simple-error (error) + (let ((dirs (parse-directories *foreign-library-directories*))) + (if-let (file (find-file path (append search-path dirs))) + (handler-case + (values (%load-foreign-library name (native-namestring file)) + file) + (simple-error (error) + (report-simple-error name error))) + (report-simple-error name error)))))) + +(defun try-foreign-library-alternatives (name library-list &optional search-path) + "Goes through a list of alternatives and only signals an error when +none of alternatives were successfully loaded." + (dolist (lib library-list) + (multiple-value-bind (handle pathname) + (ignore-errors (load-foreign-library-helper name lib search-path)) + (when handle + (return-from try-foreign-library-alternatives + (values handle pathname))))) + ;; Perhaps we should show the error messages we got for each + ;; alternative if we can figure out a nice way to do that. + (fl-error "Unable to load any of the alternatives:~% ~S" library-list)) + +(defparameter *cffi-feature-suffix-map* + '((:windows . ".dll") + (:darwin . ".dylib") + (:unix . ".so") + (t . ".so")) + "Mapping of OS feature keywords to shared library suffixes.") + +(defun default-library-suffix () + "Return a string to use as default library suffix based on the +operating system. This is used to implement the :DEFAULT option. +This will need to be extended as we test on more OSes." + (or (cdr (assoc-if #'featurep *cffi-feature-suffix-map*)) + (fl-error "Unable to determine the default library suffix on this OS."))) + +(defun load-foreign-library-helper (name thing &optional search-path) + (etypecase thing + ((or pathname string) + (load-foreign-library-path name (filter-pathname thing) search-path)) + (cons + (ecase (first thing) + (:framework (load-darwin-framework name (second thing))) + (:default + (unless (stringp (second thing)) + (fl-error "Argument to :DEFAULT must be a string.")) + (let ((library-path + (concatenate 'string + (second thing) + (default-library-suffix)))) + (load-foreign-library-path name library-path search-path))) + (:or (try-foreign-library-alternatives name (rest thing) search-path)))))) + +(defun %do-load-foreign-library (library search-path) + (flet ((%do-load (lib name spec) + (when (foreign-library-spec lib) + (with-slots (handle pathname) lib + (setf (values handle pathname) + (load-foreign-library-helper + name spec (foreign-library-search-path lib))))) + lib)) + (etypecase library + (symbol + (let* ((lib (get-foreign-library library)) + (spec (foreign-library-spec lib))) + (%do-load lib library spec))) + ((or string list) + (let* ((lib-name (gensym + (format nil "~:@(~A~)-" + (if (listp library) + (first library) + (file-namestring library))))) + (lib (make-instance 'foreign-library + :type :system + :name lib-name + :spec `((t ,library)) + :search-path search-path))) + ;; first try to load the anonymous library + ;; and register it only if that worked + (%do-load lib lib-name library) + (setf (get-foreign-library lib-name) lib)))))) + +(defun filter-pathname (thing) + (typecase thing + (pathname (namestring thing)) + (t thing))) + +(defun load-foreign-library (library &key search-path) + "Loads a foreign LIBRARY which can be a symbol denoting a library defined +through DEFINE-FOREIGN-LIBRARY; a pathname or string in which case we try to +load it directly first then search for it in *FOREIGN-LIBRARY-DIRECTORIES*; +or finally list: either (:or lib1 lib2) or (:framework )." + (let ((library (filter-pathname library))) + (restart-case + (progn + ;; dlopen/dlclose does reference counting, but the CFFI-SYS + ;; API has no infrastructure to track that. Therefore if we + ;; want to avoid increasing the internal dlopen reference + ;; counter, and thus thwarting dlclose, then we need to try + ;; to call CLOSE-FOREIGN-LIBRARY and ignore any signaled + ;; errors. + (ignore-some-conditions (foreign-library-undefined-error) + (close-foreign-library library)) + (%do-load-foreign-library library search-path)) + ;; Offer these restarts that will retry the call to + ;; %LOAD-FOREIGN-LIBRARY. + (retry () + :report "Try loading the foreign library again." + (load-foreign-library library :search-path search-path)) + (use-value (new-library) + :report "Use another library instead." + :interactive read-new-value + (load-foreign-library new-library :search-path search-path))))) + +(defmacro use-foreign-library (name) + `(load-foreign-library ',name)) + +;;;# Closing Foreign Libraries + +(defun close-foreign-library (library) + "Closes a foreign library." + (let* ((library (filter-pathname library)) + (lib (get-foreign-library library)) + (handle (foreign-library-handle lib))) + (when handle + (%close-foreign-library handle) + (setf (foreign-library-handle lib) nil) + t))) + +(defun reload-foreign-libraries (&key (test #'foreign-library-loaded-p)) + "(Re)load all currently loaded foreign libraries." + (let ((libs (list-foreign-libraries))) + (loop for l in libs + for name = (foreign-library-name l) + when (funcall test name) + do (load-foreign-library name)) + libs)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/package.lisp b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/package.lisp new file mode 100644 index 0000000..01f9ac4 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/package.lisp @@ -0,0 +1,181 @@ +;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- +;;; +;;; package.lisp --- Package definition for CFFI. +;;; +;;; Copyright (C) 2005-2006, James Bielman +;;; +;;; Permission is hereby granted, free of charge, to any person +;;; obtaining a copy of this software and associated documentation +;;; files (the "Software"), to deal in the Software without +;;; restriction, including without limitation the rights to use, copy, +;;; modify, merge, publish, distribute, sublicense, and/or sell copies +;;; of the Software, and to permit persons to whom the Software is +;;; furnished to do so, subject to the following conditions: +;;; +;;; The above copyright notice and this permission notice shall be +;;; included in all copies or substantial portions of the Software. +;;; +;;; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +;;; EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +;;; MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +;;; NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +;;; HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +;;; WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +;;; OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +;;; DEALINGS IN THE SOFTWARE. +;;; + +(in-package #:cl-user) + +(defpackage #:cffi + (:use #:common-lisp #:cffi-sys #:babel-encodings) + (:import-from #:alexandria + #:compose + #:ensure-list + #:featurep + #:format-symbol + #:hash-table-values + #:if-let + #:ignore-some-conditions + #:lastcar + #:make-gensym-list + #:make-keyword + #:mappend + #:once-only + #:parse-body + #:simple-style-warning + #:symbolicate + #:unwind-protect-case + #:when-let + #:with-unique-names) + (:export + ;; Types. + #:foreign-pointer + + ;; FIXME: the following types are undocumented. They should + ;; probably be replaced with a proper type introspection API + ;; though. + #:*built-in-foreign-types* + #:*other-builtin-types* + #:*built-in-integer-types* + #:*built-in-float-types* + + ;; Primitive pointer operations. + #:foreign-free + #:foreign-alloc + #:mem-aptr + #:mem-aref + #:mem-ref + #:pointerp + #:pointer-eq + #:null-pointer + #:null-pointer-p + #:inc-pointer + #:incf-pointer + #:with-foreign-pointer + #:make-pointer + #:pointer-address + + ;; Shareable vectors. + #:make-shareable-byte-vector + #:with-pointer-to-vector-data + + ;; Foreign string operations. + #:*default-foreign-encoding* + #:foreign-string-alloc + #:foreign-string-free + #:foreign-string-to-lisp + #:lisp-string-to-foreign + #:with-foreign-string + #:with-foreign-strings + #:with-foreign-pointer-as-string + + ;; Foreign array operations. + ;; TODO: document these + #:foreign-array-alloc + #:foreign-array-free + #:foreign-array-to-lisp + #:lisp-array-to-foreign + #:with-foreign-array + #:foreign-aref + + ;; Foreign function operations. + #:defcfun + #:foreign-funcall + #:foreign-funcall-pointer + #:foreign-funcall-varargs + #:foreign-funcall-pointer-varargs + #:translate-camelcase-name + #:translate-name-from-foreign + #:translate-name-to-foreign + #:translate-underscore-separated-name + + ;; Foreign library operations. + #:*foreign-library-directories* + #:*darwin-framework-directories* + #:foreign-library + #:foreign-library-name + #:foreign-library-pathname + #:foreign-library-type + #:foreign-library-loaded-p + #:list-foreign-libraries + #:define-foreign-library + #:load-foreign-library + #:load-foreign-library-error + #:use-foreign-library + #:close-foreign-library + #:reload-foreign-libraries + + ;; Callbacks. + #:callback + #:get-callback + #:defcallback + + ;; Foreign type operations. + #:defcstruct + #:defcunion + #:defctype + #:defcenum + #:defbitfield + #:define-foreign-type + #:define-parse-method + #:define-c-struct-wrapper + #:foreign-enum-keyword + #:foreign-enum-keyword-list + #:foreign-enum-value + #:foreign-bitfield-symbol-list + #:foreign-bitfield-symbols + #:foreign-bitfield-value + #:foreign-slot-pointer + #:foreign-slot-value + #:foreign-slot-type + #:foreign-slot-offset + #:foreign-slot-count + #:foreign-slot-names + #:foreign-type-alignment + #:foreign-type-size + #:with-foreign-object + #:with-foreign-objects + #:with-foreign-slots + #:convert-to-foreign + #:convert-from-foreign + #:convert-into-foreign-memory + #:free-converted-object + #:translation-forms-for-class + + ;; Extensible foreign type operations. + #:define-translation-method ; FIXME: undocumented + #:translate-to-foreign + #:translate-from-foreign + #:translate-into-foreign-memory + #:free-translated-object + #:expand-to-foreign-dyn + #:expand-to-foreign + #:expand-from-foreign + #:expand-into-foreign-memory + + ;; Foreign globals. + #:defcvar + #:get-var-pointer + #:foreign-symbol-pointer + )) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/strings.lisp b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/strings.lisp new file mode 100644 index 0000000..d56f1f9 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/strings.lisp @@ -0,0 +1,305 @@ +;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- +;;; +;;; strings.lisp --- Operations on foreign strings. +;;; +;;; Copyright (C) 2005-2006, James Bielman +;;; Copyright (C) 2005-2007, Luis Oliveira +;;; +;;; Permission is hereby granted, free of charge, to any person +;;; obtaining a copy of this software and associated documentation +;;; files (the "Software"), to deal in the Software without +;;; restriction, including without limitation the rights to use, copy, +;;; modify, merge, publish, distribute, sublicense, and/or sell copies +;;; of the Software, and to permit persons to whom the Software is +;;; furnished to do so, subject to the following conditions: +;;; +;;; The above copyright notice and this permission notice shall be +;;; included in all copies or substantial portions of the Software. +;;; +;;; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +;;; EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +;;; MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +;;; NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +;;; HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +;;; WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +;;; OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +;;; DEALINGS IN THE SOFTWARE. +;;; + +(in-package #:cffi) + +;;;# Foreign String Conversion +;;; +;;; Functions for converting NULL-terminated C-strings to Lisp strings +;;; and vice versa. The string functions accept an ENCODING keyword +;;; argument which is used to specify the encoding to use when +;;; converting to/from foreign strings. + +(defvar *default-foreign-encoding* :utf-8 + "Default foreign encoding.") + +;;; TODO: refactor, sigh. Also, this should probably be a function. +(defmacro bget (ptr off &optional (bytes 1) (endianness :ne)) + (let ((big-endian (member endianness + '(:be #+big-endian :ne #+little-endian :re)))) + (once-only (ptr off) + (ecase bytes + (1 `(mem-ref ,ptr :uint8 ,off)) + (2 (if big-endian + #+big-endian + `(mem-ref ,ptr :uint16 ,off) + #-big-endian + `(dpb (mem-ref ,ptr :uint8 ,off) (byte 8 8) + (mem-ref ,ptr :uint8 (1+ ,off))) + #+little-endian + `(mem-ref ,ptr :uint16 ,off) + #-little-endian + `(dpb (mem-ref ,ptr :uint8 (1+ ,off)) (byte 8 8) + (mem-ref ,ptr :uint8 ,off)))) + (4 (if big-endian + #+big-endian + `(mem-ref ,ptr :uint32 ,off) + #-big-endian + `(dpb (mem-ref ,ptr :uint8 ,off) (byte 8 24) + (dpb (mem-ref ,ptr :uint8 (1+ ,off)) (byte 8 16) + (dpb (mem-ref ,ptr :uint8 (+ ,off 2)) (byte 8 8) + (mem-ref ,ptr :uint8 (+ ,off 3))))) + #+little-endian + `(mem-ref ,ptr :uint32 ,off) + #-little-endian + `(dpb (mem-ref ,ptr :uint8 (+ ,off 3)) (byte 8 24) + (dpb (mem-ref ,ptr :uint8 (+ ,off 2)) (byte 8 16) + (dpb (mem-ref ,ptr :uint8 (1+ ,off)) (byte 8 8) + (mem-ref ,ptr :uint8 ,off)))))))))) + +(defmacro bset (val ptr off &optional (bytes 1) (endianness :ne)) + (let ((big-endian (member endianness + '(:be #+big-endian :ne #+little-endian :re)))) + (ecase bytes + (1 `(setf (mem-ref ,ptr :uint8 ,off) ,val)) + (2 (if big-endian + #+big-endian + `(setf (mem-ref ,ptr :uint16 ,off) ,val) + #-big-endian + `(setf (mem-ref ,ptr :uint8 (1+ ,off)) (ldb (byte 8 0) ,val) + (mem-ref ,ptr :uint8 ,off) (ldb (byte 8 8) ,val)) + #+little-endian + `(setf (mem-ref ,ptr :uint16 ,off) ,val) + #-little-endian + `(setf (mem-ref ,ptr :uint8 ,off) (ldb (byte 8 0) ,val) + (mem-ref ,ptr :uint8 (1+ ,off)) (ldb (byte 8 8) ,val)))) + (4 (if big-endian + #+big-endian + `(setf (mem-ref ,ptr :uint32 ,off) ,val) + #-big-endian + `(setf (mem-ref ,ptr :uint8 (+ 3 ,off)) (ldb (byte 8 0) ,val) + (mem-ref ,ptr :uint8 (+ 2 ,off)) (ldb (byte 8 8) ,val) + (mem-ref ,ptr :uint8 (1+ ,off)) (ldb (byte 8 16) ,val) + (mem-ref ,ptr :uint8 ,off) (ldb (byte 8 24) ,val)) + #+little-endian + `(setf (mem-ref ,ptr :uint32 ,off) ,val) + #-little-endian + `(setf (mem-ref ,ptr :uint8 ,off) (ldb (byte 8 0) ,val) + (mem-ref ,ptr :uint8 (1+ ,off)) (ldb (byte 8 8) ,val) + (mem-ref ,ptr :uint8 (+ ,off 2)) (ldb (byte 8 16) ,val) + (mem-ref ,ptr :uint8 (+ ,off 3)) (ldb (byte 8 24) ,val))))))) + +;;; TODO: tackle optimization notes. +(defparameter *foreign-string-mappings* + (instantiate-concrete-mappings + ;; :optimize ((speed 3) (debug 0) (compilation-speed 0) (safety 0)) + :octet-seq-getter bget + :octet-seq-setter bset + :octet-seq-type foreign-pointer + :code-point-seq-getter babel::string-get + :code-point-seq-setter babel::string-set + :code-point-seq-type babel:simple-unicode-string)) + +(defun null-terminator-len (encoding) + (length (enc-nul-encoding (get-character-encoding encoding)))) + +(defun lisp-string-to-foreign (string buffer bufsize &key (start 0) end offset + (encoding *default-foreign-encoding*)) + (check-type string string) + (when offset + (setq buffer (inc-pointer buffer offset))) + (with-checked-simple-vector ((string (coerce string 'babel:unicode-string)) + (start start) (end end)) + (declare (type simple-string string)) + (let ((mapping (lookup-mapping *foreign-string-mappings* encoding)) + (nul-len (null-terminator-len encoding))) + (assert (plusp bufsize)) + (multiple-value-bind (size end) + (funcall (octet-counter mapping) string start end (- bufsize nul-len)) + (funcall (encoder mapping) string start end buffer 0) + (dotimes (i nul-len) + (setf (mem-ref buffer :char (+ size i)) 0)))) + buffer)) + +;;; Expands into a loop that calculates the length of the foreign +;;; string at PTR plus OFFSET, using ACCESSOR and looking for a null +;;; terminator of LENGTH bytes. +(defmacro %foreign-string-length (ptr offset type length) + (once-only (ptr offset) + `(do ((i 0 (+ i ,length))) + ((zerop (mem-ref ,ptr ,type (+ ,offset i))) i) + (declare (fixnum i))))) + +;;; Return the length in octets of the null terminated foreign string +;;; at POINTER plus OFFSET octets, assumed to be encoded in ENCODING, +;;; a CFFI encoding. This should be smart enough to look for 8-bit vs +;;; 16-bit null terminators, as appropriate for the encoding. +(defun foreign-string-length (pointer &key (encoding *default-foreign-encoding*) + (offset 0)) + (ecase (null-terminator-len encoding) + (1 (%foreign-string-length pointer offset :uint8 1)) + (2 (%foreign-string-length pointer offset :uint16 2)) + (4 (%foreign-string-length pointer offset :uint32 4)))) + +(defun foreign-string-to-lisp (pointer &key (offset 0) count + (max-chars (1- array-total-size-limit)) + (encoding *default-foreign-encoding*)) + "Copy at most COUNT bytes from POINTER plus OFFSET encoded in +ENCODING into a Lisp string and return it. If POINTER is a null +pointer, NIL is returned." + (unless (null-pointer-p pointer) + (let ((count (or count + (foreign-string-length + pointer :encoding encoding :offset offset))) + (mapping (lookup-mapping *foreign-string-mappings* encoding))) + (assert (plusp max-chars)) + (multiple-value-bind (size new-end) + (funcall (code-point-counter mapping) + pointer offset (+ offset count) max-chars) + (let ((string (make-string size :element-type 'babel:unicode-char))) + (funcall (decoder mapping) pointer offset new-end string 0) + (values string (- new-end offset))))))) + +;;;# Using Foreign Strings + +(defun foreign-string-alloc (string &key (encoding *default-foreign-encoding*) + (null-terminated-p t) (start 0) end) + "Allocate a foreign string containing Lisp string STRING. +The string must be freed with FOREIGN-STRING-FREE." + (check-type string string) + (with-checked-simple-vector ((string (coerce string 'babel:unicode-string)) + (start start) (end end)) + (declare (type simple-string string)) + (let* ((mapping (lookup-mapping *foreign-string-mappings* encoding)) + (count (funcall (octet-counter mapping) string start end 0)) + (nul-length (if null-terminated-p + (null-terminator-len encoding) + 0)) + (length (+ count nul-length)) + (ptr (foreign-alloc :char :count length))) + (funcall (encoder mapping) string start end ptr 0) + (dotimes (i nul-length) + (setf (mem-ref ptr :char (+ count i)) 0)) + (values ptr length)))) + +(defun foreign-string-free (ptr) + "Free a foreign string allocated by FOREIGN-STRING-ALLOC." + (foreign-free ptr)) + +(defmacro with-foreign-string ((var-or-vars lisp-string &rest args) &body body) + "VAR-OR-VARS is not evaluated and should be a list of the form +\(VAR &OPTIONAL BYTE-SIZE-VAR) or just a VAR symbol. VAR is +bound to a foreign string containing LISP-STRING in BODY. When +BYTE-SIZE-VAR is specified then bind the C buffer size +\(including the possible null terminator\(s)) to this variable." + (destructuring-bind (var &optional size-var) + (ensure-list var-or-vars) + `(multiple-value-bind (,var ,@(when size-var (list size-var))) + (foreign-string-alloc ,lisp-string ,@args) + (unwind-protect + (progn ,@body) + (foreign-string-free ,var))))) + +(defmacro with-foreign-strings (bindings &body body) + "See WITH-FOREIGN-STRING's documentation." + (if bindings + `(with-foreign-string ,(first bindings) + (with-foreign-strings ,(rest bindings) + ,@body)) + `(progn ,@body))) + +(defmacro with-foreign-pointer-as-string + ((var-or-vars size &rest args) &body body) + "VAR-OR-VARS is not evaluated and should be a list of the form +\(VAR &OPTIONAL SIZE-VAR) or just a VAR symbol. VAR is bound to +a foreign buffer of size SIZE within BODY. The return value is +constructed by calling FOREIGN-STRING-TO-LISP on the foreign +buffer along with ARGS." ; fix wording, sigh + (destructuring-bind (var &optional size-var) + (ensure-list var-or-vars) + `(with-foreign-pointer (,var ,size ,size-var) + (progn + ,@body + (values (foreign-string-to-lisp ,var ,@args)))))) + +;;;# Automatic Conversion of Foreign Strings + +(define-foreign-type foreign-string-type () + (;; CFFI encoding of this string. + (encoding :initform nil :initarg :encoding :reader encoding) + ;; Should we free after translating from foreign? + (free-from-foreign :initarg :free-from-foreign + :reader fst-free-from-foreign-p + :initform nil :type boolean) + ;; Should we free after translating to foreign? + (free-to-foreign :initarg :free-to-foreign + :reader fst-free-to-foreign-p + :initform t :type boolean)) + (:actual-type :pointer) + (:simple-parser :string)) + +;;; describe me +(defun fst-encoding (type) + (or (encoding type) *default-foreign-encoding*)) + +;;; Display the encoding when printing a FOREIGN-STRING-TYPE instance. +(defmethod print-object ((type foreign-string-type) stream) + (print-unreadable-object (type stream :type t) + (format stream "~S" (fst-encoding type)))) + +(defmethod translate-to-foreign ((s string) (type foreign-string-type)) + (values (foreign-string-alloc s :encoding (fst-encoding type)) + (fst-free-to-foreign-p type))) + +(defmethod translate-to-foreign (obj (type foreign-string-type)) + (cond + ((pointerp obj) + (values obj nil)) + ;; FIXME: we used to support UB8 vectors but not anymore. + ;; ((typep obj '(array (unsigned-byte 8))) + ;; (values (foreign-string-alloc obj) t)) + (t (error "~A is not a Lisp string or pointer." obj)))) + +(defmethod translate-from-foreign (ptr (type foreign-string-type)) + (unwind-protect + (values (foreign-string-to-lisp ptr :encoding (fst-encoding type))) + (when (fst-free-from-foreign-p type) + (foreign-free ptr)))) + +(defmethod free-translated-object (ptr (type foreign-string-type) free-p) + (when free-p + (foreign-string-free ptr))) + +(defmethod expand-to-foreign-dyn-indirect + (value var body (type foreign-string-type)) + (alexandria:with-gensyms (str) + (expand-to-foreign-dyn + value + str + (list + (expand-to-foreign-dyn-indirect str var body (parse-type :pointer))) + type))) + +;;;# STRING+PTR + +(define-foreign-type foreign-string+ptr-type (foreign-string-type) + () + (:simple-parser :string+ptr)) + +(defmethod translate-from-foreign (value (type foreign-string+ptr-type)) + (list (call-next-method) value)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/structures.lisp b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/structures.lisp new file mode 100644 index 0000000..315d4b6 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/structures.lisp @@ -0,0 +1,133 @@ +;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- +;;; +;;; structures.lisp --- Methods for translating foreign structures. +;;; +;;; Copyright (C) 2011, Liam M. Healy +;;; +;;; Permission is hereby granted, free of charge, to any person +;;; obtaining a copy of this software and associated documentation +;;; files (the "Software"), to deal in the Software without +;;; restriction, including without limitation the rights to use, copy, +;;; modify, merge, publish, distribute, sublicense, and/or sell copies +;;; of the Software, and to permit persons to whom the Software is +;;; furnished to do so, subject to the following conditions: +;;; +;;; The above copyright notice and this permission notice shall be +;;; included in all copies or substantial portions of the Software. +;;; +;;; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +;;; EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +;;; MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +;;; NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +;;; HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +;;; WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +;;; OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +;;; DEALINGS IN THE SOFTWARE. +;;; + +(in-package #:cffi) + +;;; Definitions for conversion of foreign structures. + +(defmethod translate-into-foreign-memory ((object list) + (type foreign-struct-type) + p) + (unless (bare-struct-type-p type) + (loop for (name value) on object by #'cddr + do (setf (foreign-slot-value p (unparse-type type) name) + (let ((slot (gethash name (structure-slots type)))) + (convert-to-foreign value (slot-type slot))))))) + +(defmethod translate-to-foreign (value (type foreign-struct-type)) + (let ((ptr (foreign-alloc type))) + (translate-into-foreign-memory value type ptr) + ptr)) + +(defmethod translate-from-foreign (p (type foreign-struct-type)) + ;; Iterate over slots, make plist + (if (bare-struct-type-p type) + p + (let ((plist (list))) + (loop for slot being the hash-value of (structure-slots type) + for name = (slot-name slot) + do (setf (getf plist name) + (foreign-struct-slot-value p slot))) + plist))) + +(defmethod free-translated-object (ptr (type foreign-struct-type) freep) + (unless (bare-struct-type-p type) + ;; Look for any pointer slots and free them first + (loop for slot being the hash-value of (structure-slots type) + when (and (listp (slot-type slot)) (eq (first (slot-type slot)) :pointer)) + do + ;; Free if the pointer is to a specific type, not generic :pointer + (free-translated-object + (foreign-slot-value ptr type (slot-name slot)) + (rest (slot-type slot)) + freep)) + (foreign-free ptr))) + +(defmacro define-translation-method ((object type method) &body body) + "Define a translation method for the foreign structure type; 'method is one of :into, :from, or :to, meaning relation to foreign memory. If :into, the variable 'pointer is the foreign pointer. Note: type must be defined and loaded before this macro is expanded, and just the bare name (without :struct) should be specified." + (let ((tclass (class-name (class-of (cffi::parse-type `(:struct ,type)))))) + (when (eq tclass 'foreign-struct-type) + (error "Won't replace existing translation method for foreign-struct-type")) + `(defmethod + ,(case method + (:into 'translate-into-foreign-memory) + (:from 'translate-from-foreign) + (:to 'translate-to-foreign)) + ;; Arguments to the method + (,object + (type ,tclass) + ,@(when (eq method :into) '(pointer))) ; is intentional variable capture a good idea? + ;; The body + (declare (ignorable type)) ; I can't think of a reason why you'd want to use this + ,@body))) + +(defmacro translation-forms-for-class (class type-class) + "Make forms for translation of foreign structures to and from a standard class. The class slots are assumed to have the same name as the foreign structure." + ;; Possible improvement: optional argument to map structure slot names to/from class slot names. + `(progn + (defmethod translate-from-foreign (pointer (type ,type-class)) + ;; Make the instance from the plist + (apply 'make-instance ',class (call-next-method))) + (defmethod translate-into-foreign-memory ((object ,class) (type ,type-class) pointer) + (call-next-method + ;; Translate into a plist and call the general method + (loop for slot being the hash-value of (structure-slots type) + for name = (slot-name slot) + append (list slot-name (slot-value object slot-name))) + type + pointer)))) + +;;; For a class already defined and loaded, and a defcstruct already defined, use +;;; (translation-forms-for-class class type-class) +;;; to connnect the two. It would be nice to have a macro to do all three simultaneously. +;;; (defmacro define-foreign-structure (class )) + +#| +(defmacro define-structure-conversion + (value-symbol type lisp-class slot-names to-form from-form &optional (struct-name type)) + "Define the functions necessary to convert to and from a foreign structure. The to-form sets each of the foreign slots in succession, assume the foreign object exists. The from-form creates the Lisp object, making it with the correct value by reference to foreign slots." + `(flet ((map-slots (fn val) + (maphash + (lambda (name slot-struct) + (funcall fn (foreign-slot-value val ',type name) (slot-type slot-struct))) + (slots (follow-typedefs (parse-type ',type)))))) + ;; Convert this to a separate function so it doesn't have to be recomputed on the fly each time. + (defmethod translate-to-foreign ((,value-symbol ,lisp-class) (type ,type)) + (let ((p (foreign-alloc ',struct-name))) + ;;(map-slots #'translate-to-foreign ,value-symbol) ; recursive translation of slots + (with-foreign-slots (,slot-names p ,struct-name) + ,to-form) + (values p t))) ; second value is passed to FREE-TRANSLATED-OBJECT + (defmethod free-translated-object (,value-symbol (p ,type) freep) + (when freep + ;; Is this redundant? + (map-slots #'free-translated-object value) ; recursively free slots + (foreign-free ,value-symbol))) + (defmethod translate-from-foreign (,value-symbol (type ,type)) + (with-foreign-slots (,slot-names ,value-symbol ,struct-name) + ,from-form)))) +|# diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/types.lisp b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/types.lisp new file mode 100644 index 0000000..6863958 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/types.lisp @@ -0,0 +1,1051 @@ +;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- +;;; +;;; types.lisp --- User-defined CFFI types. +;;; +;;; Copyright (C) 2005-2006, James Bielman +;;; Copyright (C) 2005-2007, Luis Oliveira +;;; +;;; Permission is hereby granted, free of charge, to any person +;;; obtaining a copy of this software and associated documentation +;;; files (the "Software"), to deal in the Software without +;;; restriction, including without limitation the rights to use, copy, +;;; modify, merge, publish, distribute, sublicense, and/or sell copies +;;; of the Software, and to permit persons to whom the Software is +;;; furnished to do so, subject to the following conditions: +;;; +;;; The above copyright notice and this permission notice shall be +;;; included in all copies or substantial portions of the Software. +;;; +;;; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +;;; EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +;;; MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +;;; NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +;;; HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +;;; WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +;;; OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +;;; DEALINGS IN THE SOFTWARE. +;;; + +(in-package #:cffi) + +;;;# Built-In Types + +;; NOTE: In the C standard there's a "signed-char": +;; https://stackoverflow.com/questions/436513/char-signed-char-char-unsigned-char +;; and "char" may be either signed or unsigned, i.e. treating it as a small int +;; is not wise. At the level of CFFI we can safely ignore this and assume that +;; :char is mapped to "signed-char" by the CL implementation under us. +(define-built-in-foreign-type :char) +(define-built-in-foreign-type :unsigned-char) +(define-built-in-foreign-type :short) +(define-built-in-foreign-type :unsigned-short) +(define-built-in-foreign-type :int) +(define-built-in-foreign-type :unsigned-int) +(define-built-in-foreign-type :long) +(define-built-in-foreign-type :unsigned-long) +(define-built-in-foreign-type :float) +(define-built-in-foreign-type :double) +(define-built-in-foreign-type :void) + +#-cffi-sys::no-long-long +(progn + (define-built-in-foreign-type :long-long) + (define-built-in-foreign-type :unsigned-long-long)) + +;;; Define emulated LONG-LONG types. Needs checking whether we're +;;; using the right sizes on various platforms. +;;; +;;; A possibly better, certainly faster though more intrusive, +;;; alternative is available here: +;;; +#+cffi-sys::no-long-long +(eval-when (:compile-toplevel :load-toplevel :execute) + (defclass emulated-llong-type (foreign-type) ()) + (defmethod foreign-type-size ((tp emulated-llong-type)) 8) + (defmethod foreign-type-alignment ((tp emulated-llong-type)) + ;; better than assuming that the alignment is 8 + (foreign-type-alignment :long)) + (defmethod aggregatep ((tp emulated-llong-type)) nil) + + (define-foreign-type emulated-llong (emulated-llong-type) + () + (:simple-parser :long-long)) + + (define-foreign-type emulated-ullong (emulated-llong-type) + () + (:simple-parser :unsigned-long-long)) + + (defmethod canonicalize ((tp emulated-llong)) :long-long) + (defmethod unparse-type ((tp emulated-llong)) :long-long) + (defmethod canonicalize ((tp emulated-ullong)) :unsigned-long-long) + (defmethod unparse-type ((tp emulated-ullong)) :unsigned-long-long) + + (defun %emulated-mem-ref-64 (ptr type offset) + (let ((value #+big-endian + (+ (ash (mem-ref ptr :unsigned-long offset) 32) + (mem-ref ptr :unsigned-long (+ offset 4))) + #+little-endian + (+ (mem-ref ptr :unsigned-long offset) + (ash (mem-ref ptr :unsigned-long (+ offset 4)) 32)))) + (if (and (eq type :long-long) (logbitp 63 value)) + (lognot (logxor value #xFFFFFFFFFFFFFFFF)) + value))) + + (defun %emulated-mem-set-64 (value ptr type offset) + (when (and (eq type :long-long) (minusp value)) + (setq value (lognot (logxor value #xFFFFFFFFFFFFFFFF)))) + (%mem-set (ldb (byte 32 0) value) ptr :unsigned-long + #+big-endian (+ offset 4) #+little-endian offset) + (%mem-set (ldb (byte 32 32) value) ptr :unsigned-long + #+big-endian offset #+little-endian (+ offset 4)) + value)) + +;;; When some lisp other than SCL supports :long-double we should +;;; use #-cffi-sys::no-long-double here instead. +#+(and scl long-float) (define-built-in-foreign-type :long-double) + +(defparameter *possible-float-types* '(:float :double :long-double)) + +(defparameter *other-builtin-types* '(:pointer :void) + "List of types other than integer or float built in to CFFI.") + +(defparameter *built-in-integer-types* + (set-difference + cffi:*built-in-foreign-types* + (append *possible-float-types* *other-builtin-types*)) + "List of integer types supported by CFFI.") + +(defparameter *built-in-float-types* + (set-difference + cffi:*built-in-foreign-types* + (append *built-in-integer-types* *other-builtin-types*)) + "List of real float types supported by CFFI.") + +;;;# Foreign Pointers + +(define-modify-macro incf-pointer (&optional (offset 1)) inc-pointer) + +(defun mem-ref (ptr type &optional (offset 0)) + "Return the value of TYPE at OFFSET bytes from PTR. If TYPE is aggregate, +we don't return its 'value' but a pointer to it, which is PTR itself." + (let* ((parsed-type (parse-type type)) + (ctype (canonicalize parsed-type))) + #+cffi-sys::no-long-long + (when (member ctype '(:long-long :unsigned-long-long)) + (return-from mem-ref + (translate-from-foreign (%emulated-mem-ref-64 ptr ctype offset) + parsed-type))) + ;; normal branch + (if (aggregatep parsed-type) + (if (bare-struct-type-p parsed-type) + (inc-pointer ptr offset) + (translate-from-foreign (inc-pointer ptr offset) parsed-type)) + (translate-from-foreign (%mem-ref ptr ctype offset) parsed-type)))) + +(define-compiler-macro mem-ref (&whole form ptr type &optional (offset 0)) + "Compiler macro to open-code MEM-REF when TYPE is constant." + (if (constantp type) + (let* ((parsed-type (parse-type (eval type))) + (ctype (canonicalize parsed-type))) + ;; Bail out when using emulated long long types. + #+cffi-sys::no-long-long + (when (member ctype '(:long-long :unsigned-long-long)) + (return-from mem-ref form)) + (if (aggregatep parsed-type) + (if (bare-struct-type-p parsed-type) + `(inc-pointer ,ptr ,offset) + (expand-from-foreign `(inc-pointer ,ptr ,offset) parsed-type)) + (expand-from-foreign `(%mem-ref ,ptr ,ctype ,offset) parsed-type))) + form)) + +(defun mem-set (value ptr type &optional (offset 0)) + "Set the value of TYPE at OFFSET bytes from PTR to VALUE." + (let* ((ptype (parse-type type)) + (ctype (canonicalize ptype))) + #+cffi-sys::no-long-long + (when (or (eq ctype :long-long) (eq ctype :unsigned-long-long)) + (return-from mem-set + (%emulated-mem-set-64 (translate-to-foreign value ptype) + ptr ctype offset))) + (if (aggregatep ptype) ; XXX: backwards incompatible? + (translate-into-foreign-memory value ptype (inc-pointer ptr offset)) + (%mem-set (translate-to-foreign value ptype) ptr ctype offset)))) + +(define-setf-expander mem-ref (ptr type &optional (offset 0) &environment env) + "SETF expander for MEM-REF that doesn't rebind TYPE. +This is necessary for the compiler macro on MEM-SET to be able +to open-code (SETF MEM-REF) forms." + (multiple-value-bind (dummies vals newval setter getter) + (get-setf-expansion ptr env) + (declare (ignore setter newval)) + ;; if either TYPE or OFFSET are constant, we avoid rebinding them + ;; so that the compiler macros on MEM-SET and %MEM-SET work. + (with-unique-names (store type-tmp offset-tmp) + (values + (append (unless (constantp type) (list type-tmp)) + (unless (constantp offset) (list offset-tmp)) + dummies) + (append (unless (constantp type) (list type)) + (unless (constantp offset) (list offset)) + vals) + (list store) + `(progn + (mem-set ,store ,getter + ,@(if (constantp type) (list type) (list type-tmp)) + ,@(if (constantp offset) (list offset) (list offset-tmp))) + ,store) + `(mem-ref ,getter + ,@(if (constantp type) (list type) (list type-tmp)) + ,@(if (constantp offset) (list offset) (list offset-tmp))))))) + +(define-compiler-macro mem-set + (&whole form value ptr type &optional (offset 0)) + "Compiler macro to open-code (SETF MEM-REF) when type is constant." + (if (constantp type) + (let* ((parsed-type (parse-type (eval type))) + (ctype (canonicalize parsed-type))) + ;; Bail out when using emulated long long types. + #+cffi-sys::no-long-long + (when (member ctype '(:long-long :unsigned-long-long)) + (return-from mem-set form)) + (if (aggregatep parsed-type) + (expand-into-foreign-memory + value parsed-type `(inc-pointer ,ptr ,offset)) + `(%mem-set ,(expand-to-foreign value parsed-type) + ,ptr ,ctype ,offset))) + form)) + +;;;# Dereferencing Foreign Arrays + +;;; Maybe this should be named MEM-SVREF? [2007-02-28 LO] +(defun mem-aref (ptr type &optional (index 0)) + "Like MEM-REF except for accessing 1d arrays." + (mem-ref ptr type (* index (foreign-type-size type)))) + +(define-compiler-macro mem-aref (&whole form ptr type &optional (index 0)) + "Compiler macro to open-code MEM-AREF when TYPE (and eventually INDEX)." + (if (constantp type) + (if (constantp index) + `(mem-ref ,ptr ,type + ,(* (eval index) (foreign-type-size (eval type)))) + `(mem-ref ,ptr ,type (* ,index ,(foreign-type-size (eval type))))) + form)) + +(define-setf-expander mem-aref (ptr type &optional (index 0) &environment env) + "SETF expander for MEM-AREF." + (multiple-value-bind (dummies vals newval setter getter) + (get-setf-expansion ptr env) + (declare (ignore setter newval)) + ;; we avoid rebinding type and index, if possible (and if type is not + ;; constant, we don't bother about the index), so that the compiler macros + ;; on MEM-SET or %MEM-SET can work. + (with-unique-names (store type-tmp index-tmp) + (values + (append (unless (constantp type) + (list type-tmp)) + (unless (and (constantp type) (constantp index)) + (list index-tmp)) + dummies) + (append (unless (constantp type) + (list type)) + (unless (and (constantp type) (constantp index)) + (list index)) + vals) + (list store) + ;; Here we'll try to calculate the offset from the type and index, + ;; or if not possible at least get the type size early. + `(progn + ,(if (constantp type) + (if (constantp index) + `(mem-set ,store ,getter ,type + ,(* (eval index) (foreign-type-size (eval type)))) + `(mem-set ,store ,getter ,type + (* ,index-tmp ,(foreign-type-size (eval type))))) + `(mem-set ,store ,getter ,type-tmp + (* ,index-tmp (foreign-type-size ,type-tmp)))) + ,store) + `(mem-aref ,getter + ,@(if (constantp type) + (list type) + (list type-tmp)) + ,@(if (and (constantp type) (constantp index)) + (list index) + (list index-tmp))))))) + +(defmethod translate-into-foreign-memory + (value (type foreign-pointer-type) pointer) + (setf (mem-aref pointer :pointer) value)) + +(defmethod translate-into-foreign-memory + (value (type foreign-built-in-type) pointer) + (setf (mem-aref pointer (unparse-type type)) value)) + +(defun mem-aptr (ptr type &optional (index 0)) + "The pointer to the element." + (inc-pointer ptr (* index (foreign-type-size type)))) + +(define-compiler-macro mem-aptr (&whole form ptr type &optional (index 0)) + "The pointer to the element." + (cond ((not (constantp type)) + form) + ((not (constantp index)) + `(inc-pointer ,ptr (* ,index ,(foreign-type-size (eval type))))) + ((zerop (eval index)) + ptr) + (t + `(inc-pointer ,ptr ,(* (eval index) + (foreign-type-size (eval type))))))) + +(define-foreign-type foreign-array-type () + ((dimensions :reader dimensions :initarg :dimensions) + (element-type :reader element-type :initarg :element-type)) + (:actual-type :pointer)) + +(defmethod aggregatep ((type foreign-array-type)) + t) + +(defmethod print-object ((type foreign-array-type) stream) + "Print a FOREIGN-ARRAY-TYPE instance to STREAM unreadably." + (print-unreadable-object (type stream :type t :identity nil) + (format stream "~S ~S" (element-type type) (dimensions type)))) + +(defun array-element-size (array-type) + (foreign-type-size (element-type array-type))) + +(defmethod foreign-type-size ((type foreign-array-type)) + (* (array-element-size type) (reduce #'* (dimensions type)))) + +(defmethod foreign-type-alignment ((type foreign-array-type)) + (foreign-type-alignment (element-type type))) + +(define-parse-method :array (element-type &rest dimensions) + (assert (plusp (length dimensions))) + (make-instance 'foreign-array-type + :element-type element-type + :dimensions dimensions)) + +(defun indexes-to-row-major-index (dimensions &rest subscripts) + (apply #'+ (maplist (lambda (x y) + (* (car x) (apply #'* (cdr y)))) + subscripts + dimensions))) + +(defun row-major-index-to-indexes (index dimensions) + (loop with idx = index + with rank = (length dimensions) + with indexes = (make-list rank) + for dim-index from (- rank 1) downto 0 do + (setf (values idx (nth dim-index indexes)) + (floor idx (nth dim-index dimensions))) + finally (return indexes))) + +(defun foreign-alloc (type &key (initial-element nil initial-element-p) + (initial-contents nil initial-contents-p) + (count 1 count-p) null-terminated-p) + "Allocate enough memory to hold COUNT objects of type TYPE. If +INITIAL-ELEMENT is supplied, each element of the newly allocated +memory is initialized with its value. If INITIAL-CONTENTS is supplied, +each of its elements will be used to initialize the contents of the +newly allocated memory." + (let (contents-length) + ;; Some error checking, etc... + (when (and null-terminated-p + (not (eq (canonicalize-foreign-type type) :pointer))) + (error "Cannot use :NULL-TERMINATED-P with non-pointer types.")) + (when (and initial-element-p initial-contents-p) + (error "Cannot specify both :INITIAL-ELEMENT and :INITIAL-CONTENTS")) + (when initial-contents-p + (setq contents-length (length initial-contents)) + (if count-p + (assert (>= count contents-length)) + (setq count contents-length))) + ;; Everything looks good. + (let ((ptr (%foreign-alloc (* (foreign-type-size type) + (if null-terminated-p (1+ count) count))))) + (when initial-element-p + (dotimes (i count) + (setf (mem-aref ptr type i) initial-element))) + (when initial-contents-p + (dotimes (i contents-length) + (setf (mem-aref ptr type i) (elt initial-contents i)))) + (when null-terminated-p + (setf (mem-aref ptr :pointer count) (null-pointer))) + ptr))) + +;;; Simple compiler macro that kicks in when TYPE is constant and only +;;; the COUNT argument is passed. (Note: hard-coding the type's size +;;; into the fasl will likely break CLISP fasl cross-platform +;;; compatibilty.) +(define-compiler-macro foreign-alloc (&whole form type &rest args + &key (count 1 count-p) &allow-other-keys) + (if (or (and count-p (<= (length args) 2)) (null args)) + (cond + ((and (constantp type) (constantp count)) + `(%foreign-alloc ,(* (eval count) (foreign-type-size (eval type))))) + ((constantp type) + `(%foreign-alloc (* ,count ,(foreign-type-size (eval type))))) + (t form)) + form)) + +(defun lisp-array-to-foreign (array pointer array-type) + "Copy elements from a Lisp array to POINTER. ARRAY-TYPE must be a CFFI array +type." + (let* ((type (ensure-parsed-base-type array-type)) + (el-type (element-type type)) + (dimensions (dimensions type))) + (loop with foreign-type-size = (array-element-size type) + with size = (reduce #'* dimensions) + for i from 0 below size + for offset = (* i foreign-type-size) + for element = (apply #'aref array + (row-major-index-to-indexes i dimensions)) + do (setf (mem-ref pointer el-type offset) element)))) + +(defun foreign-array-to-lisp (pointer array-type &rest make-array-args) + "Copy elements from pointer into a Lisp array. ARRAY-TYPE must be a CFFI array +type; the type of the resulting Lisp array can be defined in MAKE-ARRAY-ARGS +that are then passed to MAKE-ARRAY. If POINTER is a null pointer, returns NIL." + (unless (null-pointer-p pointer) + (let* ((type (ensure-parsed-base-type array-type)) + (el-type (element-type type)) + (dimensions (dimensions type)) + (array (apply #'make-array dimensions make-array-args))) + (loop with foreign-type-size = (array-element-size type) + with size = (reduce #'* dimensions) + for i from 0 below size + for offset = (* i foreign-type-size) + for element = (mem-ref pointer el-type offset) + do (setf (apply #'aref array + (row-major-index-to-indexes i dimensions)) + element)) + array))) + +(defun foreign-array-alloc (array array-type) + "Allocate a foreign array containing the elements of lisp array. +The foreign array must be freed with foreign-array-free." + (check-type array array) + (let* ((type (ensure-parsed-base-type array-type)) + (ptr (foreign-alloc (element-type type) + :count (reduce #'* (dimensions type))))) + (lisp-array-to-foreign array ptr array-type) + ptr)) + +(defun foreign-array-free (ptr) + "Free a foreign array allocated by foreign-array-alloc." + (foreign-free ptr)) + +(defmacro with-foreign-array ((var lisp-array array-type) &body body) + "Bind var to a foreign array containing lisp-array elements in body." + (with-unique-names (type) + `(let ((,type (ensure-parsed-base-type ,array-type))) + (with-foreign-pointer (,var (* (reduce #'* (dimensions ,type)) + (array-element-size ,type))) + (lisp-array-to-foreign ,lisp-array ,var ,array-type) + ,@body)))) + +(defun foreign-aref (ptr array-type &rest indexes) + (let* ((type (ensure-parsed-base-type array-type)) + (offset (* (array-element-size type) + (apply #'indexes-to-row-major-index + (dimensions type) indexes)))) + (mem-ref ptr (element-type type) offset))) + +(defun (setf foreign-aref) (value ptr array-type &rest indexes) + (let* ((type (ensure-parsed-base-type array-type)) + (offset (* (array-element-size type) + (apply #'indexes-to-row-major-index + (dimensions type) indexes)))) + (setf (mem-ref ptr (element-type type) offset) value))) + +;;; Automatic translations for the :ARRAY type. Notice that these +;;; translators will also invoke the appropriate translators for for +;;; each of the array's elements since that's the normal behaviour of +;;; the FOREIGN-ARRAY-* operators, but there's a FIXME: **it doesn't +;;; free them yet** + +;;; This used to be in a separate type but let's experiment with just +;;; one type for a while. [2008-12-30 LO] + +;;; FIXME: those ugly invocations of UNPARSE-TYPE suggest that these +;;; foreign array operators should take the type and dimention +;;; arguments "unboxed". [2008-12-31 LO] + +(defmethod translate-to-foreign (array (type foreign-array-type)) + (foreign-array-alloc array (unparse-type type))) + +(defmethod translate-aggregate-to-foreign (ptr value (type foreign-array-type)) + (lisp-array-to-foreign value ptr (unparse-type type))) + +(defmethod translate-from-foreign (pointer (type foreign-array-type)) + (foreign-array-to-lisp pointer (unparse-type type))) + +(defmethod free-translated-object (pointer (type foreign-array-type) param) + (declare (ignore param)) + (foreign-array-free pointer)) + +;;;# Foreign Structures + +;;;## Foreign Structure Slots + +(defgeneric foreign-struct-slot-pointer (ptr slot) + (:documentation + "Get the address of SLOT relative to PTR.")) + +(defgeneric foreign-struct-slot-pointer-form (ptr slot) + (:documentation + "Return a form to get the address of SLOT in PTR.")) + +(defgeneric foreign-struct-slot-value (ptr slot) + (:documentation + "Return the value of SLOT in structure PTR.")) + +(defgeneric (setf foreign-struct-slot-value) (value ptr slot) + (:documentation + "Set the value of a SLOT in structure PTR.")) + +(defgeneric foreign-struct-slot-value-form (ptr slot) + (:documentation + "Return a form to get the value of SLOT in struct PTR.")) + +(defgeneric foreign-struct-slot-set-form (value ptr slot) + (:documentation + "Return a form to set the value of SLOT in struct PTR.")) + +(defclass foreign-struct-slot () + ((name :initarg :name :reader slot-name) + (offset :initarg :offset :accessor slot-offset) + ;; FIXME: the type should probably be parsed? + (type :initarg :type :accessor slot-type)) + (:documentation "Base class for simple and aggregate slots.")) + +(defmethod foreign-struct-slot-pointer (ptr (slot foreign-struct-slot)) + "Return the address of SLOT relative to PTR." + (inc-pointer ptr (slot-offset slot))) + +(defmethod foreign-struct-slot-pointer-form (ptr (slot foreign-struct-slot)) + "Return a form to get the address of SLOT relative to PTR." + (let ((offset (slot-offset slot))) + (if (zerop offset) + ptr + `(inc-pointer ,ptr ,offset)))) + +(defun foreign-slot-names (type) + "Returns a list of TYPE's slot names in no particular order." + (loop for value being the hash-values + in (slots (ensure-parsed-base-type type)) + collect (slot-name value))) + +;;;### Simple Slots + +(defclass simple-struct-slot (foreign-struct-slot) + () + (:documentation "Non-aggregate structure slots.")) + +(defmethod foreign-struct-slot-value (ptr (slot simple-struct-slot)) + "Return the value of a simple SLOT from a struct at PTR." + (mem-ref ptr (slot-type slot) (slot-offset slot))) + +(defmethod foreign-struct-slot-value-form (ptr (slot simple-struct-slot)) + "Return a form to get the value of a slot from PTR." + `(mem-ref ,ptr ',(slot-type slot) ,(slot-offset slot))) + +(defmethod (setf foreign-struct-slot-value) (value ptr (slot simple-struct-slot)) + "Set the value of a simple SLOT to VALUE in PTR." + (setf (mem-ref ptr (slot-type slot) (slot-offset slot)) value)) + +(defmethod foreign-struct-slot-set-form (value ptr (slot simple-struct-slot)) + "Return a form to set the value of a simple structure slot." + `(setf (mem-ref ,ptr ',(slot-type slot) ,(slot-offset slot)) ,value)) + +;;;### Aggregate Slots + +(defclass aggregate-struct-slot (foreign-struct-slot) + ((count :initarg :count :accessor slot-count)) + (:documentation "Aggregate structure slots.")) + +;;; Since MEM-REF returns a pointer for struct types we are able to +;;; chain together slot names when accessing slot values in nested +;;; structures. +(defmethod foreign-struct-slot-value (ptr (slot aggregate-struct-slot)) + "Return a pointer to SLOT relative to PTR." + (convert-from-foreign (inc-pointer ptr (slot-offset slot)) + (slot-type slot))) + +(defmethod foreign-struct-slot-value-form (ptr (slot aggregate-struct-slot)) + "Return a form to get the value of SLOT relative to PTR." + `(convert-from-foreign (inc-pointer ,ptr ,(slot-offset slot)) + ',(slot-type slot))) + +(defmethod translate-aggregate-to-foreign (ptr value (type foreign-struct-type)) + ;;; FIXME: use the block memory interface instead. + (loop for i below (foreign-type-size type) + do (%mem-set (%mem-ref value :char i) ptr :char i))) + +(defmethod (setf foreign-struct-slot-value) + (value ptr (slot aggregate-struct-slot)) + "Set the value of an aggregate SLOT to VALUE in PTR." + (translate-aggregate-to-foreign (inc-pointer ptr (slot-offset slot)) + value + (parse-type (slot-type slot)))) + +(defmethod foreign-struct-slot-set-form (value ptr (slot aggregate-struct-slot)) + "Return a form to get the value of an aggregate SLOT relative to PTR." + `(translate-aggregate-to-foreign (inc-pointer ,ptr ,(slot-offset slot)) + ,value + ,(parse-type (slot-type slot)))) + +;;;## Defining Foreign Structures + +(defun make-struct-slot (name offset type count) + "Make the appropriate type of structure slot." + ;; If TYPE is an aggregate type or COUNT is >1, create an + ;; AGGREGATE-STRUCT-SLOT, otherwise a SIMPLE-STRUCT-SLOT. + (if (or (> count 1) (aggregatep (parse-type type))) + (make-instance 'aggregate-struct-slot :offset offset :type type + :name name :count count) + (make-instance 'simple-struct-slot :offset offset :type type + :name name))) + +(defun parse-deprecated-struct-type (name struct-or-union) + (check-type struct-or-union (member :struct :union)) + (let* ((struct-type-name `(,struct-or-union ,name)) + (struct-type (parse-type struct-type-name))) + (simple-style-warning + "bare references to struct types are deprecated. ~ + Please use ~S or ~S instead." + `(:pointer ,struct-type-name) struct-type-name) + (make-instance (class-of struct-type) + :alignment (alignment struct-type) + :size (size struct-type) + :slots (slots struct-type) + :name (name struct-type) + :bare t))) + +;;; Regarding structure alignment, the following ABIs were checked: +;;; - System-V ABI: x86, x86-64, ppc, arm, mips and itanium. (more?) +;;; - Mac OS X ABI Function Call Guide: ppc32, ppc64 and x86. +;;; +;;; Rules used here: +;;; +;;; 1. "An entire structure or union object is aligned on the same +;;; boundary as its most strictly aligned member." +;;; +;;; 2. "Each member is assigned to the lowest available offset with +;;; the appropriate alignment. This may require internal +;;; padding, depending on the previous member." +;;; +;;; 3. "A structure's size is increased, if necessary, to make it a +;;; multiple of the alignment. This may require tail padding, +;;; depending on the last member." +;;; +;;; Special cases from darwin/ppc32's ABI: +;;; http://developer.apple.com/documentation/DeveloperTools/Conceptual/LowLevelABI/index.html +;;; +;;; 4. "The embedding alignment of the first element in a data +;;; structure is equal to the element's natural alignment." +;;; +;;; 5. "For subsequent elements that have a natural alignment +;;; greater than 4 bytes, the embedding alignment is 4, unless +;;; the element is a vector." (note: this applies for +;;; structures too) + +;; FIXME: get a better name for this. --luis +(defun get-alignment (type alignment-type firstp) + "Return alignment for TYPE according to ALIGNMENT-TYPE." + (declare (ignorable firstp)) + (ecase alignment-type + (:normal #-(and darwin ppc) + (foreign-type-alignment type) + #+(and darwin ppc) + (if firstp + (foreign-type-alignment type) + (min 4 (foreign-type-alignment type)))))) + +(defun adjust-for-alignment (type offset alignment-type firstp) + "Return OFFSET aligned properly for TYPE according to ALIGNMENT-TYPE." + (let* ((align (get-alignment type alignment-type firstp)) + (rem (mod offset align))) + (if (zerop rem) + offset + (+ offset (- align rem))))) + +(defmacro with-tentative-type-definition ((name value namespace) &body body) + (once-only (name namespace) + `(unwind-protect-case () + (progn + (notice-foreign-type ,name ,value ,namespace) + ,@body) + (:abort (undefine-foreign-type ,name ,namespace))))) + +(defun notice-foreign-struct-definition (name options slots) + "Parse and install a foreign structure definition." + (destructuring-bind (&key size (class 'foreign-struct-type)) + options + (let ((struct (make-instance class :name name)) + (current-offset 0) + (max-align 1) + (firstp t)) + (with-tentative-type-definition (name struct :struct) + ;; determine offsets + (dolist (slotdef slots) + (destructuring-bind (slotname type &key (count 1) offset) slotdef + (when (eq (canonicalize-foreign-type type) :void) + (simple-foreign-type-error type :struct + "In struct ~S: void type not allowed in field ~S" + name slotdef)) + (setq current-offset + (or offset + (adjust-for-alignment type current-offset :normal firstp))) + (let* ((slot (make-struct-slot slotname current-offset type count)) + (align (get-alignment (slot-type slot) :normal firstp))) + (setf (gethash slotname (slots struct)) slot) + (when (> align max-align) + (setq max-align align))) + (incf current-offset (* count (foreign-type-size type)))) + (setq firstp nil)) + ;; calculate padding and alignment + (setf (alignment struct) max-align) ; See point 1 above. + (let ((tail-padding (- max-align (rem current-offset max-align)))) + (unless (= tail-padding max-align) ; See point 3 above. + (incf current-offset tail-padding))) + (setf (size struct) (or size current-offset)))))) + +(defun generate-struct-accessors (name conc-name slot-names) + (loop with pointer-arg = (symbolicate '#:pointer-to- name) + for slot in slot-names + for accessor = (symbolicate conc-name slot) + collect `(defun ,accessor (,pointer-arg) + (foreign-slot-value ,pointer-arg '(:struct ,name) ',slot)) + collect `(defun (setf ,accessor) (value ,pointer-arg) + (foreign-slot-set value ,pointer-arg '(:struct ,name) ',slot)))) + +(define-parse-method :struct (name) + (funcall (find-type-parser name :struct))) + +(defvar *defcstruct-hook* nil) + +(defmacro defcstruct (name-and-options &body fields) + "Define the layout of a foreign structure." + (discard-docstring fields) + (destructuring-bind (name . options) + (ensure-list name-and-options) + (let ((conc-name (getf options :conc-name))) + (remf options :conc-name) + (unless (getf options :class) (setf (getf options :class) (symbolicate name '-tclass))) + `(eval-when (:compile-toplevel :load-toplevel :execute) + ;; m-f-s-t could do with this with mop:ensure-class. + ,(when-let (class (getf options :class)) + `(defclass ,class (foreign-struct-type + translatable-foreign-type) + ())) + (notice-foreign-struct-definition ',name ',options ',fields) + ,@(when conc-name + (generate-struct-accessors name conc-name + (mapcar #'car fields))) + ,@(when *defcstruct-hook* + ;; If non-nil, *defcstruct-hook* should be a function + ;; of the arguments that returns NIL or a list of + ;; forms to include in the expansion. + (apply *defcstruct-hook* name-and-options fields)) + (define-parse-method ,name () + (parse-deprecated-struct-type ',name :struct)) + '(:struct ,name))))) + +;;;## Accessing Foreign Structure Slots + +(defun get-slot-info (type slot-name) + "Return the slot info for SLOT-NAME or raise an error." + (let* ((struct (ensure-parsed-base-type type)) + (info (gethash slot-name (slots struct)))) + (unless info + (simple-foreign-type-error type :struct + "Undefined slot ~A in foreign type ~A." + slot-name type)) + info)) + +(defun foreign-slot-pointer (ptr type slot-name) + "Return the address of SLOT-NAME in the structure at PTR." + (foreign-struct-slot-pointer ptr (get-slot-info type slot-name))) + +(define-compiler-macro foreign-slot-pointer (&whole whole ptr type slot-name) + (if (and (constantp type) (constantp slot-name)) + (foreign-struct-slot-pointer-form + ptr (get-slot-info (eval type) (eval slot-name))) + whole)) + +(defun foreign-slot-type (type slot-name) + "Return the type of SLOT in a struct TYPE." + (slot-type (get-slot-info type slot-name))) + +(defun foreign-slot-offset (type slot-name) + "Return the offset of SLOT in a struct TYPE." + (slot-offset (get-slot-info type slot-name))) + +(defun foreign-slot-count (type slot-name) + "Return the number of items in SLOT in a struct TYPE." + (slot-count (get-slot-info type slot-name))) + +(defun foreign-slot-value (ptr type slot-name) + "Return the value of SLOT-NAME in the foreign structure at PTR." + (foreign-struct-slot-value ptr (get-slot-info type slot-name))) + +(define-compiler-macro foreign-slot-value (&whole form ptr type slot-name) + "Optimizer for FOREIGN-SLOT-VALUE when TYPE is constant." + (if (and (constantp type) (constantp slot-name)) + (foreign-struct-slot-value-form + ptr (get-slot-info (eval type) (eval slot-name))) + form)) + +(define-setf-expander foreign-slot-value (ptr type slot-name &environment env) + "SETF expander for FOREIGN-SLOT-VALUE." + (multiple-value-bind (dummies vals newval setter getter) + (get-setf-expansion ptr env) + (declare (ignore setter newval)) + (if (and (constantp type) (constantp slot-name)) + ;; if TYPE and SLOT-NAME are constant we avoid rebinding them + ;; so that the compiler macro on FOREIGN-SLOT-SET works. + (with-unique-names (store) + (values + dummies + vals + (list store) + `(progn + (foreign-slot-set ,store ,getter ,type ,slot-name) + ,store) + `(foreign-slot-value ,getter ,type ,slot-name))) + ;; if not... + (with-unique-names (store slot-name-tmp type-tmp) + (values + (list* type-tmp slot-name-tmp dummies) + (list* type slot-name vals) + (list store) + `(progn + (foreign-slot-set ,store ,getter ,type-tmp ,slot-name-tmp) + ,store) + `(foreign-slot-value ,getter ,type-tmp ,slot-name-tmp)))))) + +(defun foreign-slot-set (value ptr type slot-name) + "Set the value of SLOT-NAME in a foreign structure." + (setf (foreign-struct-slot-value ptr (get-slot-info type slot-name)) value)) + +(define-compiler-macro foreign-slot-set + (&whole form value ptr type slot-name) + "Optimizer when TYPE and SLOT-NAME are constant." + (if (and (constantp type) (constantp slot-name)) + (foreign-struct-slot-set-form + value ptr (get-slot-info (eval type) (eval slot-name))) + form)) + +(defmacro with-foreign-slots ((vars ptr type) &body body) + "Create local symbol macros for each var in VARS to reference +foreign slots in PTR of TYPE. Similar to WITH-SLOTS. +Each var can be of the form: slot-name - in which case slot-name will +be bound to the value of the slot or: (:pointer slot-name) - in which +case slot-name will be bound to the pointer to that slot." + (let ((ptr-var (gensym "PTR"))) + `(let ((,ptr-var ,ptr)) + (symbol-macrolet + ,(loop :for var :in vars + :collect + (if (listp var) + (if (eq (first var) :pointer) + `(,(second var) (foreign-slot-pointer + ,ptr-var ',type ',(second var))) + (error + "Malformed slot specification ~a; must be:`name' or `(:pointer name)'" + var)) + `(,var (foreign-slot-value ,ptr-var ',type ',var)))) + ,@body)))) + +;;; We could add an option to define a struct instead of a class, in +;;; the unlikely event someone needs something like that. +(defmacro define-c-struct-wrapper (class-and-type supers &optional slots) + "Define a new class with CLOS slots matching those of a foreign +struct type. An INITIALIZE-INSTANCE method is defined which +takes a :POINTER initarg that is used to store the slots of a +foreign object. This pointer is only used for initialization and +it is not retained. + +CLASS-AND-TYPE is either a list of the form (class-name +struct-type) or a single symbol naming both. The class will +inherit SUPERS. If a list of SLOTS is specified, only those +slots will be defined and stored." + (destructuring-bind (class-name &optional (struct-type (list :struct class-name))) + (ensure-list class-and-type) + (let ((slots (or slots (foreign-slot-names struct-type)))) + `(progn + (defclass ,class-name ,supers + ,(loop for slot in slots collect + `(,slot :reader ,(format-symbol t "~A-~A" class-name slot)))) + ;; This could be done in a parent class by using + ;; FOREIGN-SLOT-NAMES when instantiating but then the compiler + ;; macros wouldn't kick in. + (defmethod initialize-instance :after ((inst ,class-name) &key pointer) + (with-foreign-slots (,slots pointer ,struct-type) + ,@(loop for slot in slots collect + `(setf (slot-value inst ',slot) ,slot)))) + ',class-name)))) + +;;;# Foreign Unions +;;; +;;; A union is a subclass of FOREIGN-STRUCT-TYPE in which all slots +;;; have an offset of zero. + +;;; See also the notes regarding ABI requirements in +;;; NOTICE-FOREIGN-STRUCT-DEFINITION +(defun notice-foreign-union-definition (name-and-options slots) + "Parse and install a foreign union definition." + (destructuring-bind (name &key size) + (ensure-list name-and-options) + (let ((union (make-instance 'foreign-union-type :name name)) + (max-size 0) + (max-align 0)) + (with-tentative-type-definition (name union :union) + (dolist (slotdef slots) + (destructuring-bind (slotname type &key (count 1)) slotdef + (when (eq (canonicalize-foreign-type type) :void) + (simple-foreign-type-error name :struct + "In union ~S: void type not allowed in field ~S" + name slotdef)) + (let* ((slot (make-struct-slot slotname 0 type count)) + (size (* count (foreign-type-size type))) + (align (foreign-type-alignment (slot-type slot)))) + (setf (gethash slotname (slots union)) slot) + (when (> size max-size) + (setf max-size size)) + (when (> align max-align) + (setf max-align align))))) + (setf (size union) (or size max-size)) + (setf (alignment union) max-align))))) + +(define-parse-method :union (name) + (funcall (find-type-parser name :union))) + +(defmacro defcunion (name-and-options &body fields) + "Define the layout of a foreign union." + (discard-docstring fields) + (destructuring-bind (name &key size) + (ensure-list name-and-options) + (declare (ignore size)) + `(eval-when (:compile-toplevel :load-toplevel :execute) + (notice-foreign-union-definition ',name-and-options ',fields) + (define-parse-method ,name () + (parse-deprecated-struct-type ',name :union)) + '(:union ,name)))) + +;;;# Operations on Types + +(defmethod foreign-type-alignment (type) + "Return the alignment in bytes of a foreign type." + (foreign-type-alignment (parse-type type))) + +(defmacro with-foreign-object ((var type &optional (count 1)) &body body) + "Bind VAR to a pointer to COUNT objects of TYPE during BODY. +The buffer has dynamic extent and may be stack allocated." + `(with-foreign-pointer + (,var ,(if (constantp type) + ;; with-foreign-pointer may benefit from constant folding: + (if (constantp count) + (* (eval count) (foreign-type-size (eval type))) + `(* ,count ,(foreign-type-size (eval type)))) + `(* ,count (foreign-type-size ,type)))) + ,@body)) + +(defmacro with-foreign-objects (bindings &body body) + (if bindings + `(with-foreign-object ,(car bindings) + (with-foreign-objects ,(cdr bindings) + ,@body)) + `(progn ,@body))) + +;;;## Anonymous Type Translators +;;; +;;; (:wrapper :to-c some-function :from-c another-function) +;;; +;;; TODO: We will need to add a FREE function to this as well I think. +;;; --james + +(define-foreign-type foreign-type-wrapper () + ((to-c :initarg :to-c :reader wrapper-to-c) + (from-c :initarg :from-c :reader wrapper-from-c)) + (:documentation "Wrapper type.")) + +(define-parse-method :wrapper (base-type &key to-c from-c) + (make-instance 'foreign-type-wrapper + :actual-type (parse-type base-type) + :to-c (or to-c 'identity) + :from-c (or from-c 'identity))) + +(defmethod translate-to-foreign (value (type foreign-type-wrapper)) + (translate-to-foreign + (funcall (slot-value type 'to-c) value) (actual-type type))) + +(defmethod translate-from-foreign (value (type foreign-type-wrapper)) + (funcall (slot-value type 'from-c) + (translate-from-foreign value (actual-type type)))) + +;;;# Other types + +;;; Boolean type. Maps to an :int by default. Only accepts integer types. +(define-foreign-type foreign-boolean-type () + ()) + +(define-parse-method :boolean (&optional (base-type :int)) + (make-instance + 'foreign-boolean-type :actual-type + (ecase (canonicalize-foreign-type base-type) + ((:char :unsigned-char :int :unsigned-int :long :unsigned-long + #-cffi-sys::no-long-long :long-long + #-cffi-sys::no-long-long :unsigned-long-long) base-type)))) + +(defmethod translate-to-foreign (value (type foreign-boolean-type)) + (if value 1 0)) + +(defmethod translate-from-foreign (value (type foreign-boolean-type)) + (not (zerop value))) + +(defmethod expand-to-foreign (value (type foreign-boolean-type)) + "Optimization for the :boolean type." + (if (constantp value) + (if (eval value) 1 0) + `(if ,value 1 0))) + +(defmethod expand-from-foreign (value (type foreign-boolean-type)) + "Optimization for the :boolean type." + (if (constantp value) ; very unlikely, heh + (not (zerop (eval value))) + `(not (zerop ,value)))) + +;;; Boolean type that represents C99 _Bool +(defctype :bool (:boolean :char)) + +;;;# Typedefs for built-in types. + +(defctype :uchar :unsigned-char) +(defctype :ushort :unsigned-short) +(defctype :uint :unsigned-int) +(defctype :ulong :unsigned-long) +(defctype :llong :long-long) +(defctype :ullong :unsigned-long-long) + +;;; We try to define the :[u]int{8,16,32,64} types by looking at +;;; the sizes of the built-in integer types and defining typedefs. +(eval-when (:compile-toplevel :load-toplevel :execute) + (macrolet + ((match-types (sized-types mtypes) + `(progn + ,@(loop for (type . size-or-type) in sized-types + for m = (car (member (if (keywordp size-or-type) + (foreign-type-size size-or-type) + size-or-type) + mtypes :key #'foreign-type-size)) + when m collect `(defctype ,type ,m))))) + ;; signed + (match-types ((:int8 . 1) (:int16 . 2) (:int32 . 4) (:int64 . 8) + (:intptr . :pointer)) + (:char :short :int :long :long-long)) + ;; unsigned + (match-types ((:uint8 . 1) (:uint16 . 2) (:uint32 . 4) (:uint64 . 8) + (:uintptr . :pointer)) + (:unsigned-char :unsigned-short :unsigned-int :unsigned-long + :unsigned-long-long)))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/utils.lisp b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/utils.lisp new file mode 100644 index 0000000..6376196 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/src/utils.lisp @@ -0,0 +1,84 @@ +;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- +;;; +;;; utils.lisp --- Various utilities. +;;; +;;; Copyright (C) 2005-2008, Luis Oliveira +;;; +;;; Permission is hereby granted, free of charge, to any person +;;; obtaining a copy of this software and associated documentation +;;; files (the "Software"), to deal in the Software without +;;; restriction, including without limitation the rights to use, copy, +;;; modify, merge, publish, distribute, sublicense, and/or sell copies +;;; of the Software, and to permit persons to whom the Software is +;;; furnished to do so, subject to the following conditions: +;;; +;;; The above copyright notice and this permission notice shall be +;;; included in all copies or substantial portions of the Software. +;;; +;;; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +;;; EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +;;; MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +;;; NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +;;; HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +;;; WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +;;; OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +;;; DEALINGS IN THE SOFTWARE. +;;; + +(in-package #:cffi) + +(defmacro discard-docstring (body-var &optional force) + "Discards the first element of the list in body-var if it's a +string and the only element (or if FORCE is T)." + `(when (and (stringp (car ,body-var)) (or ,force (cdr ,body-var))) + (pop ,body-var))) + +(defun single-bit-p (integer) + "Answer whether INTEGER, which must be an integer, is a single +set twos-complement bit." + (if (<= integer 0) + nil ; infinite set bits for negatives + (loop until (logbitp 0 integer) + do (setf integer (ash integer -1)) + finally (return (zerop (ash integer -1)))))) + +;;; This function is here because it needs to be defined early. It's +;;; used by DEFINE-PARSE-METHOD and DEFCTYPE to warn users when +;;; they're defining types whose names belongs to the KEYWORD or CL +;;; packages. CFFI itself gets to use keywords without a warning. +(defun warn-if-kw-or-belongs-to-cl (name) + (let ((package (symbol-package name))) + (when (and (not (eq *package* (find-package '#:cffi))) + (member package '(#:common-lisp #:keyword) + :key #'find-package)) + (warn "Defining a foreign type named ~S. This symbol belongs to the ~A ~ + package and that may interfere with other code using CFFI." + name (package-name package))))) + +(define-condition obsolete-argument-warning (style-warning) + ((old-arg :initarg :old-arg :reader old-arg) + (new-arg :initarg :new-arg :reader new-arg)) + (:report (lambda (c s) + (format s "Keyword ~S is obsolete, please use ~S" + (old-arg c) (new-arg c))))) + +(defun warn-obsolete-argument (old-arg new-arg) + (warn 'obsolete-argument-warning + :old-arg old-arg :new-arg new-arg)) + +(defun split-if (test seq &optional (dir :before)) + (remove-if #'(lambda (x) (equal x (subseq seq 0 0))) + (loop for start fixnum = 0 + then (if (eq dir :before) + stop + (the fixnum (1+ (the fixnum stop)))) + while (< start (length seq)) + for stop = (position-if test seq + :start (if (eq dir :elide) + start + (the fixnum (1+ start)))) + collect (subseq seq start + (if (and stop (eq dir :after)) + (the fixnum (1+ (the fixnum stop))) + stop)) + while stop))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/tests/GNUmakefile b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/tests/GNUmakefile new file mode 100644 index 0000000..0776a19 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/tests/GNUmakefile @@ -0,0 +1,98 @@ +# -*- Mode: Makefile; tab-width: 3; indent-tabs-mode: t -*- +# +# Makefile --- Make targets for various tasks. +# +# Copyright (C) 2005, James Bielman +# +# Permission is hereby granted, free of charge, to any person +# obtaining a copy of this software and associated documentation +# files (the "Software"), to deal in the Software without +# restriction, including without limitation the rights to use, copy, +# modify, merge, publish, distribute, sublicense, and/or sell copies +# of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be +# included in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +# DEALINGS IN THE SOFTWARE. +# + +OSTYPE = $(shell uname) +ARCH = $(shell uname -m) + +CC := gcc +CFLAGS := -Wall -std=c99 -pedantic +SHLIB_CFLAGS := -shared +SHLIB_EXT := .so + +ifneq ($(if $(filter Linux %BSD,$(OSTYPE)),OK), OK) +ifeq ($(OSTYPE), Darwin) +SHLIB_CFLAGS := -dynamiclib +SHLIB_EXT := .dylib +ifeq ($(shell sysctl -n hw.optional.x86_64), 1) +ARCH := x86_64 +CFLAGS_64 := -m64 +endif +else +ifeq ($(OSTYPE), SunOS) +CFLAGS := -m64 -fPIC -c -Wall -std=c99 -pedantic +else +# Let's assume this is win32 +SHLIB_EXT := .dll +endif +endif +endif + +ifneq ($(ARCH), x86_64) +CFLAGS += -lm +endif + +ifeq ($(ARCH), x86_64) +CFLAGS_64 += -fPIC +endif + +# Are all G5s ppc970s? +ifeq ($(ARCH), ppc970) +CFLAGS_64 += -m64 +endif + +SHLIBS = libtest$(SHLIB_EXT) libtest2$(SHLIB_EXT) libfsbv$(SHLIB_EXT) + +ifeq ($(ARCH), x86_64) +SHLIBS += libtest32$(SHLIB_EXT) libtest2_32$(SHLIB_EXT) libfsbv_32$(SHLIB_EXT) +endif + +shlibs: $(SHLIBS) + +libtest$(SHLIB_EXT): libtest.c + $(CC) -o $@ $(SHLIB_CFLAGS) $(CFLAGS) $(CFLAGS_64) $< + +libtest2$(SHLIB_EXT): libtest2.c + $(CC) -o $@ $(SHLIB_CFLAGS) $(CFLAGS) $(CFLAGS_64) $< + +libfsbv$(SHLIB_EXT): libfsbv.c + $(CC) -o $@ $(SHLIB_CFLAGS) $(CFLAGS) $(CFLAGS_64) $< + +ifeq ($(ARCH), x86_64) +libtest32$(SHLIB_EXT): libtest.c + -$(CC) -m32 -o $@ $(SHLIB_CFLAGS) $(CFLAGS) $< + +libtest2_32$(SHLIB_EXT): libtest2.c + -$(CC) -m32 -o $@ $(SHLIB_CFLAGS) $(CFLAGS) $< + +libfsbv_32$(SHLIB_EXT): libfsbv.c + -$(CC) -m32 -o $@ $(SHLIB_CFLAGS) $(CFLAGS) $< +endif + +clean: + rm -f *.so *.dylib *.dll *.bundle + +# vim: ft=make ts=3 noet diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/tests/Makefile b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/tests/Makefile new file mode 100644 index 0000000..88bb7e9 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/tests/Makefile @@ -0,0 +1,2 @@ +shlibs clean: + gmake $@ diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/tests/arrays.lisp b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/tests/arrays.lisp new file mode 100644 index 0000000..1e96514 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/tests/arrays.lisp @@ -0,0 +1,71 @@ +;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- +;;; +;;; arrays.lisp --- Tests for foreign arrays. +;;; +;;; Copyright (C) 2005-2006, James Bielman +;;; Copyright (C) 2005-2007, Luis Oliveira +;;; +;;; Permission is hereby granted, free of charge, to any person +;;; obtaining a copy of this software and associated documentation +;;; files (the "Software"), to deal in the Software without +;;; restriction, including without limitation the rights to use, copy, +;;; modify, merge, publish, distribute, sublicense, and/or sell copies +;;; of the Software, and to permit persons to whom the Software is +;;; furnished to do so, subject to the following conditions: +;;; +;;; The above copyright notice and this permission notice shall be +;;; included in all copies or substantial portions of the Software. +;;; +;;; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +;;; EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +;;; MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +;;; NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +;;; HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +;;; WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +;;; OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +;;; DEALINGS IN THE SOFTWARE. +;;; + +;;;#Foreign Array Conversion Tests +;;; + +(in-package #:cffi-tests) + +(deftest array.foreign-to-lisp.basic + (with-foreign-array (ptr #(1 2 3 4 5) '(:array :int32 5)) + (foreign-array-to-lisp ptr '(:array :int32 5))) + #(1 2 3 4 5)) + +(deftest array.foreign-to-lisp.adjustable + (with-foreign-array (ptr #(1 2 3 4 5) '(:array :int32 5)) + (let ((array (foreign-array-to-lisp ptr '(:array :int32 5) + :adjustable t))) + (adjustable-array-p array))) + t) + +(deftest array.foreign-to-lisp.displaced + (let ((array (make-array 10 :initial-contents '(1 2 3 4 5 6 7 8 9 0)))) + (with-foreign-array (ptr #(10 20 30 40 50) '(:array :int32 5)) + (let ((displaced (foreign-array-to-lisp ptr '(:array :int32 5) + :displaced-to array + :displaced-index-offset 5))) + array))) + #(1 2 3 4 5 10 20 30 40 50)) + +;;; Implementation detail: 15.1.2.2 of the CL standard states that the only +;;; truly portable array specializations are for bits (bit-vectors) and +;;; characters (strings). Since char-codes are implementation-dependent, it +;;; would be tricky to write a portable test for them without generating +;;; characters at runtime. So, for a truly portable test, we are only left with +;;; bits, which are luckily numeric, and equal to (UNSIGNED-BYTE 1). +;;; This is why the below test is so terribly wasteful, spending a whole byte +;;; for a single bit - CFFI has no capabilities for dealing with single bits, +;;; and this test is only meant to check correctness of the :ELEMENT-TYPE +;;; argument to MAKE-ARRAY. In actual use cases of specialized +;;; FOREIGN-ARRAY-TO-LISP, capable implementations will be able to make +;;; specialized arrays of types that are commonly optimized for and/or +;;; representable in hardware, such as (UNSIGNED-BYTE 8) on x86 architectures. +(deftest array.foreign-to-lisp.specialized + (with-foreign-array (ptr #(1 0 1 0 1 1 1 0) '(:array :int8 8)) + (foreign-array-to-lisp ptr '(:array :int8 8) :element-type 'bit)) + #*10101110) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/tests/bindings.lisp b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/tests/bindings.lisp new file mode 100644 index 0000000..b0d62d6 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/tests/bindings.lisp @@ -0,0 +1,148 @@ +;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- +;;; +;;; libtest.lisp --- Setup CFFI bindings for libtest. +;;; +;;; Copyright (C) 2005-2007, Luis Oliveira +;;; +;;; Permission is hereby granted, free of charge, to any person +;;; obtaining a copy of this software and associated documentation +;;; files (the "Software"), to deal in the Software without +;;; restriction, including without limitation the rights to use, copy, +;;; modify, merge, publish, distribute, sublicense, and/or sell copies +;;; of the Software, and to permit persons to whom the Software is +;;; furnished to do so, subject to the following conditions: +;;; +;;; The above copyright notice and this permission notice shall be +;;; included in all copies or substantial portions of the Software. +;;; +;;; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +;;; EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +;;; MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +;;; NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +;;; HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +;;; WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +;;; OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +;;; DEALINGS IN THE SOFTWARE. +;;; + +(in-package #:cffi-tests) + +(define-foreign-library (libtest :type :test) + (:darwin (:or "libtest.dylib" "libtest32.dylib")) + (:unix (:or "libtest.so" "libtest32.so")) + (:windows "libtest.dll") + (t (:default "libtest"))) + +(define-foreign-library (libtest2 :type :test) + (:darwin (:or "libtest2.dylib" "libtest2_32.dylib")) + (:unix (:or "libtest2.so" "libtest2_32.so")) + (t (:default "libtest2"))) + +(define-foreign-library (libfsbv :type :test) + (:darwin (:or "libfsbv.dylib" "libfsbv32.dylib")) + (:unix (:or "libfsbv.so" "libfsbv_32.so")) + (:windows "libfsbv.dll") + (t (:default "libfsbv"))) + +(define-foreign-library libc + (:windows "msvcrt.dll")) + +(define-foreign-library libm + #+(and lispworks darwin) ; not sure why the full path is necessary + (:darwin "/usr/lib/libm.dylib") + (t (:default "libm"))) + +(defmacro deftest (name &rest body) + (destructuring-bind (name &key expected-to-fail) + (alexandria:ensure-list name) + (let ((result `(rt:deftest ,name ,@body))) + (when expected-to-fail + (setf result `(progn + (when ,expected-to-fail + (pushnew ',name rt::*expected-failures*)) + ,result))) + result))) + +(defun call-within-new-thread (fn &rest args) + (let (result + error + (cv (bordeaux-threads:make-condition-variable)) + (lock (bordeaux-threads:make-lock))) + (bordeaux-threads:with-lock-held (lock) + (bordeaux-threads:make-thread + (lambda () + (multiple-value-setq (result error) + (ignore-errors (apply fn args))) + (bordeaux-threads:with-lock-held (lock) + (bordeaux-threads:condition-notify cv)))) + (bordeaux-threads:condition-wait cv lock) + (values result error)))) + +;;; As of OSX 10.6.6, loading CoreFoundation on something other than +;;; the initial thread results in a crash. +(deftest load-core-foundation + (progn + #+bordeaux-threads + (call-within-new-thread 'load-foreign-library + '(:framework "CoreFoundation")) + t) + t) + +;;; Return the directory containing the source when compiling or +;;; loading this file. We don't use *LOAD-TRUENAME* because the fasl +;;; file may be in a different directory than the source with certain +;;; ASDF extensions loaded. +(defun load-directory () + (let ((here #.(or *compile-file-truename* *load-truename*))) + (make-pathname :name nil :type nil :version nil + :defaults here))) + +(defun load-test-libraries () + (let ((*foreign-library-directories* (list (load-directory)))) + (load-foreign-library 'libtest) + (load-foreign-library 'libtest2) + (load-foreign-library 'libfsbv) + (load-foreign-library 'libc) + #+(or abcl lispworks) (load-foreign-library 'libm))) + +#-(:and :ecl (:not :dffi)) +(load-test-libraries) + +#+(:and :ecl (:not :dffi)) +(ffi:load-foreign-library + #.(make-pathname :name "libtest" :type "so" + :defaults (or *compile-file-truename* *load-truename*))) + +;;; check libtest version +(defparameter *required-dll-version* "20120107") + +(defcvar "dll_version" :string) + +(unless (string= *dll-version* *required-dll-version*) + (error "version check failed: expected ~s but libtest reports ~s" + *required-dll-version* + *dll-version*)) + +;;; The maximum and minimum values for single and double precision C +;;; floating point values, which may be quite different from the +;;; corresponding Lisp versions. +(defcvar "float_max" :float) +(defcvar "float_min" :float) +(defcvar "double_max" :double) +(defcvar "double_min" :double) + +(defun run-cffi-tests (&key (compiled nil)) + (let ((regression-test::*compile-tests* compiled) + (*package* (find-package '#:cffi-tests))) + (format t "~&;;; running tests (~Acompiled)" (if compiled "" "un")) + (do-tests) + (set-difference (regression-test:pending-tests) + regression-test::*expected-failures*))) + +(defun run-all-cffi-tests () + (append (run-cffi-tests :compiled nil) + (run-cffi-tests :compiled t))) + +(defmacro expecting-error (&body body) + `(handler-case (progn ,@body :no-error) + (error () :error))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/tests/callbacks.lisp b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/tests/callbacks.lisp new file mode 100644 index 0000000..cd11fcc --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/tests/callbacks.lisp @@ -0,0 +1,526 @@ +;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- +;;; +;;; callbacks.lisp --- Tests on callbacks. +;;; +;;; Copyright (C) 2005-2006, Luis Oliveira +;;; +;;; Permission is hereby granted, free of charge, to any person +;;; obtaining a copy of this software and associated documentation +;;; files (the "Software"), to deal in the Software without +;;; restriction, including without limitation the rights to use, copy, +;;; modify, merge, publish, distribute, sublicense, and/or sell copies +;;; of the Software, and to permit persons to whom the Software is +;;; furnished to do so, subject to the following conditions: +;;; +;;; The above copyright notice and this permission notice shall be +;;; included in all copies or substantial portions of the Software. +;;; +;;; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +;;; EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +;;; MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +;;; NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +;;; HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +;;; WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +;;; OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +;;; DEALINGS IN THE SOFTWARE. +;;; + +(in-package #:cffi-tests) + +(defcfun "expect_char_sum" :int (f :pointer)) +(defcfun "expect_unsigned_char_sum" :int (f :pointer)) +(defcfun "expect_short_sum" :int (f :pointer)) +(defcfun "expect_unsigned_short_sum" :int (f :pointer)) +(defcfun "expect_int_sum" :int (f :pointer)) +(defcfun "expect_unsigned_int_sum" :int (f :pointer)) +(defcfun "expect_long_sum" :int (f :pointer)) +(defcfun "expect_unsigned_long_sum" :int (f :pointer)) +(defcfun "expect_float_sum" :int (f :pointer)) +(defcfun "expect_double_sum" :int (f :pointer)) +(defcfun "expect_pointer_sum" :int (f :pointer)) +(defcfun "expect_strcat" :int (f :pointer)) + +#-cffi-sys::no-long-long +(progn + (defcfun "expect_long_long_sum" :int (f :pointer)) + (defcfun "expect_unsigned_long_long_sum" :int (f :pointer))) + +#+(and scl long-float) +(defcfun "expect_long_double_sum" :int (f :pointer)) + +(defcallback sum-char :char ((a :char) (b :char)) + "Test if the named block is present and the docstring too." + ;(format t "~%}}} a: ~A, b: ~A {{{~%" a b) + (return-from sum-char (+ a b))) + +(defcallback sum-unsigned-char :unsigned-char + ((a :unsigned-char) (b :unsigned-char)) + ;(format t "~%}}} a: ~A, b: ~A {{{~%" a b) + (+ a b)) + +(defcallback sum-short :short ((a :short) (b :short)) + ;(format t "~%}}} a: ~A, b: ~A {{{~%" a b) + (+ a b)) + +(defcallback sum-unsigned-short :unsigned-short + ((a :unsigned-short) (b :unsigned-short)) + ;(format t "~%}}} a: ~A, b: ~A {{{~%" a b) + (+ a b)) + +(defcallback sum-int :int ((a :int) (b :int)) + (+ a b)) + +(defcallback sum-unsigned-int :unsigned-int + ((a :unsigned-int) (b :unsigned-int)) + (+ a b)) + +(defcallback sum-long :long ((a :long) (b :long)) + (+ a b)) + +(defcallback sum-unsigned-long :unsigned-long + ((a :unsigned-long) (b :unsigned-long)) + (+ a b)) + +#-cffi-sys::no-long-long +(progn + (defcallback sum-long-long :long-long + ((a :long-long) (b :long-long)) + (+ a b)) + + (defcallback sum-unsigned-long-long :unsigned-long-long + ((a :unsigned-long-long) (b :unsigned-long-long)) + (+ a b))) + +(defcallback sum-float :float ((a :float) (b :float)) + ;(format t "~%}}} a: ~A, b: ~A {{{~%" a b) + (+ a b)) + +(defcallback sum-double :double ((a :double) (b :double)) + ;(format t "~%}}} a: ~A, b: ~A {{{~%" a b) + (+ a b)) + +#+(and scl long-float) +(defcallback sum-long-double :long-double ((a :long-double) (b :long-double)) + ;(format t "~%}}} a: ~A, b: ~A {{{~%" a b) + (+ a b)) + +(defcallback sum-pointer :pointer ((ptr :pointer) (offset :int)) + (inc-pointer ptr offset)) + +(defcallback lisp-strcat :string ((a :string) (b :string)) + (concatenate 'string a b)) + +(deftest callbacks.char + (expect-char-sum (get-callback 'sum-char)) + 1) + +(deftest callbacks.unsigned-char + (expect-unsigned-char-sum (get-callback 'sum-unsigned-char)) + 1) + +(deftest callbacks.short + (expect-short-sum (callback sum-short)) + 1) + +(deftest callbacks.unsigned-short + (expect-unsigned-short-sum (callback sum-unsigned-short)) + 1) + +(deftest callbacks.int + (expect-int-sum (callback sum-int)) + 1) + +(deftest callbacks.unsigned-int + (expect-unsigned-int-sum (callback sum-unsigned-int)) + 1) + +(deftest callbacks.long + (expect-long-sum (callback sum-long)) + 1) + +(deftest callbacks.unsigned-long + (expect-unsigned-long-sum (callback sum-unsigned-long)) + 1) + +#-cffi-sys::no-long-long +(progn + (deftest (callbacks.long-long :expected-to-fail (alexandria:featurep :openmcl)) + (expect-long-long-sum (callback sum-long-long)) + 1) + + (deftest callbacks.unsigned-long-long + (expect-unsigned-long-long-sum (callback sum-unsigned-long-long)) + 1)) + +(deftest callbacks.float + (expect-float-sum (callback sum-float)) + 1) + +(deftest callbacks.double + (expect-double-sum (callback sum-double)) + 1) + +#+(and scl long-float) +(deftest callbacks.long-double + (expect-long-double-sum (callback sum-long-double)) + 1) + +(deftest callbacks.pointer + (expect-pointer-sum (callback sum-pointer)) + 1) + +(deftest callbacks.string + (expect-strcat (callback lisp-strcat)) + 1) + +#-cffi-sys::no-foreign-funcall +(defcallback return-a-string-not-nil :string () + "abc") + +#-cffi-sys::no-foreign-funcall +(deftest callbacks.string-not-docstring + (foreign-funcall-pointer (callback return-a-string-not-nil) () :string) + "abc") + +(defcallback check-for-nil :boolean ((pointer :pointer)) + (null pointer)) + +#-cffi-sys::no-foreign-funcall +(deftest callbacks.nil-for-null + (foreign-funcall-pointer (callback check-for-nil) nil + :pointer (null-pointer) :boolean) + nil) + +;;; This one tests mem-aref too. +(defcfun "qsort" :void + (base :pointer) + (nmemb :int) + (size :int) + (fun-compar :pointer)) + +(defcallback < :int ((a :pointer) (b :pointer)) + (let ((x (mem-ref a :int)) + (y (mem-ref b :int))) + (cond ((> x y) 1) + ((< x y) -1) + (t 0)))) + +(deftest callbacks.qsort + (with-foreign-object (array :int 10) + ;; Initialize array. + (loop for i from 0 and n in '(7 2 10 4 3 5 1 6 9 8) + do (setf (mem-aref array :int i) n)) + ;; Sort it. + (qsort array 10 (foreign-type-size :int) (callback <)) + ;; Return it as a list. + (loop for i from 0 below 10 + collect (mem-aref array :int i))) + (1 2 3 4 5 6 7 8 9 10)) + +;;; void callback +(defparameter *int* -1) + +(defcfun "pass_int_ref" :void (f :pointer)) + +;;; CMUCL chokes on this one for some reason. +#-(and darwin cmucl) +(defcallback read-int-from-pointer :void ((a :pointer)) + (setq *int* (mem-ref a :int))) + +#+(and darwin cmucl) +(pushnew 'callbacks.void rt::*expected-failures*) + +(deftest callbacks.void + (progn + (pass-int-ref (callback read-int-from-pointer)) + *int*) + 1984) + +;;; test funcalling of a callback and also declarations inside +;;; callbacks. + +#-cffi-sys::no-foreign-funcall +(progn + (defcallback sum-2 :int ((a :int) (b :int) (c :int)) + (declare (ignore c)) + (+ a b)) + + (deftest callbacks.funcall.1 + (foreign-funcall-pointer (callback sum-2) () :int 2 :int 3 :int 1 :int) + 5) + + (defctype foo-float :float) + + (defcallback sum-2f foo-float + ((a foo-float) (b foo-float) (c foo-float) (d foo-float) (e foo-float)) + "This one ignores the middle 3 arguments." + (declare (ignore b c)) + (declare (ignore d)) + (+ a e)) + + (deftest callbacks.funcall.2 + (foreign-funcall-pointer (callback sum-2f) () foo-float 1.0 foo-float 2.0 + foo-float 3.0 foo-float 4.0 foo-float 5.0 + foo-float) + 6.0)) + +;;; (cb-test :no-long-long t) + +(defcfun "call_sum_127_no_ll" :long (cb :pointer)) + +;;; CMUCL and CCL choke on this one. +#-(or cmucl clozure + #.(cl:if (cl:>= cl:lambda-parameters-limit 127) '(:or) '(:and))) +(defcallback sum-127-no-ll :long + ((a1 :unsigned-long) (a2 :pointer) (a3 :long) (a4 :double) + (a5 :unsigned-long) (a6 :float) (a7 :float) (a8 :int) (a9 :unsigned-int) + (a10 :double) (a11 :double) (a12 :double) (a13 :pointer) + (a14 :unsigned-short) (a15 :unsigned-short) (a16 :pointer) (a17 :long) + (a18 :long) (a19 :int) (a20 :short) (a21 :unsigned-short) + (a22 :unsigned-short) (a23 :char) (a24 :long) (a25 :pointer) (a26 :pointer) + (a27 :char) (a28 :unsigned-char) (a29 :unsigned-long) (a30 :short) + (a31 :int) (a32 :int) (a33 :unsigned-char) (a34 :short) (a35 :long) + (a36 :long) (a37 :pointer) (a38 :unsigned-short) (a39 :char) (a40 :double) + (a41 :unsigned-short) (a42 :pointer) (a43 :short) (a44 :unsigned-long) + (a45 :unsigned-short) (a46 :float) (a47 :unsigned-char) (a48 :short) + (a49 :float) (a50 :short) (a51 :char) (a52 :unsigned-long) + (a53 :unsigned-long) (a54 :char) (a55 :float) (a56 :long) (a57 :pointer) + (a58 :short) (a59 :float) (a60 :unsigned-int) (a61 :float) + (a62 :unsigned-int) (a63 :double) (a64 :unsigned-int) (a65 :unsigned-char) + (a66 :int) (a67 :long) (a68 :char) (a69 :short) (a70 :double) (a71 :int) + (a72 :pointer) (a73 :char) (a74 :unsigned-short) (a75 :pointer) + (a76 :unsigned-short) (a77 :pointer) (a78 :unsigned-long) (a79 :double) + (a80 :pointer) (a81 :long) (a82 :float) (a83 :unsigned-short) + (a84 :unsigned-short) (a85 :pointer) (a86 :float) (a87 :int) + (a88 :unsigned-int) (a89 :double) (a90 :float) (a91 :long) (a92 :pointer) + (a93 :unsigned-short) (a94 :float) (a95 :unsigned-char) (a96 :unsigned-char) + (a97 :float) (a98 :unsigned-int) (a99 :float) (a100 :unsigned-short) + (a101 :double) (a102 :unsigned-short) (a103 :unsigned-long) + (a104 :unsigned-int) (a105 :unsigned-long) (a106 :pointer) + (a107 :unsigned-char) (a108 :char) (a109 :char) (a110 :unsigned-short) + (a111 :unsigned-long) (a112 :float) (a113 :short) (a114 :pointer) + (a115 :long) (a116 :unsigned-short) (a117 :short) (a118 :double) + (a119 :short) (a120 :int) (a121 :char) (a122 :unsigned-long) (a123 :long) + (a124 :int) (a125 :pointer) (a126 :double) (a127 :unsigned-char)) + (let ((args (list a1 (pointer-address a2) a3 (floor a4) a5 (floor a6) + (floor a7) a8 a9 (floor a10) (floor a11) (floor a12) + (pointer-address a13) a14 a15 (pointer-address a16) a17 a18 + a19 a20 a21 a22 a23 a24 (pointer-address a25) + (pointer-address a26) a27 a28 a29 a30 a31 a32 a33 a34 a35 + a36 (pointer-address a37) a38 a39 (floor a40) a41 + (pointer-address a42) a43 a44 a45 (floor a46) a47 a48 + (floor a49) a50 a51 a52 a53 a54 (floor a55) a56 + (pointer-address a57) a58 (floor a59) a60 (floor a61) a62 + (floor a63) a64 a65 a66 a67 a68 a69 (floor a70) a71 + (pointer-address a72) a73 a74 (pointer-address a75) a76 + (pointer-address a77) a78 (floor a79) (pointer-address a80) + a81 (floor a82) a83 a84 (pointer-address a85) (floor a86) + a87 a88 (floor a89) (floor a90) a91 (pointer-address a92) + a93 (floor a94) a95 a96 (floor a97) a98 (floor a99) a100 + (floor a101) a102 a103 a104 a105 (pointer-address a106) a107 + a108 a109 a110 a111 (floor a112) a113 (pointer-address a114) + a115 a116 a117 (floor a118) a119 a120 a121 a122 a123 a124 + (pointer-address a125) (floor a126) a127))) + #-(and) + (loop for i from 1 and arg in args do + (format t "a~A: ~A~%" i arg)) + (reduce #'+ args))) + +#+(or openmcl cmucl (and darwin (or allegro lispworks))) +(push 'callbacks.bff.1 regression-test::*expected-failures*) + +#+#.(cl:if (cl:>= cl:lambda-parameters-limit 127) '(:and) '(:or)) +(deftest callbacks.bff.1 + (call-sum-127-no-ll (callback sum-127-no-ll)) + 2008547941) + +;;; (cb-test) + +#-(or cffi-sys::no-long-long + #.(cl:if (cl:>= cl:lambda-parameters-limit 127) '(or) '(and))) +(progn + (defcfun "call_sum_127" :long-long (cb :pointer)) + + ;;; CMUCL and CCL choke on this one. + #-(or cmucl clozure) + (defcallback sum-127 :long-long + ((a1 :short) (a2 :char) (a3 :pointer) (a4 :float) (a5 :long) (a6 :double) + (a7 :unsigned-long-long) (a8 :unsigned-short) (a9 :unsigned-char) + (a10 :char) (a11 :char) (a12 :unsigned-short) (a13 :unsigned-long-long) + (a14 :unsigned-short) (a15 :long-long) (a16 :unsigned-short) + (a17 :unsigned-long-long) (a18 :unsigned-char) (a19 :unsigned-char) + (a20 :unsigned-long-long) (a21 :long-long) (a22 :char) (a23 :float) + (a24 :unsigned-int) (a25 :float) (a26 :float) (a27 :unsigned-int) + (a28 :float) (a29 :char) (a30 :unsigned-char) (a31 :long) (a32 :long-long) + (a33 :unsigned-char) (a34 :double) (a35 :long) (a36 :double) + (a37 :unsigned-int) (a38 :unsigned-short) (a39 :long-long) + (a40 :unsigned-int) (a41 :int) (a42 :unsigned-long-long) (a43 :long) + (a44 :short) (a45 :unsigned-int) (a46 :unsigned-int) + (a47 :unsigned-long-long) (a48 :unsigned-int) (a49 :long) (a50 :pointer) + (a51 :unsigned-char) (a52 :char) (a53 :long-long) (a54 :unsigned-short) + (a55 :unsigned-int) (a56 :float) (a57 :unsigned-char) (a58 :unsigned-long) + (a59 :long-long) (a60 :float) (a61 :long) (a62 :float) (a63 :int) + (a64 :float) (a65 :unsigned-short) (a66 :unsigned-long-long) (a67 :short) + (a68 :unsigned-long) (a69 :long) (a70 :char) (a71 :unsigned-short) + (a72 :long-long) (a73 :short) (a74 :double) (a75 :pointer) + (a76 :unsigned-int) (a77 :char) (a78 :unsigned-int) (a79 :pointer) + (a80 :pointer) (a81 :unsigned-char) (a82 :pointer) (a83 :unsigned-short) + (a84 :unsigned-char) (a85 :long) (a86 :pointer) (a87 :char) (a88 :long) + (a89 :unsigned-short) (a90 :unsigned-char) (a91 :double) + (a92 :unsigned-long-long) (a93 :unsigned-short) (a94 :unsigned-short) + (a95 :unsigned-int) (a96 :long) (a97 :char) (a98 :long) (a99 :char) + (a100 :short) (a101 :unsigned-short) (a102 :unsigned-long) + (a103 :unsigned-long) (a104 :short) (a105 :long-long) (a106 :long-long) + (a107 :long-long) (a108 :double) (a109 :unsigned-short) + (a110 :unsigned-char) (a111 :short) (a112 :unsigned-char) (a113 :long) + (a114 :long-long) (a115 :unsigned-long-long) (a116 :unsigned-int) + (a117 :unsigned-long) (a118 :unsigned-char) (a119 :long-long) + (a120 :unsigned-char) (a121 :unsigned-long-long) (a122 :double) + (a123 :unsigned-char) (a124 :long-long) (a125 :unsigned-char) + (a126 :char) (a127 :long-long)) + (+ a1 a2 (pointer-address a3) (values (floor a4)) a5 (values (floor a6)) + a7 a8 a9 a10 a11 a12 a13 a14 a15 a16 a17 a18 a19 a20 a21 a22 + (values (floor a23)) a24 (values (floor a25)) (values (floor a26)) + a27 (values (floor a28)) a29 a30 a31 a32 a33 (values (floor a34)) + a35 (values (floor a36)) a37 a38 a39 a40 a41 a42 a43 a44 a45 a46 a47 + a48 a49 (pointer-address a50) a51 a52 a53 a54 a55 (values (floor a56)) + a57 a58 a59 (values (floor a60)) a61 (values (floor a62)) a63 + (values (floor a64)) a65 a66 a67 a68 a69 a70 a71 a72 a73 + (values (floor a74)) (pointer-address a75) a76 a77 a78 + (pointer-address a79) (pointer-address a80) a81 (pointer-address a82) + a83 a84 a85 (pointer-address a86) a87 a88 a89 a90 (values (floor a91)) + a92 a93 a94 a95 a96 a97 a98 a99 a100 a101 a102 a103 a104 a105 a106 a107 + (values (floor a108)) a109 a110 a111 a112 a113 a114 a115 a116 a117 a118 + a119 a120 a121 (values (floor a122)) a123 a124 a125 a126 a127)) + + #+(or openmcl cmucl) + (push 'callbacks.bff.2 rt::*expected-failures*) + + (deftest callbacks.bff.2 + (call-sum-127 (callback sum-127)) + 8166570665645582011)) + +;;; regression test: (callback non-existant-callback) should throw an error +(deftest callbacks.non-existant + (not (null (nth-value 1 (ignore-errors (callback doesnt-exist))))) + t) + +;;; Handling many arguments of type double. Many lisps (used to) fail +;;; this one on darwin/ppc. This test might be bogus due to floating +;;; point arithmetic rounding errors. +;;; +;;; CMUCL chokes on this one. +#-(and darwin cmucl) +(defcallback double26 :double + ((a1 :double) (a2 :double) (a3 :double) (a4 :double) (a5 :double) + (a6 :double) (a7 :double) (a8 :double) (a9 :double) (a10 :double) + (a11 :double) (a12 :double) (a13 :double) (a14 :double) (a15 :double) + (a16 :double) (a17 :double) (a18 :double) (a19 :double) (a20 :double) + (a21 :double) (a22 :double) (a23 :double) (a24 :double) (a25 :double) + (a26 :double)) + (let ((args (list a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14 a15 + a16 a17 a18 a19 a20 a21 a22 a23 a24 a25 a26))) + #-(and) + (loop for i from 1 and arg in args do + (format t "a~A: ~A~%" i arg)) + (reduce #'+ args))) + +(defcfun "call_double26" :double (f :pointer)) + +#+(and darwin (or allegro cmucl)) +(pushnew 'callbacks.double26 rt::*expected-failures*) + +(deftest callbacks.double26 + (call-double26 (callback double26)) + 81.64d0) + +#+(and darwin cmucl) +(pushnew 'callbacks.double26.funcall rt::*expected-failures*) + +#-cffi-sys::no-foreign-funcall +(deftest callbacks.double26.funcall + (foreign-funcall-pointer + (callback double26) () :double 3.14d0 :double 3.14d0 + :double 3.14d0 :double 3.14d0 :double 3.14d0 :double 3.14d0 + :double 3.14d0 :double 3.14d0 :double 3.14d0 :double 3.14d0 + :double 3.14d0 :double 3.14d0 :double 3.14d0 :double 3.14d0 + :double 3.14d0 :double 3.14d0 :double 3.14d0 :double 3.14d0 + :double 3.14d0 :double 3.14d0 :double 3.14d0 :double 3.14d0 + :double 3.14d0 :double 3.14d0 :double 3.14d0 :double 3.14d0 + :double) + 81.64d0) + +;;; Same as above, for floats. +#-(and darwin cmucl) +(defcallback float26 :float + ((a1 :float) (a2 :float) (a3 :float) (a4 :float) (a5 :float) + (a6 :float) (a7 :float) (a8 :float) (a9 :float) (a10 :float) + (a11 :float) (a12 :float) (a13 :float) (a14 :float) (a15 :float) + (a16 :float) (a17 :float) (a18 :float) (a19 :float) (a20 :float) + (a21 :float) (a22 :float) (a23 :float) (a24 :float) (a25 :float) + (a26 :float)) + (let ((args (list a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14 a15 + a16 a17 a18 a19 a20 a21 a22 a23 a24 a25 a26))) + #-(and) + (loop for i from 1 and arg in args do + (format t "a~A: ~A~%" i arg)) + (reduce #'+ args))) + +(defcfun "call_float26" :float (f :pointer)) + +#+(and darwin (or lispworks openmcl cmucl)) +(pushnew 'callbacks.float26 regression-test::*expected-failures*) + +(deftest callbacks.float26 + (call-float26 (callback float26)) + 130.0) + +#+(and darwin (or lispworks openmcl cmucl)) +(pushnew 'callbacks.float26.funcall regression-test::*expected-failures*) + +#-cffi-sys::no-foreign-funcall +(deftest callbacks.float26.funcall + (foreign-funcall-pointer + (callback float26) () :float 5.0 :float 5.0 + :float 5.0 :float 5.0 :float 5.0 :float 5.0 + :float 5.0 :float 5.0 :float 5.0 :float 5.0 + :float 5.0 :float 5.0 :float 5.0 :float 5.0 + :float 5.0 :float 5.0 :float 5.0 :float 5.0 + :float 5.0 :float 5.0 :float 5.0 :float 5.0 + :float 5.0 :float 5.0 :float 5.0 :float 5.0 + :float) + 130.0) + +;;; Defining a callback as a non-toplevel form. Not portable. Doesn't +;;; work for CMUCL or Allegro. +#-(and) +(let ((n 42)) + (defcallback non-toplevel-cb :int () + n)) + +#-(and) +(deftest callbacks.non-toplevel + (foreign-funcall (callback non-toplevel-cb) :int) + 42) + +;;;# Stdcall + +#+(and x86 (not cffi-sys::no-stdcall)) +(progn + (defcallback (stdcall-cb :convention :stdcall) :int + ((a :int) (b :int) (c :int)) + (+ a b c)) + + (defcfun "call_stdcall_fun" :int + (f :pointer)) + + (deftest callbacks.stdcall.1 + (call-stdcall-fun (callback stdcall-cb)) + 42)) + +;;; RT: many of the %DEFCALLBACK implementations wouldn't handle +;;; uninterned symbols. +(deftest callbacks.uninterned + (values (defcallback #1=#:foo :void ()) + (pointerp (callback #1#))) + #1# t) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/tests/compile.bat b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/tests/compile.bat new file mode 100644 index 0000000..1f89eea --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/tests/compile.bat @@ -0,0 +1,9 @@ +rem +rem script for compiling the test lib with the free MSVC++ toolkit. +rem + +cl /LD /DWIN32=1 /Tc libtest.c +del libtest.obj libtest.exp + +cl /LD /DWIN32=1 /Tc libtest2.c +del libtest2.obj libtest2.exp diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/tests/defcfun.lisp b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/tests/defcfun.lisp new file mode 100644 index 0000000..97e9b98 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/tests/defcfun.lisp @@ -0,0 +1,536 @@ +;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- +;;; +;;; defcfun.lisp --- Tests function definition and calling. +;;; +;;; Copyright (C) 2005-2007, Luis Oliveira +;;; +;;; Permission is hereby granted, free of charge, to any person +;;; obtaining a copy of this software and associated documentation +;;; files (the "Software"), to deal in the Software without +;;; restriction, including without limitation the rights to use, copy, +;;; modify, merge, publish, distribute, sublicense, and/or sell copies +;;; of the Software, and to permit persons to whom the Software is +;;; furnished to do so, subject to the following conditions: +;;; +;;; The above copyright notice and this permission notice shall be +;;; included in all copies or substantial portions of the Software. +;;; +;;; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +;;; EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +;;; MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +;;; NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +;;; HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +;;; WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +;;; OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +;;; DEALINGS IN THE SOFTWARE. +;;; + +(in-package #:cffi-tests) + +(deftest defcfun.parse-name-and-options.1 + (multiple-value-bind (lisp-name foreign-name) + (let ((*package* (find-package '#:cffi-tests))) + (cffi::parse-name-and-options "foo_bar")) + (list lisp-name foreign-name)) + (foo-bar "foo_bar")) + +(deftest defcfun.parse-name-and-options.2 + (multiple-value-bind (lisp-name foreign-name) + (let ((*package* (find-package '#:cffi-tests))) + (cffi::parse-name-and-options "foo_bar" t)) + (list lisp-name foreign-name)) + (*foo-bar* "foo_bar")) + +(deftest defcfun.parse-name-and-options.3 + (multiple-value-bind (lisp-name foreign-name) + (cffi::parse-name-and-options 'foo-bar) + (list lisp-name foreign-name)) + (foo-bar "foo_bar")) + +(deftest defcfun.parse-name-and-options.4 + (multiple-value-bind (lisp-name foreign-name) + (cffi::parse-name-and-options '*foo-bar* t) + (list lisp-name foreign-name)) + (*foo-bar* "foo_bar")) + +(deftest defcfun.parse-name-and-options.5 + (multiple-value-bind (lisp-name foreign-name) + (cffi::parse-name-and-options '("foo_bar" foo-baz)) + (list lisp-name foreign-name)) + (foo-baz "foo_bar")) + +(deftest defcfun.parse-name-and-options.6 + (multiple-value-bind (lisp-name foreign-name) + (cffi::parse-name-and-options '("foo_bar" *foo-baz*) t) + (list lisp-name foreign-name)) + (*foo-baz* "foo_bar")) + +(deftest defcfun.parse-name-and-options.7 + (multiple-value-bind (lisp-name foreign-name) + (cffi::parse-name-and-options '(foo-baz "foo_bar")) + (list lisp-name foreign-name)) + (foo-baz "foo_bar")) + +(deftest defcfun.parse-name-and-options.8 + (multiple-value-bind (lisp-name foreign-name) + (cffi::parse-name-and-options '(*foo-baz* "foo_bar") t) + (list lisp-name foreign-name)) + (*foo-baz* "foo_bar")) + +;;;# Name translation + +(deftest translate-underscore-separated-name.to-symbol + (let ((*package* (find-package '#:cffi-tests))) + (translate-underscore-separated-name "some_name_with_underscores")) + some-name-with-underscores) + +(deftest translate-underscore-separated-name.to-string + (translate-underscore-separated-name 'some-name-with-underscores) + "some_name_with_underscores") + +(deftest translate-camelcase-name.to-symbol + (let ((*package* (find-package '#:cffi-tests))) + (translate-camelcase-name "someXmlFunction")) + some-xml-function) + +(deftest translate-camelcase-name.to-string + (translate-camelcase-name 'some-xml-function) + "someXmlFunction") + +(deftest translate-camelcase-name.to-string-upper + (translate-camelcase-name 'some-xml-function :upper-initial-p t) + "SomeXmlFunction") + +(deftest translate-camelcase-name.to-symbol-special + (let ((*package* (find-package '#:cffi-tests))) + (translate-camelcase-name "someXMLFunction" :special-words '("XML"))) + some-xml-function) + +(deftest translate-camelcase-name.to-string-special + (translate-camelcase-name 'some-xml-function :special-words '("XML")) + "someXMLFunction") + +(deftest translate-name-from-foreign.function + (let ((*package* (find-package '#:cffi-tests))) + (translate-name-from-foreign "some_xml_name" *package*)) + some-xml-name) + +(deftest translate-name-from-foreign.var + (let ((*package* (find-package '#:cffi-tests))) + (translate-name-from-foreign "some_xml_name" *package* t)) + *some-xml-name*) + +(deftest translate-name-to-foreign.function + (translate-name-to-foreign 'some-xml-name *package*) + "some_xml_name") + +(deftest translate-name-to-foreign.var + (translate-name-to-foreign '*some-xml-name* *package* t) + "some_xml_name") + +;;;# Calling with built-in c types +;;; +;;; Tests calling standard C library functions both passing +;;; and returning each built-in type. (adapted from funcall.lisp) + +(defcfun "toupper" :char + "toupper docstring" + (char :char)) + +(deftest defcfun.char + (toupper (char-code #\a)) + #.(char-code #\A)) + +(deftest defcfun.docstring + (documentation 'toupper 'function) + "toupper docstring") + + +(defcfun ("abs" c-abs) :int + (n :int)) + +(deftest defcfun.int + (c-abs -100) + 100) + + +(defcfun "labs" :long + (n :long)) + +(deftest defcfun.long + (labs -131072) + 131072) + + +#-cffi-features:no-long-long +(progn + (defcfun "my_llabs" :long-long + (n :long-long)) + + (deftest defcfun.long-long + (my-llabs -9223372036854775807) + 9223372036854775807) + + (defcfun "ullong" :unsigned-long-long + (n :unsigned-long-long)) + + #+allegro ; lp#914500 + (pushnew 'defcfun.unsigned-long-long rt::*expected-failures*) + + (deftest defcfun.unsigned-long-long + (let ((ullong-max (1- (expt 2 (* 8 (foreign-type-size :unsigned-long-long)))))) + (eql ullong-max (ullong ullong-max))) + t)) + + +(defcfun "my_sqrtf" :float + (n :float)) + +(deftest defcfun.float + (my-sqrtf 16.0) + 4.0) + + +(defcfun ("sqrt" c-sqrt) :double + (n :double)) + +(deftest defcfun.double + (c-sqrt 36.0d0) + 6.0d0) + + +#+(and scl long-float) +(defcfun ("sqrtl" c-sqrtl) :long-double + (n :long-double)) + +#+(and scl long-float) +(deftest defcfun.long-double + (c-sqrtl 36.0l0) + 6.0l0) + + +(defcfun "strlen" :int + (n :string)) + +(deftest defcfun.string.1 + (strlen "Hello") + 5) + + +(defcfun "strcpy" (:pointer :char) + (dest (:pointer :char)) + (src :string)) + +(defcfun "strcat" (:pointer :char) + (dest (:pointer :char)) + (src :string)) + +(deftest defcfun.string.2 + (with-foreign-pointer-as-string (s 100) + (setf (mem-ref s :char) 0) + (strcpy s "Hello") + (strcat s ", world!")) + "Hello, world!") + +(defcfun "strerror" :string + (n :int)) + +(deftest defcfun.string.3 + (typep (strerror 1) 'string) + t) + + +;;; Regression test. Allegro would warn on direct calls to +;;; functions with no arguments. +;;; +;;; Also, let's check if void functions will return NIL. +;;; +;;; Check if a docstring without arguments doesn't cause problems. + +(defcfun "noargs" :int + "docstring") + +(deftest defcfun.noargs + (noargs) + 42) + +(defcfun "noop" :void) + +#+(or allegro openmcl ecl) (pushnew 'defcfun.noop rt::*expected-failures*) + +(deftest defcfun.noop + (noop) + #|no values|#) + +;;;# Calling varargs functions + +(defcfun "sum_double_arbitrary" :double (n :int) &rest) + +(deftest defcfun.varargs.nostdlib + (sum-double-arbitrary + 26 + :double 3.14d0 :double 3.14d0 :double 3.14d0 :double 3.14d0 + :double 3.14d0 :double 3.14d0 :double 3.14d0 :double 3.14d0 + :double 3.14d0 :double 3.14d0 :double 3.14d0 :double 3.14d0 + :double 3.14d0 :double 3.14d0 :double 3.14d0 :double 3.14d0 + :double 3.14d0 :double 3.14d0 :double 3.14d0 :double 3.14d0 + :double 3.14d0 :double 3.14d0 :double 3.14d0 :double 3.14d0 + :double 3.14d0 :double 3.14d0) + 81.64d0) + +(defcfun "sprintf" :int + "sprintf docstring" + (str (:pointer :char)) + (control :string) + &rest) + +;;; CLISP and ABCL discard macro docstrings. +#+(or clisp abcl) +(pushnew 'defcfun.varargs.docstrings rt::*expected-failures*) + +(deftest defcfun.varargs.docstrings + (documentation 'sprintf 'function) + "sprintf docstring") + +(deftest defcfun.varargs.char + (with-foreign-pointer-as-string (s 100) + (sprintf s "%c" :char 65)) + "A") + +(deftest defcfun.varargs.short + (with-foreign-pointer-as-string (s 100) + (sprintf s "%d" :short 42)) + "42") + +(deftest defcfun.varargs.int + (with-foreign-pointer-as-string (s 100) + (sprintf s "%d" :int 1000)) + "1000") + +(deftest defcfun.varargs.long + (with-foreign-pointer-as-string (s 100) + (sprintf s "%ld" :long 131072)) + "131072") + +(deftest defcfun.varargs.float + (with-foreign-pointer-as-string (s 100) + (sprintf s "%.2f" :float (float pi))) + "3.14") + +(deftest defcfun.varargs.double + (with-foreign-pointer-as-string (s 100) + (sprintf s "%.2f" :double (float pi 1.0d0))) + "3.14") + +#+(and scl long-float) +(deftest defcfun.varargs.long-double + (with-foreign-pointer-as-string (s 100) + (setf (mem-ref s :char) 0) + (sprintf s "%.2Lf" :long-double pi)) + "3.14") + +(deftest defcfun.varargs.string + (with-foreign-pointer-as-string (s 100) + (sprintf s "%s, %s!" :string "Hello" :string "world")) + "Hello, world!") + +;;; (let ((rettype (find-type :long)) +;;; (arg-types (n-random-types-no-ll 127))) +;;; (c-function rettype arg-types) +;;; (gen-function-test rettype arg-types)) + +#+(and (not ecl) + #.(cl:if (cl:>= cl:lambda-parameters-limit 127) '(:and) '(:or))) +(progn + (defcfun "sum_127_no_ll" :long + (a1 :long) (a2 :unsigned-long) (a3 :short) (a4 :unsigned-short) (a5 :float) + (a6 :double) (a7 :unsigned-long) (a8 :float) (a9 :unsigned-char) + (a10 :unsigned-short) (a11 :short) (a12 :unsigned-long) (a13 :double) + (a14 :long) (a15 :unsigned-int) (a16 :pointer) (a17 :unsigned-int) + (a18 :unsigned-short) (a19 :long) (a20 :float) (a21 :pointer) (a22 :float) + (a23 :int) (a24 :int) (a25 :unsigned-short) (a26 :long) (a27 :long) + (a28 :double) (a29 :unsigned-char) (a30 :unsigned-int) (a31 :unsigned-int) + (a32 :int) (a33 :unsigned-short) (a34 :unsigned-int) (a35 :pointer) + (a36 :double) (a37 :double) (a38 :long) (a39 :short) (a40 :unsigned-short) + (a41 :long) (a42 :char) (a43 :long) (a44 :unsigned-short) (a45 :pointer) + (a46 :int) (a47 :unsigned-int) (a48 :double) (a49 :unsigned-char) + (a50 :unsigned-char) (a51 :float) (a52 :int) (a53 :unsigned-short) + (a54 :double) (a55 :short) (a56 :unsigned-char) (a57 :unsigned-long) + (a58 :float) (a59 :float) (a60 :float) (a61 :pointer) (a62 :pointer) + (a63 :unsigned-int) (a64 :unsigned-long) (a65 :char) (a66 :short) + (a67 :unsigned-short) (a68 :unsigned-long) (a69 :pointer) (a70 :float) + (a71 :double) (a72 :long) (a73 :unsigned-long) (a74 :short) + (a75 :unsigned-int) (a76 :unsigned-short) (a77 :int) (a78 :unsigned-short) + (a79 :char) (a80 :double) (a81 :short) (a82 :unsigned-char) (a83 :float) + (a84 :char) (a85 :int) (a86 :double) (a87 :unsigned-char) (a88 :int) + (a89 :unsigned-long) (a90 :double) (a91 :short) (a92 :short) + (a93 :unsigned-int) (a94 :unsigned-char) (a95 :float) (a96 :long) + (a97 :float) (a98 :long) (a99 :long) (a100 :int) (a101 :int) + (a102 :unsigned-int) (a103 :char) (a104 :char) (a105 :unsigned-short) + (a106 :unsigned-int) (a107 :unsigned-short) (a108 :unsigned-short) + (a109 :int) (a110 :long) (a111 :char) (a112 :double) (a113 :unsigned-int) + (a114 :char) (a115 :short) (a116 :unsigned-long) (a117 :unsigned-int) + (a118 :short) (a119 :unsigned-char) (a120 :float) (a121 :pointer) + (a122 :double) (a123 :int) (a124 :long) (a125 :char) (a126 :unsigned-short) + (a127 :float)) + + (deftest defcfun.bff.1 + (sum-127-no-ll + 1442906394 520035521 -4715 50335 -13557.0 -30892.0d0 24061483 -23737.0 + 22 2348 4986 104895680 8073.0d0 -571698147 102484400 + (make-pointer 507907275) 12733353 7824 -1275845284 13602.0 + (make-pointer 286958390) -8042.0 -773681663 -1289932452 31199 -154985357 + -170994216 16845.0d0 177 218969221 2794350893 6068863 26327 127699339 + (make-pointer 184352771) 18512.0d0 -12345.0d0 -179853040 -19981 37268 + -792845398 116 -1084653028 50494 (make-pointer 2105239646) -1710519651 + 1557813312 2839.0d0 90 180 30580.0 -532698978 8623 9537.0d0 -10882 54 + 184357206 14929.0 -8190.0 -25615.0 (make-pointer 235310526) + (make-pointer 220476977) 7476055 1576685 -117 -11781 31479 23282640 + (make-pointer 8627281) -17834.0 10391.0d0 -1904504370 114393659 -17062 + 637873619 16078 -891210259 8107 0 760.0d0 -21268 104 14133.0 10 + 588598141 310.0d0 20 1351785456 16159552 -10121.0d0 -25866 24821 + 68232851 60 -24132.0 -1660411658 13387.0 -786516668 -499825680 + -1128144619 111849719 2746091587 -2 95 14488 326328135 64781 18204 + 150716680 -703859275 103 16809.0d0 852235610 -43 21088 242356110 + 324325428 -22380 23 24814.0 (make-pointer 40362014) -14322.0d0 + -1864262539 523684371 -21 49995 -29175.0) + 796447501)) + +;;; (let ((rettype (find-type :long-long)) +;;; (arg-types (n-random-types 127))) +;;; (c-function rettype arg-types) +;;; (gen-function-test rettype arg-types)) + +#-(or ecl cffi-sys::no-long-long + #.(cl:if (cl:>= cl:lambda-parameters-limit 127) '(:or) '(:and))) +(progn + (defcfun "sum_127" :long-long + (a1 :pointer) (a2 :pointer) (a3 :float) (a4 :unsigned-long) (a5 :pointer) + (a6 :long-long) (a7 :double) (a8 :double) (a9 :unsigned-short) (a10 :int) + (a11 :long-long) (a12 :long) (a13 :short) (a14 :unsigned-int) (a15 :long) + (a16 :unsigned-char) (a17 :int) (a18 :double) (a19 :short) (a20 :short) + (a21 :long-long) (a22 :unsigned-int) (a23 :unsigned-short) (a24 :short) + (a25 :pointer) (a26 :short) (a27 :unsigned-short) (a28 :unsigned-short) + (a29 :int) (a30 :long-long) (a31 :pointer) (a32 :int) (a33 :unsigned-long) + (a34 :unsigned-long) (a35 :pointer) (a36 :unsigned-long-long) (a37 :float) + (a38 :int) (a39 :short) (a40 :pointer) (a41 :unsigned-long-long) + (a42 :long-long) (a43 :unsigned-long) (a44 :unsigned-long) + (a45 :unsigned-long-long) (a46 :unsigned-long) (a47 :char) (a48 :double) + (a49 :long) (a50 :unsigned-int) (a51 :int) (a52 :short) (a53 :pointer) + (a54 :long) (a55 :unsigned-long-long) (a56 :int) (a57 :unsigned-short) + (a58 :unsigned-long-long) (a59 :float) (a60 :pointer) (a61 :float) + (a62 :unsigned-short) (a63 :unsigned-long) (a64 :float) (a65 :unsigned-int) + (a66 :unsigned-long-long) (a67 :pointer) (a68 :double) + (a69 :unsigned-long-long) (a70 :double) (a71 :double) (a72 :long-long) + (a73 :pointer) (a74 :unsigned-short) (a75 :long) (a76 :pointer) (a77 :short) + (a78 :double) (a79 :long) (a80 :unsigned-char) (a81 :pointer) + (a82 :unsigned-char) (a83 :long) (a84 :double) (a85 :pointer) (a86 :int) + (a87 :double) (a88 :unsigned-char) (a89 :double) (a90 :short) (a91 :long) + (a92 :int) (a93 :long) (a94 :double) (a95 :unsigned-short) + (a96 :unsigned-int) (a97 :int) (a98 :char) (a99 :long-long) (a100 :double) + (a101 :float) (a102 :unsigned-long) (a103 :short) (a104 :pointer) + (a105 :float) (a106 :long-long) (a107 :int) (a108 :long-long) + (a109 :long-long) (a110 :double) (a111 :unsigned-long-long) (a112 :double) + (a113 :unsigned-long) (a114 :char) (a115 :char) (a116 :unsigned-long) + (a117 :short) (a118 :unsigned-char) (a119 :unsigned-char) (a120 :int) + (a121 :int) (a122 :float) (a123 :unsigned-char) (a124 :unsigned-char) + (a125 :double) (a126 :unsigned-long-long) (a127 :char)) + + #+(and sbcl x86) (push 'defcfun.bff.2 rtest::*expected-failures*) + + (deftest defcfun.bff.2 + (sum-127 + (make-pointer 2746181372) (make-pointer 177623060) -32334.0 3158055028 + (make-pointer 242315091) 4288001754991016425 -21047.0d0 287.0d0 18722 + 243379286 -8677366518541007140 581399424 -13872 4240394881 1353358999 + 226 969197676 -26207.0d0 6484 11150 1241680089902988480 106068320 61865 + 2253 (make-pointer 866809333) -31613 35616 11715 1393601698 + 8940888681199591845 (make-pointer 1524606024) 805638893 3315410736 + 3432596795 (make-pointer 1490355706) 696175657106383698 -25438.0 + 1294381547 26724 (make-pointer 3196569545) 2506913373410783697 + -4405955718732597856 4075932032 3224670123 2183829215657835866 + 1318320964 -22 -3786.0d0 -2017024146 1579225515 -626617701 -1456 + (make-pointer 3561444187) 395687791 1968033632506257320 -1847773261 + 48853 142937735275669133 -17974.0 (make-pointer 2791749948) -14140.0 + 2707 3691328585 3306.0 1132012981 303633191773289330 + (make-pointer 981183954) 9114.0d0 8664374572369470 -19013.0d0 + -10288.0d0 -3679345119891954339 (make-pointer 3538786709) 23761 + -154264605 (make-pointer 2694396308) 7023 997.0d0 1009561368 241 + (make-pointer 2612292671) 48 1431872408 -32675.0d0 + (make-pointer 1587599336) 958916472 -9857.0d0 111 -14370.0d0 -7308 + -967514912 488790941 2146978095 -24111.0d0 13711 86681861 717987770 + 111 1013402998690933877 17234.0d0 -8772.0 3959216275 -8711 + (make-pointer 3142780851) 9480.0 -3820453146461186120 1616574376 + -3336232268263990050 -1906114671562979758 -27925.0d0 9695970875869913114 + 27033.0d0 1096518219 -12 104 3392025403 -27911 60 89 509297051 + -533066551 29158.0 110 54 -9802.0d0 593950442165910888 -79) + 7758614658402721936)) + +;;; regression test: defining an undefined foreign function should only +;;; throw some sort of warning, not signal an error. + +#+(or cmucl (and sbcl (or (not linkage-table) win32))) +(pushnew 'defcfun.undefined rt::*expected-failures*) + +(deftest defcfun.undefined + (progn + (eval '(defcfun ("undefined_foreign_function" undefined-foreign-function) :void)) + (compile 'undefined-foreign-function) + t) + t) + +;;; Test whether all doubles are passed correctly. On some platforms, eg. +;;; darwin/ppc, some are passed on registers others on the stack. +(defcfun "sum_double26" :double + (a1 :double) (a2 :double) (a3 :double) (a4 :double) (a5 :double) + (a6 :double) (a7 :double) (a8 :double) (a9 :double) (a10 :double) + (a11 :double) (a12 :double) (a13 :double) (a14 :double) (a15 :double) + (a16 :double) (a17 :double) (a18 :double) (a19 :double) (a20 :double) + (a21 :double) (a22 :double) (a23 :double) (a24 :double) (a25 :double) + (a26 :double)) + +(deftest defcfun.double26 + (sum-double26 3.14d0 3.14d0 3.14d0 3.14d0 3.14d0 3.14d0 3.14d0 + 3.14d0 3.14d0 3.14d0 3.14d0 3.14d0 3.14d0 3.14d0 + 3.14d0 3.14d0 3.14d0 3.14d0 3.14d0 3.14d0 3.14d0 + 3.14d0 3.14d0 3.14d0 3.14d0 3.14d0) + 81.64d0) + +;;; Same as above for floats. +(defcfun "sum_float26" :float + (a1 :float) (a2 :float) (a3 :float) (a4 :float) (a5 :float) + (a6 :float) (a7 :float) (a8 :float) (a9 :float) (a10 :float) + (a11 :float) (a12 :float) (a13 :float) (a14 :float) (a15 :float) + (a16 :float) (a17 :float) (a18 :float) (a19 :float) (a20 :float) + (a21 :float) (a22 :float) (a23 :float) (a24 :float) (a25 :float) + (a26 :float)) + +(deftest defcfun.float26 + (sum-float26 5.0 5.0 5.0 5.0 5.0 5.0 5.0 5.0 5.0 5.0 5.0 5.0 5.0 + 5.0 5.0 5.0 5.0 5.0 5.0 5.0 5.0 5.0 5.0 5.0 5.0 5.0) + 130.0) + +;;;# Namespaces + +#-cffi-sys::flat-namespace +(progn + (defcfun ("ns_function" ns-fun1 :library libtest) :boolean) + (defcfun ("ns_function" ns-fun2 :library libtest2) :boolean) + + (deftest defcfun.namespace.1 + (values (ns-fun1) (ns-fun2)) + t nil)) + +;;;# stdcall + +#+(and x86 windows (not cffi-sys::no-stdcall)) +(progn + (defcfun ("stdcall_fun@12" stdcall-fun :convention :stdcall) :int + (a :int) + (b :int) + (c :int)) + + (deftest defcfun.stdcall.1 + (loop repeat 100 do (stdcall-fun 1 2 3) + finally (return (stdcall-fun 1 2 3))) + 6)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/tests/enum.lisp b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/tests/enum.lisp new file mode 100644 index 0000000..85c2f2f --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/tests/enum.lisp @@ -0,0 +1,231 @@ +;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- +;;; +;;; enum.lisp --- Tests on C enums. +;;; +;;; Copyright (C) 2005-2006, Luis Oliveira +;;; +;;; Permission is hereby granted, free of charge, to any person +;;; obtaining a copy of this software and associated documentation +;;; files (the "Software"), to deal in the Software without +;;; restriction, including without limitation the rights to use, copy, +;;; modify, merge, publish, distribute, sublicense, and/or sell copies +;;; of the Software, and to permit persons to whom the Software is +;;; furnished to do so, subject to the following conditions: +;;; +;;; The above copyright notice and this permission notice shall be +;;; included in all copies or substantial portions of the Software. +;;; +;;; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +;;; EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +;;; MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +;;; NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +;;; HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +;;; WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +;;; OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +;;; DEALINGS IN THE SOFTWARE. +;;; + +(in-package #:cffi-tests) + +(defctype numeros-base-type :int) + +(defcenum (numeros numeros-base-type) + (:one 1) + :two + :three + :four + (:forty-one 41) + :forty-two) + +(defcfun "check_enums" :int + (%one numeros) + (%two numeros) + (%three numeros) + (%four numeros) + (%forty-one numeros) + (%forty-two numeros)) + +(deftest enum.1 + (check-enums :one :two :three 4 :forty-one :forty-two) + 1) + +(defcenum another-boolean :false :true) +(defcfun "return_enum" another-boolean (x :uint)) + +(deftest enum.2 + (and (eq :false (return-enum 0)) + (eq :true (return-enum 1))) + t) + +(defctype yet-another-boolean another-boolean) +(defcfun ("return_enum" return-enum2) yet-another-boolean + (x yet-another-boolean)) + +(deftest enum.3 + (and (eq :false (return-enum2 :false)) + (eq :true (return-enum2 :true))) + t) + +(defctype numeros-typedef numeros) + +(deftest enum.typedef.1 + (eq (foreign-enum-keyword 'numeros-typedef 1) + (foreign-enum-keyword 'numeros 1)) + t) + +(deftest enum.typedef.2 + (eql (foreign-enum-value 'numeros-typedef :four) + (foreign-enum-value 'numeros :four)) + t) + +(defcenum enum-size.int + (:one 1) + (enum-size-int #.(1- (expt 2 (1- (* (foreign-type-size :unsigned-int) 8))))) + (enum-size-negative-int #.(- (1- (expt 2 (1- (* (foreign-type-size :unsigned-int) 8)))))) + (:two 2)) + +(defcenum enum-size.uint + (:one 1) + (enum-size-uint #.(1- (expt 2 (* (foreign-type-size :unsigned-int) 8)))) + (:two 2)) + +(deftest enum.size + (mapcar (alexandria:compose 'cffi::unparse-type + 'cffi::actual-type + 'cffi::parse-type) + (list 'enum-size.int + 'enum-size.uint)) + ;; The C standard only has weak constraints on the size of integer types, so + ;; we cannot really test more than one type in a platform independent way due + ;; to the possible overlaps. + (:int + :unsigned-int)) + +(deftest enum.size.members + (mapcar (alexandria:conjoin 'boundp 'constantp) + '(enum-size-int enum-size-negative-int enum-size-uint)) + (t t t)) + +(deftest enum.size.error-when-too-large + (expecting-error + (eval '(defcenum enum-size-too-large + (:too-long #.(expt 2 129))))) + :error) + +;; There are some projects that use non-integer base type. It's not in +;; adherence with the C standard, but we also don't lose much by +;; allowing it. +(defcenum (enum.double :double) + (:one 1) + (:two 2d0) + (:three 3.42) + :four) + +(deftest enum.double + (values-list + (mapcar (alexandria:curry 'foreign-enum-value 'enum.double) + '(:one :two :three :four))) + 1 + 2.0d0 + 3.42 + 4.42) + +;;;# Bitfield tests + +;;; Regression test: defbitfield was misbehaving when the first value +;;; was provided. +(deftest bitfield.1 + (eval '(defbitfield (bf1 :long) + (:foo 0))) + bf1) + +(defbitfield bf2 + one + two + four + eight + sixteen + (bf2.outlier 42) + thirty-two + sixty-four) + +(deftest bitfield.2 + (mapcar (lambda (symbol) + (foreign-bitfield-value 'bf2 (list symbol))) + '(one two four eight sixteen thirty-two sixty-four)) + (1 2 4 8 16 32 64)) + +(deftest bitfield.2.outlier + (mapcar (lambda (symbol) + (foreign-bitfield-value 'bf2 (list symbol))) + '(one two four eight sixteen thirty-two sixty-four)) + (1 2 4 8 16 32 64)) + +(defbitfield (bf3 :int) + (three 3) + one + (seven 7) + two + (eight 8) + sixteen) + +;;; Non-single-bit numbers must not influence the progression of +;;; implicit values. Single bits larger than any before *must* +;;; influence said progression. +(deftest bitfield.3 + (mapcar (lambda (symbol) + (foreign-bitfield-value 'bf3 (list symbol))) + '(one two sixteen)) + (1 2 16)) + +(defbitfield bf4 + ;; zero will be a simple enum member because it's not a valid mask + (zero 0) + one + two + four + (three 3) + (sixteen 16)) + +;;; Yet another edge case with the 0... +(deftest bitfield.4 + ;; These should macroexpand to the literals in Slime + ;; due to the compiler macros. Same below. + (values (foreign-bitfield-value 'bf4 ()) + (foreign-bitfield-value 'bf4 'one) + (foreign-bitfield-value 'bf4 '(one two)) + (foreign-bitfield-value 'bf4 '(three)) ; or should it signal an error? + (foreign-bitfield-value 'bf4 '(sixteen))) + 0 + 1 + 3 + 3 + 16) + +(deftest bitfield.4b + (values (foreign-bitfield-symbols 'bf4 0) + (foreign-bitfield-symbols 'bf4 1) + (foreign-bitfield-symbols 'bf4 3) + (foreign-bitfield-symbols 'bf4 8) + (foreign-bitfield-symbols 'bf4 16)) + nil + (one) + (one two) + nil + (sixteen)) + +(deftest bitfield.translators + (with-foreign-object (bf 'bf4 2) + (setf (mem-aref bf 'bf4 0) 1) + (setf (mem-aref bf 'bf4 1) 3) + (values (mem-aref bf 'bf4 0) + (mem-aref bf 'bf4 1))) + (one) + (one two)) + +#+nil +(deftest bitfield.base-type-error + (expecting-error + (eval '(defbitfield (bf1 :float) + (:foo 0)))) + :error) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/tests/foreign-globals.lisp b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/tests/foreign-globals.lisp new file mode 100644 index 0000000..8527cdf --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/tests/foreign-globals.lisp @@ -0,0 +1,309 @@ +;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- +;;; +;;; foreign-globals.lisp --- Tests on foreign globals. +;;; +;;; Copyright (C) 2005-2007, Luis Oliveira +;;; +;;; Permission is hereby granted, free of charge, to any person +;;; obtaining a copy of this software and associated documentation +;;; files (the "Software"), to deal in the Software without +;;; restriction, including without limitation the rights to use, copy, +;;; modify, merge, publish, distribute, sublicense, and/or sell copies +;;; of the Software, and to permit persons to whom the Software is +;;; furnished to do so, subject to the following conditions: +;;; +;;; The above copyright notice and this permission notice shall be +;;; included in all copies or substantial portions of the Software. +;;; +;;; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +;;; EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +;;; MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +;;; NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +;;; HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +;;; WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +;;; OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +;;; DEALINGS IN THE SOFTWARE. +;;; + +(in-package #:cffi-tests) + +(defcvar ("var_char" *char-var*) :char) +(defcvar "var_unsigned_char" :unsigned-char) +(defcvar "var_short" :short) +(defcvar "var_unsigned_short" :unsigned-short) +(defcvar "var_int" :int) +(defcvar "var_unsigned_int" :unsigned-int) +(defcvar "var_long" :long) +(defcvar "var_unsigned_long" :unsigned-long) +(defcvar "var_float" :float) +(defcvar "var_double" :double) +(defcvar "var_pointer" :pointer) +(defcvar "var_string" :string) +(defcvar "var_long_long" :long-long) +(defcvar "var_unsigned_long_long" :unsigned-long-long) + +;;; The expected failures marked below result from this odd behaviour: +;;; +;;; (foreign-symbol-pointer "var_char") => NIL +;;; +;;; (foreign-symbol-pointer "var_char" :library 'libtest) +;;; => # +;;; +;;; Why is this happening? --luis +#+lispworks +(mapc (lambda (x) (pushnew x rtest::*expected-failures*)) + '(foreign-globals.ref.char foreign-globals.get-var-pointer.1 + foreign-globals.get-var-pointer.2 foreign-globals.symbol-name + foreign-globals.read-only.1 )) + +(deftest foreign-globals.ref.char + *char-var* + -127) + +(deftest foreign-globals.ref.unsigned-char + *var-unsigned-char* + 255) + +(deftest foreign-globals.ref.short + *var-short* + -32767) + +(deftest foreign-globals.ref.unsigned-short + *var-unsigned-short* + 65535) + +(deftest foreign-globals.ref.int + *var-int* + -32767) + +(deftest foreign-globals.ref.unsigned-int + *var-unsigned-int* + 65535) + +(deftest foreign-globals.ref.long + *var-long* + -2147483647) + +(deftest foreign-globals.ref.unsigned-long + *var-unsigned-long* + 4294967295) + +(deftest foreign-globals.ref.float + *var-float* + 42.0) + +(deftest foreign-globals.ref.double + *var-double* + 42.0d0) + +(deftest foreign-globals.ref.pointer + (null-pointer-p *var-pointer*) + t) + +(deftest foreign-globals.ref.string + *var-string* + "Hello, foreign world!") + +#+openmcl (push 'foreign-globals.set.long-long rt::*expected-failures*) + +(deftest foreign-globals.ref.long-long + *var-long-long* + -9223372036854775807) + +(deftest foreign-globals.ref.unsigned-long-long + *var-unsigned-long-long* + 18446744073709551615) + +;; The *.set.* tests restore the old values so that the *.ref.* +;; don't fail when re-run. +(defmacro with-old-value-restored ((place) &body body) + (let ((old (gensym))) + `(let ((,old ,place)) + (prog1 + (progn ,@body) + (setq ,place ,old))))) + +(deftest foreign-globals.set.int + (with-old-value-restored (*var-int*) + (setq *var-int* 42) + *var-int*) + 42) + +(deftest foreign-globals.set.string + (with-old-value-restored (*var-string*) + (setq *var-string* "Ehxosxangxo") + (prog1 + *var-string* + ;; free the string we just allocated + (foreign-free (mem-ref (get-var-pointer '*var-string*) :pointer)))) + "Ehxosxangxo") + +(deftest foreign-globals.set.long-long + (with-old-value-restored (*var-long-long*) + (setq *var-long-long* -9223000000000005808) + *var-long-long*) + -9223000000000005808) + +(deftest foreign-globals.get-var-pointer.1 + (pointerp (get-var-pointer '*char-var*)) + t) + +(deftest foreign-globals.get-var-pointer.2 + (mem-ref (get-var-pointer '*char-var*) :char) + -127) + +;;; Symbol case. + +(defcvar "UPPERCASEINT1" :int) +(defcvar "UPPER_CASE_INT1" :int) +(defcvar "MiXeDCaSeInT1" :int) +(defcvar "MiXeD_CaSe_InT1" :int) + +(deftest foreign-globals.ref.uppercaseint1 + *uppercaseint1* + 12345) + +(deftest foreign-globals.ref.upper-case-int1 + *upper-case-int1* + 23456) + +(deftest foreign-globals.ref.mixedcaseint1 + *mixedcaseint1* + 34567) + +(deftest foreign-globals.ref.mixed-case-int1 + *mixed-case-int1* + 45678) + +(when (string= (symbol-name 'nil) "NIL") + (let ((*readtable* (copy-readtable))) + (setf (readtable-case *readtable*) :invert) + (eval (read-from-string "(defcvar \"UPPERCASEINT2\" :int)")) + (eval (read-from-string "(defcvar \"UPPER_CASE_INT2\" :int)")) + (eval (read-from-string "(defcvar \"MiXeDCaSeInT2\" :int)")) + (eval (read-from-string "(defcvar \"MiXeD_CaSe_InT2\" :int)")) + (setf (readtable-case *readtable*) :preserve) + (eval (read-from-string "(DEFCVAR \"UPPERCASEINT3\" :INT)")) + (eval (read-from-string "(DEFCVAR \"UPPER_CASE_INT3\" :INT)")) + (eval (read-from-string "(DEFCVAR \"MiXeDCaSeInT3\" :INT)")) + (eval (read-from-string "(DEFCVAR \"MiXeD_CaSe_InT3\" :INT)")))) + + +;;; EVAL gets rid of SBCL's unreachable code warnings. +(when (string= (symbol-name (eval nil)) "nil") + (let ((*readtable* (copy-readtable))) + (setf (readtable-case *readtable*) :invert) + (eval (read-from-string "(DEFCVAR \"UPPERCASEINT2\" :INT)")) + (eval (read-from-string "(DEFCVAR \"UPPER_CASE_INT2\" :INT)")) + (eval (read-from-string "(DEFCVAR \"MiXeDCaSeInT2\" :INT)")) + (eval (read-from-string "(DEFCVAR \"MiXeD_CaSe_InT2\" :INT)")) + (setf (readtable-case *readtable*) :downcase) + (eval (read-from-string "(defcvar \"UPPERCASEINT3\" :int)")) + (eval (read-from-string "(defcvar \"UPPER_CASE_INT3\" :int)")) + (eval (read-from-string "(defcvar \"MiXeDCaSeInT3\" :int)")) + (eval (read-from-string "(defcvar \"MiXeD_CaSe_InT3\" :int)")))) + +(deftest foreign-globals.ref.uppercaseint2 + *uppercaseint2* + 12345) + +(deftest foreign-globals.ref.upper-case-int2 + *upper-case-int2* + 23456) + +(deftest foreign-globals.ref.mixedcaseint2 + *mixedcaseint2* + 34567) + +(deftest foreign-globals.ref.mixed-case-int2 + *mixed-case-int2* + 45678) + +(deftest foreign-globals.ref.uppercaseint3 + *uppercaseint3* + 12345) + +(deftest foreign-globals.ref.upper-case-int3 + *upper-case-int3* + 23456) + +(deftest foreign-globals.ref.mixedcaseint3 + *mixedcaseint3* + 34567) + +(deftest foreign-globals.ref.mixed-case-int3 + *mixed-case-int3* + 45678) + +;;; regression test: +;;; gracefully accept symbols in defcvar + +(defcvar *var-char* :char) +(defcvar var-char :char) + +(deftest foreign-globals.symbol-name + (values *var-char* var-char) + -127 -127) + +;;;# Namespace + +#-cffi-sys::flat-namespace +(progn + (deftest foreign-globals.namespace.1 + (values + (mem-ref (foreign-symbol-pointer "var_char" :library 'libtest) :char) + (foreign-symbol-pointer "var_char" :library 'libtest2)) + -127 nil) + + (deftest foreign-globals.namespace.2 + (values + (mem-ref (foreign-symbol-pointer "ns_var" :library 'libtest) :boolean) + (mem-ref (foreign-symbol-pointer "ns_var" :library 'libtest2) :boolean)) + t nil) + + ;; For its "default" module, Lispworks seems to cache lookups from + ;; the newest module tried. If a lookup happens to have failed + ;; subsequent lookups will fail even the symbol exists in other + ;; modules. So this test fails. + #+lispworks + (pushnew 'foreign-globals.namespace.3 regression-test::*expected-failures*) + + (deftest foreign-globals.namespace.3 + (values + (foreign-symbol-pointer "var_char" :library 'libtest2) + (mem-ref (foreign-symbol-pointer "var_char") :char)) + nil -127) + + (defcvar ("ns_var" *ns-var1* :library libtest) :boolean) + (defcvar ("ns_var" *ns-var2* :library libtest2) :boolean) + + (deftest foreign-globals.namespace.4 + (values *ns-var1* *ns-var2*) + t nil)) + +;;;# Read-only + +(defcvar ("var_char" *var-char-ro* :read-only t) :char + "docstring") + +(deftest foreign-globals.read-only.1 + (values *var-char-ro* + (ignore-errors (setf *var-char-ro* 12))) + -127 nil) + +(deftest defcvar.docstring + (documentation '*var-char-ro* 'variable) + "docstring") + +;;;# Other tests + +;;; RT: FOREIGN-SYMBOL-POINTER shouldn't signal an error when passed +;;; an undefined variable. +(deftest foreign-globals.undefined.1 + (foreign-symbol-pointer "surely-undefined?") + nil) + +(deftest foreign-globals.error.1 + (handler-case (foreign-symbol-pointer 'not-a-string) + (type-error () t)) + t) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/tests/fsbv.lisp b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/tests/fsbv.lisp new file mode 100644 index 0000000..85681fc --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/tests/fsbv.lisp @@ -0,0 +1,199 @@ +;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- +;;; +;;; fsbv.lisp --- Tests of foreign structure by value calls. +;;; +;;; Copyright (C) 2011, Liam M. Healy +;;; +;;; Permission is hereby granted, free of charge, to any person +;;; obtaining a copy of this software and associated documentation +;;; files (the "Software"), to deal in the Software without +;;; restriction, including without limitation the rights to use, copy, +;;; modify, merge, publish, distribute, sublicense, and/or sell copies +;;; of the Software, and to permit persons to whom the Software is +;;; furnished to do so, subject to the following conditions: +;;; +;;; The above copyright notice and this permission notice shall be +;;; included in all copies or substantial portions of the Software. +;;; +;;; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +;;; EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +;;; MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +;;; NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +;;; HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +;;; WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +;;; OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +;;; DEALINGS IN THE SOFTWARE. +;;; + +(in-package #:cffi-tests) + +;; Requires struct.lisp + +(defcfun "sumpair" :int + (p (:struct struct-pair))) + +(defcfun "makepair" (:struct struct-pair) + (condition :bool)) + +(defcfun "doublepair" (:struct struct-pair) + (p (:struct struct-pair))) + +(defcfun "prodsumpair" :double + (p (:struct struct-pair+double))) + +(defcfun "doublepairdouble" (:struct struct-pair+double) + (p (:struct struct-pair+double))) + +;;; Call struct by value +(deftest fsbv.1 + (sumpair '(1 . 2)) + 3) + +;;; See lp#1528719 +(deftest (fsbv.wfo :expected-to-fail t) + (with-foreign-object (arg '(:struct struct-pair)) + (convert-into-foreign-memory '(40 . 2) '(:struct struct-pair) arg) + (sumpair arg)) + 42) + +;;; Call and return struct by value +(deftest fsbv.2 + (doublepair '(1 . 2)) + (2 . 4)) + +;;; return struct by value +(deftest (fsbv.makepair.1 :expected-to-fail t) + (makepair nil) + (-127 . 43)) + +(deftest (fsbv.makepair.2 :expected-to-fail t) + (makepair t) + (-127 . 42)) + +;;; Call recursive structure by value +(deftest fsbv.3 + (prodsumpair '(pr (a 4 b 5) dbl 2.5d0)) + 22.5d0) + +;;; Call and return recursive structure by value +(deftest fsbv.4 + (let ((ans (doublepairdouble '(pr (a 4 b 5) dbl 2.5d0)))) + (values (getf (getf ans 'pr) 'a) + (getf (getf ans 'pr) 'b) + (getf ans 'dbl))) + 8 + 10 + 5.0d0) + +(defcstruct (struct-with-array :size 6) + (s1 (:array :char 6))) + +(defcfun "zork" :void + (p (:struct struct-with-array))) + +;;; Typedef fsbv test + +(defcfun ("sumpair" sumpair2) :int + (p struct-pair-typedef1)) + +(deftest fsbv.5 + (sumpair2 '(1 . 2)) + 3) + +(defcfun "returnpairpointer" (:pointer (:struct struct-pair)) + (ignored (:struct struct-pair))) + +(deftest fsbv.return-a-pointer + (let ((ptr (returnpairpointer '(1 . 2)))) + (+ (foreign-slot-value ptr '(:struct struct-pair) 'a) + (foreign-slot-value ptr '(:struct struct-pair) 'b))) + 42) + +;;; Test ulonglong on no-long-long implementations. + +(defcfun "ullsum" :unsigned-long-long + (a :unsigned-long-long) (b :unsigned-long-long)) + +(deftest fsbv.6 + (ullsum #x10DEADBEEF #x2300000000) + #x33DEADBEEF) + +;;; Combine structures by value with a string argument +(defcfun "stringlenpair" (:struct struct-pair) + (s :string) + (p (:struct struct-pair))) + +(deftest fsbv.7 + (stringlenpair "abc" '(1 . 2)) + (3 . 6)) + +;;; Combine structures by value with an enum argument +(defcfun "enumpair" (:int) + (e numeros) + (p (:struct struct-pair))) + +(deftest fsbv.8 + (enumpair :two '(1 . 2)) + 5) + +;;; returning struct with bitfield member (bug #1474631) +(defbitfield (struct-bitfield :unsigned-int) + (:a 1) + (:b 2)) + +(defcstruct bitfield-struct + (b struct-bitfield)) + +(defcfun "structbitfield" (:struct bitfield-struct) + (x :unsigned-int)) + +(defctype struct-bitfield-typedef struct-bitfield) + +(defcstruct bitfield-struct.2 + (b struct-bitfield-typedef)) + +(defcfun ("structbitfield" structbitfield.2) (:struct bitfield-struct.2) + (x :unsigned-int)) + +;; these would get stuck in an infinite loop previously +(deftest fsbv.struct-bitfield.0 + (structbitfield 0) + (b nil)) + +(deftest fsbv.struct-bitfield.1 + (structbitfield 1) + (b (:a))) + +(deftest fsbv.struct-bitfield.2 + (structbitfield 2) + (b (:b))) + +(deftest fsbv.struct-bitfield.3 + (structbitfield.2 2) + (b (:b))) + +;;; Test for a discrepancy between normal and fsbv return values +(cffi:define-foreign-type int-return-code (cffi::foreign-type-alias) + () + (:default-initargs :actual-type (cffi::parse-type :int)) + (:simple-parser int-return-code)) + +(defmethod cffi:expand-from-foreign (value (type int-return-code)) + ;; NOTE: strictly speaking it should be + ;; (cffi:convert-from-foreign ,value :int), but it's irrelevant in this case + `(let ((return-code ,value)) + (check-type return-code integer) + return-code)) + +(defcfun (noargs-with-typedef "noargs") int-return-code) + +(deftest fsbv.noargs-with-typedef ; for reference, not an FSBV call + (noargs-with-typedef) + 42) + +(defcfun (sumpair-with-typedef "sumpair") int-return-code + (p (:struct struct-pair))) + +(deftest (fsbv.return-value-typedef) + (sumpair-with-typedef '(40 . 2)) + 42) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/tests/funcall.lisp b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/tests/funcall.lisp new file mode 100644 index 0000000..f971bfa --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/tests/funcall.lisp @@ -0,0 +1,245 @@ +;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- +;;; +;;; funcall.lisp --- Tests function calling. +;;; +;;; Copyright (C) 2005-2006, James Bielman +;;; Copyright (C) 2005-2007, Luis Oliveira +;;; +;;; Permission is hereby granted, free of charge, to any person +;;; obtaining a copy of this software and associated documentation +;;; files (the "Software"), to deal in the Software without +;;; restriction, including without limitation the rights to use, copy, +;;; modify, merge, publish, distribute, sublicense, and/or sell copies +;;; of the Software, and to permit persons to whom the Software is +;;; furnished to do so, subject to the following conditions: +;;; +;;; The above copyright notice and this permission notice shall be +;;; included in all copies or substantial portions of the Software. +;;; +;;; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +;;; EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +;;; MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +;;; NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +;;; HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +;;; WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +;;; OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +;;; DEALINGS IN THE SOFTWARE. +;;; + +(in-package #:cffi-tests) + +;;;# Calling with Built-In C Types +;;; +;;; Tests calling standard C library functions both passing and +;;; returning each built-in type. + +;;; Don't run these tests if the implementation does not support +;;; foreign-funcall. +#-cffi-sys::no-foreign-funcall +(progn + +(deftest funcall.char + (foreign-funcall "toupper" :char (char-code #\a) :char) + #.(char-code #\A)) + +(deftest funcall.int.1 + (foreign-funcall "abs" :int -100 :int) + 100) + +(defun funcall-abs (n) + (foreign-funcall "abs" :int n :int)) + +;;; regression test: lispworks's %foreign-funcall based on creating +;;; and caching foreign-funcallables at macro-expansion time. +(deftest funcall.int.2 + (funcall-abs -42) + 42) + +(deftest funcall.long + (foreign-funcall "labs" :long -131072 :long) + 131072) + +#-cffi-sys::no-long-long +(deftest funcall.long-long + (foreign-funcall "my_llabs" :long-long -9223372036854775807 :long-long) + 9223372036854775807) + +#-cffi-sys::no-long-long +(deftest funcall.unsigned-long-long + (let ((ullong-max (1- (expt 2 (* 8 (foreign-type-size :unsigned-long-long)))))) + (eql ullong-max + (foreign-funcall "ullong" :unsigned-long-long ullong-max + :unsigned-long-long))) + t) + +(deftest funcall.float + (foreign-funcall "my_sqrtf" :float 16.0 :float) + 4.0) + +(deftest funcall.double + (foreign-funcall "sqrt" :double 36.0d0 :double) + 6.0d0) + +#+(and scl long-float) +(deftest funcall.long-double + (foreign-funcall "sqrtl" :long-double 36.0l0 :long-double) + 6.0l0) + +(deftest funcall.string.1 + (foreign-funcall "strlen" :string "Hello" :int) + 5) + +(deftest funcall.string.2 + (with-foreign-pointer-as-string (s 100) + (setf (mem-ref s :char) 0) + (foreign-funcall "strcpy" :pointer s :string "Hello" :pointer) + (foreign-funcall "strcat" :pointer s :string ", world!" :pointer)) + "Hello, world!") + +(deftest funcall.string.3 + (with-foreign-pointer (ptr 100) + (lisp-string-to-foreign "Hello, " ptr 8) + (foreign-funcall "strcat" :pointer ptr :string "world!" :string)) + "Hello, world!") + +;;;# Calling Varargs Functions + +(deftest funcall.varargs.nostdlib + (foreign-funcall-varargs + "sum_double_arbitrary" (:int 26) + :double 3.14d0 :double 3.14d0 :double 3.14d0 :double 3.14d0 + :double 3.14d0 :double 3.14d0 :double 3.14d0 :double 3.14d0 + :double 3.14d0 :double 3.14d0 :double 3.14d0 :double 3.14d0 + :double 3.14d0 :double 3.14d0 :double 3.14d0 :double 3.14d0 + :double 3.14d0 :double 3.14d0 :double 3.14d0 :double 3.14d0 + :double 3.14d0 :double 3.14d0 :double 3.14d0 :double 3.14d0 + :double 3.14d0 :double 3.14d0 + :double) + 81.64d0) + +;; The CHAR argument must be passed as :INT because chars are promoted +;; to ints when passed as variable arguments. +(deftest funcall.varargs.char + (with-foreign-pointer-as-string (s 100) + (setf (mem-ref s :char) 0) + (foreign-funcall-varargs + "sprintf" (:pointer s :string "%c") :int 65 :int)) + "A") + +(deftest funcall.varargs.int + (with-foreign-pointer-as-string (s 100) + (setf (mem-ref s :char) 0) + (foreign-funcall-varargs + "sprintf" (:pointer s :string "%d") :int 1000 :int)) + "1000") + +(deftest funcall.varargs.long + (with-foreign-pointer-as-string (s 100) + (setf (mem-ref s :char) 0) + (foreign-funcall-varargs + "sprintf" (:pointer s :string "%ld") + :long 131072 :int)) + "131072") + +;;; There is no FUNCALL.VARARGS.FLOAT as floats are promoted to double +;;; when passed as variable arguments. Currently this fails in SBCL +;;; and CMU CL on Darwin/ppc. +(deftest funcall.varargs.double + (with-foreign-pointer-as-string (s 100) + (setf (mem-ref s :char) 0) + (foreign-funcall-varargs + "sprintf" (:pointer s :string "%.2f") :double (coerce pi 'double-float) :int)) + "3.14") + +#+(and scl long-float) +(deftest funcall.varargs.long-double + (with-foreign-pointer-as-string (s 100) + (setf (mem-ref s :char) 0) + (foreign-funcall-varargs + "sprintf" :pointer s :string "%.2Lf" :long-double pi :int)) + "3.14") + +(deftest funcall.varargs.string + (with-foreign-pointer-as-string (s 100) + (setf (mem-ref s :char) 0) + (foreign-funcall-varargs + "sprintf" (:pointer s :string "%s, %s!") :string "Hello" :string "world" :int)) + "Hello, world!") + +;;; See DEFCFUN.DOUBLE26. +(deftest funcall.double26 + (foreign-funcall "sum_double26" + :double 3.14d0 :double 3.14d0 :double 3.14d0 + :double 3.14d0 :double 3.14d0 :double 3.14d0 + :double 3.14d0 :double 3.14d0 :double 3.14d0 + :double 3.14d0 :double 3.14d0 :double 3.14d0 + :double 3.14d0 :double 3.14d0 :double 3.14d0 + :double 3.14d0 :double 3.14d0 :double 3.14d0 + :double 3.14d0 :double 3.14d0 :double 3.14d0 + :double 3.14d0 :double 3.14d0 :double 3.14d0 + :double 3.14d0 :double 3.14d0 :double) + 81.64d0) + +;;; See DEFCFUN.FLOAT26. +(deftest funcall.float26 + (foreign-funcall "sum_float26" + :float 5.0 :float 5.0 :float 5.0 :float 5.0 :float 5.0 + :float 5.0 :float 5.0 :float 5.0 :float 5.0 :float 5.0 + :float 5.0 :float 5.0 :float 5.0 :float 5.0 :float 5.0 + :float 5.0 :float 5.0 :float 5.0 :float 5.0 :float 5.0 + :float 5.0 :float 5.0 :float 5.0 :float 5.0 :float 5.0 + :float 5.0 :float) + 130.0) + +;;; Funcalling a pointer. +(deftest funcall.f-s-p.1 + (foreign-funcall-pointer (foreign-symbol-pointer "abs") nil :int -42 :int) + 42) + +;;;# Namespaces + +#-cffi-sys::flat-namespace +(deftest funcall.namespace.1 + (values (foreign-funcall ("ns_function" :library libtest) :boolean) + (foreign-funcall ("ns_function" :library libtest2) :boolean)) + t nil) + +;;;# stdcall + +#+(and x86 windows (not cffi-sys::no-stdcall)) +(deftest funcall.stdcall.1 + (flet ((fun () + (foreign-funcall ("stdcall_fun@12" :convention :stdcall) + :int 1 :int 2 :int 3 :int))) + (loop repeat 100 do (fun) + finally (return (fun)))) + 6) + +;;; RT: NIL arguments are skipped + +(defvar *nil-skipped*) + +(define-foreign-type check-nil-skip-type () + () + (:actual-type :pointer) + (:simple-parser check-nil-skip-type)) + +(defmethod expand-to-foreign (val (type check-nil-skip-type)) + (declare (ignore val)) + (setf *nil-skipped* nil) + (null-pointer)) + +(deftest funcall.nil-skip + (let ((*nil-skipped* t)) + (compile nil '(lambda () + (foreign-funcall "abs" check-nil-skip-type nil))) + *nil-skipped*) + nil) + +;;; RT: CLISP returns NIL instead of a null-pointer + +(deftest funcall.pointer-not-nil + (not (null (foreign-funcall "strchr" :string "" :int 1 :pointer))) + t) + +) ;; #-cffi-sys::no-foreign-funcall diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/tests/grovel.lisp b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/tests/grovel.lisp new file mode 100644 index 0000000..97cad59 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/tests/grovel.lisp @@ -0,0 +1,96 @@ +;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- +;;; +;;; grovel.lisp --- CFFI-Grovel tests. +;;; +;;; Copyright (C) 2014, Luis Oliveira +;;; +;;; Permission is hereby granted, free of charge, to any person +;;; obtaining a copy of this software and associated documentation +;;; files (the "Software"), to deal in the Software without +;;; restriction, including without limitation the rights to use, copy, +;;; modify, merge, publish, distribute, sublicense, and/or sell copies +;;; of the Software, and to permit persons to whom the Software is +;;; furnished to do so, subject to the following conditions: +;;; +;;; The above copyright notice and this permission notice shall be +;;; included in all copies or substantial portions of the Software. +;;; +;;; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +;;; EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +;;; MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +;;; NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +;;; HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +;;; WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +;;; OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +;;; DEALINGS IN THE SOFTWARE. +;;; + +(in-package #:cffi-tests) + +(deftest %invoke + (cffi-grovel::invoke "echo" "test") + nil nil 0) + +(defun grovel-forms (forms &key (quiet t)) + (uiop:with-temporary-file (:stream grovel-stream :pathname grovel-file) + (with-standard-io-syntax + (with-open-stream (*standard-output* grovel-stream) + (let ((*package* (find-package :keyword))) + (mapc #'write forms)))) + (let ((lisp-file (let ((*debug-io* (if quiet (make-broadcast-stream) *debug-io*))) + (cffi-grovel:process-grovel-file grovel-file)))) + (unwind-protect + (load lisp-file) + (uiop:delete-file-if-exists lisp-file))))) + +(defun bug-1395242-helper (enum-type base-type constant-name) + (check-type enum-type (member constantenum cenum)) + (check-type base-type string) + (check-type constant-name string) + (let ((enum-name (intern (symbol-name (gensym)))) + (base-type-name (intern (symbol-name (gensym))))) + (grovel-forms `((ctype ,base-type-name ,base-type) + (,enum-type (,enum-name :base-type ,base-type-name) + ((:value ,constant-name))))) + (cffi:foreign-enum-value enum-name :value))) + +(deftest bug-1395242 + (labels + ((process-expression (expression) + (loop for enum-type in '(constantenum cenum) + always (destructuring-bind (base-type &rest evaluations) expression + (loop for (name expected-value) in evaluations + for actual-value = (bug-1395242-helper enum-type base-type name) + always (or (= expected-value actual-value) + (progn + (format *error-output* + "Test failed for case: ~A, ~A, ~A (expected ~A, actual ~A)~%" + enum-type base-type name expected-value actual-value) + nil))))))) + (every #'process-expression + '(("uint8_t" ("UINT8_MAX" 255) ("INT8_MAX" 127) ("INT8_MIN" 128)) + ("int8_t" ("INT8_MIN" -128) ("INT8_MAX" 127) ("UINT8_MAX" -1)) + ("uint16_t" ("UINT16_MAX" 65535) ("INT8_MIN" 65408)) + ("int16_t" ("INT16_MIN" -32768) ("INT16_MAX" 32767) ("UINT16_MAX" -1)) + ("uint32_t" ("UINT32_MAX" 4294967295) ("INT8_MIN" 4294967168)) + ("int32_t" ("INT32_MIN" -2147483648) ("INT32_MAX" 2147483647))))) + t) + +(defvar *grovelled-features*) + +(deftest grovel-feature + (let ((*grovelled-features* nil)) + (grovel-forms `((in-package :cffi-tests) + (include "limits.h") + (feature grovel-test-feature "CHAR_BIT") + (feature :char-bit "CHAR_BIT" + :feature-list *grovelled-features*) + (feature :inexistent-grovel-feature + "INEXISTENT_CFFI_GROVEL_FEATURE" + :feature-list *grovelled-features*))) + (unwind-protect + (values (and (member 'grovel-test-feature *features*) t) + (and (member :char-bit *grovelled-features*) t) + (member :inexistent-grovel-feature *grovelled-features*)) + (alexandria:removef *features* 'grovel-test-feature))) + t t nil) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/tests/libfsbv.c b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/tests/libfsbv.c new file mode 100644 index 0000000..8df645e --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/tests/libfsbv.c @@ -0,0 +1,179 @@ +/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil -*- + * + * libfsbv.c --- auxiliary C lib for testing foreign structure by value calls + * + * Copyright (C) 2011, 2015 Liam M. Healy + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifdef WIN32 +#define DLLEXPORT __declspec(dllexport) +#else +#define DLLEXPORT +#endif + +#include +#include +#include +#include +#include +#include +#include + +/* MSVC doesn't have stdint.h and uses a different syntax for stdcall */ +#ifndef _MSC_VER +#include +#endif + +#ifdef WIN32 +#ifdef _MSC_VER +#define STDCALL __stdcall +#else +#define STDCALL __attribute__((stdcall)) +#endif +#else +#define STDCALL +#endif + +struct struct_pair { + int a; + int b; +}; + +struct struct_pair_double { + struct struct_pair pr; + double dbl; +}; + +typedef enum { + ONE = 1, + TWO, + THREE, + FOUR, + FORTY_ONE = 41, + FORTY_TWO +} numeros; + +int sumpair (struct struct_pair sp); +int enumpair (numeros mynum, struct struct_pair sp); +struct struct_pair doublepair (struct struct_pair dp); +double prodsumpair (struct struct_pair_double spd); +struct struct_pair_double doublepairdouble (struct struct_pair_double pd); + +DLLEXPORT +int sumpair (struct struct_pair sp) +{ + return sp.a + sp.b; +} + +DLLEXPORT +int enumpair (numeros mynum, struct struct_pair sp) +{ + if ( mynum == ONE ) + { + return sp.a + sp.b; + } + else if ( mynum == TWO ) + { + return sp.a + 2*sp.b; + } + else if ( mynum == THREE ) + { + return 2*sp.a + sp.b; + } + else if ( mynum == FOUR ) + { + return 2*sp.a + 2*sp.b; + } + else + { + return 41*sp.a + 42*sp.b; + } +} + +DLLEXPORT +struct struct_pair makepair (bool cond) +{ + struct struct_pair ret; + ret.a = -127; + ret.b = cond ? 42 : 43; + return ret; +} + +const struct struct_pair static_pair = { 40, 2}; + +DLLEXPORT +struct struct_pair * returnpairpointer (struct struct_pair ignored) +{ + return &static_pair; +} + +DLLEXPORT +struct struct_pair doublepair (struct struct_pair dp) +{ + struct struct_pair ret; + ret.a = 2*dp.a; + ret.b = 2*dp.b; + return ret; +} + +DLLEXPORT +double prodsumpair (struct struct_pair_double pd) +{ + return pd.dbl * sumpair(pd.pr); +} + +DLLEXPORT +struct struct_pair_double doublepairdouble (struct struct_pair_double pd) +{ + struct struct_pair_double ret; + ret.pr = doublepair(pd.pr); + ret.dbl = 2*pd.dbl; + return ret; +} + +DLLEXPORT +unsigned long long ullsum (unsigned long long a, unsigned long long b) +{ + return a + b; +} + +DLLEXPORT +struct struct_pair stringlenpair (char *string, struct struct_pair dp) +{ + struct struct_pair ret; + int len = strlen(string); + ret.a = len*dp.a; + ret.b = len*dp.b; + return ret; +} + +struct bitfield_struct { + unsigned int b; +}; + +DLLEXPORT +struct bitfield_struct structbitfield (unsigned int x) { + struct bitfield_struct ret; + ret.b = x; + return ret; +} diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/tests/libtest.c b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/tests/libtest.c new file mode 100644 index 0000000..a7123d3 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/tests/libtest.c @@ -0,0 +1,985 @@ +/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil -*- + * + * libtest.c --- auxiliary C lib for testing purposes + * + * Copyright (C) 2005-2007, Luis Oliveira + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifdef WIN32 +#define DLLEXPORT __declspec(dllexport) +#else +#define DLLEXPORT +#endif + +#include +#include +#include +#include +#include +#include +#include +#include + +/* MSVC doesn't have stdint.h and uses a different syntax for stdcall */ +#ifndef _MSC_VER +#include +#endif + +#ifdef WIN32 +#ifdef _MSC_VER +#define STDCALL __stdcall +#else +#define STDCALL __attribute__((stdcall)) +#endif +#else +#define STDCALL +#endif + +/* + * Some functions that aren't available on WIN32 + */ + +DLLEXPORT +float my_sqrtf(float n) +{ + return (float) sqrt((double) n); +} + +DLLEXPORT +char *my_strdup(const char *str) +{ + char *p = malloc(strlen(str) + 1); + strcpy(p, str); + return p; +} + +DLLEXPORT +void my_strfree(char *str) +{ + free(str); +} + +DLLEXPORT +long long my_llabs(long long n) +{ + return n < 0 ? -n : n; +} + + +DLLEXPORT +unsigned long long ullong(unsigned long long n) +{ + return n == ULLONG_MAX ? n : 42; +} + +/* + * Foreign Globals + * + * (var_int is used in MISC-TYPES.EXPAND.3 as well) + */ + +DLLEXPORT char * dll_version = "20120107"; + +/* TODO: look into signed char vs. unsigned char issue */ +DLLEXPORT char var_char = -127; +DLLEXPORT unsigned char var_unsigned_char = 255; +DLLEXPORT short var_short = -32767; +DLLEXPORT unsigned short var_unsigned_short = 65535; +DLLEXPORT int var_int = -32767; +DLLEXPORT unsigned int var_unsigned_int = 65535; +DLLEXPORT long var_long = -2147483647L; +DLLEXPORT unsigned long var_unsigned_long = 4294967295UL; +DLLEXPORT float var_float = 42.0f; +DLLEXPORT double var_double = 42.0; +DLLEXPORT void * var_pointer = NULL; +DLLEXPORT char * var_string = "Hello, foreign world!"; + +DLLEXPORT long long var_long_long = -9223372036854775807LL; +DLLEXPORT unsigned long long var_unsigned_long_long = 18446744073709551615ULL; + +DLLEXPORT float float_max = FLT_MAX; +DLLEXPORT float float_min = FLT_MIN; +DLLEXPORT double double_max = DBL_MAX; +DLLEXPORT double double_min = DBL_MIN; + +/* + * Callbacks + */ + +DLLEXPORT +int expect_char_sum(char (*f)(char, char)) +{ + return f('a', 3) == 'd'; +} + +DLLEXPORT +int expect_unsigned_char_sum(unsigned char (*f)(unsigned char, unsigned char)) +{ + return f(UCHAR_MAX-1, 1) == UCHAR_MAX; +} + +DLLEXPORT +int expect_short_sum(short (*f)(short a, short b)) +{ + return f(SHRT_MIN+1, -1) == SHRT_MIN; +} + +DLLEXPORT +int expect_unsigned_short_sum(unsigned short (*f)(unsigned short, + unsigned short)) +{ + return f(USHRT_MAX-1, 1) == USHRT_MAX; +} + +/* used in MISC-TYPES.EXPAND.4 as well */ +DLLEXPORT +int expect_int_sum(int (*f)(int, int)) +{ + return f(INT_MIN+1, -1) == INT_MIN; +} + +DLLEXPORT +int expect_unsigned_int_sum(unsigned int (*f)(unsigned int, unsigned int)) +{ + return f(UINT_MAX-1, 1) == UINT_MAX; +} + +DLLEXPORT +int expect_long_sum(long (*f)(long, long)) +{ + return f(LONG_MIN+1, -1) == LONG_MIN; +} + +DLLEXPORT +int expect_unsigned_long_sum(unsigned long (*f)(unsigned long, unsigned long)) +{ + return f(ULONG_MAX-1, 1) == ULONG_MAX; +} + +DLLEXPORT +int expect_long_long_sum(long long (*f)(long long, long long)) +{ + return f(LLONG_MIN+1, -1) == LLONG_MIN; +} + +DLLEXPORT +int expect_unsigned_long_long_sum (unsigned long long + (*f)(unsigned long long, unsigned long long)) +{ + return f(ULLONG_MAX-1, 1) == ULLONG_MAX; +} + +DLLEXPORT +int expect_float_sum(float (*f)(float, float)) +{ + /*printf("\n>>> FLOAT: %f <<<\n", f(20.0f, 22.0f));*/ + return f(20.0f, 22.0f) == 42.0f; +} + +DLLEXPORT +int expect_double_sum(double (*f)(double, double)) +{ + /*printf("\n>>> DOUBLE: %f<<<\n", f(-20.0, -22.0));*/ + return f(-20.0, -22.0) == -42.0; +} + +DLLEXPORT +int expect_long_double_sum(long double (*f)(long double, long double)) +{ + /*printf("\n>>> DOUBLE: %f<<<\n", f(-20.0, -22.0));*/ + return f(-20.0, -22.0) == -42.0; +} + +DLLEXPORT +int expect_pointer_sum(void* (*f)(void*, int)) +{ + return f(NULL, 0xDEAD) == (void *) 0xDEAD; +} + +DLLEXPORT +int expect_strcat(char* (*f)(char*, char*)) +{ + char *ret = f("Hello, ", "C world!"); + int res = strcmp(ret, "Hello, C world!") == 0; + /* commented out as a quick fix on platforms that don't + foreign allocate in C malloc space. */ + /*free(ret);*/ /* is this allowed? */ + return res; +} + +DLLEXPORT +void pass_int_ref(void (*f)(int*)) +{ + int x = 1984; + f(&x); +} + +/* + * Enums + */ + +typedef enum { + ONE = 1, + TWO, + THREE, + FOUR, + FORTY_ONE = 41, + FORTY_TWO +} numeros; + +DLLEXPORT +int check_enums(numeros one, numeros two, numeros three, numeros four, + numeros forty_one, numeros forty_two) +{ + if (one == ONE && two == TWO && three == THREE && four == FOUR && + forty_one == FORTY_ONE && forty_two == FORTY_TWO) + return 1; + + return 0; +} + +typedef enum { FALSE, TRUE } another_boolean; + +DLLEXPORT +another_boolean return_enum(int x) +{ + if (x == 0) + return FALSE; + else + return TRUE; +} + +/* + * Booleans + */ + +DLLEXPORT +int equalequal(int a, unsigned int b) +{ + return ((unsigned int) a) == b; +} + +DLLEXPORT +char bool_and(unsigned char a, char b) +{ + return a && b; +} + +DLLEXPORT +unsigned long bool_xor(long a, unsigned long b) +{ + return (a && !b) || (!a && b); +} + +DLLEXPORT +unsigned sizeof_bool(void) +{ + return (unsigned) sizeof(_Bool); +} + +DLLEXPORT +unsigned bool_to_unsigned(_Bool b) +{ + return (unsigned) b; +} + +DLLEXPORT +_Bool unsigned_to_bool(unsigned u) +{ + return (_Bool) u; +} + +/* + * Test struct alignment issues. These comments assume the x86 gABI. + * Hopefully these tests will spot alignment issues in others archs + * too. + */ + +/* + * STRUCT.ALIGNMENT.1 + */ + +struct s_ch { + char a_char; +}; + +/* This struct's size should be 2 bytes */ +struct s_s_ch { + char another_char; + struct s_ch a_s_ch; +}; + +DLLEXPORT +struct s_s_ch the_s_s_ch = { 2, { 1 } }; + +/* + * STRUCT.ALIGNMENT.2 + */ + +/* This one should be alignment should be the same as short's alignment. */ +struct s_short { + char a_char; + char another_char; + short a_short; +}; + +struct s_s_short { + char yet_another_char; + struct s_short a_s_short; /* so this should be 2-byte aligned */ +}; /* size: 6 bytes */ + +DLLEXPORT +struct s_s_short the_s_s_short = { 4, { 1, 2, 3 } }; + +/* + * STRUCT.ALIGNMENT.3 + */ + +/* This test will, among other things, check for the existence tail padding. */ + +struct s_double { + char a_char; /* 1 byte */ + /* padding: 3 bytes */ + double a_double; /* 8 bytes */ + char another_char; /* 1 byte */ + /* padding: 3 bytes */ +}; /* total size: 16 bytes */ + +struct s_s_double { + char yet_another_char; /* 1 byte */ + /* 3 bytes padding */ + struct s_double a_s_double; /* 16 bytes */ + short a_short; /* 2 byte */ + /* 2 bytes padding */ +}; /* total size: 24 bytes */ + +DLLEXPORT +struct s_s_double the_s_s_double = { 4, { 1, 2.0, 3 }, 5 }; + +/* + * STRUCT.ALIGNMENT.4 + */ +struct s_s_s_double { + short another_short; /* 2 bytes */ + /* 2 bytes padding */ + struct s_s_double a_s_s_double; /* 24 bytes */ + char last_char; /* 1 byte */ + /* 3 bytes padding */ +}; /* total size: 32 */ + +DLLEXPORT +struct s_s_s_double the_s_s_s_double = { 6, { 4, { 1, 2.0, 3 }, 5 }, 7 }; + +/* + * STRUCT.ALIGNMENT.5 + */ + +/* MacOSX ABI says: "The embedding alignment of the first element in a data + structure is equal to the element's natural alignment." and "For subsequent + elements that have a natural alignment greater than 4 bytes, the embedding + alignment is 4, unless the element is a vector." */ + +/* note: these rules will apply to the structure itself. So, unless it is + the first element of another structure, its alignment will be 4. */ + +/* the following offsets and sizes are specific to darwin/ppc32 */ + +struct s_double2 { + double a_double; /* 8 bytes (alignment 8) */ + short a_short; /* 2 bytes */ + /* 6 bytes padding */ +}; /* total size: 16 */ + +struct s_s_double2 { + char a_char; /* 1 byte */ + /* 3 bytes padding */ + struct s_double2 a_s_double2; /* 16 bytes, alignment 4 */ + short another_short; /* 2 bytes */ + /* 2 bytes padding */ +}; /* total size: 24 bytes */ + /* alignment: 4 */ + +DLLEXPORT +struct s_s_double2 the_s_s_double2 = { 3, { 1.0, 2 }, 4 }; + +/* + * STRUCT.ALIGNMENT.6 + */ + +/* Same as STRUCT.ALIGNMENT.5 but with long long. */ + +struct s_long_long { + long long a_long_long; /* 8 bytes (alignment 8) */ + short a_short; /* 2 bytes */ + /* 6 bytes padding */ +}; /* total size: 16 */ + +struct s_s_long_long { + char a_char; /* 1 byte */ + /* 3 bytes padding */ + struct s_long_long a_s_long_long; /* 16 bytes, alignment 4 */ + short a_short; /* 2 bytes */ + /* 2 bytes padding */ +}; /* total size: 24 bytes */ + /* alignment: 4 */ + +DLLEXPORT +struct s_s_long_long the_s_s_long_long = { 3, { 1, 2 }, 4 }; + +/* + * STRUCT.ALIGNMENT.7 + */ + +/* Another test for Darwin's PPC32 ABI. */ + +struct s_s_double3 { + struct s_double2 a_s_double2; /* 16 bytes, alignment 8*/ + short another_short; /* 2 bytes */ + /* 6 bytes padding */ +}; /* total size: 24 */ + +struct s_s_s_double3 { + struct s_s_double3 a_s_s_double3; /* 24 bytes */ + char a_char; /* 1 byte */ + /* 7 bytes padding */ +}; /* total size: 32 */ + +DLLEXPORT +struct s_s_s_double3 the_s_s_s_double3 = { { { 1.0, 2 }, 3 }, 4 }; + +/* + * STRUCT.ALIGNMENT.8 + */ + +/* Same as STRUCT.ALIGNMENT.[56] but with unsigned long long. */ + +struct s_unsigned_long_long { + unsigned long long an_unsigned_long_long; /* 8 bytes (alignment 8) */ + short a_short; /* 2 bytes */ + /* 6 bytes padding */ +}; /* total size: 16 */ + +struct s_s_unsigned_long_long { + char a_char; /* 1 byte */ + /* 3 bytes padding */ + struct s_unsigned_long_long a_s_unsigned_long_long; /* 16 bytes, align 4 */ + short a_short; /* 2 bytes */ + /* 2 bytes padding */ +}; /* total size: 24 bytes */ + /* alignment: 4 */ + +DLLEXPORT +struct s_s_unsigned_long_long the_s_s_unsigned_long_long = { 3, { 1, 2 }, 4 }; + +/* STRUCT.ALIGNMENT.x */ + +/* commented this test out because this is not standard C + and MSVC++ (or some versions of it at least) won't compile it. */ + +/* +struct empty_struct {}; + +struct with_empty_struct { + struct empty_struct foo; + int an_int; +}; + +DLLEXPORT +struct with_empty_struct the_with_empty_struct = { {}, 42 }; +*/ + +/* + * STRUCT-VALUES.* + */ + +struct pair { int a, b; }; + +DLLEXPORT +int pair_sum(struct pair p) +{ + return p.a + p.b; +} + +DLLEXPORT +int pair_pointer_sum(struct pair *p) +{ + return p->a + p->b; +} + +DLLEXPORT +struct pair make_pair(int a, int b) +{ + return (struct pair) { a, b }; +} + +DLLEXPORT +struct pair *alloc_pair(int a, int b) +{ + struct pair *p = malloc(sizeof(struct pair)); + p->a = a; + p->b = b; + return p; +} + +struct pair_plus_one { + struct pair p; + int c; +}; + +DLLEXPORT +int pair_plus_one_sum(struct pair_plus_one p) +{ + return p.p.a + p.p.b + p.c; +} + +DLLEXPORT +int pair_plus_one_pointer_sum(struct pair_plus_one *p) +{ + return p->p.a + p->p.b + p->c; +} + +DLLEXPORT +struct pair_plus_one make_pair_plus_one(int a, int b, int c) +{ + return (struct pair_plus_one) { { a, b }, c }; +} + +DLLEXPORT +struct pair_plus_one *alloc_pair_plus_one(int a, int b, int c) +{ + struct pair_plus_one *p = malloc(sizeof(struct pair_plus_one)); + p->p.a = a; + p->p.b = b; + p->c = c; + return p; +} + +/* + * DEFCFUN.NOARGS and DEFCFUN.NOOP + */ + +DLLEXPORT +int noargs() +{ + return 42; +} + +DLLEXPORT +void noop() +{ + return; +} + +/* + * DEFCFUN.BFF.1 + * + * (let ((rettype (find-type :long)) + * (arg-types (n-random-types-no-ll 127))) + * (c-function rettype arg-types) + * (gen-function-test rettype arg-types)) + */ + +DLLEXPORT long sum_127_no_ll + (long a1, unsigned long a2, short a3, unsigned short a4, float a5, + double a6, unsigned long a7, float a8, unsigned char a9, unsigned + short a10, short a11, unsigned long a12, double a13, long a14, + unsigned int a15, void* a16, unsigned int a17, unsigned short a18, + long a19, float a20, void* a21, float a22, int a23, int a24, unsigned + short a25, long a26, long a27, double a28, unsigned char a29, unsigned + int a30, unsigned int a31, int a32, unsigned short a33, unsigned int + a34, void* a35, double a36, double a37, long a38, short a39, unsigned + short a40, long a41, char a42, long a43, unsigned short a44, void* + a45, int a46, unsigned int a47, double a48, unsigned char a49, + unsigned char a50, float a51, int a52, unsigned short a53, double a54, + short a55, unsigned char a56, unsigned long a57, float a58, float a59, + float a60, void* a61, void* a62, unsigned int a63, unsigned long a64, + char a65, short a66, unsigned short a67, unsigned long a68, void* a69, + float a70, double a71, long a72, unsigned long a73, short a74, + unsigned int a75, unsigned short a76, int a77, unsigned short a78, + char a79, double a80, short a81, unsigned char a82, float a83, char + a84, int a85, double a86, unsigned char a87, int a88, unsigned long + a89, double a90, short a91, short a92, unsigned int a93, unsigned char + a94, float a95, long a96, float a97, long a98, long a99, int a100, int + a101, unsigned int a102, char a103, char a104, unsigned short a105, + unsigned int a106, unsigned short a107, unsigned short a108, int a109, + long a110, char a111, double a112, unsigned int a113, char a114, short + a115, unsigned long a116, unsigned int a117, short a118, unsigned char + a119, float a120, void* a121, double a122, int a123, long a124, char + a125, unsigned short a126, float a127) +{ + return (long) a1 + a2 + a3 + a4 + ((long) a5) + ((long) a6) + a7 + + ((long) a8) + a9 + a10 + a11 + a12 + ((long) a13) + a14 + a15 + + ((intptr_t) a16) + a17 + a18 + a19 + ((long) a20) + + ((intptr_t) a21) + ((long) a22) + a23 + a24 + a25 + a26 + a27 + + ((long) a28) + a29 + a30 + a31 + a32 + a33 + a34 + ((intptr_t) a35) + + ((long) a36) + ((long) a37) + a38 + a39 + a40 + a41 + a42 + a43 + a44 + + ((intptr_t) a45) + a46 + a47 + ((long) a48) + a49 + a50 + + ((long) a51) + a52 + a53 + ((long) a54) + a55 + a56 + a57 + ((long) a58) + + ((long) a59) + ((long) a60) + ((intptr_t) a61) + + ((intptr_t) a62) + a63 + a64 + a65 + a66 + a67 + a68 + + ((intptr_t) a69) + ((long) a70) + ((long) a71) + a72 + a73 + a74 + + a75 + a76 + a77 + a78 + a79 + ((long) a80) + a81 + a82 + ((long) a83) + + a84 + a85 + ((long) a86) + a87 + a88 + a89 + ((long) a90) + a91 + a92 + + a93 + a94 + ((long) a95) + a96 + ((long) a97) + a98 + a99 + a100 + a101 + + a102 + a103 + a104 + a105 + a106 + a107 + a108 + a109 + a110 + a111 + + ((long) a112) + a113 + a114 + a115 + a116 + a117 + a118 + a119 + + ((long) a120) + ((intptr_t) a121) + ((long) a122) + a123 + a124 + + a125 + a126 + ((long) a127); +} + +/* + * DEFCFUN.BFF.2 + * + * (let ((rettype (find-type :long-long)) + * (arg-types (n-random-types 127))) + * (c-function rettype arg-types) + * (gen-function-test rettype arg-types)) + */ + +DLLEXPORT long long sum_127 + (void* a1, void* a2, float a3, unsigned long a4, void* a5, long long + a6, double a7, double a8, unsigned short a9, int a10, long long a11, + long a12, short a13, unsigned int a14, long a15, unsigned char a16, + int a17, double a18, short a19, short a20, long long a21, unsigned + int a22, unsigned short a23, short a24, void* a25, short a26, + unsigned short a27, unsigned short a28, int a29, long long a30, + void* a31, int a32, unsigned long a33, unsigned long a34, void* a35, + unsigned long long a36, float a37, int a38, short a39, void* a40, + unsigned long long a41, long long a42, unsigned long a43, unsigned + long a44, unsigned long long a45, unsigned long a46, char a47, + double a48, long a49, unsigned int a50, int a51, short a52, void* + a53, long a54, unsigned long long a55, int a56, unsigned short a57, + unsigned long long a58, float a59, void* a60, float a61, unsigned + short a62, unsigned long a63, float a64, unsigned int a65, unsigned + long long a66, void* a67, double a68, unsigned long long a69, double + a70, double a71, long long a72, void* a73, unsigned short a74, long + a75, void* a76, short a77, double a78, long a79, unsigned char a80, + void* a81, unsigned char a82, long a83, double a84, void* a85, int + a86, double a87, unsigned char a88, double a89, short a90, long a91, + int a92, long a93, double a94, unsigned short a95, unsigned int a96, + int a97, char a98, long long a99, double a100, float a101, unsigned + long a102, short a103, void* a104, float a105, long long a106, int + a107, long long a108, long long a109, double a110, unsigned long + long a111, double a112, unsigned long a113, char a114, char a115, + unsigned long a116, short a117, unsigned char a118, unsigned char + a119, int a120, int a121, float a122, unsigned char a123, unsigned + char a124, double a125, unsigned long long a126, char a127) +{ + return (long long) ((intptr_t) a1) + ((intptr_t) a2) + ((long) a3) + + a4 + ((intptr_t) a5) + a6 + ((long) a7) + ((long) a8) + a9 + a10 + + a11 + a12 + a13 + a14 + a15 + a16 + a17 + ((long) a18) + a19 + a20 + + a21 + a22 + a23 + a24 + ((intptr_t) a25) + a26 + a27 + a28 + a29 + + a30 + ((intptr_t) a31) + a32 + a33 + a34 + ((intptr_t) a35) + + a36 + ((long) a37) + a38 + a39 + ((intptr_t) a40) + a41 + a42 + a43 + + a44 + a45 + a46 + a47 + ((long) a48) + a49 + a50 + a51 + a52 + + ((intptr_t) a53) + a54 + a55 + a56 + a57 + a58 + ((long) a59) + + ((intptr_t) a60) + ((long) a61) + a62 + a63 + ((long) a64) + a65 + a66 + + ((intptr_t) a67) + ((long) a68) + a69 + ((long) a70) + ((long) a71) + + a72 + ((intptr_t) a73) + a74 + a75 + ((intptr_t) a76) + a77 + + ((long) a78) + a79 + a80 + ((intptr_t) a81) + a82 + a83 + ((long) a84) + + ((intptr_t) a85) + a86 + ((long) a87) + a88 + ((long) a89) + a90 + + a91 + a92 + a93 + ((long) a94) + a95 + a96 + a97 + a98 + a99 + + ((long) a100) + ((long) a101) + a102 + a103 + ((intptr_t) a104) + + ((long) a105) + a106 + a107 + a108 + a109 + ((long) a110) + a111 + + ((long) a112) + a113 + a114 + a115 + a116 + a117 + a118 + a119 + a120 + + a121 + ((long) a122) + a123 + a124 + ((long) a125) + a126 + a127; +} + +/* + * CALLBACKS.BFF.1 (cb-test :no-long-long t) + */ + +DLLEXPORT long call_sum_127_no_ll + (long (*func) + (unsigned long, void*, long, double, unsigned long, float, float, + int, unsigned int, double, double, double, void*, unsigned short, + unsigned short, void*, long, long, int, short, unsigned short, + unsigned short, char, long, void*, void*, char, unsigned char, + unsigned long, short, int, int, unsigned char, short, long, long, + void*, unsigned short, char, double, unsigned short, void*, short, + unsigned long, unsigned short, float, unsigned char, short, float, + short, char, unsigned long, unsigned long, char, float, long, void*, + short, float, unsigned int, float, unsigned int, double, unsigned int, + unsigned char, int, long, char, short, double, int, void*, char, + unsigned short, void*, unsigned short, void*, unsigned long, double, + void*, long, float, unsigned short, unsigned short, void*, float, int, + unsigned int, double, float, long, void*, unsigned short, float, + unsigned char, unsigned char, float, unsigned int, float, unsigned + short, double, unsigned short, unsigned long, unsigned int, unsigned + long, void*, unsigned char, char, char, unsigned short, unsigned long, + float, short, void*, long, unsigned short, short, double, short, int, + char, unsigned long, long, int, void*, double, unsigned char)) +{ + return + func(948223085, (void *) 803308438, -465723152, 20385, + 219679466, -10035, 13915, -1193455756, 1265303699, 27935, -18478, + -10508, (void *) 215389089, 55561, 55472, (void *) 146070433, + -1040819989, -17851453, -1622662247, -19473, 20837, 30216, 79, + 986800400, (void *) 390281604, (void *) 1178532858, 19, 117, + 78337699, -5718, -991300738, 872160910, 184, 926, -1487245383, + 1633973783, (void *) 33738609, 53985, -116, 31645, 27196, (void *) + 145569903, -6960, 17252220, 47404, -10491, 88, -30438, -21212, + -1982, -16, 1175270, 7949380, -121, 8559, -432968526, (void *) + 293455312, 11894, -8394, 142421516, -25758, 3422998, 4004, + 15758212, 198, -1071899743, -1284904617, -11, -17219, -30039, + 311589092, (void *) 541468577, 123, 63517, (void *) 1252504506, + 39368, (void *) 10057868, 134781408, -7143, (void *) 72825877, + -1190798667, -30862, 63757, 14965, (void *) 802391252, 22008, + -517289619, 806091099, 1125, 451, -498145176, (void *) 55960931, + 15379, 4629, 184, 254, 22532, 465856451, -1669, 49416, -16546, + 2983, 4337541, 65292495, 39253529, (void *) 669025, 211, 85, -19, + 24298, 65358, 16776, -29957, (void *) 124311, -163231228, 2610, + -7806, 26434, -21913, -753615541, 120, 358697932, -1198889034, + -2131350926, (void *) 3749492036, -13413, 17); +} + +/* + * CALLBACKS.BFF.2 (cb-test) + */ + +DLLEXPORT long long call_sum_127 + (long long (*func) + (short, char, void*, float, long, double, unsigned long long, + unsigned short, unsigned char, char, char, unsigned short, unsigned + long long, unsigned short, long long, unsigned short, unsigned long + long, unsigned char, unsigned char, unsigned long long, long long, + char, float, unsigned int, float, float, unsigned int, float, char, + unsigned char, long, long long, unsigned char, double, long, + double, unsigned int, unsigned short, long long, unsigned int, int, + unsigned long long, long, short, unsigned int, unsigned int, + unsigned long long, unsigned int, long, void*, unsigned char, char, + long long, unsigned short, unsigned int, float, unsigned char, + unsigned long, long long, float, long, float, int, float, unsigned + short, unsigned long long, short, unsigned long, long, char, + unsigned short, long long, short, double, void*, unsigned int, + char, unsigned int, void*, void*, unsigned char, void*, unsigned + short, unsigned char, long, void*, char, long, unsigned short, + unsigned char, double, unsigned long long, unsigned short, unsigned + short, unsigned int, long, char, long, char, short, unsigned short, + unsigned long, unsigned long, short, long long, long long, long + long, double, unsigned short, unsigned char, short, unsigned char, + long, long long, unsigned long long, unsigned int, unsigned long, + unsigned char, long long, unsigned char, unsigned long long, + double, unsigned char, long long, unsigned char, char, long long)) +{ + return + func(-8573, 14, (void *) 832601021, -32334, -1532040888, + -18478, 2793023182591311826, 2740, 230, 103, 97, 13121, + 5112369026351511084, 7763, -8134147951003417418, 34348, + 5776613699556468853, 19, 122, 1431603726926527625, + 439503521880490337, -112, -21557, 1578969190, -22008, -4953, + 2127745975, -7262, -6, 180, 226352974, -3928775366167459219, 134, + -17730, -1175042526, 23868, 3494181009, 57364, + 3134876875147518682, 104531655, -1286882727, 803577887579693487, + 1349268803, 24912, 3313099419, 3907347884, 1738833249233805034, + 2794230885, 1008818752, (void *) 1820044575, 189, 61, + -931654560961745071, 57531, 3096859985, 10405, 220, 3631311224, + -8531370353478907668, 31258, 678896693, -32150, -1869057813, + -19877, 62841, 4161660185772906873, -23869, 4016251006, 610353435, + 105, 47315, -1051054492535331660, 6846, -15163, (void *) + 736672359, 2123928476, -122, 3859258652, (void *) 3923394833, + (void *) 1265031970, 161, (void *) 1993867800, 55056, 122, + 1562112760, (void *) 866615125, -79, -1261399547, 31737, 254, + -31279, 5462649659172897980, 5202, 7644, 174224940, -337854382, + -45, -583502442, -37, -13266, 24520, 2198606699, 2890453969, + -8282, -2295716637858246075, -1905178488651598878, + -6384652209316714643, 14841, 35443, 132, 15524, 187, 2138878229, + -5153032566879951000, 9056545530140684207, 4124632010, 276167701, + 56, -2307310370663738730, 66, 9113015627153789746, -9618, 167, + 755753399701306200, 119, -28, -990561962725435433); +} + +/* + * CALLBACKS.DOUBLE26 + */ + +DLLEXPORT double call_double26 + (double (*f)(double, double, double, double, double, double, double, double, + double, double, double, double, double, double, double, double, + double, double, double, double, double, double, double, double, + double, double)) +{ + return f(3.14, 3.14, 3.14, 3.14, 3.14, 3.14, 3.14, 3.14, 3.14, 3.14, 3.14, + 3.14, 3.14, 3.14, 3.14, 3.14, 3.14, 3.14, 3.14, 3.14, 3.14, 3.14, + 3.14, 3.14, 3.14, 3.14); +} + +/* + * DEFCFUN.DOUBLE26 and FUNCALL.DOUBLE26 + */ + +DLLEXPORT +double sum_double26(double a1, double a2, double a3, double a4, double a5, + double a6, double a7, double a8, double a9, double a10, + double a11, double a12, double a13, double a14, double a15, + double a16, double a17, double a18, double a19, double a20, + double a21, double a22, double a23, double a24, double a25, + double a26) +{ + return a1 + a2 + a3 + a4 + a5 + a6 + a7 + a8 + a9 + a10 + a11 + a12 + a13 + + a14 + a15 + a16 + a17 + a18 + a19 + a20 + a21 + a22 + a23 + a24 + a25 + + a26; +} + +/* + * DEFCFUN.VARARGS.NOSTDLIB and FUNCALL.VARARGS.NOSTDLIB + */ +DLLEXPORT +double sum_double_arbitrary(int n, ...) +{ + va_list ap; + double sum = 0; + va_start(ap, n); + for(int j=0; j + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifdef WIN32 +#define DLLEXPORT __declspec(dllexport) +#else +#define DLLEXPORT +#endif + +/* + * [DEFCFUN|FOREIGN].NAMESPACE.1 + */ + +DLLEXPORT int ns_function() +{ + return 0; +} + +/* + * FOREIGN-GLOBALS.NAMESPACE.* + */ + +DLLEXPORT int ns_var = 0; + +/* vim: ts=4 et +*/ diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/tests/memory.lisp b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/tests/memory.lisp new file mode 100644 index 0000000..3b3cbea --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/tests/memory.lisp @@ -0,0 +1,657 @@ +;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- +;;; +;;; memory.lisp --- Tests for memory referencing. +;;; +;;; Copyright (C) 2005-2006, James Bielman +;;; +;;; Permission is hereby granted, free of charge, to any person +;;; obtaining a copy of this software and associated documentation +;;; files (the "Software"), to deal in the Software without +;;; restriction, including without limitation the rights to use, copy, +;;; modify, merge, publish, distribute, sublicense, and/or sell copies +;;; of the Software, and to permit persons to whom the Software is +;;; furnished to do so, subject to the following conditions: +;;; +;;; The above copyright notice and this permission notice shall be +;;; included in all copies or substantial portions of the Software. +;;; +;;; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +;;; EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +;;; MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +;;; NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +;;; HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +;;; WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +;;; OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +;;; DEALINGS IN THE SOFTWARE. +;;; + +(in-package #:cffi-tests) + +(deftest deref.char + (with-foreign-object (p :char) + (setf (mem-ref p :char) -127) + (mem-ref p :char)) + -127) + +(deftest deref.unsigned-char + (with-foreign-object (p :unsigned-char) + (setf (mem-ref p :unsigned-char) 255) + (mem-ref p :unsigned-char)) + 255) + +(deftest deref.short + (with-foreign-object (p :short) + (setf (mem-ref p :short) -32767) + (mem-ref p :short)) + -32767) + +(deftest deref.unsigned-short + (with-foreign-object (p :unsigned-short) + (setf (mem-ref p :unsigned-short) 65535) + (mem-ref p :unsigned-short)) + 65535) + +(deftest deref.int + (with-foreign-object (p :int) + (setf (mem-ref p :int) -131072) + (mem-ref p :int)) + -131072) + +(deftest deref.unsigned-int + (with-foreign-object (p :unsigned-int) + (setf (mem-ref p :unsigned-int) 262144) + (mem-ref p :unsigned-int)) + 262144) + +(deftest deref.long + (with-foreign-object (p :long) + (setf (mem-ref p :long) -536870911) + (mem-ref p :long)) + -536870911) + +(deftest deref.unsigned-long + (with-foreign-object (p :unsigned-long) + (setf (mem-ref p :unsigned-long) 536870912) + (mem-ref p :unsigned-long)) + 536870912) + +#+(and darwin openmcl) +(pushnew 'deref.long-long rt::*expected-failures*) + +(deftest deref.long-long + (with-foreign-object (p :long-long) + (setf (mem-ref p :long-long) -9223372036854775807) + (mem-ref p :long-long)) + -9223372036854775807) + +(deftest deref.unsigned-long-long + (with-foreign-object (p :unsigned-long-long) + (setf (mem-ref p :unsigned-long-long) 18446744073709551615) + (mem-ref p :unsigned-long-long)) + 18446744073709551615) + +(deftest deref.float.1 + (with-foreign-object (p :float) + (setf (mem-ref p :float) 0.0) + (mem-ref p :float)) + 0.0) + +(deftest deref.float.2 + (with-foreign-object (p :float) + (setf (mem-ref p :float) *float-max*) + (mem-ref p :float)) + #.*float-max*) + +(deftest deref.float.3 + (with-foreign-object (p :float) + (setf (mem-ref p :float) *float-min*) + (mem-ref p :float)) + #.*float-min*) + +(deftest deref.double.1 + (with-foreign-object (p :double) + (setf (mem-ref p :double) 0.0d0) + (mem-ref p :double)) + 0.0d0) + +(deftest deref.double.2 + (with-foreign-object (p :double) + (setf (mem-ref p :double) *double-max*) + (mem-ref p :double)) + #.*double-max*) + +(deftest deref.double.3 + (with-foreign-object (p :double) + (setf (mem-ref p :double) *double-min*) + (mem-ref p :double)) + #.*double-min*) + +;;; TODO: use something like *DOUBLE-MIN/MAX* above once we actually +;;; have an available lisp that supports long double. +;#-cffi-sys::no-long-float +#+(and scl long-double) +(progn + (deftest deref.long-double.1 + (with-foreign-object (p :long-double) + (setf (mem-ref p :long-double) 0.0l0) + (mem-ref p :long-double)) + 0.0l0) + + (deftest deref.long-double.2 + (with-foreign-object (p :long-double) + (setf (mem-ref p :long-double) most-positive-long-float) + (mem-ref p :long-double)) + #.most-positive-long-float) + + (deftest deref.long-double.3 + (with-foreign-object (p :long-double) + (setf (mem-ref p :long-double) least-positive-long-float) + (mem-ref p :long-double)) + #.least-positive-long-float)) + +;;; make sure the lisp doesn't convert NULL to NIL +(deftest deref.pointer.null + (with-foreign-object (p :pointer) + (setf (mem-ref p :pointer) (null-pointer)) + (null-pointer-p (mem-ref p :pointer))) + t) + +;;; regression test. lisp-string-to-foreign should handle empty strings +(deftest lisp-string-to-foreign.empty + (with-foreign-pointer (str 2) + (setf (mem-ref str :unsigned-char) 42) + (lisp-string-to-foreign "" str 1) + (mem-ref str :unsigned-char)) + 0) + +;;; regression test. with-foreign-pointer shouldn't evaluate +;;; the size argument twice. +(deftest with-foreign-pointer.evalx2 + (let ((count 0)) + (with-foreign-pointer (x (incf count) size-var) + (values count size-var))) + 1 1) + +(defconstant +two+ 2) + +;;; regression test. cffi-allegro's with-foreign-pointer wasn't +;;; handling constants properly. +(deftest with-foreign-pointer.constant-size + (with-foreign-pointer (p +two+ size) + size) + 2) + +(deftest mem-ref.left-to-right + (let ((i 0)) + (with-foreign-object (p :char 3) + (setf (mem-ref p :char 0) 66 (mem-ref p :char 1) 92) + (setf (mem-ref p :char (incf i)) (incf i)) + (values (mem-ref p :char 0) (mem-ref p :char 1) i))) + 66 2 2) + +;;; This needs to be in a real function for at least Allegro CL or the +;;; compiler macro on %MEM-REF is not expanded and the test doesn't +;;; actually test anything! +(defun %mem-ref-left-to-right () + (let ((result nil)) + (with-foreign-object (p :char) + (%mem-set 42 p :char) + (%mem-ref (progn (push 1 result) p) :char (progn (push 2 result) 0)) + (nreverse result)))) + +;;; Test left-to-right evaluation of the arguments to %MEM-REF when +;;; optimized by the compiler macro. +(deftest %mem-ref.left-to-right + (%mem-ref-left-to-right) + (1 2)) + +;;; This needs to be in a top-level function for at least Allegro CL +;;; or the compiler macro on %MEM-SET is not expanded and the test +;;; doesn't actually test anything! +(defun %mem-set-left-to-right () + (let ((result nil)) + (with-foreign-object (p :char) + (%mem-set (progn (push 1 result) 0) + (progn (push 2 result) p) + :char + (progn (push 3 result) 0)) + (nreverse result)))) + +;;; Test left-to-right evaluation of the arguments to %MEM-SET when +;;; optimized by the compiler macro. +(deftest %mem-set.left-to-right + (%mem-set-left-to-right) + (1 2 3)) + +;; regression test. mem-aref's setf expansion evaluated its type argument twice. +(deftest mem-aref.eval-type-x2 + (let ((count 0)) + (with-foreign-pointer (p 1) + (setf (mem-aref p (progn (incf count) :char) 0) 127)) + count) + 1) + +(deftest mem-aref.left-to-right + (let ((count -1)) + (with-foreign-pointer (p 2) + (values + (setf (mem-aref p (progn (incf count) :char) (incf count)) (incf count)) + (setq count -1) + (mem-aref (progn (incf count) p) :char (incf count)) + count))) + 2 -1 2 1) + +;; regression tests. nested mem-ref's and mem-aref's had bogus getters +(deftest mem-ref.nested + (with-foreign-object (p :pointer) + (with-foreign-object (i :int) + (setf (mem-ref p :pointer) i) + (setf (mem-ref i :int) 42) + (setf (mem-ref (mem-ref p :pointer) :int) 1984) + (mem-ref i :int))) + 1984) + +(deftest mem-aref.nested + (with-foreign-object (p :pointer) + (with-foreign-object (i :int 2) + (setf (mem-aref p :pointer 0) i) + (setf (mem-aref i :int 1) 42) + (setf (mem-aref (mem-ref p :pointer 0) :int 1) 1984) + (mem-aref i :int 1))) + 1984) + +(cffi:defcstruct mem-aref.bare-struct + (a :uint8)) + +;;; regression test: although mem-aref was dealing with bare struct +;;; types as though they were pointers, it wasn't calculating the +;;; proper offsets. The offsets for bare structs types should be +;;; calculated as aggregate types. +(deftest mem-aref.bare-struct + (with-foreign-object (a 'mem-aref.bare-struct 2) + (eql (- (pointer-address (cffi:mem-aref a 'mem-aref.bare-struct 1)) + (pointer-address (cffi:mem-aref a 'mem-aref.bare-struct 0))) + (foreign-type-size '(:struct mem-aref.bare-struct)))) + t) + +;;; regression tests. dereferencing an aggregate type. dereferencing a +;;; struct should return a pointer to the struct itself, not return the +;;; first 4 bytes (or whatever the size of :pointer is) as a pointer. +;;; +;;; This important for accessing an array of structs, which is +;;; what the deref.array-of-aggregates test does. +(defcstruct some-struct (x :int)) + +(deftest deref.aggregate + (with-foreign-object (s 'some-struct) + (pointer-eq s (mem-ref s 'some-struct))) + t) + +(deftest deref.array-of-aggregates + (with-foreign-object (arr 'some-struct 3) + (loop for i below 3 + do (setf (foreign-slot-value (mem-aref arr 'some-struct i) + 'some-struct 'x) + 112)) + (loop for i below 3 + collect (foreign-slot-value (mem-aref arr 'some-struct i) + 'some-struct 'x))) + (112 112 112)) + +;;; pointer operations +(deftest pointer.1 + (pointer-address (make-pointer 42)) + 42) + +;;; I suppose this test is not very good. --luis +(deftest pointer.2 + (pointer-address (null-pointer)) + 0) + +(deftest pointer.null + (nth-value 0 (ignore-errors (null-pointer-p nil))) + nil) + +(deftest foreign-pointer-type.nil + (typep nil 'foreign-pointer) + nil) + +;;; Ensure that a pointer to the highest possible address can be +;;; created using MAKE-POINTER. Regression test for CLISP/X86-64. +(deftest make-pointer.high + (let* ((pointer-length (foreign-type-size :pointer)) + (high-address (1- (expt 2 (* pointer-length 8)))) + (pointer (make-pointer high-address))) + (- high-address (pointer-address pointer))) + 0) + +;;; Ensure that incrementing a pointer by zero bytes returns an +;;; equivalent pointer. +(deftest inc-pointer.zero + (with-foreign-object (x :int) + (pointer-eq x (inc-pointer x 0))) + t) + +;;; Test the INITIAL-ELEMENT keyword argument to FOREIGN-ALLOC. +(deftest foreign-alloc.1 + (let ((ptr (foreign-alloc :int :initial-element 42))) + (unwind-protect + (mem-ref ptr :int) + (foreign-free ptr))) + 42) + +;;; Test the INITIAL-ELEMENT and COUNT arguments to FOREIGN-ALLOC. +(deftest foreign-alloc.2 + (let ((ptr (foreign-alloc :int :count 4 :initial-element 100))) + (unwind-protect + (loop for i from 0 below 4 + collect (mem-aref ptr :int i)) + (foreign-free ptr))) + (100 100 100 100)) + +;;; Test the INITIAL-CONTENTS and COUNT arguments to FOREIGN-ALLOC, +;;; passing a list of initial values. +(deftest foreign-alloc.3 + (let ((ptr (foreign-alloc :int :count 4 :initial-contents '(4 3 2 1)))) + (unwind-protect + (loop for i from 0 below 4 + collect (mem-aref ptr :int i)) + (foreign-free ptr))) + (4 3 2 1)) + +;;; Test INITIAL-CONTENTS and COUNT with FOREIGN-ALLOC passing a +;;; vector of initial values. +(deftest foreign-alloc.4 + (let ((ptr (foreign-alloc :int :count 4 :initial-contents #(10 20 30 40)))) + (unwind-protect + (loop for i from 0 below 4 + collect (mem-aref ptr :int i)) + (foreign-free ptr))) + (10 20 30 40)) + +;;; Ensure calling FOREIGN-ALLOC with both INITIAL-ELEMENT and +;;; INITIAL-CONTENTS signals an error. +(deftest foreign-alloc.5 + (values + (ignore-errors + (let ((ptr (foreign-alloc :int :initial-element 1 + :initial-contents '(1)))) + (foreign-free ptr)) + t)) + nil) + +;;; Regression test: FOREIGN-ALLOC shouldn't actually perform translation +;;; on initial-element/initial-contents since MEM-AREF will do that already. +(define-foreign-type not-an-int () + () + (:actual-type :int) + (:simple-parser not-an-int)) + +(defmethod translate-to-foreign (value (type not-an-int)) + (assert (not (integerp value))) + 0) + +(deftest foreign-alloc.6 + (let ((ptr (foreign-alloc 'not-an-int :initial-element 'foooo))) + (foreign-free ptr) + t) + t) + +;;; Ensure calling FOREIGN-ALLOC with NULL-TERMINATED-P and a non-pointer +;;; type signals an error. +(deftest foreign-alloc.7 + (values + (ignore-errors + (let ((ptr (foreign-alloc :int :null-terminated-p t))) + (foreign-free ptr)) + t)) + nil) + +;;; The opposite of the above test. +(defctype pointer-alias :pointer) + +(deftest foreign-alloc.8 + (progn + (foreign-free (foreign-alloc 'pointer-alias :count 0 :null-terminated-p t)) + t) + t) + +;;; Ensure calling FOREIGN-ALLOC with NULL-TERMINATED-P actually places +;;; a null pointer at the end. Not a very reliable test apparently. +(deftest foreign-alloc.9 + (let ((ptr (foreign-alloc :pointer :count 0 :null-terminated-p t))) + (unwind-protect + (null-pointer-p (mem-ref ptr :pointer)) + (foreign-free ptr))) + t) + +;;; RT: FOREIGN-ALLOC with :COUNT 0 on CLISP signalled an error. +(deftest foreign-alloc.10 + (null (foreign-free (foreign-alloc :char :count 0))) + t) + +;;; Tests for mem-ref with a non-constant type. This is a way to test +;;; the functional interface (without compiler macros). + +(deftest deref.nonconst.char + (let ((type :char)) + (with-foreign-object (p type) + (setf (mem-ref p type) -127) + (mem-ref p type))) + -127) + +(deftest deref.nonconst.unsigned-char + (let ((type :unsigned-char)) + (with-foreign-object (p type) + (setf (mem-ref p type) 255) + (mem-ref p type))) + 255) + +(deftest deref.nonconst.short + (let ((type :short)) + (with-foreign-object (p type) + (setf (mem-ref p type) -32767) + (mem-ref p type))) + -32767) + +(deftest deref.nonconst.unsigned-short + (let ((type :unsigned-short)) + (with-foreign-object (p type) + (setf (mem-ref p type) 65535) + (mem-ref p type))) + 65535) + +(deftest deref.nonconst.int + (let ((type :int)) + (with-foreign-object (p type) + (setf (mem-ref p type) -131072) + (mem-ref p type))) + -131072) + +(deftest deref.nonconst.unsigned-int + (let ((type :unsigned-int)) + (with-foreign-object (p type) + (setf (mem-ref p type) 262144) + (mem-ref p type))) + 262144) + +(deftest deref.nonconst.long + (let ((type :long)) + (with-foreign-object (p type) + (setf (mem-ref p type) -536870911) + (mem-ref p type))) + -536870911) + +(deftest deref.nonconst.unsigned-long + (let ((type :unsigned-long)) + (with-foreign-object (p type) + (setf (mem-ref p type) 536870912) + (mem-ref p type))) + 536870912) + +#+(and darwin openmcl) +(pushnew 'deref.nonconst.long-long rt::*expected-failures*) + +(deftest deref.nonconst.long-long + (let ((type :long-long)) + (with-foreign-object (p type) + (setf (mem-ref p type) -9223372036854775807) + (mem-ref p type))) + -9223372036854775807) + +(deftest deref.nonconst.unsigned-long-long + (let ((type :unsigned-long-long)) + (with-foreign-object (p type) + (setf (mem-ref p type) 18446744073709551615) + (mem-ref p type))) + 18446744073709551615) + +(deftest deref.nonconst.float.1 + (let ((type :float)) + (with-foreign-object (p type) + (setf (mem-ref p type) 0.0) + (mem-ref p type))) + 0.0) + +(deftest deref.nonconst.float.2 + (let ((type :float)) + (with-foreign-object (p type) + (setf (mem-ref p type) *float-max*) + (mem-ref p type))) + #.*float-max*) + +(deftest deref.nonconst.float.3 + (let ((type :float)) + (with-foreign-object (p type) + (setf (mem-ref p type) *float-min*) + (mem-ref p type))) + #.*float-min*) + +(deftest deref.nonconst.double.1 + (let ((type :double)) + (with-foreign-object (p type) + (setf (mem-ref p type) 0.0d0) + (mem-ref p type))) + 0.0d0) + +(deftest deref.nonconst.double.2 + (let ((type :double)) + (with-foreign-object (p type) + (setf (mem-ref p type) *double-max*) + (mem-ref p type))) + #.*double-max*) + +(deftest deref.nonconst.double.3 + (let ((type :double)) + (with-foreign-object (p type) + (setf (mem-ref p type) *double-min*) + (mem-ref p type))) + #.*double-min*) + +;;; regression tests: lispworks's %mem-ref and %mem-set compiler +;;; macros were misbehaving. + +(defun mem-ref-rt-1 () + (with-foreign-object (a :int 2) + (setf (mem-aref a :int 0) 123 + (mem-aref a :int 1) 456) + (values (mem-aref a :int 0) (mem-aref a :int 1)))) + +(deftest mem-ref.rt.1 + (mem-ref-rt-1) + 123 456) + +(defun mem-ref-rt-2 () + (with-foreign-object (a :double 2) + (setf (mem-aref a :double 0) 123.0d0 + (mem-aref a :double 1) 456.0d0) + (values (mem-aref a :double 0) (mem-aref a :double 1)))) + +(deftest mem-ref.rt.2 + (mem-ref-rt-2) + 123.0d0 456.0d0) + +(deftest incf-pointer.1 + (let ((ptr (null-pointer))) + (incf-pointer ptr) + (pointer-address ptr)) + 1) + +(deftest incf-pointer.2 + (let ((ptr (null-pointer))) + (incf-pointer ptr 42) + (pointer-address ptr)) + 42) + +(deftest pointerp.1 + (values + (pointerp (null-pointer)) + (null-pointer-p (null-pointer)) + (typep (null-pointer) 'foreign-pointer)) + t t t) + +(deftest pointerp.2 + (let ((p (make-pointer #xFEFF))) + (values + (pointerp p) + (typep p 'foreign-pointer))) + t t) + +(deftest pointerp.3 + (pointerp 'not-a-pointer) + nil) + +(deftest pointerp.4 + (pointerp 42) + nil) + +(deftest pointerp.5 + (pointerp 0) + nil) + +(deftest pointerp.6 + (pointerp nil) + nil) + +(deftest mem-ref.setf.1 + (with-foreign-object (p :char) + (setf (mem-ref p :char) 42)) + 42) + +(define-foreign-type int+1 () + () + (:actual-type :int) + (:simple-parser int+1)) + +(defmethod translate-to-foreign (value (type int+1)) + (1+ value)) + +(defmethod translate-from-foreign (value (type int+1)) + (1+ value)) + +(deftest mem-ref.setf.2 + (with-foreign-object (p 'int+1) + (values (setf (mem-ref p 'int+1) 42) + (mem-ref p 'int+1))) + 42 ; should this be 43? + 44) + +(deftest pointer-eq.non-pointers.1 + (expecting-error (pointer-eq 1 2)) + :error) + +(deftest pointer-eq.non-pointers.2 + (expecting-error (pointer-eq 'a 'b)) + :error) + +(deftest null-pointer-p.non-pointer.1 + (expecting-error (null-pointer-p 'not-a-pointer)) + :error) + +(deftest null-pointer-p.non-pointer.2 + (expecting-error (null-pointer-p 0)) + :error) + +(deftest null-pointer-p.non-pointer.3 + (expecting-error (null-pointer-p nil)) + :error) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/tests/misc-types.lisp b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/tests/misc-types.lisp new file mode 100644 index 0000000..ab1231e --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/tests/misc-types.lisp @@ -0,0 +1,296 @@ +;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- +;;; +;;; misc-types.lisp --- Various tests on the type system. +;;; +;;; Copyright (C) 2005-2006, Luis Oliveira +;;; +;;; Permission is hereby granted, free of charge, to any person +;;; obtaining a copy of this software and associated documentation +;;; files (the "Software"), to deal in the Software without +;;; restriction, including without limitation the rights to use, copy, +;;; modify, merge, publish, distribute, sublicense, and/or sell copies +;;; of the Software, and to permit persons to whom the Software is +;;; furnished to do so, subject to the following conditions: +;;; +;;; The above copyright notice and this permission notice shall be +;;; included in all copies or substantial portions of the Software. +;;; +;;; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +;;; EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +;;; MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +;;; NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +;;; HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +;;; WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +;;; OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +;;; DEALINGS IN THE SOFTWARE. +;;; + +(in-package #:cffi-tests) + +(defcfun ("my_strdup" strdup) :string+ptr (str :string)) + +(defcfun ("my_strfree" strfree) :void (str :pointer)) + +(deftest misc-types.string+ptr + (destructuring-bind (string pointer) + (strdup "foo") + (strfree pointer) + string) + "foo") + +#-(and) +(deftest misc-types.string+ptr.ub8 + (destructuring-bind (string pointer) + (strdup (make-array 3 :element-type '(unsigned-byte 8) + :initial-contents (map 'list #'char-code "foo"))) + (strfree pointer) + string) + "foo") + +#-(and) +(deftest misc-types.string.ub8.1 + (let ((array (make-array 7 :element-type '(unsigned-byte 8) + :initial-contents '(84 117 114 97 110 103 97)))) + (with-foreign-string (foreign-string array) + (foreign-string-to-lisp foreign-string))) + "Turanga") + +#-(and) +(deftest misc-types.string.ub8.2 + (let ((str (foreign-string-alloc + (make-array 7 :element-type '(unsigned-byte 8) + :initial-contents '(84 117 114 97 110 103 97))))) + (prog1 (foreign-string-to-lisp str) + (foreign-string-free str))) + "Turanga") + +(defcfun "equalequal" :boolean + (a (:boolean :int)) + (b (:boolean :unsigned-int))) + +(defcfun "bool_and" (:boolean :char) + (a (:boolean :unsigned-char)) + (b (:boolean :char))) + +(defcfun "bool_xor" (:boolean :unsigned-long) + (a (:boolean :long)) + (b (:boolean :unsigned-long))) + +(deftest misc-types.boolean.1 + (list (equalequal nil nil) + (equalequal t t) + (equalequal t 23) + (bool-and 'a 'b) + (bool-and "foo" nil) + (bool-xor t nil) + (bool-xor nil nil)) + (t t t t nil t nil)) + +(defcfun "sizeof_bool" :unsigned-int) + +(deftest misc-types.sizeof.bool + (eql (sizeof-bool) (foreign-type-size :bool)) + t) + +(defcfun "bool_to_unsigned" :unsigned-int + (b :bool)) + +(defcfun "unsigned_to_bool" :bool + (u :unsigned-int)) + +(deftest misc-types.bool.convert-to-foreign.mem + (loop for v in '(nil t) + collect + (with-foreign-object (b :bool) + (setf (mem-ref b :bool) v) + (mem-ref b #.(cffi::canonicalize-foreign-type :bool)))) + (0 1)) + +(deftest misc-types.bool.convert-to-foreign.call + (mapcar #'bool-to-unsigned '(nil t)) + (0 1)) + +(deftest misc-types.bool.convert-from-foreign.mem + (loop for v in '(0 1 42) + collect + (with-foreign-object (b :bool) + (setf (mem-ref b #.(cffi::canonicalize-foreign-type :bool)) v) + (mem-ref b :bool))) + (nil t t)) + +(deftest misc-types.bool.convert-from-foreign.call + (mapcar #'unsigned-to-bool '(0 1 42)) + (nil t t)) + +;;; Regression test: boolean type only worked with canonicalized +;;; built-in integer types. Should work for any type that canonicalizes +;;; to a built-in integer type. +(defctype int-for-bool :int) +(defcfun ("equalequal" equalequal2) :boolean + (a (:boolean int-for-bool)) + (b (:boolean :uint))) + +(deftest misc-types.boolean.2 + (equalequal2 nil t) + nil) + +(defctype my-string :string+ptr) + +(defun funkify (str) + (concatenate 'string "MORE " (string-upcase str))) + +(defun 3rd-person (value) + (list (concatenate 'string "Strdup says: " (first value)) + (second value))) + +;; (defctype funky-string +;; (:wrapper my-string +;; :to-c #'funkify +;; :from-c (lambda (value) +;; (list +;; (concatenate 'string "Strdup says: " +;; (first value)) +;; (second value)))) +;; "A useful type.") + +(defctype funky-string (:wrapper my-string :to-c funkify :from-c 3rd-person)) + +(defcfun ("my_strdup" funky-strdup) funky-string + (str funky-string)) + +(deftest misc-types.wrapper + (destructuring-bind (string ptr) + (funky-strdup "code") + (strfree ptr) + string) + "Strdup says: MORE CODE") + +(deftest misc-types.sized-ints + (mapcar #'foreign-type-size + '(:int8 :uint8 :int16 :uint16 :int32 :uint32 :int64 :uint64)) + (1 1 2 2 4 4 8 8)) + +(define-foreign-type error-error () + () + (:actual-type :int) + (:simple-parser error-error)) + +(defmethod translate-to-foreign (value (type error-error)) + (declare (ignore value)) + (error "translate-to-foreign invoked.")) + +(defmethod translate-from-foreign (value (type error-error)) + (declare (ignore value)) + (error "translate-from-foreign invoked.")) + +(eval-when (:load-toplevel :compile-toplevel :execute) + (defmethod expand-to-foreign (value (type error-error)) + value) + + (defmethod expand-from-foreign (value (type error-error)) + value)) + +(defcfun ("abs" expand-abs) error-error + (n error-error)) + +(defcvar ("var_int" *expand-var-int*) error-error) + +(defcfun ("expect_int_sum" expand-expect-int-sum) :boolean + (cb :pointer)) + +(defcallback expand-int-sum error-error ((x error-error) (y error-error)) + (+ x y)) + +;;; Ensure that macroexpansion-time translators are called where this +;;; is guaranteed (defcfun, defcvar, foreign-funcall and defcallback) +(deftest misc-types.expand.1 + (expand-abs -1) + 1) + +#-cffi-sys::no-foreign-funcall +(deftest misc-types.expand.2 + (foreign-funcall "abs" error-error -1 error-error) + 1) + +(deftest misc-types.expand.3 + (let ((old (mem-ref (get-var-pointer '*expand-var-int*) :int))) + (unwind-protect + (progn + (setf *expand-var-int* 42) + *expand-var-int*) + (setf (mem-ref (get-var-pointer '*expand-var-int*) :int) old))) + 42) + +(deftest misc-types.expand.4 + (expand-expect-int-sum (callback expand-int-sum)) + t) + +(define-foreign-type translate-tracker () + () + (:actual-type :int) + (:simple-parser translate-tracker)) + +(declaim (special .fto-called.)) + +(defmethod free-translated-object (value (type translate-tracker) param) + (declare (ignore value param)) + (setf .fto-called. t)) + +(define-foreign-type expand-tracker () + () + (:actual-type :int) + (:simple-parser expand-tracker)) + +(defmethod free-translated-object (value (type expand-tracker) param) + (declare (ignore value param)) + (setf .fto-called. t)) + +(eval-when (:compile-toplevel :load-toplevel :execute) + (defmethod expand-to-foreign (value (type expand-tracker)) + (declare (ignore value)) + (call-next-method))) + +(defcfun ("abs" ttracker-abs) :int + (n translate-tracker)) + +(defcfun ("abs" etracker-abs) :int + (n expand-tracker)) + +;; free-translated-object must be called when there is no etf +(deftest misc-types.expand.5 + (let ((.fto-called. nil)) + (ttracker-abs -1) + .fto-called.) + t) + +;; free-translated-object must be called when there is an etf, but +;; they answer *runtime-translator-form* +(deftest misc-types.expand.6 + (let ((.fto-called. nil)) + (etracker-abs -1) + .fto-called.) + t) + +(define-foreign-type misc-type.expand.7 () + () + (:actual-type :int) + (:simple-parser misc-type.expand.7)) + +(defmethod translate-to-foreign (value (type misc-type.expand.7)) + (values value 'second-value)) + +;; Auxiliary function to test CONVERT-TO-FOREIGN's compiler macro. +(defun misc-type.expand.7-aux () + (convert-to-foreign "foo" 'misc-type.expand.7)) + +;; Checking that expand-to-foreign doesn't ignore the second value of +;; translate-to-foreign. +(deftest misc-type.expand.7 + (misc-type.expand.7-aux) + "foo" second-value) + +;; Like MISC-TYPE.EXPAND.7 but doesn't depend on compiler macros +;; kicking in. +(deftest misc-type.expand.8 + (eval (expand-to-foreign "foo" (cffi::parse-type 'misc-type.expand.7))) + "foo" second-value) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/tests/misc.lisp b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/tests/misc.lisp new file mode 100644 index 0000000..5f5fdb6 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/tests/misc.lisp @@ -0,0 +1,132 @@ +;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- +;;; +;;; misc.lisp --- Miscellaneous tests. +;;; +;;; Copyright (C) 2006, Luis Oliveira +;;; +;;; Permission is hereby granted, free of charge, to any person +;;; obtaining a copy of this software and associated documentation +;;; files (the "Software"), to deal in the Software without +;;; restriction, including without limitation the rights to use, copy, +;;; modify, merge, publish, distribute, sublicense, and/or sell copies +;;; of the Software, and to permit persons to whom the Software is +;;; furnished to do so, subject to the following conditions: +;;; +;;; The above copyright notice and this permission notice shall be +;;; included in all copies or substantial portions of the Software. +;;; +;;; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +;;; EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +;;; MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +;;; NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +;;; HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +;;; WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +;;; OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +;;; DEALINGS IN THE SOFTWARE. +;;; + +(in-package #:cffi-tests) + +;;;# foreign-symbol-pointer tests + +;;; This might be useful for some libraries that compare function +;;; pointers. http://thread.gmane.org/gmane.lisp.cffi.devel/694 +(defcfun "compare_against_abs" :boolean (p :pointer)) + +(deftest foreign-symbol-pointer.1 + (compare-against-abs (foreign-symbol-pointer "abs")) + t) + +(defcfun "compare_against_xpto_fun" :boolean (p :pointer)) + +(deftest foreign-symbol-pointer.2 + (compare-against-xpto-fun (foreign-symbol-pointer "xpto_fun")) + t) + +;;;# Library tests +;;; +;;; Need to figure out a way to test this. CLISP, for instance, will +;;; automatically reopen the foreign-library when we call a foreign +;;; function so we can't test CLOSE-FOREIGN-LIBRARY this way. +;;; +;;; IIRC, GCC has some extensions to have code run when a library is +;;; loaded and stuff like that. That could work. + +#|| +#-(and ecl (not dffi)) +(deftest library.close.2 + (unwind-protect + (progn + (close-foreign-library 'libtest) + (ignore-errors (my-sqrtf 16.0))) + (load-test-libraries)) + nil) + +#-(or (and ecl (not dffi)) + cffi-sys::flat-namespace + cffi-sys::no-foreign-funcall) +(deftest library.close.2 + (unwind-protect + (values + (foreign-funcall ("ns_function" :library libtest) :boolean) + (close-foreign-library 'libtest) + (foreign-funcall "ns_function" :boolean) + (close-foreign-library 'libtest2) + (close-foreign-library 'libtest2) + (ignore-errors (foreign-funcall "ns_function" :boolean))) + (load-test-libraries)) + t t nil t nil nil) +||# + +(deftest library.error.1 + (handler-case (load-foreign-library "libdoesnotexistimsure") + (load-foreign-library-error () 'error)) + error) + +(define-foreign-library pseudo-library + (t pseudo-library-spec)) + +;;; RT: T clause was being handled as :T by FEATUREP. +;;; +;;; We might want to export (and clean up) the API used in this test +;;; when the need arises. +(deftest library.t-clause + (eq (cffi::foreign-library-spec + (cffi::get-foreign-library 'pseudo-library)) + 'pseudo-library-spec) + t) + +(define-foreign-library library-with-pathname + (t #p"libdoesnotexistimsure")) + +;;; RT: we were mishandling pathnames within libraries. (lp#1720626) +(deftest library.error.2 + (handler-case (load-foreign-library 'library-with-pathname) + (load-foreign-library-error () 'error)) + error) + +(deftest library.error.3 + (handler-case (load-foreign-library #p"libdoesnotexistimsure") + (load-foreign-library-error () 'error)) + error) + +;;;# Shareable Byte Vector Tests + +#+ecl +(mapc (lambda (x) (pushnew x rt::*expected-failures*)) + '(shareable-vector.1 shareable-vector.2)) + +(deftest shareable-vector.1 + (let ((vector (cffi-sys::make-shareable-byte-vector 5))) + (cffi::with-pointer-to-vector-data (pointer vector) + (strcpy pointer "xpto")) + vector) + #(120 112 116 111 0)) + +(deftest shareable-vector.2 + (block nil + (let ((vector (cffi-sys::make-shareable-byte-vector 5))) + (cffi::with-pointer-to-vector-data (pointer vector) + (strcpy pointer "xpto") + (return vector)))) + #(120 112 116 111 0)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/tests/package.lisp b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/tests/package.lisp new file mode 100644 index 0000000..00cb54c --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/tests/package.lisp @@ -0,0 +1,33 @@ +;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- +;;; +;;; package.lisp --- CFFI-TESTS package definition. +;;; +;;; Copyright (C) 2005-2006, James Bielman +;;; +;;; Permission is hereby granted, free of charge, to any person +;;; obtaining a copy of this software and associated documentation +;;; files (the "Software"), to deal in the Software without +;;; restriction, including without limitation the rights to use, copy, +;;; modify, merge, publish, distribute, sublicense, and/or sell copies +;;; of the Software, and to permit persons to whom the Software is +;;; furnished to do so, subject to the following conditions: +;;; +;;; The above copyright notice and this permission notice shall be +;;; included in all copies or substantial portions of the Software. +;;; +;;; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +;;; EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +;;; MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +;;; NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +;;; HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +;;; WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +;;; OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +;;; DEALINGS IN THE SOFTWARE. +;;; + +(in-package #:cl-user) + +(defpackage #:cffi-tests + (:use #:cl #:cffi #:cffi-sys #:regression-test) + (:export #:do-tests #:run-cffi-tests #:run-all-cffi-tests) + (:shadow #:deftest)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/tests/random-tester.lisp b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/tests/random-tester.lisp new file mode 100644 index 0000000..d720a08 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/tests/random-tester.lisp @@ -0,0 +1,246 @@ +;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- +;;; +;;; random-tester.lisp --- Random test generator. +;;; +;;; Copyright (C) 2006, Luis Oliveira +;;; +;;; Permission is hereby granted, free of charge, to any person +;;; obtaining a copy of this software and associated documentation +;;; files (the "Software"), to deal in the Software without +;;; restriction, including without limitation the rights to use, copy, +;;; modify, merge, publish, distribute, sublicense, and/or sell copies +;;; of the Software, and to permit persons to whom the Software is +;;; furnished to do so, subject to the following conditions: +;;; +;;; The above copyright notice and this permission notice shall be +;;; included in all copies or substantial portions of the Software. +;;; +;;; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +;;; EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +;;; MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +;;; NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +;;; HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +;;; WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +;;; OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +;;; DEALINGS IN THE SOFTWARE. +;;; + +;;; This code was used to generate the C and Lisp source code for +;;; the CALLBACKS.BFF.[12] and DEFCFUN.BFF.[12] tests. +;;; +;;; The original idea was to test all combinations of argument types +;;; but obviously as soon as you do the maths that it's not quite +;;; feasable for more that 4 or 5 arguments. +;;; +;;; TODO: actually run random tests, ie compile/load/run the tests +;;; this code can generate. + +(defpackage #:cffi-random-tester + (:use #:cl #:cffi #:alexandria #:regression-test)) +(in-package #:cffi-random-tester) + +(defstruct (c-type (:conc-name type-)) + keyword + name + abbrev + min + max) + +(defparameter +types+ + (mapcar (lambda (type) + (let ((keyword (first type)) + (name (second type))) + (multiple-value-bind (min max) + ;; assume we can represent an integer in the range + ;; [-2^16 2^16-1] in a float/double without causing + ;; rounding errors (probably a lame assumption) + (let ((type-size (if (or (eq keyword :float) + (eq keyword :double)) + 16 + (* 8 (foreign-type-size keyword))))) + (if (or (eql (char name 0) #\u) (eq keyword :pointer)) + (values 0 (1- (expt 2 type-size))) + (values (- (expt 2 (1- type-size))) + (1- (expt 2 (1- type-size)))))) + (make-c-type :keyword keyword :name name :abbrev (third type) + :min min :max max)))) + '((:char "char" "c") + (:unsigned-char "unsigned char" "uc") + (:short "short" "s") + (:unsigned-short "unsigned short" "us") + (:int "int" "i") + (:unsigned-int "unsigned int" "ui") + (:long "long" "l") + (:unsigned-long "unsigned long" "ul") + (:float "float" "f") + (:double "double" "d") + (:pointer "void*" "p") + (:long-long "long long" "ll") + (:unsigned-long-long "unsigned long long" "ull")))) + +(defun find-type (keyword) + (find keyword +types+ :key #'type-keyword)) + +(defun n-random-types (n) + (loop repeat n collect (nth (random (length +types+)) +types+))) + +;;; same as above, without the long long types +(defun n-random-types-no-ll (n) + (loop repeat n collect (nth (random (- (length +types+) 2)) +types+))) + +(defun random-range (x y) + (+ x (random (+ (- y x) 2)))) + +(defun random-sum (rettype arg-types) + "Returns a list of integers that fit in the respective types in the +ARG-TYPES list and whose sum fits in RETTYPE." + (loop with sum = 0 + for type in arg-types + for x = (random-range (max (- (type-min rettype) sum) (type-min type)) + (min (- (type-max rettype) sum) (type-max type))) + do (incf sum x) + collect x)) + +(defun combinations (n items) + (let ((combs '())) + (labels ((rec (n accum) + (if (= n 0) + (push accum combs) + (loop for item in items + do (rec (1- n) (cons item accum)))))) + (rec n '()) + combs))) + +(defun function-name (rettype arg-types) + (format nil "sum_~A_~{_~A~}" + (type-abbrev rettype) + (mapcar #'type-abbrev arg-types))) + +(defun c-function (rettype arg-types) + (let ((args (loop for type in arg-types and i from 1 + collect (list (type-name type) (format nil "a~A" i))))) + (format t "DLLEXPORT ~A ~A(~{~{~A ~A~}~^, ~})~%~ + { return ~A(~A) ~{~A~^ + ~}~A; }" + (type-name rettype) (function-name rettype arg-types) args + (if (eq (type-keyword rettype) :pointer) + "(void *)((unsigned int)(" + "") + (type-name rettype) + (loop for arg-pair in args collect + (format nil "~A~A~A" + (cond ((string= (first arg-pair) "void*") + "(unsigned int) ") + ((or (string= (first arg-pair) "double") + (string= (first arg-pair) "float")) + "((int) ") + (t "")) + (second arg-pair) + (if (member (first arg-pair) + '("void*" "double" "float") + :test #'string=) + ")" + ""))) + (if (eq (type-keyword rettype) :pointer) "))" "")))) + +(defun c-callback (rettype arg-types args) + (format t "DLLEXPORT ~A call_~A(~A (*func)(~{~A~^, ~}~^))~%~ + { return func(~{~A~^, ~}); }" + (type-name rettype) (function-name rettype arg-types) + (type-name rettype) (mapcar #'type-name arg-types) + (loop for type in arg-types and value in args collect + (format nil "~A~A" + (if (eq (type-keyword type) :pointer) + "(void *) " + "") + value)))) + +;;; (output-c-code #p"generated.c" 3 5) +(defun output-c-code (file min max) + (with-open-file (stream file :direction :output :if-exists :error) + (let ((*standard-output* stream)) + (format t "/* automatically generated functions and callbacks */~%~%") + (loop for n from min upto max do + (format t "/* ~A args */" (1- n)) + (loop for comb in (combinations n +types+) do + (terpri) (c-function (car comb) (cdr comb)) + (terpri) (c-callback (car comb) (cdr comb))))))) + +(defmacro with-conversion (type form) + (case type + (:double `(float ,form 1.0d0)) + (:float `(float ,form)) + (:pointer `(make-pointer ,form)) + (t form))) + +(defun integer-conversion (type form) + (case type + ((:double :float) `(values (floor ,form))) + (:pointer `(pointer-address ,form)) + (t form))) + +(defun gen-arg-values (rettype arg-types) + (let ((numbers (random-sum rettype arg-types))) + (values + (reduce #'+ numbers) + (loop for type in arg-types and n in numbers + collect (case (type-keyword type) + (:double (float n 1.0d0)) + (:float (float n)) + (:pointer `(make-pointer ,n)) + (t n)))))) + +(defun gen-function-test (rettype arg-types) + (let* ((fun-name (function-name rettype arg-types)) + (fun-sym (cffi::lisp-function-name fun-name))) + (multiple-value-bind (sum value-forms) + (gen-arg-values rettype arg-types) + `(progn + (defcfun (,fun-name ,fun-sym) ,(type-keyword rettype) + ,@(loop for type in arg-types and i from 1 collect + (list (symbolicate '#:a (format nil "~A" i)) + (type-keyword type)))) + (deftest ,(symbolicate '#:defcfun. fun-sym) + ,(integer-conversion (type-keyword rettype) + `(,fun-sym ,@value-forms)) + ,sum))))) + +(defun gen-callback-test (rettype arg-types sum) + (let* ((fname (function-name rettype arg-types)) + (cb-sym (cffi::lisp-function-name fname)) + (fun-name (concatenate 'string "call_" fname)) + (fun-sym (cffi::lisp-function-name fun-name)) + (arg-names (loop for i from 1 upto (length arg-types) collect + (symbolicate '#:a (format nil "~A" i))))) + `(progn + (defcfun (,fun-name ,fun-sym) ,(type-keyword rettype) (cb :pointer)) + (defcallback ,cb-sym ,(type-keyword rettype) + ,(loop for type in arg-types and name in arg-names + collect (list name (type-keyword type))) + ,(integer-conversion + (type-keyword rettype) + `(+ ,@(mapcar (lambda (tp n) + (integer-conversion (type-keyword tp) n)) + arg-types arg-names)))) + (deftest ,(symbolicate '#:callbacks. cb-sym) + ,(integer-conversion (type-keyword rettype) + `(,fun-sym (callback ,cb-sym))) + ,sum)))) + +(defun cb-test (&key no-long-long) + (let* ((rettype (find-type (if no-long-long :long :long-long))) + (arg-types (if no-long-long + (n-random-types-no-ll 127) + (n-random-types 127))) + (args (random-sum rettype arg-types)) + (sum (reduce #'+ args))) + (c-callback rettype arg-types args) + (gen-callback-test rettype arg-types sum))) + +;; (defmacro define-function-and-callback-tests (min max) +;; `(progn +;; ,@(loop for n from min upto max appending +;; (loop for comb in (combinations n +types+) +;; collect (gen-function-test (car comb) (cdr comb)) +;; collect (gen-callback-test (car comb) (cdr comb)))))) + +;; (define-function-and-callback-tests 3 5) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/tests/run-tests.lisp b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/tests/run-tests.lisp new file mode 100644 index 0000000..109b7fe --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/tests/run-tests.lisp @@ -0,0 +1,44 @@ +;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- +;;; +;;; run-tests.lisp --- Simple script to run the unit tests. +;;; +;;; Copyright (C) 2005-2006, James Bielman +;;; +;;; Permission is hereby granted, free of charge, to any person +;;; obtaining a copy of this software and associated documentation +;;; files (the "Software"), to deal in the Software without +;;; restriction, including without limitation the rights to use, copy, +;;; modify, merge, publish, distribute, sublicense, and/or sell copies +;;; of the Software, and to permit persons to whom the Software is +;;; furnished to do so, subject to the following conditions: +;;; +;;; The above copyright notice and this permission notice shall be +;;; included in all copies or substantial portions of the Software. +;;; +;;; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +;;; EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +;;; MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +;;; NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +;;; HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +;;; WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +;;; OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +;;; DEALINGS IN THE SOFTWARE. +;;; + +(in-package #:cl-user) + +(setf *load-verbose* nil *compile-verbose* nil *compile-print* nil) +#+cmucl (setf ext:*gc-verbose* nil) + +(require "asdf") + +(format t "~&;;; -------- Running tests in ~A --------~%" + (uiop:implementation-identifier)) + +(asdf:load-system "cffi-tests" :verbose nil) +(asdf:test-system "cffi-tests") + +(terpri) +(force-output) + +(uiop:quit) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/tests/strings.lisp b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/tests/strings.lisp new file mode 100644 index 0000000..1877754 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/tests/strings.lisp @@ -0,0 +1,150 @@ +;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- +;;; +;;; strings.lisp --- Tests for foreign string conversion. +;;; +;;; Copyright (C) 2005, James Bielman +;;; Copyright (C) 2007, Luis Oliveira +;;; +;;; Permission is hereby granted, free of charge, to any person +;;; obtaining a copy of this software and associated documentation +;;; files (the "Software"), to deal in the Software without +;;; restriction, including without limitation the rights to use, copy, +;;; modify, merge, publish, distribute, sublicense, and/or sell copies +;;; of the Software, and to permit persons to whom the Software is +;;; furnished to do so, subject to the following conditions: +;;; +;;; The above copyright notice and this permission notice shall be +;;; included in all copies or substantial portions of the Software. +;;; +;;; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +;;; EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +;;; MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +;;; NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +;;; HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +;;; WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +;;; OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +;;; DEALINGS IN THE SOFTWARE. +;;; + +(in-package #:cffi-tests) + +;;;# Foreign String Conversion Tests +;;; +;;; With the implementation of encoding support, there are a lot of +;;; things that can go wrong with foreign string conversions. This is +;;; a start at defining tests for strings and encoding conversion, but +;;; there needs to be a lot more. + +(babel:enable-sharp-backslash-syntax) + +;;; *ASCII-TEST-STRING* contains the characters in the ASCII character +;;; set that we will convert to a foreign string and check against +;;; *ASCII-TEST-BYTES*. We don't bother with control characters. +;;; +;;; FIXME: It would probably be good to move these tables into files +;;; in "tests/", especially if we ever want to get fancier and have +;;; tests for more encodings. +(eval-when (:compile-toplevel :load-toplevel :execute) + (defparameter *ascii-test-string* + (concatenate 'string " !\"#$%&'()*+,-./0123456789:;" + "<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]" + "^_`abcdefghijklmnopqrstuvwxyz{|}~"))) + +;;; *ASCII-TEST-BYTES* contains the expected ASCII encoded values +;;; for each character in *ASCII-TEST-STRING*. +(eval-when (:compile-toplevel :load-toplevel :execute) + (defparameter *ascii-test-bytes* + (let ((vector (make-array 95 :element-type '(unsigned-byte 8)))) + (loop for i from 0 + for code from 32 below 127 + do (setf (aref vector i) code) + finally (return vector))))) + +;;; Test basic consistency converting a string to and from Lisp using +;;; the default encoding. +(deftest string.conversion.basic + (with-foreign-string (s *ascii-test-string*) + (foreign-string-to-lisp s)) + #.*ascii-test-string* 95) + +(deftest string.conversion.basic.2 + (with-foreign-string ((ptr size) "123" :null-terminated-p nil) + (values (foreign-string-to-lisp ptr :count 3) size)) + "123" 3) + +;;; Ensure that conversion of *ASCII-TEST-STRING* to a foreign buffer +;;; and back preserves ASCII encoding. +(deftest string.encoding.ascii + (with-foreign-string (s *ascii-test-string* :encoding :ascii) + (let ((vector (make-array 95 :element-type '(unsigned-byte 8)))) + (loop for i from 0 below (length vector) + do (setf (aref vector i) (mem-ref s :unsigned-char i))) + vector)) + #.*ascii-test-bytes*) + +;;; FIXME: bogus test. We need support for BOM or UTF-16{BE,LE}. +(pushnew 'string.encoding.utf-16.basic rtest::*expected-failures*) + +;;; Test UTF-16 conversion of a string back and forth. Tests proper +;;; null terminator handling for wide character strings and ensures no +;;; byte order marks are added. (Why no BOM? --luis) +;;; +;;; FIXME: an identical test using :UTF-16 wouldn't work because on +;;; little-endian architectures, :UTF-16 defaults to little-endian +;;; when writing and big-endian on reading because the BOM is +;;; suppressed. +#-babel::8-bit-chars +(progn + (deftest string.encoding.utf-16le.basic + (with-foreign-string (s *ascii-test-string* :encoding :utf-16le) + (foreign-string-to-lisp s :encoding :utf-16le)) + #.*ascii-test-string* 190) + + (deftest string.encoding.utf-16be.basic + (with-foreign-string (s *ascii-test-string* :encoding :utf-16be) + (foreign-string-to-lisp s :encoding :utf-16be)) + #.*ascii-test-string* 190)) + +;;; Ensure that writing a long string into a short buffer does not +;;; attempt to write beyond the edge of the buffer, and that the +;;; resulting string is still null terminated. +(deftest string.short-write.1 + (with-foreign-pointer (buf 6) + (setf (mem-ref buf :unsigned-char 5) 70) + (lisp-string-to-foreign "ABCDE" buf 5 :encoding :ascii) + (values (mem-ref buf :unsigned-char 4) + (mem-ref buf :unsigned-char 5))) + 0 70) + +#-babel::8-bit-chars +(deftest string.encoding.utf-8.basic + (with-foreign-pointer (buf 7 size) + (let ((string (concatenate 'babel:unicode-string + '(#\u03bb #\u00e3 #\u03bb)))) + (lisp-string-to-foreign string buf size :encoding :utf-8) + (loop for i from 0 below size + collect (mem-ref buf :unsigned-char i)))) + (206 187 195 163 206 187 0)) + +(defparameter *basic-latin-alphabet* "abcdefghijklmnopqrstuvwxyz") + +(deftest string.encodings.all.basic + (let (failed) + ;;; FIXME: UTF-{32,16} and friends fail due to lack of BOM. See + ;;; STRING.ENCODING.UTF-16.BASIC for more details. + (dolist (encoding (remove-if (lambda (x) + (member x '(:utf-32 :utf-16 :ucs-2))) + (babel:list-character-encodings))) + ;; (format t "Testing ~S~%" encoding) + (with-foreign-string (ptr *basic-latin-alphabet* :encoding encoding) + (let ((string (foreign-string-to-lisp ptr :encoding encoding))) + ;; (format t " got ~S~%" string) + (unless (string= *basic-latin-alphabet* string) + (push encoding failed))))) + failed) + nil) + +;;; rt: make sure *default-foreign-enconding* binds to a keyword +(deftest string.encodings.default + (keywordp *default-foreign-encoding*) + t) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/tests/struct.lisp b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/tests/struct.lisp new file mode 100644 index 0000000..38be042 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/tests/struct.lisp @@ -0,0 +1,705 @@ +;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- +;;; +;;; struct.lisp --- Foreign structure type tests. +;;; +;;; Copyright (C) 2005-2006, James Bielman +;;; Copyright (C) 2005-2011, Luis Oliveira +;;; +;;; Permission is hereby granted, free of charge, to any person +;;; obtaining a copy of this software and associated documentation +;;; files (the "Software"), to deal in the Software without +;;; restriction, including without limitation the rights to use, copy, +;;; modify, merge, publish, distribute, sublicense, and/or sell copies +;;; of the Software, and to permit persons to whom the Software is +;;; furnished to do so, subject to the following conditions: +;;; +;;; The above copyright notice and this permission notice shall be +;;; included in all copies or substantial portions of the Software. +;;; +;;; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +;;; EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +;;; MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +;;; NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +;;; HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +;;; WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +;;; OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +;;; DEALINGS IN THE SOFTWARE. +;;; + +(in-package #:cffi-tests) + +(defcstruct timeval + (tv-secs :long) + (tv-usecs :long)) + +(defparameter *timeval-size* (* 2 (max (foreign-type-size :long) + (foreign-type-alignment :long)))) + +;;;# Basic Structure Tests + +(deftest struct.1 + (- (foreign-type-size 'timeval) *timeval-size*) + 0) + +(deftest struct.2 + (with-foreign-object (tv 'timeval) + (setf (foreign-slot-value tv 'timeval 'tv-secs) 0) + (setf (foreign-slot-value tv 'timeval 'tv-usecs) 1) + (values (foreign-slot-value tv 'timeval 'tv-secs) + (foreign-slot-value tv 'timeval 'tv-usecs))) + 0 1) + +(deftest struct.3 + (with-foreign-object (tv 'timeval) + (with-foreign-slots ((tv-secs tv-usecs) tv timeval) + (setf tv-secs 100 tv-usecs 200) + (values tv-secs tv-usecs))) + 100 200) + +;; regression test: accessing a struct through a typedef + +(defctype xpto (:struct timeval)) + +(deftest struct.4 + (with-foreign-object (tv 'xpto) + (setf (foreign-slot-value tv 'xpto 'tv-usecs) 1) + (values (foreign-slot-value tv 'xpto 'tv-usecs) + (foreign-slot-value tv 'timeval 'tv-usecs))) + 1 1) + +(deftest struct.names + (sort (foreign-slot-names 'xpto) #'< + :key (lambda (x) (foreign-slot-offset 'xpto x))) + (tv-secs tv-usecs)) + +;; regression test: compiler macro not quoting the type in the +;; resulting mem-ref form. The compiler macro on foreign-slot-value +;; is not guaranteed to be expanded though. + +(defctype my-int :int) +(defcstruct s5 (a my-int)) + +(deftest struct.5 + (with-foreign-object (s 's5) + (setf (foreign-slot-value s 's5 'a) 42) + (foreign-slot-value s 's5 'a)) + 42) + +;;;# Structs with type translators + +(defcstruct struct-string + (s :string)) + +(deftest struct.string.1 + (with-foreign-object (ptr 'struct-string) + (with-foreign-slots ((s) ptr struct-string) + (setf s "So long and thanks for all the fish!") + s)) + "So long and thanks for all the fish!") + +(deftest struct.string.2 + (with-foreign-object (ptr 'struct-string) + (setf (foreign-slot-value ptr 'struct-string 's) "Cha") + (foreign-slot-value ptr 'struct-string 's)) + "Cha") + +;;;# Structure Alignment Tests +;;; +;;; See libtest.c and types.lisp for some comments about alignments. + +(defcstruct s-ch + (a-char :char)) + +(defctype s-ch (:struct s-ch)) + +(defcstruct s-s-ch + (another-char :char) + (a-s-ch s-ch)) + +(defctype s-s-ch (:struct s-s-ch)) + +(defcvar "the_s_s_ch" s-s-ch) + +(deftest struct.alignment.1 + (list 'a-char (foreign-slot-value + (foreign-slot-pointer *the-s-s-ch* 's-s-ch 'a-s-ch) + 's-ch 'a-char) + 'another-char (foreign-slot-value *the-s-s-ch* 's-s-ch 'another-char)) + (a-char 1 another-char 2)) + + +(defcstruct s-short + (a-char :char) + (another-char :char) + (a-short :short)) + +(defctype s-short (:struct s-short)) + +(defcstruct s-s-short + (yet-another-char :char) + (a-s-short s-short)) + +(defctype s-s-short (:struct s-s-short)) + +(defcvar "the_s_s_short" s-s-short) + +(deftest struct.alignment.2 + (with-foreign-slots ((yet-another-char a-s-short) *the-s-s-short* s-s-short) + (with-foreign-slots ((a-char another-char a-short) a-s-short s-short) + (list 'a-char a-char + 'another-char another-char + 'a-short a-short + 'yet-another-char yet-another-char))) + (a-char 1 another-char 2 a-short 3 yet-another-char 4)) + + +(defcstruct s-double + (a-char :char) + (a-double :double) + (another-char :char)) + +(defctype s-double (:struct s-double)) + +(defcstruct s-s-double + (yet-another-char :char) + (a-s-double s-double) + (a-short :short)) + +(defctype s-s-double (:struct s-s-double)) + +(defcvar "the_s_s_double" s-s-double) + +(deftest struct.alignment.3 + (with-foreign-slots + ((yet-another-char a-s-double a-short) *the-s-s-double* s-s-double) + (with-foreign-slots ((a-char a-double another-char) a-s-double s-double) + (list 'a-char a-char + 'a-double a-double + 'another-char another-char + 'yet-another-char yet-another-char + 'a-short a-short))) + (a-char 1 a-double 2.0d0 another-char 3 yet-another-char 4 a-short 5)) + + +(defcstruct s-s-s-double + (another-short :short) + (a-s-s-double s-s-double) + (last-char :char)) + +(defctype s-s-s-double (:struct s-s-s-double)) + +(defcvar "the_s_s_s_double" s-s-s-double) + +(deftest struct.alignment.4 + (with-foreign-slots + ((another-short a-s-s-double last-char) *the-s-s-s-double* s-s-s-double) + (with-foreign-slots + ((yet-another-char a-s-double a-short) a-s-s-double s-s-double) + (with-foreign-slots ((a-char a-double another-char) a-s-double s-double) + (list 'a-char a-char + 'a-double a-double + 'another-char another-char + 'yet-another-char yet-another-char + 'a-short a-short + 'another-short another-short + 'last-char last-char)))) + (a-char 1 a-double 2.0d0 another-char 3 yet-another-char 4 a-short 5 + another-short 6 last-char 7)) + + +(defcstruct s-double2 + (a-double :double) + (a-short :short)) + +(defctype s-double2 (:struct s-double2)) + +(defcstruct s-s-double2 + (a-char :char) + (a-s-double2 s-double2) + (another-short :short)) + +(defctype s-s-double2 (:struct s-s-double2)) + +(defcvar "the_s_s_double2" s-s-double2) + +(deftest struct.alignment.5 + (with-foreign-slots + ((a-char a-s-double2 another-short) *the-s-s-double2* s-s-double2) + (with-foreign-slots ((a-double a-short) a-s-double2 s-double2) + (list 'a-double a-double + 'a-short a-short + 'a-char a-char + 'another-short another-short))) + (a-double 1.0d0 a-short 2 a-char 3 another-short 4)) + +(defcstruct s-long-long + (a-long-long :long-long) + (a-short :short)) + +(defctype s-long-long (:struct s-long-long)) + +(defcstruct s-s-long-long + (a-char :char) + (a-s-long-long s-long-long) + (another-short :short)) + +(defctype s-s-long-long (:struct s-s-long-long)) + +(defcvar "the_s_s_long_long" s-s-long-long) + +(deftest struct.alignment.6 + (with-foreign-slots + ((a-char a-s-long-long another-short) *the-s-s-long-long* s-s-long-long) + (with-foreign-slots ((a-long-long a-short) a-s-long-long s-long-long) + (list 'a-long-long a-long-long + 'a-short a-short + 'a-char a-char + 'another-short another-short))) + (a-long-long 1 a-short 2 a-char 3 another-short 4)) + +(defcstruct s-s-double3 + (a-s-double2 s-double2) + (another-short :short)) + +(defctype s-s-double3 (:struct s-s-double3)) + +(defcstruct s-s-s-double3 + (a-s-s-double3 s-s-double3) + (a-char :char)) + +(defctype s-s-s-double3 (:struct s-s-s-double3)) + +(defcvar "the_s_s_s_double3" s-s-s-double3) + +(deftest struct.alignment.7 + (with-foreign-slots ((a-s-s-double3 a-char) *the-s-s-s-double3* s-s-s-double3) + (with-foreign-slots ((a-s-double2 another-short) a-s-s-double3 s-s-double3) + (with-foreign-slots ((a-double a-short) a-s-double2 s-double2) + (list 'a-double a-double + 'a-short a-short + 'another-short another-short + 'a-char a-char)))) + (a-double 1.0d0 a-short 2 another-short 3 a-char 4)) + + +(defcstruct empty-struct) + +(defctype empty-struct (:struct empty-struct)) + +(defcstruct with-empty-struct + (foo empty-struct) + (an-int :int)) + +;; commented out this test because an empty struct is not valid/standard C +;; left the struct declarations anyway because they should be handled +;; gracefuly anyway. + +; (defcvar "the_with_empty_struct" with-empty-struct) +; +; (deftest struct.alignment.5 +; (with-foreign-slots ((foo an-int) *the-with-empty-struct* with-empty-struct) +; an-int) +; 42) + + +;; regression test, setf-ing nested foreign-slot-value forms +;; the setf expander used to return a bogus getter + +(defcstruct s1 + (an-int :int)) + +(defctype s1 (:struct s1)) + +(defcstruct s2 + (an-s1 s1)) + +(defctype s2 (:struct s2)) + +(deftest struct.nested-setf + (with-foreign-object (an-s2 's2) + (setf (foreign-slot-value (foreign-slot-value an-s2 's2 'an-s1) + 's1 'an-int) + 1984) + (foreign-slot-value (foreign-slot-value an-s2 's2 'an-s1) + 's1 'an-int)) + 1984) + +;; regression test, some Lisps were returning 4 instead of 8 for +;; (foreign-type-alignment :unsigned-long-long) on darwin/ppc32 + +(defcstruct s-unsigned-long-long + (an-unsigned-long-long :unsigned-long-long) + (a-short :short)) + +(defctype s-unsigned-long-long (:struct s-unsigned-long-long)) + +(defcstruct s-s-unsigned-long-long + (a-char :char) + (a-s-unsigned-long-long s-unsigned-long-long) + (another-short :short)) + +(defctype s-s-unsigned-long-long (:struct s-s-unsigned-long-long)) + +(defcvar "the_s_s_unsigned_long_long" s-s-unsigned-long-long) + +(deftest struct.alignment.8 + (with-foreign-slots + ((a-char a-s-unsigned-long-long another-short) + *the-s-s-unsigned-long-long* s-s-unsigned-long-long) + (with-foreign-slots ((an-unsigned-long-long a-short) + a-s-unsigned-long-long s-unsigned-long-long) + (list 'an-unsigned-long-long an-unsigned-long-long + 'a-short a-short + 'a-char a-char + 'another-short another-short))) + (an-unsigned-long-long 1 a-short 2 a-char 3 another-short 4)) + +;;;# C Struct Wrappers + +(define-c-struct-wrapper timeval ()) + +(define-c-struct-wrapper (timeval2 (:struct timeval)) () + (tv-secs)) + +(defmacro with-example-timeval (var &body body) + `(with-foreign-object (,var 'timeval) + (with-foreign-slots ((tv-secs tv-usecs) ,var timeval) + (setf tv-secs 42 tv-usecs 1984) + ,@body))) + +(deftest struct-wrapper.1 + (with-example-timeval ptr + (let ((obj (make-instance 'timeval :pointer ptr))) + (values (timeval-tv-secs obj) + (timeval-tv-usecs obj)))) + 42 1984) + +(deftest struct-wrapper.2 + (with-example-timeval ptr + (let ((obj (make-instance 'timeval2 :pointer ptr))) + (timeval2-tv-secs obj))) + 42) + +;;;# Structures as Values + +(defcstruct (struct-pair :class pair) + (a :int) + (b :int)) + +(defctype struct-pair-typedef1 (:struct struct-pair)) +(defctype struct-pair-typedef2 (:pointer (:struct struct-pair))) + +(deftest struct.unparse.1 + (mapcar (alexandria:compose #'cffi::unparse-type #'cffi::parse-type) + '(struct-pair + (:struct struct-pair) + struct-pair-typedef1 + struct-pair-typedef2)) + (struct-pair + (:struct struct-pair) + struct-pair-typedef1 + struct-pair-typedef2)) + +(deftest struct.canonicalize.1 + (mapcar #'cffi::canonicalize-foreign-type + '(struct-pair + (:struct struct-pair) + struct-pair-typedef1 + struct-pair-typedef2)) + (:pointer + (:struct struct-pair) + (:struct struct-pair) + :pointer)) + +(deftest struct.canonicalize.2 + (mapcar #'cffi::canonicalize-foreign-type + '(struct-pair + (:struct struct-pair) + struct-pair-typedef1 + struct-pair-typedef2)) + (:pointer + (:struct struct-pair) + (:struct struct-pair) + :pointer)) + +(defmethod translate-from-foreign (pointer (type pair)) + (with-foreign-slots ((a b) pointer (:struct struct-pair)) + (cons a b))) + +(defmethod translate-into-foreign-memory (object (type pair) pointer) + (with-foreign-slots ((a b) pointer (:struct struct-pair)) + (setf a (car object) + b (cdr object)))) + +(defmethod translate-to-foreign (object (type pair)) + (let ((p (foreign-alloc '(:struct struct-pair)))) + (translate-into-foreign-memory object type p) + (values p t))) + +(defmethod free-translated-object (pointer (type pair) freep) + (when freep + (foreign-free pointer))) + +(deftest struct-values.translation.1 + (multiple-value-bind (p freep) + (convert-to-foreign '(1 . 2) 'struct-pair) + (assert freep) + (unwind-protect + (convert-from-foreign p 'struct-pair) + (free-converted-object p 'struct-pair freep))) + (1 . 2)) + +(defcfun "pair_pointer_sum" :int + (p (:pointer (:struct struct-pair)))) + +#+#:pointer-translation-not-yet-implemented +(deftest struct-values.translation.2 + (pair-pointer-sum '(1 . 2)) + 3) + +;;; should the return type be something along the lines of +;;; (:pointer (:struct pair) :free t)? +;;; LMH: error on ":free t" option? +(defcfun "alloc_pair" (:pointer (:struct struct-pair)) + (a :int) + (b :int)) + +;; bogus: doesn't free() pointer. +#+#:pointer-translation-not-yet-implemented +(deftest struct-values.translation.3 + (alloc-pair 1 2) + (1 . 2)) + +(deftest struct-values.translation.mem-ref.1 + (with-foreign-object (p '(:struct struct-pair)) + (setf (mem-ref p '(:struct struct-pair)) '(1 . 2)) + (with-foreign-slots ((a b) p (:struct struct-pair)) + (values (mem-ref p '(:struct struct-pair)) + a + b))) + (1 . 2) + 1 + 2) + +(deftest struct-values.translation.mem-aref.1 + (with-foreign-object (p '(:struct struct-pair) 2) + (setf (mem-aref p '(:struct struct-pair) 0) '(1 . 2) + (mem-aref p '(:struct struct-pair) 1) '(3 . 4)) + (values (mem-aref p '(:struct struct-pair) 0) + (mem-aref p '(:struct struct-pair) 1))) + (1 . 2) + (3 . 4)) + +(defcstruct (struct-pair-default-translate :class pair-default) + (a :int) + (b :int)) + +(deftest struct-values-default.translation.mem-ref.1 + (with-foreign-object (p '(:struct struct-pair-default-translate)) + (setf (mem-ref p '(:struct struct-pair-default-translate)) '(a 1 b 2)) + (with-foreign-slots ((a b) p (:struct struct-pair-default-translate)) + (let ((plist (mem-ref p '(:struct struct-pair-default-translate)))) + (values (getf plist 'a) + (getf plist 'b) + a + b)))) + 1 + 2 + 1 + 2) + +(defcstruct (struct-pair+double :class pair+double) + (pr (:struct struct-pair-default-translate)) + (dbl :double)) + +(deftest struct-values-default.translation.mem-ref.2 + (with-foreign-object (p '(:struct struct-pair+double)) + (setf (mem-ref p '(:struct struct-pair+double)) '(pr (a 4 b 5) dbl 2.5d0)) + (with-foreign-slots ((pr dbl) p (:struct struct-pair+double)) + (let ((plist (mem-ref p '(:struct struct-pair+double)))) + (values (getf (getf plist 'pr) 'a) + (getf (getf plist 'pr) 'b) + (getf plist 'dbl))))) + 4 + 5 + 2.5d0) + +(defcstruct (struct-pair+1 :class pair+1) + (p (:pointer (:struct struct-pair))) + (c :int)) + +(defctype struct-pair+1 (:struct struct-pair+1)) + +(defmethod translate-from-foreign (pointer (type pair+1)) + (with-foreign-slots ((p c) pointer struct-pair+1) + (cons p c))) + +(defmethod translate-into-foreign-memory (object (type pair+1) pointer) + (with-foreign-slots ((c) pointer struct-pair+1) + (convert-into-foreign-memory (car object) + 'struct-pair + (foreign-slot-pointer pointer + 'struct-pair+1 + 'p)) + (setf c (cdr object)))) + +(defmethod translate-to-foreign (object (type pair+1)) + (let ((p (foreign-alloc 'struct-pair+1))) + (translate-into-foreign-memory object type p) + (values p t))) + +(defmethod free-translated-object (pointer (type pair+1) freep) + (when freep + (foreign-free pointer))) + +#+#:pointer-translation-not-yet-implemented +(deftest struct-values.translation.ppo.1 + (multiple-value-bind (p freep) + (convert-to-foreign '((1 . 2) . 3) 'struct-pair+1) + (assert freep) + (unwind-protect + (convert-from-foreign p 'struct-pair+1) + (free-converted-object p 'struct-pair+1 freep))) + ((1 . 2) . 3)) + +#+#:unimplemented +(defcfun "pair_plus_one_sum" :int + (p (:struct pair+1))) + +(defcfun "pair_plus_one_pointer_sum" :int + (p (:pointer (:struct struct-pair+1)))) + +#+#:pointer-translation-not-yet-implemented +(deftest struct-values.translation.ppo.2 + (pair-plus-one-pointer-sum '((1 . 2) . 3)) + 6) + +#+#:unimplemented +(defcfun "make_pair_plus_one" (:struct pair+1) + (a :int) + (b :int) + (c :int)) + +(defcfun "alloc_pair_plus_one" struct-pair+1 + (a :int) + (b :int) + (c :int)) + +;; bogus: doesn't free() pointer. +#+#:pointer-translation-not-yet-implemented +(deftest struct-values.translation.ppo.3 + (alloc-pair-plus-one 1 2 3) + ((1 . 2) . 3)) + +#+#:unimplemented +(defcfun "pair_sum" :int + (p (:struct pair))) + +#+#:unimplemented +(defcfun "make_pair" (:struct pair) + (a :int) + (b :int)) + +#|| ; TODO: load cffi-libffi for these tests to work. +(deftest struct-values.fn.1 + (with-foreign-object (p '(:struct pair)) + (with-foreign-slots ((a b) p (:struct pair)) + (setf a -1 b 2) + (pair-sum p))) + 1) + +(deftest struct-values.fn.2 + (pair-sum '(3 . 5)) + 8) + +(deftest struct-values.fn.3 + (with-foreign-object (p '(:struct pair)) + (make-pair 7 11 :result-pointer p) + (with-foreign-slots ((a b) p (:struct pair)) + (cons a b))) + (7 . 11)) + +(deftest struct-values.fn.4 + (make-pair 13 17) + (13 . 17)) +||# + +(defcstruct single-byte-struct + (a :uint8)) + +(deftest bare-struct-types.1 + (eql (foreign-type-size 'single-byte-struct) + (foreign-type-size '(:struct single-byte-struct))) + t) + +(defctype single-byte-struct-alias (:struct single-byte-struct)) + +(deftest bare-struct-types.2 + (eql (foreign-type-size 'single-byte-struct-alias) + (foreign-type-size '(:struct single-byte-struct))) + t) + +;;; Old-style access to inner structure fields. + +(defcstruct inner-struct (x :int)) +(defcstruct old-style-outer (inner inner-struct)) +(defcstruct new-style-outer (inner (:struct inner-struct))) + +(deftest old-style-struct-access + (with-foreign-object (s '(:struct old-style-outer)) + (let ((inner-ptr (foreign-slot-pointer s 'old-style-outer 'inner))) + (setf (foreign-slot-value inner-ptr 'inner-struct 'x) 42)) + (assert (pointerp (foreign-slot-value s 'old-style-outer 'inner))) + (foreign-slot-value (foreign-slot-value s 'old-style-outer 'inner) + 'inner-struct 'x)) + 42) + +(deftest new-style-struct-access + (with-foreign-object (s '(:struct new-style-outer)) + (let ((inner-ptr (foreign-slot-pointer s 'new-style-outer 'inner))) + (setf (foreign-slot-value inner-ptr 'inner-struct 'x) 42)) + (foreign-slot-value s 'new-style-outer 'inner)) + (x 42)) + +;;; regression test: setting the value of aggregate slots. + +(defcstruct aggregate-struct + (x :int) + (pair (:struct struct-pair)) + (y :int)) + +(deftest set-aggregate-struct-slot + (with-foreign-objects ((pair-struct '(:struct struct-pair)) + (aggregate-struct '(:struct aggregate-struct))) + (with-foreign-slots ((a b) pair-struct (:struct struct-pair)) + (setf a 1 b 2) + (with-foreign-slots ((x pair y) aggregate-struct (:struct aggregate-struct)) + (setf x 42 y 42) + (setf pair pair-struct) + (values x pair y)))) + 42 + (1 . 2) + 42) + +;; TODO this needs to go through compile-file to exhibit the error +;; ("don't know how to dump #"), but +;; there's no support for that, so let's leave it at toplevel here. +(defcstruct (aggregate-struct.acc :conc-name acc-) + (x :int) + (pair (:struct struct-pair)) + (y :int)) + +(deftest set-aggregate-struct-slot.acc + (with-foreign-objects ((pair-struct '(:struct struct-pair)) + (aggregate-struct '(:struct aggregate-struct))) + (with-foreign-slots ((a b) pair-struct (:struct struct-pair)) + (setf a 1 b 2) + (setf (acc-x aggregate-struct) 42) + (setf (acc-y aggregate-struct) 42) + (setf (acc-pair aggregate-struct) pair-struct) + (values (acc-x aggregate-struct) + (acc-pair aggregate-struct) + (acc-y aggregate-struct)))) + 42 + (1 . 2) + 42) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/tests/test-asdf.lisp b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/tests/test-asdf.lisp new file mode 100644 index 0000000..f823390 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/tests/test-asdf.lisp @@ -0,0 +1,42 @@ +;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- +;;; +;;; asdf.lisp --- CFFI-Grovel asdf support tests. +;;; +;;; Copyright (C) 2015, Luis Oliveira +;;; +;;; Permission is hereby granted, free of charge, to any person +;;; obtaining a copy of this software and associated documentation +;;; files (the "Software"), to deal in the Software without +;;; restriction, including without limitation the rights to use, copy, +;;; modify, merge, publish, distribute, sublicense, and/or sell copies +;;; of the Software, and to permit persons to whom the Software is +;;; furnished to do so, subject to the following conditions: +;;; +;;; The above copyright notice and this permission notice shall be +;;; included in all copies or substantial portions of the Software. +;;; +;;; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +;;; EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +;;; MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +;;; NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +;;; HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +;;; WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +;;; OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +;;; DEALINGS IN THE SOFTWARE. +;;; + +(in-package #:cffi-tests) + +#.(when (cffi-toolchain::static-ops-enabled-p) + '(deftest test-static-program + (progn + (asdf:operate :static-program-op :cffi-tests/example) + (let ((program (asdf:output-file :static-program-op :cffi-tests/example))) + (uiop:run-program `(,(native-namestring program) "1" "2 3") :output :lines))) + ("Arguments: 1 \"2 3\"" "hello, world!") nil 0)) + +(deftest test-asdf-load + (progn + (asdf:load-system :cffi-tests/example) + (uiop:symbol-call :cffi-example :check-groveller)) + nil) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/tests/test-static-link.sh b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/tests/test-static-link.sh new file mode 100644 index 0000000..ce8d9fa --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/tests/test-static-link.sh @@ -0,0 +1,9 @@ +#!/bin/sh -eux + +for l in sbcl ; do # mkcl ecl clisp sbcl + EX="$(cl-launch -l $l -sp cffi-toolchain -ip "(output-file :static-program-op :cffi-tests/example)")" + rm -f $EX ; : + cl-launch -l $l -sp cffi-toolchain -i "(operate :static-program-op :cffi-tests/example)" + [ -f $EX ] + [ "$($EX)" = "hello, world!" ] +done diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/tests/union.lisp b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/tests/union.lisp new file mode 100644 index 0000000..091751b --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/tests/union.lisp @@ -0,0 +1,52 @@ +;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- +;;; +;;; union.lisp --- Tests on C unions. +;;; +;;; Copyright (C) 2005-2006, James Bielman +;;; +;;; Permission is hereby granted, free of charge, to any person +;;; obtaining a copy of this software and associated documentation +;;; files (the "Software"), to deal in the Software without +;;; restriction, including without limitation the rights to use, copy, +;;; modify, merge, publish, distribute, sublicense, and/or sell copies +;;; of the Software, and to permit persons to whom the Software is +;;; furnished to do so, subject to the following conditions: +;;; +;;; The above copyright notice and this permission notice shall be +;;; included in all copies or substantial portions of the Software. +;;; +;;; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +;;; EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +;;; MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +;;; NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +;;; HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +;;; WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +;;; OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +;;; DEALINGS IN THE SOFTWARE. +;;; + +(in-package #:cffi-tests) + +(defcunion uint32-bytes + (int-value :unsigned-int) + (bytes :unsigned-char :count 4)) + +(defctype uint32-bytes (:union uint32-bytes)) + +(defun int-to-bytes (n) + "Convert N to a list of bytes using a union." + (with-foreign-object (obj 'uint32-bytes) + (setf (foreign-slot-value obj 'uint32-bytes 'int-value) n) + (loop for i from 0 below 4 + collect (mem-aref + (foreign-slot-value obj 'uint32-bytes 'bytes) + :unsigned-char i)))) + +(deftest union.1 + (let ((bytes (int-to-bytes #x12345678))) + (cond ((equal bytes '(#x12 #x34 #x56 #x78)) + t) + ((equal bytes '(#x78 #x56 #x34 #x12)) + t) + (t bytes))) + t) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/toolchain/bundle.lisp b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/toolchain/bundle.lisp new file mode 100644 index 0000000..d85bdb4 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/toolchain/bundle.lisp @@ -0,0 +1,565 @@ +;;;; ------------------------------------------------------------------------- +;;;; ASDF-Bundle + +(uiop/package:define-package :asdf/bundle + (:recycle :asdf/bundle :asdf) + (:use :uiop/common-lisp :uiop :asdf/upgrade + :asdf/component :asdf/system :asdf/find-system :asdf/find-component :asdf/operation + :asdf/action :asdf/lisp-action :asdf/plan :asdf/operate :asdf/defsystem) + (:export + #:bundle-op #:bundle-type #:program-system + #:bundle-system #:bundle-pathname-type #:direct-dependency-files + #:monolithic-op #:monolithic-bundle-op #:operation-monolithic-p + #:basic-compile-bundle-op #:prepare-bundle-op + #:compile-bundle-op #:load-bundle-op #:monolithic-compile-bundle-op #:monolithic-load-bundle-op + #:lib-op #:monolithic-lib-op + #:dll-op #:monolithic-dll-op + #:deliver-asd-op #:monolithic-deliver-asd-op + #:program-op #:image-op #:compiled-file #:precompiled-system #:prebuilt-system + #:user-system-p #:user-system #:trivial-system-p + #:prologue-code #:epilogue-code #:static-library)) +(in-package :asdf/bundle) + +(with-upgradability () + (defclass bundle-op (basic-compile-op) + ;; NB: use of instance-allocated slots for operations is DEPRECATED + ;; and only supported in a temporary fashion for backward compatibility. + ;; Supported replacement: Define slots on program-system instead. + ((bundle-type :initform :no-output-file :reader bundle-type :allocation :class)) + (:documentation "base class for operations that bundle outputs from multiple components")) + + (defclass monolithic-op (operation) () + (:documentation "A MONOLITHIC operation operates on a system *and all of its +dependencies*. So, for example, a monolithic concatenate operation will +concatenate together a system's components and all of its dependencies, but a +simple concatenate operation will concatenate only the components of the system +itself.")) + + (defclass monolithic-bundle-op (bundle-op monolithic-op) + ;; Old style way of specifying prologue and epilogue on ECL: in the monolithic operation. + ;; DEPRECATED. Supported replacement: Define slots on program-system instead. + ((prologue-code :initform nil :accessor prologue-code) + (epilogue-code :initform nil :accessor epilogue-code)) + (:documentation "operations that are both monolithic-op and bundle-op")) + + (defclass program-system (system) + ;; New style (ASDF3.1) way of specifying prologue and epilogue on ECL: in the system + ((prologue-code :initform nil :initarg :prologue-code :reader prologue-code) + (epilogue-code :initform nil :initarg :epilogue-code :reader epilogue-code) + (no-uiop :initform nil :initarg :no-uiop :reader no-uiop) + (prefix-lisp-object-files :initarg :prefix-lisp-object-files + :initform nil :accessor prefix-lisp-object-files) + (postfix-lisp-object-files :initarg :postfix-lisp-object-files + :initform nil :accessor postfix-lisp-object-files) + (extra-object-files :initarg :extra-object-files + :initform nil :accessor extra-object-files) + (extra-build-args :initarg :extra-build-args + :initform nil :accessor extra-build-args))) + + (defmethod prologue-code ((x system)) nil) + (defmethod epilogue-code ((x system)) nil) + (defmethod no-uiop ((x system)) nil) + (defmethod prefix-lisp-object-files ((x system)) nil) + (defmethod postfix-lisp-object-files ((x system)) nil) + (defmethod extra-object-files ((x system)) nil) + (defmethod extra-build-args ((x system)) nil) + + (defclass link-op (bundle-op) () + (:documentation "Abstract operation for linking files together")) + + (defclass gather-operation (bundle-op) + ((gather-operation :initform nil :allocation :class :reader gather-operation) + (gather-type :initform :no-output-file :allocation :class :reader gather-type)) + (:documentation "Abstract operation for gathering many input files from a system")) + + (defun operation-monolithic-p (op) + (typep op 'monolithic-op)) + + ;; Dependencies of a gather-op are the actions of the dependent operation + ;; for all the (sorted) required components for loading the system. + ;; Monolithic operations typically use lib-op as the dependent operation, + ;; and all system-level dependencies as required components. + ;; Non-monolithic operations typically use compile-op as the dependent operation, + ;; and all transitive sub-components as required components (excluding other systems). + (defmethod component-depends-on ((o gather-operation) (s system)) + (let* ((mono (operation-monolithic-p o)) + (go (make-operation (or (gather-operation o) 'compile-op))) + (bundle-p (typep go 'bundle-op)) + ;; In a non-mono operation, don't recurse to other systems. + ;; In a mono operation gathering bundles, don't recurse inside systems. + (component-type (if mono (if bundle-p 'system t) '(not system))) + ;; In the end, only keep system bundles or non-system bundles, depending. + (keep-component (if bundle-p 'system '(not system))) + (deps + ;; Required-components only looks at the dependencies of an action, excluding the action + ;; itself, so it may be safely used by an action recursing on its dependencies (which + ;; may or may not be an overdesigned API, since in practice we never use it that way). + ;; Therefore, if we use :goal-operation 'load-op :keep-operation 'load-op, which looks + ;; cleaner, we will miss the load-op on the requested system itself, which doesn't + ;; matter for a regular system, but matters, a lot, for a package-inferred-system. + ;; Using load-op as the goal operation and basic-compile-op as the keep-operation works + ;; for our needs of gathering all the files we want to include in a bundle. + ;; Note that we use basic-compile-op rather than compile-op so it will still work on + ;; systems when *load-system-operation* is load-bundle-op. + (required-components + s :other-systems mono :component-type component-type :keep-component keep-component + :goal-operation 'load-op :keep-operation 'basic-compile-op))) + `((,go ,@deps) ,@(call-next-method)))) + + ;; Create a single fasl for the entire library + (defclass basic-compile-bundle-op (bundle-op) + ((gather-type :initform #-(or clasp ecl mkcl) :fasl #+(or clasp ecl mkcl) :object + :allocation :class) + (bundle-type :initform :fasl :allocation :class)) + (:documentation "Base class for compiling into a bundle")) + + ;; Analog to prepare-op, for load-bundle-op and compile-bundle-op + (defclass prepare-bundle-op (sideway-operation) + ((sideway-operation + :initform #+(or clasp ecl mkcl) 'load-bundle-op #-(or clasp ecl mkcl) 'load-op + :allocation :class)) + (:documentation "Operation class for loading the bundles of a system's dependencies")) + + (defclass lib-op (link-op gather-operation non-propagating-operation) + ((gather-type :initform :object :allocation :class) + (bundle-type :initform :lib :allocation :class)) + (:documentation "Compile the system and produce a linkable static library (.a/.lib) +for all the linkable object files associated with the system. Compare with DLL-OP. + +On most implementations, these object files only include extensions to the runtime +written in C or another language with a compiler producing linkable object files. +On CLASP, ECL, MKCL, these object files _also_ include the contents of Lisp files +themselves. In any case, this operation will produce what you need to further build +a static runtime for your system, or a dynamic library to load in an existing runtime.")) + + ;; What works: on ECL, CLASP(?), MKCL, we link the many .o files from the system into the .so; + ;; on other implementations, we combine (usually concatenate) the .fasl files into one. + (defclass compile-bundle-op (basic-compile-bundle-op selfward-operation gather-operation + #+(or clasp ecl mkcl) link-op) + ((selfward-operation :initform '(prepare-bundle-op) :allocation :class)) + (:documentation "This operator is an alternative to COMPILE-OP. Build a system +and all of its dependencies, but build only a single (\"monolithic\") FASL, instead +of one per source file, which may be more resource efficient. That monolithic +FASL should be loaded with LOAD-BUNDLE-OP, rather than LOAD-OP.")) + + (defclass load-bundle-op (basic-load-op selfward-operation) + ((selfward-operation :initform '(prepare-bundle-op compile-bundle-op) :allocation :class)) + (:documentation "This operator is an alternative to LOAD-OP. Build a system +and all of its dependencies, using COMPILE-BUNDLE-OP. The difference with +respect to LOAD-OP is that it builds only a single FASL, which may be +faster and more resource efficient.")) + + ;; NB: since the monolithic-op's can't be sideway-operation's, + ;; if we wanted lib-op, dll-op, deliver-asd-op to be sideway-operation's, + ;; we'd have to have the monolithic-op not inherit from the main op, + ;; but instead inherit from a basic-FOO-op as with basic-compile-bundle-op above. + + (defclass dll-op (link-op gather-operation non-propagating-operation) + ((gather-type :initform :object :allocation :class) + (bundle-type :initform :dll :allocation :class)) + (:documentation "Compile the system and produce a dynamic loadable library (.so/.dll) +for all the linkable object files associated with the system. Compare with LIB-OP.")) + + (defclass deliver-asd-op (basic-compile-op selfward-operation) + ((selfward-operation + ;; TODO: implement link-op on all implementations, and make that + ;; '(compile-bundle-op lib-op #-(or clasp ecl mkcl) dll-op) + :initform '(compile-bundle-op #+(or clasp ecl mkcl) lib-op) + :allocation :class)) + (:documentation "produce an asd file for delivering the system as a single fasl")) + + + (defclass monolithic-deliver-asd-op (deliver-asd-op monolithic-bundle-op) + ((selfward-operation + ;; TODO: implement link-op on all implementations, and make that + ;; '(monolithic-compile-bundle-op monolithic-lib-op #-(or clasp ecl mkcl) monolithic-dll-op) + :initform '(monolithic-compile-bundle-op #+(or clasp ecl mkcl) monolithic-lib-op) + :allocation :class)) + (:documentation "produce fasl and asd files for combined system and dependencies.")) + + (defclass monolithic-compile-bundle-op + (basic-compile-bundle-op monolithic-bundle-op + #+(or clasp ecl mkcl) link-op gather-operation non-propagating-operation) + () + (:documentation "Create a single fasl for the system and its dependencies.")) + + (defclass monolithic-load-bundle-op (load-bundle-op monolithic-bundle-op) + ((selfward-operation :initform 'monolithic-compile-bundle-op :allocation :class)) + (:documentation "Load a single fasl for the system and its dependencies.")) + + (defclass monolithic-lib-op (lib-op monolithic-bundle-op non-propagating-operation) + ((gather-type :initform :object :allocation :class)) + (:documentation "Compile the system and produce a linkable static library (.a/.lib) +for all the linkable object files associated with the system or its dependencies. See LIB-OP.")) + + (defclass monolithic-dll-op (dll-op monolithic-bundle-op non-propagating-operation) + ((gather-type :initform :object :allocation :class)) + (:documentation "Compile the system and produce a dynamic loadable library (.so/.dll) +for all the linkable object files associated with the system or its dependencies. See LIB-OP")) + + (defclass image-op (monolithic-bundle-op selfward-operation + #+(or clasp ecl mkcl) link-op #+(or clasp ecl mkcl) gather-operation) + ((bundle-type :initform :image :allocation :class) + (gather-operation :initform 'lib-op :allocation :class) + #+(or clasp ecl mkcl) (gather-type :initform :static-library :allocation :class) + (selfward-operation :initform '(#-(or clasp ecl mkcl) load-op) :allocation :class)) + (:documentation "create an image file from the system and its dependencies")) + + (defclass program-op (image-op) + ((bundle-type :initform :program :allocation :class)) + (:documentation "create an executable file from the system and its dependencies")) + + ;; From the ASDF-internal bundle-type identifier, get a filesystem-usable pathname type. + (defun bundle-pathname-type (bundle-type) + (etypecase bundle-type + ((or null string) ;; pass through nil or string literal + bundle-type) + ((eql :no-output-file) ;; marker for a bundle-type that has NO output file + (error "No output file, therefore no pathname type")) + ((eql :fasl) ;; the type of a fasl + #-(or clasp ecl mkcl) (compile-file-type) ; on image-based platforms, used as input and output + #+(or clasp ecl mkcl) "fasb") ; on C-linking platforms, only used as output for system bundles + ((member :image) + #+allegro "dxl" + #+(and clisp os-windows) "exe" + #-(or allegro (and clisp os-windows)) "image") + ;; NB: on CLASP and ECL these implementations, we better agree with + ;; (compile-file-type :type bundle-type)) + ((eql :object) ;; the type of a linkable object file + (os-cond ((os-unix-p) "o") + ((os-windows-p) (if (featurep '(:or :mingw32 :mingw64)) "o" "obj")))) + ((member :lib :static-library) ;; the type of a linkable library + (os-cond ((os-unix-p) "a") + ((os-windows-p) (if (featurep '(:or :mingw32 :mingw64)) "a" "lib")))) + ((member :dll :shared-library) ;; the type of a shared library + (os-cond ((os-macosx-p) "dylib") ((os-unix-p) "so") ((os-windows-p) "dll"))) + ((eql :program) ;; the type of an executable program + (os-cond ((os-unix-p) nil) ((os-windows-p) "exe"))))) + + ;; Compute the output-files for a given bundle action + (defun bundle-output-files (o c) + (let ((bundle-type (bundle-type o))) + (unless (or (eq bundle-type :no-output-file) ;; NIL already means something regarding type. + (and (null (input-files o c)) (not (member bundle-type '(:image :program))))) + (let ((name (or (component-build-pathname c) + (let ((suffix + (unless (typep o 'program-op) + ;; "." is no good separator for Logical Pathnames, so we use "--" + (if (operation-monolithic-p o) + "--all-systems" + ;; These use a different type .fasb or .a instead of .fasl + #-(or clasp ecl mkcl) "--system")))) + (format nil "~A~@[~A~]" (component-name c) suffix)))) + (type (bundle-pathname-type bundle-type))) + (values (list (subpathname (component-pathname c) name :type type)) + (eq (class-of o) (coerce-class (component-build-operation c) + :package :asdf/interface + :super 'operation + :error nil))))))) + + (defmethod output-files ((o bundle-op) (c system)) + (bundle-output-files o c)) + + #-(or clasp ecl mkcl) + (progn + (defmethod perform ((o image-op) (c system)) + (dump-image (output-file o c) :executable (typep o 'program-op))) + (defmethod perform :before ((o program-op) (c system)) + (setf *image-entry-point* (ensure-function (component-entry-point c))))) + + (defclass compiled-file (file-component) + ((type :initform #-(or clasp ecl mkcl) (compile-file-type) #+(or clasp ecl mkcl) "fasb")) + (:documentation "Class for a file that is already compiled, +e.g. as part of the implementation, of an outer build system that calls into ASDF, +or of opaque libraries shipped along the source code.")) + + (defclass precompiled-system (system) + ((build-pathname :initarg :fasl)) + (:documentation "Class For a system that is delivered as a precompiled fasl")) + + (defclass prebuilt-system (system) + ((build-pathname :initarg :static-library :initarg :lib + :accessor prebuilt-system-static-library)) + (:documentation "Class for a system delivered with a linkable static library (.a/.lib)"))) + + +;;; +;;; BUNDLE-OP +;;; +;;; This operation takes all components from one or more systems and +;;; creates a single output file, which may be +;;; a FASL, a statically linked library, a shared library, etc. +;;; The different targets are defined by specialization. +;;; +(when-upgrading (:version "3.2.0") + ;; Cancel any previously defined method + (defmethod initialize-instance :after ((instance bundle-op) &rest initargs &key &allow-other-keys) + (declare (ignore initargs)))) + +(with-upgradability () + (defgeneric trivial-system-p (component)) + + (defun user-system-p (s) + (and (typep s 'system) + (not (builtin-system-p s)) + (not (trivial-system-p s))))) + +(eval-when (#-lispworks :compile-toplevel :load-toplevel :execute) + (deftype user-system () '(and system (satisfies user-system-p)))) + +;;; +;;; First we handle monolithic bundles. +;;; These are standalone systems which contain everything, +;;; including other ASDF systems required by the current one. +;;; A PROGRAM is always monolithic. +;;; +;;; MONOLITHIC SHARED LIBRARIES, PROGRAMS, FASL +;;; +(with-upgradability () + (defun direct-dependency-files (o c &key (test 'identity) (key 'output-files) &allow-other-keys) + ;; This function selects output files from direct dependencies; + ;; your component-depends-on method must gather the correct dependencies in the correct order. + (while-collecting (collect) + (map-direct-dependencies + t o c #'(lambda (sub-o sub-c) + (loop :for f :in (funcall key sub-o sub-c) + :when (funcall test f) :do (collect f)))))) + + (defun pathname-type-equal-function (type) + #'(lambda (p) (equalp (pathname-type p) type))) + + (defmethod input-files ((o gather-operation) (c system)) + (unless (eq (bundle-type o) :no-output-file) + (direct-dependency-files + o c :key 'output-files + :test (pathname-type-equal-function (bundle-pathname-type (gather-type o)))))) + + ;; Find the operation that produces a given bundle-type + (defun select-bundle-operation (type &optional monolithic) + (ecase type + ((:dll :shared-library) + (if monolithic 'monolithic-dll-op 'dll-op)) + ((:lib :static-library) + (if monolithic 'monolithic-lib-op 'lib-op)) + ((:fasl) + (if monolithic 'monolithic-compile-bundle-op 'compile-bundle-op)) + ((:image) + 'image-op) + ((:program) + 'program-op)))) + +;;; +;;; LOAD-BUNDLE-OP +;;; +;;; This is like ASDF's LOAD-OP, but using bundle fasl files. +;;; +(with-upgradability () + (defmethod component-depends-on ((o load-bundle-op) (c system)) + `((,o ,@(component-sideway-dependencies c)) + (,(if (user-system-p c) 'compile-bundle-op 'load-op) ,c) + ,@(call-next-method))) + + (defmethod input-files ((o load-bundle-op) (c system)) + (when (user-system-p c) + (output-files (find-operation o 'compile-bundle-op) c))) + + (defmethod perform ((o load-bundle-op) (c system)) + (when (input-files o c) + (perform-lisp-load-fasl o c))) + + (defmethod mark-operation-done :after ((o load-bundle-op) (c system)) + (mark-operation-done (find-operation o 'load-op) c))) + +;;; +;;; PRECOMPILED FILES +;;; +;;; This component can be used to distribute ASDF systems in precompiled form. +;;; Only useful when the dependencies have also been precompiled. +;;; +(with-upgradability () + (defmethod trivial-system-p ((s system)) + (every #'(lambda (c) (typep c 'compiled-file)) (component-children s))) + + (defmethod input-files ((o operation) (c compiled-file)) + (list (component-pathname c))) + (defmethod perform ((o load-op) (c compiled-file)) + (perform-lisp-load-fasl o c)) + (defmethod perform ((o load-source-op) (c compiled-file)) + (perform (find-operation o 'load-op) c)) + (defmethod perform ((o operation) (c compiled-file)) + nil)) + +;;; +;;; Pre-built systems +;;; +(with-upgradability () + (defmethod trivial-system-p ((s prebuilt-system)) + t) + + (defmethod perform ((o link-op) (c prebuilt-system)) + nil) + + (defmethod perform ((o basic-compile-bundle-op) (c prebuilt-system)) + nil) + + (defmethod perform ((o lib-op) (c prebuilt-system)) + nil) + + (defmethod perform ((o dll-op) (c prebuilt-system)) + nil) + + (defmethod component-depends-on ((o gather-operation) (c prebuilt-system)) + nil) + + (defmethod output-files ((o lib-op) (c prebuilt-system)) + (values (list (prebuilt-system-static-library c)) t))) + + +;;; +;;; PREBUILT SYSTEM CREATOR +;;; +(with-upgradability () + (defmethod output-files ((o deliver-asd-op) (s system)) + (list (make-pathname :name (component-name s) :type "asd" + :defaults (component-pathname s)))) + + (defmethod perform ((o deliver-asd-op) (s system)) + (let* ((inputs (input-files o s)) + (fasl (first inputs)) + (library (second inputs)) + (asd (first (output-files o s))) + (name (if (and fasl asd) (pathname-name asd) (return-from perform))) + (version (component-version s)) + (dependencies + (if (operation-monolithic-p o) + ;; We want only dependencies, and we use basic-load-op rather than load-op so that + ;; this will keep working on systems when *load-system-operation* is load-bundle-op + (remove-if-not 'builtin-system-p + (required-components s :component-type 'system + :keep-operation 'basic-load-op)) + (while-collecting (x) ;; resolve the sideway-dependencies of s + (map-direct-dependencies + t 'load-op s + #'(lambda (o c) + (when (and (typep o 'load-op) (typep c 'system)) + (x c))))))) + (depends-on (mapcar 'coerce-name dependencies))) + (when (pathname-equal asd (system-source-file s)) + (cerror "overwrite the asd file" + "~/asdf-action:format-action/ is going to overwrite the system definition file ~S ~ +which is probably not what you want; you probably need to tweak your output translations." + (cons o s) asd)) + (with-open-file (s asd :direction :output :if-exists :supersede + :if-does-not-exist :create) + (format s ";;; Prebuilt~:[~; monolithic~] ASDF definition for system ~A~%" + (operation-monolithic-p o) name) + (format s ";;; Built for ~A ~A on a ~A/~A ~A~%" + (lisp-implementation-type) + (lisp-implementation-version) + (software-type) + (machine-type) + (software-version)) + (let ((*package* (find-package :asdf-user))) + (pprint `(defsystem ,name + :class prebuilt-system + :version ,version + :depends-on ,depends-on + :components ((:compiled-file ,(pathname-name fasl))) + ,@(when library `(:lib ,(file-namestring library)))) + s) + (terpri s))))) + + #-(or clasp ecl mkcl) + (defmethod perform ((o basic-compile-bundle-op) (c system)) + (let* ((input-files (input-files o c)) + (fasl-files (remove (compile-file-type) input-files :key #'pathname-type :test-not #'equalp)) + (non-fasl-files (remove (compile-file-type) input-files :key #'pathname-type :test #'equalp)) + (output-files (output-files o c)) + (output-file (first output-files))) + (assert (eq (not input-files) (not output-files))) + (when input-files + (when non-fasl-files + (error "On ~A, asdf/bundle can only bundle FASL files, but these were also produced: ~S" + (implementation-type) non-fasl-files)) + (when (or (prologue-code c) (epilogue-code c)) + (error "prologue-code and epilogue-code are not supported on ~A" + (implementation-type))) + (with-staging-pathname (output-file) + (combine-fasls fasl-files output-file))))) + + (defmethod input-files ((o load-op) (s precompiled-system)) + (bundle-output-files (find-operation o 'compile-bundle-op) s)) + + (defmethod perform ((o load-op) (s precompiled-system)) + (perform-lisp-load-fasl o s)) + + (defmethod component-depends-on ((o load-bundle-op) (s precompiled-system)) + #+xcl (declare (ignorable o)) + `((load-op ,s) ,@(call-next-method)))) + +#| ;; Example use: +(asdf:defsystem :precompiled-asdf-utils :class asdf::precompiled-system :fasl (asdf:apply-output-translations (asdf:system-relative-pathname :asdf-utils "asdf-utils.system.fasl"))) +(asdf:load-system :precompiled-asdf-utils) +|# + +#+(or clasp ecl mkcl) +(with-upgradability () + + #+ecl ;; doesn't work on clasp or mkcl (yet?). + (unless (use-ecl-byte-compiler-p) + (setf *load-system-operation* 'load-bundle-op)) + + (defun system-module-pathname (module) + (let ((name (coerce-name module))) + (some + 'file-exists-p + (list + #+clasp (compile-file-pathname (make-pathname :name name :defaults "sys:") :output-type :object) + #+ecl (compile-file-pathname (make-pathname :name name :defaults "sys:") :type :lib) + #+ecl (compile-file-pathname (make-pathname :name name :defaults "sys:") :type :object) + #+mkcl (make-pathname :name name :type (bundle-pathname-type :lib) :defaults #p"sys:") + #+mkcl (make-pathname :name name :type (bundle-pathname-type :lib) :defaults #p"sys:contrib;"))))) + + (defun make-prebuilt-system (name &optional (pathname (system-module-pathname name))) + "Creates a prebuilt-system if PATHNAME isn't NIL." + (when pathname + (make-instance 'prebuilt-system + :name (coerce-name name) + :static-library (resolve-symlinks* pathname)))) + + (defmethod component-depends-on :around ((o image-op) (c system)) + (destructuring-bind ((lib-op . deps)) (call-next-method) + (labels ((has-it-p (x) (find x deps :test 'equal :key 'coerce-name)) + (ensure-linkable-system (x) + (unless (has-it-p x) + (or (if-let (s (find-system x)) + (and (system-source-directory x) + (list s))) + (if-let (p (system-module-pathname x)) + (list (make-prebuilt-system x p))))))) + `((,lib-op + ,@(unless (no-uiop c) + (append (ensure-linkable-system "cmp") + (or (ensure-linkable-system "uiop") + (ensure-linkable-system "asdf")))) + ,@deps))))) + + (defmethod perform ((o link-op) (c system)) + (let* ((object-files (input-files o c)) + (output (output-files o c)) + (bundle (first output)) + (programp (typep o 'program-op)) + (kind (bundle-type o))) + (when output + (apply 'create-image + bundle (append + (when programp (prefix-lisp-object-files c)) + object-files + (when programp (postfix-lisp-object-files c))) + :kind kind + :prologue-code (when programp (prologue-code c)) + :epilogue-code (when programp (epilogue-code c)) + :build-args (when programp (extra-build-args c)) + :extra-object-files (when programp (extra-object-files c)) + :no-uiop (no-uiop c) + (when programp `(:entry-point ,(component-entry-point c)))))))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/toolchain/c-toolchain.lisp b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/toolchain/c-toolchain.lisp new file mode 100644 index 0000000..8e70227 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/toolchain/c-toolchain.lisp @@ -0,0 +1,392 @@ +;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- +;;; +;;; c-toolchain.lisp --- Generic support compiling and linking C code. +;;; +;;; Copyright (C) 2005-2006, Dan Knap +;;; Copyright (C) 2005-2006, Emily Backes +;;; Copyright (C) 2007, Stelian Ionescu +;;; Copyright (C) 2007, Luis Oliveira +;;; +;;; Permission is hereby granted, free of charge, to any person +;;; obtaining a copy of this software and associated documentation +;;; files (the "Software"), to deal in the Software without +;;; restriction, including without limitation the rights to use, copy, +;;; modify, merge, publish, distribute, sublicense, and/or sell copies +;;; of the Software, and to permit persons to whom the Software is +;;; furnished to do so, subject to the following conditions: +;;; +;;; The above copyright notice and this permission notice shall be +;;; included in all copies or substantial portions of the Software. +;;; +;;; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +;;; EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +;;; MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +;;; NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +;;; HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +;;; WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +;;; OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +;;; DEALINGS IN THE SOFTWARE. +;;; + +(in-package #:cffi-toolchain) + +;;; Utils + +(defun parse-command-flags (flags) + (let ((separators '(#\Space #\Tab #\Newline #\Return))) + (remove-if 'emptyp (split-string flags :separator separators)))) + +(defun parse-command-flags-list (strings) + (loop for flags in strings append (parse-command-flags flags))) + +(defun program-argument (x) + (etypecase x + (string x) + (pathname (native-namestring x)))) + +(defun invoke (command &rest args) + (when (pathnamep command) + (setf command (native-namestring command)) + #+os-unix + (unless (absolute-pathname-p command) + (setf command (strcat "./" command)))) + (let ((cmd (cons command (mapcar 'program-argument args)))) + (safe-format! *debug-io* "; ~A~%" (escape-command cmd)) + (run-program cmd :output :interactive :error-output :interactive))) + + +;;; C support + +(defparameter *cc* nil "C compiler") +(defparameter *cc-flags* nil "flags for the C compiler") +(defparameter *ld* nil "object linker") ;; NB: can actually be the same as *cc* +(defparameter *ld-exe-flags* nil "flags for linking executables via *ld*") +(defparameter *ld-dll-flags* nil "flags for linking shared library via *ld*") +(defparameter *linkkit-start* nil "flags for the implementation linkkit, start") +(defparameter *linkkit-end* nil "flags for the implementation linkkit, end") + +(defun link-all-library (lib) + ;; Flags to provide to cc to link a whole library into an executable + (when lib + (if (featurep :darwin) ;; actually, LLVM ld vs GNU ld + `("-Wl,-force_load" ,lib) + `("-Wl,--whole-archive" ,lib "-Wl,--no-whole-archive")))) + +(defun normalize-flags (directory flags) + (loop for val in (parse-command-flags flags) collect + (cond + ((find (first-char val) "-+/") val) + ((probe-file* (subpathname directory val))) + (t val)))) + +(defun implementation-file (file &optional type) + (subpathname (lisp-implementation-directory) file + :type (bundle-pathname-type type))) + +;; TODO: on CCL, extract data from +;; (pathname (strcat "ccl:lisp-kernel/" (ccl::kernel-build-directory) "/Makefile")) ? + +#+clisp +(progn + (defparameter *clisp-toolchain-parameters* + '(("CC" *cc*) + ("CFLAGS" *cc-flags* t) + ("CLFLAGS" *cc-exe-flags* t) + ("LIBS" *linkkit-start* t) + ("X_LIBS" *linkkit-end* t))) + (defun clisp-toolchain-parameters (&optional linkset) + (nest + (let* ((linkset (ensure-pathname + (or linkset "base") + :defaults (lisp-implementation-directory) + :ensure-absolute t + :ensure-directory t + :want-existing t)) + (makevars (subpathname linkset "makevars")))) + (with-input-file (params makevars :if-does-not-exist nil)) + (when params) + (loop for l = (read-line params nil nil) while l + finally (appendf *linkkit-start* (normalize-flags linkset "modules.o")) do) + (if-let (p (position #\= l))) + (let ((var (subseq l 0 p)) + ;; strip the start and end quote characters + (val (subseq l (+ p 2) (- (length l) 1))))) + (if-let (param (cdr (assoc var *clisp-toolchain-parameters* :test 'equal)))) + (destructuring-bind (sym &optional normalizep) param + (setf (symbol-value sym) + (if normalizep (normalize-flags linkset val) val)))) + (setf *ld* *cc* + *ld-exe-flags* `(,@*cc-flags* #-darwin "-Wl,--export-dynamic") + *ld-dll-flags* (list* #+darwin "-dynamiclib" ;; -bundle ? + #-darwin "-shared" + *cc-flags*)))) + +;; TODO: for CMUCL, see whatever uses its linker.sh, +;; and teach it to accept additional objects / libraries +;; as it links a runtime plus a core into an executable + +#+ecl +(defun ecl-toolchain-parameters () + (setf *cc* c:*cc* + *cc-flags* `(,@(parse-command-flags c::*cc-flags*) + ,@(parse-command-flags c:*user-cc-flags*)) + ;; For the below, we just use c::build-FOO + *ld* *cc* + *ld-exe-flags* *cc-flags* + *ld-dll-flags* *cc-flags* + *linkkit-start* nil + *linkkit-end* nil)) + +#+mkcl +(defun mkcl-toolchain-parameters () + (setf *cc* compiler::*cc* + *cc-flags* (parse-command-flags compiler::*cc-flags*) + ;; For the below, we just use compiler::build-FOO + *ld* *cc* + *ld-exe-flags* *cc-flags* + *ld-dll-flags* *cc-flags* + *linkkit-start* nil + *linkkit-end* nil)) + +#+sbcl +(progn + (defparameter *sbcl-toolchain-parameters* + '(("CC" *cc*) + ("CFLAGS" *cc-flags* t) + ("LINKFLAGS" *ld-exe-flags* t) + ("USE_LIBSBCL" *linkkit-start* t) + ("LIBS" *linkkit-end* t))) + (defun sbcl-toolchain-parameters () + (nest + (let* ((sbcl-home (lisp-implementation-directory)) + (sbcl.mk (subpathname sbcl-home "sbcl.mk")))) + (with-input-file (params sbcl.mk :if-does-not-exist nil)) + (when params) + (loop for l = (read-line params nil nil) while l + finally (appendf *linkkit-end* '("-lm")) do) + (if-let (p (position #\= l))) + (let ((var (subseq l 0 p)) + (val (subseq l (1+ p))))) + (if-let (param (cdr (assoc var *sbcl-toolchain-parameters* :test 'equal)))) + (destructuring-bind (sym &optional normalizep) param + (setf (symbol-value sym) + (if normalizep (normalize-flags sbcl-home val) val)))) + (unless (featurep :sb-linkable-runtime) + (setf *linkkit-start* nil *linkkit-end* nil)) + (setf *ld* *cc* ;; ! + *ld-dll-flags* (list* #+darwin "-dynamiclib" #-darwin "-shared" + *cc-flags*)))) + +;;; Taken from sb-grovel +(defun split-cflags (string) + (remove-if (lambda (flag) + (zerop (length flag))) + (loop + for start = 0 then (if end (1+ end) nil) + for end = (and start (position #\Space string :start start)) + while start + collect (subseq string start end)))) + +(defun default-toolchain-parameters () + ;; The values below are legacy guesses from previous versions of CFFI. + ;; It would be nice to clean them up, remove unneeded guesses, + ;; annotate every guess with some comment explaining the context. + ;; TODO: have proper implementation-provided linkkit parameters + ;; for all implementations as above, and delete the below altogether. + (let ((arch-flags + ;; Former *cpu-word-size-flags* + #+arm '("-marm") + #+arm64 '() + #-(or arm arm64) + (ecase (cffi:foreign-type-size :pointer) + (4 '("-m32")) + (8 '("-m64"))))) + (setf *cc* + (or (getenvp "CC") + #+(or cygwin (not windows)) "cc" + "gcc") + *cc-flags* + (append + arch-flags + ;; For MacPorts + #+darwin (list "-I" "/opt/local/include/") + ;; ECL internal flags + #+ecl (parse-command-flags c::*cc-flags*) + ;; FreeBSD non-base header files + #+freebsd (list "-I" "/usr/local/include/") + (split-cflags (getenv "CFLAGS"))) + *ld* *cc* + *ld-exe-flags* `(,@arch-flags #-darwin "-Wl,--export-dynamic") + *ld-dll-flags* (list* #+darwin "-dynamiclib" ;; -bundle ? + #-darwin "-shared" + *cc-flags*) + *linkkit-start* nil + *linkkit-end* nil))) + +(defun ensure-toolchain-parameters () + #+clisp (unless *cc* (clisp-toolchain-parameters)) + #+ecl (unless *cc* (ecl-toolchain-parameters)) + #+mkcl (unless *cc* (mkcl-toolchain-parameters)) + #+sbcl (unless *cc* (sbcl-toolchain-parameters)) + (unless *cc* (default-toolchain-parameters))) + +;; Actually initialize toolchain parameters +(ignore-errors (ensure-toolchain-parameters)) + + +(defun call-with-temporary-output (output-file fun) + (let ((output-file (ensure-pathname output-file :want-file t :ensure-absolute t :truenamize t))) + (with-temporary-file + (:pathname tmp :direction :output + :prefix (strcat (native-namestring (pathname-directory-pathname output-file)) + (pathname-name output-file) "-tmp") + :suffix "" + :type (pathname-type output-file)) + (funcall fun tmp) + (rename-file-overwriting-target tmp output-file)))) + +(defmacro with-temporary-output ((output-file-var &optional (output-file-val output-file-var)) + &body body) + "Create an output file atomically, by executing the BODY while OUTPUT-FILE-VAR +is bound to a temporary file name, then atomically renaming that temporary file to OUTPUT-FILE-VAL." + `(call-with-temporary-output ,output-file-val (lambda (,output-file-var) ,@body))) + +(defun invoke-builder (builder output-file &rest args) + "Invoke the C Compiler with given OUTPUT-FILE and arguments ARGS" + (with-temporary-output (output-file) + (apply 'invoke `(,@builder ,output-file ,@args)))) + +(defun cc-compile (output-file inputs) + (apply 'invoke-builder (list *cc* "-o") output-file + "-c" (append *cc-flags* #-windows '("-fPIC") inputs))) + +(defun link-executable (output-file inputs) + (apply 'invoke-builder (list *ld* "-o") output-file + (append *ld-exe-flags* inputs))) + +(defun link-lisp-executable (output-file inputs) + #+ecl + (let ((c::*ld-flags* + (format nil "-Wl,--export-dynamic ~@[ ~A~]" + c::*ld-flags*))) + (c::build-program output-file :lisp-files inputs)) + #+mkcl (compiler::build-program + output-file :lisp-object-files (mapcar 'program-argument inputs) + :on-missing-lisp-object-initializer nil) + #+(and sbcl (not sb-linkable-runtime)) (error "Your SBCL doesn't support :SB-LINKABLE-RUNTIME") + #-(or ecl mkcl) + (link-executable output-file `(,@*linkkit-start* ,@inputs ,@*linkkit-end*))) + +(defun link-static-library (output-file inputs) + #+ecl (c::build-static-library output-file :lisp-files inputs) + #+mkcl (compiler::build-static-library + output-file :lisp-object-files (mapcar 'program-argument inputs) + :on-missing-lisp-object-initializer nil) + #-(or ecl mkcl) + (with-temporary-output (output-file) + (delete-file-if-exists output-file) + #+(or bsd linux windows) + (apply 'invoke + `(;; TODO: make it portable to BSD. + ;; ar D is also on FreeBSD, but not on OpenBSD or Darwin, dunno about NetBSD; + ;; ar T seems to only be on Linux (means something different on Darwin). Sigh. + ;; A MRI script might be more portable... not, only supported by GNU binutils. + ;; I couldn't get libtool to work, and it's not ubiquitous anyway. + ;; ,@`("libtool" "--mode=link" ,*cc* ,@*cc-flags* "-static" "-o" ,output-file) + ;; "Solution": never link .a's into further .a's, only link .o's into .a's, + ;; which implied changes that are now the case in ASDF 3.2.0. + #+bsd ,@`("ar" "rcs" ,output-file) ;; NB: includes darwin + #+linux ,@`("ar" "rcsDT" ,output-file) + #+windows ,@`("lib" "-nologo" ,(strcat "-out:" (native-namestring output-file))) + ,@inputs)) + #-(or bsd linux windows) + (error "Not implemented on your system"))) + +(defun link-shared-library (output-file inputs) + ;; remove the library so we won't possibly be overwriting + ;; the code of any existing process + (delete-file-if-exists output-file) + #+ecl (c::build-shared-library output-file :lisp-files inputs) + #+mkcl (compiler::build-shared-library + output-file :lisp-object-files (mapcar 'program-argument inputs) + :on-missing-lisp-object-initializer nil) + #-(or ecl mkcl) + ;; Don't use a temporary file, because linking is sensitive to the output file name :-/ (or put it in a temporary directory?) + (apply 'invoke *ld* "-o" output-file + (append *ld-dll-flags* inputs))) + + +;;; Computing file names + +(defun make-c-file-name (output-defaults &optional suffix) + (make-pathname :type "c" + :name (strcat (pathname-name output-defaults) suffix) + :defaults output-defaults)) + +(defun make-o-file-name (output-defaults &optional suffix) + (make-pathname :type (bundle-pathname-type :object) + :name (format nil "~A~@[~A~]" (pathname-name output-defaults) suffix) + :defaults output-defaults)) + +(defun make-so-file-name (defaults) + (make-pathname :type (bundle-pathname-type :shared-library) + :defaults defaults)) + +(defun make-exe-file-name (defaults) + (make-pathname :type (bundle-pathname-type :program) + :defaults defaults)) + + +;;; Implement link-op on image-based platforms. +#-(or clasp ecl mkcl) +(defmethod perform ((o link-op) (c system)) + (let* ((inputs (input-files o c)) + (output (first (output-files o c))) + (kind (bundle-type o))) + (when output ;; some operations skip any output when there is no input + (ecase kind + (:program (link-executable output inputs)) + ((:lib :static-library) (link-static-library output inputs)) + ((:dll :shared-library) (link-shared-library output inputs)))))) + +(defclass c-file (source-file) + ((cflags :initarg :cflags :initform :default) + (type :initform "c"))) + +(defmethod output-files ((o compile-op) (c c-file)) + (let* ((i (first (input-files o c))) + (base (format nil "~(~{~a~^__~}~)" + (mapcar (lambda (x) (substitute-if #\_ (complement #'alphanumericp) x)) + (component-find-path c)))) + (path (make-pathname :defaults i :name base))) + (list (make-o-file-name path) + (make-so-file-name path)))) + +(defmethod perform ((o compile-op) (c c-file)) + (let ((i (first (input-files o c)))) + (destructuring-bind (.o .so) (output-files o c) + (cc-compile .o (list i)) + (link-shared-library .so (list .o))))) + +(defmethod perform ((o load-op) (c c-file)) + (let ((o (second (input-files o c)))) + (cffi:load-foreign-library (file-namestring o) :search-path (list (pathname-directory-pathname o))))) + +(setf (find-class 'asdf::c-file) (find-class 'c-file)) + +(defclass o-file (source-file) + ((cflags :initarg :cflags :initform :default) + (type :initform (bundle-pathname-type :object))) + (:documentation "class for pre-compile object components")) + +(defmethod output-files ((op compile-op) (c o-file)) + (let* ((o (first (input-files op c))) + (so (apply-output-translations (make-so-file-name o)))) + (values (list o so) t))) + +(defmethod perform ((o load-op) (c o-file)) + (let ((so (second (input-files o c)))) + (cffi:load-foreign-library (file-namestring so) :search-path (list (pathname-directory-pathname so))))) + +(setf (find-class 'asdf::o-file) (find-class 'o-file)) + diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/toolchain/package.lisp b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/toolchain/package.lisp new file mode 100644 index 0000000..3c3d4ed --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/toolchain/package.lisp @@ -0,0 +1,46 @@ +;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- +;;; +;;; package.lisp --- Toolchain DEFPACKAGE. +;;; +;;; Permission is hereby granted, free of charge, to any person +;;; obtaining a copy of this software and associated documentation +;;; files (the "Software"), to deal in the Software without +;;; restriction, including without limitation the rights to use, copy, +;;; modify, merge, publish, distribute, sublicense, and/or sell copies +;;; of the Software, and to permit persons to whom the Software is +;;; furnished to do so, subject to the following conditions: +;;; +;;; The above copyright notice and this permission notice shall be +;;; included in all copies or substantial portions of the Software. +;;; +;;; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +;;; EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +;;; MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +;;; NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +;;; HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +;;; WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +;;; OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +;;; DEALINGS IN THE SOFTWARE. +;;; + +(uiop:define-package #:cffi-toolchain + (:mix #:asdf #:uiop #:common-lisp) + (:import-from #:asdf/bundle + #:link-op #:bundle-pathname-type #:bundle-type + #:gather-operation #:gather-type) + (:export + ;; Variables + #:*cc* #:*cc-flags* + #:*ld* #:*ld-exe-flags* #:*ld-dll-flags* + #:*linkkit-start* #:*linkkit-end* + ;; Functions from c-toolchain + #:make-c-file-name #:make-o-file-name + #:make-so-file-name #:make-exe-file-name + #:parse-command-flags #:parse-command-flags-list + #:invoke #:invoke-build #:cc-compile + #:link-static-library #:link-shared-library + #:link-executable #:link-lisp-executable + ;; ASDF classes + #:c-file #:o-file + #:static-runtime-op #:static-image-op #:static-program-op + )) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/toolchain/static-link.lisp b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/toolchain/static-link.lisp new file mode 100644 index 0000000..020ab0d --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/toolchain/static-link.lisp @@ -0,0 +1,95 @@ +;; FIXME: arrange packages so that this can be moved in ASDF some time later? + +(in-package #:cffi-toolchain) + +(defun static-ops-enabled-p () + (ensure-toolchain-parameters) + (and (or *linkkit-start* *linkkit-end*) t)) + +(defclass static-runtime-op (monolithic-bundle-op link-op selfward-operation) () + (:documentation "Create a Lisp runtime linkable library for the system and its dependencies.")) +(defmethod bundle-type ((o static-runtime-op)) :program) +(defmethod selfward-operation ((o static-runtime-op)) 'monolithic-lib-op) + +(defmethod output-files ((o static-runtime-op) (s system)) + #-(or ecl mkcl) + (list (subpathname (component-pathname s) + (strcat (coerce-name s) "-runtime") + :type (bundle-pathname-type :program)))) + +(defmethod perform ((o static-runtime-op) (s system)) + (link-lisp-executable + (output-file o s) + (link-all-library (first (input-files o s))))) + +(defclass static-image-op (image-op) () + (:documentation "Create a statically linked standalone image for the system.")) +#-(or ecl mkcl) (defmethod selfward-operation ((o static-image-op)) '(load-op static-runtime-op)) +#+(or ecl mkcl) (defmethod gather-operation ((o static-image-op)) 'compile-op) +#+(or ecl mkcl) (defmethod gather-operation ((o static-image-op)) :object) + +(defclass static-program-op (program-op static-image-op) () + (:documentation "Create a statically linked standalone executable for the system.")) + +;; Problem? Its output may conflict with the program-op output :-/ + +#-(or ecl mkcl) +(defmethod perform ((o static-image-op) (s system)) + #-(or clisp sbcl) (error "Not implemented yet") + #+(or clisp sbcl) + (let* ((name (coerce-name s)) + (runtime (output-file 'static-runtime-op s)) + (image + #+clisp (implementation-file "base/lispinit.mem") + #+sbcl (subpathname (lisp-implementation-directory) "sbcl.core")) + (output (output-file o s)) + (child-op (if (typep o 'program-op) 'program-op 'image-op))) + (with-temporary-output (tmp output) + (apply 'invoke runtime + #+clisp "-M" #+sbcl "--core" image + `(#+clisp ,@'("--silent" "-ansi" "-norc" "-x") + #+sbcl ,@'("--noinform" "--non-interactive" "--no-sysinit" "--no-userinit" "--eval") + ,(with-safe-io-syntax (:package :asdf) + (let ((*print-pretty* nil) + (*print-case* :downcase)) + (format + ;; This clever staging allows to put things in a single form, + ;; as required for CLISP not to print output for the first form, + ;; yet allow subsequent forms to rely on packages defined by former forms. + nil "'(~@{#.~S~^ ~})" + '(require "asdf") + '(in-package :asdf) + `(progn + (setf asdf:*central-registry* ',asdf:*central-registry*) + (initialize-source-registry ',asdf::*source-registry-parameter*) + (initialize-output-translations ',asdf::*output-translations-parameter*) + (upgrade-asdf) + ,@(if-let (ql-home + (symbol-value (find-symbol* '*quicklisp-home* 'ql-setup nil))) + `((load ,(subpathname ql-home "setup.lisp")))) + (load-system "cffi-grovel") + ;; We force the (final step of the) operation to take place + (defmethod operation-done-p + ((operation ,child-op) (system (eql (find-system ,name)))) + nil) + ;; Some implementations (notably SBCL) die as part of dumping an image, + ;; so redirect output-files to desired destination, for this processs might + ;; never otherwise get a chance to move the file to destination. + (defmethod output-files + ((operation ,child-op) (system (eql (find-system ,name)))) + (values (list ,tmp) t)) + (operate ',child-op ,name) + (quit)))))))))) + +#+(or ecl mkcl) +(defmethod perform ((o static-image-op) (s system)) + (let (#+ecl + (c::*ld-flags* + (format nil "-Wl,--export-dynamic ~@[ ~A~]" + c::*ld-flags*))) + (call-next-method))) + +;; Allow for :static-FOO-op in ASDF definitions. +(setf (find-class 'asdf::static-runtime-op) (find-class 'static-runtime-op) + (find-class 'asdf::static-image-op) (find-class 'static-image-op) + (find-class 'asdf::static-program-op) (find-class 'static-program-op)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/uffi-compat/uffi-compat.lisp b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/uffi-compat/uffi-compat.lisp new file mode 100644 index 0000000..ca67aa8 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/uffi-compat/uffi-compat.lisp @@ -0,0 +1,664 @@ +;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- +;;; +;;; uffi-compat.lisp --- UFFI compatibility layer for CFFI. +;;; +;;; Copyright (C) 2005-2006, James Bielman +;;; Copyright (C) 2005-2007, Luis Oliveira +;;; +;;; Permission is hereby granted, free of charge, to any person +;;; obtaining a copy of this software and associated documentation +;;; files (the "Software"), to deal in the Software without +;;; restriction, including without limitation the rights to use, copy, +;;; modify, merge, publish, distribute, sublicense, and/or sell copies +;;; of the Software, and to permit persons to whom the Software is +;;; furnished to do so, subject to the following conditions: +;;; +;;; The above copyright notice and this permission notice shall be +;;; included in all copies or substantial portions of the Software. +;;; +;;; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +;;; EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +;;; MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +;;; NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +;;; HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +;;; WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +;;; OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +;;; DEALINGS IN THE SOFTWARE. +;;; + +;;; Code borrowed from UFFI is Copyright (c) Kevin M. Rosenberg. + +(defpackage #:cffi-uffi-compat + (:nicknames #:uffi) ;; is this a good idea? + (:use #:cl) + (:export + + ;; immediate types + #:def-constant + #:def-foreign-type + #:def-type + #:null-char-p + + ;; aggregate types + #:def-enum + #:def-struct + #:get-slot-value + #:get-slot-pointer + #:def-array-pointer + #:deref-array + #:def-union + + ;; objects + #:allocate-foreign-object + #:free-foreign-object + #:with-foreign-object + #:with-foreign-objects + #:size-of-foreign-type + #:pointer-address + #:deref-pointer + #:ensure-char-character + #:ensure-char-integer + #:ensure-char-storable + #:null-pointer-p + #:make-null-pointer + #:make-pointer + #:+null-cstring-pointer+ + #:char-array-to-pointer + #:with-cast-pointer + #:def-foreign-var + #:convert-from-foreign-usb8 + #:def-pointer-var + + ;; string functions + #:convert-from-cstring + #:convert-to-cstring + #:free-cstring + #:with-cstring + #:with-cstrings + #:convert-from-foreign-string + #:convert-to-foreign-string + #:allocate-foreign-string + #:with-foreign-string + #:with-foreign-strings + #:foreign-string-length ; not implemented + #:string-to-octets + #:octets-to-string + #:foreign-encoded-octet-count + + ;; function call + #:def-function + + ;; libraries + #:find-foreign-library + #:load-foreign-library + #:default-foreign-library-type + #:foreign-library-types + + ;; os + #:getenv + #:run-shell-command + )) + +(in-package #:cffi-uffi-compat) + +#+clisp +(eval-when (:compile-toplevel :load-toplevel :execute) + (when (equal (machine-type) "POWER MACINTOSH") + (pushnew :ppc *features*))) + +(defun convert-uffi-type (uffi-type) + "Convert a UFFI primitive type to a CFFI type." + ;; Many CFFI types are the same as UFFI. This list handles the + ;; exceptions only. + (case uffi-type + (:cstring :pointer) + (:pointer-void :pointer) + (:pointer-self :pointer) + ;; Although UFFI's documentation claims dereferencing :CHAR and + ;; :UNSIGNED-CHAR returns characters, it actually returns + ;; integers. + (:char :char) + (:unsigned-char :unsigned-char) + (:byte :char) + (:unsigned-byte :unsigned-char) + (t + (if (listp uffi-type) + (case (car uffi-type) + ;; this is imho gross but it is what uffi does + (quote (convert-uffi-type (second uffi-type))) + (* :pointer) + (:array `(uffi-array ,(convert-uffi-type (second uffi-type)) + ,(third uffi-type))) + (:union (second uffi-type)) + (:struct (convert-uffi-type (second uffi-type))) + (:struct-pointer :pointer)) + uffi-type)))) + +(cffi:define-foreign-type uffi-array-type () + ;; ELEMENT-TYPE should be /unparsed/, suitable for passing to mem-aref. + ((element-type :initform (error "An element-type is required.") + :accessor element-type :initarg :element-type) + (nelems :initform (error "nelems is required.") + :accessor nelems :initarg :nelems)) + (:actual-type :pointer) + (:documentation "UFFI's :array type.")) + +(cffi:define-parse-method uffi-array (element-type count) + (make-instance 'uffi-array-type :element-type element-type + :nelems (or count 1))) + +(defmethod cffi:foreign-type-size ((type uffi-array-type)) + (* (cffi:foreign-type-size (element-type type)) (nelems type))) + +(defmethod cffi::aggregatep ((type uffi-array-type)) + t) + +;; UFFI's :(unsigned-)char +#+#:ignore +(cffi:define-foreign-type uffi-char () + ()) + +#+#:ignore +(cffi:define-parse-method uffi-char (base-type) + (make-instance 'uffi-char :actual-type base-type)) + +#+#:ignore +(defmethod cffi:translate-to-foreign ((value character) (type uffi-char)) + (char-code value)) + +#+#:ignore +(defmethod cffi:translate-from-foreign (obj (type uffi-char)) + (code-char obj)) + +(defmacro def-type (name type) + "Define a Common Lisp type NAME for UFFI type TYPE." + (declare (ignore type)) + `(deftype ,name () t)) + +(defmacro def-foreign-type (name type) + "Define a new foreign type." + `(cffi:defctype ,name ,(convert-uffi-type type))) + +(defmacro def-constant (name value &key export) + "Define a constant and conditionally export it." + `(eval-when (:compile-toplevel :load-toplevel :execute) + (defconstant ,name ,value) + ,@(when export `((export ',name))) + ',name)) + +(defmacro null-char-p (val) + "Return true if character is null." + `(zerop (char-code ,val))) + +(defmacro def-enum (enum-name args &key (separator-string "#")) + "Creates a constants for a C type enum list, symbols are +created in the created in the current package. The symbol is the +concatenation of the enum-name name, separator-string, and +field-name" + (let ((counter 0) + (cmds nil) + (constants nil)) + (declare (fixnum counter)) + (dolist (arg args) + (let ((name (if (listp arg) (car arg) arg)) + (value (if (listp arg) + (prog1 + (setq counter (cadr arg)) + (incf counter)) + (prog1 + counter + (incf counter))))) + (setq name (intern (concatenate 'string + (symbol-name enum-name) + separator-string + (symbol-name name)))) + (push `(def-constant ,name ,value) constants))) + (setf cmds (append '(progn) `((cffi:defctype ,enum-name :int)) + (nreverse constants))) + cmds)) + +(defmacro def-struct (name &body fields) + "Define a C structure." + `(cffi:defcstruct ,name + ,@(loop for (name uffi-type) in fields + for cffi-type = (convert-uffi-type uffi-type) + collect (list name cffi-type)))) + +;; TODO: figure out why the compiler macro is kicking in before +;; the setf expander. +(defun %foreign-slot-value (obj type field) + (cffi:foreign-slot-value obj `(:struct ,type) field)) + +(defun (setf %foreign-slot-value) (value obj type field) + (setf (cffi:foreign-slot-value obj `(:struct ,type) field) value)) + +(defmacro get-slot-value (obj type field) + "Access a slot value from a structure." + `(%foreign-slot-value ,obj ,type ,field)) + +;; UFFI uses a different function when accessing a slot whose +;; type is a pointer. We don't need that in CFFI so we use +;; foreign-slot-value too. +(defmacro get-slot-pointer (obj type field) + "Access a pointer slot value from a structure." + `(cffi:foreign-slot-value ,obj ,type ,field)) + +(defmacro def-array-pointer (name type) + "Define a foreign array type." + `(cffi:defctype ,name (uffi-array ,(convert-uffi-type type) 1))) + +(defmacro deref-array (array type position) + "Dereference an array." + `(cffi:mem-aref ,array + ,(if (constantp type) + `',(element-type (cffi::parse-type + (convert-uffi-type (eval type)))) + `(element-type (cffi::parse-type + (convert-uffi-type ,type)))) + ,position)) + +;; UFFI's documentation on DEF-UNION is a bit scarce, I'm not sure +;; if DEFCUNION and DEF-UNION are strictly compatible. +(defmacro def-union (name &body fields) + "Define a foreign union type." + `(cffi:defcunion ,name + ,@(loop for (name uffi-type) in fields + for cffi-type = (convert-uffi-type uffi-type) + collect (list name cffi-type)))) + +(defmacro allocate-foreign-object (type &optional (size 1)) + "Allocate one or more instance of a foreign type." + `(cffi:foreign-alloc ,(if (constantp type) + `',(convert-uffi-type (eval type)) + `(convert-uffi-type ,type)) + :count ,size)) + +(defmacro free-foreign-object (ptr) + "Free a foreign object allocated by ALLOCATE-FOREIGN-OBJECT." + `(cffi:foreign-free ,ptr)) + +(defmacro with-foreign-object ((var type) &body body) + "Wrap the allocation of a foreign object around BODY." + `(cffi:with-foreign-object (,var (convert-uffi-type ,type)) + ,@body)) + +;; Taken from UFFI's src/objects.lisp +(defmacro with-foreign-objects (bindings &rest body) + (if bindings + `(with-foreign-object ,(car bindings) + (with-foreign-objects ,(cdr bindings) + ,@body)) + `(progn ,@body))) + +(defmacro size-of-foreign-type (type) + "Return the size in bytes of a foreign type." + `(cffi:foreign-type-size (convert-uffi-type ,type))) + +(defmacro pointer-address (ptr) + "Return the address of a pointer." + `(cffi:pointer-address ,ptr)) + +(defmacro deref-pointer (ptr type) + "Dereference a pointer." + `(cffi:mem-ref ,ptr (convert-uffi-type ,type))) + +(defsetf deref-pointer (ptr type) (value) + `(setf (cffi:mem-ref ,ptr (convert-uffi-type ,type)) ,value)) + +(defmacro ensure-char-character (obj &environment env) + "Convert OBJ to a character if it is an integer." + (if (constantp obj env) + (if (characterp obj) obj (code-char obj)) + (let ((obj-var (gensym))) + `(let ((,obj-var ,obj)) + (if (characterp ,obj-var) + ,obj-var + (code-char ,obj-var)))))) + +(defmacro ensure-char-integer (obj &environment env) + "Convert OBJ to an integer if it is a character." + (if (constantp obj env) + (let ((the-obj (eval obj))) + (if (characterp the-obj) (char-code the-obj) the-obj)) + (let ((obj-var (gensym))) + `(let ((,obj-var ,obj)) + (if (characterp ,obj-var) + (char-code ,obj-var) + ,obj-var))))) + +(defmacro ensure-char-storable (obj) + "Ensure OBJ is storable as a character." + `(ensure-char-integer ,obj)) + +(defmacro make-null-pointer (type) + "Create a NULL pointer." + (declare (ignore type)) + `(cffi:null-pointer)) + +(defmacro make-pointer (address type) + "Create a pointer to ADDRESS." + (declare (ignore type)) + `(cffi:make-pointer ,address)) + +(defmacro null-pointer-p (ptr) + "Return true if PTR is a null pointer." + `(cffi:null-pointer-p ,ptr)) + +(defparameter +null-cstring-pointer+ (cffi:null-pointer) + "A constant NULL string pointer.") + +(defmacro char-array-to-pointer (obj) + obj) + +(defmacro with-cast-pointer ((var ptr type) &body body) + "Cast a pointer, does nothing in CFFI." + (declare (ignore type)) + `(let ((,var ,ptr)) + ,@body)) + +(defmacro def-foreign-var (name type module) + "Define a symbol macro to access a foreign variable." + (declare (ignore module)) + (flet ((lisp-name (name) + (intern (cffi-sys:canonicalize-symbol-name-case + (substitute #\- #\_ name))))) + `(cffi:defcvar ,(if (listp name) + name + (list name (lisp-name name))) + ,(convert-uffi-type type)))) + +(defmacro def-pointer-var (name value &optional doc) + #-openmcl `(defvar ,name ,value ,@(if doc (list doc))) + #+openmcl `(ccl::defloadvar ,name ,value ,doc)) + +(defmacro convert-from-cstring (s) + "Convert a cstring to a Lisp string." + (let ((ret (gensym))) + `(let ((,ret (cffi:foreign-string-to-lisp ,s))) + (if (equal ,ret "") + nil + ,ret)))) + +(defmacro convert-to-cstring (obj) + "Convert a Lisp string to a cstring." + (let ((str (gensym))) + `(let ((,str ,obj)) + (if (null ,str) + (cffi:null-pointer) + (cffi:foreign-string-alloc ,str))))) + +(defmacro free-cstring (ptr) + "Free a cstring." + `(cffi:foreign-string-free ,ptr)) + +(defmacro with-cstring ((foreign-string lisp-string) &body body) + "Binds a newly creating string." + (let ((str (gensym)) (body-proc (gensym))) + `(flet ((,body-proc (,foreign-string) ,@body)) + (let ((,str ,lisp-string)) + (if (null ,str) + (,body-proc (cffi:null-pointer)) + (cffi:with-foreign-string (,foreign-string ,str) + (,body-proc ,foreign-string))))))) + +;; Taken from UFFI's src/strings.lisp +(defmacro with-cstrings (bindings &rest body) + (if bindings + `(with-cstring ,(car bindings) + (with-cstrings ,(cdr bindings) + ,@body)) + `(progn ,@body))) + +(defmacro def-function (name args &key module (returning :void)) + "Define a foreign function." + (declare (ignore module)) + `(cffi:defcfun ,name ,(convert-uffi-type returning) + ,@(loop for (name type) in args + collect `(,name ,(convert-uffi-type type))))) + +;;; Taken from UFFI's src/libraries.lisp + +(defvar *loaded-libraries* nil + "List of foreign libraries loaded. Used to prevent reloading a library") + +(defun default-foreign-library-type () + "Returns string naming default library type for platform" + #+(or win32 cygwin mswindows) "dll" + #+(or macos macosx darwin ccl-5.0) "dylib" + #-(or win32 cygwin mswindows macos macosx darwin ccl-5.0) "so") + +(defun foreign-library-types () + "Returns list of string naming possible library types for platform, +sorted by preference" + #+(or win32 cygwin mswindows) '("dll" "lib" "so") + #+(or macos macosx darwin ccl-5.0) '("dylib" "bundle") + #-(or win32 cygwin mswindows macos macosx darwin ccl-5.0) '("so" "a" "o")) + +(defun find-foreign-library (names directories &key types drive-letters) + "Looks for a foreign library. directories can be a single +string or a list of strings of candidate directories. Use default +library type if type is not specified." + (unless types + (setq types (foreign-library-types))) + (unless (listp types) + (setq types (list types))) + (unless (listp names) + (setq names (list names))) + (unless (listp directories) + (setq directories (list directories))) + #+(or win32 mswindows) + (unless (listp drive-letters) + (setq drive-letters (list drive-letters))) + #-(or win32 mswindows) + (setq drive-letters '(nil)) + (dolist (drive-letter drive-letters) + (dolist (name names) + (dolist (dir directories) + (dolist (type types) + (let ((path (make-pathname + #+lispworks :host + #+lispworks (when drive-letter drive-letter) + #-lispworks :device + #-lispworks (when drive-letter drive-letter) + :name name + :type type + :directory + (etypecase dir + (pathname + (pathname-directory dir)) + (list + dir) + (string + (pathname-directory + (parse-namestring dir))))))) + (when (probe-file path) + (return-from find-foreign-library path))))))) + nil) + +(defun convert-supporting-libraries-to-string (libs) + (let (lib-load-list) + (dolist (lib libs) + (push (format nil "-l~A" lib) lib-load-list)) + (nreverse lib-load-list))) + +(defun load-foreign-library (filename &key module supporting-libraries + force-load) + #+(or allegro mcl sbcl clisp) (declare (ignore module supporting-libraries)) + #+(or cmucl scl sbcl) (declare (ignore module)) + + (when (and filename (or (null (pathname-directory filename)) + (probe-file filename))) + (if (pathnamep filename) ;; ensure filename is a string to check if + (setq filename (namestring filename))) ; already loaded + + (if (and (not force-load) + (find filename *loaded-libraries* :test #'string-equal)) + t ;; return T, but don't reload library + (progn + ;; FIXME: Hmm, what are these two for? + #+cmucl + (let ((type (pathname-type (parse-namestring filename)))) + (if (string-equal type "so") + (sys::load-object-file filename) + (alien:load-foreign filename + :libraries + (convert-supporting-libraries-to-string + supporting-libraries)))) + #+scl + (let ((type (pathname-type (parse-namestring filename)))) + (if (string-equal type "so") + (sys::load-dynamic-object filename) + (alien:load-foreign filename + :libraries + (convert-supporting-libraries-to-string + supporting-libraries)))) + + #-(or cmucl scl) + (cffi:load-foreign-library filename) + (push filename *loaded-libraries*) + t)))) + +;; Taken from UFFI's src/os.lisp +(defun getenv (var) + "Return the value of the environment variable." + #+allegro (sys::getenv (string var)) + #+clisp (sys::getenv (string var)) + #+(or cmucl scl) (cdr (assoc (string var) ext:*environment-list* :test #'equalp + :key #'string)) + #+(or ecl gcl) (si:getenv (string var)) + #+lispworks (lw:environment-variable (string var)) + #+lucid (lcl:environment-variable (string var)) + #+(or mcl ccl) (ccl::getenv var) + #+sbcl (sb-ext:posix-getenv var) + #-(or allegro clisp cmucl ecl scl gcl lispworks lucid mcl ccl sbcl) + (error 'not-implemented :proc (list 'getenv var))) + +;; Taken from UFFI's src/os.lisp +;; modified from function ASDF -- Copyright Dan Barlow and Contributors +(defun run-shell-command (control-string &rest args) + "Interpolate ARGS into CONTROL-STRING as if by FORMAT, and +synchronously execute the result using a Bourne-compatible shell, with +output to *trace-output*. Returns the shell's exit code." + (let ((command (apply #'format nil control-string args)) + (output *trace-output*)) + #+sbcl + (sb-impl::process-exit-code + (sb-ext:run-program + "/bin/sh" + (list "-c" command) + :input nil :output output)) + + #+(or cmucl scl) + (ext:process-exit-code + (ext:run-program + "/bin/sh" + (list "-c" command) + :input nil :output output)) + + #+allegro + (excl:run-shell-command command :input nil :output output) + + #+lispworks + (system:call-system-showing-output + command + :shell-type "/bin/sh" + :output-stream output) + + #+clisp ;XXX not exactly *trace-output*, I know + (ext:run-shell-command command :output :terminal :wait t) + + #+openmcl + (nth-value 1 + (ccl:external-process-status + (ccl:run-program "/bin/sh" (list "-c" command) + :input nil :output output + :wait t))) + + #+ecl + (nth-value 1 + (ext:run-program + "/bin/sh" (list "-c" command) + :input nil :output output :error nil :wait t)) + + #-(or openmcl ecl clisp lispworks allegro scl cmucl sbcl) + (error "RUN-SHELL-PROGRAM not implemented for this Lisp") + )) + +;;; Some undocumented UFFI operators... + +(defmacro convert-from-foreign-string + (obj &key length (locale :default) + (encoding 'cffi:*default-foreign-encoding*) + (null-terminated-p t)) + ;; in effect, (eq NULL-TERMINATED-P (null LENGTH)). Hopefully, + ;; that's compatible with the intended semantics, which are + ;; undocumented. If that's not the case, we can implement + ;; NULL-TERMINATED-P in CFFI:FOREIGN-STRING-TO-LISP. + (declare (ignore locale null-terminated-p)) + (let ((ret (gensym))) + `(let ((,ret (cffi:foreign-string-to-lisp ,obj + :count ,length + :encoding ,encoding))) + (if (equal ,ret "") + nil + ,ret)))) + +;; What's the difference between this and convert-to-cstring? +(defmacro convert-to-foreign-string + (obj &optional (encoding 'cffi:*default-foreign-encoding*)) + (let ((str (gensym))) + `(let ((,str ,obj)) + (if (null ,str) + (cffi:null-pointer) + (cffi:foreign-string-alloc ,str :encoding ,encoding))))) + +(defmacro allocate-foreign-string (size &key unsigned) + (declare (ignore unsigned)) + `(cffi:foreign-alloc :char :count ,size)) + +;; Ditto. +(defmacro with-foreign-string ((foreign-string lisp-string) &body body) + (let ((str (gensym))) + `(let ((,str ,lisp-string)) + (if (null ,str) + (let ((,foreign-string (cffi:null-pointer))) + ,@body) + (cffi:with-foreign-string (,foreign-string ,str) + ,@body))))) + +(defmacro with-foreign-strings (bindings &body body) + `(with-foreign-string ,(car bindings) + ,@(if (cdr bindings) + `((with-foreign-strings ,(cdr bindings) ,@body)) + body))) + +;; This function returns a form? Where is this used in user-code? +(defun foreign-string-length (foreign-string) + (declare (ignore foreign-string)) + (error "FOREIGN-STRING-LENGTH not implemented.")) + +;; This should be optimized. +(defun convert-from-foreign-usb8 (s len) + (let ((a (make-array len :element-type '(unsigned-byte 8)))) + (dotimes (i len a) + (setf (aref a i) (cffi:mem-ref s :unsigned-char i))))) + +;;;; String Encodings + +(defmacro string-to-octets (str &key encoding null-terminate) + `(babel:concatenate-strings-to-octets + (or ,encoding cffi:*default-foreign-encoding*) + ,str + (if ,null-terminate + #.(string #\Nul) + ""))) + +(defmacro octets-to-string (octets &key encoding) + `(babel:octets-to-string ,octets + :encoding (or ,encoding + cffi:*default-foreign-encoding*))) + +(defun foreign-encoded-octet-count (str &key encoding) + (babel:string-size-in-octets str + :encoding (or encoding + cffi:*default-foreign-encoding*))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/uffi-compat/uffi.asd b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/uffi-compat/uffi.asd new file mode 100644 index 0000000..4d31c50 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/cffi_0.20.1/uffi-compat/uffi.asd @@ -0,0 +1,3 @@ +;;;; uffi.asd -*- Mode: Lisp -*- + +(defsystem uffi :depends-on (cffi-uffi-compat)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/LICENSE b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/LICENSE new file mode 100644 index 0000000..dbeb15f --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/LICENSE @@ -0,0 +1,22 @@ +Copyright (c) 2012-2018,2019 Anton Vidovic + +Portions Copyright (c) 2018 Daniel Vedder +Portions Copyright (c) 2019 D4ryus + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/README b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/README new file mode 100644 index 0000000..eacd3fe --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/README @@ -0,0 +1,40 @@ +croatoan is a set of bindings to the ncurses terminal library for +Common Lisp. + +It is inspired by, but not derived from, cl-ncurses and cl-charms. + +Its main goal is to provide a higher-level, lispy/CLOSy interface, +whereas the existing bindings clone the cryptic C API. + +As of now, the library is in an early, but hopefully usable stage. +Ncurses is old and huge and it will take a while to cover completely. + +The API is not yet stable. + +It is developed and tested on Ubuntu 16.04 x86_64 and SBCL 1.5.7. + +The only supported ncurses version is 6.x --with-abi-version=6. +Version 5.9 mostly works, but I will focus new efforts on 6.x. + +Since many popular distributions ship ncurses --with-abi-version=5, +for full compatibility (wide characters, 256 colors and extended +mouse support), you will have to manually build ncurses 6.x. + +The documentation is currently provided by the commented examples. + +You are welcome to contribute and any form of help would be greatly +appreciated. + +-- + +Since ncurses is not thread-safe, all IO has to occur in the main +thread of the REPL running in a terminal. + +This makes it difficult to interact with ncurses from the Emacs SLIME +REPL which runs in its own thread. + +A workaround is to pass all ncurses IO to the main thread via a +thread-safe queue. Basic support for this has been implemented. + +A tutorial on interacting with ncurses from swank/slime is available +in docs/slime.md diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/croatoan-test.asd b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/croatoan-test.asd new file mode 100644 index 0000000..5434688 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/croatoan-test.asd @@ -0,0 +1,19 @@ +(asdf:defsystem :croatoan-test + :description "Tests and examples for the croatoan CLOS API and the low-level ncurses CFFI bindings." + :author "Anton Vidovic " + :licence "MIT" + :version "0.0.1" + :depends-on (:croatoan) + :components + ((:module "test" + :serial t + :components ((:file "package") + + ;; base %ncurses tests + (:file "ncurses") + (:file "unicode") + + ;; high-level clos api + (:file "clos") + (:file "tetris") + (:file "evolution"))))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/croatoan.asd b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/croatoan.asd new file mode 100644 index 0000000..090f0ef --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/croatoan.asd @@ -0,0 +1,116 @@ +(asdf:defsystem :croatoan + :description "Common Lisp bindings for the ncurses terminal library." + :author "Anton Vidovic " + :licence "MIT" + :version "0.0.1" + :depends-on (:cffi :trivial-gray-streams :bordeaux-threads) + :components + + ;; Basic CFFI wrapper for libncursesw and libncurses + ((:module "ncurses" + :components + ((:file "package") + (:file "ncurses") + + ;; complete + (:file "addch") ; add a character (with attributes) to a curses window, then advance the cursor + (:file "add_wch") ; add a complex character and rendition to a curses window, then advance the cursor + (:file "addstr") ; add a string of characters to a curses window and advance cursor + (:file "attr") ; curses character and window attribute control routines + (:file "beep") ; curses bell and screen flash routines + (:file "bkgd") ; curses window background manipulation routines + (:file "bkgrnd") ; window complex background manipulation routines + (:file "border") ; create curses borders, horizontal and vertical lines + (:file "border_set") ; create curses borders or lines using complex characters and renditions + (:file "clear") ; clear all or part of a curses window + (:file "color") ; curses color manipulation routines + (:file "default_colors") ; use terminal's default colors + (:file "define_key") ; define a keycode + (:file "delch") ; delete character under the cursor in a curses window + (:file "deleteln") ; delete and insert lines in a curses window + (:file "extend") ; curses window properties + (:file "getch") ; get (or push back) characters from curses terminal keyboard + (:file "get_wch") ; get (or push back) a wide (multi-byte) character from curses terminal keyboard + (:file "getcchar") ; Get a wide character string and rendition from a cchar_t or set a cchar_t from a wide-character string + (:file "getstr") ; accept character strings from curses terminal keyboard + (:file "getyx") ; get curses cursor and window coordinates + (:file "inch") ; get a character and attributes from a curses window + (:file "in_wch") ; extract a wide (multi-byte) character and rendition from a window + (:file "insch") ; insert a character before cursor in a curses window + (:file "ins_wch") ; insert a complex character and rendition into a window + (:file "instr") ; get a string of characters from a curses window + (:file "inwstr") ; extract a string of wchar_t characters from a curses window + (:file "inchstr") ; get a string of characters (and attributes) from a curses window + (:file "insstr") ; insert string before cursor in a curses window + (:file "initscr") ; screen initialization and manipulation routines + (:file "inopts") ; curses input options + (:file "kernel") ; low-level curses routines + (:file "keybound") ; return definition of keycode + (:file "key_defined") ; check if a keycode is defined + (:file "legacy") ; get curses cursor and window coordinates, attributes + (:file "legacy_coding") ; legacy coding + (:file "mouse") ; mouse interface through curses + (:file "move") ; move curses window cursor + (:file "opaque") ; curses window properties + (:file "outopts") ; curses output options + (:file "pad") ; create and display curses pads + (:file "refresh") ; refresh curses windows and lines + (:file "resizeterm") ; change the curses terminal size + (:file "scroll") ; scroll a curses window + (:file "slk") ; curses soft label routines + (:file "termattrs") ; environment query routines + (:file "touch") ; curses refresh control routines + (:file "util") ; miscellaneous curses utility routines + (:file "variables") ; curses global variables + (:file "window") ; create curses windows + (:file "wresize"))) ; resize a curses window + + ;; CLOS api on top of CFFI ncurses. + (:module "src" + :depends-on ("ncurses") + :components + ((:file "package") + (:file "classes") + (:file "queue") + (:file "croatoan") + (:file "gray_streams") + (:file "utf8") + + (:file "addch") + (:file "add_wch") + (:file "addstr") + (:file "attr") + (:file "beep") + (:file "bkgd") + (:file "bkgrnd") ; window complex background manipulation routines + (:file "border") + (:file "border_set") ; create curses borders or lines using complex characters and renditions + (:file "clear") + (:file "color") + (:file "delch") + (:file "deleteln") + (:file "getch") + (:file "get_wch") + (:file "getstr") + (:file "initscr") + (:file "inopts") + (:file "inch") + (:file "in_wch") + (:file "inwstr") ; get a string of wide (multi-byte) characters from a curses window + (:file "inchstr") + (:file "insch") + (:file "ins_wch") ; insert a complex character and rendition into a window + (:file "insstr") + (:file "instr") + (:file "kernel") + (:file "mouse") + (:file "move") + (:file "panel") + (:file "refresh") + (:file "touch") + (:file "wresize") + + ;; Extension libraries + (:file "form") ; curses extension for programming forms + (:file "menu") ; curses extension for programming menus + (:file "shape"))))) ; curses extension for plotting shapes diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/doc/slime.md b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/doc/slime.md new file mode 100644 index 0000000..3e66d7e --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/doc/slime.md @@ -0,0 +1,137 @@ +# Working with swank/slime + +Since ncurses is single threaded, it is only ever allowed to call +ncurses functions from the thread that initialized the screen. As this +thread must be the one controlling the terminal, ncurses must only +be called from the REPL prompt directly. With a recent enough croatoan +version, slime/swank does work though, but it requires a bit of extra +work. The following is an example of how one would work with croatoan +using slime/swank. First, a bit of boiler plate: + +``` +;; load croatoan and swank +(eval-when (:compile-toplevel :execute :load-toplevel) + (ql:quickload '(:croatoan :swank))) + +;; Defining a package is always a good idea +(defpackage #:scratch + (:use #:cl) + (:export #:main)) + +(in-package #:scratch) + +;; The main screen, we need a global so that we can access it from +;; slime +(defparameter *scr* nil) + +;; Main entry point, to be called from the terminal thread, it will +;; initialize the screen and enter the event loop +(defun main () + (croatoan:with-screen (scr + ;; Set input blocking to 100 ms. This _must_ + ;; be set for swank to work, otherwise + ;; get-event will block and croatoan only + ;; polls the job queue when a key is pressed. + :input-blocking 100 + ;; Do not override the swank debugger hook, + ;; as we want to enter the slime debugger in + ;; emacs when a error occurs. + :bind-debugger-hook nil) + ;; Set *scr* to the initilized scr so that we can access it form + ;; the swank thread and then enter the event-loop. + (croatoan:run-event-loop (setf *scr* scr)))) + +;; Initialize swank, setting dont-close will prevent the server from +;; shutting down in case slime disconnects. The default port is 4005, +;; one can specify a different one with :port. +(swank:create-server :dont-close t) + +;; Initialize screen and enter the event loop +(main) +``` + +This should be saved in a file and then loaded directly from sbcl (or +any other CL Implementation known to work with croatoan). For sbcl +this would be (when saved to `scratch.lisp`): + +``` +sbcl --load scratch.lisp +``` + +The user should now see a blank terminal window with the cursor placed +at the top left corner. Time to connect to it from slime, form within +emacs run: + +``` +M-x slime-connect +``` + +Once started, we need to change into the right package, do this by +entering (inside the SLIME repl): + +``` +CL-USER> (in-package :scratch) +``` + +To now run something inside the terminal thread one must use +`CROATOAN:SUBMIT`: + +``` +SCRATCH> (croatoan:submit (croatoan:add-string *scr* "Hey!")) +``` + +And voila, thats the basics of working with croatoan from slime! +The next thing one might want to do is set some keybindings, for +example, bind `c` to clear the screen: + +``` +SCRATCH> (croatoan:submit + (croatoan:bind *scr* #\c (lambda (win event) + (croatoan:clear *scr*)))) +``` + +And `q` to quit the event loop: + +``` +SCRATCH> (croatoan:submit + (croatoan:bind *scr* #\q 'croatoan:exit-event-loop)) +``` + +There is one caveat though, `*STANDARD-OUTPUT*` differs between the +swank and the terminal thread. It is set to the swank output stream +(which prints everything to the slime repl) inside the swank thread, +and bound to the terminal stdin/stdout inside the terminal +thread. Hence doing the following, would mess up the terminal screen +instead of printing to the slime repl: + +``` +SCRATCH> (croatoan:submit (format t "Hellou!~%")) +``` + +What we need is a way to refer to the swank stream, which can be easily +achieved by setting another global to whatever stream +`*STANDARD-OUTPUT*` points to inside the slime repl: + +``` +SCRATCH> (defparameter *swank-output* *standard-output*) +``` + +If we now run: + +``` +SCRATCH> (croatoan:submit (format *swank-output* "Hellou!~%")) +``` + +We should see `Hellou!` printed in the slime repl. + +This is quite helpful, especially when debugging something within the +terminal thread: + +``` +SCRATCH> (croatoan:submit + (croatoan:bind *scr* :resize + (lambda (win event) + (format *swank-output* "Terminal resized to width: ~a, height: ~a~%" + (croatoan:width win) + (croatoan:height win))))) +``` diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/add_wch.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/add_wch.lisp new file mode 100644 index 0000000..746861e --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/add_wch.lisp @@ -0,0 +1,24 @@ +(in-package :de.anvi.ncurses) + +;;; add_wch +;;; add a complex character and rendition to a curses window, then advance the cursor +;;; http://invisible-island.net/ncurses/man/curs_add_wch.3x.html + +;;; C prototypes + +;;; int add_wch(const cchar_t *wch); +;;; int wadd_wch(WINDOW *win, const cchar_t *wch); +;;; int mvadd_wch(int y, int x, const cchar_t *wch); +;;; int mvwadd_wch( WINDOW *win, int y, int x, const cchar_t *wch); +;;; int echo_wchar(const cchar_t *wch); +;;; int wecho_wchar(WINDOW *win, const cchar_t *wch); + +;;; Low-level CFFI wrappers + +(defcfun ("add_wch" %add-wch) :int (wch (:pointer (:struct cchar_t)))) +(defcfun ("wadd_wch" %wadd-wch) :int (win window) (wch (:pointer (:struct cchar_t)))) +(defcfun ("mvadd_wch" %mvadd-wch) :int (y :int) (x :int) (wch (:pointer (:struct cchar_t)))) +(defcfun ("mvwadd_wch" %mvwadd-wch) :int (win window) (y :int) (x :int) (wch (:pointer (:struct cchar_t)))) + +(defcfun ("echo_wchar" %echo-wchar) :int (wch (:pointer (:struct cchar_t)))) +(defcfun ("wecho_wchar" %wecho-wchar) :int (win window) (wch (:pointer (:struct cchar_t)))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/addch.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/addch.lisp new file mode 100644 index 0000000..c265a4f --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/addch.lisp @@ -0,0 +1,25 @@ +(in-package :de.anvi.ncurses) + +;;; addch +;;; add a character (with attributes) to a curses window, then advance the cursor +;;; http://invisible-island.net/ncurses/man/curs_addch.3x.html + +;;; C prototypes + +;; int addch(const chtype ch); +;; int waddch(WINDOW *win, const chtype ch); +;; int mvaddch(int y, int x, const chtype ch); +;; int mvwaddch(WINDOW *win, int y, int x, const chtype ch); +;; int echochar(const chtype ch); +;; int wechochar(WINDOW *win, const chtype ch); + +;;; Low-level CFFI wrappers + +(defcfun ("addch" %addch) :int (ch chtype)) +(defcfun ("waddch" %waddch) :int (win window) (ch chtype)) + +(defcfun ("mvaddch" %mvaddch) :int (y :int) (x :int) (ch chtype)) +(defcfun ("mvwaddch" %mvwaddch) :int (win window) (y :int) (x :int) (ch chtype)) + +(defcfun ("echochar" %echochar) :int (ch chtype)) +(defcfun ("wechochar" %wechochar) :int (win window) (ch chtype)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/addstr.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/addstr.lisp new file mode 100644 index 0000000..55036ba --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/addstr.lisp @@ -0,0 +1,31 @@ +(in-package :de.anvi.ncurses) + +;;; addstr +;;; add a string of characters to a curses window and advance cursor +;;; http://invisible-island.net/ncurses/man/curs_addstr.3x.html +;;; http://www.manpagez.com/man/3/curs_addstr/ + +;;; C prototypes + +;; int addstr(const char *str); +;; int addnstr(const char *str, int n); +;; int waddstr(WINDOW *win, const char *str); +;; int waddnstr(WINDOW *win, const char *str, int n); +;; int mvaddstr(int y, int x, const char *str); +;; int mvaddnstr(int y, int x, const char *str, int n); +;; int mvwaddstr(WINDOW *win, int y, int x, const char *str); +;; int mvwaddnstr(WINDOW *win, int y, int x, const char *str, int n); + +;;; Low-level CFFI wrappers + +(defcfun ("addstr" %addstr) :int (str :string)) +(defcfun ("addnstr" %addnstr) :int (str :string) (n :int)) + +(defcfun ("waddstr" %waddstr) :int (win window) (str :string)) +(defcfun ("waddnstr" %waddnstr) :int (win window) (str :string) (n :int)) + +(defcfun ("mvaddstr" %mvaddstr) :int (y :int) (x :int) (str :string)) +(defcfun ("mvaddnstr" %mvaddnstr) :int (y :int) (x :int) (str :string) (n :int)) + +(defcfun ("mvwaddstr" %mvwaddstr) :int (win window) (y :int) (x :int) (str :string)) +(defcfun ("mvwaddnstr" %mvwaddnstr) :int (win window) (y :int) (x :int) (str :string) (n :int)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/attr.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/attr.lisp new file mode 100644 index 0000000..d1504ac --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/attr.lisp @@ -0,0 +1,72 @@ +(in-package :de.anvi.ncurses) + +;;; attr +;;; curses character and window attribute control routines +;;; http://invisible-island.net/ncurses/man/curs_attr.3x.html +;;; http://publib.boulder.ibm.com/infocenter/pseries/v5r3/topic/com.ibm.aix.genprogc/doc/genprogc/manip_video_attrs.htm + +;;; C prototypes + +;; int attroff(int attrs); +;; int wattroff(WINDOW *win, int attrs); +;; int attron(int attrs); +;; int wattron(WINDOW *win, int attrs); +;; int attrset(int attrs); +;; int wattrset(WINDOW *win, int attrs); + +;; int color_set(short color_pair_number, void* opts); +;; int wcolor_set(WINDOW *win, short color_pair_number, void* opts); + +;; int standend(void); +;; int wstandend(WINDOW *win); +;; int standout(void); +;; int wstandout(WINDOW *win); + +;; int attr_get(attr_t *attrs, short *pair, void *opts); +;; int wattr_get(WINDOW *win, attr_t *attrs, short *pair, void *opts); + +;; int attr_off(attr_t attrs, void *opts); +;; int wattr_off(WINDOW *win, attr_t attrs, void *opts); +;; int attr_on(attr_t attrs, void *opts); +;; int wattr_on(WINDOW *win, attr_t attrs, void *opts); + +;; int attr_set(attr_t attrs, short pair, void *opts); +;; int wattr_set(WINDOW *win, attr_t attrs, short pair, void *opts); + +;; int chgat(int n, attr_t attr, short color, const void *opts) +;; int wchgat(WINDOW *win, int n, attr_t attr, short color, const void *opts) +;; int mvchgat(int y, int x, int n, attr_t attr, short color, const void *opts) +;; int mvwchgat(WINDOW *win, int y, int x, int n, attr_t attr, short color, const void *opts) + +;;; Low-level CFFI wrappers + +;; :unsigned-int should be the same size as :uint32, 4 bytes, the size of a chtype. +(defcfun ("attroff" %attroff) :int (attrs :unsigned-int)) +(defcfun ("wattroff" %wattroff) :int (win window) (attrs :unsigned-int)) +(defcfun ("attron" %attron) :int (attrs :unsigned-int)) +(defcfun ("wattron" %wattron) :int (win window) (attrs :unsigned-int)) +(defcfun ("attrset" %attrset) :int (attrs :unsigned-int)) +(defcfun ("wattrset" %wattrset) :int (win window) (attrs :unsigned-int)) + +(defcfun ("color_set" %color-set) :int (color-pair-number :short) (opts (:pointer :void))) +(defcfun ("wcolor_set" %wcolor-set) :int (win window) (color-pair-number :short) (opts (:pointer :void))) + +(defcfun ("standend" %standend) :int) +(defcfun ("wstandend" %wstandend) :int (win window)) +(defcfun ("standout" %standout) :int) +(defcfun ("wstandout" %wstandout) :int (win window)) + +(defcfun ("attr_get" %attr-get) :int (attrs (:pointer attr)) (pair (:pointer :short)) (opts (:pointer :void))) +(defcfun ("wattr_get" %wattr-get) :int (win window) (attrs (:pointer attr)) (pair (:pointer :short)) (opts (:pointer :void))) + +(defcfun ("attr_off" %attr-off) :int (attrs attr) (opts (:pointer :void))) +(defcfun ("wattr_off" %wattr-off) :int (win window) (attrs attr) (opts (:pointer :void))) +(defcfun ("attr_on" %attr-on) :int (attrs attr) (opts (:pointer :void))) +(defcfun ("wattr_on" %wattr-on) :int (win window) (attrs attr) (opts (:pointer :void))) +(defcfun ("attr_set" %attr-set) :int (attrs attr) (pair :short) (opts (:pointer :void))) +(defcfun ("wattr_set" %wattr-set) :int (win window) (attrs attr) (pair :short) (opts (:pointer :void))) + +(defcfun ("chgat" %chgat) :int (n :int) (attr attr) (color :short) (opts (:pointer :void))) +(defcfun ("wchgat" %wchgat) :int (win window) (n :int) (attr attr) (color :short) (opts (:pointer :void))) +(defcfun ("mvchgat" %mvchgat) :int (y :int) (x :int) (n :int) (attr attr) (color :short) (opts (:pointer :void))) +(defcfun ("mvwchgat" %mvwchgat) :int (win window) (y :int) (x :int) (n :int) (attr attr) (color :short) (opts (:pointer :void))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/beep.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/beep.lisp new file mode 100644 index 0000000..96951cd --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/beep.lisp @@ -0,0 +1,15 @@ +(in-package :de.anvi.ncurses) + +;;; beep +;;; curses bell and screen flash routines +;;; http://invisible-island.net/ncurses/man/curs_beep.3x.html + +;;; C prototypes + +;; int beep(void); +;; int flash(void); + +;;; Low-level CFFI wrappers + +(defcfun ("beep" %beep) :int) +(defcfun ("flash" %flash) :int) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/bkgd.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/bkgd.lisp new file mode 100644 index 0000000..81c359a --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/bkgd.lisp @@ -0,0 +1,21 @@ +(in-package :de.anvi.ncurses) + +;;; bkgd +;;; curses window background manipulation routines +;;; http://invisible-island.net/ncurses/man/curs_bkgd.3x.html + +;;; C prototypes + +;; void bkgdset(chtype ch); +;; void wbkgdset(WINDOW *win, chtype ch); +;; int bkgd(chtype ch); +;; int wbkgd(WINDOW *win, chtype ch); +;; chtype getbkgd(WINDOW *win); + +;;; Low-level CFFI wrappers + +(defcfun ("bkgdset" %bkgdset) :void (ch chtype)) +(defcfun ("wbkgdset" %wbkgdset) :void (win window) (ch chtype)) +(defcfun ("bkgd" %bkgd) :int (ch chtype)) +(defcfun ("wbkgd" %wbkgd) :int (win window) (ch chtype)) +(defcfun ("getbkgd" %getbkgd) chtype (win window)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/bkgrnd.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/bkgrnd.lisp new file mode 100644 index 0000000..66cd926 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/bkgrnd.lisp @@ -0,0 +1,23 @@ +(in-package :de.anvi.ncurses) + +;;; bkgrnd +;;; window complex background manipulation routines +;;; http://invisible-island.net/ncurses/man/curs_bkgrnd.3x.html + +;;; C prototypes + +;; int bkgrnd( const cchar_t *wch); +;; int wbkgrnd( WINDOW *win, const cchar_t *wch); +;; void bkgrndset(const cchar_t *wch ); +;; void wbkgrndset(WINDOW *win, const cchar_t *wch); +;; int getbkgrnd(cchar_t *wch); +;; int wgetbkgrnd(WINDOW *win, cchar_t *wch); + +;;; Low-level CFFI wrappers + +(defcfun ("bkgrnd" %bkgrnd) :int (wch (:pointer (:struct cchar_t)))) +(defcfun ("wbkgrnd" %wbkgrnd) :int (win window) (wch (:pointer (:struct cchar_t)))) +(defcfun ("bkgrndset" %bkgrndset) :void (wch (:pointer (:struct cchar_t)))) +(defcfun ("wbkgrndset" %wbkgrndset) :void (win window) (wch (:pointer (:struct cchar_t)))) +(defcfun ("getbkgrnd" %getbkgrnd) :int (wch (:pointer (:struct cchar_t)))) +(defcfun ("wgetbkgrnd" %wgetbkgrnd) :int (win window) (wch (:pointer (:struct cchar_t)))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/border.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/border.lisp new file mode 100644 index 0000000..fb76fd8 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/border.lisp @@ -0,0 +1,57 @@ +(in-package :de.anvi.ncurses) + +;;; border +;;; create curses borders, horizontal and vertical lines +;;; http://invisible-island.net/ncurses/man/curs_border.3x.html +;;; http://linux.die.net/man/3/box + +;;; C prototypes + +;; int border(chtype ls, chtype rs, chtype ts, chtype bs, chtype tl, chtype tr, chtype bl, chtype br); +;; int wborder(WINDOW *win, chtype ls, chtype rs, chtype ts, chtype bs, chtype tl, chtype tr, chtype bl, chtype br); +;; int box(WINDOW *win, chtype verch, chtype horch); + +;; int hline(chtype ch, int n); +;; int whline(WINDOW *win, chtype ch, int n); +;; int vline(chtype ch, int n); +;; int wvline(WINDOW *win, chtype ch, int n); + +;; int mvhline(int y, int x, chtype ch, int n); +;; int mvwhline(WINDOW *, int y, int x, chtype ch, int n); +;; int mvvline(int y, int x, chtype ch, int n); +;; int mvwvline(WINDOW *, int y, int x, chtype ch, int n); + +;;; Low-level CFFI wrappers + +(defcfun ("border" %border) :int + (ls chtype) + (rs chtype) + (ts chtype) + (bs chtype) + (tl chtype) + (tr chtype) + (bl chtype) + (br chtype)) + +(defcfun ("wborder" %wborder) :int + (win window) + (ls chtype) + (rs chtype) + (ts chtype) + (bs chtype) + (tl chtype) + (tr chtype) + (bl chtype) + (br chtype)) + +(defcfun ("box" %box) :int (win window) (verch chtype) (horch chtype)) + +(defcfun ("hline" %hline) :int (ch chtype) (n :int)) +(defcfun ("whline" %whline) :int (win window) (ch chtype) (n :int)) +(defcfun ("vline" %vline) :int (ch chtype) (n :int)) +(defcfun ("wvline" %wvline) :int (win window) (ch chtype) (n :int)) + +(defcfun ("mvhline" %mvhline) :int (y :int) (x :int) (ch chtype) (n :int)) +(defcfun ("mvwhline" %mvwhline) :int (win window) (y :int) (x :int) (ch chtype) (n :int)) +(defcfun ("mvvline" %mvvline) :int (y :int) (x :int) (ch chtype) (n :int)) +(defcfun ("mvwvline" %mvwvline) :int (win window) (y :int) (x :int) (ch chtype) (n :int)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/border_set.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/border_set.lisp new file mode 100644 index 0000000..eac057b --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/border_set.lisp @@ -0,0 +1,60 @@ +(in-package :de.anvi.ncurses) + +;;; border_set +;;; create curses borders or lines using complex characters and renditions +;;; http://invisible-island.net/ncurses/man/curs_border_set.3x.html + +;;; C prototypes + +;; int border_set(const cchar_t *ls, const cchar_t *rs, const cchar_t *ts, const cchar_t *bs, const cchar_t *tl, const cchar_t *tr, const cchar_t *bl, const cchar_t *br); +;; int wborder_set(WINDOW *win, const cchar_t *ls, const cchar_t *rs, const cchar_t *ts, const cchar_t *bs, const cchar_t *tl, const cchar_t *tr, const cchar_t *bl, const cchar_t *br); + +;; int box_set(WINDOW *win, const cchar_t *verch, const cchar_t *horch); + +;; int hline_set(const cchar_t *wch, int n); +;; int whline_set(WINDOW *win, const cchar_t *wch, int n); +;; int mvhline_set(int y, int x, const cchar_t *wch, int n); +;; int mvwhline_set(WINDOW *win, int y, int x, const cchar_t *wch, int n); + +;; int vline_set(const cchar_t *wch, int n); +;; int wvline_set(WINDOW *win, const cchar_t *wch, int n); +;; int mvvline_set(int y, int x, const cchar_t *wch, int n); +;; int mvwvline_set(WINDOW *win, int y, int x, const cchar_t *wch, int n); + +;;; Low-level CFFI wrappers + +(defcfun ("border_set" %border-set) :int + (ls (:pointer (:struct cchar_t))) + (rs (:pointer (:struct cchar_t))) + (ts (:pointer (:struct cchar_t))) + (bs (:pointer (:struct cchar_t))) + (tl (:pointer (:struct cchar_t))) + (tr (:pointer (:struct cchar_t))) + (bl (:pointer (:struct cchar_t))) + (br (:pointer (:struct cchar_t)))) + +(defcfun ("wborder_set" %wborder-set) :int + (win window) + (ls (:pointer (:struct cchar_t))) + (rs (:pointer (:struct cchar_t))) + (ts (:pointer (:struct cchar_t))) + (bs (:pointer (:struct cchar_t))) + (tl (:pointer (:struct cchar_t))) + (tr (:pointer (:struct cchar_t))) + (bl (:pointer (:struct cchar_t))) + (br (:pointer (:struct cchar_t)))) + +(defcfun ("box_set" %box-set) :int + (win window) + (verch (:pointer (:struct cchar_t))) + (horch (:pointer (:struct cchar_t)))) + +(defcfun ("hline_set" %hline-set) :int (wch (:pointer (:struct cchar_t))) (n :int)) +(defcfun ("whline_set" %whline-set) :int (win window) (wch (:pointer (:struct cchar_t))) (n :int)) +(defcfun ("mvhline_set" %mvhline-set) :int (y :int) (x :int) (wch (:pointer (:struct cchar_t))) (n :int)) +(defcfun ("mvwhline_set" %mvwhline-set) :int (win window) (y :int) (x :int) (wch (:pointer (:struct cchar_t))) (n :int)) + +(defcfun ("vline_set" %vline-set) :int (wch (:pointer (:struct cchar_t))) (n :int)) +(defcfun ("wvline_set" %wvline-set) :int (win window) (wch (:pointer (:struct cchar_t))) (n :int)) +(defcfun ("mvvline_set" %mvvline-set) :int (y :int) (x :int) (wch (:pointer (:struct cchar_t))) (n :int)) +(defcfun ("mvwvline_set" %mvwvline-set) :int (win window) (y :int) (x :int) (wch (:pointer (:struct cchar_t))) (n :int)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/clear.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/clear.lisp new file mode 100644 index 0000000..db9fc00 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/clear.lisp @@ -0,0 +1,29 @@ +(in-package :de.anvi.ncurses) + +;;; clear +;;; clear all or part of a curses window +;;; http://invisible-island.net/ncurses/man/curs_clear.3x.html +;;; http://linux.die.net/man/3/erase + +;;; C prototypes + +;; int erase(void); +;; int werase(WINDOW *win); +;; int clear(void); +;; int wclear(WINDOW *win); +;; int clrtobot(void); +;; int wclrtobot(WINDOW *win); +;; int clrtoeol(void); +;; int wclrtoeol(WINDOW *win); + +;;; Low-level CFFI wrappers + +(defcfun ("erase" %erase) :int) +(defcfun ("werase" %werase) :int (win window)) +(defcfun ("clear" %clear) :int) +(defcfun ("wclear" %wclear) :int (win window)) + +(defcfun ("clrtobot" %clrtobot) :int) +(defcfun ("wclrtobot" %wclrtobot) :int (win window)) +(defcfun ("clrtoeol" %clrtoeol) :int) +(defcfun ("wclrtoeol" %wclrtoeol) :int (win window)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/color.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/color.lisp new file mode 100644 index 0000000..35a2630 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/color.lisp @@ -0,0 +1,56 @@ +(in-package :de.anvi.ncurses) + +;;; color +;;; curses color manipulation routines +;;; http://invisible-island.net/ncurses/man/curs_color.3x.html +;;; http://linux.die.net/man/3/init_color + +;;; C prototypes + +;; int start_color(void); + +;; bool has_colors(void); +;; bool can_change_color(void); + +;; int init_pair(short pair, short f, short b); +;; int init_color(short color, short r, short g, short b); +;; int pair_content(short pair, short *f, short *b); +;; int color_content(short color, short *r, short *g, short *b); + +;; int init_extended_pair(int pair, int f, int b); +;; int init_extended_color(int color, int r, int g, int b); +;; int extended_pair_content(int pair, int *f, int *b); +;; int extended_color_content(int color, int *r, int *g, int *b); + +;;; C macros + +;; COLOR_PAIR(int n) +;; PAIR_NUMBER(attrs); + +;;; Low-level CFFI wrappers + +(defcfun ("start_color" %start-color) :int) +(defcfun ("has_colors" %has-colors) :boolean) +(defcfun ("can_change_color" %can-change-color) :boolean) + +(defcfun ("init_pair" %init-pair) :int (pair :short) (f :short) (b :short)) +(defcfun ("init_color" %init-color) :int (color :short) (r :short) (g :short) (b :short)) +(defcfun ("pair_content" %pair-content) :int (pair :short) (f (:pointer :short)) (b (:pointer :short))) +(defcfun ("color_content" %color-content) :int (color :short) (r (:pointer :short)) (g (:pointer :short)) (b (:pointer :short))) + +(defcfun ("init_extended_pair" %init-extended-pair) :int (pair :int) (f :int) (b :int)) +(defcfun ("init_extended_color" %init-extended-color) :int (color :int) (r :int) (g :int) (b :int)) +(defcfun ("extended_pair_content" %pair-extended-content) :int (pair :int) (f (:pointer :int)) (b (:pointer :int))) +(defcfun ("extended_color_content" %color-extended-content) :int (color :int) (r (:pointer :int)) (g (:pointer :int)) (b (:pointer :int))) + +(defcfun ("COLOR_PAIR" %color-pair) :int (n :int)) +(defcfun ("PAIR_NUMBER" %pair-number) :int (attrs :int)) + +(defconstant %COLOR-BLACK 0) +(defconstant %COLOR-RED 1) +(defconstant %COLOR-GREEN 2) +(defconstant %COLOR-YELLOW 3) +(defconstant %COLOR-BLUE 4) +(defconstant %COLOR-MAGENTA 5) +(defconstant %COLOR-CYAN 6) +(defconstant %COLOR-WHITE 7) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/default_colors.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/default_colors.lisp new file mode 100644 index 0000000..2ff96f1 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/default_colors.lisp @@ -0,0 +1,15 @@ +(in-package :de.anvi.ncurses) + +;; default_colors +;; use terminal's default colors +;; http://invisible-island.net/ncurses/man/default_colors.3x.html + +;;; C prototypes + +;; int use_default_colors(void); +;; int assume_default_colors(int fg, int bg); + +;;; Low-level CFFI wrappers + +(defcfun ("use_default_colors" %use-default-colors) :int) +(defcfun ("assume_default_colors" %assume-default-colors) :int (fg :int) (bg :int)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/define_key.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/define_key.lisp new file mode 100644 index 0000000..c09e495 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/define_key.lisp @@ -0,0 +1,13 @@ +(in-package :de.anvi.ncurses) + +;; define_key +;; define a keycode +;; http://invisible-island.net/ncurses/man/define_key.3x.html + +;;; C prototypes + +;; int define_key(const char *definition, int keycode); + +;;; Low-level CFFI wrappers + +(defcfun ("define_key" %define-key) :int (definition :string) (keycode :int)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/delch.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/delch.lisp new file mode 100644 index 0000000..399c535 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/delch.lisp @@ -0,0 +1,19 @@ +(in-package :de.anvi.ncurses) + +;;; delch +;;; delete character under the cursor in a curses window +;;; http://invisible-island.net/ncurses/man/curs_delch.3x.html + +;;; C prototypes + +;; int delch(void); +;; int wdelch(WINDOW *win); +;; int mvdelch(int y, int x); +;; int mvwdelch(WINDOW *win, int y, int x); + +;;; Low-level CFFI wrappers + +(defcfun ("delch" %delch) :int) +(defcfun ("wdelch" %wdelch) :int (win window)) +(defcfun ("mvdelch" %mvdelch) :int (y :int) (x :int)) +(defcfun ("mvwdelch" %mvwdelch) :int (win window) (y :int) (x :int)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/deleteln.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/deleteln.lisp new file mode 100644 index 0000000..a54903d --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/deleteln.lisp @@ -0,0 +1,23 @@ +(in-package :de.anvi.ncurses) + +;;; deleteln +;;; delete and insert lines in a curses window +;;; http://invisible-island.net/ncurses/man/curs_deleteln.3x.html + +;;; C prototypes + +;; int deleteln(void); +;; int wdeleteln(WINDOW *win); +;; int insdelln(int n); +;; int winsdelln(WINDOW *win, int n); +;; int insertln(void); +;; int winsertln(WINDOW *win); + +;;; Low-level CFFI wrappers + +(defcfun ("deleteln" %deleteln) :int) +(defcfun ("wdeleteln" %wdeleteln) :int (win window)) +(defcfun ("insdelln" %insdelln) :int (n :int)) +(defcfun ("winsdelln" %winsdelln) :int (win window) (n :int)) +(defcfun ("insertln" %insertln) :int) +(defcfun ("winsertln" %winsertln) :int (win window)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/extend.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/extend.lisp new file mode 100644 index 0000000..f98a599 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/extend.lisp @@ -0,0 +1,15 @@ +(in-package :de.anvi.ncurses) + +;;; extend +;;; miscellaneous curses extensions +;;; http://invisible-island.net/ncurses/man/curs_extend.3x.html + +;;; C prototypes + +;; const char * curses_version(void); +;; int use_extended_names(bool enable); + +;;; Low-level CFFI wrappers + +(defcfun ("curses_version" %curses-version) :string) +(defcfun ("use_extended_names" %use-extended-names) :int (enable :boolean)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/get_wch.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/get_wch.lisp new file mode 100644 index 0000000..e2b4432 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/get_wch.lisp @@ -0,0 +1,21 @@ +(in-package :de.anvi.ncurses) + +;;; get_wch +;;; get (or push back) a wide (multi-byte) character from curses terminal keyboard +;;; http://invisible-island.net/ncurses/man/curs_get_wch.3x.html + +;;; C prototypes + +;; int get_wch(wint_t *wch); +;; int wget_wch(WINDOW *win, wint_t *wch); +;; int mvget_wch(int y, int x, wint_t *wch); +;; int mvwget_wch(WINDOW *win, int y, int x, wint_t *wch); +;; int unget_wch(const wchar_t wch); + +;;; Low-level CFFI wrappers + +(defcfun ("get_wch" %get-wch) :int (wch (:pointer wint_t))) +(defcfun ("wget_wch" %wget-wch) :int (win window) (wch (:pointer wint_t))) +(defcfun ("mvget_wch" %mvget-wch) :int (y :int) (x :int) (wch (:pointer wint_t))) +(defcfun ("mvwget_wch" %mvwget-wch) :int (win window) (y :int) (x :int) (wch (:pointer wint_t))) +(defcfun ("unget_wch" %unget-wch) :int (wch wchar_t)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/getcchar.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/getcchar.lisp new file mode 100644 index 0000000..dd637e3 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/getcchar.lisp @@ -0,0 +1,26 @@ +(in-package :de.anvi.ncurses) + +;;; getcchar +;;; Get a wide character string and rendition from a cchar_t or set a cchar_t from a wide-character string +;;; http://invisible-island.net/ncurses/man/curs_getcchar.3x.html + +;;; C prototypes + +;; int getcchar(const cchar_t *wcval, wchar_t *wch, attr_t *attrs, short *color_pair, void *opts); +;; int setcchar(cchar_t *wcval, const wchar_t *wch, const attr_t attrs, short color_pair, void *opts); + +;;; Low-level CFFI wrappers + +(defcfun ("getcchar" %getcchar) :int + (wcval (:pointer (:struct cchar_t))) + (wch (:pointer wchar_t)) + (attrs (:pointer attr)) + (color_pair (:pointer :short)) + (opts (:pointer :void))) + +(defcfun ("setcchar" %setcchar) :int + (wcval (:pointer (:struct cchar_t))) + (wch (:pointer wchar_t)) + (attrs attr) + (color_pair :short) + (opts (:pointer :void))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/getch.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/getch.lisp new file mode 100644 index 0000000..2de0e30 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/getch.lisp @@ -0,0 +1,25 @@ +(in-package :de.anvi.ncurses) + +;;; getch +;;; get (or push back) characters from curses terminal keyboard +;;; http://invisible-island.net/ncurses/man/curs_getch.3x.html +;;; http://www.manpagez.com/man/3/curs_getch/ + +;;; C prototypes + +;; int getch(void); +;; int wgetch(WINDOW *win); +;; int mvgetch(int y, int x); +;; int mvwgetch(WINDOW *win, int y, int x); +;; int ungetch(int ch); +;; int has_key(int ch); + +;;; Low-level CFFI wrappers + +(defcfun ("getch" %getch) :int) +(defcfun ("wgetch" %wgetch) :int (win window)) +(defcfun ("mvgetch" %mvgetch) :int (y :int) (x :int)) +(defcfun ("mvwgetch" %mvwgetch) :int (win window) (y :int) (x :int)) + +(defcfun ("ungetch" %ungetch) :int (ch :int)) +(defcfun ("has_key" %has-key) :int (ch :int)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/getstr.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/getstr.lisp new file mode 100644 index 0000000..973f64e --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/getstr.lisp @@ -0,0 +1,27 @@ +(in-package :de.anvi.ncurses) + +;;; getstr +;;; accept character strings from curses terminal keyboard +;;; http://invisible-island.net/ncurses/man/curs_getstr.3x.html + +;;; C prototypes + +;; int getstr(char *str); +;; int getnstr(char *str, int n); +;; int wgetstr(WINDOW *win, char *str); +;; int wgetnstr(WINDOW *win, char *str, int n); +;; int mvgetstr(int y, int x, char *str); +;; int mvgetnstr(int y, int x, char *str, int n); +;; int mvwgetstr(WINDOW *win, int y, int x, char *str); +;; int mvwgetnstr(WINDOW *, int y, int x, char *str, int n); + +;;; Low-level CFFI wrappers + +(defcfun ("getstr" %getstr) :int (str :string)) +(defcfun ("getnstr" %getnstr) :int (str :string) (n :int)) +(defcfun ("wgetstr" %wgetstr) :int (win window) (str :string)) +(defcfun ("wgetnstr" %wgetnstr) :int (win window) (str :string) (n :int)) +(defcfun ("mvgetstr" %mvgetstr) :int (y :int) (x :int) (str :string)) +(defcfun ("mvgetnstr" %mvgetnstr) :int (y :int) (x :int) (str :string) (n :int)) +(defcfun ("mvwgetstr" %mvwgetstr) :int (win window) (y :int) (x :int) (str :string)) +(defcfun ("mvwgetnstr" %mvwgetnstr) :int (win window) (y :int) (x :int) (str :string) (n :int)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/getyx.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/getyx.lisp new file mode 100644 index 0000000..933e0ff --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/getyx.lisp @@ -0,0 +1,42 @@ +;; (in-package :de.anvi.ncurses) + +;;; getyx +;;; get curses cursor and window coordinates +;;; http://invisible-island.net/ncurses/man/curs_getyx.3x.html + +;;; C prototypes + +;; void getyx(WINDOW *win, int y, int x); +;; void getparyx(WINDOW *win, int y, int x); +;; void getbegyx(WINDOW *win, int y, int x); +;; void getmaxyx(WINDOW *win, int y, int x); + +;;; Low-level CFFI wrappers + +;; see legacy.lisp + +;;; NOTES + +#| + +These four C macros are defined in terms of other, simpler macros: + +#define getyx(win,y,x) (y = getcury(win), x = getcurx(win)) +#define getbegyx(win,y,x) (y = getbegy(win), x = getbegx(win)) +#define getmaxyx(win,y,x) (y = getmaxy(win), x = getmaxx(win)) +#define getparyx(win,y,x) (y = getpary(win), x = getparx(win)) + +And those simpler macros are just accessing the window struct. + +#define getcurx(win) ((win) ? (win)->_curx : ERR) +#define getcury(win) ((win) ? (win)->_cury : ERR) +#define getbegx(win) ((win) ? (win)->_begx : ERR) +#define getbegy(win) ((win) ? (win)->_begy : ERR) +#define getmaxx(win) ((win) ? ((win)->_maxx + 1) : ERR) +#define getmaxy(win) ((win) ? ((win)->_maxy + 1) : ERR) +#define getparx(win) ((win) ? (win)->_parx : ERR) +#define getpary(win) ((win) ? (win)->_pary : ERR) + +Those are defined as low-level functions in legacy.lisp. + +|# diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/in_wch.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/in_wch.lisp new file mode 100644 index 0000000..82d0ba7 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/in_wch.lisp @@ -0,0 +1,19 @@ +(in-package :de.anvi.ncurses) + +;;; in_wch +;;; extract a wide (multi-byte) character and rendition from a window +;;; http://invisible-island.net/ncurses/man/curs_in_wch.3x.html + +;;; C prototypes + +;; int in_wch(cchar_t *wcval); +;; int mvin_wch(int y, int x, cchar_t *wcval); +;; int win_wch(WINDOW *win, cchar_t *wcval); +;; int mvwin_wch(WINDOW *win, int y, int x, cchar_t *wcval); + +;;; Low-level CFFI wrappers + +(defcfun ("in_wch" %in-wch) :int (wcval (:pointer (:struct cchar_t)))) +(defcfun ("mvin_wch" %mvin-wch) :int (y :int) (x :int) (wcval (:pointer (:struct cchar_t)))) +(defcfun ("win_wch" %win-wch) :int (win window) (wcval (:pointer (:struct cchar_t)))) +(defcfun ("mvwin_wch" %mvwin-wch) :int (win window) (y :int) (x :int) (wcval (:pointer (:struct cchar_t)))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/inch.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/inch.lisp new file mode 100644 index 0000000..5604677 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/inch.lisp @@ -0,0 +1,19 @@ +(in-package :de.anvi.ncurses) + +;;; inch +;;; get a character and attributes from a curses window +;;; http://invisible-island.net/ncurses/man/curs_inch.3x.html + +;;; C prototypes + +;; chtype inch(void); +;; chtype winch(WINDOW *win); +;; chtype mvinch(int y, int x); +;; chtype mvwinch(WINDOW *win, int y, int x); + +;;; Low-level CFFI wrappers + +(defcfun ("inch" %inch) chtype) +(defcfun ("winch" %winch) chtype (win window)) +(defcfun ("mvinch" %mvinch) chtype (y :int) (x :int)) +(defcfun ("mvwinch" %mvwinch) chtype (win window) (y :int) (x :int)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/inchstr.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/inchstr.lisp new file mode 100644 index 0000000..8be601c --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/inchstr.lisp @@ -0,0 +1,27 @@ +(in-package :de.anvi.ncurses) + +;;; inchstr +;;; get a string of characters (and attributes) from a curses window +;;; http://invisible-island.net/ncurses/man/curs_inchstr.3x.html + +;;; C prototypes + +;; int inchstr(chtype *chstr); +;; int inchnstr(chtype *chstr, int n); +;; int winchstr(WINDOW *win, chtype *chstr); +;; int winchnstr(WINDOW *win, chtype *chstr, int n); +;; int mvinchstr(int y, int x, chtype *chstr); +;; int mvinchnstr(int y, int x, chtype *chstr, int n); +;; int mvwinchstr(WINDOW *win, int y, int x, chtype *chstr); +;; int mvwinchnstr(WINDOW *win, int y, int x, chtype *chstr, int n); + +;;; Low-level CFFI wrappers + +(defcfun ("inchstr" %inchstr) :int (chstr (:pointer chtype))) +(defcfun ("inchnstr" %inchnstr) :int (chstr (:pointer chtype)) (n :int)) +(defcfun ("winchstr" %winchstr) :int (win window) (chstr (:pointer chtype))) +(defcfun ("winchnstr" %winchnstr) :int (win window) (chstr (:pointer chtype)) (n :int)) +(defcfun ("mvinchstr" %mvinchstr) :int (y :int) (x :int) (chstr (:pointer chtype))) +(defcfun ("mvinchnstr" %mvinchnstr) :int (y :int) (x :int) (chstr (:pointer chtype)) (n :int)) +(defcfun ("mvwinchstr" %mvwinchstr) :int (win window) (y :int) (x :int) (chstr (:pointer chtype))) +(defcfun ("mvwinchnstr" %mvwinchnstr) :int (win window) (y :int) (x :int) (chstr (:pointer chtype)) (n :int)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/initscr.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/initscr.lisp new file mode 100644 index 0000000..23ceeb2 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/initscr.lisp @@ -0,0 +1,24 @@ +(in-package :de.anvi.ncurses) + +;;; initscr +;;; screen initialization and manipulation routines +;;; http://invisible-island.net/ncurses/man/curs_initscr.3x.html +;;; http://www.manpagez.com/man/3/curs_initscr/ + +;;; C prototypes + +;; WINDOW *initscr(void); +;; int endwin(void); +;; bool isendwin(void); +;; SCREEN *newterm(char *type, FILE *outfd, FILE *infd); +;; SCREEN *set_term(SCREEN *new); +;; void delscreen(SCREEN *sp); + +;;; Low-level CFFI wrappers + +(defcfun ("initscr" %initscr) window) +(defcfun ("endwin" %endwin) :int) +(defcfun ("isendwin" %isendwin) :boolean) +(defcfun ("newterm" %newterm) screen (type :string) (outfd file) (infd file)) +(defcfun ("set_term" %set-term) screen (new screen)) +(defcfun ("delscreen" %delscreen) :void (sp screen)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/inopts.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/inopts.lisp new file mode 100644 index 0000000..2cfb420 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/inopts.lisp @@ -0,0 +1,45 @@ +(in-package :de.anvi.ncurses) + +;;; inopts +;;; curses input options +;;; http://invisible-island.net/ncurses/man/curs_inopts.3x.html + +;;; C prototypes + +;; int cbreak(void); +;; int nocbreak(void); +;; int echo(void); +;; int noecho(void); +;; int halfdelay(int tenths); +;; int intrflush(WINDOW *win, bool bf); +;; int keypad(WINDOW *win, bool bf); +;; int meta(WINDOW *win, bool bf); +;; int nodelay(WINDOW *win, bool bf); +;; int raw(void); +;; int noraw(void); +;; void noqiflush(void); +;; void qiflush(void); +;; int notimeout(WINDOW *win, bool bf); +;; void timeout(int delay); +;; void wtimeout(WINDOW *win, int delay); +;; int typeahead(int fd); + +;;; Low-level CFFI wrappers + +(defcfun ("cbreak" %cbreak) :int) +(defcfun ("nocbreak" %nocbreak) :int) +(defcfun ("echo" %echo) :int) +(defcfun ("noecho" %noecho) :int) +(defcfun ("halfdelay" %halfdelay) :int (tenths :int)) +(defcfun ("intrflush" %intrflush) :int (win window) (bf :boolean)) +(defcfun ("keypad" %keypad) :int (win window) (bf :boolean)) +(defcfun ("meta" %meta) :int (win window) (bf :boolean)) +(defcfun ("nodelay" %nodelay) :int (win window) (bf :boolean)) +(defcfun ("raw" %raw) :int) +(defcfun ("noraw" %noraw) :int) +(defcfun ("noqiflush" %noqiflush) :void) +(defcfun ("qiflush" %qiflush) :void) +(defcfun ("notimeout" %notimeout) :int (win window) (bf :boolean)) +(defcfun ("timeout" %timeout) :void (delay :int)) +(defcfun ("wtimeout" %wtimeout) :void (win window) (delay :int)) +(defcfun ("typeahead" %typeahead) :int (fd :int)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/ins_wch.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/ins_wch.lisp new file mode 100644 index 0000000..b9b5b5c --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/ins_wch.lisp @@ -0,0 +1,19 @@ +(in-package :de.anvi.ncurses) + +;;; ins_wch +;;; insert a complex character and rendition into a window +;;; http://invisible-island.net/ncurses/man/curs_ins_wch.3x.html + +;;; C prototypes + +;; int ins_wch(const cchar_t *wch); +;; int wins_wch(WINDOW *win, const cchar_t *wch); +;; int mvins_wch(int y, int x, const cchar_t *wch); +;; int mvwins_wch(WINDOW *win, int y, int x, const cchar_t *wch); + +;;; Low-level CFFI wrappers + +(defcfun ("ins_wch" %ins-wch) :int (wch (:pointer (:struct cchar_t)))) +(defcfun ("wins_wch" %wins-wch) :int (win window) (wch (:pointer (:struct cchar_t)))) +(defcfun ("mvins_wch" %mvins-wch) :int (y :int) (x :int) (wch (:pointer (:struct cchar_t)))) +(defcfun ("mvwins_wch" %mvwins-wch) :int (win window) (y :int) (x :int) (wch (:pointer (:struct cchar_t)))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/insch.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/insch.lisp new file mode 100644 index 0000000..d966828 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/insch.lisp @@ -0,0 +1,19 @@ +(in-package :de.anvi.ncurses) + +;;; insch +;;; insert a character before cursor in a curses window +;;; http://invisible-island.net/ncurses/man/curs_insch.3x.html + +;;; C prototypes + +;; int insch(chtype ch); +;; int winsch(WINDOW *win, chtype ch); +;; int mvinsch(int y, int x, chtype ch); +;; int mvwinsch(WINDOW *win, int y, int x, chtype ch); + +;;; Low-level CFFI wrappers + +(defcfun ("insch" %insch) :int (ch chtype)) +(defcfun ("winsch" %winsch) :int (win window) (ch chtype)) +(defcfun ("mvinsch" %mvinsch) :int (y :int) (x :int) (ch chtype)) +(defcfun ("mvwinsch" %mvwinsch) :int (win window) (y :int) (x :int) (ch chtype)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/insstr.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/insstr.lisp new file mode 100644 index 0000000..c0f3f18 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/insstr.lisp @@ -0,0 +1,27 @@ +(in-package :de.anvi.ncurses) + +;;; insstr +;;; insert string before cursor in a curses window +;;; http://invisible-island.net/ncurses/man/curs_insstr.3x.html + +;;; C prototypes + +;; int insstr(const char *str); +;; int insnstr(const char *str, int n); +;; int winsstr(WINDOW *win, const char *str); +;; int winsnstr(WINDOW *win, const char *str, int n); +;; int mvinsstr(int y, int x, const char *str); +;; int mvinsnstr(int y, int x, const char *str, int n); +;; int mvwinsstr(WINDOW *win, int y, int x, const char *str); +;; int mvwinsnstr(WINDOW *win, int y, int x, const char *str, int n); + +;;; Low-level CFFI wrappers + +(defcfun ("insstr" %insstr) :int (str :string)) +(defcfun ("insnstr" %insnstr) :int (str :string) (n :int)) +(defcfun ("winsstr" %winsstr) :int (win window) (str :string)) +(defcfun ("winsnstr" %winsnstr) :int (win window) (str :string) (n :int)) +(defcfun ("mvinsstr" %mvinsstr) :int (y :int) (x :int) (str :string)) +(defcfun ("mvinsnstr" %mvinsnstr) :int (y :int) (x :int) (str :string) (n :int)) +(defcfun ("mvwinsstr" %mvwinsstr) :int (win window) (y :int) (x :int) (str :string)) +(defcfun ("mvwinsnstr" %mvwinsnstr) :int (win window) (y :int) (x :int) (str :string) (n :int)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/instr.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/instr.lisp new file mode 100644 index 0000000..e15b7b9 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/instr.lisp @@ -0,0 +1,27 @@ +(in-package :de.anvi.ncurses) + +;;; instr +;;; get a string of characters from a curses window +;;; http://invisible-island.net/ncurses/man/curs_instr.3x.html + +;;; C prototypes + +;; int instr(char *str); +;; int innstr(char *str, int n); +;; int winstr(WINDOW *win, char *str); +;; int winnstr(WINDOW *win, char *str, int n); +;; int mvinstr(int y, int x, char *str); +;; int mvinnstr(int y, int x, char *str, int n); +;; int mvwinstr(WINDOW *win, int y, int x, char *str); +;; int mvwinnstr(WINDOW *win, int y, int x, char *str, int n); + +;;; Low-level CFFI wrappers + +(defcfun ("instr" %instr) :int (str :string)) +(defcfun ("innstr" %innstr) :int (str :string) (n :int)) +(defcfun ("winstr" %winstr) :int (win window) (str :string)) +(defcfun ("winnstr" %winnstr) :int (win window) (str :string) (n :int)) +(defcfun ("mvinstr" %mvinstr) :int (y :int) (x :int) (str :string)) +(defcfun ("mvinnstr" %mvinnstr) :int (y :int) (x :int) (str :string) (n :int)) +(defcfun ("mvwinstr" %mvwinstr) :int (win window) (y :int) (x :int) (str :string)) +(defcfun ("mvwinnstr" %mvwinnstr) :int (win window) (y :int) (x :int) (str :string) (n :int)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/inwstr.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/inwstr.lisp new file mode 100644 index 0000000..856ec34 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/inwstr.lisp @@ -0,0 +1,27 @@ +(in-package :de.anvi.ncurses) + +;;; inwstr +;;; extract a string of wchar_t characters from a curses window +;;; http://invisible-island.net/ncurses/man/curs_inwstr.3x.html + +;;; C prototypes + +;; int inwstr(wchar_t *str); +;; int innwstr(wchar_t *str, int n); +;; int winwstr(WINDOW *win, wchar_t *str); +;; int winnwstr(WINDOW *win, wchar_t *str, int n); +;; int mvinwstr(int y, int x, wchar_t *str); +;; int mvinnwstr(int y, int x, wchar_t *str, int n); +;; int mvwinwstr(WINDOW *win, int y, int x, wchar_t *str); +;; int mvwinnwstr(WINDOW *win, int y, int x, wchar_t *str, int n); + +;;; Low-level CFFI wrappers + +(defcfun ("inwstr" %inwstr) :int (str (:pointer wchar_t))) +(defcfun ("innwstr" %innwstr) :int (str (:pointer wchar_t)) (n :int)) +(defcfun ("winwstr" %winwstr) :int (win window) (str (:pointer wchar_t))) +(defcfun ("winnwstr" %winnwstr) :int (win window) (str (:pointer wchar_t)) (n :int)) +(defcfun ("mvinwstr" %mvinwstr) :int (y :int) (x :int) (str (:pointer wchar_t))) +(defcfun ("mvinnwstr" %mvinnwstr) :int (y :int) (x :int) (str (:pointer wchar_t)) (n :int)) +(defcfun ("mvwinwstr" %mvwinwstr) :int (win window) (y :int) (x :int) (str (:pointer wchar_t))) +(defcfun ("mvwinnwstr" %mvwinnwstr) :int (win window) (y :int) (x :int) (str (:pointer wchar_t)) (n :int)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/kernel.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/kernel.lisp new file mode 100644 index 0000000..3cf8fdc --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/kernel.lisp @@ -0,0 +1,33 @@ +(in-package :de.anvi.ncurses) + +;;; kernel +;;; low-level curses routines +;;; http://invisible-island.net/ncurses/man/curs_kernel.3x.html + +;;; C prototypes + +;; int def_prog_mode(void); +;; int def_shell_mode(void); +;; int reset_prog_mode(void); +;; int reset_shell_mode(void); +;; int resetty(void); +;; int savetty(void); +;; void getsyx(int y, int x); +;; void setsyx(int y, int x); +;; int ripoffline(int line, int (*init)(WINDOW *, int)); +;; int curs_set(int visibility); +;; int napms(int ms); + +;;; Low-level CFFI wrappers + +(defcfun ("def_prog_mode" %def-prog-mode) :int) +(defcfun ("def_shell_mode" %def-shell-mode) :int) +(defcfun ("reset_prog_mode" %reset-prog-mode) :int) +(defcfun ("reset_shell_mode" %reset-shell-mode) :int) +(defcfun ("resetty" %resetty) :int) +(defcfun ("savetty" %savetty) :int) +(defcfun ("getsyx" %getsyx) :void (y :int) (x :int)) +(defcfun ("setsyx" %setsyx) :void (y :int) (x :int)) +(defcfun ("ripoffline" %ripoffline) :int (line :int) (init :pointer)) +(defcfun ("curs_set" %curs-set) :int (visibility :int)) +(defcfun ("napms" %napms) :int (ms :int)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/key_defined.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/key_defined.lisp new file mode 100644 index 0000000..485bfef --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/key_defined.lisp @@ -0,0 +1,13 @@ +(in-package :de.anvi.ncurses) + +;; key_defined +;; check if a keycode is defined +;; http://invisible-island.net/ncurses/man/key_defined.3x.html + +;;; C prototypes + +;; int key_defined(const char *definition); + +;;; Low-level CFFI wrappers + +(defcfun ("key_defined" %key-defined) :int (definition :string)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/keybound.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/keybound.lisp new file mode 100644 index 0000000..95c1788 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/keybound.lisp @@ -0,0 +1,13 @@ +(in-package :de.anvi.ncurses) + +;; keybound +;; return definition of keycode +;; http://invisible-island.net/ncurses/man/keybound.3x.html + +;;; C prototypes + +;; char *keybound(int keycode, int count); + +;;; Low-level CFFI wrappers + +(defcfun ("keybound" %keybound) :string (keycode :int) (count :int)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/legacy.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/legacy.lisp new file mode 100644 index 0000000..bf66e31 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/legacy.lisp @@ -0,0 +1,28 @@ +(in-package :de.anvi.ncurses) + +;;; legacy +;;; get curses cursor and window coordinates, attributes +;;; http://invisible-island.net/ncurses/man/curs_legacy.3x.html + +;;; C prototypes + +;; int getattrs(WINDOW *win); +;; int getbegx(WINDOW *win); +;; int getbegy(WINDOW *win); +;; int getcurx(WINDOW *win); +;; int getcury(WINDOW *win); +;; int getmaxx(WINDOW *win); +;; int getmaxy(WINDOW *win); +;; int getparx(WINDOW *win); +;; int getpary(WINDOW *win); + +;;; Low-level CFFI wrappers + +(defcfun ("getbegx" %getbegx) :int (win window)) +(defcfun ("getbegy" %getbegy) :int (win window)) +(defcfun ("getcurx" %getcurx) :int (win window)) +(defcfun ("getcury" %getcury) :int (win window)) +(defcfun ("getmaxx" %getmaxx) :int (win window)) +(defcfun ("getmaxy" %getmaxy) :int (win window)) +(defcfun ("getparx" %getparx) :int (win window)) +(defcfun ("getpary" %getpary) :int (win window)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/legacy_coding.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/legacy_coding.lisp new file mode 100644 index 0000000..9348165 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/legacy_coding.lisp @@ -0,0 +1,12 @@ +(in-package :de.anvi.ncurses) + +;;; legacy coding +;;; http://invisible-island.net/ncurses/man/legacy_coding.3x.html + +;;; C prototypes + +;; int use_legacy_coding(int level); + +;;; Low-level CFFI wrappers + +(defcfun ("use_legacy_coding" %use-legacy-coding) :int (level :int)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/mouse.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/mouse.lisp new file mode 100644 index 0000000..1dec87e --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/mouse.lisp @@ -0,0 +1,24 @@ +(in-package :de.anvi.ncurses) + +;;; mouse +;;; mouse interface through curses +;;; http://invisible-island.net/ncurses/man/curs_mouse.3x.html + +;;; C prototypes + +;;; bool has_mouse(void); +;;; int getmouse(MEVENT *event); +;;; int ungetmouse(MEVENT *event); +;;; mmask_t mousemask(mmask_t newmask, mmask_t *oldmask); +;;; bool wenclose(const WINDOW *win, int y, int x); +;;; bool mouse_trafo(int* pY, int* pX, bool to_screen); +;;; bool wmouse_trafo(const WINDOW* win, int* pY, int* pX, bool to_screen); +;;; int mouseinterval(int erval); + +;;; Low-level CFFI wrappers + +(defcfun ("getmouse" %getmouse) :int (event (:pointer (:struct mevent)))) +(defcfun ("mousemask" %mousemask) mmask_t (newmask mmask_t) (oldmask (:pointer mmask_t))) + +(defcfun ("has_mouse" %has-mouse) :boolean) +(defcfun ("ungetmouse" %ungetmouse) :int (event (:pointer (:struct mevent)))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/move.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/move.lisp new file mode 100644 index 0000000..e8fe418 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/move.lisp @@ -0,0 +1,16 @@ +(in-package :de.anvi.ncurses) + +;;; move +;;; move curses window cursor +;;; http://invisible-island.net/ncurses/man/curs_move.3x.html +;;; http://www.manpagez.com/man/3/curs_move/ + +;;; C prototypes + +;; int move(int y, int x); +;; int wmove(WINDOW *win, int y, int x); + +;;; Low-level CFFI wrappers + +(defcfun ("move" %move) :int (y :int) (x :int)) +(defcfun ("wmove" %wmove) :int (win window) (y :int) (x :int)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/ncurses.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/ncurses.lisp new file mode 100644 index 0000000..24e7d9b --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/ncurses.lisp @@ -0,0 +1,213 @@ +(in-package :de.anvi.ncurses) + +;;; ncurses +;;; CRT screen handling and optimization package +;;; http://invisible-island.net/ncurses/man/ncurses.3x.html + +;; The wide multi-byte library is preferred and will be loaded when the underlying lisp system supports unicode. +#+(or sb-unicode unicode openmcl-unicode-strings) +(define-foreign-library libncursesw + (:darwin (:or "libncursesw.6.dylib" "libncursesw.5.dylib" "libncursesw.dylib" "libcurses.dylib")) + (:unix (:or "libncursesw.so.6.1" "libncursesw.so.6.0" "libncursesw.so.6" "libncursesw.so.5.9" "libncursesw.so.5" "libncursesw.so")) + (t (:default "libncursesw"))) + +#+(or sb-unicode unicode openmcl-unicode-strings) +(use-foreign-library libncursesw) + +;; Attempt to use the legacy single-byte library only when the lisp implementation doesnt support unicode. +#-(or sb-unicode unicode openmcl-unicode-strings) +(define-foreign-library libncurses + (:darwin (:or "libncurses.6.dylib" "libncurses.5.dylib" "libncurses.dylib" "libcurses.dylib")) + (:unix (:or "libncurses.so.6.1" "libncurses.so.6.0" "libncurses.so.6" "libncurses.so.5.9" "libncurses.so.5" "libncurses.so")) + (t (:default "libncurses"))) + +#-(or sb-unicode unicode openmcl-unicode-strings) +(use-foreign-library libncurses) + +;;; ------------------------------------------------------------------ + +;; Every function that can take a win, should take a win. +;; We dont want functions that implicitly operate on a global stdscr. + +;; Function should return lisp-style bools, not C type int 0 or 1. +;; cffi automatically does this conversion. + +;;; ------------------------------------------------------------------ + +;; General ncurses library implementation info: + +;; data types: + +;; http://pubs.opengroup.org/onlinepubs/7908799/xcurses/curses.h.html +;; http://pubs.opengroup.org/onlinepubs/7908799/xcurses/implement.html +;; http://pubs.opengroup.org/onlinepubs/7908799/cursesix.html + +;; http://refspecs.linuxbase.org/LSB_3.0.0/LSB-Core-generic/LSB-Core-generic/libncurses.html +;; http://refspecs.linuxbase.org/LSB_3.0.0/LSB-Core-generic/LSB-Core-generic/libncurses-ddefs.html + +;; http://h71000.www7.hp.com/doc/83final/5763/5763pro_016.html + +;; http://docs.python.org/release/2.4.3/lib/curses-window-objects.html + +;; http://web.ist.utl.pt/tiago.dionizio/lua/lcurses.html + +;;; ------------------------------------------------------------------ + +;;; Types + +;; Basic types as seen in the ncurses function prototypes. +;; These will only be used inside cffi wrappers. + +;; not used, cffi automatically translates a boolean type +;; typedef unsigned char bool; +(defctype bool :unsigned-char) + +#| +--enable-lp64 +Allows an application to define _LP64 to declare chtype and mmask_t as +simply unsigned rather than the configured types +using the --with-chtype and --with-mmask_t options. + +#if 1 && defined(_LP64) +typedef unsigned chtype; +typedef unsigned mmask_t; +#else +typedef uint32_t chtype; +typedef uint32_t mmask_t; +#endif +|# + +;; default ubuntu build options, they build for API5. +;; --disable-lp64 --with-chtype='long' --with-mmask-t='long' + +;; the default type on ubuntu isnt "unsigned int" but "long", which means signed long. + +;; We will use the ABI6 default uint32_t instead of long. + +;; TODO: use ABI6 values for chtype, cchar_t and mmask: --with-chtype=uint32_t +;;(defctype chtype :unsigned-int) +(defctype chtype :uint32) + +;; wide character type, defined in: +;; /usr/lib/gcc/x86_64-linux-gnu/5/include/stddef.h +;; it has to be able to contain the 21-bit 10FFFF, which is the max allowed unicode point. +(defctype wchar_t :int32) + +;; typedef unsigned int wint_t; +;; used in get_wch.lisp +;; wint_t needs to be a signed int to represent a negative WEOF value. +(defctype wint_t :int32) + +;; typedef chtype attr_t; +;; TODO: rename this to attr_t +(defctype attr :uint32 + "The 32 bit integral type attr_t holds an OR-ed set of attributes.") +(defctype attr_t :uint32 + "The 32 bit integral type attr_t holds an OR-ed set of attributes.") + +;; winptr = *WINDOW +;; TODO: define window struct +;; (defctype ptr-window (:pointer (:struct window))) +(defctype window :pointer) + +;; scrptr = *SCREEN +(defctype screen :pointer) + +;; fileptr = *FILE +(defctype file :pointer) + +;;; C structures + +#| + +Excerpt from /usr/include/ncurses.h + +/* + * cchar_t stores an array of CCHARW_MAX wide characters. The first is + * normally a spacing character. The others are non-spacing. If those + * (spacing and nonspacing) do not fill the array, a null L'\0' follows. + * Otherwise, a null is assumed to follow when extracting via getcchar(). + */ +#define CCHARW_MAX 5 +typedef struct +{ + attr_t attr; + wchar_t chars[CCHARW_MAX]; +#if 0 +#undef NCURSES_EXT_COLORS +#define NCURSES_EXT_COLORS 20110404 + int ext_color; /* color pair, must be more than 16-bits */ +#endif +} +cchar_t; + +|# + +;; For non-extended colors, the color pair is OR-ed into the attr value, like it has been done +;; with color pairs in chtypes. This is ABI5. + +;;(defcstruct cchar_t +;; "A C struct containing contains a wide char and an integer containing the color pair and attributes." +;; (cchar-attr attr) +;; (cchar-chars wchar_t :count 5)) + +;; For extended colors, we get a new struct slot. This is ABI6, which is the default since ncurses 6.0, 20150808. + +;; Intended to be used with setcchar. +;; TODO: write meaningsful docstrings here. +(defcstruct cchar_t + "C struct containing a wide char, a color pair and attributes." + (cchar-attr attr_t) + (cchar-chars wchar_t :count 5) + (cchar-colors :int)) + +(defctype ptr-cchar_t (:pointer (:struct cchar_t))) + +;; Intended to be used with convert-to-foreign plist translation. +;; For some reasons, plists with pointers dont work, so we have to pass by value. +;; TODO: we dont need this any more, everything works now with the cchar_t struct. +(defcstruct cchar + "C struct containing a wide char, a color pair and attributes." + (cchar-attr attr_t) + (cchar-chars wchar_t) + (cchar-colors :int)) + +;; the default on ubuntu 12.04, 16.04 is --enable-ext-colors, +;; so is probably on debian, so we need to include "int ext_color" by default in +;; the cchar struct. + +;; convert-to-foreign and convert-from-foreign do not return structs, +;; but pointers to structs. + +;;; mouse.lisp + +;; typedef unsigned long mmask_t; +;; +;; typedef struct { +;; short id; /* ID to distinguish multiple devices */ +;; int x, y, z; /* event coordinates */ +;; mmask_t bstate; /* button state bits */ +;; } MEVENT; + +;; TODO: ABI6: --with-mmask_t=uint32_t +;;(defctype mmask_t :unsigned-int) +(defctype mmask_t :uint32) + +(defcstruct mevent + "C struct containing mouse coordinates and button state." + (id :short) + (x :int) + (y :int) + (z :int) + (bstate mmask_t)) + +;;; ------------------------------------------------------------------ + +;;; Constants + +;; #defines taken from ncurses.h, should not be user visible. +;; wherever cffi defines a boolean, we can use t and nil instead of TRUE and FALSE. +;;(defconstant TRUE 1) +;;(defconstant FALSE 0) +;;(defconstant ERROR -1) +;;(defconstant OK 0) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/opaque.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/opaque.lisp new file mode 100644 index 0000000..b7468a9 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/opaque.lisp @@ -0,0 +1,40 @@ +(in-package :de.anvi.ncurses) + +;;; opaque +;;; curses window properties +;;; http://invisible-island.net/ncurses/man/curs_opaque.3x.html + +;;; C prototypes + +;; bool is_cleared(const WINDOW *win); +;; bool is_idcok(const WINDOW *win); +;; bool is_idlok(const WINDOW *win); +;; bool is_immedok(const WINDOW *win); +;; bool is_keypad(const WINDOW *win); +;; bool is_leaveok(const WINDOW *win); +;; bool is_nodelay(const WINDOW *win); +;; bool is_notimeout(const WINDOW *win); +;; bool is_pad(const WINDOW *win); +;; bool is_scrollok(const WINDOW *win); +;; bool is_subwin(const WINDOW *win); +;; bool is_syncok(const WINDOW *win); +;; WINDOW *wgetparent(const WINDOW *win); +;; int wgetscrreg(const WINDOW *win, int *top, int *bottom); + +;;; Low-level CFFI wrappers + +(defcfun ("is_cleared" %is-cleared) :boolean (win window)) +(defcfun ("is_idcok" %is-idcok) :boolean (win window)) +(defcfun ("is_idlok" %is-idlok) :boolean (win window)) +(defcfun ("is_immedok" %is-immedok) :boolean (win window)) +(defcfun ("is_keypad" %is-keypad) :boolean (win window)) +(defcfun ("is_leaveok" %is-leaveok) :boolean (win window)) +(defcfun ("is_nodelay" %is-nodelay) :boolean (win window)) +(defcfun ("is_notimeout" %is-notimeout) :boolean (win window)) +(defcfun ("is_pad" %is-pad) :boolean (win window)) +(defcfun ("is_scrollok" %is-scrollok) :boolean (win window)) +(defcfun ("is_subwin" %is-subwin) :boolean (win window)) +(defcfun ("is_syncok" %is-syncok) :boolean (win window)) + +(defcfun ("wgetparent" %wgetparent) window (win window)) +(defcfun ("wgetscrreg" %wgetscrreg) :int (win window) (top (:pointer :int)) (bottom (:pointer :int))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/outopts.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/outopts.lisp new file mode 100644 index 0000000..1862c24 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/outopts.lisp @@ -0,0 +1,35 @@ +(in-package :de.anvi.ncurses) + +;;; outopts +;;; curses output options +;;; http://invisible-island.net/ncurses/man/curs_outopts.3x.html + +;;; C prototypes + +;; int clearok(WINDOW *win, bool bf); +;; int idlok(WINDOW *win, bool bf); +;; void idcok(WINDOW *win, bool bf); +;; void immedok(WINDOW *win, bool bf); +;; int leaveok(WINDOW *win, bool bf); +;; int scrollok(WINDOW *win, bool bf); + +;; int setscrreg(int top, int bot); +;; int wsetscrreg(WINDOW *win, int top, int bot); + +;; int nl(void); +;; int nonl(void); + +;;; Low-level CFFI wrappers + +(defcfun ("clearok" %clearok) :int (win window) (bf :boolean)) +(defcfun ("idlok" %idlok) :int (win window) (bf :boolean)) +(defcfun ("idcok" %idcok) :void (win window) (bf :boolean)) +(defcfun ("immedok" %immedok) :void (win window) (bf :boolean)) +(defcfun ("leaveok" %leaveok) :int (win window) (bf :boolean)) +(defcfun ("scrollok" %scrollok) :int (win window) (bf :boolean)) + +(defcfun ("setscrreg" %setscrreg) :int (top :int) (bot :int)) +(defcfun ("wsetscrreg" %wsetscrreg) :int (win window) (top :int) (bot :int)) + +(defcfun ("nl" %nl) :void) +(defcfun ("nonl" %nonl) :void) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/package.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/package.lisp new file mode 100644 index 0000000..32d78fe --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/package.lisp @@ -0,0 +1,467 @@ +(defpackage #:de.anvi.ncurses + (:documentation "Low-level CFFI bindings to the Ncurses C API. Not meant to be used directly.") + (:use #:common-lisp #:cffi) + (:export + + ;; addch / add a character (with attributes) to a curses window, then advance the cursor + %addch + %waddch + %mvaddch + %mvwaddch + %echochar + %wechochar + + ;; add_wch / add a complex character and rendition to a curses window, then advance the cursor + %add-wch + %wadd-wch + %mvadd-wch + %mvwadd-wch + %echo-wchar + %wecho-wchar + + ;; addstr / add a string of characters to a curses window and advance cursor + %addstr + %addnstr + %waddstr + %waddnstr + %mvaddstr + %mvaddnstr + %mvwaddstr + %mvwaddnstr + + ;; attr / curses character and window attribute control routines + %attroff + %wattroff + %attron + %wattron + %attrset + %wattrset + %color-set + %wcolor-set + %standend + %wstandend + %standout + %wstandout + %attr-get + %wattr-get + %attr-off + %wattr-off + %attr-on + %wattr-on + %attr-set + %wattr-set + %chgat + %wchgat + %mvchgat + %mvwchgat + + ;; beep / curses bell and screen flash routines + %beep + %flash + + ;; bkgd / curses window background manipulation routines + %bkgdset + %wbkgdset + %bkgd + %wbkgd + %getbkgd + + ;; bkgrnd / window complex background manipulation routines + %bkgrnd + %wbkgrnd + %bkgrndset + %wbkgrndset + %getbkgrnd + %wgetbkgrnd + + ;; border / create curses borders, horizontal and vertical lines + %border + %wborder + %box + %hline + %whline + %vline + %wvline + %mvhline + %mvwhline + %mvvline + %mvwvline + + ;; border_set / create curses borders or lines using complex characters and renditions + %border-set + %wborder-set + %box-set + %hline-set + %whline-set + %mvhline-set + %mvwhline-set + %vline-set + %wvline-set + %mvvline-set + %mvwvline-set + + ;; clear / clear all or part of a curses window + %erase + %werase + %clear + %wclear + %clrtobot + %wclrtobot + %clrtoeol + %wclrtoeol + + ;; color / curses color manipulation routines + %start-color + %has-colors + %can-change-color + %init-pair + %init-color + %pair-content + %color-content + %init-extended-pair + %init-extended-color + %pair-extended-content + %color-extended-content + %color-pair + %pair-number + %COLOR-BLACK + %COLOR-RED + %COLOR-GREEN + %COLOR-YELLOW + %COLOR-BLUE + %COLOR-MAGENTA + %COLOR-CYAN + %COLOR-WHITE + + ;; default_colors / use terminal's default colors + %use-default-colors + %assume-default-colors + + ;; define_key / define a keycode + %define-key + + ;; delch / delete character under the cursor in a curses window + %delch + %wdelch + %mvdelch + %mvwdelch + + ;; deleteln / delete and insert lines in a curses window + %deleteln + %wdeleteln + %insdelln + %winsdelln + %insertln + %winsertln + + ;; extend / miscellaneous curses extensions + %curses-version + %use-extended-names + + ;; getcchar / Get a wide character string and rendition from a cchar_t or set a cchar_t from a wide-character string + %getcchar + %setcchar + + ;; getch / get (or push back) characters from curses terminal keyboard + %getch + %wgetch + %mvgetch + %mvwgetch + %ungetch + %has-key + + ;; get_wch / get (or push back) a wide (multi-byte) character from curses terminal keyboard + %get-wch + %wget-wch + %mvget-wch + %mvwget-wch + %unget-wch + wint_t + + ;; getstr / accept character strings from curses terminal keyboard + %getstr + %getnstr + %wgetstr + %wgetnstr + %mvgetstr + %mvgetnstr + %mvwgetstr + %mvwgetnstr + + ;; getyx / get curses cursor and window coordinates + ;; --> legacy + + ;; inch / get a character and attributes from a curses window + %inch + %winch + %mvinch + %mvwinch + + ;; in_wch / extract a wide character and rendition from a window + %in-wch + %mvin-wch + %win-wch + %mvwin-wch + + ;; inchstr / get a string of characters (and attributes) from a curses window + %inchstr + %inchnstr + %winchstr + %winchnstr + %mvinchstr + %mvinchnstr + %mvwinchstr + %mvwinchnstr + + ;; initscr / Screen initialization and manipulation routines + %initscr + %endwin + %isendwin + %newterm + %set-term + %delscreen + + ;; inopts / Input options. + %cbreak + %nocbreak + %echo + %noecho + %halfdelay + %intrflush + %keypad + %meta + %nodelay + %raw + %noraw + %noqiflush + %qiflush + %notimeout + %timeout + %wtimeout + %typeahead + + ;; insch / insert a character before cursor in a curses window + %insch + %winsch + %mvinsch + %mvwinsch + + ;; ins_wch / insert a complex character and rendition into a window + %ins-wch + %wins-wch + %mvins-wch + %mvwins-wch + + ;; insstr / insert string before cursor in a curses window + %insstr + %insnstr + %winsstr + %winsnstr + %mvinsstr + %mvinsnstr + %mvwinsstr + %mvwinsnstr + + ;; instr / get a string of characters from a curses window + %instr + %innstr + %winstr + %winnstr + %mvinstr + %mvinnstr + %mvwinstr + %mvwinnstr + + ;; inwstr / extract a string of wchar_t characters from a curses window + %inwstr + %innwstr + %winwstr + %winnwstr + %mvinwstr + %mvinnwstr + %mvwinwstr + %mvwinnwstr + + ;; kernel / low-level curses routines + %def-prog-mode + %def-shell-mode + %reset-prog-mode + %reset-shell-mode + %resetty + %savetty + %getsyx + %setsyx + %ripoffline + %curs-set + %napms + + ;; keybound / return definition of keycode + %keybound + + ;; key_defined / check if a keycode is defined + %key-defined + + ;; legacy / get curses cursor and window coordinates, attributes + %getbegx + %getbegy + %getcurx + %getcury + %getmaxx + %getmaxy + %getparx + %getpary + + ;; legacy_coding + %use-legacy-coding + + ;; mouse interface through curses + %getmouse + %mousemask + + ;; move / move curses window cursor + %move + %wmove + + ;; ncurses / CRT screen handling and optimization package + chtype + wchar_t + wint_t + attr_t + cchar + cchar_t + ptr-cchar_t + cchar-attr + cchar-chars + cchar-colors + mmask_t + mevent + %ERROR + %OK + + ;; opaque / curses window properties + %is-cleared + %is-idcok + %is-idlok + %is-immedok + %is-keypad + %is-leaveok + %is-nodelay + %is-notimeout + %is-pad + %is-scrollok + %is-subwin + %is-syncok + %wgetparent + %wgetscrreg + + ;; outopts / curses output options + %clearok + %idlok + %idcok + %immedok + %leaveok + %scrollok + %setscrreg + %wsetscrreg + %nl + %nonl + + ;; pad / create and display curses pads + %newpad + %subpad + %prefresh + %pnoutrefresh + %pechochar + %pecho-wchar + + ;; refresh / refresh curses windows and lines + %refresh + %wrefresh + %wnoutrefresh + %doupdate + %redrawwin + %wredrawln + + ;; resizeterm / change the curses terminal size + %is-term-resized + %resize-term + %resizeterm + + ;; scroll / scroll a curses window + %scroll + %scrl + %wscrl + + ;; slk / curses soft label routines + %slk-init + %slk-set + %slk-refresh + %slk-noutrefresh + %slk-label + %slk-clear + %slk-restore + %slk-touch + %slk-attron + %slk-attroff + %slk-attrset + %slk-attr-on + %slk-attr-off + %slk-attr-set + %slk-attr + %slk-color + + ;; termattrs / environment query routines + %baudrate + %erasechar + %has-ic + %has-il + %killchar + %longname + %term-attrs + %termattrs + %termname + + ;; touch / curses refresh control routines + %touchwin + %touchline + %untouchwin + %wtouchln + %is-linetouched + %is-wintouched + + ;; util / miscellaneous curses utility routines + %unctrl + %keyname + %filter + %nofilter + %use-env + %putwin + %getwin + %delay-output + %flushinp + + ;; variables / curses global variables + %COLOR-PAIRS + %COLORS + %COLS + %ESCDELAY + %LINES + %TABSIZE + + ;; window / create curses windows + %newwin + %delwin + %mvwin + %subwin + %derwin + %mvderwin + %dupwin + %wsyncup + %syncok + %wcursyncup + %wsyncdown + + ;; wresize / resize a curses window + %wresize + + )) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/pad.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/pad.lisp new file mode 100644 index 0000000..95b6674 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/pad.lisp @@ -0,0 +1,45 @@ +(in-package :de.anvi.ncurses) + +;;; pad +;;; create and display curses pads +;;; http://invisible-island.net/ncurses/man/curs_pad.3x.html +;;; http://pic.dhe.ibm.com/infocenter/aix/v7r1/topic/com.ibm.aix.basetechref/doc/basetrf2/newpad.htm +;;; http://www.gnu.org/software/guile-ncurses/manual/html_node/Create-and-display-pads.html + +;;; C prototypes + +;; WINDOW *newpad(int nlines, int ncols); +;; WINDOW *subpad(WINDOW *orig, int nlines, int ncols, int begin_y, int begin_x); + +;; int prefresh(WINDOW *pad, int pminrow, int pmincol, int sminrow, int smincol, int smaxrow, int smaxcol); +;; int pnoutrefresh(WINDOW *pad, int pminrow, int pmincol, int sminrow, int smincol, int smaxrow, int smaxcol); + +;; int pechochar(WINDOW *pad, chtype ch); +;; int pecho_wchar(WINDOW *pad, const cchar_t *wch); + +;;; Low-level CFFI wrappers + +(defcfun ("newpad" %newpad) window (nlines :int) (ncols :int)) +(defcfun ("subpad" %subpad) window (orig window) (nlines :int) (ncols :int) (begin_y :int) (begin_x :int)) + +(defcfun ("prefresh" %prefresh) :int + (pad window) + (pminrow :int) + (pmincol :int) + (sminrow :int) + (smincol :int) + (smaxrow :int) + (smaxcol :int)) + +(defcfun ("pnoutrefresh" %pnoutrefresh) :int + (pad window) + (pminrow :int) + (pmincol :int) + (sminrow :int) + (smincol :int) + (smaxrow :int) + (smaxcol :int)) + +(defcfun ("pechochar" %pechochar) :int (pad window) (ch chtype)) + +(defcfun ("pecho_wchar" %pecho-wchar) :int (pad window) (wch (:pointer (:struct cchar_t)))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/refresh.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/refresh.lisp new file mode 100644 index 0000000..b63eb79 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/refresh.lisp @@ -0,0 +1,23 @@ +(in-package :de.anvi.ncurses) + +;;; refresh +;;; refresh curses windows and lines +;;; http://www.manpagez.com/man/3/curs_refresh/ + +;;; C prototypes + +;; int refresh(void); +;; int wrefresh(WINDOW *win); +;; int wnoutrefresh(WINDOW *win); +;; int doupdate(void); +;; int redrawwin(WINDOW *win); +;; int wredrawln(WINDOW *win, int beg_line, int num_lines); + +;;; Low-level CFFI wrappers + +(defcfun ("refresh" %refresh) :int) +(defcfun ("wrefresh" %wrefresh) :int (win window)) +(defcfun ("wnoutrefresh" %wnoutrefresh) :int (win window)) +(defcfun ("doupdate" %doupdate) :int) +(defcfun ("redrawwin" %redrawwin) :int (win window)) +(defcfun ("wredrawln" %wredrawln) :int (win window) (beg-line :int) (num-lines :int)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/resizeterm.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/resizeterm.lisp new file mode 100644 index 0000000..601ef36 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/resizeterm.lisp @@ -0,0 +1,17 @@ +(in-package :de.anvi.ncurses) + +;;; resizeterm +;;; change the curses terminal size +;;; http://invisible-island.net/ncurses/man/resizeterm.3x.html + +;;; C prototypes + +;; bool is_term_resized(int lines, int columns); +;; int resize_term(int lines, int columns); +;; int resizeterm(int lines, int columns); + +;;; Low-level CFFI wrappers + +(defcfun ("is_term_resized" %is-term-resized) :boolean (lines :int) (columns :int)) +(defcfun ("resize_term" %resize-term) :int (lines :int) (columns :int)) +(defcfun ("resizeterm" %resizeterm) :int (lines :int) (columns :int)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/scroll.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/scroll.lisp new file mode 100644 index 0000000..b989005 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/scroll.lisp @@ -0,0 +1,17 @@ +(in-package :de.anvi.ncurses) + +;;; scroll +;;; scroll a curses window +;;; http://invisible-island.net/ncurses/man/curs_scroll.3x.html + +;;; C prototypes + +;; int scroll(WINDOW *win); +;; int scrl(int n); +;; int wscrl(WINDOW *win, int n); + +;;; Low-level CFFI wrappers + +(defcfun ("scroll" %scroll) :int (win window)) +(defcfun ("scrl" %scrl) :int (n :int)) +(defcfun ("wscrl" %wscrl) :int (win window) (n :int)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/slk.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/slk.lisp new file mode 100644 index 0000000..b1fb316 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/slk.lisp @@ -0,0 +1,47 @@ +(in-package :de.anvi.ncurses) + +;;; slk +;;; curses soft label routines +;;; http://invisible-island.net/ncurses/man/curs_slk.3x.html + +;;; C prototypes + +;; int slk_init(int fmt); +;; int slk_set(int labnum, const char *label, int fmt); +;; int slk_refresh(void); +;; int slk_noutrefresh(void); +;; char *slk_label(int labnum); +;; int slk_clear(void); +;; int slk_restore(void); +;; int slk_touch(void); +;; int slk_attron(const chtype attrs); +;; int slk_attroff(const chtype attrs); +;; int slk_attrset(const chtype attrs); +;; int slk_attr_on(attr_t attrs, void *opts); +;; int slk_attr_off(const attr_t attrs, void *opts); +;; int slk_attr_set(const attr_t attrs, short color_pair, void *opts); +;; attr_t slk_attr(void); +;; int slk_color(short color_pair); +;; int slk_wset(int labnum, const wchar_t *label, int fmt); + +;;; Low-level CFFI wrappers + +(defcfun ("slk_init" %slk-init) :int (fmt :int)) +(defcfun ("slk_set" %slk-set) :int (labnum :int) (label :string) (fmt :int)) +(defcfun ("slk_refresh" %slk-refresh) :int) +(defcfun ("slk_noutrefresh" %slk-noutrefresh) :int) +(defcfun ("slk_label" %slk-label) :string (labnum :int)) +(defcfun ("slk_clear" %slk-clear) :int) +(defcfun ("slk_restore" %slk-restore) :int) +(defcfun ("slk_touch" %slk-touch) :int) + +(defcfun ("slk_attron" %slk-attron) :int (attrs chtype)) +(defcfun ("slk_attroff" %slk-attroff) :int (attrs chtype)) +(defcfun ("slk_attrset" %slk-attrset) :int (attrs chtype)) + +(defcfun ("slk_attr_on" %slk-attr-on) :int (attrs attr) (opts (:pointer :void))) +(defcfun ("slk_attr_off" %slk-attr-off) :int (attrs attr) (opts (:pointer :void))) +(defcfun ("slk_attr_set" %slk-attr-set) :int (attrs attr) (color-pair :short) (opts (:pointer :void))) + +(defcfun ("slk_attr" %slk-attr) attr) +(defcfun ("slk_color" %slk-color) :int (color-pair :short)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/termattrs.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/termattrs.lisp new file mode 100644 index 0000000..3cba63c --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/termattrs.lisp @@ -0,0 +1,31 @@ +(in-package :de.anvi.ncurses) + +;;; termattrs +;;; environment query routines +;;; http://invisible-island.net/ncurses/man/curs_termattrs.3x.html + +;;; C prototypes + +;; int baudrate(void); +;; char erasechar(void); +;; int erasewchar(wchar_t *ch); +;; bool has_ic(void); +;; bool has_il(void); +;; char killchar(void); +;; int killwchar(wchar_t *ch); +;; char *longname(void); +;; attr_t term_attrs(void); +;; chtype termattrs(void); +;; char *termname(void); + +;;; Low-level CFFI wrappers + +(defcfun ("baudrate" %baudrate) :int) +(defcfun ("erasechar" %erasechar) :char) +(defcfun ("has_ic" %has-ic) :boolean) +(defcfun ("has_il" %has-il) :boolean) +(defcfun ("killchar" %killchar) :char) +(defcfun ("longname" %longname) :string) +(defcfun ("term_attrs" %term-attrs) attr) +(defcfun ("termattrs" %termattrs) chtype) +(defcfun ("termname" %termname) :string) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/touch.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/touch.lisp new file mode 100644 index 0000000..acc4d9d --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/touch.lisp @@ -0,0 +1,25 @@ +(in-package :de.anvi.ncurses) + +;;; touch +;;; curses refresh control routines +;;; http://invisible-island.net/ncurses/man/curs_touch.3x.html +;;; http://www-01.ibm.com/support/knowledgecenter/ssw_aix_61/com.ibm.aix.basetrf2/touchwin.htm + +;;; C prototypes + +;; int touchwin(WINDOW *win); +;; int touchline(WINDOW *win, int start, int count); +;; int untouchwin(WINDOW *win); +;; int wtouchln(WINDOW *win, int y, int n, int changed); +;; bool is_linetouched(WINDOW *win, int line); +;; bool is_wintouched(WINDOW *win); + +;;; Low-level CFFI wrappers + +(defcfun ("touchwin" %touchwin) :int (win window)) +(defcfun ("touchline" %touchline) :int (win window) (start :int) (count :int)) +(defcfun ("untouchwin" %untouchwin) :int (win window)) +(defcfun ("wtouchln" %wtouchln) :int (win window) (y :int) (n :int) (changed :int)) + +(defcfun ("is_linetouched" %is-linetouched) :boolean (win window) (line :int)) +(defcfun ("is_wintouched" %is-wintouched) :boolean (win window)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/util.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/util.lisp new file mode 100644 index 0000000..3fe2d41 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/util.lisp @@ -0,0 +1,33 @@ +(in-package :de.anvi.ncurses) + +;;; util +;;; miscellaneous curses utility routines +;;; http://invisible-island.net/ncurses/man/curs_util.3x.html + +;;; C prototypes + +;; char *unctrl(chtype c); +;; wchar_t *wunctrl(cchar_t *c); +;; char *keyname(int c); +;; char *key_name(wchar_t w); +;; void filter(void); +;; void nofilter(void); +;; void use_env(bool f); +;; int putwin(WINDOW *win, FILE *filep); +;; WINDOW *getwin(FILE *filep); +;; int delay_output(int ms); +;; int flushinp(void); + +;;; Low-level CFFI wrappers + +(defcfun ("unctrl" %unctrl) :string (c chtype)) +(defcfun ("wunctrl" %wunctrl) :string (c (:pointer (:struct cchar_t)))) +(defcfun ("keyname" %keyname) :string (c :int)) +(defcfun ("key_name" %key_name) :string (w wchar_t)) +(defcfun ("filter" %filter) :void) +(defcfun ("nofilter" %nofilter) :void) +(defcfun ("use_env" %use-env) :void (f :boolean)) +(defcfun ("putwin" %putwin) :int (win window) (filep :pointer)) +(defcfun ("getwin" %getwin) window (filep :pointer)) +(defcfun ("delay_output" %delay-output) :int (ms :int)) +(defcfun ("flushinp" %flushinp) :int) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/variables.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/variables.lisp new file mode 100644 index 0000000..3ce3621 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/variables.lisp @@ -0,0 +1,27 @@ +(in-package :de.anvi.ncurses) + +;;; variables +;;; curses global variables +;;; http://invisible-island.net/ncurses/man/curs_variables.3x.html +;;; http://h71000.www7.hp.com/doc/83final/5763/5763pro_016.html + +;;; Low-level C global variables + +;; int COLOR_PAIRS; +;; int COLORS; +;; int COLS; +;; int ESCDELAY; +;; int LINES; +;; int TABSIZE; +;; WINDOW * curscr; +;; WINDOW * newscr; +;; WINDOW * stdscr; + +;;; Lisp read-only global constants. + +(defcvar ("COLOR_PAIRS" %COLOR-PAIRS :read-only t) :int) +(defcvar ("COLORS" %COLORS :read-only t) :int) +(defcvar ("COLS" %COLS :read-only t) :int) +(defcvar ("ESCDELAY" %ESCDELAY :read-only t) :int) +(defcvar ("LINES" %LINES :read-only t) :int) +(defcvar ("TABSIZE" %TABSIZE :read-only t) :int) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/window.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/window.lisp new file mode 100644 index 0000000..1b8bc62 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/window.lisp @@ -0,0 +1,36 @@ +(in-package :de.anvi.ncurses) + +;;; window +;;; create curses windows +;;; http://invisible-island.net/ncurses/man/curs_window.3x.html +;;; http://www.manpagez.com/man/3/newwin/ + +;;; C prototypes + +;; WINDOW *newwin(int nlines, int ncols, int begin_y, int begin_x); +;; int delwin(WINDOW *win); +;; int mvwin(WINDOW *win, int y, int x); +;; WINDOW *subwin(WINDOW *orig, int nlines, int ncols, int begin_y, int begin_x); +;; WINDOW *derwin(WINDOW *orig, int nlines, int ncols, int begin_y, int begin_x); +;; int mvderwin(WINDOW *win, int par_y, int par_x); +;; WINDOW *dupwin(WINDOW *win); + +;; void wsyncup(WINDOW *win); +;; int syncok(WINDOW *win, bool bf); +;; void wcursyncup(WINDOW *win); +;; void wsyncdown(WINDOW *win); + +;;; Low-level CFFI wrappers + +(defcfun ("newwin" %newwin) window (nlines :int) (ncols :int) (begin_y :int) (begin_x :int)) +(defcfun ("delwin" %delwin) :int (win window)) +(defcfun ("mvwin" %mvwin) :int (win window) (y :int) (x :int)) +(defcfun ("subwin" %subwin) window (orig window) (nlines :int) (ncols :int) (begin_y :int) (begin_x :int)) +(defcfun ("derwin" %derwin) window (orig window) (nlines :int) (ncols :int) (begin_y :int) (begin_x :int)) +(defcfun ("mvderwin" %mvderwin) :int (win window) (par_y :int) (par_x :int)) +(defcfun ("dupwin" %dupwin) window (win window)) + +(defcfun ("wsyncup" %wsyncup) :void (win window)) +(defcfun ("syncok" %syncok) :int (win window) (bf :boolean)) +(defcfun ("wcursyncup" %wcursyncup) :void (win window)) +(defcfun ("wsyncdown" %wsyncdown) :void (win window)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/wresize.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/wresize.lisp new file mode 100644 index 0000000..b12c5a8 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/ncurses/wresize.lisp @@ -0,0 +1,13 @@ +(in-package :de.anvi.ncurses) + +;;; wresize +;;; resize a curses window +;;; http://invisible-island.net/ncurses/man/wresize.3x.html + +;;; C prototypes + +;; int wresize(WINDOW *win, int lines, int columns); + +;;; Low-level CFFI wrappers + +(defcfun ("wresize" %wresize) :int (win window) (lines :int) (columns :int)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/add_wch.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/add_wch.lisp new file mode 100644 index 0000000..3eba6bb --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/add_wch.lisp @@ -0,0 +1,239 @@ +(in-package :de.anvi.croatoan) + +(defun add-wide-char-utf-8 (window char &key attributes color-pair y x position n) + "Add the wide (multi-byte) char to the window, then advance the cursor. + +If the position coordinates y (row) and x (column) are given, move the +cursor to the position first and then add the character. + +The position can also be passed in form of a two-element list. + +If n is given, write n chars. If n is -1, as many chars will be added +as will fit on the line." + (when (and y x) (move window y x)) + (when position (apply #'move window position)) + (let ((count (if n + (if (= n -1) + (distance-to-eol window) + n) + 1)) + (code-point (typecase char + (integer char) + (character (char-code char))))) + (typecase char + (complex-char + ;; if we have a complex char, use its own attributes and colors. + (loop repeat count do + (mapc #'(lambda (ch) (add-char window ch :attributes (attributes char) :color-pair (color-pair char))) + (unicode-to-utf-8 (char-code (simple-char char)))))) + ;; if we have a lisp char or an integer, use the attributes and colors passed as arguments. + (t + (loop repeat count do + (mapc #'(lambda (ch) (add-char window ch :attributes attributes :color-pair color-pair)) + (unicode-to-utf-8 code-point))))))) + +;; we can use this for add-wide-char, echo-wide-char, insert-wide-char, set-wide-background-char +(defun funcall-make-cchar_t-ptr (fn winptr char attr_t color-pair-number count) + "Create a cchar_t and apply function fn count times to winptr and cchar_t. + +cchar_t is a C struct representing a wide complex-char in ncurses. + +This function is a wrapper around %setcchar and should not be used elsewhere." + (with-foreign-objects ((ptr '(:struct cchar_t)) + (wch 'wchar_t 5)) + (dotimes (i 5) (setf (mem-aref wch 'wchar_t i) 0)) + (setf (mem-aref wch 'wchar_t) char) + (%setcchar ptr wch attr_t color-pair-number (null-pointer)) + (if (= count 1) + (funcall fn winptr ptr) + (dotimes (i count) (funcall fn winptr ptr)) ))) + +(defun funcall-make-cchar_t (fn window char attributes color-pair n) + "Assemble a cchar_t out of a char, attributes and a color-pair. + +Then apply the fn to window and the assembled cchar_t. + +char can be a lisp character, an ACS keyword, an integer code point or +a complex char. + +attributes should be a list of valid attribute keywords. + +color-pair should be a list of a foreground and background color keyword. + +attributes and color-pair can be nil. + +If char is a complex char, attributes and color-pair are ignored." + (let ((winptr (winptr window)) + (ch + (typecase char + ;; if we have a lisp char or an integer, use the attributes and colors passed as arguments. + (integer char) + (character (char-code char)) + (keyword (wacs char)) + ;; if we have a complex char, use its own attributes and colors. + (complex-char (if (simple-char char) + (let ((sch (simple-char char))) + (typecase sch + (integer sch) + (character (char-code sch)) + (keyword (wacs sch)) + (otherwise (error "unknown character type")))) + ;; this means that the default simple char is space, otherwise + ;; we can not set complex background chars. + ;; TODO: set this here or as initform for complex-char? + 32)) + (otherwise (error "unknown character type")))) + (attr_t + (typecase char + (complex-char (attrs2chtype (attributes char))) + (otherwise (attrs2chtype attributes)))) + ;; we just need the pair number here, NOT the bit-shifted color attribute. + ;; we need the color attribute for chtypes. + (color-pair-number + (if (or (eq fn #'%wbkgrnd) + (eq fn #'%wbkgrndset)) + ;; when setting the background, do not complete using the windows color pair and background + ;; just complete from the default pair + (pair-to-number (complete-default-pair (typecase char + (complex-char (color-pair char)) + (otherwise color-pair)))) + ;; for every other function, complete from the full sequence + (pair-to-number (complete-pair window (typecase char + (complex-char (color-pair char)) + (otherwise color-pair)))))) + (count (if n + (if (= n -1) + (distance-to-eol window) + n) + 1))) + ;; After the parameters are assembled, call the lower-level function that actually + ;; uses %setcchar to create a cchar_t pointer and passes it to fn. + (funcall-make-cchar_t-ptr fn winptr ch attr_t color-pair-number count))) + +(defun add-wide-char (window char &key attributes fgcolor bgcolor color-pair style y x position n) + "Add the wide (multi-byte) char to the window, then advance the cursor. + +If the position coordinates y (row) and x (column) are given, move the +cursor to the position first and then add the character. + +The position can also be passed in form of a two-element list. + +If n is given for a char, write n chars. If n is -1, add as many chars +as will fit on the line. + +If char is a complex-char, its own style overrides any style parameters. + +If a style is passed, it overrides attributes and color-pair." + (when (and y x) (move window y x)) + (when position (apply #'move window position)) + (let ((attributes (if style + (getf style :attributes) + attributes)) + (color-pair (cond (style + (list (getf style :fgcolor) (getf style :bgcolor))) + ((or fgcolor bgcolor) + (list fgcolor bgcolor)) + (t color-pair)))) + (funcall-make-cchar_t #'%wadd-wch window char attributes color-pair n))) + +(defun echo-wide-char (window char &key attributes fgcolor bgcolor color-pair style y x position) + "Add one wide (multi-byte) character to the window, then refresh the window. + +If the position coordinates y (row) and x (column) are given, move the +cursor to the position first and then add the character. + +The position can also be passed in form of a two-element list. + +The only difference to add-wide-char and a subsequent refresh is a +performance gain if we know that we only need to output a single +character." + (when (and y x) (move window y x)) + (when position (apply #'move window position)) + (let ((count 1) + ;; for some reason, there is a special echo function for pads. + (fn (typecase window + (pad #'%pecho-wchar) + (window #'%wecho-wchar))) + (attributes (if style + (getf style :attributes) + attributes)) + (color-pair (cond (style + (list (getf style :fgcolor) (getf style :bgcolor))) + ((or fgcolor bgcolor) + (list fgcolor bgcolor)) + (t color-pair)))) + (funcall-make-cchar_t fn window char attributes color-pair count))) + +;; wide-char equivalents of the ACS chars. +;; since reading _nc_wacs doesnt work like it worked with acs_map, +;; plan B is a direct translation from ACS names to unicode code points. +;; source for the codes is ncurses/widechar/lib_wacs.c +(defparameter wide-acs-alist + ;; VT100 symbols + '(( :upper-left-corner . #x250C ) ; #\BOX_DRAWINGS_LIGHT_DOWN_AND_RIGHT / 0xE2 0x94 0x8C + ( :lower-left-corner . #x2514 ) ; #\BOX_DRAWINGS_LIGHT_UP_AND_RIGHT / 0xE2 0x94 0x94 + ( :upper-right-corner . #x2510 ) ; #\BOX_DRAWINGS_LIGHT_DOWN_AND_LEFT / 0xE2 0x94 0x90 + ( :lower-right-corner . #x2518 ) ; #\BOX_DRAWINGS_LIGHT_UP_AND_LEFT / 0xE2 0x94 0x98 + ( :tee-pointing-left . #x2524 ) ; #\BOX_DRAWINGS_LIGHT_VERTICAL_AND_LEFT / 0xE2 0x94 0xA5 + ( :tee-pointing-right . #x251C ) ; #\BOX_DRAWINGS_LIGHT_VERTICAL_AND_RIGHT / 0xE2 0x94 0x9C + ( :tee-pointing-up . #x2534 ) ; #\BOX_DRAWINGS_LIGHT_UP_AND_HORIZONTAL / 0xE2 0x94 0xB4 + ( :tee-pointing-down . #x252C ) ; #\BOX_DRAWINGS_LIGHT_DOWN_AND_HORIZONTAL / 0xE2 0x94 0xAC + ( :horizontal-line . #x2500 ) ; #\BOX_DRAWINGS_LIGHT_HORIZONTAL / 0xE2 0x94 0x80 + ( :vertical-line . #x2502 ) ; #\BOX_DRAWINGS_LIGHT_VERTICAL / 0xE2 0x94 0x82 + ( :crossover-plus . #x253C ) ; #\BOX_DRAWINGS_LIGHT_VERTICAL_AND_HORIZONTAL / 0xE2 0x94 0xBC + + ( :scan-line-1 . #x23BA ) ; #\HORIZONTAL_SCAN_LINE-1 / 0xE2 0x8E 0xBA + ( :scan-line-9 . #x23BD ) ; #\HORIZONTAL_SCAN_LINE-9 / 0xE2 0x8E 0xBD + ( :diamond-symbol . #x25C6 ) ; #\BLACK_DIAMOND / 0xE2 0x97 0x86 + ( :checker-board . #x2592 ) ; #\MEDIUM_SHADE / 0xE2 0x96 0x92 + ( :degree-symbol . #x00B0 ) ; #\DEGREE_SIGN / 0xC2 0xB0 + ( :plus-minus . #x00B1 ) ; #\PLUS-MINUS_SIGN / 0xC2 0xB1 + ( :bullet-symbol . #x00B7 ) ; #\MIDDLE_DOT / 0xC2 0xB7 + + ;; Teletype 5410v1 symbols + ( :arrow-pointing-left . #x2190 ) ; #\LEFTWARDS_ARROW / 0xE2 0x86 0x90 + ( :arrow-pointing-right . #x2192 ) ; #\RIGHTWARDS_ARROW / 0xE2 0x86 0x92 + ( :arrow-pointing-down . #x2193 ) ; #\DOWNWARDS_ARROW / 0xE2 0x86 0x93 + ( :arrow-pointing-up . #x2191 ) ; #\UPWARDS_ARROW / 0xE2 0x86 0x91 + ( :board . #x2592 ) ; #\MEDIUM_SHADE / 0xE2 0x96 0x92 + ( :lantern-symbol . #x2603 ) ; #\SNOWMAN / 0xE2 0x98 0x83 + ( :solid-square-block . #x25AE ) ; #\BLACK_VERTICAL_RECTANGLE / 0xE2 0x96 0xAE + + ;; ncurses characters + ( :scan-line-3 . #x23BB ) ; #\HORIZONTAL_SCAN_LINE-3 / 0xE2 0x8E 0xBB + ( :scan-line-7 . #x23BC ) ; #\HORIZONTAL_SCAN_LINE-7 / 0xE2 0x8E 0xBC + ( :less-than-or-equal . #x2264 ) ; #\LESS-THAN_OR_EQUAL_TO / 0xE2 0x89 0xA4 + ( :greater-than-or-equal . #x2265 ) ; #\GREATER-THAN_OR_EQUAL_TO / 0xE2 0x89 0xA5 + ( :pi . #x03C0 ) ; #\GREEK_SMALL_LETTER_PI / 0xCF 0x80 + ( :not-equal . #x2260 ) ; #\NOT_EQUAL_TO / 0xE2 0x89 0xA0 + ( :uk-pound-sterling . #x00A3 ) ; #\POUND_SIGN / 0xC2 0xA3 + + ;; thick line drawing characters + ( :thick-upper-left-corner . #x250F ) ; #\BOX_DRAWINGS_HEAVY_DOWN_AND_RIGHT / 0xE2 0x94 0x8F + ( :thick-lower-left-corner . #x2517 ) ; #\BOX_DRAWINGS_HEAVY_UP_AND_RIGHT / 0xE2 0x94 0x97 + ( :thick-upper-right-corner . #x2513 ) ; #\BOX_DRAWINGS_HEAVY_DOWN_AND_LEFT / 0xE2 0x94 0x93 + ( :thick-lower-right-corner . #x251B ) ; #\BOX_DRAWINGS_HEAVY_UP_AND_LEFT / 0xE2 0x94 0x9B + ( :thick-tee-pointing-left . #x2523 ) ; #\BOX_DRAWINGS_HEAVY_VERTICAL_AND_LEFT / 0xE2 0x94 0xA3 + ( :thick-tee-pointing-right . #x252B ) ; #\BOX_DRAWINGS_HEAVY_VERTICAL_AND_RIGHT / 0xE2 0x94 0xAB + ( :thick-tee-pointing-up . #x253B ) ; #\BOX_DRAWINGS_HEAVY_UP_AND_HORIZONTAL / 0xE2 0x94 0xBB + ( :thick-tee-pointing-down . #x2533 ) ; #\BOX_DRAWINGS_HEAVY_DOWN_AND_HORIZONTAL / 0xE2 0x94 0xB3 + ( :thick-horizontal-line . #x2501 ) ; #\BOX_DRAWINGS_HEAVY_HORIZONTAL / 0xE2 0x94 0x81 + ( :thick-vertical-line . #x2503 ) ; #\BOX_DRAWINGS_HEAVY_VERTICAL / 0xE2 0x94 0x83 + ( :thick-crossover-plus . #x254B ) ; #\BOX_DRAWINGS_HEAVY_VERTICAL_AND_HORIZONTAL / 0xE2 0x95 0x8B + + ;; double-line drawing characters + ( :double-upper-left-corner . #x2554 ) ; #\BOX_DRAWINGS_DOUBLE_DOWN_AND_RIGHT / 0xE2 0x95 0x94 + ( :double-lower-left-corner . #x255A ) ; #\BOX_DRAWINGS_DOUBLE_UP_AND_RIGHT / 0xE2 0x95 0x9A + ( :double-upper-right-corner . #x2557 ) ; #\BOX_DRAWINGS_DOUBLE_DOWN_AND_LEFT / 0xE2 0x95 0x97 + ( :double-lower-right-corner . #x255D ) ; #\BOX_DRAWINGS_DOUBLE_UP_AND_LEFT / 0xE2 0x95 0x9D + ( :double-tee-pointing-left . #x2563 ) ; #\BOX_DRAWINGS_DOUBLE_VERTICAL_AND_LEFT / 0xE2 0x95 0xA3 + ( :double-tee-pointing-right . #x2560 ) ; #\BOX_DRAWINGS_DOUBLE_VERTICAL_AND_RIGHT / 0xE2 0x95 0xA0 + ( :double-tee-pointing-up . #x2569 ) ; #\BOX_DRAWINGS_DOUBLE_UP_AND_HORIZONTAL / 0xE2 0x95 0xA9 + ( :double-tee-pointing-down . #x2566 ) ; #\BOX_DRAWINGS_DOUBLE_DOWN_AND_HORIZONTAL / 0xE2 0x95 0xA6 + ( :double-horizontal-line . #x2550 ) ; #\BOX_DRAWINGS_DOUBLE_HORIZONTAL / 0xE2 0x95 0x90 + ( :double-vertical-line . #x2551 ) ; #\BOX_DRAWINGS_DOUBLE_VERTICAL / 0xE2 0x95 0x91 + ( :double-crossover-plus . #x256C ))) ; #\BOX_DRAWINGS_DOUBLE_VERTICAL_AND_HORIZONTAL / 0xE2 0x95 0xAC + +(defun wacs (char-name) + "Take a keyword symbol, return the wide unicode integer representing the ACS char." + (cdr (assoc char-name wide-acs-alist))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/addch.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/addch.lisp new file mode 100644 index 0000000..a237026 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/addch.lisp @@ -0,0 +1,230 @@ +(in-package :de.anvi.croatoan) + +;; (add scr #\a :y 10 :x 10) +;; (add scr "b" :y 11 :x 10) +;; (add scr #\a :y 10 :x 10 :attributes '(:underline) :color-pair '(:yellow :red)) +;; (add scr "bat" :y 11 :x 10 :attributes '(:underline :bold) :color-pair '(:black :green)) +;; (add scr #\a :position (list 10 10)) + +(defun add (window object &rest keys &key &allow-other-keys) + "Add the text object to the window, then advance the cursor. + +Currently supported text objects are characters (simple and complex), +characters given by integer codes or keywords, and strings +(simple and complex). + +If the position coordinates y (row) and x (column) are given, move the +cursor to the position first and then add the object. + +The position can also be passed in form of a two-element list. + +If n is given for a char, write n chars. If n is -1, add as many chars +as will fit on the line. + +If n is given for a string, add at most n chars from the string. +If n is -1, add as many chars from the string as will fit on the line." + (let ((fn (typecase object + ((or string complex-string) + #'add-string) + ((or integer keyword character complex-char) + #'add-wide-char)))) + (apply fn window object keys))) + +(defun distance-to-eol (window) + "Return the number of columns from the cursor position to the end of the line in the window." + (- (width window) (cadr (cursor-position window)))) + +(defun distance-to-bottom (window) + "Return the number of lines from the cursor position to the bottom of the window." + (- (height window) (car (cursor-position window)))) + +(defun add-char (window char &key attributes fgcolor bgcolor color-pair style y x position n) + "Add the narrow (single-byte) char to the window, then advance the cursor. + +If the position coordinates y (row) and x (column) are given, move the +cursor to the position first and then add the character. + +The position can also be passed in form of a two-element list. + +If n is given for a char, write n chars. If n is -1, add as many chars +as will fit on the line. + +Example: (add-char scr #\a :attributes '(:bold) :color-pair '(:red :yellow))" + (when (and y x) (move window y x)) + (when position (apply #'move window position)) + (let ((attributes (if style + (getf style :attributes) + attributes)) + (color-pair (cond (style + (list (getf style :fgcolor) (getf style :bgcolor))) + ((or fgcolor bgcolor) + (list fgcolor bgcolor)) + (t color-pair)))) + (funcall-make-chtype #'%waddch window char attributes color-pair n))) + +;; At the moment, echo is just a wrapper for echo-wide-char. +(defun echo (window char &rest keys &key &allow-other-keys) + "Add one character to the window, then advance the cursor. + +If the position coordinates y (row) and x (column) are given, move the +cursor to the position first and then add the character. + +The position can also be passed in form of a two-element list. + +If n is given for a char, write n chars. If n is -1, add as many chars +as will fit on the line. + +If char is a complex-char, its own style overrides any style parameters. + +If a style is passed, it overrides attributes and color-pair." + (apply #'echo-wide-char window char keys)) + +(defun echo-char (window char &key attributes fgcolor bgcolor color-pair style y x position) + "Add one narrow (single-byte) character to the window, then refresh the window. + +If the position coordinates y (row) and x (column) are given, move the +cursor to the position first and then echo the character. + +The position can also be passed in form of a two-element list. + +The only difference to add-char and a subsequent refresh is a +performance gain if we know that we only need to output a single +character." + (when (and y x) (move window y x)) + (when position (apply #'move window position)) + (let ((count 1) + (fn (typecase window + ;; a pad is a subclass of window, therefore we have to check pad first. + (pad #'%pechochar) + (window #'%wechochar))) + (attributes (if style + (getf style :attributes) + attributes)) + (color-pair (cond (style + (list (getf style :fgcolor) (getf style :bgcolor))) + ((or fgcolor bgcolor) + (list fgcolor bgcolor)) + (t color-pair)))) + (funcall-make-chtype fn window char attributes color-pair count))) + +;; just an utility function if you dont want to use (format nil "bla +;; bla ~%") to insert newlines. in C you can simply insert \n. +(defun new-line (window &optional (count 1)) + "Insert count newline characters into window." + (loop repeat count do (add-char window (char-code #\newline)))) + +;; pointer to the global/external c acs array, acs_map[]. +;; also see defcvar + get-var-pointer +(defparameter acs-map-array (foreign-symbol-pointer "acs_map")) + +;; ncurses maps those standard chars at runtime to the acs characters. +;; here we use it in the function acs. +(defparameter acs-alist + ;; VT100 symbols + '(( :upper-left-corner . #\l ) + ( :lower-left-corner . #\m ) + ( :upper-right-corner . #\k ) + ( :lower-right-corner . #\j ) + ( :tee-pointing-left . #\u ) + ( :tee-pointing-right . #\t ) + ( :tee-pointing-up . #\v ) + ( :tee-pointing-down . #\w ) + ( :horizontal-line . #\q ) + ( :vertical-line . #\x ) + ( :crossover-plus . #\n ) + + ( :scan-line-1 . #\o ) + ( :scan-line-9 . #\s ) + ( :diamond-symbol . #\` ) + ( :checker-board . #\a ) + ( :degree-symbol . #\f ) + ( :plus-minus . #\g ) + ( :bullet-symbol . #\~ ) + + ;; Teletype 5410v1 symbols + ( :arrow-pointing-left . #\, ) + ( :arrow-pointing-right . #\+ ) + ( :arrow-pointing-down . #\. ) + ( :arrow-pointing-up . #\- ) + ( :board . #\h ) + ( :lantern-symbol . #\i ) + ( :solid-square-block . #\0 ) + + ;; ncurses characters + ( :scan-line-3 . #\p ) + ( :scan-line-7 . #\r ) + ( :less-than-or-equal . #\y ) + ( :greater-than-or-equal . #\z ) + ( :pi . #\{ ) + ( :not-equal . #\| ) + ( :uk-pound-sterling . #\} ) + + ;; thick line drawing characters + ( :thick-upper-left-corner . #\L ) + ( :thick-lower-left-corner . #\M ) + ( :thick-upper-right-corner . #\K ) + ( :thick-lower-right-corner . #\J ) + ( :thick-tee-pointing-left . #\U ) + ( :thick-tee-pointing-right . #\T ) + ( :thick-tee-pointing-up . #\V ) + ( :thick-tee-pointing-down . #\W ) + ( :thick-horizontal-line . #\Q ) + ( :thick-vertical-line . #\X ) + ( :thick-crossover-plus . #\N ) + + ;; double-line drawing characters + ( :double-upper-left-corner . #\C ) + ( :double-lower-left-corner . #\D ) + ( :double-upper-right-corner . #\B ) + ( :double-lower-right-corner . #\A ) + ( :double-tee-pointing-left . #\G ) + ( :double-tee-pointing-right . #\F ) + ( :double-tee-pointing-up . #\H ) + ( :double-tee-pointing-down . #\I ) + ( :double-horizontal-line . #\R ) + ( :double-vertical-line . #\Y ) + ( :double-crossover-plus . #\E ))) + +#| + +For 64bit builds of ncurses 6.0, chtype is an unsigned int: + +#if 1 && defined(_LP64) +typedef unsigned chtype; +typedef unsigned mmask_t; +#else +typedef uint32_t chtype; +typedef uint32_t mmask_t; +#endif + +For 64bit builds of ncurses 5.9, chtype is an unsigned long: + +#if 0 && defined(_LP64) +typedef unsigned chtype; +typedef unsigned mmask_t; +#else +typedef unsigned long chtype; +typedef unsigned long mmask_t; +#endif + +acs_map[] is an chtype array: + +#if 0 || NCURSES_REENTRANT +NCURSES_WRAPPED_VAR(chtype*, acs_map); +#define acs_map NCURSES_PUBLIC_VAR(acs_map()) +#else +extern NCURSES_EXPORT_VAR(chtype) acs_map[]; +#endif + +|# + +;; ACS, the alternative/extended character set for line drawing. +;; Used by functions: add-char, box and border. +;; +;; * http://www.melvilletheatre.com/articles/ncurses-extended-characters/index.html +;; * http://tldp.org/HOWTO/NCURSES-Programming-HOWTO/misc.html +;; +;; Example: (acs 'ULCORNER) +(defun acs (char-name) + "Take a symbol, return the integer representing the acs char." + (mem-aref acs-map-array 'chtype (char-code (cdr (assoc char-name acs-alist))))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/addstr.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/addstr.lisp new file mode 100644 index 0000000..c87ce31 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/addstr.lisp @@ -0,0 +1,42 @@ +(in-package :de.anvi.croatoan) + +(defun add-string (window string &key attributes fgcolor bgcolor color-pair style y x position n) + "Add the unrendered string to the window. + +If n is given, add at most n chars from the string. If n is -1, as +many chars will be added that will fit on the line. + +If the position coordinates y (row) and x (column) are given, move the +cursor to the position first and then add the object. + +The position can also be passed in form of a two-element list." + (when (and y x) (move window y x)) + (when position (apply #'move window position)) + (let ((count (if n + (if (= n -1) + (- (width window) (cadr (cursor-position window))) + n) + ;; we cant use length to determine the length of a complex string + ;; because it is not a sequence. + (typecase string + (string (length string)) + (complex-string (length (complex-char-array string))))))) + (typecase string + (string + ;;(if (or attributes fgcolor bgcolor color-pair style) + ;; lisp string combined with attributes and colors + (loop + repeat count + for ch across string + do (add-wide-char window ch :attributes attributes :fgcolor fgcolor :bgcolor bgcolor + :color-pair color-pair :style style)) ) + ;; simple lisp string, no attributes or colors + ;; TODO 190826 we dont want to use this because we want to force color-set and bkgd to use separate colors + ;;(if n + ;; (%waddnstr (winptr window) string n) + ;; (%waddstr (winptr window) string)))) + (complex-string + (loop + repeat count + for ch across (complex-char-array string) + do (add-wide-char window ch)))))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/attr.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/attr.lisp new file mode 100644 index 0000000..8d0f460 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/attr.lisp @@ -0,0 +1,501 @@ +(in-package :de.anvi.croatoan) + +(defparameter *ansi-color-list* + '(:black :red :green :yellow :blue :magenta :cyan :white)) + +;; this list should be in color.lisp, not here. +;; but attr.lisp is loaded before color.lisp. +(defparameter *xterm-color-name-list* + '(:black :maroon :green :olive :navy :purple :teal :silver + :gray :red :lime :yellow :blue :magenta :cyan :white)) + +(defparameter *default-color-pair* nil) + +;; do not use the color alist but the two color lists, for 8 and 256 colors +;; in the 256 colors mode, only the first 16 colors are named. +;; the terminal default colors are only available when +;; the screen is initialized with :use-terminal-colors t +;; the :terminal color number is -1. +(defun color-name-to-number (color-name) + "Take a keyword denoting a color name, return the color number." + (let* ((name (cond ((eq color-name :default-fg) + (car *default-color-pair*)) + ((eq color-name :default-bg) + (cadr *default-color-pair*)) + (t color-name))) + ;; generate an alist of colors in the form ((:terminal . -1) (:black . 0) ...) + ;; depending on whether we use 8 or 256 colors, we have different names for the same color numbers. + (alist (if (<= %colors 8) + (loop + for i from -1 to 7 + for j in (cons :terminal *ansi-color-list*) + collect (cons j i)) + (loop + for i from -1 to 15 + for j in (cons :terminal *xterm-color-name-list*) + collect (cons j i)))) + (number (cdr (assoc name alist)))) + (if number + number + (error "color-name-to-number: color name ~A does not exist." name)))) + +;; address a color by: +;; integer: color number 0-255, so we can cycle through all available colors +;; keyword: it doesnt exist for all 256 colors +;; string: "#ff00ff" hex triplet in web-notation. string-length = 7, first char = # + +;; a color can also be given as a list, where the first element is a keyword +;; denoting the coding scheme. + +;; (:number 255) +;; (:name :black) +;; (:hex #xff00ff) +;; TODO: (:hex "#ff00ff") +;; TODO: (:rgb 255 00 255) +;; TODO: (:hsv 10 15 245) + +;; TODO: naming conflict with color->number +;; after we can convert everything to a color number, add this function to +;; pair-to-number, so we can generate a color pair out of every color notation. +(defun color-to-number (color) + "Takes a color in various notations, converts that notation to the exact or most appropriate color number." + (typecase color + ;; hex rgb code + ;; we cant use hex codes when in 8-color ansi mode, because the 8 ansi colors + ;; are only defined by names, not by rgb color contents. + (integer (hex-to-sgr color)) + ;; color name, for now ONLY the first 8 ansi colors and 16 web colors + ;; TODO: expand to all x11 color names + (keyword (color-name-to-number color)) + ;; a list in the form of (:type value). + (list + (let ((type (car color)) + (val (cadr color))) + (case type + ;; direct input of the color number, just return it. + (:number val) + ;; keyword denoting the color name + (:name (color-name-to-number color)) + (:hex + (typecase val + ;; hex rgb notation, for example (:hex #x00ff00) + (integer (hex-to-sgr color))))))))) + +;; keys are 2 element lists of the form: (:fgcolor :bgcolor) +;; fgcolor and bgcolor are keyword symbols +;; vals are integers that represent ncurses color pairs. +;; only one color pair, 0, is predefined: (:default :default), +;; which is identical to (:white :black) if use-terminal-colors is nil. +;; if use-terminal-colors is t, it is whatever color pair the terminal +;; used before the ncurses init. +;; TODO: this also could be a hashmap +;; TODO: move this to be a screen variable, so it gets reset on every screen init +;; for now it is reset to nil on evey screen init by set-default-color-pair +(defparameter *color-pair-alist* nil) + +(defun use-terminal-colors-p (screen) + (slot-value screen 'use-terminal-colors-p)) + +(defun (setf use-terminal-colors-p) (flag screen) + (setf (slot-value screen 'use-terminal-colors-p) flag) + (if flag + (progn + (%use-default-colors) + (setf (default-color-pair screen) (list :terminal :terminal))) + (setf (default-color-pair screen) (list :white :black)))) + +(defun default-color-pair (screen) + (declare (ignore screen)) + *default-color-pair*) + +(defun (setf default-color-pair) (color-pair screen) + "Set the colors which will comprise the default color pair 0. + +The default color pair is used when no other colors are specified. + +The ncurses default color pair is white on black. + +If the terminal can set its own colors, they are named :terminal." + (setf *default-color-pair* color-pair) + (%assume-default-colors (color-name-to-number (car color-pair)) + (color-name-to-number (cadr color-pair)))) + +;; called from initialize-instance :after ((scr screen) +;; test with t09a +(defun set-default-color-pair (use-terminal-colors-p) + ;; reset the color pair alist on every screen init + (setf *color-pair-alist* nil) + (if use-terminal-colors-p + (progn + (%use-default-colors) + (setf *default-color-pair* (list :terminal :terminal))) + (setf *default-color-pair* (list :white :black))) + ;; we cant make :white :black be pair 0, because pair 0 is ignored on several occasions + ;; Example: when color-pair of a window is set to pair 1 + ;; adding a char with 0 is ignored and the char is added with pair 1. + ;; we have to add white on black as a number bigger than 0. + (setf *color-pair-alist* (acons '(:default-fg :default-bg) 0 *color-pair-alist*))) + +(defun pair-to-number (pair) + "Take a two-element list of colors, return the ncurses pair number. + +The colors can be keywords or numbers -1:255. + +-1 is the :terminal default color when use-terminal-colors-p is t. + +If it is a new color pair, add it to ncurses, then return the new pair number. + +If the pair already exists, return its pair number. + +If pair is nil, return the default color number, 0. + +Example: + +(pair-to-number '(:white :black)) => 0" + (if pair + (let ((result (assoc pair *color-pair-alist* :test #'equal))) + (if result + ;; if the entry already exists, just return the pair number. + (cdr result) + ;; if the pair doesnt exist, create a new pair number + (let ((new-pair-number (list-length *color-pair-alist*))) + ;; add it to the alist first. + (setf *color-pair-alist* (acons pair new-pair-number *color-pair-alist*)) + ;; then add it to ncurses. + (let ((fg (car pair)) + (bg (cadr pair))) + (%init-pair new-pair-number (color-to-number fg) (color-to-number bg))) + ;; return the newly added pair number. + new-pair-number))) + ;; If pair is nil, return the default color number, 0. + 0)) + +;; TODO: cross check with the ncurses primitives that we get the same result. +;; TODO: number-to-pair +(defun number-to-pair (number) + "Take a pair number, return a color pair in a 2 element list of keywords." + (car (rassoc number *color-pair-alist*))) + +;; We cant run complete-pair here, because we dont have the window. +;; we have to run complete-pair within add-char, add-wide-char, etc. +(defun complete-default-pair (color-pair) + "Take a color pair possibly containing nil, return a pair completed from the default color pair 0." + (let ((fg (car color-pair)) + (bg (cadr color-pair)) + (default-pair (number-to-pair 0))) + (cond + ;; when both colors are given, just return the original pair + ((and color-pair fg bg) color-pair) + + ;; when the pair is nil or when both colors are missing + ((or (null color-pair) + (and (null fg) (null bg))) + ;; just return the default pair + default-pair) + + ;; when only the bg is missing, complete the bg + ((null bg) + (list fg (cadr default-pair))) + + ;; when only the fg is missing, complete the fg + ((null fg) + (list (car default-pair) bg))))) + +(defun complete-pair (window pair) + "If either the foreground or background color is nil, complete the pair for the given window. + +Return the completed pair. + +Try to complete the missing colors in the following order: + +1. window color pair. +2. window background character color pair. +3. ncurses default color pair 0 (white on black or the terminal default color pair)." + (let ((fg (car pair)) + (bg (cadr pair))) + (cond + ;; when both colors are given, just return the original pair + ((and pair fg bg) pair) + + ;; when the pair is nil or when both colors are missing + ((or (null pair) + (and (null fg) (null bg))) + (cond + ((color-pair window) + ;; if color pair exists, but is not complete, complete it recursively in a second step. + ;; if we have fg from color pair, and a bg from background, they will be combined. + (complete-pair window (color-pair window))) + ((and (background window) + (color-pair (background window))) + (complete-pair window (color-pair (background window)))) + (t (number-to-pair 0)))) + + ;; when only the bg is missing, complete the bg + ((null bg) + (cond + ((cadr (color-pair window)) + (list fg (cadr (color-pair window)))) + ((and (background window) + (cadr (color-pair (background window)))) + (list fg (cadr (color-pair (background window))))) + (t + (list fg (cadr (number-to-pair 0)))))) + + ;; when only the fg is missing, complete the fg + ((null fg) + (cond + ((car (color-pair window)) + (list (car (color-pair window)) bg)) + ((and (background window) + (car (color-pair (background window)))) + (list (car (color-pair (background window))) bg)) + (t + (list (car (number-to-pair 0)) bg)))) ))) + +;; TODO: use %wattr_on instead of %wattron, also for get and set +(defun add-attributes (win attributes) + "Takes a list of keywords and turns the appropriate attributes on." + (dolist (i attributes) + (setf (attributes win) (adjoin i (attributes win))) + (%wattron (winptr win) (get-bitmask i)))) + +(defun remove-attributes (win attributes) + "Takes a list of keywords and turns the appropriate attributes off." + (dolist (i attributes) + (setf (attributes win) (remove i (attributes win))) + (%wattroff (winptr win) (get-bitmask i)))) + +;; (set-attributes scr '(:bold :underline)) +;; set-attributes overwrites color settings because it treats color as an attribute. +;; thats why we wont use it directly. +(defun set-attributes (winptr attributes) + "Takes a list of keywords and sets the appropriate attributes. + +Overwrites any previous attribute settings including the color." + (%wattrset winptr + (apply #'logior (loop for i in attributes collect (get-bitmask i))))) + +;; (%wchgat (winptr win) 9 #x00040000 0 (null-pointer)) +(defun change-attributes (win n attributes &key color-pair y x position) + "Change the attributes of n chars starting at the current cursor position. + +If n is -1, as many chars will be added as will fit on the line. + +If the destination coordinates y and x are given, the attributes are changed +from the given point without moving the cursor position." + (when (and y x) (move win y x)) + (when position (apply #'move win position)) + (let ((attrs (attrs2chtype attributes)) + (pair-number (pair-to-number (complete-pair win color-pair)))) + (%wchgat (winptr win) n attrs pair-number (null-pointer)))) + +(defun set-color-pair (winptr color-pair) + "Sets the color attribute of the window only." + (%wcolor-set winptr + (pair-to-number (complete-default-pair color-pair)) + (null-pointer))) + +(defparameter *bitmask-alist* + ;; the first four are not attributes, but bitmasks used to extract parts of the chtype. + '((:normal . #x00000000) + (:attributes . #xffffff00) + (:chartext . #x000000ff) + (:color . #x0000ff00) + ;; we have 16 attributes that can be set. + ;; In general, only underline, bold and reverse are widely supported by terminals. + (:standout . #x00010000) + (:underline . #x00020000) + (:reverse . #x00040000) + (:blink . #x00080000) + (:dim . #x00100000) + (:bold . #x00200000) + (:altcharset . #x00400000) + (:invis . #x00800000) + (:protect . #x01000000) + (:horizontal . #x02000000) + (:left . #x04000000) + (:low . #x08000000) + (:right . #x10000000) + (:top . #x20000000) + (:vertical . #x40000000) + (:italic . #x80000000))) + +;; TODO: signal an error if passed an invalid attribute. +(defun get-bitmask (attribute) + "Returns an ncurses attr/chtype representing the attribute keyword." + (cdr (assoc attribute *bitmask-alist*))) + +(defparameter *valid-attributes* + '(:standout + :underline + :reverse + :blink + :dim + :bold + :altcharset + :invis + :protect + :horizontal + :left + :low + :right + :top + :vertical + :italic)) + +(defun chtype2attrs (ch) + "Take a chtype, return a list of used attribute keywords." + (loop + for i in *valid-attributes* + if (logtest ch (get-bitmask i)) collect i)) + +;; used in: make-chtype, change-attributes +(defun attrs2chtype (attrs) + "Take a list of attribute keywords, return a chtype with the attribute bits set." + (if attrs + ;; the attribute bitmasks already are bit-shifted to the correct position in the chtype + ;; we just need to OR them all together + (apply #'logior (mapcar #'get-bitmask attrs)) + ;; if the attribute list is nil, logior returns 0. + ;; but to emphasize intent, we explicitely return 0 if the attribute list is nil. + 0)) + +(defun colors2chtype (color-pair) + "Take a list of a color pair, return a chtype with the color attribute set." + (if color-pair + ;; convert the pair to an integer, then bit shift it by 8 + ;; right shift by 8 to get the color bits at their proper place in a chtype. + ;; you cannot simply logior the pair number because that would overwrite the char. + (ash (pair-to-number color-pair) 8) + 0)) + +;; usage: c2x, extract wide char, everywhere where number-to-pair is used. +;; first get the color attribute bits by log-AND-ing them with the ch. +;; then right shift them by 8 to extract the color pair short int from them. +;; then get the color pair (:white :black) associated with that number. +(defun chtype2colors (ch) + "Take a chtype or attr_t integer, return a list of two keywords denoting a color pair." + (number-to-pair (ash (logand ch (get-bitmask :color)) -8))) + +(defun char2chtype (char) + "Take a character in different forms, return a chtype containing that character." + (if char + (typecase char + ;; if the char is already an integer from char-code. + (integer char) + ;; alternative chars are given as keywords + ;; we use acs only when we produce chtypes, for cchar_t, we need wacs. + (keyword (acs char)) + ;; if it is a lisp char, convert it to an integer first + (character (char-code char)) + ;; if char is any other type, we dont handle it for now. + (otherwise (error "char2chtype: char is not integer, keyword or character."))) + 0)) + +;;; ------------------------------------------------------------------ + +(defun make-chtype (char attributes color-pair) + "Assemble a chtype out of a char, attributes and a color-pair. + +char can be a lisp character, an ACS keyword, or an integer code point. + +attributes should be a list of valid attribute keywords. + +color-pair should be a list of a foreground and background color keyword. + +attributes and color-pair can be nil. + +If char is a complex char, and the attributes and color-pair are passed, +they override the attributes and the color-of the complex char." + (typecase char + ;; x2c itself calls make-chtype + (complex-char (xchar2chtype char)) + ;; we first convert all three parameters to separate integers, + ;; then OR them together to create the chtype. + (otherwise (logior (char2chtype char) + (attrs2chtype attributes) + (colors2chtype color-pair))))) + +;; factor out count calculation and complete-pair +(defun funcall-make-chtype (fn window char attributes color-pair n) + "Assemble a chtype out of a char, attributes and a color-pair. + +Apply low-level ncurses function fn count times to window and chtype. + +chtype is a 32-bit integer representing a non-wide complex-char in ncurses. + +char can be a lisp character, an ACS keyword, an integer code point or +a complex char. + +attributes should be a list of valid attribute keywords. + +color-pair should be a list of a foreground and background color keyword. + +attributes and color-pair can be nil. + +If char is a complex char, attributes and color-pair are ignored." + (let ((winptr (winptr window)) + (count (if n + (if (= n -1) + (distance-to-eol window) + n) + 1)) + (chtype (make-chtype char attributes (complete-pair window color-pair)))) + (case count + (0 nil) + (1 (funcall fn winptr chtype)) + (otherwise (dotimes (i count) + (funcall fn winptr chtype)))))) + +;; Example: (xchar2chtype (chtype2xchar 2490466)) => 2490466 + +(defun xchar2chtype (ch) + "Convert a croatoan complex char to an integral ncurses chtype." + (make-chtype (simple-char ch) + (attributes ch) + (color-pair ch))) + +(defun chtype2xchar (ch) + "Converts a ncurses chtype to croatoan complex-char." + (make-instance 'complex-char + :simple-char (code-char (logand ch (get-bitmask :chartext))) + :attributes (loop for i in *valid-attributes* + if (logtest ch (get-bitmask i)) collect i) + ;; first get the color attribute bits by log-AND-ing them with ch. + ;; then right shift them by 8 to extract the color int from them. + ;; then get the color pair (:white :black) associated with that number. + :color-pair (number-to-pair (ash (logand ch (get-bitmask :color)) -8)))) + +(defgeneric convert-char (char result-type) + (:documentation "Take a char and convert it to a char of result-type.")) + +;; The lisp class representing chtype is complex-char. +(defmethod convert-char ((char complex-char) result-type) + (case result-type + (:simple-char (simple-char char)) + (:chtype (xchar2chtype char)))) + +;; Lisps character object is here called "simple-char". +(defmethod convert-char ((char character) result-type) + (case result-type + (:complex-char (make-instance 'complex-char :simple-char char :attributes nil)) + (:chtype (char-code char)))) + +;; chtype is a ncurses unsigned long, an integer. +(defmethod convert-char ((char integer) result-type) + (case result-type + (:simple-char (code-char (logand char (get-bitmask :chartext)))) + (:complex-char (chtype2xchar char)))) + + +;;; TODOs + +;; todo: convert-char -> convert + +;; [ ] add type asserts. +;; what is an attr_t? get all ncurses types definitions. + +;; make it clear which routines use xchars and which use chtypes. +;; make all user visible apis use xchars and only internally convert to chtypes. +;; functions to manipulate attributes and colors of xchars. +;; the char part of an xchar should not be changeable. diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/beep.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/beep.lisp new file mode 100644 index 0000000..f56d8ba --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/beep.lisp @@ -0,0 +1,11 @@ +(in-package :de.anvi.croatoan) + +(defun alert (&optional (type :beep)) + (case type + (:beep (%beep)) + (:flash (%flash)) + (otherwise (error "Available alert types: :beep :flash")))) + +;;; TODOs + +;; [ ] Return values, errors. diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/bkgd.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/bkgd.lisp new file mode 100644 index 0000000..8b9a0d1 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/bkgd.lisp @@ -0,0 +1,32 @@ +(in-package :de.anvi.croatoan) + +;; bkgd applies to every cell in the window. +;; bkgdset applies only to new chars inserted after the call to bkgdset. +;; i.e. with bkgd we manipulate the existing text, with bkgdset the new text. + +;; the attribute part of the background char is combined with any chars added. +;; because of that, we cant use alternate chars as background chars, since +;; :altcharset is an attribute. + +(defun set-background-char (winptr xchar &optional (apply t)) + "Set a complex single-byte character as the background of a window. + +The attribute part of the background character is combined with +simple characters in the window. + +If apply is t, the background setting is immediately applied to all cells +in the window. + +Otherwise, it is applied only to newly added simple characters." + (let ((chtype (xchar2chtype xchar))) + (if apply + ;; the background char is applied to every cell in the window by default. + (%wbkgd winptr chtype) + ;; if apply is nil, the background is combined only with new characters. + (%wbkgdset winptr chtype)))) + +(defun get-background-char (window) + "Return the complex char that is the background character of the window." + (let* ((winptr (winptr window)) + (chtype (%getbkgd winptr))) + (chtype2xchar chtype))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/bkgrnd.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/bkgrnd.lisp new file mode 100644 index 0000000..461d039 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/bkgrnd.lisp @@ -0,0 +1,51 @@ +(in-package :de.anvi.croatoan) + +;; bkgrnd applies to every char in the window. +;; bkgrndset applies only to new chars inserted after the call to bkgdset. +;; i.e. with bkgrnd we manipulate the existing text, with bkgrndset the new text. + +;; the attribute part of the background char is combined with any chars added. +;; because of that, we cant use alternate chars as background chars, since +;; :altcharset is an attribute. + +(defun set-background-cchar_t (window char &optional (apply t)) + "Set a wide complex character as the background of a window. + +The attribute part of the background character is combined with +simple characters added to the window. + +If apply is t, the background setting is immediately applied to all cells +in the window. + +Otherwise, it is applied only to newly added simple characters." + (let ((fn (if apply #'%wbkgrnd #'%wbkgrndset)) + (count 1)) + (if char + (funcall-make-cchar_t fn window char nil nil count) + ;; setting char to nil means to unset the background + ;; unset the background means set space as char and the default color pair 0 + (funcall-make-cchar_t fn window #\space nil (number-to-pair 0) count)))) + +;; used in: get-background-cchar_t, extract-wide-char +(defun funcall-get-cchar_t (fn window) + "Call function fn to read a cchar_t from window and return it as a wide complex char." + (with-foreign-object (ptr '(:struct cchar_t)) + ;; read a struct cchar_t into the space allocated with ptr + (funcall fn (winptr window) ptr) + ;; the slot cchar-chars is a a pointer to the wchar_t array. + (let* ((char (mem-aref (foreign-slot-pointer ptr '(:struct cchar_t) 'cchar-chars) 'wchar_t 0)) + ;; ABI6 + (col (foreign-slot-value ptr '(:struct cchar_t) 'cchar-colors)) + (attr (foreign-slot-value ptr '(:struct cchar_t) 'cchar-attr))) + (make-instance 'complex-char + :simple-char (code-char char) + :attributes (chtype2attrs attr) + ;; ABI6 + ;;:color-pair (number->pair col) + ;; ABI5 + ;; the color pair is not placed into the cchar_t slot, but ORed into the attribute int. + :color-pair (chtype2colors attr))))) + +(defun get-background-cchar_t (window) + "Return the wide complex char that is the background character of the window." + (funcall-get-cchar_t #'%wgetbkgrnd window)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/border.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/border.lisp new file mode 100644 index 0000000..8ca4ee7 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/border.lisp @@ -0,0 +1,23 @@ +(in-package :de.anvi.croatoan) + +;; (box win hline vline) = (draw-border win vline vline hline hline nil nil nil nil) +(defun box (window &optional (hline-char 0) (vline-char 0)) + "Draw a border around the window. + +If any parameter is nil or zero, the default ACS char will be used." + (let ((winptr (winptr window))) + (%box winptr hline-char vline-char))) + +(defun draw-border (window &key left right top bottom ;; lines + top-left top-right bottom-left bottom-right) ;; corners + "Draw a border around the window using single-byte line-drawing characters. + +If no border chars are given, the default ncurses ACS chars will be used." + (let ((winptr (winptr window))) + (apply #'%wborder + winptr + ;; if the argument is not nil, convert it to chtype first, the pass it to wborder. + ;; if the argument is nil, pass 0 to wborder, then the default ACS char will be used. + (mapcar #'(lambda (i) (if i (make-chtype i nil nil) 0)) + (list left right top bottom ;; lines + top-left top-right bottom-left bottom-right))))) ;; corners diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/border_set.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/border_set.lisp new file mode 100644 index 0000000..e1dff1f --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/border_set.lisp @@ -0,0 +1,39 @@ +(in-package :de.anvi.croatoan) + +(defun draw-wide-border (window &key left right top bottom + top-left top-right bottom-left bottom-right) + "Draw a border around the window using (wide) unicode line-drawing characters. + +If no border chars are given, the default ncurses WACS chars will be used." + (with-foreign-objects ((ls '(:struct cchar_t)) + (rs '(:struct cchar_t)) + (ts '(:struct cchar_t)) + (bs '(:struct cchar_t)) + (tl '(:struct cchar_t)) + (tr '(:struct cchar_t)) + (bl '(:struct cchar_t)) + (br '(:struct cchar_t)) + (wch 'wchar_t 5)) + (apply #'%wborder-set + (winptr window) + + ;; take a list of (wide) character codes and empty cchar_t pointers, return a list of cchar_t pointers or null pointers. + (mapcar #'(lambda (char ptr) + (if char + ;; if nil, then null-pointer, then the default wacs will be used + ;; if not nil, pointer to cchar_t + (progn + ;; blank the wch array in the struct + (dotimes (ii 5) (setf (mem-aref wch 'wchar_t ii) 0)) + ;; copy the char code to the wch array + (setf (mem-aref wch 'wchar_t) char) + ;; assemble the cchar_t using %setcchar + (%setcchar ptr wch 0 0 (null-pointer)) + ;; return the pointer to the cchar_t + ptr) + ;; if the char is not passed, return a null-pointer. + (null-pointer))) + ;; list of passed character codes + (list left right top bottom top-left top-right bottom-left bottom-right) + ;; list of pointers to allocated cchar_t structs + (list ls rs ts bs tl tr bl br))))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/classes.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/classes.lisp new file mode 100644 index 0000000..ada06ff --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/classes.lisp @@ -0,0 +1,1564 @@ +(in-package :de.anvi.croatoan) + +;; (defclass name (superclasses) (slots) class-options) + +;;; data types + +;; will be abbreviated as "xchar" or "xch" in function parameters. +(defclass complex-char () + ((simple-char + :initarg :simple-char + :initform nil + :type (or null integer character keyword) + :accessor simple-char + :documentation "Lisp primitive character type, like #\a.") + + (attributes + :initarg :attributes + :initform '() + :type (or null cons) + :accessor attributes + :documentation "List of keywords denoting attributes.") + + (fgcolor + :initarg :fgcolor + :initform nil + :type (or null keyword integer list) + :accessor fgcolor + :documentation "A keyword denoting the foreground color of the complex character.") + + (bgcolor + :initarg :bgcolor + :initform nil + :type (or null keyword integer list) + :accessor bgcolor + :documentation "A keyword denoting the background color of the complex character.")) + + (:documentation + "A complex char consists of a simple char, a list of attribute keywords and a pair of color keywords.")) + +(defmethod initialize-instance :after ((xch complex-char) &key color-pair) + "If color-pair is passed as a keyword, set fgcolor and bgcolor." + (when color-pair + (with-slots (fgcolor bgcolor) xch + (setf fgcolor (car color-pair) + bgcolor (cadr color-pair))))) + +(defun set-equal (list-a list-b &key (test #'eq) (key #'identity)) + "Compare if every element of list-a is contained in list-b. + +The order of elements in lists does not matter, so the lists are actually treated as sets. + +The items of the set are extracted using function 'key' and compared using predicate 'test'." + (and (= (length list-a) (length list-b)) + (null (set-exclusive-or list-a list-b :test test :key key)))) + +(defun complex-char= (a b) + "Return t if the simple-char, the color pair and the attribute list of a complex-char are equal. + +The initial purpose of this function is to be used as the equality test for alexandria:define-constant." + (with-accessors ((simple-char-a simple-char) + (bgcolor-a bgcolor) + (fgcolor-a fgcolor) + (attributes-a attributes)) a + (with-accessors ((simple-char-b simple-char) + (bgcolor-b bgcolor) + (fgcolor-b fgcolor) + (attributes-b attributes)) b + (let* ((simple-char-equals-p (cond + ((null simple-char-a) + (null simple-char-b)) + ((and (characterp simple-char-a) + (characterp simple-char-b)) + (char= simple-char-a + simple-char-b)) + ((and (integerp simple-char-a) + (integerp simple-char-b)) + (= simple-char-a + simple-char-b)) + (t ; mixed type or keyword + (equalp simple-char-a + simple-char-b))))) + (and simple-char-equals-p + (equalp fgcolor-a fgcolor-b) + (equalp bgcolor-a bgcolor-b) + (set-equal attributes-a attributes-b)))))) + +(defmethod make-load-form ((object complex-char) &optional environment) + "Describe how complex-char objects can be serialized and loaded by the compiler." + (make-load-form-saving-slots object + :slot-names '(simple-char attributes color-pair) + :environment environment)) + +(defclass complex-string () + ((complex-char-array + :initarg :complex-char-array + :initform (make-array 0 :element-type 'complex-char :fill-pointer 0 :adjustable t) + :type vector + :accessor complex-char-array + :documentation "Lisp primitive string type.")) + + (:documentation + "A complex string consists of an array of complex characters.")) + +;; TODO: what to do when there is no init string, when we start empty and build the string char by char, +;; for example when extracting a complex string. +(defmethod initialize-instance :after ((cstr complex-string) &key string attributes fgcolor bgcolor color-pair) + (with-slots (complex-char-array) cstr + (when string + (loop for char across string + do (vector-push-extend + (make-instance 'complex-char :simple-char char :attributes attributes + :fgcolor fgcolor :bgcolor bgcolor :color-pair color-pair) + complex-char-array))))) + +(defclass keymap () + ((bindings + :initarg :bindings + :initform nil + :type (or null cons) + :accessor bindings + :documentation "Alist of events and handler functions.")) + + (:documentation "A keymap contains an alist of events as keys and event handlers or chained keymaps as values.")) + +;; initialize instance takes a plist initarg and converts it to an alist. +(defmethod initialize-instance :after ((keymap keymap) &key bindings-plist) + (with-slots (bindings) keymap + (when (and (null bindings) bindings-plist) + (setf bindings (plist2alist bindings-plist))))) + +(defclass window (fundamental-character-input-stream fundamental-character-output-stream) + ((location + :initarg :location + :initform '(0 0) + :type cons + :documentation "The (y=row x=column) coordinate of the top left corner of the window.") + + (width + :initarg :width + :initform nil + :type (or null integer) + :documentation "The width (second, horizontal, x dimension) of the window.") + + (height + :initarg :height + :initform nil + :type (or null integer) + :documentation "The height (first, vertical, y dimension) of the window.") + + ;; has to be a 2el-list so we can use 1 arg with setf. + (cursor-position + :type cons + :documentation "The current cursor position coordinates in the form (y x).") + + (input-blocking + :initarg :input-blocking + :initform t + :type (or boolean integer) + :documentation "Input mode: blocking (t), non-blocking (nil) or blocking duration in (positive integer) miliseconds.") + + (frame-rate + :initarg :frame-rate + :initform nil + :type (or null integer) + :accessor frame-rate + :documentation "Set the frame rate in fps (frames per second). When input-blocking is nil, sleep for 1/frame-rate seconds between event loop cycles. Has the same effect as setting input-blocking duration, and should thus not be used simultaneously.") + + (function-keys-enabled-p + :initarg :enable-function-keys + :initform nil + :type boolean + :documentation "Enable (t) or disable (nil) support for function keys.") + + (scrolling-enabled-p + :initarg :enable-scrolling + :initform nil + :type boolean + :documentation "Enable (t) or disable (nil) support for window scrolling.") + + (scrolling-region + :initarg :scrolling-region + :initform nil + :type (or null cons) + :documentation "When scrolling is enabled, only scroll the window region from line y1 to y2 given as the list (y1 y2).") + + ;; IC / INS / Insert / Einfg key + ;; this will only apply to lisps standard output functions. + ;; ncurses functions add-char and insert-char can be used explicitely. + (insert-mode-p + :initarg :insert-mode + :initform nil + :type boolean + :accessor insert-mode-p + :documentation "Printing a new char will insert (t) it before the character under the cursor instead of overwriting it (nil, default).") + + ;; we need instance-local bindings so we dont have to create a keymap for every window and every program + (bindings + :initarg :bindings + :initform nil + :type (or null cons) + :accessor bindings + :documentation + "Alist of events (characters, keywords or integers) as keys and handler functions as values. + Used by the run-event-loop function.") + + ;; if using an instance-local binding isnt sufficient, we can create a keymap and reference it in the object. + (keymap + :initarg :keymap + :initform nil + :type (or null symbol keyword keymap) + :accessor keymap + :documentation "Keymap containing the key bindings to be used by run-event-loop instead of the object's own bindings.") + + (background + :initarg :background + :initform nil + :type (or null complex-char) + :documentation + "Sets a complex char with its attributes and colors as the default style of unrendered text and empty cells of the window. + Complex chars with pre-existing attributes and colors are not changed.") + + (attributes + :initarg :attributes + :initform nil + :type (or null cons) + :documentation "A list of keywords denoting attributes of new characters added to a window.") + + (fgcolor + :initarg :fgcolor + :initform nil + :type (or null keyword integer list) + :documentation "A keyword denoting the foreground color of new characters added to the window.") + + (bgcolor + :initarg :bgcolor + :initform nil + :type (or null keyword integer list) + :documentation "A keyword denoting the background color of new characters added to the window.") + + (draw-border-p + :initarg :draw-border + :initform nil + :type boolean + :reader draw-border-p + :documentation "Draw (t) or don't draw (nil, default) an initial border around a window. Not redrawn automatically.") + + (stackedp + :initarg :stacked + :initform nil + :type boolean + :documentation "If stacked is t, the window is added to the global window stack, so overlapping windows can be refreshed in the stacking order.") + + (visiblep + :initarg :visible + :initform t + :type boolean + :accessor visiblep + :documentation "If visible is nil, do not refresh the stacked window when refreshing the window stack.") + + (winptr + :initform nil + :reader winptr + :documentation "Pointer to a C/ncurses WINDOW structure after the window is created.")) + + (:documentation "A curses window object as returned by newwin.")) + +;; also see source/panel.lisp +(defparameter *window-stack* nil) + +;; ":stacked t" or "(setf (stackedp win) t)" adds a new window to the stack +;; "(setf (hidden win) t)" prevents the window from being refreshed. +(defmethod stackedp ((win window)) + (slot-value win 'stackedp)) +(defmethod (setf stackedp) (stackedp (win window)) + (if stackedp + ;; t: check if in stack, if not, add to stack, if yes, error + (if (member win *window-stack* :test #'eq) + (error "setf stackedp t: window already on stack") + (progn + (push win *window-stack*) + (setf (slot-value win 'stackedp) t))) + ;; nil: check if in stack, if yes, remove from stack, if not, error + (if (member win *window-stack* :test #'eq) + (progn + (setf *window-stack* (remove win *window-stack* :test #'eq)) + (setf (slot-value win 'stackedp) t)) + (error "setf stackedp nil: window not on stack")))) + +(defclass screen (window) + ((colors-enabled-p + :initarg :enable-colors + :initform nil + :type boolean + :documentation "Enable (t) or disable (nil) display of colors, if the terminal supports it.") + + (use-terminal-colors-p + :initarg :use-terminal-colors + :initform nil + :type boolean + :documentation + "Use (t) colors set by the terminal (named :terminal) as the default instead of the ncurses default white on black.") + + (cursor-visible-p + :initarg :cursor-visible + :initform t + :type boolean + :documentation "Enable (t) or disable (nil) the display of a visible cursor.") + + (input-echoing-p + :initarg :input-echoing + :initform t + :type boolean + :documentation "Enable (t) or disable (nil) echoing of chars during keyboard input.") + + (input-buffering-p + :initarg :input-buffering + :initform nil + :type boolean + :documentation + "Set whether typed characters will be returned immediately when they are typed (nil, default) + or buffered until Return is typed (t).") + + (process-control-chars-p + :initarg :process-control-chars + :initform t + :type boolean + :documentation + "If input-buffering is nil, set whether some control characters like ^C, ^S, ^Q, ^D will be processed (t, default) + or passed directly to the program (nil). + When input-buffering is t, control chars are always processed and this option has no effect.") + + (newline-translation-enabled-p + :initarg :enable-newline-translation + :initform t + :type boolean + :documentation + "If t (default), the #\return character (CR ^M \r) is automatically translated to newline (NL) on input, + and NL is translated to CR LF on output. + NL is the standard, system independent, portable way to end a line. + It can be either #\linefeed (LF ^J \n) on Linux, carriage #\return on MacOS, CRLF \r\n on Windows. + Setting newline translation to nil is necessary to be able to detect the #\return key.") + + (closed-p + :type boolean + :documentation "Check whether the screen has been closed, without a subsequent call to refresh to reactivate it.")) + + (:documentation "Represents the main window created upon screen initialisation.")) + +(defclass sub-window (window) + ((parent + :initarg :parent + :initform nil + :type (or null window) + :documentation "The parent window which will contain the sub-window.") + + (relativep + :initarg :relative + :initform nil + :type boolean + :documentation "The location of the sub-window is relative to the parent window (t) or to the screen (nil, default).") + + (source-location + :initarg :source-location + :initform nil + :type (or null cons) + :documentation + "Location (y x) of the area of the parent window, which is mapped to the subwindow. + By default it is identical to the location of the subwindow.")) + + (:documentation "A sub-window shares the memory and the display with and has to be contained within a parent window.")) + +(defclass decorated-window (window) + ((sub-window + :initarg :sub-window + :initform nil + :type (or null sub-window) + :reader sub-window + :documentation "Active content window, for example for menu items.") + + (title + :initarg :title + :initform nil + :accessor title + :type (or boolean string) + :documentation "If t, a title of the window will be displayed over the top border.")) + + (:documentation "A decorated-window is a window consisting of a background window for a border, a title and a content sub-window.")) + +(defclass menu-item () + ((name + :initarg :name + :initform nil + :reader name + :type (or null string symbol) + :documentation "Short name of a menu item displayed in the menu.") + + (checkedp + :initarg :checked + :initform nil + :accessor checkedp + :type boolean + :documentation "t if the item has been checked, nil if it hasn't.") + + (value + :initarg :value + :initform nil + :reader value + :type (or symbol string menu menu-window function) + :documentation "Object associated with and returned upon selection of the item.")) + + (:documentation "A menu consists of a list of menu items.")) + +;; default size of ncurses menus is 16 rows, 1 col. +(defclass menu (element) + ((name + :initarg :name + :initform nil + :reader name + :type (or null string symbol) + :documentation "Name of the menu. (For example for setting the menu-window title, if title is t.)") + + (items + :initarg :items + :initform nil + :accessor items + :type (or null cons) + :documentation "List of menu items. Item types can be strings, symbols, other menus or callback functions.") + + (menu-type + :initarg :menu-type + :initform :selection + :accessor menu-type + :type keyword + :documentation "Types of menus: :selection (default, can contain strings, symbols, menus) or :checklist.") + + (menu-location + :initarg :menu-location + :initform nil + :accessor menu-location + :type (or null cons) + :documentation "Relative location of the menu within its associated window.") + + (current-item-number + :initform 0 + :accessor current-item-number + :type integer + :documentation "Number of the currently selected item.") + + (current-item + :initform nil + :type (or null string symbol menu-item) + :accessor current-item + :documentation "Pointer to the currently selected item object. The first item is initialized as the current item.") + + (current-item-location + :initarg :current-item-location + :initform nil + :accessor current-item-location + :type (or null cons) + :documentation + "Location of the current item in the window. + This information is useful for positioning the cursor on the current item after displaying the menu.") + + (current-item-mark + :initarg :current-item-mark + :initform "" + :reader current-item-mark + :type string + :documentation "A string prefixed to the current item in the menu.") + + (cyclic-selection-p + :initarg :cyclic-selection + :initform nil + :accessor cyclic-selection-p + :type boolean + :documentation "Wrap around when the end of a non-scrolled menu is reached.") + + (max-item-length + :initarg :max-item-length + :initform 15 + :accessor max-item-length + :type integer + :documentation "Max number of characters displayed for a single item.") + + (layout + :initarg :layout + :initform nil + :accessor layout + :type (or null cons) + :documentation "Layout (no-of-rows no-of-columns) of the items in the menu. If nil, we have a vertical list.") + + (scrolled-layout + :initarg :scrolled-layout + :initform nil + :accessor scrolled-layout + :type (or null cons) + :documentation "Layout (no-of-rows no-of-columns) of the menu items actually displayed on screen.") + + (scrolled-region-start + :initform (list 0 0) + :accessor scrolled-region-start + :type (or null cons) + :documentation "A 2-element list tracking the starting row/y and column/x of the displayed menu region.") + + ;; we need instance-local bindings so we dont have to create a keymap for every window and every program + (bindings + :initarg :bindings + :initform nil + :type (or null cons) + :accessor bindings + :documentation + "Alist of events (characters, keywords or integers) as keys and handler functions as values. + Used by the run-event-loop function.") + + ;; if using an instance-local binding isnt sufficient, we can create a keymap and reference it in the object. + (keymap + :initarg :keymap + :initform 'menu-map + :type (or null symbol keyword keymap) + :accessor keymap + :documentation "Keymap containing the key bindings to be used by run-event-loop instead of the object's own bindings.") + + (window + :initarg :window + :initform nil + :type (or null window) + :accessor window + :documentation "Window created separately and then associated with the menu.")) + + (:documentation "A menu is a list of items that can be selected by the user.")) + +(defclass menu-window (menu decorated-window) + () + (:documentation "A menu-window is decorated-window providing a list of items to be selected by the user.")) + +;; init for menus which aren't menu windows +(defmethod initialize-instance :after ((menu menu) &key) + (with-slots (type items current-item layout) menu + ;; Convert strings and symbols to item objects + (setf items (mapcar (lambda (x) + (if (typep x 'menu-item) + ;; if an item object is given, just return it + x + ;; if we have strings, symbols or menus, convert them to menu-items + (make-instance 'menu-item + :name (typecase x + (string x) + (symbol (symbol-name x)) + (menu-window (name x)) + (menu (name x))) + :value x))) + ;; apply the function to the init arg passed to make-instance. + items)) + + ;; Initialize the current item as the first item from the items list. + (setf current-item (car items)) + + ;; if the layout wasnt passed as an argument, initialize it as a single one-column menu. + (unless layout (setf layout (list (length items) 1))) )) + +(defmethod initialize-instance :after ((win menu-window) &key color-pair) + (with-slots (winptr items type height width location sub-window draw-border-p layout scrolled-layout max-item-length + current-item-mark fgcolor bgcolor) win + ;; only for menu windows + (when (eq (type-of win) 'menu-window) + (let ((padding (if draw-border-p 1 0))) + ;; if no layout was given, use a vertical list (n 1) + (unless layout (setf layout (list (length items) 1))) + ;; if height and width are not given as initargs, they will be calculated, + ;; according to no of rows +/- border, and _not_ maximized like normal windows. + (unless height (setf height (+ (* 2 padding) (car (or scrolled-layout layout))))) + (unless width (setf width (+ (* 2 padding) (* (cadr (or scrolled-layout layout)) + (+ (length current-item-mark) max-item-length))))) + (setf winptr (%newwin height width (car location) (cadr location))) + (setf sub-window + (make-instance 'sub-window + :parent win :height (car (or scrolled-layout layout)) + :width (* (cadr (or scrolled-layout layout)) (+ (length current-item-mark) max-item-length)) + :location (list padding padding) :relative t)) + (cond ((or fgcolor bgcolor) + (set-color-pair winptr (color-pair win)) + (setf (color-pair sub-window) (color-pair win) + (background win) (make-instance 'complex-char :color-pair (color-pair win)) + (background sub-window) (make-instance 'complex-char :color-pair (color-pair win)) )) + ;; when a color-pair is passed as a keyword + (color-pair + ;; set fg and bg, pass to ncurses + (setf (color-pair win) color-pair + (color-pair sub-window) color-pair + (background win) (make-instance 'complex-char :color-pair color-pair) + (background sub-window) (make-instance 'complex-char :color-pair color-pair)))) )))) + +(defclass dialog-window (menu-window) + ;; this has to be a pad, so we can scroll it if the message is large. + ;; TODO: check how scrolling would work with a subwindow. + ((message-pad + :initform nil + :type (or null pad) + :reader message-pad + :documentation "Passive content window, for example for menu descriptions.") + + ;; check how message is called in the dialog program. + (message-text + :initarg :message-text + :initform nil + :accessor message-text + :type (or null string) + :documentation "Optional message text to describe the choices in the menu below.") + ;; make shorter slot names + (message-height + :initarg :message-height + :initform 0 + :reader message-height + :type integer + :documentation "Max number of lines reserved for the optional message text.") + + (message-pad-coordinates + :initform nil + :reader message-pad-coordinates + :type (or null cons) + :documentation "List of four coordinates where to refresh/display the message pad: min-y min-x max-y max-x.")) + + (:documentation "A dialog is a decorated menu with a title, a message and items.")) + +(defmethod initialize-instance :after ((win dialog-window) &key color-pair center) + (with-slots (winptr items height width location sub-window draw-border-p layout max-item-length current-item-mark + fgcolor bgcolor message-pad message-text message-height message-pad-coordinates) win + ;; only for dialog windows + (when (eq (type-of win) 'dialog-window) + + ;; dialog windows should always have borders + (let ((padding 1)) + ;; if no layout was given, use a vertical list (n 1) + (unless layout (setf layout (list (length items) 1))) + + ;; if height and width are not given as initargs, they will be calculated, + ;; according to no of rows +/- border, and _not_ maximized like normal windows. + (unless height (setf height (+ 2 message-height (* 2 padding) (car layout)))) + (unless width (setf width (+ (* 2 padding) (* (cadr layout) (+ (length current-item-mark) max-item-length))))) + + ;; if the key center was given, calculate location automatically, even if it was explicitely given. + (when center (setf location (list (- (round (/ %LINES 2)) (round (/ height 2))) + (- (round (/ %COLS 2)) (round (/ width 2)))))) + + (setf winptr (%newwin height width (car location) (cadr location))) + (setf sub-window + (make-instance 'sub-window + :parent win :height (car layout) + :width (* (cadr layout) (+ (length current-item-mark) max-item-length)) + :location (list (+ 2 message-height padding) (+ padding 1)) :relative t)) + + ;; if there is space reserved for a message, and the message is provided, + ;; initialize a pad and set the background color. + (when (and message-text (> message-height 0)) + (setf message-pad (make-instance 'pad :height message-height :width (- width 4))) + (setf message-pad-coordinates + (list (+ 2 (car location)) ;screen-min-y + (+ 2 (cadr location)) ;screen-min-x + (+ (+ 2 (car location)) message-height) ;screen-max-y + (+ (+ 2 (cadr location) (- width 4))))) ;screen-max-x + (when color-pair + (setf (background message-pad) (make-instance 'complex-char :color-pair color-pair))) + (format message-pad message-text)) + + ;; TODO: do this once for all menus and dialogs, at the moment it is duplicated + (cond ((or fgcolor bgcolor) + (set-color-pair winptr (color-pair win)) + (setf (color-pair sub-window) (color-pair win) + (background win) (make-instance 'complex-char :color-pair (color-pair win)) + (background sub-window) (make-instance 'complex-char :color-pair (color-pair win)) )) + ;; when a color-pair is passed as a keyword + (color-pair + ;; set fg and bg, pass to ncurses + (setf (color-pair win) color-pair + (color-pair sub-window) color-pair + (background win) (make-instance 'complex-char :color-pair color-pair) + (background sub-window) (make-instance 'complex-char :color-pair color-pair)))) )))) + +(defclass element () + ((name + :initarg :name + :initform nil + :reader name + :type (or null symbol keyword string) + :documentation "Optional unique name by which the element can be identified and accessed.") + + (title + :initarg :title + :initform nil + :accessor title + :type (or null string) + :documentation "Title of the element to be displayed at an location depending on the element type.") + + (value + :initarg :value + :initform nil + :accessor value + :type (or symbol keyword string number) + :documentation "Value of the element, mostly the result of the form editing.") + + (location + :initarg :location + :initform nil + :type (or null cons) + :accessor location + :documentation "A two-element list (y=row x=column) containing the coordinate of the top left corner of the element.") + + (bindings + :initarg :bindings + :initform nil + :type (or null cons) + :accessor bindings + :documentation + "Alist of events (characters, keywords or integers) as keys and handler functions as values. + Used by the run-event-loop function.") + + (keymap + :initarg :keymap + :initform nil + :type (or null symbol keyword keymap) + :accessor keymap + :documentation "Keymap containing the key bindings to be used by run-event-loop instead of the object's own bindings.") + + ;; we need this to draw selected and other elements with different styles. + ;; this has to be toggled at the same time as current-element of a form + (selectedp + :initform nil + :type boolean + :accessor selectedp + :documentation "Flag denoting whether the element is currently selected in a form.") + + (activep + :initform t + :type boolean + :accessor activep + :documentation "If t (default), the element can be selected. Used to prevent labels from being selected.") + + (parent-form + :initform nil + :type (or null form) + :accessor parent-form + :documentation "Parent form of the element. Added to every element upon the initialization of the form.") + + ;; elements do not necessarily have to have an associated window, only when they are used stand-alone. + ;; when they are part of a form, we can reference the window associated with the parent form. + (window + :initarg :window + :initform nil + :type (or null window) + :documentation "If the element is not part of a form, a window can also be associated with the stand-alone element.")) + + (:documentation "An element of a form, like a field or button.")) + +;; (window (if (window field) (window field) (window (parent-form field)))) +(defmethod window ((element element)) + "Return the window associated with an element, which can optionally be part of a form. + +If there is no window asociated with the element, return the window associated with the parent form." + (with-slots (window parent-form) element + (if window + window + (if parent-form + (if (slot-value parent-form 'window) + (slot-value parent-form 'window) + (error "(window element) ERROR: No window is associated with the parent form.")) + (error "(window element) ERROR: Neither a window nor a parent form are associated with the element."))))) + +(defmethod (setf window) (window (element element)) + (setf (slot-value element 'window) window)) + +(defmethod style ((element element)) + "If the element's style slot is empty, check whether a default style has been defined in the parent form." + (with-slots (style parent-form) element + (if style + style + (if (slot-value parent-form 'style) + ;; get the default element style from the form style slot. + (getf (slot-value parent-form 'style) (type-of element)) + nil)))) + +(defmethod (setf style) (style (element element)) + (setf (slot-value element 'style) style)) + +(defclass label (element) + ((reference + :initarg :reference + :initform nil + :accessor reference + :type (or null symbol keyword string) + :documentation + "If the name of a reference element is specified, the element's title will be displayed instead of the label's. + If a title for the label is explicitely provided, it overrides the title of the reference element.") + + (width + :initarg :width + :initform nil + :type (or null integer) + :accessor width + :documentation "The width of the label.") + + (style + :initarg :style + :initform nil + :type (or null cons) + :documentation "") + + (activep + :initform nil + :documentation "Labels are by default not active and can not be selected when cycling through the elements.")) + + (:documentation "A string displayed at the specified location.")) + +(defclass button (element) + ((callback + :initarg :callback + :initform nil + :accessor callback + :type (or null symbol function) + :documentation "Callback function called when the button is activated.") + + (style + :initarg :style + :initform nil + :type (or null cons) + :documentation "A plist of two complex-chars (or nil): :foreground and :selected-foreground.") + + (bindings + :initarg :bindings + :initform nil + :type (or null cons) + :accessor bindings + :documentation + "Alist of events (characters, keywords or integers) as keys and handler functions as values. + Used by the run-event-loop function.") + + (keymap + :initarg :keymap + :initform 'button-map + :type (or null symbol keyword keymap) + :accessor keymap + :documentation "Keymap containing the key bindings to be used by run-event-loop instead of the object's own bindings.")) + + (:documentation "An element that can call a function by pressing enter (or in future, with a mouse click).")) + +(defclass checkbox (element) + ((style + :initarg :style + :initform nil + :type (or null cons) + :documentation "A plist containing :foreground and :selected-foreground.") + + (checkedp + :initarg :checked + :initform nil + :accessor checkedp + :type boolean + :documentation "t if the checkbox has been checked, nil if it hasn't.") + + (bindings + :initarg :bindings + :initform nil + :type (or null cons) + :accessor bindings + :documentation + "Alist of events (characters, keywords or integers) as keys and handler functions as values. + Used by the run-event-loop function.") + + (keymap + :initarg :keymap + :initform 'checkbox-map + :type (or null symbol keyword keymap) + :accessor keymap + :documentation "Keymap containing the key bindings to be used by run-event-loop instead of the object's own bindings.")) + + (:documentation "A boolean element that can be checked (t) or unchecked (nil)")) + +(defclass checklist (menu) + ((menu-type + :initarg :menu-type + :initform :checklist + :type keyword + :documentation "The type of the menu is set to :checklist")) + + (:documentation "A checklist is a multi-selection menu with checkable items.")) + +(defclass field (element) + ((width + :initarg :width + :initform nil + :type (or null integer) + :accessor width + :documentation "The width of the field. The default buffer length is equal the width.") + + (style + :initarg :style + :initform nil + :type (or null cons) + :documentation "A plist of four complex-chars (or nil): :foreground, :background, :selected-foreground, :selected-background.") + + (bindings + :initarg :bindings + :initform nil + :type (or null cons) + :accessor bindings + :documentation + "Alist of events (characters, keywords or integers) as keys and handler functions as values. + Used by the run-event-loop function.") + + (keymap + :initarg :keymap + :initform 'field-map + :type (or null symbol keyword keymap) + :accessor keymap + :documentation "Keymap containing the key bindings to be used by run-event-loop instead of the object's own bindings.") + + (buffer + :initform nil + :type (or null list) + :accessor buffer + :documentation "List containing the characters in the field.") + + (max-buffer-length + :initarg :max-buffer-length + :initform nil + :type (or null integer) + :accessor max-buffer-length + :documentation + "Max length of the field buffer. If nil, it will be initialized to field width. + Horizontal scrolling is then disabled.") + + (display-pointer + :initform 0 + :type (or null integer) + :accessor display-pointer + :documentation + "Position in the input buffer from which n=width characters are displayed. + When max-buffer-length is greater than width, display-pointer can be greater than zero. + Horizontal scrolling is then enabled.") + + (input-pointer + :initform 0 + :type integer + :accessor input-pointer + :documentation "The position in the input buffer to which the next character will be written.")) + + (:documentation "A field is an editable part of the screen for user input. Can be part of a form.")) + +(defmethod initialize-instance :after ((field field) &key) + (with-slots (max-buffer-length width bindings keymap) field + ;; If unspecified, the default max-buffer-length should be equal to the visible field width. + (unless max-buffer-length + (setf max-buffer-length width)))) + +(defmethod value ((field field)) + "If the field buffer is empty, return nil, otherwise return the buffer as a string." + (when (slot-value field 'buffer) + (coerce (reverse (slot-value field 'buffer)) 'string))) + +(defmethod (setf value) (new-value (field field)) + (setf (slot-value field 'buffer) (reverse (coerce new-value 'list)))) + +(defclass form () + ((name + :initarg :name + :initform nil + :reader name + :type (or null symbol keyword string) + :documentation "Name of the form.") + + (elements + :initarg :elements + ;; Make sure we already have fields when we initialize a form. + :initform nil + :type (or null cons) + :accessor elements + :documentation "List of elements. The first element will be initialized as the current element.") + + ;; if init is 0, what if we have no fields yet? + (current-element-number + :initform 0 + :type integer + :accessor current-element-number + :documentation "Number of the currently selected element.") + + ;; has to be updated every time the current element number is updated. + (current-element + :initform nil + :type (or null field button label checkbox menu checklist) + :accessor current-element + :documentation "Currently selected element object.") + + (style + :initarg :style + :initform nil + :type (or null cons) + :accessor style + :documentation "A plist of default styles for each form element type.") + + (bindings + :initarg :bindings + :initform nil + :type (or null cons) + :accessor bindings + :documentation + "Alist of events (characters, keywords or integers) as keys and handler functions as values. + Used by the run-event-loop function.") + + (keymap + :initarg :keymap + :initform 'form-map + :type (or null symbol keyword keymap) + :accessor keymap + :documentation "Keymap containing the key bindings to be used by run-event-loop instead of the object's own bindings.") + + (window + :initarg :window + :initform nil + :type (or null window) + :accessor window + :documentation "Window created separately and then associated with the form.")) + + (:documentation "A form is a list of fields.")) + +(defmethod initialize-instance :after ((form form) &key) + (with-slots (elements current-element bindings keymap) form + (if elements + (progn + ;; Initialize the current element as the first element from the passed elements list. + ;; we have to set the current element before we can change it with select-previous-element and select-next-element + (setf current-element (car elements)) + ;; set the selected option of the initial current element. + (setf (slot-value current-element 'selectedp) t) + ;; set the parent form slot of every element. + (loop for element in elements + do (setf (slot-value element 'parent-form) form))) + + ;; if a list of elements was not passed, signal an error. + (error "A list of elements is required to initialize a form.")))) + +(defclass form-window (form decorated-window) + () + (:documentation "")) + +(defmethod initialize-instance :after ((win form-window) &key) + (with-slots (winptr height width location sub-window draw-border-p window) win + ;; only for form windows + (when (eq (type-of win) 'form-window) + (setf winptr (%newwin height width (car location) (cadr location))) + (setf sub-window (make-instance 'sub-window :parent win :height (- height 2) :width (- width 2) + :location (list 1 1) :relative t :enable-function-keys t)) + ;; set the sub of the decorated window to be the associated window of the form + ;; the form will be drawn to the associated window, i.e. to the sub + (setf window sub-window) ))) + +;; if a window-location is given during make-instance, it can be simply ignored. +;; or we can check for location and signal an error. +(defclass pad (window) + () + (:documentation "A pad is a window without a specified location on screen, which is specified dynamically during refresh.")) + +(defmethod initialize-instance :after ((win pad) &key) + (with-slots (winptr height width) win + ;; just for a pad window + (when (eq (type-of win) 'pad) + (setf winptr (%newpad height width))))) + +(defclass sub-pad (pad) + ((parent + :initarg :parent + :initform nil + :type (or null pad) + :documentation "The parent pad which will contain the sub-pad.")) + (:documentation "A sub-pad shares the memory and the display with a parent pad and has to be contained within it.")) + +;; sub-pads always use locations relative to parent pads +(defmethod initialize-instance :after ((win sub-pad) &key) + (with-slots (winptr parent height width location) win + ;; just for a sub-pad window + (when (eq (type-of win) 'sub-pad) + (setf winptr (%subpad (slot-value parent 'winptr) height width (car location) (cadr location)))))) + +#| +;; this will be called for both window and screen. +;; create a curses window when an instance is created. +(defmethod initialize-instance :after ((win window) &key) + (with-slots (winptr cursor-visible-p colors-enabled-p input-echoing-p input-reading + input-blocking function-keys-enabled-p scrolling-enabled-p height width location) win + + ;; different initialisations depending on the window type. + ;; %initscr initializes a screen, %newwin initializes a window. + ;; TODO: subwin, derwin, pad... + ;; CAUTION: these initializations have to be done _before_ any other commands. + ;; because of that we cant use call-next-method. + (case (type-of win) + ;; a screen is initialized when we start ncurses. + (screen (progn + (setf winptr (%initscr)) + (when colors-enabled-p (%start-color)) + (if input-echoing-p (%echo) (%noecho)) + (set-input-reading winptr input-reading) + (set-cursor-visibility cursor-visible-p))) ;kernel.lisp + ;; a window is initialized when we create a new window. + (window (setf winptr (%newwin height width (car location) (cadr location))))) + + ;; the following settings have to be executed for all window types. + (set-input-blocking winptr input-blocking) + (%scrollok winptr scrolling-enabled-p) + (%keypad winptr function-keys-enabled-p))) +|# + +;; We cant do this because _all_ auxiliary methods are always used and combined. + +(defmethod initialize-instance :after ((win window) &key color-pair) + (with-slots (winptr height width location fgcolor bgcolor background) win + ;; just for WINDOW types + (when (eq (type-of win) 'window) + (unless width (setf width 0)) + (unless height (setf height 0)) + (setf winptr (%newwin height width (car location) (cadr location))) + + ;; fg/bg should not be passed together with the color-pair keyword. + (cond ((or fgcolor bgcolor) + (set-color-pair winptr (color-pair win))) + (color-pair + ;; set fg and bg, pass to ncurses + (setf (color-pair win) color-pair))) + + (when background (setf (background win) background)) ))) + +(defmethod initialize-instance :after ((scr screen) &key color-pair) + (with-slots (winptr colors-enabled-p use-terminal-colors-p cursor-visible-p input-echoing-p input-blocking + function-keys-enabled-p newline-translation-enabled-p fgcolor bgcolor + scrolling-enabled-p background input-buffering-p process-control-chars-p) scr + ;; just for screen window types. + (when (eq (type-of scr) 'screen) + (setf winptr (%initscr)) + (when colors-enabled-p + (if (%has-colors) + (progn + (%start-color) + (set-default-color-pair use-terminal-colors-p)) + (error "initialize-instance screen: This terminal does not support colors."))) + + (cond ((or fgcolor bgcolor) + (set-color-pair winptr (color-pair scr))) + (color-pair + ;; set fg and bg, pass to ncurses + (setf (color-pair scr) color-pair))) + + (when background (setf (background scr) background)) + (if newline-translation-enabled-p (%nl) (%nonl)) + (if input-echoing-p (%echo) (%noecho)) + (set-input-mode input-buffering-p process-control-chars-p) + (set-cursor-visibility cursor-visible-p)))) + +;; sub-window has to be contained within a parent window +;; touch parent before refreshing a subwindow +;; move also needs a method for subwindows. +;; Subwindows must be deleted before the main window can be deleted. +(defmethod initialize-instance :after ((win sub-window) &key) + (with-slots (winptr parent height width location relativep) win + ;; leaving out the size of a window maxes it out to the right and to the bottom + (unless width (setf width 0)) + (unless height (setf height 0)) + ;; just for SUB-WINDOW types + (when (eq (type-of win) 'sub-window) + (if relativep + ;;(setf winptr (%derwin (slot-value parent 'winptr) height width (car location) (cadr location))) + (setf winptr (let ((val (%derwin (slot-value parent 'winptr) height width (car location) (cadr location)))) + (if (null-pointer-p val) + ;; may also be null if the parent window passed is null + (error "Subwindow could not be created. Probably too big and not contained in the parent window.") + val))) + (setf winptr (%subwin (slot-value parent 'winptr) height width (car location) (cadr location))))))) + +(defmethod initialize-instance :after ((win decorated-window) &key) + (with-slots (winptr width height location sub-window) win + ;; only for decorated window types + (when (eq (type-of win) 'decorated-window) + (setf winptr (%newwin height width (car location) (cadr location))) + (setf sub-window + (make-instance 'sub-window :parent win :height (- height 2) :width (- width 2) :location (list 1 1) :relative t))))) + +;; called after _all_ :after aux methods. +;; for all window types in the hierarchy. +(defmethod initialize-instance :around ((win window) &key) + ;; before :before, :after and primary. + (let ((result (call-next-method))) + ;; after :before, :after and primary. + (with-slots (winptr input-blocking function-keys-enabled-p scrolling-enabled-p draw-border-p stackedp) win + (set-input-blocking winptr input-blocking) + (%scrollok winptr scrolling-enabled-p) + (when draw-border-p (%box winptr 0 0)) + (%keypad winptr function-keys-enabled-p) + (when stackedp (push win *window-stack*))) + + ;; why do we have to return the result in :around aux methods? + result)) + +;; Accessors + +(defgeneric location (window)) +(defmethod location ((window window)) + (list (%getbegy (slot-value window 'winptr)) (%getbegx (slot-value window 'winptr)))) +(defmethod location ((win sub-window)) + (with-slots (winptr relativep) win + (if relativep + (list (%getpary winptr) (%getparx winptr)) + (list (%getbegy winptr) (%getbegx winptr))))) +(defgeneric (setf location) (coordinates window)) +(defmethod (setf location) (coordinates (w window)) + (setf (slot-value w 'location) coordinates) + (%mvwin (slot-value w 'winptr) (car coordinates) (cadr coordinates))) + +;; The slots location-y and location-x dont exist, these accessors exist for convenience. + +(defgeneric location-y (window)) +(defmethod location-y ((win window)) + (%getbegy (slot-value win 'winptr))) +(defmethod location-y ((win sub-window)) + (with-slots (winptr relativep) win + (if relativep + (%getpary winptr) + (%getbegy winptr)))) + +(defgeneric location-x (window)) +(defmethod location-x ((win window)) + (%getbegx (slot-value win 'winptr))) +(defmethod location-x ((win sub-window)) + (with-slots (winptr relativep) win + (if relativep + (%getparx winptr) + (%getbegx winptr)))) + +(defgeneric (setf location-y) (y window)) +(defmethod (setf location-y) (y (win window)) + (let ((x (cadr (slot-value win 'location)))) + (setf (slot-value win 'location) (list y x)) + (%mvwin (slot-value win 'winptr) y x))) + +(defgeneric (setf location-x) (x window)) +(defmethod (setf location-x) (x (win window)) + (let ((y (car (slot-value win 'location)))) + (setf (slot-value win 'location) (list y x)) + (%mvwin (slot-value win 'winptr) y x))) + +;; "The screen-relative parameters of the window are not changed. +;; This routine is used to display different parts of the parent +;; window at the same physical location on the screen." +;; +;; "The mvderwin() function specifies a mapping of characters. +;; The function identifies a mapped area of the parent of the specified window" + +;; TODO: rename to source-location +(defgeneric (setf source-location) (coordinates sub-window)) +(defmethod (setf source-location) (coordinates (w sub-window)) + (setf (slot-value w 'source-location) coordinates) + (%mvderwin (slot-value w 'winptr) (car coordinates) (cadr coordinates))) + +(defgeneric width (window)) +(defmethod width ((window window)) + (%getmaxx (slot-value window 'winptr))) + +(defgeneric height (window)) +(defmethod height ((window window)) + (%getmaxy (slot-value window 'winptr))) + +(defgeneric cursor-position (window)) +(defmethod cursor-position ((window window)) + (list (%getcury (slot-value window 'winptr)) (%getcurx (slot-value window 'winptr)))) + +;; we can move the cursor by doing this, or by calling "move". +;; both will use %wmove in the background. +;; note that incd and decf dont work. +(defgeneric (setf cursor-position) (coordinates window)) +(defmethod (setf cursor-position) (coordinates (w window)) + (setf (slot-value w 'cursor-position) coordinates) + (%wmove (slot-value w 'winptr) (car coordinates) (cadr coordinates))) + +;; The slots location-y and location-x dont exist, but the pseudo accessors +;; exist for convenience. + +(defgeneric cursor-position-y (window)) +(defmethod cursor-position-y ((win window)) + (%getcury (slot-value win 'winptr))) + +(defgeneric cursor-position-x (window)) +(defmethod cursor-position-x ((win window)) + (%getcurx (slot-value win 'winptr))) + +(defgeneric (setf cursor-position-y) (y window)) +(defmethod (setf cursor-position-y) (y (win window)) + (let ((x (cadr (slot-value win 'cursor-position)))) + (setf (slot-value win 'cursor-position) (list y x)) + (%wmove (slot-value win 'winptr) y x))) + +(defgeneric (setf cursor-position-x) (x window)) +(defmethod (setf cursor-position-x) (x (win window)) + (let ((y (car (slot-value win 'cursor-position)))) + (setf (slot-value win 'cursor-position) (list y x)) + (%wmove (slot-value win 'winptr) y x))) + +(defgeneric cursor-visible-p (window)) +(defmethod cursor-visible-p ((screen screen)) + (slot-value screen 'cursor-visible-p)) +(defgeneric (setf cursor-visible-p) (status screen)) +(defmethod (setf cursor-visible-p) (status (screen screen)) + (setf (slot-value screen 'cursor-visible-p) status) + (set-cursor-visibility status)) + +(defgeneric input-blocking (window)) +(defmethod input-blocking ((window window)) + (slot-value window 'input-blocking)) +(defgeneric (setf input-blocking) (status window)) +(defmethod (setf input-blocking) (status (window window)) + (setf (slot-value window 'input-blocking) status) + (set-input-blocking (slot-value window 'winptr) status)) + +(defgeneric function-keys-enabled-p (window)) +(defmethod function-keys-enabled-p ((window window)) + (slot-value window 'function-keys-enabled-p)) +(defgeneric (setf function-keys-enabled-p) (status window)) +(defmethod (setf function-keys-enabled-p) (status (window window)) + (setf (slot-value window 'function-keys-enabled-p) status) + (%keypad (slot-value window 'winptr) status)) + +(defgeneric scrolling-enabled-p (window)) +(defmethod scrolling-enabled-p ((window window)) + (slot-value window 'scrolling-enabled-p)) +(defgeneric (setf scrolling-enabled-p) (status window)) +(defmethod (setf scrolling-enabled-p) (status (window window)) + (setf (slot-value window 'scrolling-enabled-p) status) + (%scrollok (slot-value window 'winptr) status)) + +(defgeneric scrolling-region (window)) +(defmethod scrolling-region ((window window)) + (slot-value window 'scrolling-region)) +(defgeneric (setf scrolling-region) (list window)) +(defmethod (setf scrolling-region) (list (window window)) + (setf (slot-value window 'scrolling-region) list) + (%wsetscrreg (slot-value window 'winptr) + (first (slot-value window 'scrolling-region)) + (second (slot-value window 'scrolling-region)))) +;; TODO: setf only when scrolling is enabled. + +(defgeneric input-echoing-p (screen)) +(defmethod input-echoing-p ((screen screen)) + (slot-value screen 'input-echoing-p)) +(defgeneric (setf input-echoing-p) (status screen)) +(defmethod (setf input-echoing-p) (status (screen screen)) + (setf (slot-value screen 'input-echoing-p) status) + ;;(set-input-echoing status)) + (if status (%echo) (%noecho))) + +(defgeneric input-buffering-p (screen)) +(defmethod input-buffering-p ((screen screen)) + (slot-value screen 'input-buffering-p)) +(defgeneric (setf input-buffering-p) (status screen)) +(defmethod (setf input-buffering-p) (status (screen screen)) + (setf (slot-value screen 'input-buffering-p) status) + (set-input-mode (slot-value screen 'input-buffering-p) + (slot-value screen 'process-control-chars-p))) + +(defgeneric process-control-chars-p (screen)) +(defmethod process-control-chars-p ((screen screen)) + (slot-value screen 'process-control-chars-p)) +(defgeneric (setf process-control-chars-p) (status screen)) +(defmethod (setf process-control-chars-p) (status (screen screen)) + (with-slots (input-buffering-p process-control-chars-p) screen + ;; only make a change when the status changed. + (when (not (eq process-control-chars-p status)) + ;; only call ncurses when buffering is nil. + (unless input-buffering-p + ;; before we switch the unbuffered mode, we switch to the default cooked mode. + (if process-control-chars-p (%nocbreak) (%noraw)) + ;; then make a "clean" switch back to the new unbuffered mode. + (set-input-mode input-buffering-p status)) + ;; then save the new status. + (setf process-control-chars-p status) ))) + +(defgeneric newline-translation-enabled-p (screen)) +(defmethod newline-translation-enabled-p ((screen screen)) + (slot-value screen 'newline-translation-enabled-p)) +(defgeneric (setf newline-translation-enabled-p) (status screen)) +(defmethod (setf newline-translation-enabled-p) (status (screen screen)) + (setf (slot-value screen 'newline-translation-enabled-p) status) + (if status (%nl) (%nonl))) + +(defgeneric background (window)) +(defmethod background ((win window)) + (slot-value win 'background)) + +(defgeneric (setf background) (char window &optional apply)) +(defmethod (setf background) (char (window window) &optional (apply t)) + (setf (slot-value window 'background) char) + ;; ncurses + ;;(set-background-char (slot-value window 'winptr) char apply)) + ;; ncursesw + (set-background-cchar_t window char apply)) + +;(defgeneric attributes (window)) +(defmethod attributes ((window window)) + (slot-value window 'attributes)) + +;;(defgeneric (setf attributes) (attributes window)) +#| +(defmethod (setf attributes) (attributes (window window)) + (let ((added (set-difference attributes (slot-value window 'attributes))) + (removed (set-difference (slot-value window 'attributes) attributes))) + (setf (slot-value window 'attributes) attributes) + (add-attributes window added) + (remove-attributes window removed))) +|# +;; TODO use %wattron and %wattroff here. + +(defmethod (setf attributes) (attributes (win window)) + (with-slots ((win-attributes attributes)) win + (let ((added (set-difference attributes win-attributes)) + (removed (set-difference win-attributes attributes))) + ;; set the list of attributes to the window slot + (setf win-attributes attributes) + ;; pass the attrbutes to add and remove to ncurses + (add-attributes win added) + (remove-attributes win removed)))) + +;; we dont want to use set-attributes because it also overwrites the color attribute. +;; we want the attributes function to just handle attributes and leave the color alone. +;; to do that, we have to treat the attributes as a set and ignore set-attributes. + +;; (defmethod (setf attributes) (attributes (window window)) +;; (setf (slot-value window 'attributes) attributes) +;; (set-attributes window attributes)) + +(defmethod color-pair ((win window)) + (with-slots (fgcolor bgcolor) win + (if (or fgcolor bgcolor) + (list fgcolor bgcolor) + ;; when both colors are nil, do not return (nil nil) but nil + nil))) + +(defmethod (setf color-pair) (color-pair (win window)) + (with-slots (fgcolor bgcolor) win + (if color-pair + (setf fgcolor (car color-pair) + bgcolor (cadr color-pair)) + ;; when color-pair is nil, both fg and bg are set to nil + (setf fgcolor nil + bgcolor nil))) + ;; after the slots are set, pass the new pair to ncurses + (set-color-pair (slot-value win 'winptr) (color-pair win))) + +(defmethod color-pair ((xch complex-char)) + (with-slots (fgcolor bgcolor) xch + (if (or fgcolor bgcolor) + (list fgcolor bgcolor) + ;; when both colors are nil, do not return (nil nil) but nil + nil))) + +(defmethod (setf color-pair) (color-pair (xch complex-char)) + (with-slots (fgcolor bgcolor) xch + (if color-pair + (setf fgcolor (car color-pair) + bgcolor (cadr color-pair)) + ;; when color-pair is nil, both fg and bg are set to nil + (setf fgcolor nil + bgcolor nil)))) + +(defmethod fgcolor ((win window)) + (slot-value win 'fgcolor)) + +(defmethod bgcolor ((win window)) + (slot-value win 'bgcolor)) + +(defmethod (setf fgcolor) (fgcolor (win window)) + (setf (slot-value win 'fgcolor) fgcolor) + ;; set the color pair in the underlying ncurses lib. + (set-color-pair (slot-value win 'winptr) (color-pair win))) + +(defmethod (setf bgcolor) (bgcolor (win window)) + (setf (slot-value win 'bgcolor) bgcolor) + ;; set the color pair in the underlying ncurses lib. + (set-color-pair (slot-value win 'winptr) (color-pair win))) + + +;;; print, prin1, princ, format ~A, ~S + +;; print a wide but simple lisp character to a window +;; TODO: add check for insert-mode +(defmethod print-object ((ch character) (stream window)) + (add-wide-char stream ch)) + +;; TODO: add check for insert-mode +(defmethod print-object ((ch complex-char) (stream window)) + (add-wide-char stream ch)) + +;; print only simple chars to the lisp repl. +(defmethod print-object ((ch complex-char) stream) + (princ (simple-char ch) stream)) + +;; print simple strings to a ncurses widow. +(defmethod print-object ((str string) (stream window)) + (%waddstr (winptr stream) str)) + +;; print complex strings to a ncurses window. +(defmethod print-object ((cstr complex-string) (stream window)) + (loop for ch across (complex-char-array cstr) + do (add-wide-char stream ch))) + +;; print only simple chars to the lisp repl. +(defmethod print-object ((cstr complex-string) stream) + (loop for ch across (complex-char-array cstr) + do (princ (simple-char ch) stream))) + +;; methods to close streams, and thus screen _and_ windows, since they are now gray streams. +;; end-screen = %endwin +;; delete-window = %delwin +;; see t07a +;; remember we cant use open to open a window. it works only for file streams. +;; we have to make-instance of a window or a screen. + +(defmethod close ((stream window) &key abort) + (declare (ignore abort)) + ;; if by time of closing, the window is still on the stack, remove it first. + (if (member stream *window-stack* :test #'eq) + (setf *window-stack* (remove stream *window-stack* :test #'eq))) + (%delwin (winptr stream)) + ;; The default method provided by class FUNDAMENTAL-STREAM sets a flag for OPEN-STREAM-P. + (call-next-method)) + +(defmethod close ((stream sub-window) &key abort) + (declare (ignore abort)) + (%delwin (winptr stream))) + +(defmethod close ((stream screen) &key abort) + (declare (ignore abort)) + (%endwin)) + +(defmethod close ((stream decorated-window) &key abort) + (declare (ignore abort)) + (%delwin (winptr (sub-window stream))) + (%delwin (winptr stream))) + +;; although it is not a stream, we will abuse close to close a menu's window and subwindow, which _are_ streams. +(defmethod close ((stream menu-window) &key abort) + (declare (ignore abort)) + (%delwin (winptr (sub-window stream))) + (%delwin (winptr stream))) + +(defmethod close ((stream dialog-window) &key abort) + (declare (ignore abort)) + (%delwin (winptr (message-pad stream))) + (%delwin (winptr (sub-window stream))) + (%delwin (winptr stream))) + +(defmethod close ((stream form-window) &key abort) + (declare (ignore abort)) + (%delwin (winptr (sub-window stream))) + (%delwin (winptr stream))) + +;; SBCL bug when specializing close on gray streams: +;; STYLE-WARNING: +;; Generic function CLOSE clobbers an earlier FTYPE proclamation +;; (FUNCTION (STREAM &KEY (:ABORT T)) (VALUES (MEMBER T) &OPTIONAL)) for the +;; same name with (FUNCTION (T &KEY (:ABORT T)) *). diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/clear.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/clear.lisp new file mode 100644 index 0000000..5f72584 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/clear.lisp @@ -0,0 +1,27 @@ +(in-package :de.anvi.croatoan) + +;; (clear scr :redraw t) +;; (clear scr :target :whole-screen :redraw t) + +;; (clear scr :target :end-of-line) +;; (clear scr :target :bottom) + +(defgeneric clear (object &key)) + +(defmethod clear ((window window) &key redraw (target :whole-window)) + "Clear the window by overwriting it with blanks. + +If the keyword redraw is t, first copy blanks to every position in the +window, then set the clear-redraw-flag to have the window redrawn from +scratch on the next refresh. + +If target is :end-of-line, clear the window from the cursor to the end +of the current line. + +If target is :bottom, clear the window from the cursor to the end of +the current line and all lines below." + (let ((winptr (winptr window))) + (case target + (:whole-window (if redraw (%wclear winptr) (%werase winptr))) + (:end-of-line (%wclrtoeol winptr)) + (:bottom (%wclrtobot winptr))))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/color.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/color.lisp new file mode 100644 index 0000000..b5fd161 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/color.lisp @@ -0,0 +1,160 @@ +(in-package :de.anvi.croatoan) + +;; 1000 -> 255 (ff) +(defun color-1k-to-8bit (integer) + "Convert the ncurses color intensity 0-1000 to the 8bit range 0-255." + (values (round (* integer 0.255)))) + +;; 255 (ff) -> 1000 +(defun color-8bit-to-1k (integer) + "Convert the 8bit range 0-255 to the ncurses color intensity 0-1000." + (values (round (* integer (/ 1 0.255))))) + +;; https://www.w3schools.com/colors/colors_rgb.asp +;; 255 255 255 -> ffffff +;; the hex triplet is a 6 digit, 3 byte (24 bit) hexadecimal number +;; 255 192 203 :pink +(defun rgb-to-hex (rgb-list) + "Take a list of three 8bit (0-255) RGB values, return a 24bit integer (RGB hex triplet)." + (let ((r (nth 0 rgb-list)) + (g (nth 1 rgb-list)) + (b (nth 2 rgb-list))) + (logior (ash r 16) + (ash g 8) + (ash b 0)))) +;; test: (format t "~x" (rgb-to-hex (list 255 255 0))) + +;; (hex-to-rgb #xffffff) => (255 255 255) +(defun hex-to-rgb (hex) + "Take a 24bit integer (RGB hex triplet), return a list of three 8bit (0-255) RGB values." + (let ((r (ldb (byte 8 16) hex)) + (g (ldb (byte 8 8) hex)) + (b (ldb (byte 8 0) hex))) + (list r g b))) + +;;(defun hex-to-string (hex) +;; (format nil "~6,'0x" hex)) + +;; SGR = select graphc rendition, vt100 attribute sequences + +;; xterm sources: +;; https://github.com/joejulian/xterm/blob/master/256colres.pl +;; https://github.com/joejulian/xterm/blob/master/256colres.h +;; https://gist.github.com/clairvy/566623#file-256colors2-pl + +;; scale rgb values from 0-255 down to 0-5, corresponding to colors in the xterm 6x6x6 RGB cube. +(defun rgb-to-rgb6 (rgb-list) + "Take a list of three RGB integers 0-255, return a list of three RGB integers 0-5." + (mapcar (lambda (x) + (if (< x 55) + 0 + (floor (/ (- x 55) 40)))) + rgb-list)) + +;; scale rgb values from 0-5 to 0-255, from the xterm 6x6x6 RGB color cube to 3x8bit=24bit. +(defun rgb6-to-rgb (rgb6-list) + "Take a list of three RGB integers 0-5, return a list of three RGB integers 0-255 of the xterm color palette." + (mapcar (lambda (x) (if (> x 0) + (+ 55 (* 40 x)) + 0)) + rgb6-list)) + +(defun rgb6-to-sgr (rgb6-list) + "Take a list of three RGB integers 0-5, return an 8bit SGR color code 16-231." + (let ((r (nth 0 rgb6-list)) + (g (nth 1 rgb6-list)) + (b (nth 2 rgb6-list))) + (+ (* r 36) + (* g 6) + (* b 1) + 16))) + +;; only returns values from the color cube, not from the grayscale ramp 232-255. +(defun sgr-to-rgb6 (sgr) + "Take a 8bit SGR color code 16-231, return a list of three RGB integers 0-5." + (let* ((rgb (- sgr 16)) + (r (floor rgb 36)) + (r-rem (- rgb (* 36 r))) + (g (floor r-rem 6)) + (b (- r-rem (* 6 g)))) + (list r g b))) + +;; the rgb values of the first 8 ansi colors arent defined, they only have names. +;; the first 16 colors of the 256-color palette have names ("web colors") and rgb values. +;; https://en.wikipedia.org/wiki/Web_colors + +;; TODO: this list is also defined in attr.lisp, but it should only be here +;;(defparameter *xterm-color-name-list* +;; '(:black :maroon :green :olive :navy :purple :teal :silver +;; :gray :red :lime :yellow :blue :magenta :cyan :white)) + +(defparameter *xterm-color-hex-list* + '(#x000000 ;black + #x800000 ;web maroon + #x008000 ;web green + #x808000 ;olive + #x000080 ;navy blue + #x800080 ;web purple + #x008080 ;teal + #xc0c0c0 ;silver + + #x808080 ;web gray + #xff0000 ;red + #x00ff00 ;lime, x11: green + #xffff00 ;yellow + #x0000ff ;blue + #xff00ff ;magenta, x11: fuchsia + #x00ffff ;cyan, x11: aqua + #xffffff)) ;white + +(defun gray-to-rgb (sgr) + "Take a sgr gray color number 232-255, return a list of three RGB integers 0-255." + (let ((val (+ 8 (* 10 (- sgr 232))))) + (list val val val))) + +(defun closest-gray (rgb) + "Take an integer 0-255 denoting a gray color intensity, return the closest gray from the xterm palette." + (let* ((allowed-gray-values (loop for i from 0 to 23 collect (+ 8 (* 10 i)))) + (delta-list (mapcar (lambda (x) (abs (- rgb x))) allowed-gray-values)) + (delta-min (apply #'min delta-list)) + (pos (position delta-min delta-list))) + (+ 232 pos))) + ;;(nth pos allowed-gray-values))) + +;; otherwise return the closest short-rgb color. +;; TODO: we do not want the approximated and the exact color returned by the same function. +;; we need to check whether the hex is in the palette and return that +;; and if it is NOT in the palette, then either init a new color or return the closest color +;; from the palette. +(defun hex-to-sgr (hex) + "Takes a RGB hex triplet, returns the exact or most appropriate SGR color code 0-255." + (let ((rgb-list (hex-to-rgb hex))) + ;; TODO: check whether we use 8 or 256 colors, limit the hex codes to the first 8 if necessary. + (cond + ;; is the hex value one of the 16 basic ansi colors? + ((member hex *xterm-color-hex-list*) + (position hex *xterm-color-hex-list*)) + ;; if all three rgb values are equal, return the closest shade of gray. + ;; TODO: what if they are almost equal, for example (243 242 244)? + ((apply #'= rgb-list) + (closest-gray (car rgb-list))) + ;; if they arent equal, return the closest value from the 6x6x6 rgb cube. + (t (rgb6-to-sgr (rgb-to-rgb6 rgb-list)))))) + +;; handles all three xterm-256color color spaces +;; we need this to list the rgb values of all 256 xterm colors to compare them to the x11 color list. +;; TODO: use this to make a list containing all 256 SGR hex codes. +(defun sgr-to-hex (sgr) + "Take a SGR color code 0-255, return a 24bit hex triplet." + (cond + ;; 8 ansi colors (8 normal and 8 bright or bold) 0-15 + ;; just return the hex integer from the list + ((< sgr 16) + ;;(cdr (assoc sgr *ansi-color-sgr-hex-alist*))) + (nth sgr *xterm-color-hex-list*)) + ;; 216 colors from a 6x6x6 RGB color cube, 16-231 + ((< sgr 232) + (rgb-to-hex (rgb6-to-rgb (sgr-to-rgb6 sgr)))) + ;; 24 gray colors without black and white, which are contained in both 1. and 2. + ((< sgr 256) + (rgb-to-hex (gray-to-rgb sgr))))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/croatoan.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/croatoan.lisp new file mode 100644 index 0000000..0aa39a3 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/croatoan.lisp @@ -0,0 +1,297 @@ +(in-package :de.anvi.croatoan) + +;;; Define all macros here centrally. + +(defmacro with-screen ((screen &key + (bind-debugger-hook t) + (input-buffering nil) + (process-control-chars t) + (enable-newline-translation t) + (input-blocking t) + (input-echoing t) + (enable-function-keys t) + (enable-scrolling nil) + (insert-mode nil) + (enable-colors t) + (use-terminal-colors nil) + (cursor-visible t) + (stacked nil) + (fgcolor nil) + (bgcolor nil) + (color-pair nil) + (background nil)) + &body body) + "Create a screen, evaluate the forms in the body, then cleanly close the screen. + +Pass any arguments besides BIND-DEBUGGER-HOOK to the initialisation of the +screen object. The screen is cleared immediately after initialisation. + +This macro will bind *DEBUGGER-HOOK* so that END-SCREEN gets called before the +condition is printed. This will interfere with SWANK as it also binds *DEBUGGER-HOOK*. +To prevent WITH-SCREEN from binding *DEBUGGER-HOOK*, set BIND-DEBUGGER-HOOK to NIL. + +This macro is the main entry point for writing ncurses programs with the croatoan +library. Do not run more than one screen at the same time." + `(unwind-protect + (let ((,screen (make-instance 'screen + :input-buffering ,input-buffering + :process-control-chars ,process-control-chars + :enable-newline-translation ,enable-newline-translation + :input-blocking ,input-blocking + :input-echoing ,input-echoing + :enable-function-keys ,enable-function-keys + :enable-scrolling ,enable-scrolling + :insert-mode ,insert-mode + :enable-colors ,enable-colors + :use-terminal-colors ,use-terminal-colors + :cursor-visible ,cursor-visible + :stacked ,stacked + :fgcolor ,fgcolor + :bgcolor ,bgcolor + :color-pair ,color-pair + :background ,background)) + + ;; when an error is signaled and not handled, cleanly end ncurses, print the condition text + ;; into the repl and get out of the debugger into the repl. + ;; the debugger is annoying with ncurses apps. + ;; add (abort) to automatically get out of the debugger. + ;; this binding is added by default. call with-screen with :bind-debugger-hook nil to remove. + ,@(if bind-debugger-hook + '((*debugger-hook* #'(lambda (c h) + (declare (ignore h)) + (end-screen) + (print c)))) + nil)) + + ;; clear the display when starting up. + (clear ,screen) + + ,@body) + + ;; cleanly exit ncurses whatever happens. + (end-screen))) + +(defmacro with-window ((win &rest options) &body body) + "Create a window, evaluate the forms in the body, then cleanly close the window. + +Pass any arguments to the initialisation of the window object. + +Example: + +(with-window (win :input-echoing t + body)" + `(let ((,win (make-instance 'window ,@options))) + (unwind-protect + (progn + ,@body) + (close ,win)))) + +;; see similar macro cffi:with-foreign-objects. +(defmacro with-windows (bindings &body body) + "Create one or more windows, evaluate the forms in the body, then cleanly close the windows. + +Pass any arguments to the initialisation of the window objects. + +Example: + +(with-windows ((win1 :input-echoing t) + (win2 :input-echoing t)) + body)" + (if bindings + ;; execute the bindings recursively + `(with-window ,(car bindings) + ;; the cdr is the body + (with-windows ,(cdr bindings) + ,@body)) + ;; finally, execute the body. + `(progn + ,@body))) + +(defmacro event-case ((window event &optional mouse-y mouse-x) &body body) + "Window event loop, events are handled by an implicit case form. + +For now, it is limited to events generated in a single window. So events +from multiple windows have to be handled separately. + +In order for event handling to work, input-buffering has to be nil. +Several control character events can only be handled when +process-control-chars is also nil. + +If input-blocking is nil, we can handle the (nil) event, i.e. what +happens between key presses. + +If input-blocking is t, the (nil) event is never returned. + +The main window event loop name is hard coded to event-case to be +used with return-from. + +Instead of ((nil) nil), which eats 100% CPU, use input-blocking t." + (if (and mouse-y mouse-x) + `(loop :named event-case do + (multiple-value-bind (,event ,mouse-y ,mouse-x) + ;; depending on which version of ncurses is loaded, decide which event reader to use. + #+(or sb-unicode unicode openmcl-unicode-strings) (get-wide-event ,window) + #-(or sb-unicode unicode openmcl-unicode-strings) (get-event ,window) + ;;(print (list ,event mouse-y mouse-x) ,window) + (when (null ,event) + ;; process the contents of the job queue (ncurses access from other threads) + (process)) + (case ,event + ,@body))) + `(loop :named event-case do + ;; depending on which version of ncurses is loaded, decide which event reader to use. + (let ((,event #+(or sb-unicode unicode openmcl-unicode-strings) (get-wide-event ,window) + #-(or sb-unicode unicode openmcl-unicode-strings) (get-event ,window))) + (when (null ,event) + ;; process the contents of the job queue (ncurses access from other threads) + (process)) + (case ,event + ,@body))))) + +(defun bind (object event handler) + "Bind the handler function to the event in the bindings alist of the object. + +The handlers will be called by the run-event-loop when keyboard or mouse events occur. + +The handler functions have two mandatory arguments, window and event. + +For every event-loop, at least an event to exit the event loop should be assigned, +by associating it with the predefined function exit-event-loop. + +If a handler for the default event t is defined, it will handle all events for which +no specific event handler has been defined. + +If input-blocking of the window is set to nil, a handler for the nil event +can be defined, which will be called at a specified frame-rate between keypresses. +Here the main application state can be updated. + +Alternatively, to achieve the same effect, input-blocking can be set to a specific +delay in miliseconds. + +Example use: (bind scr #\q (lambda (win event) (throw 'event-loop :quit)))" + (setf (bindings object) + (acons event handler (bindings object)))) + +(defun unbind (object event) + "Remove the event and the handler function from object's bindings alist." + (setf (slot-value object 'bindings) + (remove event (slot-value object 'bindings) :key #'car))) + +(defparameter *keymaps* nil "An alist of available keymaps.") + +(defun define-keymap (name plist) + "Register a keymap given by a name and a plist of keys and functions." + (let ((keymap (make-instance 'keymap :bindings-plist plist))) + (setf *keymaps* (acons name keymap *keymaps*)))) + +(defun find-keymap (keymap-name) + "Return a keymap given by its name from the global keymap alist." + (cdr (assoc keymap-name *keymaps*))) + +;; source: alexandria +(defun plist2alist (plist) + "Take a plist in the form (k1 v1 k2 v2 ...), return an alist ((k1 . v1) (k2 . v2) ...)" + (let (alist) + (do ((lst plist (cddr lst))) + ((endp lst) (nreverse alist)) + (push (cons (car lst) (cadr lst)) alist)))) + +(defun get-event-handler (object event) + "Take an object and an event, return the object's handler for that event. + +The key bindings alist is stored in the bindings slot of the object. + +If no handler is defined for the event, the default event handler t is tried. +If not even a default handler is defined, the event is ignored. + +If input-blocking is nil, we receive nil events in case no real events occur. +In that case, the handler for the nil event is returned, if defined. + +The event pairs are added by the bind function as conses: (event . #'handler). + +An event should be bound to the pre-defined function exit-event-loop." + (flet ((ev (event) + (let ((keymap (typecase (keymap object) + (keymap (keymap object)) + (symbol (find-keymap (keymap object)))))) + ;; object-local bindings override the external keymap + ;; an event is checked in the bindings first, then in the external keymap. + (if (bindings object) + (if (assoc event (bindings object)) + (assoc event (bindings object)) + (if (and keymap (bindings keymap)) + (assoc event (bindings keymap)) + nil)) + ;; if there are no local bindings, check the external keymap + (if (and keymap (bindings keymap)) + (assoc event (bindings keymap)) + nil))))) + (cond + ;; Event occured and event handler is defined. + ((and event (ev event)) (cdr (ev event))) + ;; Event occured and a default event handler is defined. + ;; If not even the default handler is defined, the event is ignored. + ((and event (ev t)) (cdr (ev t))) + ;; If no event occured and the idle handler is defined. + ;; The event is only nil when input input-blocking is nil. + ((and (null event) (ev nil)) (cdr (ev nil))) + ;; If no event occured and the idle handler is not defined. + (t nil)))) + +(defun run-event-loop (object &rest args) + "Read events from the window, then call predefined event handler functions on the events. + +The handlers can be added by the bind function, or by directly setting a predefined keymap +to the window's bindings slot. + +Args is one or more additional arguments passed to the handlers. + +Provide a non-local exit point so we can exit the loop from an event handler. + +One of the events must provide a way to exit the event loop by throwing 'event-loop. + +The function exit-event-loop is pre-defined to perform this non-local exit." + (catch object + (loop + (let* ((window (typecase object + (form-window (sub-window object)) + ;; if the object is a window + (window object) + ;; if the object isnt a window, it should have an associated window. + (otherwise (window object)))) + (event (get-wide-event window))) + (handle-event object event args) + ;; process the contents of the job queue (ncurses access from other threads) + (process) + ;; should a frame rate be a property of the window or of the object? + (when (and (null event) (frame-rate window)) + (sleep (/ 1.0 (frame-rate window)))) )))) + +(defgeneric handle-event (object event args) + ;; the default method applies to window, field, button, menu. + (:method (object event args) + "Default method for all objects without a specialized method." + (let ((handler (get-event-handler object event))) + (when handler + ;; if args is nil, apply will call the handler with just object and event + ;; this means that if we dont need args, we can define most handlers as two-argument functions. + (apply handler object event args))))) + +(defmethod handle-event ((form form) event args) + "If a form can't handle an event, let the current form element try to handle it." + (let ((handler (get-event-handler form event))) + (if handler + (apply handler form event args) + (handle-event (current-element form) event args)))) + +(defun exit-event-loop (object event &rest args) + "Associate this function with an event to exit the event loop." + (declare (ignore win event args)) + (throw object :exit-event-loop)) + +(defmacro save-excursion (window &body body) + "After executing body, return the cursor in window to its initial position." + (let ((pos (gensym))) + `(let ((,pos (cursor-position ,window))) + ,@body + (move ,window (car ,pos) (cadr ,pos))))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/default_colors.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/default_colors.lisp new file mode 100644 index 0000000..ac5e7e5 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/default_colors.lisp @@ -0,0 +1,30 @@ +(in-package :croatoan) + +;; default_colors +;; use terminal's default colors +;; http://invisible-island.net/ncurses/man/default_colors.3x.html + +;;; C prototypes + +;; int use_default_colors(void); +;; int assume_default_colors(int fg, int bg); + +;;; Low-level C functions + +(defcfun ("use_default_colors" %use-default-colors) :int) +(defcfun ("assume_default_colors" %assume-default-colors) :int (fg :int) (bg :int)) + +;;; High-level Lisp wrappers + +(defun use-default-colors (flag) + "Assign the terminal default colors to the color number -1." + (when flag + (%use-default-colors))) + +(defun assume-default-colors (fg bg) + "Modify the default color pair 0 to use the color numbers fg and bg. + +Ncurses otherwise will use white on black." + (%assume-default-colors fg bg)) + +;;; NOTICE diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/define_key.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/define_key.lisp new file mode 100644 index 0000000..e6ef7b7 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/define_key.lisp @@ -0,0 +1,24 @@ +(in-package :croatoan) + +;; define_key +;; define a keycode +;; http://invisible-island.net/ncurses/man/define_key.3x.html + +;;; C prototypes + +;; int define_key(const char *definition, int keycode); + +;;; Low-level C functions + +(defcfun ("define_key" %define-key) :int (definition :string) (keycode :int)) + +;;; High-level Lisp wrappers + +(defun define-key (definition code) + "Define a new keycode with its definition string. + +If the string is empty, or the code zero or negative, the existing +definition is removed." + (%define-key definition code)) + +;;; TODOs diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/delch.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/delch.lisp new file mode 100644 index 0000000..83f09c6 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/delch.lisp @@ -0,0 +1,14 @@ +(in-package :de.anvi.croatoan) + +(defun delete-char (window &key y x) + "Delete the character under the cursor. + +All characters to the right of the cursor on the same line are moved +to the left one position and the last character on the line is filled +with a blank. The cursor position does not change after moving +to (y,x), if specified." + (let ((winptr (winptr window))) + (cond ((and y x) + (%mvwdelch winptr y x)) + (t + (%wdelch winptr))))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/deleteln.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/deleteln.lisp new file mode 100644 index 0000000..4958872 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/deleteln.lisp @@ -0,0 +1,18 @@ +(in-package :de.anvi.croatoan) + +(defun delete-line (window &key (n 1)) + "Delete n lines starting with the one under the cursor. + +The remaining lines are moved up. The bottom n lines are cleared. + +The current cursor position does not change." + (%winsdelln (winptr window) (- n))) + +(defun insert-line (window &key (n 1)) + "Insert n lines above the current line. + +The current line and the lines below are moved down. The n bottom +lines are lost. + +The current cursor position does not change." + (%winsdelln (winptr window) n)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/extend.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/extend.lisp new file mode 100644 index 0000000..082b28e --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/extend.lisp @@ -0,0 +1,19 @@ +(in-package :croatoan) + +;;; extend +;;; miscellaneous curses extensions +;;; http://invisible-island.net/ncurses/man/curs_extend.3x.html + +;;; C prototypes + +;; const char * curses_version(void); +;; int use_extended_names(bool enable); + +;;; Low-level C functions + +(defcfun ("curses_version" %curses-version) :string) +(defcfun ("use_extended_names" %use-extended-names) :int (enable :boolean)) + +;;; High-level Lisp wrappers + +;;; NOTES diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/form.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/form.lisp new file mode 100644 index 0000000..b7d4abb --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/form.lisp @@ -0,0 +1,484 @@ +(in-package :de.anvi.croatoan) + +;; form +;; curses extension for programming forms +;; https://invisible-island.net/ncurses/man/form.3x.html + +(defun remove-nth (n list) + "Remove element at nth place from the list, decreasing the length of the list. + +Example: (remove-nth 3 '(a b c d e)) => (A B C E)" + (declare + (type (integer 0) n) + (type list list)) + (assert (>= n 0)) + (assert (> (length list) n)) + (if (or (zerop n) (null list)) + (cdr list) + (cons (car list) (remove-nth (1- n) (cdr list))))) + +(defun insert-nth (n element list) + "Insert element into list at nth place, increasing the length of the list. + +Example: (insert-nth 3 'x '(a b c d e)) => (A B C X D E)" + (declare + (type (integer 0) n) + (type list list)) + (assert (>= n 0)) + (assert (>= (length list) n)) + (if (or (zerop n) (null list)) + (cons element list) + (cons (car list) (insert-nth (1- n) element (cdr list))))) + +(defun replace-nth (n element list) + "Replaces element of list at nth place, not increasing the length of the list. + +Example: (replace-nth 3 'x '(a b c d e)) => (A B C X E)" + (declare + (type (integer 0) n) + (type list list)) + (assert (>= n 0)) + (assert (>= (length list) n)) + (if (or (zerop n) (null list)) + (cons element (cdr list)) + (cons (car list) (replace-nth (1- n) element (cdr list))))) + +(defun find-element (form element-name &key (test #'eql) (key #'name)) + "Return from the given form the element given by its name. + +The name should be a keyword, symbol or integer, the default test is eql. + +If the name is a string, equal should be used as the test. + +Instead of the name, another key can be provided to identify the element." + (find element-name (elements form) :test test :key key)) + +;; this is the only place we set the background style for the field +;; TODO: how to access the default fg and bg of a form, +;; if the field is not part of a form? by having a form slot in the field. + +(defmethod clear ((field field) &key) + "Clear the field by overwriting it with the background char. + +The default background char is #\space." + (with-accessors ((pos location) (width width) (selected selectedp) (win window) (style style)) field + (let* ((bg-style (if selected (getf style :selected-background) (getf style :background))) + (bg-char (if (getf bg-style :simple-char) (getf bg-style :simple-char) #\space))) + (setf (cursor-position win) pos) + (add win bg-char :style bg-style :n width) + (setf (cursor-position win) pos)))) + +(defgeneric update-cursor-position (object) + (:documentation "Update the cursor position of the element of a form.") + (:method (object) + "The default method puts the cursor at the start position of the element." + (setf (cursor-position (window object)) (location object)) + (refresh (window object)))) + +;; when the form element is an embedded selection menu or checklist +;; will not work for menu-windows, which arent yet embedded in forms. +;; we need a separate update-cursor-position for menu-window. +;; used in menu.lisp/(draw menu) + +(defmethod update-cursor-position ((object menu)) + "Update the cursor position of a menu after it is drawn. + +Place the cursor, when it is visible, on the first char of the current item." + (setf (cursor-position (window object)) (current-item-location object)) + (refresh (window object))) + +(defmethod update-cursor-position ((object checklist)) + "Update the cursor position of a checklist after it is drawn. + +Place the cursor between the brackets [_] of the current item." + (with-accessors ((pos current-item-location) (win window)) object + (move win + (car pos) + (1+ (cadr pos))) ;; put the cursor after the [ + (refresh win))) + +(defmethod update-cursor-position ((checkbox checkbox)) + "Update the cursor position of a checkbox." + (with-accessors ((pos location) (win window)) checkbox + (move win + (car pos) + (1+ (cadr pos))) ;; put the cursor after the [ + (refresh win) )) + +(defmethod update-cursor-position ((field field)) + "Update the cursor position of a field." + (with-accessors ((pos location) (inptr input-pointer) (dptr display-pointer) (win window)) field + (move win + ;; TODO: assumes a single-line field. + (car pos) + (+ (cadr pos) ; beginning of the field + (- inptr dptr) )) ; position in the field starting with dptr + (refresh win))) + +(defmethod update-cursor-position ((form form)) + "Move the cursor to the correct position in current element of the form." + (update-cursor-position (current-element form))) + +(defgeneric draw (object) + (:documentation "Draw objects (form, field, menu) to their associated window.")) + +(defmethod draw ((label label)) + (with-accessors ((pos location) (win window) (name name) (title title) (width width) (style style) (reference reference) + (parent-form parent-form)) label + ;; pick the string to write in the following order + ;; title of the label + ;; title of the referenced element + ;; name of the referenced element + ;; name of the label + (let* ((text (or title + (title (find-element parent-form reference)) + (name (find-element parent-form reference)) + name)) + (string (when text (format nil "~A" text))) + (fg-style (getf style :foreground)) + (bg-style (getf style :background)) + (bg-char (if (getf bg-style :simple-char) (getf bg-style :simple-char) #\space))) + (when string + ;; first draw the background, but only if width > string + (when width + (apply #'move win pos) + (add win bg-char :style bg-style :n width)) + ;; then the label over the background + (apply #'move win pos) + (add-string win string :style fg-style))))) + +(defmethod draw ((button button)) + (with-accessors ((pos location) (name name) (title title) (win window) (selected selectedp) (style style)) button + (apply #'move win pos) + (let* ((fg-style (if selected (getf style :selected-foreground) (getf style :foreground)))) + (add-string win (format nil "<~A>" (if title title name)) :style fg-style)))) + +(defmethod draw ((checkbox checkbox)) + (with-accessors ((pos location) (name name) (win window) (selected selectedp) (style style) + (checkedp checkedp)) checkbox + (apply #'move win pos) + (let* ((fg-style (if selected (getf style :selected-foreground) (getf style :foreground)))) + (add-string win (format nil "[~A]" (if checkedp "X" "_")) :style fg-style) + (update-cursor-position checkbox)))) + +(defmethod draw ((field field)) + "Clear and redraw the field and its contents and background." + (with-accessors ((pos location) (width width) (inbuf buffer) (inptr input-pointer) (dptr display-pointer) + (selected selectedp) (win window) (title title) (style style)) field + (let* ((fg-style (if selected (getf style :selected-foreground) (getf style :foreground))) + (len (length inbuf)) + (val (value field)) + (str (if (< len width) + ;; if the buffer is shorter than the field, just display it. + val + ;; otherwise display a substring starting with dptr. + ;; display only max width chars starting from dptr + (subseq val dptr (if (< width (- len dptr)) + ;; if the remaining substring is longer than width, display just width chars. + (+ dptr width) + ;; if the remaining substring is shorter than width, just display it. + len) )))) + (clear field) + (apply #'move win pos) + (add-string win str :style fg-style) + (update-cursor-position field)))) + +(defmethod draw ((form form)) + "Draw the form by drawing the elements, then moving the cursor to the current element." + (with-accessors ((elements elements) (window window)) form + (loop for element in elements do + (draw element)) + ;; after drawing the elements, reposition the cursor to the current element + (update-cursor-position form))) + +(defmethod draw ((form form-window)) + "Draw the form by drawing the elements, then moving the cursor to the current element." + ;; update cursor position only refreshes the window associated with the form, which is the sub-window + ;; in order to see the border, we have to touch and refresh the parent border window. + ;; refreshing the parent window has to be done before refreshing the cursor position in the sub + ;; or the cursor will be moved to 0,0 of the parent window. + (touch form) + (refresh form) + ;; draw the form contents, the superclass of form-window is form (and decorated-window). + (call-next-method)) + +;; previous-element and next-element are the only two elements where the current-element-number is changed. +;; here also current-element and selected has to be set. +(defun select-previous-element (form event &rest args) + "Select the previous element in a form's element list." + ;;(declare (special form)) + (with-accessors ((elements elements) (current-element-number current-element-number) (current-element current-element) (win window)) form + (setf (selectedp current-element) nil) + + ;; use mod to cycle the element list. + (setf current-element-number (mod (- current-element-number 1) (length elements))) + (setf current-element (nth current-element-number elements)) + + ;; ignore inactive elements like labels. + (if (activep current-element) + (progn + (setf (selectedp current-element) t) + ;; after we switched the element number, we also have to redraw the form. + (draw form)) + (select-previous-element form event)))) + +(defun select-next-element (form event &rest args) + "Select the next element in a form's element list." + ;;(declare (special form)) + (with-accessors ((elements elements) (current-element-number current-element-number) (current-element current-element) (win window)) form + (setf (selectedp current-element) nil) + + ;; use mod to cycle the element list. + (setf current-element-number (mod (+ current-element-number 1) (length elements))) + (setf current-element (nth current-element-number elements)) + + ;; ignore inactive elements like labels. + (if (activep current-element) + (progn + (setf (selectedp current-element) t) + ;; after we switched the element number, we also have to redraw the form. + (draw form)) + (select-next-element form event)))) + +(defun move-previous-char (field event &rest args) + "Move the cursor to the previous char in the field." + (with-accessors ((inptr input-pointer) (dptr display-pointer) (win window)) field + (when (> inptr 0) + (decf inptr)) + ;; when the inptr moves left past the dptr, simultaneously decf the dptr. + (when (< inptr dptr) + (decf dptr)) + (draw field))) + +(defun move-next-char (field event &rest args) + "Move the cursor to the next char in the field." + (with-accessors ((width width) (inbuf buffer) (inptr input-pointer) (dptr display-pointer) (mlen max-buffer-length) + (win window)) field + (when (and (< inptr (length inbuf)) + (not (= (1+ inptr) mlen width))) + (incf inptr)) + ;; when the inptr moves right past the width, simultaneously incf the dptr. + (when (and (>= inptr (+ dptr width)) + (not (= inptr mlen width))) + (incf dptr)) + (draw field))) + +(defun delete-previous-char (field event &rest args) + "Delete the previous char in the field, moving the cursor to the left." + (with-accessors ((inbuf buffer) (inptr input-pointer) (dptr display-pointer) (win window)) field + (when (> inptr 0) + (decf inptr) + (when (> dptr 0) + (decf dptr)) + (setf inbuf (remove-nth (- (length inbuf) 1 inptr) inbuf))) + ;; we dont have to redraw the complete form, just the changed field. + (draw field))) + +(defun delete-next-char (field event &rest args) + "Delete the next char (char under the cursor) in the field, not moving the cursor." + (with-accessors ((inbuf buffer) (inptr input-pointer) (dptr display-pointer) (win window)) field + ;; we can only delete to the right if the inptr is not at the end of the inbuf. + (when (> (length inbuf) inptr) + (when (> dptr 0) + ;; when a part of the string is hidden on the left side, shift it to the right. + (decf dptr)) + (setf inbuf (remove-nth (- (length inbuf) (1+ inptr)) inbuf))) + (draw field))) + +(defun field-add-char (field char &rest args) + "Add char to the current cursor position in the field. + +The buffer can be longer than the displayed field width, horizontal scrolling is enabled." + (if (and (characterp char) (graphic-char-p char)) + (progn + (with-accessors ((width width) (inbuf buffer) (mlen max-buffer-length) (inptr input-pointer) + (dptr display-pointer) (win window)) field + (let ((len (length inbuf))) + (if (insert-mode-p win) + + ;; insert mode + (progn + ;; only add new chars until we've reached the max-buffer-length + (unless (>= len mlen) + ;; if we're at the end of the inbuf + (if (= inptr len) + ;; just add another char to the inbuf + (setf inbuf (cons char inbuf)) + ;; if we're in the middle of the buffer, either insert or replace + (setf inbuf (insert-nth (- len inptr) char inbuf)) ) + ;; we need special cases when mlen is exactly equal to width. + (if (= mlen width) + ;; advance the cursor if it is not already at the end + ;; if scrolling is disabled, do not move past the last char in the field. + (unless (>= inptr (- mlen 1)) + (incf inptr)) + (unless (> inptr (- mlen 1)) + (incf inptr)))) + ;; after updating the fill-pointer, update the display-pointer + (if (< inptr dptr) (decf dptr)) + (if (> inptr (+ dptr (1- width))) (incf dptr))) + ;; default overwrite mode + (progn + ;; only add new chars until we've reached the max-buffer-length then only overwrite. + (if (>= len mlen) + (if (< inptr mlen) + ;; even when the inbuf is full, when inptr is not at the end, overwrite. + (setf inbuf (replace-nth (- len (1+ inptr)) char inbuf)) + nil) + ;; if we're at the end of the inbuf + (if (= inptr len) + ;; just add another char to the inbuf + (setf inbuf (cons char inbuf)) + ;; if we're in the middle of the buffer, either insert or replace + (setf inbuf (replace-nth (- len (1+ inptr)) char inbuf)))) + ;; we need special cases when mlen is exactly equal to width. + (if (= mlen width) + ;; advance the cursor if it is not already at the end + ;; if scrolling is disabled, do not move past the last char in the field. + (unless (>= inptr (- mlen 1)) + (incf inptr)) + (unless (> inptr (- mlen 1)) + (incf inptr))) + ;; after updating the fill-pointer, update the display-pointer + (when (< inptr dptr) (decf dptr)) + (if (<= mlen width) + ;; if scrolling is disabled, do not move past the last char in the field. + (when (> inptr (+ dptr width)) + (incf dptr)) + (when (> inptr (+ dptr (1- width))) + (incf dptr))) )))) + (draw field)) + ;; if the char isnt graphic, do nothing. + ;; TODO: this doesnt work with acs chars, which are keywords. + nil)) + +(defun debug-print-field-buffer (object event &rest args) + (declare (ignore event)) + (typecase object + (field + (with-accessors ((inbuf buffer) (inptr input-pointer) (dptr display-pointer) (win window)) object + (when (> (length inbuf) 0) + (clear win) + (format win "~A ~%" (value object)) + (setf inbuf nil inptr 0 dptr 0)))) + ;; when we want to debug the whole form. + (form + (debug-print-field-buffer (current-element object) event))) + (draw object)) + +(defun cancel (object event &rest args) + "Associate this function with an event (key binding or button) to exit the event loop of a form or form element. + +The first return value is nil, emphasizing that the user has canceled the form. + +The second value is a list containing the object, the event that called the exit and the args passed. + +This allows to specify why the form was canceled." + ;; TODO: should this be done by the routine or explicitely by the user? + (when (eq (type-of object) 'form) + (reset-form object event)) + (throw (if (eq (type-of object) 'form) + object + (if (parent-form object) + (parent-form object) + object)) + (values nil (list object event args)))) + +(defun accept (object event &rest args) + "Associate this function with an event (key binding or button) to exit the event loop of a form or form element. + +The first return value is t, emphasizing that the user has accepted the form. + +The second value is a list containing the object, the event that called the exit and the args passed. + +This allows to specify by which button or event the form was accepted." + ;; if the object has a parent-form, do not throw the object, throw its parent form, otherwise throw the object. + (throw (if (eq (type-of object) 'form) + object + (if (parent-form object) + (parent-form object) + object)) + (values t (list object event args)))) + +(defun reset-field (field event &rest args) + "Clear the field and reset its internal buffers and pointers." + (with-accessors ((inbuf buffer) (inptr input-pointer) (dptr display-pointer) (win window)) field + (clear field) + (setf inbuf nil inptr 0 dptr 0))) + +(defun reset-form (object event &rest args) + (declare (ignore event)) + (let ((form (typecase object + (form object) + (t (parent-form object))))) + (loop for element in (elements form) + do (when (and (typep element 'field) (activep element)) + (with-accessors ((inbuf buffer) (inptr input-pointer) (dptr display-pointer) (win window)) element + (setf inbuf nil + inptr 0 + dptr 0)))) + (draw form))) + +(define-keymap 'form-map + (list + ;; C-a = ^A = #\soh = 1 = start of heading + ;; exit the edit loop, return t + #\soh 'accept + ;; C-x = cancel = CAN = #\can + ;; exit the edit loop, return nil + #\can 'cancel + ;; C-r = reset = DC2 = #\dc2 + ;; reset editable elements of the form (fields, checkboxes) + #\dc2 'reset-form + + :btab 'select-previous-element + #\tab 'select-next-element)) + +(define-keymap 'field-map + (list + ;; C-a = ^A = #\soh = 1 = start of heading + ;; exit the edit loop, return t + #\soh 'accept + ;; C-x = cancel = CAN = #\can + ;; exit the edit loop, return nil + #\can 'cancel + ;; C-r = reset = DC2 = #\dc2 + ;; reset the field + #\dc2 'reset-field + + :left 'move-previous-char + :right 'move-next-char + :backspace 'delete-previous-char + :dc 'delete-next-char + :ic (lambda (field event &rest args) + (setf (insert-mode-p (window field)) (not (insert-mode-p (window field))))) + t 'field-add-char)) + +(defun call-button-function (button event &rest args) + (declare (ignore event)) + (when (callback button) + (funcall (callback button) button event))) + +(defun toggle-checkbox (checkbox event &rest args) + (declare (ignore event)) + (setf (checkedp checkbox) (not (checkedp checkbox))) + (draw checkbox)) + +;; How to automatically bind a hotkey to every button? +;; that hotkey would have to be added to the form keymap, not to that of a button. +;; that would be like a global keymap, in contrast to an elements local keymap. +(define-keymap 'button-map + (list + #\space 'call-button-function + #\newline 'call-button-function)) + +(define-keymap 'checkbox-map + (list + #\space 'toggle-checkbox + #\x 'toggle-checkbox)) + +(defun edit (object &rest args) + (draw object) + ;; since we have args passed to run-event-loop, all handler functions have to accept + ;; a &rest args argument. + (apply #'run-event-loop object args)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/get_wch.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/get_wch.lisp new file mode 100644 index 0000000..611f277 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/get_wch.lisp @@ -0,0 +1,36 @@ +(in-package :de.anvi.croatoan) + +(defun get-wide-char (window &key y x) + "Read in a wide C wchar_t (multi-byte) from the keyboard and return it. + +If the destination coordinates y (row) and x (column) are given, move +the cursor to the destination first and then read a multi-byte char. + +The window from which the char is read is automatically refreshed." + (when (and y x) (move window y x)) + + (with-foreign-object (ptr 'wint_t) + ;; #define KEY_CODE_YES 0400 /* A wchar_t contains a key code */ + ;; if the char is a function key, return t as a second value, otherwise nil. + (if (= 256 (%wget-wch (winptr window) ptr)) + (values (mem-ref ptr 'wint_t) t) + (values (mem-ref ptr 'wint_t) nil)))) + +(defun get-wide-event (window) + "Return a single user input event. + +An event can be a lisp character or a keyword representing a function or mouse key. + +If input-blocking is nil for the window, return nil if no key was typed." + (multiple-value-bind (ch function-key-p) (get-wide-char window) + (cond + ;; for wide chars, if no input is waiting in non-blocking mode, ERR=0 is returned. + ;; for normal chars, ERR=-1. + ((= ch 0) nil) + (function-key-p + (let ((ev (function-key ch))) + (if (eq ev :mouse) + (multiple-value-bind (mev y x) (get-mouse-event) + (values mev y x)) ; returns 3 values, see mouse.lisp + ev))) + (t (code-char ch))))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/getch.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/getch.lisp new file mode 100644 index 0000000..66fbc82 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/getch.lisp @@ -0,0 +1,520 @@ +(in-package :de.anvi.croatoan) + +(defun get-char (window &key y x) + "Read in a C char (single byte) from the keyboard and return it. + +If the destination coordinates y (row) and x (column) are given, move +the cursor to the destination first and then read a single byte. + +The window from which the char is read is automatically refreshed." + (let ((winptr (winptr window))) + (cond ((and y x) + (%mvwgetch winptr y x)) + (t + (%wgetch winptr))))) + +;; takes a simple C chtype and puts it back into the read buffer. +;; it will be read with the next get-char. +(defun unget-char (chtype) + (%ungetch chtype)) + +;; takes an C int denoting a key. returns t or nil. +;; checks whether a function key is supported by the current terminal. +(defun key-supported-p (key-char) + (%has-key key-char)) + +;;; NOTES + +;; All those return a simple C char (or int), not a rendered chtype (unsigned long int). +;; you can use code-char to convert this simple char/int to a lisp char. +;; but you cannot use this to convert a chtype to a lisp char. + +;;; TODOs + +;; [ ] Escape sequences. They are neither function keys nor chars. + + + +;; keys above the first 0-255 chars. cannot fit in a char variable any more. +;; http://tldp.org/HOWTO/NCURSES-Programming-HOWTO/keys.html +(defparameter *key-alist* + '((:code_yes . 256) + (:min . 257) + (:break . 257) + (:down . 258) + (:up . 259) + (:left . 260) + (:right . 261) + (:home . 262) ; Pos1 + (:backspace . 263) + (:f0 . 264) + + (:f1 . 265) + (:f2 . 266) + (:f3 . 267) + (:f4 . 268) + (:f5 . 269) + (:f6 . 270) + (:f7 . 271) + (:f8 . 272) + (:f9 . 273) + (:f10 . 274) + (:f11 . 275) + (:f12 . 276) + (:f13 . 277) + (:f14 . 278) + (:f15 . 279) + (:f16 . 280) + (:f17 . 281) + (:f18 . 282) + (:f19 . 283) + (:f20 . 284) + (:f21 . 285) + (:f22 . 286) + (:f23 . 287) + (:f24 . 288) + (:f25 . 289) + (:f26 . 290) + (:f27 . 291) + (:f28 . 292) + (:f29 . 293) + (:f30 . 294) + (:f31 . 295) + (:f32 . 296) + (:f33 . 297) + (:f34 . 298) + (:f35 . 299) + (:f36 . 300) + (:f37 . 301) + (:f38 . 302) + (:f39 . 303) + (:f40 . 304) + (:f41 . 305) + (:f42 . 306) + (:f43 . 307) + (:f44 . 308) + (:f45 . 309) + (:f46 . 310) + (:f47 . 311) + (:f48 . 312) + (:f49 . 313) + (:f50 . 314) + (:f51 . 315) + (:f52 . 316) + (:f53 . 317) + (:f54 . 318) + (:f55 . 319) + (:f56 . 320) + (:f57 . 321) + (:f58 . 322) + (:f59 . 323) + (:f60 . 324) + (:f61 . 325) + (:f62 . 326) + (:f63 . 327) + + (:dl . 328) + (:il . 329) + (:dc . 330) + (:ic . 331) + (:eic . 332) + (:clear . 333) + (:eos . 334) + (:eol . 335) + (:sf . 336) ; :shift-down + (:sr . 337) ; :shift-up + (:npage . 338) + (:ppage . 339) + (:stab . 340) + (:ctab . 341) + (:catab . 342) + (:enter . 343) + (:sreset . 344) + (:reset . 345) + (:print . 346) + (:ll . 347) + (:a1 . 348) + (:a3 . 349) + (:b2 . 350) + (:c1 . 351) + (:c3 . 352) + (:btab . 353) ; Shift + TAB = #\LATIN_SMALL_LETTER_S_WITH_CARON = sch + (:beg . 354) + (:cancel . 355) + (:close . 356) + (:command . 357) + (:copy . 358) + (:create . 359) + (:end . 360) ; Ende + (:exit . 361) + (:find . 362) + (:help . 363) + (:mark . 364) + (:message . 365) + (:move . 366) + (:next . 367) + (:open . 368) + (:options . 369) + (:previous . 370) + (:redo . 371) + (:reference . 372) + (:refresh . 373) + (:replace . 374) + (:restart . 375) + (:resume . 376) + (:save . 377) + (:sbeg . 378) + (:scancel . 379) + (:scommand . 380) + (:scopy . 381) + (:screate . 382) + (:sdc . 383) + (:sdl . 384) + (:select . 385) + (:send . 386) ; Shift-End + (:seol . 387) + (:sexit . 388) + (:sfind . 389) + (:shelp . 390) + (:shome . 391) ; Shift-Home, Shift-Pos1 + (:sic . 392) + (:sleft . 393) + (:smessage . 394) + (:smove . 395) + (:snext . 396) + (:soptions . 397) + (:sprevious . 398) + (:sprint . 399) + (:sredo . 400) + (:sreplace . 401) + (:sright . 402) + (:srsume . 403) + (:ssave . 404) + (:ssuspend . 405) + (:sundo . 406) + (:suspend . 407) + (:undo . 408) + (:mouse . 409) + (:resize . 410) + (:event . 411) + (:max . 511) ; Alt-Delete + + ;; The following codes are not part of ncurses because they are not portable, i.e. they do not + ;; exist on all terminals. + ;; These are tested on xterm / gnome-terminal + + ;; :shift-delete = :sdc + (:shift-alt-delete . 512) + (:ctrl-delete . 513) ; Ctrl-Delete + (:shift-ctrl-delete . 514) ; Shift-Control-Delete + + ;; :shift-down = :sf = 336 + (:alt-down . 517) + (:shift-alt-down . 518) + (:ctrl-down . 519) + (:shift-ctrl-down . 520) + ;; (:shift-alt-ctrl-down . xxx) ;; hijacked by the ubuntu unity wm. + + (:alt-end . 522) + (:shift-alt-end . 523) + (:ctrl-end . 524) + (:shift-ctrl-end . 525) + (:ctrl-alt-end . 526) + ;; :shift-ctrl-alt-end . xxx + + (:alt-home . 527) + (:shift-alt-home . 528) + (:ctrl-home . 529) + (:shift-ctrl-home . 530) + (:ctrl-alt-home . 531) + + (:alt-insert . 532) ; Alt-Insert + ;; :shift-insert = middle mouse button paste, probably 513, hijacked by xterm. + (:ctrl-insert . 534) ; Ctrl-Insert + (:ctrl-alt-insert . 536) ; Ctrl-Alt-Insert + + ;; Shift-Ctrl-Alt-Insert = ^[ [ 3 ; 8 ~ + + (:alt-left . 537) + (:shift-alt-right . 538) + (:ctrl-left . 539) + (:shift-ctrl-left . 540) + + ;; npage + ;; :shift-npage + (:alt-npage . 542) + (:ctrl-npage . 544) + (:ctrl-alt-npage . 546) + + ;; :ppage + ;; :shift-ppage activates an xterm ppage function + (:alt-ppage . 547) + (:ctrl-ppage . 549) + (:ctrl-alt-ppage . 551) + + (:alt-right . 552) + (:shift-alt-right . 553) + (:ctrl-right . 554) + (:shift-ctrl-left . 555) + + ;; :shift-up = :sr = 337 + (:alt-up . 558) + (:shift-alt-up . 559) + (:ctrl-up . 560) + (:shift-ctrl-up . 561))) + ;; (:shift-alt-ctrl-up . xxx) + +;; Takes a short int returned by get-char, +;; returns a keyword represeting the function key. +;; returns nil if number is not in the list. +(defun function-key (number) + (car (rassoc number *key-alist*))) + +;; Returns t if the number is a key, nil if it is a char. +(defun function-key-p (number) + (if (and (> number 255) + (rassoc number *key-alist*)) + t + nil)) + +;; http://rosettacode.org/wiki/Keyboard_input/Keypress_check +;; Returns t if a key has been pressed and a char can be read by get-char. +;; Requires input-blocking for window to be set to nil. +(defun key-pressed-p (window) + (let ((ch (get-char window))) + ;; ncurses get-char returns -1 when no key was pressed. + (unless (= ch -1) + ;; if a key was pressed, put it back into the input buffer so it can be rad by the next call to get-char. + (unget-char ch) + ;; Return t. + t))) + +;; works only when input-blocking is set to nil. enable-fkeys should also be t. +;; events can be handled with case. +;; events can be nil (no key pressed), characters #\a and function keys like :up, :down, etc. +;; todo: mouse, resizekey +(defun get-event (window) + ;; doesnt really get a "char", but a single byte, which can be a char. + (let ((ch (get-char window))) + (cond + ;; -1 means no key has been pressed. + ((= ch -1) nil) + ;; 0-255 are regular chars, whch can be converted to lisp chars with code-char. + ((and (>= ch 0) (<= ch 255)) (code-char ch)) + ;; if the code belongs to a known function key, return a keyword symbol. + ((function-key-p ch) + (let ((ev (function-key ch))) + (if (eq ev :mouse) + (multiple-value-bind (mev y x) (get-mouse-event) + (values mev y x)) ; returns 3 values, see mouse.lisp + ev))) + ;; todo: unknown codes, like mouse, resize and unknown function keys. + (t + ;;(error "invalid value of char received from ncurses.") + (princ ch window))))) + +#| + ;; I dont want them defined as octal literals. + '((:code_yes . #o400) + (:min . #o401) + + (:break . #o401) + (:down . #o402) + (:up . #o403) + (:left . #o404) + (:right . #o405) + (:home . #o406) + (:backspace . #o407) + (:f0 . #o410) + + ;; how to handle this??? + ;; F(n) (KEY_F0+(n)) /* Value of function key n */ + ;; (loop for i from 1 to 63 do (format t "(:f~A . ~A)~%" i (+ F0 i))) + + (:dl . #o510) + (:il . #o511) + (:dc . #o512) + (:ic . #o513) + (:eic . #o514) + (:clear . #o515) + (:eos . #o516) + (:eol . #o517) + (:sf . #o520) + (:sr . #o521) + (:npage . #o522) + (:ppage . #o523) + (:stab . #o524) + (:ctab . #o525) + (:catab . #o526) + (:enter . #o527) + (:sreset . #o530) + (:reset . #o531) + (:print . #o532) + (:ll . #o533) + (:a1 . #o534) + (:a3 . #o535) + (:b2 . #o536) + (:c1 . #o537) + (:c3 . #o540) + (:btab . #o541) + (:beg . #o542) + (:cancel . #o543) + (:close . #o544) + (:command . #o545) + (:copy . #o546) + (:create . #o547) + (:end . #o550) + (:exit . #o551) + (:find . #o552) + (:help . #o553) + (:mark . #o554) + (:message . #o555) + (:move . #o556) + (:next . #o557) + (:open . #o560) + (:options . #o561) + (:previous . #o562) + (:redo . #o563) + (:reference . #o564) + (:refresh . #o565) + (:replace . #o566) + (:restart . #o567) + (:resume . #o570) + (:save . #o571) + (:sbeg . #o572) + (:scancel . #o573) + (:scommand . #o574) + (:scopy . #o575) + (:screate . #o576) + (:sdc . #o577) + (:sdl . #o600) + (:select . #o601) + (:send . #o602) + (:seol . #o603) + (:sexit . #o604) + (:sfind . #o605) + (:shelp . #o606) + (:shome . #o607) + (:sic . #o610) + (:sleft . #o611) + (:smessage . #o612) + (:smove . #o613) + (:snext . #o614) + (:soptions . #o615) + (:sprevious . #o616) + (:sprint . #o617) + (:sredo . #o620) + (:sreplace . #o621) + (:sright . #o622) + (:srsume . #o623) + (:ssave . #o624) + (:ssuspend . #o625) + (:sundo . #o626) + (:suspend . #o627) + (:undo . #o630) + (:mouse . #o631) + (:resize . #o632) + (:event . #o633) + + (:max . #o777))) + +#define KEY_CODE_YES 0400 /* A wchar_t contains a key code */ +#define KEY_MIN 0401 /* Minimum curses key */ + +#define KEY_BREAK 0401 /* Break key (unreliable) */ +#define KEY_DOWN 0402 /* down-arrow key */ +#define KEY_UP 0403 /* up-arrow key */ +#define KEY_LEFT 0404 /* left-arrow key */ +#define KEY_RIGHT 0405 /* right-arrow key */ +#define KEY_HOME 0406 /* home key */ +#define KEY_BACKSPACE 0407 /* backspace key */ +#define KEY_F0 0410 /* Function keys. Space for 64 */ +#define KEY_F(n) (KEY_F0+(n)) /* Value of function key n */ +#define KEY_DL 0510 /* delete-line key */ +#define KEY_IL 0511 /* insert-line key */ +#define KEY_DC 0512 /* delete-character key */ +#define KEY_IC 0513 /* insert-character key */ +#define KEY_EIC 0514 /* sent by rmir or smir in insert mode */ +#define KEY_CLEAR 0515 /* clear-screen or erase key */ +#define KEY_EOS 0516 /* clear-to-end-of-screen key */ +#define KEY_EOL 0517 /* clear-to-end-of-line key */ +#define KEY_SF 0520 /* scroll-forward key */ +#define KEY_SR 0521 /* scroll-backward key */ +#define KEY_NPAGE 0522 /* next-page key */ +#define KEY_PPAGE 0523 /* previous-page key */ +#define KEY_STAB 0524 /* set-tab key */ +#define KEY_CTAB 0525 /* clear-tab key */ +#define KEY_CATAB 0526 /* clear-all-tabs key */ +#define KEY_ENTER 0527 /* enter/send key */ +#define KEY_SRESET 0530 /* Soft (partial) reset (unreliable) */ +#define KEY_RESET 0531 /* Reset or hard reset (unreliable) */ +#define KEY_PRINT 0532 /* print key */ +#define KEY_LL 0533 /* lower-left key (home down) */ +#define KEY_A1 0534 /* upper left of keypad */ +#define KEY_A3 0535 /* upper right of keypad */ +#define KEY_B2 0536 /* center of keypad */ +#define KEY_C1 0537 /* lower left of keypad */ +#define KEY_C3 0540 /* lower right of keypad */ +#define KEY_BTAB 0541 /* back-tab key */ +#define KEY_BEG 0542 /* begin key */ +#define KEY_CANCEL 0543 /* cancel key */ +#define KEY_CLOSE 0544 /* close key */ +#define KEY_COMMAND 0545 /* command key */ +#define KEY_COPY 0546 /* copy key */ +#define KEY_CREATE 0547 /* create key */ +#define KEY_END 0550 /* end key */ +#define KEY_EXIT 0551 /* exit key */ +#define KEY_FIND 0552 /* find key */ +#define KEY_HELP 0553 /* help key */ +#define KEY_MARK 0554 /* mark key */ +#define KEY_MESSAGE 0555 /* message key */ +#define KEY_MOVE 0556 /* move key */ +#define KEY_NEXT 0557 /* next key */ +#define KEY_OPEN 0560 /* open key */ +#define KEY_OPTIONS 0561 /* options key */ +#define KEY_PREVIOUS 0562 /* previous key */ +#define KEY_REDO 0563 /* redo key */ +#define KEY_REFERENCE 0564 /* reference key */ +#define KEY_REFRESH 0565 /* refresh key */ +#define KEY_REPLACE 0566 /* replace key */ +#define KEY_RESTART 0567 /* restart key */ +#define KEY_RESUME 0570 /* resume key */ +#define KEY_SAVE 0571 /* save key */ +#define KEY_SBEG 0572 /* shifted begin key */ +#define KEY_SCANCEL 0573 /* shifted cancel key */ +#define KEY_SCOMMAND 0574 /* shifted command key */ +#define KEY_SCOPY 0575 /* shifted copy key */ +#define KEY_SCREATE 0576 /* shifted create key */ +#define KEY_SDC 0577 /* shifted delete-character key */ +#define KEY_SDL 0600 /* shifted delete-line key */ +#define KEY_SELECT 0601 /* select key */ +#define KEY_SEND 0602 /* shifted end key */ +#define KEY_SEOL 0603 /* shifted clear-to-end-of-line key */ +#define KEY_SEXIT 0604 /* shifted exit key */ +#define KEY_SFIND 0605 /* shifted find key */ +#define KEY_SHELP 0606 /* shifted help key */ +#define KEY_SHOME 0607 /* shifted home key */ +#define KEY_SIC 0610 /* shifted insert-character key */ +#define KEY_SLEFT 0611 /* shifted left-arrow key */ +#define KEY_SMESSAGE 0612 /* shifted message key */ +#define KEY_SMOVE 0613 /* shifted move key */ +#define KEY_SNEXT 0614 /* shifted next key */ +#define KEY_SOPTIONS 0615 /* shifted options key */ +#define KEY_SPREVIOUS 0616 /* shifted previous key */ +#define KEY_SPRINT 0617 /* shifted print key */ +#define KEY_SREDO 0620 /* shifted redo key */ +#define KEY_SREPLACE 0621 /* shifted replace key */ +#define KEY_SRIGHT 0622 /* shifted right-arrow key */ +#define KEY_SRSUME 0623 /* shifted resume key */ +#define KEY_SSAVE 0624 /* shifted save key */ +#define KEY_SSUSPEND 0625 /* shifted suspend key */ +#define KEY_SUNDO 0626 /* shifted undo key */ +#define KEY_SUSPEND 0627 /* suspend key */ +#define KEY_UNDO 0630 /* undo key */ +#define KEY_MOUSE 0631 /* Mouse event has occurred */ +#define KEY_RESIZE 0632 /* Terminal resize event */ +#define KEY_EVENT 0633 /* We were interrupted by an event */ + +#define KEY_MAX 0777 /* Maximum key value is 0633 */ + +|# diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/getstr.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/getstr.lisp new file mode 100644 index 0000000..7fb8063 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/getstr.lisp @@ -0,0 +1,19 @@ +(in-package :de.anvi.croatoan) + +(defun get-string (window n &key y x) + "Read a string from the keyboard and return it. + +Reading is performed until a newline or carriage return is received. +The terminating character is not included in the returned string. + +If n is given, read at most n chars, to prevent a possible input +buffer overflow. + +If the destination coordinates y and x are given, move the cursor +there first." + (let ((winptr (winptr window))) + (with-foreign-pointer-as-string (string n) + (cond ((and y x) + (%mvwgetnstr winptr y x string n)) + (t + (%wgetnstr winptr string n)))))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/getyx.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/getyx.lisp new file mode 100644 index 0000000..4e52bb0 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/getyx.lisp @@ -0,0 +1,54 @@ +(in-package :de.anvi.croatoan) + +;; TODO: window auf winpter umstellen. + +(defun cursor-position (window) + "Returns a cons pair of the current cursor coordinates (line-y . column-x) in window." + (cons (%getcury window) + (%getcurx window))) + +(defun window-begin (window) + "Returns a cons pair of the top left beginning coordinates (y . x) of window." + (cons (%getbegy window) + (%getbegx window))) + +(defun subwindow-relative-begin (subwindow) + "Returns a cons pair (y . x) of beginning coordinates of a subwindow relative to the parent window." + (cons (%getpary subwindow) + (%getparx subwindow))) + +(defun window-size (window) + "Returns window size as a cons pair (height . width)." + (cons (%getmaxy window) + (%getmaxx window))) + +;;; NOTES + +#| + +Those 4 C macros are defined in terms of other, simpler macros: + +#define getyx(win,y,x) (y = getcury(win), x = getcurx(win)) +#define getbegyx(win,y,x) (y = getbegy(win), x = getbegx(win)) +#define getmaxyx(win,y,x) (y = getmaxy(win), x = getmaxx(win)) +#define getparyx(win,y,x) (y = getpary(win), x = getparx(win)) + +And those simpler macros are just accessing the window struct. + +#define getcurx(win) ((win) ? (win)->_curx : ERR) +#define getcury(win) ((win) ? (win)->_cury : ERR) +#define getbegx(win) ((win) ? (win)->_begx : ERR) +#define getbegy(win) ((win) ? (win)->_begy : ERR) +#define getmaxx(win) ((win) ? ((win)->_maxx + 1) : ERR) +#define getmaxy(win) ((win) ? ((win)->_maxy + 1) : ERR) +#define getparx(win) ((win) ? (win)->_parx : ERR) +#define getpary(win) ((win) ? (win)->_pary : ERR) + +Those are defined as low-level functions in legacy.lisp. + +|# + +;;; TODOs + +;; combine the 2 win and subwin functions into one by using opaque/is_subwin. + diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/gray_streams.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/gray_streams.lisp new file mode 100644 index 0000000..651b145 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/gray_streams.lisp @@ -0,0 +1,162 @@ +(in-package :de.anvi.croatoan) + +#| + +classes and methods for the gray stream interface. + +http://www.nhplace.com/kent/CL/Issues/stream-definition-by-user.html +http://www.gnu.org/software/clisp/impnotes/gray-gf-char-out.html + +before including this, add trivial-gray-streams to asd or use the sb-gray stream package. + +Up to now, window and screen had no superclasses, thus they were subclasses of standard-object. +Now, they will become bi-directional character streams. + +That means that we dont need separate classes for defining streams, and that windows will have +a stream as a feature, windows now will _be_ specialized streams. + +fundamental-character-output-stream +fundamental-character-input-stream + window + screen + subwin + +For the existing code, nothing will change. we will still be able to use all ncurses and croatoan +functions. + +Actually, we still _need_ those functions to define the gray stream functions. But once defined, +we will not need add-char and add-string any more, we will simply use Lisp's format, read, print, etc. + +|# + +;;;; libncursesw, wide IO + +;;; Character Output stream + +;;; Mandatory methods + +;; write-char, format ~C +(defmethod stream-write-char ((stream window) (ch character)) + (if (insert-mode-p stream) + (progn + (insert-wide-char stream ch) + ;; move the cursor after the inserted character. + (move-direction stream :right)) + (add-wide-char stream ch))) + +;; 170830: #sbcl, according to stassats we can not specialize on the second argument, +;; so no complex chars or complex strings with the ~C directive. +;; use ~/xyz/ instead of ~C. +;; ~A uses print-object underneath, not gray streams, so it probably can be used. +#| +; SLIME 2.19 +CL-USER> (defun xxx (&rest args) + (print (second args))) +XXX +CL-USER> xxx +; Evaluation aborted on #. +CL-USER> (xxx 1 2 3 4) + +2 +2 +CL-USER> (format t "~/xxx/") +; Evaluation aborted on #. +CL-USER> (format t "~/xxx/" 1) + +1 +NIL +CL-USER> (format t "~/xxx/" 11) + +11 +NIL +CL-USER> +|# +(defmethod stream-write-char ((stream window) (ch complex-char)) + (add-wide-char stream ch)) + +;; Returns the column number where the next character would be written, i.e. the current x position +(defmethod stream-line-column ((stream window)) + (%getcurx (winptr stream))) + +;;; Non-mandatory methods + +;; Default method uses repeated calls to stream-write-char +;; We can not specialize stream-write-string on complex-strings. + +#| +(defmethod stream-write-string ((stream window) (str-orig string) &optional (start 0) (end nil)) + ;; TODO: either do something with start and end, or (declare (ignore start end)) + (let ((str (subseq str-orig start end))) + ;; TODO: we can not combine %wadd-wch and %waddstr + ;; TODO: writing a normal string waddstr on a wide cchar background causes an SB-KERNEL::CONTROL-STACK-EXHAUSTED-ERROR + (%waddstr (winptr stream) str))) +|# + +;;; Character Input Stream + +;;; Mandatory methods: stream-read-char, stream-unread-char + +(defmethod stream-read-char ((stream window)) + (code-char (get-wide-char stream))) + +(defmethod stream-unread-char ((stream window) (ch character)) + (%unget-wch (char-code ch))) + +;;;; libncurses, non-wide IO + +;;; Character Output stream + +;;; Mandatory methods: stream-write-char, stream-line-column + +;; write-char, format ~C +;;(defmethod stream-write-char ((stream window) (ch character)) +;; (let ((code (char-code ch)) +;; (winptr (winptr stream))) +;; (if (insert-mode-p stream) +;; (progn +;; (%winsch winptr code) +;; ;; move the cursor after the inserted character. +;; (move-to stream :right)) +;; (%waddch winptr code)))) + +;; write-char, format ~C +;;(defmethod stream-write-char ((stream window) (ch complex-char)) +;; (%waddch (winptr stream) (x2c ch))) + +;; print, prin1, princ, format ~A, ~S +;;(defmethod print-object ((ch complex-char) (stream window)) +;; (%waddch (winptr stream) (x2c ch))) +;; +;;(defmethod print-object ((cstr complex-string) stream) +;; (loop for ch across (complex-char-array cstr) +;; do (princ (simple-char ch)))) +;; +;;(defmethod print-object ((cstr complex-string) (stream window)) +;; (loop for ch across (complex-char-array cstr) +;; do (add-char stream ch))) + +;; Returns the column number where the next character would be written, i.e. the current y position +;;(defmethod stream-line-column ((stream window)) +;; (%getcurx (winptr stream))) + +;;; Non-mandatory methods + +;; Default method uses repeated calls to stream-write-char +;;(defmethod stream-write-string ((stream window) (str string) &optional (start 0) (end nil)) +;; ;; TODO: either do something with start and end, or (declare (ignore start end)) +;; (%waddstr (winptr stream) str)) + +;;; Character Input Stream + +;;(defmethod stream-read-char ((stream window)) +;; (code-char (%wgetch (winptr stream)))) + +;;(defmethod stream-read-char-no-hang ((stream window)) +;; %wgetch wie bei read-char, nur muss input-blocking nil sein. + +;;(defmethod stream-unread-char ((stream window) (ch character)) +;; (%ungetch (char-code ch))) + +;; listen = read-char-no-hang + unread +;;(defmethod stream-listen ((stream window)) + diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/in_wch.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/in_wch.lisp new file mode 100644 index 0000000..16ab056 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/in_wch.lisp @@ -0,0 +1,14 @@ +(in-package :de.anvi.croatoan) + +(defun extract-wide-char (window &key y x position) + "Extract and return a single wide (complex) character from the window. + +This includes wide characters (code > 255), and requires the ncursesw library. + +If the position coordinates y (row) and x (column) are given, move the +cursor to the position first and then add the character. + +The position can also be passed in form of a two-element list." + (when (and y x) (move window y x)) + (when position (apply #'move window position)) + (funcall-get-cchar_t #'%win-wch window)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/inch.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/inch.lisp new file mode 100644 index 0000000..9845332 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/inch.lisp @@ -0,0 +1,14 @@ +(in-package :de.anvi.croatoan) + +(defun extract-char (window &key y x position) + "Extract and return the single-byte complex char from the window. + +If the position coordinates y (row) and x (column) are given, move the +cursor to the position first and then add the character. + +The position can also be passed in form of a two-element list." + (when (and y x) (move window y x)) + (when position (apply #'move window position)) + (let* ((winptr (winptr window)) + (chtype (%winch winptr))) + (chtype2xchar chtype))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/inchstr.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/inchstr.lisp new file mode 100644 index 0000000..7526f2a --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/inchstr.lisp @@ -0,0 +1,21 @@ +(in-package :de.anvi.croatoan) + +(defun extract-complex-string (window &key y x position n) + "Extract and return a complex string from the window. + +Start at the current cursor position and end at the right margin of window. + +If the position coordinates y (row) and x (column) are given, move the +cursor to the position first and then add the character. + +The position can also be passed in form of a two-element list. + +If n is given, read at most n chars." + (when (and y x) (move window y x)) + (when position (apply #'move window position)) + (let* ((count (if n n (- (width window) (cadr (cursor-position window))))) + (complex-string (make-instance 'complex-string))) + (loop for i from 0 to (1- count) do + (vector-push-extend (extract-wide-char window) (complex-char-array complex-string)) + (move-direction window :right)) + complex-string)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/initscr.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/initscr.lisp new file mode 100644 index 0000000..cf2e9d9 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/initscr.lisp @@ -0,0 +1,31 @@ +(in-package :de.anvi.croatoan) + +(defun init-screen () + "Initializes the curses mode. Returns the main window." + (%initscr)) + +(defun end-screen () + "Clean shutdown of the curses display." + (%endwin)) + +(defgeneric closed-p (s) + (:documentation "Check whether the screen has been closed without a subsequent call to refresh to reactivate it.")) + +(defmethod closed-p ((s screen)) + (declare (ignore s)) + (%isendwin)) + +(defun new-terminal (type out-fd in-fd) + "Use instead of init-screen when you want more than one terminal." + (%newterm type out-fd in-fd)) + +(defun set-current-terminal (new-screen) + "Sets new-screen as the current terminal. Returns the old screen." + (%set-term new-screen)) + + +;;; TODOs + +;; [ ] are files in lisp in newterm correctly represented by fd-s? +;; [ ] add type info either to the docs or in asserts. +;; [ ] document all possible return values and check for them. diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/inopts.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/inopts.lisp new file mode 100644 index 0000000..71a0f05 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/inopts.lisp @@ -0,0 +1,82 @@ +(in-package :de.anvi.croatoan) + +;; nodelay FALSE = getch blocking +;; nodelay TRUE = getch non-blocking. +;; halfdelay 5 = waits for 5/10 seconds. + +;; halfdelay is turned off by nocbreak. + +;; terminal input modes: +;; +;; canonical non canonical +;; line buffered character based +;; ctrl chars processed ^C,^S,^Q,^D processed no ctrl chars processed +;; cooked cbreak raw +;; +;; buffering t nil nil +;; control t t nil + +;; | cooked | cbreak | raw +;; ----------+--------+--------+----- +;; buffering | t | nil | nil +;; ----------+--------+--------+----- +;; control | t | t | nil + +;; The combination echo+getch should not be used during buffered input +(defun set-input-mode (input-buffering process-control-chars) + (if input-buffering + ;; to turn on buffering, turn off cbreak or raw + (if process-control-chars (%nocbreak) (%noraw)) + ;; to turn off buffering, turn on cbreak or raw + (if process-control-chars (%cbreak) (%raw)))) + +;; Ported to clos, used in clos. +(defun set-input-blocking (window status) + "Set window input blocking behavior. + +Possible values are t, nil and a blocking duration in (positive integer) miliseconds." + (cond ((eq status t) (%wtimeout window -1)) + ((eq status nil) (%wtimeout window 0)) + ((and (typep status 'integer) (plusp status)) + (%wtimeout window status)) + (t (error "possible blocking states: t, nil, delay in miliseconds")))) + +;; Not used in clos because too simple. obsolete. +(defun set-input-echoing (flag) + "Set whether chars will be echoed on input." + (if flag + (%echo) + (%noecho))) + +;; Not used in clos because too simple. obsolete. +(defun set-enable-fkeys (window flag) + "If flag is t, bind function keys to known codes when returned by get-char. + +If flag is nil, F keys will be system-dependent multi-character escape codes." + (%keypad (winptr window) flag)) + +;; Obscure functions I never used before: + +(defun flush-on-interrupt (window flag) + (%intrflush window flag)) + +(defun enable-8bit-char-input (window flag) + (%meta window flag)) + +(defun io-queue-flush (flag) + (if flag + (%qiflush) + (%noqiflush))) + +;; if it would work at all, which it doesnt, +;; it would work only for (function-keys win t) +(defun escape-sequence-delay (window flag) + (%notimeout window flag)) + +(defun type-ahead-fd (fd) + (%typeahead fd)) + +;;; TODOs + +;; [X] do not mix cbreak and raw. use either the one or the other. +;; [ ] for now, we consider only global optins. work in a window parameter as well. diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/ins_wch.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/ins_wch.lisp new file mode 100644 index 0000000..f231c63 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/ins_wch.lisp @@ -0,0 +1,56 @@ +(in-package :de.anvi.croatoan) + +(defun insert-wide-char (window char &key attributes fgcolor bgcolor color-pair style y x position n) + "Insert char into window before the character currently under the cursor. + +Chars right of the cursor are moved one position to the right. +The rightmost character on the line may be lost. The position of the +cursor is not changed. + +char can be a simple character or a complex-char with attributes and colors. + +If the position coordinates y (row) and x (column) are given, move the +cursor to the position first and then add the object. + +The position can also be passed in form of a two-element list. + +If n is given, insert n chars." + (when (and y x) (move window y x)) + (when position (apply #'move window position)) + (let ((attributes (if style + (getf style :attributes) + attributes)) + (color-pair (cond (style + (list (getf style :fgcolor) (getf style :bgcolor))) + ((or fgcolor bgcolor) + (list fgcolor bgcolor)) + (t color-pair)))) + (funcall-make-cchar_t #'%wins-wch window char attributes color-pair n))) + +;; TODO: (defmethod insert (obj character)) +;; (defmethod insert (obj string)) etc. +;; the same for echo (only chars) and add. + +;; :x t :y t => keep the current row or column + +(defun insert (window object &rest keys &key &allow-other-keys) + "Insert char or string into window before the char currently under the cursor. + +Currently supported text objects are characters (simple and complex), +characters given by integer codes or keywords, and strings +(simple and complex). + +If the position coordinates y (row) and x (column) are given, move the +cursor to the position first and then insert the object. + +The position can also be passed in form of a two-element list. + +If n is given for a char, insert n chars. + +If n is given for a string, add at most n chars from the string." + (let ((fn (typecase object + ((or string complex-string) + #'insert-string) + ((or integer keyword character complex-char) + #'insert-wide-char)))) + (apply fn window object keys))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/insch.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/insch.lisp new file mode 100644 index 0000000..e4e8ebb --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/insch.lisp @@ -0,0 +1,28 @@ +(in-package :de.anvi.croatoan) + +(defun insert-char (window char &key attributes fgcolor bgcolor color-pair style y x position n) + "Insert char into window before the character currently under the cursor. + +Chars right of the cursor are moved one position to the right. +The rightmost character on the line may be lost. The position of the +cursor is not changed. + +char can be a simple character or a complex-char with attributes and colors. + +If the position coordinates y (row) and x (column) are given, move the +cursor to the position first and then add the object. + +The position can also be passed in form of a two-element list. + +If n is given, insert n chars." + (when (and y x) (move window y x)) + (when position (apply #'move window position)) + (let ((attributes (if style + (getf style :attributes) + attributes)) + (color-pair (cond (style + (list (getf style :fgcolor) (getf style :bgcolor))) + ((or fgcolor bgcolor) + (list fgcolor bgcolor)) + (t color-pair)))) + (funcall-make-chtype #'%winsch window char attributes color-pair n))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/insstr.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/insstr.lisp new file mode 100644 index 0000000..c7a37be --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/insstr.lisp @@ -0,0 +1,42 @@ +(in-package :de.anvi.croatoan) + +(defun insert-string (window string &key attributes fgcolor bgcolor color-pair style y x position n) + "Insert string before the current position in window. + +Chars right of the cursor are moved to the right. The rightmost chars +on the line may be lost. The cursor position is not changed. + +If n is given, insert at most n chars from the string. + +If the position coordinates y (row) and x (column) are given, move the +cursor to the position first and then add the object. + +The position can also be passed in form of a two-element list." + (when (and y x) (move window y x)) + (when position (apply #'move window position)) + (let ((count (if n + n + ;; we cant use length to determine the length of a complex string + ;; because it is not a sequence. + (typecase string + (string (length string)) + (complex-string (length (complex-char-array string))))))) + (typecase string + (string + ;;(if (or attributes fgcolor bgcolor color-pair style) + ;; lisp string combined with attributes and colors + (loop + repeat count + for ch across (reverse string) + do (insert-wide-char window ch :attributes attributes :fgcolor fgcolor :bgcolor bgcolor + :color-pair color-pair :style style)) ) + ;; simple lisp string, no attributes or colors + ;; TODO 190826 we dont want to use this because we want to force color-set and bkgd to use separate colors + ;;(if n + ;; (%winsnstr (winptr window) string n) + ;; (%winsstr (winptr window) string)))) + (complex-string + (loop + repeat count + for ch across (reverse (complex-char-array string)) + do (insert-wide-char window ch)))))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/instr.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/instr.lisp new file mode 100644 index 0000000..aea54bc --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/instr.lisp @@ -0,0 +1,28 @@ +(in-package :de.anvi.croatoan) + +(defun extract-string (window &key y x position n) + "Extract and return a string from window. + +Any attributes are stripped from the characters before the string is returned. + +Start at the current cursor position and end at the right margin of window. + +If the position coordinates y (row) and x (column) are given, move the +cursor to the position first and then add the character. + +The position can also be passed in form of a two-element list. + +If n is given, read at most n chars." + (when (and y x) (move window y x)) + (when position (apply #'move window position)) + (let ((len (if n n (distance-to-eol window)))) + (with-foreign-pointer (string len) + ;; zero the allocated foreign string first. + (setf (mem-ref string :char (1- len)) 0) + ;; populate the foreign string with chars. + ;; the c routines return ERR (-1) or the number of chars extracted. + (let ((retval (%winnstr (winptr window) string len))) + (if (= retval -1) + nil + ;; convert the char pointer to a lisp string. + (foreign-string-to-lisp string)))))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/inwstr.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/inwstr.lisp new file mode 100644 index 0000000..97de23a --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/inwstr.lisp @@ -0,0 +1,25 @@ +(in-package :de.anvi.croatoan) + +(defun extract-wide-string (window &key y x position n) + "Extract and return a string from window. + +Any attributes are stripped from the characters before the string is returned. + +Start at the current cursor position and end at the right margin of window. + +If the position coordinates y (row) and x (column) are given, move the +cursor to the position first and then add the character. + +The position can also be passed in form of a two-element list. + +If n is given, read at most n chars." + (when (and y x) (move window y x)) + (when position (apply #'move window position)) + (let ((count (if n n (distance-to-eol window))) + ;; start with an empty string as buffer + (str (make-array '(0) :element-type 'character :fill-pointer 0 :adjustable t))) + (loop for i from 0 to (1- count) do + (vector-push-extend (simple-char (extract-wide-char window)) str) + (move-direction window :right)) + ;; return string buffer containing i chars + str)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/kernel.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/kernel.lisp new file mode 100644 index 0000000..fa17259 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/kernel.lisp @@ -0,0 +1,9 @@ +(in-package :de.anvi.croatoan) + +;; 0 invisible, 1 visible, 2 very visible. +(defun set-cursor-visibility (status) + (case status + ((nil :invisible) (%curs-set 0)) + ((t :visible) (%curs-set 1)) + (:very-visible (%curs-set 2)) + (otherwise (error "Valid status arguments: nil, t, :very-visible")))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/key_defined.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/key_defined.lisp new file mode 100644 index 0000000..eb6e4b3 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/key_defined.lisp @@ -0,0 +1,27 @@ +(in-package :croatoan) + +;; key_defined +;; check if a keycode is defined +;; http://invisible-island.net/ncurses/man/key_defined.3x.html + +;;; C prototypes + +;; int key_defined(const char *definition); + +;;; Low-level C functions + +(defcfun ("key_defined" %key-defined) :int (definition :string)) + +;;; High-level Lisp wrappers + +(defun key-defined-p (key-name) + "If keycode is defined, return the keycode." + (let ((retval (%key-defined key-name))) + (cond ((= retval 0) nil) + ((= retval -1) nil) + (t retval)))) + +;;; TODOs + +;; [ ] dont return any numeric codes, do something with keywords. +;; [ ] somehow handle the -1 error case. diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/keybound.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/keybound.lisp new file mode 100644 index 0000000..132857c --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/keybound.lisp @@ -0,0 +1,24 @@ +(in-package :croatoan) + +;; keybound +;; return definition of keycode +;; http://invisible-island.net/ncurses/man/keybound.3x.html + +;;; C prototypes + +;; char *keybound(int keycode, int count); + +;;; Low-level C functions + +(defcfun ("keybound" %keybound) :string (keycode :int) (count :int)) + +;;; High-level Lisp wrappers + +(defun key-description (code n) + "Return the n-th description of key stored in the terminfo database." + (%keybound code n)) + +;;; TODOs + +;; [ ] dont return any numeric codes, do something with keywords. +;; [ ] somehow handle the -1 error case. diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/legacy.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/legacy.lisp new file mode 100644 index 0000000..c4c556b --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/legacy.lisp @@ -0,0 +1,39 @@ +(in-package :croatoan) + +;;; legacy +;;; get curses cursor and window coordinates, attributes +;;; http://invisible-island.net/ncurses/man/curs_legacy.3x.html + +;;; C prototypes + +;; int getattrs(WINDOW *win); +;; int getbegx(WINDOW *win); +;; int getbegy(WINDOW *win); +;; int getcurx(WINDOW *win); +;; int getcury(WINDOW *win); +;; int getmaxx(WINDOW *win); +;; int getmaxy(WINDOW *win); +;; int getparx(WINDOW *win); +;; int getpary(WINDOW *win); + +;;; Low-level C functions + +(defcfun ("getbegx" %getbegx) :int (win window)) +(defcfun ("getbegy" %getbegy) :int (win window)) +(defcfun ("getcurx" %getcurx) :int (win window)) +(defcfun ("getcury" %getcury) :int (win window)) +(defcfun ("getmaxx" %getmaxx) :int (win window)) +(defcfun ("getmaxy" %getmaxy) :int (win window)) +(defcfun ("getparx" %getparx) :int (win window)) +(defcfun ("getpary" %getpary) :int (win window)) + +;;; High-level Lisp wrappers + +;; See getyx.lisp. + +;;; NOTES + +;;; TODOs + +;; getattrs compare with attr_get + diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/legacy_coding.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/legacy_coding.lisp new file mode 100644 index 0000000..38caca9 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/legacy_coding.lisp @@ -0,0 +1,26 @@ +(in-package :croatoan) + +;;; legacy coding +;;; http://invisible-island.net/ncurses/man/legacy_coding.3x.html + +;;; C prototypes + +;; int use_legacy_coding(int level); + +;;; Low-level C functions + +(defcfun ("use_legacy_coding" %use-legacy-coding) :int (level :int)) + +;;; High-level Lisp wrappers + +;; Possible values: 0 (default), 1 and 2. +(defun set-char-representation (level) + "Set how char-to-string will represent a char." + (%use-legacy-coding level)) + +;;; NOTES + +;; This affects %unctrl/char-to-string. See util.lisp and the manpage. + +;;; TODOs + diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/menu.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/menu.lisp new file mode 100644 index 0000000..786942f --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/menu.lisp @@ -0,0 +1,344 @@ +(in-package :de.anvi.croatoan) + +;; menu +;; curses extension for programming menus +;; http://invisible-island.net/ncurses/man/menu.3x.html + +(defun list2array (list dimensions) + "Example: (list2array '(a b c d e f) '(3 2)) => #2A((A B) (C D) (E F))" + (let ((m (car dimensions)) + (n (cadr dimensions))) + (assert (= (length list) (* m n))) + (let ((array (make-array dimensions :initial-element nil))) + (loop for i from 0 to (- m 1) + do (loop for j from 0 to (- n 1) + do (setf (aref array i j) (nth (+ (* i n) j) list)))) + array))) + +;; TODO: see menu_format +(defun rmi2sub (layout rmi) + "Take array dimensions and an index in row-major order, return two subscripts. + +Example: (rmi2sub '(2 3) 5) => (1 2)" + (let ((m (car layout)) + (n (cadr layout))) + (assert (< rmi (* m n))) + (multiple-value-bind (q r) (floor rmi n) + (list q r)))) + +(defun sub2rmi (layout subs) + "Take array dimensions and two subscripts, return an index in row-major order. + +Example: (sub2rmi '(2 3) '(1 2)) => 5" + (let ((m (car layout)) + (n (cadr layout)) + (i (car subs)) + (j (cadr subs))) + (assert (and (< i m) (< j n))) + (+ (* i n) j))) + +(defun update-menu (menu event) + "Take a menu and an event, update in-place the current item of the menu." + ;; we need to make menu special in order to setf i in the passed menu object. + (declare (special menu)) + (with-accessors ((current-item-number current-item-number) (current-item current-item) (items items) + (cyclic-selection cyclic-selection-p) (layout layout) (scrolled-layout scrolled-layout) + (scrolled-region-start scrolled-region-start)) menu + (let ((i (car (rmi2sub layout current-item-number))) + (j (cadr (rmi2sub layout current-item-number))) + (m (car layout)) + (n (cadr layout)) + (m0 (car scrolled-region-start)) + (n0 (cadr scrolled-region-start)) + (m1 (car scrolled-layout)) + (n1 (cadr scrolled-layout))) + (if scrolled-layout + ;; when scrolling is on, the menu is not cycled. + (progn + (case event + (:up (when (> i 0) (decf i)) ; when not in first row, move one row up + (when (< i m0) (decf m0))) ; when above region, move region one row up + (:down (when (< i (1- m)) (incf i)) ; when not in last row, move one row down + (when (>= i (+ m0 m1)) (incf m0))) ; when below region, move region one row down + (:left (when (> j 0) (decf j)) ; when not in first column, move one column left + (when (< j n0) (decf n0))) ; when left of region, move region one column left + (:right (when (< j (1- n)) (incf j)) ; when not in last column, move one column right + (when (>= j (+ n0 n1)) (incf n0)))) ; when right of region, move region one column right + + ;; set new scrolled-region coordinates + (setf scrolled-region-start (list m0 n0))) + + ;; when scrolling is off, the menu can be cycled. + (if cyclic-selection + ;; do cycle through the items + (case event + (:up (setf i (mod (1- i) m))) + (:down (setf i (mod (1+ i) m))) + (:left (setf j (mod (1- j) n))) + (:right (setf j (mod (1+ j) n)))) + ;; dont cycle through the items + (case event + (:up (setf i (max (1- i) 0))) + (:down (setf i (min (1+ i) (1- m)))) + (:left (setf j (max (1- j) 0))) + (:right (setf j (min (1+ j) (1- n))))))) + + ;; after updating i,j, update the current-item-number + (setf current-item-number (sub2rmi layout (list i j))) + ;; after updating the current-item-number, update the pointer to the current-item. + (setf current-item (nth current-item-number items)) ))) + +(defun format-menu-item (menu item-number) + "Take a menu and return item item-number as a properly formatted string. + +If the menu is a checklist, return [ ] or [X] at the first position. + +If a mark is set for the current item, display the mark at the second position. +Display the same number of spaces for other items. + +At the third position, display the item given by item-number." + (with-accessors ((items items) + (type menu-type) + (current-item-number current-item-number) + (current-item-mark current-item-mark)) menu + ;; return as string + (format nil "~A~A~A" + ;; two types of menus: :selection or :checklist + ;; show the checkbox before the item in checklists + (if (eq type :checklist) + (if (checkedp (nth item-number items)) "[X] " "[ ] ") + "") + + ;; for the current item, draw the current-item-mark + ;; for all other items, draw a space + (if (= current-item-number item-number) + current-item-mark + (make-string (length current-item-mark) :initial-element #\space)) + + ;; then add the item name + (name (nth item-number items)) ))) + +(defun draw-menu-item (win menu item-number i j) + "Draw the item given by item-number at item position (i j) in the window." + (with-accessors ((current-item-number current-item-number) + (current-item-location current-item-location) + (max-item-length max-item-length) + (menu-location menu-location)) menu + (let (pos-y + pos-x) + (if menu-location + ;; add an offset when menu-location is given + (setq pos-y (+ i (car menu-location)) + pos-x (+ (* j max-item-length) (cadr menu-location))) + ;; if a location is not given, display the menu starting at 0,0 + (setq pos-y i + pos-x (* j max-item-length))) + (move win pos-y pos-x) + ;; save the location of the current item, to be used in update-cursor-position. + (when (= item-number current-item-number) + (setf current-item-location (list pos-y pos-x)))) + + ;; if the item is the current item, change its attributes + (let ((attr (if (= item-number current-item-number) + (list :reverse) + nil))) + ;; delete the item by overwriting it with an empty string. + (save-excursion win (add win #\space :n max-item-length)) + (change-attributes win max-item-length attr) + ;; format the item text + ;; display it in the window associated with the menu + (add win (format-menu-item menu item-number) :attributes attr)))) + +;; draws to any window, not just to a sub-window of a menu-window. +(defun draw-menu (window menu) + "Draw the menu to the window." + (with-accessors ((layout layout) (scrolled-layout scrolled-layout) (scrolled-region-start scrolled-region-start)) menu + (let ((m (car layout)) + (n (cadr layout)) + (m0 (car scrolled-region-start)) + (n0 (cadr scrolled-region-start)) + (m1 (car scrolled-layout)) + (n1 (cadr scrolled-layout))) + (if scrolled-layout + ;; when the menu is too big to be displayed at once, only a part + ;; is displayed, and the menu can be scrolled + (loop for i from 0 to (1- m1) + do (loop for j from 0 to (1- n1) + do (let ((item-number (sub2rmi layout (list (+ m0 i) (+ n0 j))))) + ;; the menu is given as a flat list, so we have to access it as a 2d array in row major order + (draw-menu-item window menu item-number i j)))) + ;; when there is no scrolling, and the whole menu is displayed at once + (loop for i from 0 to (1- m) + do (loop for j from 0 to (1- n) + do (let ((item-number (sub2rmi layout (list i j)))) + (draw-menu-item window menu item-number i j)))) )) + (refresh window))) + +(defmethod draw ((menu menu)) + "Draw the menu to its associated window." + (draw-menu (window menu) menu) + ;; when menu is a part of a form: + ;; update-cursor-position = place the cursor on the current item + ;; if the menu is a checklist, place the cursor inside the [_], like it is done with a single checkbox. + (update-cursor-position menu)) + +(defmethod draw ((menu menu-window)) + "Draw the menu-window." + (with-accessors ((title title) (name name) (border draw-border-p) (sub-win sub-window)) menu + ;; draw the menu to the sub-window + (draw-menu sub-win menu) + ;; we have to explicitely touch the background win, because otherwise it wont get refreshed. + (touch menu) + ;; draw the title only when we also have a border, because we draw the title on top of the border. + (when (and border title) + ;; make a format template depending on the length of the title. + ;; "|~12:@<~A~>|" + (flet ((make-title-string (len) + (concatenate 'string "|~" (write-to-string (+ len 2)) ":@<~A~>|"))) + ;; If there is a title string, take it, otherwise take the name. + ;; The name is displayed only if title is t. + (let* ((str (if (typep title 'string) title name)) + (n (length str))) + (add menu (format nil (make-title-string n) str) :y 0 :x 2)))) + ;; todo: when we refresh a window with a subwin, we shouldnt have to refresh the subwin separately. + ;; make refresh specialize on menu and decorated window in a way to do both. + (refresh menu))) + +(defmethod draw ((menu dialog-window)) + ;; first draw a menu + ;; TODO: describe what exactly is drawn here and what in the parent method. + (call-next-method) + + ;; then draw the message in the reserved space above the menu. + (with-accessors ((message-text message-text) (message-height message-height) + (message-pad message-pad) (coords message-pad-coordinates)) menu + ;; if there is text, and there is space reserved for the text, draw the text + (when (and message-text (> message-height 0)) + (refresh message-pad + 0 ;pad-min-y + 0 ;pad-min-x + (first coords) ;screen-min-y + (second coords) ;screen-min-x + (third coords) ;screen-max-y + (fourth coords))))) ;screen-max-x + +(defun reset-menu (menu) + "After the menu is closed reset it to its initial state." + (with-slots (items current-item-number current-item scrolled-region-start menu-type) menu + (setf current-item-number 0 + current-item (car items) + scrolled-region-start (list 0 0)) + (when (eq menu-type :checklist) + (loop for i in items if (checkedp i) do (setf (checkedp i) nil))))) + +(defun return-from-menu (menu return-value) + "Set menu window to invisible, refresh the window stack, return the value from select." + (when *window-stack* + ;; change visibility only when there is an active stack. + (typecase menu + (menu-window (setf (visiblep menu) nil)) + (menu (setf (visiblep (window menu)) nil))) + (refresh-stack)) + (reset-menu menu) + (throw menu return-value)) + +(defun exit-menu-event-loop (menu event) + "Associate this function with an event to exit the menu event loop." + (declare (ignore event)) + (return-from-menu menu nil)) + +(defun checked-items (menu) + "Take a menu, return a list of checked menu items." + (loop for i in (items menu) if (checkedp i) collect i)) + +(defmethod value ((menu menu)) + "Return the value of the selected item." + (value (current-item menu))) + +(defmethod value ((checklist checklist)) + "Return the list of values of the checked items." + (mapcar #'value (checked-items checklist))) + +(defun accept-selection (menu event) + "Return the value of the currently selected item or all checked items." + (declare (ignore event)) + + (case (menu-type menu) + (:checklist + ;; return all checked items (not their values) in the item list. + (return-from-menu menu (checked-items menu))) + + (:selection + (let ((val (value (current-item menu)))) + (cond + ;; if the item is a string or symbol, just return it. + ((or (typep val 'string) + (typep val 'symbol)) + (return-from-menu menu val)) + + ;; if the item is a function object, call it. + ((typep val 'function) + (funcall val) + (return-from-menu menu (name (current-item menu)))) + + ;; if the item is a menu (and thus also a menu-window), recursively select an item from that submenu + ((or (typep val 'menu) + (typep val 'menu-window)) + (let ((selected-item (select val))) + + ;; when we have more than menu in one window, redraw the parent menu when we return from the submenu. + (when (eq (type-of val) 'menu) + (draw menu)) + + (when selected-item + (return-from-menu menu selected-item)))) ))))) + +(defun update-redraw-menu (menu event) + "Update the menu after an event, the redraw the menu." + (update-menu menu event) + (draw menu)) + +(defun toggle-item-checkbox (menu event) + "Toggle the checked state of the current item, used in checkbox menus." + (declare (ignore event)) + (setf (checkedp (current-item menu)) (not (checkedp (current-item menu)))) + (draw menu)) + +;; all of these take two arguments: menu event +(define-keymap 'menu-map + (list + ;; q doesnt return a value, just nil, i.e. in the case of a checklist, an empty list. + #\q 'exit-menu-event-loop + #\x 'toggle-item-checkbox + + :up 'update-redraw-menu + :down 'update-redraw-menu + :left 'update-redraw-menu + :right 'update-redraw-menu + + ;; there is no :default action, all other events are ignored for menus. + + ;; return the selected item or all checked items, then exit the menu like q. + #\newline 'accept-selection)) + +(defun select (menu) + "Display the menu, let the user select an item, return the selected item. + +If the item is a menu object, recursively display the sub menu." + (typecase menu + + (menu-window + (when *window-stack* + (setf (visiblep menu) t) + (refresh-stack)) + (draw menu) + + ;; here we can pass the menu to run-event-loop because it is a menu-window. + ;; all handler functions have to accept window and event as arguments. + ;; the return value of select is the return value of run-event-loop + ;; is the value thrown to the catch tag 'event-loop. + (run-event-loop menu)) + + (menu + (draw menu) + (run-event-loop menu)))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/mouse.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/mouse.lisp new file mode 100644 index 0000000..51c52bc --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/mouse.lisp @@ -0,0 +1,89 @@ +(in-package :de.anvi.croatoan) + +(defparameter *mouse-button-event-bitmask-alist* + '((:released . #o01) + (:pressed . #o02) + (:clicked . #o04) + (:double-clicked . #o10) + (:triple-clicked . #o20) + (:reserved-event . #o40))) + +(defmacro mouse-bitmask (button event) + (let ((*mouse-button-event-bitmask-alist* + '((:released . #o01) + (:pressed . #o02) + (:clicked . #o04) + (:double-clicked . #o10) + (:triple-clicked . #o20) + (:reserved-event . #o40)))) + (cond ((integerp event) `(ash ,event (* 6 (- ,button 1)))) + ((symbolp event) + (let ((mask (cdr (assoc event *mouse-button-event-bitmask-alist*)))) + `(ash ,mask (* 6 (- ,button 1)))))))) + +(defparameter *mouse-event-bitmask-alist* + `((:button-1-released . ,(mouse-bitmask 1 :released)) + (:button-1-pressed . ,(mouse-bitmask 1 :pressed)) + (:button-1-clicked . ,(mouse-bitmask 1 :clicked)) + (:button-1-double-clicked . ,(mouse-bitmask 1 :double-clicked)) + (:button-1-triple-clicked . ,(mouse-bitmask 1 :triple-clicked)) + (:button-1-reserved-event . ,(mouse-bitmask 1 :reserved-event)) + (:button-2-released . ,(mouse-bitmask 2 :released)) + (:button-2-pressed . ,(mouse-bitmask 2 :pressed)) + (:button-2-clicked . ,(mouse-bitmask 2 :clicked)) + (:button-2-double-clicked . ,(mouse-bitmask 2 :double-clicked)) + (:button-2-triple-clicked . ,(mouse-bitmask 2 :triple-clicked)) + (:button-2-reserved-event . ,(mouse-bitmask 2 :reserved-event)) + (:button-3-released . ,(mouse-bitmask 3 :released)) + (:button-3-pressed . ,(mouse-bitmask 3 :pressed)) + (:button-3-clicked . ,(mouse-bitmask 3 :clicked)) + (:button-3-double-clicked . ,(mouse-bitmask 3 :double-clicked)) + (:button-3-triple-clicked . ,(mouse-bitmask 3 :triple-clicked)) + (:button-3-reserved-event . ,(mouse-bitmask 3 :reserved-event)) + (:button-4-released . ,(mouse-bitmask 4 :released)) + (:button-4-pressed . ,(mouse-bitmask 4 :pressed)) + (:button-4-clicked . ,(mouse-bitmask 4 :clicked)) + (:button-4-double-clicked . ,(mouse-bitmask 4 :double-clicked)) + (:button-4-triple-clicked . ,(mouse-bitmask 4 :triple-clicked)) + (:button-4-reserved-event . ,(mouse-bitmask 4 :reserved-event)) + (:button-ctrl . ,(mouse-bitmask 5 #o01)) + (:button-shift . ,(mouse-bitmask 5 #o02)) + (:button-alt . ,(mouse-bitmask 5 #o04)) + (:report-mouse-position . ,(mouse-bitmask 5 #o10)))) + +;; (:all-mouse-events . ,(- (mouse-bitmask 5 #o10) 1) + +;; take a unsigned long integer representing a bitmask of mouse events, +;; return a list of mouse event keywords. +(defun bitmask-to-keyword (bitmask) + (loop for i in (mapcar #'car *mouse-event-bitmask-alist*) + if (logtest bitmask (cdr (assoc i *mouse-event-bitmask-alist*))) return i)) +;; use collect to catch more than 1 event at once. +;; (format scr "~32,'0b" bitmask) + +(defun keyword-to-bitmask (keys) + "Take a list of mouse event keywords, return a logiored bitmask." + (apply #'logior (mapcar #'(lambda (x) (cdr (assoc x *mouse-event-bitmask-alist*))) + keys))) + +(defun set-mouse-event (keyword-list) + "Take a list of mouse events, activate tracking of those events. + +Returns an integer bitmask. An empty list turns off mouse tracking." + (%mousemask (keyword-to-bitmask keyword-list) (null-pointer))) + +;; decode and return the mouse event struct as multiple values: +;; mouse event keyword, y coordinate integer, x coordinate integer +(defun get-mouse-event () + (flet ((plist-symbols-to-keywords (plist) + ;; mem-ref returns a struct as a symbol plist. + ;; we have to convert the symbols to keywords to transport them across packages. + (loop for i in plist collect (if (symbolp i) (values (intern (symbol-name i) "KEYWORD")) i)))) + (with-foreign-object (ptr '(:struct mevent)) + (%getmouse ptr) + (let* ((struct (plist-symbols-to-keywords (mem-ref ptr '(:struct mevent)))) + (x (getf struct :x)) + (y (getf struct :y)) + (b (getf struct :bstate)) + (mouse-event (bitmask-to-keyword b))) + (values mouse-event y x))))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/move.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/move.lisp new file mode 100644 index 0000000..41da3f6 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/move.lisp @@ -0,0 +1,32 @@ +(in-package :de.anvi.croatoan) + +(defun move (window y x &key relative) + "Move cursor to the position given by row y and column x. + +If relative is t, move the cursor by y rows and x columns." + (let ((winptr (winptr window))) + (if relative + (let ((pos-y (car (cursor-position window))) + (pos-x (cadr (cursor-position window)))) + (%wmove winptr (+ pos-y y) (+ pos-x x))) + (%wmove winptr y x)))) + +(defun move-direction (window direction &optional (n 1)) + "Move cursor in the given direction by n cells." + (case direction + (:left (move window 0 (* n -1) :relative t)) + (:right (move window 0 (* n 1) :relative t)) + (:up (move window (* n -1) 0 :relative t)) + (:down (move window (* n 1) 0 :relative t)) + (otherwise (error "Valid cursor movement directions: :left, :right, :up, :down")))) + +(defun move-window (window y x &key relative) + "Move top left corner of the window to row y and column x. + +If relative is t, move the window by y rows and x columns." + (let ((winptr (winptr window))) + (if relative + (let ((pos-y (car (location window))) + (pos-x (cadr (location window)))) + (%mvwin winptr (+ pos-y y) (+ pos-x x))) + (%mvwin winptr y x)))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/opaque.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/opaque.lisp new file mode 100644 index 0000000..281cb55 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/opaque.lisp @@ -0,0 +1,118 @@ +(in-package :croatoan) + +;;; opaque +;;; curses window properties +;;; http://invisible-island.net/ncurses/man/curs_opaque.3x.html + +;;; C prototypes + +;; bool is_cleared(const WINDOW *win); +;; bool is_idcok(const WINDOW *win); +;; bool is_idlok(const WINDOW *win); +;; bool is_immedok(const WINDOW *win); +;; bool is_keypad(const WINDOW *win); +;; bool is_leaveok(const WINDOW *win); +;; bool is_nodelay(const WINDOW *win); +;; bool is_notimeout(const WINDOW *win); +;; bool is_pad(const WINDOW *win); +;; bool is_scrollok(const WINDOW *win); +;; bool is_subwin(const WINDOW *win); +;; bool is_syncok(const WINDOW *win); +;; WINDOW *wgetparent(const WINDOW *win); +;; int wgetscrreg(const WINDOW *win, int *top, int *bottom); + +;;; Low-level C functions + +(defcfun ("is_cleared" %is_cleared) :boolean (win window)) +(defcfun ("is_idcok" %is_idcok) :boolean (win window)) +(defcfun ("is_idlok" %is_idlok) :boolean (win window)) +(defcfun ("is_immedok" %is_immedok) :boolean (win window)) +(defcfun ("is_keypad" %is_keypad) :boolean (win window)) +(defcfun ("is_leaveok" %is_leaveok) :boolean (win window)) +(defcfun ("is_nodelay" %is_nodelay) :boolean (win window)) +(defcfun ("is_notimeout" %is_notimeout) :boolean (win window)) +(defcfun ("is_pad" %is_pad) :boolean (win window)) +(defcfun ("is_scrollok" %is_scrollok) :boolean (win window)) +(defcfun ("is_subwin" %is_subwin) :boolean (win window)) +(defcfun ("is_syncok" %is_syncok) :boolean (win window)) + +(defcfun ("wgetparent" %wgetparent) window (win window)) +(defcfun ("wgetscrreg" %wgetscrreg) :int (win window) (top (:pointer :int)) (bottom (:pointer :int))) + +;;; High-level Lisp wrappers + +(defun redraw-on-clear-p (window) + "If t, the next refresh will redraw the screen from scratch." + (%is_cleared window)) + +(defun insert-delete-char-p (window) + "If t, the hardware insert/delete char feature of a terminal will be used, if the terminal supports it." + (%is_idcok window)) + +(defun insert-delete-line-p (window) + "If t, the hardware insert/delete line feature of a terminal will be used, if the terminal supports it." + (is_idlok window)) + +(defun immediately-refresh-p (window) + "If t, any change to a window will automatically call refresh." + (%is_immedok window)) + +(defun function-keys-p (window) + "If t, function keys will be recognized when returned by get-char." + (%is_keypad window)) + +(defun leave-cursor-on-refresh-p (window) + "If t, don't move the cursor back to the position before refresh." + (%is_leaveok window)) + +;; Vorsicht: we don't use %nodelay for blocking settings. But maybe it still works somehow. +(defun input-blocking-p (window) + "If t, reading is blocking." + (not (%is_nodelay window))) + +;; Hint: doesnt seem to work. +(defun escape-sequence-delay (window) + "If t, do not set a delay after the escape key." + (%is_notimeout window)) + +(defun pad-p (window) + "If t, the window is a pad." + (%is_pad window)) + +(defun enable-scrolling-p (window) + "If t, scrolling is enabled." + (%is_scrollok window)) + +(defun subwindow-p (window) + "If t, the window is a subwindow." + (%is_subwin window)) + +(defun touch-parent-windows-p (window) + "If t, areas in parent windows will be touched when window is changed." + (%is_syncok window)) + +(defun get-parent-window (window) + "If window is a subwindow, return its parent window." + (%wgetparent window)) + +(defun get-scrolling-region (window) + "Return a cons pair with the top and bottom margin of the scrolling region." + (let ((t-ptr (foreign-alloc :int)) + (b-ptr (foreign-alloc :int))) + ;; populate the pointers with values. + (%wgetscrreg window t-ptr b-ptr) + ;; dereference the int pointers. + (let ((top (mem-ref t-ptr :int)) + (bottom (mem-ref t-ptr :int))) + ;; free the allocated memory. + (foreign-free t-ptr) + (foreign-free b-ptr) + ;; return two color integers as a cons pair. + (cons top bottom)))) + +;;; TODOs + +;;; NOTES + +;; These functions which return properties set in the WINDOW +;; structure, allowing it to be compiled as opaque. \ No newline at end of file diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/outopts.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/outopts.lisp new file mode 100644 index 0000000..44dda46 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/outopts.lisp @@ -0,0 +1,57 @@ +(in-package :croatoan) + +;;; High-level Lisp wrappers + +;; old bindings not yet replaced, deprecated, not exported, not loaded, do not use. + +;; all defaults are FALSE + +(defun redraw-on-clear (window flag) + "If flag is t, when refresh is called after clear, it will redraw the screen from scratch." + (%clearok window flag)) +;; for now, to use clearok with curscr, use %clearok directly. + +(defun insert-delete-line (window flag) + "If flag is t, use the hardware insert/delete line feature of a terminal, if the terminal supports it. + +It is disabled by default." + (%idlok window flag)) + +(defun insert-delete-char (window flag) + "If flag is t, use the hardware insert/delete char feature of a terminal, if the terminal supports it. + +It is enabled by default." + (%idcok window flag)) + +(defun immediately-refresh (window flag) + "If flag is t, any change to a window will automatically call refresh. + +It is disabled by default, since it can degrade performance." + (%immedok window flag)) + +(defun leave-cursor-on-refresh (window flag) + "If flag is t, don't move the cursor back to the position before refresh. + +It is disabled by default." + (%leaveok window flag)) + +(defun enable-scrolling (window flag) + "Enables and disables window scrolling. + +If flag is t, when the curses moves below the bottom line of a window +or scrolling region, the window/region is scrolled. + +If flag is nil, the cursor is left on the bottom line." + (%scrollok window flag)) + +(defun set-scrolling-region (window top-margin bottom-margin) + "Set the margins of a scrolling region for a window if scrolling is enabled for that window." + (%wsetscrreg window top-margin bottom-margin)) + +(defun newline-translation (flag) + "If status is t, enable translation of RET to NL on input, and NL to RET and LF on output. + +It is enabled by default." + (if flag + (%nl) + (%nonl))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/package.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/package.lisp new file mode 100644 index 0000000..aa91a7d --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/package.lisp @@ -0,0 +1,321 @@ +(defpackage #:de.anvi.croatoan + (:documentation "High-level Lisp interface to the basic CFFI Ncurses API.") + (:use #:common-lisp #:cffi #:de.anvi.ncurses #:trivial-gray-streams) + (:shadow callback) + (:nicknames #:croatoan #:crt) + (:export + + ;; croatoan.lisp + with-screen + with-window + with-windows + event-case + keymap + define-keymap + find-keymap + run-event-loop + exit-event-loop + bind + unbind + save-excursion + + ;; classes + complex-char + complex-string + window + screen + sub-window + decorated-window + menu + checklist + menu-window + menu-item + dialog-window + pad + sub-pad + field + form + form-window + button + label + checkbox + shape + + ;; accessors + simple-char + attributes + color-pair + default-color-pair + fgcolor + bgcolor + complex-char-array + width + height + location + location-y + location-x + cursor-position + cursor-position-y + cursor-position-x + draw-border-p + stackedp + visiblep + winptr + input-blocking + frame-rate + function-keys-enabled-p + scrolling-enabled-p + scrolling-region + insert-mode-p + bindings + background + input-echoing-p + input-buffering-p + process-control-chars-p + newline-translation-enabled-p + cursor-visible-p + source-location + + ;; Predicates + closed-p + complex-char= + + ;; menu + items + menu-type + menu-location + current-item-number + current-item + current-item-mark + cyclic-selection-p + max-item-length + name + value + message-pad + message-text + message-height + message-pad-coordinates + menu-map + + ;; form + buffer + elements + style + max-buffer-length + callback + title + find-element + field-map + form-map + button-map + accept + cancel + reset-field + reset-form + checkedp + + ;; queue + submit + process + queue + job-error + enqueue + dequeue + + ;; shape + origin-x + origin-y + coordinates + plot-char + + ;; addch / add a character (with attributes) to a curses window, then advance the cursor + add + add-char + echo + echo-char + new-line + acs + wacs + + ;; add_wch / add a wide complex character to a curses window, then advance the cursor + add-wide-char + add-wide-char-utf-8 + echo-wide-char + + ;; addstr / add a string of characters to a curses window and advance cursor + add-string + + ;; attr / curses character and window attribute control routines + *ansi-color-list* + convert-char + change-attributes + add-attributes + remove-attributes + + ;; beep / curses bell and screen flash routines + alert + + ;; bkgd / curses window background manipulation routines + + ;; border / create curses borders, horizontal and vertical lines + box + draw-border + + ;; border_set / create curses borders or lines using complex characters and renditions + draw-wide-border + + ;; clear / clear all or part of a curses window + clear + + ;; color / curses color manipulation routines + + ;; default_colors / use terminal's default colors + use-terminal-colors-p + + ;; define_key / define a keycode + + ;; delch / delete character under the cursor in a curses window + delete-char + + ;; deleteln / delete and insert lines in a curses window + delete-line + insert-line + + ;; form / curses extension for programming forms + remove-nth + replace-nth + insert-nth + edit + field-buffer-to-string + + ;; getch / get (or push back) characters from curses terminal keyboard + get-char + unget-char + key-supported-p + function-key + function-key-p + key-pressed-p + get-event + + ;; get_wch / get (or push back) a wide (multi-byte) character from curses terminal keyboard + get-wide-char + get-wide-event + + ;; getstr / accept character strings from curses terminal keyboard + get-string + + ;; getyx / get curses cursor and window coordinates + + ;; inch / get a character and attributes from a curses window + extract-char + + ;; in_wch / extract a wide character and rendition from a window + extract-wide-char + + ;; insch / insert a character before cursor in a curses window + insert + insert-char + + ;; ins_wch / insert a complex character and rendition into a window + insert-wide-char + + ;; instr / get a string of characters from a curses window + extract-string + + ;; inwstr / get a string of wide (multi-byte) characters from a curses window + extract-wide-string + + ;; inchstr / get a string of characters (and attributes) from a curses window + extract-complex-string + + ;; insstr / insert string before cursor in a curses window + insert-string + + ;; initscr / Screen initialization and manipulation routines + end-screen + + ;; inopts / Input options. + + ;; kernel / low-level curses routines + + ;; keybound / return definition of keycode + + ;; key_defined / check if a keycode is defined + + ;; legacy / get curses cursor and window coordinates, attributes + + ;; legacy_coding + + ;; menu / curses extension for programming menus + draw-menu + update-menu + select + return-from-menu + exit-menu-event-loop + accept-selection + update-redraw-menu + toggle-item-checkbox + + ;; mouse / mouse interface through curses + set-mouse-event + get-mouse-event + + ;; move / move curses window cursor + move + move-direction + move-window + + ;; opaque / curses window properties + + ;; outopts / curses output options + + ;; pad / create and display curses pads + + ;; panel / panel stack extension for curses + raise + raise-to-top + lower + lower-to-bottom + empty-stack + refresh-stack + + ;; refresh / refresh curses windows and lines + refresh + refresh-marked + mark-for-refresh + mark-for-redraw + + ;; resizeterm / change the curses terminal size + + ;; scroll / scroll a curses window + + ;; shape / shape plotting extension for ncurses + draw-shape + shape-extent + merge-shapes + fill-shape + line + angle-line + polygon + triangle + quadrilateral + rectangle + circle + + ;; slk / curses soft label routines + + ;; termattrs / environment query routines + + ;; touch / curses refresh control routines + touch + + ;; util / miscellaneous curses utility routines + + ;; variables / curses global variables + + ;; window / create curses windows + + ;; wresize / resize a curses window + resize + + )) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/panel.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/panel.lisp new file mode 100644 index 0000000..2683c15 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/panel.lisp @@ -0,0 +1,54 @@ +(in-package :de.anvi.croatoan) + +;; panel +;; panel stack extension for curses +;; http://invisible-island.net/ncurses/man/panel.3x.html + +;; defined in source/classes.lisp +;; (defparameter *window-stack* nil) + +(defun raise (win) + "Raise window one position in the stack." + (when (not (eq win (car *window-stack*))) + (let ((pos (position win *window-stack*))) + (rotatef (nth (1- pos) *window-stack*) + (nth pos *window-stack*))))) + +(defun raise-to-top (win) + "Raise window to the top of the window stack." + (setf *window-stack* (cons win (remove win *window-stack*)))) + +(defun lower (win) + "Lower window one position in the stack." + (when (not (eq win (car (last *window-stack*)))) + (let ((pos (position win *window-stack*))) + (rotatef (nth (1+ pos) *window-stack*) + (nth pos *window-stack*))))) + +(defun lower-to-bottom (win) + "Lower window to the bottom of the window stack." + (when (not (eq win (car (last *window-stack*)))) + (setf *window-stack* (append (remove win *window-stack*) (list win))))) + +(defun empty-stack () + "Remove all windows from the stack." + (setf *window-stack* nil)) + +(defun refresh-stack () + "Touch and refresh visible windows in the window stack." + (if *window-stack* + (progn + (mapc #'(lambda (w) + (when (visiblep w) + (touch w) + (mark-for-refresh w))) + (reverse *window-stack*)) + (refresh-marked)) + (error "refresh stack: stack empty"))) + +;; https://www.informatimago.com/develop/lisp/l99/p19.lisp +;; todo: what if count is longer than a list? use mod +(defun rotate (list count) + (if (minusp count) + (rotate list (+ (length list) count)) + (nconc (subseq list count) (subseq list 0 count)))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/queue.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/queue.lisp new file mode 100644 index 0000000..ec2ebf0 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/queue.lisp @@ -0,0 +1,107 @@ +(in-package :de.anvi.croatoan) + +;; queue +;; support for cross-thread evaluation +;; authors: d4ryus , +;; Anton Vidovic + +(defclass queue () + ((head + :documentation "Pointer to the first cons of the elements list.") + (tail + :documentation "Pointer to the last cons of the elements list.") + (lock + :documentation "A mutex that ensures thread-safe access to the queue from multiple threads.")) + (:documentation "A thread-safe FIFO queue.")) + +(defmethod initialize-instance :after ((queue queue) &key) + (with-slots (head tail lock) queue + (setf head (cons nil nil) + tail (last head) + lock (bt:make-lock)))) + +(define-condition job-error (error) + ((form + :initarg :form + :initform (error "Form required") + :documentation "The form that failed to execute") + + (error + :initarg :error + :initform (error "Error required") + :documentation "The error that was signaled when form was executed"))) + +(defmethod print-object ((obj queue) stream) + (with-slots (head lock) obj + (bt:with-lock-held (lock) + (print-unreadable-object (obj stream :type t) + (format stream "~:[~;~:*~a~]" (cdr head)))))) + +(defmethod print-object ((obj job-error) stream) + (print-unreadable-object (obj stream :type t :identity t) + (with-slots (form error) obj + (format stream "form: ~a ~_error: ~a" form error)))) + +(defun enqueue (item queue) + "Push a new item onto the tail of the queue, return the new item." + (with-slots (tail lock) queue + (bt:with-lock-held (lock) + (car (setf tail (cdr (rplacd tail (list item)))))))) + +(defun dequeue (queue) + "Pop of the first element of queue and return it, returns NIL when queue is empty" + (with-slots (head lock) queue + (bt:with-lock-held (lock) + (when (cdr head) + (car (setf head (cdr head))))))) + +(defparameter *job-queue* (make-instance 'queue) + "A queue of functions (consed to their form for debugging purposes) +to be processed by the main thread to interface with ncurses.") + +(defmacro submit (&body body) + "Submit BODY from a producer thread to a job queue to be processed by the main thread. + +The main thread should be the only one interfacing ncurses directly, +and should be running in a terminal. + +SUBMIT uses a thread-safe FIFO queue to queue up jobs which should be +evaluated inside the terminal thread. + +For this to work PROCESS has to be called from inside the terminal +thread to pop requests from the FIFO queue and evaluate them. + +When a condition is signaled while the body of SUBMIT is evaluated, it +is handled by PROCESS and put inside a JOB-ERROR which also contains +the failed form. + +The condition is then signaled again from within a restart which +allows skipping the failed form and continue evaluating requests. + +In practice, this allows for calls to ncurses forms from SLIME to be +performed without IO glitches that tend to occur when ncurses code is +called from the SLIME repl thread directly." + `(enqueue + (cons (lambda () ,@body) + ;; the failed form is included for debugging. + ',body) + *job-queue*)) + +(defun process () + "Process the contents of the job queue in the current thread, then exit. + +Process should be called from the main thread, which should be the only thread +interfacing ncurses directly, and should be running in a terminal." + (loop :for (fn . form) := (dequeue *job-queue*) + :while fn + ;; We want to be able to see what form failed, for this we + ;; need to wrap the signaled condition in a job-error + ;; which contains the failed form and the signaled condition. + :do (handler-case (funcall fn) + (error (e) + (restart-case (error 'job-error + :form form + :error e) + (skip-job-form () + :report (lambda (stream) + (format stream "Skip job form")))))))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/refresh.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/refresh.lisp new file mode 100644 index 0000000..f6b9d9d --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/refresh.lisp @@ -0,0 +1,56 @@ +(in-package :de.anvi.croatoan) + +;; refresh windows _and_ pads +(defun refresh (win &optional pad-min-y pad-min-x screen-min-y screen-min-x screen-max-y screen-max-x) + "Redisplay the window after changes have been made to it. + +Copies a window to the virtual screen, then updates the visible +physical screen by the contents of the virtual screen. + +Only updates the changed parts of the window. In order to redraw the +whole window, it has to be explicitely touched or marked for redraw." + (let ((winptr (winptr win))) + ;; typease whether window or pad + ;; if window, signal error if any parameters are provided. + ;; if pad, signal error if not all parameters are provided. + ;; typecase uses type-of or typep internally. + ;; if typep, a pad will be recognized as a window, since it is a subclass. + ;; the pad type has to be checked first. + (typecase win + (pad (progn + ;; all 6 arguments have to be given, we dont have default arguments. + (unless (and pad-min-y pad-min-x screen-min-y screen-min-x screen-max-y screen-max-x) + (error "One of the arguments for pad refreshing is missing.")) + (%prefresh winptr pad-min-y pad-min-x screen-min-y screen-min-x screen-max-y screen-max-x))) + (window (%wrefresh winptr))))) + +;; call refresh-marked after this. +(defun mark-for-refresh (win &optional pad-min-y pad-min-x screen-min-y screen-min-x screen-max-y screen-max-x) + "Mark a window for a later batch-refresh. + +Copy a window to the virtual screen, but do not display it on the +visible physical screen. Call batch-refresh to display all marked +refreshes." + (let ((winptr (winptr win))) + ;; typecase uses typep internally, so pad has to be checked first because it is a subclass of window. + (typecase win + (pad (progn + (unless (and pad-min-y pad-min-x screen-min-y screen-min-x screen-max-y screen-max-x) + (error "One of the arguments for pad refreshing is missing.")) + (%prefresh winptr pad-min-y pad-min-x screen-min-y screen-min-x screen-max-y screen-max-x))) + (window (%wnoutrefresh winptr))))) + +;; call this after several windows have been marked for refresh. +(defun refresh-marked () + "Refresh windows marked for refresh." + (%doupdate)) + +;; does not redraw, only marks for redrawing by refresh. +;; It assumes that the display on the terminal has been corrupted. +;; It is unclear how redrawwin differs from touchwin. +(defun mark-for-redraw (window &key first-line no-of-lines) + "Mark a whole window or a number of lines to be completely redrawn on the next refresh." + (let ((winptr (winptr window))) + (if (and first-line no-of-lines) + (%wredrawln winptr first-line no-of-lines) + (%redrawwin winptr)))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/resizeterm.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/resizeterm.lisp new file mode 100644 index 0000000..0fbd859 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/resizeterm.lisp @@ -0,0 +1,41 @@ +(in-package :croatoan) + +;;; resizeterm +;;; change the curses terminal size +;;; http://invisible-island.net/ncurses/man/resizeterm.3x.html + +;;; C prototypes + +;; bool is_term_resized(int lines, int columns); +;; int resize_term(int lines, int columns); +;; int resizeterm(int lines, int columns); + +;;; Low-level C functions + +(defcfun ("is_term_resized" %is-term-resized) :boolean (lines :int) (columns :int)) +(defcfun ("resize_term" %resize-term) :int (lines :int) (columns :int)) +(defcfun ("resizeterm" %is-term-resized) :int (lines :int) (columns :int)) + +;;; High-level Lisp wrappers + +(defun terminal-resized-p (height width) + "Returns t if resize-terminal would modify a window, and nil otherwise." + (%is-term-resized height width)) + +(defun resize-terminal (height width &key use-sigwinch-handler) + "Resizes the current window to the specified dimensions. + +The function attempts to resize all windows. The areas that are +extended are filled with blanks. + +It is not possible to resize pads without additional interaction with +the application. + +If use-sigwinch-handler is t, add bookkeeping for the SIGWINCH +handler." + (if use-sigwinch-handler + (%resizeterm height width) + (%resize-term height width))) + +;;; TODOs + diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/scroll.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/scroll.lisp new file mode 100644 index 0000000..372f6cb --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/scroll.lisp @@ -0,0 +1,30 @@ +(in-package :croatoan) + +;;; scroll +;;; scroll a curses window +;;; http://invisible-island.net/ncurses/man/curs_scroll.3x.html + +;;; C prototypes + +;; int scroll(WINDOW *win); +;; int scrl(int n); +;; int wscrl(WINDOW *win, int n); + +;;; Low-level C functions + +(defcfun ("scroll" %scroll) :int (win window)) +(defcfun ("scrl" %scrl) :int (n :int)) +(defcfun ("wscrl" %wscrl) :int (win window) (n :int)) + +;;; High-level Lisp wrappers + +(defun scroll (window &optional (n 1)) + "Scroll the window for n lines. + +If n is positive, scroll the window down. If n is negative, scroll the +window up. The cursor position is not changed." + (%wscrl n)) + +;;; TODOs + +;; [ ] what about return values? diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/shape.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/shape.lisp new file mode 100644 index 0000000..177a7a6 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/shape.lisp @@ -0,0 +1,193 @@ +(in-package :de.anvi.croatoan) + +;; shapes +;; curses extension for plotting shapes +;; author: Daniel Vedder + +(defclass shape () + (;; TODO: merge -x and -y into one location in form of a list to correspond to the position/location slot of other elements. + (origin-x + :initform 0 + :initarg :x0 + :type integer + :accessor origin-x + :documentation "The x coordinate of this shape's point of origin.") + + (origin-y + :initform 0 + :initarg :y0 + :type integer + :accessor origin-y + :documentation "The y coordinate of this shape's point of origin.") + + ;; Coordinates are stored as '(y x) pairs (note the order!) + (coordinates + :initform nil + :type (or null cons) + :accessor coordinates + :documentation "A list of coordinates relative to the origin that form this shape.") + + (plot-char + :initform (make-instance 'complex-char :simple-char #\X :color-pair '(:white :black) :attributes nil) + :initarg :char + :type (or null character keyword complex-char) + :accessor plot-char + :documentation "The character to use for plotting.")) + + (:documentation "A shape is a list of coordinates, relative to an origin, that can be plotted in a window.")) + +;;; General shape methods + +(defun shape-extent (shape) + "Return min-y, min-x, max-y, and max-x of a shape's coordinates as multiple values." + (let ((y-vals (mapcar #'first (coordinates shape))) + (x-vals (mapcar #'second (coordinates shape)))) + (values (apply #'min y-vals) (apply #'min x-vals) + (apply #'max y-vals) (apply #'max x-vals)))) + +(defun fill-shape (shape) + "Take a shape that only shows the borders and 'color it out'." + ;; Every point inside a shape has, on the same axis, a point larger and one smaller than itself. + (flet ((inside-p (pt shape) + (and (member pt (coordinates shape) + :test #'(lambda (p c) (and (= (first p) (first c)) + (> (second p) (second c))))) + (member pt (coordinates shape) + :test #'(lambda (p c) (and (= (first p) (first c)) + (< (second p) (second c))))) + (member pt (coordinates shape) + :test #'(lambda (p c) (and (= (second p) (second c)) + (> (first p) (first c))))) + (member pt (coordinates shape) + :test #'(lambda (p c) (and (= (second p) (second c)) + (< (first p) (first c)))))))) + ;; Iterate over the rectangle that encloses the shape, adding any + ;; points inside the shape's borders to its coordinates + (do* ((extent (multiple-value-list (shape-extent shape))) + (min-y (first extent)) (min-x (second extent)) + (max-y (third extent)) (max-x (fourth extent)) + (y min-y (1+ y))) + ((> y max-y) shape) + (do ((x min-x (1+ x))) + ((> x max-x)) + (when (inside-p (list y x) shape) + (setf (coordinates shape) + (append (coordinates shape) (list (list y x))))))))) + +(defun merge-shapes (&rest shapes) + "Create a new shape object by merging the coordinates of a given list of shapes." + ;; This keeps the first shape's point of origin and plot-char. + ;; A completely new object is created and new lists consed up. + (let ((shp (make-instance 'shape + :char (plot-char (first shapes)) + :y0 (origin-y (first shapes)) + :x0 (origin-x (first shapes))))) + (dolist (s shapes shp) + (dolist (c (coordinates s)) + (unless (member c (coordinates shp) :test #'equal) + (setf (coordinates shp) + (append (coordinates shp) + (list (list (first c) (second c)))))))))) + +;;; Create various basic shapes + +(defun line (y0 x0 y1 x1 &key char) + "Return a straight line between two points" + ;;make sure we're moving from left to right + (let (zx zy) + (when (or (> x0 x1) (and (= x0 x1) (> y0 y1))) + (setf zx x1 zy y1) + (setf x1 x0 y1 y0) + (setf x0 zx y0 zy))) + ;;increment x from x0 to x1, building a list of coordinates as we go + (do* ((l (make-instance 'shape)) (coords nil) + (slope (if (= x0 x1) (abs (- y0 y1)) ;;prevent division-by-zero + (/ (- y1 y0) (- x1 x0)))) + (x 0 (1+ x)) (y (round (* x slope)) (round (* x slope)))) + ((< x1 (+ x0 x)) ;;finalise the shape object and return it + (setf (coordinates l) coords) + (when char (setf (plot-char l) char)) + l) + ;;for each x value, figure out how many characters we need to print + ;; in the y direction (depends on the slope gradient) + (do* ((next-x (+ x0 x)) (dy 0 (1+ dy)) + (next-y (+ y0 y (if (plusp slope) dy (* -1 dy))) + (+ y0 y (if (plusp slope) dy (* -1 dy))))) + ;;stop when we have stacked sufficient vertical coordinates + ((or (and (>= 1 (abs slope)) (= dy 1)) ;;shallow slopes + (and (< 1 (abs slope)) (= dy (ceiling (abs slope)))) ;;steep + (if (plusp slope) ;;don't overshoot the end + (or (> next-y y1) (> next-x x1)) + (or (< next-y y1) (> next-x x1))))) + ;;append the next pair of coordinates + (setf coords (append coords (list (list next-y next-x))))))) + +(defun angle-line (y0 x0 theta length &key char) + "Draw a line of the given length in the bearing theta from the origin." + ;; theta = 0 -> vertically up; theta = 90 -> horizontally right + (let* ((radians (* pi (/ (- theta 90) 180.0))) + (y1 (+ y0 (* length (sin radians)))) + (x1 (+ x0 (* length (cos radians))))) + (line y0 x0 (round y1) (round x1) :char char))) + +(defun polygon (corners &key filled char) + "Return a polygon along a list of corners, optionally filled" + (do* ((pol (make-instance 'shape)) + (i 0 (1+ i)) (j (1+ i) (1+ i))) + ((= i (length corners)) + (when char (setf (plot-char pol) char)) + (if filled (fill-shape pol) pol)) + (when (= j (length corners)) (setf j 0)) + (setf pol (merge-shapes pol + (line (first (nth i corners)) (second (nth i corners)) + (first (nth j corners)) (second (nth j corners)) + :char char))))) + +(defun triangle (y0 x0 y1 x1 y2 x2 &key filled char) + "Return a triangle (utility wrapper around `polygon')." + (polygon (list (list y0 x0) (list y1 x1) (list y2 x2)) + :filled filled :char char)) + +(defun quadrilateral (y0 x0 y1 x1 y2 x2 y3 x3 &key filled char) + "Return a quadrilateral (utility wrapper around `polygon')." + (polygon (list (list y0 x0) (list y1 x1) (list y2 x2) (list y3 x3)) + :filled filled :char char)) + +(defun rectangle (y0 x0 height width &key filled char) + "Return a rectangle (utility wrapper around `polygon')." + (polygon (list (list y0 x0) (list y0 (+ x0 (1- width))) + (list (+ y0 (1- height)) (+ x0 (1- width))) + (list (+ y0 (1- height)) x0)) + :filled filled :char char)) + +(defun circle (y0 x0 radius &key filled char) + "Return a circle with a given radius, optionally filled." + (do* ((shp (make-instance 'shape)) (coords nil) (deg 0 (1+ deg)) + (radians (* pi (/ deg 180.0)) (* pi (/ deg 180.0))) + (y (+ y0 (round (* radius (sin radians)))) + (+ y0 (round (* radius (sin radians))))) + (x (+ x0 (round (* radius (cos radians)))) + (+ x0 (round (* radius (cos radians))))) + (last-coord nil coord) (coord (list y x) (list y x))) + ((= deg 360) + (setf (coordinates shp) coords) + (when char (setf (plot-char shp) char)) + (if filled (fill-shape shp) shp)) + (unless (equal coord last-coord) + (setf coords (append coords (list coord)))))) + +;;; Integrate shapes with the rest of croatoan + +(defun draw-shape (window shape &optional squarify) + "Draw a shape in the given window." + ;; If squarify is on, draw-shape doubles the width of the shape to compensate + ;; for the fact that terminal fonts are higher than they are wide + (do* ((y0 (origin-y shape)) (x0 (origin-x shape)) (c (plot-char shape)) + (coords (coordinates shape) (cdr coords)) + (y (first (car coords)) (first (car coords))) + (x (second (car coords)) (second (car coords)))) + ((null coords)) + (setf y (+ y0 y) x (+ x0 x)) + (when squarify (setf x (* 2 x))) + (unless (or (minusp y) (minusp x) (>= y (height window)) (>= x (width window))) + (add window (simple-char c) :y y :x x :attributes (attributes c) :color-pair (color-pair c))))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/slk.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/slk.lisp new file mode 100644 index 0000000..c657fbd --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/slk.lisp @@ -0,0 +1,53 @@ +(in-package :croatoan) + +;;; slk +;;; curses soft label routines +;;; http://invisible-island.net/ncurses/man/curs_slk.3x.html + +;;; C prototypes + +;; int slk_init(int fmt); +;; int slk_set(int labnum, const char *label, int fmt); +;; int slk_refresh(void); +;; int slk_noutrefresh(void); +;; char *slk_label(int labnum); +;; int slk_clear(void); +;; int slk_restore(void); +;; int slk_touch(void); +;; int slk_attron(const chtype attrs); +;; int slk_attroff(const chtype attrs); +;; int slk_attrset(const chtype attrs); +;; int slk_attr_on(attr_t attrs, void *opts); +;; int slk_attr_off(const attr_t attrs, void *opts); +;; int slk_attr_set(const attr_t attrs, short color_pair, void *opts); +;; attr_t slk_attr(void); +;; int slk_color(short color_pair); +;; int slk_wset(int labnum, const wchar_t *label, int fmt); + +;;; Low-level C functions + +(defcfun ("slk_init" %slk-init) :int (fmt :int)) +(defcfun ("slk_set" %slk-set) :int (labnum :int) (label :string) (fmt :int)) +(defcfun ("slk_refresh" %slk-refresh) :int) +(defcfun ("slk_noutrefresh" %slk-noutrefresh) :int) +(defcfun ("slk_label" %slk-label) :string (labnum :int)) +(defcfun ("slk_clear" %slk-clear) :int) +(defcfun ("slk_restore" %slk-restore) :int) +(defcfun ("slk_touch" %slk-touch) :int) + +(defcfun ("slk_attron" %slk-attron) :int (attrs chtype)) +(defcfun ("slk_attroff" %slk-attroff) :int (attrs chtype)) +(defcfun ("slk_attrset" %slk-attrset) :int (attrs chtype)) + +(defcfun ("slk_attr_on" %slk-attr-on) :int (attrs attr) (opts (:pointer :void))) +(defcfun ("slk_attr_off" %slk-attr-off) :int (attrs attr) (opts (:pointer :void))) +(defcfun ("slk_attr_set" %slk-attr-set) :int (attrs attr) (color-pair :short) (opts (:pointer :void))) + +(defcfun ("slk_attr" %slk-attr) attr) +(defcfun ("slk_color" %slk-color) :int (color-pair :short)) + +;;; High-level Lisp wrappers + +;;; NOTES + +;;; TODOs diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/termattrs.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/termattrs.lisp new file mode 100644 index 0000000..929fd30 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/termattrs.lisp @@ -0,0 +1,37 @@ +(in-package :croatoan) + +;;; termattrs +;;; environment query routines +;;; http://invisible-island.net/ncurses/man/curs_termattrs.3x.html + +;;; C prototypes + +;; int baudrate(void); +;; char erasechar(void); +;; int erasewchar(wchar_t *ch); +;; bool has_ic(void); +;; bool has_il(void); +;; char killchar(void); +;; int killwchar(wchar_t *ch); +;; char *longname(void); +;; attr_t term_attrs(void); +;; chtype termattrs(void); +;; char *termname(void); + +;;; Low-level C functions + +(defcfun ("baudrate" %baudrate) :void) +(defcfun ("erasechar" %erasechar) :char) +(defcfun ("has_ic" %has_ic) :boolean) +(defcfun ("has_il" %has_il) :boolean) +(defcfun ("killchar" %killchar) :char) +(defcfun ("longname" %longname) :string) +(defcfun ("term_attrs" %term-attrs) attr) +(defcfun ("termattrs" %termattrs) chtype) +(defcfun ("termname" %termname) :string) + +;;; High-level Lisp wrappers + +;;; NOTES + +;;; TODOs diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/touch.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/touch.lisp new file mode 100644 index 0000000..2d9314e --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/touch.lisp @@ -0,0 +1,13 @@ +(in-package :de.anvi.croatoan) + +(defun touch (window) + "Make the next call to refresh rewrite whe whole window by marking the whole window as changed. + +Makes it possible to raise unchanged overlapping windows by refreshing." + (let ((winptr (winptr window))) + (%touchwin winptr))) + +;;; TODOs + +;; [ ] Return values, errors. +;; [ ] Difference to redrawwin. diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/utf8.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/utf8.lisp new file mode 100644 index 0000000..f883f2f --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/utf8.lisp @@ -0,0 +1,350 @@ +(in-package :de.anvi.croatoan) + +(defun ascii-byte-p (octet) + "Return t if octet is a single-byte 7-bit ASCII char. + +The most significant bit is 0, so the allowed pattern is 0xxx xxxx." + (assert (typep octet 'integer)) + (assert (<= (integer-length octet) 8)) + (let ((bitmask #b10000000) + (template #b00000000)) + ;; bitwise and the with the bitmask #b11000000 to extract the first two bits. + ;; check if the first two bits are equal to the template #b10000000. + (= (logand bitmask octet) template))) + +(defun multi-byte-p (octet) + "Return t if octet is a part of a multi-byte UTF-8 sequence. + +The multibyte pattern is 1xxx xxxx. + +A multi-byte can be either a lead byte or a trail byte." + (assert (typep octet 'integer)) + (assert (<= (integer-length octet) 8)) + (let ((bitmask #b10000000) + (template #b10000000)) + ;; bitwise and the with the bitmask #b11000000 to extract the first two bits. + ;; check if the first two bits are equal to the template #b10000000. + (= (logand bitmask octet) template))) + +(defun lead-byte-p (octet) + "Return t if octet is one of the leading bytes of an UTF-8 sequence, nil otherwise. + +Allowed leading byte patterns are 0xxx xxxx, 110x xxxx, 1110 xxxx and 1111 0xxx." + (assert (typep octet 'integer)) + (assert (<= (integer-length octet) 8)) + (let ((bitmasks (list #b10000000 #b11100000 #b11110000 #b11111000)) + (templates (list #b00000000 #b11000000 #b11100000 #b11110000))) + (some #'(lambda (a b) (= (logand a octet) b)) bitmasks templates))) + +;; http://stackoverflow.com/questions/14380143/matching-binary-patterns-in-c +(defun n-trail-bytes (octet) + "Take a leading utf-8 byte, return the number of continuation bytes 1-3." + (assert (typep octet 'integer)) + (assert (<= (integer-length octet) 8)) + (let ((bitmasks (list #b10000000 #b11100000 #b11110000 #b11111000)) + (templates (list #b00000000 #b11000000 #b11100000 #b11110000))) + (loop for i from 0 to 3 + when (= (nth i templates) (logand (nth i bitmasks) octet)) + return i))) + +(defun trail-byte-p (octet) + "Return t if octet is the continuation byte of an UTF-8 sequence. + +The allowed continuation byte pattern is 10xx xxxx." + (assert (typep octet 'integer)) + (assert (<= (integer-length octet) 8)) + (let ((bitmask #b11000000) + (template #b10000000)) + ;; bitwise and the with the bitmask #b11000000 to extract the first two bits. + ;; check if the first two bits are equal to the template #b10000000. + (= (logand bitmask octet) template))) + +#| + +Lower Upper Binary +bound bound Pattern +---------------------------------------------------- +0x00000 0x00007F 0xxxxxxx +0x00080 0x0007FF 110xxxxx 10xxxxxx +0x00800 0x00FFFF 1110xxxx 10xxxxxx 10xxxxxx +0x10000 0x10FFFF 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx + +Unicode code points Range Encoding Binary value +------------------ -------- -------------------------- +U+000000-U+00007f 0xxxxxxx 0xxxxxxx + +U+000080-U+0007ff 110yyyxx 00000yyy xxxxxxxx + 10xxxxxx + +U+000800-U+00ffff 1110yyyy yyyyyyyy xxxxxxxx + 10yyyyxx + 10xxxxxx + +U+010000-U+10ffff 11110zzz 000zzzzz yyyyyyyy xxxxxxxx + 10zzyyyy + 10yyyyxx + 10xxxxxx +|# + +;; two helper functions from the internal to the external format. +;; inside the app, we use lisp chars, we only convert from utf-8 on input and +;; to utf-8 on output. + +(defun utf-8-to-unicode (byte-list) + "Take a list of one to four utf-8 encoded bytes (octets), return a code point. + +Since this decoder will only used for reading keyboard input, the sequences are +not checked for illegal bytes. + +Since security is not considered, this decoder should not be used for anything +else." + (let ((b1 (car byte-list))) + (cond ((ascii-byte-p b1) b1) ; if a single byte, just return it. + ((multi-byte-p b1) + (if (lead-byte-p b1) + (let ((n (n-trail-bytes b1)) + ;; Content bits we want to extract from each lead byte. + (lead-templates (list #b01111111 #b00011111 #b00001111 #b00000111)) + ;; Content bits we want to extract from each trail byte. + (trail-template #b00111111)) + (if (= n (1- (list-length byte-list))) + ;; add lead byte + (+ (ash (logand (nth 0 byte-list) (nth n lead-templates)) (* 6 n)) + ;; and the trail bytes + (loop for i from 1 to n sum + (ash (logand (nth i byte-list) trail-template) (* 6 (- n i))))) + (error "calculated number of bytes doesnt match the length of the byte list"))) + (error "first byte in the list isnt a lead byte")))))) + +#| +(defun utf-8-to-unicode (byte-list) + "Take a list of one to four utf-8 encoded bytes (octets), return the shortest possible unicode code point." + (let ((b1 (car byte-list))) + (if (lead-byte-p b1) + (let ((n (n-trail-bytes b1))) + (if (= n (1- (list-length byte-list))) + + (case n + ;; if 0, we have simple ascii, so just get the char. + (0 b1) + ;; if 1, we have to convert 110yyyxx 10xxxxxx to 00000yyyxxxxxxxx + (1 (+ (ash (logand (nth 0 byte-list) #b00011111) 6) + (ash (logand (nth 1 byte-list) #b00111111) 0))) + ;; if 2, we have to convert 1110yyyy 10yyyyxx 10xxxxxx to yyyyyyyyxxxxxxxx + (2 (+ (ash (logand (nth 0 byte-list) #b00001111) 12) + (ash (logand (nth 1 byte-list) #b00111111) 6) + (ash (logand (nth 2 byte-list) #b00111111) 0))) + ;; if 3, we have to convert 11110zzz 10zzyyyy 10yyyyxx 10xxxxxx to 000zzzzz yyyyyyyy xxxxxxxx + (3 (+ (ash (logand (nth 0 byte-list) #b00000111) 18) + (ash (logand (nth 1 byte-list) #b00111111) 12) + (ash (logand (nth 2 byte-list) #b00111111) 6) + (ash (logand (nth 3 byte-list) #b00111111) 0)))) + + (error "calculated number of bytes doesnt match the length of the byte list"))) + (error "first byte in the list isnt a lead byte")))) +|# + +#| +;; we also can determine the number of required bytes by the bit-length of the code point. +(n-bits (integer-length int)) + (n-trail-bytes (cond ( (<= n-bits 7) 0) + ((and (> n-bits 7) (<= n-bits 11)) 1) + ((and (> n-bits 11) (<= n-bits 16)) 2) + ((and (> n-bits 16) (<= n-bits 21)) 3))) +|# + +;; we can also just print the char to a string, and output the string. +;; this is easier than utf-8 single char input. +(defun unicode-to-utf-8 (int) + "Take a unicode code point, return a list of one to four UTF-8 encoded bytes (octets)." + (assert (<= (integer-length int) 21)) + (let ((n-trail-bytes (cond ((<= #x00000 int #x00007F) 0) + ((<= #x00080 int #x0007FF) 1) + ((<= #x00800 int #x00FFFF) 2) + ((<= #x10000 int #x10FFFF) 3))) + (lead-templates (list #b00000000 #b11000000 #b11100000 #b11110000)) + (trail-template #b10000000) + ;; number of content bits in the lead byte. + (n-lead-bits (list 7 5 4 3)) + ;; number of content bits in the trail byte. + (n-trail-bits 6) + ;; list to put the UTF-8 encoded bytes in. + (byte-list nil)) + (if (= n-trail-bytes 0) + ;; if we need 0 trail bytes, ist just an ascii single byte. + (push int byte-list) + (progn + ;; if we need more than one byte, first fill the trail bytes with 6 bits each. + (loop for i from 0 to (1- n-trail-bytes) + do (push (+ trail-template + (ldb (byte n-trail-bits (* i n-trail-bits)) int)) + byte-list)) + ;; then copy the remaining content bytes to the lead byte. + (push (+ (nth n-trail-bytes lead-templates) + (ldb (byte (nth n-trail-bytes n-lead-bits) (* n-trail-bytes n-trail-bits)) int)) + byte-list))) + ;; return the list of UTF-8 encoded bytes. + byte-list)) + +#| + +;; %wgetch returns chars <255 and keycodes >255. +;; %wget_wch returns wide chars <255 and >255, and keycodes >255. +;; it also returns KEY_CODE_YES to designate that a >255 char is a keycode. +(defun get-char- (window &key y x) + "" + (let* ((winptr (winptr window)) + (byte-list nil) + ;; get the first byte + (b1 (%wgetch winptr))) + ;; -1 means "no event", >255 means function key. + ;; TODO: problem, when we return b1>255, how do we know that it is a function key and not a unicode code point?? + ;; we have to return function keywords _before_ we assemble a code point from utf-8. + ;; we have to merge get-char and get-event. + (when (= b1 -1) (return-from get-char- (values b1 nil))) + (when (> b1 255) (return-from get-char- (values b1 t))) + ;; normal 8-bit octets in the range 0-255. + (if (lead-byte-p b1) + (progn + (push b1 byte-list) + ;;(princ b1 window) + (let ((n (n-trail-bytes b1))) + (loop repeat n do + (let ((ch (%wgetch winptr))) + ;;(princ ch window) + (push ch byte-list))))) + (error "First byte isnt a lead byte.")) + ;;(princ (utf-8-to-unicode (reverse byte-list)) window) + (values (utf-8-to-unicode (reverse byte-list)) nil))) + +(defun get-event- (window) + (multiple-value-bind (code-point function-key-p) (get-char window) + (cond + ;; -1 means no key has been pressed. + ((= code-point -1) nil) + ;; 0-255 are regular chars, whch can be converted to lisp chars with code-char. + ((and (>= code-point 0) (not function-key-p)) (code-char code-point)) + ;; if the code belongs to a known function key, return a keyword symbol. + ((and (>= code-point 0) function-key-p) + (let ((ev (function-key code-point))) + (if (eq ev :mouse) + (multiple-value-bind (mev y x) (get-mouse-event) + (values mev y x)) ; returns 3 values, see mouse.lisp + ev))) + ;; todo: unknown codes, like mose, resize and unknown function keys. + (t (error "invalid value of char received from ncurses."))))) + +|# + +;; return t if the chosen unicode points are encoded and decoded correctly. +(defun test-utf-8 () + (let* ((unicodes-orig (list 65 246 1046 8364 119070)) + (unicodes-test (mapcar #'(lambda (x) (utf-8-to-unicode (unicode-to-utf-8 x))) + unicodes-orig))) + (mapcar #'(lambda (x) + (format t + "code point: ~A, character ~A, utf8 ~A, correct enc-dec ~A~%" + x + (code-char x) + (unicode-to-utf-8 x) + (= x (utf-8-to-unicode (unicode-to-utf-8 x))))) + unicodes-orig) + ;; return t if all are t + (every #'= unicodes-orig unicodes-test))) + +;; reading utf-8 chars from the keyboard works. +;; tested in t03. +;; to make t16c work too, we have to similarly be able to extract utf-8 from a window. +;; characters are saved by ncurses as wchar_t or wint_t. + +;; instead of get-char, use read-byte and gray streams + +;; part 2 will be correctly implementing get_wch und winwch. +;; then we do not need utf-8 conversion. + +;; read one (first) char from the stream +;; check how many chars we have to read if it is an utf8 char +;; read additional n (0-3) octets. +;; combine 1-4 octets into one lisp utf-8 char and return that char. + +;; all bytes here are octets. + +#| +(defun get-utf-8-char (byte-list) + "Take a list of chars, return the first UTF-8 encoded char. + +Signal an error if there are malformatted octets before the first char +is successfully read." + (let ((one-char-list nil) + (b1 (car byte-list))) + (if (lead-byte-p b1) + (progn + (push b1 one-char-list) + (let ((n (n-trail-bytes b1))) + (loop for i from 1 to n do (push (nth i byte-list) one-char-list)))) + (error "First byte isnt a lead byte.")) + (reverse one-char-list))) +|# + +;; (code-char (utf-8-to-unicode (bytes))) => #\a + +;; char-code and code-char translate between lisp chars and unicode code points. +;; so we have to return wchar_t compatible 32-bit integers. + +#| +;; instead of stream, we have to use window as an argument here. +(defun get-utf-8-char (stream) + (let ((bytes nil) + (ch (get-char window))) + ;; check whether single-byte or multi-byte. + ;; if single-byte: return ch + ;; if multi-byte: read continuation bytes, combine bytes, return ch + (if (lead-byte-p ch) + (let ((n (n-trail-bytes ch))) + (if (= n 0) + (push ch bytes) + (loop repeat n do (push (get-char window))))) + (error "trail byte without lead byte")))) +|# + +#| +(defun utf-8-number-of-bytes (first-byte) + "returns the length of the utf-8 code in number of bytes, based on the first byte. +The length can be a number between 1 and 4." + (declare (fixnum first-byte)) + (cond ((= 0 (ldb (byte 1 7) first-byte)) 1) + ((= #b110 (ldb (byte 3 5) first-byte)) 2) + ((= #b1110 (ldb (byte 4 4) first-byte)) 3) + ((= #b11110 (ldb (byte 5 3) first-byte)) 4) + (t (error "unknown number of utf-8 bytes for ~a" first-byte)))) + +(defun utf-8-decode-unicode-character-code-from-stream (stream) + "Decodes byte values, from a binary byte stream, which describe a character +encoded using UTF-8. +Returns the character code and the number of bytes read." + (let* ((first-byte (read-byte stream)) + (number-of-bytes (utf-8-number-of-bytes first-byte))) + (declare (fixnum first-byte number-of-bytes)) + (ecase number-of-bytes + (1 (values (ldb (byte 7 0) first-byte) + 1)) + (2 (values (logior (ash (ldb (byte 5 0) first-byte) 6) + (ldb (byte 6 0) (read-byte stream))) + 2)) + (3 (values (logior (ash (ldb (byte 5 0) first-byte) 12) + (ash (ldb (byte 6 0) (read-byte stream)) 6) + (ldb (byte 6 0) (read-byte stream))) + 3)) + (4 (values (logior (ash (ldb (byte 3 0) first-byte) 18) + (ash (ldb (byte 6 0) (read-byte stream)) 12) + (ash (ldb (byte 6 0) (read-byte stream)) 6) + (ldb (byte 6 0) (read-byte stream))) + 4)) + (t (error "wrong UTF-8 encoding for file position ~a of stream ~s" + (file-position stream) + stream))))) + +(mapcar #'(lambda (x) (princ (code-char (utf-8-to-unicode (unicode-to-utf-8 x))))) (list 65 246 1046 8364 119070)) + +=> (#\A #\LATIN_SMALL_LETTER_O_WITH_DIAERESIS #\CYRILLIC_CAPITAL_LETTER_ZHE #\EURO_SIGN #\MUSICAL_SYMBOL_G_CLEF) +|# diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/util.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/util.lisp new file mode 100644 index 0000000..73dcadf --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/util.lisp @@ -0,0 +1,52 @@ +(in-package :croatoan) + +;;; util +;;; miscellaneous curses utility routines +;;; http://invisible-island.net/ncurses/man/curs_util.3x.html + +;;; C prototypes + +;; char *unctrl(chtype c); +;; wchar_t *wunctrl(cchar_t *c); +;; char *keyname(int c); +;; char *key_name(wchar_t w); +;; void filter(void); +;; void nofilter(void); +;; void use_env(bool f); +;; int putwin(WINDOW *win, FILE *filep); +;; WINDOW *getwin(FILE *filep); +;; int delay_output(int ms); +;; int flushinp(void); + +;;; Low-level C functions + +(defcfun ("unctrl" %unctrl) :string (c chtype)) +(defcfun ("keyname" %keyname) :string (c :int)) + +(defcfun ("filter" %filter) :void) +(defcfun ("nofilter" %nofilter) :void) + +(defcfun ("use-env" %use-env) :void (f :boolean)) + +(defcfun ("delay_output" %delay-output) :int (ms :int)) +(defcfun ("flushinp" %flushinp) :int) + +;;; High-level Lisp wrappers + +(defun char-to-string (char) + "Return a string representing the char." + (%unctrl char)) + +(defun key-to-string (key) + "Return a string representing they key." + (%keyname key)) + +;;; NOTES + +;; Also see %use-legacy-coding in legacy_coding.lisp. + +;;; TODOs + +;; [ ] putwin, getwin, FILE pointer. +;; [ ] wunctrl, key_name, for wide chars. + diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/variables.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/variables.lisp new file mode 100644 index 0000000..4f7f143 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/variables.lisp @@ -0,0 +1,62 @@ +(in-package :croatoan) + +;;; variables +;;; curses global variables +;;; http://invisible-island.net/ncurses/man/curs_variables.3x.html +;;; http://h71000.www7.hp.com/doc/83final/5763/5763pro_016.html + +;;; Low-level C global variables + +;; int COLOR_PAIRS; +;; int COLORS; +;; int COLS; +;; int ESCDELAY; +;; int LINES; +;; int TABSIZE; +;; WINDOW * curscr; +;; WINDOW * newscr; +;; WINDOW * stdscr; + +;;; Lisp read-only global constants. + +(defcvar ("COLOR_PAIRS" +color-pairs+ :read-only t) :int + "Number of color pairs which the terminal can support.") + +(defcvar ("COLORS" +colors+ :read-only t) :int + "Number of colors which the terminal can support.") + +(defcvar ("COLS" +screen-columns+ :read-only t) :int + "Width of the screen, the number of columns.") + +(defcvar ("ESCDELAY" +esc-delay+ :read-only t) :int + "Number of miliseconds to wait after reading an escape character, +to distinguish between an individual escape character entered on the +keyboard from escape sequences sent by cursor- and function-keys.") + +(defcvar ("LINES" +screen-lines+ :read-only t) :int + "Height of the screen, the number of lines.") + +(defcvar ("TABSIZE" +tab-size+ :read-only t) :int + "Number of columns to convert a tab character to spaces when +displaying the tab in a window.") + +#| + +curscr is the contents of the physical display screen, so it naturally +includes the ripped-off lines. + +6.3.1 Predefined Windows (stdscr and curscr) + +Initially, two windows the size of the terminal screen are predefined +by Curses. These windows are called stdscr and curscr . The stdscr +window is defined for your use. Many Curses macros default to this +window. + +The second predefined window, curscr , is designed for internal Curses +work; it is an image of what is currently displayed on the terminal +screen. The only HP C for OpenVMS Curses function that will accept +this window as an argument is clearok . Do not write to or read from +curscr . Use stdscr and user-defined windows for all your Curses +applications. + +|# diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/window.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/window.lisp new file mode 100644 index 0000000..9aac143 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/window.lisp @@ -0,0 +1,39 @@ +(in-package :de.anvi.croatoan) + +;; takes integers and returns a winptr. +(defun new-window (&key height width begin-y begin-x) + (%newwin height width begin-y begin-x)) +;; Example: (new-window :height 18 :width 17 :begin-y 4 :begin-x 19) + +;; TODO: one single command to delete a window and to end screen, or better a method that specializes on window type. +;; takes a window object. +;; TODO: look up what delwin returns. +(defun delete-window (window) + (%delwin (winptr window))) + +;; takes a winptr. +(defun move-window (window y x) + (%mvwin window y x)) + +;; takes a winptr, returns a winptr. +(defun new-subwindow (parent-window &key height width begin-y begin-x relative) + (if relative + (%derwin parent-window height width begin-y begin-x) + (%subwin parent-window height width begin-y begin-x))) + +;; This is NOT a move function, despite the name. You still move a subwindow with mvwin. +;; "Moving subwindows is allowed, but should be avoided." +;; mvderwin changes the source area of a subwin, but not the output area. +;; "This routine is used to display different parts of the parent window at the same physical position on the screen." +(defun move-subwindow (window parent-y parent-x) + (%mvderwin window parent-y parent-x)) + +(defun duplicate-window (window) + (%dupwin window)) + +;;; TODOs + +;; Do something with wsyncup, syncok, wcursyncup, wsyncdown. +;; For now, I wont wrap them, because I have no idea how to test them. +;; I doubt anybody will ever use them. + diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/wresize.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/wresize.lisp new file mode 100644 index 0000000..bc56353 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/wresize.lisp @@ -0,0 +1,5 @@ +(in-package :de.anvi.croatoan) + +(defun resize (window height width) + (let ((winptr (winptr window))) + (%wresize winptr height width))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/test/clos.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/test/clos.lisp new file mode 100644 index 0000000..56acc42 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/test/clos.lisp @@ -0,0 +1,2878 @@ +(in-package :de.anvi.croatoan.test) + +(defun snake () + (labels ((display-snake (scr body) + (mapc #'(lambda (pair) (add-char scr (char-code #\*) :y (car pair) :x (cadr pair))) body))) + (with-screen (scr :input-echoing nil :input-blocking nil :enable-function-keys t :cursor-visible nil) + (let* ((body '((0 7) (0 6) (0 5) (0 4) (0 3) (0 2) (0 1) (0 0))) + (xpos (cadar body)) + (ypos (caar body)) + (dir #c(1 0))) + + (clear scr) + (display-snake scr body) + (refresh scr) + + (loop + (let ((event (get-event scr))) + (if event + (case event + (:up (setf dir #c( 0 1))) + (:down (setf dir #c( 0 -1))) + (:right (setf dir #c( 1 0))) + (:left (setf dir #c(-1 0))) + (#\q (return))) + (progn + (sleep 0.1) + (add-char scr (char-code #\space) :y (caar (last body)) :x (cadar (last body))) + (setf body (cons (list (incf ypos (- (imagpart dir))) + (incf xpos (realpart dir))) + (butlast body))) + (display-snake scr body) + (refresh scr))))))))) + +(defun snake2 () + "Use bind and run-event-loop for event handling. Use lists instead of complex numbers for directions." + (with-screen (scr :input-echoing nil :input-blocking nil :enable-function-keys t :cursor-visible nil) + (let* ((body '((0 7) (0 6) (0 5) (0 4) (0 3) (0 2) (0 1) (0 0))) + (head (car body)) + (tail (car (last body))) + ;; initial direction = right + (dir '(0 1))) + (flet ((draw-snake (win body) + (mapc (lambda (pos) (add win #\* :position pos)) body))) + (bind scr #\q 'exit-event-loop) + (bind scr :right (lambda (w e) (setq dir '( 0 1)))) + (bind scr :left (lambda (w e) (setq dir '( 0 -1)))) + (bind scr :down (lambda (w e) (setq dir '( 1 0)))) + (bind scr :up (lambda (w e) (setq dir '(-1 0)))) + (bind scr nil (lambda (w e) + ;; snake moves = erase last body pair by overwriting it with space + (add scr #\space :position tail) + (setq body (cons (mapcar #'+ head dir) (butlast body))) + (setq head (car body)) + (setq tail (car (last body))) + (draw-snake scr body) + (refresh scr))) + (clear scr) + (setf (frame-rate scr) 20) + (run-event-loop scr))))) + +;; https://github.com/skydrome/random/blob/master/shell/screensaver.sh +;; https://github.com/pipeseroni/pipes.sh/blob/master/pipes.sh +;; https://www.youtube.com/watch?v=T4n87IIa--U +(defun pipes () + (with-screen (scr :input-echoing nil :input-blocking nil :enable-function-keys t :cursor-visible nil) + (let* ((pos (list (round (/ (height scr) 2)) (round (/ (width scr) 2)))) + (dirs '((1 0) (-1 0) (0 -1) (0 1))) + (dir (nth (random 4) dirs)) + (dir-prev dir) + ch + (i 0)) + (clear scr) + (box scr) + (refresh scr) + (event-case (scr event) + (#\q (return-from event-case)) + ((nil) + (sleep 0.1) + (move scr (car pos) (cadr pos)) + (setf ch (cond ((equal dir dir-prev) (if (= (car dir) 0) :horizontal-line :vertical-line)) + ((and (equal dir-prev '(1 0)) (equal dir '(0 -1))) :lower-right-corner) + ((and (equal dir-prev '(1 0)) (equal dir '(0 1))) :lower-left-corner) + ((and (equal dir-prev '(0 1)) (equal dir '(-1 0))) :lower-right-corner) + ((and (equal dir-prev '(0 1)) (equal dir '(1 0))) :upper-right-corner) + ((and (equal dir-prev '(-1 0)) (equal dir '(0 -1))) :upper-right-corner) + ((and (equal dir-prev '(-1 0)) (equal dir '(0 1))) :upper-left-corner) + ((and (equal dir-prev '(0 -1)) (equal dir '(-1 0))) :lower-left-corner) + ((and (equal dir-prev '(0 -1)) (equal dir '(1 0))) :upper-left-corner))) + (add-char scr ch) + (let ((pos-trial (list (+ (car pos) (car dir)) (+ (cadr pos) (cadr dir))))) + (if (or (= (car pos-trial) 0) + (= (cadr pos-trial) 0) + (= (car pos-trial) (1- (height scr))) + (= (cadr pos-trial) (1- (width scr)))) + (setf pos (list (round (/ (height scr) 2)) (round (/ (width scr) 2)))) + (setf pos pos-trial))) + (if (> i (random 5)) + (progn (setf i 0) + (setf dir-prev dir) + (setf dir (nth (random 3) (remove (list (- (car dir)) (- (cadr dir))) dirs :test #'equal)))) + (progn (incf i) + (setf dir-prev dir))) + (refresh scr)))))) + +(defun matrix () + (with-screen (scr :input-echoing nil :input-blocking nil :cursor-visible nil) + (let* ((width (width scr)) + (height (height scr)) + (positions (loop repeat width collect (random height))) + (speeds (loop repeat width collect (random 4)))) + (event-case (scr event) + (#\q (return-from event-case)) + ((nil) + (sleep 0.05) + (loop for column from 0 to (1- width) do + (loop repeat (nth column speeds) do + (setf (attributes scr) '(:bold)) + (setf (color-pair scr) '(:white :black)) + (add-char scr (+ 64 (random 58)) :y (mod (nth column positions) height) :x column) + (setf (color-pair scr) '(:green :black)) + (add-char scr (+ 64 (random 58)) :y (mod (- (nth column positions) 1) height) :x column) + (add-char scr (+ 64 (random 58)) :y (mod (- (nth column positions) 2) height) :x column) + (setf (attributes scr) '()) + (add-char scr (+ 64 (random 58)) :y (mod (- (nth column positions) 3) height) :x column) + (add-char scr (char-code #\space) :y (mod (- (nth column positions) (floor height 2)) height) :x column) + (refresh scr) + (setf (nth column positions) (mod (1+ (nth column positions)) height))))))))) + +(defun matrix2 () + (with-screen (scr :input-echoing nil :input-blocking nil :cursor-visible nil) + (let* ((width (width scr)) + (height (height scr)) + ;; start at a random height in each column. + (positions (loop repeat width collect (random height))) + ;; run each column at a random speed. + (speeds (loop repeat width collect (random 4)))) + (flet ((randch () (+ 64 (random 58)))) + ;; hit the q key to exit the main loop. + (bind scr #\q 'exit-event-loop) + (bind scr nil + (lambda (win event) + ;; generate a random ascii char + (loop for column from 0 to (1- width) do + (loop repeat (nth column speeds) do + ;; position of the first point in the current column + (let ((pos (nth column positions))) + (setf (attributes win) '(:bold)) + (setf (color-pair win) '(:white :black)) + (add win (randch) :y (mod pos height) :x column) + (setf (color-pair win) '(:green :black)) + (add win (randch) :y (mod (- pos 1) height) :x column) + (add win (randch) :y (mod (- pos 2) height) :x column) + (setf (attributes win) '()) + (add win (randch) :y (mod (- pos 3) height) :x column) + ;; overwrite the last char with a space + (add win #\space :y (mod (- pos (floor height 3)) height) :x column) + (refresh win) + ;; increment the column positions + (setf (nth column positions) (mod (1+ pos) height))))))))) + ;; after the handlers have been defined, run the main event loop at 20 fps. + (setf (frame-rate scr) 20) + (run-event-loop scr))) + +(defun matrix3 () + "Test character styles and color pair completion." + (with-screen (scr :input-echoing nil :input-blocking nil :cursor-visible nil) + (let* ((width (width scr)) + (height (height scr)) + (positions (loop repeat width collect (random height))) + (speeds (loop repeat width collect (random 4))) + (s1 (list :attributes '(:bold) :fgcolor :white)) + (s2 (list :attributes '(:bold) :fgcolor :green :bgcolor nil)) + (s3 (list :attributes nil :fgcolor :green :bgcolor :black))) + (flet ((randch () (+ 64 (random 58)))) + (bind scr #\q 'exit-event-loop) + (bind scr #\r + (lambda (win event) + (setf (getf s2 :fgcolor) :red + (getf s3 :fgcolor) :red))) + (bind scr nil + (lambda (win event) + (loop for column from 0 to (1- width) do + (loop repeat (nth column speeds) do + (let ((pos (nth column positions))) + (add win (randch) :y (mod pos height) :x column :style s1) + (add win (randch) :y (mod (- pos 1) height) :x column :style s2) + (add win (randch) :y (mod (- pos 2) height) :x column :style s2) + (add win (randch) :y (mod (- pos 3) height) :x column :style s3) + (add win #\space :y (mod (- pos (floor height 3)) height) :x column :style s3) + (refresh win) + (setf (nth column positions) (mod (1+ pos) height))))))))) + (setf (frame-rate scr) 20) + (run-event-loop scr))) + +(defun matrix4 () + "Test passing colors with fgcolor without passing them as pairs." + (with-screen (scr :input-echoing nil :input-blocking nil :cursor-visible nil) + (let* ((width (width scr)) + (height (height scr)) + (positions (loop repeat width collect (random height))) + (speeds (loop repeat width collect (random 4)))) + (flet ((randch () (+ 64 (random 58)))) + (bind scr #\q 'exit-event-loop) + (bind scr nil + (lambda (win event) + (loop for column from 0 to (1- width) do + (loop repeat (nth column speeds) do + (let ((pos (nth column positions))) + (setf (attributes win) '(:bold)) + (setf (fgcolor win) :green) + (add win (randch) :y (mod pos height) :fgcolor :white :x column) + (add win (randch) :y (mod (- pos 1) height) :x column) + (add win (randch) :y (mod (- pos 2) height) :x column) + (setf (attributes win) '()) + (add win (randch) :y (mod (- pos 3) height) :x column) + (add win #\space :y (mod (- pos (floor height 3)) height) :x column) + (refresh win) + (setf (nth column positions) (mod (1+ pos) height))))))))) + (setf (frame-rate scr) 20) + (run-event-loop scr))) + +;; initialize ncurses, deinitialize ncurses +;; tests initialize-instance +(defun t00 () + (let ((scr (make-instance 'screen))) + (unwind-protect + nil + (close scr)))) + +;; clos screen, accessors, unwind-protect. +(defun t01 () + (unwind-protect + (let ((scr (make-instance 'screen :enable-colors t))) + + (clear scr) + (move scr 0 0) + (add-string scr "hello there!") + + ;; the text will be red on yellow. + ;; this affects only new characters, not the whole window. + (setf (color-pair scr) '(:red :yellow)) + + (move scr 5 5) + (add-string scr "dear john!") + (refresh scr) + + ;; wait for keypress, works only in blocking mode, which is the default. + (get-char scr) + + ;; set the background character for new characters + ;; the optional argument nil prevents it from being applied to every window cell. + ;; a newline sets the background till the end of the line. + (setf (background scr nil) (make-instance 'complex-char :simple-char #\- :color-pair '(:white :green))) + (format scr "~%Hello again!~%") + (refresh scr) + (get-char scr) + + ;; finally, set the background for the whole window. + ;; the change is applied only to empty cells and to + ;; characters that have no already set attributes or colors. + (setf (background scr) (make-instance 'complex-char :simple-char #\. :color-pair '(:green :white))) + (refresh scr) + (get-char scr) + (setf (background scr) (make-instance 'complex-char :simple-char #\- :color-pair '(:red :white))) + (refresh scr) + + ;; wait for the next keypress, then end. + (get-char scr)) + + ;; unwind protect makes sure that ncurses is ended at all cost. + (end-screen))) + +;; the same as t01, but hides the window creation and ncurses ending by utilizing the with-screen macro. +(defun t02 () + (with-screen (scr :color-pair (list :yellow :red)) + (clear scr) + (move scr 0 0) + (add-string scr "hello there!") + (move scr 3 6) + (add-string scr "dear john!") + (setf (color-pair scr) '(:red :yellow)) + (move scr 3 3 :relative t) + (add-string scr "call me maybe!") + ;; setting the cursor position directly instead of using move + (setf (cursor-position scr) (list 9 12)) + (add-string scr "welcome to tijuana") + (refresh scr) + (get-char scr) + + (setf (background scr) (make-instance 'complex-char :simple-char #\. :color-pair '(:green :white))) + (refresh scr) + (get-char scr) + + (setf (background scr) (make-instance 'complex-char :simple-char #\, :color-pair '(:white :green))) + (refresh scr) + (get-char scr) )) + +(defun t02a () + "Separately set the window foreground and background color pairs." + (with-screen (scr :fgcolor :yellow :bgcolor :red) + (clear scr) + (move scr 0 0) + (add-string scr "hello there!") + + (setf (color-pair scr) '(:red :yellow)) + (move scr 3 6) + (add-string scr "dear john!") + + (setf (fgcolor scr) :yellow + (bgcolor scr) :red) + (move scr 3 3 :relative t) + (add-string scr "call me maybe!") + + ;; setting the cursor position directly instead of using move + (setf (cursor-position scr) (list 9 12)) + (add-string scr "welcome to tijuana") + (refresh scr) + (get-char scr) + + ;; setting fg to green, will set the bg to the default black + (setf (background scr) (make-instance 'complex-char :simple-char #\. :fgcolor :green)) + (refresh scr) + (get-char scr) + ;; setting bg to green will set the fg to the default white + (setf (background scr) (make-instance 'complex-char :simple-char #\, :bgcolor :green)) + + ;; text will still use the window color pair + (move scr 3 3 :relative t) + (add scr "hasta siempre") + + (refresh scr) + (get-char scr) )) + +(defun t02b () + "Set and get a wide character background." + (with-screen (scr) + ;;(de.anvi.croatoan::funcall-make-cchar_t-ptr #'%wbkgrnd (winptr scr) 0 0 0 1) + + ;; if we set char 0 as background, ncurses sets char 32 (space), which is obviously the default char. + ;; also setting 0 leads to the color pair not being accepted. + ;; TODO: check that only graphic chars are set. + (setf (background scr) (make-instance 'complex-char :simple-char #x2592 :color-pair '(:yellow :red))) + (get-char scr) + + (move scr 0 0) + ;; the low-level function returns the code. + (let ((ch (de.anvi.croatoan::get-background-cchar_t scr))) + (format scr "ch: ~A~%" ch) + (format scr "~A ~A ~A" (char-code (simple-char ch)) (attributes ch) (color-pair ch))) + + (move scr 2 0) + ;; the high level interface returns what was set by the high-level setf. + ;; TODO: when we set background to :board, should it return :board or the numeric code point? + (let ((ch (background scr))) + (if ch + (format scr "~A ~A ~A" (simple-char ch) (attributes ch) (color-pair ch)) + (format scr "ch: ~A" ch))) + + (refresh scr) + (get-char scr))) + +(defun t02c () + (with-screen (scr :input-blocking t :input-echoing nil :enable-colors t :use-terminal-colors t) + ;; simple chars added to a window without a rendered style. + (add-string scr "Hello there!") + (fresh-line scr) (refresh scr) (get-char scr) + + ;; color-pair applies to newly added text. + (setf (color-pair scr) '(:red :yellow)) + (add-string scr "Dear John!") + (fresh-line scr) (refresh scr) (get-char scr) + + ;; removing the color pair puts back the outut into the default state. + (setf (color-pair scr) '()) + (add-string scr "Open the pod bay door.") + (fresh-line scr) (refresh scr) (get-char scr) + + ;; the background style renders simple text, but it doesnt change the text with a set color pair + (setf (background scr) (make-instance 'complex-char :simple-char #\. :fgcolor :black :bgcolor :magenta)) + (add-string scr "I can feel it.") + (fresh-line scr) (refresh scr) (get-char scr) + + ;; remove the background char, set back to the default state. + (setf (background scr) nil) + (add-string scr "My mind is going.") + (fresh-line scr) (refresh scr) (get-char scr) + + ;; the empty cells of the last foreground will be overwritten by the next background call. + (setf (background scr) (make-instance 'complex-char :simple-char #\_ :color-pair '(:black :yellow))) + (format scr "I'm sorry, Dave.") + (fresh-line scr) (refresh scr) (get-char scr))) + +;; read and display chars until a q is pressed, blocking version. +(defun t03 () + (with-screen (scr :input-echoing nil :input-blocking t) + (clear scr) + (add-string scr "Type chars. Type q to quit. ") + (refresh scr) + + (loop for ch = (get-char scr) + while (not (equal (code-char ch) #\q)) + do (add-char scr ch)) + + (add-string scr "You pressed q. Now press any char to quit.") + (get-char scr))) + +;; read and display chars until a q is pressed, non-blocking version (leads to 100% CPU usage). +;; wait for keyboard using get-char makes no sense in non-blocking code because it doesnt wait. +(defun t03a () + (with-screen (scr :input-echoing nil :input-blocking nil) + (clear scr) + (add-string scr "Type chars. Type q to quit. ") + (refresh scr) + + (loop for ch = (get-char scr) + while (or (= ch -1) (not (equal (code-char ch) #\q))) + do (unless (= ch -1) (add-char scr ch))))) + +;; test which integer is returned by ncurses on a non-blocking nil event. +;; when get-char is used, -1 is returned, +;; when get-wide-char is used, 0 is returned. +(defun t03a2 () + (with-screen (scr :input-echoing nil :input-blocking nil) + (clear scr) + (add-string scr "Type chars. Type q to quit. ") + (refresh scr) + (loop for ch = (get-char scr) + while (not (equal ch 113)) ; 113 = q + do (princ ch scr)))) + +;; read and display chars until a q is pressed, non-blocking version (leads to 100% CPU usage). +;; uses get-event for event handling. +(defun t03b () + (with-screen (scr :input-echoing nil :input-blocking nil) + (clear scr) + (add-string scr "Type chars. Type q to quit. ") + (refresh scr) + + ;; TODO: should get-event only return single bytes, or should we merge it with get-wide-event? + (loop (let ((event (get-event scr))) + (when event + (case event + (#\q (return)) + (otherwise (add-char scr (char-code event))))))))) + +;; using the event-case macro to simplify the event loop. +;; do not use ((nil) nil) with input-blocking nil, it leads to 100% CPU usage. +;; if nothing happens in the nil case anyway, we can use blocking. +(defun t03b2 () + (with-screen (scr :input-echoing nil :input-blocking t) + (clear scr) + (add-string scr "Type chars. Type q to quit. ") + (refresh scr) + (event-case (scr event) + ;; ((nil) nil) + (#\q (return-from event-case)) + (otherwise (add-char scr (char-code event)))))) + +;; slightly improved t03b2 pasted as an example to the cliki croatoan page +(defun t03b3 () + (with-screen (scr :input-echoing nil :input-blocking t :enable-colors t) + (clear scr) + (move scr 2 0) + (format scr "Type chars. Type q to quit.~%~%") + (refresh scr) + (setf (color-pair scr) '(:yellow :red) + (attributes scr) '(:bold)) + (event-case (scr event) + (#\q (return-from event-case)) + (otherwise (princ event scr) + (refresh scr))))) + +;; read and display chars until a q is pressed, blocking + gray stream version. +;; the stream reading function wont work in non-blocking mode and with non-char keys. +(defun t03c () + (with-screen (scr :input-echoing nil :input-blocking t) + (clear scr) + (princ "Type chars. Type q to quit." scr) + (refresh scr) + + (loop for ch = (read-char scr) + while (not (equal ch #\q)) + do (princ ch scr)) + + (princ "You pressed q. Now press any char to quit." scr) + (read-char scr))) + +(defun t03d () + "Read and display wide (multi-byte) characters until q is pressed." + (with-screen (scr :input-echoing nil :input-blocking t :enable-colors t :cursor-visible nil) + (clear scr) + (refresh scr) + (loop for ch = (get-wide-char scr) + while (not (equal (code-char ch) #\q)) + do + (clear scr) + ;; display the human-readable version of a wide char. + (add-wide-char scr ch :attributes (list :underline) :fgcolor :yellow :bgcolor :red :y 0 :x 0) + (add-wide-char scr (code-char ch) :attributes (list :bold) :color-pair (list :yellow :red) :y 0 :x 2) + ;; extract the wide char again. + (let ((ch2 (extract-wide-char scr :y 0 :x 0))) + ;; display the lisp-readable version of the extracted complex wide char + (move scr 1 0) + ;; TODO: prin1, print and ~S should print unreadable #<..> + ;; only princ and ~A should render complex chars + (prin1 (simple-char ch2) scr) + ;; print the slots of the extracted complex wide char + (princ (attributes ch2) scr) + (princ (color-pair ch2) scr) + ;; display the rendered complex wide char again + (add-wide-char scr ch2 :y 3 :x 0) )))) + +;; gray stream version of t03d +;; we can not use ~C and write-char to write complex-chars, but it works for wide chars, which are normal lisp chars. +;; princ and ~A should work, because they rely on specialized print-object. +;; also see t08c +(defun t03d2 () + "Use gray stream functions to read and display wide (multi-byte) characters until q is pressed." + (with-screen (scr :input-echoing nil :input-blocking t :enable-colors t :cursor-visible nil) + (clear scr) + (refresh scr) + (loop for ch = (read-char scr) + while (not (equal ch #\q)) + do + (clear scr) + (move scr 0 0) + ;; we only can write-char if it is a lisp character. + (write-char ch scr) + ;; the extracted "char" is not a lisp character any more, but a complex-char + (let ((ch2 (extract-wide-char scr :y 0 :x 0)) + (*standard-output* scr)) + ;; this soon will not work with sbcl and complex chars. + ;; write-char only takes characters, no other objects. + ;; even if we specialize stream-write-char to complex-chars + ;;(move scr 1 0) + ;;(write-char ch2 scr) + ;; this will work because it uses print-objectm, since print-object can be + ;; specialized on complex-chars. + (move scr 1 0) + (princ ch scr) + (princ ch) + (move scr 2 0) + (princ ch2 scr) + (princ ch2) + ;; aestethic ~A can be used, since it uses princ underneath + ;; standard ~S can not because it cant be read back in + ;; character ~C can not be used because it requires characters. + (move scr 3 0) + (format scr "~A ~A" ch ch2) + (move scr 4 0) + (format t "~A ~A" ch ch2) + (refresh scr) )))) + +;; | cooked | cbreak | raw +;; ----------+--------+--------+----- +;; buffering | t | nil | nil +;; ----------+--------+--------+----- +;; control | t | t | nil +;; +(defun t03e () + "Test switching between input modes and control char processing." + (with-screen (scr :input-echoing nil :input-blocking t :input-buffering nil :process-control-chars nil) + (with-accessors ((input-buffering input-buffering-p) (process-control-chars process-control-chars-p)) scr + (clear scr) + (format scr "buffering ~A process-control-chars ~A (raw)~%" input-buffering process-control-chars) + (format scr "ch1: ~A~%" (get-char scr)) + (setf (process-control-chars-p scr) t) + (format scr "buffering ~A process-control-chars ~A (cbreak)~%" input-buffering process-control-chars) + (format scr "ch2: ~A~%" (get-char scr)) + (setf (input-buffering-p scr) t) + (format scr "buffering ~A process-control-chars ~A (cooked)~%" input-buffering process-control-chars) + (format scr "ch3: ~A~%" (get-char scr)) + ;; ignore the typed enter key + (get-char scr) + ;; wait for one keypress before exiting. + (get-char scr)))) + +;; take a function given as symbol name and display its docstring. press q to exit. +;; Example: (a:t04 'cdr) +(defun t04 (&optional (name 'car)) + (unwind-protect + (let ((scr (make-instance 'screen))) + (clear scr) + (refresh scr) + + (setf (attributes scr) '(:bold :reverse)) + (add-string scr "Docstring") + + (setf (attributes scr) '()) + (add-string scr " --> ") + + (setf (attributes scr) '(:bold :underline)) + (add-string scr (format nil "~A~%~%" name)) + + (setf (attributes scr) '()) + (add-string scr (documentation name 'function)) + + (refresh scr) + (get-char scr)) + (end-screen))) + +;; adding and removing attributes. +(defun t04a () + (unwind-protect + (let ((scr (make-instance 'screen :enable-colors t))) + (clear scr) + (refresh scr) + + (add-string scr (write-to-string (attributes scr))) + (add-char scr (char-code #\newline)) + + (pushnew :bold (attributes scr)) + (add-string scr (write-to-string (attributes scr))) + (add-char scr (char-code #\newline)) + + (pushnew :underline (attributes scr)) + (add-string scr (write-to-string (attributes scr))) + (add-char scr (char-code #\newline)) + + (pushnew :reverse (attributes scr)) + (add-string scr (write-to-string (attributes scr))) + (add-char scr (char-code #\newline)) + + (setf (attributes scr) (remove :reverse (attributes scr))) + (add-string scr (write-to-string (attributes scr))) + (add-char scr (char-code #\newline)) + + (setf (attributes scr) (remove :underline (attributes scr))) + (add-string scr (write-to-string (attributes scr))) + (add-char scr (char-code #\newline)) + + (setf (attributes scr) (remove :bold (attributes scr))) + (add-string scr (write-to-string (attributes scr))) + (add-char scr (char-code #\newline)) + + (refresh scr) + (get-char scr)) + (end-screen))) + +;; a more concise way to write t04a +(defun t04b () + (with-screen (scr :enable-colors t :cursor-visible nil) + (clear scr) + + (print (attributes scr) scr) + + (add-attributes scr '(:bold)) + (print (attributes scr) scr) + + (add-attributes scr '(:underline)) + (print (attributes scr) scr) + + (add-attributes scr '(:reverse)) + (print (attributes scr) scr) + + (remove-attributes scr '(:bold :underline :reverse)) + (print (attributes scr) scr) + + (add-attributes scr '(:bold :underline :reverse)) + (print (attributes scr) scr) + + (setf (attributes scr) nil) + (print (attributes scr) scr) + (print "test" scr) + + (move scr 6 10) + (change-attributes scr 10 '()) + + (refresh scr) + (get-char scr))) + +;; Make sure we shut down ncurses and dont mess up the terminal when an error is signaled. +(defun t05 () + (unwind-protect + (let ((scr (make-instance 'screen))) + (add-string scr "press any char to signal an error and go to the debugger in a messed up screen!") + (refresh scr) + (get-char scr) + (error "zu huelf!")) + ;; this will be executed after we somehow return from the debugger. + (end-screen))) + +;; End ncurses cleanly _before_ getting into the debugger when an error is signalled. +;; do get into the debugger, but only after we are back to the repl. +(defun t06 () + (let ((*debugger-hook* #'(lambda (c h) (declare (ignore c)) (declare (ignore h)) (end-screen)))) + (unwind-protect + (let ((scr (make-instance 'screen))) + (add-string scr "hello there! press a char to signal an error and go to the debugger without messung up the screen!") + (refresh scr) + (get-char scr) + (error "zu huelf!")) + (end-screen)))) + +;; The debugger hook is added now to with-screen. +;; When an error is signalled in a ncurses app, we cleanly exit ncurses first, we dont get +;; into the debugger and we merely print the signalled condition to the REPL. +(defun t06a () + (with-screen (scr) + (add-string scr "hello there! press a char to signal an error. the app will be ended without going to the debugger.") + (refresh scr) + (get-char scr) + (error "zu huelf!"))) + +;; display a new window on the stadard screen. +;; problem: deleting different windows is not standardized. (problem solved, example obsolete) +(defun t07 () + (unwind-protect + (let ((scr (make-instance 'screen :enable-colors t))) + (clear scr) + (add-string scr "Standard screen") + (refresh scr) + (get-char scr) + + (let ((win (make-instance 'window :height 15 :width 50 :location '(5 5)))) + (setf (background win) (make-instance 'complex-char :color-pair '(:red :blue))) + (add-string win "Window 1") + (refresh win) + (get-char win))) + ;(delete-window win) ; this is missing, we have to properly delete windows manually. + + ;; this will be executed after we somhow return from the debugger. + (end-screen))) + +;; close now closes both windows and the main screen. +;; but the creation of a window/screen now has to be outside the unwind-protect form. +(defun t07a () + (let ((scr (make-instance 'screen :enable-colors t :cursor-visible nil))) + ;; since windows are streams now, we can use close on tem too. + ;; in order to be able to close scr, as compared to end-screen without arguments in t07, + ;; we have to move unwind-protect inside the let scope. + (unwind-protect + (progn + (clear scr) + (add-string scr "Standard screen") + (refresh scr) + (get-char scr) + + (let ((win (make-instance 'window :height 15 :width 50 :location '(5 5) :draw-border t))) + (setf (background win) (make-instance 'complex-char :simple-char #\: :color-pair '(nil :blue))) + (add-string win "Window 1" :y 2 :x 4 :fgcolor :red :bgcolor :yellow) + (refresh win) + (get-char win) + (close win)) + + (clear scr) + (refresh scr) + (get-char scr)) + ;; close is defined by the gray stream interface. + (close scr)))) + +;; test the gray streams interface. +(defun t08 () + (unwind-protect + (let ((scr (make-instance 'screen))) + (clear scr) + + (write-char #\a) ; writes a to the repl. wont be visible until we quit ncurses. + + (write-char #\b scr) ; writes b to scr. + (terpri scr) + + (princ "hello") ; writes to the repl. wont be visible until we quit ncurses. + + (princ "hello" scr) + (terpri scr) ; 3 calls, 3 new lines will be added. + (terpri scr) + (terpri scr) + + (princ "there" scr) + + (terpri scr) + (write-string "dear john" scr :start 0 :end 4) + (terpri scr) + (write-string "dear john" scr :start 5) + + (fresh-line scr) ; we call it 3 times, but only one newline will be added. + (fresh-line scr) + (fresh-line scr) + + (format scr "--~%~r~%--" 1234) ; each % will add a newline. + + (write-char #\newline scr) ; this is the char that actually gets displayed each time terpri is called. + + (refresh scr) + (get-char scr)) + (end-screen))) + +;; when we define windows as streams, we can rebind the *standard-output* to print to a ncurses window. +;; this only works with standard lisp output functions, format, write-char, terpri, print, etc. +;; we still have to explicitely ncurses functions clear, close, refresh, etc. though. +(defun t08a () + (let ((scr (make-instance 'screen))) + (unwind-protect + (progn + (clear scr) + + ;; writes explicitely to scr + (write-char #\a scr) + (terpri scr) + (princ "hello" scr) + (terpri scr) + (format scr "~r" 1234) + (terpri scr) + + ;; writes to *standard-output*, which here is scr. + (let ((*standard-output* scr)) + (write-char #\b) + (terpri) + (princ "there") + (terpri) + (format t "~r" 5678) + (terpri)) + + (refresh scr) + (get-char scr)) + (close scr)))) + +(defun t08b () + "Use colors on *standard-output* with standard lisp printing functions. + +Test whether a window (stream) was closed." + (let* ((scr (make-instance 'screen :enable-colors t)) + (*standard-output* scr)) + (unwind-protect + (progn + (clear scr) + (setf (background scr) (make-instance 'complex-char :color-pair '(:black :white))) + (format t "~r" 1984) + (refresh scr) + (get-char scr) + + ;; temporarily bind *standard-output* to a window. + (let* ((win (make-instance 'window :height 15 :width 50 :location '(5 5))) + (*standard-output* win)) + (setf (background win) (make-instance 'complex-char :color-pair '(:white :black))) + (format t "~r" 1985) + (refresh win) + (get-char win) + (format t "~%before close: streamp: ~A open-stream-p: ~A" (streamp win) (open-stream-p win)) + (refresh win) + (get-char win) + (format scr "~%after close: close: ~A streamp: ~A open-stream-p: ~A" (close win) (streamp win) (open-stream-p win)) + (refresh scr) + (get-char scr)) + + ;; *standard-output*is now again scr. + (setf (background scr) (make-instance 'complex-char :color-pair '(:black :white))) + (terpri) + (format t "~r" 1984) + (refresh scr) + (get-char scr)) + (close scr)))) + +;; Write complex chars to standard output using standard lisp output functions + gray streams. +;; According to SBCL devs, write-char and ~C are not supposed to work, because according to the +;; standard, only lisp characters should be accepted s arguments by write-char, and any other +;; object like a complex-char should signal an error. +(defun t08c () + (with-screen (scr) + (let ((*standard-output* scr) + (ch (make-instance 'complex-char :simple-char #\a :attributes '(:bold :underline) :color-pair '(:green :black)))) + (write-char #\a) + (terpri) + ;;(write-char ch) + (terpri) + (princ ch) + (terpri) + (print ch) + (terpri) + (format t "~%Format:~%~S~%~A" ch ch) + (terpri)) + (refresh scr) + (get-char scr))) + +;; box, move +(defun t09 () + (let* ((scr (make-instance 'screen :enable-colors t))) + (unwind-protect + (progn + (clear scr) + + (setf (background scr) (make-instance 'complex-char :color-pair '(:black :white))) + (box scr) + (move scr 1 1) + (princ 0 scr) + + (refresh scr) + + (let ((w1 (make-instance 'window :height 10 :width 30 :location '(3 5))) + (w2 (make-instance 'window :height 10 :width 30 :location '(6 10))) + (w3 (make-instance 'window :height 10 :width 30 :location '(9 15)))) + + (setf (background w1) (make-instance 'complex-char :color-pair '(:white :black))) + (setf (background w2) (make-instance 'complex-char :color-pair '(:black :white))) + (setf (background w3) (make-instance 'complex-char :color-pair '(:white :black))) + + (box w1) + (box w2) + (box w3) + + (move w1 1 1) + (princ 1 w1) + (move w2 1 1) + (princ 2 w2) + (move w3 1 1) + (princ 3 w3) + + (refresh w1) + (refresh w2) + (refresh w3) + + (get-char w1) + + ;; todo: before we can refresh w2 to raise it, we have to "touch" it. + ;; if we dont touch it, only the changed parts of it will be redrawn. + (touch w2) + (refresh w2) + + (get-char w1) + + ;; move the whole window 3. note that this doesnt refresh the windows below, + ;; they have to be refreshed separately. + (setf (location w3) '(9 20)) + (refresh w3) + (get-char w3) + + (close w1) + (close w2) + (close w3)) + + (setf (background scr) (make-instance 'complex-char :color-pair '(:black :white))) + + (refresh scr) + (get-char scr)) + + (close scr)))) + +;; the same as t09, but we can now raise the overlapping windows by hitting 1, 2 or 3. +(defun t09a () + (let* ((scr (make-instance 'screen :enable-colors t :input-blocking t :input-echoing nil ;;:use-terminal-colors t + :cursor-visible nil))) + (unwind-protect + (progn + (clear scr) + + (box scr) + (refresh scr) + + ;; the default value for width or height is "to the end of the screen". + (let ((w1 (make-instance 'window :height 10 :width 30 :location '(3 5))) + (w2 (make-instance 'window :width 30 :location '(6 10))) + (w3 (make-instance 'window :height 10 :location '(9 15)))) + + (box w1) + (box w2) + (box w3) + + ;; after we define a default pair, :terminal -1 refers to these colors. + (setf (use-terminal-colors-p scr) t) + ;;(setf (default-color-pair scr) (list :yellow :red)) + + (setf (background w1) (make-instance 'complex-char :color-pair '(:default-fg :yellow))) + ;; window w2 uses the :default fg and bg color of the terminal, because use-terminal-colors is t. + (setf (background w3) (make-instance 'complex-char :color-pair '(:yellow :terminal))) + + ;; print currently active color pairs to w3 + (format w3 "~A" de.anvi.croatoan::*color-pair-alist*) + + ;; TODO: clear, refresh, etc, should take one or more windows as arguments. + ;; so we can do (refresh w1 w2 w3) instead of: + (refresh w1) + (refresh w2) + (refresh w3) + + (loop (let ((event (get-event scr))) + (when event + (case event + (#\1 (touch w1) (refresh w1)) + (#\2 (touch w2) (refresh w2)) + (#\3 (touch w3) (refresh w3)) + (#\q (return)) + (otherwise nil))))) + + (close w1) + (close w2) + (close w3))) + + (close scr)))) + +(defun t09b () + "Use with-screen, event-case and mapc to simplify t09a." + (with-screen (scr :input-blocking t :input-echoing nil :enable-colors t :cursor-visible nil) + (box scr) + (refresh scr) + + (let ((w1 (make-instance 'window :height 10 :width 30 :location '(3 5) :draw-border t)) + (w2 (make-instance 'window :width 30 :location '(6 10) :draw-border t)) + (w3 (make-instance 'window :height 10 :location '(9 15) :draw-border t))) + + (setf (background w1) (make-instance 'complex-char :simple-char #\space :color-pair '(:white :black)) + (background w3) (make-instance 'complex-char :simple-char #\space :color-pair '(:white :black))) + + (mapc #'refresh (list w1 w2 w3)) + + (event-case (scr event) + (#\1 (touch w1) (refresh w1)) + (#\2 (touch w2) (refresh w2)) + (#\3 (touch w3) (refresh w3)) + (#\q (return-from event-case)) + (otherwise nil)) + + (mapc #'close (list w1 w2 w3)) + + ;; return nil explicitely, so it doesnt return the window list. + nil))) + +;; https://www.gnu.org/software/guile-ncurses/manual/html_node/Panels-Basics.html#Panels-Basics +;; https://www.gnu.org/software/guile-ncurses/manual/html_node/The-curses-panel-library.html +(defun t09c () + "Use a window stack to manage overlapping windows." + (with-screen (scr :input-blocking t :input-echoing nil :enable-colors t :enable-function-keys t :cursor-visible nil :stacked t) + (box scr) + (setf (background scr) (make-instance 'complex-char :simple-char #\space :color-pair '(:black :white))) + ;; we have to stack scr because the event loop runs on scr, and this refreshes scr implicitely every time + ;; and overlaps the other windows + ;;(setf (stackedp scr) t) + + (let ((winlst nil) + (n 0)) + ;; create 8 windows (with 8 different background colors), + ;; add them to the local winlist and to the global stack + (loop for i from 0 to 7 do + (push (make-instance 'window :height 10 :width 30 :location (list (+ 3 (* i 1)) (+ 3 (* i 3))) :draw-border t :stacked t) + winlst)) + ;; number them and set the background colors + (loop for i from 0 to 7 do + (setf (attributes (nth i winlst)) (list :reverse)) + (format (nth i winlst) "~A" i) + (setf (background (nth i winlst)) + (make-instance 'complex-char :simple-char #\space :color-pair (list :black (nth i *ansi-color-list*))))) + ;;(setf (stackedp (nth i winlst)) t) + (refresh-stack) + + (event-case (scr event) + ;; type 0-7 to pick a window + ((#\0 #\1 #\2 #\3 #\4 #\5 #\6 #\7) + ;; show the picked window number in the upper right screen corner + (add-char scr event :y 1 :x 78 :color-pair (list :white :black)) + (setf n (- (char-code event) 48))) + ;; to raise a window to the top of the stack + (#\t + (raise-to-top (nth n winlst)) + (refresh-stack)) + (#\r + (raise (nth n winlst)) + (refresh-stack)) + (#\l + (lower (nth n winlst)) + (refresh-stack)) + (#\b + (lower-to-bottom (nth n winlst)) + (refresh-stack)) + ;; type v to toggle window visibility + (#\v + ;; toggle visibility for window n + (setf (visiblep (nth n winlst)) (not (visiblep (nth n winlst)))) + (refresh-stack)) + (#\q (return-from event-case)) + (otherwise nil)) + + ;; before closing them, remove all windows from the stack, so they can be GCd. + (empty-stack) + (mapc #'close winlst) + ;; return nil explicitely, so it doesnt return the window list. + nil))) + +;; port of kletva/test05. +;; print the screen size. +;; print the keys and key codes of any key pressed. +;; TODO: when we reach the end of the screen, the ~% doesnt print newlines any more and the screen doesnt scroll. +;; see scroll.lisp. a lot of window options, including scrolling, arent closified yet. +;; enable-function-keys t: fkeys have codes 255+ +;; enable-function-keys nil: fkeys are multi-char escape codes. +(defun t10 () + (let ((scr (make-instance 'screen :input-echoing nil :enable-function-keys t))) + (unwind-protect + (progn + (clear scr) + + (format scr "~A lines high, ~A columns wide.~%~%" (height scr) (width scr)) + (refresh scr) + + (loop + ;; act only on events, do nothing on non-events. + (when (key-pressed-p scr) + (let ((ch (get-char scr))) + ;; quit on q, print everything else including function keys. + (cond ((equal (code-char ch) #\q) (return)) + (t (format scr "Code: ~A, Char: ~A~%" ch (code-char ch)))))))) + (close scr)))) + +;; cleaner key printing. +;; prints key names instead of numeric char codes. +(defun t10a () + (with-screen (scr :input-echoing nil :input-blocking t :enable-function-keys t + :input-buffering nil :process-control-chars nil :enable-newline-translation t) + (setf (scrolling-enabled-p scr) t) + (format scr "~A lines high, ~A columns wide.~%~%" (height scr) (width scr)) + (loop (let ((event (get-event scr))) + (when event + (case event + (#\q (return)) + + ;; non-printable ascii chars. (#\space and #\newline are standard, all others non-standard) + (#\escape (format scr "escape char ESC ^[ \e~%")) + (#\tab (format scr "horizontal tab char HT \t~%")) + (#\space (format scr "space char~%")) + + ;; NL can be either LF \n,CR \r,or CRLF \r\n, depending on the system. it is LF on ubuntu. + ;; NL is the standard, system independent, portable way. + (#\linefeed (format scr "enter/linefeed LF ^J \n char~%")) + (#\return (format scr "enter/return CR ^M \r char~%")) + (#\newline (format scr "enter/newline char~%")) ; = #\linefeed, code 10. + + ;; use %nonl to prevent ^M (CR) from automatically being translated to ^J (LF) + (#\n (setf (newline-translation-enabled-p scr) + (not (newline-translation-enabled-p scr))) + (if (newline-translation-enabled-p scr) + (format scr "%nl newline translation enabled: RET => NL (= LF)~%") + (format scr "%nonl newline translation disabled: RET => CR~%"))) + + (#\rubout (format scr "rubout char ^?~%")) ;; DEL, ^?, delete char 127 + (#\backspace (format scr "backspace char ^H~%")) ;; BS, \b, ^H, code 8, not the same as the :backspace key + + (:backspace (format scr "backspace key <--~%")) + (otherwise (format scr "Event: ~A~%" event)))))))) + +;; demonstrate scrolling and scrolling regions. +(defun t11 () + (let ((scr (make-instance 'screen))) + (unwind-protect + (progn + (clear scr) + (refresh scr) + + ;; (move scr 5 5) + (setf (cursor-position scr) '(5 5)) + + ;; see inopts. + (setf + + ;; this is sufficient to make the whole window scroll. + ;;(scrolling-enabled-p scr t) + ;;(%scrollok (winptr scr) t) + (scrolling-enabled-p scr) t + + ;; to make only a few lines (5 to 10) scroll, we have to set a line-based region. + ;;(set-scrolling-region scr 5 10) + ;;(%wsetscrreg (winptr scr) 5 10) + (scrolling-region scr) '(5 10)) + + (loop for i from 0 to 30 do + (format scr "~A~%" i) + (refresh scr) + (sleep 0.2))) + + (close scr)))) + +;; Display available ACS (alternative character set) pseudo-graphical characters. +(defun t12 () + (let ((scr (make-instance 'screen))) + (unwind-protect + (progn + +(add-string scr "ACS_ULCORNER ") (add-char scr (acs :upper-left-corner )) (add-string scr " upper left corner") (new-line scr) +(add-string scr "ACS_LLCORNER ") (add-char scr (acs :lower-left-corner )) (add-string scr " lower left corner ") (new-line scr) +(add-string scr "ACS_URCORNER ") (add-char scr (acs :upper-right-corner )) (add-string scr " upper right corner ") (new-line scr) +(add-string scr "ACS_LRCORNER ") (add-char scr (acs :lower-right-corner )) (add-string scr " lower right corner ") (new-line scr) +(add-string scr "ACS_LTEE ") (add-char scr (acs :tee-pointing-right )) (add-string scr " tee pointing right ") (new-line scr) +(add-string scr "ACS_RTEE ") (add-char scr (acs :tee-pointing-left )) (add-string scr " tee pointing left ") (new-line scr) +(add-string scr "ACS_BTEE ") (add-char scr (acs :tee-pointing-up )) (add-string scr " tee pointing up ") (new-line scr) +(add-string scr "ACS_TTEE ") (add-char scr (acs :tee-pointing-down )) (add-string scr " tee pointing down ") (new-line scr) +(add-string scr "ACS_HLINE ") (add-char scr (acs :horizontal-line )) (add-string scr " horizontal line ") (new-line scr) +(add-string scr "ACS_VLINE ") (add-char scr (acs :vertical-line )) (add-string scr " vertical line ") (new-line scr) +(add-string scr "ACS_PLUS ") (add-char scr (acs :crossover-plus )) (add-string scr " large plus or crossover ") (new-line scr) +(add-string scr "ACS_S1 ") (add-char scr (acs :scan-line-1 )) (add-string scr " scan line 1 ") (new-line scr) +(add-string scr "ACS_S3 ") (add-char scr (acs :scan-line-3 )) (add-string scr " scan line 3 ") (new-line scr) +(add-string scr "ACS_S7 ") (add-char scr (acs :scan-line-7 )) (add-string scr " scan line 7 ") (new-line scr) +(add-string scr "ACS_S9 ") (add-char scr (acs :scan-line-9 )) (add-string scr " scan line 9 ") (new-line scr) +(add-string scr "ACS_DIAMOND ") (add-char scr (acs :diamond-symbol )) (add-string scr " diamond ") (new-line scr) +(add-string scr "ACS_BOARD ") (add-char scr (acs :board )) (add-string scr " board of squares ") (new-line scr) +(add-string scr "ACS_CKBOARD ") (add-char scr (acs :checker-board )) (add-string scr " checker board (stipple) ") (new-line scr) +(add-string scr "ACS_DEGREE ") (add-char scr (acs :degree-symbol )) (add-string scr " degree symbol ") (new-line scr) +(add-string scr "ACS_PLMINUS ") (add-char scr (acs :plus-minus )) (add-string scr " plus/minus ") (new-line scr) +(add-string scr "ACS_BULLET ") (add-char scr (acs :bullet-symbol )) (add-string scr " bullet ") (new-line scr) +(add-string scr "ACS_LARROW ") (add-char scr (acs :arrow-pointing-left )) (add-string scr " arrow pointing left ") (new-line scr) +(add-string scr "ACS_RARROW ") (add-char scr (acs :arrow-pointing-right )) (add-string scr " arrow pointing right ") (new-line scr) +(add-string scr "ACS_DARROW ") (add-char scr (acs :arrow-pointing-down )) (add-string scr " arrow pointing down ") (new-line scr) +(add-string scr "ACS_UARROW ") (add-char scr (acs :arrow-pointing-up )) (add-string scr " arrow pointing up ") (new-line scr) +(add-string scr "ACS_LANTERN ") (add-char scr (acs :lantern-symbol )) (add-string scr " lantern symbol ") (new-line scr) +(add-string scr "ACS_BLOCK ") (add-char scr (acs :solid-square-block )) (add-string scr " solid square block ") (new-line scr) +(add-string scr "ACS_LEQUAL ") (add-char scr (acs :less-than-or-equal )) (add-string scr " less/equal ") (new-line scr) +(add-string scr "ACS_GEQUAL ") (add-char scr (acs :greater-than-or-equal)) (add-string scr " greater/equal ") (new-line scr) +(add-string scr "ACS_PI ") (add-char scr (acs :pi )) (add-string scr " Pi ") (new-line scr) +(add-string scr "ACS_NEQUAL ") (add-char scr (acs :not-equal )) (add-string scr " not equal ") (new-line scr) +(add-string scr "ACS_STERLING ") (add-char scr (acs :uk-pound-sterling )) (add-string scr " UK pound sign") (new-line scr) + + (get-char scr)) + (close scr)))) + +;; after adding gray streams and adding acs to add-char. +;; http://melvilletheatre.com/articles/ncurses-extended-characters/index.html +(defun t12a () + (with-screen (scr) + (add-char scr :upper-left-corner ) (format scr " ACS_ULCORNER / upper left corner ~%") + (add-char scr :lower-left-corner ) (format scr " ACS_LLCORNER / lower left corner ~%") + (add-char scr :upper-right-corner ) (format scr " ACS_URCORNER / upper right corner ~%") + (add-char scr :lower-right-corner ) (format scr " ACS_LRCORNER / lower right corner ~%") + (add-char scr :tee-pointing-right ) (format scr " ACS_LTEE / tee pointing right ~%") + (add-char scr :tee-pointing-left ) (format scr " ACS_RTEE / tee pointing left ~%") + (add-char scr :tee-pointing-up ) (format scr " ACS_BTEE / tee pointing up ~%") + (add-char scr :tee-pointing-down ) (format scr " ACS_TTEE / tee pointing down ~%") + (add-char scr :horizontal-line ) (format scr " ACS_HLINE / horizontal line ~%") + (add-char scr :vertical-line ) (format scr " ACS_VLINE / vertical line ~%") + (add-char scr :crossover-plus ) (format scr " ACS_PLUS / large plus or crossover~%") + (add-char scr :scan-line-1 ) (format scr " ACS_S1 / scan line 1 ~%") + (add-char scr :scan-line-3 ) (format scr " ACS_S3 / scan line 3 ~%") + (add-char scr :scan-line-7 ) (format scr " ACS_S7 / scan line 7 ~%") + (add-char scr :scan-line-9 ) (format scr " ACS_S9 / scan line 9 ~%") + (add-char scr :diamond-symbol ) (format scr " ACS_DIAMOND / diamond ~%") + (add-char scr :board ) (format scr " ACS_BOARD / board of squares ~%") + (add-char scr :checker-board ) (format scr " ACS_CKBOARD / checker board (stipple)~%") + (add-char scr :degree-symbol ) (format scr " ACS_DEGREE / degree symbol ~%") + (add-char scr :plus-minus ) (format scr " ACS_PLMINUS / plus/minus ~%") + (add-char scr :bullet-symbol ) (format scr " ACS_BULLET / bullet ~%") + (add-char scr :arrow-pointing-left ) (format scr " ACS_LARROW / arrow pointing left ~%") + (add-char scr :arrow-pointing-right ) (format scr " ACS_RARROW / arrow pointing right ~%") + (add-char scr :arrow-pointing-down ) (format scr " ACS_DARROW / arrow pointing down ~%") + (add-char scr :arrow-pointing-up ) (format scr " ACS_UARROW / arrow pointing up ~%") + (add-char scr :lantern-symbol ) (format scr " ACS_LANTERN / lantern symbol ~%") + (add-char scr :solid-square-block ) (format scr " ACS_BLOCK / solid square block ~%") + (add-char scr :less-than-or-equal ) (format scr " ACS_LEQUAL / less/equal ~%") + (add-char scr :greater-than-or-equal) (format scr " ACS_GEQUAL / greater/equal ~%") + (add-char scr :pi ) (format scr " ACS_PI / Pi ~%") + (add-char scr :not-equal ) (format scr " ACS_NEQUAL / not equal ~%") + (add-char scr :uk-pound-sterling ) (format scr " ACS_STERLING / UK pound sign ~%") + + (refresh scr) + (get-char scr))) + +;; Smaller ACS example to explain how the ACS system works. +(defun t12b () + (with-screen (scr) + ;; acs takes a keyword :ulcorner, translates it to a char #\l, + ;; ncurses translates it at run-time to a terminal-dependent + ;; integer value that doesnt correspond to a char code. + (format scr "~A ~A ~A " #\l (char-code #\l) (acs :upper-left-corner)) + ;; We cant output it in a string, but have to use add-char. + (add-char scr 4194412) + (terpri scr) + (refresh scr) + (get-char scr))) + +;; Show the longer symbol names next to the ACS chars in a more readable table view. +(defun t12c () + (with-screen (scr) + (loop for i from 0 for symbol in + '(:upper-left-corner + :lower-left-corner + :upper-right-corner + :lower-right-corner + :tee-pointing-right + :tee-pointing-left + :tee-pointing-up + :tee-pointing-down + :horizontal-line + :vertical-line) + do (progn (move scr (+ 2 (* i 2)) 2) + (add-char scr symbol) + (format scr " ~S~%~%" symbol))) + + (loop for i from 0 for symbol in + '(:crossover-plus + :scan-line-1 + :scan-line-3 + :scan-line-7 + :scan-line-9 + :diamond-symbol + :board + :checker-board + :degree-symbol + :plus-minus + :bullet-symbol) + do (progn (move scr (+ 2 (* i 2)) 30) + (add-char scr symbol) + (format scr " ~S~%~%" symbol))) + + (loop for i from 0 for symbol in + '(:arrow-pointing-left + :arrow-pointing-right + :arrow-pointing-down + :arrow-pointing-up + :lantern-symbol + :solid-square-block + :less-than-or-equal + :greater-than-or-equal + :pi + :not-equal + :uk-pound-sterling) + do (progn (move scr (+ 2 (* i 2)) 55) + (add-char scr symbol) + (format scr " ~S~%~%" symbol))) + (refresh scr) + (get-char scr))) + +(defun t12c2 () + "ACS chars not available on all terminals: thick and double line drawing characters. + +Tested with xterm, gnome-terminal, st. Doesn't work in the linux console, aterm, eterm." + (with-screen (scr) + (loop for i from 0 for symbol in + '(:thick-upper-left-corner + :thick-lower-left-corner + :thick-upper-right-corner + :thick-lower-right-corner + :thick-tee-pointing-right + :thick-tee-pointing-left + :thick-tee-pointing-up + :thick-tee-pointing-down + :thick-horizontal-line + :thick-vertical-line + :thick-crossover-plus) + do (progn (move scr (+ 1 (* i 2)) 2) + (add-char scr symbol) + (format scr " ~S~%~%" symbol))) + + (loop for i from 0 for symbol in + '(:double-upper-left-corner + :double-lower-left-corner + :double-upper-right-corner + :double-lower-right-corner + :double-tee-pointing-right + :double-tee-pointing-left + :double-tee-pointing-up + :double-tee-pointing-down + :double-horizontal-line + :double-vertical-line + :double-crossover-plus) + do (progn (move scr (+ 1 (* i 2)) 40) + (add-char scr symbol) + (format scr " ~S~%~%" symbol))) + (refresh scr) + (get-char scr))) + +(defun t12d () + "Print all graphic alternative chars supported by the non-wide acs_map[128] array. + +Only the chars 33 to 126 are graphic, and not all are accessible through the +keywords provided by ncurses, and the supported chars are terminal dependent." + (with-screen (scr) + (let* ((ptr (foreign-symbol-pointer "acs_map")) + (code (mem-aref ptr :unsigned-int (char-code #\l)))) + (format scr "~A ~A ~A ~A " #\l (char-code #\l) (acs :upper-left-corner) code) + ;; l 108 4194412 4194412 *** + ;; 4194412 is nothing more than 108 with the A_ALTCHARSET bit turned on. + (add-char scr code) + (add-char scr (acs :upper-left-corner)) + (add-char scr #\l :attributes (list :altcharset)) + (terpri scr) + ;; so we do not really need to access acs_map, like acs is doing. + ;; we just need to translate chars like #\l to :upper-left-corner + (loop for i from 33 to 126 do + (add-char scr (code-char i)) + (add-char scr #\space)) + (terpri scr) + (loop for i from 33 to 126 do + (add-char scr (mem-aref ptr :unsigned-int i)) + (add-char scr #\space)) + (refresh scr) + (get-char scr)))) + +;; Demonstrate flash and beep alerts. +;; It depends on the terminal emulator whether they will work for you. +;; They both worked in xterm for me. +(defun t13 () + (with-screen (scr :input-echoing nil :input-blocking nil :enable-function-keys t :cursor-visible nil) + (loop + (let ((event (get-event scr))) + (if event + (case event + (#\b (alert :beep)) + (#\f (alert :flash)) + (#\q (return))) + (sleep 0.1)))))) + +;; minimal setting to get the mouse working. +;; reads and prints a single mouse event. +(defun t14 () + (let ((scr (make-instance 'screen :input-echoing nil :input-blocking t :enable-function-keys t))) + (unwind-protect + (progn + (%mousemask #b00000111111111111111111111111111 (null-pointer)) ; activate all mouse events. + (get-char scr) ; here you have to click to generate a mouse event. + (with-foreign-object (me '(:struct mevent)) ; create a pointer to the struct mevent. + (%getmouse me) ; save the mouse event struct to the pointed position. + (princ (mem-ref me '(:struct mevent)) scr) ; dereference the pointer, return a plist of the struct. + (get-char scr))) + (close scr)))) + +;; (cffi:convert-to-foreign '(id 1 x 1 y 2 z 3 bstate 2) '(:struct mevent)) +;; (setf ev (convert-from-foreign (mem-ref bstate '(:struct mevent)) '(:struct mevent))) + +;; mouse events are now detected in the event loop. +;; print the y x coordinates and the detected event. +(defun t14a () + (with-screen (scr :input-echoing nil :input-blocking t :enable-function-keys t :cursor-visible nil) + (set-mouse-event '(:button-1-clicked :button-2-clicked :button-3-clicked)) + (event-case (scr event y x) + ((:button-1-clicked :button-2-clicked :button-3-clicked) (format scr "~3A ~3A ~A~%" y x event)) + (#\q (return-from event-case))))) + +;; left click prints a 1, right click prints a 3. +(defun t14b () + (with-screen (scr :input-echoing nil :input-blocking t :enable-function-keys t :cursor-visible nil) + (set-mouse-event '(:button-1-clicked :button-3-clicked)) + (event-case (scr event mouse-y mouse-x) + (:button-1-clicked (move scr mouse-y mouse-x) (princ "1" scr)) + (:button-3-clicked (move scr mouse-y mouse-x) (princ "3" scr)) + (#\q (return-from event-case))))) + +(defun t14c () + "Print all mouse events." + (with-screen (scr :input-echoing nil :input-blocking t :enable-function-keys t :cursor-visible nil) + (%mousemask #b00000111111111111111111111111111 (null-pointer)) + (event-case (scr event y x) + (#\q (return-from event-case)) + (t (format scr "~3A ~3A ~A~%" y x event)) ))) + +;; resize event: the standard screen size is resized automatically. +(defun t15 () + (with-screen (scr :input-echoing nil :input-blocking nil :enable-function-keys t :cursor-visible nil :enable-colors t) + (add-string scr "Current standard screen geometry (Y x X):" :y 0 :x 0) + (loop + (let ((event (get-event scr))) + (if event + (case event + (:resize (move scr 1 0) + (format scr "~A Y lines x ~A X columns." (height scr) (width scr)) + ;; the environment variables get updated on a resize event too. + (format scr "~%~A Y lines x ~A X cols." %LINES %COLS) + (refresh scr)) + (#\q (return))) + (progn + (sleep 0.1))))))) + +;; resize event: arrange window _locations_ relative to the screen size. +(defun t15a () + (with-screen (scr :input-echoing nil :input-blocking nil :enable-function-keys t :cursor-visible nil :enable-colors t) + (add-string scr "Current standard screen geometry (Y x X):" :y 0 :x 0) + (setf (background scr) (make-instance 'complex-char :simple-char #\. :color-pair '(:green :white))) + (let ((time 0) + ;; place a window in the center of the screen. + (win (make-instance 'window :height 5 :width 10 :location (list (round (/ (height scr) 2)) + (round (/ (width scr) 2)))))) + (loop + (let ((event (get-event scr))) + (if event + (case event + (:resize ;; if the scren is resized, relocate the window to the new center. + (move-window win (round (/ (height scr) 2)) (round (/ (width scr) 2))) + ;; better differentiation of types with methods. + (move win 0 0) + (format win "Y:~A X:~A" (height scr) (width scr)) + ;; repaint all windows completely by touching them before refreshing. + ;; overlapping windows have to be refreshed in reverse stacking order. + (mapc #'(lambda (w) (touch w) (refresh w)) + (list scr win))) + (#\q (return))) + (progn + (sleep 0.01) + (move win 1 0) + (incf time 0.01) + (format win "~A" time) + (mapc #'(lambda (w) (touch w) (refresh w)) + (list scr win)) )))) + (close win)))) + +;; resize event: arrange window _sizes_ relative to the screen size. +(defun t15b () + (with-screen (scr :input-echoing nil :input-blocking nil :enable-function-keys t :cursor-visible nil :enable-colors t) + (add-string scr "Current standard screen geometry (Y x X):" :y 0 :x 0) + (setf (background scr) (make-instance 'complex-char :color-pair '(:black :white))) + (let ((time 0) + ;; make the window slightly smaller than the standard screen. + (win (make-instance 'window :height (- (height scr) 4) :width (- (width scr) 6) :location '(2 3)))) + (loop + (let ((event (get-event scr))) + (if event + (case event + (:resize ;; resize the window on every termina resize. + (resize win (- (height scr) 4) (- (width scr) 6)) + (move win 0 0) + (format win "Y:~A X:~A" (height scr) (width scr)) + ;; when updating several overlapping windows, using mark-for-refresh and + ;; batch-refresh instead of several calls to refresh prevents flickering. + (mapc #'(lambda (w) (touch w) (mark-for-refresh w)) (list scr win)) + (refresh-marked)) + (#\q (return))) + (progn + (sleep 0.01) + (move win 1 0) + (incf time 0.01) + (format win "~A" time) + (mapc #'(lambda (w) (touch w) (mark-for-refresh w)) (list scr win)) + (refresh-marked) )))) + (close win)))) + +;; test get-string: read a string, then output it. +;; the only function key we can use during input is backspace. +(defun t16 () + (unwind-protect + (let ((scr (make-instance 'screen))) + (clear scr) + (move scr 0 0) + (add-string scr "Type your name: ") + (refresh scr) + (let ((str (get-string scr 10))) + (add-string scr "Your name is: ") + (add-string scr str)) + (refresh scr) + (get-char scr)) + (end-screen))) + +;; read a single line of Lisp input (30 chars max) from the last line, +;; evaluate it and print the result to the output window above. +(defun t16a () + (with-screen (scr :input-echoing t :input-blocking t :enable-function-keys t :cursor-visible nil :enable-colors nil) + (let ((out (make-instance 'window :height (1- (height scr)) :width (width scr) :location '(0 0))) + (in (make-instance 'window :height 1 :width (width scr) :location (list (1- (height scr)) 0)))) + + (print (eval (read-from-string (get-string in 30))) out) + (refresh out) + + ;; blocking is t, so wait till the next keypress before exiting. + (get-char in) + + ;; close windows and window streams. + (close in) + (close out)))) + +;; add a loop to the input, making it a simple repl. +(defun t16b () + (with-screen (scr :input-echoing t :input-blocking t :enable-function-keys t :cursor-visible t :enable-colors nil) + (let ((out (make-instance 'window :height (1- (height scr)) :width (width scr) :location '(0 0))) + (in (make-instance 'window :height 1 :width (width scr) :location (list (1- (height scr)) 0)))) + (loop + (let ((str (get-string in 30))) + ;; if the input line is empty (length = 0), do nothing. + (when (> (length str) 0) + ;; a single blocking q exits the loop. + (when (string= str "q") (return)) + ;; after the input is read, clear the input line. + (clear in) + (print (eval (read-from-string str)) out) + (refresh out)))) + (close in) + (close out)))) + +;; ncurses' get-string only allows the backspace key. +;; extend the functionality of the input line of the simple repl. +(defun t16c () + (with-screen (scr :input-echoing nil :cursor-visible t :enable-colors t) + (let* ((wout (make-instance 'window :height (1- (height scr)) :width (width scr) :location '(0 0) :enable-scrolling t)) + ;; input blocking is a property of every single window, not just of the global screen. + (win (make-instance 'window :height 1 :width (width scr) :location (list (1- (height scr)) 0) + :enable-function-keys t :input-blocking t)) + (*standard-output* wout) + (n 0)) ; no of chars in the input line. + (event-case (win event) + (:left + (when (> (cadr (cursor-position win)) 0) + (move win 0 -1 :relative t))) + (:right + (when (< (cadr (cursor-position win)) n) + (move win 0 1 :relative t))) + (#\newline ; RET key, C-j, C-m + (when (> n 0) ; only print when the line is not empty. + (let* ((strin (extract-wide-string win :n n :y 0 :x 0)) + (strout (eval (read-from-string strin)))) + (print (length strin)) + (princ strin) + (terpri) + (add-string wout (format nil "=> ~A~%~%" strout))) + (setf n 0) + (clear win) ; empty the input line after evaluation. + (refresh wout))) + (:dc ; DEL key + (when (> n (cadr (cursor-position win))) + (decf n) + (delete-char win))) + (:ic ; INS / Einfg key + (format t "(insert-mode-p win) => ~A~%" (insert-mode-p win)) + (setf (insert-mode-p win) (not (insert-mode-p win))) + (format t "(insert-mode-p win) => ~A~%" (insert-mode-p win)) + (refresh wout)) + (:backspace ; BS key + (when (> (cadr (cursor-position win)) 0) + (decf n) + (move win 0 -1 :relative t) + (delete-char win))) + (#\q (return-from event-case)) + ((nil) ; when no key is hit at all + ;; when there is no event, get-event will return nil. + ;; this is the place for no-event code. + ;; instead of doing nothing, set blocking to t. + nil) + ;; non-function keys, i.e. normal character keys + (otherwise + (when (and (characterp event) + (< (cadr (cursor-position win)) (1- (width win)))) + (incf n) + ;; insert-mode-p does not insert if we do not use gray stream functions + ;;(add-wide-char win event)))) + (write-char event win)))) ; calls stream-write-char + ;; (princ event win) ; calls print-object + (close win) + (close wout)))) + +;; buffer: (3 2 1) +;; screen: 123 +;; in the buffer, elements are added to the left and counted from the left. +;; on the screen, the list is displayed in reverse. +(defun t16d () + "Use an input buffer instead of extracting the string from the window. Create windows using the with-windows macro." + (with-screen (scr :input-echoing nil :cursor-visible t :enable-colors t) + (with-windows ((wout :height (1- (height scr)) :width (width scr) :location '(0 0) :enable-scrolling t) + (win :height 1 :width (width scr) :location (list (1- (height scr)) 0) :enable-function-keys t :input-blocking t)) + (let ((*standard-output* wout) + (inbuf nil) ; input buffer character list + (inptr 0)) ; position of the next character in the buffer + (event-case (win event) + (#\q (return-from event-case)) + (:left + (when (> inptr 0) (decf inptr)) + (move win 0 inptr)) + (:right + (when (< inptr (length inbuf)) (incf inptr)) + (move win 0 inptr)) + (#\newline + (when (> (length inbuf) 0) + (format t "~A~%" (coerce (reverse inbuf) 'string)) (refresh wout) + (setf inbuf nil inptr 0) + (clear win) + (move win 0 inptr) + (refresh win))) + (:dc + (when (> (length inbuf) inptr) + (setf inbuf (remove-nth (- (length inbuf) (1+ inptr)) inbuf)) + (clear win) + (add-string win (coerce (reverse inbuf) 'string)) + (move win 0 inptr) + (refresh win))) + (:backspace + (when (> inptr 0) + (decf inptr) + (setf inbuf (remove-nth (- (length inbuf) 1 inptr) inbuf)) + (clear win) + (add-string win (coerce (reverse inbuf) 'string)) + (move win 0 inptr) + (refresh win))) + (:ic + (format t "(insert-mode-p win) => ~A~%" (insert-mode-p win)) + (setf (insert-mode-p win) (not (insert-mode-p win))) + (format t "(insert-mode-p win) => ~A~%" (insert-mode-p win)) + (refresh wout)) + (otherwise + (if (= inptr (length inbuf)) + (setf inbuf (cons event inbuf)) + (if (insert-mode-p win) + (setf inbuf (insert-nth (- (length inbuf) inptr) event inbuf)) + (setf inbuf (replace-nth (- (length inbuf) (1+ inptr)) event inbuf)))) + (incf inptr) + (clear win) + (add-string win (coerce (reverse inbuf) 'string)) + (move win 0 inptr) + (refresh win))))))) + +(defun t16e () + "Edit a single input field, not part of a form." + (with-screen (scr :input-echoing nil :cursor-visible t :enable-colors t :enable-function-keys t :input-blocking t) + (let ((*standard-output* scr) + (s1 (list :attributes '(:underline))) + (s2 (list :simple-char #\.)) + (field (make-instance 'field :location (list 3 20) :width 10 :window scr))) + + (setf (style field) (list :foreground s1 :background s2)) + + (bind field #\newline 'de.anvi.croatoan::debug-print-field-buffer) + + ;; pressing ^A (for "accept") exits the edit mode (for now) + ;; the field variables are not reset when edit is exited, we can access them after the edit. + (if (edit field) + ;; accept returns t + (progn + (clear scr) + ;; display the contents of the input buffer of the field + (format t "buffer: ~A~%" (buffer field)) + (format t "string: ~A" (value field))) + ;; when cancel returns nil + (progn + (clear scr) + (format t "field edit canceled."))) + + (refresh scr) + + ;; wait for keypress, then exit + (get-char scr) ))) + +(defun t16f () + "Group several input fields and buttons to a form." + (with-screen (scr :input-echoing nil :cursor-visible t :enable-colors t :enable-function-keys t :input-blocking t) + (let* ((s1 (list :fgcolor nil :bgcolor nil :attributes nil)) + (s2 (list :simple-char #\_)) + (s3 (list :fgcolor :yellow :bgcolor :red :attributes '(:underline :bold :italic))) + (s4 (list :fgcolor :blue :bgcolor :white :attributes nil)) + + ;; a style is a plist interpreted by the element drawing functions. + (s5 (list :foreground s1 :background s2 :selected-foreground s3 :selected-background s4)) + + (field1 (make-instance 'field :location (list 3 20) :width 10 :style s5 :max-buffer-length 5)) + (field2 (make-instance 'field :location (list 5 20) :width 10 :style s5)) + (field3 (make-instance 'field :location (list 7 20) :width 10 :style s5 :max-buffer-length 15)) + + (s6 (list :foreground s1 :selected-foreground s4)) + + (button1 (make-instance 'button :location (list 10 10) :name "Hello" :style s6)) + (button2 (make-instance 'button :location (list 10 20) :name "Accept" :style s6)) + (button3 (make-instance 'button :location (list 10 30) :name "Cancel" :style s6)) + + ;; a window is associated with the parent form, and can be accessed by the elements. + (form (make-instance 'form :elements (list field1 field2 field3 button1 button2 button3) :window scr))) + + ;; for debugging, return prints the content of the buffer and then deletes the buffer + (bind form :f4 'de.anvi.croatoan::debug-print-field-buffer) + (bind (find-keymap 'field-map) :f3 'de.anvi.croatoan::debug-print-field-buffer) + + ;; Functions to be called when the button is activated by #\newline or #\space. + (setf (callback button1) (lambda (b e) (save-excursion scr (move scr 0 0) (format scr "Hello there")))) + (setf (callback button2) 'accept) + (setf (callback button3) 'cancel) + + ;; pressing ^A or C-a (for "accept") exits the edit mode + ;; TAB, up and down cycles the fields and buttons + (if (prog1 (edit form) (clear scr)) + ;; display the contents of the input buffer of all fields of the form + ;; use field-buffer-to-string to get the contents of the field buffer as a string instead of a list of chars. + (loop for el in (elements form) + do (when (typep el 'field) + (format scr "~A ~A ~%" (buffer el) (value el)))) + ;; user did not accept the form (default) or called cancel-form. + (format scr "nil")) + + (refresh scr) + ;; wait for keypress, then exit + (get-char scr) ))) + +(defun t16g () + "Use the element default style of the form." + (with-screen (scr :input-echoing nil :cursor-visible t :enable-colors t :enable-function-keys t :input-blocking t) + (let* (;; character styles that can be referenced in element styles + (ch1 (list :fgcolor :blue :bgcolor :black)) + (ch2 (list :simple-char #\_)) + (ch3 (list :fgcolor :yellow :bgcolor :red :attributes '(:bold :italic))) + (ch4 (list :simple-char #\_ :fgcolor :white :bgcolor :blue)) + (ch5 (list :fgcolor :yellow :simple-char #\.)) + + ;; element styles reference previousy defined character styles. + (s1 (list :foreground ch1 :background ch2 :selected-foreground ch3 :selected-background ch4)) + (s2 (list :foreground ch4 :selected-foreground ch3)) + (s3 (list :foreground ch1 :background ch5)) + + ;; the form style consists of default styles of form elements. + (sf1 (list 'field s1 'button s2 'label s3 'checkbox s1)) + + (field1 (make-instance 'field :name :f1 :title "Forename" :location (list 3 20) :width 15 :max-buffer-length 5)) + (field2 (make-instance 'field :name :f2 :title "Surname" :location (list 5 20) :width 15)) + (field3 (make-instance 'field :name :f3 :location (list 7 20) :width 15 :max-buffer-length 20)) + + (cb1 (make-instance 'checkbox :name :c1 :title "Employed" :location (list 9 20))) + + (m1 (make-instance 'checklist :name :m1 :title "checklist" :items (list 'a 'b 'c 'd 'e 'f) :layout (list 2 3) + :max-item-length 6 :menu-location (list 11 20) :window scr)) + + (label1 (make-instance 'label :name :l1 :reference :f1 :width 18 :location (list 3 1))) + (label2 (make-instance 'label :name :l2 :reference :f2 :width 18 :location (list 5 1))) + (label3 (make-instance 'label :name :l3 :title "Age" :location (list 7 1))) + (label4 (make-instance 'label :name :l4 :reference :c1 :width 18 :location (list 9 1))) + (label5 (make-instance 'label :name :l5 :reference :m1 :width 18 :location (list 11 1))) + + (button1 (make-instance 'button :name :b1 :title "Hello" :location (list 14 10))) + (button2 (make-instance 'button :name :b2 :title "Accept" :location (list 14 20))) + (button3 (make-instance 'button :name :b3 :title "Cancel" :location (list 14 30))) + + (form (make-instance 'form + :elements (list field1 field2 field3 cb1 label1 label2 label3 label4 label5 + m1 button1 button2 button3) + :style sf1 :window scr))) + + ;; for debugging, return prints the content of the buffer and then deletes the buffer + (bind form :f4 'crt::debug-print-field-buffer) + + ;; Functions to be called when the button is activated by #\newline or #\space. + (setf (callback button1) (lambda (b e) (save-excursion scr (move scr 0 0) (format scr "Hello there")))) + (setf (callback button2) 'accept) + (setf (callback button3) 'cancel) + + ;; The set value shouldnt be longer than the max-buffer-length + (setf (value field2) "hello" + (value field3) "dear john") + + ;; Access fields by their name instead of looping through the elements list. + (if (edit form) + ;; edit returned t, which means the user accepted the form + (progn + (clear scr) + (mapc #'(lambda (name) + (let ((element (find-element form name))) + (format scr "~5A ~10A ~20A~%" name (title element) (value element)))) + (list :f1 :f2 :f3)) + ;; display the state of the checkbox + (format scr "~5A ~10A ~20A~%" (name cb1) (title cb1) (checkedp cb1)) + (format scr "~5A ~10A ~20A~%" (name m1) (title m1) (value m1))) + + ;; edit returned nil, which means the user canceled the form + (progn + (clear scr) + (format scr "nil"))) + + (refresh scr) + ;; wait for keypress, then exit + (get-char scr) ))) + +(defun t16h () + "Create a form window." + (with-screen (scr :input-echoing nil :cursor-visible t :enable-colors t :enable-function-keys t :input-blocking t) + (let* ((ch1 (list :fgcolor :black :bgcolor :white)) + (ch2 (list :simple-char #\_ :fgcolor :black :bgcolor :white)) + (ch3 (list :fgcolor :yellow :bgcolor :red :attributes '(:underline :bold :italic))) + (ch4 (list :simple-char #\_ :fgcolor :white :bgcolor :blue)) + + (style1 (list :foreground ch1 :background ch2 :selected-foreground ch3 :selected-background ch4)) + (style2 (list :foreground ch4 :selected-foreground ch3)) + (style3 (list 'field style1 'button style2)) + + (field1 (make-instance 'field :name :f1 :title "Forename" :location (list 3 3) :width 20 :max-buffer-length 5)) + (field2 (make-instance 'field :name :f2 :title "Surname" :location (list 5 3) :width 20)) + (field3 (make-instance 'field :name :f3 :title "Age" :location (list 7 3) :width 20 :max-buffer-length 20)) + + (button1 (make-instance 'button :name :b1 :title "Say Hello" :location (list 10 7))) + (button2 (make-instance 'button :name :b1 :title "Cancel" :location (list 10 20))) + (button3 (make-instance 'button :name :b2 :title "Accept" :location (list 10 30))) + + (form (make-instance 'form-window :elements (list field1 field2 field3 button1 button2 button3) + :style style3 :enable-function-keys t :input-blocking t :title "form window" + :draw-border t :height 15 :width 50 :location (list 5 15)))) + + (setf (background scr) (make-instance 'complex-char :simple-char #\space)) + (setf (background form) (make-instance 'complex-char :simple-char #\space :color-pair '(:black :white))) + (refresh scr) + + ;; Functions to be called when the button is activated by #\newline or #\space. + (setf (callback button1) (lambda (b e) (save-excursion scr (move scr 0 0) (format scr "Hello there") (refresh scr)))) + (setf (callback button2) 'cancel) + (setf (callback button3) 'accept) + + ;; The set value shouldnt be longer than the max-buffer-length (not checked yet) + (setf (value field1) "hello" + (value field2) "there" + (value field3) "dear john") + + (event-case (scr event) + (#\q (return-from event-case)) + ;; display the form window input box by pressing a. + (#\a + (if (edit form) + ;; edit returns t if the form is accepted + (progn + (clear scr) + ;; Access fields by their name instead of looping through the elements list. + (mapc #'(lambda (name) + (let ((field (find-element form name))) + (format scr "~5A ~10A ~20A~%" name (title field) (value field)))) + (list :f1 :f2 :f3)) + (refresh scr)) + + ;; and nil if it is cancelled. + (progn + (clear scr) + (princ nil scr) + (refresh scr))))) + + ;; close the ncurses windows before exiting. + (close form)))) + +(defun t16i () + "A simple input form window." + (let ((value nil)) + (with-screen (scr :input-echoing nil :cursor-visible t :enable-colors t :enable-function-keys t :input-blocking t) + (let* ((ch1 (list :fgcolor :black :bgcolor :white)) + (ch2 (list :simple-char #\_ :fgcolor :black :bgcolor :white)) + (ch3 (list :fgcolor :yellow :bgcolor :red :attributes '(:underline :bold :italic))) + (ch4 (list :simple-char #\_ :fgcolor :white :bgcolor :blue)) + (ch5 (list :simple-char #\. :fgcolor :black :bgcolor :white)) + + (style1 (list :foreground ch1 :background ch2 :selected-foreground ch3 :selected-background ch4)) + (style2 (list :foreground ch1 :selected-foreground ch4)) + (style3 (list :foreground ch1 :background ch5)) + + ;; form element default styles + (style4 (list 'field style1 'button style2 'label style3)) + + (label1 (make-instance 'label :name :l1 :reference :f1 :width 20 :location (list 2 1))) + (field1 (make-instance 'field :name :f1 :title "Forename" :location (list 2 22) :width 20 :max-buffer-length 25)) + + (label2 (make-instance 'label :name :l2 :reference :f2 :width 20 :location (list 4 1))) + (field2 (make-instance 'field :name :f2 :title "Surname" :location (list 4 22) :width 20 :max-buffer-length 25)) + + (button1 (make-instance 'button :name :b3 :title "Reset" :location (list 6 15))) + (button2 (make-instance 'button :name :b2 :title "Cancel" :location (list 6 25))) + (button3 (make-instance 'button :name :b2 :title "Accept" :location (list 6 34))) + + (form (make-instance 'form-window :elements (list field1 field2 label1 label2 button1 button2 button3) + :style style4 :enable-function-keys t :input-blocking t :title "form window" + :draw-border t :height 10 :width 50 :location (list 5 15)))) + + (setf (background form) (make-instance 'complex-char :simple-char #\space :color-pair '(:black :white))) + (refresh scr) + + (setf (callback button1) 'reset-form) + (setf (callback button2) 'cancel) + (setf (callback button3) 'accept) + + (if (edit form) + (setq value (pairlis (list (title field1) (title field2)) + (list (value field1) (value field2)))) + (setq value nil)) + (close form))) + + ;; return the input values + value)) + +;; creating sub-windows and how they share memory with the parent window. +;; leaving out the size of a window maxes it out to the right (win1) and to the bottom (win1, win3) +(defun t17 () + (with-screen (scr :input-echoing nil :input-blocking t :cursor-visible nil :enable-colors t) + (let* ((win1 (make-instance 'window :location '(2 2) :draw-border t)) + (win2 (make-instance 'sub-window :parent win1 :height 5 :width 20 :location '(4 4) :draw-border t)) + (win3 (make-instance 'sub-window :parent win1 :width 20 :location '(4 4) :draw-border t :relative t))) + (princ "win1" win1) + (princ "win2" win2) + (princ "win3 relative" win3) + (mapc #'(lambda (w) (refresh w)) (list win1 win2 win3)) + (get-char win3) + (mapc #'(lambda (w) (close w)) (list win2 win3)) + (refresh win1) + ;; observe that the content from win 2 and 3 is still in win1 after they have been closed. + (get-char win1) + (close win1) ))) + +;; by default, the sub-window displays the part of the parent window it overlaps with. +;; we can change which part of the parent is displayed by changing the sub-windows source-location +;; we can change where it is displayed by changing the sub-windows location. +(defun t17a () + (with-screen (scr :input-echoing nil :input-blocking t :cursor-visible nil :enable-colors t) + (let ((win (make-instance 'sub-window :parent scr :height 5 :width 20 :location '(2 2) :draw-border t :relative t))) + ;; initial content written to subwin and thus to scr. + (move win 1 1) (princ "subwin" win) + + ;; create two content areas in the parent window. + (move scr 2 25) (princ "area1" scr) + (move scr 3 29) (princ "area1" scr) + (move scr 4 33) (princ "area1" scr) + (move scr 5 37) (princ "area1" scr) + (move scr 6 41) (princ "area1" scr) + + (move scr 2 50) (princ "area2" scr) + (move scr 3 54) (princ "area2" scr) + (move scr 4 58) (princ "area2" scr) + (move scr 5 62) (princ "area2" scr) + (move scr 6 66) (princ "area2" scr) + + (mapc #'(lambda (w) (touch w) (refresh w)) (list scr win)) + (get-char scr) + + ;; map area1 to subwin location + ;; the mapping only _displays_ the content from the source area. + ;; the mapping it doesnt _write_ it onto the displayed area of scr. + (setf (source-location win) '(2 25)) ; (%mvderwin (winptr win) 2 25) + (mapc #'(lambda (w) (touch w) (refresh w)) (list scr win)) + (get-char scr) + + ;; map area2 to subwin location + (setf (source-location win) '(2 50)) + (mapc #'(lambda (w) (touch w) (refresh w)) (list scr win)) + (get-char scr) + + ;;; now move subwin location + ;; it still maps area2, but now to the new location. + ;; the original content written to the subwin (and thus to scr because they share memory) + ;; is now visible in scr, since the subwin overlay has moved. + (setf (location win) '(10 2)) + (mapc #'(lambda (w) (touch w) (refresh w)) (list scr win)) + (get-char scr) + + ;; map area1 again, but now to the new location. + (setf (source-location win) '(2 25)) + (mapc #'(lambda (w) (touch w) (refresh w)) (list scr win)) + (get-char scr) + + ;; writing to a sub-window writes to the _mapped_ location of the parent window + ;; _not_ to the parent location below the subwindow. + (clear win) + (move win 0 0) (princ "writing to sub-win" win) + (move win 1 0) (princ "writes to parent win" win) + (mapc #'(lambda (w) (touch w) (refresh w)) (list scr win)) + (get-char scr) + + ;; delete the subwindow win + ;; the mapped content isnt displayed any more. + ;; now the content before the mapping should be displayed again. + (mapc #'(lambda (w) (close w)) (list win)) + (refresh scr) + (get-char scr) ))) + +;; Display misc system information +;; https://github.com/rudolfochrist/dotfiles/blob/master/.rc.lisp +(defun t18 () + (with-screen (scr) + (format scr "Lisp implementation type: ~A~%" (lisp-implementation-type)) + (format scr "Lisp implementation version: ~A~%" (lisp-implementation-version)) + (format scr "Machine type (Arch) ~A~%" (machine-type)) + (format scr "Machine version (CPU) ~A~%" (machine-version)) + (format scr "Software type (OS) ~A~%" (software-type)) + (format scr "Software version (OS) ~A~%" (software-version)) + (format scr "Machine instance (hostname) ~A~%" (machine-instance)) + (format scr "User HOME ~A~%" (user-homedir-pathname)) + (format scr "Ncurses version: ~A~%" (de.anvi.ncurses:%curses-version)) + (format scr "Terminal: ~A~%" (%termname)) + (format scr "Colors supported: ~A~%" (%has-colors)) + (format scr "Color change supported: ~A~%" (%can-change-color)) + (format scr "No of supported colors: ~A~%" %colors) + (format scr "No of supported color pairs ~A~%" %color-pairs) + (format scr "Can insert/delete chars: ~A~%" (%has-ic)) + (format scr "Can insert/delete lines: ~A~%" (%has-il)) + #+sbcl + (progn + (format scr "Terminal: ~A~%" (sb-ext:posix-getenv "TERM")) + (format scr "Locale: ~A~%" (sb-ext:posix-getenv "LANG")) + (format scr "Hostname: ~A~%" (sb-ext:posix-getenv "HOSTNAME")) + (format scr "Username: ~A~%" (sb-ext:posix-getenv "USER")) + (format scr "Operating system: ~A~%" (sb-ext:posix-getenv "OSTYPE")) + (format scr "CPU Type: ~A~%" (sb-ext:posix-getenv "MACHTYPE"))) + (format scr "uname -a:~%~A" (uiop:run-program "uname -a" :output :string)) + (refresh scr) + (get-char scr))) + +;; http://stackoverflow.com/questions/38684906/how-to-get-package-documentation-in-quicklisp +(defun t18a () + "Display misc quicklisp information." + #+quicklisp + (with-screen (scr) + (let* ((dist (ql-dist:dist "quicklisp")) ; current dist + ;; output to an empty broadcast stream is discraded like redirecting to /dev/null + (*standard-output* (make-broadcast-stream)) + ;; Quicklisp prints its "Fetching xyz" messages to *trace-output* + (*trace-output* *standard-output*) + (*error-output* *standard-output*) + (installed-systems (mapcar #'ql-dist:name (ql-dist:installed-systems dist)))) + (format scr "Quicklisp dist name ~A~%" (ql-dist:name dist)) + (format scr "Quicklisp dist version ~A~%" (ql-dist:version dist)) + (format scr "Quicklisp available version ~A~%" (caar (ql-dist:available-versions dist))) + (format scr "~%Quicklisp installed releases ~{~A, ~}~%" (mapcar #'ql-dist:name (ql-dist:installed-releases dist))) + (format scr "~%Quicklisp installed systems ~{~A, ~}~%~%" installed-systems) + (loop + for i in installed-systems + for sys = (asdf:find-system i nil) + do + (when sys + (format scr "~27@A | ~A~%" + i + (remove #\newline (asdf:system-description sys)))))) + (refresh scr) + (get-char scr)) + #-quicklisp + (princ "Quicklisp not installed.")) + +;; print a simple menu, let the user choose an item by arrow keys, return the chosen item. +;; https://www.gnu.org/software/guile-ncurses/manual/html_node/A-simple-key-usage-example.html +(defun t19 () + (with-screen (scr :input-echoing nil :input-blocking t :cursor-visible nil :enable-colors t) + (flet ((draw-menu (win choices i) + (clear win) + (loop for j from 0 to (1- (length choices)) do + (move win j 0) + (format win "~A~A" (nth j choices) (if (= i j) "*" "")) + (when (= i j) + (move win j 0) + (change-attributes win 9 '(:reverse))) + (refresh win)))) + (let* ((choices '("Choice 0" "Choice 1" "Choice 2" "Choice 3" "Choice 4" "Choice 5" "Choice 6")) + (n (length choices)) + (i 0)) ; current choice + (draw-menu scr choices i) + (event-case (scr event) + (:up (setf i (mod (1- i) n)) (draw-menu scr choices i)) + (:down (setf i (mod (1+ i) n)) (draw-menu scr choices i)) + (#\newline (return-from event-case (nth i choices))) + (#\q (return-from event-case))))))) + +;; an even simpler 2-item menu is a yes-no-dialog. +(defun t19a () + (with-screen (scr :input-echoing nil :input-blocking t :cursor-visible nil :enable-colors t) + (flet ((draw-menu (win choices i) + (move win 2 0) (clear win :target :end-of-line) + (loop for j from 0 to (1- (length choices)) do + (move win 2 (* 10 j)) + (format win "~A~A" (car (nth j choices)) (if (= i j) "*" "")) + (refresh win)))) + (let* ((choices '(("Yes" . t) ("No" . nil))) + (n (length choices)) + (i 0)) ; current choice + (move scr 0 0) (format scr "User, do you want?") (refresh scr) + (draw-menu scr choices i) + (event-case (scr event) + ((:up :down :left :right #\tab) (setf i (mod (1+ i) n)) (draw-menu scr choices i)) + (#\newline (return-from event-case (cdr (nth i choices))))))))) + +(defun t19b () + "Use the menu class, draw-menu and select functions." + (with-screen (scr :input-echoing nil :input-blocking t :cursor-visible nil :enable-colors t) + (let* ((choices '("Choice 0" "Choice 11" "Choice 222" "Choice 3333" "Choice 44444" "Choice 555555" "Choice 6666666")) + (menu (make-instance 'menu-window :items choices :location (list 0 20) :title "t19b" + :cyclic-selection t :draw-border t :enable-function-keys t))) + (let ((result (select menu))) + (format scr "You chose ~A" result) + (touch scr) + (refresh scr) + (get-char scr)) + (close menu)))) + +(defun t19b2 () + "Use the select function with independent windows and menus" + (with-screen (scr :input-echoing nil :input-blocking t :cursor-visible nil :enable-colors t) + (let* ((items1 '("Choice 0" "Choice 11" :choice22 "Choice 3333" "Choice 44444" "Choice 555555" + "Choice 6666666" "Choice 7" "Choice 88" "Choice 999")) + (menu1 (make-instance 'menu :items items1 :name "sub-menu 1" :max-item-length 50 :menu-location (list 5 10))) + (items2 (list "Item 0" menu1 "Item 1" "Item 2" "Item 3" "Item 4" "Item 5" "Item 6" "Item 7" "Item 8" "Item 9")) + (menu2 (make-instance 'menu :items items2 :name "sub-menu 2" :max-item-length 50 :menu-location (list 5 10))) + (items3 (list "Item 00" menu2 "Item 01" "Item 02" "Item 03" "Item 04" "Item 5" "Item 6" "Item 7" "Item 8" "Item 9")) + (menu3 (make-instance 'menu :items items3 :name "t19b2b" :max-item-length 50 :menu-location (list 5 10)))) + ;; associate the same window with all three menus. + (setf (window menu1) scr + (window menu2) scr + (window menu3) scr) + ;; select an item and return it. + (select menu3)))) + +(defun t19c () + "Improved t19b, the menu can be called repeatedly with the key a." + (with-screen (scr :input-echoing nil :input-blocking t :cursor-visible nil :enable-colors t) + (let* ((choices '("Choice 0" "Choice 11" "Choice 222" "Choice 3333" "Choice 44444" "Choice 555555" + "Choice 6666666" "Choice 7" "Choice 88" "Choice 999")) + (menu (make-instance 'menu-window :items choices :location (list 0 25) :scrolled-layout (list 6 1) + :title "t19c" :draw-border t :enable-function-keys t))) + (event-case (scr event) + ;; "a" draws the menu and enters a new menu-only event loop + (#\a (let ((result (select menu))) + (format scr "You chose ~A~%" result) + ;; we have to touch scr in order to make the menu disappear. + (touch scr) + (refresh scr))) + (#\q (return-from event-case))) + (close menu)))) + +(defun t19c2 () + "Test the menu-item class for submenus." + (with-screen (scr :input-echoing nil :input-blocking t :cursor-visible nil :enable-colors t) + (let* ((fun1 (make-instance 'menu-item :name "fun1" :value (lambda () (clear scr)))) + (choices (list "Choice 0" 'choice11 fun1 "Choice 222" "Choice 3333" "Choice 44444" "Choice 555555" + "Choice 6666666" "Choice 7" "Choice 88" "Choice 999")) + ;; First, create a menu + ;; TODO: how to determine the location of the sub-menu depending on the parent menu? + (sub-menu2 (make-instance 'menu-window + :items choices ;; here we only have strings + :location (list 2 57) :scrolled-layout (list 6 1) + ;; for hex triplets to work, we need to start sbcl with:TERM=xterm-256color lisp.sh + ;;:color-pair (list :black #x666666) + :bgcolor :red + :name "submenu2" :title t :draw-border t :enable-function-keys t :visible nil)) + ;; then add that sub-menu menu as an item to the next menu, and so on. + (sub-menu1 (make-instance 'menu-window + :items (cons sub-menu2 choices) ;; first item is a submenu + :location (list 1 41) :scrolled-layout (list 6 1) + ;;:color-pair (list :black #x999999) + :fgcolor :green + :name "submenu1" :title nil :draw-border t :enable-function-keys t :visible nil)) + ;; finally, create the main menu containing sub-menu1 as an item + (menu (make-instance 'menu-window + :items (cons sub-menu1 choices) ;; first item is a submenu + :location (list 0 25) :scrolled-layout (list 6 1) + ;;:color-pair (list :black #xcccccc) + :fgcolor :blue :bgcolor :yellow + :name "menu" :title nil :draw-border nil :enable-function-keys t :visible nil))) + ;; add the menus and submenus to a window stack + ;; scr has to be stacked too so we can make the menus disappear. + (setf (stackedp scr) t + (stackedp menu) t + (stackedp sub-menu1) t + (stackedp sub-menu2) t) + + (setf (background scr) (make-instance 'complex-char :simple-char :board :color-pair (list :black :white))) + + (refresh-stack) + (event-case (scr event) + ;; "a" draws the menu and enters a new menu-only event loop by calling select + (#\a (let ((result (select menu))) + (format scr "You chose ~A~%" result) + (format scr "~A~%" (color-pair menu)) + (format scr "Stack ~A~%" (length de.anvi.croatoan::*window-stack*)) + (refresh-stack) )) + ;; TODO: doesnt repaint the border, because the border already has attributes. + ;; setting a background doesnt change existing attributes, only existing backgrounds. + (#\b (setf (color-pair menu) (list :red :black))) + ;; "q" exits the function and all menus and submenus. + (#\q (return-from event-case))) + (close menu) + (close sub-menu1) + (close sub-menu2)))) + +(defun t19c3 () + "Menu with checkbox items." + (with-screen (scr :input-echoing nil :input-blocking t :cursor-visible nil :enable-colors t) + (let* ((choices '("Choice 0" "Choice 11" "Choice 222" "Choice 3333" "Choice 44444" "Choice 555555" + "Choice 6666666" "Choice 7" "Choice 88" "Choice 999")) + (menu (make-instance 'menu-window :items choices :location (list 0 25) :scrolled-layout (list 6 1) + :title "t19c" :draw-border t :enable-function-keys t + :menu-type :checklist + :max-item-length 20 + :color-pair (list :yellow :red) ))) + (event-case (scr event) + ;; "a" draws the menu and enters a new menu-only event loop + (#\a (let ((result (select menu))) + (format scr "You chose ~A~%" (mapcar #'value result)) + ;; we have to touch scr in order to make the menu disappear. + (touch scr) + (refresh scr))) + (#\q (return-from event-case))) + (close menu)))) + +(defun t19d () + "Use the arrow keys to pick a value from an 2D array menu, given as a layout parameter." + (with-screen (scr :input-echoing nil :input-blocking t :cursor-visible nil :enable-colors t) + (let* ((items (loop for i below 200 collect (format nil "Item ~A" i))) + (menu (make-instance 'menu-window + :items items :location (list 0 0) :layout (list 20 10) :scrolled-layout (list 10 4) + :cyclic-selection nil :max-item-length 9 :title "t19d" :draw-border t :enable-function-keys t))) + (event-case (scr event) + ;; "a" draws the menu and enters a new menu-only event loop + (#\a (let ((result (select menu))) + (format scr "You chose ~A~%" result) + ;; we have to touch scr in order to make the menu disappear. + (touch scr) + (refresh scr))) + (#\q (return-from event-case))) + (close menu)))) + +(defun t19e () + "A one-line menu without a title and border resembling a menu bar." + (with-screen (scr :input-echoing nil :input-blocking t :cursor-visible nil :enable-colors t) + (let* ((items '("Item 0" "Item 1" "Item 2" "Item 3" "Item 4" "Item 5" "Item 6" "Item 7" "Item 8" "Item 9")) + (menu (make-instance 'menu-window :input-blocking t :items items :location (list 0 0) + :layout (list 1 (length items)) + :scrolled-layout (list 1 6) + ;;:color-pair (list :black :yellow) + :max-item-length 10 :width (width scr) :draw-border t :enable-function-keys t))) + ;; start the output below the menu + (move scr 4 0) + ;; exit the infinite loop by exiting the menu with q. + (loop named menu-case + do + (let ((result (select menu))) + (unless result (return-from menu-case)) + (format scr "You chose ~A~%" result) + (refresh scr))) + (close menu)))) + +(defun t19e2 () + "A menu bar and submenus." + (with-screen (scr :input-echoing nil :input-blocking t :cursor-visible nil :enable-colors t) + (let* ((items1 (list "Choice 0" "Choice11" "Choice 222" "Choice 3333" "Choice 44444" "Choice 555555" + "Choice 6666666" "Choice 7" "Choice 88" "Choice 999")) + (sub-menu1 (make-instance 'menu-window :items items1 :location (list 2 30) :scrolled-layout (list 6 1) + :title nil :name "submenu1" :draw-border t :enable-function-keys t :visible nil :menu-type :selection)) + (sub-menu2 (make-instance 'menu-window :items items1 :location (list 2 45) :scrolled-layout (list 6 1) + :title nil :name "submenu2" :draw-border t :enable-function-keys t :visible nil :menu-type :checklist)) + (fun1 (make-instance 'menu-item :name "fun1" :value (lambda () (clear scr)))) + (items2 (list "Item 0" fun1 sub-menu1 sub-menu2)) + (menu (make-instance 'menu-window :input-blocking t :items items2 :location (list 0 0) :layout (list 1 (length items2)) + :max-item-length 15 :width (width scr) :draw-border t :enable-function-keys t))) + (setf (stackedp scr) t + (stackedp menu) t + (stackedp sub-menu1) t + (stackedp sub-menu2) t) + (move scr 4 0) ;; start the output at line 4, below the menu bar. + (refresh-stack) + (loop named menu-case + do (let ((result (select menu))) + (unless result (return-from menu-case)) + (format scr "You chose ~A~%" result) + (refresh-stack))) + (close menu) + (close sub-menu1) + (close sub-menu2) ))) + +(defun t19f () + "A more fancy version of t19a, a yes-no dialog using the class dialog-window." + (with-screen (scr :input-echoing nil :input-blocking t :cursor-visible nil :enable-colors t) + (let* ((items (list "Yes" "No" "OK" 'cancel)) + (menu (make-instance 'dialog-window + :input-blocking t + :items items + ;; when center is t for a dialog window, we do not need to pass the location explicitely. + ;;:location (list 5 15) + :center t + :layout (list 1 4) + :max-item-length 12 + :current-item-mark "> " + :color-pair (list :yellow :red) + :width 60 + :draw-border t + :enable-function-keys t + :name "t19f" + :title t + ;; if the title is given as a string, it overrides the default title = name + ;; :title "this is a selection dialog" + :message-height 2 + :message-text "Press <- or -> to choose. Enter to confirm choice.~%Press q to exit."))) + + (setf (background scr) (make-instance 'complex-char :simple-char :board :color-pair (list :black :white))) + + (refresh scr) + (loop named menu-case + do (let ((result (select menu))) + (unless result (return-from menu-case)) + (format scr "You chose ~A~%" result) + (refresh scr))) + (close menu)))) + +(defun t19g () + "A checkbox dialog." + (with-screen (scr :input-echoing nil :input-blocking t :cursor-visible nil :enable-colors t :use-terminal-colors t) + (let* ((items (list "Yes" "No" "OK" 'cancel "Maybe")) + (menu (make-instance 'dialog-window + :input-blocking t + :items items + ;; when a menu or dialog type is a checklist, items can be checked and unchecked with x/space. + :menu-type :checklist + ;; a dialog window can be automatically centered in the terminal window. + :center t + :layout (list 5 1) + ;; TODO: the size of the dialog window should depend on scrolled layout when it is defined. + ;;:scrolled-layout (list 3 1) + :max-item-length 56 + :color-pair (list :yellow :red) + ;; we do not need an item mark in a checklist + :current-item-mark "" + :width 60 :draw-border t :enable-function-keys t + :title "this is a checkbox dialog" + :message-height 2 + :message-text "Press <- or -> to choose. Enter to confirm choice.~%Press q to exit."))) + ;; #x2592 = :board + (setf (background scr) (make-instance 'complex-char :simple-char #x2592 :color-pair (list :white :black))) + + (refresh scr) + (loop named menu-case + do (let ((result (select menu))) + ;; TODO: returning an empty list exits the loop. + (unless result (return-from menu-case)) + (format scr "You chose ~A~%" (mapcar #'value result)) + (refresh scr))) + (close menu)))) + +;; Passing the color attribute directly to a character. +(defun t20 () + "Display a randomly created carpet of the seven default ANSI colors, except for black." + (with-screen (scr :input-echoing nil :input-blocking nil :enable-colors t :cursor-visible nil) + (let ((colors '(:red :green :yellow :blue :magenta :cyan :white))) + (event-case (scr event) + (#\q (return-from event-case)) + ((nil) + (sleep 0.01) + (echo scr #\space + :y (random (height scr)) + :x (random (width scr)) + :color-pair (list nil (nth (random 7) colors)))))))) + +(defun t20a () + "Display a randomly created carpet of the 16 default xterm colors, except for black. + +This only works with TERM=xterm-256color in xterm and gnome-terminal." + (with-screen (scr :input-echoing nil :input-blocking nil :enable-colors t :cursor-visible nil) + (let ((colors '( :maroon :green :olive :navy :purple :teal :silver + :gray :red :lime :yellow :blue :magenta :cyan :white))) + (bind scr #\q 'exit-event-loop) + (bind scr nil + (lambda (win e) + (echo win #\space + :y (random (height win)) + :x (random (width win)) + :bgcolor (nth (random 15) colors)))) + (setf (frame-rate scr) 1000) + (run-event-loop scr)))) + +;; it is just a coincidence that "echo-char" works here. +;; echo-char is a chtype-function, and chtype allows only 1 byte for color pairs, which means 256 color pairs. +;; it works only because the foreground color is always black in the example. +;; echo-wide-char has to be used. +(defun t20b () + "Display the 256 supported colors. This only works with TERM=xterm-256color in xterm and gnome-terminal." + (with-screen (scr :input-echoing nil :input-blocking t :enable-colors t :cursor-visible nil) + ;; 0-15: 8 ANSI colors and 8 bold ANSI colors + ;; only those first 16 colors are named. + ;; note that the naming of the first 8 ANSI colors is not the same as the first 8 xterm colors. + (loop for i from 0 to 7 do + (loop for j from 0 to 1 do + (loop for k from 0 to 2 do + (echo scr #\space + :y j + :x (+ (* i 3) k) + :color-pair (list :black + (list :number (+ i (* j 8))))) ))) + ;; 16-231: 6x6x6 color cube + (loop for n from 0 to 1 do + (loop + for m from 0 to 2 + for a1 = (+ 16 (* m 36)) + for a2 = (+ 16 (* m 36) 5) + for a3 = (* m 19) + do (loop for i from a1 to a2 do + (loop for j from 0 to 5 do + (loop for k from 0 to 2 do + (echo scr #\space + :y (+ 3 j (* n 7)) + :x (+ (* (- i a1) 3) k a3) + :color-pair (list :black + (list :number (+ (* n 108) i (* j 6)))) )))))) + ;; 232-255: 24 shades of gray, without black and white + (loop for i from 232 to 255 do + (loop for k from 0 to 2 do + (echo scr #\space + :y 17 + :x (+ (* (- i 232) 3) k) + :color-pair (list :black + (list :number i))))) + (get-char scr))) + +(defun t20c () + "Display the 256 supported colors. This only works with TERM=xterm-256color in xterm and gnome-terminal." + (with-screen (scr :input-echoing nil :input-blocking t :enable-colors t :cursor-visible nil) + ;; 0-15: 8 ANSI colors and 8 bold ANSI colors + (loop for i from 0 to 7 do + (loop for j from 0 to 1 do + (loop for k from 0 to 2 do + (add scr #\space + :y j + :x (+ (* i 3) k) + :bgcolor (list :number (+ i (* j 8))))) )) + ;; 16-231: 6x6x6 color cube + (loop for n from 0 to 1 do + (loop + for m from 0 to 2 + for a1 = (+ 16 (* m 36)) + for a2 = (+ 16 (* m 36) 5) + for a3 = (* m 19) + do (loop for i from a1 to a2 do + (loop for j from 0 to 5 do + (loop for k from 0 to 2 do + (add scr #\space + :y (+ 3 j (* n 7)) + :x (+ (* (- i a1) 3) k a3) + :bgcolor (list :number (+ (* n 108) i (* j 6)))) ))))) + ;; 232-255: 24 shades of gray, without black and white + (loop for i from 232 to 255 do + (loop for k from 0 to 2 do + (add scr #\space + :y 17 + :x (+ (* (- i 232) 3) k) + :bgcolor (list :number i)))) + (refresh scr) + (get-char scr))) + +;; Tests for insert-char, insert-string, extract-char. +(defun t21 () + (with-screen (scr :cursor-visible nil) + (move scr 0 0) (add-char scr #\a) + ;; overwrite b over a + (move scr 0 0) + (add-char scr + (make-instance 'complex-char :simple-char #\b :attributes (list :bold :underline) :color-pair '(:blue :yellow))) + (echo scr + (make-instance 'complex-char :simple-char #\e :attributes (list :underline) :color-pair '(:blue :yellow))) + ;; insert pi before b + (move scr 0 0) (insert-char scr :pi :color-pair '(:yellow :red)) + ;; insert d before pi + (move scr 0 0) (insert-string scr "d ") + ;; change the attributes of the d + (move scr 0 0) (change-attributes scr 1 '(:underline) :color-pair '(:green :black)) + ;; extract the complex d from the window, then print its properties. + (let ((e (extract-char scr))) + (move scr 1 0) + ;; format uses print-object specialized on complex-chars + (format scr "~S~%~S ~S ~S" e (simple-char e) (attributes e) (color-pair e)) + ;; print back the extracted char + (move scr 3 0) + (add-char scr (simple-char e) :attributes (attributes e) :color-pair (color-pair e)) + ;; directly print the complex char + (add-char scr e :y 5 :x 10 :n -1) + ;; print strings with attributes and colors + ;; attributes dont work (yet) when a long string gets wrapped around the last column. + (add-string scr "string with attributes" :y 11 :x 10 :attributes '(:underline) :color-pair '(:black :green)) + ;; test adding both chars and strings with a single wrapper routine. + (add scr #\a :y 13 :x 0 :attributes '(:underline) :color-pair '(:yellow :red) :n -1) + (add scr "string with attributes" :y 15 :x 0 :n 11 :attributes '(:underline :bold) :color-pair '(:yellow :green))) + ;; test print-object specialisation on complex-string + (let ((str (make-instance 'complex-string :string "complex-string" :color-pair '(:blue :white) :attributes '(:underline)))) + (format scr "~%~S~%" str) + (add-string scr str :y 18 :x 73 :n -1) + (add scr str :y 19 :x 70 :n -1)) + ;; extract the first line as a complex-string, then reprint it at line 22 + (let ((str (extract-complex-string scr :y 0 :x 0 :n 4))) + (move scr 22 1) + (add scr str :n -1)) + ;; extract the first line as a simple string, then reprint it at line 23 + (let ((str (extract-string scr :y 0 :x 0 :n 5))) + (move scr 23 1) + (add scr str)) + (refresh scr) + (get-char scr))) + +;; temporarily end the main screen, write something to the repl, and then return to the screen. +;; the predicate closed-p can be used to check whether the screen has been temporarily closed. +(defun t22 () + (let ((scr (make-instance 'screen :input-blocking t :input-echoing nil))) + (unwind-protect + (progn + (clear scr) + ;; should yield NIL, since we didnt endwin yet + (format scr "1. screen before ending: ~A~%" (closed-p scr)) + (get-char scr) + + (close scr) + + ;; this shouldnt be visible, but it is visible after the later refresh + ;; obviously ncurses doesnt destroy the screen window after it is closed + (format scr "2. screen after ending, we dont see it till after the refresh: ~A~%" (closed-p scr)) + + ;; should yield T, because we closed the screen + (format t "3. in the repl, after ending the screen: ~A~%" (closed-p scr)) + (force-output *standard-output*) + (sleep 5) + + (refresh scr) + ;; should yield NIL, since we refreshed + (format scr "4. screen after refreshing: ~A~%" (closed-p scr)) + + (get-char scr)) + (close scr)))) + +(defun t23 () + "Use save-excursion to return the cursor to its initial location." + (with-screen (scr :input-echoing nil :input-blocking t :cursor-visible t :enable-colors t) + (move scr 0 0) + (princ "1. hello" scr) + (save-excursion scr + (move scr 5 5) + (princ "2. there" scr)) + (princ "3. dear john" scr) + (get-char scr))) + +(defun t24 () + "Test usage of insert-line and delete-line." + (with-screen (scr :input-echoing nil :input-blocking t :cursor-visible t :enable-colors t) + (loop for i from 0 to (- (height scr) 1) + do + (move scr i 0) + (format scr "~A" i)) + (refresh scr) + (event-case (scr event) + ((:up :down) (move-direction scr event) (refresh scr)) + (#\d (delete-line scr) (refresh scr)) + (#\i (insert-line scr) (refresh scr)) + (#\q (return-from event-case))) + (get-char scr))) + +(defun t25 () + "Test initialisation and refreshing of pads and sub-pads." + (with-screen (scr :input-blocking t :cursor-visible nil :enable-colors t) + (let* ((p (make-instance 'pad :height 100 :width 100)) + (sp (make-instance 'sub-pad :parent p :height 5 :width 10 :location (list 10 10)))) + + ;; populate the pad with numbers. + (loop for j from 0 to 99 + do (loop for i from 0 to 99 + do + (move p j i) + (format p "~D" (mod (* i j) 10)))) + + ;; populate the sub-pad with letters. + (loop for j from 0 to 4 + do (loop for i from 0 to 9 + do + (move sp j i) + (add-char sp #\X) )) + + ;; we have to modify the sub-window attributes first because apparently once + ;; chars have attributes, they can not be changed by subsequent background changes. + (setf (background sp) (make-instance 'complex-char :color-pair '(:white :red)) + (background p) (make-instance 'complex-char :color-pair '(:green :white))) + + (let ((pad-min-y 0) + (pad-min-x 0) + (screen-min-y 0) + (screen-min-x 0) + (screen-max-y 5) + (screen-max-x 10)) + + ;; the background screen has to be touched and refreshed on every move, + ;; otherwise we will see parts of the previously displayed pad still there. + (touch scr) + (refresh scr) + (refresh p pad-min-y pad-min-x screen-min-y screen-min-x screen-max-y screen-max-x) + + (event-case (scr event) + (:up (decf pad-min-y) (decf screen-min-y) (decf screen-max-y) (touch scr) (refresh scr) + (refresh p pad-min-y pad-min-x screen-min-y screen-min-x screen-max-y screen-max-x)) + (:down (incf pad-min-y) (incf screen-min-y) (incf screen-max-y) (touch scr) (refresh scr) + (refresh p pad-min-y pad-min-x screen-min-y screen-min-x screen-max-y screen-max-x)) + (:left (decf pad-min-x) (decf screen-min-x) (decf screen-max-x) (touch scr) (refresh scr) + (refresh p pad-min-y pad-min-x screen-min-y screen-min-x screen-max-y screen-max-x)) + (:right (incf pad-min-x) (incf screen-min-x) (incf screen-max-x) (touch scr) (refresh scr) + (refresh p pad-min-y pad-min-x screen-min-y screen-min-x screen-max-y screen-max-x)) + (#\q (return-from event-case)) + (otherwise nil))) + + (close p) + (close sp)))) + +(defun t26 () + "Test accessors of window and cursor locations." + (with-screen (scr :input-echoing nil :input-blocking t :cursor-visible t :enable-colors t :stacked t) + (let ((win (make-instance 'window :height 5 :width 20 :location (list 0 0) :stacked t))) + + (setf (background scr) (make-instance 'complex-char :color-pair '(:white :red)) + (background win) (make-instance 'complex-char :color-pair '(:black :yellow))) + + (refresh-stack) + (get-char scr) + + (setf (location win) (list 2 4)) + (refresh-stack) + (get-char scr) + + (setf (location-y win) 4) + (refresh-stack) + (get-char scr) + + (setf (location-x win) 8) + (refresh-stack) + (get-char scr) + + (setf (cursor-position win) (list 0 0)) + (princ "a" win) + (refresh-stack) + (get-char scr) + + (setf (cursor-position-y win) 2) + (princ "b" win) + (refresh-stack) + (get-char scr) + + (setf (cursor-position-x win) 4) + (princ "c" win) + (refresh-stack) + (get-char scr)))) + +(defun t27 () + "Use run-event-loop and bind instead of event-case to handle keyboard events." + (with-screen (scr :input-echoing nil :input-blocking t) + + ;; q ends the loop. + (bind scr #\q 'exit-event-loop) + + ;; The event handler function has to take two arguments, the window and the event. + + ;; a and s add a string to the window. + (bind scr #\a (lambda (win event) (format win "Hello there.~%"))) + (bind scr #\s (lambda (win event) (format win "Dear John.~%"))) + + ;; d clears the window. + (bind scr #\d (lambda (win event) (clear win))) + + ;; u unbinds a + (bind scr #\u (lambda (win event) (unbind scr #\a))) + + (clear scr) + (add-string scr "Type a, s or d. Type q to quit.") + (refresh scr) + + (run-event-loop scr))) + +(defun t28-hello (win event) + (format win "Hello there ~A.~%" event)) + +(defun t28-clear (win event) + (declare (ignore event)) + (clear win)) + +(defparameter *t28-map* + (make-instance 'keymap :bindings-plist + (list + #\q 'exit-event-loop + #\a 't28-hello + #\d 't28-clear)) + "Define a keymap separately and then set it as a window's event handlers before running the event loop.") + +(defun t28 () + "Use run-event-loop and a pre-defined event handler alist. Use a default handler." + (with-screen (scr :input-echoing nil :input-blocking t) + ;; add the separately defined keymap to the window object. + (setf (keymap scr) *t28-map*) + + ;; add another event handler + (bind scr #\s (lambda (win event) (format win "Dear John ~A~%" event))) + + ;; t is the default handler for all events without defined handlers. + ;; The default event handler should not be used to handle the nil event when input-blocking is nil + (bind *t28-map* t (lambda (win event) (format win "Default event handler ~A~%" event))) + + (clear scr) + (add-string scr "Type a, s or d. Type q to quit.") + (refresh scr) + + (run-event-loop scr))) + +(defun t28a () + "Test the use of the run-event-loop with non-blocking events." + (with-screen (scr :input-echoing nil :input-blocking nil) + + (setf (keymap scr) *t28-map*) + + (bind scr #\s (lambda (win event) (format win "Dear John ~A~%" event))) + + ;; The handler function for the nil event will be called between keyboard events. + (bind scr nil (lambda (win event) (format win "sleep ~A " event))) + + (clear scr) + (add-string scr "Type a, s or d. Type q to quit.") + (refresh scr) + + ;; Set the rate at which the nil event will be handled in fps (frames per second). + ;; For the same effect as frame-rate of 1, you can set :input-blocking to 1000 ms. + (setf (frame-rate scr) 1) + + (run-event-loop scr))) + +(defun draw-t29-shapes (window shapes &optional squarify) + "Draw a list of shapes to window." + (clear window) + (unless (listp shapes) (setf shapes (list shapes))) + (dolist (s shapes) + (draw-shape window s squarify))) + +;; Assumes an 80x24 terminal +(defun t29 () + "Draw an ASCII-art tree to illustrate the use of shapes." + (with-screen (scr :input-blocking t :enable-colors t :input-echoing nil :cursor-visible nil :input-buffering nil) + (let* ((leaf-char (make-instance 'complex-char :simple-char #\O :color-pair '(:green :black))) + (trunk-char (make-instance 'complex-char :simple-char #\H :color-pair '(:white :black))) + (ground-char (make-instance 'complex-char :simple-char #\i :color-pair '(:green :black))) + (sun-char (make-instance 'complex-char :simple-char #\o :color-pair '(:yellow :black))) + + (tree-trunk (rectangle 19 27 5 4 :filled t :char trunk-char)) + (upper-crown (triangle 4 29 12 22 12 35 :filled t :char leaf-char)) + (lower-crown (triangle 8 29 18 20 18 37 :filled t :char leaf-char)) + (tree-crown (merge-shapes upper-crown lower-crown)) + (ground (line 23 0 23 80 :char ground-char)) + (sun (circle 5 6 2 :char sun-char :filled t))) + + (draw-t29-shapes scr (list tree-trunk tree-crown ground sun) t) + ;; wait for a keypress + (get-char scr) + + ;; redraw with squarify nil + (draw-t29-shapes scr (list tree-trunk tree-crown ground sun) nil) + (get-char scr) ))) + +(defun t30 () + "Test color pair completion for style parameters." + (with-screen (scr :input-echoing nil :input-blocking t :cursor-visible nil :enable-colors t) + (with-windows ((w1 :height 5 :width 5 :location '(0 0)) + (w2 :height 5 :width 5 :location '(0 5)) + (w3 :height 5 :width 5 :location '(0 10))) + (setf (background w1) (make-instance 'complex-char :color-pair '(:black :cyan)) + (background w2) (make-instance 'complex-char :color-pair '(:black :magenta)) + (background w3) (make-instance 'complex-char :color-pair '(:black :white))) + ;; the character style contains only one color + ;; the fg/bg of the target window is used to complete the color pair. + (let ((s1 (list :attributes '(:bold) :fgcolor :red)) + (s2 (list :attributes '(:bold) :bgcolor :yellow))) + (add w1 #\a :y 2 :x 2 :style s1) + (add w2 #\b :y 2 :x 2 :style s1) + (add w3 #\c :y 2 :x 2 :style s2)) + (refresh w1) + (refresh w2) + (refresh w3) + (get-char w1)))) + +;; the ncurses window background property and the color-pair apparently set the same internal variable +;; setting one to nil sets the other to nil. +;; croatoan does not do that. here, the window color if it is set overrides the background property. +;; if a color parameter is directly passed, it overrides both the window color-pair and background. +(defun t31 () + "Test color pair completion for fgcolor and bgcolor parameters." + (with-screen (scr :input-echoing nil :input-blocking t :cursor-visible nil :enable-colors t) + (add-string scr "default colors" :y 0 :x 0) (refresh scr) (get-char scr) + + (setf (color-pair scr) '(:yellow :blue)) + (add-string scr "color-pair yellow on blue" :y 1 :x 0) (refresh scr) (get-char scr) + + ;; text is not printed red on white because the color-pair overrides the background color. + (setf (background scr nil) (make-instance 'complex-char :simple-char #\- :color-pair '(:red :white))) + (add-string scr " background red on white" :y 2 :x 0) (refresh scr) (get-char scr) + + (setf (color-pair scr) '(:blue :yellow)) + (add-string scr "color-pair blue on yellow" :y 3 :x 0) (refresh scr) (get-char scr) + + ;; text is not printed red on white because the color-pair overrides the background color. + (setf (background scr nil) (make-instance 'complex-char :simple-char #\space :color-pair '(:white :red))) + (add-string scr " background white on red" :y 4 :x 0) (refresh scr) (get-char scr) + + ;; now when we set the color-pair to nil, the text is printed in background colors. + (setf (color-pair scr) nil) + (add-string scr "color-pair nil" :y 5 :x 0) (refresh scr) (get-char scr) + + ;; when we then also set the background to nil, the text is displayed in default white on black. + (setf (background scr nil) nil) + (add-string scr " background nil" :y 6 :x 0) (refresh scr) (get-char scr) + + (add-string scr "fgcolor red bgcolor cyan" :y 7 :x 0 :fgcolor :red :bgcolor :cyan) (refresh scr) (get-char scr) + (add-string scr "fgcolor red (bgcolor default)" :y 8 :x 0 :fgcolor :red) (refresh scr) (get-char scr) + (add-string scr "(fgcolor default) bgcolor cyan" :y 9 :x 0 :bgcolor :cyan) (refresh scr) (get-char scr) + + (setf (color-pair scr) '(:yellow :blue)) + ;; the color parameters override the color-pair window property + (add-string scr "color pair yellow on blue, then fgcolor red" :y 10 :x 0 :fgcolor :red) (refresh scr) (get-char scr) + (add-string scr "color pair yellow on blue, then bgcolor cyan" :y 11 :x 0 :bgcolor :cyan) (refresh scr) (get-char scr) + + ;; the background is ignored because color-pair is set + (setf (background scr nil) (make-instance 'complex-char :simple-char #\. :color-pair '(:white :red))) + (add-string scr "fgcolor red" :y 12 :x 0 :fgcolor :red) (refresh scr) (get-char scr) + (add-string scr "bgcolor cyan" :y 13 :x 0 :bgcolor :cyan) (refresh scr) (get-char scr) + + ;; when the pair is set to nil, the background is used again. + (setf (color-pair scr) nil) + (add-string scr "fgcolor magenta" :y 14 :x 0 :fgcolor :magenta) (refresh scr) (get-char scr) + (add-string scr "bgcolor cyan" :y 15 :x 0 :bgcolor :cyan) (refresh scr) (get-char scr) )) + diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/test/evolution.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/test/evolution.lisp new file mode 100644 index 0000000..ee688e0 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/test/evolution.lisp @@ -0,0 +1,311 @@ +(in-package :de.anvi.croatoan.test) + +;; Example from "Land of Lisp", Copyright by Conrad Barski. +;; Source: http://landoflisp.com/evolution.lisp +;; Unknown licence. + +(defparameter *width* 100) +(defparameter *height* 30) +(defparameter *jungle* '(45 10 10 10)) +(defparameter *plant-energy* 80) +(defparameter *plants* (make-hash-table :test #'equal)) +(defparameter *reproduction-energy* 200) + +(defstruct animal x y energy dir genes) + + +(defun random-plant (left top width height) + (let ((pos (cons (+ left (random width)) + (+ top (random height))))) + (setf (gethash pos *plants*) t))) + +(defun add-plants () + ;; First one in the jungle. + (apply #'random-plant *jungle*) + ;; Then one in the rest of the world. + (random-plant 0 0 *width* *height*)) + +;; Define one starting animal. +(defparameter *animals* + (list (make-animal :x (ash *width* -1) + :y (ash *height* -1) + :energy 1000 + :dir 0 + :genes (loop repeat 8 collect (1+ (random 10)))))) + +(defun move- (animal) + (let ((dir (animal-dir animal)) + (x (animal-x animal)) + (y (animal-y animal))) + + ;; If x>width, wrap around the world border with the mod function. + (setf (animal-x animal) + (mod (+ x (cond ((and (>= dir 2) (< dir 5)) 1) + ((or (= dir 1) (= dir 5)) 0) + (t -1)) + *width*) + *width*)) + + ;; Down is +1, up is -1. + (setf (animal-y animal) + (mod (+ y (cond ((and (>= dir 0) (< dir 3)) -1) + ((and (>= dir 4) (< dir 7)) 1) + (t 0)) + *height*) + *height*)) + + (decf (animal-energy animal)))) + +(defun turn (animal) + (let ((x (random (apply #'+ (animal-genes animal))))) + (labels ((angle (genes x) + (let ((xnu (- x (car genes)))) + (if (< xnu 0) + 0 + (1+ (angle (cdr genes) xnu)))))) + + (setf (animal-dir animal) + (mod (+ (animal-dir animal) + (angle (animal-genes animal) x)) + 8))))) + +(defun eat (animal) + (let ((pos (cons (animal-x animal) (animal-y animal)))) + (when (gethash pos *plants*) + (incf (animal-energy animal) *plant-energy*) + (remhash pos *plants*)))) + +(defun reproduce (animal) + (let ((e (animal-energy animal))) + (when (>= e *reproduction-energy*) + (setf (animal-energy animal) (ash e -1)) + (let ((animal-nu (copy-structure animal)) + (genes (copy-list (animal-genes animal))) + (mutation (random 8))) + ;; mutate a random gene by +1 or -1. + (setf (nth mutation genes) + (max 1 (+ (nth mutation genes) (random 3) -1))) + ;; deep copy of the gene list. + (setf (animal-genes animal-nu) genes) + ;; push the new animal to the list. + (push animal-nu *animals*))))) + +(defun update-world () + ;; Remove dead animals. + (setf *animals* + (remove-if (lambda (animal) (<= (animal-energy animal) 0)) + *animals*)) + ;; Do what animals do. + (mapc (lambda (animal) + (turn animal) + (move- animal) + (eat animal) + (reproduce animal)) + *animals*) + ;; Grow plants. + (add-plants)) + +;;; simple non-ncurses version from LOL, prints to REPL. +(defun draw-world () + (loop for y + below *height* + do (progn (fresh-line) + ;; beginning of the line. + (princ "|") + (loop for x + below *width* + do (princ (cond + ;; if there is one or more animals, print a M. + ((some (lambda (animal) (and (= (animal-x animal) x) + (= (animal-y animal) y))) + *animals*) + #\M) + ;; if there is a plant, print * + ((gethash (cons x y) *plants*) #\*) + ;; if there is neithe a plant nor an animal, print a space. + (t #\space)))) + ;; end of the line. + (princ "|")))) + +;; enter a recursive infinite loop as the programs main loop. +(defun evolution () + (draw-world) + ;; add an empty line between worlds. + (fresh-line) + (let ((str (read-line))) + (cond ((equal str "quit") ()) + (t (let ((x (parse-integer str :junk-allowed t))) + (if x + (loop for i + below x + do (update-world) + if (zerop (mod i 1000)) + do (princ #\.)) + (update-world)) + (evolution)))))) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +;; instead of using princ to draw to stdout, use add-string to draw to the curses screen. +;; the screen has to be initialized first in the main function evolve. +(defun draw-world-croatoan (scr) + (loop + for y + from 0 + below *height* + do (loop + for x + from 0 + below *width* + do (add-string scr + (format nil "~A" + (cond + ;; if there is one or more animals, print a M. + ((some (lambda (animal) (and (= (animal-x animal) x) + (= (animal-y animal) y))) + *animals*) + #\M) + ;; if there is a plant, print * + ((gethash (cons x y) *plants*) #\*) + ;; if there is neithe a plant nor an animal, print a space. + (t #\space))) + :y y + :x x))) + ;; refresh the physical screen to dsplay the drawn changes. + (refresh scr)) + +;; enter a recursive infinite loop as the programs main loop. +(defun evolve () + (with-screen (scr :input-blocking nil :input-echoing nil :cursor-visible nil) + (clear scr) + (setf (background scr) (make-instance 'complex-char :color-pair '(:green :white))) + + (setq *width* (width scr)) + (setq *height* (height scr)) + + (loop + initially + (draw-world-croatoan scr) + + for ch = (get-char scr) + + while (or (= ch -1) (not (equal (code-char ch) #\q))) + do + (update-world) + (sleep 0.001) + (draw-world-croatoan scr)))) + +;; uses tagbody to separate between event handling and body. +(defun evolve2 () + (with-screen (scr :input-blocking nil :input-echoing nil :cursor-visible nil) + (clear scr) + (setf (background scr) (make-instance 'complex-char :color-pair '(:green :white))) + + (setq *width* (width scr)) + (setq *height* (height scr)) + + (draw-world-croatoan scr) + (refresh scr) + + (loop + (tagbody + + ;; read a char. + (let ((ch (get-char scr))) + + ;; if it is -1, just execute the body. + ;; this is a special event when there is no event. + (cond ((= ch -1) (go evolution-body)) + + ;; And from here we have real key/character events. + ((equal (code-char ch) #\q) (return)))) + + evolution-body + + (update-world) + (sleep 0.001) + (draw-world-croatoan scr) + (refresh scr))))) + +;; uses key-pressed-p to separate between events and the body, instead of loop and tagbody used in 1 and 2. +(defun evolve3 () + (with-screen (scr :input-blocking nil :input-echoing nil :cursor-visible nil) + (clear scr) + ;(setf (background scr) (make-instance 'complex-char :color-pair '(:green :white))) + + (setq *width* (width scr)) + (setq *height* (height scr)) + + (draw-world-croatoan scr) + + (loop + (if (key-pressed-p scr) + (let ((ch (get-char scr))) + (cond ((equal (code-char ch) #\q) (return)))) + (progn + (update-world) + (sleep 0.001) + (draw-world-croatoan scr) ))))) + +(defun evolve4 () + "Uses get-event to separate between events and the body, instead of key-pressed-p." + (with-screen (scr :input-blocking nil :input-echoing nil :cursor-visible nil) + (clear scr) + ;(setf (background scr) (make-instance 'complex-char :color-pair '(:green :white))) + + (setq *width* (width scr)) + (setq *height* (height scr)) + + (draw-world-croatoan scr) + + (loop + (let ((event (get-event scr))) + (if event + (case event + (#\q (return))) + (progn + (update-world) + (sleep 0.001) + (draw-world-croatoan scr) )))))) + +(defun evolve5 () + "Use the event-case macro for event handling." + (with-screen (scr :input-blocking nil :input-echoing nil :cursor-visible nil) + (clear scr) + + (setq *width* (width scr)) + (setq *height* (height scr)) + + (draw-world-croatoan scr) + + (event-case (scr event) + (#\q (return-from event-case)) + ((nil) + (update-world) + (sleep 0.001) + (draw-world-croatoan scr))))) + +(defun update-game-state (win event) + "Main game state update function for evolve6, called during the nil event handling." + (declare (ignore event)) + (update-world) + (draw-world-croatoan win)) + +(defun evolve6 () + "Use the run-event-loop for event handling." + (with-screen (scr :input-blocking nil :input-echoing nil :cursor-visible nil) + (clear scr) + + (setq *width* (width scr)) + (setq *height* (height scr)) + + (bind scr #\q 'exit-event-loop) + (bind scr nil 'update-game-state) + + ;; For the same effect, set :input-blocking to 1 milisecond. + (setf (frame-rate scr) 1000) + + ;; Draw the world once before entering the main loop. + (draw-world-croatoan scr) + + (run-event-loop scr))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/test/ncurses.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/test/ncurses.lisp new file mode 100644 index 0000000..39effcb --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/test/ncurses.lisp @@ -0,0 +1,137 @@ +(in-package :de.anvi.croatoan.test) + +;; here the ncurses primitive bindings should be tested. + +(defun nctest () + (%initscr) + (%mvaddstr 0 0 "hello there") + (%mvaddstr 7 7 "hello there") + (%mvaddstr 15 15 "hello there") + (%refresh) + (%getch) + (%endwin)) + +(defun nctest2 () + (let ((scr (%initscr))) + (%mvaddstr 0 0 "hello there") + + (%wattron scr #x00020000) + (%mvaddstr 7 7 "hello there") + (%wattroff scr #x00020000) + + (%wattron scr #x80000000) + (%mvaddstr 15 15 "hello there") + (%wattroff scr #x80000000) + + (%wrefresh scr) + (%wgetch scr) + (%endwin))) + +(defun nctest3 () + (%initscr) + (%start-color) + (%init-pair 1 1 3) ; red(1) on yellow(3) + + ;; extract and display the foreground and background color numbers from the pair number + (with-foreign-objects ((ptr-f :short) + (ptr-b :short)) + (%pair-content 1 ptr-f ptr-b) + (%mvaddstr 0 0 (format nil "1 ~A, 3 ~A" (mem-aref ptr-f :short) (mem-aref ptr-b :short)))) + + ;; extract and display the RGB contents of predefined color no. 3 (yellow). + (with-foreign-objects ((ptr-r :short) + (ptr-g :short) + (ptr-b :short)) + (%color-content 3 ptr-r ptr-g ptr-b) + (%mvaddstr 1 0 (format nil "~3A ~3A ~3A" + (mem-aref ptr-r :short) + (mem-aref ptr-g :short) + (mem-aref ptr-b :short)))) + (%refresh) + (%getch) + (%endwin)) + +(defun nctest4 () + "Test low-level cchar_t reading and writing. + +The output is: + +a rendered cchar_t +97 code of character #\a +1 color pair 1 +00020100 attribute underline #x00020000 OR-ed with bit-shifted color pair 1 + +We see that the attr_t slot contains _both_ the attribute _and_ the +bit-shifted color pair, as if it were a chtype in ABI5. + +When ABI6 is used, the separate color-pair slot contains the same color +pair number. + +The goal is obviously to make the cchar_t usable under both ABI5 and ABI6." + (let ((scr (%initscr))) + (%start-color) + (%init-pair 1 1 3) ; red(1) on yellow(3) + + (with-foreign-objects ((ptr '(:struct cchar_t)) + (wch 'wchar_t 5)) + (dotimes (i 5) (setf (mem-aref wch 'wchar_t i) 0)) + (setf (mem-aref wch 'wchar_t) (char-code #\a)) + ;;(%setcchar ptr wch attr_t color-pair-number (null-pointer)) + (%setcchar ptr wch #x00020000 1 (null-pointer)) + (%wadd-wch scr ptr)) + + ;; access the struct slots directly using slot pointers + (with-foreign-object (ptr '(:struct cchar_t)) + (%mvwin-wch scr 0 0 ptr) + (let* ((char (mem-aref (foreign-slot-pointer ptr '(:struct cchar_t) 'cchar-chars) 'wchar_t 0)) + (col (foreign-slot-value ptr '(:struct cchar_t) 'cchar-colors)) + (attr (foreign-slot-value ptr '(:struct cchar_t) 'cchar-attr))) + ;; char code + (%mvaddstr 1 0 (format nil "~A" char)) + ;; color pair number + (%mvaddstr 2 0 (format nil "~A" col)) + ;; attr_t in hex. + (%mvaddstr 3 0 (format nil "~8,'0x" attr)))) + + ;; deconstruct cchar_t using getcchar + (with-foreign-objects ((wcval '(:struct cchar_t)) + (wch 'wchar_t 5) + (attrs 'attr_t) + (color-pair :short)) + (dotimes (i 5) (setf (mem-aref wch 'wchar_t i) 0)) + (%mvwin-wch scr 0 0 wcval) + (%getcchar wcval wch attrs color-pair (null-pointer)) + + (%mvaddstr 5 0 (format nil "~A" (mem-aref wch 'wchar_t 0))) + (%mvaddstr 6 0 (format nil "~A" (mem-aref color-pair :short))) + (%mvaddstr 7 0 (format nil "~8,'0x" (mem-aref attrs 'attr_t)))) + + (%refresh) + (%getch) + (%endwin))) + +;; 190302 +(defun nctest5 () + (let ((scr (%initscr))) + (%addstr (format nil "~A~%" "no background ")) + (%wgetch scr) + + (%wbkgd scr (char-code #\-)) + (%addstr (format nil "~A~%" "background minus ")) + (%wgetch scr) + + (%wbkgd scr (char-code #\*)) + (%addstr (format nil "~A~%" "background star ")) + (%wgetch scr) + + (%wbkgd scr (char-code #\-)) + (%addstr (format nil "~A~%" "background minus ")) + (%wgetch scr) + + (%wbkgd scr (char-code #\+)) + (%addstr (format nil "~A~%" "background plus ")) + (%wgetch scr) + + (%wrefresh scr) + (%wgetch scr) + (%endwin))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/test/package.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/test/package.lisp new file mode 100644 index 0000000..48cb087 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/test/package.lisp @@ -0,0 +1,127 @@ +(defpackage #:de.anvi.croatoan.test + (:documentation "Tests and examples demonstrating the use of the croatoan API.") + (:use #:common-lisp #:cffi #:de.anvi.ncurses #:de.anvi.croatoan) + (:shadowing-import-from #:de.anvi.croatoan callback) + (:export + + ;; ncurses.lisp + #:nctest + #:nctest2 + #:nctest3 + #:nctest4 + #:nctest5 + + ;; unicode.lisp + #:ut01 + #:ut02 + #:ut02b + #:ut03 + #:ut04 + + ;; clos.lisp + #:t00 + #:t01 + #:t02 + #:t02a + #:t02b + #:t02c + #:t03 + #:t03a + #:t03a2 + #:t03b + #:t03b2 + #:t03b3 + #:t03c + #:t03d + #:t03d2 + #:t03e + #:t04 + #:t04a + #:t04b + #:t05 + #:t06 + #:t06a + #:t07 + #:t07a + #:t08 + #:t08a + #:t08b + #:t08c + #:t09 + #:t09a + #:t09b + #:t09c + #:t10 + #:t10a + #:t11 + #:t11a + #:t12 + #:t12a + #:t12b + #:t12c + #:t12c2 + #:t12d + #:t13 + #:t14 + #:t14a + #:t14b + #:t14c + #:t15 + #:t15a + #:t15b + #:t16 + #:t16a + #:t16b + #:t16c + #:t16d + #:t16e + #:t16f + #:t16g + #:t16h + #:t16i + #:t17 + #:t17a + #:t18 + #:t18a + #:t19 + #:t19a + #:t19b + #:t19b2 + #:t19c + #:t19c2 + #:t19c3 + #:t19d + #:t19e + #:t19e2 + #:t19f + #:t19g + #:t20 + #:t20a + #:t20b + #:t20c + #:t21 + #:t22 + #:t23 + #:t24 + #:t25 + #:t26 + #:t27 + #:t28 + #:t28a + #:t29 + #:t30 + #:t31 + + ;; clos.lisp + #:matrix + #:matrix2 + #:matrix3 + #:matrix4 + #:snake + #:snake2 + #:tetris + #:pipes + + ;; evolution.lisp + #:evolve5 + #:evolve6)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/test/tetris.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/test/tetris.lisp new file mode 100644 index 0000000..15e1d34 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/test/tetris.lisp @@ -0,0 +1,148 @@ +(in-package :de.anvi.croatoan.test) + +(defun tetris () + (let ((scr (make-instance 'screen :input-echoing nil :input-blocking nil :enable-function-keys t :cursor-visible nil))) + (unwind-protect + + (let* ((board (make-array '(20 10) :initial-element nil)) + (pieces + +'((((0 0) (0 1) (0 2) (1 1)) ((0 1) (1 0) (2 1) (1 1)) ((1 0) (0 1) (1 2) (1 1)) ((0 0) (1 0) (2 0) (1 1))) ;T + (((0 0) (0 1) (0 2) (1 0)) ((0 0) (0 1) (2 1) (1 1)) ((1 0) (1 1) (1 2) (0 2)) ((0 0) (1 0) (2 0) (2 1))) ;L + (((0 0) (0 1) (0 2) (1 2)) ((0 1) (1 1) (2 1) (2 0)) ((0 0) (1 0) (1 2) (1 1)) ((0 0) (0 1) (1 0) (2 0))) ;J + (((1 0) (0 1) (0 2) (1 1)) ((0 0) (1 0) (2 1) (1 1)) ((1 0) (0 1) (0 2) (1 1)) ((0 0) (1 0) (2 1) (1 1))) ;S + (((0 0) (0 1) (1 2) (1 1)) ((1 0) (0 1) (2 0) (1 1)) ((0 0) (0 1) (1 2) (1 1)) ((1 0) (0 1) (2 0) (1 1))) ;Z + (((0 0) (0 1) (1 0) (1 1)) ((0 0) (0 1) (1 0) (1 1)) ((0 0) (0 1) (1 0) (1 1)) ((0 0) (0 1) (1 0) (1 1))) ;O + (((0 0) (0 1) (0 2) (0 3)) ((0 0) (1 0) (2 0) (3 0)) ((0 0) (0 1) (0 2) (0 3)) ((0 0) (1 0) (2 0) (3 0)))));I + + (position '(0 3)) + (orientation 0) + (style 0) + (piece (nth orientation (nth style pieces)))) + + (labels (;; check whether we left the board. + (boundary-crossed-p (piece position) + (loop + for i in piece + for j = (mapcar #'+ i position) + do + (when (or (> (cadr j) 9) (< (cadr j) 0)) + (return t)))) + + (bottom-reached-p (piece position) + (loop + for i in piece + for j = (mapcar #'+ i position) + do + (when (> (car j) 19) + (return t)))) + + ;; check whether the piece coordinates are non-nil on the board. + (collision-occured-p (board piece position) + (loop + for i in piece + for j = (mapcar #'+ i position) + do + (when (aref board (car j) (cadr j)) + (return t)))) + + (move-permissible-p (board piece next-position) + (not (or (boundary-crossed-p piece next-position) + (bottom-reached-p piece next-position) + (collision-occured-p board piece next-position)))) + + (add-new-piece () + (setf style (random 7)) + (setf orientation 0) + (setf piece (elt (elt pieces style) 0)) + (setf position '(0 3))) + + ;; add piece to board. + (update-board () + (loop + for i in piece + for j = (mapcar #'+ i position) + do + (setf (aref board (car j) (cadr j)) t))) + + (remove-line (board m) + (loop for i from m above 0 do + (loop for j from 0 to 9 do + (setf (aref board i j) (aref board (1- i) j))))) + + ;; find geht nicht, wir muessen checken ob _alle_ t sind. + (remove-complete-lines () + (loop for i from 0 to 19 do + (when (every #'identity (loop for j from 0 to 9 for y = (aref board i j) collect y)) + (remove-line board i)))) + + (draw-board-and-piece () + ;; first, draw the board + (loop for line from 0 to 19 do + (loop for column from 0 to 9 do + (move scr line column) + (if (aref board line column) + (princ "x" scr) + (princ "_" scr)))) + ;; add coord of position to every coord of piece + ;; then draw the piece + (loop + for i in piece + for j = (mapcar #'+ i position) + do + (move scr (car j) (cadr j)) + (princ "x" scr)) + (refresh scr)) + + ;; down #c(-1 0), left #c(-1 0), right #c(1 0) + (move-piece (direction) + (let ((next-position (list (- (car position) (imagpart direction)) + (+ (cadr position) (realpart direction))))) + (if (move-permissible-p board piece next-position) + (setf position next-position) + ;; when sideways move not permissible: do nothing. + ;; when downwards move not permissible: add piece to board, start new piece. + (unless (zerop (imagpart direction)) + (update-board) + (remove-complete-lines) + (add-new-piece)))) + (draw-board-and-piece)) + + (rotate-piece () + (let ((next-piece (elt (elt pieces style) (mod (+ orientation 1) 4)))) + (when (move-permissible-p board next-piece position) + (setf orientation (mod (+ orientation 1) 4)) + (setf piece (elt (elt pieces style) orientation)) + (draw-board-and-piece)))) + + (drop-piece () + (loop + (let ((next-position (list (1+ (car position)) (cadr position)))) + (if (move-permissible-p board piece next-position) + (setf position next-position) + (return)))) + (update-board) + (remove-complete-lines) + (add-new-piece) + (draw-board-and-piece))) + + ;; clear screen before starting. + (clear scr) + (refresh scr) + + ;; navigate with the arrow keys, q to quit. + (loop + (let ((event (get-event scr))) + (if event + (case event + (:up (rotate-piece)) + (:down (drop-piece)) + (:right (move-piece #c(1 0))) + (:left (move-piece #c(-1 0))) + (#\q (return))) + (progn + (move-piece #c(0 -1)) + (sleep 0.3))))))) + + ;; cleanly close ncurses at the end. + (close scr)))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/test/unicode.lisp b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/test/unicode.lisp new file mode 100644 index 0000000..decbb04 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/test/unicode.lisp @@ -0,0 +1,116 @@ +(in-package :de.anvi.croatoan.test) + +;; Tested in xterm and Gnome Terminal. +;; Doesn't work in the Linux console and aterm. + +;; Unicode strings are supported by the default non-unicode ncurses API (addstr) as long as libncursesw is used. +;; Special wide-char string functions (addwstr, add_wchstr) do not have to be used. +(defun ut01 () + (%initscr) + + (%mvaddstr 2 2 "ÄÄććššđđžž") + (%mvaddstr 4 6 "öäüüüßß") + (%mvaddstr 6 8 "Без муки нет науки - no pain, no gain") + (%mvaddstr 8 10 "指鹿為馬 - point deer, make horse") + (%mvaddstr 10 12 "μολὼν λαβέ / ΜΟΛΩΠΛΑΒΕ - come and get it") + + (%refresh) + (%getch) + (%endwin)) + +;; For displaying single unicode chars, addch functions do not work, and we have to use add_wch explicitly. +;; The data type also changes, from the integral chtype for addch, to the cchar_t struct for add_wch. +;; Use the cchar type for convert-to-foreign via a plist. +;; cchar-chars isnt a pointer to an integer array here, but an integer. +(defun ut02 () + (let ((scr (%initscr))) + + ;; %add-wch + ;; Add #\CYRILLIC_SMALL_LETTER_SHA = #\ш to the stdscr. + (with-foreign-object (ptr '(:struct cchar)) + (setf ptr (convert-to-foreign (list 'cchar-attr 0 'cchar-chars (char-code #\ш)) + '(:struct cchar))) + (%add-wch ptr)) + + ;; %wadd-wch + ;; #\CYRILLIC_CAPITAL_LETTER_LJE = #\Љ + (with-foreign-object (ptr '(:struct cchar)) + (setf ptr (convert-to-foreign (list 'cchar-attr #x00020000 'cchar-chars (char-code #\Љ)) + '(:struct cchar))) + (%wadd-wch scr ptr)) + + (%wrefresh scr) + (%wgetch scr) + (%endwin))) + +(defun ut02b () + (let ((scr (%initscr))) + (%start-color) + (%init-pair 1 1 3) ; red(1) on yellow(3) + + ;; %wadd-wch + ;; #\CYRILLIC_CAPITAL_LETTER_LJE = #\Љ + (with-foreign-object (ptr '(:struct cchar_t)) + ;; 2 is the attribute, 1 is the color pair, the color doesnt work with convert-to-foreign + ;;(setf ptr (convert-to-foreign (list 'cchar-attr #x00020100 'cchar-chars (char-code #\Љ) 'cchar-colors 1) + ;; '(:struct cchar_t))) + + ;; we have to set each slot manually in order to make the extended colors work. + (setf (foreign-slot-value ptr '(:struct cchar_t) 'cchar-attr) #x00020100) + (setf (foreign-slot-value ptr '(:struct cchar_t) 'cchar-colors) 1) + ;; also with cchar_t, we can not use convert to foreign at all, but have to manually add the char + ;; at the first place in the char array. + (setf (mem-aref + (foreign-slot-pointer ptr '(:struct cchar_t) 'cchar-chars) + 'wchar_t + 0) + (char-code #\Љ)) + (%wadd-wch scr ptr)) + + (%wrefresh scr) + (%wgetch scr) + (%endwin))) + +;; We do not need special "wide character" functions for displaying single UTF-8 characters. +;; We can just use the string output function %waddstr. +;; Here, the underlying %waddstr powers the gray stream interface displaying UTF-8. +(defun ut03 () + (with-screen (scr) + ;; Even though we have a control STRING, format still writes the char + ;; arguments char by char with write-char. + (format scr "~C ~A" #\Љ #\ш) + (terpri scr) + (format scr "Без муки нет науки") + (terpri scr) + (format scr "指鹿為馬") + (terpri scr) + (format scr "μολὼν λαβέ / ΜΟΛΩΠΛΑΒΕ") + (terpri scr) + (refresh scr) + (get-char scr))) + +;; Use the cchar_t type for setcchar. +;; cchar-chars is a pointer to an integer array here, like the C prototype requires. +(defun ut04 () + (let ((scr (%initscr))) + (%start-color) + ;; Initialize color pair 1, yellow 3 on red 1. + (%init-pair 1 3 1) + + (with-foreign-objects ((ptr '(:struct cchar_t)) + (wch 'wchar_t 5)) + ;; Reset the wch array to zero. + (dotimes (i 5) (setf (mem-aref wch 'wchar_t i) 0)) + (setf (mem-aref wch 'wchar_t) (char-code #\ш)) + ;; Create a cchar_t containing #\ш, attribute underline, color pair yellow on red. + (%setcchar ptr wch #x00020000 1 (null-pointer)) + (%wadd-wch scr ptr) + (%waddch scr (char-code #\newline)) + ;; Take a look at the plist convert-from-foreign returns from cchar_t. + ;; Sadly that plist cant be read back because it contains a pointer. + ;; As of now, the convert-to-foreign function requires foreign values, not pointers. + (%waddstr scr (princ-to-string (convert-from-foreign ptr '(:struct cchar))))) + + (%wrefresh scr) + (%wgetch scr) + (%endwin))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/.travis.yml b/sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/.travis.yml new file mode 100644 index 0000000..d9cdf8a --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/.travis.yml @@ -0,0 +1,30 @@ +language: lisp + +env: + matrix: + # - LISP=abcl + # - LISP=allegro + - LISP=sbcl + - LISP=sbcl32 + - LISP=ccl + - LISP=ccl32 + - LISP=clisp + - LISP=clisp32 + # - LISP=cmucl + - LISP=ecl + +matrix: + allow_failures: + - env: LISP=ecl + +install: + - curl -L https://github.com/luismbo/cl-travis/raw/master/install.sh | sh + - if [ "${LISP:(-2)}" = "32" ]; then + sudo apt-get install libc6-dev-i386; + fi + +script: + - cl -e '(ql:quickload :cffi-grovel) + (ql:quickload :trivial-features-tests) + (unless (trivial-features-tests:run) + (uiop:quit 1))' diff --git a/sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/COPYRIGHT b/sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/COPYRIGHT new file mode 100644 index 0000000..c79d81b --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/COPYRIGHT @@ -0,0 +1,21 @@ +Copyright (C) 2007, Luis Oliveira + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, copy, +modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. diff --git a/sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/README.md b/sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/README.md new file mode 100644 index 0000000..4ef33d9 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/README.md @@ -0,0 +1,32 @@ +[![Build Status](https://travis-ci.org/trivial-features/trivial-features.svg?branch=master)](https://travis-ci.org/trivial-features/trivial-features) + +trivial-features ensures consistent `*FEATURES*` across multiple +Common Lisp implementations. + +For example, on MacOS X platforms, while most Lisps push `:DARWIN` to +`*FEATURES*`, CLISP and Allegro push `:MACOS` and `:MACOSX` instead, +respectively. Some Lisps might not push any feature suggesting MacOS +X at all. trivial-features will make sure all Lisps will have +`:DARWIN` in the `*FEATURES*` list when running on MacOS X. This +way, you can write + + #+darwin foo #-darwin bar + +instead of + + #+(or darwin macos macosx) foo + #-(or darwin macos macosx) bar + +The included [SPEC.md][1] document describes the set of symbols that +should or should not be present in `CL:*FEATURES*` on certain +circumstances. This specification is implemented by the +TRIVIAL-FEATURES system which supports a handful of Lisps. + +The test suite is, in effect, an implementation using [CFFI][2] that +is checked against the various implementations in `src/tf-*.lisp`. + +trivial-features is MIT-licenced. + + +[1]: https://github.com/trivial-features/trivial-features/blob/master/SPEC.md +[2]: http://common-lisp.net/project/cffi diff --git a/sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/SPEC.md b/sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/SPEC.md new file mode 100644 index 0000000..3dde464 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/SPEC.md @@ -0,0 +1,86 @@ +TRIVIAL-FEATURES +================ + +This is a first *draft* of a description of what symbols should be +present in `CL:*FEATURES*` for various platforms. A possible future +direction of this documentation might be a CDR document, if it turns +out to be a good idea. (Making the language of this document much +more precise will be necessary then.) + +We will start by limiting ourselves to OS, CPU and endianness features +on Windows and POSIX platforms. + +There are various possible implementation strategies ranging from null +implementations (when the host Lisp already pushes the wanted feature) +to using FFI (e.g. calling uname() to grab system information. + + +Specification +------------- + +### ENDIANNESS + +Either `:LITTLE-ENDIAN` or `:BIG-ENDIAN` should present in +`\*FEATURES\*`. For the time being, we will not concern ourselves +with other orderings, switchable endianness, etc. + + +### OPERATING SYSTEM + +On Windows, `:WINDOWS` should be present in `*FEATURES*`. + +On POSIX systems, the "sysname" information from uname(3) should be +used to push the appropriate symbol to `*FEATURES*` by upcasing that +string (or downcasing for the "modern" lisps) and interning it in the +keyword package. + +Examples: + + - `:DARWIN` + - `:LINUX` + - `:NETBSD` + - `:OPENBSD` + - `:FREEBSD` + +For convenience, `:UNIX` should be pushed when running on +POSIX/UNIX-like operating system (that doesn't include Windows) and +`:BSD` should be present when running on BSD-based systems (that +includes Darwin) + +[add `:MACH` too?] + + +### CPU + +These features should be mutually exclusive: + + - `:X86` + - `:X86-64` + - `:PPC` + - `:PPC64` + - `:MIPS` + - `:ALPHA` + - `:SPARC` + - `:SPARC64` + - `:HPPA` + - `:HPPA64` + +[add more ...] + +[note: it's debatable whether `:X86` shouldn't also be exported on +x86-64, and `:PPC` on ppc64. SBCL doesn't. Other ways +to handle, for example, the x86/x86-64 case would be to export +something like `:PC386` in both cases or have an additional `:X86-32`. Or +finally, have just `:X86`, `:PPC`, etc, and add `:32-BIT-CPU` and +`:64-BIT-CPU` features.] + + +Unreferenced References +----------------------- + + * [CLHS: Variable \*FEATURES\*][1] + * [Maintaining Portable Lisp Programs][2], by Christophe Rhodes + + +[1]: http://www.lispworks.com/documentation/HyperSpec/Body/v_featur.htm +[2]: http://www-jcsu.jesus.cam.ac.uk/~csr21/papers/features.pdf diff --git a/sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/release.lisp b/sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/release.lisp new file mode 100644 index 0000000..8997438 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/release.lisp @@ -0,0 +1,247 @@ +#!/usr/bin/env clisp +;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- + +(defpackage :release-script (:use #:cl #:regexp)) +(in-package :release-script) + +;;;; Configuration ------------------------------------------------------------ + +(defparameter *project-name* "trivial-features") +(defparameter *asdf-file* (format nil "~A.asd" *project-name*)) + +(defparameter *host* "common-lisp.net") +(defparameter *release-dir* + (format nil "public_html/tarballs/~A/" *project-name*)) + +(defparameter *version-file* nil) +(defparameter *version-file-dir* nil) + +;;;; -------------------------------------------------------------------------- + +;;;; Utilities + +(defun ensure-list (x) + (if (listp x) x (list x))) + +(defmacro string-case (expression &body clauses) + `(let ((it ,expression)) ; yes, anaphoric, deal with it. + (cond + ,@(loop for clause in clauses collect + `((or ,@(loop for alternative in (ensure-list (first clause)) + collect (or (eq t alternative) + `(string= it ,alternative)))) + ,@(rest clause)))))) + +(defparameter *development-mode* t) + +(defun die (format-control &rest format-args) + (format *error-output* "~?" format-control format-args) + (if *development-mode* + (cerror "continue" "die") + (ext:quit 1))) + +(defun numeric-split (string) + (if (digit-char-p (char string 0)) + (multiple-value-bind (number next-position) + (parse-integer string :junk-allowed t) + (cons number (when (< next-position (length string)) + (numeric-split (subseq string next-position))))) + (let ((next-digit-position (position-if #'digit-char-p string))) + (if next-digit-position + (cons (subseq string 0 next-digit-position) + (numeric-split (subseq string next-digit-position))) + (list string))))) + +(defun natural-string-< (s1 s2) + (labels ((aux< (l1 l2) + (cond ((null l1) (not (null l2))) + ((null l2) nil) + (t (destructuring-bind (x . xs) l1 + (destructuring-bind (y . ys) l2 + (cond ((and (numberp x) (stringp y)) + t) + ((and (numberp y) (stringp x)) + nil) + ((and (numberp x) (numberp y)) + (or (< x y) (and (= x y) (aux< xs ys)))) + (t + (or (string-lessp x y) + (and (string-equal x y) + (aux< xs ys))))))))))) + (aux< (numeric-split s1) + (numeric-split s2)))) + +;;;; Running commands + +(defparameter *dry-run* nil) + +(defun cmd? (format-control &rest format-args) + (let ((cmd (format nil "~?" format-control format-args))) + (with-open-stream (s1 (ext:run-shell-command cmd :output :stream)) + (loop for line = (read-line s1 nil nil) + while line + collect line)))) + +;; XXX: quote arguments. +(defun cmd (format-control &rest format-args) + (when *development-mode* + (format *debug-io* "CMD: ~?~%" format-control format-args)) + (let ((ret (ext:run-shell-command (format nil "~?" format-control format-args)))) + (or (null ret) + (zerop ret)))) + +(defun cmd! (format-control &rest format-args) + (or (apply #'cmd format-control format-args) + (die "cmd '~?' failed." format-control format-args))) + +(defun maybe-cmd! (format-control &rest format-args) + (if *dry-run* + (format t "SUPPRESSING: ~?~%" format-control format-args) + (apply #'cmd! format-control format-args))) + +;;;; + +(defun find-current-version () + (subseq (reduce (lambda (x y) (if (natural-string-< x y) y x)) + (cmd? "git tag -l v\\*")) + 1)) + +(defun parse-version (string) + (mapcar (lambda (x) + (parse-integer x :junk-allowed t)) + (loop repeat 3 ; XXX: parameterize + for el in (regexp-split "\\." (find-current-version)) + collect el))) + +(defun check-for-unrecorded-changes (&optional force) + (unless (cmd "git diff --exit-code") + (write-line "Unrecorded changes.") + (if force + (write-line "Continuing anyway.") + (die "Aborting.~@ + Use -f or --force if you want to make a release anyway.")))) + +(defun new-version-number-candidates (current-version) + (let ((current-version (parse-version current-version))) + (labels ((alternatives (before after) + (when after + (cons (append before (list (1+ (first after))) + (mapcar (constantly 0) (rest after))) + (alternatives (append before (list (first after))) + (rest after)))))) + (loop for alt in (alternatives nil current-version) + collect (reduce (lambda (acc next) + (format nil "~a.~a" acc next)) + alt))))) + +(defun ask-user-for-version (current-version next-versions) + (format *query-io* "Current version is ~A. Which will be the next one?~%" + current-version) + (loop for i from 1 and version in next-versions + do (format *query-io* "~T~A) ~A~%" i version)) + (format *query-io* "? ") + (finish-output *query-io*) + (nth (1- (parse-integer (read-line) :junk-allowed t)) + next-versions)) + +(defun git-tag-tree (version) + (write-line "Tagging the tree...") + (maybe-cmd! "git tag \"v~A\"" version)) + +(defun add-version-to-system-file (version path-in path-out) + (with-open-file (in path-in :direction :input) + (with-open-file (out path-out :direction :output) + (loop for line = (read-line in nil nil) while line + do (write-line line out) + when (string= #1="(defsystem " line + :end2 (min (length #1#) (length line))) + do (format out " :version ~s~%" version))))) + +(defun create-dist (version distname) + (write-line "Creating distribution...") + (cmd! "mkdir \"~a\"" distname) + (cmd! "git archive master | tar xC \"~A\"" distname) + (format t "Updating ~A with new version: ~A~%" *asdf-file* version) + (let* ((asdf-file-path (format nil "~A/~A" distname *asdf-file*)) + (tmp-asdf-file-path (format nil "~a.tmp" asdf-file-path))) + (add-version-to-system-file version asdf-file-path tmp-asdf-file-path) + (cmd! "mv \"~a\" \"~a\"" tmp-asdf-file-path asdf-file-path))) + +(defun tar-and-sign (distname tarball) + (write-line "Creating and signing tarball...") + (cmd! "tar czf \"~a\" \"~a\"" tarball distname) + (cmd! "gpg -b -a \"~a\"" tarball)) + +(defparameter *remote-directory* (format nil "~A:~A" *host* *release-dir*)) + +(defun upload-tarball (tarball signature remote-directory) + (write-line "Copying tarball to web server...") + (maybe-cmd! "scp \"~A\" \"~A\" \"~A\"" tarball signature remote-directory) + (format t "Uploaded ~A and ~A.~%" tarball signature)) + +(defun update-remote-links (tarball signature host release-dir project-name) + (format t "Updating ~A_latest links...~%" project-name) + (maybe-cmd! "ssh \"~A\" ln -sf \"~A\" \"~A/~A_latest.tar.gz\"" + host tarball release-dir project-name) + (maybe-cmd! "ssh \"~A\" ln -sf \"~A\" \"~A/~A_latest.tar.gz.asc\"" + host signature release-dir project-name)) + +(defun upload-version-file (version version-file host version-file-dir) + (format t "Uploading ~A...~%" version-file) + (maybe-cmd! "echo -n \"~A\" > \"~A\"" version version-file) + (maybe-cmd! "scp \"~A\" \"~A\":\"~A\"" version-file host version-file-dir) + (maybe-cmd! "rm \"~A\"" version-file)) + +(defun maybe-clean-things-up (tarball signature) + (when (y-or-n-p "Clean local tarball and signature?") + (cmd! "rm \"~A\" \"~A\"" tarball signature))) + +(defun run (force version) + (check-for-unrecorded-changes force) + ;; figure out what version we'll be preparing. + (unless version + (let* ((current-version (find-current-version)) + (next-versions (new-version-number-candidates current-version))) + (setf version (or (ask-user-for-version current-version next-versions) + (die "invalid selection."))))) + (git-tag-tree version) + (let* ((distname (format nil "~A_~A" *project-name* version)) + (tarball (format nil "~A.tar.gz" distname)) + (signature (format nil "~A.asc" tarball))) + ;; package things up. + (create-dist version distname) + (tar-and-sign distname tarball) + ;; upload. + (upload-tarball tarball signature *remote-directory*) + (update-remote-links tarball signature *host* *release-dir* *project-name*) + (when *version-file* + (upload-version-file version *version-file* *host* *version-file-dir*)) + ;; clean up. + (maybe-clean-things-up tarball signature) + ;; documentation. + ;; (write-line "Building and uploading documentation...") + ;; (maybe-cmd! "make -C doc upload-docs") + ;; push tags and any outstanding changes. + (write-line "Pushing tags and changes...") + (maybe-cmd! "git push --tags origin master"))) + + +;;;; Do it to it + +(let ((force nil) + (version nil) + (args ext:*args*)) + (loop while args + do (string-case (pop args) + (("-h" "--help") + (write-line "No help, sorry. Read the source.") + (ext:quit 0)) + (("-f" "--force") + (setf force t)) + (("-v" "--version") + (setf version (pop args))) + (("-n" "--dry-run") + (setf *dry-run* t)) + (t + (die "Unrecognized argument '~a'" it)))) + (run force version)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/src/tf-abcl.lisp b/sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/src/tf-abcl.lisp new file mode 100644 index 0000000..b570756 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/src/tf-abcl.lisp @@ -0,0 +1,46 @@ +;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- +;;; +;;; tf-abcl.lisp --- ABCL trivial-features implementation. +;;; +;;; Copyright (C) 2009, Luis Oliveira +;;; +;;; Permission is hereby granted, free of charge, to any person +;;; obtaining a copy of this software and associated documentation +;;; files (the "Software"), to deal in the Software without +;;; restriction, including without limitation the rights to use, copy, +;;; modify, merge, publish, distribute, sublicense, and/or sell copies +;;; of the Software, and to permit persons to whom the Software is +;;; furnished to do so, subject to the following conditions: +;;; +;;; The above copyright notice and this permission notice shall be +;;; included in all copies or substantial portions of the Software. +;;; +;;; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +;;; EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +;;; MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +;;; NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +;;; HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +;;; WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +;;; OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +;;; DEALINGS IN THE SOFTWARE. + +(in-package :cl-user) + +;;;; Endianness + +(pushnew (let ((order (jcall "toString" + (jstatic "nativeOrder" "java.nio.ByteOrder")))) + (cond ((string-equal order "LITTLE_ENDIAN") + :little-endian) + ((string-equal order "BIG_ENDIAN") + :big-endian) + (t (error "Byte order ~A unknown" order)))) + *features*) + +;;;; OS + +;;; ABCL already pushes :LINUX and :UNIX. + +;;;; CPU + +;;; ABCL already pushes :x86-64 \ No newline at end of file diff --git a/sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/src/tf-allegro.lisp b/sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/src/tf-allegro.lisp new file mode 100644 index 0000000..40984d8 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/src/tf-allegro.lisp @@ -0,0 +1,49 @@ +;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- +;;; +;;; tf-allegro.lisp --- Allegro implementation of trivial-features. +;;; +;;; Copyright (C) 2007, Luis Oliveira +;;; +;;; Permission is hereby granted, free of charge, to any person +;;; obtaining a copy of this software and associated documentation +;;; files (the "Software"), to deal in the Software without +;;; restriction, including without limitation the rights to use, copy, +;;; modify, merge, publish, distribute, sublicense, and/or sell copies +;;; of the Software, and to permit persons to whom the Software is +;;; furnished to do so, subject to the following conditions: +;;; +;;; The above copyright notice and this permission notice shall be +;;; included in all copies or substantial portions of the Software. +;;; +;;; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +;;; EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +;;; MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +;;; NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +;;; HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +;;; WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +;;; OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +;;; DEALINGS IN THE SOFTWARE. + +(in-package :cl-user) + +;;;; Endianness + +;;; Allegro already pushes :LITTLE-ENDIAN and :BIG-ENDIAN. + +;;;; OS + +;;; Allegro already pushes :LINUX and :UNIX. + +#+mswindows (pushnew :windows *features*) +#+macosx (pushnew :darwin *features*) + +;;; Pushing :BSD. (Make sure this list is complete.) +#+(or macosx darwin freebsd netbsd openbsd) +(pushnew :bsd *features*) + +;;;; CPU + +;;; Allegro already pushes :X86 and :X86-64. + +;;; what about PPC64? +#+powerpc (pushnew :ppc *features*) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/src/tf-clasp.lisp b/sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/src/tf-clasp.lisp new file mode 100644 index 0000000..d12bf70 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/src/tf-clasp.lisp @@ -0,0 +1,36 @@ +;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- +;;; +;;; tf-clasp.lisp --- CLASP implementation of trivial-features. +;;; +;;; Permission is hereby granted, free of charge, to any person +;;; obtaining a copy of this software and associated documentation +;;; files (the "Software"), to deal in the Software without +;;; restriction, including without limitation the rights to use, copy, +;;; modify, merge, publish, distribute, sublicense, and/or sell copies +;;; of the Software, and to permit persons to whom the Software is +;;; furnished to do so, subject to the following conditions: +;;; +;;; The above copyright notice and this permission notice shall be +;;; included in all copies or substantial portions of the Software. +;;; +;;; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +;;; EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +;;; MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +;;; NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +;;; HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +;;; WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +;;; OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +;;; DEALINGS IN THE SOFTWARE. + +(in-package :cl-user) + +;;;; Endianness +;;; - Set by CLASP directly. Sets :LITTLE-ENDIAN or :BIG-ENDIAN + +;;;; OS +;;; - Set by CLASP directly. Already pushes :DARWIN, :LINUX, :UNIX, :BSD + +;;;; CPU +;;; - Set by CLASP directly. Already pushes :X86-64 (currently the only +;;; supported platform) - More will be added directly in CLASP as soon as +;;; porting is done. diff --git a/sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/src/tf-clisp.lisp b/sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/src/tf-clisp.lisp new file mode 100644 index 0000000..1b4443d --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/src/tf-clisp.lisp @@ -0,0 +1,72 @@ +;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- +;;; +;;; tf-clisp.lisp --- CLISP trivial-features implementation. +;;; +;;; Copyright (C) 2007, Luis Oliveira +;;; +;;; Permission is hereby granted, free of charge, to any person +;;; obtaining a copy of this software and associated documentation +;;; files (the "Software"), to deal in the Software without +;;; restriction, including without limitation the rights to use, copy, +;;; modify, merge, publish, distribute, sublicense, and/or sell copies +;;; of the Software, and to permit persons to whom the Software is +;;; furnished to do so, subject to the following conditions: +;;; +;;; The above copyright notice and this permission notice shall be +;;; included in all copies or substantial portions of the Software. +;;; +;;; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +;;; EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +;;; MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +;;; NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +;;; HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +;;; WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +;;; OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +;;; DEALINGS IN THE SOFTWARE. + +(in-package :cl-user) + +;;;; Endianness + +(pushnew (intern (symbol-name (if sys::*big-endian* + '#:big-endian + '#:little-endian)) + '#:keyword) + *features*) + +;;;; OS + +;;; CLISP already exports :UNIX. + +#+win32 (pushnew :windows *features*) + +#-win32 +(eval-when (:compile-toplevel :load-toplevel :execute) + (pushnew (with-standard-io-syntax + (read-from-string + (format nil ":~(~A~)" (posix:uname-sysname (posix:uname))))) + *features*)) + +#+(or darwin freebsd netbsd openbsd) +(pushnew :bsd *features*) + +;;;; CPU + +;;; FIXME: not complete +(let ((cpu (cond + ((or (member :pc386 *features*) + (member (machine-type) '("x86" "x86_64") + :test #'string-equal)) + (if (member :word-size=64 *features*) + '#:x86-64 + '#:x86)) + ((string= (machine-type) "POWER MACINTOSH") + '#:ppc) + ((or (member (machine-type) '("SPARC" "SPARC64") + :test #'string-equal)) + (if (member :word-size=64 *features*) + '#:sparc64 + '#:sparc))))) + (when cpu + (pushnew (intern (symbol-name cpu) '#:keyword) + *features*))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/src/tf-cmucl.lisp b/sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/src/tf-cmucl.lisp new file mode 100644 index 0000000..ac3adc0 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/src/tf-cmucl.lisp @@ -0,0 +1,44 @@ +;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- +;;; +;;; tf-cmucl.lisp --- CMUCL implementation of trivial-features. +;;; +;;; Copyright (C) 2007, Luis Oliveira +;;; +;;; Permission is hereby granted, free of charge, to any person +;;; obtaining a copy of this software and associated documentation +;;; files (the "Software"), to deal in the Software without +;;; restriction, including without limitation the rights to use, copy, +;;; modify, merge, publish, distribute, sublicense, and/or sell copies +;;; of the Software, and to permit persons to whom the Software is +;;; furnished to do so, subject to the following conditions: +;;; +;;; The above copyright notice and this permission notice shall be +;;; included in all copies or substantial portions of the Software. +;;; +;;; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +;;; EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +;;; MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +;;; NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +;;; HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +;;; WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +;;; OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +;;; DEALINGS IN THE SOFTWARE. + +(in-package :cl-user) + +;;;; Endianness + +(pushnew (alien:with-alien ((ptr (array (alien:unsigned 8) 2))) + (setf (sys:sap-ref-16 (alien:alien-sap ptr) 0) #xfeff) + (ecase (sys:sap-ref-8 (alien:alien-sap ptr) 0) + (#xfe (intern "BIG-ENDIAN" :keyword)) + (#xff (intern "LITTLE-ENDIAN" :keyword)))) + *features*) + +;;;; OS + +;;; CMUCL already pushes :UNIX, :BSD, :LINUX and :DARWIN. + +;;;; CPU + +;;; CMUCL already pushes :PPC and :X86. diff --git a/sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/src/tf-corman.lisp b/sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/src/tf-corman.lisp new file mode 100644 index 0000000..f66a6fe --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/src/tf-corman.lisp @@ -0,0 +1,39 @@ +;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- +;;; +;;; tf-corman.lisp --- Corman Lisp implementation of trivial-features. +;;; +;;; Copyright (C) 2007, Luis Oliveira +;;; +;;; Permission is hereby granted, free of charge, to any person +;;; obtaining a copy of this software and associated documentation +;;; files (the "Software"), to deal in the Software without +;;; restriction, including without limitation the rights to use, copy, +;;; modify, merge, publish, distribute, sublicense, and/or sell copies +;;; of the Software, and to permit persons to whom the Software is +;;; furnished to do so, subject to the following conditions: +;;; +;;; The above copyright notice and this permission notice shall be +;;; included in all copies or substantial portions of the Software. +;;; +;;; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +;;; EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +;;; MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +;;; NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +;;; HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +;;; WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +;;; OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +;;; DEALINGS IN THE SOFTWARE. + +(in-package :cl-user) + +;;;; Endianness + +(pushnew :little-endian *features*) + +;;;; OS + +(pushnew :windows *features*) + +;;;; CPU + +(pushnew :x86 *features*) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/src/tf-ecl.lisp b/sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/src/tf-ecl.lisp new file mode 100644 index 0000000..8dc26e9 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/src/tf-ecl.lisp @@ -0,0 +1,55 @@ +;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- +;;; +;;; tf-ecl.lisp --- ECL implementation of trivial-features. +;;; +;;; Copyright (C) 2007-2009, Luis Oliveira +;;; +;;; Permission is hereby granted, free of charge, to any person +;;; obtaining a copy of this software and associated documentation +;;; files (the "Software"), to deal in the Software without +;;; restriction, including without limitation the rights to use, copy, +;;; modify, merge, publish, distribute, sublicense, and/or sell copies +;;; of the Software, and to permit persons to whom the Software is +;;; furnished to do so, subject to the following conditions: +;;; +;;; The above copyright notice and this permission notice shall be +;;; included in all copies or substantial portions of the Software. +;;; +;;; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +;;; EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +;;; MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +;;; NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +;;; HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +;;; WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +;;; OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +;;; DEALINGS IN THE SOFTWARE. + +(in-package :cl-user) + +;;;; Endianness + +(pushnew (let ((ptr (ffi:allocate-foreign-object :unsigned-short))) + (unwind-protect + (progn + (setf (ffi:deref-pointer ptr :unsigned-short) #xfeff) + (ecase (ffi:deref-pointer ptr :unsigned-byte) + (#xfe (intern "BIG-ENDIAN" "KEYWORD")) + (#xff (intern "LITTLE-ENDIAN" "KEYWORD")))) + (ffi:free-foreign-object ptr))) + *features*) + +;;;; OS + +;;; ECL already pushes :DARWIN, :LINUX, :UNIX (except on Darwin) and :BSD. + +#+darwin (pushnew :unix *features*) +#+win32 (pushnew :windows *features*) + +;;;; CPU + +;;; FIXME: add more +#+powerpc7450 (pushnew :ppc *features*) +#+x86_64 (pushnew :x86-64 *features*) +#+(or i386 i486 i586 i686) (pushnew :x86 *features*) +#+(or armv5l armv6l armv7l) (pushnew :arm *features*) +#+mipsel (pushnew :mips *features*) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/src/tf-lispworks.lisp b/sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/src/tf-lispworks.lisp new file mode 100644 index 0000000..ce2fae2 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/src/tf-lispworks.lisp @@ -0,0 +1,58 @@ +;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- +;;; +;;; tf-lispworks.lisp --- Lispworks implementation of trivial-features. +;;; +;;; Copyright (C) 2007, Luis Oliveira +;;; +;;; Permission is hereby granted, free of charge, to any person +;;; obtaining a copy of this software and associated documentation +;;; files (the "Software"), to deal in the Software without +;;; restriction, including without limitation the rights to use, copy, +;;; modify, merge, publish, distribute, sublicense, and/or sell copies +;;; of the Software, and to permit persons to whom the Software is +;;; furnished to do so, subject to the following conditions: +;;; +;;; The above copyright notice and this permission notice shall be +;;; included in all copies or substantial portions of the Software. +;;; +;;; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +;;; EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +;;; MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +;;; NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +;;; HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +;;; WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +;;; OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +;;; DEALINGS IN THE SOFTWARE. + +(in-package :cl-user) + +;;;; Endianness + +;;; Lispworks pushes :LITTLE-ENDIAN. + +#-little-endian (pushnew :big-endian *features*) + +#-(and) +(pushnew (fli:with-dynamic-foreign-objects () + (let ((ptr (fli:alloca :type :byte :nelems 2))) + (setf (fli:dereference ptr :type '(:unsigned :short)) #xfeff) + (ecase (fli:dereference ptr :type '(:unsigned :byte)) + (#xfe (intern "BIG-ENDIAN" :keyword)) + (#xff (intern "LITTLE-ENDIAN" :keyword))))) + *features*) + +;;;; OS + +;;; Lispworks already pushes :DARWIN, :LINUX and :UNIX. + +#+win32 (pushnew :windows *features*) + +;;; Pushing :BSD. (Make sure this list is complete.) +#+(or darwin freebsd netbsd openbsd) +(pushnew :bsd *features*) + +;;;; CPU + +;;; Lispworks already pushes :X86. + +#+powerpc (pushnew :ppc *features*) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/src/tf-mcl.lisp b/sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/src/tf-mcl.lisp new file mode 100644 index 0000000..5f1a0cf --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/src/tf-mcl.lisp @@ -0,0 +1,41 @@ +;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- +;;; +;;; tf-mcl.lisp --- Digitool MCL trivial-features implementation. +;;; +;;; Copyright (C) 2010, Chun Tian (binghe) +;;; +;;; Permission is hereby granted, free of charge, to any person +;;; obtaining a copy of this software and associated documentation +;;; files (the "Software"), to deal in the Software without +;;; restriction, including without limitation the rights to use, copy, +;;; modify, merge, publish, distribute, sublicense, and/or sell copies +;;; of the Software, and to permit persons to whom the Software is +;;; furnished to do so, subject to the following conditions: +;;; +;;; The above copyright notice and this permission notice shall be +;;; included in all copies or substantial portions of the Software. +;;; +;;; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +;;; EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +;;; MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +;;; NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +;;; HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +;;; WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +;;; OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +;;; DEALINGS IN THE SOFTWARE. + +(in-package :cl-user) + +;;;; Endianness + +(pushnew :big-endian *features*) + +;;;; OS + +;;; MCL already pushes :UNIX and :DARWIN. + +(pushnew :bsd *features*) + +;;;; CPU + +#+ppc-target (pushnew :ppc *features*) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/src/tf-mezzano.lisp b/sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/src/tf-mezzano.lisp new file mode 100644 index 0000000..47385d6 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/src/tf-mezzano.lisp @@ -0,0 +1,39 @@ +;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- +;;; +;;; tf-mezzano.lisp --- Mezzano trivial-features implementation. +;;; +;;; Copyright (C) 2009, Luis Oliveira +;;; +;;; Permission is hereby granted, free of charge, to any person +;;; obtaining a copy of this software and associated documentation +;;; files (the "Software"), to deal in the Software without +;;; restriction, including without limitation the rights to use, copy, +;;; modify, merge, publish, distribute, sublicense, and/or sell copies +;;; of the Software, and to permit persons to whom the Software is +;;; furnished to do so, subject to the following conditions: +;;; +;;; The above copyright notice and this permission notice shall be +;;; included in all copies or substantial portions of the Software. +;;; +;;; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +;;; EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +;;; MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +;;; NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +;;; HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +;;; WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +;;; OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +;;; DEALINGS IN THE SOFTWARE. + +(in-package :cl-user) + +;;;; Endianness + +;;; Mezzano already pushes :LITTLE-ENDIAN. + +;;;; OS + +;;; Mezzano already pushes :MEZZANO. + +;;;; CPU + +;;; Mezzano already pushes :X86-64. diff --git a/sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/src/tf-mkcl.lisp b/sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/src/tf-mkcl.lisp new file mode 100644 index 0000000..53aa635 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/src/tf-mkcl.lisp @@ -0,0 +1,49 @@ +;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- +;;; +;;; tf-mkcl.lisp --- MKCL implementation of trivial-features. +;;; +;;; Copyright (C) 2007-2009, Luis Oliveira +;;; +;;; Permission is hereby granted, free of charge, to any person +;;; obtaining a copy of this software and associated documentation +;;; files (the "Software"), to deal in the Software without +;;; restriction, including without limitation the rights to use, copy, +;;; modify, merge, publish, distribute, sublicense, and/or sell copies +;;; of the Software, and to permit persons to whom the Software is +;;; furnished to do so, subject to the following conditions: +;;; +;;; The above copyright notice and this permission notice shall be +;;; included in all copies or substantial portions of the Software. +;;; +;;; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +;;; EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +;;; MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +;;; NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +;;; HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +;;; WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +;;; OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +;;; DEALINGS IN THE SOFTWARE. + +(in-package :cl-user) + +;;;; Endianness + +#-(or :little-endian :big-endian) +(pushnew (let ((ptr (ffi:allocate-foreign-object :unsigned-short))) + (unwind-protect + (progn + (setf (ffi:deref-pointer ptr :unsigned-short) #xfeff) + (ecase (ffi:deref-pointer ptr :unsigned-byte) + (#xfe (intern "BIG-ENDIAN" "KEYWORD")) + (#xff (intern "LITTLE-ENDIAN" "KEYWORD")))) + (ffi:free-foreign-object ptr))) + *features*) + +;;;; OS + +;;; MKCL conforms to SPEC + +;;;; CPU + +;;; MKCL conforms to SPEC + diff --git a/sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/src/tf-mocl.lisp b/sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/src/tf-mocl.lisp new file mode 100644 index 0000000..adf0cea --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/src/tf-mocl.lisp @@ -0,0 +1,40 @@ +;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- +;;; +;;; tf-mocl.lisp --- MOCL trivial-features implementation. +;;; +;;; Copyright (C) 2007, Luis Oliveira +;;; +;;; Permission is hereby granted, free of charge, to any person +;;; obtaining a copy of this software and associated documentation +;;; files (the "Software"), to deal in the Software without +;;; restriction, including without limitation the rights to use, copy, +;;; modify, merge, publish, distribute, sublicense, and/or sell copies +;;; of the Software, and to permit persons to whom the Software is +;;; furnished to do so, subject to the following conditions: +;;; +;;; The above copyright notice and this permission notice shall be +;;; included in all copies or substantial portions of the Software. +;;; +;;; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +;;; EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +;;; MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +;;; NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +;;; HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +;;; WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +;;; OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +;;; DEALINGS IN THE SOFTWARE. + +(in-package :cl-user) + +;;;; Endianness + +;;; MOCL already pushes :LITTLE-ENDIAN. + +;;;; OS + +;;; MOCL already pushes :IOS, :DARWIN, :BSD, and :UNIX for iOS, +;;; and :ANDROID, :LINUX, and :UNIX for Android. + +;;;; CPU + +;;; MOCL already pushes :ARM. diff --git a/sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/src/tf-openmcl.lisp b/sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/src/tf-openmcl.lisp new file mode 100644 index 0000000..f96096f --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/src/tf-openmcl.lisp @@ -0,0 +1,47 @@ +;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- +;;; +;;; tf-openmcl.lisp --- OpenMCL trivial-features implementation. +;;; +;;; Copyright (C) 2007, Luis Oliveira +;;; +;;; Permission is hereby granted, free of charge, to any person +;;; obtaining a copy of this software and associated documentation +;;; files (the "Software"), to deal in the Software without +;;; restriction, including without limitation the rights to use, copy, +;;; modify, merge, publish, distribute, sublicense, and/or sell copies +;;; of the Software, and to permit persons to whom the Software is +;;; furnished to do so, subject to the following conditions: +;;; +;;; The above copyright notice and this permission notice shall be +;;; included in all copies or substantial portions of the Software. +;;; +;;; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +;;; EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +;;; MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +;;; NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +;;; HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +;;; WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +;;; OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +;;; DEALINGS IN THE SOFTWARE. + +(in-package :cl-user) + +;;;; Endianness + +(pushnew #+big-endian-target :big-endian + #+little-endian-target :little-endian + *features*) + +;;;; OS + +;;; OpenMCL already pushes :UNIX and :DARWIN. + +#+linux-target (pushnew :linux *features*) + +#+darwin (pushnew :bsd *features*) + +;;;; CPU + +;;; what about ppc64? +#+ppc-target (pushnew :ppc *features*) +#+x8664-target (pushnew :x86-64 *features*) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/src/tf-sbcl.lisp b/sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/src/tf-sbcl.lisp new file mode 100644 index 0000000..483d22a --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/src/tf-sbcl.lisp @@ -0,0 +1,51 @@ +;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- +;;; +;;; tf-sbcl.lisp --- SBCL trivial-features implementation. +;;; +;;; Copyright (C) 2007-2009, Luis Oliveira +;;; +;;; Permission is hereby granted, free of charge, to any person +;;; obtaining a copy of this software and associated documentation +;;; files (the "Software"), to deal in the Software without +;;; restriction, including without limitation the rights to use, copy, +;;; modify, merge, publish, distribute, sublicense, and/or sell copies +;;; of the Software, and to permit persons to whom the Software is +;;; furnished to do so, subject to the following conditions: +;;; +;;; The above copyright notice and this permission notice shall be +;;; included in all copies or substantial portions of the Software. +;;; +;;; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +;;; EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +;;; MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +;;; NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +;;; HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +;;; WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +;;; OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +;;; DEALINGS IN THE SOFTWARE. + +(in-package :cl-user) + +;;;; Endianness + +(pushnew (sb-alien:with-alien ((ptr (array (sb-alien:unsigned 8) 2))) + (setf (sb-sys:sap-ref-16 (sb-alien:alien-sap ptr) 0) #xfeff) + (ecase (sb-sys:sap-ref-8 (sb-alien:alien-sap ptr) 0) + (#xfe (intern "BIG-ENDIAN" :keyword)) + (#xff (intern "LITTLE-ENDIAN" :keyword)))) + *features*) + +;;;; OS + +;;; SBCL already pushes :DARWIN, :LINUX, :BSD and :UNIX. + +#+win32 +(progn + ;; note: as of 2008 or so, SBCL doesn't push :UNIX and :WIN32 + ;; simultaneously anymore. + (setq *features* (remove :unix *features*)) + (pushnew :windows *features*)) + +;;;; CPU + +;;; SBCL already pushes: :X86, :X86-64, and :PPC diff --git a/sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/src/tf-scl.lisp b/sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/src/tf-scl.lisp new file mode 100644 index 0000000..0455818 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/src/tf-scl.lisp @@ -0,0 +1,47 @@ +;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- +;;; +;;; tf-scl.lisp --- SCL implementation of trivial-features. +;;; +;;; Copyright (C) 2007, Luis Oliveira +;;; +;;; Permission is hereby granted, free of charge, to any person +;;; obtaining a copy of this software and associated documentation +;;; files (the "Software"), to deal in the Software without +;;; restriction, including without limitation the rights to use, copy, +;;; modify, merge, publish, distribute, sublicense, and/or sell copies +;;; of the Software, and to permit persons to whom the Software is +;;; furnished to do so, subject to the following conditions: +;;; +;;; The above copyright notice and this permission notice shall be +;;; included in all copies or substantial portions of the Software. +;;; +;;; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +;;; EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +;;; MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +;;; NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +;;; HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +;;; WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +;;; OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +;;; DEALINGS IN THE SOFTWARE. + +(in-package :cl-user) + +;;;; Endianness + +(pushnew (alien:with-alien ((ptr (array (alien:unsigned 8) 2))) + (setf (sys:sap-ref-16 (alien:alien-sap ptr) 0) #xfeff) + (ecase (sys:sap-ref-8 (alien:alien-sap ptr) 0) + (#xfe (intern (symbol-name '#:big-endian) '#:keyword)) + (#xff (intern (symbol-name '#:little-endian) '#:keyword)))) + *features*) + +;;;; OS + +;;; SCL already pushes :unix, :bsd, :linux, :hpux, and :solaris + +;;;; CPU + +;;; SCL already pushes :amd64, :x86, :sparc, :sparc64, :hppa and :hppa64. +;;; For 64 bit CPUs the SCL pushes: :64bit + +#+amd64 (pushnew :x86-64 *features*) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/src/tf-xcl.lisp b/sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/src/tf-xcl.lisp new file mode 100644 index 0000000..42aeb35 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/src/tf-xcl.lisp @@ -0,0 +1,39 @@ +;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- +;;; +;;; tf-xcl.lisp --- XCL trivial-features implementation. +;;; +;;; Copyright (C) 2009, Luis Oliveira +;;; +;;; Permission is hereby granted, free of charge, to any person +;;; obtaining a copy of this software and associated documentation +;;; files (the "Software"), to deal in the Software without +;;; restriction, including without limitation the rights to use, copy, +;;; modify, merge, publish, distribute, sublicense, and/or sell copies +;;; of the Software, and to permit persons to whom the Software is +;;; furnished to do so, subject to the following conditions: +;;; +;;; The above copyright notice and this permission notice shall be +;;; included in all copies or substantial portions of the Software. +;;; +;;; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +;;; EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +;;; MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +;;; NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +;;; HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +;;; WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +;;; OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +;;; DEALINGS IN THE SOFTWARE. + +(in-package :cl-user) + +;;;; Endianness + +;;; XCL already pushes :LITTLE-ENDIAN. + +;;;; OS + +;;; XCL already pushes :LINUX, :UNIX, :FREEBSD, :NETBSD, :BSD and :WINDOWS. + +;;;; CPU + +;;; XCL already pushes :X86 and :X86-64. diff --git a/sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/tests/package.lisp b/sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/tests/package.lisp new file mode 100644 index 0000000..1ff95b9 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/tests/package.lisp @@ -0,0 +1,34 @@ +;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- +;;; +;;; package.lisp --- TRIVIAL-FEATURES-TESTS package definition. +;;; +;;; Copyright (C) 2007, Luis Oliveira +;;; +;;; Permission is hereby granted, free of charge, to any person +;;; obtaining a copy of this software and associated documentation +;;; files (the "Software"), to deal in the Software without +;;; restriction, including without limitation the rights to use, copy, +;;; modify, merge, publish, distribute, sublicense, and/or sell copies +;;; of the Software, and to permit persons to whom the Software is +;;; furnished to do so, subject to the following conditions: +;;; +;;; The above copyright notice and this permission notice shall be +;;; included in all copies or substantial portions of the Software. +;;; +;;; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +;;; EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +;;; MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +;;; NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +;;; HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +;;; WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +;;; OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +;;; DEALINGS IN THE SOFTWARE. + +(in-package :cl-user) + +(defpackage :trivial-features-tests + (:use :common-lisp + :regression-test + :alexandria + :cffi) + (:export #:run)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/tests/sysinfo.lisp b/sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/tests/sysinfo.lisp new file mode 100644 index 0000000..989b397 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/tests/sysinfo.lisp @@ -0,0 +1,49 @@ +;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- +;;; +;;; sysinfo.lisp --- FFI definitions for GetSystemInfo(). +;;; +;;; Copyright (C) 2007, Luis Oliveira +;;; +;;; Permission is hereby granted, free of charge, to any person +;;; obtaining a copy of this software and associated documentation +;;; files (the "Software"), to deal in the Software without +;;; restriction, including without limitation the rights to use, copy, +;;; modify, merge, publish, distribute, sublicense, and/or sell copies +;;; of the Software, and to permit persons to whom the Software is +;;; furnished to do so, subject to the following conditions: +;;; +;;; The above copyright notice and this permission notice shall be +;;; included in all copies or substantial portions of the Software. +;;; +;;; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +;;; EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +;;; MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +;;; NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +;;; HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +;;; WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +;;; OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +;;; DEALINGS IN THE SOFTWARE. + +(in-package :trivial-features-tests) + +(defctype word :unsigned-short) + +(defcenum (architecture word) + (:amd64 9) + (:ia64 6) + (:intel 0) + (:unknown #xffff)) + +(defcstruct (system-info :size 36) + (processor-architecture architecture)) + +(load-foreign-library "kernel32.dll") + +(defcfun ("GetSystemInfo" %get-system-info :cconv :stdcall) :void + (system-info :pointer)) + +;;; only getting at the CPU architecture for now. +(defun get-system-info () + (with-foreign-object (si 'system-info) + (%get-system-info si) + (foreign-slot-value si 'system-info 'processor-architecture))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/tests/tests.lisp b/sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/tests/tests.lisp new file mode 100644 index 0000000..4215aaf --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/tests/tests.lisp @@ -0,0 +1,130 @@ +;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- +;;; +;;; tests.lisp --- trivial-features tests. +;;; +;;; Copyright (C) 2007, Luis Oliveira +;;; +;;; Permission is hereby granted, free of charge, to any person +;;; obtaining a copy of this software and associated documentation +;;; files (the "Software"), to deal in the Software without +;;; restriction, including without limitation the rights to use, copy, +;;; modify, merge, publish, distribute, sublicense, and/or sell copies +;;; of the Software, and to permit persons to whom the Software is +;;; furnished to do so, subject to the following conditions: +;;; +;;; The above copyright notice and this permission notice shall be +;;; included in all copies or substantial portions of the Software. +;;; +;;; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +;;; EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +;;; MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +;;; NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +;;; HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +;;; WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +;;; OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +;;; DEALINGS IN THE SOFTWARE. + +(in-package :trivial-features-tests) + +(defun run () + (let ((*package* (find-package :trivial-features-tests))) + (do-tests) + (null (regression-test:pending-tests)))) + +;;;; Support Code + +#-windows +(progn + ;; Hmm, why not just use OSICAT-POSIX:UNAME? + (defcfun ("uname" %uname) :int + (buf :pointer)) + + ;; Get system identification. + (defun uname () + (with-foreign-object (buf '(:struct utsname)) + (when (= (%uname buf) -1) + (error "uname() returned -1")) + (macrolet ((utsname-slot (name) + `(foreign-string-to-lisp + (foreign-slot-pointer buf 'utsname ',name)))) + (values (utsname-slot sysname) + ;; (utsname-slot nodename) + ;; (utsname-slot release) + ;; (utsname-slot version) + (utsname-slot machine)))))) + +(defun mutually-exclusive-p (features) + (= 1 (loop for feature in features when (featurep feature) count 1))) + +;;;; Tests + +(deftest endianness.1 + (with-foreign-object (p :uint16) + (setf (mem-ref p :uint16) #xfeff) + (ecase (mem-ref p :uint8) + (#xfe (featurep :big-endian)) + (#xff (featurep :little-endian)))) + t) + +(defparameter *bsds* '(:darwin :netbsd :openbsd :freebsd)) +(defparameter *unices* (list* :linux *bsds*)) + +#+windows +(deftest os.1 + (featurep (list* :or :unix *unices*)) + nil) + +#-windows +(deftest os.1 + (featurep (make-keyword (string-upcase (uname)))) + t) + +(deftest os.2 + (if (featurep :bsd) + (mutually-exclusive-p *bsds*) + (featurep `(:not (:or ,@*bsds*)))) + t) + +(deftest os.3 + (if (featurep `(:or ,@*unices*)) + (featurep :unix) + t) + t) + +(deftest os.4 + (if (featurep :windows) + (not (featurep :unix)) + t) + t) + +(deftest cpu.1 + (mutually-exclusive-p '(:ppc :ppc64 :x86 :x86-64 :alpha :mips)) + t) + +#+windows +(deftest cpu.2 + (case (get-system-info) + (:intel (featurep :x86)) + (:amd64 (featurep :x86-64)) + (:ia64 nil) ; add this feature later! + (t t)) + t) + +#-windows +(deftest cpu.2 + (let ((machine (nth-value 1 (uname)))) + (cond ((member machine '("x86" "x86_64") :test #'string=) + (ecase (foreign-type-size :pointer) + (4 (featurep :x86)) + (8 (featurep :x86-64)))) + (t + (format *debug-io* + "~&; NOTE: unhandled machine type, ~a, in CPU.2 test.~%" + machine) + t))) + t) + +;; regression test: sometimes, silly logic leads to pushing nil to +;; *features*. +(deftest nil.1 (featurep nil) nil) +(deftest nil.2 (featurep :nil) nil) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/tests/utsname.lisp b/sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/tests/utsname.lisp new file mode 100644 index 0000000..9ffbf59 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/tests/utsname.lisp @@ -0,0 +1,36 @@ +;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- +;;; +;;; utsname.lisp --- Grovel definitions for uname(3). +;;; +;;; Copyright (C) 2007, Luis Oliveira +;;; +;;; Permission is hereby granted, free of charge, to any person +;;; obtaining a copy of this software and associated documentation +;;; files (the "Software"), to deal in the Software without +;;; restriction, including without limitation the rights to use, copy, +;;; modify, merge, publish, distribute, sublicense, and/or sell copies +;;; of the Software, and to permit persons to whom the Software is +;;; furnished to do so, subject to the following conditions: +;;; +;;; The above copyright notice and this permission notice shall be +;;; included in all copies or substantial portions of the Software. +;;; +;;; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +;;; EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +;;; MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +;;; NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +;;; HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +;;; WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +;;; OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +;;; DEALINGS IN THE SOFTWARE. + +(in-package :trivial-features-tests) + +(include "sys/utsname.h") + +(cstruct utsname "struct utsname" + (sysname "sysname" :type :char) + (nodename "nodename" :type :char) + (release "release" :type :char) + (version "version" :type :char) + (machine "machine" :type :char)) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/trivial-features-tests.asd b/sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/trivial-features-tests.asd new file mode 100644 index 0000000..fee88e3 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/trivial-features-tests.asd @@ -0,0 +1,52 @@ +;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- +;;; +;;; trivial-features-tests.asd --- ASDF definition. +;;; +;;; Copyright (C) 2007, Luis Oliveira +;;; +;;; Permission is hereby granted, free of charge, to any person +;;; obtaining a copy of this software and associated documentation +;;; files (the "Software"), to deal in the Software without +;;; restriction, including without limitation the rights to use, copy, +;;; modify, merge, publish, distribute, sublicense, and/or sell copies +;;; of the Software, and to permit persons to whom the Software is +;;; furnished to do so, subject to the following conditions: +;;; +;;; The above copyright notice and this permission notice shall be +;;; included in all copies or substantial portions of the Software. +;;; +;;; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +;;; EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +;;; MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +;;; NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +;;; HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +;;; WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +;;; OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +;;; DEALINGS IN THE SOFTWARE. + +(eval-when (:load-toplevel :execute) + ;; We need to load trivial-features this way before the the + ;; defsystem form is read for the corner case when someone loads + ;; trivial-features-tests before trivial-features since the system + ;; definition's got a #+windows reader conditional that is supplied + ;; by trivial-features. + (oos 'load-op 'trivial-features)) + +(defsystem trivial-features-tests + :description "Unit tests for TRIVIAL-FEATURES." + :author "Luis Oliveira " + :licence "MIT" + :defsystem-depends-on (cffi-grovel) + :depends-on (trivial-features rt cffi alexandria) + :components + ((:module tests + :serial t + :components + ((:file "package") + #-windows (:cffi-grovel-file "utsname") + #+windows (:file "sysinfo") + (:file "tests"))))) + +(defmethod perform ((o test-op) (c (eql (find-system 'trivial-features-tests)))) + (let ((*package* (find-package 'trivial-features-tests))) + (funcall (find-symbol (symbol-name '#:do-tests))))) diff --git a/sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/trivial-features.asd b/sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/trivial-features.asd new file mode 100644 index 0000000..27a4c73 --- /dev/null +++ b/sbcl/.quicklisp/dists/quicklisp/software/trivial-features-20190710-git/trivial-features.asd @@ -0,0 +1,59 @@ +;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- +;;; +;;; trivial-features.asd --- ASDF system definition. +;;; +;;; Copyright (C) 2007, Luis Oliveira +;;; +;;; Permission is hereby granted, free of charge, to any person +;;; obtaining a copy of this software and associated documentation +;;; files (the "Software"), to deal in the Software without +;;; restriction, including without limitation the rights to use, copy, +;;; modify, merge, publish, distribute, sublicense, and/or sell copies +;;; of the Software, and to permit persons to whom the Software is +;;; furnished to do so, subject to the following conditions: +;;; +;;; The above copyright notice and this permission notice shall be +;;; included in all copies or substantial portions of the Software. +;;; +;;; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +;;; EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +;;; MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +;;; NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +;;; HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +;;; WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +;;; OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +;;; DEALINGS IN THE SOFTWARE. + +#-(or sbcl clisp allegro openmcl mcl mkcl lispworks ecl cmu scl cormanlisp abcl xcl mocl clasp mezzano) +(error "Sorry, your Lisp is not supported. Patches welcome.") + +(defsystem trivial-features + :description "Ensures consistent *FEATURES* across multiple CLs." + :author "Luis Oliveira " + :licence "MIT" + :components + ((:module src + :serial t + :components + (#+allegro (:file "tf-allegro") + #+clisp (:file "tf-clisp") + #+cmu (:file "tf-cmucl") + #+cormanlisp (:file "tf-cormanlisp") + #+ecl (:file "tf-ecl") + #+lispworks (:file "tf-lispworks") + #+openmcl (:file "tf-openmcl") + #+mcl (:file "tf-mcl") + #+mkcl (:file "tf-mkcl") + #+sbcl (:file "tf-sbcl") + #+scl (:file "tf-scl") + #+abcl (:file "tf-abcl") + #+xcl (:file "tf-xcl") + #+mocl (:file "tf-mocl") + #+clasp (:file "tf-clasp") + #+mezzano (:file "tf-mezzano") + )))) + +#-mezzano +(defmethod perform ((o test-op) (c (eql (find-system 'trivial-features)))) + (operate 'load-op 'trivial-features-tests) + (operate 'test-op 'trivial-features-tests)) diff --git a/sbcl/.quicklisp/tmp/release-install.tar b/sbcl/.quicklisp/tmp/release-install.tar index 6ad0c2175bdf4e8b5a7ec3540f5beb84714d6d73..dbeff94b6849afd762b75c069150f55842d2c09f 100644 GIT binary patch literal 624640 zcmYc;%1G%_;RP0uXRXP_!DFfcGMH#KE2FfcGQH#I<}K~f;hU}$V+ zU}#`&U}|W_U|?u!XkyHuU`kb2;4rMTxFoSiL4l#LG&4CnC$qQ!hdM&?IJ6CRVeIi= zl3Gl~L;#9l(&FFD(8y>s{^^l+@Wg*!a%oX9VuGCSVdVg*NH8!q zF+k1#Mg}J4#taGu#2HVSsu7<5H8S&b3lfvF6Vp=_tWr|-67$M3^q&T?)vv81FZKTiQIXQEG~Yp{7E9o2;MSDKrYT2!o%R+OI$)&RB;A__{D<(VZJ zx*$U`)AMxmld@8iONtdVGzvnRv3Xg~sAQ;$FZ6~R0X zPBj>T0}=oSP&$$75IzALsG$mW6g(u2!NE`jCey(rW_TJZ7$~5GXPvR50u(EOO$E6M z3q}oVB7CNR77avr5?u?zzu*!^Llv6qK&eDS6`b85Ojt%kE3-@>`AjJ!wYWqfC%;@b zC$%g!MmBe5vHM4>1(5mZ8h^F?`4W=UpVx*iu-NJgqcerZWTX^BE+u@x6rA|fz~ zQu9($i$IA1Vgi??Ib1S1KP45EWI!^B$t9^p3d%8wT!wIYXaWKyeFZ}uX$EYU5_$V@8%xd2p5C_qi)3Qtui zP6bs&i6!7X3^FsmM4>n*zXY6~6EpLQ72=cfOETi&@(?@Y6Z2BQVqDlw*HK6;R>(|K z$ShGP2i0|n3dtEIl?AB^nRyD1PM)TETwLK9sbIF5LT0f-X>n?b4%m+3)PlsK#FA8q z$06kys)IoFW^rOJR0S8<}^K|W1|M`LMm zVp0w?^b|mT1Un2ItBy{dW_qAxt%0}NLMwSe6#(&NuY!UGD0Z-ykqYV>R>dVnrO72Q z=Ymr*B2}QVG|H1R6x7Q>i738A!4$4oBPG8iGdHzZK_gSaR8v8tIJG1VDSx5p%G6Xa zKxo9HQd2<#WRWg7=_%!4}x)D8nV2W+5%0w_Ug zDQJKL5Gf)+MQbXkrUbbR7AD{z#7qbZ>fiv@1;s(JCL-1mkq1p28p-)N;6fW=a#>p(LDjXLQx~Y#0eKv(5?jIowT{Y@%Mx?&Brb@{&`9*W54HhK4UDS+@@%n! zI*5wL*8o#c0HvP%B1riQZ6JXvO^`|Cmnv8?2iVVWlfkt!D4Z0);_wor7`ZyYUUESF zjTCRD81aVE_yd&|AnzzBpkyM1Ti}V(48K8$vJKWCgQqYg*O+4%0!>ATCK4!GiXl#d zMG-u8p|oN^Sq7A%zv_ZX_06X zs3IrJBKmnrn?x@ayL6FfunZ#TfrH93B6oOX33!&_N?wK^gl1AgJ$em6D%anwy$el30?NpQixs zXcmKe9;p?Hxdl0?#R@5@x!{&WBB*-_Zo8HigFA|#-VZF9DL4jr>On^KtU%JrR>}Ff zx%qjzph0E@Wvk@0v`i#-zy=#JT?Weg8dk*_i7ENznR)5DnYjh|MJ2l6!5vK13dxB% zIiP|XqAj%oq!=`w1R79+S^`ezpi)NJ3Nl=Y%r-*i7$b8`kU6F>GfVR_LG48(GfPVh z3?WKOOAMgKfmlg!L8!5%B?cxiW0G_7A>;25MI{CXFb32txKSkrMu{*vBdD1r21dy+ zF{t4s2F7q@#)(j8lo%Mpbr>fh2_iHh%t?Wpn1WE53KN8eMu~w5+!_s3Ra8s6!wesAG!r z60@Np0A@lpl%$pvWrBP0%2oxL1*yd_8&k{jb4o#_E>d9v5-UrEdJ4iZ)70c5qsD+0 z%vkDw1n13dN-bp!zvAMIi|?wUd&XmROooqL7!LrwdJ$@Oenb08a%C zNcT(=G=!UzpO+4%Gn1eddpT%i6*OE6c42TqYI0^`jzW26N-B6n3Tm}NT4`P~D4P|7 zjVmuMDbi6$Oi76^PtGVVDbiF($ydnBFHy)yEK3EA&L*XThk*59eO6HY4(+faX1hR5 zCslZ-+(^MlLFq{Ek=`TiN7|1rJi746#3K`r?mM~<(jY=8G*K{9P&&Nr@RGxOz;OQI z`RGc_6f6{!E=;_z^}=?A3wtg$U)XhFhr)%u7q(t(0#O^FBDxBB`Jh3kJRJ}tJux#6 z-5?7ELjwh+XFcsNckX}QwCm-vH43^4;6X)&l+@HB9mp_rMt)H-#*D0?fr6otg3`G? z=k}l5{c!J|b9)ue?LN2h+@^DD74#L(%{e#!-0X8J&&^dhH~ZYgbCb?ZRnS#P1|=EL z)LnXNi9%)x*fro#g7)jc4K(nW3V5Ud(Uk+I7PtH&*qk4D05mf%9XucoZft=E-HO4H zmYjhUozRE_B}pA{@+(h;$0Dc=3XNoi)QW`bBgmp z7UZR;7V9A95J5x1=|zb-u*rh7{31}INzTv#r4dl-2M>LMrYIl-xlje5R0Xyrv>0iO zA7T|qNpgN(S!z*dY%n+l7b|2I=aqmYAw$z3s}u7S zz-~(|Qb;T+N~{D=;Oi(Pm4YTtVN%G6m%y|)sEPwMmQ|sn)-b+fN{WJVjB{j=r;m@P zb9}I`qmNI#k84PXYfyZ!hoge6f^y8o4v>pLfl*wNQk+}_8M4GSq=UYij5@S)u>)=_XvhFJMjOrsjc!2{Yruj6G&&8L za0O4fs=@~LVL^lxJkE{*o*|C#0P^v21qaZDPOw_qhX~Td1oD_XYS3Khq&#R~VE`JY zK@J}c)pBS?2g!gkJ7_Erc|;BrxQJYjSWp1&D?tlbTF!Akq3cr=5=#^kb8;Z%Ijltj z51z!76!7>9$T)Z+0BHdwv9!#h;u3{|oWx}C)HX;6qz+O`poJG~)d|!PQ2cLsXMI7=oCcqRoEBor1g*47H)sjvoKUTSKJLNT>ahpa-YEeN^CMepW0?<`cpm}t{O=571Q$Yd0 zDag%XqBIcS2F7U|X1$o6S^^FluvbAX3~Orzl=fnL38KXaTgCuRIH+wyqFRPInb6fH z&I$!Z`6c<_R&P;iVQFSjYB6%kfvz>eKP?BEpF&#V2d)!5^D;{^6LT`FpzC13b((^q z4s?Z|g0Vt=9%$X4f*~|5fcsI9`CLNk4T@m*gu{r55EwoTs2b{;V?bYgLfisn*sC&PA!9g+__6H8$Y< zn3$OdDi=WQY#s0fKez>fSY)LGnTdu3H)KH{G^F7k!CV9bZ37q>7$}gigasPbkir>M zZG%?Nf^s`-=}lg0IcVJ%a^oiiw9F|{AtygS8&*ewJ2@b~fm<}7F@1P1s3^6hv?#9_ z(gOo0^Y{{&H>|A{f)i6fi>ERYK~-F4aS5p0Edi}a1}%XDPX{X`r6wnWYSm1n6=R8z z9&akNYXVLHj^KrndHLm#5*S(uBlpPQg*GgkfQmy<14E$2cx8%x>-E#rVTn@Dd}!v~b`jQ_zWAK;3~WZ)hDGchnT zFf>LT|1&frltbe8fZxZsS}XeF$z|hc?G2yl})P?0` z-R#uLVuca~E70bb{36}5%;HSYqRYI@9GI6tH6Lh29LRnJbqx&z1#?XW4Fd%;FbP_; zXrN#MW*dV^BQR+QCJhkd2e6Q-D98tmO(doy7D2rPEk$7pDxnH+$){u%DJUmv7=ji< zLJI_tR*mGG)Wjli+W~H%25M|!MwSLjD+I1jK_e$WzW~7n^#UNB@YFKU(sm6{Qw72V zZR~(X3dj`@tdW_f0G38E0xFlBSe%MeRzX3-sdRDtMf<|U;VtPShQ3+_hDt2#z%)*KxCPA`9 zQEFli$;N0Tm6jm+4u>}gWdmflp=1egr3>;CY}g-M>_Nv)l|YSi&~7O3D05M1o-R1e z>w@wQsA&L6KX>fC4@#Aq`XQgN-T%fRpps^kW7HA85H%9+6qxui0cB1|6Kd>@536QqaRjShv1taEe^@m`%S+svp#>XO&Cuc*r)F5Gh)px7S_YNa z$ePh(0~DYzY;6r~h2-X!r4}pLDx?;HY7cmh2e%bKLk#(4sYRf{1yDT?+R~9(lA!=D z2Jx8=DndaOrh;+|SS?aKgOVr012E?x(V(KS5S*OAvlGP%;6#*Iq@b*>tpHB>DVar@ z3PhDpP-7uRg7xCaHBg0c3Zet#RsvZGt^>-@K*|@OWDCxqc!LVLp@5W?v9>xO-QBdJ z#N1R}@J<;}BSFCkX{b*Ft+WIw0F|}iS-*^ul7eC@ef{*zl8n+Mz2y8{{o?G(l%o9H zRQ;mFyp;T0{iK}yB>mjP;*!)N{bJB2Qhi8UusE?SwMefx12i{{#Tf8Hi`1h0yi9#C zQ?ED!#VD8{vi9=wa=ps@(vs4oRIpRZ6HAga?8|IJO!6$uJv|e3bwgp516Vt>!A$oe z8{BFH)h-GekX?})`U)Buso-`FD0mf&G&PZ>$}>|yc_g_=6C{HarJ($ol37#?YU_d; znF<=Z5XwM77t*RlZ&!f}V2!+z3LWBk+M{8&x z^#efRQjDcdrU5FOKn{ZBK~N0=Vu5-tpvnU3BCu}I=BDHfaDkDcprMgkSelpv3Jeei zhm58IsOhX>3o-yS^<4zo@}yvukzbTqm7iCVn4=3CPEoJ|4U}XiL%B!}h6N#v*3baW zy(26FTcV(@0V&@V5E2TY`V(AXC|Koy2AXxjwUcggeo8V+B-At&tV#qs0KS`N+8dRIwxaMvwylpy?LW!Ub*f&M($2DFQVup@c(0;I2-Nx(Ib5*pNYLi31bEmC-1Se+ z&neB#gG^f(fM)VR*$y0fpp}Jaxg4Sm8YJM<2-ObpG8P@s5COF(z&j?vQ$WR_Mu;Y8 zcV<$4P6~4J0V@X+kW`PnbrKX;AU)+7nI)+TR!KRD$=Nvcg4Tk8W_LjLfJ#O)6L^%F zT7aspN(GJF{1ixrf_ecS@tO+IXa$WxK_rnv4(vEEf!l@Y;8|T?E;s`SYn#eh{EYKW1^jg8VsQ10h{~-_o*Snkl<8-(=v^;oc#PEX!-#4Mxada zBmlmof?O)1_2oKm%hT1q%0z3dfg$W45&)|TRxX?jB@@FDw zT;zg=PD((dvY@p?3ebKTBnyHTRHcHJSwR8?Hd6@+GI)lCOahQmQd?Uq6qV*d7IHys z08R8J!rTBZ)KKjN3z1&5L&x|)egpNYz^yg3G6^YzfKIi_gd8JMsF0lsK63*!Ob1?` zlbe{C2bz;EKsXFBQl}hKs6fn!US4JnQYwUxCxS*1!QD&L^3K{?Aw4xO6+A!!51ho} zV5jTizJZLQkI>ifAW8tpl zz*?ai!E5j!t4d%R30HLx13(MwK#>O?)kw}j6lI{cF(fMyDxx3;L5goIE+Jf{K@7m@ z5)IJeeb8D=B8yDoj3c^Yf*1$!9%c+7Wj?S%Bm&e!0}robge}xZL{~syL#?e9U?aeg z_4VKpVo+rSS$CF5U@#c&9N0)OcrqGXK|lf+wTd#Y<1x56 zgd9CpTv7?zdkh-X0_P^k_91VszbQJ#zeT7f{KkOdthBLyj2`Dn~+;kLA6swZ4rd4R8WVk41qPRG)nWzGxJh( zL7QGulS>e7JVeQ&0a^*43L4}FcacC20f~SFQd9GEpvQIQ7ZvL$pc)3>HdA6?2z3^! z0+?;k_7ZN_Dp*0+DMM?f5|Hy@xL`?FWF}|8_Uu9rtU&e}XoWO*`~lM{*hVAJ0afXcwK^b`kRC3m;f@-N zh-kOA29FEm7l69Di8%_1(4BS)p#BqRVNGgYNipa|WANx;QYvUMTw*~%PG)KfXbLK| zEVZZ-H0Y9&U#^gxnv;X%UeFi-DEh$5ONvuVAlv$oTnOIr2a3zoJn*tr5EG;r$qZ<8 zB549e6sQXbS{#?1ij*fIJ@yL79KBU>CTIyPgrgjzt6+tcBGfft6%V93LoTIJcMqz1 zfKHBANCcgFp;)I1-FOF%VE6zGI5NOOAOh42gV+idM+xXO&>1H=l{yMoVha>UAphe? z*3f85&PdElPX#3rSR8hR1KQP8 z33d@u4?e#LG=Z951RZ?=c?>#7u7MgAnj}So9(pu@!(Ras8=&F{Y!QecE_6XE!5C{Y zAAlf2Zc9Ag67V{0uELt*xOI0C)=} zXa*Zp^%N@7dF6 zhVpJg+v^Nm6A{sOp2CYd!mVh#SQl&y^NoG!F6^H{e z4%C@}+M;RgV3BN&xRtK~kuKRT8w{1{y7dCVsTtTx4V`DOfE6Kye-hZ4 zU=N_WAL27)_k%MkSU(lquY;6}z_x>OG$`$XT4SK<9TJ$}W-MqsILINeniO=N4LHX_ z978xsf-{LyMq+VEqC#6KCN2Mi#md2$bI#b}i z?2rNn`y3Y}J6T(6pkL}`Wd+*nnwXQL3u>I`LifA(-?19u$2N{o#ZG$8ALkh)4p*PUdf zD!`I4NIj&b1?q%=&Rr{p*0BZ(IjM;$#h@GkiY{;=29782Q9025O>%N-K?&&cF=%9m z_`CR9DI{m4CTA;@fDQ%#x4P4d5(_dilfeO6tN=cBFco@`0Og6V!pPLp2)!DDmF=LS z4ps}HG$J9Pi=|)(rPz#AqgF8deVrb^y*u1l>yl zie<1WLJcxdd5LHNB}2+2oU7a5o9auj?nOl#y;1-j{;dl-1r*e)hFk?#tN?9#gDMa3 z001m=rldf|D?nu+xUmK5y?~}-5*6SVRe>h~Au){6bcc)slz^@f{v?ENJ~x4QOGQzJh;Ho4_W?%6l$RA6*7ti z5(JfZpm2dzzL>ENQUz&ffXgri(D)rBtk6@fZ>2(RW?l+tgex6%=mvQ{0GkbsY~+El z{4{WC1ux`6>TQ9WaY?E0cT^d2uOlPk^^T>QrgGy==D1^ zt|8StsFVezT$FO%Q$1IqIKQZCeZ2D=uri_ehu26uW1|Rr{Vhbp+kPpOymX{!7krN4Y z_=Buef+#M~M= z5|l7Ovq5 zhJ_iZ14?J$wk${`=(tKq>W3>gK(-zwR&fvXW)gFD5+s1ApZ!63o6OvwoS|T72wIG5 z4Wbon6$-&+2{aPHN3DS(5LDR1qKnp9w6r+27}SG@9R2~GQ3S^@;usjj+_f>Z=RYVj z8oc8Kz2+N~+#o&ycc>xhQ314kDkoJTsj>ugPI`V3tP@q9s*syn1e*Q=O(mCPfP(~_ zTES+(dQSQI1)w4ibn`Y?98&H>n2=b5MJOnhC}@BaK3Ez>95f>iIu`_+4C-coMC|}J z5JYI?gSraknZ>EN&nE*L3|b8U#^6&bASExT-2s-=1)ntlo?8J`72wusW*X!^1F!<{ zQfY8LhaON58ij%!FaU02L0YMhoQPaN=zu14;o~5vwF20<%rww&NCv3gpOIKlkeUZt zF#&Enfr=Nfvl8g+HCJU4lKuIJyCo?-! z0e1MJLP26W(h?TqB#N44m}^DAA%Ia(!-qBD11%`6Rd7=cRKsC5+v-%|)9EPvW{5qI zwl%n8h1&6jG>t)XZP3AfP)sVIjA?-KIB32OyaXLu!QhQ*l4BK834qN6wE-b^KpX-k zQM?4o-{4p#sh)skCIxK;cFzQz0-mP}HxIPd z1l*tm4S|5$4xktU?OsEi(OY6*OlY)*oMt^F;FRzr3nfH=qJ$x|i4ER(23jhS3~tba zd<|);fFd27bg;JQlQR@BTJaFKKn|D%^@u<*2RTVqL5YNxJBoV~QxL8JnF$~JGERYv zeJKT@ce+6Jmx4xaX--L|E~v)S1osTU>voD2Abm09o*4FldaUDRXvKaBMxMrfKqW># zN9kLELkcY>Ks7nYD+vGNjt%_%E0{h|{flKq8tA^^%;JKaL`XH5QJR~Wrwd94pd&aH zpt%FIw-7YamjapXfOObF&W6;+C=LZR=D<==0(m0~WcJ(&a&mfR9_ai-*qkJE^bKiX z2DCl^w8hH+w4N3DAPI2C5Yjh>zznknFhCP-y6 zxD2dwgz1J11A{IXD#%H#00$QMDm6$PC@6r-215n3NeLrOL;(O*X>AR49mwOL`whT{ zK!Z5Mh62QSsN?ilECRbI8D&g0IRlG2w1|Ru6kAk45(jdCVM)5l8AhNaVGK#-3h>Ge zOC<%$h9w5ZDd6rUHifcCFg*X9(1h+EPp_30F$6VEy^r`W<_urS(2EY3b}3r9ERYP*9zcntpX%d zAg>Jt?=%KAh!rv+)B2FRPe4oWAq`Yrq;N0EM+qsEQr6lU5$~9FfCiE&pmGSg)d%ti zEF{1K`rrUSI;kH#iUKMSN}#zqR|hoIkerH=)xpyzN#M&hK_-GQXfhG*AMna`Xh4F~ zJ!&xEc0IJT#z=I~ngz6s03}utCc*nwAjg1?UjTUmq}~Xe7Lbz++!Exr0620IQ;SPd zOF+vN>Kvhd1l=P8nxf9k1Kr~TzE-9f92Uutiy!h*6H8DIQ3M49G&L&J1%piir8Ib1 z3c3yfGeCnnT-Me|m0BvazXH0mQ=zy#vm_Zj7?hM+QV!a_5AItifO?Xk zkqJ<%4q`kgsz3{ulT*Q)ASvptfbGylgaOErRs}`*AhUI${(|3Emt&Jh+YXil$l1f6$Pu34w5 zq=4o&>^dMG1xU4!f_yuGN>6xG#xd{##Xe3&d7?>!i zC#Mu?B1#ey1r4=)*ybV)um$SLiACTsa~%8TpbaL_Mjs8(z&34J(315K_Ue18V>cEvBTPY;|*ig$K$$H|VMlOq21N zrJ$>82b#c!#u~`w1YC$1i-2WqkS5SfA|#SPIRU=-4pd|+ffn9@N*7Srg9fFb{sNu* z0XkX&xtj?M417-3NXbtIU&WRPUOfmhR6!lq(?K;JB@Pg_qNHw!C$MZ-NlZxrjc0@N_!(oK^(dv#KPuxDh%YAet<1Fpyf znF5U|CD3vu=)@hwV0g#cOu-O36QTiGK#Lwmh6acwz!1F{$seslqY0i$^#$Gd2;LJ5 zT7I8V3RBRmGXhzk_pjskfgJs&pJpOTtXnhstC23qa~@>6Px zLMgb{lbVX}I08^CfiY?zfWp;N>xa$NKGyUuSEbK z>jw(;{M^)x{Br0963DUCpji%>VDeWNcB-HYg14`r?8}B!hBy)! z=y=vt&=MvhdqG(GDWEHCz(G-zstE15C4z^3LB1w3y@8epfObiMl3ZzCIw;M7q8QQ* zgKdNWCnN<0)K)Q65JcfhdkP8~xKbZT3V9DZB-4k0w-!K?11K^;BlC&itsQy!CLP254Q0Y1nH57w7K@(0qD+Tgkq zxf~%SiuJ&`BC((VGDQH&(s`gwF(9izQ4C&g4+=w&lVM37zP_A5sSGYqu*D`M;$XuG ziJ;>^V5f!TgYE`TRVXe2U0ay~Y9gej=7D3apeR2nCpFhfAtf~@6B&$*cod%Vv04m17 ztYU?v{E`f~GeAWPC|`n4$%UjAa83cuJA%aF2Y2MBDS#HffPxZweHqxy4A8M3`Jl6x z@=HsKGgBZtdQg)-XmULlsW38!6-JPxg}WjmZebBLia>Kn;0Y&4+(7rumK3EX=7KgE zl!IdhG_ea>B>)Zz(8PR6YOX>_KJ?af&=_i-LVi(7Y7wZsN=j7#ul)f{E9T@EgO97y z0qrIRCCfxm`U4%01FucMbE2RE4|dWKWNE8`xehpafyP-=6=2B%+>k{Jrp!Ee0D?lM zI61!nw#N-sCD=T0l7!sWg5cv=+k~YO$5TWgWe(7|9g68FV{DM53w8*+Spmv&=-C(& zBg7RH3Rd9T{*s`vfR?%8V~eDf9N-1c&^c)37%Q}*1T>h5tt3GWHIT;;WeI4diV*f}vKItY03feBf$waFw7|i(L-Pe_wT=R~0|n}{fm;MfIzc(1Bo(|V z8mSzxpsb=qNg5af24MdpPwOkkBx-^Mts%>SiWL$;nH=Ota4TH_ys$MXRRMOZHe`)t zd8z_vHyEtV2J^WB^z;Oei{&71gQg>MAK18X22_l4C095*1a5rJyrC!EI(xR6?5|Ajc~} zLj&CYfzJPD!@lpBqo=DTQZeFbQ^XBLB#5ok07 z$w$~rDs1HxmL5O2>s}5%o+C34(YOLlJVI)Ic&%TQ3ckx2ry}}p zkZMa$0n{lg$;gDBt_WKF14{g$`$%EUZ1Cbh$TBMU9B8o)xZRUjq5~;!z$*%LpkV=B zXR4!+T9OQIZ-ItAz{kD78VIQs1v#0?nI)heA8bz^Y&NV|0W`W%q@w_?6?7D!K?pHT zp(G=}G(7{koF%rs1uIc;4;_FnwL?T6xCQ_n2LNs-Ad7=qJD_!6#R|wCDai*VC1iD| z=`9f?jg(^*aFhV>rA^Qhl6Y;%nWU}=nmJG$1Wl}Xd{mOJfRTh?D@H-*IDiHZP|JIG z>j*<1*ySibRzS;xN$9c=2cnCDMg@`;lpy6Ox+Hcj(69ilMJiHKFf}u`z@ZPV$pKAn zV5g%59ZKU6W)}JZweW#Z3+OxnczG*$M-C{5VFoR@T@C8ZgI6m;mP&$r3+}(evxFWO z7kEigc}6NI4B(v=1r5kLK}`kF0W9DQlLA>il#^Nlx-5`{?gzA|0Vyc)MJ1UT2y8Hf z!0aG{5+s2$F~NZd+13QQDFbvl9=0Pe5$kZEQEzBzfm}}_wNgQr;*MgZ+6TN8up~9N zAipTFC^M&00bJT*hEYjAJZ6xZ43PW*iVaXJo09GWauh*A5>)YHx&zXZhN}QEFoPVV zh@>Dd2Oa7Ozm^b|13-p@T!EV33@t5?TNNNh@PST{#mK=5GFlGKidHa( zf>zOkYizK~u(}nj0qiRB-Ho1}kpmVahg#BETVs|+nc%?$$c6?`35c4CAroInol}sZ zBqbr}Ngd#n1gnohX#_gBw1M$;tUe;1xL~`3k{K&OQn$sb!$^tU=a-+f3jU=AdmIMWA7< z5{2T@f`WX|(HEeN9r;Dsh%Fb1$Yzyfq=Fi5Fc;}SR`!G41!}uO*8Rfv=zxZLpl7ow zfJTne!7Gu9L5Hlh16HD;uM=k>0!0T77 z>Qw83>s0F;K?jRr(Fw5$UZTN66|Lt1nP*7Kuh3BdjoBfVIaoqRFUV;|KnY^rmw;xh5=#`o13b_preOAfb%19NixrYmbMng} zGdZAw0E|Jw3EJfe8?#ADg$>1|rYID{kK;!79;A_&lMkIBEjI>TgKnu{WPo1cz$+(E zq5<0oBM_AoND4JZplvu%?8B6UX_z=hT7ovLjZqd^W6RnU*Dc5ng?kQUDvAU=E<5h^hXpv| zPzWn5OD3V|hRjh1WcxHg#Vsg^Q3PT60W5(m1C0aN`HW?WIi;zfQBMWPIsn8q>6yg} zO3-Nwq$^n$R#2S^Y3bmeUs5{c?i%pv0~x8Hq5NFX z5y6NKD3-7R4F;E>q;PB{E2s`YFI-SNaj13eY>xb1D@Q zlfjpWfK39QwF~aZmm8yMgpDYa8-w-)7b$=jnnU8F7_{61zMcXt7(pvO@*%TrdEoOip(cacdgVr- zmX-qIZWAk1N5N|!%!~#%1tYV;WiT=v8G4g>}c#Q`Suz*jw11%Z{EiOPAYX;9dfmR-1#vZgWgAsR7abu*Mg5IKl z&rDb%&rE=pF+x{<>L`FC0dle%XysIHVnH&f$qZg!0zN>`z%mgsyMUw(ywH-kHUaug zdU#G!0+sxrgau9#@Z<~^fe2HjcddZ2CI@UdB!=;Hvmpw=B%WFozv0Amx4|}m35?nm z!*E1%64DAMsa^p`Gkh5l_{IqI!7|joI8r!)x~GZB*|61)pge=OlT5N*2%mvdrLsCK zOF~X|DmMhxZRMcs33ZhQQewtDrVxA*B@rbGaRrEmatsmW1#(~hIxcU652yy;m;hS$g)}>@qfnd=TC)M~1cDWTdJmAg2sHBuugM|B5_rK= zMoCFQv6a4ld3m{BdS0nseo?x9aei7!d16tjetKzUPO2_+0$(4p=uC@F)5!9}QoMxFvkTd~zTpB|89>5}G%rIEIMV(-4bVOHnc#3OE&+K09K2SjI}V|)gf;O|^+1~Y znJ8^}Xfi^IU{pOQiXo=s@5T_yWRUo)hlokp!c*{}NDIl2y zPF8se8oJ2m1b~A^Q^CXn)OLnMGPr+PlCJ<6VT0Eg(41V7UjXYPgF_i^frfGn(k0d! zVBNYU`MMwt;1~lPGX^S@;5i7?vq6n9L>Ou)#~_CS*fa&QjLCt!P(dRnzdW^wJY$m3 zjRE;BDZiv7KbH&xVM(qGl;BG8)6;Wc3mhR!lrwWOODbW}p#Zm9Lpi1l&H>+i4bci- z)(p`DDo~-tBhndK(7X;-my=q6?qcXo7PzE|jj=+|4kS>^ii`%HwKZ(w0@TCJW*Sc z&_Vf+?0e9&#(paL!xyk`c)1+BZ#Q%F?E$p`xtn)>p==l2xrC}id( z=ahn1fk3op=B4X^Hq+*nfENg5rh#q+uLNC!2ReT?4?NnA)=acgNCSrjcrpeO5Jsk^ z+MpIR)^=rHW)4gXXpb%Apk#0|0b-o*-_3+Hq|m*FMn=alB=ftE0* zr0RiBOIOfDkWJa?FWIwby3t9(*I(3BNe2_{o zwzh`s=*Z7gD1@%V205>&65_1X9PnKa*iMs}DXC2Q930ONtWnib0oWgZ2bN0ts5p!OIz4 zh;ve)=?m6Uq;@8PbY-AP6`bY?j1c1<7{)gqj68&bCAnb)GN^}=pQj5h;z6aVLSk`p zW+r5rpPqt-atvgY3slr2wu6AmOT@Z5P_+y0f`V2?f>xM9j+KRkHc|oynFcLdQ34k# z1}=JCgPj%Pq7`CNL3cP{HK8Oi2{oT&!?o<|u&Vz{YrlD8!WDGy>u!6gNPG zKzgz3!WM3RKHx(}LHpe^!As74+!SK+bew|}Vv2O~ixixLKmtWEc{&OysRgNd;OY&O z4l_~}iYtptQgih{!%dmR3O;V2t*E6*rFkW#XmcEplGM)!JdFg>2;Fj`12sY+GY?{T zYF>$s0;nkgj>YoCN=$<^lw&|uL0W2R3ThC7&k59r%lWt|#Ca*i@zP!C6~_=J6C% z^YZg@K<(!OP)9hg1mq$O=O9f;`!KPzBtJK?Bonk-t5N}SMK7$x0Ns?54+;kjA2+NC zF;4+nl0cn_T-KnKDHy2->PQd;xgUSRq$~Goob00I$(!^2sE=naRGHIis>nt#h_G+ zFy1)`oa|6r86X2eWk^wJ5@?q-irG*xP)bpVvj=Mib$wi1eRLG!>_Hh2v~3@p5)}-M z%rQbkLpcUC#sMh?P)tS$Lk#zT8}1aWqY#s%qY&o-O^6mcp!G!H#xs0XN=B-J6~YM6 zQJk1|BPqaPHK-|X1KQK4q^XJM>45_T)K&tQzTnw16#cGcsd*)^h6A|DfwUDsbL^mV zZBldd^NLG~5=&sMbWo29RMNxiMuno(^vwJ`b% z3p)9wG%YPNITLh-NC{}HJR7v4EL8zzsTm|hQHx~IpcS~Ul$n=~T42E1AYgZaYXA*Z zhza@Gpy5}<<>%1RZ(OrP7ZhvCAeD!+P{}t0_w(P=B4T;C4yGrLy`!l*HTMBv!+njKoo&`4hp95le=K9 zwzk$#EeGAko?KLvnvUv0Ow~w!M3@R%K?hcfT4ZQ|Iws%+Nyy{J#s+8u$Y6({WF64a zrb-H^W1$dL(7`B>S1=1cjpCft)B*(qJtI)^ho(j>ZE_drMKg(IiJ3W|qEErmIaom> zF{dQ8C@&GRN&|kFd2woqrb0n+YH3QoF7#&j#2j!@2HC@aShHpby)XjW$^_*K>|Iol z>ph;jm0C9)I1zCv*Wb|-`e5fcjF zfm=i{;0Xn=N@y?;>jobJZUB2u7i=;CH-J?_hnXQ!L9`n}TwOsC3|0?{VQ@VOieE@- zC`nD#1z$i9DwV)aQBY988V)6?pgXxU^FTdRs8cY~1NOKGBE=2hlWmc7K2sd zus$adbR8*JRellZDn^JtV#6WW5NbFMhZH9#=7GaN7p4$begLV2gn=Q^mKzgmIZPp8 z%Z-V)+?-g;VG0RbZceo2mc&{PQ%KlyOJXf|@pSa{_j6GItH+Z0QZf^B^FfDIK~Cg{ zxD;#thpGe{L`1>kM8l9HNUl$xqrj2s2n z3qXiU1*l4paYV#KfRC@IAE*cdsmGE8K;?;UZe||5>;VM@)^Gr+)Q6}9nMH)%PN6iS?6N`%S%MlF_aFvcd$iXTVU`-WBlaNTy z2a)CoNGk|yz@s?=qLN5gxRB-waLrCsP=Hku>4;F$906$w5fc=|w}gBg{X$%W{BS14 zoJ7#QD0!&a5UUfQDoMW^Fx1fpcecn$EiTqA$w!N_~h5kbj6M3fu|Uoeo}6R)lIj z*6@d_B+dE&Pf*z7_Ig1kR34eaYJET^vBB*}z{`30CGb#&TZ`3B(Al#jg?4a=Ymkqp zpF7y8SW;VQwr)XwDX8KvNi6~m4T0>(YIUf$0$8O2=*$AlxP}gAfV4xVu3#NK_|P<# zkq*dNABm7VS5Qs_1PwGo#X+M6po3vjAh#TYXD30cUaj=?b5nE5GC?&*MrvY7QL0{Y zey)BZs1cu&TC5LUR;!y@QIZNeau_@*3K5(Q3M^K@$2;^Dz1?ohDeSp&4#$pA$->$C!(gX1UQWqV!FF?v6Rv>q( zu~`9=N45ec296NIzCi9eW3vJ#k8A}@j7TexJIL6qfXO3U0TaV(1+;UE*7(C>1-w74 zuK?8pHW!J&6;P1QBa%W86I(F??X@Z>=tDc4NL^o$9^BCl?WdykXtDSL-Zj=&fa-x- z1@GJ9@&%*^iW*K>3qyFPS6>052i9DMctHWTFF?Ia%>F1AU%)%I`U)UD(4HyWd^}b_ zI+H~B0^WbsSAgh2HXY2y6;R+V8%7Tki!b0^Rec4p9<;tD9$$c!BdmZ_o7hqmyd#QX z1w;?-xInW4QUPGI0^ZBSumYloXe%Jq7&a^5eMk%|AbN0H0qwA%#y2)A;C)0;VGiyN zqNiG1(GBjCVf5axL^r$}s1Ld|A~OZG9|uZOxU2wmxlnsYII3?SShqu80i*}oPXZYY z!?>(~_N-8C!4^>P&YZpiR1dl>xU9h5&%zQ=@D7{4LIAeD8Sd!D-mSu71-yTz4_=}H z>0rUa2u$Ph1@`U}7AxTWFntA-juhB*Fafp#(pDm+7PygVw5nI%(jUXV5Av$R01y0z%Lli_~H?wTUI5 zy>7ZCnYpQ;Zl7^KuH68?8D+WCqEAq zI?%CT$XeaJ)C%xv)u8qFp!f#`3}^+fLLy{seo<;-3V2~b379O)Of5%F7SR2kIFbdH zWfPz+BTxq*-@C4^VFl@6f_gsCDQ0l2f_$Z*0J;XIJhce9hl?T$(F?AcaBIdXjnZ8M zt3ojxMH=Kj+_I$wxaB~#8j38U7Xxl^qsXE3S0J&ipa5F*4!Nj9K?A;ANkdz~2(snS zNK;b*npB{n2BA>PA01xSueDLj0>3KLK&lq|WAvAm-6t!Xx>_U=a4y`4Jk@C^xF*6RD0*nlRCXbeR zP@7<2=R-n7!3wkKgdz=U!k{)tP^6*F4?HRgGEp?ZTL&nj7!^7RF>Q)|Vl&8R)QV}a zSwu7pV8@gg8YM&5dnqAm0MPI;VpUmwo&sofKJ1jBVk^)wcc7iCc_|7h`K3uYsgNNC z&?$VN#h;*B1TuaKJx(3GE43s;p#o%tjzW4~elFtlCmn_25oO8AL!4O0@%4i<0~xPC`)xav32tXqgO)DHz!lq6S}W1yO-gXJK&%YE1x%DcqHs zA$=+}uscagFOc+3Ai+Qt;ZHG8MFf%zR29T1a5})2u%N0?(gRpA*n^-V0aW8+Q-zUg zuqi@IHrSM4q#LLrdSwIj-inmX!olE)E3A=A>g7tCkHH%n4FwiT$~9iz)LcUK=-|Xtm1-p;EF-F z4whwtF5yh7gxy>PF$822_yBdV3n6xbwsV1sX3$x7(5*_Tc_sJ@YRKIg1tmq`o^Wbr zI&3-}GD?+Nq@V=#F6`c4P^g18D}Z`$3L3eoxw?r(sc8xzBdkjEKvRyXDY~HG1zqS| zqzhIC>bSw0u!vhLKx<1u`&#Q9$?EWdcMZXcF>7mu90fxI3s{#8PHSmtL9?K>HCzyU z_&;QuDEN>%&;&YIH)tm$C|*ckcBml> z-P8zIg3&<-T}P6iUx2)EfJhhMN!Fw}38Ni|aZ?3!jK~FP7f)JFVsQreNS!3mHiX2S z)FRMU7Hew-&k|_H2A@3yDg@veJ~g*AC$S{I2y}TlcpD@5oP_dB&|wPsMcLp$sLU?~ zPs)dYPCJI&ADUkTI(;cK57IOQtIAD98e%Yp6qy(!46rS|`1S~cH~B)gVh!PHJ1biEbp(YrBj~UC&%*)IL zosX0XIkUI~axFP1E_3ri15%)|KX7IQpHPvQ0y?Q71+wKEG`LrsnFl&S1fmw~XQbFN zfyNf(yg*O^i+$q=F|k(y--V49cQAjV?K(l)&;}VLL5>RzRj`9|6N|GIl#>iVzz{c3 z(8w#z$$?ctnxI?nz=xiKwzz?6ZLnF8ctzXdg>rC!g0%wp9YSIAc;OLzX)6}LhlIC$W2vH*RU!sDJo4aQOE`B0=p1=#V+Xj z5b)AN&{~I&O>Qd4o5hJ`kZorWL9ppC6QHN^K#WgO zD1dH-LpKt%2Rs>4GlME-?9K&cAO&lMl+>cswA7;1ykv;25VMOwN3nn^JcUGs0?tDvrtnWA8*P@!O`P^n;~ zP^Dn3kW^d(iftp%jxhAV2Au^0+02((20pa`Y#!*KLAZ(Fh6%{~P;;=v7^V>9ju51f z2VEfpx~!&LAtkjWH5t?xgdXPvi5SqfG;o0m3UkPLV3i7>4m0>FoWzn;NZthn9ozu0 zPUI|$YcUf=c@*1Wd(iT=IJHC<>_=U&Q$UG1skEddKTp?C7o0m%QxvSAB1RY@#xN0R zL}NdFQlV0z0%9HLG%c8Eq?r$Hk>)0rfLb^TN_EDL3SjIAIz9sw%3#++T>(Dj5?&Bv z9!Uf$vOuW@)BsZedlFHg8tOndDWQoY9U^aNf@}U|FhmlOQ38o`(3wA=L+~Z7h|q@_0(T42C@W4wjL{5Hjv*9<@UEN*bmjx8D+jg)Rw*cP zfo?X+EXe?EUIiVw1ez?PRb)|Aw}ER(B61PlzyTWqx^aWZOrrqH5Jjn=v#21U1{zgN z1)bXnxu6j`%LtawELMQ1Oi@5NYyqhpGle!iKwT(O1D(W%BD`S&IdKuT%^KW0fK2m2 z$_(eyq9V|CZrB+oAW=|SNKehrO)V*^RM3c2s8EQ|v{C|{vu6N0XAe4FL9a%r6(m%V zGK--C)CtfQ0t$sPM^xvi5D6akEmo)ib)X|ar`m%~gwj(Y?jR@>qd}+CWuz*k=9Og@ z<>%#sf~_pEC=)d6SPZ%mSfR8aB@t8sg2tkui2;&q6iV{*(V7HECZjr86|19*^^_D; zL0kTU6;z%5eS%>%2a+*RCdzORhBDMcbI_zQ+oT{f(VOUyCIB>6z%`5&c!(!29e!wE zJm}=p63}r9@d`z$phJm3O*Uv-5BYpIcwuEqNfkf%@&@>DNe$3x80kfz73rXCMd&Ij z)bm31P!6+H*MQwk2R_ddR5XF32GWTEFFZiW6V}!W1v!bypr$tT{5fc&EE#+N4!p4n zjtk_JsX@f8q^7Xz$qbRNCxZ;bXh6KHp^uusjNsKE$k~))BufwnxG8`RB7g-9bXWsg z=7V|>kdOi=SA4x>1@I{|U}Xr+5clFci%LNQR!o7`c%*^H$3T@s9_TP5NLEP!^%%hU z0@9Cw#tXE^l9yVp0Ervq*nn7!Ai=E;U8qiQOyLY}1>Avz)C)xz4P}APoh&IyEkc}m zoS6v9$>1bYS&#}kOs^zEAvd)oBR>VTX9+a|Mu8m*I_Xux0AGQP80-XjNGZ~)&QT%4 z3UrqtQAhQ`Y=hF^0fB-<(BLYl7YqriV(4|1;2Xw4L)D;5w?LDCpffdL=WIfUp}@lm zP{XiL*4D5CsZlOif~}T8xfUxkPXTlkQ&BOv#gLp0vN69XCAA2D6oW2WP*&H-Nz6@3 zNmS4%*M#3bp$R%&FRduGI76Wv+vzyy?uBGY&=3dcmR)RF5N~y$0BXwSrz4%43bO!S zB^aPzR|isohlmHjBkW8*n zoC7*JI;T>h7`m1aJY@kISU_vsB4O0U8(a5KUnrOl*K#&Yl4P>SXS_KBZ>rP$6 zNWmC1rU|V_P}<9&`YE*pbdVNBw?>AC0}Z^U77?g| zU?(=?s39<%45}*7N;y0}fOQ{qLFS}_E-6FyADBJ7D-DppQKFov@Iwza0`&;!fzL04O*MdzvxQy(2^ySFDFvk* z1@IxXpk^ni_W?fT4`~F#3_1dV{W@l7X$xvFV4o8~G_OHTYVajz;GPX4Jwb9d$OP1! zjWO^L0=io|(I5)8ZdR!+cvU3uPOTdE{Itn0jQb9|`LF4_ICE!vBF`izO zS`51E5ZaS~UQ!RO6cdy3%aG?P&4}%1!|(9~@5KidmpCW8unnZ6k3Ye0UV)}D@UfPl z8eA7tLMDPHSJa_ShFxQ#VW^AJiA2=8Nc9ZzHCUh&ha7JT8kwM#tclsFxGgb+SLIj@ zg_N6^E&(Ms`1yO_%fL$%G(a%~YN02lfJfJ%c^gu>Lz7}=o`Nw*FDP$AQj7vf2c%7( zUs?h;6I7ApJ~SNGi%G4>1f3}ctH=?n z?KAT<;pZZPkIDw$DF?mr7qmeg8v4a0MX8Co@Qxj{4V;+=cP;2Xf>f~kVJSQ@B?WX& zVt#%BXh9FiY2Y$Q2h>6XB^*$KRe+3cC={g@3O9DCrB2ULxK?~DMgGRR9W$xyIWFwjIk+8&nB zz_vrq@z$_|s|FRMsO@&JI?$1#i3-qJdU*L#r~pd5kb9mWvxX4G2oh>OBrn;5DoX{W zLeS|AkYkup@;*ctXx9(;c360-1bGQmBbN0{I@~ zc};LeK@Mh!PFMv8%JQIW1Qt~wCbK~gf>1|lJwR?ANX*H}FNcI4yygcr5x|WH$gvUN z9ssQQkO;n0B_AWop&~f)D|Ai?GVKo<;YtM^4xL1i$av&}A9u?5_X3&)`(0m9z z(iN0QLDx=~)2dQ{S4NPNWkF?932I^ijoRfEl$JnFo&hPy1T7>fD9SHLEh?!5)!3lU zLM1HGLJCVA@DeicA~0yE!7la!w*XKQ6EPi4vMVEu1O`b@a1wUcCM@pZD~!Nd9da-a z$kS+{qM-%rIqO1N6YZlIuR2)b(-HUojkY6_qc zThMp`(qJgmE*t!I!D~W@_rbfIAa>!l3UQx+HTYQZ?9@sf1!vtX5Rr@UENDI!)bQ7^ zQvlser(g}q*^rhVxbF%IRZuwvD#bvHWWj|qN;-p#EP%2TxR_MXNUbO-N=z;Rugirs zNkHzk%2UWgn$yE_*fz+68pS0=;B1MbaRaslX_Nz`2aI8bV@@i#-hiq@_A5vkSXDBp zB*#*~LKiC{QU^!}sN(@z3JEqa9h@HF6S|;LF(q3&1<;Ykpd}Cxw-6doLW?(o134Ks#^fgT%aTHLE)(cYE7d{BDo6^sMrjE9Q%)HGLjSFF-V~s zP=g;H%o<3?&RZ)u1*7>NoU=f!77~gWY;k~86rdG5aF>8mFTSWEW(5Oixe%xYt6&XU z#|pYx2;?77iI4$mX_tWZK_M&z-Ps8$Q$XuoQ$dRI@*#85I^Y%rxcpTBFM)+LqCkyf zq*M)_^UegXe+HF3kV!?*4%xhX=-MdIN@P?GpdKCcavkuRX;3W*x&}!{p*R((h6VLk zku-w51a~%Qt95=Jd_^qCgP^Ok^iuT{^74y7YePX54S4?+SPrfcabYf8NCBG3K%E@$ zf_t#G0!SzzrC@N`03kF8)B)fQA*90y$!sXbK;}14Gbp%$ft-CnyS_mI1G={zw7@nq z4RpObbX7WNI0xwjF$Gw?4Y~3Z;zk8)Yw(~7XukzyB{-;52gfIRd8|=hlnE;wzzV=Q z8+75PwE|=`64L9_MW{oB9=K-!EvFHh6<|8Sm6I-H;U`oRv>6Ku88i`Ca~Cw8kp#Zz z$Vx%OSiwlaP!l8sX-`@y7#bOaxX>wUh(aBO)SOh%nhVH+!^9NOmJd)8%1DKr5C)3g zQhrdTl%0AcF0{+*p8Uc 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

ZxjUzS=_UX%%*5YH?D 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�^&dQs}#UCr50N$K!QmJblr1eC1?a5DF~o< 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 literal 20480 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 diff --git a/sbcl/.sbclrc b/sbcl/.sbclrc index c6658cd..d8049d6 100644 --- a/sbcl/.sbclrc +++ b/sbcl/.sbclrc @@ -6,3 +6,11 @@ (when (probe-file quicklisp-init) (load quicklisp-init))) + +;;; The following lines added by ql:add-to-init-file: +#-quicklisp +(let ((quicklisp-init (merge-pathnames ".dotfiles/sbcl/.quicklisp/setup.lisp" + (user-homedir-pathname)))) + (when (probe-file quicklisp-init) + (load quicklisp-init))) + diff --git a/tmux/.tmux.conf b/tmux/.tmux.conf index 1a4ef86..abdbb0e 100644 --- a/tmux/.tmux.conf +++ b/tmux/.tmux.conf @@ -1,9 +1,12 @@ -set-option -g default-shell /bin/bash +set-option -g default-shell /bin/zsh set -g default-terminal "rxvt-unicode-256color" # set-window-option -g mode-keys vi -bind | split-window -h -c "#{pane_current_path}" -bind - split-window -v -c "#{pane_current_path}" +set-window-option -g automatic-rename on + +bind h split-window -h -c "#{pane_current_path}" +bind v split-window -v -c "#{pane_current_path}" +bind w new-window # Smart pane switching with awareness of Vim splits. # See: https://github.com/christoomey/vim-tmux-navigator @@ -30,3 +33,9 @@ bind -n C-l run "($is_vim && tmux send-keys C-l) || \ tmux select-pane -R" bind-key -n C-\ if-shell "$is_vim" "send-keys C-\\" "select-pane -l" + +bind a resize-pane -Z + +# Shift arrow to switch windows +bind -n C-S-Space previous-window +bind -n C-Space next-window diff --git a/vim/.vim/bindings.md b/vim/.vim/bindings.md index 7bbef1b..80e0c7c 100644 --- a/vim/.vim/bindings.md +++ b/vim/.vim/bindings.md @@ -1,3 +1,5 @@ +TODO: asciidoc + EasyAlign C-x in visual mode to do reg expression Vlime @@ -45,3 +47,10 @@ Custom Bindings c-c kill current window +Tmux + c-b d exit session + TODO kill session + :rename-window -n name + c-b {v, h} window split + c-b w new window + tslime: ,t diff --git a/vim/.vimrc b/vim/.vimrc index e8d36c8..85a1128 100755 --- a/vim/.vimrc +++ b/vim/.vimrc @@ -55,7 +55,7 @@ " appearance {{{ - " colorscheme zenburn + colorscheme zenburn " colorscheme wal syntax on " Enable syntax set encoding=utf-8 " Keep utf-8 encoding