enclave 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/README.md +182 -0
- data/Rakefile +30 -0
- data/ext/enclave/enclave.c +390 -0
- data/ext/enclave/extconf.rb +33 -0
- data/ext/enclave/mruby/Makefile +63 -0
- data/ext/enclave/mruby/Rakefile +102 -0
- data/ext/enclave/mruby/benchmark/bm_ao_render.rb +309 -0
- data/ext/enclave/mruby/benchmark/bm_app_lc_fizzbuzz.rb +51 -0
- data/ext/enclave/mruby/benchmark/bm_fib.rb +6 -0
- data/ext/enclave/mruby/benchmark/bm_mandel_term.rb +34 -0
- data/ext/enclave/mruby/benchmark/bm_so_lists.rb +49 -0
- data/ext/enclave/mruby/benchmark/bm_so_mandelbrot.rb +65 -0
- data/ext/enclave/mruby/benchmark/vm_dispatch_bench.c +197 -0
- data/ext/enclave/mruby/benchmark/vm_optimization_bench.rb +513 -0
- data/ext/enclave/mruby/build/host/include/mrbconf.h +230 -0
- data/ext/enclave/mruby/build/host/include/mruby/array.h +303 -0
- data/ext/enclave/mruby/build/host/include/mruby/boxing_nan.h +169 -0
- data/ext/enclave/mruby/build/host/include/mruby/boxing_no.h +59 -0
- data/ext/enclave/mruby/build/host/include/mruby/boxing_word.h +248 -0
- data/ext/enclave/mruby/build/host/include/mruby/class.h +157 -0
- data/ext/enclave/mruby/build/host/include/mruby/common.h +127 -0
- data/ext/enclave/mruby/build/host/include/mruby/compile.h +187 -0
- data/ext/enclave/mruby/build/host/include/mruby/data.h +76 -0
- data/ext/enclave/mruby/build/host/include/mruby/debug.h +75 -0
- data/ext/enclave/mruby/build/host/include/mruby/dump.h +159 -0
- data/ext/enclave/mruby/build/host/include/mruby/endian.h +44 -0
- data/ext/enclave/mruby/build/host/include/mruby/error.h +168 -0
- data/ext/enclave/mruby/build/host/include/mruby/gc.h +77 -0
- data/ext/enclave/mruby/build/host/include/mruby/hash.h +234 -0
- data/ext/enclave/mruby/build/host/include/mruby/internal.h +278 -0
- data/ext/enclave/mruby/build/host/include/mruby/irep.h +142 -0
- data/ext/enclave/mruby/build/host/include/mruby/istruct.h +50 -0
- data/ext/enclave/mruby/build/host/include/mruby/khash.h +455 -0
- data/ext/enclave/mruby/build/host/include/mruby/mempool.h +19 -0
- data/ext/enclave/mruby/build/host/include/mruby/numeric.h +174 -0
- data/ext/enclave/mruby/build/host/include/mruby/object.h +44 -0
- data/ext/enclave/mruby/build/host/include/mruby/opcode.h +73 -0
- data/ext/enclave/mruby/build/host/include/mruby/ops.h +133 -0
- data/ext/enclave/mruby/build/host/include/mruby/presym/id.h +895 -0
- data/ext/enclave/mruby/build/host/include/mruby/presym/scanning.h +82 -0
- data/ext/enclave/mruby/build/host/include/mruby/presym/table.h +1787 -0
- data/ext/enclave/mruby/build/host/include/mruby/presym.h +65 -0
- data/ext/enclave/mruby/build/host/include/mruby/proc.h +184 -0
- data/ext/enclave/mruby/build/host/include/mruby/range.h +77 -0
- data/ext/enclave/mruby/build/host/include/mruby/re.h +16 -0
- data/ext/enclave/mruby/build/host/include/mruby/string.h +428 -0
- data/ext/enclave/mruby/build/host/include/mruby/throw.h +81 -0
- data/ext/enclave/mruby/build/host/include/mruby/value.h +471 -0
- data/ext/enclave/mruby/build/host/include/mruby/variable.h +108 -0
- data/ext/enclave/mruby/build/host/include/mruby/version.h +143 -0
- data/ext/enclave/mruby/build/host/include/mruby.h +1632 -0
- data/ext/enclave/mruby/build/host/mrbc/include/mruby/presym/id.h +281 -0
- data/ext/enclave/mruby/build/host/mrbc/include/mruby/presym/table.h +559 -0
- data/ext/enclave/mruby/build/host/mrbgems/gem_init.c +164 -0
- data/ext/enclave/mruby/build/host/mrbgems/mruby-array-ext/gem_init.c +650 -0
- data/ext/enclave/mruby/build/host/mrbgems/mruby-binding/gem_init.c +21 -0
- data/ext/enclave/mruby/build/host/mrbgems/mruby-catch/gem_init.c +86 -0
- data/ext/enclave/mruby/build/host/mrbgems/mruby-class-ext/gem_init.c +21 -0
- data/ext/enclave/mruby/build/host/mrbgems/mruby-compar-ext/gem_init.c +99 -0
- data/ext/enclave/mruby/build/host/mrbgems/mruby-complex/gem_init.c +362 -0
- data/ext/enclave/mruby/build/host/mrbgems/mruby-data/gem_init.c +21 -0
- data/ext/enclave/mruby/build/host/mrbgems/mruby-enum-chain/gem_init.c +229 -0
- data/ext/enclave/mruby/build/host/mrbgems/mruby-enum-ext/gem_init.c +1420 -0
- data/ext/enclave/mruby/build/host/mrbgems/mruby-enum-lazy/gem_init.c +602 -0
- data/ext/enclave/mruby/build/host/mrbgems/mruby-enumerator/gem_init.c +822 -0
- data/ext/enclave/mruby/build/host/mrbgems/mruby-eval/gem_init.c +21 -0
- data/ext/enclave/mruby/build/host/mrbgems/mruby-fiber/gem_init.c +21 -0
- data/ext/enclave/mruby/build/host/mrbgems/mruby-hash-ext/gem_init.c +591 -0
- data/ext/enclave/mruby/build/host/mrbgems/mruby-kernel-ext/gem_init.c +21 -0
- data/ext/enclave/mruby/build/host/mrbgems/mruby-math/gem_init.c +21 -0
- data/ext/enclave/mruby/build/host/mrbgems/mruby-metaprog/gem_init.c +21 -0
- data/ext/enclave/mruby/build/host/mrbgems/mruby-method/gem_init.c +153 -0
- data/ext/enclave/mruby/build/host/mrbgems/mruby-numeric-ext/gem_init.c +211 -0
- data/ext/enclave/mruby/build/host/mrbgems/mruby-object-ext/gem_init.c +94 -0
- data/ext/enclave/mruby/build/host/mrbgems/mruby-objectspace/gem_init.c +21 -0
- data/ext/enclave/mruby/build/host/mrbgems/mruby-pack/gem_init.c +21 -0
- data/ext/enclave/mruby/build/host/mrbgems/mruby-proc-binding/gem_init.c +21 -0
- data/ext/enclave/mruby/build/host/mrbgems/mruby-proc-ext/gem_init.c +237 -0
- data/ext/enclave/mruby/build/host/mrbgems/mruby-random/gem_init.c +21 -0
- data/ext/enclave/mruby/build/host/mrbgems/mruby-range-ext/gem_init.c +205 -0
- data/ext/enclave/mruby/build/host/mrbgems/mruby-rational/gem_init.c +147 -0
- data/ext/enclave/mruby/build/host/mrbgems/mruby-set/gem_init.c +487 -0
- data/ext/enclave/mruby/build/host/mrbgems/mruby-sprintf/gem_init.c +83 -0
- data/ext/enclave/mruby/build/host/mrbgems/mruby-string-ext/gem_init.c +220 -0
- data/ext/enclave/mruby/build/host/mrbgems/mruby-struct/gem_init.c +175 -0
- data/ext/enclave/mruby/build/host/mrbgems/mruby-symbol-ext/gem_init.c +153 -0
- data/ext/enclave/mruby/build/host/mrbgems/mruby-time/gem_init.c +21 -0
- data/ext/enclave/mruby/build/host/mrbgems/mruby-toplevel-ext/gem_init.c +78 -0
- data/ext/enclave/mruby/build/host/mrblib/mrblib.c +1758 -0
- data/ext/enclave/mruby/build_config/ArduinoDue.rb +72 -0
- data/ext/enclave/mruby/build_config/IntelEdison.rb +69 -0
- data/ext/enclave/mruby/build_config/IntelGalileo.rb +88 -0
- data/ext/enclave/mruby/build_config/RX630.rb +63 -0
- data/ext/enclave/mruby/build_config/android_arm64_v8a.rb +11 -0
- data/ext/enclave/mruby/build_config/android_armeabi_v7a_neon_hard.rb +13 -0
- data/ext/enclave/mruby/build_config/bench.rb +11 -0
- data/ext/enclave/mruby/build_config/boxing.rb +19 -0
- data/ext/enclave/mruby/build_config/chipKITMax32.rb +68 -0
- data/ext/enclave/mruby/build_config/ci/gcc-clang.rb +40 -0
- data/ext/enclave/mruby/build_config/ci/msvc.rb +20 -0
- data/ext/enclave/mruby/build_config/clang-asan.rb +11 -0
- data/ext/enclave/mruby/build_config/cosmopolitan.rb +86 -0
- data/ext/enclave/mruby/build_config/cross-32bit.rb +14 -0
- data/ext/enclave/mruby/build_config/cross-mingw-winetest.rb +90 -0
- data/ext/enclave/mruby/build_config/cross-mingw.rb +14 -0
- data/ext/enclave/mruby/build_config/default.rb +83 -0
- data/ext/enclave/mruby/build_config/dreamcast_shelf.rb +81 -0
- data/ext/enclave/mruby/build_config/emscripten-cxx.rb +12 -0
- data/ext/enclave/mruby/build_config/emscripten.rb +10 -0
- data/ext/enclave/mruby/build_config/gameboyadvance.rb +72 -0
- data/ext/enclave/mruby/build_config/helpers/wine_runner.rb +71 -0
- data/ext/enclave/mruby/build_config/host-cxx.rb +12 -0
- data/ext/enclave/mruby/build_config/host-debug.rb +20 -0
- data/ext/enclave/mruby/build_config/host-f32.rb +14 -0
- data/ext/enclave/mruby/build_config/host-gprof.rb +14 -0
- data/ext/enclave/mruby/build_config/host-m32.rb +15 -0
- data/ext/enclave/mruby/build_config/host-nofloat.rb +22 -0
- data/ext/enclave/mruby/build_config/host-shared.rb +36 -0
- data/ext/enclave/mruby/build_config/i586-pc-msdosdjgpp.rb +76 -0
- data/ext/enclave/mruby/build_config/luckfox_pico.rb +106 -0
- data/ext/enclave/mruby/build_config/milkv_duo.rb +106 -0
- data/ext/enclave/mruby/build_config/minimal.rb +4 -0
- data/ext/enclave/mruby/build_config/mrbc.rb +10 -0
- data/ext/enclave/mruby/build_config/nintendo_switch.rb +73 -0
- data/ext/enclave/mruby/build_config/nintendo_wii.rb +95 -0
- data/ext/enclave/mruby/build_config/no-float.rb +17 -0
- data/ext/enclave/mruby/build_config/playstationportable.rb +78 -0
- data/ext/enclave/mruby/build_config/serenity.rb +26 -0
- data/ext/enclave/mruby/build_config.rb +9 -0
- data/ext/enclave/mruby/examples/mrbgems/c_and_ruby_extension_example/mrblib/example.rb +5 -0
- data/ext/enclave/mruby/examples/mrbgems/c_and_ruby_extension_example/src/example.c +23 -0
- data/ext/enclave/mruby/examples/mrbgems/c_and_ruby_extension_example/test/example.rb +7 -0
- data/ext/enclave/mruby/examples/mrbgems/c_extension_example/src/example.c +23 -0
- data/ext/enclave/mruby/examples/mrbgems/c_extension_example/test/example.c +7 -0
- data/ext/enclave/mruby/examples/mrbgems/c_extension_example/test/example.rb +3 -0
- data/ext/enclave/mruby/examples/mrbgems/cdata_extension_example/src/example.c +77 -0
- data/ext/enclave/mruby/examples/mrbgems/cdata_extension_example/test/example.c +7 -0
- data/ext/enclave/mruby/examples/mrbgems/mruby-YOUR-bigint/core/bigint.c +70 -0
- data/ext/enclave/mruby/examples/mrbgems/ruby_extension_example/mrblib/example.rb +5 -0
- data/ext/enclave/mruby/examples/mrbgems/ruby_extension_example/test/example.rb +3 -0
- data/ext/enclave/mruby/include/mrbconf.h +230 -0
- data/ext/enclave/mruby/include/mruby/array.h +303 -0
- data/ext/enclave/mruby/include/mruby/boxing_nan.h +169 -0
- data/ext/enclave/mruby/include/mruby/boxing_no.h +59 -0
- data/ext/enclave/mruby/include/mruby/boxing_word.h +248 -0
- data/ext/enclave/mruby/include/mruby/class.h +157 -0
- data/ext/enclave/mruby/include/mruby/common.h +127 -0
- data/ext/enclave/mruby/include/mruby/compile.h +187 -0
- data/ext/enclave/mruby/include/mruby/data.h +76 -0
- data/ext/enclave/mruby/include/mruby/debug.h +75 -0
- data/ext/enclave/mruby/include/mruby/dump.h +159 -0
- data/ext/enclave/mruby/include/mruby/endian.h +44 -0
- data/ext/enclave/mruby/include/mruby/error.h +168 -0
- data/ext/enclave/mruby/include/mruby/gc.h +77 -0
- data/ext/enclave/mruby/include/mruby/hash.h +234 -0
- data/ext/enclave/mruby/include/mruby/internal.h +278 -0
- data/ext/enclave/mruby/include/mruby/irep.h +142 -0
- data/ext/enclave/mruby/include/mruby/istruct.h +50 -0
- data/ext/enclave/mruby/include/mruby/khash.h +455 -0
- data/ext/enclave/mruby/include/mruby/mempool.h +19 -0
- data/ext/enclave/mruby/include/mruby/numeric.h +174 -0
- data/ext/enclave/mruby/include/mruby/object.h +44 -0
- data/ext/enclave/mruby/include/mruby/opcode.h +73 -0
- data/ext/enclave/mruby/include/mruby/ops.h +133 -0
- data/ext/enclave/mruby/include/mruby/presym/scanning.h +82 -0
- data/ext/enclave/mruby/include/mruby/presym.h +65 -0
- data/ext/enclave/mruby/include/mruby/proc.h +184 -0
- data/ext/enclave/mruby/include/mruby/range.h +77 -0
- data/ext/enclave/mruby/include/mruby/re.h +16 -0
- data/ext/enclave/mruby/include/mruby/string.h +428 -0
- data/ext/enclave/mruby/include/mruby/throw.h +81 -0
- data/ext/enclave/mruby/include/mruby/value.h +471 -0
- data/ext/enclave/mruby/include/mruby/variable.h +108 -0
- data/ext/enclave/mruby/include/mruby/version.h +143 -0
- data/ext/enclave/mruby/include/mruby.h +1632 -0
- data/ext/enclave/mruby/lib/mruby/amalgam.rb +568 -0
- data/ext/enclave/mruby/lib/mruby/build/command.rb +383 -0
- data/ext/enclave/mruby/lib/mruby/build/load_gems.rb +383 -0
- data/ext/enclave/mruby/lib/mruby/build.rb +616 -0
- data/ext/enclave/mruby/lib/mruby/core_ext.rb +61 -0
- data/ext/enclave/mruby/lib/mruby/doc.rb +51 -0
- data/ext/enclave/mruby/lib/mruby/gem.rb +585 -0
- data/ext/enclave/mruby/lib/mruby/lockfile.rb +81 -0
- data/ext/enclave/mruby/lib/mruby/presym.rb +167 -0
- data/ext/enclave/mruby/lib/mruby/source.rb +32 -0
- data/ext/enclave/mruby/mrbgems/default-no-fpu.gembox +3 -0
- data/ext/enclave/mruby/mrbgems/default-no-stdio.gembox +4 -0
- data/ext/enclave/mruby/mrbgems/default.gembox +25 -0
- data/ext/enclave/mruby/mrbgems/full-core.gembox +6 -0
- data/ext/enclave/mruby/mrbgems/hal-posix-dir/mrbgem.rake +7 -0
- data/ext/enclave/mruby/mrbgems/hal-posix-dir/src/dir_hal.c +193 -0
- data/ext/enclave/mruby/mrbgems/hal-posix-io/mrbgem.rake +8 -0
- data/ext/enclave/mruby/mrbgems/hal-posix-io/src/io_hal.c +602 -0
- data/ext/enclave/mruby/mrbgems/hal-posix-socket/mrbgem.rake +8 -0
- data/ext/enclave/mruby/mrbgems/hal-posix-socket/src/socket_hal.c +158 -0
- data/ext/enclave/mruby/mrbgems/hal-posix-task/README.md +102 -0
- data/ext/enclave/mruby/mrbgems/hal-posix-task/mrbgem.rake +8 -0
- data/ext/enclave/mruby/mrbgems/hal-posix-task/src/task_hal.c +252 -0
- data/ext/enclave/mruby/mrbgems/hal-win-dir/mrbgem.rake +7 -0
- data/ext/enclave/mruby/mrbgems/hal-win-dir/src/dir_hal.c +249 -0
- data/ext/enclave/mruby/mrbgems/hal-win-io/mrbgem.rake +11 -0
- data/ext/enclave/mruby/mrbgems/hal-win-io/src/io_hal.c +646 -0
- data/ext/enclave/mruby/mrbgems/hal-win-socket/mrbgem.rake +12 -0
- data/ext/enclave/mruby/mrbgems/hal-win-socket/src/socket_hal.c +177 -0
- data/ext/enclave/mruby/mrbgems/hal-win-task/README.md +109 -0
- data/ext/enclave/mruby/mrbgems/hal-win-task/mrbgem.rake +11 -0
- data/ext/enclave/mruby/mrbgems/hal-win-task/src/task_hal.c +187 -0
- data/ext/enclave/mruby/mrbgems/math.gembox +12 -0
- data/ext/enclave/mruby/mrbgems/metaprog.gembox +21 -0
- data/ext/enclave/mruby/mrbgems/mruby-array-ext/README.md +87 -0
- data/ext/enclave/mruby/mrbgems/mruby-array-ext/mrbgem.rake +5 -0
- data/ext/enclave/mruby/mrbgems/mruby-array-ext/mrblib/array.rb +784 -0
- data/ext/enclave/mruby/mrbgems/mruby-array-ext/src/array.c +1583 -0
- data/ext/enclave/mruby/mrbgems/mruby-array-ext/test/array.rb +849 -0
- data/ext/enclave/mruby/mrbgems/mruby-benchmark/README.md +257 -0
- data/ext/enclave/mruby/mrbgems/mruby-benchmark/mrbgem.rake +10 -0
- data/ext/enclave/mruby/mrbgems/mruby-benchmark/mrblib/benchmark.rb +131 -0
- data/ext/enclave/mruby/mrbgems/mruby-benchmark/test/benchmark.rb +244 -0
- data/ext/enclave/mruby/mrbgems/mruby-bigint/README-fgmp.md +154 -0
- data/ext/enclave/mruby/mrbgems/mruby-bigint/README.md +44 -0
- data/ext/enclave/mruby/mrbgems/mruby-bigint/core/bigint.c +6335 -0
- data/ext/enclave/mruby/mrbgems/mruby-bigint/core/bigint.h +117 -0
- data/ext/enclave/mruby/mrbgems/mruby-bigint/mrbgem.rake +10 -0
- data/ext/enclave/mruby/mrbgems/mruby-bigint/test/bigint.rb +157 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-config/README.md +46 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-config/mrbgem.rake +49 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-config/mruby-config +46 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-config/mruby-config.bat +92 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-debugger/README.md +63 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-debugger/bintest/mrdb.rb +283 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-debugger/bintest/print.rb +703 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-debugger/mrbgem.rake +10 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/apibreak.c +523 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/apibreak.h +26 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/apilist.c +238 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/apilist.h +14 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/apiprint.c +88 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/apiprint.h +13 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/apistring.c +34 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/apistring.h +14 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/cmdbreak.c +436 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/cmdmisc.c +509 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/cmdprint.c +71 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/cmdrun.c +64 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/mrdb.c +768 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/mrdb.h +159 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/mrdbconf.h +24 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/mrdberror.h +19 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-mirb/README.md +94 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-mirb/bintest/mirb.rb +58 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-mirb/mrbgem.rake +7 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-mirb/tools/mirb/mirb.c +808 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-mirb/tools/mirb/mirb_buffer.c +1035 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-mirb/tools/mirb/mirb_buffer.h +185 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-mirb/tools/mirb/mirb_completion.c +797 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-mirb/tools/mirb/mirb_completion.h +132 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-mirb/tools/mirb/mirb_editor.c +1118 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-mirb/tools/mirb/mirb_editor.h +153 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-mirb/tools/mirb/mirb_highlight.c +516 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-mirb/tools/mirb/mirb_highlight.h +95 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-mirb/tools/mirb/mirb_history.c +185 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-mirb/tools/mirb/mirb_history.h +76 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-mirb/tools/mirb/mirb_term.c +491 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-mirb/tools/mirb/mirb_term.h +137 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-mrbc/README.md +58 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-mrbc/bintest/mrbc.rb +30 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-mrbc/mrbgem.rake +15 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-mrbc/tools/mrbc/mrbc.c +362 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-mrbc/tools/mrbc/stub.c +104 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-mruby/README.md +47 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-mruby/bintest/mruby.rb +178 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-mruby/mrbgem.rake +7 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-mruby/tools/mruby/mruby.c +380 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-strip/README.md +38 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-strip/bintest/mruby_strip.rb +73 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-strip/mrbgem.rake +7 -0
- data/ext/enclave/mruby/mrbgems/mruby-bin-strip/tools/mruby-strip/mruby_strip.c +139 -0
- data/ext/enclave/mruby/mrbgems/mruby-binding/README.md +256 -0
- data/ext/enclave/mruby/mrbgems/mruby-binding/mrbgem.rake +7 -0
- data/ext/enclave/mruby/mrbgems/mruby-binding/src/binding.c +518 -0
- data/ext/enclave/mruby/mrbgems/mruby-binding/test/binding.c +14 -0
- data/ext/enclave/mruby/mrbgems/mruby-binding/test/binding.rb +64 -0
- data/ext/enclave/mruby/mrbgems/mruby-catch/README.md +94 -0
- data/ext/enclave/mruby/mrbgems/mruby-catch/mrbgem.rake +5 -0
- data/ext/enclave/mruby/mrbgems/mruby-catch/mrblib/catch.rb +29 -0
- data/ext/enclave/mruby/mrbgems/mruby-catch/src/catch.c +149 -0
- data/ext/enclave/mruby/mrbgems/mruby-catch/test/catch.rb +86 -0
- data/ext/enclave/mruby/mrbgems/mruby-class-ext/README.md +81 -0
- data/ext/enclave/mruby/mrbgems/mruby-class-ext/mrbgem.rake +5 -0
- data/ext/enclave/mruby/mrbgems/mruby-class-ext/src/class.c +377 -0
- data/ext/enclave/mruby/mrbgems/mruby-class-ext/test/class.rb +46 -0
- data/ext/enclave/mruby/mrbgems/mruby-class-ext/test/module.rb +109 -0
- data/ext/enclave/mruby/mrbgems/mruby-cmath/README.md +45 -0
- data/ext/enclave/mruby/mrbgems/mruby-cmath/mrbgem.rake +8 -0
- data/ext/enclave/mruby/mrbgems/mruby-cmath/src/cmath.c +426 -0
- data/ext/enclave/mruby/mrbgems/mruby-cmath/test/cmath.rb +41 -0
- data/ext/enclave/mruby/mrbgems/mruby-compar-ext/README.md +65 -0
- data/ext/enclave/mruby/mrbgems/mruby-compar-ext/mrbgem.rake +5 -0
- data/ext/enclave/mruby/mrbgems/mruby-compar-ext/mrblib/compar.rb +75 -0
- data/ext/enclave/mruby/mrbgems/mruby-compar-ext/test/compar.rb +21 -0
- data/ext/enclave/mruby/mrbgems/mruby-compiler/README.md +28 -0
- data/ext/enclave/mruby/mrbgems/mruby-compiler/core/codegen.c +7316 -0
- data/ext/enclave/mruby/mrbgems/mruby-compiler/core/keywords +52 -0
- data/ext/enclave/mruby/mrbgems/mruby-compiler/core/lex.def +207 -0
- data/ext/enclave/mruby/mrbgems/mruby-compiler/core/node.h +784 -0
- data/ext/enclave/mruby/mrbgems/mruby-compiler/core/parse.y +8977 -0
- data/ext/enclave/mruby/mrbgems/mruby-compiler/core/y.tab.c +16136 -0
- data/ext/enclave/mruby/mrbgems/mruby-compiler/mrbgem.rake +42 -0
- data/ext/enclave/mruby/mrbgems/mruby-complex/README.md +55 -0
- data/ext/enclave/mruby/mrbgems/mruby-complex/mrbgem.rake +7 -0
- data/ext/enclave/mruby/mrbgems/mruby-complex/mrblib/complex.rb +259 -0
- data/ext/enclave/mruby/mrbgems/mruby-complex/src/complex.c +597 -0
- data/ext/enclave/mruby/mrbgems/mruby-complex/test/complex.rb +174 -0
- data/ext/enclave/mruby/mrbgems/mruby-data/README.md +126 -0
- data/ext/enclave/mruby/mrbgems/mruby-data/mrbgem.rake +5 -0
- data/ext/enclave/mruby/mrbgems/mruby-data/src/data.c +550 -0
- data/ext/enclave/mruby/mrbgems/mruby-data/test/data.rb +76 -0
- data/ext/enclave/mruby/mrbgems/mruby-dir/README.md +53 -0
- data/ext/enclave/mruby/mrbgems/mruby-dir/include/dir_hal.h +79 -0
- data/ext/enclave/mruby/mrbgems/mruby-dir/mrbgem.rake +35 -0
- data/ext/enclave/mruby/mrbgems/mruby-dir/mrblib/dir.rb +124 -0
- data/ext/enclave/mruby/mrbgems/mruby-dir/src/dir.c +493 -0
- data/ext/enclave/mruby/mrbgems/mruby-dir/test/dir.rb +138 -0
- data/ext/enclave/mruby/mrbgems/mruby-dir/test/dirtest.c +125 -0
- data/ext/enclave/mruby/mrbgems/mruby-encoding/README.md +96 -0
- data/ext/enclave/mruby/mrbgems/mruby-encoding/mrbgem.rake +8 -0
- data/ext/enclave/mruby/mrbgems/mruby-encoding/src/encoding.c +128 -0
- data/ext/enclave/mruby/mrbgems/mruby-encoding/test/numeric.rb +27 -0
- data/ext/enclave/mruby/mrbgems/mruby-encoding/test/string.rb +30 -0
- data/ext/enclave/mruby/mrbgems/mruby-enum-chain/README.md +80 -0
- data/ext/enclave/mruby/mrbgems/mruby-enum-chain/mrbgem.rake +6 -0
- data/ext/enclave/mruby/mrbgems/mruby-enum-chain/mrblib/chain.rb +149 -0
- data/ext/enclave/mruby/mrbgems/mruby-enum-chain/test/enum_chain.rb +108 -0
- data/ext/enclave/mruby/mrbgems/mruby-enum-ext/README.md +487 -0
- data/ext/enclave/mruby/mrbgems/mruby-enum-ext/mrbgem.rake +5 -0
- data/ext/enclave/mruby/mrbgems/mruby-enum-ext/mrblib/enum.rb +938 -0
- data/ext/enclave/mruby/mrbgems/mruby-enum-ext/test/enum.rb +223 -0
- data/ext/enclave/mruby/mrbgems/mruby-enum-lazy/README.md +91 -0
- data/ext/enclave/mruby/mrbgems/mruby-enum-lazy/mrbgem.rake +7 -0
- data/ext/enclave/mruby/mrbgems/mruby-enum-lazy/mrblib/lazy.rb +363 -0
- data/ext/enclave/mruby/mrbgems/mruby-enum-lazy/test/lazy.rb +59 -0
- data/ext/enclave/mruby/mrbgems/mruby-enumerator/README.md +89 -0
- data/ext/enclave/mruby/mrbgems/mruby-enumerator/mrbgem.rake +6 -0
- data/ext/enclave/mruby/mrbgems/mruby-enumerator/mrblib/enumerator.rb +861 -0
- data/ext/enclave/mruby/mrbgems/mruby-enumerator/test/enumerator.rb +664 -0
- data/ext/enclave/mruby/mrbgems/mruby-errno/README.md +83 -0
- data/ext/enclave/mruby/mrbgems/mruby-errno/mrbgem.rake +5 -0
- data/ext/enclave/mruby/mrbgems/mruby-errno/mrblib/errno.rb +50 -0
- data/ext/enclave/mruby/mrbgems/mruby-errno/src/errno.c +335 -0
- data/ext/enclave/mruby/mrbgems/mruby-errno/src/gen.rb +18 -0
- data/ext/enclave/mruby/mrbgems/mruby-errno/src/known_errors.def +156 -0
- data/ext/enclave/mruby/mrbgems/mruby-errno/src/known_errors_def.cstub +780 -0
- data/ext/enclave/mruby/mrbgems/mruby-errno/test/errno.rb +57 -0
- data/ext/enclave/mruby/mrbgems/mruby-error/README.md +103 -0
- data/ext/enclave/mruby/mrbgems/mruby-error/mrbgem.rake +5 -0
- data/ext/enclave/mruby/mrbgems/mruby-error/src/exception.c +143 -0
- data/ext/enclave/mruby/mrbgems/mruby-error/test/exception.c +60 -0
- data/ext/enclave/mruby/mrbgems/mruby-error/test/exception.rb +55 -0
- data/ext/enclave/mruby/mrbgems/mruby-eval/README.md +26 -0
- data/ext/enclave/mruby/mrbgems/mruby-eval/mrbgem.rake +10 -0
- data/ext/enclave/mruby/mrbgems/mruby-eval/src/eval.c +437 -0
- data/ext/enclave/mruby/mrbgems/mruby-eval/test/binding.rb +81 -0
- data/ext/enclave/mruby/mrbgems/mruby-eval/test/eval.rb +185 -0
- data/ext/enclave/mruby/mrbgems/mruby-exit/mrbgem.rake +5 -0
- data/ext/enclave/mruby/mrbgems/mruby-exit/src/mruby_exit.c +83 -0
- data/ext/enclave/mruby/mrbgems/mruby-fiber/mrbgem.rake +5 -0
- data/ext/enclave/mruby/mrbgems/mruby-fiber/src/fiber.c +575 -0
- data/ext/enclave/mruby/mrbgems/mruby-fiber/test/fiber.rb +210 -0
- data/ext/enclave/mruby/mrbgems/mruby-fiber/test/fiber2.rb +155 -0
- data/ext/enclave/mruby/mrbgems/mruby-fiber/test/fibertest.c +87 -0
- data/ext/enclave/mruby/mrbgems/mruby-hash-ext/README.md +392 -0
- data/ext/enclave/mruby/mrbgems/mruby-hash-ext/mrbgem.rake +6 -0
- data/ext/enclave/mruby/mrbgems/mruby-hash-ext/mrblib/hash.rb +408 -0
- data/ext/enclave/mruby/mrbgems/mruby-hash-ext/src/hash_ext.c +392 -0
- data/ext/enclave/mruby/mrbgems/mruby-hash-ext/test/hash.rb +317 -0
- data/ext/enclave/mruby/mrbgems/mruby-io/README.md +198 -0
- data/ext/enclave/mruby/mrbgems/mruby-io/include/io_hal.h +451 -0
- data/ext/enclave/mruby/mrbgems/mruby-io/include/mruby/io.h +76 -0
- data/ext/enclave/mruby/mrbgems/mruby-io/mrbgem.rake +34 -0
- data/ext/enclave/mruby/mrbgems/mruby-io/mrblib/file.rb +109 -0
- data/ext/enclave/mruby/mrbgems/mruby-io/mrblib/file_constants.rb +24 -0
- data/ext/enclave/mruby/mrbgems/mruby-io/mrblib/io.rb +303 -0
- data/ext/enclave/mruby/mrbgems/mruby-io/mrblib/kernel.rb +175 -0
- data/ext/enclave/mruby/mrbgems/mruby-io/src/file.c +1192 -0
- data/ext/enclave/mruby/mrbgems/mruby-io/src/file_test.c +403 -0
- data/ext/enclave/mruby/mrbgems/mruby-io/src/io.c +2260 -0
- data/ext/enclave/mruby/mrbgems/mruby-io/src/mruby_io_gem.c +21 -0
- data/ext/enclave/mruby/mrbgems/mruby-io/test/file.rb +415 -0
- data/ext/enclave/mruby/mrbgems/mruby-io/test/file_test.rb +112 -0
- data/ext/enclave/mruby/mrbgems/mruby-io/test/io.rb +668 -0
- data/ext/enclave/mruby/mrbgems/mruby-io/test/mruby_io_test.c +293 -0
- data/ext/enclave/mruby/mrbgems/mruby-kernel-ext/README.md +165 -0
- data/ext/enclave/mruby/mrbgems/mruby-kernel-ext/mrbgem.rake +5 -0
- data/ext/enclave/mruby/mrbgems/mruby-kernel-ext/src/kernel.c +316 -0
- data/ext/enclave/mruby/mrbgems/mruby-kernel-ext/test/kernel.rb +134 -0
- data/ext/enclave/mruby/mrbgems/mruby-math/README.md +77 -0
- data/ext/enclave/mruby/mrbgems/mruby-math/mrbgem.rake +5 -0
- data/ext/enclave/mruby/mrbgems/mruby-math/src/math.c +753 -0
- data/ext/enclave/mruby/mrbgems/mruby-math/test/math.rb +201 -0
- data/ext/enclave/mruby/mrbgems/mruby-metaprog/README.md +123 -0
- data/ext/enclave/mruby/mrbgems/mruby-metaprog/mrbgem.rake +5 -0
- data/ext/enclave/mruby/mrbgems/mruby-metaprog/src/metaprog.c +739 -0
- data/ext/enclave/mruby/mrbgems/mruby-metaprog/test/metaprog.rb +465 -0
- data/ext/enclave/mruby/mrbgems/mruby-method/README.md +66 -0
- data/ext/enclave/mruby/mrbgems/mruby-method/mrbgem.rake +7 -0
- data/ext/enclave/mruby/mrbgems/mruby-method/mrblib/method.rb +73 -0
- data/ext/enclave/mruby/mrbgems/mruby-method/src/method.c +890 -0
- data/ext/enclave/mruby/mrbgems/mruby-method/test/method.rb +514 -0
- data/ext/enclave/mruby/mrbgems/mruby-numeric-ext/README.md +78 -0
- data/ext/enclave/mruby/mrbgems/mruby-numeric-ext/mrbgem.rake +5 -0
- data/ext/enclave/mruby/mrbgems/mruby-numeric-ext/mrblib/numeric_ext.rb +125 -0
- data/ext/enclave/mruby/mrbgems/mruby-numeric-ext/src/numeric_ext.c +527 -0
- data/ext/enclave/mruby/mrbgems/mruby-numeric-ext/test/numeric.rb +137 -0
- data/ext/enclave/mruby/mrbgems/mruby-object-ext/README.md +144 -0
- data/ext/enclave/mruby/mrbgems/mruby-object-ext/mrbgem.rake +5 -0
- data/ext/enclave/mruby/mrbgems/mruby-object-ext/mrblib/object.rb +33 -0
- data/ext/enclave/mruby/mrbgems/mruby-object-ext/src/object.c +128 -0
- data/ext/enclave/mruby/mrbgems/mruby-object-ext/test/nil.rb +16 -0
- data/ext/enclave/mruby/mrbgems/mruby-object-ext/test/object.rb +67 -0
- data/ext/enclave/mruby/mrbgems/mruby-object-ext/test/object_ext.c +17 -0
- data/ext/enclave/mruby/mrbgems/mruby-objectspace/README.md +59 -0
- data/ext/enclave/mruby/mrbgems/mruby-objectspace/mrbgem.rake +5 -0
- data/ext/enclave/mruby/mrbgems/mruby-objectspace/src/mruby_objectspace.c +188 -0
- data/ext/enclave/mruby/mrbgems/mruby-objectspace/test/objectspace.rb +60 -0
- data/ext/enclave/mruby/mrbgems/mruby-os-memsize/README.md +75 -0
- data/ext/enclave/mruby/mrbgems/mruby-os-memsize/mrbgem.rake +10 -0
- data/ext/enclave/mruby/mrbgems/mruby-os-memsize/src/memsize.c +271 -0
- data/ext/enclave/mruby/mrbgems/mruby-os-memsize/test/memsize.rb +63 -0
- data/ext/enclave/mruby/mrbgems/mruby-pack/README.md +140 -0
- data/ext/enclave/mruby/mrbgems/mruby-pack/mrbgem.rake +5 -0
- data/ext/enclave/mruby/mrbgems/mruby-pack/src/pack.c +2129 -0
- data/ext/enclave/mruby/mrbgems/mruby-pack/test/pack.rb +202 -0
- data/ext/enclave/mruby/mrbgems/mruby-proc-binding/README.md +140 -0
- data/ext/enclave/mruby/mrbgems/mruby-proc-binding/mrbgem.rake +10 -0
- data/ext/enclave/mruby/mrbgems/mruby-proc-binding/src/proc_binding.c +76 -0
- data/ext/enclave/mruby/mrbgems/mruby-proc-binding/test/proc_binding.c +14 -0
- data/ext/enclave/mruby/mrbgems/mruby-proc-binding/test/proc_binding.rb +22 -0
- data/ext/enclave/mruby/mrbgems/mruby-proc-ext/README.md +107 -0
- data/ext/enclave/mruby/mrbgems/mruby-proc-ext/mrbgem.rake +5 -0
- data/ext/enclave/mruby/mrbgems/mruby-proc-ext/mrblib/proc.rb +130 -0
- data/ext/enclave/mruby/mrbgems/mruby-proc-ext/src/proc.c +267 -0
- data/ext/enclave/mruby/mrbgems/mruby-proc-ext/test/proc.c +62 -0
- data/ext/enclave/mruby/mrbgems/mruby-proc-ext/test/proc.rb +130 -0
- data/ext/enclave/mruby/mrbgems/mruby-random/README.md +272 -0
- data/ext/enclave/mruby/mrbgems/mruby-random/mrbgem.rake +5 -0
- data/ext/enclave/mruby/mrbgems/mruby-random/src/random.c +608 -0
- data/ext/enclave/mruby/mrbgems/mruby-random/test/random.rb +151 -0
- data/ext/enclave/mruby/mrbgems/mruby-range-ext/README.md +93 -0
- data/ext/enclave/mruby/mrbgems/mruby-range-ext/mrbgem.rake +5 -0
- data/ext/enclave/mruby/mrbgems/mruby-range-ext/mrblib/range.rb +155 -0
- data/ext/enclave/mruby/mrbgems/mruby-range-ext/src/range.c +236 -0
- data/ext/enclave/mruby/mrbgems/mruby-range-ext/test/range.rb +211 -0
- data/ext/enclave/mruby/mrbgems/mruby-rational/README.md +61 -0
- data/ext/enclave/mruby/mrbgems/mruby-rational/mrbgem.rake +7 -0
- data/ext/enclave/mruby/mrbgems/mruby-rational/mrblib/rational.rb +66 -0
- data/ext/enclave/mruby/mrbgems/mruby-rational/src/rational.c +1269 -0
- data/ext/enclave/mruby/mrbgems/mruby-rational/test/rational.rb +316 -0
- data/ext/enclave/mruby/mrbgems/mruby-set/LICENSE +24 -0
- data/ext/enclave/mruby/mrbgems/mruby-set/README.md +260 -0
- data/ext/enclave/mruby/mrbgems/mruby-set/mrbgem.rake +9 -0
- data/ext/enclave/mruby/mrbgems/mruby-set/mrblib/set.rb +325 -0
- data/ext/enclave/mruby/mrbgems/mruby-set/mruby-set.gem +6 -0
- data/ext/enclave/mruby/mrbgems/mruby-set/src/set.c +1535 -0
- data/ext/enclave/mruby/mrbgems/mruby-set/test/set.rb +764 -0
- data/ext/enclave/mruby/mrbgems/mruby-sleep/README.md +29 -0
- data/ext/enclave/mruby/mrbgems/mruby-sleep/example/sleep.rb +2 -0
- data/ext/enclave/mruby/mrbgems/mruby-sleep/mrbgem.rake +5 -0
- data/ext/enclave/mruby/mrbgems/mruby-sleep/src/sleep.c +187 -0
- data/ext/enclave/mruby/mrbgems/mruby-sleep/test/sleep_test.rb +29 -0
- data/ext/enclave/mruby/mrbgems/mruby-socket/README.md +56 -0
- data/ext/enclave/mruby/mrbgems/mruby-socket/include/socket_hal.h +83 -0
- data/ext/enclave/mruby/mrbgems/mruby-socket/mrbgem.rake +37 -0
- data/ext/enclave/mruby/mrbgems/mruby-socket/mrblib/socket.rb +1131 -0
- data/ext/enclave/mruby/mrbgems/mruby-socket/src/const.cstub +480 -0
- data/ext/enclave/mruby/mrbgems/mruby-socket/src/const.def +172 -0
- data/ext/enclave/mruby/mrbgems/mruby-socket/src/gen.rb +17 -0
- data/ext/enclave/mruby/mrbgems/mruby-socket/src/socket.c +1374 -0
- data/ext/enclave/mruby/mrbgems/mruby-socket/test/addrinfo.rb +91 -0
- data/ext/enclave/mruby/mrbgems/mruby-socket/test/basicsocket.rb +17 -0
- data/ext/enclave/mruby/mrbgems/mruby-socket/test/ipsocket.rb +44 -0
- data/ext/enclave/mruby/mrbgems/mruby-socket/test/socket.rb +38 -0
- data/ext/enclave/mruby/mrbgems/mruby-socket/test/sockettest.c +84 -0
- data/ext/enclave/mruby/mrbgems/mruby-socket/test/tcpsocket.rb +4 -0
- data/ext/enclave/mruby/mrbgems/mruby-socket/test/udpsocket.rb +16 -0
- data/ext/enclave/mruby/mrbgems/mruby-socket/test/unix.rb +130 -0
- data/ext/enclave/mruby/mrbgems/mruby-sprintf/README.md +235 -0
- data/ext/enclave/mruby/mrbgems/mruby-sprintf/mrbgem.rake +5 -0
- data/ext/enclave/mruby/mrbgems/mruby-sprintf/mrblib/string.rb +24 -0
- data/ext/enclave/mruby/mrbgems/mruby-sprintf/src/sprintf.c +1195 -0
- data/ext/enclave/mruby/mrbgems/mruby-sprintf/test/sprintf.rb +92 -0
- data/ext/enclave/mruby/mrbgems/mruby-strftime/README.md +140 -0
- data/ext/enclave/mruby/mrbgems/mruby-strftime/mrbgem.rake +7 -0
- data/ext/enclave/mruby/mrbgems/mruby-strftime/src/strftime.c +119 -0
- data/ext/enclave/mruby/mrbgems/mruby-strftime/test/strftime.rb +152 -0
- data/ext/enclave/mruby/mrbgems/mruby-string-ext/README.md +886 -0
- data/ext/enclave/mruby/mrbgems/mruby-string-ext/mrbgem.rake +5 -0
- data/ext/enclave/mruby/mrbgems/mruby-string-ext/mrblib/string.rb +166 -0
- data/ext/enclave/mruby/mrbgems/mruby-string-ext/src/string.c +2290 -0
- data/ext/enclave/mruby/mrbgems/mruby-string-ext/test/numeric.rb +27 -0
- data/ext/enclave/mruby/mrbgems/mruby-string-ext/test/range.rb +26 -0
- data/ext/enclave/mruby/mrbgems/mruby-string-ext/test/string.rb +765 -0
- data/ext/enclave/mruby/mrbgems/mruby-struct/README.md +105 -0
- data/ext/enclave/mruby/mrbgems/mruby-struct/mrbgem.rake +5 -0
- data/ext/enclave/mruby/mrbgems/mruby-struct/mrblib/struct.rb +69 -0
- data/ext/enclave/mruby/mrbgems/mruby-struct/src/struct.c +812 -0
- data/ext/enclave/mruby/mrbgems/mruby-struct/test/struct.rb +303 -0
- data/ext/enclave/mruby/mrbgems/mruby-symbol-ext/README.md +50 -0
- data/ext/enclave/mruby/mrbgems/mruby-symbol-ext/mrbgem.rake +5 -0
- data/ext/enclave/mruby/mrbgems/mruby-symbol-ext/mrblib/symbol.rb +72 -0
- data/ext/enclave/mruby/mrbgems/mruby-symbol-ext/src/symbol.c +79 -0
- data/ext/enclave/mruby/mrbgems/mruby-symbol-ext/test/symbol.rb +55 -0
- data/ext/enclave/mruby/mrbgems/mruby-task/README.md +770 -0
- data/ext/enclave/mruby/mrbgems/mruby-task/examples/inspection.rb +65 -0
- data/ext/enclave/mruby/mrbgems/mruby-task/examples/priority.rb +41 -0
- data/ext/enclave/mruby/mrbgems/mruby-task/examples/producer_consumer.rb +58 -0
- data/ext/enclave/mruby/mrbgems/mruby-task/examples/simple.rb +27 -0
- data/ext/enclave/mruby/mrbgems/mruby-task/examples/statistics.rb +59 -0
- data/ext/enclave/mruby/mrbgems/mruby-task/examples/suspend_resume.rb +47 -0
- data/ext/enclave/mruby/mrbgems/mruby-task/examples/task_pass.rb +21 -0
- data/ext/enclave/mruby/mrbgems/mruby-task/include/task.h +143 -0
- data/ext/enclave/mruby/mrbgems/mruby-task/include/task_hal.h +162 -0
- data/ext/enclave/mruby/mrbgems/mruby-task/mrbgem.rake +36 -0
- data/ext/enclave/mruby/mrbgems/mruby-task/src/task.c +1573 -0
- data/ext/enclave/mruby/mrbgems/mruby-task/test/task.rb +185 -0
- data/ext/enclave/mruby/mrbgems/mruby-test/README.md +7 -0
- data/ext/enclave/mruby/mrbgems/mruby-test/driver.c +315 -0
- data/ext/enclave/mruby/mrbgems/mruby-test/mrbgem.rake +173 -0
- data/ext/enclave/mruby/mrbgems/mruby-test/vformat.c +151 -0
- data/ext/enclave/mruby/mrbgems/mruby-test-inline-struct/mrbgem.rake +5 -0
- data/ext/enclave/mruby/mrbgems/mruby-test-inline-struct/test/inline.c +92 -0
- data/ext/enclave/mruby/mrbgems/mruby-test-inline-struct/test/inline.rb +118 -0
- data/ext/enclave/mruby/mrbgems/mruby-time/README.md +102 -0
- data/ext/enclave/mruby/mrbgems/mruby-time/include/mruby/time.h +27 -0
- data/ext/enclave/mruby/mrbgems/mruby-time/mrbgem.rake +5 -0
- data/ext/enclave/mruby/mrbgems/mruby-time/src/time.c +1739 -0
- data/ext/enclave/mruby/mrbgems/mruby-time/test/time.rb +313 -0
- data/ext/enclave/mruby/mrbgems/mruby-toplevel-ext/README.md +32 -0
- data/ext/enclave/mruby/mrbgems/mruby-toplevel-ext/mrbgem.rake +5 -0
- data/ext/enclave/mruby/mrbgems/mruby-toplevel-ext/mrblib/toplevel.rb +24 -0
- data/ext/enclave/mruby/mrbgems/mruby-toplevel-ext/test/toplevel.rb +23 -0
- data/ext/enclave/mruby/mrbgems/stdlib-ext.gembox +21 -0
- data/ext/enclave/mruby/mrbgems/stdlib-io.gembox +15 -0
- data/ext/enclave/mruby/mrbgems/stdlib.gembox +63 -0
- data/ext/enclave/mruby/mrblib/10error.rb +23 -0
- data/ext/enclave/mruby/mrblib/array.rb +102 -0
- data/ext/enclave/mruby/mrblib/compar.rb +102 -0
- data/ext/enclave/mruby/mrblib/enum.rb +358 -0
- data/ext/enclave/mruby/mrblib/hash.rb +276 -0
- data/ext/enclave/mruby/mrblib/kernel.rb +45 -0
- data/ext/enclave/mruby/mrblib/numeric.rb +160 -0
- data/ext/enclave/mruby/mrblib/range.rb +98 -0
- data/ext/enclave/mruby/mrblib/string.rb +173 -0
- data/ext/enclave/mruby/mrblib/symbol.rb +8 -0
- data/ext/enclave/mruby/oss-fuzz/mruby_fuzzer.c +18 -0
- data/ext/enclave/mruby/oss-fuzz/proto_to_ruby.h +55 -0
- data/ext/enclave/mruby/src/allocf.c +37 -0
- data/ext/enclave/mruby/src/array.c +2302 -0
- data/ext/enclave/mruby/src/backtrace.c +294 -0
- data/ext/enclave/mruby/src/cdump.c +498 -0
- data/ext/enclave/mruby/src/class.c +4394 -0
- data/ext/enclave/mruby/src/codedump.c +693 -0
- data/ext/enclave/mruby/src/debug.c +290 -0
- data/ext/enclave/mruby/src/dump.c +998 -0
- data/ext/enclave/mruby/src/enum.c +30 -0
- data/ext/enclave/mruby/src/error.c +937 -0
- data/ext/enclave/mruby/src/etc.c +421 -0
- data/ext/enclave/mruby/src/fmt_fp.c +372 -0
- data/ext/enclave/mruby/src/gc.c +1610 -0
- data/ext/enclave/mruby/src/hash.c +2355 -0
- data/ext/enclave/mruby/src/init.c +50 -0
- data/ext/enclave/mruby/src/kernel.c +718 -0
- data/ext/enclave/mruby/src/load.c +760 -0
- data/ext/enclave/mruby/src/mempool.c +225 -0
- data/ext/enclave/mruby/src/numeric.c +2420 -0
- data/ext/enclave/mruby/src/numops.c +112 -0
- data/ext/enclave/mruby/src/object.c +883 -0
- data/ext/enclave/mruby/src/print.c +136 -0
- data/ext/enclave/mruby/src/proc.c +572 -0
- data/ext/enclave/mruby/src/range.c +597 -0
- data/ext/enclave/mruby/src/readfloat.c +228 -0
- data/ext/enclave/mruby/src/readint.c +27 -0
- data/ext/enclave/mruby/src/readnum.c +43 -0
- data/ext/enclave/mruby/src/state.c +247 -0
- data/ext/enclave/mruby/src/string.c +3577 -0
- data/ext/enclave/mruby/src/symbol.c +1023 -0
- data/ext/enclave/mruby/src/value_array.h +28 -0
- data/ext/enclave/mruby/src/variable.c +1475 -0
- data/ext/enclave/mruby/src/version.c +17 -0
- data/ext/enclave/mruby/src/vm.c +3696 -0
- data/ext/enclave/mruby/tasks/amalgam.rake +34 -0
- data/ext/enclave/mruby/tasks/benchmark.rake +93 -0
- data/ext/enclave/mruby/tasks/bin.rake +23 -0
- data/ext/enclave/mruby/tasks/core.rake +12 -0
- data/ext/enclave/mruby/tasks/doc.rake +118 -0
- data/ext/enclave/mruby/tasks/install.rake +40 -0
- data/ext/enclave/mruby/tasks/libmruby.rake +90 -0
- data/ext/enclave/mruby/tasks/mrbgems.rake +152 -0
- data/ext/enclave/mruby/tasks/mrblib.rake +29 -0
- data/ext/enclave/mruby/tasks/presym.rake +57 -0
- data/ext/enclave/mruby/tasks/test.rake +84 -0
- data/ext/enclave/mruby/tasks/toolchains/android.rake +228 -0
- data/ext/enclave/mruby/tasks/toolchains/clang.rake +8 -0
- data/ext/enclave/mruby/tasks/toolchains/emscripten.rake +57 -0
- data/ext/enclave/mruby/tasks/toolchains/gcc.rake +74 -0
- data/ext/enclave/mruby/tasks/toolchains/openwrt.rake +32 -0
- data/ext/enclave/mruby/tasks/toolchains/visualcpp.rake +48 -0
- data/ext/enclave/mruby/test/assert.rb +404 -0
- data/ext/enclave/mruby/test/bintest.rb +55 -0
- data/ext/enclave/mruby/test/t/argumenterror.rb +37 -0
- data/ext/enclave/mruby/test/t/array.rb +478 -0
- data/ext/enclave/mruby/test/t/basicobject.rb +10 -0
- data/ext/enclave/mruby/test/t/bs_block.rb +621 -0
- data/ext/enclave/mruby/test/t/bs_literal.rb +38 -0
- data/ext/enclave/mruby/test/t/class.rb +505 -0
- data/ext/enclave/mruby/test/t/codegen.rb +196 -0
- data/ext/enclave/mruby/test/t/comparable.rb +79 -0
- data/ext/enclave/mruby/test/t/ensure.rb +36 -0
- data/ext/enclave/mruby/test/t/enumerable.rb +134 -0
- data/ext/enclave/mruby/test/t/exception.rb +425 -0
- data/ext/enclave/mruby/test/t/false.rb +31 -0
- data/ext/enclave/mruby/test/t/float.rb +296 -0
- data/ext/enclave/mruby/test/t/gc.rb +45 -0
- data/ext/enclave/mruby/test/t/hash.rb +976 -0
- data/ext/enclave/mruby/test/t/indexerror.rb +6 -0
- data/ext/enclave/mruby/test/t/integer.rb +247 -0
- data/ext/enclave/mruby/test/t/iterations.rb +61 -0
- data/ext/enclave/mruby/test/t/kernel.rb +462 -0
- data/ext/enclave/mruby/test/t/lang.rb +74 -0
- data/ext/enclave/mruby/test/t/literals.rb +386 -0
- data/ext/enclave/mruby/test/t/localjumperror.rb +13 -0
- data/ext/enclave/mruby/test/t/methods.rb +138 -0
- data/ext/enclave/mruby/test/t/module.rb +931 -0
- data/ext/enclave/mruby/test/t/nameerror.rb +28 -0
- data/ext/enclave/mruby/test/t/nil.rb +39 -0
- data/ext/enclave/mruby/test/t/nomethoderror.rb +22 -0
- data/ext/enclave/mruby/test/t/numeric.rb +114 -0
- data/ext/enclave/mruby/test/t/object.rb +10 -0
- data/ext/enclave/mruby/test/t/proc.rb +198 -0
- data/ext/enclave/mruby/test/t/range.rb +194 -0
- data/ext/enclave/mruby/test/t/rangeerror.rb +6 -0
- data/ext/enclave/mruby/test/t/regexperror.rb +4 -0
- data/ext/enclave/mruby/test/t/runtimeerror.rb +6 -0
- data/ext/enclave/mruby/test/t/standarderror.rb +6 -0
- data/ext/enclave/mruby/test/t/string.rb +981 -0
- data/ext/enclave/mruby/test/t/superclass.rb +46 -0
- data/ext/enclave/mruby/test/t/symbol.rb +30 -0
- data/ext/enclave/mruby/test/t/syntax.rb +1296 -0
- data/ext/enclave/mruby/test/t/true.rb +31 -0
- data/ext/enclave/mruby/test/t/typeerror.rb +6 -0
- data/ext/enclave/mruby/test/t/unicode.rb +39 -0
- data/ext/enclave/mruby/test/t/vformat.rb +57 -0
- data/ext/enclave/mruby/tools/lrama/LEGAL.md +12 -0
- data/ext/enclave/mruby/tools/lrama/MIT +21 -0
- data/ext/enclave/mruby/tools/lrama/NEWS.md +696 -0
- data/ext/enclave/mruby/tools/lrama/exe/lrama +7 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/bitmap.rb +34 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/command.rb +68 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/context.rb +499 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/counterexamples/derivation.rb +66 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/counterexamples/example.rb +129 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/counterexamples/path.rb +29 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/counterexamples/production_path.rb +19 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/counterexamples/start_path.rb +23 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/counterexamples/state_item.rb +8 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/counterexamples/transition_path.rb +19 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/counterexamples/triple.rb +23 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/counterexamples.rb +298 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/diagnostics.rb +36 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/digraph.rb +83 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/auxiliary.rb +9 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/binding.rb +67 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/code/destructor_code.rb +42 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/code/initial_action_code.rb +36 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/code/no_reference_code.rb +30 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/code/printer_code.rb +42 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/code/rule_action.rb +92 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/code.rb +53 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/counter.rb +17 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/destructor.rb +11 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/error_token.rb +11 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/parameterizing_rule/resolver.rb +62 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/parameterizing_rule/rhs.rb +40 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/parameterizing_rule/rule.rb +24 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/parameterizing_rule.rb +5 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/percent_code.rb +14 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/precedence.rb +13 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/printer.rb +11 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/reference.rb +16 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/rule.rb +75 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/rule_builder.rb +255 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/stdlib.y +122 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/symbol.rb +105 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/symbols/resolver.rb +301 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/symbols.rb +3 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/type.rb +20 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/union.rb +12 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar.rb +407 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar_validator.rb +37 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/lexer/grammar_file.rb +40 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/lexer/location.rb +115 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/lexer/token/char.rb +11 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/lexer/token/ident.rb +11 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/lexer/token/instantiate_rule.rb +30 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/lexer/token/tag.rb +16 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/lexer/token/user_code.rb +83 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/lexer/token.rb +70 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/lexer.rb +191 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/logger.rb +21 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/option_parser.rb +169 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/options.rb +28 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/output.rb +459 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/parser.rb +2144 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/report/duration.rb +27 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/report/profile.rb +16 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/report.rb +4 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/state/reduce.rb +37 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/state/reduce_reduce_conflict.rb +11 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/state/resolved_conflict.rb +31 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/state/shift.rb +15 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/state/shift_reduce_conflict.rb +11 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/state.rb +433 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/states/item.rb +91 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/states.rb +595 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/states_reporter.rb +362 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/trace_reporter.rb +45 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama/version.rb +5 -0
- data/ext/enclave/mruby/tools/lrama/lib/lrama.rb +22 -0
- data/ext/enclave/mruby/tools/lrama/template/bison/_yacc.h +71 -0
- data/ext/enclave/mruby/tools/lrama/template/bison/yacc.c +2068 -0
- data/ext/enclave/mruby/tools/lrama/template/bison/yacc.h +40 -0
- data/ext/enclave/sandbox_build_config.rb +15 -0
- data/ext/enclave/sandbox_core.c +722 -0
- data/ext/enclave/sandbox_core.h +87 -0
- data/lib/enclave/result.rb +29 -0
- data/lib/enclave/tool.rb +38 -0
- data/lib/enclave/version.rb +3 -0
- data/lib/enclave.rb +73 -0
- metadata +819 -0
|
@@ -0,0 +1,1195 @@
|
|
|
1
|
+
/*
|
|
2
|
+
** sprintf.c - Kernel.#sprintf
|
|
3
|
+
**
|
|
4
|
+
** See Copyright Notice in mruby.h
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
#include <mruby.h>
|
|
8
|
+
#include <mruby/string.h>
|
|
9
|
+
#include <mruby/hash.h>
|
|
10
|
+
#include <mruby/numeric.h>
|
|
11
|
+
#include <mruby/presym.h>
|
|
12
|
+
#include <mruby/internal.h>
|
|
13
|
+
#include <string.h>
|
|
14
|
+
#include <ctype.h>
|
|
15
|
+
|
|
16
|
+
#define BIT_DIGITS(N) (((N)*146)/485 + 1) /* log2(10) =~ 146/485 */
|
|
17
|
+
#define BITSPERDIG MRB_INT_BIT
|
|
18
|
+
#define EXTENDSIGN(n, l) (((~0U << (n)) >> (((n)*(l)) % BITSPERDIG)) & ~(~0U << (n)))
|
|
19
|
+
|
|
20
|
+
mrb_value mrb_bint_2comp(mrb_state *mrb, mrb_value x);
|
|
21
|
+
|
|
22
|
+
static char*
|
|
23
|
+
remove_sign_bits(char *str, int base)
|
|
24
|
+
{
|
|
25
|
+
char *t;
|
|
26
|
+
|
|
27
|
+
t = str;
|
|
28
|
+
if (base == 16) {
|
|
29
|
+
while (*t == 'f') {
|
|
30
|
+
t++;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
else if (base == 8) {
|
|
34
|
+
*t |= EXTENDSIGN(3, strlen(t));
|
|
35
|
+
while (*t == '7') {
|
|
36
|
+
t++;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
else if (base == 2) {
|
|
40
|
+
while (*t == '1') {
|
|
41
|
+
t++;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
return t;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
static char *
|
|
49
|
+
mrb_uint_to_cstr(char *buf, size_t len, mrb_int num, int base)
|
|
50
|
+
{
|
|
51
|
+
char *b = buf + len - 1;
|
|
52
|
+
const int mask = base-1;
|
|
53
|
+
int shift;
|
|
54
|
+
mrb_uint val = (uint64_t)num;
|
|
55
|
+
|
|
56
|
+
if (num == 0) {
|
|
57
|
+
buf[0] = '0'; buf[1] = '\0';
|
|
58
|
+
return buf;
|
|
59
|
+
}
|
|
60
|
+
switch (base) {
|
|
61
|
+
case 16: shift = 4; break;
|
|
62
|
+
case 8: shift = 3; break;
|
|
63
|
+
case 2: shift = 1; break;
|
|
64
|
+
default: return NULL;
|
|
65
|
+
}
|
|
66
|
+
*--b = '\0';
|
|
67
|
+
do {
|
|
68
|
+
*--b = mrb_digitmap[(int)(val & mask)];
|
|
69
|
+
} while (val >>= shift);
|
|
70
|
+
|
|
71
|
+
if (num < 0) {
|
|
72
|
+
b = remove_sign_bits(b, base);
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
return b;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
#define FNONE 0
|
|
79
|
+
#define FSHARP 1
|
|
80
|
+
#define FMINUS 2
|
|
81
|
+
#define FPLUS 4
|
|
82
|
+
#define FZERO 8
|
|
83
|
+
#define FSPACE 16
|
|
84
|
+
#define FWIDTH 32
|
|
85
|
+
#define FPREC 64
|
|
86
|
+
#define FPREC0 128
|
|
87
|
+
|
|
88
|
+
/* Format specifier types for lookup table */
|
|
89
|
+
#define FMT_INVALID 0
|
|
90
|
+
#define FMT_FLAG 1 /* space, #, +, -, 0 */
|
|
91
|
+
#define FMT_DIGIT 2 /* 1-9 for width */
|
|
92
|
+
#define FMT_NAMED 3 /* < { for named args */
|
|
93
|
+
#define FMT_WIDTH 4 /* * for width from arg */
|
|
94
|
+
#define FMT_PREC 5 /* . for precision */
|
|
95
|
+
#define FMT_LITERAL 6 /* % \n \0 */
|
|
96
|
+
#define FMT_CHAR 7 /* c */
|
|
97
|
+
#define FMT_STRING 8 /* s p */
|
|
98
|
+
#define FMT_INTEGER 9 /* d i o x X b B u */
|
|
99
|
+
#define FMT_FLOAT 10 /* f g G e E */
|
|
100
|
+
|
|
101
|
+
/* Format specifier info structure */
|
|
102
|
+
typedef struct {
|
|
103
|
+
int type; /* FMT_* type */
|
|
104
|
+
int base; /* number base for integers */
|
|
105
|
+
int subtype; /* format-specific subtype */
|
|
106
|
+
} fmt_spec_t;
|
|
107
|
+
|
|
108
|
+
|
|
109
|
+
/* Get format specifier info for character c */
|
|
110
|
+
static inline fmt_spec_t get_fmt_spec(unsigned char c) {
|
|
111
|
+
static const fmt_spec_t invalid = {FMT_INVALID, 0, 0};
|
|
112
|
+
|
|
113
|
+
switch (c) {
|
|
114
|
+
/* Control characters and whitespace */
|
|
115
|
+
case '\0': case '\n':
|
|
116
|
+
return (fmt_spec_t){FMT_LITERAL, 0, 0};
|
|
117
|
+
|
|
118
|
+
/* Flags */
|
|
119
|
+
case ' ': return (fmt_spec_t){FMT_FLAG, 0, FSPACE};
|
|
120
|
+
case '#': return (fmt_spec_t){FMT_FLAG, 0, FSHARP};
|
|
121
|
+
case '+': return (fmt_spec_t){FMT_FLAG, 0, FPLUS};
|
|
122
|
+
case '-': return (fmt_spec_t){FMT_FLAG, 0, FMINUS};
|
|
123
|
+
case '0': return (fmt_spec_t){FMT_FLAG, 0, FZERO};
|
|
124
|
+
|
|
125
|
+
/* Width digits */
|
|
126
|
+
case '1': return (fmt_spec_t){FMT_DIGIT, 0, 1};
|
|
127
|
+
case '2': return (fmt_spec_t){FMT_DIGIT, 0, 2};
|
|
128
|
+
case '3': return (fmt_spec_t){FMT_DIGIT, 0, 3};
|
|
129
|
+
case '4': return (fmt_spec_t){FMT_DIGIT, 0, 4};
|
|
130
|
+
case '5': return (fmt_spec_t){FMT_DIGIT, 0, 5};
|
|
131
|
+
case '6': return (fmt_spec_t){FMT_DIGIT, 0, 6};
|
|
132
|
+
case '7': return (fmt_spec_t){FMT_DIGIT, 0, 7};
|
|
133
|
+
case '8': return (fmt_spec_t){FMT_DIGIT, 0, 8};
|
|
134
|
+
case '9': return (fmt_spec_t){FMT_DIGIT, 0, 9};
|
|
135
|
+
|
|
136
|
+
/* Width and precision */
|
|
137
|
+
case '*': return (fmt_spec_t){FMT_WIDTH, 0, 0};
|
|
138
|
+
case '.': return (fmt_spec_t){FMT_PREC, 0, 0};
|
|
139
|
+
|
|
140
|
+
/* Named arguments */
|
|
141
|
+
case '<': return (fmt_spec_t){FMT_NAMED, 0, '<'};
|
|
142
|
+
case '{': return (fmt_spec_t){FMT_NAMED, 0, '{'};
|
|
143
|
+
|
|
144
|
+
/* Literal percent */
|
|
145
|
+
case '%': return (fmt_spec_t){FMT_LITERAL, 0, '%'};
|
|
146
|
+
|
|
147
|
+
/* Character formatting */
|
|
148
|
+
case 'c': return (fmt_spec_t){FMT_CHAR, 0, 0};
|
|
149
|
+
|
|
150
|
+
/* String formatting */
|
|
151
|
+
case 's': return (fmt_spec_t){FMT_STRING, 0, 0};
|
|
152
|
+
case 'p': return (fmt_spec_t){FMT_STRING, 0, 1}; /* inspect format */
|
|
153
|
+
|
|
154
|
+
/* Integer formatting */
|
|
155
|
+
case 'd': return (fmt_spec_t){FMT_INTEGER, 10, 1}; /* signed decimal */
|
|
156
|
+
case 'i': return (fmt_spec_t){FMT_INTEGER, 10, 1}; /* signed decimal */
|
|
157
|
+
case 'u': return (fmt_spec_t){FMT_INTEGER, 10, 1}; /* unsigned (same as signed in mruby) */
|
|
158
|
+
case 'o': return (fmt_spec_t){FMT_INTEGER, 8, 0}; /* octal */
|
|
159
|
+
case 'x': return (fmt_spec_t){FMT_INTEGER, 16, 0}; /* hex lowercase */
|
|
160
|
+
case 'X': return (fmt_spec_t){FMT_INTEGER, 16, 1}; /* hex uppercase */
|
|
161
|
+
case 'b': return (fmt_spec_t){FMT_INTEGER, 2, 0}; /* binary lowercase */
|
|
162
|
+
case 'B': return (fmt_spec_t){FMT_INTEGER, 2, 1}; /* binary uppercase */
|
|
163
|
+
|
|
164
|
+
/* Float formatting */
|
|
165
|
+
case 'f': return (fmt_spec_t){FMT_FLOAT, 0, 'f'};
|
|
166
|
+
case 'e': return (fmt_spec_t){FMT_FLOAT, 0, 'e'};
|
|
167
|
+
case 'E': return (fmt_spec_t){FMT_FLOAT, 0, 'E'};
|
|
168
|
+
case 'g': return (fmt_spec_t){FMT_FLOAT, 0, 'g'};
|
|
169
|
+
case 'G': return (fmt_spec_t){FMT_FLOAT, 0, 'G'};
|
|
170
|
+
|
|
171
|
+
default:
|
|
172
|
+
return invalid;
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
#ifndef MRB_NO_FLOAT
|
|
177
|
+
static int
|
|
178
|
+
fmt_float(char *buf, size_t buf_size, char fmt, int flags, int width, int prec, mrb_float f)
|
|
179
|
+
{
|
|
180
|
+
char sign = '\0';
|
|
181
|
+
int left_align = 0;
|
|
182
|
+
int zero_pad = 0;
|
|
183
|
+
|
|
184
|
+
if (flags & FSHARP) fmt |= 0x80;
|
|
185
|
+
if (flags & FPLUS) sign = '+';
|
|
186
|
+
if (flags & FMINUS) left_align = 1;
|
|
187
|
+
if (flags & FZERO) zero_pad = 1;
|
|
188
|
+
if (flags & FSPACE) sign = ' ';
|
|
189
|
+
|
|
190
|
+
int len = mrb_format_float(f, buf, buf_size, fmt, prec, sign);
|
|
191
|
+
|
|
192
|
+
// buf[0] < '0' returns true if the first character is space, + or -
|
|
193
|
+
// buf[1] < '9' matches a digit, and doesn't match when we get back +nan or +inf
|
|
194
|
+
if (buf[0] < '0' && buf[1] <= '9' && zero_pad) {
|
|
195
|
+
buf++;
|
|
196
|
+
width--;
|
|
197
|
+
len--;
|
|
198
|
+
}
|
|
199
|
+
if (*buf < '0' || *buf >= '9') {
|
|
200
|
+
// For inf or nan, we don't want to zero pad.
|
|
201
|
+
zero_pad = 0;
|
|
202
|
+
}
|
|
203
|
+
if (len >= width) {
|
|
204
|
+
return len;
|
|
205
|
+
}
|
|
206
|
+
buf[width] = '\0';
|
|
207
|
+
if (left_align) {
|
|
208
|
+
memset(&buf[len], ' ', width - len);
|
|
209
|
+
return width;
|
|
210
|
+
}
|
|
211
|
+
memmove(&buf[width - len], buf, len);
|
|
212
|
+
if (zero_pad) {
|
|
213
|
+
memset(buf, '0', width - len);
|
|
214
|
+
}
|
|
215
|
+
else {
|
|
216
|
+
memset(buf, ' ', width - len);
|
|
217
|
+
}
|
|
218
|
+
return width;
|
|
219
|
+
}
|
|
220
|
+
#endif
|
|
221
|
+
|
|
222
|
+
#define CHECK(l) do { \
|
|
223
|
+
if (blen+(l) >= bsiz) {\
|
|
224
|
+
while (blen+(l) >= bsiz) {\
|
|
225
|
+
if (bsiz > MRB_INT_MAX/2) mrb_raise(mrb, E_ARGUMENT_ERROR, "too big specifier");\
|
|
226
|
+
bsiz*=2;\
|
|
227
|
+
}\
|
|
228
|
+
mrb_str_resize(mrb, result, bsiz);\
|
|
229
|
+
}\
|
|
230
|
+
buf = RSTRING_PTR(result);\
|
|
231
|
+
} while (0)
|
|
232
|
+
|
|
233
|
+
#define PUSH(s, l) do { \
|
|
234
|
+
CHECK(l);\
|
|
235
|
+
memcpy(&buf[blen], s, l);\
|
|
236
|
+
blen += (mrb_int)(l);\
|
|
237
|
+
} while (0)
|
|
238
|
+
|
|
239
|
+
#define FILL(c, l) do { \
|
|
240
|
+
CHECK(l);\
|
|
241
|
+
memset(&buf[blen], c, l);\
|
|
242
|
+
blen += (l);\
|
|
243
|
+
} while (0)
|
|
244
|
+
|
|
245
|
+
static void
|
|
246
|
+
check_next_arg(mrb_state *mrb, int posarg, int nextarg)
|
|
247
|
+
{
|
|
248
|
+
switch (posarg) {
|
|
249
|
+
case -1:
|
|
250
|
+
mrb_raisef(mrb, E_ARGUMENT_ERROR, "unnumbered(%d) mixed with numbered", nextarg);
|
|
251
|
+
break;
|
|
252
|
+
case -2:
|
|
253
|
+
mrb_raisef(mrb, E_ARGUMENT_ERROR, "unnumbered(%d) mixed with named", nextarg);
|
|
254
|
+
break;
|
|
255
|
+
default:
|
|
256
|
+
break;
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
static void
|
|
261
|
+
check_pos_arg(mrb_state *mrb, int posarg, mrb_int n)
|
|
262
|
+
{
|
|
263
|
+
if (posarg > 0) {
|
|
264
|
+
mrb_raisef(mrb, E_ARGUMENT_ERROR, "numbered(%i) after unnumbered(%d)",
|
|
265
|
+
n, posarg);
|
|
266
|
+
}
|
|
267
|
+
if (posarg == -2) {
|
|
268
|
+
mrb_raisef(mrb, E_ARGUMENT_ERROR, "numbered(%i) after named", n);
|
|
269
|
+
}
|
|
270
|
+
if (n < 1) {
|
|
271
|
+
mrb_raisef(mrb, E_ARGUMENT_ERROR, "invalid index - %i$", n);
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
static void
|
|
276
|
+
check_name_arg(mrb_state *mrb, int posarg, const char *name, size_t len)
|
|
277
|
+
{
|
|
278
|
+
if (posarg > 0) {
|
|
279
|
+
mrb_raisef(mrb, E_ARGUMENT_ERROR, "named%l after unnumbered(%d)",
|
|
280
|
+
name, len, posarg);
|
|
281
|
+
}
|
|
282
|
+
if (posarg == -1) {
|
|
283
|
+
mrb_raisef(mrb, E_ARGUMENT_ERROR, "named%l after numbered", name, len);
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
#define GETNEXTARG() (\
|
|
288
|
+
check_next_arg(mrb, posarg, nextarg),\
|
|
289
|
+
(posarg = nextarg++, GETNTHARG(posarg)))
|
|
290
|
+
|
|
291
|
+
#define GETARG() (!mrb_undef_p(nextvalue) ? nextvalue : GETNEXTARG())
|
|
292
|
+
|
|
293
|
+
#define GETPOSARG(n) (\
|
|
294
|
+
check_pos_arg(mrb, posarg, n),\
|
|
295
|
+
(posarg = -1, GETNTHARG(n)))
|
|
296
|
+
|
|
297
|
+
#define GETNTHARG(nth) \
|
|
298
|
+
((nth >= argc) ? (mrb_raise(mrb, E_ARGUMENT_ERROR, "too few arguments"), mrb_undef_value()) : argv[nth])
|
|
299
|
+
|
|
300
|
+
#define CHECKNAMEARG(name, len) (\
|
|
301
|
+
check_name_arg(mrb, posarg, name, len),\
|
|
302
|
+
posarg = -2)
|
|
303
|
+
|
|
304
|
+
#define GETNUM(n, val) do { \
|
|
305
|
+
if (!(p = get_num(mrb, p, end, &(n)))) \
|
|
306
|
+
mrb_raise(mrb, E_ARGUMENT_ERROR, #val " too big"); \
|
|
307
|
+
} while(0)
|
|
308
|
+
|
|
309
|
+
#define GETASTER(num) do { \
|
|
310
|
+
mrb_value tmp_v; \
|
|
311
|
+
t = p++; \
|
|
312
|
+
GETNUM(n, val); \
|
|
313
|
+
if (*p == '$') { \
|
|
314
|
+
tmp_v = GETPOSARG(n); \
|
|
315
|
+
} \
|
|
316
|
+
else { \
|
|
317
|
+
tmp_v = GETNEXTARG(); \
|
|
318
|
+
p = t; \
|
|
319
|
+
} \
|
|
320
|
+
num = (int)mrb_as_int(mrb, tmp_v); \
|
|
321
|
+
} while (0)
|
|
322
|
+
|
|
323
|
+
static const char*
|
|
324
|
+
get_num(mrb_state *mrb, const char *p, const char *end, int *valp)
|
|
325
|
+
{
|
|
326
|
+
char *e;
|
|
327
|
+
mrb_int n;
|
|
328
|
+
if (!mrb_read_int(p, end, &e, &n) || INT_MAX < n) {
|
|
329
|
+
return NULL;
|
|
330
|
+
}
|
|
331
|
+
*valp = (int)n;
|
|
332
|
+
return e;
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
static void
|
|
336
|
+
get_hash(mrb_state *mrb, mrb_value *hash, mrb_int argc, const mrb_value *argv)
|
|
337
|
+
{
|
|
338
|
+
if (!mrb_undef_p(*hash)) return;
|
|
339
|
+
if (argc != 2) {
|
|
340
|
+
mrb_raise(mrb, E_ARGUMENT_ERROR, "one hash required");
|
|
341
|
+
}
|
|
342
|
+
mrb_value tmp = mrb_check_hash_type(mrb, argv[1]);
|
|
343
|
+
if (mrb_nil_p(tmp)) {
|
|
344
|
+
mrb_raise(mrb, E_ARGUMENT_ERROR, "one hash required");
|
|
345
|
+
}
|
|
346
|
+
*hash = tmp;
|
|
347
|
+
}
|
|
348
|
+
|
|
349
|
+
static mrb_value
|
|
350
|
+
mrb_str_format(mrb_state *mrb, mrb_int argc, const mrb_value *argv, mrb_value fmt)
|
|
351
|
+
{
|
|
352
|
+
const char *p, *end;
|
|
353
|
+
char *buf;
|
|
354
|
+
mrb_int blen;
|
|
355
|
+
mrb_int bsiz;
|
|
356
|
+
mrb_value result;
|
|
357
|
+
int n;
|
|
358
|
+
int width;
|
|
359
|
+
int prec;
|
|
360
|
+
int nextarg = 1;
|
|
361
|
+
int posarg = 0;
|
|
362
|
+
mrb_value nextvalue;
|
|
363
|
+
mrb_value str;
|
|
364
|
+
mrb_value hash = mrb_undef_value();
|
|
365
|
+
|
|
366
|
+
#define CHECK_FOR_WIDTH(f) \
|
|
367
|
+
if ((f) & FWIDTH) { \
|
|
368
|
+
mrb_raise(mrb, E_ARGUMENT_ERROR, "width given twice"); \
|
|
369
|
+
} \
|
|
370
|
+
if ((f) & FPREC0) { \
|
|
371
|
+
mrb_raise(mrb, E_ARGUMENT_ERROR, "width after precision"); \
|
|
372
|
+
}
|
|
373
|
+
#define CHECK_FOR_FLAGS(f) \
|
|
374
|
+
if ((f) & FWIDTH) { \
|
|
375
|
+
mrb_raise(mrb, E_ARGUMENT_ERROR, "flag after width"); \
|
|
376
|
+
} \
|
|
377
|
+
if ((f) & FPREC0) { \
|
|
378
|
+
mrb_raise(mrb, E_ARGUMENT_ERROR, "flag after precision"); \
|
|
379
|
+
}
|
|
380
|
+
|
|
381
|
+
argc++;
|
|
382
|
+
argv--;
|
|
383
|
+
mrb_ensure_string_type(mrb, fmt);
|
|
384
|
+
p = RSTRING_PTR(fmt);
|
|
385
|
+
end = p + RSTRING_LEN(fmt);
|
|
386
|
+
blen = 0;
|
|
387
|
+
/* Estimate initial buffer size to reduce reallocations:
|
|
388
|
+
* - format string length (for literal text)
|
|
389
|
+
* - base headroom (120 bytes)
|
|
390
|
+
* - per-specifier headroom (24 bytes each)
|
|
391
|
+
* - capped at 4096 to prevent over-allocation
|
|
392
|
+
*/
|
|
393
|
+
bsiz = (end - p) + 120;
|
|
394
|
+
for (const char *scan = p; scan < end; scan++) {
|
|
395
|
+
if (*scan == '%') bsiz += 24;
|
|
396
|
+
}
|
|
397
|
+
if (bsiz > 4096) bsiz = 4096;
|
|
398
|
+
result = mrb_str_new_capa(mrb, bsiz);
|
|
399
|
+
buf = RSTRING_PTR(result);
|
|
400
|
+
memset(buf, 0, bsiz);
|
|
401
|
+
|
|
402
|
+
int ai = mrb_gc_arena_save(mrb);
|
|
403
|
+
for (; p < end; p++) {
|
|
404
|
+
const char *t;
|
|
405
|
+
mrb_sym id = 0;
|
|
406
|
+
int flags = FNONE;
|
|
407
|
+
|
|
408
|
+
for (t = p; t < end && *t != '%'; t++)
|
|
409
|
+
;
|
|
410
|
+
if (t + 1 == end) {
|
|
411
|
+
/* % at the bottom */
|
|
412
|
+
mrb_raise(mrb, E_ARGUMENT_ERROR, "incomplete format specifier; use %% (double %) instead");
|
|
413
|
+
}
|
|
414
|
+
PUSH(p, t - p);
|
|
415
|
+
if (t >= end)
|
|
416
|
+
goto sprint_exit; /* end of fmt string */
|
|
417
|
+
|
|
418
|
+
p = t + 1; /* skip '%' */
|
|
419
|
+
|
|
420
|
+
width = prec = -1;
|
|
421
|
+
nextvalue = mrb_undef_value();
|
|
422
|
+
|
|
423
|
+
retry:
|
|
424
|
+
if (p >= end) {
|
|
425
|
+
mrb_raise(mrb, E_ARGUMENT_ERROR, "malformed format string - unexpected end");
|
|
426
|
+
}
|
|
427
|
+
{
|
|
428
|
+
fmt_spec_t spec = get_fmt_spec(*p);
|
|
429
|
+
|
|
430
|
+
switch (spec.type) {
|
|
431
|
+
case FMT_INVALID:
|
|
432
|
+
mrb_raisef(mrb, E_ARGUMENT_ERROR, "malformed format string - %%%c", *p);
|
|
433
|
+
break;
|
|
434
|
+
|
|
435
|
+
case FMT_FLAG:
|
|
436
|
+
CHECK_FOR_FLAGS(flags);
|
|
437
|
+
flags |= spec.subtype;
|
|
438
|
+
p++;
|
|
439
|
+
goto retry;
|
|
440
|
+
|
|
441
|
+
case FMT_DIGIT:
|
|
442
|
+
GETNUM(n, width);
|
|
443
|
+
if (*p == '$') {
|
|
444
|
+
if (!mrb_undef_p(nextvalue)) {
|
|
445
|
+
mrb_raisef(mrb, E_ARGUMENT_ERROR, "value given twice - %i$", n);
|
|
446
|
+
}
|
|
447
|
+
nextvalue = GETPOSARG(n);
|
|
448
|
+
p++;
|
|
449
|
+
goto retry;
|
|
450
|
+
}
|
|
451
|
+
CHECK_FOR_WIDTH(flags);
|
|
452
|
+
width = n;
|
|
453
|
+
flags |= FWIDTH;
|
|
454
|
+
goto retry;
|
|
455
|
+
|
|
456
|
+
case FMT_NAMED: {
|
|
457
|
+
const char *start = p;
|
|
458
|
+
char term = (spec.subtype == '<') ? '>' : '}';
|
|
459
|
+
|
|
460
|
+
for (; p < end && *p != term; )
|
|
461
|
+
p++;
|
|
462
|
+
if (id) {
|
|
463
|
+
mrb_raisef(mrb, E_ARGUMENT_ERROR, "name%l after <%n>",
|
|
464
|
+
start, p - start + 1, id);
|
|
465
|
+
}
|
|
466
|
+
CHECKNAMEARG(start, p - start + 1);
|
|
467
|
+
get_hash(mrb, &hash, argc, argv);
|
|
468
|
+
id = mrb_intern_check(mrb, start + 1, p - start - 1);
|
|
469
|
+
if (id) {
|
|
470
|
+
nextvalue = mrb_hash_fetch(mrb, hash, mrb_symbol_value(id), mrb_undef_value());
|
|
471
|
+
}
|
|
472
|
+
if (!id || mrb_undef_p(nextvalue)) {
|
|
473
|
+
mrb_raisef(mrb, E_KEY_ERROR, "key%l not found", start, p - start + 1);
|
|
474
|
+
}
|
|
475
|
+
if (term == '}') goto format_s;
|
|
476
|
+
p++;
|
|
477
|
+
goto retry;
|
|
478
|
+
}
|
|
479
|
+
|
|
480
|
+
case FMT_WIDTH:
|
|
481
|
+
CHECK_FOR_WIDTH(flags);
|
|
482
|
+
flags |= FWIDTH;
|
|
483
|
+
GETASTER(width);
|
|
484
|
+
if (width > INT16_MAX || INT16_MIN > width) {
|
|
485
|
+
mrb_raise(mrb, E_ARGUMENT_ERROR, "width too big");
|
|
486
|
+
}
|
|
487
|
+
if (width < 0) {
|
|
488
|
+
flags |= FMINUS;
|
|
489
|
+
width = -width;
|
|
490
|
+
}
|
|
491
|
+
p++;
|
|
492
|
+
goto retry;
|
|
493
|
+
|
|
494
|
+
case FMT_PREC:
|
|
495
|
+
if (flags & FPREC0) {
|
|
496
|
+
mrb_raise(mrb, E_ARGUMENT_ERROR, "precision given twice");
|
|
497
|
+
}
|
|
498
|
+
flags |= FPREC|FPREC0;
|
|
499
|
+
|
|
500
|
+
p++;
|
|
501
|
+
if (*p == '*') {
|
|
502
|
+
GETASTER(prec);
|
|
503
|
+
if (prec < 0) { /* ignore negative precision */
|
|
504
|
+
flags &= ~FPREC;
|
|
505
|
+
}
|
|
506
|
+
p++;
|
|
507
|
+
goto retry;
|
|
508
|
+
}
|
|
509
|
+
GETNUM(prec, precision);
|
|
510
|
+
goto retry;
|
|
511
|
+
|
|
512
|
+
case FMT_LITERAL:
|
|
513
|
+
if (spec.subtype == 0) { /* \n or \0 */
|
|
514
|
+
p--;
|
|
515
|
+
}
|
|
516
|
+
if (flags != FNONE) {
|
|
517
|
+
mrb_raise(mrb, E_ARGUMENT_ERROR, "invalid format character - %");
|
|
518
|
+
}
|
|
519
|
+
PUSH("%", 1);
|
|
520
|
+
break;
|
|
521
|
+
|
|
522
|
+
case FMT_CHAR: {
|
|
523
|
+
/* CHARACTER FORMATTING (%c) */
|
|
524
|
+
mrb_value val = GETARG();
|
|
525
|
+
const char *c;
|
|
526
|
+
char cbuf[4]; /* stack buffer for character bytes */
|
|
527
|
+
int clen;
|
|
528
|
+
|
|
529
|
+
if (mrb_integer_p(val)) {
|
|
530
|
+
/* Integer: encode directly to stack buffer (no allocation) */
|
|
531
|
+
mrb_int code = mrb_integer(val);
|
|
532
|
+
#ifdef MRB_UTF8_STRING
|
|
533
|
+
clen = (int)mrb_utf8_to_buf(cbuf, (uint32_t)code);
|
|
534
|
+
if (clen == 0) clen = 1; /* invalid codepoint: write single byte */
|
|
535
|
+
#else
|
|
536
|
+
cbuf[0] = (char)(code & 0xff);
|
|
537
|
+
clen = 1;
|
|
538
|
+
#endif
|
|
539
|
+
c = cbuf;
|
|
540
|
+
}
|
|
541
|
+
else {
|
|
542
|
+
/* String: validate and use directly */
|
|
543
|
+
mrb_value tmp = mrb_check_string_type(mrb, val);
|
|
544
|
+
if (mrb_nil_p(tmp)) {
|
|
545
|
+
mrb_raise(mrb, E_ARGUMENT_ERROR, "invalid character");
|
|
546
|
+
}
|
|
547
|
+
if (RSTRING_LEN(tmp) != 1) {
|
|
548
|
+
mrb_raise(mrb, E_ARGUMENT_ERROR, "%c requires a character");
|
|
549
|
+
}
|
|
550
|
+
c = RSTRING_PTR(tmp);
|
|
551
|
+
clen = (int)RSTRING_LEN(tmp);
|
|
552
|
+
}
|
|
553
|
+
|
|
554
|
+
/* Format and output the character with width/alignment */
|
|
555
|
+
n = clen;
|
|
556
|
+
if (!(flags & FWIDTH)) {
|
|
557
|
+
PUSH(c, n);
|
|
558
|
+
}
|
|
559
|
+
else if ((flags & FMINUS)) {
|
|
560
|
+
PUSH(c, n);
|
|
561
|
+
if (width>0) FILL(' ', width-1);
|
|
562
|
+
}
|
|
563
|
+
else {
|
|
564
|
+
if (width>0) FILL(' ', width-1);
|
|
565
|
+
PUSH(c, n);
|
|
566
|
+
}
|
|
567
|
+
}
|
|
568
|
+
break;
|
|
569
|
+
|
|
570
|
+
case FMT_STRING:
|
|
571
|
+
format_s:
|
|
572
|
+
{
|
|
573
|
+
/* STRING FORMATTING (%s, %p) */
|
|
574
|
+
mrb_value arg = GETARG();
|
|
575
|
+
mrb_int len;
|
|
576
|
+
mrb_int slen;
|
|
577
|
+
|
|
578
|
+
/* Convert to string (with inspect for %p) */
|
|
579
|
+
if (spec.subtype == 1) arg = mrb_inspect(mrb, arg); /* 'p' format */
|
|
580
|
+
str = mrb_obj_as_string(mrb, arg);
|
|
581
|
+
len = RSTRING_LEN(str);
|
|
582
|
+
|
|
583
|
+
/* Update result string length for embedded strings */
|
|
584
|
+
if (RSTRING(result)->flags & MRB_STR_EMBED) {
|
|
585
|
+
mrb_int tmp_n = len;
|
|
586
|
+
RSTRING(result)->flags &= ~MRB_STR_EMBED_LEN_MASK;
|
|
587
|
+
RSTRING(result)->flags |= tmp_n << MRB_STR_EMBED_LEN_SHIFT;
|
|
588
|
+
}
|
|
589
|
+
else {
|
|
590
|
+
RSTRING(result)->as.heap.len = blen;
|
|
591
|
+
}
|
|
592
|
+
|
|
593
|
+
/* Handle precision and width formatting */
|
|
594
|
+
if (flags&(FPREC|FWIDTH)) {
|
|
595
|
+
slen = RSTRING_LEN(str);
|
|
596
|
+
if (slen < 0) {
|
|
597
|
+
mrb_raise(mrb, E_ARGUMENT_ERROR, "invalid mbstring sequence");
|
|
598
|
+
}
|
|
599
|
+
if ((flags&FPREC) && (prec < slen)) {
|
|
600
|
+
char *p = RSTRING_PTR(str) + prec;
|
|
601
|
+
slen = prec;
|
|
602
|
+
len = (mrb_int)(p - RSTRING_PTR(str));
|
|
603
|
+
}
|
|
604
|
+
/* Apply width formatting with padding */
|
|
605
|
+
if ((flags&FWIDTH) && (width > slen)) {
|
|
606
|
+
width -= (int)slen;
|
|
607
|
+
if (!(flags&FMINUS)) {
|
|
608
|
+
FILL(' ', width);
|
|
609
|
+
}
|
|
610
|
+
PUSH(RSTRING_PTR(str), len);
|
|
611
|
+
if (flags&FMINUS) {
|
|
612
|
+
FILL(' ', width);
|
|
613
|
+
}
|
|
614
|
+
break;
|
|
615
|
+
}
|
|
616
|
+
}
|
|
617
|
+
PUSH(RSTRING_PTR(str), len);
|
|
618
|
+
mrb_gc_arena_restore(mrb, ai);
|
|
619
|
+
}
|
|
620
|
+
break;
|
|
621
|
+
|
|
622
|
+
case FMT_INTEGER: {
|
|
623
|
+
/* INTEGER FORMATTING (%d, %i, %o, %x, %X, %b, %B, %u) */
|
|
624
|
+
mrb_value val = GETARG();
|
|
625
|
+
char nbuf[69], *s;
|
|
626
|
+
const char *prefix = NULL;
|
|
627
|
+
int sign = 0, dots = 0;
|
|
628
|
+
char sc = 0;
|
|
629
|
+
char fc = 0;
|
|
630
|
+
mrb_int v = 0;
|
|
631
|
+
int base;
|
|
632
|
+
int len;
|
|
633
|
+
|
|
634
|
+
/* Determine base and signedness from lookup table */
|
|
635
|
+
base = spec.base;
|
|
636
|
+
if (spec.subtype == 1) { /* signed formats: d, i, u */
|
|
637
|
+
sign = 1;
|
|
638
|
+
}
|
|
639
|
+
|
|
640
|
+
/* Set prefix for alternative format (#) */
|
|
641
|
+
if (flags & FSHARP) {
|
|
642
|
+
switch (base) {
|
|
643
|
+
case 8: prefix = "0"; break;
|
|
644
|
+
case 16: prefix = (spec.subtype == 1) ? "0X" : "0x"; break;
|
|
645
|
+
case 2: prefix = (spec.subtype == 1) ? "0B" : "0b"; break;
|
|
646
|
+
default: break;
|
|
647
|
+
}
|
|
648
|
+
}
|
|
649
|
+
|
|
650
|
+
/* Convert value to integer and format as string */
|
|
651
|
+
bin_retry:
|
|
652
|
+
switch (mrb_type(val)) {
|
|
653
|
+
#ifndef MRB_NO_FLOAT
|
|
654
|
+
case MRB_TT_FLOAT:
|
|
655
|
+
val = mrb_float_to_integer(mrb, val);
|
|
656
|
+
goto bin_retry;
|
|
657
|
+
#endif
|
|
658
|
+
#ifdef MRB_USE_BIGINT
|
|
659
|
+
case MRB_TT_BIGINT:
|
|
660
|
+
{
|
|
661
|
+
mrb_int n = (mrb_bint_cmp(mrb, val, mrb_fixnum_value(0)));
|
|
662
|
+
mrb_bool need_dots = ((flags & FPLUS) == 0) && (base == 16 || base == 8 || base == 2) && n < 0;
|
|
663
|
+
if (need_dots) {
|
|
664
|
+
val = mrb_bint_2comp(mrb, val);
|
|
665
|
+
dots = 1;
|
|
666
|
+
v = -1;
|
|
667
|
+
}
|
|
668
|
+
mrb_value str = mrb_bint_to_s(mrb, val, base);
|
|
669
|
+
s = RSTRING_PTR(str);
|
|
670
|
+
len = (int)RSTRING_LEN(str);
|
|
671
|
+
}
|
|
672
|
+
goto str_skip;
|
|
673
|
+
#endif
|
|
674
|
+
case MRB_TT_STRING:
|
|
675
|
+
val = mrb_str_to_integer(mrb, val, 0, TRUE);
|
|
676
|
+
goto bin_retry;
|
|
677
|
+
case MRB_TT_INTEGER:
|
|
678
|
+
v = mrb_integer(val);
|
|
679
|
+
break;
|
|
680
|
+
default:
|
|
681
|
+
v = mrb_as_int(mrb, val);
|
|
682
|
+
break;
|
|
683
|
+
}
|
|
684
|
+
|
|
685
|
+
if (sign) {
|
|
686
|
+
if (v >= 0) {
|
|
687
|
+
if (flags & FPLUS) {
|
|
688
|
+
sc = '+';
|
|
689
|
+
width--;
|
|
690
|
+
}
|
|
691
|
+
else if (flags & FSPACE) {
|
|
692
|
+
sc = ' ';
|
|
693
|
+
width--;
|
|
694
|
+
}
|
|
695
|
+
}
|
|
696
|
+
else {
|
|
697
|
+
sc = '-';
|
|
698
|
+
width--;
|
|
699
|
+
}
|
|
700
|
+
s = mrb_int_to_cstr(nbuf, sizeof(nbuf), v, base);
|
|
701
|
+
if (v < 0) s++; /* skip minus sign */
|
|
702
|
+
}
|
|
703
|
+
else {
|
|
704
|
+
/* print as unsigned */
|
|
705
|
+
s = mrb_uint_to_cstr(nbuf, sizeof(nbuf), v, base);
|
|
706
|
+
if (v < 0) {
|
|
707
|
+
dots = 1;
|
|
708
|
+
}
|
|
709
|
+
}
|
|
710
|
+
|
|
711
|
+
{
|
|
712
|
+
size_t size = strlen(s);
|
|
713
|
+
/* PARANOID: assert(size <= MRB_INT_MAX) */
|
|
714
|
+
len = (int)size;
|
|
715
|
+
}
|
|
716
|
+
|
|
717
|
+
#ifdef MRB_USE_BIGINT
|
|
718
|
+
str_skip:
|
|
719
|
+
#endif
|
|
720
|
+
switch (base) {
|
|
721
|
+
case 16:
|
|
722
|
+
fc = 'f'; break;
|
|
723
|
+
case 8:
|
|
724
|
+
fc = '7'; break;
|
|
725
|
+
case 2:
|
|
726
|
+
fc = '1'; break;
|
|
727
|
+
}
|
|
728
|
+
|
|
729
|
+
if (dots) {
|
|
730
|
+
if (base == 8 && (*s == '1' || *s == '3')) {
|
|
731
|
+
s++; len--;
|
|
732
|
+
}
|
|
733
|
+
while (*s == fc) {
|
|
734
|
+
s++; len--;
|
|
735
|
+
}
|
|
736
|
+
}
|
|
737
|
+
/* Convert to uppercase for X, B formats */
|
|
738
|
+
if (spec.subtype == 1) { /* uppercase formats: X, B */
|
|
739
|
+
char *pp = s;
|
|
740
|
+
int c;
|
|
741
|
+
while ((c = (int)(unsigned char)*pp) != 0) {
|
|
742
|
+
*pp = toupper(c);
|
|
743
|
+
pp++;
|
|
744
|
+
}
|
|
745
|
+
if (base == 16) {
|
|
746
|
+
fc = 'F';
|
|
747
|
+
}
|
|
748
|
+
}
|
|
749
|
+
|
|
750
|
+
if (prefix && !prefix[1]) { /* octal */
|
|
751
|
+
if (dots) {
|
|
752
|
+
prefix = NULL;
|
|
753
|
+
}
|
|
754
|
+
else if (len == 1 && *s == '0') {
|
|
755
|
+
len = 0;
|
|
756
|
+
if (flags & FPREC) prec--;
|
|
757
|
+
}
|
|
758
|
+
else if ((flags & FPREC) && (prec > len)) {
|
|
759
|
+
prefix = NULL;
|
|
760
|
+
}
|
|
761
|
+
}
|
|
762
|
+
else if (len == 1 && *s == '0') {
|
|
763
|
+
prefix = NULL;
|
|
764
|
+
}
|
|
765
|
+
|
|
766
|
+
if (prefix) {
|
|
767
|
+
size_t size = strlen(prefix);
|
|
768
|
+
/* PARANOID: assert(size <= MRB_INT_MAX).
|
|
769
|
+
* this check is absolutely paranoid. */
|
|
770
|
+
width -= (int)size;
|
|
771
|
+
}
|
|
772
|
+
|
|
773
|
+
if ((flags & (FZERO|FMINUS|FPREC)) == FZERO) {
|
|
774
|
+
prec = width;
|
|
775
|
+
width = 0;
|
|
776
|
+
}
|
|
777
|
+
else {
|
|
778
|
+
if (prec < len) {
|
|
779
|
+
if (!prefix && prec == 0 && len == 1 && *s == '0') len = 0;
|
|
780
|
+
prec = len;
|
|
781
|
+
}
|
|
782
|
+
width -= prec;
|
|
783
|
+
}
|
|
784
|
+
|
|
785
|
+
if (!(flags&FMINUS) && width > 0) {
|
|
786
|
+
FILL(' ', width);
|
|
787
|
+
width = 0;
|
|
788
|
+
}
|
|
789
|
+
|
|
790
|
+
if (sc) PUSH(&sc, 1);
|
|
791
|
+
|
|
792
|
+
if (prefix) {
|
|
793
|
+
int plen = (int)strlen(prefix);
|
|
794
|
+
PUSH(prefix, plen);
|
|
795
|
+
}
|
|
796
|
+
if (dots) {
|
|
797
|
+
prec -= 2;
|
|
798
|
+
width -= 2;
|
|
799
|
+
PUSH("..", 2);
|
|
800
|
+
if (*s != fc) {
|
|
801
|
+
FILL(fc, 1);
|
|
802
|
+
prec--; width--;
|
|
803
|
+
}
|
|
804
|
+
}
|
|
805
|
+
|
|
806
|
+
if (prec > len) {
|
|
807
|
+
CHECK(prec - len);
|
|
808
|
+
if ((flags & (FMINUS|FPREC)) != FMINUS) {
|
|
809
|
+
char c = '0';
|
|
810
|
+
FILL(c, prec - len);
|
|
811
|
+
}
|
|
812
|
+
else if (v < 0) {
|
|
813
|
+
FILL(fc, prec - len);
|
|
814
|
+
}
|
|
815
|
+
}
|
|
816
|
+
PUSH(s, len);
|
|
817
|
+
if (width > 0) {
|
|
818
|
+
FILL(' ', width);
|
|
819
|
+
}
|
|
820
|
+
}
|
|
821
|
+
break;
|
|
822
|
+
|
|
823
|
+
case FMT_FLOAT: {
|
|
824
|
+
/* FLOAT FORMATTING (%f, %g, %G, %e, %E) */
|
|
825
|
+
#ifdef MRB_NO_FLOAT
|
|
826
|
+
mrb_raisef(mrb, E_ARGUMENT_ERROR, "%%%c not supported with MRB_NO_FLOAT defined", spec.subtype);
|
|
827
|
+
#else
|
|
828
|
+
mrb_value val = GETARG();
|
|
829
|
+
double fval;
|
|
830
|
+
mrb_int need = 6;
|
|
831
|
+
|
|
832
|
+
fval = mrb_as_float(mrb, val);
|
|
833
|
+
if (!isfinite(fval)) {
|
|
834
|
+
const char *expr;
|
|
835
|
+
const int elen = 3;
|
|
836
|
+
char sign = '\0';
|
|
837
|
+
|
|
838
|
+
if (isnan(fval)) {
|
|
839
|
+
expr = "NaN";
|
|
840
|
+
}
|
|
841
|
+
else {
|
|
842
|
+
expr = "Inf";
|
|
843
|
+
}
|
|
844
|
+
need = elen;
|
|
845
|
+
if (!isnan(fval) && fval < 0.0)
|
|
846
|
+
sign = '-';
|
|
847
|
+
else if (flags & (FPLUS|FSPACE))
|
|
848
|
+
sign = (flags & FPLUS) ? '+' : ' ';
|
|
849
|
+
if (sign)
|
|
850
|
+
need++;
|
|
851
|
+
if ((flags & FWIDTH) && need < width)
|
|
852
|
+
need = width;
|
|
853
|
+
|
|
854
|
+
if (need < 0) {
|
|
855
|
+
mrb_raise(mrb, E_ARGUMENT_ERROR, "width too big");
|
|
856
|
+
}
|
|
857
|
+
FILL(' ', need);
|
|
858
|
+
if (flags & FMINUS) {
|
|
859
|
+
if (sign)
|
|
860
|
+
buf[blen - need--] = sign;
|
|
861
|
+
memcpy(&buf[blen - need], expr, elen);
|
|
862
|
+
}
|
|
863
|
+
else {
|
|
864
|
+
if (sign)
|
|
865
|
+
buf[blen - elen - 1] = sign;
|
|
866
|
+
memcpy(&buf[blen - elen], expr, (size_t)elen);
|
|
867
|
+
}
|
|
868
|
+
break;
|
|
869
|
+
}
|
|
870
|
+
|
|
871
|
+
need = 0;
|
|
872
|
+
if (*p != 'e' && *p != 'E') {
|
|
873
|
+
int i;
|
|
874
|
+
frexp(fval, &i);
|
|
875
|
+
if (i > 0)
|
|
876
|
+
need = BIT_DIGITS(i);
|
|
877
|
+
}
|
|
878
|
+
if (need > MRB_INT_MAX - ((flags&FPREC) ? prec : 6)) {
|
|
879
|
+
too_big_width_prec:
|
|
880
|
+
mrb_raise(mrb, E_ARGUMENT_ERROR,
|
|
881
|
+
(width > prec ? "width too big" : "prec too big"));
|
|
882
|
+
}
|
|
883
|
+
need += (flags&FPREC) ? prec : 6;
|
|
884
|
+
if ((flags&FWIDTH) && need < width)
|
|
885
|
+
need = width;
|
|
886
|
+
if ((mrb_int)need > MRB_INT_MAX - 20) {
|
|
887
|
+
goto too_big_width_prec;
|
|
888
|
+
}
|
|
889
|
+
need += 20;
|
|
890
|
+
|
|
891
|
+
CHECK(need);
|
|
892
|
+
n = fmt_float(&buf[blen], need, spec.subtype, flags, width, prec, fval);
|
|
893
|
+
if (n < 0 || n >= need) {
|
|
894
|
+
mrb_raise(mrb, E_RUNTIME_ERROR, "formatting error");
|
|
895
|
+
}
|
|
896
|
+
blen += n;
|
|
897
|
+
#endif
|
|
898
|
+
}
|
|
899
|
+
break;
|
|
900
|
+
}
|
|
901
|
+
}
|
|
902
|
+
}
|
|
903
|
+
|
|
904
|
+
sprint_exit:
|
|
905
|
+
mrb_str_resize(mrb, result, blen);
|
|
906
|
+
|
|
907
|
+
return result;
|
|
908
|
+
}
|
|
909
|
+
|
|
910
|
+
/*
|
|
911
|
+
* call-seq:
|
|
912
|
+
* format(format_string [, arguments...] ) -> string
|
|
913
|
+
* sprintf(format_string [, arguments...] ) -> string
|
|
914
|
+
*
|
|
915
|
+
* Returns the string resulting from applying *format_string* to
|
|
916
|
+
* any additional arguments. Within the format string, any characters
|
|
917
|
+
* other than format sequences are copied to the result.
|
|
918
|
+
*
|
|
919
|
+
* The syntax of a format sequence is follows.
|
|
920
|
+
*
|
|
921
|
+
* %[flags][width][.precision]type
|
|
922
|
+
*
|
|
923
|
+
* A format
|
|
924
|
+
* sequence consists of a percent sign, followed by optional flags,
|
|
925
|
+
* width, and precision indicators, then terminated with a field type
|
|
926
|
+
* character. The field type controls how the corresponding
|
|
927
|
+
* `sprintf` argument is to be interpreted, while the flags
|
|
928
|
+
* modify that interpretation.
|
|
929
|
+
*
|
|
930
|
+
* The field type characters are:
|
|
931
|
+
*
|
|
932
|
+
* Field | Integer Format
|
|
933
|
+
* ------+--------------------------------------------------------------
|
|
934
|
+
* b | Convert argument as a binary number.
|
|
935
|
+
* | Negative numbers will be displayed as a two's complement
|
|
936
|
+
* | prefixed with '..1'.
|
|
937
|
+
* B | Equivalent to 'b', but uses an uppercase 0B for prefix
|
|
938
|
+
* | in the alternative format by #.
|
|
939
|
+
* d | Convert argument as a decimal number.
|
|
940
|
+
* i | Identical to 'd'.
|
|
941
|
+
* o | Convert argument as an octal number.
|
|
942
|
+
* | Negative numbers will be displayed as a two's complement
|
|
943
|
+
* | prefixed with '..7'.
|
|
944
|
+
* u | Identical to 'd'.
|
|
945
|
+
* x | Convert argument as a hexadecimal number.
|
|
946
|
+
* | Negative numbers will be displayed as a two's complement
|
|
947
|
+
* | prefixed with '..f' (representing an infinite string of
|
|
948
|
+
* | leading 'ff's).
|
|
949
|
+
* X | Equivalent to 'x', but uses uppercase letters.
|
|
950
|
+
*
|
|
951
|
+
* Field | Float Format
|
|
952
|
+
* ------+--------------------------------------------------------------
|
|
953
|
+
* e | Convert floating-point argument into exponential notation
|
|
954
|
+
* | with one digit before the decimal point as [-]d.dddddde[+-]dd.
|
|
955
|
+
* | The precision specifies the number of digits after the decimal
|
|
956
|
+
* | point (defaulting to six).
|
|
957
|
+
* E | Equivalent to 'e', but uses an uppercase E to indicate
|
|
958
|
+
* | the exponent.
|
|
959
|
+
* f | Convert floating-point argument as [-]ddd.dddddd,
|
|
960
|
+
* | where the precision specifies the number of digits after
|
|
961
|
+
* | the decimal point.
|
|
962
|
+
* g | Convert a floating-point number using exponential form
|
|
963
|
+
* | if the exponent is less than -4 or greater than or
|
|
964
|
+
* | equal to the precision, or in dd.dddd form otherwise.
|
|
965
|
+
* | The precision specifies the number of significant digits.
|
|
966
|
+
* G | Equivalent to 'g', but use an uppercase 'E' in exponent form.
|
|
967
|
+
*
|
|
968
|
+
* Field | Other Format
|
|
969
|
+
* ------+--------------------------------------------------------------
|
|
970
|
+
* c | Argument is the numeric code for a single character or
|
|
971
|
+
* | a single character string itself.
|
|
972
|
+
* p | The valuing of argument.inspect.
|
|
973
|
+
* s | Argument is a string to be substituted. If the format
|
|
974
|
+
* | sequence contains a precision, at most that many characters
|
|
975
|
+
* | will be copied.
|
|
976
|
+
* % | A percent sign itself will be displayed. No argument taken.
|
|
977
|
+
*
|
|
978
|
+
* The flags modifies the behavior of the formats.
|
|
979
|
+
* The flag characters are:
|
|
980
|
+
*
|
|
981
|
+
* Flag | Applies to | Meaning
|
|
982
|
+
* ---------+---------------+-----------------------------------------
|
|
983
|
+
* space | bBdiouxX | Leave a space at the start of
|
|
984
|
+
* | aAeEfgG | non-negative numbers.
|
|
985
|
+
* | (numeric fmt) | For 'o', 'x', 'X', 'b' and 'B', use
|
|
986
|
+
* | | a minus sign with absolute value for
|
|
987
|
+
* | | negative values.
|
|
988
|
+
* ---------+---------------+-----------------------------------------
|
|
989
|
+
* (digit)$ | all | Specifies the absolute argument number
|
|
990
|
+
* | | for this field. Absolute and relative
|
|
991
|
+
* | | argument numbers cannot be mixed in a
|
|
992
|
+
* | | sprintf string.
|
|
993
|
+
* ---------+---------------+-----------------------------------------
|
|
994
|
+
* # | bBoxX | Use an alternative format.
|
|
995
|
+
* | aAeEfgG | For the conversions 'o', increase the precision
|
|
996
|
+
* | | until the first digit will be '0' if
|
|
997
|
+
* | | it is not formatted as complements.
|
|
998
|
+
* | | For the conversions 'x', 'X', 'b' and 'B'
|
|
999
|
+
* | | on non-zero, prefix the result with "0x",
|
|
1000
|
+
* | | "0X", "0b" and "0B", respectively.
|
|
1001
|
+
* | | For 'e', 'E', 'f', 'g', and 'G',
|
|
1002
|
+
* | | force a decimal point to be added,
|
|
1003
|
+
* | | even if no digits follow.
|
|
1004
|
+
* | | For 'g' and 'G', do not remove trailing zeros.
|
|
1005
|
+
* ---------+---------------+-----------------------------------------
|
|
1006
|
+
* + | bBdiouxX | Add a leading plus sign to non-negative
|
|
1007
|
+
* | aAeEfgG | numbers.
|
|
1008
|
+
* | (numeric fmt) | For 'o', 'x', 'X', 'b' and 'B', use
|
|
1009
|
+
* | | a minus sign with absolute value for
|
|
1010
|
+
* | | negative values.
|
|
1011
|
+
* ---------+---------------+-----------------------------------------
|
|
1012
|
+
* - | all | Left-justify the result of this conversion.
|
|
1013
|
+
* ---------+---------------+-----------------------------------------
|
|
1014
|
+
* 0 (zero) | bBdiouxX | Pad with zeros, not spaces.
|
|
1015
|
+
* | aAeEfgG | For 'o', 'x', 'X', 'b' and 'B', radix-1
|
|
1016
|
+
* | (numeric fmt) | is used for negative numbers formatted as
|
|
1017
|
+
* | | complements.
|
|
1018
|
+
* ---------+---------------+-----------------------------------------
|
|
1019
|
+
* * | all | Use the next argument as the field width.
|
|
1020
|
+
* | | If negative, left-justify the result. If the
|
|
1021
|
+
* | | asterisk is followed by a number and a dollar
|
|
1022
|
+
* | | sign, use the indicated argument as the width.
|
|
1023
|
+
*
|
|
1024
|
+
* Examples of flags:
|
|
1025
|
+
*
|
|
1026
|
+
* # '+' and space flag specifies the sign of non-negative numbers.
|
|
1027
|
+
* sprintf("%d", 123) #=> "123"
|
|
1028
|
+
* sprintf("%+d", 123) #=> "+123"
|
|
1029
|
+
* sprintf("% d", 123) #=> " 123"
|
|
1030
|
+
*
|
|
1031
|
+
* # '#' flag for 'o' increases number of digits to show '0'.
|
|
1032
|
+
* # '+' and space flag changes format of negative numbers.
|
|
1033
|
+
* sprintf("%o", 123) #=> "173"
|
|
1034
|
+
* sprintf("%#o", 123) #=> "0173"
|
|
1035
|
+
* sprintf("%+o", -123) #=> "-173"
|
|
1036
|
+
* sprintf("%o", -123) #=> "..7605"
|
|
1037
|
+
* sprintf("%#o", -123) #=> "..7605"
|
|
1038
|
+
*
|
|
1039
|
+
* # '#' flag for 'x' add a prefix '0x' for non-zero numbers.
|
|
1040
|
+
* # '+' and space flag disables complements for negative numbers.
|
|
1041
|
+
* sprintf("%x", 123) #=> "7b"
|
|
1042
|
+
* sprintf("%#x", 123) #=> "0x7b"
|
|
1043
|
+
* sprintf("%+x", -123) #=> "-7b"
|
|
1044
|
+
* sprintf("%x", -123) #=> "..f85"
|
|
1045
|
+
* sprintf("%#x", -123) #=> "0x..f85"
|
|
1046
|
+
* sprintf("%#x", 0) #=> "0"
|
|
1047
|
+
*
|
|
1048
|
+
* # '#' for 'X' uses the prefix '0X'.
|
|
1049
|
+
* sprintf("%X", 123) #=> "7B"
|
|
1050
|
+
* sprintf("%#X", 123) #=> "0X7B"
|
|
1051
|
+
*
|
|
1052
|
+
* # '#' flag for 'b' add a prefix '0b' for non-zero numbers.
|
|
1053
|
+
* # '+' and space flag disables complements for negative numbers.
|
|
1054
|
+
* sprintf("%b", 123) #=> "1111011"
|
|
1055
|
+
* sprintf("%#b", 123) #=> "0b1111011"
|
|
1056
|
+
* sprintf("%+b", -123) #=> "-1111011"
|
|
1057
|
+
* sprintf("%b", -123) #=> "..10000101"
|
|
1058
|
+
* sprintf("%#b", -123) #=> "0b..10000101"
|
|
1059
|
+
* sprintf("%#b", 0) #=> "0"
|
|
1060
|
+
*
|
|
1061
|
+
* # '#' for 'B' uses the prefix '0B'.
|
|
1062
|
+
* sprintf("%B", 123) #=> "1111011"
|
|
1063
|
+
* sprintf("%#B", 123) #=> "0B1111011"
|
|
1064
|
+
*
|
|
1065
|
+
* # '#' for 'e' forces to show the decimal point.
|
|
1066
|
+
* sprintf("%.0e", 1) #=> "1e+00"
|
|
1067
|
+
* sprintf("%#.0e", 1) #=> "1.e+00"
|
|
1068
|
+
*
|
|
1069
|
+
* # '#' for 'f' forces to show the decimal point.
|
|
1070
|
+
* sprintf("%.0f", 1234) #=> "1234"
|
|
1071
|
+
* sprintf("%#.0f", 1234) #=> "1234."
|
|
1072
|
+
*
|
|
1073
|
+
* # '#' for 'g' forces to show the decimal point.
|
|
1074
|
+
* # It also disables stripping lowest zeros.
|
|
1075
|
+
* sprintf("%g", 123.4) #=> "123.4"
|
|
1076
|
+
* sprintf("%#g", 123.4) #=> "123.400"
|
|
1077
|
+
* sprintf("%g", 123456) #=> "123456"
|
|
1078
|
+
* sprintf("%#g", 123456) #=> "123456."
|
|
1079
|
+
*
|
|
1080
|
+
* The field width is an optional integer, followed optionally by a
|
|
1081
|
+
* period and a precision. The width specifies the minimum number of
|
|
1082
|
+
* characters that will be written to the result for this field.
|
|
1083
|
+
*
|
|
1084
|
+
* Examples of width:
|
|
1085
|
+
*
|
|
1086
|
+
* # padding is done by spaces, width=20
|
|
1087
|
+
* # 0 or radix-1. <------------------>
|
|
1088
|
+
* sprintf("%20d", 123) #=> " 123"
|
|
1089
|
+
* sprintf("%+20d", 123) #=> " +123"
|
|
1090
|
+
* sprintf("%020d", 123) #=> "00000000000000000123"
|
|
1091
|
+
* sprintf("%+020d", 123) #=> "+0000000000000000123"
|
|
1092
|
+
* sprintf("% 020d", 123) #=> " 0000000000000000123"
|
|
1093
|
+
* sprintf("%-20d", 123) #=> "123 "
|
|
1094
|
+
* sprintf("%-+20d", 123) #=> "+123 "
|
|
1095
|
+
* sprintf("%- 20d", 123) #=> " 123 "
|
|
1096
|
+
* sprintf("%020x", -123) #=> "..ffffffffffffffff85"
|
|
1097
|
+
*
|
|
1098
|
+
* For
|
|
1099
|
+
* numeric fields, the precision controls the number of decimal places
|
|
1100
|
+
* displayed. For string fields, the precision determines the maximum
|
|
1101
|
+
* number of characters to be copied from the string. (Thus, the format
|
|
1102
|
+
* sequence `%10.10s` will always contribute exactly ten
|
|
1103
|
+
* characters to the result.)
|
|
1104
|
+
*
|
|
1105
|
+
* Examples of precisions:
|
|
1106
|
+
*
|
|
1107
|
+
* # precision for 'd', 'o', 'x' and 'b' is
|
|
1108
|
+
* # minimum number of digits <------>
|
|
1109
|
+
* sprintf("%20.8d", 123) #=> " 00000123"
|
|
1110
|
+
* sprintf("%20.8o", 123) #=> " 00000173"
|
|
1111
|
+
* sprintf("%20.8x", 123) #=> " 0000007b"
|
|
1112
|
+
* sprintf("%20.8b", 123) #=> " 01111011"
|
|
1113
|
+
* sprintf("%20.8d", -123) #=> " -00000123"
|
|
1114
|
+
* sprintf("%20.8o", -123) #=> " ..777605"
|
|
1115
|
+
* sprintf("%20.8x", -123) #=> " ..ffff85"
|
|
1116
|
+
* sprintf("%20.8b", -11) #=> " ..110101"
|
|
1117
|
+
*
|
|
1118
|
+
* # "0x" and "0b" for '#x' and '#b' is not counted for
|
|
1119
|
+
* # precision but "0" for '#o' is counted. <------>
|
|
1120
|
+
* sprintf("%#20.8d", 123) #=> " 00000123"
|
|
1121
|
+
* sprintf("%#20.8o", 123) #=> " 00000173"
|
|
1122
|
+
* sprintf("%#20.8x", 123) #=> " 0x0000007b"
|
|
1123
|
+
* sprintf("%#20.8b", 123) #=> " 0b01111011"
|
|
1124
|
+
* sprintf("%#20.8d", -123) #=> " -00000123"
|
|
1125
|
+
* sprintf("%#20.8o", -123) #=> " ..777605"
|
|
1126
|
+
* sprintf("%#20.8x", -123) #=> " 0x..ffff85"
|
|
1127
|
+
* sprintf("%#20.8b", -11) #=> " 0b..110101"
|
|
1128
|
+
*
|
|
1129
|
+
* # precision for 'e' is number of
|
|
1130
|
+
* # digits after the decimal point <------>
|
|
1131
|
+
* sprintf("%20.8e", 1234.56789) #=> " 1.23456789e+03"
|
|
1132
|
+
*
|
|
1133
|
+
* # precision for 'f' is number of
|
|
1134
|
+
* # digits after the decimal point <------>
|
|
1135
|
+
* sprintf("%20.8f", 1234.56789) #=> " 1234.56789000"
|
|
1136
|
+
*
|
|
1137
|
+
* # precision for 'g' is number of
|
|
1138
|
+
* # significant digits <------->
|
|
1139
|
+
* sprintf("%20.8g", 1234.56789) #=> " 1234.5679"
|
|
1140
|
+
*
|
|
1141
|
+
* # <------->
|
|
1142
|
+
* sprintf("%20.8g", 123456789) #=> " 1.2345679e+08"
|
|
1143
|
+
*
|
|
1144
|
+
* # precision for 's' is
|
|
1145
|
+
* # maximum number of characters <------>
|
|
1146
|
+
* sprintf("%20.8s", "string test") #=> " string t"
|
|
1147
|
+
*
|
|
1148
|
+
* Examples:
|
|
1149
|
+
*
|
|
1150
|
+
* sprintf("%d %04x", 123, 123) #=> "123 007b"
|
|
1151
|
+
* sprintf("%08b '%4s'", 123, 123) #=> "01111011 ' 123'"
|
|
1152
|
+
* sprintf("%1$*2$s %2$d %1$s", "hello", 8) #=> " hello 8 hello"
|
|
1153
|
+
* sprintf("%1$*2$s %2$d", "hello", -8) #=> "hello -8"
|
|
1154
|
+
* sprintf("%+g:% g:%-g", 1.23, 1.23, 1.23) #=> "+1.23: 1.23:1.23"
|
|
1155
|
+
* sprintf("%u", -123) #=> "-123"
|
|
1156
|
+
*
|
|
1157
|
+
* For more complex formatting, Ruby supports a reference by name.
|
|
1158
|
+
* %<name>s style uses format style, but %{name} style doesn't.
|
|
1159
|
+
*
|
|
1160
|
+
* Examples:
|
|
1161
|
+
* sprintf("%<foo>d : %<bar>f", { :foo => 1, :bar => 2 })
|
|
1162
|
+
* #=> 1 : 2.000000
|
|
1163
|
+
* sprintf("%{foo}f", { :foo => 1 })
|
|
1164
|
+
* # => "1f"
|
|
1165
|
+
*/
|
|
1166
|
+
|
|
1167
|
+
static mrb_value
|
|
1168
|
+
mrb_f_sprintf(mrb_state *mrb, mrb_value obj)
|
|
1169
|
+
{
|
|
1170
|
+
mrb_int argc;
|
|
1171
|
+
const mrb_value *argv;
|
|
1172
|
+
|
|
1173
|
+
mrb_get_args(mrb, "*", &argv, &argc);
|
|
1174
|
+
|
|
1175
|
+
if (argc <= 0) {
|
|
1176
|
+
mrb_raise(mrb, E_ARGUMENT_ERROR, "too few arguments");
|
|
1177
|
+
return mrb_nil_value();
|
|
1178
|
+
}
|
|
1179
|
+
else {
|
|
1180
|
+
return mrb_str_format(mrb, argc - 1, argv + 1, argv[0]);
|
|
1181
|
+
}
|
|
1182
|
+
}
|
|
1183
|
+
|
|
1184
|
+
void
|
|
1185
|
+
mrb_mruby_sprintf_gem_init(mrb_state *mrb)
|
|
1186
|
+
{
|
|
1187
|
+
struct RClass *krn = mrb->kernel_module;
|
|
1188
|
+
mrb_define_module_function_id(mrb, krn, MRB_SYM(sprintf), mrb_f_sprintf, MRB_ARGS_ANY());
|
|
1189
|
+
mrb_define_module_function_id(mrb, krn, MRB_SYM(format), mrb_f_sprintf, MRB_ARGS_ANY());
|
|
1190
|
+
}
|
|
1191
|
+
|
|
1192
|
+
void
|
|
1193
|
+
mrb_mruby_sprintf_gem_final(mrb_state *mrb)
|
|
1194
|
+
{
|
|
1195
|
+
}
|