esruby 0.0.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 (763) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +21 -0
  3. data/README.md +22 -0
  4. data/bin/esruby +34 -0
  5. data/lib/esruby.rb +26 -0
  6. data/lib/esruby/build.rb +140 -0
  7. data/lib/esruby/build/configuration.rb +77 -0
  8. data/lib/esruby/gem.rb +5 -0
  9. data/lib/esruby/gem/specification.rb +35 -0
  10. data/resources/build_config.eruby +53 -0
  11. data/resources/cpp/esruby.cpp +64 -0
  12. data/resources/cpp/esruby.hpp +42 -0
  13. data/resources/cpp/main.cpp +9 -0
  14. data/resources/js/esruby.js +45 -0
  15. data/resources/mruby/AUTHORS +40 -0
  16. data/resources/mruby/CONTRIBUTING.md +68 -0
  17. data/resources/mruby/LEGAL +6 -0
  18. data/resources/mruby/MITL +20 -0
  19. data/resources/mruby/Makefile +17 -0
  20. data/resources/mruby/NEWS +13 -0
  21. data/resources/mruby/README.md +92 -0
  22. data/resources/mruby/Rakefile +152 -0
  23. data/resources/mruby/TODO +10 -0
  24. data/resources/mruby/appveyor.yml +38 -0
  25. data/resources/mruby/appveyor_config.rb +50 -0
  26. data/resources/mruby/benchmark/bm_ao_render.rb +314 -0
  27. data/resources/mruby/benchmark/bm_app_lc_fizzbuzz.rb +52 -0
  28. data/resources/mruby/benchmark/bm_fib.rb +7 -0
  29. data/resources/mruby/benchmark/bm_so_lists.rb +47 -0
  30. data/resources/mruby/benchmark/build_config_boxing.rb +28 -0
  31. data/resources/mruby/benchmark/build_config_cc.rb +13 -0
  32. data/resources/mruby/benchmark/plot.gpl +5 -0
  33. data/resources/mruby/bin/mirb +0 -0
  34. data/resources/mruby/bin/mrbc +0 -0
  35. data/resources/mruby/bin/mruby +0 -0
  36. data/resources/mruby/bin/mruby-strip +0 -0
  37. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/README.md +82 -0
  38. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/mrbgem.rake +63 -0
  39. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/mrblib/regexp_pcre.rb +232 -0
  40. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/mrblib/string_pcre.rb +333 -0
  41. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/132html +313 -0
  42. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/AUTHORS +45 -0
  43. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/CMakeLists.txt +959 -0
  44. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/COPYING +5 -0
  45. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/ChangeLog +4981 -0
  46. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/CheckMan +67 -0
  47. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/CleanTxt +113 -0
  48. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/Detrail +35 -0
  49. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/HACKING +473 -0
  50. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/INSTALL +370 -0
  51. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/LICENCE +92 -0
  52. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/Makefile.am +877 -0
  53. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/Makefile.in +2917 -0
  54. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/NEWS +611 -0
  55. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/NON-AUTOTOOLS-BUILD +639 -0
  56. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/NON-UNIX-USE +7 -0
  57. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/PrepareRelease +253 -0
  58. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/README +935 -0
  59. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/RunGrepTest +551 -0
  60. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/RunTest +1015 -0
  61. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/RunTest.bat +616 -0
  62. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/aclocal.m4 +1230 -0
  63. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/autom4te.cache/output.0 +21280 -0
  64. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/autom4te.cache/output.1 +21280 -0
  65. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/autom4te.cache/requests +273 -0
  66. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/autom4te.cache/traces.0 +2421 -0
  67. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/autom4te.cache/traces.1 +1144 -0
  68. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/cmake/COPYING-CMAKE-SCRIPTS +22 -0
  69. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/cmake/FindEditline.cmake +17 -0
  70. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/cmake/FindPackageHandleStandardArgs.cmake +58 -0
  71. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/cmake/FindReadline.cmake +29 -0
  72. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/compile +343 -0
  73. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/config-cmake.h.in +54 -0
  74. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/config.guess +1552 -0
  75. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/config.h +392 -0
  76. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/config.h.generic +392 -0
  77. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/config.h.in +343 -0
  78. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/config.sub +1804 -0
  79. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/configure +21280 -0
  80. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/configure.ac +1082 -0
  81. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/depcomp +708 -0
  82. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/dftables.c +212 -0
  83. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/index.html +180 -0
  84. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcre-config.html +109 -0
  85. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcre.html +204 -0
  86. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcre16.html +383 -0
  87. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcre_assign_jit_stack.html +76 -0
  88. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcre_compile.html +108 -0
  89. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcre_compile2.html +112 -0
  90. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcre_config.html +91 -0
  91. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcre_copy_named_substring.html +65 -0
  92. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcre_copy_substring.html +61 -0
  93. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcre_dfa_exec.html +128 -0
  94. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcre_exec.html +110 -0
  95. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcre_free_study.html +46 -0
  96. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcre_free_substring.html +46 -0
  97. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcre_free_substring_list.html +46 -0
  98. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcre_fullinfo.html +108 -0
  99. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcre_get_named_substring.html +68 -0
  100. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcre_get_stringnumber.html +57 -0
  101. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcre_get_stringtable_entries.html +60 -0
  102. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcre_get_substring.html +64 -0
  103. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcre_get_substring_list.html +61 -0
  104. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcre_jit_exec.html +108 -0
  105. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcre_jit_stack_alloc.html +55 -0
  106. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcre_jit_stack_free.html +48 -0
  107. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcre_maketables.html +48 -0
  108. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcre_pattern_to_host_byte_order.html +58 -0
  109. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcre_refcount.html +51 -0
  110. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcre_study.html +68 -0
  111. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcre_utf16_to_host_byte_order.html +57 -0
  112. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcre_version.html +46 -0
  113. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcreapi.html +2786 -0
  114. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcrebuild.html +517 -0
  115. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcrecallout.html +243 -0
  116. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcrecompat.html +216 -0
  117. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcrecpp.html +368 -0
  118. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcredemo.html +426 -0
  119. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcregrep.html +757 -0
  120. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcrejit.html +458 -0
  121. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcrelimits.html +86 -0
  122. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcrematching.html +233 -0
  123. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcrepartial.html +474 -0
  124. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcrepattern.html +2953 -0
  125. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcreperform.html +195 -0
  126. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcreposix.html +292 -0
  127. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcreprecompile.html +158 -0
  128. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcresample.html +110 -0
  129. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcrestack.html +225 -0
  130. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcresyntax.html +521 -0
  131. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcretest.html +1082 -0
  132. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcreunicode.html +270 -0
  133. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/index.html.src +180 -0
  134. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcre-config.1 +92 -0
  135. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcre-config.txt +86 -0
  136. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcre.3 +202 -0
  137. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcre.txt +9909 -0
  138. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcre16.3 +390 -0
  139. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcre32.3 +389 -0
  140. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcre_assign_jit_stack.3 +61 -0
  141. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcre_compile.3 +98 -0
  142. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcre_compile2.3 +106 -0
  143. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcre_config.3 +76 -0
  144. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcre_copy_named_substring.3 +59 -0
  145. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcre_copy_substring.3 +52 -0
  146. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcre_dfa_exec.3 +125 -0
  147. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcre_exec.3 +103 -0
  148. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcre_free_study.3 +31 -0
  149. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcre_free_substring.3 +31 -0
  150. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcre_free_substring_list.3 +31 -0
  151. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcre_fullinfo.3 +95 -0
  152. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcre_get_named_substring.3 +62 -0
  153. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcre_get_stringnumber.3 +45 -0
  154. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcre_get_stringtable_entries.3 +48 -0
  155. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcre_get_substring.3 +55 -0
  156. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcre_get_substring_list.3 +49 -0
  157. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcre_jit_exec.3 +104 -0
  158. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcre_jit_stack_alloc.3 +45 -0
  159. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcre_jit_stack_free.3 +35 -0
  160. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcre_maketables.3 +33 -0
  161. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcre_pattern_to_host_byte_order.3 +46 -0
  162. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcre_refcount.3 +36 -0
  163. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcre_study.3 +56 -0
  164. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcre_utf16_to_host_byte_order.3 +46 -0
  165. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcre_utf32_to_host_byte_order.3 +46 -0
  166. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcre_version.3 +31 -0
  167. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcreapi.3 +2823 -0
  168. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcrebuild.3 +520 -0
  169. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcrecallout.3 +214 -0
  170. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcrecompat.3 +185 -0
  171. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcrecpp.3 +348 -0
  172. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcregrep.1 +679 -0
  173. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcregrep.txt +740 -0
  174. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcrejit.3 +437 -0
  175. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcrelimits.3 +67 -0
  176. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcrematching.3 +206 -0
  177. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcrepartial.3 +445 -0
  178. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcrepattern.3 +2983 -0
  179. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcreperform.3 +177 -0
  180. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcreposix.3 +270 -0
  181. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcreprecompile.3 +151 -0
  182. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcresample.3 +99 -0
  183. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcrestack.3 +215 -0
  184. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcresyntax.3 +496 -0
  185. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcretest.1 +1079 -0
  186. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcretest.txt +1012 -0
  187. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcreunicode.3 +255 -0
  188. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/perltest.txt +42 -0
  189. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/install-sh +527 -0
  190. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/libpcre.pc.in +12 -0
  191. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/libpcre16.pc.in +12 -0
  192. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/libpcre32.pc.in +12 -0
  193. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/libpcrecpp.pc.in +12 -0
  194. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/libpcreposix.pc.in +13 -0
  195. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/ltmain.sh +9636 -0
  196. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/m4/ax_pthread.m4 +309 -0
  197. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/m4/libtool.m4 +7844 -0
  198. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/m4/ltoptions.m4 +369 -0
  199. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/m4/ltsugar.m4 +123 -0
  200. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/m4/ltversion.m4 +23 -0
  201. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/m4/lt~obsolete.m4 +98 -0
  202. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/m4/pcre_visibility.m4 +89 -0
  203. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/makevp.bat +66 -0
  204. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/makevp_c.txt +20 -0
  205. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/makevp_l.txt +20 -0
  206. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/missing +331 -0
  207. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre-config.in +133 -0
  208. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre.h +653 -0
  209. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre.h.generic +653 -0
  210. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre.h.in +653 -0
  211. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre16_byte_order.c +45 -0
  212. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre16_chartables.c +45 -0
  213. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre16_compile.c +45 -0
  214. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre16_config.c +45 -0
  215. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre16_dfa_exec.c +45 -0
  216. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre16_exec.c +45 -0
  217. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre16_fullinfo.c +45 -0
  218. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre16_get.c +45 -0
  219. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre16_globals.c +45 -0
  220. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre16_jit_compile.c +45 -0
  221. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre16_maketables.c +45 -0
  222. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre16_newline.c +45 -0
  223. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre16_ord2utf16.c +90 -0
  224. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre16_printint.c +45 -0
  225. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre16_refcount.c +45 -0
  226. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre16_string_utils.c +45 -0
  227. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre16_study.c +45 -0
  228. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre16_tables.c +45 -0
  229. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre16_ucd.c +45 -0
  230. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre16_utf16_utils.c +130 -0
  231. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre16_valid_utf16.c +156 -0
  232. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre16_version.c +45 -0
  233. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre16_xclass.c +45 -0
  234. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre32_byte_order.c +45 -0
  235. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre32_chartables.c +45 -0
  236. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre32_compile.c +45 -0
  237. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre32_config.c +45 -0
  238. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre32_dfa_exec.c +45 -0
  239. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre32_exec.c +45 -0
  240. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre32_fullinfo.c +45 -0
  241. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre32_get.c +45 -0
  242. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre32_globals.c +45 -0
  243. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre32_jit_compile.c +45 -0
  244. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre32_maketables.c +45 -0
  245. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre32_newline.c +45 -0
  246. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre32_ord2utf32.c +82 -0
  247. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre32_printint.c +45 -0
  248. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre32_refcount.c +45 -0
  249. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre32_string_utils.c +45 -0
  250. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre32_study.c +45 -0
  251. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre32_tables.c +45 -0
  252. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre32_ucd.c +45 -0
  253. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre32_utf32_utils.c +141 -0
  254. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre32_valid_utf32.c +131 -0
  255. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre32_version.c +45 -0
  256. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre32_xclass.c +45 -0
  257. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre_byte_order.c +318 -0
  258. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre_chartables.c +198 -0
  259. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre_chartables.c.dist +198 -0
  260. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre_compile.c +8386 -0
  261. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre_config.c +186 -0
  262. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre_dfa_exec.c +3582 -0
  263. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre_exec.c +7049 -0
  264. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre_fullinfo.c +231 -0
  265. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre_get.c +662 -0
  266. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre_globals.c +84 -0
  267. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre_internal.h +2744 -0
  268. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre_jit_compile.c +8560 -0
  269. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre_jit_test.c +1614 -0
  270. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre_maketables.c +151 -0
  271. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre_newline.c +210 -0
  272. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre_ord2utf8.c +94 -0
  273. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre_printint.c +766 -0
  274. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre_refcount.c +92 -0
  275. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre_scanner.cc +199 -0
  276. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre_scanner.h +172 -0
  277. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre_scanner_unittest.cc +159 -0
  278. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre_string_utils.c +211 -0
  279. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre_stringpiece.cc +43 -0
  280. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre_stringpiece.h.in +179 -0
  281. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre_stringpiece_unittest.cc +150 -0
  282. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre_study.c +1562 -0
  283. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre_tables.c +655 -0
  284. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre_ucd.c +3298 -0
  285. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre_valid_utf8.c +312 -0
  286. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre_version.c +98 -0
  287. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre_xclass.c +198 -0
  288. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcrecpp.cc +922 -0
  289. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcrecpp.h +710 -0
  290. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcrecpp_internal.h +71 -0
  291. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcrecpp_unittest.cc +1291 -0
  292. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcrecpparg.h.in +174 -0
  293. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcredemo.c +406 -0
  294. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcregexp.pas +845 -0
  295. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcregrep.c +3180 -0
  296. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcreposix.c +419 -0
  297. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcreposix.h +146 -0
  298. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcretest.c +5488 -0
  299. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/perltest.pl +237 -0
  300. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/sljit/sljitConfig.h +110 -0
  301. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/sljit/sljitConfigInternal.h +484 -0
  302. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/sljit/sljitExecAllocator.c +289 -0
  303. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/sljit/sljitLir.c +1766 -0
  304. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/sljit/sljitLir.h +985 -0
  305. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/sljit/sljitNativeARM_Thumb2.c +2008 -0
  306. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/sljit/sljitNativeARM_v5.c +2515 -0
  307. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/sljit/sljitNativeMIPS_32.c +404 -0
  308. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/sljit/sljitNativeMIPS_common.c +1881 -0
  309. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/sljit/sljitNativePPC_32.c +269 -0
  310. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/sljit/sljitNativePPC_64.c +421 -0
  311. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/sljit/sljitNativePPC_common.c +2014 -0
  312. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/sljit/sljitNativeSPARC_32.c +164 -0
  313. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/sljit/sljitNativeSPARC_common.c +1348 -0
  314. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/sljit/sljitNativeX86_32.c +547 -0
  315. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/sljit/sljitNativeX86_64.c +810 -0
  316. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/sljit/sljitNativeX86_common.c +2836 -0
  317. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/sljit/sljitUtils.c +332 -0
  318. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/grepbinary +0 -0
  319. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/grepfilelist +3 -0
  320. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/grepinput +611 -0
  321. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/grepinput3 +15 -0
  322. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/grepinput8 +11 -0
  323. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/grepinputv +4 -0
  324. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/grepinputx +43 -0
  325. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/greplist +7 -0
  326. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/grepoutput +707 -0
  327. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/grepoutput8 +12 -0
  328. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/grepoutputN +16 -1
  329. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/greppatN4 +2 -0
  330. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/saved16 +0 -0
  331. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/saved16BE-1 +0 -0
  332. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/saved16BE-2 +0 -0
  333. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/saved16LE-1 +0 -0
  334. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/saved16LE-2 +0 -0
  335. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/saved32 +0 -0
  336. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/saved32BE-1 +0 -0
  337. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/saved32BE-2 +0 -0
  338. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/saved32LE-1 +0 -0
  339. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/saved32LE-2 +0 -0
  340. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/saved8 +0 -0
  341. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testinput1 +5306 -0
  342. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testinput10 +1337 -0
  343. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testinput11 +135 -0
  344. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testinput12 +89 -0
  345. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testinput13 +9 -0
  346. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testinput14 +329 -0
  347. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testinput15 +430 -0
  348. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testinput16 +35 -0
  349. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testinput17 +296 -0
  350. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testinput18 +296 -0
  351. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testinput19 +22 -0
  352. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testinput2 +3813 -0
  353. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testinput20 +19 -0
  354. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testinput21 +16 -0
  355. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testinput22 +13 -0
  356. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testinput23 +16 -0
  357. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testinput24 +77 -0
  358. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testinput25 +32 -0
  359. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testinput26 +80 -0
  360. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testinput3 +95 -0
  361. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testinput4 +624 -0
  362. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testinput5 +772 -0
  363. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testinput6 +1319 -0
  364. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testinput7 +672 -0
  365. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testinput8 +4801 -0
  366. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testinput9 +717 -0
  367. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testinputEBC +121 -0
  368. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testoutput1 +8798 -0
  369. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testoutput10 +2726 -0
  370. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testoutput11-16 +713 -0
  371. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testoutput11-32 +713 -0
  372. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testoutput11-8 +713 -0
  373. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testoutput12 +181 -0
  374. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testoutput13 +21 -0
  375. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testoutput14 +476 -0
  376. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testoutput15 +1269 -0
  377. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testoutput16 +121 -0
  378. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testoutput17 +505 -0
  379. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testoutput18-16 +1022 -0
  380. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testoutput18-32 +1019 -0
  381. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testoutput19 +88 -0
  382. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testoutput2 +12484 -0
  383. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testoutput20 +27 -0
  384. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testoutput21-16 +90 -0
  385. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testoutput21-32 +90 -0
  386. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testoutput22-16 +71 -0
  387. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testoutput22-32 +71 -0
  388. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testoutput23 +42 -0
  389. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testoutput24 +145 -0
  390. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testoutput25 +79 -0
  391. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testoutput26 +148 -0
  392. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testoutput3 +169 -0
  393. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testoutput4 +1094 -0
  394. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testoutput5 +1849 -0
  395. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testoutput6 +2137 -0
  396. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testoutput7 +1473 -0
  397. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testoutput8 +8019 -0
  398. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testoutput9 +1371 -0
  399. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testoutputEBC +182 -0
  400. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/wintestinput3 +91 -0
  401. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/wintestoutput3 +166 -0
  402. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/ucp.h +197 -0
  403. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/run_test.rb +23 -0
  404. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/src/mruby_regexp_pcre.c +364 -0
  405. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/test/matchdata.rb +94 -0
  406. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/test/regexp.rb +264 -0
  407. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/test/string.rb +201 -0
  408. data/resources/mruby/build_config.rb +152 -0
  409. data/resources/mruby/doc/guides/compile.md +488 -0
  410. data/resources/mruby/doc/guides/debugger.md +370 -0
  411. data/resources/mruby/doc/guides/gc-arena-howto.md +177 -0
  412. data/resources/mruby/doc/guides/mrbconf.md +146 -0
  413. data/resources/mruby/doc/guides/mrbgems.md +340 -0
  414. data/resources/mruby/doc/limitations.md +187 -0
  415. data/resources/mruby/examples/mrbgems/c_and_ruby_extension_example/README.md +4 -0
  416. data/resources/mruby/examples/mrbgems/c_and_ruby_extension_example/mrbgem.rake +23 -0
  417. data/resources/mruby/examples/mrbgems/c_and_ruby_extension_example/mrblib/example.rb +5 -0
  418. data/resources/mruby/examples/mrbgems/c_and_ruby_extension_example/src/example.c +20 -0
  419. data/resources/mruby/examples/mrbgems/c_and_ruby_extension_example/test/example.rb +7 -0
  420. data/resources/mruby/examples/mrbgems/c_extension_example/README.md +4 -0
  421. data/resources/mruby/examples/mrbgems/c_extension_example/mrbgem.rake +23 -0
  422. data/resources/mruby/examples/mrbgems/c_extension_example/src/example.c +20 -0
  423. data/resources/mruby/examples/mrbgems/c_extension_example/test/example.c +7 -0
  424. data/resources/mruby/examples/mrbgems/c_extension_example/test/example.rb +3 -0
  425. data/resources/mruby/examples/mrbgems/ruby_extension_example/README.md +4 -0
  426. data/resources/mruby/examples/mrbgems/ruby_extension_example/mrbgem.rake +25 -0
  427. data/resources/mruby/examples/mrbgems/ruby_extension_example/mrblib/example.rb +5 -0
  428. data/resources/mruby/examples/mrbgems/ruby_extension_example/test/example.rb +3 -0
  429. data/resources/mruby/examples/targets/build_config_ArduinoDue.rb +90 -0
  430. data/resources/mruby/examples/targets/build_config_IntelEdison.rb +69 -0
  431. data/resources/mruby/examples/targets/build_config_IntelGalileo.rb +106 -0
  432. data/resources/mruby/examples/targets/build_config_RX630.rb +81 -0
  433. data/resources/mruby/examples/targets/build_config_android_arm64-v8a.rb +26 -0
  434. data/resources/mruby/examples/targets/build_config_android_armeabi.rb +26 -0
  435. data/resources/mruby/examples/targets/build_config_android_armeabi_v7a_neon_hard.rb +28 -0
  436. data/resources/mruby/examples/targets/build_config_chipKITMax32.rb +86 -0
  437. data/resources/mruby/include/mrbconf.h +145 -0
  438. data/resources/mruby/include/mruby.h +1280 -0
  439. data/resources/mruby/include/mruby/array.h +279 -0
  440. data/resources/mruby/include/mruby/boxing_nan.h +102 -0
  441. data/resources/mruby/include/mruby/boxing_no.h +56 -0
  442. data/resources/mruby/include/mruby/boxing_word.h +136 -0
  443. data/resources/mruby/include/mruby/class.h +94 -0
  444. data/resources/mruby/include/mruby/common.h +72 -0
  445. data/resources/mruby/include/mruby/compile.h +194 -0
  446. data/resources/mruby/include/mruby/data.h +75 -0
  447. data/resources/mruby/include/mruby/debug.h +66 -0
  448. data/resources/mruby/include/mruby/dump.h +196 -0
  449. data/resources/mruby/include/mruby/error.h +75 -0
  450. data/resources/mruby/include/mruby/gc.h +91 -0
  451. data/resources/mruby/include/mruby/hash.h +182 -0
  452. data/resources/mruby/include/mruby/irep.h +62 -0
  453. data/resources/mruby/include/mruby/istruct.h +47 -0
  454. data/resources/mruby/include/mruby/khash.h +274 -0
  455. data/resources/mruby/include/mruby/numeric.h +161 -0
  456. data/resources/mruby/include/mruby/object.h +45 -0
  457. data/resources/mruby/include/mruby/opcode.h +161 -0
  458. data/resources/mruby/include/mruby/proc.h +131 -0
  459. data/resources/mruby/include/mruby/range.h +49 -0
  460. data/resources/mruby/include/mruby/re.h +16 -0
  461. data/resources/mruby/include/mruby/string.h +440 -0
  462. data/resources/mruby/include/mruby/throw.h +55 -0
  463. data/resources/mruby/include/mruby/value.h +309 -0
  464. data/resources/mruby/include/mruby/variable.h +138 -0
  465. data/resources/mruby/include/mruby/version.h +110 -0
  466. data/resources/mruby/lib/mruby-core-ext.rb +79 -0
  467. data/resources/mruby/lib/mruby/build.rb +355 -0
  468. data/resources/mruby/lib/mruby/build/command.rb +324 -0
  469. data/resources/mruby/lib/mruby/build/load_gems.rb +122 -0
  470. data/resources/mruby/lib/mruby/gem.rb +459 -0
  471. data/resources/mruby/lib/mruby/source.rb +30 -0
  472. data/resources/mruby/minirake +484 -0
  473. data/resources/mruby/mrbgems/default.gembox +82 -0
  474. data/resources/mruby/mrbgems/full-core.gembox +9 -0
  475. data/resources/mruby/mrbgems/mruby-array-ext/mrbgem.rake +6 -0
  476. data/resources/mruby/mrbgems/mruby-array-ext/mrblib/array.rb +935 -0
  477. data/resources/mruby/mrbgems/mruby-array-ext/src/array.c +246 -0
  478. data/resources/mruby/mrbgems/mruby-array-ext/test/array.rb +422 -0
  479. data/resources/mruby/mrbgems/mruby-bin-debugger/bintest/mrdb.rb +286 -0
  480. data/resources/mruby/mrbgems/mruby-bin-debugger/bintest/print.rb +701 -0
  481. data/resources/mruby/mrbgems/mruby-bin-debugger/mrbgem.rake +9 -0
  482. data/resources/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/apibreak.c +505 -0
  483. data/resources/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/apibreak.h +26 -0
  484. data/resources/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/apilist.c +240 -0
  485. data/resources/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/apilist.h +14 -0
  486. data/resources/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/apiprint.c +78 -0
  487. data/resources/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/apiprint.h +13 -0
  488. data/resources/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/cmdbreak.c +436 -0
  489. data/resources/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/cmdmisc.c +502 -0
  490. data/resources/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/cmdprint.c +58 -0
  491. data/resources/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/cmdrun.c +64 -0
  492. data/resources/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/mrdb.c +759 -0
  493. data/resources/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/mrdb.h +165 -0
  494. data/resources/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/mrdbconf.h +16 -0
  495. data/resources/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/mrdberror.h +20 -0
  496. data/resources/mruby/mrbgems/mruby-bin-mirb/bintest/mirb.rb +12 -0
  497. data/resources/mruby/mrbgems/mruby-bin-mirb/mrbgem.rake +33 -0
  498. data/resources/mruby/mrbgems/mruby-bin-mirb/tools/mirb/mirb.c +611 -0
  499. data/resources/mruby/mrbgems/mruby-bin-mrbc/mrbgem.rake +16 -0
  500. data/resources/mruby/mrbgems/mruby-bin-mrbc/tools/mrbc/mrbc.c +336 -0
  501. data/resources/mruby/mrbgems/mruby-bin-mruby-config/mrbgem.rake +30 -0
  502. data/resources/mruby/mrbgems/mruby-bin-mruby-config/mruby-config +20 -0
  503. data/resources/mruby/mrbgems/mruby-bin-mruby-config/mruby-config.bat +42 -0
  504. data/resources/mruby/mrbgems/mruby-bin-mruby/bintest/mruby.rb +60 -0
  505. data/resources/mruby/mrbgems/mruby-bin-mruby/mrbgem.rake +12 -0
  506. data/resources/mruby/mrbgems/mruby-bin-mruby/tools/mruby/mruby.c +254 -0
  507. data/resources/mruby/mrbgems/mruby-bin-strip/bintest/mruby-strip.rb +73 -0
  508. data/resources/mruby/mrbgems/mruby-bin-strip/mrbgem.rake +6 -0
  509. data/resources/mruby/mrbgems/mruby-bin-strip/tools/mruby-strip/mruby-strip.c +155 -0
  510. data/resources/mruby/mrbgems/mruby-class-ext/mrbgem.rake +5 -0
  511. data/resources/mruby/mrbgems/mruby-class-ext/src/class.c +68 -0
  512. data/resources/mruby/mrbgems/mruby-class-ext/test/module.rb +55 -0
  513. data/resources/mruby/mrbgems/mruby-compar-ext/mrbgem.rake +5 -0
  514. data/resources/mruby/mrbgems/mruby-compar-ext/mrblib/compar.rb +31 -0
  515. data/resources/mruby/mrbgems/mruby-compiler/bintest/mrbc.rb +30 -0
  516. data/resources/mruby/mrbgems/mruby-compiler/core/codegen.c +3083 -0
  517. data/resources/mruby/mrbgems/mruby-compiler/core/keywords +50 -0
  518. data/resources/mruby/mrbgems/mruby-compiler/core/lex.def +211 -0
  519. data/resources/mruby/mrbgems/mruby-compiler/core/node.h +118 -0
  520. data/resources/mruby/mrbgems/mruby-compiler/core/parse.y +6661 -0
  521. data/resources/mruby/mrbgems/mruby-compiler/mrbgem.rake +40 -0
  522. data/resources/mruby/mrbgems/mruby-enum-ext/mrbgem.rake +5 -0
  523. data/resources/mruby/mrbgems/mruby-enum-ext/mrblib/enum.rb +813 -0
  524. data/resources/mruby/mrbgems/mruby-enum-ext/test/enum.rb +185 -0
  525. data/resources/mruby/mrbgems/mruby-enum-lazy/mrbgem.rake +7 -0
  526. data/resources/mruby/mrbgems/mruby-enum-lazy/mrblib/lazy.rb +178 -0
  527. data/resources/mruby/mrbgems/mruby-enum-lazy/test/lazy.rb +53 -0
  528. data/resources/mruby/mrbgems/mruby-enumerator/mrbgem.rake +7 -0
  529. data/resources/mruby/mrbgems/mruby-enumerator/mrblib/enumerator.rb +645 -0
  530. data/resources/mruby/mrbgems/mruby-enumerator/test/enumerator.rb +546 -0
  531. data/resources/mruby/mrbgems/mruby-error/mrbgem.rake +10 -0
  532. data/resources/mruby/mrbgems/mruby-error/src/exception.c +100 -0
  533. data/resources/mruby/mrbgems/mruby-error/test/exception.c +59 -0
  534. data/resources/mruby/mrbgems/mruby-error/test/exception.rb +55 -0
  535. data/resources/mruby/mrbgems/mruby-eval/mrbgem.rake +7 -0
  536. data/resources/mruby/mrbgems/mruby-eval/src/eval.c +346 -0
  537. data/resources/mruby/mrbgems/mruby-eval/test/eval.rb +101 -0
  538. data/resources/mruby/mrbgems/mruby-exit/mrbgem.rake +5 -0
  539. data/resources/mruby/mrbgems/mruby-exit/src/mruby-exit.c +24 -0
  540. data/resources/mruby/mrbgems/mruby-fiber/mrbgem.rake +5 -0
  541. data/resources/mruby/mrbgems/mruby-fiber/src/fiber.c +420 -0
  542. data/resources/mruby/mrbgems/mruby-fiber/test/fiber.rb +208 -0
  543. data/resources/mruby/mrbgems/mruby-hash-ext/mrbgem.rake +8 -0
  544. data/resources/mruby/mrbgems/mruby-hash-ext/mrblib/hash.rb +502 -0
  545. data/resources/mruby/mrbgems/mruby-hash-ext/src/hash-ext.c +128 -0
  546. data/resources/mruby/mrbgems/mruby-hash-ext/test/hash.rb +300 -0
  547. data/resources/mruby/mrbgems/mruby-inline-struct/mrbgem.rake +5 -0
  548. data/resources/mruby/mrbgems/mruby-inline-struct/test/inline.c +83 -0
  549. data/resources/mruby/mrbgems/mruby-inline-struct/test/inline.rb +151 -0
  550. data/resources/mruby/mrbgems/mruby-io/README.md +193 -0
  551. data/resources/mruby/mrbgems/mruby-io/include/mruby/ext/io.h +38 -0
  552. data/resources/mruby/mrbgems/mruby-io/mrbgem.rake +17 -0
  553. data/resources/mruby/mrbgems/mruby-io/mrblib/file.rb +208 -0
  554. data/resources/mruby/mrbgems/mruby-io/mrblib/file_constants.rb +29 -0
  555. data/resources/mruby/mrbgems/mruby-io/mrblib/io.rb +387 -0
  556. data/resources/mruby/mrbgems/mruby-io/mrblib/kernel.rb +15 -0
  557. data/resources/mruby/mrbgems/mruby-io/run_test.rb +26 -0
  558. data/resources/mruby/mrbgems/mruby-io/src/file.c +489 -0
  559. data/resources/mruby/mrbgems/mruby-io/src/file_test.c +381 -0
  560. data/resources/mruby/mrbgems/mruby-io/src/io.c +1320 -0
  561. data/resources/mruby/mrbgems/mruby-io/src/mruby_io_gem.c +20 -0
  562. data/resources/mruby/mrbgems/mruby-io/test/file.rb +197 -0
  563. data/resources/mruby/mrbgems/mruby-io/test/file_test.rb +117 -0
  564. data/resources/mruby/mrbgems/mruby-io/test/gc_filedes.sh +4 -0
  565. data/resources/mruby/mrbgems/mruby-io/test/io.rb +642 -0
  566. data/resources/mruby/mrbgems/mruby-io/test/mruby_io_test.c +256 -0
  567. data/resources/mruby/mrbgems/mruby-kernel-ext/mrbgem.rake +5 -0
  568. data/resources/mruby/mrbgems/mruby-kernel-ext/mrblib/kernel.rb +13 -0
  569. data/resources/mruby/mrbgems/mruby-kernel-ext/src/kernel.c +264 -0
  570. data/resources/mruby/mrbgems/mruby-kernel-ext/test/kernel.rb +86 -0
  571. data/resources/mruby/mrbgems/mruby-math/mrbgem.rake +5 -0
  572. data/resources/mruby/mrbgems/mruby-math/src/math.c +783 -0
  573. data/resources/mruby/mrbgems/mruby-math/test/math.rb +152 -0
  574. data/resources/mruby/mrbgems/mruby-method/README.md +59 -0
  575. data/resources/mruby/mrbgems/mruby-method/mrbgem.rake +7 -0
  576. data/resources/mruby/mrbgems/mruby-method/mrblib/kernel.rb +9 -0
  577. data/resources/mruby/mrbgems/mruby-method/mrblib/method.rb +20 -0
  578. data/resources/mruby/mrbgems/mruby-method/mrblib/unbound_method.rb +9 -0
  579. data/resources/mruby/mrbgems/mruby-method/src/method.c +418 -0
  580. data/resources/mruby/mrbgems/mruby-method/test/method.rb +425 -0
  581. data/resources/mruby/mrbgems/mruby-numeric-ext/mrbgem.rake +5 -0
  582. data/resources/mruby/mrbgems/mruby-numeric-ext/mrblib/numeric_ext.rb +25 -0
  583. data/resources/mruby/mrbgems/mruby-numeric-ext/src/numeric_ext.c +102 -0
  584. data/resources/mruby/mrbgems/mruby-numeric-ext/test/numeric.rb +28 -0
  585. data/resources/mruby/mrbgems/mruby-object-ext/mrbgem.rake +5 -0
  586. data/resources/mruby/mrbgems/mruby-object-ext/mrblib/object.rb +19 -0
  587. data/resources/mruby/mrbgems/mruby-object-ext/src/object.c +112 -0
  588. data/resources/mruby/mrbgems/mruby-object-ext/test/nil.rb +11 -0
  589. data/resources/mruby/mrbgems/mruby-object-ext/test/object.rb +53 -0
  590. data/resources/mruby/mrbgems/mruby-objectspace/mrbgem.rake +5 -0
  591. data/resources/mruby/mrbgems/mruby-objectspace/src/mruby_objectspace.c +187 -0
  592. data/resources/mruby/mrbgems/mruby-objectspace/test/objectspace.rb +60 -0
  593. data/resources/mruby/mrbgems/mruby-pack/README.md +70 -0
  594. data/resources/mruby/mrbgems/mruby-pack/mrbgem.rake +7 -0
  595. data/resources/mruby/mrbgems/mruby-pack/packtest.rb +157 -0
  596. data/resources/mruby/mrbgems/mruby-pack/run_test.rb +26 -0
  597. data/resources/mruby/mrbgems/mruby-pack/src/pack.c +1281 -0
  598. data/resources/mruby/mrbgems/mruby-pack/test/pack.rb +165 -0
  599. data/resources/mruby/mrbgems/mruby-print/mrbgem.rake +5 -0
  600. data/resources/mruby/mrbgems/mruby-print/mrblib/print.rb +64 -0
  601. data/resources/mruby/mrbgems/mruby-print/src/print.c +64 -0
  602. data/resources/mruby/mrbgems/mruby-proc-ext/mrbgem.rake +5 -0
  603. data/resources/mruby/mrbgems/mruby-proc-ext/mrblib/proc.rb +42 -0
  604. data/resources/mruby/mrbgems/mruby-proc-ext/src/proc.c +173 -0
  605. data/resources/mruby/mrbgems/mruby-proc-ext/test/proc.c +62 -0
  606. data/resources/mruby/mrbgems/mruby-proc-ext/test/proc.rb +96 -0
  607. data/resources/mruby/mrbgems/mruby-random/mrbgem.rake +5 -0
  608. data/resources/mruby/mrbgems/mruby-random/src/mt19937ar.c +224 -0
  609. data/resources/mruby/mrbgems/mruby-random/src/mt19937ar.h +80 -0
  610. data/resources/mruby/mrbgems/mruby-random/src/random.c +349 -0
  611. data/resources/mruby/mrbgems/mruby-random/src/random.h +12 -0
  612. data/resources/mruby/mrbgems/mruby-random/test/random.rb +88 -0
  613. data/resources/mruby/mrbgems/mruby-range-ext/mrbgem.rake +5 -0
  614. data/resources/mruby/mrbgems/mruby-range-ext/mrblib/range.rb +31 -0
  615. data/resources/mruby/mrbgems/mruby-range-ext/src/range.c +176 -0
  616. data/resources/mruby/mrbgems/mruby-range-ext/test/range.rb +32 -0
  617. data/resources/mruby/mrbgems/mruby-socket/README.md +55 -0
  618. data/resources/mruby/mrbgems/mruby-socket/mrbgem.rake +17 -0
  619. data/resources/mruby/mrbgems/mruby-socket/mrblib/socket.rb +621 -0
  620. data/resources/mruby/mrbgems/mruby-socket/run_test.rb +28 -0
  621. data/resources/mruby/mrbgems/mruby-socket/src/const.cstub +453 -0
  622. data/resources/mruby/mrbgems/mruby-socket/src/const.def +163 -0
  623. data/resources/mruby/mrbgems/mruby-socket/src/gen.rb +17 -0
  624. data/resources/mruby/mrbgems/mruby-socket/src/socket.c +928 -0
  625. data/resources/mruby/mrbgems/mruby-socket/test/addrinfo.rb +91 -0
  626. data/resources/mruby/mrbgems/mruby-socket/test/basicsocket.rb +17 -0
  627. data/resources/mruby/mrbgems/mruby-socket/test/ipsocket.rb +44 -0
  628. data/resources/mruby/mrbgems/mruby-socket/test/socket.rb +38 -0
  629. data/resources/mruby/mrbgems/mruby-socket/test/sockettest.c +46 -0
  630. data/resources/mruby/mrbgems/mruby-socket/test/tcpsocket.rb +4 -0
  631. data/resources/mruby/mrbgems/mruby-socket/test/udpsocket.rb +16 -0
  632. data/resources/mruby/mrbgems/mruby-socket/test/unix.rb +130 -0
  633. data/resources/mruby/mrbgems/mruby-sprintf/mrbgem.rake +5 -0
  634. data/resources/mruby/mrbgems/mruby-sprintf/mrblib/string.rb +9 -0
  635. data/resources/mruby/mrbgems/mruby-sprintf/src/kernel.c +30 -0
  636. data/resources/mruby/mrbgems/mruby-sprintf/src/sprintf.c +1126 -0
  637. data/resources/mruby/mrbgems/mruby-sprintf/test/sprintf.rb +110 -0
  638. data/resources/mruby/mrbgems/mruby-string-ext/mrbgem.rake +6 -0
  639. data/resources/mruby/mrbgems/mruby-string-ext/mrblib/string.rb +368 -0
  640. data/resources/mruby/mrbgems/mruby-string-ext/src/string.c +804 -0
  641. data/resources/mruby/mrbgems/mruby-string-ext/test/string.rb +682 -0
  642. data/resources/mruby/mrbgems/mruby-struct/mrbgem.rake +5 -0
  643. data/resources/mruby/mrbgems/mruby-struct/mrblib/struct.rb +103 -0
  644. data/resources/mruby/mrbgems/mruby-struct/src/struct.c +726 -0
  645. data/resources/mruby/mrbgems/mruby-struct/test/struct.rb +205 -0
  646. data/resources/mruby/mrbgems/mruby-symbol-ext/mrbgem.rake +5 -0
  647. data/resources/mruby/mrbgems/mruby-symbol-ext/mrblib/symbol.rb +78 -0
  648. data/resources/mruby/mrbgems/mruby-symbol-ext/src/symbol.c +64 -0
  649. data/resources/mruby/mrbgems/mruby-symbol-ext/test/symbol.rb +48 -0
  650. data/resources/mruby/mrbgems/mruby-test/README.md +7 -0
  651. data/resources/mruby/mrbgems/mruby-test/driver.c +175 -0
  652. data/resources/mruby/mrbgems/mruby-test/init_mrbtest.c +38 -0
  653. data/resources/mruby/mrbgems/mruby-test/mrbgem.rake +191 -0
  654. data/resources/mruby/mrbgems/mruby-time/mrbgem.rake +5 -0
  655. data/resources/mruby/mrbgems/mruby-time/mrblib/time.rb +9 -0
  656. data/resources/mruby/mrbgems/mruby-time/src/time.c +869 -0
  657. data/resources/mruby/mrbgems/mruby-time/test/time.rb +228 -0
  658. data/resources/mruby/mrbgems/mruby-toplevel-ext/mrbgem.rake +5 -0
  659. data/resources/mruby/mrbgems/mruby-toplevel-ext/mrblib/toplevel.rb +11 -0
  660. data/resources/mruby/mrbgems/mruby-toplevel-ext/test/toplevel.rb +24 -0
  661. data/resources/mruby/mrblib/00class.rb +29 -0
  662. data/resources/mruby/mrblib/10error.rb +59 -0
  663. data/resources/mruby/mrblib/array.rb +243 -0
  664. data/resources/mruby/mrblib/compar.rb +84 -0
  665. data/resources/mruby/mrblib/enum.rb +348 -0
  666. data/resources/mruby/mrblib/float.rb +9 -0
  667. data/resources/mruby/mrblib/hash.rb +358 -0
  668. data/resources/mruby/mrblib/init_mrblib.c +11 -0
  669. data/resources/mruby/mrblib/kernel.rb +50 -0
  670. data/resources/mruby/mrblib/mrblib.rake +21 -0
  671. data/resources/mruby/mrblib/numeric.rb +163 -0
  672. data/resources/mruby/mrblib/range.rb +67 -0
  673. data/resources/mruby/mrblib/string.rb +275 -0
  674. data/resources/mruby/mruby-source.gemspec +18 -0
  675. data/resources/mruby/src/array.c +1251 -0
  676. data/resources/mruby/src/backtrace.c +285 -0
  677. data/resources/mruby/src/class.c +2546 -0
  678. data/resources/mruby/src/codedump.c +477 -0
  679. data/resources/mruby/src/compar.c +13 -0
  680. data/resources/mruby/src/crc.c +39 -0
  681. data/resources/mruby/src/debug.c +217 -0
  682. data/resources/mruby/src/dump.c +1106 -0
  683. data/resources/mruby/src/enum.c +14 -0
  684. data/resources/mruby/src/error.c +513 -0
  685. data/resources/mruby/src/error.h +3 -0
  686. data/resources/mruby/src/etc.c +246 -0
  687. data/resources/mruby/src/fmt_fp.c +374 -0
  688. data/resources/mruby/src/gc.c +1835 -0
  689. data/resources/mruby/src/hash.c +916 -0
  690. data/resources/mruby/src/init.c +51 -0
  691. data/resources/mruby/src/kernel.c +1264 -0
  692. data/resources/mruby/src/load.c +706 -0
  693. data/resources/mruby/src/mruby_core.rake +20 -0
  694. data/resources/mruby/src/numeric.c +1574 -0
  695. data/resources/mruby/src/object.c +618 -0
  696. data/resources/mruby/src/opcode.h +2 -0
  697. data/resources/mruby/src/pool.c +209 -0
  698. data/resources/mruby/src/print.c +47 -0
  699. data/resources/mruby/src/proc.c +313 -0
  700. data/resources/mruby/src/range.c +446 -0
  701. data/resources/mruby/src/state.c +307 -0
  702. data/resources/mruby/src/string.c +3025 -0
  703. data/resources/mruby/src/symbol.c +494 -0
  704. data/resources/mruby/src/value_array.h +27 -0
  705. data/resources/mruby/src/variable.c +982 -0
  706. data/resources/mruby/src/version.c +17 -0
  707. data/resources/mruby/src/vm.c +3020 -0
  708. data/resources/mruby/tasks/benchmark.rake +91 -0
  709. data/resources/mruby/tasks/gitlab.rake +118 -0
  710. data/resources/mruby/tasks/libmruby.rake +24 -0
  711. data/resources/mruby/tasks/mrbgems.rake +98 -0
  712. data/resources/mruby/tasks/toolchains/android.rake +321 -0
  713. data/resources/mruby/tasks/toolchains/clang.rake +9 -0
  714. data/resources/mruby/tasks/toolchains/gcc.rake +66 -0
  715. data/resources/mruby/tasks/toolchains/openwrt.rake +38 -0
  716. data/resources/mruby/tasks/toolchains/visualcpp.rake +68 -0
  717. data/resources/mruby/test/assert.rb +249 -0
  718. data/resources/mruby/test/bintest.rb +33 -0
  719. data/resources/mruby/test/report.rb +4 -0
  720. data/resources/mruby/test/t/argumenterror.rb +16 -0
  721. data/resources/mruby/test/t/array.rb +394 -0
  722. data/resources/mruby/test/t/basicobject.rb +11 -0
  723. data/resources/mruby/test/t/bs_block.rb +521 -0
  724. data/resources/mruby/test/t/bs_literal.rb +38 -0
  725. data/resources/mruby/test/t/class.rb +451 -0
  726. data/resources/mruby/test/t/codegen.rb +197 -0
  727. data/resources/mruby/test/t/comparable.rb +80 -0
  728. data/resources/mruby/test/t/ensure.rb +54 -0
  729. data/resources/mruby/test/t/enumerable.rb +134 -0
  730. data/resources/mruby/test/t/exception.rb +422 -0
  731. data/resources/mruby/test/t/false.rb +31 -0
  732. data/resources/mruby/test/t/float.rb +209 -0
  733. data/resources/mruby/test/t/gc.rb +45 -0
  734. data/resources/mruby/test/t/hash.rb +375 -0
  735. data/resources/mruby/test/t/indexerror.rb +6 -0
  736. data/resources/mruby/test/t/integer.rb +277 -0
  737. data/resources/mruby/test/t/iterations.rb +61 -0
  738. data/resources/mruby/test/t/kernel.rb +600 -0
  739. data/resources/mruby/test/t/lang.rb +74 -0
  740. data/resources/mruby/test/t/literals.rb +337 -0
  741. data/resources/mruby/test/t/localjumperror.rb +13 -0
  742. data/resources/mruby/test/t/methods.rb +109 -0
  743. data/resources/mruby/test/t/module.rb +914 -0
  744. data/resources/mruby/test/t/nameerror.rb +28 -0
  745. data/resources/mruby/test/t/nil.rb +39 -0
  746. data/resources/mruby/test/t/nomethoderror.rb +22 -0
  747. data/resources/mruby/test/t/numeric.rb +43 -0
  748. data/resources/mruby/test/t/object.rb +11 -0
  749. data/resources/mruby/test/t/proc.rb +180 -0
  750. data/resources/mruby/test/t/range.rb +95 -0
  751. data/resources/mruby/test/t/rangeerror.rb +6 -0
  752. data/resources/mruby/test/t/regexperror.rb +4 -0
  753. data/resources/mruby/test/t/runtimeerror.rb +6 -0
  754. data/resources/mruby/test/t/standarderror.rb +6 -0
  755. data/resources/mruby/test/t/string.rb +728 -0
  756. data/resources/mruby/test/t/superclass.rb +47 -0
  757. data/resources/mruby/test/t/symbol.rb +30 -0
  758. data/resources/mruby/test/t/syntax.rb +468 -0
  759. data/resources/mruby/test/t/true.rb +31 -0
  760. data/resources/mruby/test/t/typeerror.rb +6 -0
  761. data/resources/mruby/test/t/unicode.rb +39 -0
  762. data/resources/mruby/travis_config.rb +53 -0
  763. metadata +806 -0
