From f8fb607cb64c15946f898a23f96a8f75abfd81c0 Mon Sep 17 00:00:00 2001 From: Scott Duensing Date: Sat, 4 Jul 2026 20:25:00 -0500 Subject: [PATCH] Ruby added. --- .gitignore | 7 + API.md | 4 +- LICENSE.md | 4 + Makefile | 65 +- README.md | 5 +- design.md | 49 + examples/scripts/README.md | 1 + examples/scripts/languages/ruby.rb | 19 + libs/calogExport.h | 8 +- libs/calogTask.c | 3 + src/calog.h | 4 + src/calogMain.c | 3 +- src/mruby/build_config.rb | 30 + src/mruby/mrubyAdapter.c | 714 +++ src/mruby/mrubyAdapter.h | 28 + src/mruby/mrubyEngine.c | 61 + tests/testEngineMruby.c | 403 ++ vendor/mruby/.codespellrc | 3 + vendor/mruby/.dockerignore | 14 + vendor/mruby/.editorconfig | 30 + vendor/mruby/.pre-commit-config.yaml | 130 + vendor/mruby/.prettierignore | 6 + vendor/mruby/.prettierrc | 3 + vendor/mruby/.travis.yml | 11 + vendor/mruby/.yardopts | 23 + vendor/mruby/AUTHORS | 348 ++ vendor/mruby/CONTRIBUTING.md | 193 + vendor/mruby/Dockerfile | 13 + vendor/mruby/Doxyfile | 2748 +++++++++++ vendor/mruby/Gemfile | 8 + vendor/mruby/Gemfile.lock | 25 + vendor/mruby/LEGAL | 62 + vendor/mruby/LICENSE | 19 + vendor/mruby/Makefile | 63 + vendor/mruby/NEWS.md | 367 ++ vendor/mruby/README.md | 186 + vendor/mruby/Rakefile | 102 + vendor/mruby/SECURITY.md | 54 + vendor/mruby/TODO.md | 17 + vendor/mruby/appveyor.yml | 47 + vendor/mruby/bin/mirb | 1 + vendor/mruby/bin/mrbc | 1 + vendor/mruby/bin/mrdb | 1 + vendor/mruby/bin/mruby | 1 + vendor/mruby/bin/mruby-config | 1 + vendor/mruby/bin/mruby-strip | 1 + vendor/mruby/build_config.rb | 9 + vendor/mruby/build_config/ArduinoDue.rb | 72 + vendor/mruby/build_config/IntelEdison.rb | 69 + vendor/mruby/build_config/IntelGalileo.rb | 88 + vendor/mruby/build_config/RX630.rb | 63 + .../mruby/build_config/android_arm64_v8a.rb | 11 + .../android_armeabi_v7a_neon_hard.rb | 13 + vendor/mruby/build_config/bench.rb | 11 + vendor/mruby/build_config/boxing.rb | 19 + vendor/mruby/build_config/chipKITMax32.rb | 68 + vendor/mruby/build_config/ci/gcc-clang.rb | 40 + vendor/mruby/build_config/ci/msvc.rb | 20 + vendor/mruby/build_config/clang-asan.rb | 11 + vendor/mruby/build_config/cosmopolitan.rb | 86 + vendor/mruby/build_config/cross-32bit.rb | 14 + .../build_config/cross-mingw-winetest.rb | 90 + vendor/mruby/build_config/cross-mingw.rb | 14 + vendor/mruby/build_config/default.rb | 83 + vendor/mruby/build_config/dreamcast_shelf.rb | 81 + vendor/mruby/build_config/emscripten-cxx.rb | 12 + vendor/mruby/build_config/emscripten.rb | 10 + vendor/mruby/build_config/gameboyadvance.rb | 72 + .../mruby/build_config/helpers/wine_runner.rb | 71 + vendor/mruby/build_config/host-cxx.rb | 12 + vendor/mruby/build_config/host-debug.rb | 20 + vendor/mruby/build_config/host-f32.rb | 14 + vendor/mruby/build_config/host-gprof.rb | 14 + vendor/mruby/build_config/host-m32-f32.rb | 16 + vendor/mruby/build_config/host-m32.rb | 15 + vendor/mruby/build_config/host-nofloat.rb | 22 + vendor/mruby/build_config/host-shared.rb | 36 + .../mruby/build_config/i586-pc-msdosdjgpp.rb | 76 + vendor/mruby/build_config/luckfox_pico.rb | 106 + vendor/mruby/build_config/milkv_duo.rb | 106 + vendor/mruby/build_config/minimal.rb | 4 + vendor/mruby/build_config/mrbc.rb | 10 + vendor/mruby/build_config/nintendo_switch.rb | 73 + vendor/mruby/build_config/nintendo_wii.rb | 95 + vendor/mruby/build_config/no-float.rb | 17 + .../mruby/build_config/playstationportable.rb | 78 + vendor/mruby/build_config/serenity.rb | 26 + vendor/mruby/docker-compose.yml | 13 + .../c_and_ruby_extension_example/README.md | 3 + .../c_and_ruby_extension_example/mrbgem.rake | 23 + .../mrblib/example.rb | 5 + .../src/example.c | 23 + .../test/example.rb | 7 + .../mrbgems/c_extension_example/README.md | 3 + .../mrbgems/c_extension_example/mrbgem.rake | 23 + .../mrbgems/c_extension_example/src/example.c | 23 + .../c_extension_example/test/example.c | 7 + .../c_extension_example/test/example.rb | 3 + .../mrbgems/cdata_extension_example/README.md | 3 + .../cdata_extension_example/mrbgem.rake | 23 + .../cdata_extension_example/src/example.c | 77 + .../cdata_extension_example/test/example.c | 7 + .../mrbgems/mruby-YOUR-bigint/TODO-HINT.md | 39 + .../mrbgems/mruby-YOUR-bigint/mrbgem.rake | 12 + .../mrbgems/ruby_extension_example/README.md | 3 + .../ruby_extension_example/mrbgem.rake | 23 + .../ruby_extension_example/mrblib/example.rb | 5 + .../ruby_extension_example/test/example.rb | 3 + vendor/mruby/include/mrbconf.h | 243 + vendor/mruby/include/mruby.h | 1636 ++++++ vendor/mruby/include/mruby/array.h | 303 ++ vendor/mruby/include/mruby/boxing_nan.h | 169 + vendor/mruby/include/mruby/boxing_no.h | 59 + vendor/mruby/include/mruby/boxing_word.h | 277 ++ vendor/mruby/include/mruby/class.h | 157 + vendor/mruby/include/mruby/common.h | 127 + vendor/mruby/include/mruby/compile.h | 187 + vendor/mruby/include/mruby/data.h | 76 + vendor/mruby/include/mruby/debug.h | 75 + vendor/mruby/include/mruby/dump.h | 159 + vendor/mruby/include/mruby/endian.h | 44 + vendor/mruby/include/mruby/error.h | 173 + vendor/mruby/include/mruby/gc.h | 79 + vendor/mruby/include/mruby/hash.h | 234 + vendor/mruby/include/mruby/internal.h | 282 ++ vendor/mruby/include/mruby/irep.h | 143 + vendor/mruby/include/mruby/istruct.h | 50 + vendor/mruby/include/mruby/khash.h | 455 ++ vendor/mruby/include/mruby/mempool.h | 19 + vendor/mruby/include/mruby/numeric.h | 174 + vendor/mruby/include/mruby/object.h | 51 + vendor/mruby/include/mruby/opcode.h | 73 + vendor/mruby/include/mruby/ops.h | 133 + vendor/mruby/include/mruby/presym.h | 65 + vendor/mruby/include/mruby/presym/scanning.h | 82 + vendor/mruby/include/mruby/proc.h | 184 + vendor/mruby/include/mruby/range.h | 77 + vendor/mruby/include/mruby/re.h | 16 + vendor/mruby/include/mruby/string.h | 428 ++ vendor/mruby/include/mruby/throw.h | 81 + vendor/mruby/include/mruby/value.h | 475 ++ vendor/mruby/include/mruby/variable.h | 108 + vendor/mruby/include/mruby/version.h | 143 + vendor/mruby/lib/mruby/amalgam.rb | 568 +++ vendor/mruby/lib/mruby/build.rb | 616 +++ vendor/mruby/lib/mruby/build/command.rb | 383 ++ vendor/mruby/lib/mruby/build/load_gems.rb | 383 ++ vendor/mruby/lib/mruby/core_ext.rb | 61 + vendor/mruby/lib/mruby/doc.rb | 51 + vendor/mruby/lib/mruby/gem.rb | 586 +++ vendor/mruby/lib/mruby/lockfile.rb | 81 + vendor/mruby/lib/mruby/presym.rb | 167 + vendor/mruby/lib/mruby/source.rb | 32 + vendor/mruby/minirake | 2 + vendor/mruby/mrbgems/default-no-fpu.gembox | 3 + vendor/mruby/mrbgems/default-no-stdio.gembox | 4 + vendor/mruby/mrbgems/default.gembox | 25 + vendor/mruby/mrbgems/full-core.gembox | 6 + .../mruby/mrbgems/hal-posix-dir/mrbgem.rake | 7 + .../mruby/mrbgems/hal-posix-dir/src/dir_hal.c | 193 + vendor/mruby/mrbgems/hal-posix-io/mrbgem.rake | 8 + .../mruby/mrbgems/hal-posix-io/src/io_hal.c | 602 +++ .../mrbgems/hal-posix-socket/mrbgem.rake | 8 + .../mrbgems/hal-posix-socket/src/socket_hal.c | 157 + vendor/mruby/mrbgems/hal-posix-task/README.md | 102 + .../mruby/mrbgems/hal-posix-task/mrbgem.rake | 8 + .../mrbgems/hal-posix-task/src/task_hal.c | 252 + vendor/mruby/mrbgems/hal-win-dir/mrbgem.rake | 7 + .../mruby/mrbgems/hal-win-dir/src/dir_hal.c | 249 + vendor/mruby/mrbgems/hal-win-io/mrbgem.rake | 11 + vendor/mruby/mrbgems/hal-win-io/src/io_hal.c | 646 +++ .../mruby/mrbgems/hal-win-socket/mrbgem.rake | 12 + .../mrbgems/hal-win-socket/src/socket_hal.c | 176 + vendor/mruby/mrbgems/hal-win-task/README.md | 109 + vendor/mruby/mrbgems/hal-win-task/mrbgem.rake | 11 + .../mruby/mrbgems/hal-win-task/src/task_hal.c | 187 + vendor/mruby/mrbgems/math.gembox | 12 + vendor/mruby/mrbgems/metaprog.gembox | 21 + .../mruby/mrbgems/mruby-array-ext/README.md | 87 + .../mruby/mrbgems/mruby-array-ext/mrbgem.rake | 5 + .../mrbgems/mruby-array-ext/mrblib/array.rb | 762 +++ .../mruby/mrbgems/mruby-array-ext/src/array.c | 1688 +++++++ .../mrbgems/mruby-array-ext/test/array.rb | 849 ++++ .../mruby/mrbgems/mruby-benchmark/README.md | 257 + .../mruby/mrbgems/mruby-benchmark/mrbgem.rake | 10 + .../mruby-benchmark/mrblib/benchmark.rb | 131 + .../mrbgems/mruby-benchmark/test/benchmark.rb | 244 + .../mruby/mrbgems/mruby-bigint/README-fgmp.md | 154 + vendor/mruby/mrbgems/mruby-bigint/README.md | 44 + vendor/mruby/mrbgems/mruby-bigint/mrbgem.rake | 10 + .../mruby/mrbgems/mruby-bigint/test/bigint.rb | 157 + .../mruby/mrbgems/mruby-bin-config/README.md | 46 + .../mrbgems/mruby-bin-config/mrbgem.rake | 49 + .../mrbgems/mruby-bin-config/mruby-config | 46 + .../mrbgems/mruby-bin-config/mruby-config.bat | 92 + .../mrbgems/mruby-bin-debugger/README.md | 63 + .../mruby-bin-debugger/bintest/mrdb.rb | 283 ++ .../mruby-bin-debugger/bintest/print.rb | 703 +++ .../mrbgems/mruby-bin-debugger/mrbgem.rake | 10 + .../mruby-bin-debugger/tools/mrdb/apibreak.c | 506 ++ .../mruby-bin-debugger/tools/mrdb/apibreak.h | 26 + .../mruby-bin-debugger/tools/mrdb/apilist.c | 238 + .../mruby-bin-debugger/tools/mrdb/apilist.h | 14 + .../mruby-bin-debugger/tools/mrdb/apiprint.c | 87 + .../mruby-bin-debugger/tools/mrdb/apiprint.h | 13 + .../mruby-bin-debugger/tools/mrdb/apistring.c | 34 + .../mruby-bin-debugger/tools/mrdb/apistring.h | 14 + .../mruby-bin-debugger/tools/mrdb/cmdbreak.c | 426 ++ .../mruby-bin-debugger/tools/mrdb/cmdmisc.c | 509 ++ .../mruby-bin-debugger/tools/mrdb/cmdprint.c | 71 + .../mruby-bin-debugger/tools/mrdb/cmdrun.c | 62 + .../mruby-bin-debugger/tools/mrdb/mrdb.c | 788 +++ .../mruby-bin-debugger/tools/mrdb/mrdb.h | 167 + .../mruby-bin-debugger/tools/mrdb/mrdbconf.h | 24 + .../mruby-bin-debugger/tools/mrdb/mrdberror.h | 19 + vendor/mruby/mrbgems/mruby-bin-mirb/README.md | 94 + .../mrbgems/mruby-bin-mirb/bintest/mirb.rb | 58 + .../mruby/mrbgems/mruby-bin-mirb/mrbgem.rake | 7 + .../mrbgems/mruby-bin-mirb/tools/mirb/mirb.c | 787 +++ .../mruby-bin-mirb/tools/mirb/mirb_buffer.c | 1014 ++++ .../mruby-bin-mirb/tools/mirb/mirb_buffer.h | 195 + .../tools/mirb/mirb_completion.c | 756 +++ .../tools/mirb/mirb_completion.h | 128 + .../mruby-bin-mirb/tools/mirb/mirb_editor.c | 1066 ++++ .../mruby-bin-mirb/tools/mirb/mirb_editor.h | 153 + .../tools/mirb/mirb_highlight.c | 508 ++ .../tools/mirb/mirb_highlight.h | 104 + .../mruby-bin-mirb/tools/mirb/mirb_history.c | 185 + .../mruby-bin-mirb/tools/mirb/mirb_history.h | 76 + .../mruby-bin-mirb/tools/mirb/mirb_term.c | 491 ++ .../mruby-bin-mirb/tools/mirb/mirb_term.h | 137 + vendor/mruby/mrbgems/mruby-bin-mrbc/README.md | 58 + .../mrbgems/mruby-bin-mrbc/bintest/mrbc.rb | 30 + .../mruby/mrbgems/mruby-bin-mrbc/mrbgem.rake | 15 + .../mrbgems/mruby-bin-mrbc/tools/mrbc/mrbc.c | 362 ++ .../mrbgems/mruby-bin-mrbc/tools/mrbc/stub.c | 104 + .../mruby/mrbgems/mruby-bin-mruby/README.md | 47 + .../mrbgems/mruby-bin-mruby/bintest/mruby.rb | 178 + .../mruby/mrbgems/mruby-bin-mruby/mrbgem.rake | 7 + .../mruby-bin-mruby/tools/mruby/mruby.c | 379 ++ .../mruby/mrbgems/mruby-bin-strip/README.md | 38 + .../mruby-bin-strip/bintest/mruby_strip.rb | 73 + .../mruby/mrbgems/mruby-bin-strip/mrbgem.rake | 7 + .../tools/mruby-strip/mruby_strip.c | 139 + vendor/mruby/mrbgems/mruby-binding/README.md | 256 + .../mruby/mrbgems/mruby-binding/mrbgem.rake | 7 + .../mruby/mrbgems/mruby-binding/src/binding.c | 517 ++ .../mrbgems/mruby-binding/test/binding.c | 13 + .../mrbgems/mruby-binding/test/binding.rb | 64 + vendor/mruby/mrbgems/mruby-catch/README.md | 94 + vendor/mruby/mrbgems/mruby-catch/mrbgem.rake | 5 + .../mruby/mrbgems/mruby-catch/mrblib/catch.rb | 29 + vendor/mruby/mrbgems/mruby-catch/src/catch.c | 148 + .../mruby/mrbgems/mruby-catch/test/catch.rb | 86 + .../mruby/mrbgems/mruby-class-ext/README.md | 81 + .../mruby/mrbgems/mruby-class-ext/mrbgem.rake | 5 + .../mruby/mrbgems/mruby-class-ext/src/class.c | 376 ++ .../mrbgems/mruby-class-ext/test/class.rb | 46 + .../mrbgems/mruby-class-ext/test/module.rb | 109 + vendor/mruby/mrbgems/mruby-cmath/README.md | 45 + vendor/mruby/mrbgems/mruby-cmath/mrbgem.rake | 8 + vendor/mruby/mrbgems/mruby-cmath/src/cmath.c | 425 ++ .../mruby/mrbgems/mruby-cmath/test/cmath.rb | 41 + .../mruby/mrbgems/mruby-compar-ext/README.md | 65 + .../mrbgems/mruby-compar-ext/mrbgem.rake | 5 + .../mrbgems/mruby-compar-ext/mrblib/compar.rb | 75 + .../mrbgems/mruby-compar-ext/test/compar.rb | 21 + vendor/mruby/mrbgems/mruby-compiler/README.md | 28 + .../mruby/mrbgems/mruby-compiler/mrbgem.rake | 42 + vendor/mruby/mrbgems/mruby-complex/README.md | 55 + .../mruby/mrbgems/mruby-complex/mrbgem.rake | 7 + .../mrbgems/mruby-complex/mrblib/complex.rb | 259 + .../mruby/mrbgems/mruby-complex/src/complex.c | 596 +++ .../mrbgems/mruby-complex/test/complex.rb | 174 + vendor/mruby/mrbgems/mruby-data/README.md | 126 + vendor/mruby/mrbgems/mruby-data/mrbgem.rake | 5 + vendor/mruby/mrbgems/mruby-data/src/data.c | 549 ++ vendor/mruby/mrbgems/mruby-data/test/data.rb | 76 + vendor/mruby/mrbgems/mruby-dir/README.md | 53 + .../mruby/mrbgems/mruby-dir/include/dir_hal.h | 79 + vendor/mruby/mrbgems/mruby-dir/mrbgem.rake | 35 + vendor/mruby/mrbgems/mruby-dir/mrblib/dir.rb | 124 + vendor/mruby/mrbgems/mruby-dir/src/dir.c | 492 ++ vendor/mruby/mrbgems/mruby-dir/test/dir.rb | 138 + vendor/mruby/mrbgems/mruby-dir/test/dirtest.c | 125 + vendor/mruby/mrbgems/mruby-encoding/README.md | 96 + .../mruby/mrbgems/mruby-encoding/mrbgem.rake | 8 + .../mrbgems/mruby-encoding/src/encoding.c | 127 + .../mrbgems/mruby-encoding/test/numeric.rb | 27 + .../mrbgems/mruby-encoding/test/string.rb | 30 + .../mruby/mrbgems/mruby-enum-chain/README.md | 80 + .../mrbgems/mruby-enum-chain/mrbgem.rake | 6 + .../mrbgems/mruby-enum-chain/mrblib/chain.rb | 149 + .../mruby-enum-chain/test/enum_chain.rb | 108 + vendor/mruby/mrbgems/mruby-enum-ext/README.md | 487 ++ .../mruby/mrbgems/mruby-enum-ext/mrbgem.rake | 5 + .../mrbgems/mruby-enum-ext/mrblib/enum.rb | 938 ++++ .../mruby/mrbgems/mruby-enum-ext/test/enum.rb | 223 + .../mruby/mrbgems/mruby-enum-lazy/README.md | 91 + .../mruby/mrbgems/mruby-enum-lazy/mrbgem.rake | 7 + .../mrbgems/mruby-enum-lazy/mrblib/lazy.rb | 364 ++ .../mrbgems/mruby-enum-lazy/test/lazy.rb | 71 + .../mruby/mrbgems/mruby-enumerator/README.md | 89 + .../mrbgems/mruby-enumerator/mrbgem.rake | 6 + .../mruby-enumerator/mrblib/enumerator.rb | 861 ++++ .../mruby-enumerator/test/enumerator.rb | 664 +++ vendor/mruby/mrbgems/mruby-errno/README.md | 83 + vendor/mruby/mrbgems/mruby-errno/mrbgem.rake | 5 + .../mruby/mrbgems/mruby-errno/mrblib/errno.rb | 50 + vendor/mruby/mrbgems/mruby-errno/src/errno.c | 334 ++ vendor/mruby/mrbgems/mruby-errno/src/gen.rb | 18 + .../mrbgems/mruby-errno/src/known_errors.def | 156 + .../mruby-errno/src/known_errors_def.cstub | 780 +++ .../mruby/mrbgems/mruby-errno/test/errno.rb | 57 + vendor/mruby/mrbgems/mruby-error/README.md | 103 + vendor/mruby/mrbgems/mruby-error/mrbgem.rake | 5 + .../mruby/mrbgems/mruby-error/src/exception.c | 143 + .../mrbgems/mruby-error/test/exception.c | 60 + .../mrbgems/mruby-error/test/exception.rb | 55 + vendor/mruby/mrbgems/mruby-eval/README.md | 26 + vendor/mruby/mrbgems/mruby-eval/mrbgem.rake | 10 + vendor/mruby/mrbgems/mruby-eval/src/eval.c | 436 ++ .../mruby/mrbgems/mruby-eval/test/binding.rb | 81 + vendor/mruby/mrbgems/mruby-eval/test/eval.rb | 185 + vendor/mruby/mrbgems/mruby-exit/mrbgem.rake | 5 + .../mruby/mrbgems/mruby-exit/src/mruby_exit.c | 82 + vendor/mruby/mrbgems/mruby-fiber/mrbgem.rake | 5 + vendor/mruby/mrbgems/mruby-fiber/src/fiber.c | 574 +++ .../mruby/mrbgems/mruby-fiber/test/fiber.rb | 210 + .../mruby/mrbgems/mruby-fiber/test/fiber2.rb | 155 + .../mrbgems/mruby-fiber/test/fibertest.c | 87 + vendor/mruby/mrbgems/mruby-hash-ext/README.md | 392 ++ .../mruby/mrbgems/mruby-hash-ext/mrbgem.rake | 6 + .../mrbgems/mruby-hash-ext/mrblib/hash.rb | 408 ++ .../mrbgems/mruby-hash-ext/src/hash_ext.c | 391 ++ .../mruby/mrbgems/mruby-hash-ext/test/hash.rb | 317 ++ vendor/mruby/mrbgems/mruby-io/README.md | 198 + .../mruby/mrbgems/mruby-io/include/io_hal.h | 451 ++ .../mruby/mrbgems/mruby-io/include/mruby/io.h | 76 + vendor/mruby/mrbgems/mruby-io/mrbgem.rake | 34 + vendor/mruby/mrbgems/mruby-io/mrblib/file.rb | 109 + .../mrbgems/mruby-io/mrblib/file_constants.rb | 24 + vendor/mruby/mrbgems/mruby-io/mrblib/io.rb | 303 ++ .../mruby/mrbgems/mruby-io/mrblib/kernel.rb | 175 + vendor/mruby/mrbgems/mruby-io/src/file.c | 1191 +++++ vendor/mruby/mrbgems/mruby-io/src/file_test.c | 402 ++ vendor/mruby/mrbgems/mruby-io/src/io.c | 2259 +++++++++ .../mruby/mrbgems/mruby-io/src/mruby_io_gem.c | 21 + vendor/mruby/mrbgems/mruby-io/test/file.rb | 415 ++ .../mruby/mrbgems/mruby-io/test/file_test.rb | 112 + vendor/mruby/mrbgems/mruby-io/test/io.rb | 668 +++ .../mrbgems/mruby-io/test/mruby_io_test.c | 293 ++ .../mruby/mrbgems/mruby-kernel-ext/README.md | 165 + .../mrbgems/mruby-kernel-ext/mrbgem.rake | 5 + .../mrbgems/mruby-kernel-ext/src/kernel.c | 315 ++ .../mrbgems/mruby-kernel-ext/test/kernel.rb | 134 + vendor/mruby/mrbgems/mruby-math/README.md | 77 + vendor/mruby/mrbgems/mruby-math/mrbgem.rake | 5 + vendor/mruby/mrbgems/mruby-math/src/math.c | 752 +++ vendor/mruby/mrbgems/mruby-math/test/math.rb | 201 + vendor/mruby/mrbgems/mruby-metaprog/README.md | 123 + .../mruby/mrbgems/mruby-metaprog/mrbgem.rake | 5 + .../mrbgems/mruby-metaprog/src/metaprog.c | 738 +++ .../mrbgems/mruby-metaprog/test/metaprog.rb | 465 ++ vendor/mruby/mrbgems/mruby-method/README.md | 66 + vendor/mruby/mrbgems/mruby-method/mrbgem.rake | 7 + .../mrbgems/mruby-method/mrblib/method.rb | 73 + .../mruby/mrbgems/mruby-method/src/method.c | 889 ++++ .../mruby/mrbgems/mruby-method/test/method.rb | 514 ++ .../mruby/mrbgems/mruby-numeric-ext/README.md | 78 + .../mrbgems/mruby-numeric-ext/mrbgem.rake | 5 + .../mruby-numeric-ext/mrblib/numeric_ext.rb | 125 + .../mruby-numeric-ext/src/numeric_ext.c | 522 ++ .../mrbgems/mruby-numeric-ext/test/numeric.rb | 137 + .../mruby/mrbgems/mruby-object-ext/README.md | 144 + .../mrbgems/mruby-object-ext/mrbgem.rake | 5 + .../mrbgems/mruby-object-ext/mrblib/object.rb | 33 + .../mrbgems/mruby-object-ext/src/object.c | 127 + .../mrbgems/mruby-object-ext/test/nil.rb | 16 + .../mrbgems/mruby-object-ext/test/object.rb | 67 + .../mruby-object-ext/test/object_ext.c | 17 + .../mruby/mrbgems/mruby-objectspace/README.md | 59 + .../mrbgems/mruby-objectspace/mrbgem.rake | 5 + .../mruby-objectspace/src/mruby_objectspace.c | 187 + .../mruby-objectspace/test/objectspace.rb | 60 + .../mruby/mrbgems/mruby-os-memsize/README.md | 75 + .../mrbgems/mruby-os-memsize/mrbgem.rake | 10 + .../mrbgems/mruby-os-memsize/src/memsize.c | 271 + .../mrbgems/mruby-os-memsize/test/memsize.rb | 63 + vendor/mruby/mrbgems/mruby-pack/README.md | 140 + vendor/mruby/mrbgems/mruby-pack/mrbgem.rake | 5 + vendor/mruby/mrbgems/mruby-pack/src/pack.c | 2128 ++++++++ vendor/mruby/mrbgems/mruby-pack/test/pack.rb | 202 + .../mrbgems/mruby-proc-binding/README.md | 140 + .../mrbgems/mruby-proc-binding/mrbgem.rake | 10 + .../mruby-proc-binding/src/proc_binding.c | 75 + .../mruby-proc-binding/test/proc_binding.c | 14 + .../mruby-proc-binding/test/proc_binding.rb | 22 + vendor/mruby/mrbgems/mruby-proc-ext/README.md | 107 + .../mruby/mrbgems/mruby-proc-ext/mrbgem.rake | 5 + .../mrbgems/mruby-proc-ext/mrblib/proc.rb | 130 + .../mruby/mrbgems/mruby-proc-ext/src/proc.c | 266 + .../mruby/mrbgems/mruby-proc-ext/test/proc.c | 62 + .../mruby/mrbgems/mruby-proc-ext/test/proc.rb | 130 + vendor/mruby/mrbgems/mruby-random/README.md | 272 + vendor/mruby/mrbgems/mruby-random/mrbgem.rake | 5 + .../mruby/mrbgems/mruby-random/src/random.c | 607 +++ .../mruby/mrbgems/mruby-random/test/random.rb | 151 + .../mruby/mrbgems/mruby-range-ext/README.md | 93 + .../mruby/mrbgems/mruby-range-ext/mrbgem.rake | 5 + .../mrbgems/mruby-range-ext/mrblib/range.rb | 155 + .../mruby/mrbgems/mruby-range-ext/src/range.c | 235 + .../mrbgems/mruby-range-ext/test/range.rb | 211 + vendor/mruby/mrbgems/mruby-rational/README.md | 61 + .../mruby/mrbgems/mruby-rational/mrbgem.rake | 7 + .../mrbgems/mruby-rational/mrblib/rational.rb | 66 + .../mrbgems/mruby-rational/src/rational.c | 1268 +++++ .../mrbgems/mruby-rational/test/rational.rb | 316 ++ vendor/mruby/mrbgems/mruby-set/LICENSE | 24 + vendor/mruby/mrbgems/mruby-set/README.md | 260 + vendor/mruby/mrbgems/mruby-set/mrbgem.rake | 9 + vendor/mruby/mrbgems/mruby-set/mrblib/set.rb | 325 ++ vendor/mruby/mrbgems/mruby-set/mruby-set.gem | 6 + vendor/mruby/mrbgems/mruby-set/src/set.c | 1534 ++++++ vendor/mruby/mrbgems/mruby-set/test/set.rb | 764 +++ vendor/mruby/mrbgems/mruby-sleep/README.md | 29 + .../mrbgems/mruby-sleep/example/sleep.rb | 2 + vendor/mruby/mrbgems/mruby-sleep/mrbgem.rake | 5 + vendor/mruby/mrbgems/mruby-sleep/src/sleep.c | 186 + .../mrbgems/mruby-sleep/test/sleep_test.rb | 29 + vendor/mruby/mrbgems/mruby-socket/README.md | 56 + .../mrbgems/mruby-socket/include/socket_hal.h | 83 + vendor/mruby/mrbgems/mruby-socket/mrbgem.rake | 37 + .../mrbgems/mruby-socket/mrblib/socket.rb | 1129 +++++ .../mrbgems/mruby-socket/src/const.cstub | 480 ++ .../mruby/mrbgems/mruby-socket/src/const.def | 172 + vendor/mruby/mrbgems/mruby-socket/src/gen.rb | 17 + .../mruby/mrbgems/mruby-socket/src/socket.c | 1373 +++++ .../mrbgems/mruby-socket/test/addrinfo.rb | 91 + .../mrbgems/mruby-socket/test/basicsocket.rb | 17 + .../mrbgems/mruby-socket/test/ipsocket.rb | 44 + .../mruby/mrbgems/mruby-socket/test/socket.rb | 38 + .../mrbgems/mruby-socket/test/sockettest.c | 84 + .../mrbgems/mruby-socket/test/tcpsocket.rb | 4 + .../mrbgems/mruby-socket/test/udpsocket.rb | 16 + .../mruby/mrbgems/mruby-socket/test/unix.rb | 130 + vendor/mruby/mrbgems/mruby-sprintf/README.md | 235 + .../mruby/mrbgems/mruby-sprintf/mrbgem.rake | 5 + .../mrbgems/mruby-sprintf/mrblib/string.rb | 24 + .../mruby/mrbgems/mruby-sprintf/src/sprintf.c | 1201 +++++ .../mrbgems/mruby-sprintf/test/sprintf.rb | 108 + vendor/mruby/mrbgems/mruby-strftime/README.md | 140 + .../mruby/mrbgems/mruby-strftime/mrbgem.rake | 7 + .../mrbgems/mruby-strftime/src/strftime.c | 118 + .../mrbgems/mruby-strftime/test/strftime.rb | 152 + .../mruby/mrbgems/mruby-string-ext/README.md | 886 ++++ .../mrbgems/mruby-string-ext/mrbgem.rake | 5 + .../mrbgems/mruby-string-ext/mrblib/string.rb | 166 + .../mrbgems/mruby-string-ext/src/string.c | 2301 +++++++++ .../mrbgems/mruby-string-ext/test/numeric.rb | 27 + .../mrbgems/mruby-string-ext/test/range.rb | 26 + .../mrbgems/mruby-string-ext/test/string.rb | 780 +++ vendor/mruby/mrbgems/mruby-struct/README.md | 105 + vendor/mruby/mrbgems/mruby-struct/mrbgem.rake | 5 + .../mrbgems/mruby-struct/mrblib/struct.rb | 69 + .../mruby/mrbgems/mruby-struct/src/struct.c | 811 +++ .../mruby/mrbgems/mruby-struct/test/struct.rb | 303 ++ .../mruby/mrbgems/mruby-symbol-ext/README.md | 50 + .../mrbgems/mruby-symbol-ext/mrbgem.rake | 5 + .../mrbgems/mruby-symbol-ext/mrblib/symbol.rb | 72 + .../mrbgems/mruby-symbol-ext/src/symbol.c | 78 + .../mrbgems/mruby-symbol-ext/test/symbol.rb | 55 + vendor/mruby/mrbgems/mruby-task/README.md | 770 +++ .../mrbgems/mruby-task/examples/inspection.rb | 65 + .../mrbgems/mruby-task/examples/priority.rb | 41 + .../mruby-task/examples/producer_consumer.rb | 58 + .../mrbgems/mruby-task/examples/simple.rb | 27 + .../mrbgems/mruby-task/examples/statistics.rb | 59 + .../mruby-task/examples/suspend_resume.rb | 47 + .../mrbgems/mruby-task/examples/task_pass.rb | 21 + .../mruby/mrbgems/mruby-task/include/task.h | 143 + .../mrbgems/mruby-task/include/task_hal.h | 162 + vendor/mruby/mrbgems/mruby-task/mrbgem.rake | 36 + vendor/mruby/mrbgems/mruby-task/src/task.c | 1572 ++++++ vendor/mruby/mrbgems/mruby-task/test/task.rb | 185 + .../mruby-test-inline-struct/mrbgem.rake | 5 + .../mruby-test-inline-struct/test/inline.c | 92 + .../mruby-test-inline-struct/test/inline.rb | 118 + vendor/mruby/mrbgems/mruby-test/README.md | 7 + vendor/mruby/mrbgems/mruby-test/driver.c | 315 ++ vendor/mruby/mrbgems/mruby-test/mrbgem.rake | 179 + vendor/mruby/mrbgems/mruby-test/vformat.c | 151 + vendor/mruby/mrbgems/mruby-time/README.md | 102 + .../mrbgems/mruby-time/include/mruby/time.h | 27 + vendor/mruby/mrbgems/mruby-time/mrbgem.rake | 5 + vendor/mruby/mrbgems/mruby-time/src/time.c | 1738 +++++++ vendor/mruby/mrbgems/mruby-time/test/time.rb | 313 ++ .../mrbgems/mruby-toplevel-ext/README.md | 32 + .../mrbgems/mruby-toplevel-ext/mrbgem.rake | 5 + .../mruby-toplevel-ext/mrblib/toplevel.rb | 24 + .../mruby-toplevel-ext/test/toplevel.rb | 23 + vendor/mruby/mrbgems/stdlib-ext.gembox | 21 + vendor/mruby/mrbgems/stdlib-io.gembox | 15 + vendor/mruby/mrbgems/stdlib.gembox | 63 + vendor/mruby/mrblib/10error.rb | 23 + vendor/mruby/mrblib/array.rb | 102 + vendor/mruby/mrblib/compar.rb | 102 + vendor/mruby/mrblib/enum.rb | 358 ++ vendor/mruby/mrblib/hash.rb | 276 ++ vendor/mruby/mrblib/kernel.rb | 45 + vendor/mruby/mrblib/numeric.rb | 160 + vendor/mruby/mrblib/range.rb | 98 + vendor/mruby/mrblib/string.rb | 173 + vendor/mruby/mrblib/symbol.rb | 8 + vendor/mruby/mruby-source.gemspec | 17 + vendor/mruby/oss-fuzz/config/mruby.dict | 105 + .../oss-fuzz/config/mruby_fuzzer.options | 5 + .../config/mruby_proto_fuzzer.options | 4 + vendor/mruby/oss-fuzz/mruby_fuzzer.c | 18 + vendor/mruby/oss-fuzz/mruby_proto_fuzzer.cpp | 45 + vendor/mruby/oss-fuzz/proto_to_ruby.cpp | 455 ++ vendor/mruby/oss-fuzz/proto_to_ruby.h | 55 + vendor/mruby/oss-fuzz/ruby.proto | 201 + vendor/mruby/src/allocf.c | 37 + vendor/mruby/src/array.c | 2301 +++++++++ vendor/mruby/src/backtrace.c | 293 ++ vendor/mruby/src/cdump.c | 497 ++ vendor/mruby/src/class.c | 4394 +++++++++++++++++ vendor/mruby/src/codedump.c | 693 +++ vendor/mruby/src/debug.c | 290 ++ vendor/mruby/src/dump.c | 998 ++++ vendor/mruby/src/enum.c | 29 + vendor/mruby/src/error.c | 936 ++++ vendor/mruby/src/etc.c | 507 ++ vendor/mruby/src/fmt_fp.c | 380 ++ vendor/mruby/src/gc.c | 1707 +++++++ vendor/mruby/src/hash.c | 2354 +++++++++ vendor/mruby/src/init.c | 50 + vendor/mruby/src/kernel.c | 717 +++ vendor/mruby/src/load.c | 857 ++++ vendor/mruby/src/mempool.c | 225 + vendor/mruby/src/numeric.c | 2419 +++++++++ vendor/mruby/src/numops.c | 111 + vendor/mruby/src/object.c | 882 ++++ vendor/mruby/src/print.c | 135 + vendor/mruby/src/proc.c | 571 +++ vendor/mruby/src/range.c | 592 +++ vendor/mruby/src/readfloat.c | 228 + vendor/mruby/src/readint.c | 27 + vendor/mruby/src/readnum.c | 43 + vendor/mruby/src/state.c | 254 + vendor/mruby/src/string.c | 3576 ++++++++++++++ vendor/mruby/src/symbol.c | 1022 ++++ vendor/mruby/src/value_array.h | 28 + vendor/mruby/src/variable.c | 1846 +++++++ vendor/mruby/src/version.c | 17 + vendor/mruby/src/vm.c | 3723 ++++++++++++++ vendor/mruby/tasks/amalgam.rake | 34 + vendor/mruby/tasks/benchmark.rake | 93 + vendor/mruby/tasks/bin.rake | 23 + vendor/mruby/tasks/doc.rake | 118 + vendor/mruby/tasks/install.rake | 40 + vendor/mruby/tasks/libmruby.rake | 90 + vendor/mruby/tasks/mrbgems.rake | 152 + vendor/mruby/tasks/mrblib.rake | 29 + vendor/mruby/tasks/presym.rake | 72 + vendor/mruby/tasks/test.rake | 84 + vendor/mruby/tasks/toolchains/android.rake | 228 + vendor/mruby/tasks/toolchains/clang.rake | 8 + vendor/mruby/tasks/toolchains/emscripten.rake | 57 + vendor/mruby/tasks/toolchains/gcc.rake | 74 + vendor/mruby/tasks/toolchains/openwrt.rake | 32 + vendor/mruby/tasks/toolchains/visualcpp.rake | 48 + vendor/mruby/test/assert.rb | 404 ++ vendor/mruby/test/bintest.rb | 55 + vendor/mruby/test/t/argumenterror.rb | 37 + vendor/mruby/test/t/array.rb | 478 ++ vendor/mruby/test/t/basicobject.rb | 10 + vendor/mruby/test/t/bs_block.rb | 621 +++ vendor/mruby/test/t/bs_literal.rb | 38 + vendor/mruby/test/t/class.rb | 505 ++ vendor/mruby/test/t/codegen.rb | 196 + vendor/mruby/test/t/comparable.rb | 79 + vendor/mruby/test/t/ensure.rb | 36 + vendor/mruby/test/t/enumerable.rb | 134 + vendor/mruby/test/t/exception.rb | 425 ++ vendor/mruby/test/t/false.rb | 31 + vendor/mruby/test/t/float.rb | 296 ++ vendor/mruby/test/t/gc.rb | 45 + vendor/mruby/test/t/hash.rb | 976 ++++ vendor/mruby/test/t/indexerror.rb | 6 + vendor/mruby/test/t/integer.rb | 247 + vendor/mruby/test/t/iterations.rb | 61 + vendor/mruby/test/t/kernel.rb | 462 ++ vendor/mruby/test/t/lang.rb | 74 + vendor/mruby/test/t/literals.rb | 386 ++ vendor/mruby/test/t/localjumperror.rb | 13 + vendor/mruby/test/t/methods.rb | 138 + vendor/mruby/test/t/module.rb | 934 ++++ vendor/mruby/test/t/nameerror.rb | 28 + vendor/mruby/test/t/nil.rb | 39 + vendor/mruby/test/t/nomethoderror.rb | 22 + vendor/mruby/test/t/numeric.rb | 114 + vendor/mruby/test/t/object.rb | 10 + vendor/mruby/test/t/proc.rb | 198 + vendor/mruby/test/t/range.rb | 194 + vendor/mruby/test/t/rangeerror.rb | 6 + vendor/mruby/test/t/regexperror.rb | 4 + vendor/mruby/test/t/runtimeerror.rb | 6 + vendor/mruby/test/t/standarderror.rb | 6 + vendor/mruby/test/t/string.rb | 981 ++++ vendor/mruby/test/t/superclass.rb | 46 + vendor/mruby/test/t/symbol.rb | 30 + vendor/mruby/test/t/syntax.rb | 1311 +++++ vendor/mruby/test/t/true.rb | 31 + vendor/mruby/test/t/typeerror.rb | 6 + vendor/mruby/test/t/unicode.rb | 39 + vendor/mruby/test/t/vformat.rb | 57 + vendor/mruby/tools/lrama/LEGAL.md | 12 + vendor/mruby/tools/lrama/MIT | 21 + vendor/mruby/tools/lrama/NEWS.md | 696 +++ vendor/mruby/tools/lrama/exe/lrama | 7 + vendor/mruby/tools/lrama/lib/lrama.rb | 22 + vendor/mruby/tools/lrama/lib/lrama/bitmap.rb | 34 + vendor/mruby/tools/lrama/lib/lrama/command.rb | 68 + vendor/mruby/tools/lrama/lib/lrama/context.rb | 499 ++ .../tools/lrama/lib/lrama/counterexamples.rb | 298 ++ .../lib/lrama/counterexamples/derivation.rb | 66 + .../lib/lrama/counterexamples/example.rb | 129 + .../lrama/lib/lrama/counterexamples/path.rb | 29 + .../lrama/counterexamples/production_path.rb | 19 + .../lib/lrama/counterexamples/start_path.rb | 23 + .../lib/lrama/counterexamples/state_item.rb | 8 + .../lrama/counterexamples/transition_path.rb | 19 + .../lrama/lib/lrama/counterexamples/triple.rb | 23 + .../tools/lrama/lib/lrama/diagnostics.rb | 36 + vendor/mruby/tools/lrama/lib/lrama/digraph.rb | 83 + vendor/mruby/tools/lrama/lib/lrama/grammar.rb | 407 ++ .../lrama/lib/lrama/grammar/auxiliary.rb | 9 + .../tools/lrama/lib/lrama/grammar/binding.rb | 67 + .../tools/lrama/lib/lrama/grammar/code.rb | 53 + .../lib/lrama/grammar/code/destructor_code.rb | 42 + .../lrama/grammar/code/initial_action_code.rb | 36 + .../lrama/grammar/code/no_reference_code.rb | 30 + .../lib/lrama/grammar/code/printer_code.rb | 42 + .../lib/lrama/grammar/code/rule_action.rb | 92 + .../tools/lrama/lib/lrama/grammar/counter.rb | 17 + .../lrama/lib/lrama/grammar/destructor.rb | 11 + .../lrama/lib/lrama/grammar/error_token.rb | 11 + .../lib/lrama/grammar/parameterizing_rule.rb | 5 + .../grammar/parameterizing_rule/resolver.rb | 62 + .../lrama/grammar/parameterizing_rule/rhs.rb | 40 + .../lrama/grammar/parameterizing_rule/rule.rb | 24 + .../lrama/lib/lrama/grammar/percent_code.rb | 14 + .../lrama/lib/lrama/grammar/precedence.rb | 13 + .../tools/lrama/lib/lrama/grammar/printer.rb | 11 + .../lrama/lib/lrama/grammar/reference.rb | 16 + .../tools/lrama/lib/lrama/grammar/rule.rb | 75 + .../lrama/lib/lrama/grammar/rule_builder.rb | 255 + .../tools/lrama/lib/lrama/grammar/stdlib.y | 122 + .../tools/lrama/lib/lrama/grammar/symbol.rb | 105 + .../tools/lrama/lib/lrama/grammar/symbols.rb | 3 + .../lib/lrama/grammar/symbols/resolver.rb | 301 ++ .../tools/lrama/lib/lrama/grammar/type.rb | 20 + .../tools/lrama/lib/lrama/grammar/union.rb | 12 + .../lrama/lib/lrama/grammar_validator.rb | 37 + vendor/mruby/tools/lrama/lib/lrama/lexer.rb | 191 + .../lrama/lib/lrama/lexer/grammar_file.rb | 40 + .../tools/lrama/lib/lrama/lexer/location.rb | 115 + .../tools/lrama/lib/lrama/lexer/token.rb | 70 + .../tools/lrama/lib/lrama/lexer/token/char.rb | 11 + .../lrama/lib/lrama/lexer/token/ident.rb | 11 + .../lib/lrama/lexer/token/instantiate_rule.rb | 30 + .../tools/lrama/lib/lrama/lexer/token/tag.rb | 16 + .../lrama/lib/lrama/lexer/token/user_code.rb | 83 + vendor/mruby/tools/lrama/lib/lrama/logger.rb | 21 + .../tools/lrama/lib/lrama/option_parser.rb | 169 + vendor/mruby/tools/lrama/lib/lrama/options.rb | 28 + vendor/mruby/tools/lrama/lib/lrama/output.rb | 459 ++ vendor/mruby/tools/lrama/lib/lrama/parser.rb | 2144 ++++++++ vendor/mruby/tools/lrama/lib/lrama/report.rb | 4 + .../tools/lrama/lib/lrama/report/duration.rb | 27 + .../tools/lrama/lib/lrama/report/profile.rb | 16 + vendor/mruby/tools/lrama/lib/lrama/state.rb | 433 ++ .../tools/lrama/lib/lrama/state/reduce.rb | 37 + .../lib/lrama/state/reduce_reduce_conflict.rb | 11 + .../lib/lrama/state/resolved_conflict.rb | 31 + .../tools/lrama/lib/lrama/state/shift.rb | 15 + .../lib/lrama/state/shift_reduce_conflict.rb | 11 + vendor/mruby/tools/lrama/lib/lrama/states.rb | 595 +++ .../tools/lrama/lib/lrama/states/item.rb | 91 + .../tools/lrama/lib/lrama/states_reporter.rb | 362 ++ .../tools/lrama/lib/lrama/trace_reporter.rb | 45 + vendor/mruby/tools/lrama/lib/lrama/version.rb | 5 + .../mruby/tools/lrama/template/bison/_yacc.h | 71 + .../mruby/tools/lrama/template/bison/yacc.c | 2068 ++++++++ .../mruby/tools/lrama/template/bison/yacc.h | 40 + 697 files changed, 150284 insertions(+), 22 deletions(-) create mode 100644 examples/scripts/languages/ruby.rb create mode 100644 src/mruby/build_config.rb create mode 100644 src/mruby/mrubyAdapter.c create mode 100644 src/mruby/mrubyAdapter.h create mode 100644 src/mruby/mrubyEngine.c create mode 100644 tests/testEngineMruby.c create mode 100644 vendor/mruby/.codespellrc create mode 100644 vendor/mruby/.dockerignore create mode 100644 vendor/mruby/.editorconfig create mode 100644 vendor/mruby/.pre-commit-config.yaml create mode 100644 vendor/mruby/.prettierignore create mode 100644 vendor/mruby/.prettierrc create mode 100644 vendor/mruby/.travis.yml create mode 100644 vendor/mruby/.yardopts create mode 100644 vendor/mruby/AUTHORS create mode 100644 vendor/mruby/CONTRIBUTING.md create mode 100644 vendor/mruby/Dockerfile create mode 100644 vendor/mruby/Doxyfile create mode 100644 vendor/mruby/Gemfile create mode 100644 vendor/mruby/Gemfile.lock create mode 100644 vendor/mruby/LEGAL create mode 100644 vendor/mruby/LICENSE create mode 100644 vendor/mruby/Makefile create mode 100644 vendor/mruby/NEWS.md create mode 100644 vendor/mruby/README.md create mode 100644 vendor/mruby/Rakefile create mode 100644 vendor/mruby/SECURITY.md create mode 100644 vendor/mruby/TODO.md create mode 100644 vendor/mruby/appveyor.yml create mode 120000 vendor/mruby/bin/mirb create mode 120000 vendor/mruby/bin/mrbc create mode 120000 vendor/mruby/bin/mrdb create mode 120000 vendor/mruby/bin/mruby create mode 120000 vendor/mruby/bin/mruby-config create mode 120000 vendor/mruby/bin/mruby-strip create mode 100644 vendor/mruby/build_config.rb create mode 100644 vendor/mruby/build_config/ArduinoDue.rb create mode 100644 vendor/mruby/build_config/IntelEdison.rb create mode 100644 vendor/mruby/build_config/IntelGalileo.rb create mode 100644 vendor/mruby/build_config/RX630.rb create mode 100644 vendor/mruby/build_config/android_arm64_v8a.rb create mode 100644 vendor/mruby/build_config/android_armeabi_v7a_neon_hard.rb create mode 100644 vendor/mruby/build_config/bench.rb create mode 100644 vendor/mruby/build_config/boxing.rb create mode 100644 vendor/mruby/build_config/chipKITMax32.rb create mode 100644 vendor/mruby/build_config/ci/gcc-clang.rb create mode 100644 vendor/mruby/build_config/ci/msvc.rb create mode 100644 vendor/mruby/build_config/clang-asan.rb create mode 100644 vendor/mruby/build_config/cosmopolitan.rb create mode 100644 vendor/mruby/build_config/cross-32bit.rb create mode 100644 vendor/mruby/build_config/cross-mingw-winetest.rb create mode 100644 vendor/mruby/build_config/cross-mingw.rb create mode 100644 vendor/mruby/build_config/default.rb create mode 100644 vendor/mruby/build_config/dreamcast_shelf.rb create mode 100644 vendor/mruby/build_config/emscripten-cxx.rb create mode 100644 vendor/mruby/build_config/emscripten.rb create mode 100644 vendor/mruby/build_config/gameboyadvance.rb create mode 100755 vendor/mruby/build_config/helpers/wine_runner.rb create mode 100644 vendor/mruby/build_config/host-cxx.rb create mode 100644 vendor/mruby/build_config/host-debug.rb create mode 100644 vendor/mruby/build_config/host-f32.rb create mode 100644 vendor/mruby/build_config/host-gprof.rb create mode 100644 vendor/mruby/build_config/host-m32-f32.rb create mode 100644 vendor/mruby/build_config/host-m32.rb create mode 100644 vendor/mruby/build_config/host-nofloat.rb create mode 100644 vendor/mruby/build_config/host-shared.rb create mode 100644 vendor/mruby/build_config/i586-pc-msdosdjgpp.rb create mode 100644 vendor/mruby/build_config/luckfox_pico.rb create mode 100644 vendor/mruby/build_config/milkv_duo.rb create mode 100644 vendor/mruby/build_config/minimal.rb create mode 100644 vendor/mruby/build_config/mrbc.rb create mode 100644 vendor/mruby/build_config/nintendo_switch.rb create mode 100644 vendor/mruby/build_config/nintendo_wii.rb create mode 100644 vendor/mruby/build_config/no-float.rb create mode 100644 vendor/mruby/build_config/playstationportable.rb create mode 100644 vendor/mruby/build_config/serenity.rb create mode 100644 vendor/mruby/docker-compose.yml create mode 100644 vendor/mruby/examples/mrbgems/c_and_ruby_extension_example/README.md create mode 100644 vendor/mruby/examples/mrbgems/c_and_ruby_extension_example/mrbgem.rake create mode 100644 vendor/mruby/examples/mrbgems/c_and_ruby_extension_example/mrblib/example.rb create mode 100644 vendor/mruby/examples/mrbgems/c_and_ruby_extension_example/src/example.c create mode 100644 vendor/mruby/examples/mrbgems/c_and_ruby_extension_example/test/example.rb create mode 100644 vendor/mruby/examples/mrbgems/c_extension_example/README.md create mode 100644 vendor/mruby/examples/mrbgems/c_extension_example/mrbgem.rake create mode 100644 vendor/mruby/examples/mrbgems/c_extension_example/src/example.c create mode 100644 vendor/mruby/examples/mrbgems/c_extension_example/test/example.c create mode 100644 vendor/mruby/examples/mrbgems/c_extension_example/test/example.rb create mode 100644 vendor/mruby/examples/mrbgems/cdata_extension_example/README.md create mode 100644 vendor/mruby/examples/mrbgems/cdata_extension_example/mrbgem.rake create mode 100644 vendor/mruby/examples/mrbgems/cdata_extension_example/src/example.c create mode 100644 vendor/mruby/examples/mrbgems/cdata_extension_example/test/example.c create mode 100644 vendor/mruby/examples/mrbgems/mruby-YOUR-bigint/TODO-HINT.md create mode 100644 vendor/mruby/examples/mrbgems/mruby-YOUR-bigint/mrbgem.rake create mode 100644 vendor/mruby/examples/mrbgems/ruby_extension_example/README.md create mode 100644 vendor/mruby/examples/mrbgems/ruby_extension_example/mrbgem.rake create mode 100644 vendor/mruby/examples/mrbgems/ruby_extension_example/mrblib/example.rb create mode 100644 vendor/mruby/examples/mrbgems/ruby_extension_example/test/example.rb create mode 100644 vendor/mruby/include/mrbconf.h create mode 100644 vendor/mruby/include/mruby.h create mode 100644 vendor/mruby/include/mruby/array.h create mode 100644 vendor/mruby/include/mruby/boxing_nan.h create mode 100644 vendor/mruby/include/mruby/boxing_no.h create mode 100644 vendor/mruby/include/mruby/boxing_word.h create mode 100644 vendor/mruby/include/mruby/class.h create mode 100644 vendor/mruby/include/mruby/common.h create mode 100644 vendor/mruby/include/mruby/compile.h create mode 100644 vendor/mruby/include/mruby/data.h create mode 100644 vendor/mruby/include/mruby/debug.h create mode 100644 vendor/mruby/include/mruby/dump.h create mode 100644 vendor/mruby/include/mruby/endian.h create mode 100644 vendor/mruby/include/mruby/error.h create mode 100644 vendor/mruby/include/mruby/gc.h create mode 100644 vendor/mruby/include/mruby/hash.h create mode 100644 vendor/mruby/include/mruby/internal.h create mode 100644 vendor/mruby/include/mruby/irep.h create mode 100644 vendor/mruby/include/mruby/istruct.h create mode 100644 vendor/mruby/include/mruby/khash.h create mode 100644 vendor/mruby/include/mruby/mempool.h create mode 100644 vendor/mruby/include/mruby/numeric.h create mode 100644 vendor/mruby/include/mruby/object.h create mode 100644 vendor/mruby/include/mruby/opcode.h create mode 100644 vendor/mruby/include/mruby/ops.h create mode 100644 vendor/mruby/include/mruby/presym.h create mode 100644 vendor/mruby/include/mruby/presym/scanning.h create mode 100644 vendor/mruby/include/mruby/proc.h create mode 100644 vendor/mruby/include/mruby/range.h create mode 100644 vendor/mruby/include/mruby/re.h create mode 100644 vendor/mruby/include/mruby/string.h create mode 100644 vendor/mruby/include/mruby/throw.h create mode 100644 vendor/mruby/include/mruby/value.h create mode 100644 vendor/mruby/include/mruby/variable.h create mode 100644 vendor/mruby/include/mruby/version.h create mode 100644 vendor/mruby/lib/mruby/amalgam.rb create mode 100644 vendor/mruby/lib/mruby/build.rb create mode 100644 vendor/mruby/lib/mruby/build/command.rb create mode 100644 vendor/mruby/lib/mruby/build/load_gems.rb create mode 100644 vendor/mruby/lib/mruby/core_ext.rb create mode 100644 vendor/mruby/lib/mruby/doc.rb create mode 100644 vendor/mruby/lib/mruby/gem.rb create mode 100644 vendor/mruby/lib/mruby/lockfile.rb create mode 100644 vendor/mruby/lib/mruby/presym.rb create mode 100644 vendor/mruby/lib/mruby/source.rb create mode 100755 vendor/mruby/minirake create mode 100644 vendor/mruby/mrbgems/default-no-fpu.gembox create mode 100644 vendor/mruby/mrbgems/default-no-stdio.gembox create mode 100644 vendor/mruby/mrbgems/default.gembox create mode 100644 vendor/mruby/mrbgems/full-core.gembox create mode 100644 vendor/mruby/mrbgems/hal-posix-dir/mrbgem.rake create mode 100644 vendor/mruby/mrbgems/hal-posix-dir/src/dir_hal.c create mode 100644 vendor/mruby/mrbgems/hal-posix-io/mrbgem.rake create mode 100644 vendor/mruby/mrbgems/hal-posix-io/src/io_hal.c create mode 100644 vendor/mruby/mrbgems/hal-posix-socket/mrbgem.rake create mode 100644 vendor/mruby/mrbgems/hal-posix-socket/src/socket_hal.c create mode 100644 vendor/mruby/mrbgems/hal-posix-task/README.md create mode 100644 vendor/mruby/mrbgems/hal-posix-task/mrbgem.rake create mode 100644 vendor/mruby/mrbgems/hal-posix-task/src/task_hal.c create mode 100644 vendor/mruby/mrbgems/hal-win-dir/mrbgem.rake create mode 100644 vendor/mruby/mrbgems/hal-win-dir/src/dir_hal.c create mode 100644 vendor/mruby/mrbgems/hal-win-io/mrbgem.rake create mode 100644 vendor/mruby/mrbgems/hal-win-io/src/io_hal.c create mode 100644 vendor/mruby/mrbgems/hal-win-socket/mrbgem.rake create mode 100644 vendor/mruby/mrbgems/hal-win-socket/src/socket_hal.c create mode 100644 vendor/mruby/mrbgems/hal-win-task/README.md create mode 100644 vendor/mruby/mrbgems/hal-win-task/mrbgem.rake create mode 100644 vendor/mruby/mrbgems/hal-win-task/src/task_hal.c create mode 100644 vendor/mruby/mrbgems/math.gembox create mode 100644 vendor/mruby/mrbgems/metaprog.gembox create mode 100644 vendor/mruby/mrbgems/mruby-array-ext/README.md create mode 100644 vendor/mruby/mrbgems/mruby-array-ext/mrbgem.rake create mode 100644 vendor/mruby/mrbgems/mruby-array-ext/mrblib/array.rb create mode 100644 vendor/mruby/mrbgems/mruby-array-ext/src/array.c create mode 100644 vendor/mruby/mrbgems/mruby-array-ext/test/array.rb create mode 100644 vendor/mruby/mrbgems/mruby-benchmark/README.md create mode 100644 vendor/mruby/mrbgems/mruby-benchmark/mrbgem.rake create mode 100644 vendor/mruby/mrbgems/mruby-benchmark/mrblib/benchmark.rb create mode 100644 vendor/mruby/mrbgems/mruby-benchmark/test/benchmark.rb create mode 100644 vendor/mruby/mrbgems/mruby-bigint/README-fgmp.md create mode 100644 vendor/mruby/mrbgems/mruby-bigint/README.md create mode 100644 vendor/mruby/mrbgems/mruby-bigint/mrbgem.rake create mode 100644 vendor/mruby/mrbgems/mruby-bigint/test/bigint.rb create mode 100644 vendor/mruby/mrbgems/mruby-bin-config/README.md create mode 100644 vendor/mruby/mrbgems/mruby-bin-config/mrbgem.rake create mode 100755 vendor/mruby/mrbgems/mruby-bin-config/mruby-config create mode 100644 vendor/mruby/mrbgems/mruby-bin-config/mruby-config.bat create mode 100644 vendor/mruby/mrbgems/mruby-bin-debugger/README.md create mode 100644 vendor/mruby/mrbgems/mruby-bin-debugger/bintest/mrdb.rb create mode 100644 vendor/mruby/mrbgems/mruby-bin-debugger/bintest/print.rb create mode 100644 vendor/mruby/mrbgems/mruby-bin-debugger/mrbgem.rake create mode 100644 vendor/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/apibreak.c create mode 100644 vendor/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/apibreak.h create mode 100644 vendor/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/apilist.c create mode 100644 vendor/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/apilist.h create mode 100644 vendor/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/apiprint.c create mode 100644 vendor/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/apiprint.h create mode 100644 vendor/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/apistring.c create mode 100644 vendor/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/apistring.h create mode 100644 vendor/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/cmdbreak.c create mode 100644 vendor/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/cmdmisc.c create mode 100644 vendor/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/cmdprint.c create mode 100644 vendor/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/cmdrun.c create mode 100644 vendor/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/mrdb.c create mode 100644 vendor/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/mrdb.h create mode 100644 vendor/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/mrdbconf.h create mode 100644 vendor/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/mrdberror.h create mode 100644 vendor/mruby/mrbgems/mruby-bin-mirb/README.md create mode 100644 vendor/mruby/mrbgems/mruby-bin-mirb/bintest/mirb.rb create mode 100644 vendor/mruby/mrbgems/mruby-bin-mirb/mrbgem.rake create mode 100644 vendor/mruby/mrbgems/mruby-bin-mirb/tools/mirb/mirb.c create mode 100644 vendor/mruby/mrbgems/mruby-bin-mirb/tools/mirb/mirb_buffer.c create mode 100644 vendor/mruby/mrbgems/mruby-bin-mirb/tools/mirb/mirb_buffer.h create mode 100644 vendor/mruby/mrbgems/mruby-bin-mirb/tools/mirb/mirb_completion.c create mode 100644 vendor/mruby/mrbgems/mruby-bin-mirb/tools/mirb/mirb_completion.h create mode 100644 vendor/mruby/mrbgems/mruby-bin-mirb/tools/mirb/mirb_editor.c create mode 100644 vendor/mruby/mrbgems/mruby-bin-mirb/tools/mirb/mirb_editor.h create mode 100644 vendor/mruby/mrbgems/mruby-bin-mirb/tools/mirb/mirb_highlight.c create mode 100644 vendor/mruby/mrbgems/mruby-bin-mirb/tools/mirb/mirb_highlight.h create mode 100644 vendor/mruby/mrbgems/mruby-bin-mirb/tools/mirb/mirb_history.c create mode 100644 vendor/mruby/mrbgems/mruby-bin-mirb/tools/mirb/mirb_history.h create mode 100644 vendor/mruby/mrbgems/mruby-bin-mirb/tools/mirb/mirb_term.c create mode 100644 vendor/mruby/mrbgems/mruby-bin-mirb/tools/mirb/mirb_term.h create mode 100644 vendor/mruby/mrbgems/mruby-bin-mrbc/README.md create mode 100644 vendor/mruby/mrbgems/mruby-bin-mrbc/bintest/mrbc.rb create mode 100644 vendor/mruby/mrbgems/mruby-bin-mrbc/mrbgem.rake create mode 100644 vendor/mruby/mrbgems/mruby-bin-mrbc/tools/mrbc/mrbc.c create mode 100644 vendor/mruby/mrbgems/mruby-bin-mrbc/tools/mrbc/stub.c create mode 100644 vendor/mruby/mrbgems/mruby-bin-mruby/README.md create mode 100644 vendor/mruby/mrbgems/mruby-bin-mruby/bintest/mruby.rb create mode 100644 vendor/mruby/mrbgems/mruby-bin-mruby/mrbgem.rake create mode 100644 vendor/mruby/mrbgems/mruby-bin-mruby/tools/mruby/mruby.c create mode 100644 vendor/mruby/mrbgems/mruby-bin-strip/README.md create mode 100644 vendor/mruby/mrbgems/mruby-bin-strip/bintest/mruby_strip.rb create mode 100644 vendor/mruby/mrbgems/mruby-bin-strip/mrbgem.rake create mode 100644 vendor/mruby/mrbgems/mruby-bin-strip/tools/mruby-strip/mruby_strip.c create mode 100644 vendor/mruby/mrbgems/mruby-binding/README.md create mode 100644 vendor/mruby/mrbgems/mruby-binding/mrbgem.rake create mode 100644 vendor/mruby/mrbgems/mruby-binding/src/binding.c create mode 100644 vendor/mruby/mrbgems/mruby-binding/test/binding.c create mode 100644 vendor/mruby/mrbgems/mruby-binding/test/binding.rb create mode 100644 vendor/mruby/mrbgems/mruby-catch/README.md create mode 100644 vendor/mruby/mrbgems/mruby-catch/mrbgem.rake create mode 100644 vendor/mruby/mrbgems/mruby-catch/mrblib/catch.rb create mode 100644 vendor/mruby/mrbgems/mruby-catch/src/catch.c create mode 100644 vendor/mruby/mrbgems/mruby-catch/test/catch.rb create mode 100644 vendor/mruby/mrbgems/mruby-class-ext/README.md create mode 100644 vendor/mruby/mrbgems/mruby-class-ext/mrbgem.rake create mode 100644 vendor/mruby/mrbgems/mruby-class-ext/src/class.c create mode 100644 vendor/mruby/mrbgems/mruby-class-ext/test/class.rb create mode 100644 vendor/mruby/mrbgems/mruby-class-ext/test/module.rb create mode 100644 vendor/mruby/mrbgems/mruby-cmath/README.md create mode 100644 vendor/mruby/mrbgems/mruby-cmath/mrbgem.rake create mode 100644 vendor/mruby/mrbgems/mruby-cmath/src/cmath.c create mode 100644 vendor/mruby/mrbgems/mruby-cmath/test/cmath.rb create mode 100644 vendor/mruby/mrbgems/mruby-compar-ext/README.md create mode 100644 vendor/mruby/mrbgems/mruby-compar-ext/mrbgem.rake create mode 100644 vendor/mruby/mrbgems/mruby-compar-ext/mrblib/compar.rb create mode 100644 vendor/mruby/mrbgems/mruby-compar-ext/test/compar.rb create mode 100644 vendor/mruby/mrbgems/mruby-compiler/README.md create mode 100644 vendor/mruby/mrbgems/mruby-compiler/mrbgem.rake create mode 100644 vendor/mruby/mrbgems/mruby-complex/README.md create mode 100644 vendor/mruby/mrbgems/mruby-complex/mrbgem.rake create mode 100644 vendor/mruby/mrbgems/mruby-complex/mrblib/complex.rb create mode 100644 vendor/mruby/mrbgems/mruby-complex/src/complex.c create mode 100644 vendor/mruby/mrbgems/mruby-complex/test/complex.rb create mode 100644 vendor/mruby/mrbgems/mruby-data/README.md create mode 100644 vendor/mruby/mrbgems/mruby-data/mrbgem.rake create mode 100644 vendor/mruby/mrbgems/mruby-data/src/data.c create mode 100644 vendor/mruby/mrbgems/mruby-data/test/data.rb create mode 100644 vendor/mruby/mrbgems/mruby-dir/README.md create mode 100644 vendor/mruby/mrbgems/mruby-dir/include/dir_hal.h create mode 100644 vendor/mruby/mrbgems/mruby-dir/mrbgem.rake create mode 100644 vendor/mruby/mrbgems/mruby-dir/mrblib/dir.rb create mode 100644 vendor/mruby/mrbgems/mruby-dir/src/dir.c create mode 100644 vendor/mruby/mrbgems/mruby-dir/test/dir.rb create mode 100644 vendor/mruby/mrbgems/mruby-dir/test/dirtest.c create mode 100644 vendor/mruby/mrbgems/mruby-encoding/README.md create mode 100644 vendor/mruby/mrbgems/mruby-encoding/mrbgem.rake create mode 100644 vendor/mruby/mrbgems/mruby-encoding/src/encoding.c create mode 100644 vendor/mruby/mrbgems/mruby-encoding/test/numeric.rb create mode 100644 vendor/mruby/mrbgems/mruby-encoding/test/string.rb create mode 100644 vendor/mruby/mrbgems/mruby-enum-chain/README.md create mode 100644 vendor/mruby/mrbgems/mruby-enum-chain/mrbgem.rake create mode 100644 vendor/mruby/mrbgems/mruby-enum-chain/mrblib/chain.rb create mode 100644 vendor/mruby/mrbgems/mruby-enum-chain/test/enum_chain.rb create mode 100644 vendor/mruby/mrbgems/mruby-enum-ext/README.md create mode 100644 vendor/mruby/mrbgems/mruby-enum-ext/mrbgem.rake create mode 100644 vendor/mruby/mrbgems/mruby-enum-ext/mrblib/enum.rb create mode 100644 vendor/mruby/mrbgems/mruby-enum-ext/test/enum.rb create mode 100644 vendor/mruby/mrbgems/mruby-enum-lazy/README.md create mode 100644 vendor/mruby/mrbgems/mruby-enum-lazy/mrbgem.rake create mode 100644 vendor/mruby/mrbgems/mruby-enum-lazy/mrblib/lazy.rb create mode 100644 vendor/mruby/mrbgems/mruby-enum-lazy/test/lazy.rb create mode 100644 vendor/mruby/mrbgems/mruby-enumerator/README.md create mode 100644 vendor/mruby/mrbgems/mruby-enumerator/mrbgem.rake create mode 100644 vendor/mruby/mrbgems/mruby-enumerator/mrblib/enumerator.rb create mode 100644 vendor/mruby/mrbgems/mruby-enumerator/test/enumerator.rb create mode 100644 vendor/mruby/mrbgems/mruby-errno/README.md create mode 100644 vendor/mruby/mrbgems/mruby-errno/mrbgem.rake create mode 100644 vendor/mruby/mrbgems/mruby-errno/mrblib/errno.rb create mode 100644 vendor/mruby/mrbgems/mruby-errno/src/errno.c create mode 100755 vendor/mruby/mrbgems/mruby-errno/src/gen.rb create mode 100644 vendor/mruby/mrbgems/mruby-errno/src/known_errors.def create mode 100644 vendor/mruby/mrbgems/mruby-errno/src/known_errors_def.cstub create mode 100644 vendor/mruby/mrbgems/mruby-errno/test/errno.rb create mode 100644 vendor/mruby/mrbgems/mruby-error/README.md create mode 100644 vendor/mruby/mrbgems/mruby-error/mrbgem.rake create mode 100644 vendor/mruby/mrbgems/mruby-error/src/exception.c create mode 100644 vendor/mruby/mrbgems/mruby-error/test/exception.c create mode 100644 vendor/mruby/mrbgems/mruby-error/test/exception.rb create mode 100644 vendor/mruby/mrbgems/mruby-eval/README.md create mode 100644 vendor/mruby/mrbgems/mruby-eval/mrbgem.rake create mode 100644 vendor/mruby/mrbgems/mruby-eval/src/eval.c create mode 100644 vendor/mruby/mrbgems/mruby-eval/test/binding.rb create mode 100644 vendor/mruby/mrbgems/mruby-eval/test/eval.rb create mode 100644 vendor/mruby/mrbgems/mruby-exit/mrbgem.rake create mode 100644 vendor/mruby/mrbgems/mruby-exit/src/mruby_exit.c create mode 100644 vendor/mruby/mrbgems/mruby-fiber/mrbgem.rake create mode 100644 vendor/mruby/mrbgems/mruby-fiber/src/fiber.c create mode 100644 vendor/mruby/mrbgems/mruby-fiber/test/fiber.rb create mode 100644 vendor/mruby/mrbgems/mruby-fiber/test/fiber2.rb create mode 100644 vendor/mruby/mrbgems/mruby-fiber/test/fibertest.c create mode 100644 vendor/mruby/mrbgems/mruby-hash-ext/README.md create mode 100644 vendor/mruby/mrbgems/mruby-hash-ext/mrbgem.rake create mode 100644 vendor/mruby/mrbgems/mruby-hash-ext/mrblib/hash.rb create mode 100644 vendor/mruby/mrbgems/mruby-hash-ext/src/hash_ext.c create mode 100644 vendor/mruby/mrbgems/mruby-hash-ext/test/hash.rb create mode 100644 vendor/mruby/mrbgems/mruby-io/README.md create mode 100644 vendor/mruby/mrbgems/mruby-io/include/io_hal.h create mode 100644 vendor/mruby/mrbgems/mruby-io/include/mruby/io.h create mode 100644 vendor/mruby/mrbgems/mruby-io/mrbgem.rake create mode 100644 vendor/mruby/mrbgems/mruby-io/mrblib/file.rb create mode 100644 vendor/mruby/mrbgems/mruby-io/mrblib/file_constants.rb create mode 100644 vendor/mruby/mrbgems/mruby-io/mrblib/io.rb create mode 100644 vendor/mruby/mrbgems/mruby-io/mrblib/kernel.rb create mode 100644 vendor/mruby/mrbgems/mruby-io/src/file.c create mode 100644 vendor/mruby/mrbgems/mruby-io/src/file_test.c create mode 100644 vendor/mruby/mrbgems/mruby-io/src/io.c create mode 100644 vendor/mruby/mrbgems/mruby-io/src/mruby_io_gem.c create mode 100644 vendor/mruby/mrbgems/mruby-io/test/file.rb create mode 100644 vendor/mruby/mrbgems/mruby-io/test/file_test.rb create mode 100644 vendor/mruby/mrbgems/mruby-io/test/io.rb create mode 100644 vendor/mruby/mrbgems/mruby-io/test/mruby_io_test.c create mode 100644 vendor/mruby/mrbgems/mruby-kernel-ext/README.md create mode 100644 vendor/mruby/mrbgems/mruby-kernel-ext/mrbgem.rake create mode 100644 vendor/mruby/mrbgems/mruby-kernel-ext/src/kernel.c create mode 100644 vendor/mruby/mrbgems/mruby-kernel-ext/test/kernel.rb create mode 100644 vendor/mruby/mrbgems/mruby-math/README.md create mode 100644 vendor/mruby/mrbgems/mruby-math/mrbgem.rake create mode 100644 vendor/mruby/mrbgems/mruby-math/src/math.c create mode 100644 vendor/mruby/mrbgems/mruby-math/test/math.rb create mode 100644 vendor/mruby/mrbgems/mruby-metaprog/README.md create mode 100644 vendor/mruby/mrbgems/mruby-metaprog/mrbgem.rake create mode 100644 vendor/mruby/mrbgems/mruby-metaprog/src/metaprog.c create mode 100644 vendor/mruby/mrbgems/mruby-metaprog/test/metaprog.rb create mode 100644 vendor/mruby/mrbgems/mruby-method/README.md create mode 100644 vendor/mruby/mrbgems/mruby-method/mrbgem.rake create mode 100644 vendor/mruby/mrbgems/mruby-method/mrblib/method.rb create mode 100644 vendor/mruby/mrbgems/mruby-method/src/method.c create mode 100644 vendor/mruby/mrbgems/mruby-method/test/method.rb create mode 100644 vendor/mruby/mrbgems/mruby-numeric-ext/README.md create mode 100644 vendor/mruby/mrbgems/mruby-numeric-ext/mrbgem.rake create mode 100644 vendor/mruby/mrbgems/mruby-numeric-ext/mrblib/numeric_ext.rb create mode 100644 vendor/mruby/mrbgems/mruby-numeric-ext/src/numeric_ext.c create mode 100644 vendor/mruby/mrbgems/mruby-numeric-ext/test/numeric.rb create mode 100644 vendor/mruby/mrbgems/mruby-object-ext/README.md create mode 100644 vendor/mruby/mrbgems/mruby-object-ext/mrbgem.rake create mode 100644 vendor/mruby/mrbgems/mruby-object-ext/mrblib/object.rb create mode 100644 vendor/mruby/mrbgems/mruby-object-ext/src/object.c create mode 100644 vendor/mruby/mrbgems/mruby-object-ext/test/nil.rb create mode 100644 vendor/mruby/mrbgems/mruby-object-ext/test/object.rb create mode 100644 vendor/mruby/mrbgems/mruby-object-ext/test/object_ext.c create mode 100644 vendor/mruby/mrbgems/mruby-objectspace/README.md create mode 100644 vendor/mruby/mrbgems/mruby-objectspace/mrbgem.rake create mode 100644 vendor/mruby/mrbgems/mruby-objectspace/src/mruby_objectspace.c create mode 100644 vendor/mruby/mrbgems/mruby-objectspace/test/objectspace.rb create mode 100644 vendor/mruby/mrbgems/mruby-os-memsize/README.md create mode 100644 vendor/mruby/mrbgems/mruby-os-memsize/mrbgem.rake create mode 100644 vendor/mruby/mrbgems/mruby-os-memsize/src/memsize.c create mode 100644 vendor/mruby/mrbgems/mruby-os-memsize/test/memsize.rb create mode 100644 vendor/mruby/mrbgems/mruby-pack/README.md create mode 100644 vendor/mruby/mrbgems/mruby-pack/mrbgem.rake create mode 100644 vendor/mruby/mrbgems/mruby-pack/src/pack.c create mode 100644 vendor/mruby/mrbgems/mruby-pack/test/pack.rb create mode 100644 vendor/mruby/mrbgems/mruby-proc-binding/README.md create mode 100644 vendor/mruby/mrbgems/mruby-proc-binding/mrbgem.rake create mode 100644 vendor/mruby/mrbgems/mruby-proc-binding/src/proc_binding.c create mode 100644 vendor/mruby/mrbgems/mruby-proc-binding/test/proc_binding.c create mode 100644 vendor/mruby/mrbgems/mruby-proc-binding/test/proc_binding.rb create mode 100644 vendor/mruby/mrbgems/mruby-proc-ext/README.md create mode 100644 vendor/mruby/mrbgems/mruby-proc-ext/mrbgem.rake create mode 100644 vendor/mruby/mrbgems/mruby-proc-ext/mrblib/proc.rb create mode 100644 vendor/mruby/mrbgems/mruby-proc-ext/src/proc.c create mode 100644 vendor/mruby/mrbgems/mruby-proc-ext/test/proc.c create mode 100644 vendor/mruby/mrbgems/mruby-proc-ext/test/proc.rb create mode 100644 vendor/mruby/mrbgems/mruby-random/README.md create mode 100644 vendor/mruby/mrbgems/mruby-random/mrbgem.rake create mode 100644 vendor/mruby/mrbgems/mruby-random/src/random.c create mode 100644 vendor/mruby/mrbgems/mruby-random/test/random.rb create mode 100644 vendor/mruby/mrbgems/mruby-range-ext/README.md create mode 100644 vendor/mruby/mrbgems/mruby-range-ext/mrbgem.rake create mode 100644 vendor/mruby/mrbgems/mruby-range-ext/mrblib/range.rb create mode 100644 vendor/mruby/mrbgems/mruby-range-ext/src/range.c create mode 100644 vendor/mruby/mrbgems/mruby-range-ext/test/range.rb create mode 100644 vendor/mruby/mrbgems/mruby-rational/README.md create mode 100644 vendor/mruby/mrbgems/mruby-rational/mrbgem.rake create mode 100644 vendor/mruby/mrbgems/mruby-rational/mrblib/rational.rb create mode 100644 vendor/mruby/mrbgems/mruby-rational/src/rational.c create mode 100644 vendor/mruby/mrbgems/mruby-rational/test/rational.rb create mode 100644 vendor/mruby/mrbgems/mruby-set/LICENSE create mode 100644 vendor/mruby/mrbgems/mruby-set/README.md create mode 100644 vendor/mruby/mrbgems/mruby-set/mrbgem.rake create mode 100644 vendor/mruby/mrbgems/mruby-set/mrblib/set.rb create mode 100644 vendor/mruby/mrbgems/mruby-set/mruby-set.gem create mode 100644 vendor/mruby/mrbgems/mruby-set/src/set.c create mode 100644 vendor/mruby/mrbgems/mruby-set/test/set.rb create mode 100644 vendor/mruby/mrbgems/mruby-sleep/README.md create mode 100644 vendor/mruby/mrbgems/mruby-sleep/example/sleep.rb create mode 100644 vendor/mruby/mrbgems/mruby-sleep/mrbgem.rake create mode 100644 vendor/mruby/mrbgems/mruby-sleep/src/sleep.c create mode 100644 vendor/mruby/mrbgems/mruby-sleep/test/sleep_test.rb create mode 100644 vendor/mruby/mrbgems/mruby-socket/README.md create mode 100644 vendor/mruby/mrbgems/mruby-socket/include/socket_hal.h create mode 100644 vendor/mruby/mrbgems/mruby-socket/mrbgem.rake create mode 100644 vendor/mruby/mrbgems/mruby-socket/mrblib/socket.rb create mode 100644 vendor/mruby/mrbgems/mruby-socket/src/const.cstub create mode 100644 vendor/mruby/mrbgems/mruby-socket/src/const.def create mode 100755 vendor/mruby/mrbgems/mruby-socket/src/gen.rb create mode 100644 vendor/mruby/mrbgems/mruby-socket/src/socket.c create mode 100644 vendor/mruby/mrbgems/mruby-socket/test/addrinfo.rb create mode 100644 vendor/mruby/mrbgems/mruby-socket/test/basicsocket.rb create mode 100644 vendor/mruby/mrbgems/mruby-socket/test/ipsocket.rb create mode 100644 vendor/mruby/mrbgems/mruby-socket/test/socket.rb create mode 100644 vendor/mruby/mrbgems/mruby-socket/test/sockettest.c create mode 100644 vendor/mruby/mrbgems/mruby-socket/test/tcpsocket.rb create mode 100644 vendor/mruby/mrbgems/mruby-socket/test/udpsocket.rb create mode 100644 vendor/mruby/mrbgems/mruby-socket/test/unix.rb create mode 100644 vendor/mruby/mrbgems/mruby-sprintf/README.md create mode 100644 vendor/mruby/mrbgems/mruby-sprintf/mrbgem.rake create mode 100644 vendor/mruby/mrbgems/mruby-sprintf/mrblib/string.rb create mode 100644 vendor/mruby/mrbgems/mruby-sprintf/src/sprintf.c create mode 100644 vendor/mruby/mrbgems/mruby-sprintf/test/sprintf.rb create mode 100644 vendor/mruby/mrbgems/mruby-strftime/README.md create mode 100644 vendor/mruby/mrbgems/mruby-strftime/mrbgem.rake create mode 100644 vendor/mruby/mrbgems/mruby-strftime/src/strftime.c create mode 100644 vendor/mruby/mrbgems/mruby-strftime/test/strftime.rb create mode 100644 vendor/mruby/mrbgems/mruby-string-ext/README.md create mode 100644 vendor/mruby/mrbgems/mruby-string-ext/mrbgem.rake create mode 100644 vendor/mruby/mrbgems/mruby-string-ext/mrblib/string.rb create mode 100644 vendor/mruby/mrbgems/mruby-string-ext/src/string.c create mode 100644 vendor/mruby/mrbgems/mruby-string-ext/test/numeric.rb create mode 100644 vendor/mruby/mrbgems/mruby-string-ext/test/range.rb create mode 100644 vendor/mruby/mrbgems/mruby-string-ext/test/string.rb create mode 100644 vendor/mruby/mrbgems/mruby-struct/README.md create mode 100644 vendor/mruby/mrbgems/mruby-struct/mrbgem.rake create mode 100644 vendor/mruby/mrbgems/mruby-struct/mrblib/struct.rb create mode 100644 vendor/mruby/mrbgems/mruby-struct/src/struct.c create mode 100644 vendor/mruby/mrbgems/mruby-struct/test/struct.rb create mode 100644 vendor/mruby/mrbgems/mruby-symbol-ext/README.md create mode 100644 vendor/mruby/mrbgems/mruby-symbol-ext/mrbgem.rake create mode 100644 vendor/mruby/mrbgems/mruby-symbol-ext/mrblib/symbol.rb create mode 100644 vendor/mruby/mrbgems/mruby-symbol-ext/src/symbol.c create mode 100644 vendor/mruby/mrbgems/mruby-symbol-ext/test/symbol.rb create mode 100644 vendor/mruby/mrbgems/mruby-task/README.md create mode 100644 vendor/mruby/mrbgems/mruby-task/examples/inspection.rb create mode 100644 vendor/mruby/mrbgems/mruby-task/examples/priority.rb create mode 100644 vendor/mruby/mrbgems/mruby-task/examples/producer_consumer.rb create mode 100644 vendor/mruby/mrbgems/mruby-task/examples/simple.rb create mode 100644 vendor/mruby/mrbgems/mruby-task/examples/statistics.rb create mode 100644 vendor/mruby/mrbgems/mruby-task/examples/suspend_resume.rb create mode 100644 vendor/mruby/mrbgems/mruby-task/examples/task_pass.rb create mode 100644 vendor/mruby/mrbgems/mruby-task/include/task.h create mode 100644 vendor/mruby/mrbgems/mruby-task/include/task_hal.h create mode 100644 vendor/mruby/mrbgems/mruby-task/mrbgem.rake create mode 100644 vendor/mruby/mrbgems/mruby-task/src/task.c create mode 100644 vendor/mruby/mrbgems/mruby-task/test/task.rb create mode 100644 vendor/mruby/mrbgems/mruby-test-inline-struct/mrbgem.rake create mode 100644 vendor/mruby/mrbgems/mruby-test-inline-struct/test/inline.c create mode 100644 vendor/mruby/mrbgems/mruby-test-inline-struct/test/inline.rb create mode 100644 vendor/mruby/mrbgems/mruby-test/README.md create mode 100644 vendor/mruby/mrbgems/mruby-test/driver.c create mode 100644 vendor/mruby/mrbgems/mruby-test/mrbgem.rake create mode 100644 vendor/mruby/mrbgems/mruby-test/vformat.c create mode 100644 vendor/mruby/mrbgems/mruby-time/README.md create mode 100644 vendor/mruby/mrbgems/mruby-time/include/mruby/time.h create mode 100644 vendor/mruby/mrbgems/mruby-time/mrbgem.rake create mode 100644 vendor/mruby/mrbgems/mruby-time/src/time.c create mode 100644 vendor/mruby/mrbgems/mruby-time/test/time.rb create mode 100644 vendor/mruby/mrbgems/mruby-toplevel-ext/README.md create mode 100644 vendor/mruby/mrbgems/mruby-toplevel-ext/mrbgem.rake create mode 100644 vendor/mruby/mrbgems/mruby-toplevel-ext/mrblib/toplevel.rb create mode 100644 vendor/mruby/mrbgems/mruby-toplevel-ext/test/toplevel.rb create mode 100644 vendor/mruby/mrbgems/stdlib-ext.gembox create mode 100644 vendor/mruby/mrbgems/stdlib-io.gembox create mode 100644 vendor/mruby/mrbgems/stdlib.gembox create mode 100644 vendor/mruby/mrblib/10error.rb create mode 100644 vendor/mruby/mrblib/array.rb create mode 100644 vendor/mruby/mrblib/compar.rb create mode 100644 vendor/mruby/mrblib/enum.rb create mode 100644 vendor/mruby/mrblib/hash.rb create mode 100644 vendor/mruby/mrblib/kernel.rb create mode 100644 vendor/mruby/mrblib/numeric.rb create mode 100644 vendor/mruby/mrblib/range.rb create mode 100644 vendor/mruby/mrblib/string.rb create mode 100644 vendor/mruby/mrblib/symbol.rb create mode 100644 vendor/mruby/mruby-source.gemspec create mode 100644 vendor/mruby/oss-fuzz/config/mruby.dict create mode 100644 vendor/mruby/oss-fuzz/config/mruby_fuzzer.options create mode 100644 vendor/mruby/oss-fuzz/config/mruby_proto_fuzzer.options create mode 100644 vendor/mruby/oss-fuzz/mruby_fuzzer.c create mode 100644 vendor/mruby/oss-fuzz/mruby_proto_fuzzer.cpp create mode 100644 vendor/mruby/oss-fuzz/proto_to_ruby.cpp create mode 100644 vendor/mruby/oss-fuzz/proto_to_ruby.h create mode 100644 vendor/mruby/oss-fuzz/ruby.proto create mode 100644 vendor/mruby/src/allocf.c create mode 100644 vendor/mruby/src/array.c create mode 100644 vendor/mruby/src/backtrace.c create mode 100644 vendor/mruby/src/cdump.c create mode 100644 vendor/mruby/src/class.c create mode 100644 vendor/mruby/src/codedump.c create mode 100644 vendor/mruby/src/debug.c create mode 100644 vendor/mruby/src/dump.c create mode 100644 vendor/mruby/src/enum.c create mode 100644 vendor/mruby/src/error.c create mode 100644 vendor/mruby/src/etc.c create mode 100644 vendor/mruby/src/fmt_fp.c create mode 100644 vendor/mruby/src/gc.c create mode 100644 vendor/mruby/src/hash.c create mode 100644 vendor/mruby/src/init.c create mode 100644 vendor/mruby/src/kernel.c create mode 100644 vendor/mruby/src/load.c create mode 100644 vendor/mruby/src/mempool.c create mode 100644 vendor/mruby/src/numeric.c create mode 100644 vendor/mruby/src/numops.c create mode 100644 vendor/mruby/src/object.c create mode 100644 vendor/mruby/src/print.c create mode 100644 vendor/mruby/src/proc.c create mode 100644 vendor/mruby/src/range.c create mode 100644 vendor/mruby/src/readfloat.c create mode 100644 vendor/mruby/src/readint.c create mode 100644 vendor/mruby/src/readnum.c create mode 100644 vendor/mruby/src/state.c create mode 100644 vendor/mruby/src/string.c create mode 100644 vendor/mruby/src/symbol.c create mode 100644 vendor/mruby/src/value_array.h create mode 100644 vendor/mruby/src/variable.c create mode 100644 vendor/mruby/src/version.c create mode 100644 vendor/mruby/src/vm.c create mode 100644 vendor/mruby/tasks/amalgam.rake create mode 100644 vendor/mruby/tasks/benchmark.rake create mode 100644 vendor/mruby/tasks/bin.rake create mode 100644 vendor/mruby/tasks/doc.rake create mode 100644 vendor/mruby/tasks/install.rake create mode 100644 vendor/mruby/tasks/libmruby.rake create mode 100644 vendor/mruby/tasks/mrbgems.rake create mode 100644 vendor/mruby/tasks/mrblib.rake create mode 100644 vendor/mruby/tasks/presym.rake create mode 100644 vendor/mruby/tasks/test.rake create mode 100644 vendor/mruby/tasks/toolchains/android.rake create mode 100644 vendor/mruby/tasks/toolchains/clang.rake create mode 100644 vendor/mruby/tasks/toolchains/emscripten.rake create mode 100644 vendor/mruby/tasks/toolchains/gcc.rake create mode 100644 vendor/mruby/tasks/toolchains/openwrt.rake create mode 100644 vendor/mruby/tasks/toolchains/visualcpp.rake create mode 100644 vendor/mruby/test/assert.rb create mode 100644 vendor/mruby/test/bintest.rb create mode 100644 vendor/mruby/test/t/argumenterror.rb create mode 100644 vendor/mruby/test/t/array.rb create mode 100644 vendor/mruby/test/t/basicobject.rb create mode 100644 vendor/mruby/test/t/bs_block.rb create mode 100644 vendor/mruby/test/t/bs_literal.rb create mode 100644 vendor/mruby/test/t/class.rb create mode 100644 vendor/mruby/test/t/codegen.rb create mode 100644 vendor/mruby/test/t/comparable.rb create mode 100644 vendor/mruby/test/t/ensure.rb create mode 100644 vendor/mruby/test/t/enumerable.rb create mode 100644 vendor/mruby/test/t/exception.rb create mode 100644 vendor/mruby/test/t/false.rb create mode 100644 vendor/mruby/test/t/float.rb create mode 100644 vendor/mruby/test/t/gc.rb create mode 100644 vendor/mruby/test/t/hash.rb create mode 100644 vendor/mruby/test/t/indexerror.rb create mode 100644 vendor/mruby/test/t/integer.rb create mode 100644 vendor/mruby/test/t/iterations.rb create mode 100644 vendor/mruby/test/t/kernel.rb create mode 100755 vendor/mruby/test/t/lang.rb create mode 100644 vendor/mruby/test/t/literals.rb create mode 100644 vendor/mruby/test/t/localjumperror.rb create mode 100644 vendor/mruby/test/t/methods.rb create mode 100644 vendor/mruby/test/t/module.rb create mode 100644 vendor/mruby/test/t/nameerror.rb create mode 100644 vendor/mruby/test/t/nil.rb create mode 100644 vendor/mruby/test/t/nomethoderror.rb create mode 100644 vendor/mruby/test/t/numeric.rb create mode 100644 vendor/mruby/test/t/object.rb create mode 100644 vendor/mruby/test/t/proc.rb create mode 100644 vendor/mruby/test/t/range.rb create mode 100644 vendor/mruby/test/t/rangeerror.rb create mode 100644 vendor/mruby/test/t/regexperror.rb create mode 100644 vendor/mruby/test/t/runtimeerror.rb create mode 100644 vendor/mruby/test/t/standarderror.rb create mode 100644 vendor/mruby/test/t/string.rb create mode 100644 vendor/mruby/test/t/superclass.rb create mode 100644 vendor/mruby/test/t/symbol.rb create mode 100644 vendor/mruby/test/t/syntax.rb create mode 100644 vendor/mruby/test/t/true.rb create mode 100644 vendor/mruby/test/t/typeerror.rb create mode 100644 vendor/mruby/test/t/unicode.rb create mode 100644 vendor/mruby/test/t/vformat.rb create mode 100644 vendor/mruby/tools/lrama/LEGAL.md create mode 100644 vendor/mruby/tools/lrama/MIT create mode 100644 vendor/mruby/tools/lrama/NEWS.md create mode 100755 vendor/mruby/tools/lrama/exe/lrama create mode 100644 vendor/mruby/tools/lrama/lib/lrama.rb create mode 100644 vendor/mruby/tools/lrama/lib/lrama/bitmap.rb create mode 100644 vendor/mruby/tools/lrama/lib/lrama/command.rb create mode 100644 vendor/mruby/tools/lrama/lib/lrama/context.rb create mode 100644 vendor/mruby/tools/lrama/lib/lrama/counterexamples.rb create mode 100644 vendor/mruby/tools/lrama/lib/lrama/counterexamples/derivation.rb create mode 100644 vendor/mruby/tools/lrama/lib/lrama/counterexamples/example.rb create mode 100644 vendor/mruby/tools/lrama/lib/lrama/counterexamples/path.rb create mode 100644 vendor/mruby/tools/lrama/lib/lrama/counterexamples/production_path.rb create mode 100644 vendor/mruby/tools/lrama/lib/lrama/counterexamples/start_path.rb create mode 100644 vendor/mruby/tools/lrama/lib/lrama/counterexamples/state_item.rb create mode 100644 vendor/mruby/tools/lrama/lib/lrama/counterexamples/transition_path.rb create mode 100644 vendor/mruby/tools/lrama/lib/lrama/counterexamples/triple.rb create mode 100644 vendor/mruby/tools/lrama/lib/lrama/diagnostics.rb create mode 100644 vendor/mruby/tools/lrama/lib/lrama/digraph.rb create mode 100644 vendor/mruby/tools/lrama/lib/lrama/grammar.rb create mode 100644 vendor/mruby/tools/lrama/lib/lrama/grammar/auxiliary.rb create mode 100644 vendor/mruby/tools/lrama/lib/lrama/grammar/binding.rb create mode 100644 vendor/mruby/tools/lrama/lib/lrama/grammar/code.rb create mode 100644 vendor/mruby/tools/lrama/lib/lrama/grammar/code/destructor_code.rb create mode 100644 vendor/mruby/tools/lrama/lib/lrama/grammar/code/initial_action_code.rb create mode 100644 vendor/mruby/tools/lrama/lib/lrama/grammar/code/no_reference_code.rb create mode 100644 vendor/mruby/tools/lrama/lib/lrama/grammar/code/printer_code.rb create mode 100644 vendor/mruby/tools/lrama/lib/lrama/grammar/code/rule_action.rb create mode 100644 vendor/mruby/tools/lrama/lib/lrama/grammar/counter.rb create mode 100644 vendor/mruby/tools/lrama/lib/lrama/grammar/destructor.rb create mode 100644 vendor/mruby/tools/lrama/lib/lrama/grammar/error_token.rb create mode 100644 vendor/mruby/tools/lrama/lib/lrama/grammar/parameterizing_rule.rb create mode 100644 vendor/mruby/tools/lrama/lib/lrama/grammar/parameterizing_rule/resolver.rb create mode 100644 vendor/mruby/tools/lrama/lib/lrama/grammar/parameterizing_rule/rhs.rb create mode 100644 vendor/mruby/tools/lrama/lib/lrama/grammar/parameterizing_rule/rule.rb create mode 100644 vendor/mruby/tools/lrama/lib/lrama/grammar/percent_code.rb create mode 100644 vendor/mruby/tools/lrama/lib/lrama/grammar/precedence.rb create mode 100644 vendor/mruby/tools/lrama/lib/lrama/grammar/printer.rb create mode 100644 vendor/mruby/tools/lrama/lib/lrama/grammar/reference.rb create mode 100644 vendor/mruby/tools/lrama/lib/lrama/grammar/rule.rb create mode 100644 vendor/mruby/tools/lrama/lib/lrama/grammar/rule_builder.rb create mode 100644 vendor/mruby/tools/lrama/lib/lrama/grammar/stdlib.y create mode 100644 vendor/mruby/tools/lrama/lib/lrama/grammar/symbol.rb create mode 100644 vendor/mruby/tools/lrama/lib/lrama/grammar/symbols.rb create mode 100644 vendor/mruby/tools/lrama/lib/lrama/grammar/symbols/resolver.rb create mode 100644 vendor/mruby/tools/lrama/lib/lrama/grammar/type.rb create mode 100644 vendor/mruby/tools/lrama/lib/lrama/grammar/union.rb create mode 100644 vendor/mruby/tools/lrama/lib/lrama/grammar_validator.rb create mode 100644 vendor/mruby/tools/lrama/lib/lrama/lexer.rb create mode 100644 vendor/mruby/tools/lrama/lib/lrama/lexer/grammar_file.rb create mode 100644 vendor/mruby/tools/lrama/lib/lrama/lexer/location.rb create mode 100644 vendor/mruby/tools/lrama/lib/lrama/lexer/token.rb create mode 100644 vendor/mruby/tools/lrama/lib/lrama/lexer/token/char.rb create mode 100644 vendor/mruby/tools/lrama/lib/lrama/lexer/token/ident.rb create mode 100644 vendor/mruby/tools/lrama/lib/lrama/lexer/token/instantiate_rule.rb create mode 100644 vendor/mruby/tools/lrama/lib/lrama/lexer/token/tag.rb create mode 100644 vendor/mruby/tools/lrama/lib/lrama/lexer/token/user_code.rb create mode 100644 vendor/mruby/tools/lrama/lib/lrama/logger.rb create mode 100644 vendor/mruby/tools/lrama/lib/lrama/option_parser.rb create mode 100644 vendor/mruby/tools/lrama/lib/lrama/options.rb create mode 100644 vendor/mruby/tools/lrama/lib/lrama/output.rb create mode 100644 vendor/mruby/tools/lrama/lib/lrama/parser.rb create mode 100644 vendor/mruby/tools/lrama/lib/lrama/report.rb create mode 100644 vendor/mruby/tools/lrama/lib/lrama/report/duration.rb create mode 100644 vendor/mruby/tools/lrama/lib/lrama/report/profile.rb create mode 100644 vendor/mruby/tools/lrama/lib/lrama/state.rb create mode 100644 vendor/mruby/tools/lrama/lib/lrama/state/reduce.rb create mode 100644 vendor/mruby/tools/lrama/lib/lrama/state/reduce_reduce_conflict.rb create mode 100644 vendor/mruby/tools/lrama/lib/lrama/state/resolved_conflict.rb create mode 100644 vendor/mruby/tools/lrama/lib/lrama/state/shift.rb create mode 100644 vendor/mruby/tools/lrama/lib/lrama/state/shift_reduce_conflict.rb create mode 100644 vendor/mruby/tools/lrama/lib/lrama/states.rb create mode 100644 vendor/mruby/tools/lrama/lib/lrama/states/item.rb create mode 100644 vendor/mruby/tools/lrama/lib/lrama/states_reporter.rb create mode 100644 vendor/mruby/tools/lrama/lib/lrama/trace_reporter.rb create mode 100644 vendor/mruby/tools/lrama/lib/lrama/version.rb create mode 100644 vendor/mruby/tools/lrama/template/bison/_yacc.h create mode 100644 vendor/mruby/tools/lrama/template/bison/yacc.c create mode 100644 vendor/mruby/tools/lrama/template/bison/yacc.h diff --git a/.gitignore b/.gitignore index 37c8879e..c629fd5d 100644 --- a/.gitignore +++ b/.gitignore @@ -3,6 +3,13 @@ /bin/ /lib/ +# Vendored-engine build output: mruby's Rake build and libssh2's CMake build emit whole +# trees (generated .c/.h, the mrbc tool, CMake cache) under their own build/ dirs. +/vendor/mruby/build/ +/vendor/libssh2/build/ +# ...and mruby's Rake drops a transient per-config lock next to the config (src/mruby/). +/src/mruby/*.lock + # Belt-and-suspenders: stray build artifacts from manual/ad-hoc compiles. *.o *.d diff --git a/API.md b/API.md index 11b512f4..ea81cc8d 100644 --- a/API.md +++ b/API.md @@ -84,7 +84,7 @@ Share a function by name across contexts and engines. |---|---| | `calogExport(name: string, fn: fn)` | Publish function `fn` under a global `name`. | | `calogUnexport(name: string)` | Remove an exported name. | -| `calogCall(name: string, ...args: any) -> any` | Call an exported function by name -- works in **every** engine. (An export is also reachable by its bare name -- `exportedFn(args)` -- on Lua/JS/Squirrel/s7, and on my-basic case-insensitively, since it uppercases identifiers; Wren and Berry always need `calogCall`.) | +| `calogCall(name: string, ...args: any) -> any` | Call an exported function by name -- works in **every** engine. (An export is also reachable by its bare name -- `exportedFn(args)` -- on Lua/JS/Squirrel/s7, on Ruby at top level (via `method_missing`), and on my-basic case-insensitively (it uppercases identifiers); Wren and Berry always need `calogCall`.) | ## fs @@ -208,7 +208,7 @@ out, or the close blocks until the task next returns to the runtime. | Function | Description | |---|---| -| `taskSpawn(engine: string, code: string) -> handle` | Run a code string on a named engine (`"lua"`, `"js"`, `"squirrel"`, `"mybasic"`, `"berry"`, `"s7"`, `"wren"`). | +| `taskSpawn(engine: string, code: string) -> handle` | Run a code string on a named engine (`"lua"`, `"js"`, `"squirrel"`, `"mybasic"`, `"berry"`, `"s7"`, `"wren"`, `"mruby"`). | | `taskLoad(baseName: string) -> handle` | Launch a script *file* (engine chosen by extension). | | `taskEval(handle: handle, code: string)` | Feed more code into a running task (runs on its thread). | | `taskClose(handle: handle)` | Ask a task to stop (cooperative: sets its shutdown flag, then waits for its thread to exit). | diff --git a/LICENSE.md b/LICENSE.md index 4ad89aec..004d1fc2 100644 --- a/LICENSE.md +++ b/LICENSE.md @@ -66,6 +66,10 @@ libraries below. - **Berry** -- MIT License. Copyright (c) 2018-2022 Guan Wenliang and Berry contributors. Notice in `vendor/berry/src/berry.h`. +- **mruby 4.0.0** (Ruby) -- MIT License. Copyright (c) 2010-2025 mruby developers. + `vendor/mruby/` (unmodified upstream; license in `vendor/mruby/LICENSE`, contributors + in `vendor/mruby/AUTHORS`). `libmruby.a` is generated by mruby's own Rake build (needs a + host Ruby + bison at build time); calog links the resulting static archive. ### Database, network, and cryptography libraries diff --git a/Makefile b/Makefile index a833fc63..1ae64df0 100644 --- a/Makefile +++ b/Makefile @@ -27,8 +27,8 @@ LDFLAGS = $(SAN) # Our headers: src/ plus the per-language subdirs. VPATH lets the object rules find # a source by name without spelling out its directory. -INC = -Isrc -Isrc/lua -Isrc/mybasic -Isrc/squirrel -Isrc/js -Isrc/berry -Isrc/s7 -Isrc/wren -Ilibs -VPATH = src:src/lua:src/mybasic:src/squirrel:src/js:src/berry:src/s7:src/wren:libs:tests +INC = -Isrc -Isrc/lua -Isrc/mybasic -Isrc/squirrel -Isrc/js -Isrc/berry -Isrc/s7 -Isrc/wren -Isrc/mruby -Ilibs +VPATH = src:src/lua:src/mybasic:src/squirrel:src/js:src/berry:src/s7:src/wren:src/mruby:libs:tests # --- vendored our-basic: calog's fork of MY-BASIC (see vendor/ourbasic/NOTICE) --- MBDIR = vendor/ourbasic @@ -118,6 +118,23 @@ WRENFLAGS = -std=c99 -w -g -O1 WRENOBJ = obj/wren.o WRENLIBS = -lm +# --- vendored mruby 4.0.0 (Ruby). UNLIKE every other engine, libmruby.a is GENERATED by mruby's +# own Rake build (needs a host Ruby >=2.5 + bison), not compiled from .c here. The embed gembox +# is the core language + runtime eval (mruby-compiler) + stdlib/math/metaprog, with no executables +# and no file/socket IO (calog provides those). MRB_INT64 keeps script integers 64-bit. Links -lm. +# The build config lives in src/mruby/ (calog-owned), NOT in vendor/mruby/, so re-vendoring a new +# mruby version cannot clobber it. --- +MRUBYDIR = vendor/mruby +# Both the static headers AND the build-generated ones (mruby/presym.h -- pre-interned symbols +# -- and mrbconf.h are emitted per-build under build/calog/include). +MRUBYINC = -I$(MRUBYDIR)/include -I$(MRUBYDIR)/build/calog/include +MRUBYCONF = $(CURDIR)/src/mruby/build_config.rb +MRUBYLIB = $(MRUBYDIR)/build/calog/lib/libmruby.a +MRUBYLIBS = -lm + +$(MRUBYLIB): $(MRUBYCONF) + cd $(MRUBYDIR) && MRUBY_CONFIG=$(MRUBYCONF) ruby ./minirake -j4 + # --- vendored SQLite (C amalgamation, single file). THREADSAFE=1 (serialized) because # the DB natives run inline on many context threads. Links -lm -lpthread. --- SQLITEDIR = vendor/sqlite @@ -135,19 +152,19 @@ ENETOBJ = $(foreach n,$(ENETNAMES),obj/enet_$(n).o) BINS = bin/testBroker bin/testLua bin/testMyBasic bin/testPolyglot bin/testActor \ bin/testEngineLua bin/testEngineMyBasic bin/testSquirrel bin/testEngineSquirrel bin/testJs bin/testEngineJs \ - bin/testEngineBerry bin/testEngineS7 bin/testEngineWren bin/testLoad bin/testDb bin/testNet bin/testTask bin/testExport bin/testJson bin/testTime bin/testFs bin/testCrypto bin/testKv bin/testTimer bin/testPubsub bin/testHttp bin/testHttps bin/embed bin/calog + bin/testEngineBerry bin/testEngineS7 bin/testEngineWren bin/testEngineMruby bin/testLoad bin/testDb bin/testNet bin/testTask bin/testExport bin/testJson bin/testTime bin/testFs bin/testCrypto bin/testKv bin/testTimer bin/testPubsub bin/testHttp bin/testHttps bin/embed bin/calog all: $(BINS) # ---- object rules, grouped by flag set (sources resolved via VPATH) ---- # strict C, no threads -STRICTOBJ = obj/broker.o obj/value.o obj/luaEngine.o obj/squirrelEngine.o obj/jsEngine.o obj/berryEngine.o obj/s7Engine.o obj/wrenEngine.o obj/testBroker.o +STRICTOBJ = obj/broker.o obj/value.o obj/luaEngine.o obj/squirrelEngine.o obj/jsEngine.o obj/berryEngine.o obj/s7Engine.o obj/wrenEngine.o obj/mrubyEngine.o obj/testBroker.o $(STRICTOBJ): obj/%.o: %.c | obj $(CC) $(COREFLAGS) $(INC) -c -o $@ $< # strict C, threaded -THREADOBJ = obj/context.o obj/mybasicEngine.o obj/testActor.o obj/testEngineLua.o obj/testEngineSquirrel.o obj/testEngineJs.o obj/testEngineMyBasic.o obj/testEngineBerry.o obj/testEngineS7.o obj/testEngineWren.o obj/calogHandle.o obj/testDb.o obj/testNet.o obj/testTask.o obj/calogExport.o obj/testExport.o obj/calogJson.o obj/testJson.o obj/calogFs.o obj/testFs.o obj/calogTime.o obj/testTime.o obj/calogKv.o obj/testKv.o obj/testCrypto.o obj/calogTimer.o obj/testTimer.o obj/calogPubsub.o obj/testPubsub.o obj/testHttp.o obj/testSsh.o +THREADOBJ = obj/context.o obj/mybasicEngine.o obj/testActor.o obj/testEngineLua.o obj/testEngineSquirrel.o obj/testEngineJs.o obj/testEngineMyBasic.o obj/testEngineBerry.o obj/testEngineS7.o obj/testEngineWren.o obj/testEngineMruby.o obj/calogHandle.o obj/testDb.o obj/testNet.o obj/testTask.o obj/calogExport.o obj/testExport.o obj/calogJson.o obj/testJson.o obj/calogFs.o obj/testFs.o obj/calogTime.o obj/testTime.o obj/calogKv.o obj/testKv.o obj/testCrypto.o obj/calogTimer.o obj/testTimer.o obj/calogPubsub.o obj/testPubsub.o obj/testHttp.o obj/testSsh.o $(THREADOBJ): obj/%.o: %.c | obj $(CC) $(COREFLAGS) $(INC) -pthread -c -o $@ $< @@ -205,6 +222,12 @@ WRENADP = obj/wrenAdapter.o $(WRENADP): obj/%.o: %.c | obj $(CC) $(ADPFLAGS) $(INC) $(WRENINC) -c -o $@ $< +# relaxed C + mruby headers. Ordered after $(MRUBYLIB): mruby's Rake build emits generated +# headers (mruby/presym.h) under build/calog/include that the adapter includes. +MRUBYADP = obj/mrubyAdapter.o +$(MRUBYADP): obj/%.o: %.c | obj $(MRUBYLIB) + $(CC) $(ADPFLAGS) $(INC) $(MRUBYINC) -c -o $@ $< + # DB library adapter: relaxed C + SQLite headers, sqlite backend compiled in DBADP = obj/calogDb.o $(DBADP): obj/%.o: %.c | obj @@ -218,7 +241,7 @@ $(NETADP): obj/%.o: %.c | obj # task library: strict C with every engine name compiled in (it references each engine # vtable under its CALOG_WITH_* guard), so a task-using binary links all engine archives. -ENGINEDEFS = -DCALOG_WITH_LUA -DCALOG_WITH_JS -DCALOG_WITH_SQUIRREL -DCALOG_WITH_MYBASIC -DCALOG_WITH_BERRY -DCALOG_WITH_S7 -DCALOG_WITH_WREN +ENGINEDEFS = -DCALOG_WITH_LUA -DCALOG_WITH_JS -DCALOG_WITH_SQUIRREL -DCALOG_WITH_MYBASIC -DCALOG_WITH_BERRY -DCALOG_WITH_S7 -DCALOG_WITH_WREN -DCALOG_WITH_MRUBY TASKADP = obj/calogTask.o $(TASKADP): obj/%.o: %.c | obj $(CC) $(COREFLAGS) $(INC) $(ENGINEDEFS) -pthread -c -o $@ $< @@ -271,7 +294,8 @@ obj/enet_%.o: $(ENETDIR)/%.c | obj CALOGLIB = obj/value.o obj/broker.o obj/context.o \ obj/luaAdapter.o obj/luaEngine.o obj/jsAdapter.o obj/jsEngine.o \ obj/squirrelAdapter.o obj/squirrelEngine.o obj/mybasicAdapter.o obj/mybasicEngine.o \ - obj/berryAdapter.o obj/berryEngine.o obj/s7Adapter.o obj/s7Engine.o obj/wrenAdapter.o obj/wrenEngine.o + obj/berryAdapter.o obj/berryEngine.o obj/s7Adapter.o obj/s7Engine.o obj/wrenAdapter.o obj/wrenEngine.o \ + obj/mrubyAdapter.o obj/mrubyEngine.o lib/libcalog.a: $(CALOGLIB) | lib ar rcs $@ $^ @@ -375,6 +399,9 @@ bin/testEngineS7: obj/testEngineS7.o lib/libcalog.a lib/libs7.a | bin bin/testEngineWren: obj/testEngineWren.o lib/libcalog.a lib/libwren.a | bin $(CC) $(LDFLAGS) -pthread -o $@ $^ $(WRENLIBS) +bin/testEngineMruby: obj/testEngineMruby.o lib/libcalog.a $(MRUBYLIB) | bin + $(CC) $(LDFLAGS) -pthread -o $@ $^ $(MRUBYLIBS) + # example host: embeds calog + JS via calog.h only, linking the two archives. obj/embed.o: examples/embed.c src/calog.h | obj $(CC) $(COREFLAGS) -Isrc -pthread -c -o $@ $< @@ -390,7 +417,7 @@ bin/embed: obj/embed.o lib/libcalog.a lib/libquickjs.a | bin # it); SSLARCH follows the archives that reference it. bin/calog: obj/calogMain.o \ obj/calogCrypto.o obj/calogDbFull.o obj/calogExport.o obj/calogFs.o obj/calogHttp.o obj/calogJson.o obj/calogKv.o obj/calogNet.o obj/calogPubsub.o obj/calogSsh.o obj/calogTask.o obj/calogTime.o obj/calogTimer.o obj/calogHandle.o \ - lib/libcalog.a lib/liblua.a lib/libquickjs.a lib/libsquirrel.a lib/libmybasic.a lib/libberry.a lib/libs7.a lib/libwren.a \ + lib/libcalog.a lib/liblua.a lib/libquickjs.a lib/libsquirrel.a lib/libmybasic.a lib/libberry.a lib/libs7.a lib/libwren.a $(MRUBYLIB) \ lib/libsqlite3.a lib/libenet.a $(LIBSSH2LIB) $(DBARCH) | bin $(CC) $(LDFLAGS) -pthread -o $@ $(filter-out $(DBARCH),$^) -Wl,--start-group $(PGARCHIVES) -Wl,--end-group $(MYSQLARCH) $(SSLARCH) -lstdc++ -ldl -lm -lpthread @@ -429,12 +456,12 @@ static: bin/calogStatic obj/testLoad.o: tests/testLoad.c src/calog.h | obj $(CC) $(COREFLAGS) -Isrc -pthread $(ENGINEDEFS) -c -o $@ $< -bin/testLoad: obj/testLoad.o lib/libcalog.a lib/liblua.a lib/libquickjs.a lib/libsquirrel.a lib/libmybasic.a lib/libberry.a lib/libs7.a lib/libwren.a | bin - $(CC) $(LDFLAGS) -pthread -o $@ $^ $(LUALIBS) -lstdc++ -lm +bin/testLoad: obj/testLoad.o lib/libcalog.a lib/liblua.a lib/libquickjs.a lib/libsquirrel.a lib/libmybasic.a lib/libberry.a lib/libs7.a lib/libwren.a $(MRUBYLIB) | bin + $(CC) $(LDFLAGS) -pthread -o $@ $^ $(LUALIBS) -lstdc++ -lm $(MRUBYLIBS) # task library test: the task lib names every engine, so (like testLoad) it links them all. -bin/testTask: obj/testTask.o $(TASKADP) obj/calogHandle.o lib/libcalog.a lib/liblua.a lib/libquickjs.a lib/libsquirrel.a lib/libmybasic.a lib/libberry.a lib/libs7.a lib/libwren.a | bin - $(CC) $(LDFLAGS) -pthread -o $@ $^ $(LUALIBS) -lstdc++ -lm +bin/testTask: obj/testTask.o $(TASKADP) obj/calogHandle.o lib/libcalog.a lib/liblua.a lib/libquickjs.a lib/libsquirrel.a lib/libmybasic.a lib/libberry.a lib/libs7.a lib/libwren.a $(MRUBYLIB) | bin + $(CC) $(LDFLAGS) -pthread -o $@ $^ $(LUALIBS) -lstdc++ -lm $(MRUBYLIBS) # export library test: publish from Lua, call by bare name from Lua + via callExport from JS. bin/testExport: obj/testExport.o obj/calogExport.o lib/libcalog.a lib/liblua.a lib/libquickjs.a lib/libsquirrel.a lib/libs7.a lib/libmybasic.a | bin @@ -483,7 +510,7 @@ obj bin lib: test: all ./bin/testBroker && ./bin/testLua && ./bin/testMyBasic && ./bin/testPolyglot && \ ./bin/testActor && ./bin/testEngineLua && ./bin/testEngineMyBasic && ./bin/testSquirrel && ./bin/testEngineSquirrel && \ - ./bin/testJs && ./bin/testEngineJs && ./bin/testEngineBerry && ./bin/testEngineS7 && ./bin/testEngineWren && ./bin/testLoad && ./bin/testDb && ./bin/testNet && ./bin/testTask && ./bin/testExport && ./bin/testJson && ./bin/testTime && ./bin/testFs && ./bin/testCrypto && ./bin/testKv && ./bin/testTimer && ./bin/testPubsub && ./bin/testHttp && ./bin/testHttps + ./bin/testJs && ./bin/testEngineJs && ./bin/testEngineBerry && ./bin/testEngineS7 && ./bin/testEngineWren && ./bin/testEngineMruby && ./bin/testLoad && ./bin/testDb && ./bin/testNet && ./bin/testTask && ./bin/testExport && ./bin/testJson && ./bin/testTime && ./bin/testFs && ./bin/testCrypto && ./bin/testKv && ./bin/testTimer && ./bin/testPubsub && ./bin/testHttp && ./bin/testHttps # ThreadSanitizer build of the actor core and the Lua engine path (cannot combine # with ASan). Recompiled from source under TSan; the vendored Lua objects are @@ -566,6 +593,16 @@ tsanwren: | bin obj setarch -R ./bin/testEngineWrenTsan rm -f obj/wren.tsan.o +# ThreadSanitizer build of the mruby engine path. Unlike the other engines, mruby's VM is a +# separate Rake-built archive, so it links UN-sanitized (like tsanlibs with liblua.a) -- TSan +# instruments the calog adapter/engine/actor code, which is where the cross-context risk lives; +# each mrb_state is independent (one per thread), the concurrency gate mruby was chosen on. +tsanmruby: $(MRUBYLIB) | bin obj + $(CC) $(TSANFLAGS) $(INC) $(MRUBYINC) -o bin/testEngineMrubyTsan \ + tests/testEngineMruby.c src/mruby/mrubyEngine.c src/mruby/mrubyAdapter.c $(TSANCORE) \ + $(MRUBYLIB) $(MRUBYLIBS) + setarch -R ./bin/testEngineMrubyTsan + # ThreadSanitizer build of the concurrent libraries (timer's background thread, pubsub's # callback fan-out, kv's shared store), each over a Lua context so callbacks marshal across # threads. The unsanitized liblua.a links in fine (TSan instruments only the calog code). @@ -583,4 +620,4 @@ clean: -include $(wildcard obj/*.d) -include $(wildcard obj/rel/*.d) -.PHONY: all test tsan tsansq tsanjs tsanmb tsanberry tsans7 tsanwren tsanlibs clean +.PHONY: all test tsan tsansq tsanjs tsanmb tsanberry tsans7 tsanwren tsanmruby tsanlibs clean diff --git a/README.md b/README.md index 701a44c5..864a6bc1 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ calog embeds scripting into a C or C++ program. You register your native C functions **once**, and they become callable from **any** embedded engine — Lua, JavaScript, Scheme, -Squirrel, Wren, Berry, or MY-BASIC — with values passed through a single canonical type. Add a new +Squirrel, Wren, Berry, Ruby, or MY-BASIC — with values passed through a single canonical type. Add a new scripting language to your app by linking one more archive; your native functions don't change. @@ -19,7 +19,7 @@ calogContextEval(ctx, "hostLog('hello from JavaScript, ' + 6 * 7)"); ``` Swap `&calogJsEngine` for `&calogLuaEngine`, `&calogSquirrelEngine`, -`&calogS7Engine`, `&calogWrenEngine`, `&calogBerryEngine`, or `&calogMyBasicEngine` — nothing else changes. +`&calogS7Engine`, `&calogWrenEngine`, `&calogBerryEngine`, `&calogMrubyEngine`, or `&calogMyBasicEngine` — nothing else changes. --- @@ -59,6 +59,7 @@ Swap `&calogJsEngine` for `&calogLuaEngine`, `&calogSquirrelEngine`, | Scheme | `calogS7Engine` | `.scm` | s7; 64-bit ints | | Wren | `calogWrenEngine` | `.wren` | doubles only; call via `Calog.call(…)` | | Berry | `calogBerryEngine` | `.be` | scalars + callbacks | +| Ruby | `calogMrubyEngine` | `.rb` | mruby; 64-bit ints; built by mruby's Rake | A native can return a keyed `CalogValueT` record and **every** engine reads its fields with native syntax (`user.name`, `user["name"]`, `(user "name")`), and a script can hand a diff --git a/design.md b/design.md index 873232dc..f39add55 100644 --- a/design.md +++ b/design.md @@ -1029,3 +1029,52 @@ compile). Berry's `BE_BYTES_MAX_SIZE` was likewise raised from 32 kb to 256 MB. **Verified**: `make test` (539 checks) with a `testForeignFunction` per engine and a `testMapIngress` on s7 and Berry (the Berry one nests a list to exercise list ingress); ASan-clean on every engine (retain/release balanced); gcc strict; per-engine `tsan*`. + +## 19. mruby -- the eighth engine (Ruby) + +**mruby** (`.rb`, `calogMrubyEngine`) is the first engine whose static library is not compiled from +vendored `.c` but **generated by the engine's own build**: mruby 4.0.0's Rake build (needs a host +Ruby + bison) emits `libmruby.a` from a trimmed embed gembox -- stdlib + math + metaprog (which +carries `mruby-compiler`, i.e. runtime `eval`) plus `mruby-bin-mrbc` as a *build-time* tool to +compile the Ruby-written stdlib into the archive; no bins, no file/socket IO. `MRB_INT64` keeps +script integers full 64-bit. The Makefile runs the Rake build as a prerequisite of the adapter +object, since mruby emits a per-build `mruby/presym.h` the adapter must include. Linked footprint is +~1.1 MB (QuickJS class -- not the CPython-scale bloat the feasibility study found real Ruby drags in). + +Dispatch resolves two mruby facts. `mrb_func_t` carries **no user data**, so every native binds one +shared trampoline that recovers *which* native was called from the current method id (`mrb_get_mid` +-> `mrb_sym_name`); the context rides on **`mrb->ud`** (mrb_state's spare auxiliary pointer -- +script-invisible, no global). Natives are public `Kernel` methods, so `cryptoUuid()` works bare. + +Callables cross both ways with real Ruby semantics. A Ruby proc/lambda crossing *out* is GC-pinned +with `mrb_gc_register` behind `CalogFnT`, invoked with `mrb_funcall_argv(..., "call", ...)` (so a +Proc, a lambda, or a `Method` all work). A foreign `CalogFnT` crossing *in* becomes a **genuine Ruby +`Proc`** via `mrb_proc_new_cfunc_with_env` (the `CalogFnT` travels in the proc's cfunc env as a +cptr), so a script calls it `f.call(x)` / `f.(x)` and can pass it as a block -- no `.call`-method +wrapper like Wren, no `calogInvoke` helper like my-basic. As with Berry, that cfunc env has no +per-value finalizer, so foreign callables are tracked on the context and released at destroy; +marshalling is bracketed by `mrb_gc_arena_save`/`restore` so transient objects don't overflow the +arena. + +Aggregates are `Array` <-> list and `Hash` <-> map (a keyed record's sequence part goes at integer +keys); strings are binary-safe (`mrb_str_new` carries a length). Bare-name **exports** resolve via +`Kernel#method_missing`: a top-level `exportedFn(args)` that is not a defined method is looked up in +the export registry and invoked -- but *only* when `self` is the main object (`mrb_obj_equal` against +`mrb_top_self`), so a missing method on any other receiver (`obj.foo`) stays a plain `NoMethodError` +and is never hijacked. This puts Ruby among the hook engines without a VM change -- its own +`method_missing` is the hook my-basic needed a fork to fake. + +**IO by design.** Ruby's `File`/`IO`/`Socket` are left out (no `mruby-io`): scripts use calog's +`fs*`/`net*`/`http*` natives like every other engine, so all IO stays on one path. A partial `File` +shim would footgun (whole-file ops map to calog's `fs`, but the streaming object model does not), so +it is all-or-nothing and deferred; the adapter supplies only `puts`/`print`/`p` (to stdout). + +mruby keeps no shared mutable process state -- one independent `mrb_state` per `mrb_open`, no GIL -- +so contexts run in parallel, the concurrency gate mruby was chosen on (over MRI/CRuby and MicroPython, +which both fail it). Its Rake-built archive links un-sanitized, so `tsanmruby` instruments the +adapter/engine/actor code (like `tsanlibs` with Lua); each VM is single-threaded per instance. + +**Verified**: `testEngineMruby` (13 checks -- natives, `Hash` egress/ingress, a foreign `Proc`, a +cross-thread lambda callback, the error handler, three concurrent `mrb_state`s), ASan-clean; +`tsanmruby` clean; cross-engine both ways (Ruby calling a Lua export, Lua invoking a Ruby lambda +export); `make test` 29/29. diff --git a/examples/scripts/README.md b/examples/scripts/README.md index 388d23f1..1ac16fa3 100644 --- a/examples/scripts/README.md +++ b/examples/scripts/README.md @@ -33,6 +33,7 @@ Conventions every example follows: | `squirrel.nut` | Squirrel: locals, a function, `foreach` over an array, a table, a small class | | `mybasic.bas` | my-basic: variables, a `FOR..NEXT` sum, `IF..THEN..ELSE`, plus crypto + kv | | `berry.be` | Berry (Python-like): a `def`, a list built with a `for`, a map, then json + uuid | +| `ruby.rb` | Ruby (mruby): a Range, `reduce` with a block, `select(&:even?)`, a Hash, then json + sha256 | | `scheme.scm` | s7 Scheme: a recursive factorial, list build + map, string ops (all in one `(begin ...)`) | | `wren.wren` | Wren: a class, a `List`, and every native reached via `Calog.call(name, [args])` | diff --git a/examples/scripts/languages/ruby.rb b/examples/scripts/languages/ruby.rb new file mode 100644 index 00000000..71ca75ff --- /dev/null +++ b/examples/scripts/languages/ruby.rb @@ -0,0 +1,19 @@ +# A guided tour of Ruby (mruby) running on calog. +# Demonstrates: a Range, reduce with a block, select with a symbol-to-proc, a Hash, then the +# jsonStringify/jsonParse and cryptoHashSha256 natives. Ruby's puts works; real file/socket IO +# is provided by calog's fs*/net* natives (not Ruby's stdlib) -- so scripts stay uniform. +# run: bin/calog examples/scripts/languages/ruby.rb + +nums = (1..5).to_a +total = nums.reduce(0) { |acc, n| acc + n } +evens = nums.select(&:even?) +puts "nums=#{nums.inspect} total=#{total} evens=#{evens.inspect}" + +user = { "name" => "ada", "age" => 36 } +calogPrint("user as JSON:", jsonStringify(user)) + +parsed = jsonParse('{"lang":"ruby","ints":[1,2,3]}') +calogPrint("parsed lang:", parsed["lang"], "| first int:", parsed["ints"][0]) +calogPrint("sha256(calog):", cryptoHashSha256("calog")) + +calogExit(0) diff --git a/libs/calogExport.h b/libs/calogExport.h index 75c1af2a..a7e7389b 100644 --- a/libs/calogExport.h +++ b/libs/calogExport.h @@ -9,9 +9,11 @@ // (plain `export` is a JavaScript keyword; plain `call` is a my-basic keyword). // // On engines with a runtime unknown-name hook (Lua, Squirrel, JavaScript, s7), an exported -// name is ALSO reachable by its BARE name, e.g. `luaExample(1, 2)`. my-basic likewise bare- -// resolves a name called like a function, but CASE-INSENSITIVELY (it uppercases identifiers at -// parse time), so `luaExample(1, 2)` there matches the export ignoring case. Wren and Berry +// name is ALSO reachable by its BARE name, e.g. `luaExample(1, 2)`. Ruby resolves a bare name +// the same way via Kernel#method_missing, but only at TOP LEVEL (self is the main object, so a +// missing method on some other receiver -- obj.foo -- is never hijacked). my-basic likewise +// bare-resolves a name called like a function, but CASE-INSENSITIVELY (it uppercases identifiers +// at parse time), so `luaExample(1, 2)` there matches the export ignoring case. Wren and Berry // resolve names statically and use calogCall('luaExample', ...). Resolution is dynamic: a name // exported at any time becomes callable immediately, and calogUnexport takes effect at once. // diff --git a/libs/calogTask.c b/libs/calogTask.c index d6893002..3ee5a59e 100644 --- a/libs/calogTask.c +++ b/libs/calogTask.c @@ -69,6 +69,9 @@ static const TaskEngineT gTaskEngines[] = { #endif #ifdef CALOG_WITH_WREN { "wren", &calogWrenEngine }, +#endif +#ifdef CALOG_WITH_MRUBY + { "mruby", &calogMrubyEngine }, #endif { NULL, NULL } }; diff --git a/src/calog.h b/src/calog.h index aebf6ff3..458279f5 100644 --- a/src/calog.h +++ b/src/calog.h @@ -203,6 +203,7 @@ extern const CalogEngineT calogMyBasicEngine; extern const CalogEngineT calogBerryEngine; extern const CalogEngineT calogS7Engine; extern const CalogEngineT calogWrenEngine; +extern const CalogEngineT calogMrubyEngine; // Register the built-in engines selected at build time, so calogContextLoad works // without hand-registering each. Define CALOG_WITH_LUA / _JS / _SQUIRREL / _MYBASIC (in @@ -231,6 +232,9 @@ static inline void calogRegisterBuiltinEngines(CalogT *calog) { #endif #ifdef CALOG_WITH_WREN calogRegisterEngine(calog, &calogWrenEngine); +#endif +#ifdef CALOG_WITH_MRUBY + calogRegisterEngine(calog, &calogMrubyEngine); #endif (void)calog; // no-op if the build selected no engines } diff --git a/src/calogMain.c b/src/calogMain.c index 3b08a133..14d837d8 100644 --- a/src/calogMain.c +++ b/src/calogMain.c @@ -93,7 +93,8 @@ static const CalogEngineT *const gEngines[] = { &calogMyBasicEngine, &calogBerryEngine, &calogS7Engine, - &calogWrenEngine + &calogWrenEngine, + &calogMrubyEngine }; // The built-in libraries, in registration order. One source of truth: main() registers every diff --git a/src/mruby/build_config.rb b/src/mruby/build_config.rb new file mode 100644 index 00000000..2652f184 --- /dev/null +++ b/src/mruby/build_config.rb @@ -0,0 +1,30 @@ +# calog's embed build config for mruby. +# +# Kept HERE, in src/mruby/ (NOT under vendor/mruby/), on purpose: it is calog-owned, so +# re-vendoring a new mruby version -- which replaces the whole vendor/mruby/ tree -- cannot +# overwrite or delete it. The Makefile points MRUBY_CONFIG at this file by absolute path and runs +# the build from the mruby tree, so `conf.gembox 'name'` resolves against vendor/mruby/mrbgems. +# +# Produces build/calog/lib/libmruby.a. Trimmed for embedding: +# - stdlib : Array/Hash/String/Enumerable/... extensions, Set, Fiber, Struct +# - stdlib-ext : sprintf, time, struct, data, random, pack +# - math : Math, Rational, Complex, bigint (arbitrary-precision integers) +# - metaprog : metaprogramming AND mruby-compiler (runtime eval of source strings) +# Deliberately excluded: the bin gems (no mrbc/mirb/mruby executables -- calog links only the +# library) and stdlib-io / mruby-io / mruby-socket (calog provides its own fs and net natives; +# the adapter supplies puts/print). MRB_INT64 keeps script integers full 64-bit to match calog. +MRuby::Build.new('calog') do |conf| + conf.toolchain :gcc + conf.cc.flags << '-O2' + conf.cc.defines << 'MRB_INT64' + + conf.gembox 'stdlib' + conf.gembox 'stdlib-ext' + conf.gembox 'math' + conf.gembox 'metaprog' + + # Build-time tool only: mrbc compiles the Ruby-written stdlib (mrblib/*.rb and each gem's + # *.rb) into libmruby.a. The executable is not linked into calog. It is the one bin gem the + # library build requires; the other bins (mirb/mruby/mrdb) are deliberately left out. + conf.gem core: 'mruby-bin-mrbc' +end diff --git a/src/mruby/mrubyAdapter.c b/src/mruby/mrubyAdapter.c new file mode 100644 index 00000000..8fd9388b --- /dev/null +++ b/src/mruby/mrubyAdapter.c @@ -0,0 +1,714 @@ +// mrubyAdapter.c -- mruby (Ruby) engine adapter for the broker. +// +// Each exposed native is a Kernel method bound to one shared trampoline. mrb_func_t carries no +// userData, so the trampoline recovers the native's name from the current call's method id +// (mrb_get_mid) and the owning context from mrb->ud, then marshals the Ruby arguments to +// CalogValueT and dispatches through calogCall (honoring the actor route hook). Marshalling covers +// scalars and binary-safe strings; aggregates cross both ways (Array<->list, Hash<->map). Functions +// cross both ways too: a Ruby proc out becomes a refcounted CalogFnT pinned as a GC root +// (mrb_gc_register) and dropped on release; a foreign CalogFnT in becomes a real Ruby Proc +// (mrb_proc_new_cfunc_with_env) carrying the CalogFnT in its env -- the script calls it as f.call(x). +// Foreign functions are tracked on the context and released at destroy (a cfunc proc's env has no +// per-value finalizer). puts/print/p are provided (routed to stdout); there is no file/socket IO. +// +// Error model: on failure the trampoline raises an mruby exception (mrb_raise, which longjmps out +// of the VM) after freeing any CalogValueT it owns. GC-arena save/restore brackets marshalling so +// transient objects created here do not overflow the arena. + +#define _POSIX_C_SOURCE 200809L + +#include "mrubyAdapter.h" + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#define MRUBY_FOREIGN_INITIAL 8 + +struct CalogMrubyT { + mrb_state *mrb; + CalogT *broker; + uint64_t ctxId; + CalogFnT **foreignFns; // foreign function values pushed into this VM + int32_t foreignCount; + int32_t foreignCap; +}; + +// Backs a CalogFnT exported from this VM: the owning context and the pinned Ruby callable +// (a Proc/Method), kept GC-reachable by mrb_gc_register until the CalogFnT is released. +typedef struct MrubyExportT { + CalogMrubyT *context; + mrb_value callable; +} MrubyExportT; + +static int32_t mrubyCallableInvoke(CalogValueT *args, int32_t argCount, CalogValueT *result, void *userData); +static void mrubyCallableRelease(CalogFnT *callable); +static int32_t mrubyExportValue(CalogMrubyT *context, mrb_value callable, CalogFnT **out); +static mrb_value mrubyForeignCall(mrb_state *mrb, mrb_value self); +static int32_t mrubyFromValue(CalogMrubyT *context, const CalogValueT *value, mrb_value *out, int32_t depth); +static int32_t mrubyInvokeArgs(CalogMrubyT *context, CalogFnT *callable, mrb_value *argv, mrb_int argc, mrb_value *out, char *errbuf, size_t errcap); +static mrb_value mrubyMethodMissing(mrb_state *mrb, mrb_value self); +static mrb_value mrubyP(mrb_state *mrb, mrb_value self); +static mrb_value mrubyPrint(mrb_state *mrb, mrb_value self); +static mrb_value mrubyPuts(mrb_state *mrb, mrb_value self); +static int32_t mrubyToValue(CalogMrubyT *context, mrb_value value, CalogValueT *out, int32_t depth); +static int32_t mrubyTrackForeign(CalogMrubyT *context, CalogFnT *callable); +static mrb_value mrubyTrampoline(mrb_state *mrb, mrb_value self); + + +int32_t calogMrubyCreate(CalogMrubyT **out, CalogT *broker, uint64_t ctxId) { + CalogMrubyT *context; + mrb_state *mrb; + + *out = NULL; + context = (CalogMrubyT *)calloc(1, sizeof(*context)); + if (context == NULL) { + return calogErrOomE; + } + mrb = mrb_open(); + if (mrb == NULL) { + free(context); + return calogErrOomE; + } + context->mrb = mrb; + context->broker = broker; + context->ctxId = ctxId; + mrb->ud = context; // the trampoline recovers the context from here + // Ruby ergonomics without pulling mruby-io: puts/print/p route to stdout. Defined on Kernel + // so a bare `puts "x"` works at top level (calog scripts still use fs*/net* for real IO). + mrb_define_method(mrb, mrb->kernel_module, "puts", mrubyPuts, MRB_ARGS_ANY()); + mrb_define_method(mrb, mrb->kernel_module, "print", mrubyPrint, MRB_ARGS_ANY()); + mrb_define_method(mrb, mrb->kernel_module, "p", mrubyP, MRB_ARGS_ANY()); + // Bare-name export resolution: a top-level `exportedFn(args)` that is not a defined method + // resolves to a broker export (see mrubyMethodMissing), like the hook engines. + mrb_define_method(mrb, mrb->kernel_module, "method_missing", mrubyMethodMissing, MRB_ARGS_ANY()); + *out = context; + return calogOkE; +} + + +static int32_t mrubyCallableInvoke(CalogValueT *args, int32_t argCount, CalogValueT *result, void *userData) { + MrubyExportT *export; + CalogMrubyT *context; + mrb_state *mrb; + mrb_value *argv; + mrb_value ret; + int arena; + int32_t index; + int32_t status; + + export = (MrubyExportT *)userData; + context = export->context; + mrb = context->mrb; + calogValueNil(result); + argv = NULL; + if (argCount > 0) { + argv = (mrb_value *)calloc((size_t)argCount, sizeof(mrb_value)); + if (argv == NULL) { + return calogFail(result, calogErrOomE, "out of memory calling mruby callable"); + } + } + arena = mrb_gc_arena_save(mrb); + for (index = 0; index < argCount; index++) { + status = mrubyFromValue(context, &args[index], &argv[index], 0); + if (status != calogOkE) { + mrb_gc_arena_restore(mrb, arena); + free(argv); + return calogFail(result, status, "failed to marshal argument into mruby"); + } + } + ret = mrb_funcall_argv(mrb, export->callable, mrb_intern_lit(mrb, "call"), (mrb_int)argCount, argv); + free(argv); + if (mrb->exc != NULL) { + mrb_value exc; + mrb_value message; + const char *text; + exc = mrb_obj_value(mrb->exc); + mrb->exc = NULL; + message = mrb_funcall_argv(mrb, exc, mrb_intern_lit(mrb, "message"), 0, NULL); + text = mrb_string_p(message) ? RSTRING_PTR(message) : "mruby callable raised"; + status = calogFail(result, calogErrArgE, text); + mrb_gc_arena_restore(mrb, arena); + return status; + } + status = mrubyToValue(context, ret, result, 0); + mrb_gc_arena_restore(mrb, arena); + return status; +} + + +static void mrubyCallableRelease(CalogFnT *callable) { + MrubyExportT *export; + + export = (MrubyExportT *)calogFnUserData(callable); + mrb_gc_unregister(export->context->mrb, export->callable); + free(export); +} + + +void calogMrubyDestroy(CalogMrubyT *context) { + int32_t index; + + if (context == NULL) { + return; + } + // Release the foreign function values pushed into this VM (see mrubyTrackForeign): a cfunc + // proc's env has no per-value finalizer, so they are held until the context is destroyed. + for (index = 0; index < context->foreignCount; index++) { + calogFnRelease(context->foreignFns[index]); + } + free(context->foreignFns); + if (context->mrb != NULL) { + mrb_close(context->mrb); + } + free(context); +} + + +int32_t calogMrubyExport(CalogMrubyT *context, const char *name, CalogFnT **out) { + mrb_state *mrb; + mrb_value self; + mrb_value method; + mrb_value sym; + int arena; + int32_t status; + + mrb = context->mrb; + *out = NULL; + // Object#method returns a Method for a top-level `def name` (public or private). A Proc/lambda + // held in a global ($name) also resolves through method_missing/global lookup below. + self = mrb_top_self(mrb); + sym = mrb_symbol_value(mrb_intern_cstr(mrb, name)); + arena = mrb_gc_arena_save(mrb); + method = mrb_funcall_argv(mrb, self, mrb_intern_lit(mrb, "method"), 1, &sym); + if (mrb->exc != NULL) { + mrb->exc = NULL; + mrb_gc_arena_restore(mrb, arena); + return calogErrNotFoundE; + } + status = mrubyExportValue(context, method, out); + mrb_gc_arena_restore(mrb, arena); + return status; +} + + +static int32_t mrubyExportValue(CalogMrubyT *context, mrb_value callable, CalogFnT **out) { + mrb_state *mrb; + MrubyExportT *export; + int32_t status; + + mrb = context->mrb; + *out = NULL; + export = (MrubyExportT *)malloc(sizeof(*export)); + if (export == NULL) { + return calogErrOomE; + } + export->context = context; + export->callable = callable; + // Pin the callable as a GC root so it survives until the CalogFnT is released. + mrb_gc_register(mrb, callable); + status = calogFnCreate(out, context->broker, mrubyCallableInvoke, export, mrubyCallableRelease, context->ctxId); + if (status != calogOkE) { + mrb_gc_unregister(mrb, callable); + free(export); + return status; + } + return calogOkE; +} + + +int32_t calogMrubyExpose(CalogMrubyT *context, const char *name) { + mrb_state *mrb; + + mrb = context->mrb; + if (calogLookup(context->broker, name) == NULL) { + return calogErrNotFoundE; + } + // A public Kernel method routed to the shared trampoline, so `name(args)` works at top level + // in any context. The trampoline recovers `name` from the call's method id. + mrb_define_method(mrb, mrb->kernel_module, name, mrubyTrampoline, MRB_ARGS_ANY()); + return calogOkE; +} + + +// Call target for a foreign CalogFnT pushed into mruby as a Proc. The CalogFnT travels in the +// proc's cfunc env (slot 0, a cptr); the context comes from mrb->ud. +static mrb_value mrubyForeignCall(mrb_state *mrb, mrb_value self) { + CalogMrubyT *context; + CalogFnT *callable; + mrb_value *argv; + mrb_int argc; + mrb_value out; + int arena; + int32_t status; + char message[CALOG_ERR_MSG_CAP]; + + (void)self; + context = (CalogMrubyT *)mrb->ud; + callable = (CalogFnT *)mrb_cptr(mrb_proc_cfunc_env_get(mrb, 0)); + mrb_get_args(mrb, "*", &argv, &argc); + arena = mrb_gc_arena_save(mrb); + status = mrubyInvokeArgs(context, callable, argv, argc, &out, message, sizeof(message)); + mrb_gc_arena_restore(mrb, arena); + if (status != calogOkE) { + mrb_raise(mrb, E_RUNTIME_ERROR, message); + } + return out; +} + + +static int32_t mrubyFromValue(CalogMrubyT *context, const CalogValueT *value, mrb_value *out, int32_t depth) { + mrb_state *mrb; + + mrb = context->mrb; + *out = mrb_nil_value(); + if (depth >= CALOG_MAX_DEPTH) { + return calogErrDepthE; + } + switch (value->type) { + case calogNilE: + return calogOkE; + case calogBoolE: + *out = mrb_bool_value(value->as.b); + return calogOkE; + case calogIntE: + *out = mrb_int_value(mrb, (mrb_int)value->as.i); + return calogOkE; + case calogRealE: + *out = mrb_float_value(mrb, (mrb_float)value->as.r); + return calogOkE; + case calogStringE: + *out = mrb_str_new(mrb, value->as.s.bytes, (mrb_int)value->as.s.length); + return calogOkE; + case calogAggE: { + CalogAggT *aggregate; + int64_t index; + int32_t status; + mrb_value child; + aggregate = value->as.agg; + if (calogAggIsKeyed(aggregate)) { + mrb_value map; + map = mrb_hash_new(mrb); + for (index = 0; index < aggregate->arrayCount; index++) { + status = mrubyFromValue(context, &aggregate->array[index], &child, depth + 1); + if (status != calogOkE) { + return status; + } + mrb_hash_set(mrb, map, mrb_int_value(mrb, (mrb_int)index), child); + } + for (index = 0; index < aggregate->pairCount; index++) { + mrb_value key; + status = mrubyFromValue(context, &aggregate->pairs[index].key, &key, depth + 1); + if (status != calogOkE) { + return status; + } + status = mrubyFromValue(context, &aggregate->pairs[index].value, &child, depth + 1); + if (status != calogOkE) { + return status; + } + mrb_hash_set(mrb, map, key, child); + } + *out = map; + return calogOkE; + } + *out = mrb_ary_new_capa(mrb, (mrb_int)aggregate->arrayCount); + for (index = 0; index < aggregate->arrayCount; index++) { + status = mrubyFromValue(context, &aggregate->array[index], &child, depth + 1); + if (status != calogOkE) { + return status; + } + mrb_ary_push(mrb, *out, child); + } + return calogOkE; + } + case calogFnE: { + // A foreign callable becomes a real Ruby Proc carrying the CalogFnT in its env; + // the script calls it as f.call(x) / f.(x). Tracked on the context and released at + // destroy (a cfunc proc's env has no per-value finalizer). + mrb_value env[1]; + if (mrubyTrackForeign(context, value->as.fn) != calogOkE) { + return calogErrOomE; + } + env[0] = mrb_cptr_value(mrb, value->as.fn); + *out = mrb_obj_value(mrb_proc_new_cfunc_with_env(mrb, mrubyForeignCall, 1, env)); + calogFnRetain(value->as.fn); + return calogOkE; + } + } + return calogErrTypeE; +} + + +// Marshal argv[0..argc) into CalogValueT, invoke `callable`, and marshal the result into *out. +// Non-raising: returns calogOkE (out set) or an error, copying a message into errbuf so the caller +// can release its own references before raising (the mruby raise longjmps out). +static int32_t mrubyInvokeArgs(CalogMrubyT *context, CalogFnT *callable, mrb_value *argv, mrb_int argc, mrb_value *out, char *errbuf, size_t errcap) { + CalogValueT *args; + CalogValueT result; + mrb_int index; + int32_t status; + + *out = mrb_nil_value(); + args = NULL; + if (argc > 0) { + args = (CalogValueT *)calloc((size_t)argc, sizeof(CalogValueT)); + if (args == NULL) { + snprintf(errbuf, errcap, "out of memory marshalling arguments"); + return calogErrOomE; + } + } + for (index = 0; index < argc; index++) { + status = mrubyToValue(context, argv[index], &args[index], 0); + if (status != calogOkE) { + mrb_int cleanup; + for (cleanup = 0; cleanup < index; cleanup++) { + calogValueFree(&args[cleanup]); + } + free(args); + snprintf(errbuf, errcap, "failed to marshal an argument"); + return status; + } + } + status = calogFnInvoke(callable, args, (int32_t)argc, &result); + for (index = 0; index < argc; index++) { + calogValueFree(&args[index]); + } + free(args); + if (status != calogOkE) { + snprintf(errbuf, errcap, "%s", (result.type == calogStringE) ? result.as.s.bytes : "call failed"); + calogValueFree(&result); + return status; + } + status = mrubyFromValue(context, &result, out, 0); + calogValueFree(&result); + if (status != calogOkE) { + snprintf(errbuf, errcap, "failed to marshal the result"); + } + return status; +} + + +// Kernel#method_missing: a bare name called at TOP LEVEL that is not a defined method may be a +// broker export. Resolve and invoke it -- but only when self is the top-level main object, so a +// missing method on any other receiver (obj.foo) stays a NoMethodError and is never hijacked. +// This gives Ruby the bare-name export resolution the hook engines have (no VM change needed). +static mrb_value mrubyMethodMissing(mrb_state *mrb, mrb_value self) { + CalogMrubyT *context; + mrb_value *argv; + mrb_int argc; + mrb_sym missing; + const char *name; + CalogValueT nameArg; + CalogValueT resolved; + mrb_value out; + int arena; + int32_t status; + char message[CALOG_ERR_MSG_CAP]; + + context = (CalogMrubyT *)mrb->ud; + mrb_get_args(mrb, "*", &argv, &argc); // argv[0] is the method name (a Symbol), rest are args + if (argc < 1 || !mrb_symbol_p(argv[0])) { + mrb_raise(mrb, E_NOMETHOD_ERROR, "method_missing without a method name"); + } + missing = mrb_symbol(argv[0]); + if (!mrb_obj_equal(mrb, self, mrb_top_self(mrb))) { + mrb_raisef(mrb, E_NOMETHOD_ERROR, "undefined method '%n'", missing); + } + name = mrb_sym_name(mrb, missing); + if (calogValueString(&nameArg, name, (int64_t)strlen(name)) != calogOkE) { + mrb_raisef(mrb, E_NOMETHOD_ERROR, "undefined method '%n'", missing); + } + calogValueNil(&resolved); + calogCall(context->broker, "__calogExportResolve", &nameArg, 1, &resolved); + calogValueFree(&nameArg); + if (resolved.type != calogFnE) { + calogValueFree(&resolved); + mrb_raisef(mrb, E_NOMETHOD_ERROR, "undefined method '%n'", missing); + } + // It is an export: invoke with the remaining args. Keep our resolved reference across the + // invoke (guards against a concurrent unexport), release it, THEN raise on failure -- so the + // reference never leaks on the raise path. + arena = mrb_gc_arena_save(mrb); + status = mrubyInvokeArgs(context, resolved.as.fn, argv + 1, argc - 1, &out, message, sizeof(message)); + calogValueFree(&resolved); + mrb_gc_arena_restore(mrb, arena); + if (status != calogOkE) { + mrb_raise(mrb, E_RUNTIME_ERROR, message); + } + return out; +} + + +static mrb_value mrubyP(mrb_state *mrb, mrb_value self) { + mrb_value *argv; + mrb_int argc; + mrb_int index; + + (void)self; + mrb_get_args(mrb, "*", &argv, &argc); + for (index = 0; index < argc; index++) { + mrb_value text; + text = mrb_inspect(mrb, argv[index]); + fwrite(RSTRING_PTR(text), 1, (size_t)RSTRING_LEN(text), stdout); + fputc('\n', stdout); + } + if (argc == 1) { + return argv[0]; + } + return mrb_nil_value(); +} + + +static mrb_value mrubyPrint(mrb_state *mrb, mrb_value self) { + mrb_value *argv; + mrb_int argc; + mrb_int index; + + (void)self; + mrb_get_args(mrb, "*", &argv, &argc); + for (index = 0; index < argc; index++) { + mrb_value text; + text = mrb_obj_as_string(mrb, argv[index]); + fwrite(RSTRING_PTR(text), 1, (size_t)RSTRING_LEN(text), stdout); + } + return mrb_nil_value(); +} + + +static mrb_value mrubyPuts(mrb_state *mrb, mrb_value self) { + mrb_value *argv; + mrb_int argc; + mrb_int index; + + (void)self; + mrb_get_args(mrb, "*", &argv, &argc); + if (argc == 0) { + fputc('\n', stdout); + return mrb_nil_value(); + } + for (index = 0; index < argc; index++) { + mrb_value text; + text = mrb_obj_as_string(mrb, argv[index]); + fwrite(RSTRING_PTR(text), 1, (size_t)RSTRING_LEN(text), stdout); + fputc('\n', stdout); + } + return mrb_nil_value(); +} + + +int32_t calogMrubyRun(CalogMrubyT *context, const char *source) { + mrb_state *mrb; + int arena; + + mrb = context->mrb; + arena = mrb_gc_arena_save(mrb); + mrb_load_string(mrb, source); + if (mrb->exc != NULL) { + mrb_value exc; + mrb_value text; + exc = mrb_obj_value(mrb->exc); + mrb->exc = NULL; + text = mrb_funcall_argv(mrb, exc, mrb_intern_lit(mrb, "inspect"), 0, NULL); + fprintf(stderr, "mruby error: %s\n", mrb_string_p(text) ? RSTRING_PTR(text) : "(unknown)"); + mrb_gc_arena_restore(mrb, arena); + return calogErrArgE; + } + mrb_gc_arena_restore(mrb, arena); + return calogOkE; +} + + +static int32_t mrubyToValue(CalogMrubyT *context, mrb_value value, CalogValueT *out, int32_t depth) { + mrb_state *mrb; + + mrb = context->mrb; + calogValueNil(out); + if (depth >= CALOG_MAX_DEPTH) { + return calogErrDepthE; + } + if (mrb_nil_p(value)) { + return calogOkE; + } + switch (mrb_type(value)) { + case MRB_TT_TRUE: + calogValueBool(out, true); + return calogOkE; + case MRB_TT_FALSE: + calogValueBool(out, false); + return calogOkE; + case MRB_TT_INTEGER: + calogValueInt(out, (int64_t)mrb_integer(value)); + return calogOkE; + case MRB_TT_FLOAT: + calogValueReal(out, (double)mrb_float(value)); + return calogOkE; + case MRB_TT_STRING: + return calogValueString(out, RSTRING_PTR(value), (int64_t)RSTRING_LEN(value)); + case MRB_TT_ARRAY: { + CalogAggT *aggregate; + int32_t status; + mrb_int index; + mrb_int count; + status = calogAggCreate(&aggregate, calogListE); + if (status != calogOkE) { + return status; + } + count = RARRAY_LEN(value); + for (index = 0; index < count; index++) { + CalogValueT element; + status = mrubyToValue(context, mrb_ary_ref(mrb, value, index), &element, depth + 1); + if (status != calogOkE) { + calogAggFree(aggregate); + return status; + } + status = calogAggPush(aggregate, &element); + if (status != calogOkE) { + calogValueFree(&element); + calogAggFree(aggregate); + return status; + } + } + calogValueAgg(out, aggregate); + return calogOkE; + } + case MRB_TT_HASH: { + CalogAggT *aggregate; + mrb_value keys; + int32_t status; + mrb_int index; + mrb_int count; + status = calogAggCreate(&aggregate, calogMapE); + if (status != calogOkE) { + return status; + } + keys = mrb_hash_keys(mrb, value); + count = RARRAY_LEN(keys); + for (index = 0; index < count; index++) { + mrb_value rubyKey; + CalogValueT key; + CalogValueT element; + rubyKey = mrb_ary_ref(mrb, keys, index); + status = mrubyToValue(context, rubyKey, &key, depth + 1); + if (status != calogOkE) { + calogAggFree(aggregate); + return status; + } + status = mrubyToValue(context, mrb_hash_get(mrb, value, rubyKey), &element, depth + 1); + if (status != calogOkE) { + calogValueFree(&key); + calogAggFree(aggregate); + return status; + } + status = calogAggSet(aggregate, &key, &element); + if (status != calogOkE) { + calogValueFree(&key); + calogValueFree(&element); + calogAggFree(aggregate); + return status; + } + } + calogValueAgg(out, aggregate); + return calogOkE; + } + case MRB_TT_PROC: { + CalogFnT *callable; + int32_t status; + status = mrubyExportValue(context, value, &callable); + if (status != calogOkE) { + return status; + } + calogValueFn(out, callable); + return calogOkE; + } + default: + break; + } + // Other reference types (symbols, objects, ranges, ...) have no CalogValueT equivalent. + return calogErrUnsupportedE; +} + + +// Record a foreign function pushed into this VM so it is released at destroy (a cfunc proc's env +// has no per-value finalizer to release it when the proc is collected). +static int32_t mrubyTrackForeign(CalogMrubyT *context, CalogFnT *callable) { + if (context->foreignCount == context->foreignCap) { + int32_t newCap; + CalogFnT **resized; + newCap = (context->foreignCap == 0) ? MRUBY_FOREIGN_INITIAL : context->foreignCap * CALOG_GROWTH_FACTOR; + resized = (CalogFnT **)realloc(context->foreignFns, (size_t)newCap * sizeof(CalogFnT *)); + if (resized == NULL) { + return calogErrOomE; + } + context->foreignFns = resized; + context->foreignCap = newCap; + } + context->foreignFns[context->foreignCount] = callable; + context->foreignCount++; + return calogOkE; +} + + +static mrb_value mrubyTrampoline(mrb_state *mrb, mrb_value self) { + CalogMrubyT *context; + const char *name; + mrb_value *argv; + mrb_int argc; + CalogValueT *args; + CalogValueT result; + mrb_value out; + int arena; + mrb_int index; + int32_t status; + + (void)self; + context = (CalogMrubyT *)mrb->ud; + name = mrb_sym_name(mrb, mrb_get_mid(mrb)); // which exposed native was called + mrb_get_args(mrb, "*", &argv, &argc); + args = NULL; + if (argc > 0) { + args = (CalogValueT *)calloc((size_t)argc, sizeof(CalogValueT)); + if (args == NULL) { + mrb_raise(mrb, E_RUNTIME_ERROR, "out of memory marshalling native arguments"); + } + } + arena = mrb_gc_arena_save(mrb); + for (index = 0; index < argc; index++) { + status = mrubyToValue(context, argv[index], &args[index], 0); + if (status != calogOkE) { + mrb_int cleanup; + for (cleanup = 0; cleanup < index; cleanup++) { + calogValueFree(&args[cleanup]); + } + free(args); + mrb_raise(mrb, E_TYPE_ERROR, "failed to marshal a native argument"); + } + } + status = calogCall(context->broker, name, args, (int32_t)argc, &result); + for (index = 0; index < argc; index++) { + calogValueFree(&args[index]); + } + free(args); + if (status != calogOkE) { + char message[CALOG_ERR_MSG_CAP]; + snprintf(message, sizeof(message), "%s", (result.type == calogStringE) ? result.as.s.bytes : "native call failed"); + calogValueFree(&result); + mrb_raise(mrb, E_RUNTIME_ERROR, message); + } + status = mrubyFromValue(context, &result, &out, 0); + calogValueFree(&result); + mrb_gc_arena_restore(mrb, arena); + if (status != calogOkE) { + mrb_raise(mrb, E_TYPE_ERROR, "failed to marshal the native result"); + } + return out; +} diff --git a/src/mruby/mrubyAdapter.h b/src/mruby/mrubyAdapter.h new file mode 100644 index 00000000..75803980 --- /dev/null +++ b/src/mruby/mrubyAdapter.h @@ -0,0 +1,28 @@ +// mrubyAdapter.h -- mruby (Ruby) engine adapter for the broker. +// +// Exposes broker-registered natives into an mruby VM -- each becomes a Kernel method routed +// through one trampoline that recovers its name from the call's method id (mrb_func_t carries no +// userData) and the context from mrb->ud. Marshals values between mruby and CalogValueT by value: +// scalars, binary-safe strings, Array<->list, Hash<->map. A Ruby proc crossing OUT becomes a +// refcounted CalogFnT (GC-pinned with mrb_gc_register, dropped on release); a foreign CalogFnT +// crossing IN becomes a real Ruby Proc (mrb_proc_new_cfunc_with_env) the script calls as f.call(x) +// / f.(x). Ruby file/socket IO is intentionally absent -- scripts use calog's fs*/net* natives; the +// adapter supplies only puts/print/p (routed to stdout). +// +// Lifetime note (as with Berry): release every CalogFnT obtained from calogMrubyExport (and drop +// every function value marshalled out) BEFORE calogMrubyDestroy, since the release touches the VM. + +#ifndef MRUBY_ADAPTER_H +#define MRUBY_ADAPTER_H + +#include "calogInternal.h" + +typedef struct CalogMrubyT CalogMrubyT; + +int32_t calogMrubyCreate(CalogMrubyT **out, CalogT *broker, uint64_t ctxId); +void calogMrubyDestroy(CalogMrubyT *context); +int32_t calogMrubyExport(CalogMrubyT *context, const char *name, CalogFnT **out); +int32_t calogMrubyExpose(CalogMrubyT *context, const char *name); +int32_t calogMrubyRun(CalogMrubyT *context, const char *source); + +#endif diff --git a/src/mruby/mrubyEngine.c b/src/mruby/mrubyEngine.c new file mode 100644 index 00000000..b2f0543b --- /dev/null +++ b/src/mruby/mrubyEngine.c @@ -0,0 +1,61 @@ +// mrubyEngine.c -- bridges the mruby adapter to the actor layer's CalogEngineT vtable. +// +// Every hook runs on the owning context's thread (createInterpreter, runSource, +// destroyInterpreter), confining the mruby VM (one mrb_state) to one thread. createInterpreter +// builds the VM and exposes the registered natives; runSource evaluates a script and reports +// failure through the single error channel (result). + +#include "calogInternal.h" +#include "mrubyAdapter.h" + +static int32_t mrubyEngineCreate(CalogContextT *context, void **interpOut); +static void mrubyEngineDestroy(void *interp); +static int32_t mrubyEngineRun(void *interp, const char *source, CalogValueT *result); +static void mrubyExposeVisitor(const CalogEntryT *entry, void *ud); + +static const char *const mrubyExtensions[] = { "rb", NULL }; + +const CalogEngineT calogMrubyEngine = { + "mruby", + mrubyExtensions, + mrubyEngineCreate, + mrubyEngineDestroy, + mrubyEngineRun +}; + + +static int32_t mrubyEngineCreate(CalogContextT *context, void **interpOut) { + CalogMrubyT *rb; + int32_t status; + + *interpOut = NULL; + status = calogMrubyCreate(&rb, calogContextBroker(context), calogContextId(context)); + if (status != calogOkE) { + return status; + } + calogForEach(calogContextBroker(context), mrubyExposeVisitor, rb); + *interpOut = rb; + return calogOkE; +} + + +static void mrubyEngineDestroy(void *interp) { + calogMrubyDestroy((CalogMrubyT *)interp); +} + + +static int32_t mrubyEngineRun(void *interp, const char *source, CalogValueT *result) { + int32_t status; + + calogValueNil(result); + status = calogMrubyRun((CalogMrubyT *)interp, source); + if (status != calogOkE) { + return calogFail(result, status, "mruby script failed"); + } + return calogOkE; +} + + +static void mrubyExposeVisitor(const CalogEntryT *entry, void *ud) { + calogMrubyExpose((CalogMrubyT *)ud, entry->name); +} diff --git a/tests/testEngineMruby.c b/tests/testEngineMruby.c new file mode 100644 index 00000000..e203d416 --- /dev/null +++ b/tests/testEngineMruby.c @@ -0,0 +1,403 @@ +// testEngineMruby.c -- mruby on a context thread, driven the host way: register natives, +// open a context, fire-and-forget a script, and calogPump on the host thread. Verifies +// host-thread dispatch, the inline escape hatch, the cross-thread callback, aggregates both +// ways, a foreign function value, the error handler, and concurrent contexts (N mrb_states). + +#define _POSIX_C_SOURCE 200809L + +#include "calog.h" + +#include +#include +#include +#include +#include + +#define CHECK(cond, msg) checkImpl((cond), (msg), __FILE__, __LINE__) + +#define PUMP_LIMIT 4000 + +static CalogT *calog = NULL; +static _Atomic int64_t reportedValue = 0; +static _Atomic uint64_t reportedCtxId = 0xFFFFu; +static _Atomic uint64_t inlineCtxId = 0xFFFFu; +static _Atomic int32_t bumpCount = 0; +static _Atomic bool scriptDone = false; +static _Atomic int32_t errorCount = 0; +static _Atomic uint64_t errorCtxId = 0; +static CalogFnT *_Atomic storedCb = NULL; +static char storedName[32] = { 0 }; +static _Atomic int32_t nameLen = -1; +static int32_t testsRun = 0; +static int32_t testsFailed = 0; + +static void checkImpl(bool condition, const char *message, const char *file, int32_t line); +static int32_t nativeAdd(CalogValueT *args, int32_t argCount, CalogValueT *result, void *userData); +static int32_t nativeBump(CalogValueT *args, int32_t argCount, CalogValueT *result, void *userData); +static int32_t nativeDone(CalogValueT *args, int32_t argCount, CalogValueT *result, void *userData); +static int32_t nativeGetAdder(CalogValueT *args, int32_t argCount, CalogValueT *result, void *userData); +static int32_t nativeMakeUser(CalogValueT *args, int32_t argCount, CalogValueT *result, void *userData); +static int32_t nativeMapAge(CalogValueT *args, int32_t argCount, CalogValueT *result, void *userData); +static int32_t nativeReport(CalogValueT *args, int32_t argCount, CalogValueT *result, void *userData); +static int32_t nativeReportInline(CalogValueT *args, int32_t argCount, CalogValueT *result, void *userData); +static int32_t nativeReportName(CalogValueT *args, int32_t argCount, CalogValueT *result, void *userData); +static int32_t nativeSetCb(CalogValueT *args, int32_t argCount, CalogValueT *result, void *userData); +static void onError(uint64_t contextId, const char *message, void *userData); +static void pumpUntilDone(void); +static void testConcurrentContexts(void); +static void testCrossThreadCallback(void); +static void testForeignFunction(void); +static void testHostAndInlineNatives(void); +static void testMapIngress(void); +static void testMaterializedRecord(void); +static void testScriptError(void); + + +static void checkImpl(bool condition, const char *message, const char *file, int32_t line) { + testsRun++; + if (!condition) { + testsFailed++; + printf("FAIL %s:%d %s\n", file, line, message); + } +} + + +static int32_t nativeAdd(CalogValueT *args, int32_t argCount, CalogValueT *result, void *userData) { + (void)userData; + calogValueNil(result); + if (argCount != 2 || args[0].type != calogIntE || args[1].type != calogIntE) { + return calogFail(result, calogErrArgE, "add expects two integers"); + } + calogValueInt(result, args[0].as.i + args[1].as.i); + return calogOkE; +} + + +static int32_t nativeBump(CalogValueT *args, int32_t argCount, CalogValueT *result, void *userData) { + (void)args; + (void)argCount; + (void)userData; + atomic_fetch_add(&bumpCount, 1); + calogValueNil(result); + return calogOkE; +} + + +static int32_t nativeDone(CalogValueT *args, int32_t argCount, CalogValueT *result, void *userData) { + (void)args; + (void)argCount; + (void)userData; + atomic_store(&scriptDone, true); + calogValueNil(result); + return calogOkE; +} + + +static int32_t nativeGetAdder(CalogValueT *args, int32_t argCount, CalogValueT *result, void *userData) { + CalogFnT *callable; + int32_t status; + + (void)args; + (void)argCount; + (void)userData; + calogValueNil(result); + // A host-owned function value handed to the script; calling it routes back here. + status = calogFnFromNative(&callable, calog, nativeAdd, NULL); + if (status != calogOkE) { + return calogFail(result, status, "getAdder could not allocate"); + } + calogValueFn(result, callable); + return calogOkE; +} + + +static int32_t nativeMakeUser(CalogValueT *args, int32_t argCount, CalogValueT *result, void *userData) { + CalogAggT *user; + CalogValueT key; + CalogValueT val; + int32_t status; + + (void)args; + (void)argCount; + (void)userData; + calogValueNil(result); + status = calogAggCreate(&user, calogMapE); + if (status != calogOkE) { + return calogFail(result, status, "makeUser could not allocate"); + } + calogValueString(&key, "name", 4); + calogValueString(&val, "ada", 3); + calogAggSet(user, &key, &val); + calogValueString(&key, "age", 3); + calogValueInt(&val, 36); + calogAggSet(user, &key, &val); + calogValueAgg(result, user); + return calogOkE; +} + + +static int32_t nativeMapAge(CalogValueT *args, int32_t argCount, CalogValueT *result, void *userData) { + CalogValueT key; + CalogValueT *found; + + (void)userData; + calogValueNil(result); + if (argCount != 1 || args[0].type != calogAggE) { + return calogFail(result, calogErrArgE, "mapAge expects a map"); + } + // Read a field out of a map the script built and handed to C (aggregate ingress). + calogValueString(&key, "age", 3); + found = calogAggGet(args[0].as.agg, &key); + calogValueFree(&key); + if (found != NULL && found->type == calogIntE) { + atomic_store(&reportedValue, found->as.i); + } + return calogOkE; +} + + +static int32_t nativeReport(CalogValueT *args, int32_t argCount, CalogValueT *result, void *userData) { + (void)userData; + calogValueNil(result); + if (argCount != 1 || args[0].type != calogIntE) { + return calogFail(result, calogErrArgE, "report expects one integer"); + } + atomic_store(&reportedCtxId, calogCurrentId()); + atomic_store(&reportedValue, args[0].as.i); + return calogOkE; +} + + +static int32_t nativeReportInline(CalogValueT *args, int32_t argCount, CalogValueT *result, void *userData) { + (void)args; + (void)argCount; + (void)userData; + atomic_store(&inlineCtxId, calogCurrentId()); + calogValueNil(result); + return calogOkE; +} + + +static int32_t nativeReportName(CalogValueT *args, int32_t argCount, CalogValueT *result, void *userData) { + size_t length; + + (void)userData; + calogValueNil(result); + if (argCount != 1 || args[0].type != calogStringE) { + return calogFail(result, calogErrArgE, "reportName expects one string"); + } + length = (size_t)args[0].as.s.length; + if (length >= sizeof(storedName)) { + length = sizeof(storedName) - 1; + } + memcpy(storedName, args[0].as.s.bytes, length); + storedName[length] = '\0'; + atomic_store(&nameLen, (int32_t)length); + return calogOkE; +} + + +static int32_t nativeSetCb(CalogValueT *args, int32_t argCount, CalogValueT *result, void *userData) { + (void)userData; + calogValueNil(result); + if (argCount != 1 || args[0].type != calogFnE) { + return calogFail(result, calogErrArgE, "setCb expects one function"); + } + calogFnRetain(args[0].as.fn); + atomic_store(&storedCb, args[0].as.fn); + return calogOkE; +} + + +static void onError(uint64_t contextId, const char *message, void *userData) { + (void)message; + (void)userData; + atomic_store(&errorCtxId, contextId); + atomic_fetch_add(&errorCount, 1); +} + + +static void pumpUntilDone(void) { + struct timespec ts = { 0, 500000 }; + int errorsBefore; + int i; + + errorsBefore = atomic_load(&errorCount); + for (i = 0; i < PUMP_LIMIT; i++) { + calogPump(calog); + if (atomic_load(&scriptDone) || atomic_load(&errorCount) != errorsBefore) { + calogPump(calog); + return; + } + nanosleep(&ts, NULL); + } +} + + +static void testHostAndInlineNatives(void) { + CalogContextT *ctx; + + ctx = calogContextOpen(calog, &calogMrubyEngine); + CHECK(ctx != NULL, "opened an mruby context"); + + atomic_store(&scriptDone, false); + calogContextEval(ctx, "report(42)\nreportInline(1)\ndone()"); + pumpUntilDone(); + + CHECK(atomic_load(&reportedValue) == 42, "host native received the argument"); + CHECK(atomic_load(&reportedCtxId) == 0, "default native ran on the host thread (id 0)"); + CHECK(atomic_load(&inlineCtxId) == calogContextId(ctx), "inline native ran on the script's own thread"); + + calogContextClose(ctx); +} + + +static void testMaterializedRecord(void) { + CalogContextT *ctx; + + ctx = calogContextOpen(calog, &calogMrubyEngine); + atomic_store(&scriptDone, false); + atomic_store(&nameLen, -1); + atomic_store(&reportedValue, 0); + calogContextEval(ctx, "u = makeUser()\nreport(u['age'])\nreportName(u['name'])\ndone()"); + pumpUntilDone(); + + CHECK(atomic_load(&reportedValue) == 36, "read an int field from a materialized record hash"); + CHECK(atomic_load(&nameLen) == 3 && memcmp(storedName, "ada", 3) == 0, "read a string field from a materialized record hash"); + + calogContextClose(ctx); +} + + +static void testMapIngress(void) { + CalogContextT *ctx; + + ctx = calogContextOpen(calog, &calogMrubyEngine); + atomic_store(&scriptDone, false); + atomic_store(&reportedValue, 0); + // The script builds a hash (with a nested array, exercising list ingress too) with STRING + // keys (=> not : which would make symbols) and hands it to a native, which reads a field. + calogContextEval(ctx, "m = {'age' => 9, 'tags' => [1, 2]}\nmapAge(m)\ndone()"); + pumpUntilDone(); + + CHECK(atomic_load(&reportedValue) == 9, "native read a field from a hash the script built"); + + calogContextClose(ctx); +} + + +static void testForeignFunction(void) { + CalogContextT *ctx; + + ctx = calogContextOpen(calog, &calogMrubyEngine); + atomic_store(&scriptDone, false); + atomic_store(&reportedValue, 0); + // The script receives a host-owned function value (a real Ruby Proc) and calls it. + calogContextEval(ctx, "adder = getAdder()\nreport(adder.call(2, 3))\ndone()"); + pumpUntilDone(); + + CHECK(atomic_load(&reportedValue) == 5, "script called a foreign function value pushed in from the host"); + + calogContextClose(ctx); +} + + +static void testCrossThreadCallback(void) { + CalogContextT *ctx; + CalogFnT *callback; + CalogValueT arg; + CalogValueT result; + int32_t status; + + ctx = calogContextOpen(calog, &calogMrubyEngine); + atomic_store(&scriptDone, false); + atomic_store(&storedCb, NULL); + calogContextEval(ctx, "cb = ->(x) { x + 100 }\nsetCb(cb)\ndone()"); + pumpUntilDone(); + + callback = atomic_load(&storedCb); + CHECK(callback != NULL, "a Ruby lambda was captured as a CalogFnT"); + + calogValueInt(&arg, 7); + status = calogFnInvoke(callback, &arg, 1, &result); + CHECK(status == calogOkE && result.type == calogIntE && result.as.i == 107, "cross-thread callable invoke routed to the owner"); + calogValueFree(&result); + calogValueFree(&arg); + calogFnRelease(callback); + + calogContextClose(ctx); +} + + +static void testScriptError(void) { + CalogContextT *ctx; + int32_t before; + + ctx = calogContextOpen(calog, &calogMrubyEngine); + before = atomic_load(&errorCount); + atomic_store(&scriptDone, false); + calogContextEval(ctx, "raise 'intentional test error'"); + pumpUntilDone(); + + CHECK(atomic_load(&errorCount) == before + 1, "a fire-and-forget script error reached the error handler"); + CHECK(atomic_load(&errorCtxId) == calogContextId(ctx), "the error names the failing context"); + + calogContextClose(ctx); +} + + +static void testConcurrentContexts(void) { + CalogContextT *ctxs[3]; + struct timespec ts = { 0, 500000 }; + int32_t i; + + atomic_store(&bumpCount, 0); + for (i = 0; i < 3; i++) { + ctxs[i] = calogContextOpen(calog, &calogMrubyEngine); + calogContextEval(ctxs[i], "bump()\nbump()\nbump()"); + } + for (i = 0; i < PUMP_LIMIT && atomic_load(&bumpCount) < 9; i++) { + calogPump(calog); + nanosleep(&ts, NULL); + } + CHECK(atomic_load(&bumpCount) == 9, "three concurrent mruby contexts all dispatched to the host thread"); + for (i = 0; i < 3; i++) { + calogContextClose(ctxs[i]); + } +} + + +int main(void) { + calog = calogCreate(); + if (calog == NULL) { + printf("calog create failed\n"); + return 1; + } + calogSetErrorHandler(calog, onError, NULL); + calogRegister(calog, "report", nativeReport, NULL); + calogRegister(calog, "setCb", nativeSetCb, NULL); + calogRegister(calog, "done", nativeDone, NULL); + calogRegister(calog, "bump", nativeBump, NULL); + calogRegister(calog, "makeUser", nativeMakeUser, NULL); + calogRegister(calog, "reportName", nativeReportName, NULL); + calogRegister(calog, "getAdder", nativeGetAdder, NULL); + calogRegister(calog, "mapAge", nativeMapAge, NULL); + calogRegisterInline(calog, "reportInline", nativeReportInline, NULL); + + testHostAndInlineNatives(); + testMaterializedRecord(); + testMapIngress(); + testForeignFunction(); + testCrossThreadCallback(); + testScriptError(); + testConcurrentContexts(); + + calogDestroy(calog); + + printf("\n%d checks, %d failed\n", testsRun, testsFailed); + fflush(stdout); + if (testsFailed != 0) { + return 1; + } + return 0; +} diff --git a/vendor/mruby/.codespellrc b/vendor/mruby/.codespellrc new file mode 100644 index 00000000..2f725806 --- /dev/null +++ b/vendor/mruby/.codespellrc @@ -0,0 +1,3 @@ +[codespell] +ignore-words = .github/linters/codespell.txt +skip = ./build,./doc/api,./doc/capi diff --git a/vendor/mruby/.dockerignore b/vendor/mruby/.dockerignore new file mode 100644 index 00000000..237f4456 --- /dev/null +++ b/vendor/mruby/.dockerignore @@ -0,0 +1,14 @@ +.DS_Store +.idea +.vscode +.yardoc +*.bak +*.iml +*.ipr +*.swp +*.tmp +bin +build +doc/api +doc/capi +node_modules diff --git a/vendor/mruby/.editorconfig b/vendor/mruby/.editorconfig new file mode 100644 index 00000000..081e8c6b --- /dev/null +++ b/vendor/mruby/.editorconfig @@ -0,0 +1,30 @@ +# About this file, see: +# Website: https://editorconfig.org/ +# For Emacs users: https://github.com/editorconfig/editorconfig-emacs +# For Vim users: https://github.com/editorconfig/editorconfig-vim + +root = true + +[*] +charset = utf-8 +end_of_line = lf +indent_size = 2 +indent_style = space +insert_final_newline = true +tab_width = 8 +trim_trailing_whitespace = true + +[{Makefile,Makefile.*,makefile,*.mk}] +indent_style = tab +#max_line_length = 80 + +#[*.{c,cc,C,cxx,cpp,h,hh,H,hxx,hpp,inc,y}] +#max_line_length = 120 + +#[{*.rb,Rakefile,rakefile,*.rake,*.gemspec,*.gembox}] +#max_line_length = 120 + +# limitation to US-ASCII +[*.bat] +end_of_line = crlf +#max_line_length = 80 diff --git a/vendor/mruby/.pre-commit-config.yaml b/vendor/mruby/.pre-commit-config.yaml new file mode 100644 index 00000000..3e59a26d --- /dev/null +++ b/vendor/mruby/.pre-commit-config.yaml @@ -0,0 +1,130 @@ +--- +# https://github.com/j178/prek +default_stages: [pre-commit, pre-push] +default_language_version: + python: python3 + node: 24.14.0 +minimum_pre_commit_version: "3.2.0" +exclude: "^tools/lrama/" +repos: + - repo: meta + hooks: + - id: identity + name: run identity + description: check your identity + - id: check-hooks-apply + name: run check-hooks-apply + description: check hooks apply to the repository + - repo: local + hooks: + - id: prettier + name: run prettier + description: format files with prettier + entry: prettier --write '**/*.md' '**/*.yaml' '**/*.yml' + files: \.(md|ya?ml)$ + language: node + additional_dependencies: ["prettier@3.7.4"] + pass_filenames: false + stages: [manual] + - id: check-zip-file-is-not-committed + name: disallow zip files + description: Zip files are not allowed in the repository + language: fail + entry: | + Zip files are not allowed in the repository as they are hard to + track and have security implications. Please remove the zip file from the repository. + files: \.zip$ + - repo: https://github.com/gitleaks/gitleaks + rev: v8.30.1 + hooks: + - id: gitleaks + name: run gitleaks + description: detect hardcoded secrets with gitleaks + - repo: https://github.com/oxipng/oxipng + rev: v10.1.0 + hooks: + - id: oxipng + name: run oxipng + description: use lossless compression to optimize PNG files + args: ["--fix", "-o", "4", "--strip", "safe", "--alpha"] + stages: [manual] + - repo: https://github.com/pre-commit/pre-commit-hooks + rev: v6.0.0 + hooks: + - id: check-added-large-files + - id: check-case-conflict + - id: check-executables-have-shebangs + exclude: ^test/t/lang\.rb$ + - id: check-illegal-windows-names + - id: check-merge-conflict + - id: check-shebang-scripts-are-executable + - id: check-vcs-permalinks + - id: check-yaml + - id: destroyed-symlinks + - id: detect-aws-credentials + args: [--allow-missing-credentials] + - id: detect-private-key + - id: end-of-file-fixer + - id: file-contents-sorter + args: [--unique] + files: ^\.github/linters/codespell\.txt$ + - id: fix-byte-order-marker + - id: forbid-submodules + - id: mixed-line-ending + - id: trailing-whitespace + - repo: https://github.com/Lucas-C/pre-commit-hooks + rev: v1.5.6 + hooks: + - id: forbid-tabs + name: run no-tabs checker + description: check the codebase for tabs + exclude: Makefile$ + - id: remove-tabs + name: run tabs remover + description: find and convert tabs to spaces + args: [--whitespaces-count, "2"] + exclude: Makefile$ + - repo: https://github.com/rhysd/actionlint + rev: v1.7.12 + hooks: + - id: actionlint + name: run actionlint + description: lint GitHub Actions workflow files + - repo: https://github.com/codespell-project/codespell + rev: v2.4.2 + hooks: + - id: codespell + name: run codespell + description: check spelling with codespell + - repo: https://github.com/igorshubovych/markdownlint-cli + rev: v0.48.0 + hooks: + - id: markdownlint + name: run markdownlint + description: checks the style of Markdown files + args: [--config=.github/linters/.markdown-lint.yml] + types: [markdown] + files: \.md$ + - repo: https://github.com/rubocop/rubocop + rev: v1.86.0 + hooks: + - id: rubocop + name: run rubocop + description: RuboCop is a Ruby code style checker (linter) and formatter based on the community-driven Ruby Style Guide + exclude: ^test/t/syntax\.rb$ + args: [--config=.github/linters/.rubocop.yml] + - repo: https://github.com/shellcheck-py/shellcheck-py + rev: v0.11.0.1 + hooks: + - id: shellcheck + name: run shellcheck + description: check shell scripts with a static analysis tool + - repo: https://github.com/adrienverge/yamllint + rev: v1.38.0 + hooks: + - id: yamllint + name: run yamllint + description: check YAML files with yamllint + args: [--strict, -c=.github/linters/.yaml-lint.yml] + types: [yaml] + files: \.ya?ml$ diff --git a/vendor/mruby/.prettierignore b/vendor/mruby/.prettierignore new file mode 100644 index 00000000..8ed001b5 --- /dev/null +++ b/vendor/mruby/.prettierignore @@ -0,0 +1,6 @@ +# Ignore artifacts: +build +coverage +doc/internal/opcode.md +tools/lrama +.venv diff --git a/vendor/mruby/.prettierrc b/vendor/mruby/.prettierrc new file mode 100644 index 00000000..81b81d20 --- /dev/null +++ b/vendor/mruby/.prettierrc @@ -0,0 +1,3 @@ +{ + "bracketSpacing": false +} diff --git a/vendor/mruby/.travis.yml b/vendor/mruby/.travis.yml new file mode 100644 index 00000000..23d97286 --- /dev/null +++ b/vendor/mruby/.travis.yml @@ -0,0 +1,11 @@ +language: c + +jobs: + - os: linux + - os: osx + +env: + - MRUBY_CONFIG=ci/gcc-clang + +script: + - rake -m test:run:serial diff --git a/vendor/mruby/.yardopts b/vendor/mruby/.yardopts new file mode 100644 index 00000000..f87c2652 --- /dev/null +++ b/vendor/mruby/.yardopts @@ -0,0 +1,23 @@ +--markup markdown +--plugin mruby +--plugin coderay +--output-dir doc/api + +src/**/*.c +mrblib/**/*.rb +include/**/*.h + +mrbgems/*/src/**/*.c +mrbgems/*/mrblib/**/*.rb +mrbgems/*/include/**/*.h +- +CONTRIBUTING.md +SECURITY.md +TODO.md +doc/*.md +doc/guides/*.md +doc/internal/*.md +AUTHORS +LEGAL +LICENSE +NEWS diff --git a/vendor/mruby/AUTHORS b/vendor/mruby/AUTHORS new file mode 100644 index 00000000..19e7d0a1 --- /dev/null +++ b/vendor/mruby/AUTHORS @@ -0,0 +1,348 @@ +# Authors of mruby (mruby developers) + +## The List of Contributors sorted by number of commits (as of 2026-03-02 02877f0) + + 7532 Yukihiro "Matz" Matsumoto (@matz)* + 712 dearblue (@dearblue)* + 587 KOBAYASHI Shuji (@shuujii) + 353 Daniel Bovensiepen (@bovi)* + 345 Takeshi Watanabe (@take-cheeze)* + 333 Masaki Muranaka (@monaka) + 255 John Bampton (@jbampton) + 234 Jun Hiroe (@suzukaze) + 228 Tomoyuki Sahara (@tsahara)* + 220 Cremno (@cremno)* + 209 Yuki Kurihara (@ksss)+ + 144 Yasuhiro Matsumoto (@mattn)* + 113 Carson McDonald (@carsonmcdonald) + 104 Tomasz Pędraszewski (@dabroz)* + 83 Akira Yumiyama (@akiray03)* + 83 skandhas (@skandhas) + 80 Masamitsu MURASE (@masamitsu-murase) + 73 Hiroshi Mimaki (@mimaki)* + 71 Tatsuhiko Kubo (@cubicdaiya)* + 71 Yuichiro MASUI (@masuidrive) + 62 Yuichiro Kaneko (@yui-knk)+ + 59 Kurebayashi, Takahiro (@crimsonwoods)* + 56 h2so5 (@h2so5) + 52 Ralph Desir (@Mav7)* + 48 Paolo Bosetti (@pbosetti)* + 45 Rory O'Connell (@RoryO)* + 42 fleuria (@flaneur2020) + 40 Christopher Aue (@christopheraue) + 40 Seba Gamboa (@sagmor) + 39 Kouhei Sutou (@kou)* + 38 Koji Yoshioka (@kyab)*+ + 32 Masayoshi Takahashi (@takahashim)+ + 31 MATSUMOTO Ryosuke (@matsumotory)* + 30 Nobuyoshi Nakada (@nobu) + 26 Hoshiumi Arata (@hoshiumiarata)* + 25 Julian Aron Prenner (@furunkel)* + 22 Clayton Smith (@clayton-shopify) + 22 Uchio Kondo (@udzura)* + 22 Zachary Scott (@zzak)* + 21 Ryan Lopopolo (@lopopolo) + 20 Ryan Scott (@ryan-scott-dev)* + 20 google-labs-jules[bot] (@google-jules) + 19 Bouke van der Bijl (@bouk) + 19 Jared Breeden (@jbreeden)* + 19 go kikuta (@gkta)* + 18 Corey Powell (@IceDragon200) + 18 Hidetaka Takano (@TJ-Hidetaka-Takano) + 18 Jon Maken (@jonforums)+ + 18 leviongit (@leviongit) + 18 mirichi (@mirichi) + 17 Mitchell Blank Jr (@mitchblank)* + 16 HASUMI Hitoshi (@hasumikin) + 16 bggd (@bggd) + 16 kano4 (@kano4) + 15 Felix Jones (@felixjones)* + 14 Blaž Hrastnik (@archseer)* + 14 Kazuki Tsujimoto (@k-tsj) + 14 Tadashi FUKUZAWA (@FUKUZAWA-Tadashi)+ + 14 fn ⌃ ⌥ (@FnControlOption) + 13 Jose Narvaez (@goyox86) + 13 Patrick Hogan (@pbhogan) + 12 Akira Kuroda (@akuroda) + 12 Kouki Ooyatsu (kaishuu0123)* + 12 NAKAMURA Usaku (@unak)* + 12 Ray Chason (@chasonr)* + 12 SiZiOUS (@suzious) + 12 Takashi Sawanaka (@sdottaka)* + 12 Ukrainskiy Sergey (@ukrainskiysergey) + 12 Xuejie "Rafael" Xiao (@xxuejie)* + 11 Julien Ammous (@schmurfy) + 11 Kazuho Oku (@kazuho) + 11 RIZAL Reckordp (@Reckordp)+ + 11 Seeker (@SeekingMeaning) + 11 takkaw (@takkaw) + 10 Hendrik (@Asmod4n) + 10 Miura Hideki (@miura1729) + 10 Narihiro Nakamura (@authorNari) + 10 YAMAMOTO Masaya (pandax381) + 10 Yuichi Nishiwaki (@nyuichi) + 9 Akira Mitsui (@murasesyuka)* + 9 Frank Celler (@fceller) + 9 Tatsuya Matsumoto (@tmash06)* + 8 Takashi Sogabe (@sogabe) + 8 Wataru Ashihara (@wataash)* + 7 Bhargava Shastry (@bshastry)* + 7 Kouichi Nakanishi (@keizo042) + 7 Rubyist (@expeditiousRubyist) + 7 Simon Génier (@simon-shopify) + 7 Terence Lee (@hone) + 7 roco (@rystyle)* + 7 vickash (@vickash) + 6 Akito Mochizuki (@ak-mochi) + 6 Beoran (@beoran) + 6 David Siaw (@davidsiaw)* + 6 Frederick John Milens III (@fjmilens3) + 6 Hiro Asari (@BanzaiMan) + 6 INOUE Yasuyuki (@yasuyuki) + 6 Junji Sawada (@junjis0203) + 6 Kenji Okimoto (@okkez)+ + 6 Paweł Świątkowski (@katafrakt) + 6 Selman ULUG (@selman) + 6 Yusuke Endoh (@mame)* + 6 buty4649 (@buty4649) + 6 masahino (@masahino) + 5 Chris Reuter (@suetanvil) + 5 Davide D'Agostino (@DAddYE) + 5 Eric Hodel (@drbrain) + 5 Ichito Nagata (@i110) + 5 Keita Obo (@ktaobo)* + 5 Max Anselm (@silverhammermba) + 5 Rodrigo Malizia (@rmalizia44)+ + 5 Ryan Davis (@zenspider) + 5 Syohei YOSHIDA (@syohex) + 5 TOMITA Masahiro (@tmtm) + 5 Yurie Yamane (@yurie)+ + 5 dreamedge (@dreamedge) + 5 nkshigeru (@nkshigeru) + 5 xuejianqing (@joans321) + 4 Chris Hasiński (@khasinski) + 4 Dante Catalfamo (@dantecatalfamo) + 4 Goro Kikuchi (@gorogit) + 4 Herwin Weststrate (@herwinw) + 4 Horimoto Yasuhiro (@komainu8) + 4 Jon Moss (@maclover7) + 4 Ken Muramatsu (@ken-mu)+ + 4 Kohei Suzuki (@eagletmt) + 4 Lanza (@LanzaSchneider) + 4 Li Yazhou (@flaneur2020) + 4 Marcus Stollsteimer (@stomar) + 4 Mark Delk (@jethrodaniel) + 4 NARUSE, Yui (@nurse) + 4 Ravil Bayramgalin (@brainopia)*+ + 4 Satoshi Odawara (@SatoshiOdawara) + 4 UENO, M. (@eunos-1128) + 4 Yuhei Okazaki (@Yuuhei-Okazaki)* + 4 Yuji Yamano (@yyamano) + 4 kurodash (@kurodash)* + 4 wanabe (@wanabe)* + 3 Anton Davydov (@davydovanton) + 3 Aurora Nockert (@auroranockert) + 3 Carlo Prelz (@asfluido)* + 3 Daniel K. Sierpiński (@513ry)+ + 3 David Turnbull (@AE9RB) + 3 Franck Verrot (@franckverrot) + 3 Hirohito Higashi (@HirohitoHigashi) + 3 J. Mutua (@katmutua)+ + 3 Jan Berdajs (@mrbrdo) + 3 Jonas Minnberg (@sasq64) + 3 Joseph McCullough (@joequery) + 3 Mark McCurry (@fundamental) + 3 Meder Kydyraliev (@meder) + 3 Nobuhiro Iwamatsu (@iwamatsu) + 3 Per Lundberg (@perlun)* + 3 Rob Fors (@robfors)* + 3 Robert Rowe (@CaptainJet) + 3 Sebastián Katzer (@katzer)* + 3 Shuta Kimura (@kimushu)+ + 3 TERAJIMA, Motoyuki (@trmmy) + 3 Taichi AOKI (@aoki1980taichi) + 3 Takashi Kokubun (@k0kubun) + 3 Tatsuhiro Tsujikawa (@tatsuhiro-t) + 3 Thiago Scalone (@scalone) + 3 Vladimir Dementyev (@palkan)* + 3 William Light (@wrl) + 3 bamchoh (@bamchoh) + 3 sasaki takeru (@takeru) + 3 windwiny (@windwiny) + 2 Akira Moroo (@retrage) + 2 Artur K (@nemerle) + 2 Christian Mauceri (@mauceri) + 2 Craig Lehmann (@craiglrock)* + 2 Dominic Sisneros (@dsisnero)* + 2 Dusan D. Majkic (@dmajkic) + 2 Emiliano Lesende (@3miliano) + 2 Francois Chagnon (@EiNSTeiN-)* + 2 Gilad Zohari (@gzohari) + 2 Go Saito (@govm) + 2 Hiroyuki Iwatsuki (@iwadon) + 2 Huei-Horng Yo (@hiroshiyui) + 2 Jonas Kulla (@Ancurio) + 2 Jun Takeda (@takjn) + 2 Kazuaki Tanaka (@kaz0505) + 2 Kazuhiko Yamashita (@pyama86)+ + 2 Kazuhiro Sera (@seratch) + 2 Kuroda Daisuke (@dycoon)+ + 2 Lothar Scholz (@llothar) + 2 Lukas Joeressen (@kext) + 2 Masahiro Wakame (@vvkame)+ + 2 Minao Yamamoto (@tarosay)+ + 2 Nihad Abbasov (@NARKOZ) + 2 Robert Mosolgo (@rmosolgo) + 2 Russel Hunter Yukawa (@rhykw)+ + 2 Ryunosuke SATO (@tricknotes) + 2 Santa Zhang (@santazhang) + 2 Serg Podtynnyi (@shtirlic) + 2 Shannen Saez (@shancat) + 2 Shouji Kuboyama (@Shokuji)* + 2 SouthWolf (@southwolf) + 2 TJ Singleton (@tjsingleton) + 2 Taiyo Mizuhashi (@taiyoslime)+ + 2 Tomás Pollak (@tomas)* + 2 Yutaka HARA (@yhara)*+ + 2 Zhang Xiaohui (@hifoolno) + 2 icm7216 (@icm7216) + 1 A-Sat (@asatou)+ + 1 AN Long (@aisk) + 1 Abinoam Praxedes Marques Junior (@abinoam) + 1 Alex Wang (@nanamiwang)+ + 1 AlexDenisov (@AlexDenisov) + 1 Andrew Nordman (@cadwallion) + 1 Ashish Kurmi (@boahc077) + 1 Atsushi Morimoto (@mynz) + 1 Ben A Morgan (@BenMorganIO) + 1 Benoit Daloze (@eregon) + 1 Bradley Whited (@esotericpig) + 1 Colin MacKenzie IV (@sinisterchipmunk) + 1 Daehyub Kim (@lateau) + 1 Daniel Varga (@vargad) + 1 Diamond Rivero (@diamant3) + 1 Edgar Boda-Majer (@eboda) + 1 Fangrui Song (@MaskRay) + 1 Flavio Medeiros (@flaviommedeiros) + 1 Francis Bogsanyi (@fbogsany) + 1 Guo Xiao (@guoxiao) + 1 Gwen Boatrite (@boatrit) + 1 Gwendolyn Boatrite (@boatrite) + 1 HARADA Makoto (@haramako) + 1 HAYASHI Kentaro (@kenhys) + 1 Hiroki Mori (@yamori813)+ + 1 Hiromasa Ishii (@Hir0)+ + 1 Hiroyuki Matsuzaki (@Hiroyuki-Matsuzaki) + 1 Hugo Logmans (@hlogmans) + 1 Jack Danger Canty (@JackDanger) + 1 Jeff Federman (@jefffederman) + 1 Jeffrey Crowell (@crowell) + 1 Jeremy Ong (@jeremyong) + 1 Jiro Nishiguchi (@spiritloose) + 1 Joachim Baran (@indiedotkim) + 1 Joe Kutner (@jkutner) + 1 Jun Aruga (@junaruga) + 1 Junichi Kajiwara (@kjunichi) + 1 Jurriaan Pruis (@jurriaan) + 1 Katsuhiko Kageyama (@kishima)+ + 1 Katsuyoshi Ito (@katsuyoshi) + 1 Kazuhiro NISHIYAMA (@znz) + 1 Kei Sawada (@remore) + 1 Kim H Madsen (@kimhmadsen) + 1 Koichi ITO (@koic) + 1 Konstantin Haase (@rkh) + 1 Leo Neat (@Leo-Neat) + 1 Lian Cheng (@liancheng) + 1 Luis Lavena (@luislavena) + 1 Lukas Elmer (@lukaselmer) + 1 Lukas Stabe (@Ahti) + 1 M.Naruoka (@fenrir-naru) + 1 Marcelo Juchem (@juchem) + 1 Martin Bosslet (@emboss)+ + 1 Masahiko Sawada (@MasahikoSawada) + 1 Matt Aimonetti (@mattetti) + 1 Max Base (@MaxFork) + 1 Maxim Abramchuk (@MaximAbramchuck) + 1 Megumi Tomita (@tomykaira)+ + 1 Mitchell Hashimoto (@mitchellh) + 1 Mitsutaka Mimura (@takkanm) + 1 Nathan Ladd (@ntl) + 1 Nicholas (@knf) + 1 Nozomi SATO (@nozomiS) + 1 Okumura Takahiro (@hfm) + 1 Oliver Chang (@oliverchang) + 1 Patrick Ellis (@pje) + 1 Patrick Pokatilo (@SHyx0rmZ) + 1 Pavel Evstigneev (@Paxa)+ + 1 Pete Kinnecom (@petekinnecom) + 1 Piotr Usewicz (@pusewicz) + 1 Prayag Verma (@pra85) + 1 Ranmocy (@ranmocy) + 1 Robert McNally (@wolfmcnally) + 1 Ryan Scott Lewis (@RyanScottLewis) + 1 Ryo Okubo (@syucream) + 1 SAkira a.k.a. Akira Suzuki (@sakisakira) + 1 Santiago Rodriguez (@sanrodari) + 1 Satoh, Hiroh (@cho45)+ + 1 Satoru Naba (@snaba)+ + 1 Sayed Abdelhaleem (@visualsayed) + 1 Sergey Ukrainskiy (@ukrainskiysergey) + 1 Shugo Maeda (@shugo) + 1 Sinkevich Artem (@ArtSin) + 1 Sorah Fukumori (@sorah) + 1 Stephen Jothen (@sjothen) + 1 Stuart Hinson (@stuarth) + 1 Takuma Kume (@takumakume)+ + 1 Takuya ASADA (@syuu1228) + 1 Thomas Schmidt (@digitaltom) + 1 Timo Schilling (@timoschilling) + 1 Tom Black (@blacktm) + 1 Utkarsh Kukreti (@utkarshkukreti) + 1 W (@graywolf) + 1 Wuffers Lightwolf (@w-x-l) + 1 YAMAMOTO Yuji (@igrep) + 1 Yevhen Viktorov (@yevgenko) + 1 Yoji SHIDARA (@darashi) + 1 Yoshiori SHOJI (@yoshiori) + 1 Yuji Yokoo (@yujiyokoo) + 1 Yukang (@chenyukang) + 1 Yurii Nakonechnyi (@inobelar) + 1 Yusuke Suzuki (@Constellation)+ + 1 Yusuke Tanaka (@csouls) + 1 alpha.netzilla (@alpha-netzilla) + 1 arton (@arton) + 1 duangsuse (@duangsuse) + 1 fl0l0u (@fl0l0u) + 1 hasse (@hasse09052) + 1 hhc0null (@hhc0null) + 1 iTitou (@titouanc) + 1 javier ramírez (@javier) + 1 liyuray (@liyuray) + 1 lucas dicioccio (@lucasdicioccio) + 1 n4o847 (@n4o847) + 1 niyarin (@niyarin) + 1 robert (@R-obert) + 1 sbsoftware (@sbsoftware) + 1 ssmallkirby (@smallkirby) + 1 taku toyama (@tsuichu) + +`*` - Entries unified according to names and addresses +`+` - Entries with names different from commits + +## Contributors without named commits + + Yuichi Osawa (Mitsubishi Electric Micro-Computer Application Software) + Shota Nakano (Manycolors) + Bjorn De Meyer + +## Corporate contributors + + Ministry of Economy, Trade and Industry, Japan + Kyushu Bureau of Economy, Trade and Industry + SCSK KYUSHU CORPORATION + Kyushu Institute of Technology + Network Applied Communication Laboratory, Inc. + Internet Initiative Japan Inc. + Specified non-profit organization mruby Forum + Mitsubishi Electric Micro-Computer Application Software Co.,Ltd. + Manycolors, Inc. diff --git a/vendor/mruby/CONTRIBUTING.md b/vendor/mruby/CONTRIBUTING.md new file mode 100644 index 00000000..12f5df7f --- /dev/null +++ b/vendor/mruby/CONTRIBUTING.md @@ -0,0 +1,193 @@ +# How to contribute + +mruby is an open-source project which is looking forward to each contribution. +Contributors agree to license their contribution(s) under MIT license. + +## Your Pull Request + +To make it easy to review and understand your change please keep the following +things in mind before submitting your pull request: + +- Work on the latest possible state of **mruby/master** +- Create a branch which is dedicated to your change +- Test your changes before creating a pull request (`rake test`) +- If possible write a test case which confirms your change +- Don't mix several features or bugfixes in one pull request +- Create a meaningful commit message +- Explain your change (i.e. with a link to the issue you are fixing) +- Use mrbgem to provide non ISO features (classes, modules and methods) unless + you have a special reason to implement them in the core + +## Security Issues + +If you discover a security vulnerability: + +- **High priority security vulnerabilities** (RCE): Report via email to +- **VM crashes from valid Ruby code**: Please report as regular bug reports on our issue tracker + +For detailed guidance on what qualifies as a security issue and what doesn't, see [SECURITY.md](SECURITY.md). + +## prek + +We use [prek](https://github.com/j178/prek), a fast Rust-based pre-commit hook manager. +It reads the standard `.pre-commit-config.yaml` format. + +Install `prek` following the [installation guide](https://github.com/j178/prek#installation), +then install the hooks with `prek install`. +Now `prek` will run automatically on git commit! + +It's usually a good idea to run the hooks against all the files when adding new hooks (usually `prek` +will only run on the changed files during git hooks). Use `prek run --all-files` to check all files. + +To run a single hook use `prek run --all-files ` + +To update use `prek autoupdate` + +Sometimes you might need to skip one or more hooks which can be done with the `SKIP` environment variable. + +`$ SKIP=yamllint git commit -m "foo"` + +For convenience, we have added `prek run --all-files`, `prek install` and `prek autoupdate` +to both the Makefile and the Rakefile. Run them with: + +- `make check` or `rake check` +- `make checkinstall` or `rake checkinstall` +- `make checkupdate` or `rake checkupdate` + +To configure hooks you can modify the config file [.pre-commit-config.yaml](.pre-commit-config.yaml). +We use [GitHub Actions](.github/workflows/pre-commit.yml) to run `prek` on every pull request. + +### prek quick links + +- [prek GitHub](https://github.com/j178/prek) +- [Installation](https://github.com/j178/prek#installation) +- [Usage](https://github.com/j178/prek#usage) + +## Docker + +We have both a `Dockerfile` and `docker-compose.yml` files in the repository root. +You can run these with the command line or use +[Docker Desktop](https://www.docker.com/products/docker-desktop/). + +The Docker image is running Debian bullseye with Ruby and Python installed. +You can build the Docker image with: + +`$ docker-compose build test` + +So far we just have one service: `test`. Running the default `docker-compose` +command will create the Docker image, spin up a container and then build and +run all mruby tests. + +The default `docker-compose` command is: + +`$ docker-compose -p mruby run test` + +You can also use Make or Rake to run the default `docker-compose` +command from above: + +- `make composetest` +- `rake composetest` + +List your Docker images with: + +```console +$ docker images +REPOSITORY TAG IMAGE ID CREATED SIZE +mruby-test latest ec60f9536948 29 seconds ago 1.29GB +``` + +You can also run any custom `docker-compose` command which will override +the default. For example to run `prek run --all-files` type: + +`$ docker-compose -p mruby run test prek run --all-files` + +For convenience, you can also run `prek` with: + +- `make composecheck` +- `rake composecheck` + +The bonus of running `prek` with `docker-compose` is that you won't need +to install `prek` and the hooks on your local machine. + +Note limitation: currently running `prek` with `docker-compose` we +skip the `check-executables-have-shebangs` hook. + +Two more examples of custom `docker-compose` commands are: + +- `$ docker-compose -p mruby run test ls` +- `$ docker-compose -p mruby run test rake doc:api` + +If you want to test using a different `docker-compose` YAML config file you +can use the `-f` flag: + +`$ docker-compose -p mruby -f docker-compose.test.yml run test` + +- +- + +## Spell Checking + +We are using `prek` to run [codespell](https://github.com/codespell-project/codespell) +to check code for common misspellings. We have a small custom dictionary file [codespell.txt](.github/linters/codespell.txt). + +## Coding conventions + +How to style your C and Ruby code which you want to submit. + +### C code + +The core part (parser, bytecode-interpreter, core-lib, etc.) of mruby is +written in the C programming language. Please note the following hints for your +C code: + +#### Comply with C99 (ISO/IEC 9899:1999) + +mruby should be highly portable to other systems and compilers. For this it is +recommended to keep your code as close as possible to the C99 standard +(). + +Visual C++ is also an important target for mruby (supported version is 2013 or +later). For this reason features that are not supported by Visual C++ may not +be used (e.g. `%z` of `strftime()`). + +NOTE: Old GCC requires `-std=gnu99` option to enable C99 support. + +#### Reduce library dependencies to a minimum + +The dependencies to libraries should be kept to an absolute minimum. This +increases the portability but makes it also easier to cut away parts of mruby +on-demand. + +#### Insert a break after the function return value: + +```c +int +main(void) +{ + ... +} +``` + +### Ruby code + +Parts of the standard library of mruby are written in the Ruby programming +language itself. Please note the following hints for your Ruby code: + +#### Comply with the Ruby standard (ISO/IEC 30170:2012) + +mruby is currently targeting to execute Ruby code which complies to ISO/IEC +30170:2012 (), +unless there's a clear reason, e.g. the latest Ruby has changed behavior from ISO. + +## Building documentation + +### mruby API + +- [YARD](https://yardoc.org/) - YARD is a documentation generation tool for the Ruby programming language +- [yard-mruby](https://rubygems.org/gems/yard-mruby) - Document mruby sources with YARD +- [yard-coderay](https://rubygems.org/gems/yard-coderay) - Adds coderay syntax highlighting to YARD docs + +### C API + +- [Doxygen](https://www.doxygen.nl/) - Generate documentation from source code +- [Graphviz](https://graphviz.org/) - Graphviz is open source graph visualization software diff --git a/vendor/mruby/Dockerfile b/vendor/mruby/Dockerfile new file mode 100644 index 00000000..34936c93 --- /dev/null +++ b/vendor/mruby/Dockerfile @@ -0,0 +1,13 @@ +FROM ruby:3.2.2-bullseye + +RUN apt-get update && apt-get install --no-install-recommends -y python3-pip shellcheck \ + && apt-get clean \ + && rm -rf /var/lib/apt/lists/* + +WORKDIR /app + +COPY Gemfile Gemfile.lock .pre-commit-config.yaml ./ + +RUN bundle install && pip3 install --no-cache-dir pre-commit && git init . && pre-commit install-hooks + +COPY . . diff --git a/vendor/mruby/Doxyfile b/vendor/mruby/Doxyfile new file mode 100644 index 00000000..aaaf13bc --- /dev/null +++ b/vendor/mruby/Doxyfile @@ -0,0 +1,2748 @@ +# Doxyfile 1.9.6 + +# This file describes the settings to be used by the documentation system +# doxygen (www.doxygen.org) for a project. +# +# All text after a double hash (##) is considered a comment and is placed in +# front of the TAG it is preceding. +# +# All text after a single hash (#) is considered a comment and will be ignored. +# The format is: +# TAG = value [value, ...] +# For lists, items can also be appended using: +# TAG += value [value, ...] +# Values that contain spaces should be placed between quotes (\" \"). +# +# Note: +# +# Use doxygen to compare the used configuration file with the template +# configuration file: +# doxygen -x [configFile] +# Use doxygen to compare the used configuration file with the template +# configuration file without replacing the environment variables or CMake type +# replacement variables: +# doxygen -x_noenv [configFile] + +#--------------------------------------------------------------------------- +# Project related configuration options +#--------------------------------------------------------------------------- + +# This tag specifies the encoding used for all characters in the configuration +# file that follow. The default is UTF-8 which is also the encoding used for all +# text before the first occurrence of this tag. Doxygen uses libiconv (or the +# iconv built into libc) for the transcoding. See +# https://www.gnu.org/software/libiconv/ for the list of possible encodings. +# The default value is: UTF-8. + +DOXYFILE_ENCODING = UTF-8 + +# The PROJECT_NAME tag is a single word (or a sequence of words surrounded by +# double-quotes, unless you are using Doxywizard) that should identify the +# project for which the documentation is generated. This name is used in the +# title of most generated pages and in a few other places. +# The default value is: My Project. + +PROJECT_NAME = mruby + +# The PROJECT_NUMBER tag can be used to enter a project or revision number. This +# could be handy for archiving the generated documentation or if some version +# control system is used. + +PROJECT_NUMBER = 4.0.0 + +# Using the PROJECT_BRIEF tag one can provide an optional one line description +# for a project that appears at the top of each page and should give viewer a +# quick idea about the purpose of the project. Keep the description short. + +PROJECT_BRIEF = "mruby is the lightweight implementation of the Ruby language" + +# With the PROJECT_LOGO tag one can specify a logo or an icon that is included +# in the documentation. The maximum height of the logo should not exceed 55 +# pixels and the maximum width should not exceed 200 pixels. Doxygen will copy +# the logo to the output directory. + +PROJECT_LOGO = doc/mruby_logo_red_icon.png + +# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) path +# into which the generated documentation will be written. If a relative path is +# entered, it will be relative to the location where doxygen was started. If +# left blank the current directory will be used. + +OUTPUT_DIRECTORY = doc/capi + +# If the CREATE_SUBDIRS tag is set to YES then doxygen will create up to 4096 +# sub-directories (in 2 levels) under the output directory of each output format +# and will distribute the generated files over these directories. Enabling this +# option can be useful when feeding doxygen a huge amount of source files, where +# putting all generated files in the same directory would otherwise causes +# performance problems for the file system. Adapt CREATE_SUBDIRS_LEVEL to +# control the number of sub-directories. +# The default value is: NO. + +CREATE_SUBDIRS = NO + +# Controls the number of sub-directories that will be created when +# CREATE_SUBDIRS tag is set to YES. Level 0 represents 16 directories, and every +# level increment doubles the number of directories, resulting in 4096 +# directories at level 8 which is the default and also the maximum value. The +# sub-directories are organized in 2 levels, the first level always has a fixed +# number of 16 directories. +# Minimum value: 0, maximum value: 8, default value: 8. +# This tag requires that the tag CREATE_SUBDIRS is set to YES. + +CREATE_SUBDIRS_LEVEL = 8 + +# If the ALLOW_UNICODE_NAMES tag is set to YES, doxygen will allow non-ASCII +# characters to appear in the names of generated files. If set to NO, non-ASCII +# characters will be escaped, for example _xE3_x81_x84 will be used for Unicode +# U+3044. +# The default value is: NO. + +ALLOW_UNICODE_NAMES = NO + +# The OUTPUT_LANGUAGE tag is used to specify the language in which all +# documentation generated by doxygen is written. Doxygen will use this +# information to generate all constant output in the proper language. +# Possible values are: Afrikaans, Arabic, Armenian, Brazilian, Bulgarian, +# Catalan, Chinese, Chinese-Traditional, Croatian, Czech, Danish, Dutch, English +# (United States), Esperanto, Farsi (Persian), Finnish, French, German, Greek, +# Hindi, Hungarian, Indonesian, Italian, Japanese, Japanese-en (Japanese with +# English messages), Korean, Korean-en (Korean with English messages), Latvian, +# Lithuanian, Macedonian, Norwegian, Persian (Farsi), Polish, Portuguese, +# Romanian, Russian, Serbian, Serbian-Cyrillic, Slovak, Slovene, Spanish, +# Swedish, Turkish, Ukrainian and Vietnamese. +# The default value is: English. + +OUTPUT_LANGUAGE = English + +# If the BRIEF_MEMBER_DESC tag is set to YES, doxygen will include brief member +# descriptions after the members that are listed in the file and class +# documentation (similar to Javadoc). Set to NO to disable this. +# The default value is: YES. + +BRIEF_MEMBER_DESC = YES + +# If the REPEAT_BRIEF tag is set to YES, doxygen will prepend the brief +# description of a member or function before the detailed description +# +# Note: If both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the +# brief descriptions will be completely suppressed. +# The default value is: YES. + +REPEAT_BRIEF = YES + +# This tag implements a quasi-intelligent brief description abbreviator that is +# used to form the text in various listings. Each string in this list, if found +# as the leading text of the brief description, will be stripped from the text +# and the result, after processing the whole list, is used as the annotated +# text. Otherwise, the brief description is used as-is. If left blank, the +# following values are used ($name is automatically replaced with the name of +# the entity):The $name class, The $name widget, The $name file, is, provides, +# specifies, contains, represents, a, an and the. + +ABBREVIATE_BRIEF = "The $name class" \ + "The $name widget" \ + "The $name file" \ + is \ + provides \ + specifies \ + contains \ + represents \ + a \ + an \ + the + +# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then +# doxygen will generate a detailed section even if there is only a brief +# description. +# The default value is: NO. + +ALWAYS_DETAILED_SEC = NO + +# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all +# inherited members of a class in the documentation of that class as if those +# members were ordinary class members. Constructors, destructors and assignment +# operators of the base classes will not be shown. +# The default value is: NO. + +INLINE_INHERITED_MEMB = NO + +# If the FULL_PATH_NAMES tag is set to YES, doxygen will prepend the full path +# before files name in the file list and in the header files. If set to NO the +# shortest path that makes the file name unique will be used +# The default value is: YES. + +FULL_PATH_NAMES = YES + +# The STRIP_FROM_PATH tag can be used to strip a user-defined part of the path. +# Stripping is only done if one of the specified strings matches the left-hand +# part of the path. The tag can be used to show relative paths in the file list. +# If left blank the directory from which doxygen is run is used as the path to +# strip. +# +# Note that you can specify absolute paths here, but also relative paths, which +# will be relative from the directory where doxygen is started. +# This tag requires that the tag FULL_PATH_NAMES is set to YES. + +STRIP_FROM_PATH = + +# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of the +# path mentioned in the documentation of a class, which tells the reader which +# header file to include in order to use a class. If left blank only the name of +# the header file containing the class definition is used. Otherwise one should +# specify the list of include paths that are normally passed to the compiler +# using the -I flag. + +STRIP_FROM_INC_PATH = + +# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter (but +# less readable) file names. This can be useful is your file systems doesn't +# support long names like on DOS, Mac, or CD-ROM. +# The default value is: NO. + +SHORT_NAMES = NO + +# If the JAVADOC_AUTOBRIEF tag is set to YES then doxygen will interpret the +# first line (until the first dot) of a Javadoc-style comment as the brief +# description. If set to NO, the Javadoc-style will behave just like regular Qt- +# style comments (thus requiring an explicit @brief command for a brief +# description.) +# The default value is: NO. + +JAVADOC_AUTOBRIEF = YES + +# If the JAVADOC_BANNER tag is set to YES then doxygen will interpret a line +# such as +# /*************** +# as being the beginning of a Javadoc-style comment "banner". If set to NO, the +# Javadoc-style will behave just like regular comments and it will not be +# interpreted by doxygen. +# The default value is: NO. + +JAVADOC_BANNER = NO + +# If the QT_AUTOBRIEF tag is set to YES then doxygen will interpret the first +# line (until the first dot) of a Qt-style comment as the brief description. If +# set to NO, the Qt-style will behave just like regular Qt-style comments (thus +# requiring an explicit \brief command for a brief description.) +# The default value is: NO. + +QT_AUTOBRIEF = NO + +# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make doxygen treat a +# multi-line C++ special comment block (i.e. a block of //! or /// comments) as +# a brief description. This used to be the default behavior. The new default is +# to treat a multi-line C++ comment block as a detailed description. Set this +# tag to YES if you prefer the old behavior instead. +# +# Note that setting this tag to YES also means that rational rose comments are +# not recognized any more. +# The default value is: NO. + +MULTILINE_CPP_IS_BRIEF = NO + +# By default Python docstrings are displayed as preformatted text and doxygen's +# special commands cannot be used. By setting PYTHON_DOCSTRING to NO the +# doxygen's special commands can be used and the contents of the docstring +# documentation blocks is shown as doxygen documentation. +# The default value is: YES. + +PYTHON_DOCSTRING = YES + +# If the INHERIT_DOCS tag is set to YES then an undocumented member inherits the +# documentation from any documented member that it re-implements. +# The default value is: YES. + +INHERIT_DOCS = YES + +# If the SEPARATE_MEMBER_PAGES tag is set to YES then doxygen will produce a new +# page for each member. If set to NO, the documentation of a member will be part +# of the file/class/namespace that contains it. +# The default value is: NO. + +SEPARATE_MEMBER_PAGES = NO + +# The TAB_SIZE tag can be used to set the number of spaces in a tab. Doxygen +# uses this value to replace tabs by spaces in code fragments. +# Minimum value: 1, maximum value: 16, default value: 4. + +TAB_SIZE = 4 + +# This tag can be used to specify a number of aliases that act as commands in +# the documentation. An alias has the form: +# name=value +# For example adding +# "sideeffect=@par Side Effects:^^" +# will allow you to put the command \sideeffect (or @sideeffect) in the +# documentation, which will result in a user-defined paragraph with heading +# "Side Effects:". Note that you cannot put \n's in the value part of an alias +# to insert newlines (in the resulting output). You can put ^^ in the value part +# of an alias to insert a newline as if a physical newline was in the original +# file. When you need a literal { or } or , in the value part of an alias you +# have to escape them by means of a backslash (\), this can lead to conflicts +# with the commands \{ and \} for these it is advised to use the version @{ and +# @} or use a double escape (\\{ and \\}) + +ALIASES = + +# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources +# only. Doxygen will then generate output that is more tailored for C. For +# instance, some of the names that are used will be different. The list of all +# members will be omitted, etc. +# The default value is: NO. + +OPTIMIZE_OUTPUT_FOR_C = NO + +# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java or +# Python sources only. Doxygen will then generate output that is more tailored +# for that language. For instance, namespaces will be presented as packages, +# qualified scopes will look different, etc. +# The default value is: NO. + +OPTIMIZE_OUTPUT_JAVA = NO + +# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran +# sources. Doxygen will then generate output that is tailored for Fortran. +# The default value is: NO. + +OPTIMIZE_FOR_FORTRAN = NO + +# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL +# sources. Doxygen will then generate output that is tailored for VHDL. +# The default value is: NO. + +OPTIMIZE_OUTPUT_VHDL = NO + +# Set the OPTIMIZE_OUTPUT_SLICE tag to YES if your project consists of Slice +# sources only. Doxygen will then generate output that is more tailored for that +# language. For instance, namespaces will be presented as modules, types will be +# separated into more groups, etc. +# The default value is: NO. + +OPTIMIZE_OUTPUT_SLICE = NO + +# Doxygen selects the parser to use depending on the extension of the files it +# parses. With this tag you can assign which parser to use for a given +# extension. Doxygen has a built-in mapping, but you can override or extend it +# using this tag. The format is ext=language, where ext is a file extension, and +# language is one of the parsers supported by doxygen: IDL, Java, JavaScript, +# Csharp (C#), C, C++, Lex, D, PHP, md (Markdown), Objective-C, Python, Slice, +# VHDL, Fortran (fixed format Fortran: FortranFixed, free formatted Fortran: +# FortranFree, unknown formatted Fortran: Fortran. In the later case the parser +# tries to guess whether the code is fixed or free formatted code, this is the +# default for Fortran type files). For instance to make doxygen treat .inc files +# as Fortran files (default is PHP), and .f files as C (default is Fortran), +# use: inc=Fortran f=C. +# +# Note: For files without extension you can use no_extension as a placeholder. +# +# Note that for custom extensions you also need to set FILE_PATTERNS otherwise +# the files are not read by doxygen. When specifying no_extension you should add +# * to the FILE_PATTERNS. +# +# Note see also the list of default file extension mappings. + +EXTENSION_MAPPING = no_extension=md + +# If the MARKDOWN_SUPPORT tag is enabled then doxygen pre-processes all comments +# according to the Markdown format, which allows for more readable +# documentation. See https://daringfireball.net/projects/markdown/ for details. +# The output of markdown processing is further processed by doxygen, so you can +# mix doxygen, HTML, and XML commands with Markdown formatting. Disable only in +# case of backward compatibilities issues. +# The default value is: YES. + +MARKDOWN_SUPPORT = YES + +# When the TOC_INCLUDE_HEADINGS tag is set to a non-zero value, all headings up +# to that level are automatically included in the table of contents, even if +# they do not have an id attribute. +# Note: This feature currently applies only to Markdown headings. +# Minimum value: 0, maximum value: 99, default value: 5. +# This tag requires that the tag MARKDOWN_SUPPORT is set to YES. + +TOC_INCLUDE_HEADINGS = 0 + +# When enabled doxygen tries to link words that correspond to documented +# classes, or namespaces to their corresponding documentation. Such a link can +# be prevented in individual cases by putting a % sign in front of the word or +# globally by setting AUTOLINK_SUPPORT to NO. +# The default value is: YES. + +AUTOLINK_SUPPORT = YES + +# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want +# to include (a tag file for) the STL sources as input, then you should set this +# tag to YES in order to let doxygen match functions declarations and +# definitions whose arguments contain STL classes (e.g. func(std::string); +# versus func(std::string) {}). This also make the inheritance and collaboration +# diagrams that involve STL classes more complete and accurate. +# The default value is: NO. + +BUILTIN_STL_SUPPORT = NO + +# If you use Microsoft's C++/CLI language, you should set this option to YES to +# enable parsing support. +# The default value is: NO. + +CPP_CLI_SUPPORT = NO + +# Set the SIP_SUPPORT tag to YES if your project consists of sip (see: +# https://www.riverbankcomputing.com/software/sip/intro) sources only. Doxygen +# will parse them like normal C++ but will assume all classes use public instead +# of private inheritance when no explicit protection keyword is present. +# The default value is: NO. + +SIP_SUPPORT = NO + +# For Microsoft's IDL there are propget and propput attributes to indicate +# getter and setter methods for a property. Setting this option to YES will make +# doxygen to replace the get and set methods by a property in the documentation. +# This will only work if the methods are indeed getting or setting a simple +# type. If this is not the case, or you want to show the methods anyway, you +# should set this option to NO. +# The default value is: YES. + +IDL_PROPERTY_SUPPORT = YES + +# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC +# tag is set to YES then doxygen will reuse the documentation of the first +# member in the group (if any) for the other members of the group. By default +# all members of a group must be documented explicitly. +# The default value is: NO. + +DISTRIBUTE_GROUP_DOC = NO + +# If one adds a struct or class to a group and this option is enabled, then also +# any nested class or struct is added to the same group. By default this option +# is disabled and one has to add nested compounds explicitly via \ingroup. +# The default value is: NO. + +GROUP_NESTED_COMPOUNDS = NO + +# Set the SUBGROUPING tag to YES to allow class member groups of the same type +# (for instance a group of public functions) to be put as a subgroup of that +# type (e.g. under the Public Functions section). Set it to NO to prevent +# subgrouping. Alternatively, this can be done per class using the +# \nosubgrouping command. +# The default value is: YES. + +SUBGROUPING = YES + +# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and unions +# are shown inside the group in which they are included (e.g. using \ingroup) +# instead of on a separate page (for HTML and Man pages) or section (for LaTeX +# and RTF). +# +# Note that this feature does not work in combination with +# SEPARATE_MEMBER_PAGES. +# The default value is: NO. + +INLINE_GROUPED_CLASSES = NO + +# When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and unions +# with only public data fields or simple typedef fields will be shown inline in +# the documentation of the scope in which they are defined (i.e. file, +# namespace, or group documentation), provided this scope is documented. If set +# to NO, structs, classes, and unions are shown on a separate page (for HTML and +# Man pages) or section (for LaTeX and RTF). +# The default value is: NO. + +INLINE_SIMPLE_STRUCTS = NO + +# When TYPEDEF_HIDES_STRUCT tag is enabled, a typedef of a struct, union, or +# enum is documented as struct, union, or enum with the name of the typedef. So +# typedef struct TypeS {} TypeT, will appear in the documentation as a struct +# with name TypeT. When disabled the typedef will appear as a member of a file, +# namespace, or class. And the struct will be named TypeS. This can typically be +# useful for C code in case the coding convention dictates that all compound +# types are typedef'ed and only the typedef is referenced, never the tag name. +# The default value is: NO. + +TYPEDEF_HIDES_STRUCT = NO + +# The size of the symbol lookup cache can be set using LOOKUP_CACHE_SIZE. This +# cache is used to resolve symbols given their name and scope. Since this can be +# an expensive process and often the same symbol appears multiple times in the +# code, doxygen keeps a cache of pre-resolved symbols. If the cache is too small +# doxygen will become slower. If the cache is too large, memory is wasted. The +# cache size is given by this formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range +# is 0..9, the default is 0, corresponding to a cache size of 2^16=65536 +# symbols. At the end of a run doxygen will report the cache usage and suggest +# the optimal cache size from a speed point of view. +# Minimum value: 0, maximum value: 9, default value: 0. + +LOOKUP_CACHE_SIZE = 0 + +# The NUM_PROC_THREADS specifies the number of threads doxygen is allowed to use +# during processing. When set to 0 doxygen will based this on the number of +# cores available in the system. You can set it explicitly to a value larger +# than 0 to get more control over the balance between CPU load and processing +# speed. At this moment only the input processing can be done using multiple +# threads. Since this is still an experimental feature the default is set to 1, +# which effectively disables parallel processing. Please report any issues you +# encounter. Generating dot graphs in parallel is controlled by the +# DOT_NUM_THREADS setting. +# Minimum value: 0, maximum value: 32, default value: 1. + +NUM_PROC_THREADS = 1 + +#--------------------------------------------------------------------------- +# Build related configuration options +#--------------------------------------------------------------------------- + +# If the EXTRACT_ALL tag is set to YES, doxygen will assume all entities in +# documentation are documented, even if no documentation was available. Private +# class members and static file members will be hidden unless the +# EXTRACT_PRIVATE respectively EXTRACT_STATIC tags are set to YES. +# Note: This will also disable the warnings about undocumented members that are +# normally produced when WARNINGS is set to YES. +# The default value is: NO. + +EXTRACT_ALL = NO + +# If the EXTRACT_PRIVATE tag is set to YES, all private members of a class will +# be included in the documentation. +# The default value is: NO. + +EXTRACT_PRIVATE = NO + +# If the EXTRACT_PRIV_VIRTUAL tag is set to YES, documented private virtual +# methods of a class will be included in the documentation. +# The default value is: NO. + +EXTRACT_PRIV_VIRTUAL = NO + +# If the EXTRACT_PACKAGE tag is set to YES, all members with package or internal +# scope will be included in the documentation. +# The default value is: NO. + +EXTRACT_PACKAGE = NO + +# If the EXTRACT_STATIC tag is set to YES, all static members of a file will be +# included in the documentation. +# The default value is: NO. + +EXTRACT_STATIC = YES + +# If the EXTRACT_LOCAL_CLASSES tag is set to YES, classes (and structs) defined +# locally in source files will be included in the documentation. If set to NO, +# only classes defined in header files are included. Does not have any effect +# for Java sources. +# The default value is: YES. + +EXTRACT_LOCAL_CLASSES = YES + +# This flag is only useful for Objective-C code. If set to YES, local methods, +# which are defined in the implementation section but not in the interface are +# included in the documentation. If set to NO, only methods in the interface are +# included. +# The default value is: NO. + +EXTRACT_LOCAL_METHODS = NO + +# If this flag is set to YES, the members of anonymous namespaces will be +# extracted and appear in the documentation as a namespace called +# 'anonymous_namespace{file}', where file will be replaced with the base name of +# the file that contains the anonymous namespace. By default anonymous namespace +# are hidden. +# The default value is: NO. + +EXTRACT_ANON_NSPACES = NO + +# If this flag is set to YES, the name of an unnamed parameter in a declaration +# will be determined by the corresponding definition. By default unnamed +# parameters remain unnamed in the output. +# The default value is: YES. + +RESOLVE_UNNAMED_PARAMS = YES + +# If the HIDE_UNDOC_MEMBERS tag is set to YES, doxygen will hide all +# undocumented members inside documented classes or files. If set to NO these +# members will be included in the various overviews, but no documentation +# section is generated. This option has no effect if EXTRACT_ALL is enabled. +# The default value is: NO. + +HIDE_UNDOC_MEMBERS = NO + +# If the HIDE_UNDOC_CLASSES tag is set to YES, doxygen will hide all +# undocumented classes that are normally visible in the class hierarchy. If set +# to NO, these classes will be included in the various overviews. This option +# will also hide undocumented C++ concepts if enabled. This option has no effect +# if EXTRACT_ALL is enabled. +# The default value is: NO. + +HIDE_UNDOC_CLASSES = NO + +# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, doxygen will hide all friend +# declarations. If set to NO, these declarations will be included in the +# documentation. +# The default value is: NO. + +HIDE_FRIEND_COMPOUNDS = NO + +# If the HIDE_IN_BODY_DOCS tag is set to YES, doxygen will hide any +# documentation blocks found inside the body of a function. If set to NO, these +# blocks will be appended to the function's detailed documentation block. +# The default value is: NO. + +HIDE_IN_BODY_DOCS = NO + +# The INTERNAL_DOCS tag determines if documentation that is typed after a +# \internal command is included. If the tag is set to NO then the documentation +# will be excluded. Set it to YES to include the internal documentation. +# The default value is: NO. + +INTERNAL_DOCS = NO + +# With the correct setting of option CASE_SENSE_NAMES doxygen will better be +# able to match the capabilities of the underlying filesystem. In case the +# filesystem is case sensitive (i.e. it supports files in the same directory +# whose names only differ in casing), the option must be set to YES to properly +# deal with such files in case they appear in the input. For filesystems that +# are not case sensitive the option should be set to NO to properly deal with +# output files written for symbols that only differ in casing, such as for two +# classes, one named CLASS and the other named Class, and to also support +# references to files without having to specify the exact matching casing. On +# Windows (including Cygwin) and MacOS, users should typically set this option +# to NO, whereas on Linux or other Unix flavors it should typically be set to +# YES. +# Possible values are: SYSTEM, NO and YES. +# The default value is: SYSTEM. + +CASE_SENSE_NAMES = YES + +# If the HIDE_SCOPE_NAMES tag is set to NO then doxygen will show members with +# their full class and namespace scopes in the documentation. If set to YES, the +# scope will be hidden. +# The default value is: NO. + +HIDE_SCOPE_NAMES = NO + +# If the HIDE_COMPOUND_REFERENCE tag is set to NO (default) then doxygen will +# append additional text to a page's title, such as Class Reference. If set to +# YES the compound reference will be hidden. +# The default value is: NO. + +HIDE_COMPOUND_REFERENCE= NO + +# If the SHOW_HEADERFILE tag is set to YES then the documentation for a class +# will show which file needs to be included to use the class. +# The default value is: YES. + +SHOW_HEADERFILE = YES + +# If the SHOW_INCLUDE_FILES tag is set to YES then doxygen will put a list of +# the files that are included by a file in the documentation of that file. +# The default value is: YES. + +SHOW_INCLUDE_FILES = YES + +# If the SHOW_GROUPED_MEMB_INC tag is set to YES then Doxygen will add for each +# grouped member an include statement to the documentation, telling the reader +# which file to include in order to use the member. +# The default value is: NO. + +SHOW_GROUPED_MEMB_INC = NO + +# If the FORCE_LOCAL_INCLUDES tag is set to YES then doxygen will list include +# files with double quotes in the documentation rather than with sharp brackets. +# The default value is: NO. + +FORCE_LOCAL_INCLUDES = NO + +# If the INLINE_INFO tag is set to YES then a tag [inline] is inserted in the +# documentation for inline members. +# The default value is: YES. + +INLINE_INFO = YES + +# If the SORT_MEMBER_DOCS tag is set to YES then doxygen will sort the +# (detailed) documentation of file and class members alphabetically by member +# name. If set to NO, the members will appear in declaration order. +# The default value is: YES. + +SORT_MEMBER_DOCS = YES + +# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the brief +# descriptions of file, namespace and class members alphabetically by member +# name. If set to NO, the members will appear in declaration order. Note that +# this will also influence the order of the classes in the class list. +# The default value is: NO. + +SORT_BRIEF_DOCS = NO + +# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen will sort the +# (brief and detailed) documentation of class members so that constructors and +# destructors are listed first. If set to NO the constructors will appear in the +# respective orders defined by SORT_BRIEF_DOCS and SORT_MEMBER_DOCS. +# Note: If SORT_BRIEF_DOCS is set to NO this option is ignored for sorting brief +# member documentation. +# Note: If SORT_MEMBER_DOCS is set to NO this option is ignored for sorting +# detailed member documentation. +# The default value is: NO. + +SORT_MEMBERS_CTORS_1ST = NO + +# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the hierarchy +# of group names into alphabetical order. If set to NO the group names will +# appear in their defined order. +# The default value is: NO. + +SORT_GROUP_NAMES = NO + +# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be sorted by +# fully-qualified names, including namespaces. If set to NO, the class list will +# be sorted only by class name, not including the namespace part. +# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. +# Note: This option applies only to the class list, not to the alphabetical +# list. +# The default value is: NO. + +SORT_BY_SCOPE_NAME = NO + +# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to do proper +# type resolution of all parameters of a function it will reject a match between +# the prototype and the implementation of a member function even if there is +# only one candidate or it is obvious which candidate to choose by doing a +# simple string match. By disabling STRICT_PROTO_MATCHING doxygen will still +# accept a match between prototype and implementation in such cases. +# The default value is: NO. + +STRICT_PROTO_MATCHING = NO + +# The GENERATE_TODOLIST tag can be used to enable (YES) or disable (NO) the todo +# list. This list is created by putting \todo commands in the documentation. +# The default value is: YES. + +GENERATE_TODOLIST = YES + +# The GENERATE_TESTLIST tag can be used to enable (YES) or disable (NO) the test +# list. This list is created by putting \test commands in the documentation. +# The default value is: YES. + +GENERATE_TESTLIST = YES + +# The GENERATE_BUGLIST tag can be used to enable (YES) or disable (NO) the bug +# list. This list is created by putting \bug commands in the documentation. +# The default value is: YES. + +GENERATE_BUGLIST = YES + +# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or disable (NO) +# the deprecated list. This list is created by putting \deprecated commands in +# the documentation. +# The default value is: YES. + +GENERATE_DEPRECATEDLIST= YES + +# The ENABLED_SECTIONS tag can be used to enable conditional documentation +# sections, marked by \if ... \endif and \cond +# ... \endcond blocks. + +ENABLED_SECTIONS = + +# The MAX_INITIALIZER_LINES tag determines the maximum number of lines that the +# initial value of a variable or macro / define can have for it to appear in the +# documentation. If the initializer consists of more lines than specified here +# it will be hidden. Use a value of 0 to hide initializers completely. The +# appearance of the value of individual variables and macros / defines can be +# controlled using \showinitializer or \hideinitializer command in the +# documentation regardless of this setting. +# Minimum value: 0, maximum value: 10000, default value: 30. + +MAX_INITIALIZER_LINES = 30 + +# Set the SHOW_USED_FILES tag to NO to disable the list of files generated at +# the bottom of the documentation of classes and structs. If set to YES, the +# list will mention the files that were used to generate the documentation. +# The default value is: YES. + +SHOW_USED_FILES = YES + +# Set the SHOW_FILES tag to NO to disable the generation of the Files page. This +# will remove the Files entry from the Quick Index and from the Folder Tree View +# (if specified). +# The default value is: YES. + +SHOW_FILES = YES + +# Set the SHOW_NAMESPACES tag to NO to disable the generation of the Namespaces +# page. This will remove the Namespaces entry from the Quick Index and from the +# Folder Tree View (if specified). +# The default value is: YES. + +SHOW_NAMESPACES = YES + +# The FILE_VERSION_FILTER tag can be used to specify a program or script that +# doxygen should invoke to get the current version for each file (typically from +# the version control system). Doxygen will invoke the program by executing (via +# popen()) the command command input-file, where command is the value of the +# FILE_VERSION_FILTER tag, and input-file is the name of an input file provided +# by doxygen. Whatever the program writes to standard output is used as the file +# version. For an example see the documentation. + +FILE_VERSION_FILTER = + +# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed +# by doxygen. The layout file controls the global structure of the generated +# output files in an output format independent way. To create the layout file +# that represents doxygen's defaults, run doxygen with the -l option. You can +# optionally specify a file name after the option, if omitted DoxygenLayout.xml +# will be used as the name of the layout file. See also section "Changing the +# layout of pages" for information. +# +# Note that if you run doxygen from a directory containing a file called +# DoxygenLayout.xml, doxygen will parse it automatically even if the LAYOUT_FILE +# tag is left empty. + +LAYOUT_FILE = + +# The CITE_BIB_FILES tag can be used to specify one or more bib files containing +# the reference definitions. This must be a list of .bib files. The .bib +# extension is automatically appended if omitted. This requires the bibtex tool +# to be installed. See also https://en.wikipedia.org/wiki/BibTeX for more info. +# For LaTeX the style of the bibliography can be controlled using +# LATEX_BIB_STYLE. To use this feature you need bibtex and perl available in the +# search path. See also \cite for info how to create references. + +CITE_BIB_FILES = + +#--------------------------------------------------------------------------- +# Configuration options related to warning and progress messages +#--------------------------------------------------------------------------- + +# The QUIET tag can be used to turn on/off the messages that are generated to +# standard output by doxygen. If QUIET is set to YES this implies that the +# messages are off. +# The default value is: NO. + +QUIET = YES + +# The WARNINGS tag can be used to turn on/off the warning messages that are +# generated to standard error (stderr) by doxygen. If WARNINGS is set to YES +# this implies that the warnings are on. +# +# Tip: Turn warnings on while writing the documentation. +# The default value is: YES. + +WARNINGS = YES + +# If the WARN_IF_UNDOCUMENTED tag is set to YES then doxygen will generate +# warnings for undocumented members. If EXTRACT_ALL is set to YES then this flag +# will automatically be disabled. +# The default value is: YES. + +WARN_IF_UNDOCUMENTED = NO + +# If the WARN_IF_DOC_ERROR tag is set to YES, doxygen will generate warnings for +# potential errors in the documentation, such as documenting some parameters in +# a documented function twice, or documenting parameters that don't exist or +# using markup commands wrongly. +# The default value is: YES. + +WARN_IF_DOC_ERROR = YES + +# If WARN_IF_INCOMPLETE_DOC is set to YES, doxygen will warn about incomplete +# function parameter documentation. If set to NO, doxygen will accept that some +# parameters have no documentation without warning. +# The default value is: YES. + +WARN_IF_INCOMPLETE_DOC = YES + +# This WARN_NO_PARAMDOC option can be enabled to get warnings for functions that +# are documented, but have no documentation for their parameters or return +# value. If set to NO, doxygen will only warn about wrong parameter +# documentation, but not about the absence of documentation. If EXTRACT_ALL is +# set to YES then this flag will automatically be disabled. See also +# WARN_IF_INCOMPLETE_DOC +# The default value is: NO. + +WARN_NO_PARAMDOC = NO + +# If WARN_IF_UNDOC_ENUM_VAL option is set to YES, doxygen will warn about +# undocumented enumeration values. If set to NO, doxygen will accept +# undocumented enumeration values. If EXTRACT_ALL is set to YES then this flag +# will automatically be disabled. +# The default value is: NO. + +WARN_IF_UNDOC_ENUM_VAL = NO + +# If the WARN_AS_ERROR tag is set to YES then doxygen will immediately stop when +# a warning is encountered. If the WARN_AS_ERROR tag is set to FAIL_ON_WARNINGS +# then doxygen will continue running as if WARN_AS_ERROR tag is set to NO, but +# at the end of the doxygen process doxygen will return with a non-zero status. +# Possible values are: NO, YES and FAIL_ON_WARNINGS. +# The default value is: NO. + +WARN_AS_ERROR = NO + +# The WARN_FORMAT tag determines the format of the warning messages that doxygen +# can produce. The string should contain the $file, $line, and $text tags, which +# will be replaced by the file and line number from which the warning originated +# and the warning text. Optionally the format may contain $version, which will +# be replaced by the version of the file (if it could be obtained via +# FILE_VERSION_FILTER) +# See also: WARN_LINE_FORMAT +# The default value is: $file:$line: $text. + +WARN_FORMAT = "$file:$line: $text" + +# In the $text part of the WARN_FORMAT command it is possible that a reference +# to a more specific place is given. To make it easier to jump to this place +# (outside of doxygen) the user can define a custom "cut" / "paste" string. +# Example: +# WARN_LINE_FORMAT = "'vi $file +$line'" +# See also: WARN_FORMAT +# The default value is: at line $line of file $file. + +WARN_LINE_FORMAT = "at line $line of file $file" + +# The WARN_LOGFILE tag can be used to specify a file to which warning and error +# messages should be written. If left blank the output is written to standard +# error (stderr). In case the file specified cannot be opened for writing the +# warning and error messages are written to standard error. When as file - is +# specified the warning and error messages are written to standard output +# (stdout). + +WARN_LOGFILE = + +#--------------------------------------------------------------------------- +# Configuration options related to the input files +#--------------------------------------------------------------------------- + +# The INPUT tag is used to specify the files and/or directories that contain +# documented source files. You may enter file names like myfile.cpp or +# directories like /usr/src/myproject. Separate the files or directories with +# spaces. See also FILE_PATTERNS and EXTENSION_MAPPING +# Note: If this tag is empty the current directory is searched. + +INPUT = CONTRIBUTING.md \ + README.md \ + SECURITY.md \ + TODO.md \ + src \ + include \ + include/mruby \ + mrblib \ + doc \ + doc/guides \ + doc/internal \ + LEGAL \ + LICENSE \ + NEWS + +# This tag can be used to specify the character encoding of the source files +# that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses +# libiconv (or the iconv built into libc) for the transcoding. See the libiconv +# documentation (see: +# https://www.gnu.org/software/libiconv/) for the list of possible encodings. +# See also: INPUT_FILE_ENCODING +# The default value is: UTF-8. + +INPUT_ENCODING = UTF-8 + +# This tag can be used to specify the character encoding of the source files +# that doxygen parses The INPUT_FILE_ENCODING tag can be used to specify +# character encoding on a per file pattern basis. Doxygen will compare the file +# name with each pattern and apply the encoding instead of the default +# INPUT_ENCODING) if there is a match. The character encodings are a list of the +# form: pattern=encoding (like *.php=ISO-8859-1). See cfg_input_encoding +# "INPUT_ENCODING" for further information on supported encodings. + +INPUT_FILE_ENCODING = + +# If the value of the INPUT tag contains directories, you can use the +# FILE_PATTERNS tag to specify one or more wildcard patterns (like *.cpp and +# *.h) to filter out the source-files in the directories. +# +# Note that for custom extensions or not directly supported extensions you also +# need to set EXTENSION_MAPPING for the extension otherwise the files are not +# read by doxygen. +# +# Note the list of default checked file patterns might differ from the list of +# default file extension mappings. +# +# If left blank the following patterns are tested:*.c, *.cc, *.cxx, *.cpp, +# *.c++, *.java, *.ii, *.ixx, *.ipp, *.i++, *.inl, *.idl, *.ddl, *.odl, *.h, +# *.hh, *.hxx, *.hpp, *.h++, *.l, *.cs, *.d, *.php, *.php4, *.php5, *.phtml, +# *.inc, *.m, *.markdown, *.md, *.mm, *.dox (to be provided as doxygen C +# comment), *.py, *.pyw, *.f90, *.f95, *.f03, *.f08, *.f18, *.f, *.for, *.vhd, +# *.vhdl, *.ucf, *.qsf and *.ice. + +FILE_PATTERNS = *.c \ + *.cc \ + *.cxx \ + *.cpp \ + *.c++ \ + *.java \ + *.ii \ + *.ixx \ + *.ipp \ + *.i++ \ + *.inl \ + *.idl \ + *.ddl \ + *.odl \ + *.h \ + *.hh \ + *.hxx \ + *.hpp \ + *.h++ \ + *.cs \ + *.d \ + *.php \ + *.php4 \ + *.php5 \ + *.phtml \ + *.inc \ + *.m \ + *.markdown \ + *.md \ + *.mm \ + *.dox \ + *.py \ + *.pyw \ + *.f90 \ + *.f95 \ + *.f03 \ + *.f08 \ + *.f \ + *.for \ + *.tcl \ + *.vhd \ + *.vhdl \ + *.ucf \ + *.qsf + +# The RECURSIVE tag can be used to specify whether or not subdirectories should +# be searched for input files as well. +# The default value is: NO. + +RECURSIVE = NO + +# The EXCLUDE tag can be used to specify files and/or directories that should be +# excluded from the INPUT source files. This way you can easily exclude a +# subdirectory from a directory tree whose root is specified with the INPUT tag. +# +# Note that relative paths are relative to the directory from which doxygen is +# run. + +EXCLUDE = + +# The EXCLUDE_SYMLINKS tag can be used to select whether or not files or +# directories that are symbolic links (a Unix file system feature) are excluded +# from the input. +# The default value is: NO. + +EXCLUDE_SYMLINKS = NO + +# If the value of the INPUT tag contains directories, you can use the +# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude +# certain files from those directories. +# +# Note that the wildcards are matched against the file with absolute path, so to +# exclude all test directories for example use the pattern */test/* + +EXCLUDE_PATTERNS = + +# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names +# (namespaces, classes, functions, etc.) that should be excluded from the +# output. The symbol name can be a fully qualified name, a word, or if the +# wildcard * is used, a substring. Examples: ANamespace, AClass, +# ANamespace::AClass, ANamespace::*Test +# +# Note that the wildcards are matched against the file with absolute path, so to +# exclude all test directories use the pattern */test/* + +EXCLUDE_SYMBOLS = + +# The EXAMPLE_PATH tag can be used to specify one or more files or directories +# that contain example code fragments that are included (see the \include +# command). + +EXAMPLE_PATH = + +# If the value of the EXAMPLE_PATH tag contains directories, you can use the +# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp and +# *.h) to filter out the source-files in the directories. If left blank all +# files are included. + +EXAMPLE_PATTERNS = * + +# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be +# searched for input files to be used with the \include or \dontinclude commands +# irrespective of the value of the RECURSIVE tag. +# The default value is: NO. + +EXAMPLE_RECURSIVE = NO + +# The IMAGE_PATH tag can be used to specify one or more files or directories +# that contain images that are to be included in the documentation (see the +# \image command). + +IMAGE_PATH = + +# The INPUT_FILTER tag can be used to specify a program that doxygen should +# invoke to filter for each input file. Doxygen will invoke the filter program +# by executing (via popen()) the command: +# +# +# +# where is the value of the INPUT_FILTER tag, and is the +# name of an input file. Doxygen will then use the output that the filter +# program writes to standard output. If FILTER_PATTERNS is specified, this tag +# will be ignored. +# +# Note that the filter must not add or remove lines; it is applied before the +# code is scanned, but not when the output code is generated. If lines are added +# or removed, the anchors will not be placed correctly. +# +# Note that doxygen will use the data processed and written to standard output +# for further processing, therefore nothing else, like debug statements or used +# commands (so in case of a Windows batch file always use @echo OFF), should be +# written to standard output. +# +# Note that for custom extensions or not directly supported extensions you also +# need to set EXTENSION_MAPPING for the extension otherwise the files are not +# properly processed by doxygen. + +INPUT_FILTER = + +# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern +# basis. Doxygen will compare the file name with each pattern and apply the +# filter if there is a match. The filters are a list of the form: pattern=filter +# (like *.cpp=my_cpp_filter). See INPUT_FILTER for further information on how +# filters are used. If the FILTER_PATTERNS tag is empty or if none of the +# patterns match the file name, INPUT_FILTER is applied. +# +# Note that for custom extensions or not directly supported extensions you also +# need to set EXTENSION_MAPPING for the extension otherwise the files are not +# properly processed by doxygen. + +FILTER_PATTERNS = + +# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using +# INPUT_FILTER) will also be used to filter the input files that are used for +# producing the source files to browse (i.e. when SOURCE_BROWSER is set to YES). +# The default value is: NO. + +FILTER_SOURCE_FILES = NO + +# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file +# pattern. A pattern will override the setting for FILTER_PATTERN (if any) and +# it is also possible to disable source filtering for a specific pattern using +# *.ext= (so without naming a filter). +# This tag requires that the tag FILTER_SOURCE_FILES is set to YES. + +FILTER_SOURCE_PATTERNS = + +# If the USE_MDFILE_AS_MAINPAGE tag refers to the name of a markdown file that +# is part of the input, its contents will be placed on the main page +# (index.html). This can be useful if you have a project on for instance GitHub +# and want to reuse the introduction page also for the doxygen output. + +USE_MDFILE_AS_MAINPAGE = README.md + +# The Fortran standard specifies that for fixed formatted Fortran code all +# characters from position 72 are to be considered as comment. A common +# extension is to allow longer lines before the automatic comment starts. The +# setting FORTRAN_COMMENT_AFTER will also make it possible that longer lines can +# be processed before the automatic comment starts. +# Minimum value: 7, maximum value: 10000, default value: 72. + +FORTRAN_COMMENT_AFTER = 72 + +#--------------------------------------------------------------------------- +# Configuration options related to source browsing +#--------------------------------------------------------------------------- + +# If the SOURCE_BROWSER tag is set to YES then a list of source files will be +# generated. Documented entities will be cross-referenced with these sources. +# +# Note: To get rid of all source code in the generated output, make sure that +# also VERBATIM_HEADERS is set to NO. +# The default value is: NO. + +SOURCE_BROWSER = NO + +# Setting the INLINE_SOURCES tag to YES will include the body of functions, +# classes and enums directly into the documentation. +# The default value is: NO. + +INLINE_SOURCES = NO + +# Setting the STRIP_CODE_COMMENTS tag to YES will instruct doxygen to hide any +# special comment blocks from generated source code fragments. Normal C, C++ and +# Fortran comments will always remain visible. +# The default value is: YES. + +STRIP_CODE_COMMENTS = YES + +# If the REFERENCED_BY_RELATION tag is set to YES then for each documented +# entity all documented functions referencing it will be listed. +# The default value is: NO. + +REFERENCED_BY_RELATION = NO + +# If the REFERENCES_RELATION tag is set to YES then for each documented function +# all documented entities called/used by that function will be listed. +# The default value is: NO. + +REFERENCES_RELATION = NO + +# If the REFERENCES_LINK_SOURCE tag is set to YES and SOURCE_BROWSER tag is set +# to YES then the hyperlinks from functions in REFERENCES_RELATION and +# REFERENCED_BY_RELATION lists will link to the source code. Otherwise they will +# link to the documentation. +# The default value is: YES. + +REFERENCES_LINK_SOURCE = YES + +# If SOURCE_TOOLTIPS is enabled (the default) then hovering a hyperlink in the +# source code will show a tooltip with additional information such as prototype, +# brief description and links to the definition and documentation. Since this +# will make the HTML file larger and loading of large files a bit slower, you +# can opt to disable this feature. +# The default value is: YES. +# This tag requires that the tag SOURCE_BROWSER is set to YES. + +SOURCE_TOOLTIPS = YES + +# If the USE_HTAGS tag is set to YES then the references to source code will +# point to the HTML generated by the htags(1) tool instead of doxygen built-in +# source browser. The htags tool is part of GNU's global source tagging system +# (see https://www.gnu.org/software/global/global.html). You will need version +# 4.8.6 or higher. +# +# To use it do the following: +# - Install the latest version of global +# - Enable SOURCE_BROWSER and USE_HTAGS in the configuration file +# - Make sure the INPUT points to the root of the source tree +# - Run doxygen as normal +# +# Doxygen will invoke htags (and that will in turn invoke gtags), so these +# tools must be available from the command line (i.e. in the search path). +# +# The result: instead of the source browser generated by doxygen, the links to +# source code will now point to the output of htags. +# The default value is: NO. +# This tag requires that the tag SOURCE_BROWSER is set to YES. + +USE_HTAGS = NO + +# If the VERBATIM_HEADERS tag is set the YES then doxygen will generate a +# verbatim copy of the header file for each class for which an include is +# specified. Set to NO to disable this. +# See also: Section \class. +# The default value is: YES. + +VERBATIM_HEADERS = YES + +#--------------------------------------------------------------------------- +# Configuration options related to the alphabetical class index +#--------------------------------------------------------------------------- + +# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index of all +# compounds will be generated. Enable this if the project contains a lot of +# classes, structs, unions or interfaces. +# The default value is: YES. + +ALPHABETICAL_INDEX = YES + +# The IGNORE_PREFIX tag can be used to specify a prefix (or a list of prefixes) +# that should be ignored while generating the index headers. The IGNORE_PREFIX +# tag works for classes, function and member names. The entity will be placed in +# the alphabetical list under the first letter of the entity name that remains +# after removing the prefix. +# This tag requires that the tag ALPHABETICAL_INDEX is set to YES. + +IGNORE_PREFIX = + +#--------------------------------------------------------------------------- +# Configuration options related to the HTML output +#--------------------------------------------------------------------------- + +# If the GENERATE_HTML tag is set to YES, doxygen will generate HTML output +# The default value is: YES. + +GENERATE_HTML = YES + +# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. If a +# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of +# it. +# The default directory is: html. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_OUTPUT = html + +# The HTML_FILE_EXTENSION tag can be used to specify the file extension for each +# generated HTML page (for example: .htm, .php, .asp). +# The default value is: .html. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_FILE_EXTENSION = .html + +# The HTML_HEADER tag can be used to specify a user-defined HTML header file for +# each generated HTML page. If the tag is left blank doxygen will generate a +# standard header. +# +# To get valid HTML the header file that includes any scripts and style sheets +# that doxygen needs, which is dependent on the configuration options used (e.g. +# the setting GENERATE_TREEVIEW). It is highly recommended to start with a +# default header using +# doxygen -w html new_header.html new_footer.html new_stylesheet.css +# YourConfigFile +# and then modify the file new_header.html. See also section "Doxygen usage" +# for information on how to generate the default header that doxygen normally +# uses. +# Note: The header is subject to change so you typically have to regenerate the +# default header when upgrading to a newer version of doxygen. For a description +# of the possible markers and block names see the documentation. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_HEADER = + +# The HTML_FOOTER tag can be used to specify a user-defined HTML footer for each +# generated HTML page. If the tag is left blank doxygen will generate a standard +# footer. See HTML_HEADER for more information on how to generate a default +# footer and what special commands can be used inside the footer. See also +# section "Doxygen usage" for information on how to generate the default footer +# that doxygen normally uses. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_FOOTER = + +# The HTML_STYLESHEET tag can be used to specify a user-defined cascading style +# sheet that is used by each HTML page. It can be used to fine-tune the look of +# the HTML output. If left blank doxygen will generate a default style sheet. +# See also section "Doxygen usage" for information on how to generate the style +# sheet that doxygen normally uses. +# Note: It is recommended to use HTML_EXTRA_STYLESHEET instead of this tag, as +# it is more robust and this tag (HTML_STYLESHEET) will in the future become +# obsolete. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_STYLESHEET = + +# The HTML_EXTRA_STYLESHEET tag can be used to specify additional user-defined +# cascading style sheets that are included after the standard style sheets +# created by doxygen. Using this option one can overrule certain style aspects. +# This is preferred over using HTML_STYLESHEET since it does not replace the +# standard style sheet and is therefore more robust against future updates. +# Doxygen will copy the style sheet files to the output directory. +# Note: The order of the extra style sheet files is of importance (e.g. the last +# style sheet in the list overrules the setting of the previous ones in the +# list). +# Note: Since the styling of scrollbars can currently not be overruled in +# Webkit/Chromium, the styling will be left out of the default doxygen.css if +# one or more extra stylesheets have been specified. So if scrollbar +# customization is desired it has to be added explicitly. For an example see the +# documentation. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_EXTRA_STYLESHEET = + +# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or +# other source files which should be copied to the HTML output directory. Note +# that these files will be copied to the base HTML output directory. Use the +# $relpath^ marker in the HTML_HEADER and/or HTML_FOOTER files to load these +# files. In the HTML_STYLESHEET file, use the file name only. Also note that the +# files will be copied as-is; there are no commands or markers available. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_EXTRA_FILES = + +# The HTML_COLORSTYLE tag can be used to specify if the generated HTML output +# should be rendered with a dark or light theme. +# Possible values are: LIGHT always generate light mode output, DARK always +# generate dark mode output, AUTO_LIGHT automatically set the mode according to +# the user preference, use light mode if no preference is set (the default), +# AUTO_DARK automatically set the mode according to the user preference, use +# dark mode if no preference is set and TOGGLE allow to user to switch between +# light and dark mode via a button. +# The default value is: AUTO_LIGHT. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_COLORSTYLE = AUTO_LIGHT + +# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen +# will adjust the colors in the style sheet and background images according to +# this color. Hue is specified as an angle on a color-wheel, see +# https://en.wikipedia.org/wiki/Hue for more information. For instance the value +# 0 represents red, 60 is yellow, 120 is green, 180 is cyan, 240 is blue, 300 +# purple, and 360 is red again. +# Minimum value: 0, maximum value: 359, default value: 220. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_COLORSTYLE_HUE = 359 + +# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of the colors +# in the HTML output. For a value of 0 the output will use gray-scales only. A +# value of 255 will produce the most vivid colors. +# Minimum value: 0, maximum value: 255, default value: 100. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_COLORSTYLE_SAT = 100 + +# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to the +# luminance component of the colors in the HTML output. Values below 100 +# gradually make the output lighter, whereas values above 100 make the output +# darker. The value divided by 100 is the actual gamma applied, so 80 represents +# a gamma of 0.8, The value 220 represents a gamma of 2.2, and 100 does not +# change the gamma. +# Minimum value: 40, maximum value: 240, default value: 80. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_COLORSTYLE_GAMMA = 80 + +# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML +# page will contain the date and time when the page was generated. Setting this +# to YES can help to show when doxygen was last run and thus if the +# documentation is up to date. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_TIMESTAMP = NO + +# If the HTML_DYNAMIC_MENUS tag is set to YES then the generated HTML +# documentation will contain a main index with vertical navigation menus that +# are dynamically created via JavaScript. If disabled, the navigation index will +# consists of multiple levels of tabs that are statically embedded in every HTML +# page. Disable this option to support browsers that do not have JavaScript, +# like the Qt help browser. +# The default value is: YES. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_DYNAMIC_MENUS = YES + +# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML +# documentation will contain sections that can be hidden and shown after the +# page has loaded. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_DYNAMIC_SECTIONS = NO + +# With HTML_INDEX_NUM_ENTRIES one can control the preferred number of entries +# shown in the various tree structured indices initially; the user can expand +# and collapse entries dynamically later on. Doxygen will expand the tree to +# such a level that at most the specified number of entries are visible (unless +# a fully collapsed tree already exceeds this amount). So setting the number of +# entries 1 will produce a full collapsed tree by default. 0 is a special value +# representing an infinite number of entries and will result in a full expanded +# tree by default. +# Minimum value: 0, maximum value: 9999, default value: 100. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_INDEX_NUM_ENTRIES = 100 + +# If the GENERATE_DOCSET tag is set to YES, additional index files will be +# generated that can be used as input for Apple's Xcode 3 integrated development +# environment (see: +# https://developer.apple.com/xcode/), introduced with OSX 10.5 (Leopard). To +# create a documentation set, doxygen will generate a Makefile in the HTML +# output directory. Running make will produce the docset in that directory and +# running make install will install the docset in +# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find it at +# startup. See https://developer.apple.com/library/archive/featuredarticles/Doxy +# genXcode/_index.html for more information. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_DOCSET = NO + +# This tag determines the name of the docset feed. A documentation feed provides +# an umbrella under which multiple documentation sets from a single provider +# (such as a company or product suite) can be grouped. +# The default value is: Doxygen generated docs. +# This tag requires that the tag GENERATE_DOCSET is set to YES. + +DOCSET_FEEDNAME = "Doxygen generated docs" + +# This tag determines the URL of the docset feed. A documentation feed provides +# an umbrella under which multiple documentation sets from a single provider +# (such as a company or product suite) can be grouped. +# This tag requires that the tag GENERATE_DOCSET is set to YES. + +DOCSET_FEEDURL = + +# This tag specifies a string that should uniquely identify the documentation +# set bundle. This should be a reverse domain-name style string, e.g. +# com.mycompany.MyDocSet. Doxygen will append .docset to the name. +# The default value is: org.doxygen.Project. +# This tag requires that the tag GENERATE_DOCSET is set to YES. + +DOCSET_BUNDLE_ID = org.doxygen.Project + +# The DOCSET_PUBLISHER_ID tag specifies a string that should uniquely identify +# the documentation publisher. This should be a reverse domain-name style +# string, e.g. com.mycompany.MyDocSet.documentation. +# The default value is: org.doxygen.Publisher. +# This tag requires that the tag GENERATE_DOCSET is set to YES. + +DOCSET_PUBLISHER_ID = org.doxygen.Publisher + +# The DOCSET_PUBLISHER_NAME tag identifies the documentation publisher. +# The default value is: Publisher. +# This tag requires that the tag GENERATE_DOCSET is set to YES. + +DOCSET_PUBLISHER_NAME = Publisher + +# If the GENERATE_HTMLHELP tag is set to YES then doxygen generates three +# additional HTML index files: index.hhp, index.hhc, and index.hhk. The +# index.hhp is a project file that can be read by Microsoft's HTML Help Workshop +# on Windows. In the beginning of 2021 Microsoft took the original page, with +# a.o. the download links, offline the HTML help workshop was already many years +# in maintenance mode). You can download the HTML help workshop from the web +# archives at Installation executable (see: +# http://web.archive.org/web/20160201063255/http://download.microsoft.com/downlo +# ad/0/A/9/0A939EF6-E31C-430F-A3DF-DFAE7960D564/htmlhelp.exe). +# +# The HTML Help Workshop contains a compiler that can convert all HTML output +# generated by doxygen into a single compiled HTML file (.chm). Compiled HTML +# files are now used as the Windows 98 help format, and will replace the old +# Windows help format (.hlp) on all Windows platforms in the future. Compressed +# HTML files also contain an index, a table of contents, and you can search for +# words in the documentation. The HTML workshop also contains a viewer for +# compressed HTML files. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_HTMLHELP = NO + +# The CHM_FILE tag can be used to specify the file name of the resulting .chm +# file. You can add a path in front of the file if the result should not be +# written to the html output directory. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +CHM_FILE = + +# The HHC_LOCATION tag can be used to specify the location (absolute path +# including file name) of the HTML help compiler (hhc.exe). If non-empty, +# doxygen will try to run the HTML help compiler on the generated index.hhp. +# The file has to be specified with full path. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +HHC_LOCATION = + +# The GENERATE_CHI flag controls if a separate .chi index file is generated +# (YES) or that it should be included in the main .chm file (NO). +# The default value is: NO. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +GENERATE_CHI = NO + +# The CHM_INDEX_ENCODING is used to encode HtmlHelp index (hhk), content (hhc) +# and project file content. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +CHM_INDEX_ENCODING = + +# The BINARY_TOC flag controls whether a binary table of contents is generated +# (YES) or a normal table of contents (NO) in the .chm file. Furthermore it +# enables the Previous and Next buttons. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +BINARY_TOC = NO + +# The TOC_EXPAND flag can be set to YES to add extra items for group members to +# the table of contents of the HTML help documentation and to the tree view. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +TOC_EXPAND = NO + +# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and +# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated that +# can be used as input for Qt's qhelpgenerator to generate a Qt Compressed Help +# (.qch) of the generated HTML documentation. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_QHP = NO + +# If the QHG_LOCATION tag is specified, the QCH_FILE tag can be used to specify +# the file name of the resulting .qch file. The path specified is relative to +# the HTML output folder. +# This tag requires that the tag GENERATE_QHP is set to YES. + +QCH_FILE = + +# The QHP_NAMESPACE tag specifies the namespace to use when generating Qt Help +# Project output. For more information please see Qt Help Project / Namespace +# (see: +# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#namespace). +# The default value is: org.doxygen.Project. +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_NAMESPACE = org.doxygen.Project + +# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating Qt +# Help Project output. For more information please see Qt Help Project / Virtual +# Folders (see: +# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#virtual-folders). +# The default value is: doc. +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_VIRTUAL_FOLDER = doc + +# If the QHP_CUST_FILTER_NAME tag is set, it specifies the name of a custom +# filter to add. For more information please see Qt Help Project / Custom +# Filters (see: +# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#custom-filters). +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_CUST_FILTER_NAME = + +# The QHP_CUST_FILTER_ATTRS tag specifies the list of the attributes of the +# custom filter to add. For more information please see Qt Help Project / Custom +# Filters (see: +# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#custom-filters). +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_CUST_FILTER_ATTRS = + +# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this +# project's filter section matches. Qt Help Project / Filter Attributes (see: +# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#filter-attributes). +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_SECT_FILTER_ATTRS = + +# The QHG_LOCATION tag can be used to specify the location (absolute path +# including file name) of Qt's qhelpgenerator. If non-empty doxygen will try to +# run qhelpgenerator on the generated .qhp file. +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHG_LOCATION = + +# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files will be +# generated, together with the HTML files, they form an Eclipse help plugin. To +# install this plugin and make it available under the help contents menu in +# Eclipse, the contents of the directory containing the HTML and XML files needs +# to be copied into the plugins directory of eclipse. The name of the directory +# within the plugins directory should be the same as the ECLIPSE_DOC_ID value. +# After copying Eclipse needs to be restarted before the help appears. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_ECLIPSEHELP = NO + +# A unique identifier for the Eclipse help plugin. When installing the plugin +# the directory name containing the HTML and XML files should also have this +# name. Each documentation set should have its own identifier. +# The default value is: org.doxygen.Project. +# This tag requires that the tag GENERATE_ECLIPSEHELP is set to YES. + +ECLIPSE_DOC_ID = org.doxygen.Project + +# If you want full control over the layout of the generated HTML pages it might +# be necessary to disable the index and replace it with your own. The +# DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs) at top +# of each HTML page. A value of NO enables the index and the value YES disables +# it. Since the tabs in the index contain the same information as the navigation +# tree, you can set this option to YES if you also set GENERATE_TREEVIEW to YES. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +DISABLE_INDEX = NO + +# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index +# structure should be generated to display hierarchical information. If the tag +# value is set to YES, a side panel will be generated containing a tree-like +# index structure (just like the one that is generated for HTML Help). For this +# to work a browser that supports JavaScript, DHTML, CSS and frames is required +# (i.e. any modern browser). Windows users are probably better off using the +# HTML help feature. Via custom style sheets (see HTML_EXTRA_STYLESHEET) one can +# further fine tune the look of the index (see "Fine-tuning the output"). As an +# example, the default style sheet generated by doxygen has an example that +# shows how to put an image at the root of the tree instead of the PROJECT_NAME. +# Since the tree basically has the same information as the tab index, you could +# consider setting DISABLE_INDEX to YES when enabling this option. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_TREEVIEW = NO + +# When both GENERATE_TREEVIEW and DISABLE_INDEX are set to YES, then the +# FULL_SIDEBAR option determines if the side bar is limited to only the treeview +# area (value NO) or if it should extend to the full height of the window (value +# YES). Setting this to YES gives a layout similar to +# https://docs.readthedocs.io with more room for contents, but less room for the +# project logo, title, and description. If either GENERATE_TREEVIEW or +# DISABLE_INDEX is set to NO, this option has no effect. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +FULL_SIDEBAR = NO + +# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values that +# doxygen will group on one line in the generated HTML documentation. +# +# Note that a value of 0 will completely suppress the enum values from appearing +# in the overview section. +# Minimum value: 0, maximum value: 20, default value: 4. +# This tag requires that the tag GENERATE_HTML is set to YES. + +ENUM_VALUES_PER_LINE = 4 + +# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be used +# to set the initial width (in pixels) of the frame in which the tree is shown. +# Minimum value: 0, maximum value: 1500, default value: 250. +# This tag requires that the tag GENERATE_HTML is set to YES. + +TREEVIEW_WIDTH = 250 + +# If the EXT_LINKS_IN_WINDOW option is set to YES, doxygen will open links to +# external symbols imported via tag files in a separate window. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +EXT_LINKS_IN_WINDOW = NO + +# If the OBFUSCATE_EMAILS tag is set to YES, doxygen will obfuscate email +# addresses. +# The default value is: YES. +# This tag requires that the tag GENERATE_HTML is set to YES. + +OBFUSCATE_EMAILS = YES + +# If the HTML_FORMULA_FORMAT option is set to svg, doxygen will use the pdf2svg +# tool (see https://github.com/dawbarton/pdf2svg) or inkscape (see +# https://inkscape.org) to generate formulas as SVG images instead of PNGs for +# the HTML output. These images will generally look nicer at scaled resolutions. +# Possible values are: png (the default) and svg (looks nicer but requires the +# pdf2svg or inkscape tool). +# The default value is: png. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_FORMULA_FORMAT = png + +# Use this tag to change the font size of LaTeX formulas included as images in +# the HTML documentation. When you change the font size after a successful +# doxygen run you need to manually remove any form_*.png images from the HTML +# output directory to force them to be regenerated. +# Minimum value: 8, maximum value: 50, default value: 10. +# This tag requires that the tag GENERATE_HTML is set to YES. + +FORMULA_FONTSIZE = 10 + +# The FORMULA_MACROFILE can contain LaTeX \newcommand and \renewcommand commands +# to create new LaTeX commands to be used in formulas as building blocks. See +# the section "Including formulas" for details. + +FORMULA_MACROFILE = + +# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax (see +# https://www.mathjax.org) which uses client side JavaScript for the rendering +# instead of using pre-rendered bitmaps. Use this if you do not have LaTeX +# installed or if you want to formulas look prettier in the HTML output. When +# enabled you may also need to install MathJax separately and configure the path +# to it using the MATHJAX_RELPATH option. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +USE_MATHJAX = NO + +# With MATHJAX_VERSION it is possible to specify the MathJax version to be used. +# Note that the different versions of MathJax have different requirements with +# regards to the different settings, so it is possible that also other MathJax +# settings have to be changed when switching between the different MathJax +# versions. +# Possible values are: MathJax_2 and MathJax_3. +# The default value is: MathJax_2. +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_VERSION = MathJax_2 + +# When MathJax is enabled you can set the default output format to be used for +# the MathJax output. For more details about the output format see MathJax +# version 2 (see: +# http://docs.mathjax.org/en/v2.7-latest/output.html) and MathJax version 3 +# (see: +# http://docs.mathjax.org/en/latest/web/components/output.html). +# Possible values are: HTML-CSS (which is slower, but has the best +# compatibility. This is the name for Mathjax version 2, for MathJax version 3 +# this will be translated into chtml), NativeMML (i.e. MathML. Only supported +# for NathJax 2. For MathJax version 3 chtml will be used instead.), chtml (This +# is the name for Mathjax version 3, for MathJax version 2 this will be +# translated into HTML-CSS) and SVG. +# The default value is: HTML-CSS. +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_FORMAT = HTML-CSS + +# When MathJax is enabled you need to specify the location relative to the HTML +# output directory using the MATHJAX_RELPATH option. The destination directory +# should contain the MathJax.js script. For instance, if the mathjax directory +# is located at the same level as the HTML output directory, then +# MATHJAX_RELPATH should be ../mathjax. The default value points to the MathJax +# Content Delivery Network so you can quickly see the result without installing +# MathJax. However, it is strongly recommended to install a local copy of +# MathJax from https://www.mathjax.org before deployment. The default value is: +# - in case of MathJax version 2: https://cdn.jsdelivr.net/npm/mathjax@2 +# - in case of MathJax version 3: https://cdn.jsdelivr.net/npm/mathjax@3 +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_RELPATH = http://cdn.mathjax.org/mathjax/latest + +# The MATHJAX_EXTENSIONS tag can be used to specify one or more MathJax +# extension names that should be enabled during MathJax rendering. For example +# for MathJax version 2 (see +# https://docs.mathjax.org/en/v2.7-latest/tex.html#tex-and-latex-extensions): +# MATHJAX_EXTENSIONS = TeX/AMSmath TeX/AMSsymbols +# For example for MathJax version 3 (see +# http://docs.mathjax.org/en/latest/input/tex/extensions/index.html): +# MATHJAX_EXTENSIONS = ams +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_EXTENSIONS = + +# The MATHJAX_CODEFILE tag can be used to specify a file with javascript pieces +# of code that will be used on startup of the MathJax code. See the MathJax site +# (see: +# http://docs.mathjax.org/en/v2.7-latest/output.html) for more details. For an +# example see the documentation. +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_CODEFILE = + +# When the SEARCHENGINE tag is enabled doxygen will generate a search box for +# the HTML output. The underlying search engine uses javascript and DHTML and +# should work on any modern browser. Note that when using HTML help +# (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets (GENERATE_DOCSET) +# there is already a search function so this one should typically be disabled. +# For large projects the javascript based search engine can be slow, then +# enabling SERVER_BASED_SEARCH may provide a better solution. It is possible to +# search using the keyboard; to jump to the search box use + S +# (what the is depends on the OS and browser, but it is typically +# , /