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.
Files changed (739) hide show
  1. checksums.yaml +7 -0
  2. data/README.md +182 -0
  3. data/Rakefile +30 -0
  4. data/ext/enclave/enclave.c +390 -0
  5. data/ext/enclave/extconf.rb +33 -0
  6. data/ext/enclave/mruby/Makefile +63 -0
  7. data/ext/enclave/mruby/Rakefile +102 -0
  8. data/ext/enclave/mruby/benchmark/bm_ao_render.rb +309 -0
  9. data/ext/enclave/mruby/benchmark/bm_app_lc_fizzbuzz.rb +51 -0
  10. data/ext/enclave/mruby/benchmark/bm_fib.rb +6 -0
  11. data/ext/enclave/mruby/benchmark/bm_mandel_term.rb +34 -0
  12. data/ext/enclave/mruby/benchmark/bm_so_lists.rb +49 -0
  13. data/ext/enclave/mruby/benchmark/bm_so_mandelbrot.rb +65 -0
  14. data/ext/enclave/mruby/benchmark/vm_dispatch_bench.c +197 -0
  15. data/ext/enclave/mruby/benchmark/vm_optimization_bench.rb +513 -0
  16. data/ext/enclave/mruby/build/host/include/mrbconf.h +230 -0
  17. data/ext/enclave/mruby/build/host/include/mruby/array.h +303 -0
  18. data/ext/enclave/mruby/build/host/include/mruby/boxing_nan.h +169 -0
  19. data/ext/enclave/mruby/build/host/include/mruby/boxing_no.h +59 -0
  20. data/ext/enclave/mruby/build/host/include/mruby/boxing_word.h +248 -0
  21. data/ext/enclave/mruby/build/host/include/mruby/class.h +157 -0
  22. data/ext/enclave/mruby/build/host/include/mruby/common.h +127 -0
  23. data/ext/enclave/mruby/build/host/include/mruby/compile.h +187 -0
  24. data/ext/enclave/mruby/build/host/include/mruby/data.h +76 -0
  25. data/ext/enclave/mruby/build/host/include/mruby/debug.h +75 -0
  26. data/ext/enclave/mruby/build/host/include/mruby/dump.h +159 -0
  27. data/ext/enclave/mruby/build/host/include/mruby/endian.h +44 -0
  28. data/ext/enclave/mruby/build/host/include/mruby/error.h +168 -0
  29. data/ext/enclave/mruby/build/host/include/mruby/gc.h +77 -0
  30. data/ext/enclave/mruby/build/host/include/mruby/hash.h +234 -0
  31. data/ext/enclave/mruby/build/host/include/mruby/internal.h +278 -0
  32. data/ext/enclave/mruby/build/host/include/mruby/irep.h +142 -0
  33. data/ext/enclave/mruby/build/host/include/mruby/istruct.h +50 -0
  34. data/ext/enclave/mruby/build/host/include/mruby/khash.h +455 -0
  35. data/ext/enclave/mruby/build/host/include/mruby/mempool.h +19 -0
  36. data/ext/enclave/mruby/build/host/include/mruby/numeric.h +174 -0
  37. data/ext/enclave/mruby/build/host/include/mruby/object.h +44 -0
  38. data/ext/enclave/mruby/build/host/include/mruby/opcode.h +73 -0
  39. data/ext/enclave/mruby/build/host/include/mruby/ops.h +133 -0
  40. data/ext/enclave/mruby/build/host/include/mruby/presym/id.h +895 -0
  41. data/ext/enclave/mruby/build/host/include/mruby/presym/scanning.h +82 -0
  42. data/ext/enclave/mruby/build/host/include/mruby/presym/table.h +1787 -0
  43. data/ext/enclave/mruby/build/host/include/mruby/presym.h +65 -0
  44. data/ext/enclave/mruby/build/host/include/mruby/proc.h +184 -0
  45. data/ext/enclave/mruby/build/host/include/mruby/range.h +77 -0
  46. data/ext/enclave/mruby/build/host/include/mruby/re.h +16 -0
  47. data/ext/enclave/mruby/build/host/include/mruby/string.h +428 -0
  48. data/ext/enclave/mruby/build/host/include/mruby/throw.h +81 -0
  49. data/ext/enclave/mruby/build/host/include/mruby/value.h +471 -0
  50. data/ext/enclave/mruby/build/host/include/mruby/variable.h +108 -0
  51. data/ext/enclave/mruby/build/host/include/mruby/version.h +143 -0
  52. data/ext/enclave/mruby/build/host/include/mruby.h +1632 -0
  53. data/ext/enclave/mruby/build/host/mrbc/include/mruby/presym/id.h +281 -0
  54. data/ext/enclave/mruby/build/host/mrbc/include/mruby/presym/table.h +559 -0
  55. data/ext/enclave/mruby/build/host/mrbgems/gem_init.c +164 -0
  56. data/ext/enclave/mruby/build/host/mrbgems/mruby-array-ext/gem_init.c +650 -0
  57. data/ext/enclave/mruby/build/host/mrbgems/mruby-binding/gem_init.c +21 -0
  58. data/ext/enclave/mruby/build/host/mrbgems/mruby-catch/gem_init.c +86 -0
  59. data/ext/enclave/mruby/build/host/mrbgems/mruby-class-ext/gem_init.c +21 -0
  60. data/ext/enclave/mruby/build/host/mrbgems/mruby-compar-ext/gem_init.c +99 -0
  61. data/ext/enclave/mruby/build/host/mrbgems/mruby-complex/gem_init.c +362 -0
  62. data/ext/enclave/mruby/build/host/mrbgems/mruby-data/gem_init.c +21 -0
  63. data/ext/enclave/mruby/build/host/mrbgems/mruby-enum-chain/gem_init.c +229 -0
  64. data/ext/enclave/mruby/build/host/mrbgems/mruby-enum-ext/gem_init.c +1420 -0
  65. data/ext/enclave/mruby/build/host/mrbgems/mruby-enum-lazy/gem_init.c +602 -0
  66. data/ext/enclave/mruby/build/host/mrbgems/mruby-enumerator/gem_init.c +822 -0
  67. data/ext/enclave/mruby/build/host/mrbgems/mruby-eval/gem_init.c +21 -0
  68. data/ext/enclave/mruby/build/host/mrbgems/mruby-fiber/gem_init.c +21 -0
  69. data/ext/enclave/mruby/build/host/mrbgems/mruby-hash-ext/gem_init.c +591 -0
  70. data/ext/enclave/mruby/build/host/mrbgems/mruby-kernel-ext/gem_init.c +21 -0
  71. data/ext/enclave/mruby/build/host/mrbgems/mruby-math/gem_init.c +21 -0
  72. data/ext/enclave/mruby/build/host/mrbgems/mruby-metaprog/gem_init.c +21 -0
  73. data/ext/enclave/mruby/build/host/mrbgems/mruby-method/gem_init.c +153 -0
  74. data/ext/enclave/mruby/build/host/mrbgems/mruby-numeric-ext/gem_init.c +211 -0
  75. data/ext/enclave/mruby/build/host/mrbgems/mruby-object-ext/gem_init.c +94 -0
  76. data/ext/enclave/mruby/build/host/mrbgems/mruby-objectspace/gem_init.c +21 -0
  77. data/ext/enclave/mruby/build/host/mrbgems/mruby-pack/gem_init.c +21 -0
  78. data/ext/enclave/mruby/build/host/mrbgems/mruby-proc-binding/gem_init.c +21 -0
  79. data/ext/enclave/mruby/build/host/mrbgems/mruby-proc-ext/gem_init.c +237 -0
  80. data/ext/enclave/mruby/build/host/mrbgems/mruby-random/gem_init.c +21 -0
  81. data/ext/enclave/mruby/build/host/mrbgems/mruby-range-ext/gem_init.c +205 -0
  82. data/ext/enclave/mruby/build/host/mrbgems/mruby-rational/gem_init.c +147 -0
  83. data/ext/enclave/mruby/build/host/mrbgems/mruby-set/gem_init.c +487 -0
  84. data/ext/enclave/mruby/build/host/mrbgems/mruby-sprintf/gem_init.c +83 -0
  85. data/ext/enclave/mruby/build/host/mrbgems/mruby-string-ext/gem_init.c +220 -0
  86. data/ext/enclave/mruby/build/host/mrbgems/mruby-struct/gem_init.c +175 -0
  87. data/ext/enclave/mruby/build/host/mrbgems/mruby-symbol-ext/gem_init.c +153 -0
  88. data/ext/enclave/mruby/build/host/mrbgems/mruby-time/gem_init.c +21 -0
  89. data/ext/enclave/mruby/build/host/mrbgems/mruby-toplevel-ext/gem_init.c +78 -0
  90. data/ext/enclave/mruby/build/host/mrblib/mrblib.c +1758 -0
  91. data/ext/enclave/mruby/build_config/ArduinoDue.rb +72 -0
  92. data/ext/enclave/mruby/build_config/IntelEdison.rb +69 -0
  93. data/ext/enclave/mruby/build_config/IntelGalileo.rb +88 -0
  94. data/ext/enclave/mruby/build_config/RX630.rb +63 -0
  95. data/ext/enclave/mruby/build_config/android_arm64_v8a.rb +11 -0
  96. data/ext/enclave/mruby/build_config/android_armeabi_v7a_neon_hard.rb +13 -0
  97. data/ext/enclave/mruby/build_config/bench.rb +11 -0
  98. data/ext/enclave/mruby/build_config/boxing.rb +19 -0
  99. data/ext/enclave/mruby/build_config/chipKITMax32.rb +68 -0
  100. data/ext/enclave/mruby/build_config/ci/gcc-clang.rb +40 -0
  101. data/ext/enclave/mruby/build_config/ci/msvc.rb +20 -0
  102. data/ext/enclave/mruby/build_config/clang-asan.rb +11 -0
  103. data/ext/enclave/mruby/build_config/cosmopolitan.rb +86 -0
  104. data/ext/enclave/mruby/build_config/cross-32bit.rb +14 -0
  105. data/ext/enclave/mruby/build_config/cross-mingw-winetest.rb +90 -0
  106. data/ext/enclave/mruby/build_config/cross-mingw.rb +14 -0
  107. data/ext/enclave/mruby/build_config/default.rb +83 -0
  108. data/ext/enclave/mruby/build_config/dreamcast_shelf.rb +81 -0
  109. data/ext/enclave/mruby/build_config/emscripten-cxx.rb +12 -0
  110. data/ext/enclave/mruby/build_config/emscripten.rb +10 -0
  111. data/ext/enclave/mruby/build_config/gameboyadvance.rb +72 -0
  112. data/ext/enclave/mruby/build_config/helpers/wine_runner.rb +71 -0
  113. data/ext/enclave/mruby/build_config/host-cxx.rb +12 -0
  114. data/ext/enclave/mruby/build_config/host-debug.rb +20 -0
  115. data/ext/enclave/mruby/build_config/host-f32.rb +14 -0
  116. data/ext/enclave/mruby/build_config/host-gprof.rb +14 -0
  117. data/ext/enclave/mruby/build_config/host-m32.rb +15 -0
  118. data/ext/enclave/mruby/build_config/host-nofloat.rb +22 -0
  119. data/ext/enclave/mruby/build_config/host-shared.rb +36 -0
  120. data/ext/enclave/mruby/build_config/i586-pc-msdosdjgpp.rb +76 -0
  121. data/ext/enclave/mruby/build_config/luckfox_pico.rb +106 -0
  122. data/ext/enclave/mruby/build_config/milkv_duo.rb +106 -0
  123. data/ext/enclave/mruby/build_config/minimal.rb +4 -0
  124. data/ext/enclave/mruby/build_config/mrbc.rb +10 -0
  125. data/ext/enclave/mruby/build_config/nintendo_switch.rb +73 -0
  126. data/ext/enclave/mruby/build_config/nintendo_wii.rb +95 -0
  127. data/ext/enclave/mruby/build_config/no-float.rb +17 -0
  128. data/ext/enclave/mruby/build_config/playstationportable.rb +78 -0
  129. data/ext/enclave/mruby/build_config/serenity.rb +26 -0
  130. data/ext/enclave/mruby/build_config.rb +9 -0
  131. data/ext/enclave/mruby/examples/mrbgems/c_and_ruby_extension_example/mrblib/example.rb +5 -0
  132. data/ext/enclave/mruby/examples/mrbgems/c_and_ruby_extension_example/src/example.c +23 -0
  133. data/ext/enclave/mruby/examples/mrbgems/c_and_ruby_extension_example/test/example.rb +7 -0
  134. data/ext/enclave/mruby/examples/mrbgems/c_extension_example/src/example.c +23 -0
  135. data/ext/enclave/mruby/examples/mrbgems/c_extension_example/test/example.c +7 -0
  136. data/ext/enclave/mruby/examples/mrbgems/c_extension_example/test/example.rb +3 -0
  137. data/ext/enclave/mruby/examples/mrbgems/cdata_extension_example/src/example.c +77 -0
  138. data/ext/enclave/mruby/examples/mrbgems/cdata_extension_example/test/example.c +7 -0
  139. data/ext/enclave/mruby/examples/mrbgems/mruby-YOUR-bigint/core/bigint.c +70 -0
  140. data/ext/enclave/mruby/examples/mrbgems/ruby_extension_example/mrblib/example.rb +5 -0
  141. data/ext/enclave/mruby/examples/mrbgems/ruby_extension_example/test/example.rb +3 -0
  142. data/ext/enclave/mruby/include/mrbconf.h +230 -0
  143. data/ext/enclave/mruby/include/mruby/array.h +303 -0
  144. data/ext/enclave/mruby/include/mruby/boxing_nan.h +169 -0
  145. data/ext/enclave/mruby/include/mruby/boxing_no.h +59 -0
  146. data/ext/enclave/mruby/include/mruby/boxing_word.h +248 -0
  147. data/ext/enclave/mruby/include/mruby/class.h +157 -0
  148. data/ext/enclave/mruby/include/mruby/common.h +127 -0
  149. data/ext/enclave/mruby/include/mruby/compile.h +187 -0
  150. data/ext/enclave/mruby/include/mruby/data.h +76 -0
  151. data/ext/enclave/mruby/include/mruby/debug.h +75 -0
  152. data/ext/enclave/mruby/include/mruby/dump.h +159 -0
  153. data/ext/enclave/mruby/include/mruby/endian.h +44 -0
  154. data/ext/enclave/mruby/include/mruby/error.h +168 -0
  155. data/ext/enclave/mruby/include/mruby/gc.h +77 -0
  156. data/ext/enclave/mruby/include/mruby/hash.h +234 -0
  157. data/ext/enclave/mruby/include/mruby/internal.h +278 -0
  158. data/ext/enclave/mruby/include/mruby/irep.h +142 -0
  159. data/ext/enclave/mruby/include/mruby/istruct.h +50 -0
  160. data/ext/enclave/mruby/include/mruby/khash.h +455 -0
  161. data/ext/enclave/mruby/include/mruby/mempool.h +19 -0
  162. data/ext/enclave/mruby/include/mruby/numeric.h +174 -0
  163. data/ext/enclave/mruby/include/mruby/object.h +44 -0
  164. data/ext/enclave/mruby/include/mruby/opcode.h +73 -0
  165. data/ext/enclave/mruby/include/mruby/ops.h +133 -0
  166. data/ext/enclave/mruby/include/mruby/presym/scanning.h +82 -0
  167. data/ext/enclave/mruby/include/mruby/presym.h +65 -0
  168. data/ext/enclave/mruby/include/mruby/proc.h +184 -0
  169. data/ext/enclave/mruby/include/mruby/range.h +77 -0
  170. data/ext/enclave/mruby/include/mruby/re.h +16 -0
  171. data/ext/enclave/mruby/include/mruby/string.h +428 -0
  172. data/ext/enclave/mruby/include/mruby/throw.h +81 -0
  173. data/ext/enclave/mruby/include/mruby/value.h +471 -0
  174. data/ext/enclave/mruby/include/mruby/variable.h +108 -0
  175. data/ext/enclave/mruby/include/mruby/version.h +143 -0
  176. data/ext/enclave/mruby/include/mruby.h +1632 -0
  177. data/ext/enclave/mruby/lib/mruby/amalgam.rb +568 -0
  178. data/ext/enclave/mruby/lib/mruby/build/command.rb +383 -0
  179. data/ext/enclave/mruby/lib/mruby/build/load_gems.rb +383 -0
  180. data/ext/enclave/mruby/lib/mruby/build.rb +616 -0
  181. data/ext/enclave/mruby/lib/mruby/core_ext.rb +61 -0
  182. data/ext/enclave/mruby/lib/mruby/doc.rb +51 -0
  183. data/ext/enclave/mruby/lib/mruby/gem.rb +585 -0
  184. data/ext/enclave/mruby/lib/mruby/lockfile.rb +81 -0
  185. data/ext/enclave/mruby/lib/mruby/presym.rb +167 -0
  186. data/ext/enclave/mruby/lib/mruby/source.rb +32 -0
  187. data/ext/enclave/mruby/mrbgems/default-no-fpu.gembox +3 -0
  188. data/ext/enclave/mruby/mrbgems/default-no-stdio.gembox +4 -0
  189. data/ext/enclave/mruby/mrbgems/default.gembox +25 -0
  190. data/ext/enclave/mruby/mrbgems/full-core.gembox +6 -0
  191. data/ext/enclave/mruby/mrbgems/hal-posix-dir/mrbgem.rake +7 -0
  192. data/ext/enclave/mruby/mrbgems/hal-posix-dir/src/dir_hal.c +193 -0
  193. data/ext/enclave/mruby/mrbgems/hal-posix-io/mrbgem.rake +8 -0
  194. data/ext/enclave/mruby/mrbgems/hal-posix-io/src/io_hal.c +602 -0
  195. data/ext/enclave/mruby/mrbgems/hal-posix-socket/mrbgem.rake +8 -0
  196. data/ext/enclave/mruby/mrbgems/hal-posix-socket/src/socket_hal.c +158 -0
  197. data/ext/enclave/mruby/mrbgems/hal-posix-task/README.md +102 -0
  198. data/ext/enclave/mruby/mrbgems/hal-posix-task/mrbgem.rake +8 -0
  199. data/ext/enclave/mruby/mrbgems/hal-posix-task/src/task_hal.c +252 -0
  200. data/ext/enclave/mruby/mrbgems/hal-win-dir/mrbgem.rake +7 -0
  201. data/ext/enclave/mruby/mrbgems/hal-win-dir/src/dir_hal.c +249 -0
  202. data/ext/enclave/mruby/mrbgems/hal-win-io/mrbgem.rake +11 -0
  203. data/ext/enclave/mruby/mrbgems/hal-win-io/src/io_hal.c +646 -0
  204. data/ext/enclave/mruby/mrbgems/hal-win-socket/mrbgem.rake +12 -0
  205. data/ext/enclave/mruby/mrbgems/hal-win-socket/src/socket_hal.c +177 -0
  206. data/ext/enclave/mruby/mrbgems/hal-win-task/README.md +109 -0
  207. data/ext/enclave/mruby/mrbgems/hal-win-task/mrbgem.rake +11 -0
  208. data/ext/enclave/mruby/mrbgems/hal-win-task/src/task_hal.c +187 -0
  209. data/ext/enclave/mruby/mrbgems/math.gembox +12 -0
  210. data/ext/enclave/mruby/mrbgems/metaprog.gembox +21 -0
  211. data/ext/enclave/mruby/mrbgems/mruby-array-ext/README.md +87 -0
  212. data/ext/enclave/mruby/mrbgems/mruby-array-ext/mrbgem.rake +5 -0
  213. data/ext/enclave/mruby/mrbgems/mruby-array-ext/mrblib/array.rb +784 -0
  214. data/ext/enclave/mruby/mrbgems/mruby-array-ext/src/array.c +1583 -0
  215. data/ext/enclave/mruby/mrbgems/mruby-array-ext/test/array.rb +849 -0
  216. data/ext/enclave/mruby/mrbgems/mruby-benchmark/README.md +257 -0
  217. data/ext/enclave/mruby/mrbgems/mruby-benchmark/mrbgem.rake +10 -0
  218. data/ext/enclave/mruby/mrbgems/mruby-benchmark/mrblib/benchmark.rb +131 -0
  219. data/ext/enclave/mruby/mrbgems/mruby-benchmark/test/benchmark.rb +244 -0
  220. data/ext/enclave/mruby/mrbgems/mruby-bigint/README-fgmp.md +154 -0
  221. data/ext/enclave/mruby/mrbgems/mruby-bigint/README.md +44 -0
  222. data/ext/enclave/mruby/mrbgems/mruby-bigint/core/bigint.c +6335 -0
  223. data/ext/enclave/mruby/mrbgems/mruby-bigint/core/bigint.h +117 -0
  224. data/ext/enclave/mruby/mrbgems/mruby-bigint/mrbgem.rake +10 -0
  225. data/ext/enclave/mruby/mrbgems/mruby-bigint/test/bigint.rb +157 -0
  226. data/ext/enclave/mruby/mrbgems/mruby-bin-config/README.md +46 -0
  227. data/ext/enclave/mruby/mrbgems/mruby-bin-config/mrbgem.rake +49 -0
  228. data/ext/enclave/mruby/mrbgems/mruby-bin-config/mruby-config +46 -0
  229. data/ext/enclave/mruby/mrbgems/mruby-bin-config/mruby-config.bat +92 -0
  230. data/ext/enclave/mruby/mrbgems/mruby-bin-debugger/README.md +63 -0
  231. data/ext/enclave/mruby/mrbgems/mruby-bin-debugger/bintest/mrdb.rb +283 -0
  232. data/ext/enclave/mruby/mrbgems/mruby-bin-debugger/bintest/print.rb +703 -0
  233. data/ext/enclave/mruby/mrbgems/mruby-bin-debugger/mrbgem.rake +10 -0
  234. data/ext/enclave/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/apibreak.c +523 -0
  235. data/ext/enclave/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/apibreak.h +26 -0
  236. data/ext/enclave/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/apilist.c +238 -0
  237. data/ext/enclave/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/apilist.h +14 -0
  238. data/ext/enclave/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/apiprint.c +88 -0
  239. data/ext/enclave/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/apiprint.h +13 -0
  240. data/ext/enclave/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/apistring.c +34 -0
  241. data/ext/enclave/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/apistring.h +14 -0
  242. data/ext/enclave/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/cmdbreak.c +436 -0
  243. data/ext/enclave/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/cmdmisc.c +509 -0
  244. data/ext/enclave/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/cmdprint.c +71 -0
  245. data/ext/enclave/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/cmdrun.c +64 -0
  246. data/ext/enclave/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/mrdb.c +768 -0
  247. data/ext/enclave/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/mrdb.h +159 -0
  248. data/ext/enclave/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/mrdbconf.h +24 -0
  249. data/ext/enclave/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/mrdberror.h +19 -0
  250. data/ext/enclave/mruby/mrbgems/mruby-bin-mirb/README.md +94 -0
  251. data/ext/enclave/mruby/mrbgems/mruby-bin-mirb/bintest/mirb.rb +58 -0
  252. data/ext/enclave/mruby/mrbgems/mruby-bin-mirb/mrbgem.rake +7 -0
  253. data/ext/enclave/mruby/mrbgems/mruby-bin-mirb/tools/mirb/mirb.c +808 -0
  254. data/ext/enclave/mruby/mrbgems/mruby-bin-mirb/tools/mirb/mirb_buffer.c +1035 -0
  255. data/ext/enclave/mruby/mrbgems/mruby-bin-mirb/tools/mirb/mirb_buffer.h +185 -0
  256. data/ext/enclave/mruby/mrbgems/mruby-bin-mirb/tools/mirb/mirb_completion.c +797 -0
  257. data/ext/enclave/mruby/mrbgems/mruby-bin-mirb/tools/mirb/mirb_completion.h +132 -0
  258. data/ext/enclave/mruby/mrbgems/mruby-bin-mirb/tools/mirb/mirb_editor.c +1118 -0
  259. data/ext/enclave/mruby/mrbgems/mruby-bin-mirb/tools/mirb/mirb_editor.h +153 -0
  260. data/ext/enclave/mruby/mrbgems/mruby-bin-mirb/tools/mirb/mirb_highlight.c +516 -0
  261. data/ext/enclave/mruby/mrbgems/mruby-bin-mirb/tools/mirb/mirb_highlight.h +95 -0
  262. data/ext/enclave/mruby/mrbgems/mruby-bin-mirb/tools/mirb/mirb_history.c +185 -0
  263. data/ext/enclave/mruby/mrbgems/mruby-bin-mirb/tools/mirb/mirb_history.h +76 -0
  264. data/ext/enclave/mruby/mrbgems/mruby-bin-mirb/tools/mirb/mirb_term.c +491 -0
  265. data/ext/enclave/mruby/mrbgems/mruby-bin-mirb/tools/mirb/mirb_term.h +137 -0
  266. data/ext/enclave/mruby/mrbgems/mruby-bin-mrbc/README.md +58 -0
  267. data/ext/enclave/mruby/mrbgems/mruby-bin-mrbc/bintest/mrbc.rb +30 -0
  268. data/ext/enclave/mruby/mrbgems/mruby-bin-mrbc/mrbgem.rake +15 -0
  269. data/ext/enclave/mruby/mrbgems/mruby-bin-mrbc/tools/mrbc/mrbc.c +362 -0
  270. data/ext/enclave/mruby/mrbgems/mruby-bin-mrbc/tools/mrbc/stub.c +104 -0
  271. data/ext/enclave/mruby/mrbgems/mruby-bin-mruby/README.md +47 -0
  272. data/ext/enclave/mruby/mrbgems/mruby-bin-mruby/bintest/mruby.rb +178 -0
  273. data/ext/enclave/mruby/mrbgems/mruby-bin-mruby/mrbgem.rake +7 -0
  274. data/ext/enclave/mruby/mrbgems/mruby-bin-mruby/tools/mruby/mruby.c +380 -0
  275. data/ext/enclave/mruby/mrbgems/mruby-bin-strip/README.md +38 -0
  276. data/ext/enclave/mruby/mrbgems/mruby-bin-strip/bintest/mruby_strip.rb +73 -0
  277. data/ext/enclave/mruby/mrbgems/mruby-bin-strip/mrbgem.rake +7 -0
  278. data/ext/enclave/mruby/mrbgems/mruby-bin-strip/tools/mruby-strip/mruby_strip.c +139 -0
  279. data/ext/enclave/mruby/mrbgems/mruby-binding/README.md +256 -0
  280. data/ext/enclave/mruby/mrbgems/mruby-binding/mrbgem.rake +7 -0
  281. data/ext/enclave/mruby/mrbgems/mruby-binding/src/binding.c +518 -0
  282. data/ext/enclave/mruby/mrbgems/mruby-binding/test/binding.c +14 -0
  283. data/ext/enclave/mruby/mrbgems/mruby-binding/test/binding.rb +64 -0
  284. data/ext/enclave/mruby/mrbgems/mruby-catch/README.md +94 -0
  285. data/ext/enclave/mruby/mrbgems/mruby-catch/mrbgem.rake +5 -0
  286. data/ext/enclave/mruby/mrbgems/mruby-catch/mrblib/catch.rb +29 -0
  287. data/ext/enclave/mruby/mrbgems/mruby-catch/src/catch.c +149 -0
  288. data/ext/enclave/mruby/mrbgems/mruby-catch/test/catch.rb +86 -0
  289. data/ext/enclave/mruby/mrbgems/mruby-class-ext/README.md +81 -0
  290. data/ext/enclave/mruby/mrbgems/mruby-class-ext/mrbgem.rake +5 -0
  291. data/ext/enclave/mruby/mrbgems/mruby-class-ext/src/class.c +377 -0
  292. data/ext/enclave/mruby/mrbgems/mruby-class-ext/test/class.rb +46 -0
  293. data/ext/enclave/mruby/mrbgems/mruby-class-ext/test/module.rb +109 -0
  294. data/ext/enclave/mruby/mrbgems/mruby-cmath/README.md +45 -0
  295. data/ext/enclave/mruby/mrbgems/mruby-cmath/mrbgem.rake +8 -0
  296. data/ext/enclave/mruby/mrbgems/mruby-cmath/src/cmath.c +426 -0
  297. data/ext/enclave/mruby/mrbgems/mruby-cmath/test/cmath.rb +41 -0
  298. data/ext/enclave/mruby/mrbgems/mruby-compar-ext/README.md +65 -0
  299. data/ext/enclave/mruby/mrbgems/mruby-compar-ext/mrbgem.rake +5 -0
  300. data/ext/enclave/mruby/mrbgems/mruby-compar-ext/mrblib/compar.rb +75 -0
  301. data/ext/enclave/mruby/mrbgems/mruby-compar-ext/test/compar.rb +21 -0
  302. data/ext/enclave/mruby/mrbgems/mruby-compiler/README.md +28 -0
  303. data/ext/enclave/mruby/mrbgems/mruby-compiler/core/codegen.c +7316 -0
  304. data/ext/enclave/mruby/mrbgems/mruby-compiler/core/keywords +52 -0
  305. data/ext/enclave/mruby/mrbgems/mruby-compiler/core/lex.def +207 -0
  306. data/ext/enclave/mruby/mrbgems/mruby-compiler/core/node.h +784 -0
  307. data/ext/enclave/mruby/mrbgems/mruby-compiler/core/parse.y +8977 -0
  308. data/ext/enclave/mruby/mrbgems/mruby-compiler/core/y.tab.c +16136 -0
  309. data/ext/enclave/mruby/mrbgems/mruby-compiler/mrbgem.rake +42 -0
  310. data/ext/enclave/mruby/mrbgems/mruby-complex/README.md +55 -0
  311. data/ext/enclave/mruby/mrbgems/mruby-complex/mrbgem.rake +7 -0
  312. data/ext/enclave/mruby/mrbgems/mruby-complex/mrblib/complex.rb +259 -0
  313. data/ext/enclave/mruby/mrbgems/mruby-complex/src/complex.c +597 -0
  314. data/ext/enclave/mruby/mrbgems/mruby-complex/test/complex.rb +174 -0
  315. data/ext/enclave/mruby/mrbgems/mruby-data/README.md +126 -0
  316. data/ext/enclave/mruby/mrbgems/mruby-data/mrbgem.rake +5 -0
  317. data/ext/enclave/mruby/mrbgems/mruby-data/src/data.c +550 -0
  318. data/ext/enclave/mruby/mrbgems/mruby-data/test/data.rb +76 -0
  319. data/ext/enclave/mruby/mrbgems/mruby-dir/README.md +53 -0
  320. data/ext/enclave/mruby/mrbgems/mruby-dir/include/dir_hal.h +79 -0
  321. data/ext/enclave/mruby/mrbgems/mruby-dir/mrbgem.rake +35 -0
  322. data/ext/enclave/mruby/mrbgems/mruby-dir/mrblib/dir.rb +124 -0
  323. data/ext/enclave/mruby/mrbgems/mruby-dir/src/dir.c +493 -0
  324. data/ext/enclave/mruby/mrbgems/mruby-dir/test/dir.rb +138 -0
  325. data/ext/enclave/mruby/mrbgems/mruby-dir/test/dirtest.c +125 -0
  326. data/ext/enclave/mruby/mrbgems/mruby-encoding/README.md +96 -0
  327. data/ext/enclave/mruby/mrbgems/mruby-encoding/mrbgem.rake +8 -0
  328. data/ext/enclave/mruby/mrbgems/mruby-encoding/src/encoding.c +128 -0
  329. data/ext/enclave/mruby/mrbgems/mruby-encoding/test/numeric.rb +27 -0
  330. data/ext/enclave/mruby/mrbgems/mruby-encoding/test/string.rb +30 -0
  331. data/ext/enclave/mruby/mrbgems/mruby-enum-chain/README.md +80 -0
  332. data/ext/enclave/mruby/mrbgems/mruby-enum-chain/mrbgem.rake +6 -0
  333. data/ext/enclave/mruby/mrbgems/mruby-enum-chain/mrblib/chain.rb +149 -0
  334. data/ext/enclave/mruby/mrbgems/mruby-enum-chain/test/enum_chain.rb +108 -0
  335. data/ext/enclave/mruby/mrbgems/mruby-enum-ext/README.md +487 -0
  336. data/ext/enclave/mruby/mrbgems/mruby-enum-ext/mrbgem.rake +5 -0
  337. data/ext/enclave/mruby/mrbgems/mruby-enum-ext/mrblib/enum.rb +938 -0
  338. data/ext/enclave/mruby/mrbgems/mruby-enum-ext/test/enum.rb +223 -0
  339. data/ext/enclave/mruby/mrbgems/mruby-enum-lazy/README.md +91 -0
  340. data/ext/enclave/mruby/mrbgems/mruby-enum-lazy/mrbgem.rake +7 -0
  341. data/ext/enclave/mruby/mrbgems/mruby-enum-lazy/mrblib/lazy.rb +363 -0
  342. data/ext/enclave/mruby/mrbgems/mruby-enum-lazy/test/lazy.rb +59 -0
  343. data/ext/enclave/mruby/mrbgems/mruby-enumerator/README.md +89 -0
  344. data/ext/enclave/mruby/mrbgems/mruby-enumerator/mrbgem.rake +6 -0
  345. data/ext/enclave/mruby/mrbgems/mruby-enumerator/mrblib/enumerator.rb +861 -0
  346. data/ext/enclave/mruby/mrbgems/mruby-enumerator/test/enumerator.rb +664 -0
  347. data/ext/enclave/mruby/mrbgems/mruby-errno/README.md +83 -0
  348. data/ext/enclave/mruby/mrbgems/mruby-errno/mrbgem.rake +5 -0
  349. data/ext/enclave/mruby/mrbgems/mruby-errno/mrblib/errno.rb +50 -0
  350. data/ext/enclave/mruby/mrbgems/mruby-errno/src/errno.c +335 -0
  351. data/ext/enclave/mruby/mrbgems/mruby-errno/src/gen.rb +18 -0
  352. data/ext/enclave/mruby/mrbgems/mruby-errno/src/known_errors.def +156 -0
  353. data/ext/enclave/mruby/mrbgems/mruby-errno/src/known_errors_def.cstub +780 -0
  354. data/ext/enclave/mruby/mrbgems/mruby-errno/test/errno.rb +57 -0
  355. data/ext/enclave/mruby/mrbgems/mruby-error/README.md +103 -0
  356. data/ext/enclave/mruby/mrbgems/mruby-error/mrbgem.rake +5 -0
  357. data/ext/enclave/mruby/mrbgems/mruby-error/src/exception.c +143 -0
  358. data/ext/enclave/mruby/mrbgems/mruby-error/test/exception.c +60 -0
  359. data/ext/enclave/mruby/mrbgems/mruby-error/test/exception.rb +55 -0
  360. data/ext/enclave/mruby/mrbgems/mruby-eval/README.md +26 -0
  361. data/ext/enclave/mruby/mrbgems/mruby-eval/mrbgem.rake +10 -0
  362. data/ext/enclave/mruby/mrbgems/mruby-eval/src/eval.c +437 -0
  363. data/ext/enclave/mruby/mrbgems/mruby-eval/test/binding.rb +81 -0
  364. data/ext/enclave/mruby/mrbgems/mruby-eval/test/eval.rb +185 -0
  365. data/ext/enclave/mruby/mrbgems/mruby-exit/mrbgem.rake +5 -0
  366. data/ext/enclave/mruby/mrbgems/mruby-exit/src/mruby_exit.c +83 -0
  367. data/ext/enclave/mruby/mrbgems/mruby-fiber/mrbgem.rake +5 -0
  368. data/ext/enclave/mruby/mrbgems/mruby-fiber/src/fiber.c +575 -0
  369. data/ext/enclave/mruby/mrbgems/mruby-fiber/test/fiber.rb +210 -0
  370. data/ext/enclave/mruby/mrbgems/mruby-fiber/test/fiber2.rb +155 -0
  371. data/ext/enclave/mruby/mrbgems/mruby-fiber/test/fibertest.c +87 -0
  372. data/ext/enclave/mruby/mrbgems/mruby-hash-ext/README.md +392 -0
  373. data/ext/enclave/mruby/mrbgems/mruby-hash-ext/mrbgem.rake +6 -0
  374. data/ext/enclave/mruby/mrbgems/mruby-hash-ext/mrblib/hash.rb +408 -0
  375. data/ext/enclave/mruby/mrbgems/mruby-hash-ext/src/hash_ext.c +392 -0
  376. data/ext/enclave/mruby/mrbgems/mruby-hash-ext/test/hash.rb +317 -0
  377. data/ext/enclave/mruby/mrbgems/mruby-io/README.md +198 -0
  378. data/ext/enclave/mruby/mrbgems/mruby-io/include/io_hal.h +451 -0
  379. data/ext/enclave/mruby/mrbgems/mruby-io/include/mruby/io.h +76 -0
  380. data/ext/enclave/mruby/mrbgems/mruby-io/mrbgem.rake +34 -0
  381. data/ext/enclave/mruby/mrbgems/mruby-io/mrblib/file.rb +109 -0
  382. data/ext/enclave/mruby/mrbgems/mruby-io/mrblib/file_constants.rb +24 -0
  383. data/ext/enclave/mruby/mrbgems/mruby-io/mrblib/io.rb +303 -0
  384. data/ext/enclave/mruby/mrbgems/mruby-io/mrblib/kernel.rb +175 -0
  385. data/ext/enclave/mruby/mrbgems/mruby-io/src/file.c +1192 -0
  386. data/ext/enclave/mruby/mrbgems/mruby-io/src/file_test.c +403 -0
  387. data/ext/enclave/mruby/mrbgems/mruby-io/src/io.c +2260 -0
  388. data/ext/enclave/mruby/mrbgems/mruby-io/src/mruby_io_gem.c +21 -0
  389. data/ext/enclave/mruby/mrbgems/mruby-io/test/file.rb +415 -0
  390. data/ext/enclave/mruby/mrbgems/mruby-io/test/file_test.rb +112 -0
  391. data/ext/enclave/mruby/mrbgems/mruby-io/test/io.rb +668 -0
  392. data/ext/enclave/mruby/mrbgems/mruby-io/test/mruby_io_test.c +293 -0
  393. data/ext/enclave/mruby/mrbgems/mruby-kernel-ext/README.md +165 -0
  394. data/ext/enclave/mruby/mrbgems/mruby-kernel-ext/mrbgem.rake +5 -0
  395. data/ext/enclave/mruby/mrbgems/mruby-kernel-ext/src/kernel.c +316 -0
  396. data/ext/enclave/mruby/mrbgems/mruby-kernel-ext/test/kernel.rb +134 -0
  397. data/ext/enclave/mruby/mrbgems/mruby-math/README.md +77 -0
  398. data/ext/enclave/mruby/mrbgems/mruby-math/mrbgem.rake +5 -0
  399. data/ext/enclave/mruby/mrbgems/mruby-math/src/math.c +753 -0
  400. data/ext/enclave/mruby/mrbgems/mruby-math/test/math.rb +201 -0
  401. data/ext/enclave/mruby/mrbgems/mruby-metaprog/README.md +123 -0
  402. data/ext/enclave/mruby/mrbgems/mruby-metaprog/mrbgem.rake +5 -0
  403. data/ext/enclave/mruby/mrbgems/mruby-metaprog/src/metaprog.c +739 -0
  404. data/ext/enclave/mruby/mrbgems/mruby-metaprog/test/metaprog.rb +465 -0
  405. data/ext/enclave/mruby/mrbgems/mruby-method/README.md +66 -0
  406. data/ext/enclave/mruby/mrbgems/mruby-method/mrbgem.rake +7 -0
  407. data/ext/enclave/mruby/mrbgems/mruby-method/mrblib/method.rb +73 -0
  408. data/ext/enclave/mruby/mrbgems/mruby-method/src/method.c +890 -0
  409. data/ext/enclave/mruby/mrbgems/mruby-method/test/method.rb +514 -0
  410. data/ext/enclave/mruby/mrbgems/mruby-numeric-ext/README.md +78 -0
  411. data/ext/enclave/mruby/mrbgems/mruby-numeric-ext/mrbgem.rake +5 -0
  412. data/ext/enclave/mruby/mrbgems/mruby-numeric-ext/mrblib/numeric_ext.rb +125 -0
  413. data/ext/enclave/mruby/mrbgems/mruby-numeric-ext/src/numeric_ext.c +527 -0
  414. data/ext/enclave/mruby/mrbgems/mruby-numeric-ext/test/numeric.rb +137 -0
  415. data/ext/enclave/mruby/mrbgems/mruby-object-ext/README.md +144 -0
  416. data/ext/enclave/mruby/mrbgems/mruby-object-ext/mrbgem.rake +5 -0
  417. data/ext/enclave/mruby/mrbgems/mruby-object-ext/mrblib/object.rb +33 -0
  418. data/ext/enclave/mruby/mrbgems/mruby-object-ext/src/object.c +128 -0
  419. data/ext/enclave/mruby/mrbgems/mruby-object-ext/test/nil.rb +16 -0
  420. data/ext/enclave/mruby/mrbgems/mruby-object-ext/test/object.rb +67 -0
  421. data/ext/enclave/mruby/mrbgems/mruby-object-ext/test/object_ext.c +17 -0
  422. data/ext/enclave/mruby/mrbgems/mruby-objectspace/README.md +59 -0
  423. data/ext/enclave/mruby/mrbgems/mruby-objectspace/mrbgem.rake +5 -0
  424. data/ext/enclave/mruby/mrbgems/mruby-objectspace/src/mruby_objectspace.c +188 -0
  425. data/ext/enclave/mruby/mrbgems/mruby-objectspace/test/objectspace.rb +60 -0
  426. data/ext/enclave/mruby/mrbgems/mruby-os-memsize/README.md +75 -0
  427. data/ext/enclave/mruby/mrbgems/mruby-os-memsize/mrbgem.rake +10 -0
  428. data/ext/enclave/mruby/mrbgems/mruby-os-memsize/src/memsize.c +271 -0
  429. data/ext/enclave/mruby/mrbgems/mruby-os-memsize/test/memsize.rb +63 -0
  430. data/ext/enclave/mruby/mrbgems/mruby-pack/README.md +140 -0
  431. data/ext/enclave/mruby/mrbgems/mruby-pack/mrbgem.rake +5 -0
  432. data/ext/enclave/mruby/mrbgems/mruby-pack/src/pack.c +2129 -0
  433. data/ext/enclave/mruby/mrbgems/mruby-pack/test/pack.rb +202 -0
  434. data/ext/enclave/mruby/mrbgems/mruby-proc-binding/README.md +140 -0
  435. data/ext/enclave/mruby/mrbgems/mruby-proc-binding/mrbgem.rake +10 -0
  436. data/ext/enclave/mruby/mrbgems/mruby-proc-binding/src/proc_binding.c +76 -0
  437. data/ext/enclave/mruby/mrbgems/mruby-proc-binding/test/proc_binding.c +14 -0
  438. data/ext/enclave/mruby/mrbgems/mruby-proc-binding/test/proc_binding.rb +22 -0
  439. data/ext/enclave/mruby/mrbgems/mruby-proc-ext/README.md +107 -0
  440. data/ext/enclave/mruby/mrbgems/mruby-proc-ext/mrbgem.rake +5 -0
  441. data/ext/enclave/mruby/mrbgems/mruby-proc-ext/mrblib/proc.rb +130 -0
  442. data/ext/enclave/mruby/mrbgems/mruby-proc-ext/src/proc.c +267 -0
  443. data/ext/enclave/mruby/mrbgems/mruby-proc-ext/test/proc.c +62 -0
  444. data/ext/enclave/mruby/mrbgems/mruby-proc-ext/test/proc.rb +130 -0
  445. data/ext/enclave/mruby/mrbgems/mruby-random/README.md +272 -0
  446. data/ext/enclave/mruby/mrbgems/mruby-random/mrbgem.rake +5 -0
  447. data/ext/enclave/mruby/mrbgems/mruby-random/src/random.c +608 -0
  448. data/ext/enclave/mruby/mrbgems/mruby-random/test/random.rb +151 -0
  449. data/ext/enclave/mruby/mrbgems/mruby-range-ext/README.md +93 -0
  450. data/ext/enclave/mruby/mrbgems/mruby-range-ext/mrbgem.rake +5 -0
  451. data/ext/enclave/mruby/mrbgems/mruby-range-ext/mrblib/range.rb +155 -0
  452. data/ext/enclave/mruby/mrbgems/mruby-range-ext/src/range.c +236 -0
  453. data/ext/enclave/mruby/mrbgems/mruby-range-ext/test/range.rb +211 -0
  454. data/ext/enclave/mruby/mrbgems/mruby-rational/README.md +61 -0
  455. data/ext/enclave/mruby/mrbgems/mruby-rational/mrbgem.rake +7 -0
  456. data/ext/enclave/mruby/mrbgems/mruby-rational/mrblib/rational.rb +66 -0
  457. data/ext/enclave/mruby/mrbgems/mruby-rational/src/rational.c +1269 -0
  458. data/ext/enclave/mruby/mrbgems/mruby-rational/test/rational.rb +316 -0
  459. data/ext/enclave/mruby/mrbgems/mruby-set/LICENSE +24 -0
  460. data/ext/enclave/mruby/mrbgems/mruby-set/README.md +260 -0
  461. data/ext/enclave/mruby/mrbgems/mruby-set/mrbgem.rake +9 -0
  462. data/ext/enclave/mruby/mrbgems/mruby-set/mrblib/set.rb +325 -0
  463. data/ext/enclave/mruby/mrbgems/mruby-set/mruby-set.gem +6 -0
  464. data/ext/enclave/mruby/mrbgems/mruby-set/src/set.c +1535 -0
  465. data/ext/enclave/mruby/mrbgems/mruby-set/test/set.rb +764 -0
  466. data/ext/enclave/mruby/mrbgems/mruby-sleep/README.md +29 -0
  467. data/ext/enclave/mruby/mrbgems/mruby-sleep/example/sleep.rb +2 -0
  468. data/ext/enclave/mruby/mrbgems/mruby-sleep/mrbgem.rake +5 -0
  469. data/ext/enclave/mruby/mrbgems/mruby-sleep/src/sleep.c +187 -0
  470. data/ext/enclave/mruby/mrbgems/mruby-sleep/test/sleep_test.rb +29 -0
  471. data/ext/enclave/mruby/mrbgems/mruby-socket/README.md +56 -0
  472. data/ext/enclave/mruby/mrbgems/mruby-socket/include/socket_hal.h +83 -0
  473. data/ext/enclave/mruby/mrbgems/mruby-socket/mrbgem.rake +37 -0
  474. data/ext/enclave/mruby/mrbgems/mruby-socket/mrblib/socket.rb +1131 -0
  475. data/ext/enclave/mruby/mrbgems/mruby-socket/src/const.cstub +480 -0
  476. data/ext/enclave/mruby/mrbgems/mruby-socket/src/const.def +172 -0
  477. data/ext/enclave/mruby/mrbgems/mruby-socket/src/gen.rb +17 -0
  478. data/ext/enclave/mruby/mrbgems/mruby-socket/src/socket.c +1374 -0
  479. data/ext/enclave/mruby/mrbgems/mruby-socket/test/addrinfo.rb +91 -0
  480. data/ext/enclave/mruby/mrbgems/mruby-socket/test/basicsocket.rb +17 -0
  481. data/ext/enclave/mruby/mrbgems/mruby-socket/test/ipsocket.rb +44 -0
  482. data/ext/enclave/mruby/mrbgems/mruby-socket/test/socket.rb +38 -0
  483. data/ext/enclave/mruby/mrbgems/mruby-socket/test/sockettest.c +84 -0
  484. data/ext/enclave/mruby/mrbgems/mruby-socket/test/tcpsocket.rb +4 -0
  485. data/ext/enclave/mruby/mrbgems/mruby-socket/test/udpsocket.rb +16 -0
  486. data/ext/enclave/mruby/mrbgems/mruby-socket/test/unix.rb +130 -0
  487. data/ext/enclave/mruby/mrbgems/mruby-sprintf/README.md +235 -0
  488. data/ext/enclave/mruby/mrbgems/mruby-sprintf/mrbgem.rake +5 -0
  489. data/ext/enclave/mruby/mrbgems/mruby-sprintf/mrblib/string.rb +24 -0
  490. data/ext/enclave/mruby/mrbgems/mruby-sprintf/src/sprintf.c +1195 -0
  491. data/ext/enclave/mruby/mrbgems/mruby-sprintf/test/sprintf.rb +92 -0
  492. data/ext/enclave/mruby/mrbgems/mruby-strftime/README.md +140 -0
  493. data/ext/enclave/mruby/mrbgems/mruby-strftime/mrbgem.rake +7 -0
  494. data/ext/enclave/mruby/mrbgems/mruby-strftime/src/strftime.c +119 -0
  495. data/ext/enclave/mruby/mrbgems/mruby-strftime/test/strftime.rb +152 -0
  496. data/ext/enclave/mruby/mrbgems/mruby-string-ext/README.md +886 -0
  497. data/ext/enclave/mruby/mrbgems/mruby-string-ext/mrbgem.rake +5 -0
  498. data/ext/enclave/mruby/mrbgems/mruby-string-ext/mrblib/string.rb +166 -0
  499. data/ext/enclave/mruby/mrbgems/mruby-string-ext/src/string.c +2290 -0
  500. data/ext/enclave/mruby/mrbgems/mruby-string-ext/test/numeric.rb +27 -0
  501. data/ext/enclave/mruby/mrbgems/mruby-string-ext/test/range.rb +26 -0
  502. data/ext/enclave/mruby/mrbgems/mruby-string-ext/test/string.rb +765 -0
  503. data/ext/enclave/mruby/mrbgems/mruby-struct/README.md +105 -0
  504. data/ext/enclave/mruby/mrbgems/mruby-struct/mrbgem.rake +5 -0
  505. data/ext/enclave/mruby/mrbgems/mruby-struct/mrblib/struct.rb +69 -0
  506. data/ext/enclave/mruby/mrbgems/mruby-struct/src/struct.c +812 -0
  507. data/ext/enclave/mruby/mrbgems/mruby-struct/test/struct.rb +303 -0
  508. data/ext/enclave/mruby/mrbgems/mruby-symbol-ext/README.md +50 -0
  509. data/ext/enclave/mruby/mrbgems/mruby-symbol-ext/mrbgem.rake +5 -0
  510. data/ext/enclave/mruby/mrbgems/mruby-symbol-ext/mrblib/symbol.rb +72 -0
  511. data/ext/enclave/mruby/mrbgems/mruby-symbol-ext/src/symbol.c +79 -0
  512. data/ext/enclave/mruby/mrbgems/mruby-symbol-ext/test/symbol.rb +55 -0
  513. data/ext/enclave/mruby/mrbgems/mruby-task/README.md +770 -0
  514. data/ext/enclave/mruby/mrbgems/mruby-task/examples/inspection.rb +65 -0
  515. data/ext/enclave/mruby/mrbgems/mruby-task/examples/priority.rb +41 -0
  516. data/ext/enclave/mruby/mrbgems/mruby-task/examples/producer_consumer.rb +58 -0
  517. data/ext/enclave/mruby/mrbgems/mruby-task/examples/simple.rb +27 -0
  518. data/ext/enclave/mruby/mrbgems/mruby-task/examples/statistics.rb +59 -0
  519. data/ext/enclave/mruby/mrbgems/mruby-task/examples/suspend_resume.rb +47 -0
  520. data/ext/enclave/mruby/mrbgems/mruby-task/examples/task_pass.rb +21 -0
  521. data/ext/enclave/mruby/mrbgems/mruby-task/include/task.h +143 -0
  522. data/ext/enclave/mruby/mrbgems/mruby-task/include/task_hal.h +162 -0
  523. data/ext/enclave/mruby/mrbgems/mruby-task/mrbgem.rake +36 -0
  524. data/ext/enclave/mruby/mrbgems/mruby-task/src/task.c +1573 -0
  525. data/ext/enclave/mruby/mrbgems/mruby-task/test/task.rb +185 -0
  526. data/ext/enclave/mruby/mrbgems/mruby-test/README.md +7 -0
  527. data/ext/enclave/mruby/mrbgems/mruby-test/driver.c +315 -0
  528. data/ext/enclave/mruby/mrbgems/mruby-test/mrbgem.rake +173 -0
  529. data/ext/enclave/mruby/mrbgems/mruby-test/vformat.c +151 -0
  530. data/ext/enclave/mruby/mrbgems/mruby-test-inline-struct/mrbgem.rake +5 -0
  531. data/ext/enclave/mruby/mrbgems/mruby-test-inline-struct/test/inline.c +92 -0
  532. data/ext/enclave/mruby/mrbgems/mruby-test-inline-struct/test/inline.rb +118 -0
  533. data/ext/enclave/mruby/mrbgems/mruby-time/README.md +102 -0
  534. data/ext/enclave/mruby/mrbgems/mruby-time/include/mruby/time.h +27 -0
  535. data/ext/enclave/mruby/mrbgems/mruby-time/mrbgem.rake +5 -0
  536. data/ext/enclave/mruby/mrbgems/mruby-time/src/time.c +1739 -0
  537. data/ext/enclave/mruby/mrbgems/mruby-time/test/time.rb +313 -0
  538. data/ext/enclave/mruby/mrbgems/mruby-toplevel-ext/README.md +32 -0
  539. data/ext/enclave/mruby/mrbgems/mruby-toplevel-ext/mrbgem.rake +5 -0
  540. data/ext/enclave/mruby/mrbgems/mruby-toplevel-ext/mrblib/toplevel.rb +24 -0
  541. data/ext/enclave/mruby/mrbgems/mruby-toplevel-ext/test/toplevel.rb +23 -0
  542. data/ext/enclave/mruby/mrbgems/stdlib-ext.gembox +21 -0
  543. data/ext/enclave/mruby/mrbgems/stdlib-io.gembox +15 -0
  544. data/ext/enclave/mruby/mrbgems/stdlib.gembox +63 -0
  545. data/ext/enclave/mruby/mrblib/10error.rb +23 -0
  546. data/ext/enclave/mruby/mrblib/array.rb +102 -0
  547. data/ext/enclave/mruby/mrblib/compar.rb +102 -0
  548. data/ext/enclave/mruby/mrblib/enum.rb +358 -0
  549. data/ext/enclave/mruby/mrblib/hash.rb +276 -0
  550. data/ext/enclave/mruby/mrblib/kernel.rb +45 -0
  551. data/ext/enclave/mruby/mrblib/numeric.rb +160 -0
  552. data/ext/enclave/mruby/mrblib/range.rb +98 -0
  553. data/ext/enclave/mruby/mrblib/string.rb +173 -0
  554. data/ext/enclave/mruby/mrblib/symbol.rb +8 -0
  555. data/ext/enclave/mruby/oss-fuzz/mruby_fuzzer.c +18 -0
  556. data/ext/enclave/mruby/oss-fuzz/proto_to_ruby.h +55 -0
  557. data/ext/enclave/mruby/src/allocf.c +37 -0
  558. data/ext/enclave/mruby/src/array.c +2302 -0
  559. data/ext/enclave/mruby/src/backtrace.c +294 -0
  560. data/ext/enclave/mruby/src/cdump.c +498 -0
  561. data/ext/enclave/mruby/src/class.c +4394 -0
  562. data/ext/enclave/mruby/src/codedump.c +693 -0
  563. data/ext/enclave/mruby/src/debug.c +290 -0
  564. data/ext/enclave/mruby/src/dump.c +998 -0
  565. data/ext/enclave/mruby/src/enum.c +30 -0
  566. data/ext/enclave/mruby/src/error.c +937 -0
  567. data/ext/enclave/mruby/src/etc.c +421 -0
  568. data/ext/enclave/mruby/src/fmt_fp.c +372 -0
  569. data/ext/enclave/mruby/src/gc.c +1610 -0
  570. data/ext/enclave/mruby/src/hash.c +2355 -0
  571. data/ext/enclave/mruby/src/init.c +50 -0
  572. data/ext/enclave/mruby/src/kernel.c +718 -0
  573. data/ext/enclave/mruby/src/load.c +760 -0
  574. data/ext/enclave/mruby/src/mempool.c +225 -0
  575. data/ext/enclave/mruby/src/numeric.c +2420 -0
  576. data/ext/enclave/mruby/src/numops.c +112 -0
  577. data/ext/enclave/mruby/src/object.c +883 -0
  578. data/ext/enclave/mruby/src/print.c +136 -0
  579. data/ext/enclave/mruby/src/proc.c +572 -0
  580. data/ext/enclave/mruby/src/range.c +597 -0
  581. data/ext/enclave/mruby/src/readfloat.c +228 -0
  582. data/ext/enclave/mruby/src/readint.c +27 -0
  583. data/ext/enclave/mruby/src/readnum.c +43 -0
  584. data/ext/enclave/mruby/src/state.c +247 -0
  585. data/ext/enclave/mruby/src/string.c +3577 -0
  586. data/ext/enclave/mruby/src/symbol.c +1023 -0
  587. data/ext/enclave/mruby/src/value_array.h +28 -0
  588. data/ext/enclave/mruby/src/variable.c +1475 -0
  589. data/ext/enclave/mruby/src/version.c +17 -0
  590. data/ext/enclave/mruby/src/vm.c +3696 -0
  591. data/ext/enclave/mruby/tasks/amalgam.rake +34 -0
  592. data/ext/enclave/mruby/tasks/benchmark.rake +93 -0
  593. data/ext/enclave/mruby/tasks/bin.rake +23 -0
  594. data/ext/enclave/mruby/tasks/core.rake +12 -0
  595. data/ext/enclave/mruby/tasks/doc.rake +118 -0
  596. data/ext/enclave/mruby/tasks/install.rake +40 -0
  597. data/ext/enclave/mruby/tasks/libmruby.rake +90 -0
  598. data/ext/enclave/mruby/tasks/mrbgems.rake +152 -0
  599. data/ext/enclave/mruby/tasks/mrblib.rake +29 -0
  600. data/ext/enclave/mruby/tasks/presym.rake +57 -0
  601. data/ext/enclave/mruby/tasks/test.rake +84 -0
  602. data/ext/enclave/mruby/tasks/toolchains/android.rake +228 -0
  603. data/ext/enclave/mruby/tasks/toolchains/clang.rake +8 -0
  604. data/ext/enclave/mruby/tasks/toolchains/emscripten.rake +57 -0
  605. data/ext/enclave/mruby/tasks/toolchains/gcc.rake +74 -0
  606. data/ext/enclave/mruby/tasks/toolchains/openwrt.rake +32 -0
  607. data/ext/enclave/mruby/tasks/toolchains/visualcpp.rake +48 -0
  608. data/ext/enclave/mruby/test/assert.rb +404 -0
  609. data/ext/enclave/mruby/test/bintest.rb +55 -0
  610. data/ext/enclave/mruby/test/t/argumenterror.rb +37 -0
  611. data/ext/enclave/mruby/test/t/array.rb +478 -0
  612. data/ext/enclave/mruby/test/t/basicobject.rb +10 -0
  613. data/ext/enclave/mruby/test/t/bs_block.rb +621 -0
  614. data/ext/enclave/mruby/test/t/bs_literal.rb +38 -0
  615. data/ext/enclave/mruby/test/t/class.rb +505 -0
  616. data/ext/enclave/mruby/test/t/codegen.rb +196 -0
  617. data/ext/enclave/mruby/test/t/comparable.rb +79 -0
  618. data/ext/enclave/mruby/test/t/ensure.rb +36 -0
  619. data/ext/enclave/mruby/test/t/enumerable.rb +134 -0
  620. data/ext/enclave/mruby/test/t/exception.rb +425 -0
  621. data/ext/enclave/mruby/test/t/false.rb +31 -0
  622. data/ext/enclave/mruby/test/t/float.rb +296 -0
  623. data/ext/enclave/mruby/test/t/gc.rb +45 -0
  624. data/ext/enclave/mruby/test/t/hash.rb +976 -0
  625. data/ext/enclave/mruby/test/t/indexerror.rb +6 -0
  626. data/ext/enclave/mruby/test/t/integer.rb +247 -0
  627. data/ext/enclave/mruby/test/t/iterations.rb +61 -0
  628. data/ext/enclave/mruby/test/t/kernel.rb +462 -0
  629. data/ext/enclave/mruby/test/t/lang.rb +74 -0
  630. data/ext/enclave/mruby/test/t/literals.rb +386 -0
  631. data/ext/enclave/mruby/test/t/localjumperror.rb +13 -0
  632. data/ext/enclave/mruby/test/t/methods.rb +138 -0
  633. data/ext/enclave/mruby/test/t/module.rb +931 -0
  634. data/ext/enclave/mruby/test/t/nameerror.rb +28 -0
  635. data/ext/enclave/mruby/test/t/nil.rb +39 -0
  636. data/ext/enclave/mruby/test/t/nomethoderror.rb +22 -0
  637. data/ext/enclave/mruby/test/t/numeric.rb +114 -0
  638. data/ext/enclave/mruby/test/t/object.rb +10 -0
  639. data/ext/enclave/mruby/test/t/proc.rb +198 -0
  640. data/ext/enclave/mruby/test/t/range.rb +194 -0
  641. data/ext/enclave/mruby/test/t/rangeerror.rb +6 -0
  642. data/ext/enclave/mruby/test/t/regexperror.rb +4 -0
  643. data/ext/enclave/mruby/test/t/runtimeerror.rb +6 -0
  644. data/ext/enclave/mruby/test/t/standarderror.rb +6 -0
  645. data/ext/enclave/mruby/test/t/string.rb +981 -0
  646. data/ext/enclave/mruby/test/t/superclass.rb +46 -0
  647. data/ext/enclave/mruby/test/t/symbol.rb +30 -0
  648. data/ext/enclave/mruby/test/t/syntax.rb +1296 -0
  649. data/ext/enclave/mruby/test/t/true.rb +31 -0
  650. data/ext/enclave/mruby/test/t/typeerror.rb +6 -0
  651. data/ext/enclave/mruby/test/t/unicode.rb +39 -0
  652. data/ext/enclave/mruby/test/t/vformat.rb +57 -0
  653. data/ext/enclave/mruby/tools/lrama/LEGAL.md +12 -0
  654. data/ext/enclave/mruby/tools/lrama/MIT +21 -0
  655. data/ext/enclave/mruby/tools/lrama/NEWS.md +696 -0
  656. data/ext/enclave/mruby/tools/lrama/exe/lrama +7 -0
  657. data/ext/enclave/mruby/tools/lrama/lib/lrama/bitmap.rb +34 -0
  658. data/ext/enclave/mruby/tools/lrama/lib/lrama/command.rb +68 -0
  659. data/ext/enclave/mruby/tools/lrama/lib/lrama/context.rb +499 -0
  660. data/ext/enclave/mruby/tools/lrama/lib/lrama/counterexamples/derivation.rb +66 -0
  661. data/ext/enclave/mruby/tools/lrama/lib/lrama/counterexamples/example.rb +129 -0
  662. data/ext/enclave/mruby/tools/lrama/lib/lrama/counterexamples/path.rb +29 -0
  663. data/ext/enclave/mruby/tools/lrama/lib/lrama/counterexamples/production_path.rb +19 -0
  664. data/ext/enclave/mruby/tools/lrama/lib/lrama/counterexamples/start_path.rb +23 -0
  665. data/ext/enclave/mruby/tools/lrama/lib/lrama/counterexamples/state_item.rb +8 -0
  666. data/ext/enclave/mruby/tools/lrama/lib/lrama/counterexamples/transition_path.rb +19 -0
  667. data/ext/enclave/mruby/tools/lrama/lib/lrama/counterexamples/triple.rb +23 -0
  668. data/ext/enclave/mruby/tools/lrama/lib/lrama/counterexamples.rb +298 -0
  669. data/ext/enclave/mruby/tools/lrama/lib/lrama/diagnostics.rb +36 -0
  670. data/ext/enclave/mruby/tools/lrama/lib/lrama/digraph.rb +83 -0
  671. data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/auxiliary.rb +9 -0
  672. data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/binding.rb +67 -0
  673. data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/code/destructor_code.rb +42 -0
  674. data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/code/initial_action_code.rb +36 -0
  675. data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/code/no_reference_code.rb +30 -0
  676. data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/code/printer_code.rb +42 -0
  677. data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/code/rule_action.rb +92 -0
  678. data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/code.rb +53 -0
  679. data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/counter.rb +17 -0
  680. data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/destructor.rb +11 -0
  681. data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/error_token.rb +11 -0
  682. data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/parameterizing_rule/resolver.rb +62 -0
  683. data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/parameterizing_rule/rhs.rb +40 -0
  684. data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/parameterizing_rule/rule.rb +24 -0
  685. data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/parameterizing_rule.rb +5 -0
  686. data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/percent_code.rb +14 -0
  687. data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/precedence.rb +13 -0
  688. data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/printer.rb +11 -0
  689. data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/reference.rb +16 -0
  690. data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/rule.rb +75 -0
  691. data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/rule_builder.rb +255 -0
  692. data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/stdlib.y +122 -0
  693. data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/symbol.rb +105 -0
  694. data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/symbols/resolver.rb +301 -0
  695. data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/symbols.rb +3 -0
  696. data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/type.rb +20 -0
  697. data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar/union.rb +12 -0
  698. data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar.rb +407 -0
  699. data/ext/enclave/mruby/tools/lrama/lib/lrama/grammar_validator.rb +37 -0
  700. data/ext/enclave/mruby/tools/lrama/lib/lrama/lexer/grammar_file.rb +40 -0
  701. data/ext/enclave/mruby/tools/lrama/lib/lrama/lexer/location.rb +115 -0
  702. data/ext/enclave/mruby/tools/lrama/lib/lrama/lexer/token/char.rb +11 -0
  703. data/ext/enclave/mruby/tools/lrama/lib/lrama/lexer/token/ident.rb +11 -0
  704. data/ext/enclave/mruby/tools/lrama/lib/lrama/lexer/token/instantiate_rule.rb +30 -0
  705. data/ext/enclave/mruby/tools/lrama/lib/lrama/lexer/token/tag.rb +16 -0
  706. data/ext/enclave/mruby/tools/lrama/lib/lrama/lexer/token/user_code.rb +83 -0
  707. data/ext/enclave/mruby/tools/lrama/lib/lrama/lexer/token.rb +70 -0
  708. data/ext/enclave/mruby/tools/lrama/lib/lrama/lexer.rb +191 -0
  709. data/ext/enclave/mruby/tools/lrama/lib/lrama/logger.rb +21 -0
  710. data/ext/enclave/mruby/tools/lrama/lib/lrama/option_parser.rb +169 -0
  711. data/ext/enclave/mruby/tools/lrama/lib/lrama/options.rb +28 -0
  712. data/ext/enclave/mruby/tools/lrama/lib/lrama/output.rb +459 -0
  713. data/ext/enclave/mruby/tools/lrama/lib/lrama/parser.rb +2144 -0
  714. data/ext/enclave/mruby/tools/lrama/lib/lrama/report/duration.rb +27 -0
  715. data/ext/enclave/mruby/tools/lrama/lib/lrama/report/profile.rb +16 -0
  716. data/ext/enclave/mruby/tools/lrama/lib/lrama/report.rb +4 -0
  717. data/ext/enclave/mruby/tools/lrama/lib/lrama/state/reduce.rb +37 -0
  718. data/ext/enclave/mruby/tools/lrama/lib/lrama/state/reduce_reduce_conflict.rb +11 -0
  719. data/ext/enclave/mruby/tools/lrama/lib/lrama/state/resolved_conflict.rb +31 -0
  720. data/ext/enclave/mruby/tools/lrama/lib/lrama/state/shift.rb +15 -0
  721. data/ext/enclave/mruby/tools/lrama/lib/lrama/state/shift_reduce_conflict.rb +11 -0
  722. data/ext/enclave/mruby/tools/lrama/lib/lrama/state.rb +433 -0
  723. data/ext/enclave/mruby/tools/lrama/lib/lrama/states/item.rb +91 -0
  724. data/ext/enclave/mruby/tools/lrama/lib/lrama/states.rb +595 -0
  725. data/ext/enclave/mruby/tools/lrama/lib/lrama/states_reporter.rb +362 -0
  726. data/ext/enclave/mruby/tools/lrama/lib/lrama/trace_reporter.rb +45 -0
  727. data/ext/enclave/mruby/tools/lrama/lib/lrama/version.rb +5 -0
  728. data/ext/enclave/mruby/tools/lrama/lib/lrama.rb +22 -0
  729. data/ext/enclave/mruby/tools/lrama/template/bison/_yacc.h +71 -0
  730. data/ext/enclave/mruby/tools/lrama/template/bison/yacc.c +2068 -0
  731. data/ext/enclave/mruby/tools/lrama/template/bison/yacc.h +40 -0
  732. data/ext/enclave/sandbox_build_config.rb +15 -0
  733. data/ext/enclave/sandbox_core.c +722 -0
  734. data/ext/enclave/sandbox_core.h +87 -0
  735. data/lib/enclave/result.rb +29 -0
  736. data/lib/enclave/tool.rb +38 -0
  737. data/lib/enclave/version.rb +3 -0
  738. data/lib/enclave.rb +73 -0
  739. 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
+ }