@@ -0,0 +1,3025 @@
1
+ /*
2
+ ** string.c - String class
3
+ **
4
+ ** See Copyright Notice in mruby.h
5
+ */
6
+
7
+ #ifdef _MSC_VER
8
+ # define _CRT_NONSTDC_NO_DEPRECATE
9
+ #endif
10
+
11
+ #ifndef MRB_WITHOUT_FLOAT
12
+ #include <float.h>
13
+ #endif
14
+ #include <limits.h>
15
+ #include <stddef.h>
16
+ #include <stdlib.h>
17
+ #include <string.h>
18
+ #include <mruby.h>
19
+ #include <mruby/array.h>
20
+ #include <mruby/class.h>
21
+ #include <mruby/range.h>
22
+ #include <mruby/string.h>
23
+ #include <mruby/re.h>
24
+
25
+ typedef struct mrb_shared_string {
26
+ mrb_bool nofree : 1;
27
+ int refcnt;
28
+ char *ptr;
29
+ mrb_int len;
30
+ } mrb_shared_string;
31
+
32
+ const char mrb_digitmap[] = "0123456789abcdefghijklmnopqrstuvwxyz";
33
+
34
+ #define mrb_obj_alloc_string(mrb) ((struct RString*)mrb_obj_alloc((mrb), MRB_TT_STRING, (mrb)->string_class))
35
+
36
+ static struct RString*
37
+ str_new_static(mrb_state *mrb, const char *p, size_t len)
38
+ {
39
+ struct RString *s;
40
+
41
+ if (len >= MRB_INT_MAX) {
42
+ mrb_raise(mrb, E_ARGUMENT_ERROR, "string size too big");
43
+ }
44
+ s = mrb_obj_alloc_string(mrb);
45
+ s->as.heap.len = (mrb_int)len;
46
+ s->as.heap.aux.capa = 0; /* nofree */
47
+ s->as.heap.ptr = (char *)p;
48
+ s->flags = MRB_STR_NOFREE;
49
+
50
+ return s;
51
+ }
52
+
53
+ static struct RString*
54
+ str_new(mrb_state *mrb, const char *p, size_t len)
55
+ {
56
+ struct RString *s;
57
+
58
+ if (p && mrb_ro_data_p(p)) {
59
+ return str_new_static(mrb, p, len);
60
+ }
61
+ s = mrb_obj_alloc_string(mrb);
62
+ if (len <= RSTRING_EMBED_LEN_MAX) {
63
+ RSTR_SET_EMBED_FLAG(s);
64
+ RSTR_SET_EMBED_LEN(s, len);
65
+ if (p) {
66
+ memcpy(s->as.ary, p, len);
67
+ }
68
+ }
69
+ else {
70
+ if (len >= MRB_INT_MAX) {
71
+ mrb_raise(mrb, E_ARGUMENT_ERROR, "string size too big");
72
+ }
73
+ s->as.heap.ptr = (char *)mrb_malloc(mrb, len+1);
74
+ s->as.heap.len = (mrb_int)len;
75
+ s->as.heap.aux.capa = (mrb_int)len;
76
+ if (p) {
77
+ memcpy(s->as.heap.ptr, p, len);
78
+ }
79
+ }
80
+ RSTR_PTR(s)[len] = '\0';
81
+ return s;
82
+ }
83
+
84
+ static inline void
85
+ str_with_class(mrb_state *mrb, struct RString *s, mrb_value obj)
86
+ {
87
+ s->c = mrb_str_ptr(obj)->c;
88
+ }
89
+
90
+ static mrb_value
91
+ mrb_str_new_empty(mrb_state *mrb, mrb_value str)
92
+ {
93
+ struct RString *s = str_new(mrb, 0, 0);
94
+
95
+ str_with_class(mrb, s, str);
96
+ return mrb_obj_value(s);
97
+ }
98
+
99
+ MRB_API mrb_value
100
+ mrb_str_new_capa(mrb_state *mrb, size_t capa)
101
+ {
102
+ struct RString *s;
103
+
104
+ s = mrb_obj_alloc_string(mrb);
105
+
106
+ if (capa >= MRB_INT_MAX) {
107
+ mrb_raise(mrb, E_ARGUMENT_ERROR, "string capacity size too big");
108
+ }
109
+ s->as.heap.len = 0;
110
+ s->as.heap.aux.capa = (mrb_int)capa;
111
+ s->as.heap.ptr = (char *)mrb_malloc(mrb, capa+1);
112
+ RSTR_PTR(s)[0] = '\0';
113
+
114
+ return mrb_obj_value(s);
115
+ }
116
+
117
+ #ifndef MRB_STR_BUF_MIN_SIZE
118
+ # define MRB_STR_BUF_MIN_SIZE 128
119
+ #endif
120
+
121
+ MRB_API mrb_value
122
+ mrb_str_buf_new(mrb_state *mrb, size_t capa)
123
+ {
124
+ if (capa < MRB_STR_BUF_MIN_SIZE) {
125
+ capa = MRB_STR_BUF_MIN_SIZE;
126
+ }
127
+ return mrb_str_new_capa(mrb, capa);
128
+ }
129
+
130
+ static void
131
+ resize_capa(mrb_state *mrb, struct RString *s, size_t capacity)
132
+ {
133
+ #if SIZE_MAX > MRB_INT_MAX
134
+ mrb_assert(capacity < MRB_INT_MAX);
135
+ #endif
136
+ if (RSTR_EMBED_P(s)) {
137
+ if (RSTRING_EMBED_LEN_MAX < capacity) {
138
+ char *const tmp = (char *)mrb_malloc(mrb, capacity+1);
139
+ const mrb_int len = RSTR_EMBED_LEN(s);
140
+ memcpy(tmp, s->as.ary, len);
141
+ RSTR_UNSET_EMBED_FLAG(s);
142
+ s->as.heap.ptr = tmp;
143
+ s->as.heap.len = len;
144
+ s->as.heap.aux.capa = (mrb_int)capacity;
145
+ }
146
+ }
147
+ else {
148
+ s->as.heap.ptr = (char*)mrb_realloc(mrb, RSTR_PTR(s), capacity+1);
149
+ s->as.heap.aux.capa = (mrb_int)capacity;
150
+ }
151
+ }
152
+
153
+ MRB_API mrb_value
154
+ mrb_str_new(mrb_state *mrb, const char *p, size_t len)
155
+ {
156
+ return mrb_obj_value(str_new(mrb, p, len));
157
+ }
158
+
159
+ /*
160
+ * call-seq: (Caution! NULL string)
161
+ * String.new(str="") => new_str
162
+ *
163
+ * Returns a new string object containing a copy of <i>str</i>.
164
+ */
165
+
166
+ MRB_API mrb_value
167
+ mrb_str_new_cstr(mrb_state *mrb, const char *p)
168
+ {
169
+ struct RString *s;
170
+ size_t len;
171
+
172
+ if (p) {
173
+ len = strlen(p);
174
+ }
175
+ else {
176
+ len = 0;
177
+ }
178
+
179
+ s = str_new(mrb, p, len);
180
+
181
+ return mrb_obj_value(s);
182
+ }
183
+
184
+ MRB_API mrb_value
185
+ mrb_str_new_static(mrb_state *mrb, const char *p, size_t len)
186
+ {
187
+ struct RString *s = str_new_static(mrb, p, len);
188
+ return mrb_obj_value(s);
189
+ }
190
+
191
+ static void
192
+ str_decref(mrb_state *mrb, mrb_shared_string *shared)
193
+ {
194
+ shared->refcnt--;
195
+ if (shared->refcnt == 0) {
196
+ if (!shared->nofree) {
197
+ mrb_free(mrb, shared->ptr);
198
+ }
199
+ mrb_free(mrb, shared);
200
+ }
201
+ }
202
+
203
+ void
204
+ mrb_gc_free_str(mrb_state *mrb, struct RString *str)
205
+ {
206
+ if (RSTR_EMBED_P(str))
207
+ /* no code */;
208
+ else if (RSTR_SHARED_P(str))
209
+ str_decref(mrb, str->as.heap.aux.shared);
210
+ else if (!RSTR_NOFREE_P(str) && !RSTR_FSHARED_P(str))
211
+ mrb_free(mrb, str->as.heap.ptr);
212
+ }
213
+
214
+ #ifdef MRB_UTF8_STRING
215
+ static const char utf8len_codepage[256] =
216
+ {
217
+ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
218
+ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
219
+ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
220
+ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
221
+ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
222
+ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
223
+ 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
224
+ 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,4,4,4,4,4,1,1,1,1,1,1,1,1,1,1,1,
225
+ };
226
+
227
+ static mrb_int
228
+ utf8len(const char* p, const char* e)
229
+ {
230
+ mrb_int len;
231
+ mrb_int i;
232
+
233
+ len = utf8len_codepage[(unsigned char)*p];
234
+ if (p + len > e) return 1;
235
+ for (i = 1; i < len; ++i)
236
+ if ((p[i] & 0xc0) != 0x80)
237
+ return 1;
238
+ return len;
239
+ }
240
+
241
+ static mrb_int
242
+ utf8_strlen(mrb_value str, mrb_int len)
243
+ {
244
+ mrb_int total = 0;
245
+ char* p = RSTRING_PTR(str);
246
+ char* e = p;
247
+ if (RSTRING(str)->flags & MRB_STR_NO_UTF) {
248
+ return RSTRING_LEN(str);
249
+ }
250
+ e += len < 0 ? RSTRING_LEN(str) : len;
251
+ while (p<e) {
252
+ p += utf8len(p, e);
253
+ total++;
254
+ }
255
+ if (RSTRING_LEN(str) == total) {
256
+ RSTRING(str)->flags |= MRB_STR_NO_UTF;
257
+ }
258
+ return total;
259
+ }
260
+
261
+ #define RSTRING_CHAR_LEN(s) utf8_strlen(s, -1)
262
+
263
+ /* map character index to byte offset index */
264
+ static mrb_int
265
+ chars2bytes(mrb_value s, mrb_int off, mrb_int idx)
266
+ {
267
+ mrb_int i, b, n;
268
+ const char *p = RSTRING_PTR(s) + off;
269
+ const char *e = RSTRING_END(s);
270
+
271
+ for (b=i=0; p<e && i<idx; i++) {
272
+ n = utf8len(p, e);
273
+ b += n;
274
+ p += n;
275
+ }
276
+ return b;
277
+ }
278
+
279
+ /* map byte offset to character index */
280
+ static mrb_int
281
+ bytes2chars(char *p, mrb_int bi)
282
+ {
283
+ mrb_int i, b, n;
284
+
285
+ for (b=i=0; b<bi; i++) {
286
+ n = utf8len_codepage[(unsigned char)*p];
287
+ b += n;
288
+ p += n;
289
+ }
290
+ if (b != bi) return -1;
291
+ return i;
292
+ }
293
+
294
+ #define BYTES_ALIGN_CHECK(pos) if (pos < 0) return mrb_nil_value();
295
+ #else
296
+ #define RSTRING_CHAR_LEN(s) RSTRING_LEN(s)
297
+ #define chars2bytes(p, off, ci) (ci)
298
+ #define bytes2chars(p, bi) (bi)
299
+ #define BYTES_ALIGN_CHECK(pos)
300
+ #endif
301
+
302
+ static inline mrb_int
303
+ mrb_memsearch_qs(const unsigned char *xs, mrb_int m, const unsigned char *ys, mrb_int n)
304
+ {
305
+ const unsigned char *x = xs, *xe = xs + m;
306
+ const unsigned char *y = ys;
307
+ int i;
308
+ ptrdiff_t qstable[256];
309
+
310
+ /* Preprocessing */
311
+ for (i = 0; i < 256; ++i)
312
+ qstable[i] = m + 1;
313
+ for (; x < xe; ++x)
314
+ qstable[*x] = xe - x;
315
+ /* Searching */
316
+ for (; y + m <= ys + n; y += *(qstable + y[m])) {
317
+ if (*xs == *y && memcmp(xs, y, m) == 0)
318
+ return (mrb_int)(y - ys);
319
+ }
320
+ return -1;
321
+ }
322
+
323
+ static mrb_int
324
+ mrb_memsearch(const void *x0, mrb_int m, const void *y0, mrb_int n)
325
+ {
326
+ const unsigned char *x = (const unsigned char *)x0, *y = (const unsigned char *)y0;
327
+
328
+ if (m > n) return -1;
329
+ else if (m == n) {
330
+ return memcmp(x0, y0, m) == 0 ? 0 : -1;
331
+ }
332
+ else if (m < 1) {
333
+ return 0;
334
+ }
335
+ else if (m == 1) {
336
+ const unsigned char *ys = (const unsigned char *)memchr(y, *x, n);
337
+
338
+ if (ys)
339
+ return (mrb_int)(ys - y);
340
+ else
341
+ return -1;
342
+ }
343
+ return mrb_memsearch_qs((const unsigned char *)x0, m, (const unsigned char *)y0, n);
344
+ }
345
+
346
+ static void
347
+ str_make_shared(mrb_state *mrb, struct RString *orig, struct RString *s)
348
+ {
349
+ mrb_shared_string *shared;
350
+ mrb_int len = RSTR_LEN(orig);
351
+
352
+ mrb_assert(!RSTR_EMBED_P(orig));
353
+ if (RSTR_SHARED_P(orig)) {
354
+ shared = orig->as.heap.aux.shared;
355
+ shared->refcnt++;
356
+ s->as.heap.ptr = orig->as.heap.ptr;
357
+ s->as.heap.len = len;
358
+ s->as.heap.aux.shared = shared;
359
+ RSTR_SET_SHARED_FLAG(s);
360
+ RSTR_UNSET_EMBED_FLAG(s);
361
+ }
362
+ else if (RSTR_FSHARED_P(orig)) {
363
+ struct RString *fs;
364
+
365
+ fs = orig->as.heap.aux.fshared;
366
+ s->as.heap.ptr = orig->as.heap.ptr;
367
+ s->as.heap.len = len;
368
+ s->as.heap.aux.fshared = fs;
369
+ RSTR_SET_FSHARED_FLAG(s);
370
+ RSTR_UNSET_EMBED_FLAG(s);
371
+ }
372
+ else if (MRB_FROZEN_P(orig) && !RSTR_POOL_P(orig)) {
373
+ s->as.heap.ptr = orig->as.heap.ptr;
374
+ s->as.heap.len = len;
375
+ s->as.heap.aux.fshared = orig;
376
+ RSTR_SET_FSHARED_FLAG(s);
377
+ RSTR_UNSET_EMBED_FLAG(s);
378
+ }
379
+ else {
380
+ shared = (mrb_shared_string *)mrb_malloc(mrb, sizeof(mrb_shared_string));
381
+ shared->refcnt = 2;
382
+ shared->nofree = !!RSTR_NOFREE_P(orig);
383
+ if (!shared->nofree && orig->as.heap.aux.capa > orig->as.heap.len) {
384
+ shared->ptr = (char *)mrb_realloc(mrb, orig->as.heap.ptr, len+1);
385
+ orig->as.heap.ptr = shared->ptr;
386
+ }
387
+ else {
388
+ shared->ptr = orig->as.heap.ptr;
389
+ }
390
+ orig->as.heap.aux.shared = shared;
391
+ RSTR_SET_SHARED_FLAG(orig);
392
+ shared->len = len;
393
+ s->as.heap.aux.shared = shared;
394
+ s->as.heap.ptr = shared->ptr;
395
+ s->as.heap.len = len;
396
+ RSTR_SET_SHARED_FLAG(s);
397
+ RSTR_UNSET_EMBED_FLAG(s);
398
+ }
399
+ }
400
+
401
+ static mrb_value
402
+ byte_subseq(mrb_state *mrb, mrb_value str, mrb_int beg, mrb_int len)
403
+ {
404
+ struct RString *orig, *s;
405
+
406
+ orig = mrb_str_ptr(str);
407
+ if (RSTR_EMBED_P(orig) || RSTR_LEN(orig) == 0 || len <= RSTRING_EMBED_LEN_MAX) {
408
+ s = str_new(mrb, RSTR_PTR(orig)+beg, len);
409
+ }
410
+ else {
411
+ s = mrb_obj_alloc_string(mrb);
412
+ str_make_shared(mrb, orig, s);
413
+ s->as.heap.ptr += beg;
414
+ s->as.heap.len = len;
415
+ }
416
+ return mrb_obj_value(s);
417
+ }
418
+ #ifdef MRB_UTF8_STRING
419
+ static inline mrb_value
420
+ str_subseq(mrb_state *mrb, mrb_value str, mrb_int beg, mrb_int len)
421
+ {
422
+ beg = chars2bytes(str, 0, beg);
423
+ len = chars2bytes(str, beg, len);
424
+
425
+ return byte_subseq(mrb, str, beg, len);
426
+ }
427
+ #else
428
+ #define str_subseq(mrb, str, beg, len) byte_subseq(mrb, str, beg, len)
429
+ #endif
430
+
431
+ static mrb_value
432
+ str_substr(mrb_state *mrb, mrb_value str, mrb_int beg, mrb_int len)
433
+ {
434
+ mrb_int clen = RSTRING_CHAR_LEN(str);
435
+
436
+ if (len < 0) return mrb_nil_value();
437
+ if (clen == 0) {
438
+ len = 0;
439
+ }
440
+ else if (beg < 0) {
441
+ beg = clen + beg;
442
+ }
443
+ if (beg > clen) return mrb_nil_value();
444
+ if (beg < 0) {
445
+ beg += clen;
446
+ if (beg < 0) return mrb_nil_value();
447
+ }
448
+ if (len > clen - beg)
449
+ len = clen - beg;
450
+ if (len <= 0) {
451
+ len = 0;
452
+ }
453
+ return str_subseq(mrb, str, beg, len);
454
+ }
455
+
456
+ MRB_API mrb_int
457
+ mrb_str_index(mrb_state *mrb, mrb_value str, const char *sptr, mrb_int slen, mrb_int offset)
458
+ {
459
+ mrb_int pos;
460
+ char *s;
461
+ mrb_int len;
462
+
463
+ len = RSTRING_LEN(str);
464
+ if (offset < 0) {
465
+ offset += len;
466
+ if (offset < 0) return -1;
467
+ }
468
+ if (len - offset < slen) return -1;
469
+ s = RSTRING_PTR(str);
470
+ if (offset) {
471
+ s += offset;
472
+ }
473
+ if (slen == 0) return offset;
474
+ /* need proceed one character at a time */
475
+ len = RSTRING_LEN(str) - offset;
476
+ pos = mrb_memsearch(sptr, slen, s, len);
477
+ if (pos < 0) return pos;
478
+ return pos + offset;
479
+ }
480
+
481
+ static mrb_int
482
+ str_index_str(mrb_state *mrb, mrb_value str, mrb_value str2, mrb_int offset)
483
+ {
484
+ const char *ptr;
485
+ mrb_int len;
486
+
487
+ ptr = RSTRING_PTR(str2);
488
+ len = RSTRING_LEN(str2);
489
+
490
+ return mrb_str_index(mrb, str, ptr, len, offset);
491
+ }
492
+
493
+ static void
494
+ check_frozen(mrb_state *mrb, struct RString *s)
495
+ {
496
+ if (MRB_FROZEN_P(s)) {
497
+ mrb_raise(mrb, E_FROZEN_ERROR, "can't modify frozen string");
498
+ }
499
+ }
500
+
501
+ static mrb_value
502
+ str_replace(mrb_state *mrb, struct RString *s1, struct RString *s2)
503
+ {
504
+ mrb_int len;
505
+
506
+ check_frozen(mrb, s1);
507
+ if (s1 == s2) return mrb_obj_value(s1);
508
+ s1->flags &= ~MRB_STR_NO_UTF;
509
+ s1->flags |= s2->flags&MRB_STR_NO_UTF;
510
+ len = RSTR_LEN(s2);
511
+ if (RSTR_SHARED_P(s1)) {
512
+ str_decref(mrb, s1->as.heap.aux.shared);
513
+ RSTR_UNSET_SHARED_FLAG(s1);
514
+ }
515
+ else if (!RSTR_EMBED_P(s1) && !RSTR_NOFREE_P(s1) && !RSTR_FSHARED_P(s1)
516
+ && s1->as.heap.ptr) {
517
+ mrb_free(mrb, s1->as.heap.ptr);
518
+ }
519
+
520
+ RSTR_UNSET_FSHARED_FLAG(s1);
521
+ RSTR_UNSET_NOFREE_FLAG(s1);
522
+ if (len <= RSTRING_EMBED_LEN_MAX) {
523
+ RSTR_UNSET_SHARED_FLAG(s1);
524
+ RSTR_UNSET_FSHARED_FLAG(s1);
525
+ RSTR_SET_EMBED_FLAG(s1);
526
+ memcpy(s1->as.ary, RSTR_PTR(s2), len);
527
+ RSTR_SET_EMBED_LEN(s1, len);
528
+ }
529
+ else {
530
+ str_make_shared(mrb, s2, s1);
531
+ }
532
+
533
+ return mrb_obj_value(s1);
534
+ }
535
+
536
+ static mrb_int
537
+ str_rindex(mrb_state *mrb, mrb_value str, mrb_value sub, mrb_int pos)
538
+ {
539
+ char *s, *sbeg, *t;
540
+ struct RString *ps = mrb_str_ptr(str);
541
+ mrb_int len = RSTRING_LEN(sub);
542
+
543
+ /* substring longer than string */
544
+ if (RSTR_LEN(ps) < len) return -1;
545
+ if (RSTR_LEN(ps) - pos < len) {
546
+ pos = RSTR_LEN(ps) - len;
547
+ }
548
+ sbeg = RSTR_PTR(ps);
549
+ s = RSTR_PTR(ps) + pos;
550
+ t = RSTRING_PTR(sub);
551
+ if (len) {
552
+ while (sbeg <= s) {
553
+ if (memcmp(s, t, len) == 0) {
554
+ return (mrb_int)(s - RSTR_PTR(ps));
555
+ }
556
+ s--;
557
+ }
558
+ return -1;
559
+ }
560
+ else {
561
+ return pos;
562
+ }
563
+ }
564
+
565
+ MRB_API mrb_int
566
+ mrb_str_strlen(mrb_state *mrb, struct RString *s)
567
+ {
568
+ mrb_int i, max = RSTR_LEN(s);
569
+ char *p = RSTR_PTR(s);
570
+
571
+ if (!p) return 0;
572
+ for (i=0; i<max; i++) {
573
+ if (p[i] == '\0') {
574
+ mrb_raise(mrb, E_ARGUMENT_ERROR, "string contains null byte");
575
+ }
576
+ }
577
+ return max;
578
+ }
579
+
580
+ #ifdef _WIN32
581
+ #include <windows.h>
582
+
583
+ char*
584
+ mrb_utf8_from_locale(const char *str, int len)
585
+ {
586
+ wchar_t* wcsp;
587
+ char* mbsp;
588
+ int mbssize, wcssize;
589
+
590
+ if (len == 0)
591
+ return strdup("");
592
+ if (len == -1)
593
+ len = (int)strlen(str);
594
+ wcssize = MultiByteToWideChar(GetACP(), 0, str, len, NULL, 0);
595
+ wcsp = (wchar_t*) malloc((wcssize + 1) * sizeof(wchar_t));
596
+ if (!wcsp)
597
+ return NULL;
598
+ wcssize = MultiByteToWideChar(GetACP(), 0, str, len, wcsp, wcssize + 1);
599
+ wcsp[wcssize] = 0;
600
+
601
+ mbssize = WideCharToMultiByte(CP_UTF8, 0, (LPCWSTR) wcsp, -1, NULL, 0, NULL, NULL);
602
+ mbsp = (char*) malloc((mbssize + 1));
603
+ if (!mbsp) {
604
+ free(wcsp);
605
+ return NULL;
606
+ }
607
+ mbssize = WideCharToMultiByte(CP_UTF8, 0, (LPCWSTR) wcsp, -1, mbsp, mbssize, NULL, NULL);
608
+ mbsp[mbssize] = 0;
609
+ free(wcsp);
610
+ return mbsp;
611
+ }
612
+
613
+ char*
614
+ mrb_locale_from_utf8(const char *utf8, int len)
615
+ {
616
+ wchar_t* wcsp;
617
+ char* mbsp;
618
+ int mbssize, wcssize;
619
+
620
+ if (len == 0)
621
+ return strdup("");
622
+ if (len == -1)
623
+ len = (int)strlen(utf8);
624
+ wcssize = MultiByteToWideChar(CP_UTF8, 0, utf8, len, NULL, 0);
625
+ wcsp = (wchar_t*) malloc((wcssize + 1) * sizeof(wchar_t));
626
+ if (!wcsp)
627
+ return NULL;
628
+ wcssize = MultiByteToWideChar(CP_UTF8, 0, utf8, len, wcsp, wcssize + 1);
629
+ wcsp[wcssize] = 0;
630
+ mbssize = WideCharToMultiByte(GetACP(), 0, (LPCWSTR) wcsp, -1, NULL, 0, NULL, NULL);
631
+ mbsp = (char*) malloc((mbssize + 1));
632
+ if (!mbsp) {
633
+ free(wcsp);
634
+ return NULL;
635
+ }
636
+ mbssize = WideCharToMultiByte(GetACP(), 0, (LPCWSTR) wcsp, -1, mbsp, mbssize, NULL, NULL);
637
+ mbsp[mbssize] = 0;
638
+ free(wcsp);
639
+ return mbsp;
640
+ }
641
+ #endif
642
+
643
+ MRB_API void
644
+ mrb_str_modify(mrb_state *mrb, struct RString *s)
645
+ {
646
+ check_frozen(mrb, s);
647
+ s->flags &= ~MRB_STR_NO_UTF;
648
+ if (RSTR_SHARED_P(s)) {
649
+ mrb_shared_string *shared = s->as.heap.aux.shared;
650
+
651
+ if (shared->nofree == 0 && shared->refcnt == 1 && s->as.heap.ptr == shared->ptr) {
652
+ s->as.heap.ptr = shared->ptr;
653
+ s->as.heap.aux.capa = shared->len;
654
+ RSTR_PTR(s)[s->as.heap.len] = '\0';
655
+ mrb_free(mrb, shared);
656
+ }
657
+ else {
658
+ char *ptr, *p;
659
+ mrb_int len;
660
+
661
+ p = RSTR_PTR(s);
662
+ len = s->as.heap.len;
663
+ if (len < RSTRING_EMBED_LEN_MAX) {
664
+ RSTR_SET_EMBED_FLAG(s);
665
+ RSTR_SET_EMBED_LEN(s, len);
666
+ ptr = RSTR_PTR(s);
667
+ }
668
+ else {
669
+ ptr = (char *)mrb_malloc(mrb, (size_t)len + 1);
670
+ s->as.heap.ptr = ptr;
671
+ s->as.heap.aux.capa = len;
672
+ }
673
+ if (p) {
674
+ memcpy(ptr, p, len);
675
+ }
676
+ ptr[len] = '\0';
677
+ str_decref(mrb, shared);
678
+ }
679
+ RSTR_UNSET_SHARED_FLAG(s);
680
+ return;
681
+ }
682
+ if (RSTR_NOFREE_P(s) || RSTR_FSHARED_P(s)) {
683
+ char *p = s->as.heap.ptr;
684
+ mrb_int len = s->as.heap.len;
685
+
686
+ RSTR_UNSET_FSHARED_FLAG(s);
687
+ RSTR_UNSET_NOFREE_FLAG(s);
688
+ RSTR_UNSET_FSHARED_FLAG(s);
689
+ if (len < RSTRING_EMBED_LEN_MAX) {
690
+ RSTR_SET_EMBED_FLAG(s);
691
+ RSTR_SET_EMBED_LEN(s, len);
692
+ }
693
+ else {
694
+ s->as.heap.ptr = (char *)mrb_malloc(mrb, (size_t)len+1);
695
+ s->as.heap.aux.capa = len;
696
+ }
697
+ if (p) {
698
+ memcpy(RSTR_PTR(s), p, len);
699
+ }
700
+ RSTR_PTR(s)[len] = '\0';
701
+ return;
702
+ }
703
+ }
704
+
705
+ MRB_API mrb_value
706
+ mrb_str_resize(mrb_state *mrb, mrb_value str, mrb_int len)
707
+ {
708
+ mrb_int slen;
709
+ struct RString *s = mrb_str_ptr(str);
710
+
711
+ mrb_str_modify(mrb, s);
712
+ slen = RSTR_LEN(s);
713
+ if (len != slen) {
714
+ if (slen < len || slen - len > 256) {
715
+ resize_capa(mrb, s, len);
716
+ }
717
+ RSTR_SET_LEN(s, len);
718
+ RSTR_PTR(s)[len] = '\0'; /* sentinel */
719
+ }
720
+ return str;
721
+ }
722
+
723
+ MRB_API char*
724
+ mrb_str_to_cstr(mrb_state *mrb, mrb_value str0)
725
+ {
726
+ struct RString *s;
727
+
728
+ if (!mrb_string_p(str0)) {
729
+ mrb_raise(mrb, E_TYPE_ERROR, "expected String");
730
+ }
731
+
732
+ s = str_new(mrb, RSTRING_PTR(str0), RSTRING_LEN(str0));
733
+ if ((strlen(RSTR_PTR(s)) ^ RSTR_LEN(s)) != 0) {
734
+ mrb_raise(mrb, E_ARGUMENT_ERROR, "string contains null byte");
735
+ }
736
+ return RSTR_PTR(s);
737
+ }
738
+
739
+ /*
740
+ * call-seq: (Caution! String("abcd") change)
741
+ * String("abcdefg") = String("abcd") + String("efg")
742
+ *
743
+ * Returns a new string object containing a copy of <i>str</i>.
744
+ */
745
+ MRB_API void
746
+ mrb_str_concat(mrb_state *mrb, mrb_value self, mrb_value other)
747
+ {
748
+ if (!mrb_string_p(other)) {
749
+ other = mrb_str_to_str(mrb, other);
750
+ }
751
+ mrb_str_cat_str(mrb, self, other);
752
+ }
753
+
754
+ /*
755
+ * call-seq: (Caution! String("abcd") remain)
756
+ * String("abcdefg") = String("abcd") + String("efg")
757
+ *
758
+ * Returns a new string object containing a copy of <i>str</i>.
759
+ */
760
+ MRB_API mrb_value
761
+ mrb_str_plus(mrb_state *mrb, mrb_value a, mrb_value b)
762
+ {
763
+ struct RString *s = mrb_str_ptr(a);
764
+ struct RString *s2 = mrb_str_ptr(b);
765
+ struct RString *t;
766
+
767
+ t = str_new(mrb, 0, RSTR_LEN(s) + RSTR_LEN(s2));
768
+ memcpy(RSTR_PTR(t), RSTR_PTR(s), RSTR_LEN(s));
769
+ memcpy(RSTR_PTR(t) + RSTR_LEN(s), RSTR_PTR(s2), RSTR_LEN(s2));
770
+
771
+ return mrb_obj_value(t);
772
+ }
773
+
774
+ /* 15.2.10.5.2 */
775
+
776
+ /*
777
+ * call-seq: (Caution! String("abcd") remain) for stack_argument
778
+ * String("abcdefg") = String("abcd") + String("efg")
779
+ *
780
+ * Returns a new string object containing a copy of <i>str</i>.
781
+ */
782
+ static mrb_value
783
+ mrb_str_plus_m(mrb_state *mrb, mrb_value self)
784
+ {
785
+ mrb_value str;
786
+
787
+ mrb_get_args(mrb, "S", &str);
788
+ return mrb_str_plus(mrb, self, str);
789
+ }
790
+
791
+ /* 15.2.10.5.26 */
792
+ /* 15.2.10.5.33 */
793
+ /*
794
+ * call-seq:
795
+ * "abcd".size => int
796
+ *
797
+ * Returns the length of string.
798
+ */
799
+ static mrb_value
800
+ mrb_str_size(mrb_state *mrb, mrb_value self)
801
+ {
802
+ mrb_int len = RSTRING_CHAR_LEN(self);
803
+ return mrb_fixnum_value(len);
804
+ }
805
+
806
+ static mrb_value
807
+ mrb_str_bytesize(mrb_state *mrb, mrb_value self)
808
+ {
809
+ mrb_int len = RSTRING_LEN(self);
810
+ return mrb_fixnum_value(len);
811
+ }
812
+
813
+ /* 15.2.10.5.1 */
814
+ /*
815
+ * call-seq:
816
+ * str * integer => new_str
817
+ *
818
+ * Copy---Returns a new <code>String</code> containing <i>integer</i> copies of
819
+ * the receiver.
820
+ *
821
+ * "Ho! " * 3 #=> "Ho! Ho! Ho! "
822
+ */
823
+ static mrb_value
824
+ mrb_str_times(mrb_state *mrb, mrb_value self)
825
+ {
826
+ mrb_int n,len,times;
827
+ struct RString *str2;
828
+ char *p;
829
+
830
+ mrb_get_args(mrb, "i", &times);
831
+ if (times < 0) {
832
+ mrb_raise(mrb, E_ARGUMENT_ERROR, "negative argument");
833
+ }
834
+ if (times && MRB_INT_MAX / times < RSTRING_LEN(self)) {
835
+ mrb_raise(mrb, E_ARGUMENT_ERROR, "argument too big");
836
+ }
837
+
838
+ len = RSTRING_LEN(self)*times;
839
+ str2 = str_new(mrb, 0, len);
840
+ str_with_class(mrb, str2, self);
841
+ p = RSTR_PTR(str2);
842
+ if (len > 0) {
843
+ n = RSTRING_LEN(self);
844
+ memcpy(p, RSTRING_PTR(self), n);
845
+ while (n <= len/2) {
846
+ memcpy(p + n, p, n);
847
+ n *= 2;
848
+ }
849
+ memcpy(p + n, p, len-n);
850
+ }
851
+ p[RSTR_LEN(str2)] = '\0';
852
+
853
+ return mrb_obj_value(str2);
854
+ }
855
+ /* -------------------------------------------------------------- */
856
+
857
+ #define lesser(a,b) (((a)>(b))?(b):(a))
858
+
859
+ /* ---------------------------*/
860
+ /*
861
+ * call-seq:
862
+ * mrb_value str1 <=> mrb_value str2 => int
863
+ * > 1
864
+ * = 0
865
+ * < -1
866
+ */
867
+ MRB_API int
868
+ mrb_str_cmp(mrb_state *mrb, mrb_value str1, mrb_value str2)
869
+ {
870
+ mrb_int len;
871
+ mrb_int retval;
872
+ struct RString *s1 = mrb_str_ptr(str1);
873
+ struct RString *s2 = mrb_str_ptr(str2);
874
+
875
+ len = lesser(RSTR_LEN(s1), RSTR_LEN(s2));
876
+ retval = memcmp(RSTR_PTR(s1), RSTR_PTR(s2), len);
877
+ if (retval == 0) {
878
+ if (RSTR_LEN(s1) == RSTR_LEN(s2)) return 0;
879
+ if (RSTR_LEN(s1) > RSTR_LEN(s2)) return 1;
880
+ return -1;
881
+ }
882
+ if (retval > 0) return 1;
883
+ return -1;
884
+ }
885
+
886
+ /* 15.2.10.5.3 */
887
+
888
+ /*
889
+ * call-seq:
890
+ * str <=> other_str => -1, 0, +1
891
+ *
892
+ * Comparison---Returns -1 if <i>other_str</i> is less than, 0 if
893
+ * <i>other_str</i> is equal to, and +1 if <i>other_str</i> is greater than
894
+ * <i>str</i>. If the strings are of different lengths, and the strings are
895
+ * equal when compared up to the shortest length, then the longer string is
896
+ * considered greater than the shorter one. If the variable <code>$=</code> is
897
+ * <code>false</code>, the comparison is based on comparing the binary values
898
+ * of each character in the string. In older versions of Ruby, setting
899
+ * <code>$=</code> allowed case-insensitive comparisons; this is now deprecated
900
+ * in favor of using <code>String#casecmp</code>.
901
+ *
902
+ * <code><=></code> is the basis for the methods <code><</code>,
903
+ * <code><=</code>, <code>></code>, <code>>=</code>, and <code>between?</code>,
904
+ * included from module <code>Comparable</code>. The method
905
+ * <code>String#==</code> does not use <code>Comparable#==</code>.
906
+ *
907
+ * "abcdef" <=> "abcde" #=> 1
908
+ * "abcdef" <=> "abcdef" #=> 0
909
+ * "abcdef" <=> "abcdefg" #=> -1
910
+ * "abcdef" <=> "ABCDEF" #=> 1
911
+ */
912
+ static mrb_value
913
+ mrb_str_cmp_m(mrb_state *mrb, mrb_value str1)
914
+ {
915
+ mrb_value str2;
916
+ mrb_int result;
917
+
918
+ mrb_get_args(mrb, "o", &str2);
919
+ if (!mrb_string_p(str2)) {
920
+ if (!mrb_respond_to(mrb, str2, mrb_intern_lit(mrb, "to_s"))) {
921
+ return mrb_nil_value();
922
+ }
923
+ else if (!mrb_respond_to(mrb, str2, mrb_intern_lit(mrb, "<=>"))) {
924
+ return mrb_nil_value();
925
+ }
926
+ else {
927
+ mrb_value tmp = mrb_funcall(mrb, str2, "<=>", 1, str1);
928
+
929
+ if (!mrb_nil_p(tmp)) return mrb_nil_value();
930
+ if (!mrb_fixnum_p(tmp)) {
931
+ return mrb_funcall(mrb, mrb_fixnum_value(0), "-", 1, tmp);
932
+ }
933
+ result = -mrb_fixnum(tmp);
934
+ }
935
+ }
936
+ else {
937
+ result = mrb_str_cmp(mrb, str1, str2);
938
+ }
939
+ return mrb_fixnum_value(result);
940
+ }
941
+
942
+ static mrb_bool
943
+ str_eql(mrb_state *mrb, const mrb_value str1, const mrb_value str2)
944
+ {
945
+ const mrb_int len = RSTRING_LEN(str1);
946
+
947
+ if (len != RSTRING_LEN(str2)) return FALSE;
948
+ if (memcmp(RSTRING_PTR(str1), RSTRING_PTR(str2), (size_t)len) == 0)
949
+ return TRUE;
950
+ return FALSE;
951
+ }
952
+
953
+ MRB_API mrb_bool
954
+ mrb_str_equal(mrb_state *mrb, mrb_value str1, mrb_value str2)
955
+ {
956
+ if (mrb_immediate_p(str2)) return FALSE;
957
+ if (!mrb_string_p(str2)) {
958
+ if (mrb_nil_p(str2)) return FALSE;
959
+ if (!mrb_respond_to(mrb, str2, mrb_intern_lit(mrb, "to_str"))) {
960
+ return FALSE;
961
+ }
962
+ str2 = mrb_funcall(mrb, str2, "to_str", 0);
963
+ return mrb_equal(mrb, str2, str1);
964
+ }
965
+ return str_eql(mrb, str1, str2);
966
+ }
967
+
968
+ /* 15.2.10.5.4 */
969
+ /*
970
+ * call-seq:
971
+ * str == obj => true or false
972
+ *
973
+ * Equality---
974
+ * If <i>obj</i> is not a <code>String</code>, returns <code>false</code>.
975
+ * Otherwise, returns <code>false</code> or <code>true</code>
976
+ *
977
+ * caution:if <i>str</i> <code><=></code> <i>obj</i> returns zero.
978
+ */
979
+ static mrb_value
980
+ mrb_str_equal_m(mrb_state *mrb, mrb_value str1)
981
+ {
982
+ mrb_value str2;
983
+
984
+ mrb_get_args(mrb, "o", &str2);
985
+
986
+ return mrb_bool_value(mrb_str_equal(mrb, str1, str2));
987
+ }
988
+ /* ---------------------------------- */
989
+ MRB_API mrb_value
990
+ mrb_str_to_str(mrb_state *mrb, mrb_value str)
991
+ {
992
+ mrb_value s;
993
+
994
+ if (!mrb_string_p(str)) {
995
+ s = mrb_check_convert_type(mrb, str, MRB_TT_STRING, "String", "to_str");
996
+ if (mrb_nil_p(s)) {
997
+ s = mrb_convert_type(mrb, str, MRB_TT_STRING, "String", "to_s");
998
+ }
999
+ return s;
1000
+ }
1001
+ return str;
1002
+ }
1003
+
1004
+ MRB_API const char*
1005
+ mrb_string_value_ptr(mrb_state *mrb, mrb_value ptr)
1006
+ {
1007
+ mrb_value str = mrb_str_to_str(mrb, ptr);
1008
+ return RSTRING_PTR(str);
1009
+ }
1010
+
1011
+ MRB_API mrb_int
1012
+ mrb_string_value_len(mrb_state *mrb, mrb_value ptr)
1013
+ {
1014
+ mrb_value str = mrb_str_to_str(mrb, ptr);
1015
+ return RSTRING_LEN(str);
1016
+ }
1017
+
1018
+ void
1019
+ mrb_noregexp(mrb_state *mrb, mrb_value self)
1020
+ {
1021
+ mrb_raise(mrb, E_NOTIMP_ERROR, "Regexp class not implemented");
1022
+ }
1023
+
1024
+ void
1025
+ mrb_regexp_check(mrb_state *mrb, mrb_value obj)
1026
+ {
1027
+ if (mrb_regexp_p(mrb, obj)) {
1028
+ mrb_noregexp(mrb, obj);
1029
+ }
1030
+ }
1031
+
1032
+ MRB_API mrb_value
1033
+ mrb_str_dup(mrb_state *mrb, mrb_value str)
1034
+ {
1035
+ struct RString *s = mrb_str_ptr(str);
1036
+ struct RString *dup = str_new(mrb, 0, 0);
1037
+
1038
+ str_with_class(mrb, dup, str);
1039
+ return str_replace(mrb, dup, s);
1040
+ }
1041
+
1042
+ static mrb_value
1043
+ mrb_str_aref(mrb_state *mrb, mrb_value str, mrb_value indx)
1044
+ {
1045
+ mrb_int idx;
1046
+
1047
+ mrb_regexp_check(mrb, indx);
1048
+ switch (mrb_type(indx)) {
1049
+ case MRB_TT_FIXNUM:
1050
+ idx = mrb_fixnum(indx);
1051
+
1052
+ num_index:
1053
+ str = str_substr(mrb, str, idx, 1);
1054
+ if (!mrb_nil_p(str) && RSTRING_LEN(str) == 0) return mrb_nil_value();
1055
+ return str;
1056
+
1057
+ case MRB_TT_STRING:
1058
+ if (str_index_str(mrb, str, indx, 0) != -1)
1059
+ return mrb_str_dup(mrb, indx);
1060
+ return mrb_nil_value();
1061
+
1062
+ case MRB_TT_RANGE:
1063
+ goto range_arg;
1064
+
1065
+ default:
1066
+ indx = mrb_Integer(mrb, indx);
1067
+ if (mrb_nil_p(indx)) {
1068
+ range_arg:
1069
+ {
1070
+ mrb_int beg, len;
1071
+
1072
+ len = RSTRING_CHAR_LEN(str);
1073
+ switch (mrb_range_beg_len(mrb, indx, &beg, &len, len, TRUE)) {
1074
+ case 1:
1075
+ return str_subseq(mrb, str, beg, len);
1076
+ case 2:
1077
+ return mrb_nil_value();
1078
+ default:
1079
+ break;
1080
+ }
1081
+ }
1082
+ mrb_raise(mrb, E_TYPE_ERROR, "can't convert to Fixnum");
1083
+ }
1084
+ idx = mrb_fixnum(indx);
1085
+ goto num_index;
1086
+ }
1087
+ return mrb_nil_value(); /* not reached */
1088
+ }
1089
+
1090
+ /* 15.2.10.5.6 */
1091
+ /* 15.2.10.5.34 */
1092
+ /*
1093
+ * call-seq:
1094
+ * str[fixnum] => fixnum or nil
1095
+ * str[fixnum, fixnum] => new_str or nil
1096
+ * str[range] => new_str or nil
1097
+ * str[regexp] => new_str or nil
1098
+ * str[regexp, fixnum] => new_str or nil
1099
+ * str[other_str] => new_str or nil
1100
+ * str.slice(fixnum) => fixnum or nil
1101
+ * str.slice(fixnum, fixnum) => new_str or nil
1102
+ * str.slice(range) => new_str or nil
1103
+ * str.slice(other_str) => new_str or nil
1104
+ *
1105
+ * Element Reference---If passed a single <code>Fixnum</code>, returns the code
1106
+ * of the character at that position. If passed two <code>Fixnum</code>
1107
+ * objects, returns a substring starting at the offset given by the first, and
1108
+ * a length given by the second. If given a range, a substring containing
1109
+ * characters at offsets given by the range is returned. In all three cases, if
1110
+ * an offset is negative, it is counted from the end of <i>str</i>. Returns
1111
+ * <code>nil</code> if the initial offset falls outside the string, the length
1112
+ * is negative, or the beginning of the range is greater than the end.
1113
+ *
1114
+ * If a <code>String</code> is given, that string is returned if it occurs in
1115
+ * <i>str</i>. In both cases, <code>nil</code> is returned if there is no
1116
+ * match.
1117
+ *
1118
+ * a = "hello there"
1119
+ * a[1] #=> 101(1.8.7) "e"(1.9.2)
1120
+ * a[1.1] #=> "e"(1.9.2)
1121
+ * a[1,3] #=> "ell"
1122
+ * a[1..3] #=> "ell"
1123
+ * a[-3,2] #=> "er"
1124
+ * a[-4..-2] #=> "her"
1125
+ * a[12..-1] #=> nil
1126
+ * a[-2..-4] #=> ""
1127
+ * a["lo"] #=> "lo"
1128
+ * a["bye"] #=> nil
1129
+ */
1130
+ static mrb_value
1131
+ mrb_str_aref_m(mrb_state *mrb, mrb_value str)
1132
+ {
1133
+ mrb_value a1, a2;
1134
+ mrb_int argc;
1135
+
1136
+ argc = mrb_get_args(mrb, "o|o", &a1, &a2);
1137
+ if (argc == 2) {
1138
+ mrb_int n1, n2;
1139
+
1140
+ mrb_regexp_check(mrb, a1);
1141
+ mrb_get_args(mrb, "ii", &n1, &n2);
1142
+ return str_substr(mrb, str, n1, n2);
1143
+ }
1144
+ if (argc != 1) {
1145
+ mrb_raisef(mrb, E_ARGUMENT_ERROR, "wrong number of arguments (%S for 1)", mrb_fixnum_value(argc));
1146
+ }
1147
+ return mrb_str_aref(mrb, str, a1);
1148
+ }
1149
+
1150
+ /* 15.2.10.5.8 */
1151
+ /*
1152
+ * call-seq:
1153
+ * str.capitalize! => str or nil
1154
+ *
1155
+ * Modifies <i>str</i> by converting the first character to uppercase and the
1156
+ * remainder to lowercase. Returns <code>nil</code> if no changes are made.
1157
+ *
1158
+ * a = "hello"
1159
+ * a.capitalize! #=> "Hello"
1160
+ * a #=> "Hello"
1161
+ * a.capitalize! #=> nil
1162
+ */
1163
+ static mrb_value
1164
+ mrb_str_capitalize_bang(mrb_state *mrb, mrb_value str)
1165
+ {
1166
+ char *p, *pend;
1167
+ mrb_bool modify = FALSE;
1168
+ struct RString *s = mrb_str_ptr(str);
1169
+
1170
+ mrb_str_modify(mrb, s);
1171
+ if (RSTR_LEN(s) == 0 || !RSTR_PTR(s)) return mrb_nil_value();
1172
+ p = RSTR_PTR(s); pend = RSTR_PTR(s) + RSTR_LEN(s);
1173
+ if (ISLOWER(*p)) {
1174
+ *p = TOUPPER(*p);
1175
+ modify = TRUE;
1176
+ }
1177
+ while (++p < pend) {
1178
+ if (ISUPPER(*p)) {
1179
+ *p = TOLOWER(*p);
1180
+ modify = TRUE;
1181
+ }
1182
+ }
1183
+ if (modify) return str;
1184
+ return mrb_nil_value();
1185
+ }
1186
+
1187
+ /* 15.2.10.5.7 */
1188
+ /*
1189
+ * call-seq:
1190
+ * str.capitalize => new_str
1191
+ *
1192
+ * Returns a copy of <i>str</i> with the first character converted to uppercase
1193
+ * and the remainder to lowercase.
1194
+ *
1195
+ * "hello".capitalize #=> "Hello"
1196
+ * "HELLO".capitalize #=> "Hello"
1197
+ * "123ABC".capitalize #=> "123abc"
1198
+ */
1199
+ static mrb_value
1200
+ mrb_str_capitalize(mrb_state *mrb, mrb_value self)
1201
+ {
1202
+ mrb_value str;
1203
+
1204
+ str = mrb_str_dup(mrb, self);
1205
+ mrb_str_capitalize_bang(mrb, str);
1206
+ return str;
1207
+ }
1208
+
1209
+ /* 15.2.10.5.10 */
1210
+ /*
1211
+ * call-seq:
1212
+ * str.chomp!(separator="\n") => str or nil
1213
+ *
1214
+ * Modifies <i>str</i> in place as described for <code>String#chomp</code>,
1215
+ * returning <i>str</i>, or <code>nil</code> if no modifications were made.
1216
+ */
1217
+ static mrb_value
1218
+ mrb_str_chomp_bang(mrb_state *mrb, mrb_value str)
1219
+ {
1220
+ mrb_value rs;
1221
+ mrb_int newline;
1222
+ char *p, *pp;
1223
+ mrb_int rslen;
1224
+ mrb_int len;
1225
+ mrb_int argc;
1226
+ struct RString *s = mrb_str_ptr(str);
1227
+
1228
+ argc = mrb_get_args(mrb, "|S", &rs);
1229
+ mrb_str_modify(mrb, s);
1230
+ len = RSTR_LEN(s);
1231
+ if (argc == 0) {
1232
+ if (len == 0) return mrb_nil_value();
1233
+ smart_chomp:
1234
+ if (RSTR_PTR(s)[len-1] == '\n') {
1235
+ RSTR_SET_LEN(s, RSTR_LEN(s) - 1);
1236
+ if (RSTR_LEN(s) > 0 &&
1237
+ RSTR_PTR(s)[RSTR_LEN(s)-1] == '\r') {
1238
+ RSTR_SET_LEN(s, RSTR_LEN(s) - 1);
1239
+ }
1240
+ }
1241
+ else if (RSTR_PTR(s)[len-1] == '\r') {
1242
+ RSTR_SET_LEN(s, RSTR_LEN(s) - 1);
1243
+ }
1244
+ else {
1245
+ return mrb_nil_value();
1246
+ }
1247
+ RSTR_PTR(s)[RSTR_LEN(s)] = '\0';
1248
+ return str;
1249
+ }
1250
+
1251
+ if (len == 0 || mrb_nil_p(rs)) return mrb_nil_value();
1252
+ p = RSTR_PTR(s);
1253
+ rslen = RSTRING_LEN(rs);
1254
+ if (rslen == 0) {
1255
+ while (len>0 && p[len-1] == '\n') {
1256
+ len--;
1257
+ if (len>0 && p[len-1] == '\r')
1258
+ len--;
1259
+ }
1260
+ if (len < RSTR_LEN(s)) {
1261
+ RSTR_SET_LEN(s, len);
1262
+ p[len] = '\0';
1263
+ return str;
1264
+ }
1265
+ return mrb_nil_value();
1266
+ }
1267
+ if (rslen > len) return mrb_nil_value();
1268
+ newline = RSTRING_PTR(rs)[rslen-1];
1269
+ if (rslen == 1 && newline == '\n')
1270
+ newline = RSTRING_PTR(rs)[rslen-1];
1271
+ if (rslen == 1 && newline == '\n')
1272
+ goto smart_chomp;
1273
+
1274
+ pp = p + len - rslen;
1275
+ if (p[len-1] == newline &&
1276
+ (rslen <= 1 ||
1277
+ memcmp(RSTRING_PTR(rs), pp, rslen) == 0)) {
1278
+ RSTR_SET_LEN(s, len - rslen);
1279
+ p[RSTR_LEN(s)] = '\0';
1280
+ return str;
1281
+ }
1282
+ return mrb_nil_value();
1283
+ }
1284
+
1285
+ /* 15.2.10.5.9 */
1286
+ /*
1287
+ * call-seq:
1288
+ * str.chomp(separator="\n") => new_str
1289
+ *
1290
+ * Returns a new <code>String</code> with the given record separator removed
1291
+ * from the end of <i>str</i> (if present). If <code>$/</code> has not been
1292
+ * changed from the default Ruby record separator, then <code>chomp</code> also
1293
+ * removes carriage return characters (that is it will remove <code>\n</code>,
1294
+ * <code>\r</code>, and <code>\r\n</code>).
1295
+ *
1296
+ * "hello".chomp #=> "hello"
1297
+ * "hello\n".chomp #=> "hello"
1298
+ * "hello\r\n".chomp #=> "hello"
1299
+ * "hello\n\r".chomp #=> "hello\n"
1300
+ * "hello\r".chomp #=> "hello"
1301
+ * "hello \n there".chomp #=> "hello \n there"
1302
+ * "hello".chomp("llo") #=> "he"
1303
+ */
1304
+ static mrb_value
1305
+ mrb_str_chomp(mrb_state *mrb, mrb_value self)
1306
+ {
1307
+ mrb_value str;
1308
+
1309
+ str = mrb_str_dup(mrb, self);
1310
+ mrb_str_chomp_bang(mrb, str);
1311
+ return str;
1312
+ }
1313
+
1314
+ /* 15.2.10.5.12 */
1315
+ /*
1316
+ * call-seq:
1317
+ * str.chop! => str or nil
1318
+ *
1319
+ * Processes <i>str</i> as for <code>String#chop</code>, returning <i>str</i>,
1320
+ * or <code>nil</code> if <i>str</i> is the empty string. See also
1321
+ * <code>String#chomp!</code>.
1322
+ */
1323
+ static mrb_value
1324
+ mrb_str_chop_bang(mrb_state *mrb, mrb_value str)
1325
+ {
1326
+ struct RString *s = mrb_str_ptr(str);
1327
+
1328
+ mrb_str_modify(mrb, s);
1329
+ if (RSTR_LEN(s) > 0) {
1330
+ mrb_int len;
1331
+ #ifdef MRB_UTF8_STRING
1332
+ const char* t = RSTR_PTR(s), *p = t;
1333
+ const char* e = p + RSTR_LEN(s);
1334
+ while (p<e) {
1335
+ mrb_int clen = utf8len(p, e);
1336
+ if (p + clen>=e) break;
1337
+ p += clen;
1338
+ }
1339
+ len = p - t;
1340
+ #else
1341
+ len = RSTR_LEN(s) - 1;
1342
+ #endif
1343
+ if (RSTR_PTR(s)[len] == '\n') {
1344
+ if (len > 0 &&
1345
+ RSTR_PTR(s)[len-1] == '\r') {
1346
+ len--;
1347
+ }
1348
+ }
1349
+ RSTR_SET_LEN(s, len);
1350
+ RSTR_PTR(s)[len] = '\0';
1351
+ return str;
1352
+ }
1353
+ return mrb_nil_value();
1354
+ }
1355
+
1356
+ /* 15.2.10.5.11 */
1357
+ /*
1358
+ * call-seq:
1359
+ * str.chop => new_str
1360
+ *
1361
+ * Returns a new <code>String</code> with the last character removed. If the
1362
+ * string ends with <code>\r\n</code>, both characters are removed. Applying
1363
+ * <code>chop</code> to an empty string returns an empty
1364
+ * string. <code>String#chomp</code> is often a safer alternative, as it leaves
1365
+ * the string unchanged if it doesn't end in a record separator.
1366
+ *
1367
+ * "string\r\n".chop #=> "string"
1368
+ * "string\n\r".chop #=> "string\n"
1369
+ * "string\n".chop #=> "string"
1370
+ * "string".chop #=> "strin"
1371
+ * "x".chop #=> ""
1372
+ */
1373
+ static mrb_value
1374
+ mrb_str_chop(mrb_state *mrb, mrb_value self)
1375
+ {
1376
+ mrb_value str;
1377
+ str = mrb_str_dup(mrb, self);
1378
+ mrb_str_chop_bang(mrb, str);
1379
+ return str;
1380
+ }
1381
+
1382
+ /* 15.2.10.5.14 */
1383
+ /*
1384
+ * call-seq:
1385
+ * str.downcase! => str or nil
1386
+ *
1387
+ * Downcases the contents of <i>str</i>, returning <code>nil</code> if no
1388
+ * changes were made.
1389
+ */
1390
+ static mrb_value
1391
+ mrb_str_downcase_bang(mrb_state *mrb, mrb_value str)
1392
+ {
1393
+ char *p, *pend;
1394
+ mrb_bool modify = FALSE;
1395
+ struct RString *s = mrb_str_ptr(str);
1396
+
1397
+ mrb_str_modify(mrb, s);
1398
+ p = RSTR_PTR(s);
1399
+ pend = RSTR_PTR(s) + RSTR_LEN(s);
1400
+ while (p < pend) {
1401
+ if (ISUPPER(*p)) {
1402
+ *p = TOLOWER(*p);
1403
+ modify = TRUE;
1404
+ }
1405
+ p++;
1406
+ }
1407
+
1408
+ if (modify) return str;
1409
+ return mrb_nil_value();
1410
+ }
1411
+
1412
+ /* 15.2.10.5.13 */
1413
+ /*
1414
+ * call-seq:
1415
+ * str.downcase => new_str
1416
+ *
1417
+ * Returns a copy of <i>str</i> with all uppercase letters replaced with their
1418
+ * lowercase counterparts. The operation is locale insensitive---only
1419
+ * characters 'A' to 'Z' are affected.
1420
+ *
1421
+ * "hEllO".downcase #=> "hello"
1422
+ */
1423
+ static mrb_value
1424
+ mrb_str_downcase(mrb_state *mrb, mrb_value self)
1425
+ {
1426
+ mrb_value str;
1427
+
1428
+ str = mrb_str_dup(mrb, self);
1429
+ mrb_str_downcase_bang(mrb, str);
1430
+ return str;
1431
+ }
1432
+
1433
+ /* 15.2.10.5.16 */
1434
+ /*
1435
+ * call-seq:
1436
+ * str.empty? => true or false
1437
+ *
1438
+ * Returns <code>true</code> if <i>str</i> has a length of zero.
1439
+ *
1440
+ * "hello".empty? #=> false
1441
+ * "".empty? #=> true
1442
+ */
1443
+ static mrb_value
1444
+ mrb_str_empty_p(mrb_state *mrb, mrb_value self)
1445
+ {
1446
+ struct RString *s = mrb_str_ptr(self);
1447
+
1448
+ return mrb_bool_value(RSTR_LEN(s) == 0);
1449
+ }
1450
+
1451
+ /* 15.2.10.5.17 */
1452
+ /*
1453
+ * call-seq:
1454
+ * str.eql?(other) => true or false
1455
+ *
1456
+ * Two strings are equal if the have the same length and content.
1457
+ */
1458
+ static mrb_value
1459
+ mrb_str_eql(mrb_state *mrb, mrb_value self)
1460
+ {
1461
+ mrb_value str2;
1462
+ mrb_bool eql_p;
1463
+
1464
+ mrb_get_args(mrb, "o", &str2);
1465
+ eql_p = (mrb_type(str2) == MRB_TT_STRING) && str_eql(mrb, self, str2);
1466
+
1467
+ return mrb_bool_value(eql_p);
1468
+ }
1469
+
1470
+ MRB_API mrb_value
1471
+ mrb_str_substr(mrb_state *mrb, mrb_value str, mrb_int beg, mrb_int len)
1472
+ {
1473
+ return str_substr(mrb, str, beg, len);
1474
+ }
1475
+
1476
+ uint32_t
1477
+ mrb_str_hash(mrb_state *mrb, mrb_value str)
1478
+ {
1479
+ /* 1-8-7 */
1480
+ struct RString *s = mrb_str_ptr(str);
1481
+ mrb_int len = RSTR_LEN(s);
1482
+ char *p = RSTR_PTR(s);
1483
+ uint64_t key = 0;
1484
+
1485
+ while (len--) {
1486
+ key = key*65599 + *p;
1487
+ p++;
1488
+ }
1489
+ return (uint32_t)(key + (key>>5));
1490
+ }
1491
+
1492
+ /* 15.2.10.5.20 */
1493
+ /*
1494
+ * call-seq:
1495
+ * str.hash => fixnum
1496
+ *
1497
+ * Return a hash based on the string's length and content.
1498
+ */
1499
+ static mrb_value
1500
+ mrb_str_hash_m(mrb_state *mrb, mrb_value self)
1501
+ {
1502
+ mrb_int key = mrb_str_hash(mrb, self);
1503
+ return mrb_fixnum_value(key);
1504
+ }
1505
+
1506
+ /* 15.2.10.5.21 */
1507
+ /*
1508
+ * call-seq:
1509
+ * str.include? other_str => true or false
1510
+ * str.include? fixnum => true or false
1511
+ *
1512
+ * Returns <code>true</code> if <i>str</i> contains the given string or
1513
+ * character.
1514
+ *
1515
+ * "hello".include? "lo" #=> true
1516
+ * "hello".include? "ol" #=> false
1517
+ * "hello".include? ?h #=> true
1518
+ */
1519
+ static mrb_value
1520
+ mrb_str_include(mrb_state *mrb, mrb_value self)
1521
+ {
1522
+ mrb_value str2;
1523
+
1524
+ mrb_get_args(mrb, "S", &str2);
1525
+ if (str_index_str(mrb, self, str2, 0) < 0)
1526
+ return mrb_bool_value(FALSE);
1527
+ return mrb_bool_value(TRUE);
1528
+ }
1529
+
1530
+ /* 15.2.10.5.22 */
1531
+ /*
1532
+ * call-seq:
1533
+ * str.index(substring [, offset]) => fixnum or nil
1534
+ * str.index(fixnum [, offset]) => fixnum or nil
1535
+ * str.index(regexp [, offset]) => fixnum or nil
1536
+ *
1537
+ * Returns the index of the first occurrence of the given
1538
+ * <i>substring</i>,
1539
+ * character (<i>fixnum</i>), or pattern (<i>regexp</i>) in <i>str</i>.
1540
+ * Returns
1541
+ * <code>nil</code> if not found.
1542
+ * If the second parameter is present, it
1543
+ * specifies the position in the string to begin the search.
1544
+ *
1545
+ * "hello".index('e') #=> 1
1546
+ * "hello".index('lo') #=> 3
1547
+ * "hello".index('a') #=> nil
1548
+ * "hello".index(101) #=> 1(101=0x65='e')
1549
+ * "hello".index(/[aeiou]/, -3) #=> 4
1550
+ */
1551
+ static mrb_value
1552
+ mrb_str_index_m(mrb_state *mrb, mrb_value str)
1553
+ {
1554
+ mrb_value *argv;
1555
+ mrb_int argc;
1556
+ mrb_value sub;
1557
+ mrb_int pos, clen;
1558
+
1559
+ mrb_get_args(mrb, "*!", &argv, &argc);
1560
+ if (argc == 2) {
1561
+ mrb_get_args(mrb, "oi", &sub, &pos);
1562
+ }
1563
+ else {
1564
+ pos = 0;
1565
+ if (argc > 0)
1566
+ sub = argv[0];
1567
+ else
1568
+ sub = mrb_nil_value();
1569
+ }
1570
+ mrb_regexp_check(mrb, sub);
1571
+ clen = RSTRING_CHAR_LEN(str);
1572
+ if (pos < 0) {
1573
+ pos += clen;
1574
+ if (pos < 0) {
1575
+ return mrb_nil_value();
1576
+ }
1577
+ }
1578
+ if (pos > clen) return mrb_nil_value();
1579
+ pos = chars2bytes(str, 0, pos);
1580
+
1581
+ switch (mrb_type(sub)) {
1582
+ default: {
1583
+ mrb_value tmp;
1584
+
1585
+ tmp = mrb_check_string_type(mrb, sub);
1586
+ if (mrb_nil_p(tmp)) {
1587
+ mrb_raisef(mrb, E_TYPE_ERROR, "type mismatch: %S given", sub);
1588
+ }
1589
+ sub = tmp;
1590
+ }
1591
+ /* fall through */
1592
+ case MRB_TT_STRING:
1593
+ pos = str_index_str(mrb, str, sub, pos);
1594
+ break;
1595
+ }
1596
+
1597
+ if (pos == -1) return mrb_nil_value();
1598
+ pos = bytes2chars(RSTRING_PTR(str), pos);
1599
+ BYTES_ALIGN_CHECK(pos);
1600
+ return mrb_fixnum_value(pos);
1601
+ }
1602
+
1603
+ #define STR_REPLACE_SHARED_MIN 10
1604
+
1605
+ /* 15.2.10.5.24 */
1606
+ /* 15.2.10.5.28 */
1607
+ /*
1608
+ * call-seq:
1609
+ * str.replace(other_str) => str
1610
+ *
1611
+ * s = "hello" #=> "hello"
1612
+ * s.replace "world" #=> "world"
1613
+ */
1614
+ static mrb_value
1615
+ mrb_str_replace(mrb_state *mrb, mrb_value str)
1616
+ {
1617
+ mrb_value str2;
1618
+
1619
+ mrb_get_args(mrb, "S", &str2);
1620
+ return str_replace(mrb, mrb_str_ptr(str), mrb_str_ptr(str2));
1621
+ }
1622
+
1623
+ /* 15.2.10.5.23 */
1624
+ /*
1625
+ * call-seq:
1626
+ * String.new(str="") => new_str
1627
+ *
1628
+ * Returns a new string object containing a copy of <i>str</i>.
1629
+ */
1630
+ static mrb_value
1631
+ mrb_str_init(mrb_state *mrb, mrb_value self)
1632
+ {
1633
+ mrb_value str2;
1634
+
1635
+ if (mrb_get_args(mrb, "|S", &str2) == 0) {
1636
+ struct RString *s = str_new(mrb, 0, 0);
1637
+ str2 = mrb_obj_value(s);
1638
+ }
1639
+ str_replace(mrb, mrb_str_ptr(self), mrb_str_ptr(str2));
1640
+ return self;
1641
+ }
1642
+
1643
+ /* 15.2.10.5.25 */
1644
+ /* 15.2.10.5.41 */
1645
+ /*
1646
+ * call-seq:
1647
+ * str.intern => symbol
1648
+ * str.to_sym => symbol
1649
+ *
1650
+ * Returns the <code>Symbol</code> corresponding to <i>str</i>, creating the
1651
+ * symbol if it did not previously exist. See <code>Symbol#id2name</code>.
1652
+ *
1653
+ * "Koala".intern #=> :Koala
1654
+ * s = 'cat'.to_sym #=> :cat
1655
+ * s == :cat #=> true
1656
+ * s = '@cat'.to_sym #=> :@cat
1657
+ * s == :@cat #=> true
1658
+ *
1659
+ * This can also be used to create symbols that cannot be represented using the
1660
+ * <code>:xxx</code> notation.
1661
+ *
1662
+ * 'cat and dog'.to_sym #=> :"cat and dog"
1663
+ */
1664
+ MRB_API mrb_value
1665
+ mrb_str_intern(mrb_state *mrb, mrb_value self)
1666
+ {
1667
+ return mrb_symbol_value(mrb_intern_str(mrb, self));
1668
+ }
1669
+ /* ---------------------------------- */
1670
+ MRB_API mrb_value
1671
+ mrb_obj_as_string(mrb_state *mrb, mrb_value obj)
1672
+ {
1673
+ mrb_value str;
1674
+
1675
+ if (mrb_string_p(obj)) {
1676
+ return obj;
1677
+ }
1678
+ str = mrb_funcall(mrb, obj, "to_s", 0);
1679
+ if (!mrb_string_p(str))
1680
+ return mrb_any_to_s(mrb, obj);
1681
+ return str;
1682
+ }
1683
+
1684
+ MRB_API mrb_value
1685
+ mrb_ptr_to_str(mrb_state *mrb, void *p)
1686
+ {
1687
+ struct RString *p_str;
1688
+ char *p1;
1689
+ char *p2;
1690
+ uintptr_t n = (uintptr_t)p;
1691
+
1692
+ p_str = str_new(mrb, NULL, 2 + sizeof(uintptr_t) * CHAR_BIT / 4);
1693
+ p1 = RSTR_PTR(p_str);
1694
+ *p1++ = '0';
1695
+ *p1++ = 'x';
1696
+ p2 = p1;
1697
+
1698
+ do {
1699
+ *p2++ = mrb_digitmap[n % 16];
1700
+ n /= 16;
1701
+ } while (n > 0);
1702
+ *p2 = '\0';
1703
+ RSTR_SET_LEN(p_str, (mrb_int)(p2 - RSTR_PTR(p_str)));
1704
+
1705
+ while (p1 < p2) {
1706
+ const char c = *p1;
1707
+ *p1++ = *--p2;
1708
+ *p2 = c;
1709
+ }
1710
+
1711
+ return mrb_obj_value(p_str);
1712
+ }
1713
+
1714
+ MRB_API mrb_value
1715
+ mrb_string_type(mrb_state *mrb, mrb_value str)
1716
+ {
1717
+ return mrb_convert_type(mrb, str, MRB_TT_STRING, "String", "to_str");
1718
+ }
1719
+
1720
+ MRB_API mrb_value
1721
+ mrb_check_string_type(mrb_state *mrb, mrb_value str)
1722
+ {
1723
+ return mrb_check_convert_type(mrb, str, MRB_TT_STRING, "String", "to_str");
1724
+ }
1725
+
1726
+ /* 15.2.10.5.30 */
1727
+ /*
1728
+ * call-seq:
1729
+ * str.reverse! => str
1730
+ *
1731
+ * Reverses <i>str</i> in place.
1732
+ */
1733
+ static mrb_value
1734
+ mrb_str_reverse_bang(mrb_state *mrb, mrb_value str)
1735
+ {
1736
+ #ifdef MRB_UTF8_STRING
1737
+ mrb_int utf8_len = RSTRING_CHAR_LEN(str);
1738
+ mrb_int len = RSTRING_LEN(str);
1739
+
1740
+ if (utf8_len == len) goto bytes;
1741
+ if (utf8_len > 1) {
1742
+ char *buf;
1743
+ char *p, *e, *r;
1744
+
1745
+ mrb_str_modify(mrb, mrb_str_ptr(str));
1746
+ len = RSTRING_LEN(str);
1747
+ buf = (char*)mrb_malloc(mrb, (size_t)len);
1748
+ p = buf;
1749
+ e = buf + len;
1750
+
1751
+ memcpy(buf, RSTRING_PTR(str), len);
1752
+ r = RSTRING_PTR(str) + len;
1753
+
1754
+ while (p<e) {
1755
+ mrb_int clen = utf8len(p, e);
1756
+ r -= clen;
1757
+ memcpy(r, p, clen);
1758
+ p += clen;
1759
+ }
1760
+ mrb_free(mrb, buf);
1761
+ }
1762
+ return str;
1763
+
1764
+ bytes:
1765
+ #endif
1766
+ {
1767
+ struct RString *s = mrb_str_ptr(str);
1768
+ char *p, *e;
1769
+ char c;
1770
+
1771
+ mrb_str_modify(mrb, s);
1772
+ if (RSTR_LEN(s) > 1) {
1773
+ p = RSTR_PTR(s);
1774
+ e = p + RSTR_LEN(s) - 1;
1775
+ while (p < e) {
1776
+ c = *p;
1777
+ *p++ = *e;
1778
+ *e-- = c;
1779
+ }
1780
+ }
1781
+ return str;
1782
+ }
1783
+ }
1784
+
1785
+ /* ---------------------------------- */
1786
+ /* 15.2.10.5.29 */
1787
+ /*
1788
+ * call-seq:
1789
+ * str.reverse => new_str
1790
+ *
1791
+ * Returns a new string with the characters from <i>str</i> in reverse order.
1792
+ *
1793
+ * "stressed".reverse #=> "desserts"
1794
+ */
1795
+ static mrb_value
1796
+ mrb_str_reverse(mrb_state *mrb, mrb_value str)
1797
+ {
1798
+ mrb_value str2 = mrb_str_dup(mrb, str);
1799
+ mrb_str_reverse_bang(mrb, str2);
1800
+ return str2;
1801
+ }
1802
+
1803
+ /* 15.2.10.5.31 */
1804
+ /*
1805
+ * call-seq:
1806
+ * str.rindex(substring [, fixnum]) => fixnum or nil
1807
+ * str.rindex(fixnum [, fixnum]) => fixnum or nil
1808
+ * str.rindex(regexp [, fixnum]) => fixnum or nil
1809
+ *
1810
+ * Returns the index of the last occurrence of the given <i>substring</i>,
1811
+ * character (<i>fixnum</i>), or pattern (<i>regexp</i>) in <i>str</i>. Returns
1812
+ * <code>nil</code> if not found. If the second parameter is present, it
1813
+ * specifies the position in the string to end the search---characters beyond
1814
+ * this point will not be considered.
1815
+ *
1816
+ * "hello".rindex('e') #=> 1
1817
+ * "hello".rindex('l') #=> 3
1818
+ * "hello".rindex('a') #=> nil
1819
+ * "hello".rindex(101) #=> 1
1820
+ * "hello".rindex(/[aeiou]/, -2) #=> 1
1821
+ */
1822
+ static mrb_value
1823
+ mrb_str_rindex(mrb_state *mrb, mrb_value str)
1824
+ {
1825
+ mrb_value *argv;
1826
+ mrb_int argc;
1827
+ mrb_value sub;
1828
+ mrb_int pos, len = RSTRING_CHAR_LEN(str);
1829
+
1830
+ mrb_get_args(mrb, "*!", &argv, &argc);
1831
+ if (argc == 2) {
1832
+ mrb_get_args(mrb, "oi", &sub, &pos);
1833
+ if (pos < 0) {
1834
+ pos += len;
1835
+ if (pos < 0) {
1836
+ mrb_regexp_check(mrb, sub);
1837
+ return mrb_nil_value();
1838
+ }
1839
+ }
1840
+ if (pos > len) pos = len;
1841
+ }
1842
+ else {
1843
+ pos = len;
1844
+ if (argc > 0)
1845
+ sub = argv[0];
1846
+ else
1847
+ sub = mrb_nil_value();
1848
+ }
1849
+ pos = chars2bytes(str, 0, pos);
1850
+ mrb_regexp_check(mrb, sub);
1851
+
1852
+ switch (mrb_type(sub)) {
1853
+ default: {
1854
+ mrb_value tmp;
1855
+
1856
+ tmp = mrb_check_string_type(mrb, sub);
1857
+ if (mrb_nil_p(tmp)) {
1858
+ mrb_raisef(mrb, E_TYPE_ERROR, "type mismatch: %S given", sub);
1859
+ }
1860
+ sub = tmp;
1861
+ }
1862
+ /* fall through */
1863
+ case MRB_TT_STRING:
1864
+ pos = str_rindex(mrb, str, sub, pos);
1865
+ if (pos >= 0) {
1866
+ pos = bytes2chars(RSTRING_PTR(str), pos);
1867
+ BYTES_ALIGN_CHECK(pos);
1868
+ return mrb_fixnum_value(pos);
1869
+ }
1870
+ break;
1871
+
1872
+ } /* end of switch (TYPE(sub)) */
1873
+ return mrb_nil_value();
1874
+ }
1875
+
1876
+ /* 15.2.10.5.35 */
1877
+
1878
+ /*
1879
+ * call-seq:
1880
+ * str.split(pattern="\n", [limit]) => anArray
1881
+ *
1882
+ * Divides <i>str</i> into substrings based on a delimiter, returning an array
1883
+ * of these substrings.
1884
+ *
1885
+ * If <i>pattern</i> is a <code>String</code>, then its contents are used as
1886
+ * the delimiter when splitting <i>str</i>. If <i>pattern</i> is a single
1887
+ * space, <i>str</i> is split on whitespace, with leading whitespace and runs
1888
+ * of contiguous whitespace characters ignored.
1889
+ *
1890
+ * If <i>pattern</i> is a <code>Regexp</code>, <i>str</i> is divided where the
1891
+ * pattern matches. Whenever the pattern matches a zero-length string,
1892
+ * <i>str</i> is split into individual characters.
1893
+ *
1894
+ * If <i>pattern</i> is omitted, the value of <code>$;</code> is used. If
1895
+ * <code>$;</code> is <code>nil</code> (which is the default), <i>str</i> is
1896
+ * split on whitespace as if ' ' were specified.
1897
+ *
1898
+ * If the <i>limit</i> parameter is omitted, trailing null fields are
1899
+ * suppressed. If <i>limit</i> is a positive number, at most that number of
1900
+ * fields will be returned (if <i>limit</i> is <code>1</code>, the entire
1901
+ * string is returned as the only entry in an array). If negative, there is no
1902
+ * limit to the number of fields returned, and trailing null fields are not
1903
+ * suppressed.
1904
+ *
1905
+ * " now's the time".split #=> ["now's", "the", "time"]
1906
+ * " now's the time".split(' ') #=> ["now's", "the", "time"]
1907
+ * " now's the time".split(/ /) #=> ["", "now's", "", "the", "time"]
1908
+ * "hello".split(//) #=> ["h", "e", "l", "l", "o"]
1909
+ * "hello".split(//, 3) #=> ["h", "e", "llo"]
1910
+ *
1911
+ * "mellow yellow".split("ello") #=> ["m", "w y", "w"]
1912
+ * "1,2,,3,4,,".split(',') #=> ["1", "2", "", "3", "4"]
1913
+ * "1,2,,3,4,,".split(',', 4) #=> ["1", "2", "", "3,4,,"]
1914
+ * "1,2,,3,4,,".split(',', -4) #=> ["1", "2", "", "3", "4", "", ""]
1915
+ */
1916
+
1917
+ static mrb_value
1918
+ mrb_str_split_m(mrb_state *mrb, mrb_value str)
1919
+ {
1920
+ mrb_int argc;
1921
+ mrb_value spat = mrb_nil_value();
1922
+ enum {awk, string, regexp} split_type = string;
1923
+ mrb_int i = 0;
1924
+ mrb_int beg;
1925
+ mrb_int end;
1926
+ mrb_int lim = 0;
1927
+ mrb_bool lim_p;
1928
+ mrb_value result, tmp;
1929
+
1930
+ argc = mrb_get_args(mrb, "|oi", &spat, &lim);
1931
+ lim_p = (lim > 0 && argc == 2);
1932
+ if (argc == 2) {
1933
+ if (lim == 1) {
1934
+ if (RSTRING_LEN(str) == 0)
1935
+ return mrb_ary_new_capa(mrb, 0);
1936
+ return mrb_ary_new_from_values(mrb, 1, &str);
1937
+ }
1938
+ i = 1;
1939
+ }
1940
+
1941
+ if (argc == 0 || mrb_nil_p(spat)) {
1942
+ split_type = awk;
1943
+ }
1944
+ else {
1945
+ if (mrb_string_p(spat)) {
1946
+ split_type = string;
1947
+ if (RSTRING_LEN(spat) == 1 && RSTRING_PTR(spat)[0] == ' ') {
1948
+ split_type = awk;
1949
+ }
1950
+ }
1951
+ else {
1952
+ mrb_noregexp(mrb, str);
1953
+ }
1954
+ }
1955
+
1956
+ result = mrb_ary_new(mrb);
1957
+ beg = 0;
1958
+ if (split_type == awk) {
1959
+ mrb_bool skip = TRUE;
1960
+ mrb_int idx = 0;
1961
+ mrb_int str_len = RSTRING_LEN(str);
1962
+ unsigned int c;
1963
+ int ai = mrb_gc_arena_save(mrb);
1964
+
1965
+ idx = end = beg;
1966
+ while (idx < str_len) {
1967
+ c = (unsigned char)RSTRING_PTR(str)[idx++];
1968
+ if (skip) {
1969
+ if (ISSPACE(c)) {
1970
+ beg = idx;
1971
+ }
1972
+ else {
1973
+ end = idx;
1974
+ skip = FALSE;
1975
+ if (lim_p && lim <= i) break;
1976
+ }
1977
+ }
1978
+ else if (ISSPACE(c)) {
1979
+ mrb_ary_push(mrb, result, byte_subseq(mrb, str, beg, end-beg));
1980
+ mrb_gc_arena_restore(mrb, ai);
1981
+ skip = TRUE;
1982
+ beg = idx;
1983
+ if (lim_p) ++i;
1984
+ }
1985
+ else {
1986
+ end = idx;
1987
+ }
1988
+ }
1989
+ }
1990
+ else if (split_type == string) {
1991
+ mrb_int str_len = RSTRING_LEN(str);
1992
+ mrb_int pat_len = RSTRING_LEN(spat);
1993
+ mrb_int idx = 0;
1994
+ int ai = mrb_gc_arena_save(mrb);
1995
+
1996
+ while (idx < str_len) {
1997
+ if (pat_len > 0) {
1998
+ end = mrb_memsearch(RSTRING_PTR(spat), pat_len, RSTRING_PTR(str)+idx, str_len - idx);
1999
+ if (end < 0) break;
2000
+ }
2001
+ else {
2002
+ end = chars2bytes(str, idx, 1);
2003
+ }
2004
+ mrb_ary_push(mrb, result, byte_subseq(mrb, str, idx, end));
2005
+ mrb_gc_arena_restore(mrb, ai);
2006
+ idx += end + pat_len;
2007
+ if (lim_p && lim <= ++i) break;
2008
+ }
2009
+ beg = idx;
2010
+ }
2011
+ else {
2012
+ mrb_noregexp(mrb, str);
2013
+ }
2014
+ if (RSTRING_LEN(str) > 0 && (lim_p || RSTRING_LEN(str) > beg || lim < 0)) {
2015
+ if (RSTRING_LEN(str) == beg) {
2016
+ tmp = mrb_str_new_empty(mrb, str);
2017
+ }
2018
+ else {
2019
+ tmp = byte_subseq(mrb, str, beg, RSTRING_LEN(str)-beg);
2020
+ }
2021
+ mrb_ary_push(mrb, result, tmp);
2022
+ }
2023
+ if (!lim_p && lim == 0) {
2024
+ mrb_int len;
2025
+ while ((len = RARRAY_LEN(result)) > 0 &&
2026
+ (tmp = RARRAY_PTR(result)[len-1], RSTRING_LEN(tmp) == 0))
2027
+ mrb_ary_pop(mrb, result);
2028
+ }
2029
+
2030
+ return result;
2031
+ }
2032
+
2033
+ MRB_API mrb_value
2034
+ mrb_str_len_to_inum(mrb_state *mrb, const char *str, mrb_int len, mrb_int base, int badcheck)
2035
+ {
2036
+ const char *p = str;
2037
+ const char *pend = str + len;
2038
+ char sign = 1;
2039
+ int c;
2040
+ uint64_t n = 0;
2041
+ mrb_int val;
2042
+
2043
+ #define conv_digit(c) \
2044
+ (ISDIGIT(c) ? ((c) - '0') : \
2045
+ ISLOWER(c) ? ((c) - 'a' + 10) : \
2046
+ ISUPPER(c) ? ((c) - 'A' + 10) : \
2047
+ -1)
2048
+
2049
+ if (!p) {
2050
+ if (badcheck) goto bad;
2051
+ return mrb_fixnum_value(0);
2052
+ }
2053
+ while (p<pend && ISSPACE(*p))
2054
+ p++;
2055
+
2056
+ if (p[0] == '+') {
2057
+ p++;
2058
+ }
2059
+ else if (p[0] == '-') {
2060
+ p++;
2061
+ sign = 0;
2062
+ }
2063
+ if (base <= 0) {
2064
+ if (p[0] == '0') {
2065
+ switch (p[1]) {
2066
+ case 'x': case 'X':
2067
+ base = 16;
2068
+ break;
2069
+ case 'b': case 'B':
2070
+ base = 2;
2071
+ break;
2072
+ case 'o': case 'O':
2073
+ base = 8;
2074
+ break;
2075
+ case 'd': case 'D':
2076
+ base = 10;
2077
+ break;
2078
+ default:
2079
+ base = 8;
2080
+ break;
2081
+ }
2082
+ }
2083
+ else if (base < -1) {
2084
+ base = -base;
2085
+ }
2086
+ else {
2087
+ base = 10;
2088
+ }
2089
+ }
2090
+ switch (base) {
2091
+ case 2:
2092
+ if (p[0] == '0' && (p[1] == 'b'||p[1] == 'B')) {
2093
+ p += 2;
2094
+ }
2095
+ break;
2096
+ case 3:
2097
+ break;
2098
+ case 8:
2099
+ if (p[0] == '0' && (p[1] == 'o'||p[1] == 'O')) {
2100
+ p += 2;
2101
+ }
2102
+ case 4: case 5: case 6: case 7:
2103
+ break;
2104
+ case 10:
2105
+ if (p[0] == '0' && (p[1] == 'd'||p[1] == 'D')) {
2106
+ p += 2;
2107
+ }
2108
+ case 9: case 11: case 12: case 13: case 14: case 15:
2109
+ break;
2110
+ case 16:
2111
+ if (p[0] == '0' && (p[1] == 'x'||p[1] == 'X')) {
2112
+ p += 2;
2113
+ }
2114
+ break;
2115
+ default:
2116
+ if (base < 2 || 36 < base) {
2117
+ mrb_raisef(mrb, E_ARGUMENT_ERROR, "illegal radix %S", mrb_fixnum_value(base));
2118
+ }
2119
+ break;
2120
+ } /* end of switch (base) { */
2121
+ if (p>=pend) {
2122
+ if (badcheck) goto bad;
2123
+ return mrb_fixnum_value(0);
2124
+ }
2125
+ if (*p == '0') { /* squeeze preceding 0s */
2126
+ p++;
2127
+ while (p<pend) {
2128
+ c = *p++;
2129
+ if (c == '_') {
2130
+ if (p<pend && *p == '_') {
2131
+ if (badcheck) goto bad;
2132
+ break;
2133
+ }
2134
+ continue;
2135
+ }
2136
+ if (c != '0') {
2137
+ p--;
2138
+ break;
2139
+ }
2140
+ }
2141
+ if (*(p - 1) == '0')
2142
+ p--;
2143
+ }
2144
+ if (p == pend) {
2145
+ if (badcheck) goto bad;
2146
+ return mrb_fixnum_value(0);
2147
+ }
2148
+ for ( ;p<pend;p++) {
2149
+ if (*p == '_') {
2150
+ p++;
2151
+ if (p==pend) {
2152
+ if (badcheck) goto bad;
2153
+ continue;
2154
+ }
2155
+ if (*p == '_') {
2156
+ if (badcheck) goto bad;
2157
+ break;
2158
+ }
2159
+ }
2160
+ if (badcheck && *p == '\0') {
2161
+ goto nullbyte;
2162
+ }
2163
+ c = conv_digit(*p);
2164
+ if (c < 0 || c >= base) {
2165
+ break;
2166
+ }
2167
+ n *= base;
2168
+ n += c;
2169
+ if (n > (uint64_t)MRB_INT_MAX + (sign ? 0 : 1)) {
2170
+ mrb_raisef(mrb, E_ARGUMENT_ERROR, "string (%S) too big for integer",
2171
+ mrb_str_new(mrb, str, pend-str));
2172
+ }
2173
+ }
2174
+ val = (mrb_int)n;
2175
+ if (badcheck) {
2176
+ if (p == str) goto bad; /* no number */
2177
+ while (p<pend && ISSPACE(*p)) p++;
2178
+ if (p<pend) goto bad; /* trailing garbage */
2179
+ }
2180
+
2181
+ return mrb_fixnum_value(sign ? val : -val);
2182
+ nullbyte:
2183
+ mrb_raise(mrb, E_ARGUMENT_ERROR, "string contains null byte");
2184
+ /* not reached */
2185
+ bad:
2186
+ mrb_raisef(mrb, E_ARGUMENT_ERROR, "invalid string for number(%S)",
2187
+ mrb_inspect(mrb, mrb_str_new(mrb, str, pend-str)));
2188
+ /* not reached */
2189
+ return mrb_fixnum_value(0);
2190
+ }
2191
+
2192
+ MRB_API mrb_value
2193
+ mrb_cstr_to_inum(mrb_state *mrb, const char *str, int base, int badcheck)
2194
+ {
2195
+ return mrb_str_len_to_inum(mrb, str, strlen(str), base, badcheck);
2196
+ }
2197
+
2198
+ MRB_API const char*
2199
+ mrb_string_value_cstr(mrb_state *mrb, mrb_value *ptr)
2200
+ {
2201
+ mrb_value str = mrb_str_to_str(mrb, *ptr);
2202
+ struct RString *ps = mrb_str_ptr(str);
2203
+ mrb_int len = mrb_str_strlen(mrb, ps);
2204
+ char *p = RSTR_PTR(ps);
2205
+
2206
+ if (!p || p[len] != '\0') {
2207
+ if (MRB_FROZEN_P(ps)) {
2208
+ *ptr = str = mrb_str_dup(mrb, str);
2209
+ ps = mrb_str_ptr(str);
2210
+ }
2211
+ mrb_str_modify(mrb, ps);
2212
+ return RSTR_PTR(ps);
2213
+ }
2214
+ return p;
2215
+ }
2216
+
2217
+ MRB_API mrb_value
2218
+ mrb_str_to_inum(mrb_state *mrb, mrb_value str, mrb_int base, mrb_bool badcheck)
2219
+ {
2220
+ const char *s;
2221
+ mrb_int len;
2222
+
2223
+ s = mrb_string_value_ptr(mrb, str);
2224
+ len = RSTRING_LEN(str);
2225
+ return mrb_str_len_to_inum(mrb, s, len, base, badcheck);
2226
+ }
2227
+
2228
+ /* 15.2.10.5.38 */
2229
+ /*
2230
+ * call-seq:
2231
+ * str.to_i(base=10) => integer
2232
+ *
2233
+ * Returns the result of interpreting leading characters in <i>str</i> as an
2234
+ * integer base <i>base</i> (between 2 and 36). Extraneous characters past the
2235
+ * end of a valid number are ignored. If there is not a valid number at the
2236
+ * start of <i>str</i>, <code>0</code> is returned. This method never raises an
2237
+ * exception.
2238
+ *
2239
+ * "12345".to_i #=> 12345
2240
+ * "99 red balloons".to_i #=> 99
2241
+ * "0a".to_i #=> 0
2242
+ * "0a".to_i(16) #=> 10
2243
+ * "hello".to_i #=> 0
2244
+ * "1100101".to_i(2) #=> 101
2245
+ * "1100101".to_i(8) #=> 294977
2246
+ * "1100101".to_i(10) #=> 1100101
2247
+ * "1100101".to_i(16) #=> 17826049
2248
+ */
2249
+ static mrb_value
2250
+ mrb_str_to_i(mrb_state *mrb, mrb_value self)
2251
+ {
2252
+ mrb_int base = 10;
2253
+
2254
+ mrb_get_args(mrb, "|i", &base);
2255
+ if (base < 0) {
2256
+ mrb_raisef(mrb, E_ARGUMENT_ERROR, "illegal radix %S", mrb_fixnum_value(base));
2257
+ }
2258
+ return mrb_str_to_inum(mrb, self, base, FALSE);
2259
+ }
2260
+
2261
+ #ifndef MRB_WITHOUT_FLOAT
2262
+ MRB_API double
2263
+ mrb_cstr_to_dbl(mrb_state *mrb, const char * p, mrb_bool badcheck)
2264
+ {
2265
+ char *end;
2266
+ char buf[DBL_DIG * 4 + 10];
2267
+ double d;
2268
+
2269
+ enum {max_width = 20};
2270
+
2271
+ if (!p) return 0.0;
2272
+ while (ISSPACE(*p)) p++;
2273
+
2274
+ if (!badcheck && p[0] == '0' && (p[1] == 'x' || p[1] == 'X')) {
2275
+ return 0.0;
2276
+ }
2277
+ d = mrb_float_read(p, &end);
2278
+ if (p == end) {
2279
+ if (badcheck) {
2280
+ bad:
2281
+ mrb_raisef(mrb, E_ARGUMENT_ERROR, "invalid string for float(%S)", mrb_str_new_cstr(mrb, p));
2282
+ /* not reached */
2283
+ }
2284
+ return d;
2285
+ }
2286
+ if (*end) {
2287
+ char *n = buf;
2288
+ char *e = buf + sizeof(buf) - 1;
2289
+ char prev = 0;
2290
+
2291
+ while (p < end && n < e) prev = *n++ = *p++;
2292
+ while (*p) {
2293
+ if (*p == '_') {
2294
+ /* remove underscores between digits */
2295
+ if (badcheck) {
2296
+ if (n == buf || !ISDIGIT(prev)) goto bad;
2297
+ ++p;
2298
+ if (!ISDIGIT(*p)) goto bad;
2299
+ }
2300
+ else {
2301
+ while (*++p == '_');
2302
+ continue;
2303
+ }
2304
+ }
2305
+ prev = *p++;
2306
+ if (n < e) *n++ = prev;
2307
+ }
2308
+ *n = '\0';
2309
+ p = buf;
2310
+
2311
+ if (!badcheck && p[0] == '0' && (p[1] == 'x' || p[1] == 'X')) {
2312
+ return 0.0;
2313
+ }
2314
+
2315
+ d = mrb_float_read(p, &end);
2316
+ if (badcheck) {
2317
+ if (!end || p == end) goto bad;
2318
+ while (*end && ISSPACE(*end)) end++;
2319
+ if (*end) goto bad;
2320
+ }
2321
+ }
2322
+ return d;
2323
+ }
2324
+
2325
+ MRB_API double
2326
+ mrb_str_to_dbl(mrb_state *mrb, mrb_value str, mrb_bool badcheck)
2327
+ {
2328
+ char *s;
2329
+ mrb_int len;
2330
+
2331
+ str = mrb_str_to_str(mrb, str);
2332
+ s = RSTRING_PTR(str);
2333
+ len = RSTRING_LEN(str);
2334
+ if (s) {
2335
+ if (badcheck && memchr(s, '\0', len)) {
2336
+ mrb_raise(mrb, E_ARGUMENT_ERROR, "string for Float contains null byte");
2337
+ }
2338
+ if (s[len]) { /* no sentinel somehow */
2339
+ struct RString *temp_str = str_new(mrb, s, len);
2340
+ s = RSTR_PTR(temp_str);
2341
+ }
2342
+ }
2343
+ return mrb_cstr_to_dbl(mrb, s, badcheck);
2344
+ }
2345
+
2346
+ /* 15.2.10.5.39 */
2347
+ /*
2348
+ * call-seq:
2349
+ * str.to_f => float
2350
+ *
2351
+ * Returns the result of interpreting leading characters in <i>str</i> as a
2352
+ * floating point number. Extraneous characters past the end of a valid number
2353
+ * are ignored. If there is not a valid number at the start of <i>str</i>,
2354
+ * <code>0.0</code> is returned. This method never raises an exception.
2355
+ *
2356
+ * "123.45e1".to_f #=> 1234.5
2357
+ * "45.67 degrees".to_f #=> 45.67
2358
+ * "thx1138".to_f #=> 0.0
2359
+ */
2360
+ static mrb_value
2361
+ mrb_str_to_f(mrb_state *mrb, mrb_value self)
2362
+ {
2363
+ return mrb_float_value(mrb, mrb_str_to_dbl(mrb, self, FALSE));
2364
+ }
2365
+ #endif
2366
+
2367
+ /* 15.2.10.5.40 */
2368
+ /*
2369
+ * call-seq:
2370
+ * str.to_s => str
2371
+ * str.to_str => str
2372
+ *
2373
+ * Returns the receiver.
2374
+ */
2375
+ static mrb_value
2376
+ mrb_str_to_s(mrb_state *mrb, mrb_value self)
2377
+ {
2378
+ if (mrb_obj_class(mrb, self) != mrb->string_class) {
2379
+ return mrb_str_dup(mrb, self);
2380
+ }
2381
+ return self;
2382
+ }
2383
+
2384
+ /* 15.2.10.5.43 */
2385
+ /*
2386
+ * call-seq:
2387
+ * str.upcase! => str or nil
2388
+ *
2389
+ * Upcases the contents of <i>str</i>, returning <code>nil</code> if no changes
2390
+ * were made.
2391
+ */
2392
+ static mrb_value
2393
+ mrb_str_upcase_bang(mrb_state *mrb, mrb_value str)
2394
+ {
2395
+ struct RString *s = mrb_str_ptr(str);
2396
+ char *p, *pend;
2397
+ mrb_bool modify = FALSE;
2398
+
2399
+ mrb_str_modify(mrb, s);
2400
+ p = RSTRING_PTR(str);
2401
+ pend = RSTRING_END(str);
2402
+ while (p < pend) {
2403
+ if (ISLOWER(*p)) {
2404
+ *p = TOUPPER(*p);
2405
+ modify = TRUE;
2406
+ }
2407
+ p++;
2408
+ }
2409
+
2410
+ if (modify) return str;
2411
+ return mrb_nil_value();
2412
+ }
2413
+
2414
+ /* 15.2.10.5.42 */
2415
+ /*
2416
+ * call-seq:
2417
+ * str.upcase => new_str
2418
+ *
2419
+ * Returns a copy of <i>str</i> with all lowercase letters replaced with their
2420
+ * uppercase counterparts. The operation is locale insensitive---only
2421
+ * characters 'a' to 'z' are affected.
2422
+ *
2423
+ * "hEllO".upcase #=> "HELLO"
2424
+ */
2425
+ static mrb_value
2426
+ mrb_str_upcase(mrb_state *mrb, mrb_value self)
2427
+ {
2428
+ mrb_value str;
2429
+
2430
+ str = mrb_str_dup(mrb, self);
2431
+ mrb_str_upcase_bang(mrb, str);
2432
+ return str;
2433
+ }
2434
+
2435
+ #define IS_EVSTR(p,e) ((p) < (e) && (*(p) == '$' || *(p) == '@' || *(p) == '{'))
2436
+
2437
+ /*
2438
+ * call-seq:
2439
+ * str.dump -> new_str
2440
+ *
2441
+ * Produces a version of <i>str</i> with all nonprinting characters replaced by
2442
+ * <code>\nnn</code> notation and all special characters escaped.
2443
+ */
2444
+ mrb_value
2445
+ mrb_str_dump(mrb_state *mrb, mrb_value str)
2446
+ {
2447
+ mrb_int len;
2448
+ const char *p, *pend;
2449
+ char *q;
2450
+ struct RString *result;
2451
+
2452
+ len = 2; /* "" */
2453
+ p = RSTRING_PTR(str); pend = p + RSTRING_LEN(str);
2454
+ while (p < pend) {
2455
+ unsigned char c = *p++;
2456
+ switch (c) {
2457
+ case '"': case '\\':
2458
+ case '\n': case '\r':
2459
+ case '\t': case '\f':
2460
+ case '\013': case '\010': case '\007': case '\033':
2461
+ len += 2;
2462
+ break;
2463
+
2464
+ case '#':
2465
+ len += IS_EVSTR(p, pend) ? 2 : 1;
2466
+ break;
2467
+
2468
+ default:
2469
+ if (ISPRINT(c)) {
2470
+ len++;
2471
+ }
2472
+ else {
2473
+ len += 4; /* \NNN */
2474
+ }
2475
+ break;
2476
+ }
2477
+ }
2478
+
2479
+ result = str_new(mrb, 0, len);
2480
+ str_with_class(mrb, result, str);
2481
+ p = RSTRING_PTR(str); pend = p + RSTRING_LEN(str);
2482
+ q = RSTR_PTR(result);
2483
+ *q++ = '"';
2484
+ while (p < pend) {
2485
+ unsigned char c = *p++;
2486
+
2487
+ switch (c) {
2488
+ case '"':
2489
+ case '\\':
2490
+ *q++ = '\\';
2491
+ *q++ = c;
2492
+ break;
2493
+
2494
+ case '\n':
2495
+ *q++ = '\\';
2496
+ *q++ = 'n';
2497
+ break;
2498
+
2499
+ case '\r':
2500
+ *q++ = '\\';
2501
+ *q++ = 'r';
2502
+ break;
2503
+
2504
+ case '\t':
2505
+ *q++ = '\\';
2506
+ *q++ = 't';
2507
+ break;
2508
+
2509
+ case '\f':
2510
+ *q++ = '\\';
2511
+ *q++ = 'f';
2512
+ break;
2513
+
2514
+ case '\013':
2515
+ *q++ = '\\';
2516
+ *q++ = 'v';
2517
+ break;
2518
+
2519
+ case '\010':
2520
+ *q++ = '\\';
2521
+ *q++ = 'b';
2522
+ break;
2523
+
2524
+ case '\007':
2525
+ *q++ = '\\';
2526
+ *q++ = 'a';
2527
+ break;
2528
+
2529
+ case '\033':
2530
+ *q++ = '\\';
2531
+ *q++ = 'e';
2532
+ break;
2533
+
2534
+ case '#':
2535
+ if (IS_EVSTR(p, pend)) *q++ = '\\';
2536
+ *q++ = '#';
2537
+ break;
2538
+
2539
+ default:
2540
+ if (ISPRINT(c)) {
2541
+ *q++ = c;
2542
+ }
2543
+ else {
2544
+ *q++ = '\\';
2545
+ q[2] = '0' + c % 8; c /= 8;
2546
+ q[1] = '0' + c % 8; c /= 8;
2547
+ q[0] = '0' + c % 8;
2548
+ q += 3;
2549
+ }
2550
+ }
2551
+ }
2552
+ *q = '"';
2553
+ return mrb_obj_value(result);
2554
+ }
2555
+
2556
+ MRB_API mrb_value
2557
+ mrb_str_cat(mrb_state *mrb, mrb_value str, const char *ptr, size_t len)
2558
+ {
2559
+ struct RString *s = mrb_str_ptr(str);
2560
+ size_t capa;
2561
+ size_t total;
2562
+ ptrdiff_t off = -1;
2563
+
2564
+ if (len == 0) return str;
2565
+ mrb_str_modify(mrb, s);
2566
+ if (ptr >= RSTR_PTR(s) && ptr <= RSTR_PTR(s) + (size_t)RSTR_LEN(s)) {
2567
+ off = ptr - RSTR_PTR(s);
2568
+ }
2569
+
2570
+ capa = RSTR_CAPA(s);
2571
+ total = RSTR_LEN(s)+len;
2572
+ if (total >= MRB_INT_MAX) {
2573
+ size_error:
2574
+ mrb_raise(mrb, E_ARGUMENT_ERROR, "string size too big");
2575
+ }
2576
+ if (capa <= total) {
2577
+ if (capa == 0) capa = 1;
2578
+ while (capa <= total) {
2579
+ if (capa <= MRB_INT_MAX / 2) {
2580
+ capa *= 2;
2581
+ }
2582
+ else {
2583
+ capa = total+1;
2584
+ }
2585
+ }
2586
+ if (capa <= total || capa > MRB_INT_MAX) {
2587
+ goto size_error;
2588
+ }
2589
+ resize_capa(mrb, s, capa);
2590
+ }
2591
+ if (off != -1) {
2592
+ ptr = RSTR_PTR(s) + off;
2593
+ }
2594
+ memcpy(RSTR_PTR(s) + RSTR_LEN(s), ptr, len);
2595
+ mrb_assert_int_fit(size_t, total, mrb_int, MRB_INT_MAX);
2596
+ RSTR_SET_LEN(s, total);
2597
+ RSTR_PTR(s)[total] = '\0'; /* sentinel */
2598
+ return str;
2599
+ }
2600
+
2601
+ MRB_API mrb_value
2602
+ mrb_str_cat_cstr(mrb_state *mrb, mrb_value str, const char *ptr)
2603
+ {
2604
+ return mrb_str_cat(mrb, str, ptr, strlen(ptr));
2605
+ }
2606
+
2607
+ MRB_API mrb_value
2608
+ mrb_str_cat_str(mrb_state *mrb, mrb_value str, mrb_value str2)
2609
+ {
2610
+ return mrb_str_cat(mrb, str, RSTRING_PTR(str2), RSTRING_LEN(str2));
2611
+ }
2612
+
2613
+ MRB_API mrb_value
2614
+ mrb_str_append(mrb_state *mrb, mrb_value str1, mrb_value str2)
2615
+ {
2616
+ str2 = mrb_str_to_str(mrb, str2);
2617
+ return mrb_str_cat_str(mrb, str1, str2);
2618
+ }
2619
+
2620
+ #define CHAR_ESC_LEN 13 /* sizeof(\x{ hex of 32bit unsigned int } \0) */
2621
+
2622
+ /*
2623
+ * call-seq:
2624
+ * str.inspect -> string
2625
+ *
2626
+ * Returns a printable version of _str_, surrounded by quote marks,
2627
+ * with special characters escaped.
2628
+ *
2629
+ * str = "hello"
2630
+ * str[3] = "\b"
2631
+ * str.inspect #=> "\"hel\\bo\""
2632
+ */
2633
+ mrb_value
2634
+ mrb_str_inspect(mrb_state *mrb, mrb_value str)
2635
+ {
2636
+ const char *p, *pend;
2637
+ char buf[CHAR_ESC_LEN + 1];
2638
+ mrb_value result = mrb_str_new_lit(mrb, "\"");
2639
+
2640
+ p = RSTRING_PTR(str); pend = RSTRING_END(str);
2641
+ for (;p < pend; p++) {
2642
+ unsigned char c, cc;
2643
+ #ifdef MRB_UTF8_STRING
2644
+ mrb_int clen;
2645
+
2646
+ clen = utf8len(p, pend);
2647
+ if (clen > 1) {
2648
+ mrb_int i;
2649
+
2650
+ for (i=0; i<clen; i++) {
2651
+ buf[i] = p[i];
2652
+ }
2653
+ mrb_str_cat(mrb, result, buf, clen);
2654
+ p += clen-1;
2655
+ continue;
2656
+ }
2657
+ #endif
2658
+ c = *p;
2659
+ if (c == '"'|| c == '\\' || (c == '#' && IS_EVSTR(p+1, pend))) {
2660
+ buf[0] = '\\'; buf[1] = c;
2661
+ mrb_str_cat(mrb, result, buf, 2);
2662
+ continue;
2663
+ }
2664
+ if (ISPRINT(c)) {
2665
+ buf[0] = c;
2666
+ mrb_str_cat(mrb, result, buf, 1);
2667
+ continue;
2668
+ }
2669
+ switch (c) {
2670
+ case '\n': cc = 'n'; break;
2671
+ case '\r': cc = 'r'; break;
2672
+ case '\t': cc = 't'; break;
2673
+ case '\f': cc = 'f'; break;
2674
+ case '\013': cc = 'v'; break;
2675
+ case '\010': cc = 'b'; break;
2676
+ case '\007': cc = 'a'; break;
2677
+ case 033: cc = 'e'; break;
2678
+ default: cc = 0; break;
2679
+ }
2680
+ if (cc) {
2681
+ buf[0] = '\\';
2682
+ buf[1] = (char)cc;
2683
+ mrb_str_cat(mrb, result, buf, 2);
2684
+ continue;
2685
+ }
2686
+ else {
2687
+ buf[0] = '\\';
2688
+ buf[3] = '0' + c % 8; c /= 8;
2689
+ buf[2] = '0' + c % 8; c /= 8;
2690
+ buf[1] = '0' + c % 8;
2691
+ mrb_str_cat(mrb, result, buf, 4);
2692
+ continue;
2693
+ }
2694
+ }
2695
+ mrb_str_cat_lit(mrb, result, "\"");
2696
+
2697
+ return result;
2698
+ }
2699
+
2700
+ /*
2701
+ * call-seq:
2702
+ * str.bytes -> array of fixnums
2703
+ *
2704
+ * Returns an array of bytes in _str_.
2705
+ *
2706
+ * str = "hello"
2707
+ * str.bytes #=> [104, 101, 108, 108, 111]
2708
+ */
2709
+ static mrb_value
2710
+ mrb_str_bytes(mrb_state *mrb, mrb_value str)
2711
+ {
2712
+ struct RString *s = mrb_str_ptr(str);
2713
+ mrb_value a = mrb_ary_new_capa(mrb, RSTR_LEN(s));
2714
+ unsigned char *p = (unsigned char *)(RSTR_PTR(s)), *pend = p + RSTR_LEN(s);
2715
+
2716
+ while (p < pend) {
2717
+ mrb_ary_push(mrb, a, mrb_fixnum_value(p[0]));
2718
+ p++;
2719
+ }
2720
+ return a;
2721
+ }
2722
+
2723
+ /* ---------------------------*/
2724
+ void
2725
+ mrb_init_string(mrb_state *mrb)
2726
+ {
2727
+ struct RClass *s;
2728
+
2729
+ mrb_static_assert(RSTRING_EMBED_LEN_MAX < (1 << 5), "pointer size too big for embedded string");
2730
+
2731
+ mrb->string_class = s = mrb_define_class(mrb, "String", mrb->object_class); /* 15.2.10 */
2732
+ MRB_SET_INSTANCE_TT(s, MRB_TT_STRING);
2733
+
2734
+ mrb_define_method(mrb, s, "bytesize", mrb_str_bytesize, MRB_ARGS_NONE());
2735
+
2736
+ mrb_define_method(mrb, s, "<=>", mrb_str_cmp_m, MRB_ARGS_REQ(1)); /* 15.2.10.5.1 */
2737
+ mrb_define_method(mrb, s, "==", mrb_str_equal_m, MRB_ARGS_REQ(1)); /* 15.2.10.5.2 */
2738
+ mrb_define_method(mrb, s, "+", mrb_str_plus_m, MRB_ARGS_REQ(1)); /* 15.2.10.5.4 */
2739
+ mrb_define_method(mrb, s, "*", mrb_str_times, MRB_ARGS_REQ(1)); /* 15.2.10.5.5 */
2740
+ mrb_define_method(mrb, s, "[]", mrb_str_aref_m, MRB_ARGS_ANY()); /* 15.2.10.5.6 */
2741
+ mrb_define_method(mrb, s, "capitalize", mrb_str_capitalize, MRB_ARGS_NONE()); /* 15.2.10.5.7 */
2742
+ mrb_define_method(mrb, s, "capitalize!", mrb_str_capitalize_bang, MRB_ARGS_NONE()); /* 15.2.10.5.8 */
2743
+ mrb_define_method(mrb, s, "chomp", mrb_str_chomp, MRB_ARGS_ANY()); /* 15.2.10.5.9 */
2744
+ mrb_define_method(mrb, s, "chomp!", mrb_str_chomp_bang, MRB_ARGS_ANY()); /* 15.2.10.5.10 */
2745
+ mrb_define_method(mrb, s, "chop", mrb_str_chop, MRB_ARGS_NONE()); /* 15.2.10.5.11 */
2746
+ mrb_define_method(mrb, s, "chop!", mrb_str_chop_bang, MRB_ARGS_NONE()); /* 15.2.10.5.12 */
2747
+ mrb_define_method(mrb, s, "downcase", mrb_str_downcase, MRB_ARGS_NONE()); /* 15.2.10.5.13 */
2748
+ mrb_define_method(mrb, s, "downcase!", mrb_str_downcase_bang, MRB_ARGS_NONE()); /* 15.2.10.5.14 */
2749
+ mrb_define_method(mrb, s, "empty?", mrb_str_empty_p, MRB_ARGS_NONE()); /* 15.2.10.5.16 */
2750
+ mrb_define_method(mrb, s, "eql?", mrb_str_eql, MRB_ARGS_REQ(1)); /* 15.2.10.5.17 */
2751
+
2752
+ mrb_define_method(mrb, s, "hash", mrb_str_hash_m, MRB_ARGS_NONE()); /* 15.2.10.5.20 */
2753
+ mrb_define_method(mrb, s, "include?", mrb_str_include, MRB_ARGS_REQ(1)); /* 15.2.10.5.21 */
2754
+ mrb_define_method(mrb, s, "index", mrb_str_index_m, MRB_ARGS_ANY()); /* 15.2.10.5.22 */
2755
+ mrb_define_method(mrb, s, "initialize", mrb_str_init, MRB_ARGS_REQ(1)); /* 15.2.10.5.23 */
2756
+ mrb_define_method(mrb, s, "initialize_copy", mrb_str_replace, MRB_ARGS_REQ(1)); /* 15.2.10.5.24 */
2757
+ mrb_define_method(mrb, s, "intern", mrb_str_intern, MRB_ARGS_NONE()); /* 15.2.10.5.25 */
2758
+ mrb_define_method(mrb, s, "length", mrb_str_size, MRB_ARGS_NONE()); /* 15.2.10.5.26 */
2759
+ mrb_define_method(mrb, s, "replace", mrb_str_replace, MRB_ARGS_REQ(1)); /* 15.2.10.5.28 */
2760
+ mrb_define_method(mrb, s, "reverse", mrb_str_reverse, MRB_ARGS_NONE()); /* 15.2.10.5.29 */
2761
+ mrb_define_method(mrb, s, "reverse!", mrb_str_reverse_bang, MRB_ARGS_NONE()); /* 15.2.10.5.30 */
2762
+ mrb_define_method(mrb, s, "rindex", mrb_str_rindex, MRB_ARGS_ANY()); /* 15.2.10.5.31 */
2763
+ mrb_define_method(mrb, s, "size", mrb_str_size, MRB_ARGS_NONE()); /* 15.2.10.5.33 */
2764
+ mrb_define_method(mrb, s, "slice", mrb_str_aref_m, MRB_ARGS_ANY()); /* 15.2.10.5.34 */
2765
+ mrb_define_method(mrb, s, "split", mrb_str_split_m, MRB_ARGS_ANY()); /* 15.2.10.5.35 */
2766
+
2767
+ #ifndef MRB_WITHOUT_FLOAT
2768
+ mrb_define_method(mrb, s, "to_f", mrb_str_to_f, MRB_ARGS_NONE()); /* 15.2.10.5.38 */
2769
+ #endif
2770
+ mrb_define_method(mrb, s, "to_i", mrb_str_to_i, MRB_ARGS_ANY()); /* 15.2.10.5.39 */
2771
+ mrb_define_method(mrb, s, "to_s", mrb_str_to_s, MRB_ARGS_NONE()); /* 15.2.10.5.40 */
2772
+ mrb_define_method(mrb, s, "to_str", mrb_str_to_s, MRB_ARGS_NONE());
2773
+ mrb_define_method(mrb, s, "to_sym", mrb_str_intern, MRB_ARGS_NONE()); /* 15.2.10.5.41 */
2774
+ mrb_define_method(mrb, s, "upcase", mrb_str_upcase, MRB_ARGS_NONE()); /* 15.2.10.5.42 */
2775
+ mrb_define_method(mrb, s, "upcase!", mrb_str_upcase_bang, MRB_ARGS_NONE()); /* 15.2.10.5.43 */
2776
+ mrb_define_method(mrb, s, "inspect", mrb_str_inspect, MRB_ARGS_NONE()); /* 15.2.10.5.46(x) */
2777
+ mrb_define_method(mrb, s, "bytes", mrb_str_bytes, MRB_ARGS_NONE());
2778
+ }
2779
+
2780
+ #ifndef MRB_WITHOUT_FLOAT
2781
+ /*
2782
+ * Source code for the "strtod" library procedure.
2783
+ *
2784
+ * Copyright (c) 1988-1993 The Regents of the University of California.
2785
+ * Copyright (c) 1994 Sun Microsystems, Inc.
2786
+ *
2787
+ * Permission to use, copy, modify, and distribute this
2788
+ * software and its documentation for any purpose and without
2789
+ * fee is hereby granted, provided that the above copyright
2790
+ * notice appear in all copies. The University of California
2791
+ * makes no representations about the suitability of this
2792
+ * software for any purpose. It is provided "as is" without
2793
+ * express or implied warranty.
2794
+ *
2795
+ * RCS: @(#) $Id: strtod.c 11708 2007-02-12 23:01:19Z shyouhei $
2796
+ */
2797
+
2798
+ #include <ctype.h>
2799
+ #include <errno.h>
2800
+
2801
+ static const int maxExponent = 511; /* Largest possible base 10 exponent. Any
2802
+ * exponent larger than this will already
2803
+ * produce underflow or overflow, so there's
2804
+ * no need to worry about additional digits.
2805
+ */
2806
+ static const double powersOf10[] = {/* Table giving binary powers of 10. Entry */
2807
+ 10., /* is 10^2^i. Used to convert decimal */
2808
+ 100., /* exponents into floating-point numbers. */
2809
+ 1.0e4,
2810
+ 1.0e8,
2811
+ 1.0e16,
2812
+ 1.0e32,
2813
+ 1.0e64,
2814
+ 1.0e128,
2815
+ 1.0e256
2816
+ };
2817
+
2818
+ MRB_API double
2819
+ mrb_float_read(const char *string, char **endPtr)
2820
+ /* const char *string; A decimal ASCII floating-point number,
2821
+ * optionally preceded by white space.
2822
+ * Must have form "-I.FE-X", where I is the
2823
+ * integer part of the mantissa, F is the
2824
+ * fractional part of the mantissa, and X
2825
+ * is the exponent. Either of the signs
2826
+ * may be "+", "-", or omitted. Either I
2827
+ * or F may be omitted, or both. The decimal
2828
+ * point isn't necessary unless F is present.
2829
+ * The "E" may actually be an "e". E and X
2830
+ * may both be omitted (but not just one).
2831
+ */
2832
+ /* char **endPtr; If non-NULL, store terminating character's
2833
+ * address here. */
2834
+ {
2835
+ int sign, expSign = FALSE;
2836
+ double fraction, dblExp;
2837
+ const double *d;
2838
+ const char *p;
2839
+ int c;
2840
+ int exp = 0; /* Exponent read from "EX" field. */
2841
+ int fracExp = 0; /* Exponent that derives from the fractional
2842
+ * part. Under normal circumstatnces, it is
2843
+ * the negative of the number of digits in F.
2844
+ * However, if I is very long, the last digits
2845
+ * of I get dropped (otherwise a long I with a
2846
+ * large negative exponent could cause an
2847
+ * unnecessary overflow on I alone). In this
2848
+ * case, fracExp is incremented one for each
2849
+ * dropped digit. */
2850
+ int mantSize; /* Number of digits in mantissa. */
2851
+ int decPt; /* Number of mantissa digits BEFORE decimal
2852
+ * point. */
2853
+ const char *pExp; /* Temporarily holds location of exponent
2854
+ * in string. */
2855
+
2856
+ /*
2857
+ * Strip off leading blanks and check for a sign.
2858
+ */
2859
+
2860
+ p = string;
2861
+ while (isspace(*p)) {
2862
+ p += 1;
2863
+ }
2864
+ if (*p == '-') {
2865
+ sign = TRUE;
2866
+ p += 1;
2867
+ }
2868
+ else {
2869
+ if (*p == '+') {
2870
+ p += 1;
2871
+ }
2872
+ sign = FALSE;
2873
+ }
2874
+
2875
+ /*
2876
+ * Count the number of digits in the mantissa (including the decimal
2877
+ * point), and also locate the decimal point.
2878
+ */
2879
+
2880
+ decPt = -1;
2881
+ for (mantSize = 0; ; mantSize += 1)
2882
+ {
2883
+ c = *p;
2884
+ if (!isdigit(c)) {
2885
+ if ((c != '.') || (decPt >= 0)) {
2886
+ break;
2887
+ }
2888
+ decPt = mantSize;
2889
+ }
2890
+ p += 1;
2891
+ }
2892
+
2893
+ /*
2894
+ * Now suck up the digits in the mantissa. Use two integers to
2895
+ * collect 9 digits each (this is faster than using floating-point).
2896
+ * If the mantissa has more than 18 digits, ignore the extras, since
2897
+ * they can't affect the value anyway.
2898
+ */
2899
+
2900
+ pExp = p;
2901
+ p -= mantSize;
2902
+ if (decPt < 0) {
2903
+ decPt = mantSize;
2904
+ }
2905
+ else {
2906
+ mantSize -= 1; /* One of the digits was the point. */
2907
+ }
2908
+ if (mantSize > 18) {
2909
+ if (decPt - 18 > 29999) {
2910
+ fracExp = 29999;
2911
+ }
2912
+ else {
2913
+ fracExp = decPt - 18;
2914
+ }
2915
+ mantSize = 18;
2916
+ }
2917
+ else {
2918
+ fracExp = decPt - mantSize;
2919
+ }
2920
+ if (mantSize == 0) {
2921
+ fraction = 0.0;
2922
+ p = string;
2923
+ goto done;
2924
+ }
2925
+ else {
2926
+ int frac1, frac2;
2927
+ frac1 = 0;
2928
+ for ( ; mantSize > 9; mantSize -= 1)
2929
+ {
2930
+ c = *p;
2931
+ p += 1;
2932
+ if (c == '.') {
2933
+ c = *p;
2934
+ p += 1;
2935
+ }
2936
+ frac1 = 10*frac1 + (c - '0');
2937
+ }
2938
+ frac2 = 0;
2939
+ for (; mantSize > 0; mantSize -= 1)
2940
+ {
2941
+ c = *p;
2942
+ p += 1;
2943
+ if (c == '.') {
2944
+ c = *p;
2945
+ p += 1;
2946
+ }
2947
+ frac2 = 10*frac2 + (c - '0');
2948
+ }
2949
+ fraction = (1.0e9 * frac1) + frac2;
2950
+ }
2951
+
2952
+ /*
2953
+ * Skim off the exponent.
2954
+ */
2955
+
2956
+ p = pExp;
2957
+ if ((*p == 'E') || (*p == 'e')) {
2958
+ p += 1;
2959
+ if (*p == '-') {
2960
+ expSign = TRUE;
2961
+ p += 1;
2962
+ }
2963
+ else {
2964
+ if (*p == '+') {
2965
+ p += 1;
2966
+ }
2967
+ expSign = FALSE;
2968
+ }
2969
+ while (isdigit(*p)) {
2970
+ exp = exp * 10 + (*p - '0');
2971
+ if (exp > 19999) {
2972
+ exp = 19999;
2973
+ }
2974
+ p += 1;
2975
+ }
2976
+ }
2977
+ if (expSign) {
2978
+ exp = fracExp - exp;
2979
+ }
2980
+ else {
2981
+ exp = fracExp + exp;
2982
+ }
2983
+
2984
+ /*
2985
+ * Generate a floating-point number that represents the exponent.
2986
+ * Do this by processing the exponent one bit at a time to combine
2987
+ * many powers of 2 of 10. Then combine the exponent with the
2988
+ * fraction.
2989
+ */
2990
+
2991
+ if (exp < 0) {
2992
+ expSign = TRUE;
2993
+ exp = -exp;
2994
+ }
2995
+ else {
2996
+ expSign = FALSE;
2997
+ }
2998
+ if (exp > maxExponent) {
2999
+ exp = maxExponent;
3000
+ errno = ERANGE;
3001
+ }
3002
+ dblExp = 1.0;
3003
+ for (d = powersOf10; exp != 0; exp >>= 1, d += 1) {
3004
+ if (exp & 01) {
3005
+ dblExp *= *d;
3006
+ }
3007
+ }
3008
+ if (expSign) {
3009
+ fraction /= dblExp;
3010
+ }
3011
+ else {
3012
+ fraction *= dblExp;
3013
+ }
3014
+
3015
+ done:
3016
+ if (endPtr != NULL) {
3017
+ *endPtr = (char *) p;
3018
+ }
3019
+
3020
+ if (sign) {
3021
+ return -fraction;
3022
+ }
3023
+ return fraction;
3024
+ }
3025
+ #endif