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,1118 @@
1
+ /*
2
+ ** mirb_editor.c - Multi-line editor for mirb
3
+ **
4
+ ** See Copyright Notice in mruby.h
5
+ */
6
+
7
+ #include "mirb_editor.h"
8
+ #include <stdio.h>
9
+ #include <stdlib.h>
10
+ #include <string.h>
11
+
12
+ /* ANSI color codes */
13
+ #define COLOR_GREEN "\033[32m"
14
+ #define COLOR_RESET "\033[0m"
15
+
16
+ /*
17
+ * Check if line contains only whitespace before given column
18
+ */
19
+ static mrb_bool
20
+ line_is_blank_before(const char *line, size_t col)
21
+ {
22
+ for (size_t i = 0; i < col; i++) {
23
+ if (line[i] != ' ' && line[i] != '\t') {
24
+ return FALSE;
25
+ }
26
+ }
27
+ return TRUE;
28
+ }
29
+
30
+ /*
31
+ * Get leading whitespace count on current line
32
+ */
33
+ static size_t
34
+ leading_spaces(const char *line)
35
+ {
36
+ size_t count = 0;
37
+ while (line[count] == ' ' || line[count] == '\t') {
38
+ count++;
39
+ }
40
+ return count;
41
+ }
42
+
43
+ /*
44
+ * Check if content starts with a dedenting keyword
45
+ * (end, else, elsif, when, in, rescue, ensure) or '}'
46
+ */
47
+ static mrb_bool
48
+ is_dedent_keyword(const char *content)
49
+ {
50
+ if (content[0] == '}') return TRUE;
51
+ if (strncmp(content, "end", 3) == 0 &&
52
+ (content[3] == '\0' || content[3] == ' ' || content[3] == '\t' ||
53
+ content[3] == '.' || content[3] == ')')) return TRUE;
54
+ if (strncmp(content, "else", 4) == 0 &&
55
+ (content[4] == '\0' || content[4] == ' ' || content[4] == '\t')) return TRUE;
56
+ if (strncmp(content, "elsif", 5) == 0 && content[5] == ' ') return TRUE;
57
+ if (strncmp(content, "when", 4) == 0 && content[4] == ' ') return TRUE;
58
+ if (strncmp(content, "in", 2) == 0 && content[2] == ' ') return TRUE;
59
+ if (strncmp(content, "rescue", 6) == 0 &&
60
+ (content[6] == '\0' || content[6] == ' ' || content[6] == '\t')) return TRUE;
61
+ if (strncmp(content, "ensure", 6) == 0 &&
62
+ (content[6] == '\0' || content[6] == ' ' || content[6] == '\t')) return TRUE;
63
+ return FALSE;
64
+ }
65
+
66
+ /*
67
+ * Check if a line contains only whitespace (or is empty)
68
+ */
69
+ static mrb_bool
70
+ is_line_blank(const mirb_line *line)
71
+ {
72
+ for (size_t i = 0; i < line->len; i++) {
73
+ if (line->data[i] != ' ' && line->data[i] != '\t') {
74
+ return FALSE;
75
+ }
76
+ }
77
+ return TRUE;
78
+ }
79
+
80
+ /*
81
+ * Calculate indent level by counting open blocks in code
82
+ */
83
+ static int
84
+ calc_indent_level(const char *code)
85
+ {
86
+ int level = 0;
87
+ const char *p = code;
88
+ int at_line_start = 1;
89
+
90
+ while (*p) {
91
+ /* Skip strings */
92
+ if (*p == '"' || *p == '\'') {
93
+ char quote = *p++;
94
+ while (*p && *p != quote) {
95
+ if (*p == '\\' && p[1]) p++;
96
+ p++;
97
+ }
98
+ if (*p) p++;
99
+ at_line_start = 0;
100
+ continue;
101
+ }
102
+ /* Skip comments */
103
+ if (*p == '#') {
104
+ while (*p && *p != '\n') p++;
105
+ continue;
106
+ }
107
+ /* Track line starts for keyword detection */
108
+ if (*p == '\n') {
109
+ at_line_start = 1;
110
+ p++;
111
+ continue;
112
+ }
113
+ /* Skip whitespace but don't change at_line_start yet */
114
+ if (*p == ' ' || *p == '\t') {
115
+ p++;
116
+ continue;
117
+ }
118
+ /* Check for block-opening keywords at word boundary */
119
+ if (at_line_start || (p > code && !((p[-1] >= 'a' && p[-1] <= 'z') ||
120
+ (p[-1] >= 'A' && p[-1] <= 'Z') ||
121
+ (p[-1] >= '0' && p[-1] <= '9') ||
122
+ p[-1] == '_'))) {
123
+ /* Check block-opening keywords */
124
+ if ((strncmp(p, "def ", 4) == 0) ||
125
+ (strncmp(p, "class ", 6) == 0) ||
126
+ (strncmp(p, "module ", 7) == 0) ||
127
+ (strncmp(p, "if ", 3) == 0) ||
128
+ (strncmp(p, "unless ", 7) == 0) ||
129
+ (strncmp(p, "case ", 5) == 0) ||
130
+ (strncmp(p, "while ", 6) == 0) ||
131
+ (strncmp(p, "until ", 6) == 0) ||
132
+ (strncmp(p, "for ", 4) == 0) ||
133
+ (strncmp(p, "begin", 5) == 0 && (p[5] == '\0' || p[5] == '\n' || p[5] == ' ' || p[5] == '#')) ||
134
+ (strncmp(p, "do", 2) == 0 && (p[2] == '\0' || p[2] == '\n' || p[2] == ' ' || p[2] == '#' || p[2] == '|'))) {
135
+ level++;
136
+ }
137
+ /* Check block-closing keyword */
138
+ else if (strncmp(p, "end", 3) == 0 &&
139
+ (p[3] == '\0' || p[3] == '\n' || p[3] == ' ' || p[3] == '#' || p[3] == '.' || p[3] == ')')) {
140
+ if (level > 0) level--;
141
+ }
142
+ }
143
+ /* Check for block opening/closing with braces */
144
+ if (*p == '{') {
145
+ level++;
146
+ }
147
+ else if (*p == '}') {
148
+ if (level > 0) level--;
149
+ }
150
+ at_line_start = 0;
151
+ p++;
152
+ }
153
+ return level;
154
+ }
155
+
156
+ /*
157
+ * Check if we should dedent after typing a character
158
+ * Returns TRUE if current line starts with 'end' or '}' after only whitespace
159
+ */
160
+ static mrb_bool
161
+ should_dedent(mirb_buffer *buf, char last_char)
162
+ {
163
+ const char *line = mirb_buffer_current_line(buf);
164
+ size_t col = buf->cursor_col;
165
+ size_t line_len = buf->lines[buf->cursor_line].len;
166
+
167
+ /* Check for '}' - dedent immediately when typed at line start */
168
+ if (last_char == '}') {
169
+ if (col == 1 || (col > 1 && line_is_blank_before(line, col - 1))) {
170
+ return TRUE;
171
+ }
172
+ }
173
+
174
+ /* Helper macro: check keyword completion */
175
+ #define CHECK_KEYWORD(keyword, len, trigger_char) \
176
+ if (last_char == trigger_char && col >= len) { \
177
+ if (strncmp(line + col - len, keyword, len) == 0) { \
178
+ if (col == len || line_is_blank_before(line, col - len)) { \
179
+ if (col == line_len || \
180
+ line[col] == ' ' || line[col] == '\t' || line[col] == '\0' || \
181
+ line[col] == '\n' || line[col] == '.' || line[col] == ')') { \
182
+ return TRUE; \
183
+ } \
184
+ } \
185
+ } \
186
+ }
187
+
188
+ /* Check for 'end' - dedent when 'd' completes "end" */
189
+ CHECK_KEYWORD("end", 3, 'd');
190
+
191
+ /* Check for 'else' - dedent when 'e' completes "else" */
192
+ CHECK_KEYWORD("else", 4, 'e');
193
+
194
+ /* Check for 'elsif' - dedent when 'f' completes "elsif" */
195
+ CHECK_KEYWORD("elsif", 5, 'f');
196
+
197
+ /* Check for 'when' - dedent when 'n' completes "when" */
198
+ CHECK_KEYWORD("when", 4, 'n');
199
+
200
+ /* Check for 'in' - dedent when 'n' completes "in" (pattern matching) */
201
+ CHECK_KEYWORD("in", 2, 'n');
202
+
203
+ /* Check for 'rescue' - dedent when 'e' completes "rescue" */
204
+ CHECK_KEYWORD("rescue", 6, 'e');
205
+
206
+ /* Check for 'ensure' - dedent when 'e' completes "ensure" */
207
+ CHECK_KEYWORD("ensure", 6, 'e');
208
+
209
+ #undef CHECK_KEYWORD
210
+
211
+ return FALSE;
212
+ }
213
+
214
+ /*
215
+ * Perform dedentation - remove one level (2 spaces) of leading whitespace
216
+ */
217
+ static void
218
+ perform_dedent(mirb_buffer *buf)
219
+ {
220
+ const char *line = mirb_buffer_current_line(buf);
221
+ size_t current_spaces = leading_spaces(line);
222
+ int expected_indent = 0;
223
+
224
+ /* Calculate expected indent from code up to previous line */
225
+ if (buf->cursor_line > 0) {
226
+ char *partial = mirb_buffer_to_string_upto_line(buf, buf->cursor_line - 1);
227
+ if (partial) {
228
+ expected_indent = calc_indent_level(partial);
229
+ free(partial);
230
+ }
231
+ }
232
+
233
+ /* Dedent one level for keywords like end, else, etc. */
234
+ if (expected_indent > 0) expected_indent--;
235
+
236
+ size_t target_spaces = (size_t)(expected_indent * 2);
237
+
238
+ /* Only dedent if we have more spaces than target */
239
+ if (current_spaces > target_spaces) {
240
+ size_t to_remove = current_spaces - target_spaces;
241
+ size_t saved_col = buf->cursor_col;
242
+ /* Move cursor to start of line and delete leading spaces */
243
+ buf->cursor_col = 0;
244
+ for (size_t i = 0; i < to_remove; i++) {
245
+ mirb_buffer_delete_forward(buf);
246
+ }
247
+ /* Restore cursor position, adjusted for removed spaces */
248
+ buf->cursor_col = (saved_col > to_remove) ? (saved_col - to_remove) : 0;
249
+ }
250
+ }
251
+
252
+
253
+ /*
254
+ * Re-indent current line to match expected indent level
255
+ * Used before inserting newline to fix any misaligned indentation
256
+ */
257
+ static void
258
+ reindent_line(mirb_buffer *buf)
259
+ {
260
+ mirb_line *line = &buf->lines[buf->cursor_line];
261
+ size_t current_spaces = 0;
262
+ int expected_indent = 0;
263
+ const char *content;
264
+
265
+ /* Count current leading whitespace */
266
+ for (size_t i = 0; i < line->len && (line->data[i] == ' ' || line->data[i] == '\t'); i++) {
267
+ current_spaces++;
268
+ }
269
+
270
+ /* Calculate expected indent from code up to previous line */
271
+ if (buf->cursor_line > 0) {
272
+ char *partial = mirb_buffer_to_string_upto_line(buf, buf->cursor_line - 1);
273
+ if (partial) {
274
+ expected_indent = calc_indent_level(partial);
275
+ free(partial);
276
+ }
277
+ }
278
+
279
+ /* Check if line content starts with dedenting keyword */
280
+ content = line->data + current_spaces;
281
+ if (is_dedent_keyword(content)) {
282
+ if (expected_indent > 0) expected_indent--;
283
+ }
284
+
285
+ size_t target_spaces = (size_t)(expected_indent * 2);
286
+
287
+ /* Adjust indentation if needed */
288
+ if (target_spaces != current_spaces) {
289
+ size_t saved_col = buf->cursor_col;
290
+
291
+ if (target_spaces > current_spaces) {
292
+ /* Need to add spaces */
293
+ size_t add = target_spaces - current_spaces;
294
+ buf->cursor_col = 0;
295
+ for (size_t i = 0; i < add; i++) {
296
+ mirb_buffer_insert_char(buf, ' ');
297
+ }
298
+ buf->cursor_col = saved_col + add;
299
+ }
300
+ else {
301
+ /* Need to remove spaces */
302
+ size_t remove = current_spaces - target_spaces;
303
+ buf->cursor_col = current_spaces;
304
+ for (size_t i = 0; i < remove; i++) {
305
+ mirb_buffer_delete_back(buf);
306
+ }
307
+ buf->cursor_col = (saved_col > remove) ? (saved_col - remove) : 0;
308
+ }
309
+ }
310
+ }
311
+
312
+ /*
313
+ * Initialize editor
314
+ */
315
+ mrb_bool
316
+ mirb_editor_init(mirb_editor *ed)
317
+ {
318
+ memset(ed, 0, sizeof(*ed));
319
+
320
+ if (!mirb_term_init(&ed->term)) {
321
+ /* Terminal init may fail but we can still work in simple mode */
322
+ }
323
+
324
+ if (!mirb_buffer_init(&ed->buf)) {
325
+ mirb_term_cleanup(&ed->term);
326
+ return FALSE;
327
+ }
328
+
329
+ if (!mirb_history_init(&ed->hist, MIRB_HISTORY_SIZE)) {
330
+ mirb_buffer_free(&ed->buf);
331
+ mirb_term_cleanup(&ed->term);
332
+ return FALSE;
333
+ }
334
+
335
+ ed->prompt = "> ";
336
+ ed->prompt_cont = "* ";
337
+ ed->prompt_len = 2;
338
+ ed->prompt_cont_len = 2;
339
+ ed->prompt_fmt = NULL;
340
+ ed->prompt_cont_fmt = NULL;
341
+ ed->line_num_base = 1;
342
+ ed->use_color = FALSE;
343
+ mirb_highlight_init(&ed->highlight, FALSE);
344
+ ed->initialized = TRUE;
345
+
346
+ return TRUE;
347
+ }
348
+
349
+ /*
350
+ * Cleanup editor
351
+ */
352
+ void
353
+ mirb_editor_cleanup(mirb_editor *ed)
354
+ {
355
+ if (!ed->initialized) return;
356
+
357
+ mirb_history_free(&ed->hist);
358
+ mirb_buffer_free(&ed->buf);
359
+ mirb_term_cleanup(&ed->term);
360
+ ed->initialized = FALSE;
361
+ }
362
+
363
+ /*
364
+ * Set prompts (fixed strings)
365
+ */
366
+ void
367
+ mirb_editor_set_prompts(mirb_editor *ed, const char *prompt, const char *prompt_cont)
368
+ {
369
+ ed->prompt = prompt;
370
+ ed->prompt_cont = prompt_cont;
371
+ ed->prompt_len = strlen(prompt);
372
+ ed->prompt_cont_len = strlen(prompt_cont);
373
+ ed->prompt_fmt = NULL;
374
+ ed->prompt_cont_fmt = NULL;
375
+ }
376
+
377
+ /*
378
+ * Set prompt format strings for line-numbered prompts
379
+ */
380
+ void
381
+ mirb_editor_set_prompt_format(mirb_editor *ed, const char *prompt_fmt,
382
+ const char *prompt_cont_fmt, int line_num)
383
+ {
384
+ ed->prompt_fmt = prompt_fmt;
385
+ ed->prompt_cont_fmt = prompt_cont_fmt;
386
+ ed->line_num_base = line_num;
387
+ /* Estimate prompt length (assuming line numbers up to 999) */
388
+ ed->prompt_len = strlen(prompt_fmt) + 2; /* %d -> up to 3 digits, minus 2 for %d */
389
+ ed->prompt_cont_len = strlen(prompt_cont_fmt) + 2;
390
+ }
391
+
392
+ /*
393
+ * Set completion checker
394
+ */
395
+ void
396
+ mirb_editor_set_check_complete(mirb_editor *ed, mirb_check_complete_fn *fn, void *user_data)
397
+ {
398
+ ed->check_complete = fn;
399
+ ed->check_complete_data = user_data;
400
+ }
401
+
402
+ /*
403
+ * Set tab completion callbacks
404
+ */
405
+ void
406
+ mirb_editor_set_tab_complete(mirb_editor *ed,
407
+ mirb_tab_complete_fn *complete_fn,
408
+ mirb_tab_complete_free_fn *free_fn,
409
+ void *user_data)
410
+ {
411
+ ed->tab_complete = complete_fn;
412
+ ed->tab_complete_free = free_fn;
413
+ ed->tab_complete_data = user_data;
414
+ }
415
+
416
+ /*
417
+ * Handle tab completion
418
+ * Returns TRUE if completion was performed
419
+ */
420
+
421
+ /*
422
+ * Handle tab auto-indent
423
+ * Adjusts current line's indentation to match the expected level
424
+ */
425
+ static void
426
+ handle_tab_indent(mirb_editor *ed)
427
+ {
428
+ mirb_line *line = &ed->buf.lines[ed->buf.cursor_line];
429
+ int expected_indent = 0;
430
+ size_t current_spaces = 0;
431
+ size_t i;
432
+ const char *content;
433
+ size_t saved_cursor_col = ed->buf.cursor_col;
434
+
435
+ /* Calculate expected indent from code up to previous line */
436
+ if (ed->buf.cursor_line > 0) {
437
+ char *partial = mirb_buffer_to_string_upto_line(&ed->buf, ed->buf.cursor_line - 1);
438
+ if (partial) {
439
+ expected_indent = calc_indent_level(partial);
440
+ free(partial);
441
+ }
442
+ }
443
+
444
+ /* Count current leading whitespace */
445
+ for (i = 0; i < line->len && (line->data[i] == ' ' || line->data[i] == '\t'); i++) {
446
+ current_spaces++;
447
+ }
448
+
449
+ /* Check if line content starts with dedenting keyword */
450
+ content = line->data + current_spaces;
451
+ if (is_dedent_keyword(content)) {
452
+ if (expected_indent > 0) expected_indent--;
453
+ }
454
+
455
+ /* Calculate target spaces (2 spaces per indent level) */
456
+ size_t target_spaces = (size_t)(expected_indent * 2);
457
+
458
+ /* Adjust indentation */
459
+ if (target_spaces > current_spaces) {
460
+ /* Need to add spaces - insert at beginning */
461
+ size_t add = target_spaces - current_spaces;
462
+ ed->buf.cursor_col = 0;
463
+ for (i = 0; i < add; i++) {
464
+ mirb_buffer_insert_char(&ed->buf, ' ');
465
+ }
466
+ }
467
+ else if (target_spaces < current_spaces) {
468
+ /* Need to remove spaces */
469
+ size_t remove = current_spaces - target_spaces;
470
+ ed->buf.cursor_col = current_spaces;
471
+ for (i = 0; i < remove; i++) {
472
+ mirb_buffer_delete_back(&ed->buf);
473
+ }
474
+ }
475
+
476
+ /* Restore cursor position adjusted for indent change */
477
+ if (target_spaces >= current_spaces) {
478
+ ed->buf.cursor_col = saved_cursor_col + (target_spaces - current_spaces);
479
+ }
480
+ else {
481
+ size_t removed = current_spaces - target_spaces;
482
+ if (saved_cursor_col >= removed) {
483
+ ed->buf.cursor_col = saved_cursor_col - removed;
484
+ }
485
+ else {
486
+ ed->buf.cursor_col = 0;
487
+ }
488
+ }
489
+ }
490
+
491
+ static mrb_bool
492
+ handle_tab_completion(mirb_editor *ed)
493
+ {
494
+ char **completions = NULL;
495
+ int count, prefix_len;
496
+ const char *current_line;
497
+ int cursor_col;
498
+
499
+ if (!ed->tab_complete) return FALSE;
500
+
501
+ /* Get current line and cursor position */
502
+ current_line = ed->buf.lines[ed->buf.cursor_line].data;
503
+ cursor_col = (int)ed->buf.cursor_col;
504
+
505
+ /* Get completions */
506
+ count = ed->tab_complete(current_line, cursor_col, &completions, &prefix_len,
507
+ ed->tab_complete_data);
508
+
509
+ if (count == 0 || !completions) {
510
+ return FALSE;
511
+ }
512
+
513
+ if (count == 1) {
514
+ /* Single completion - insert it */
515
+ const char *completion = completions[0];
516
+ int i;
517
+
518
+ /* Delete the prefix we're replacing */
519
+ for (i = 0; i < prefix_len; i++) {
520
+ mirb_buffer_delete_back(&ed->buf);
521
+ }
522
+
523
+ /* Insert completion */
524
+ mirb_buffer_insert_string(&ed->buf, completion, strlen(completion));
525
+ }
526
+ else {
527
+ /* Multiple completions - find common prefix and show options */
528
+ int common_len = (int)strlen(completions[0]);
529
+ int i, j;
530
+
531
+ /* Find longest common prefix */
532
+ for (i = 1; i < count; i++) {
533
+ for (j = 0; j < common_len && completions[i][j]; j++) {
534
+ if (completions[0][j] != completions[i][j]) {
535
+ common_len = j;
536
+ break;
537
+ }
538
+ }
539
+ if (j < common_len) common_len = j;
540
+ }
541
+
542
+ if (common_len > prefix_len) {
543
+ /* Extend with common prefix */
544
+ for (i = 0; i < prefix_len; i++) {
545
+ mirb_buffer_delete_back(&ed->buf);
546
+ }
547
+ mirb_buffer_insert_string(&ed->buf, completions[0], common_len);
548
+ }
549
+ else {
550
+ /* Show all completions */
551
+ printf("\r\n");
552
+ for (i = 0; i < count; i++) {
553
+ printf("%s ", completions[i]);
554
+ if ((i + 1) % 4 == 0 && i + 1 < count) printf("\r\n");
555
+ }
556
+ printf("\r\n");
557
+ /* Force full redraw */
558
+ ed->prev_line_count = 0;
559
+ }
560
+ }
561
+
562
+ /* Free completions */
563
+ if (ed->tab_complete_free) {
564
+ ed->tab_complete_free(completions, count, ed->tab_complete_data);
565
+ }
566
+
567
+ return TRUE;
568
+ }
569
+
570
+ /*
571
+ * Enable/disable color
572
+ */
573
+ void
574
+ mirb_editor_set_color(mirb_editor *ed, mrb_bool enable)
575
+ {
576
+ ed->use_color = enable;
577
+ mirb_highlight_init(&ed->highlight, enable);
578
+ }
579
+
580
+ /*
581
+ * Check if multi-line editing is supported
582
+ */
583
+ mrb_bool
584
+ mirb_editor_supported(mirb_editor *ed)
585
+ {
586
+ return ed->term.supported;
587
+ }
588
+
589
+ /*
590
+ * Calculate prompt length for given line
591
+ */
592
+ static size_t
593
+ calc_prompt_len(mirb_editor *ed, size_t line_idx)
594
+ {
595
+ if (ed->prompt_fmt != NULL) {
596
+ /* Format string: calculate actual length */
597
+ int line_num = ed->line_num_base + (int)line_idx;
598
+ const char *fmt = (line_idx == 0) ? ed->prompt_fmt : ed->prompt_cont_fmt;
599
+ return (size_t)snprintf(NULL, 0, fmt, line_num);
600
+ }
601
+ else {
602
+ /* Fixed prompt string */
603
+ return (line_idx == 0) ? ed->prompt_len : ed->prompt_cont_len;
604
+ }
605
+ }
606
+
607
+ /*
608
+ * Print prompt for given line
609
+ */
610
+ static void
611
+ print_prompt(mirb_editor *ed, size_t line_idx)
612
+ {
613
+ int line_num = ed->line_num_base + (int)line_idx;
614
+
615
+ if (ed->use_color) {
616
+ printf("%s", COLOR_GREEN);
617
+ }
618
+
619
+ if (ed->prompt_fmt != NULL) {
620
+ /* Use format string with line number */
621
+ const char *fmt = (line_idx == 0) ? ed->prompt_fmt : ed->prompt_cont_fmt;
622
+ printf(fmt, line_num);
623
+ }
624
+ else {
625
+ /* Use fixed prompt string */
626
+ const char *p = (line_idx == 0) ? ed->prompt : ed->prompt_cont;
627
+ printf("%s", p);
628
+ }
629
+
630
+ if (ed->use_color) {
631
+ printf("%s", COLOR_RESET);
632
+ }
633
+ }
634
+
635
+ /*
636
+ * Refresh display - uses natural terminal scrolling like irb
637
+ *
638
+ * Strategy:
639
+ * - Track which screen row we started on
640
+ * - Move cursor back to start, clear everything below, redraw all lines
641
+ * - This allows terminal to scroll naturally without corrupting history
642
+ */
643
+ static void
644
+ refresh_display(mirb_editor *ed)
645
+ {
646
+ size_t lines_to_go_up;
647
+
648
+ /* Calculate how many lines up we need to go to reach start of input */
649
+ /* We're currently on cursor_line, and prev_line_count tells us total displayed */
650
+ if (ed->prev_line_count > 0) {
651
+ /* Go up from current position to first line of input */
652
+ lines_to_go_up = ed->display_cursor_row;
653
+ if (lines_to_go_up > 0) {
654
+ mirb_term_cursor_up((int)lines_to_go_up);
655
+ }
656
+ }
657
+
658
+ /* Move to column 1 and clear from here to end of screen */
659
+ mirb_term_cursor_col(1);
660
+ mirb_term_clear_below();
661
+
662
+ /* Reset highlight state for fresh scan */
663
+ mirb_highlight_reset(&ed->highlight);
664
+
665
+ /* Redraw all lines */
666
+ for (size_t i = 0; i < ed->buf.line_count; i++) {
667
+ print_prompt(ed, i);
668
+ mirb_highlight_print_line(&ed->highlight, mirb_buffer_line_at(&ed->buf, i));
669
+
670
+ if (i < ed->buf.line_count - 1) {
671
+ printf("\r\n");
672
+ }
673
+ }
674
+
675
+ /* Now position cursor correctly */
676
+ /* We're at the end of last line, need to go to cursor position */
677
+ size_t lines_up_from_end = ed->buf.line_count - 1 - ed->buf.cursor_line;
678
+ if (lines_up_from_end > 0) {
679
+ mirb_term_cursor_up((int)lines_up_from_end);
680
+ }
681
+
682
+ /* Position column on cursor line (calculate actual prompt length) */
683
+ size_t prompt_len = calc_prompt_len(ed, ed->buf.cursor_line);
684
+ size_t display_col = mirb_buffer_cursor_display_col(&ed->buf);
685
+ mirb_term_cursor_col((int)(prompt_len + display_col + 1));
686
+
687
+ /* Update tracking */
688
+ ed->prev_line_count = ed->buf.line_count;
689
+ ed->display_cursor_row = ed->buf.cursor_line;
690
+
691
+ mirb_term_flush();
692
+ }
693
+
694
+ /*
695
+ * Handle a keypress
696
+ * Returns TRUE to continue editing, FALSE to finish
697
+ */
698
+ static mrb_bool
699
+ handle_key(mirb_editor *ed, int key, mirb_edit_result *result)
700
+ {
701
+ switch (key) {
702
+ case MIRB_KEY_ENTER:
703
+ /* Stop history browsing */
704
+ mirb_history_browse_stop(&ed->hist);
705
+ /* Re-indent current line before inserting newline */
706
+ reindent_line(&ed->buf);
707
+ {
708
+ /*
709
+ * Smart Enter behavior:
710
+ * - Only evaluate when cursor is at end of last line and code is complete
711
+ * - If cursor is not at end of last line, always insert/split (no evaluation)
712
+ * - If next line is blank last line and cursor at end, move to it
713
+ */
714
+ mrb_bool at_last_line = (ed->buf.cursor_line == ed->buf.line_count - 1);
715
+ mirb_line *current_line = &ed->buf.lines[ed->buf.cursor_line];
716
+ mrb_bool at_end_of_line = (ed->buf.cursor_col == current_line->len);
717
+ mrb_bool can_evaluate = at_last_line && at_end_of_line;
718
+
719
+ /* Check for smart navigation to existing blank last line */
720
+ if (!at_last_line && at_end_of_line) {
721
+ size_t next_line_idx = ed->buf.cursor_line + 1;
722
+ mrb_bool next_is_last = (next_line_idx == ed->buf.line_count - 1);
723
+
724
+ if (next_is_last) {
725
+ mirb_line *next_line = &ed->buf.lines[next_line_idx];
726
+ if (is_line_blank(next_line)) {
727
+ /* Move to existing blank last line with proper indentation */
728
+ char *code = mirb_buffer_to_string(&ed->buf);
729
+ int indent = code ? calc_indent_level(code) : 0;
730
+ free(code);
731
+
732
+ mirb_buffer_cursor_down(&ed->buf);
733
+ /* Clear existing whitespace and set correct indent */
734
+ mirb_line *line = &ed->buf.lines[ed->buf.cursor_line];
735
+ line->len = 0;
736
+ line->data[0] = '\0';
737
+ ed->buf.cursor_col = 0;
738
+ for (int i = 0; i < indent * 2; i++) {
739
+ mirb_buffer_insert_char(&ed->buf, ' ');
740
+ }
741
+ return TRUE;
742
+ }
743
+ }
744
+ }
745
+
746
+ /* If cursor in middle of line and next is blank last, remove it before split */
747
+ if (!at_last_line && !at_end_of_line) {
748
+ size_t next_line_idx = ed->buf.cursor_line + 1;
749
+ if (next_line_idx == ed->buf.line_count - 1) {
750
+ mirb_line *next_line = &ed->buf.lines[next_line_idx];
751
+ if (is_line_blank(next_line)) {
752
+ mirb_buffer_delete_line(&ed->buf, next_line_idx);
753
+ }
754
+ }
755
+ }
756
+
757
+ /* Check if input is complete - only when cursor at end of last line */
758
+ if (can_evaluate && ed->check_complete) {
759
+ char *code = mirb_buffer_to_string(&ed->buf);
760
+ if (code) {
761
+ mrb_bool complete = ed->check_complete(code, ed->check_complete_data);
762
+ if (complete) {
763
+ free(code);
764
+ *result = MIRB_EDIT_OK;
765
+ return FALSE;
766
+ }
767
+ /* Code not complete - add new line with indentation */
768
+ int indent = calc_indent_level(code);
769
+ free(code);
770
+ mirb_buffer_newline(&ed->buf);
771
+ for (int i = 0; i < indent * 2; i++) {
772
+ mirb_buffer_insert_char(&ed->buf, ' ');
773
+ }
774
+ return TRUE;
775
+ }
776
+ }
777
+
778
+ /* Not at end of last line - just insert/split with appropriate indent */
779
+ {
780
+ char *partial = mirb_buffer_to_string_upto_line(&ed->buf, ed->buf.cursor_line);
781
+ int indent = partial ? calc_indent_level(partial) : 0;
782
+ free(partial);
783
+ mirb_buffer_newline(&ed->buf);
784
+
785
+ /* Check if new line starts with dedenting keyword */
786
+ mirb_line *new_line = &ed->buf.lines[ed->buf.cursor_line];
787
+ if (is_dedent_keyword(new_line->data)) {
788
+ if (indent > 0) indent--;
789
+ }
790
+
791
+ for (int i = 0; i < indent * 2; i++) {
792
+ mirb_buffer_insert_char(&ed->buf, ' ');
793
+ }
794
+ return TRUE;
795
+ }
796
+ }
797
+
798
+ case MIRB_KEY_CTRL_C:
799
+ *result = MIRB_EDIT_INTERRUPT;
800
+ return FALSE;
801
+
802
+ case MIRB_KEY_CTRL_D:
803
+ if (mirb_buffer_total_len(&ed->buf) == 0) {
804
+ *result = MIRB_EDIT_EOF;
805
+ return FALSE;
806
+ }
807
+ /* Delete forward if not empty */
808
+ mirb_buffer_delete_forward(&ed->buf);
809
+ return TRUE;
810
+
811
+ case MIRB_KEY_BACKSPACE:
812
+ mirb_buffer_delete_back(&ed->buf);
813
+ return TRUE;
814
+
815
+ case MIRB_KEY_DELETE:
816
+ mirb_buffer_delete_forward(&ed->buf);
817
+ return TRUE;
818
+
819
+ case MIRB_KEY_LEFT:
820
+ case MIRB_KEY_CTRL_B:
821
+ mirb_buffer_cursor_left(&ed->buf);
822
+ return TRUE;
823
+
824
+ case MIRB_KEY_RIGHT:
825
+ case MIRB_KEY_CTRL_F:
826
+ mirb_buffer_cursor_right(&ed->buf);
827
+ return TRUE;
828
+
829
+ case MIRB_KEY_UP:
830
+ case MIRB_KEY_CTRL_P:
831
+ /* If on first line, navigate history; otherwise move cursor up */
832
+ if (ed->buf.cursor_line == 0) {
833
+ /* Start history browsing if not already */
834
+ if (!ed->hist.browsing) {
835
+ char *current = mirb_buffer_to_string(&ed->buf);
836
+ mirb_history_browse_start(&ed->hist, current);
837
+ free(current);
838
+ }
839
+ const char *prev = mirb_history_prev(&ed->hist);
840
+ if (prev) {
841
+ mirb_buffer_set_string(&ed->buf, prev);
842
+ mirb_buffer_cursor_finish(&ed->buf);
843
+ }
844
+ }
845
+ else {
846
+ mirb_buffer_cursor_up(&ed->buf);
847
+ }
848
+ return TRUE;
849
+
850
+ case MIRB_KEY_DOWN:
851
+ case MIRB_KEY_CTRL_N:
852
+ /* If on last line, navigate history; otherwise move cursor down */
853
+ if (ed->buf.cursor_line == ed->buf.line_count - 1) {
854
+ if (ed->hist.browsing) {
855
+ const char *next = mirb_history_next(&ed->hist);
856
+ if (next) {
857
+ mirb_buffer_set_string(&ed->buf, next);
858
+ mirb_buffer_cursor_finish(&ed->buf);
859
+ }
860
+ }
861
+ }
862
+ else {
863
+ mirb_buffer_cursor_down(&ed->buf);
864
+ }
865
+ return TRUE;
866
+
867
+ case MIRB_KEY_HOME:
868
+ case MIRB_KEY_CTRL_A:
869
+ mirb_buffer_cursor_home(&ed->buf);
870
+ return TRUE;
871
+
872
+ case MIRB_KEY_END:
873
+ case MIRB_KEY_CTRL_E:
874
+ mirb_buffer_cursor_end(&ed->buf);
875
+ return TRUE;
876
+
877
+ case MIRB_KEY_CTRL_K:
878
+ mirb_buffer_kill_to_end(&ed->buf);
879
+ return TRUE;
880
+
881
+ case MIRB_KEY_CTRL_U:
882
+ mirb_buffer_kill_to_start(&ed->buf);
883
+ return TRUE;
884
+
885
+ case MIRB_KEY_CTRL_W:
886
+ mirb_buffer_kill_word_back(&ed->buf);
887
+ return TRUE;
888
+
889
+ case MIRB_KEY_CTRL_Y:
890
+ mirb_buffer_yank(&ed->buf);
891
+ return TRUE;
892
+
893
+ case MIRB_KEY_ALT_B:
894
+ mirb_buffer_cursor_word_back(&ed->buf);
895
+ return TRUE;
896
+
897
+ case MIRB_KEY_ALT_F:
898
+ mirb_buffer_cursor_word_forward(&ed->buf);
899
+ return TRUE;
900
+
901
+ case MIRB_KEY_ALT_D:
902
+ mirb_buffer_kill_word_forward(&ed->buf);
903
+ return TRUE;
904
+
905
+ case MIRB_KEY_CTRL_L:
906
+ /* Clear screen and refresh */
907
+ mirb_term_clear_screen();
908
+ ed->prev_line_count = 0;
909
+ return TRUE;
910
+
911
+ case MIRB_KEY_TAB:
912
+ /* Auto-indent if at start/end of line or preceded by whitespace */
913
+ {
914
+ mirb_line *line = &ed->buf.lines[ed->buf.cursor_line];
915
+ mrb_bool do_indent = FALSE;
916
+
917
+ if (ed->buf.cursor_col == 0) {
918
+ do_indent = TRUE;
919
+ }
920
+ else if (ed->buf.cursor_col == line->len) {
921
+ /* At end of line */
922
+ do_indent = TRUE;
923
+ }
924
+ else {
925
+ char prev_char = line->data[ed->buf.cursor_col - 1];
926
+ if (prev_char == ' ' || prev_char == '\t') {
927
+ do_indent = TRUE;
928
+ }
929
+ }
930
+
931
+ if (do_indent) {
932
+ handle_tab_indent(ed);
933
+ }
934
+ else {
935
+ handle_tab_completion(ed);
936
+ }
937
+ }
938
+ return TRUE;
939
+
940
+ default:
941
+ /* Insert printable characters */
942
+ if (key >= 32 && key < 127) {
943
+ /* Stop history browsing when user types */
944
+ mirb_history_browse_stop(&ed->hist);
945
+ mirb_buffer_insert_char(&ed->buf, (char)key);
946
+ /* Check for auto-dedent after typing 'end' or '}' */
947
+ if (should_dedent(&ed->buf, (char)key)) {
948
+ perform_dedent(&ed->buf);
949
+ }
950
+ }
951
+ #ifdef MRB_UTF8_STRING
952
+ /* Handle UTF-8 multibyte characters (bytes >= 0x80) */
953
+ else if (key >= 128 && key <= 255) {
954
+ mirb_history_browse_stop(&ed->hist);
955
+ mirb_buffer_insert_char(&ed->buf, (char)key);
956
+ }
957
+ #endif
958
+ return TRUE;
959
+ }
960
+ }
961
+
962
+ /*
963
+ * Read input with multi-line editing
964
+ */
965
+ mirb_edit_result
966
+ mirb_editor_read(mirb_editor *ed, char **out_str)
967
+ {
968
+ mirb_edit_result result;
969
+ int key;
970
+
971
+ *out_str = NULL;
972
+
973
+ /* Fall back to simple mode if raw mode not supported */
974
+ if (!ed->term.supported) {
975
+ return mirb_editor_read_simple(ed, out_str);
976
+ }
977
+
978
+ /* Clear buffer for new input */
979
+ mirb_buffer_clear(&ed->buf);
980
+ ed->prev_line_count = 0;
981
+ ed->display_cursor_row = 0;
982
+
983
+ /* Enable raw mode */
984
+ if (!mirb_term_raw_enable(&ed->term)) {
985
+ return mirb_editor_read_simple(ed, out_str);
986
+ }
987
+
988
+ /* Initial display */
989
+ print_prompt(ed, 0);
990
+ mirb_term_flush();
991
+ ed->prev_line_count = 1;
992
+ ed->display_cursor_row = 0;
993
+
994
+ /* Main editing loop */
995
+ result = MIRB_EDIT_ERROR;
996
+ while (1) {
997
+ key = mirb_term_read_key(&ed->term);
998
+ if (key == MIRB_KEY_NONE) {
999
+ result = MIRB_EDIT_ERROR;
1000
+ break;
1001
+ }
1002
+
1003
+ if (!handle_key(ed, key, &result)) {
1004
+ break;
1005
+ }
1006
+
1007
+ refresh_display(ed);
1008
+ }
1009
+
1010
+ /* Disable raw mode */
1011
+ mirb_term_raw_disable(&ed->term);
1012
+
1013
+ /* Move to end and print newline */
1014
+ if (ed->buf.cursor_line < ed->buf.line_count - 1) {
1015
+ mirb_term_cursor_down((int)(ed->buf.line_count - 1 - ed->buf.cursor_line));
1016
+ }
1017
+ printf("\n");
1018
+
1019
+ /* Return result string */
1020
+ if (result == MIRB_EDIT_OK) {
1021
+ *out_str = mirb_buffer_to_string(&ed->buf);
1022
+ if (*out_str == NULL) {
1023
+ result = MIRB_EDIT_ERROR;
1024
+ }
1025
+ }
1026
+
1027
+ return result;
1028
+ }
1029
+
1030
+ /*
1031
+ * Simple single-line input (fallback)
1032
+ */
1033
+ mirb_edit_result
1034
+ mirb_editor_read_simple(mirb_editor *ed, char **out_str)
1035
+ {
1036
+ char line[4096];
1037
+ size_t total_len = 0;
1038
+ size_t total_cap = 4096;
1039
+ char *total = (char*)malloc(total_cap);
1040
+ mrb_bool first_line = TRUE;
1041
+
1042
+ *out_str = NULL;
1043
+
1044
+ if (total == NULL) return MIRB_EDIT_ERROR;
1045
+ total[0] = '\0';
1046
+
1047
+ while (1) {
1048
+ /* Print prompt */
1049
+ print_prompt(ed, first_line ? 0 : 1);
1050
+ fflush(stdout);
1051
+
1052
+ /* Read line */
1053
+ if (fgets(line, sizeof(line), stdin) == NULL) {
1054
+ if (total_len == 0) {
1055
+ free(total);
1056
+ return MIRB_EDIT_EOF;
1057
+ }
1058
+ break;
1059
+ }
1060
+
1061
+ /* Remove trailing newline */
1062
+ size_t len = strlen(line);
1063
+ if (len > 0 && line[len - 1] == '\n') {
1064
+ line[--len] = '\0';
1065
+ }
1066
+
1067
+ /* Append to total */
1068
+ if (!first_line) {
1069
+ /* Add newline separator */
1070
+ if (total_len + 1 >= total_cap) {
1071
+ total_cap *= 2;
1072
+ char *new_total = (char*)realloc(total, total_cap);
1073
+ if (new_total == NULL) {
1074
+ free(total);
1075
+ return MIRB_EDIT_ERROR;
1076
+ }
1077
+ total = new_total;
1078
+ }
1079
+ total[total_len++] = '\n';
1080
+ }
1081
+
1082
+ if (total_len + len >= total_cap) {
1083
+ total_cap *= 2;
1084
+ char *new_total = (char*)realloc(total, total_cap);
1085
+ if (new_total == NULL) {
1086
+ free(total);
1087
+ return MIRB_EDIT_ERROR;
1088
+ }
1089
+ total = new_total;
1090
+ }
1091
+ memcpy(total + total_len, line, len + 1);
1092
+ total_len += len;
1093
+
1094
+ first_line = FALSE;
1095
+
1096
+ /* Check if complete */
1097
+ if (ed->check_complete) {
1098
+ if (ed->check_complete(total, ed->check_complete_data)) {
1099
+ break;
1100
+ }
1101
+ }
1102
+ else {
1103
+ break; /* No checker, single line mode */
1104
+ }
1105
+ }
1106
+
1107
+ *out_str = total;
1108
+ return MIRB_EDIT_OK;
1109
+ }
1110
+
1111
+ /*
1112
+ * Add entry to history
1113
+ */
1114
+ void
1115
+ mirb_editor_history_add(mirb_editor *ed, const char *entry)
1116
+ {
1117
+ mirb_history_add(&ed->hist, entry);
1118
+ }