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.
- checksums.yaml +7 -0
- data/LICENSE +21 -0
- data/README.md +22 -0
- data/bin/esruby +34 -0
- data/lib/esruby.rb +26 -0
- data/lib/esruby/build.rb +140 -0
- data/lib/esruby/build/configuration.rb +77 -0
- data/lib/esruby/gem.rb +5 -0
- data/lib/esruby/gem/specification.rb +35 -0
- data/resources/build_config.eruby +53 -0
- data/resources/cpp/esruby.cpp +64 -0
- data/resources/cpp/esruby.hpp +42 -0
- data/resources/cpp/main.cpp +9 -0
- data/resources/js/esruby.js +45 -0
- data/resources/mruby/AUTHORS +40 -0
- data/resources/mruby/CONTRIBUTING.md +68 -0
- data/resources/mruby/LEGAL +6 -0
- data/resources/mruby/MITL +20 -0
- data/resources/mruby/Makefile +17 -0
- data/resources/mruby/NEWS +13 -0
- data/resources/mruby/README.md +92 -0
- data/resources/mruby/Rakefile +152 -0
- data/resources/mruby/TODO +10 -0
- data/resources/mruby/appveyor.yml +38 -0
- data/resources/mruby/appveyor_config.rb +50 -0
- data/resources/mruby/benchmark/bm_ao_render.rb +314 -0
- data/resources/mruby/benchmark/bm_app_lc_fizzbuzz.rb +52 -0
- data/resources/mruby/benchmark/bm_fib.rb +7 -0
- data/resources/mruby/benchmark/bm_so_lists.rb +47 -0
- data/resources/mruby/benchmark/build_config_boxing.rb +28 -0
- data/resources/mruby/benchmark/build_config_cc.rb +13 -0
- data/resources/mruby/benchmark/plot.gpl +5 -0
- data/resources/mruby/bin/mirb +0 -0
- data/resources/mruby/bin/mrbc +0 -0
- data/resources/mruby/bin/mruby +0 -0
- data/resources/mruby/bin/mruby-strip +0 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/README.md +82 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/mrbgem.rake +63 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/mrblib/regexp_pcre.rb +232 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/mrblib/string_pcre.rb +333 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/132html +313 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/AUTHORS +45 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/CMakeLists.txt +959 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/COPYING +5 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/ChangeLog +4981 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/CheckMan +67 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/CleanTxt +113 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/Detrail +35 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/HACKING +473 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/INSTALL +370 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/LICENCE +92 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/Makefile.am +877 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/Makefile.in +2917 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/NEWS +611 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/NON-AUTOTOOLS-BUILD +639 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/NON-UNIX-USE +7 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/PrepareRelease +253 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/README +935 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/RunGrepTest +551 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/RunTest +1015 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/RunTest.bat +616 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/aclocal.m4 +1230 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/autom4te.cache/output.0 +21280 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/autom4te.cache/output.1 +21280 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/autom4te.cache/requests +273 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/autom4te.cache/traces.0 +2421 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/autom4te.cache/traces.1 +1144 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/cmake/COPYING-CMAKE-SCRIPTS +22 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/cmake/FindEditline.cmake +17 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/cmake/FindPackageHandleStandardArgs.cmake +58 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/cmake/FindReadline.cmake +29 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/compile +343 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/config-cmake.h.in +54 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/config.guess +1552 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/config.h +392 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/config.h.generic +392 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/config.h.in +343 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/config.sub +1804 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/configure +21280 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/configure.ac +1082 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/depcomp +708 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/dftables.c +212 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/index.html +180 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcre-config.html +109 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcre.html +204 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcre16.html +383 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcre_assign_jit_stack.html +76 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcre_compile.html +108 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcre_compile2.html +112 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcre_config.html +91 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcre_copy_named_substring.html +65 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcre_copy_substring.html +61 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcre_dfa_exec.html +128 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcre_exec.html +110 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcre_free_study.html +46 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcre_free_substring.html +46 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcre_free_substring_list.html +46 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcre_fullinfo.html +108 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcre_get_named_substring.html +68 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcre_get_stringnumber.html +57 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcre_get_stringtable_entries.html +60 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcre_get_substring.html +64 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcre_get_substring_list.html +61 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcre_jit_exec.html +108 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcre_jit_stack_alloc.html +55 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcre_jit_stack_free.html +48 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcre_maketables.html +48 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcre_pattern_to_host_byte_order.html +58 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcre_refcount.html +51 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcre_study.html +68 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcre_utf16_to_host_byte_order.html +57 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcre_version.html +46 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcreapi.html +2786 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcrebuild.html +517 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcrecallout.html +243 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcrecompat.html +216 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcrecpp.html +368 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcredemo.html +426 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcregrep.html +757 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcrejit.html +458 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcrelimits.html +86 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcrematching.html +233 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcrepartial.html +474 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcrepattern.html +2953 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcreperform.html +195 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcreposix.html +292 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcreprecompile.html +158 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcresample.html +110 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcrestack.html +225 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcresyntax.html +521 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcretest.html +1082 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcreunicode.html +270 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/index.html.src +180 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcre-config.1 +92 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcre-config.txt +86 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcre.3 +202 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcre.txt +9909 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcre16.3 +390 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcre32.3 +389 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcre_assign_jit_stack.3 +61 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcre_compile.3 +98 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcre_compile2.3 +106 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcre_config.3 +76 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcre_copy_named_substring.3 +59 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcre_copy_substring.3 +52 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcre_dfa_exec.3 +125 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcre_exec.3 +103 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcre_free_study.3 +31 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcre_free_substring.3 +31 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcre_free_substring_list.3 +31 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcre_fullinfo.3 +95 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcre_get_named_substring.3 +62 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcre_get_stringnumber.3 +45 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcre_get_stringtable_entries.3 +48 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcre_get_substring.3 +55 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcre_get_substring_list.3 +49 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcre_jit_exec.3 +104 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcre_jit_stack_alloc.3 +45 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcre_jit_stack_free.3 +35 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcre_maketables.3 +33 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcre_pattern_to_host_byte_order.3 +46 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcre_refcount.3 +36 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcre_study.3 +56 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcre_utf16_to_host_byte_order.3 +46 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcre_utf32_to_host_byte_order.3 +46 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcre_version.3 +31 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcreapi.3 +2823 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcrebuild.3 +520 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcrecallout.3 +214 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcrecompat.3 +185 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcrecpp.3 +348 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcregrep.1 +679 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcregrep.txt +740 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcrejit.3 +437 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcrelimits.3 +67 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcrematching.3 +206 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcrepartial.3 +445 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcrepattern.3 +2983 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcreperform.3 +177 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcreposix.3 +270 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcreprecompile.3 +151 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcresample.3 +99 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcrestack.3 +215 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcresyntax.3 +496 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcretest.1 +1079 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcretest.txt +1012 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcreunicode.3 +255 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/perltest.txt +42 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/install-sh +527 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/libpcre.pc.in +12 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/libpcre16.pc.in +12 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/libpcre32.pc.in +12 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/libpcrecpp.pc.in +12 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/libpcreposix.pc.in +13 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/ltmain.sh +9636 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/m4/ax_pthread.m4 +309 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/m4/libtool.m4 +7844 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/m4/ltoptions.m4 +369 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/m4/ltsugar.m4 +123 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/m4/ltversion.m4 +23 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/m4/lt~obsolete.m4 +98 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/m4/pcre_visibility.m4 +89 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/makevp.bat +66 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/makevp_c.txt +20 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/makevp_l.txt +20 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/missing +331 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre-config.in +133 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre.h +653 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre.h.generic +653 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre.h.in +653 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre16_byte_order.c +45 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre16_chartables.c +45 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre16_compile.c +45 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre16_config.c +45 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre16_dfa_exec.c +45 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre16_exec.c +45 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre16_fullinfo.c +45 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre16_get.c +45 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre16_globals.c +45 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre16_jit_compile.c +45 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre16_maketables.c +45 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre16_newline.c +45 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre16_ord2utf16.c +90 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre16_printint.c +45 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre16_refcount.c +45 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre16_string_utils.c +45 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre16_study.c +45 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre16_tables.c +45 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre16_ucd.c +45 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre16_utf16_utils.c +130 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre16_valid_utf16.c +156 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre16_version.c +45 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre16_xclass.c +45 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre32_byte_order.c +45 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre32_chartables.c +45 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre32_compile.c +45 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre32_config.c +45 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre32_dfa_exec.c +45 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre32_exec.c +45 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre32_fullinfo.c +45 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre32_get.c +45 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre32_globals.c +45 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre32_jit_compile.c +45 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre32_maketables.c +45 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre32_newline.c +45 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre32_ord2utf32.c +82 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre32_printint.c +45 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre32_refcount.c +45 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre32_string_utils.c +45 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre32_study.c +45 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre32_tables.c +45 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre32_ucd.c +45 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre32_utf32_utils.c +141 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre32_valid_utf32.c +131 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre32_version.c +45 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre32_xclass.c +45 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre_byte_order.c +318 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre_chartables.c +198 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre_chartables.c.dist +198 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre_compile.c +8386 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre_config.c +186 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre_dfa_exec.c +3582 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre_exec.c +7049 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre_fullinfo.c +231 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre_get.c +662 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre_globals.c +84 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre_internal.h +2744 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre_jit_compile.c +8560 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre_jit_test.c +1614 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre_maketables.c +151 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre_newline.c +210 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre_ord2utf8.c +94 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre_printint.c +766 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre_refcount.c +92 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre_scanner.cc +199 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre_scanner.h +172 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre_scanner_unittest.cc +159 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre_string_utils.c +211 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre_stringpiece.cc +43 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre_stringpiece.h.in +179 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre_stringpiece_unittest.cc +150 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre_study.c +1562 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre_tables.c +655 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre_ucd.c +3298 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre_valid_utf8.c +312 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre_version.c +98 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre_xclass.c +198 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcrecpp.cc +922 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcrecpp.h +710 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcrecpp_internal.h +71 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcrecpp_unittest.cc +1291 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcrecpparg.h.in +174 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcredemo.c +406 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcregexp.pas +845 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcregrep.c +3180 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcreposix.c +419 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcreposix.h +146 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcretest.c +5488 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/perltest.pl +237 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/sljit/sljitConfig.h +110 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/sljit/sljitConfigInternal.h +484 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/sljit/sljitExecAllocator.c +289 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/sljit/sljitLir.c +1766 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/sljit/sljitLir.h +985 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/sljit/sljitNativeARM_Thumb2.c +2008 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/sljit/sljitNativeARM_v5.c +2515 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/sljit/sljitNativeMIPS_32.c +404 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/sljit/sljitNativeMIPS_common.c +1881 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/sljit/sljitNativePPC_32.c +269 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/sljit/sljitNativePPC_64.c +421 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/sljit/sljitNativePPC_common.c +2014 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/sljit/sljitNativeSPARC_32.c +164 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/sljit/sljitNativeSPARC_common.c +1348 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/sljit/sljitNativeX86_32.c +547 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/sljit/sljitNativeX86_64.c +810 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/sljit/sljitNativeX86_common.c +2836 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/sljit/sljitUtils.c +332 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/grepbinary +0 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/grepfilelist +3 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/grepinput +611 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/grepinput3 +15 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/grepinput8 +11 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/grepinputv +4 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/grepinputx +43 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/greplist +7 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/grepoutput +707 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/grepoutput8 +12 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/grepoutputN +16 -1
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/greppatN4 +2 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/saved16 +0 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/saved16BE-1 +0 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/saved16BE-2 +0 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/saved16LE-1 +0 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/saved16LE-2 +0 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/saved32 +0 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/saved32BE-1 +0 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/saved32BE-2 +0 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/saved32LE-1 +0 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/saved32LE-2 +0 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/saved8 +0 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testinput1 +5306 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testinput10 +1337 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testinput11 +135 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testinput12 +89 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testinput13 +9 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testinput14 +329 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testinput15 +430 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testinput16 +35 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testinput17 +296 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testinput18 +296 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testinput19 +22 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testinput2 +3813 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testinput20 +19 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testinput21 +16 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testinput22 +13 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testinput23 +16 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testinput24 +77 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testinput25 +32 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testinput26 +80 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testinput3 +95 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testinput4 +624 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testinput5 +772 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testinput6 +1319 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testinput7 +672 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testinput8 +4801 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testinput9 +717 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testinputEBC +121 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testoutput1 +8798 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testoutput10 +2726 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testoutput11-16 +713 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testoutput11-32 +713 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testoutput11-8 +713 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testoutput12 +181 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testoutput13 +21 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testoutput14 +476 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testoutput15 +1269 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testoutput16 +121 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testoutput17 +505 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testoutput18-16 +1022 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testoutput18-32 +1019 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testoutput19 +88 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testoutput2 +12484 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testoutput20 +27 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testoutput21-16 +90 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testoutput21-32 +90 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testoutput22-16 +71 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testoutput22-32 +71 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testoutput23 +42 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testoutput24 +145 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testoutput25 +79 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testoutput26 +148 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testoutput3 +169 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testoutput4 +1094 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testoutput5 +1849 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testoutput6 +2137 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testoutput7 +1473 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testoutput8 +8019 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testoutput9 +1371 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testoutputEBC +182 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/wintestinput3 +91 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/wintestoutput3 +166 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/ucp.h +197 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/run_test.rb +23 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/src/mruby_regexp_pcre.c +364 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/test/matchdata.rb +94 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/test/regexp.rb +264 -0
- data/resources/mruby/build/mrbgems/mruby-regexp-pcre/test/string.rb +201 -0
- data/resources/mruby/build_config.rb +152 -0
- data/resources/mruby/doc/guides/compile.md +488 -0
- data/resources/mruby/doc/guides/debugger.md +370 -0
- data/resources/mruby/doc/guides/gc-arena-howto.md +177 -0
- data/resources/mruby/doc/guides/mrbconf.md +146 -0
- data/resources/mruby/doc/guides/mrbgems.md +340 -0
- data/resources/mruby/doc/limitations.md +187 -0
- data/resources/mruby/examples/mrbgems/c_and_ruby_extension_example/README.md +4 -0
- data/resources/mruby/examples/mrbgems/c_and_ruby_extension_example/mrbgem.rake +23 -0
- data/resources/mruby/examples/mrbgems/c_and_ruby_extension_example/mrblib/example.rb +5 -0
- data/resources/mruby/examples/mrbgems/c_and_ruby_extension_example/src/example.c +20 -0
- data/resources/mruby/examples/mrbgems/c_and_ruby_extension_example/test/example.rb +7 -0
- data/resources/mruby/examples/mrbgems/c_extension_example/README.md +4 -0
- data/resources/mruby/examples/mrbgems/c_extension_example/mrbgem.rake +23 -0
- data/resources/mruby/examples/mrbgems/c_extension_example/src/example.c +20 -0
- data/resources/mruby/examples/mrbgems/c_extension_example/test/example.c +7 -0
- data/resources/mruby/examples/mrbgems/c_extension_example/test/example.rb +3 -0
- data/resources/mruby/examples/mrbgems/ruby_extension_example/README.md +4 -0
- data/resources/mruby/examples/mrbgems/ruby_extension_example/mrbgem.rake +25 -0
- data/resources/mruby/examples/mrbgems/ruby_extension_example/mrblib/example.rb +5 -0
- data/resources/mruby/examples/mrbgems/ruby_extension_example/test/example.rb +3 -0
- data/resources/mruby/examples/targets/build_config_ArduinoDue.rb +90 -0
- data/resources/mruby/examples/targets/build_config_IntelEdison.rb +69 -0
- data/resources/mruby/examples/targets/build_config_IntelGalileo.rb +106 -0
- data/resources/mruby/examples/targets/build_config_RX630.rb +81 -0
- data/resources/mruby/examples/targets/build_config_android_arm64-v8a.rb +26 -0
- data/resources/mruby/examples/targets/build_config_android_armeabi.rb +26 -0
- data/resources/mruby/examples/targets/build_config_android_armeabi_v7a_neon_hard.rb +28 -0
- data/resources/mruby/examples/targets/build_config_chipKITMax32.rb +86 -0
- data/resources/mruby/include/mrbconf.h +145 -0
- data/resources/mruby/include/mruby.h +1280 -0
- data/resources/mruby/include/mruby/array.h +279 -0
- data/resources/mruby/include/mruby/boxing_nan.h +102 -0
- data/resources/mruby/include/mruby/boxing_no.h +56 -0
- data/resources/mruby/include/mruby/boxing_word.h +136 -0
- data/resources/mruby/include/mruby/class.h +94 -0
- data/resources/mruby/include/mruby/common.h +72 -0
- data/resources/mruby/include/mruby/compile.h +194 -0
- data/resources/mruby/include/mruby/data.h +75 -0
- data/resources/mruby/include/mruby/debug.h +66 -0
- data/resources/mruby/include/mruby/dump.h +196 -0
- data/resources/mruby/include/mruby/error.h +75 -0
- data/resources/mruby/include/mruby/gc.h +91 -0
- data/resources/mruby/include/mruby/hash.h +182 -0
- data/resources/mruby/include/mruby/irep.h +62 -0
- data/resources/mruby/include/mruby/istruct.h +47 -0
- data/resources/mruby/include/mruby/khash.h +274 -0
- data/resources/mruby/include/mruby/numeric.h +161 -0
- data/resources/mruby/include/mruby/object.h +45 -0
- data/resources/mruby/include/mruby/opcode.h +161 -0
- data/resources/mruby/include/mruby/proc.h +131 -0
- data/resources/mruby/include/mruby/range.h +49 -0
- data/resources/mruby/include/mruby/re.h +16 -0
- data/resources/mruby/include/mruby/string.h +440 -0
- data/resources/mruby/include/mruby/throw.h +55 -0
- data/resources/mruby/include/mruby/value.h +309 -0
- data/resources/mruby/include/mruby/variable.h +138 -0
- data/resources/mruby/include/mruby/version.h +110 -0
- data/resources/mruby/lib/mruby-core-ext.rb +79 -0
- data/resources/mruby/lib/mruby/build.rb +355 -0
- data/resources/mruby/lib/mruby/build/command.rb +324 -0
- data/resources/mruby/lib/mruby/build/load_gems.rb +122 -0
- data/resources/mruby/lib/mruby/gem.rb +459 -0
- data/resources/mruby/lib/mruby/source.rb +30 -0
- data/resources/mruby/minirake +484 -0
- data/resources/mruby/mrbgems/default.gembox +82 -0
- data/resources/mruby/mrbgems/full-core.gembox +9 -0
- data/resources/mruby/mrbgems/mruby-array-ext/mrbgem.rake +6 -0
- data/resources/mruby/mrbgems/mruby-array-ext/mrblib/array.rb +935 -0
- data/resources/mruby/mrbgems/mruby-array-ext/src/array.c +246 -0
- data/resources/mruby/mrbgems/mruby-array-ext/test/array.rb +422 -0
- data/resources/mruby/mrbgems/mruby-bin-debugger/bintest/mrdb.rb +286 -0
- data/resources/mruby/mrbgems/mruby-bin-debugger/bintest/print.rb +701 -0
- data/resources/mruby/mrbgems/mruby-bin-debugger/mrbgem.rake +9 -0
- data/resources/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/apibreak.c +505 -0
- data/resources/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/apibreak.h +26 -0
- data/resources/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/apilist.c +240 -0
- data/resources/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/apilist.h +14 -0
- data/resources/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/apiprint.c +78 -0
- data/resources/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/apiprint.h +13 -0
- data/resources/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/cmdbreak.c +436 -0
- data/resources/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/cmdmisc.c +502 -0
- data/resources/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/cmdprint.c +58 -0
- data/resources/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/cmdrun.c +64 -0
- data/resources/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/mrdb.c +759 -0
- data/resources/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/mrdb.h +165 -0
- data/resources/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/mrdbconf.h +16 -0
- data/resources/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/mrdberror.h +20 -0
- data/resources/mruby/mrbgems/mruby-bin-mirb/bintest/mirb.rb +12 -0
- data/resources/mruby/mrbgems/mruby-bin-mirb/mrbgem.rake +33 -0
- data/resources/mruby/mrbgems/mruby-bin-mirb/tools/mirb/mirb.c +611 -0
- data/resources/mruby/mrbgems/mruby-bin-mrbc/mrbgem.rake +16 -0
- data/resources/mruby/mrbgems/mruby-bin-mrbc/tools/mrbc/mrbc.c +336 -0
- data/resources/mruby/mrbgems/mruby-bin-mruby-config/mrbgem.rake +30 -0
- data/resources/mruby/mrbgems/mruby-bin-mruby-config/mruby-config +20 -0
- data/resources/mruby/mrbgems/mruby-bin-mruby-config/mruby-config.bat +42 -0
- data/resources/mruby/mrbgems/mruby-bin-mruby/bintest/mruby.rb +60 -0
- data/resources/mruby/mrbgems/mruby-bin-mruby/mrbgem.rake +12 -0
- data/resources/mruby/mrbgems/mruby-bin-mruby/tools/mruby/mruby.c +254 -0
- data/resources/mruby/mrbgems/mruby-bin-strip/bintest/mruby-strip.rb +73 -0
- data/resources/mruby/mrbgems/mruby-bin-strip/mrbgem.rake +6 -0
- data/resources/mruby/mrbgems/mruby-bin-strip/tools/mruby-strip/mruby-strip.c +155 -0
- data/resources/mruby/mrbgems/mruby-class-ext/mrbgem.rake +5 -0
- data/resources/mruby/mrbgems/mruby-class-ext/src/class.c +68 -0
- data/resources/mruby/mrbgems/mruby-class-ext/test/module.rb +55 -0
- data/resources/mruby/mrbgems/mruby-compar-ext/mrbgem.rake +5 -0
- data/resources/mruby/mrbgems/mruby-compar-ext/mrblib/compar.rb +31 -0
- data/resources/mruby/mrbgems/mruby-compiler/bintest/mrbc.rb +30 -0
- data/resources/mruby/mrbgems/mruby-compiler/core/codegen.c +3083 -0
- data/resources/mruby/mrbgems/mruby-compiler/core/keywords +50 -0
- data/resources/mruby/mrbgems/mruby-compiler/core/lex.def +211 -0
- data/resources/mruby/mrbgems/mruby-compiler/core/node.h +118 -0
- data/resources/mruby/mrbgems/mruby-compiler/core/parse.y +6661 -0
- data/resources/mruby/mrbgems/mruby-compiler/mrbgem.rake +40 -0
- data/resources/mruby/mrbgems/mruby-enum-ext/mrbgem.rake +5 -0
- data/resources/mruby/mrbgems/mruby-enum-ext/mrblib/enum.rb +813 -0
- data/resources/mruby/mrbgems/mruby-enum-ext/test/enum.rb +185 -0
- data/resources/mruby/mrbgems/mruby-enum-lazy/mrbgem.rake +7 -0
- data/resources/mruby/mrbgems/mruby-enum-lazy/mrblib/lazy.rb +178 -0
- data/resources/mruby/mrbgems/mruby-enum-lazy/test/lazy.rb +53 -0
- data/resources/mruby/mrbgems/mruby-enumerator/mrbgem.rake +7 -0
- data/resources/mruby/mrbgems/mruby-enumerator/mrblib/enumerator.rb +645 -0
- data/resources/mruby/mrbgems/mruby-enumerator/test/enumerator.rb +546 -0
- data/resources/mruby/mrbgems/mruby-error/mrbgem.rake +10 -0
- data/resources/mruby/mrbgems/mruby-error/src/exception.c +100 -0
- data/resources/mruby/mrbgems/mruby-error/test/exception.c +59 -0
- data/resources/mruby/mrbgems/mruby-error/test/exception.rb +55 -0
- data/resources/mruby/mrbgems/mruby-eval/mrbgem.rake +7 -0
- data/resources/mruby/mrbgems/mruby-eval/src/eval.c +346 -0
- data/resources/mruby/mrbgems/mruby-eval/test/eval.rb +101 -0
- data/resources/mruby/mrbgems/mruby-exit/mrbgem.rake +5 -0
- data/resources/mruby/mrbgems/mruby-exit/src/mruby-exit.c +24 -0
- data/resources/mruby/mrbgems/mruby-fiber/mrbgem.rake +5 -0
- data/resources/mruby/mrbgems/mruby-fiber/src/fiber.c +420 -0
- data/resources/mruby/mrbgems/mruby-fiber/test/fiber.rb +208 -0
- data/resources/mruby/mrbgems/mruby-hash-ext/mrbgem.rake +8 -0
- data/resources/mruby/mrbgems/mruby-hash-ext/mrblib/hash.rb +502 -0
- data/resources/mruby/mrbgems/mruby-hash-ext/src/hash-ext.c +128 -0
- data/resources/mruby/mrbgems/mruby-hash-ext/test/hash.rb +300 -0
- data/resources/mruby/mrbgems/mruby-inline-struct/mrbgem.rake +5 -0
- data/resources/mruby/mrbgems/mruby-inline-struct/test/inline.c +83 -0
- data/resources/mruby/mrbgems/mruby-inline-struct/test/inline.rb +151 -0
- data/resources/mruby/mrbgems/mruby-io/README.md +193 -0
- data/resources/mruby/mrbgems/mruby-io/include/mruby/ext/io.h +38 -0
- data/resources/mruby/mrbgems/mruby-io/mrbgem.rake +17 -0
- data/resources/mruby/mrbgems/mruby-io/mrblib/file.rb +208 -0
- data/resources/mruby/mrbgems/mruby-io/mrblib/file_constants.rb +29 -0
- data/resources/mruby/mrbgems/mruby-io/mrblib/io.rb +387 -0
- data/resources/mruby/mrbgems/mruby-io/mrblib/kernel.rb +15 -0
- data/resources/mruby/mrbgems/mruby-io/run_test.rb +26 -0
- data/resources/mruby/mrbgems/mruby-io/src/file.c +489 -0
- data/resources/mruby/mrbgems/mruby-io/src/file_test.c +381 -0
- data/resources/mruby/mrbgems/mruby-io/src/io.c +1320 -0
- data/resources/mruby/mrbgems/mruby-io/src/mruby_io_gem.c +20 -0
- data/resources/mruby/mrbgems/mruby-io/test/file.rb +197 -0
- data/resources/mruby/mrbgems/mruby-io/test/file_test.rb +117 -0
- data/resources/mruby/mrbgems/mruby-io/test/gc_filedes.sh +4 -0
- data/resources/mruby/mrbgems/mruby-io/test/io.rb +642 -0
- data/resources/mruby/mrbgems/mruby-io/test/mruby_io_test.c +256 -0
- data/resources/mruby/mrbgems/mruby-kernel-ext/mrbgem.rake +5 -0
- data/resources/mruby/mrbgems/mruby-kernel-ext/mrblib/kernel.rb +13 -0
- data/resources/mruby/mrbgems/mruby-kernel-ext/src/kernel.c +264 -0
- data/resources/mruby/mrbgems/mruby-kernel-ext/test/kernel.rb +86 -0
- data/resources/mruby/mrbgems/mruby-math/mrbgem.rake +5 -0
- data/resources/mruby/mrbgems/mruby-math/src/math.c +783 -0
- data/resources/mruby/mrbgems/mruby-math/test/math.rb +152 -0
- data/resources/mruby/mrbgems/mruby-method/README.md +59 -0
- data/resources/mruby/mrbgems/mruby-method/mrbgem.rake +7 -0
- data/resources/mruby/mrbgems/mruby-method/mrblib/kernel.rb +9 -0
- data/resources/mruby/mrbgems/mruby-method/mrblib/method.rb +20 -0
- data/resources/mruby/mrbgems/mruby-method/mrblib/unbound_method.rb +9 -0
- data/resources/mruby/mrbgems/mruby-method/src/method.c +418 -0
- data/resources/mruby/mrbgems/mruby-method/test/method.rb +425 -0
- data/resources/mruby/mrbgems/mruby-numeric-ext/mrbgem.rake +5 -0
- data/resources/mruby/mrbgems/mruby-numeric-ext/mrblib/numeric_ext.rb +25 -0
- data/resources/mruby/mrbgems/mruby-numeric-ext/src/numeric_ext.c +102 -0
- data/resources/mruby/mrbgems/mruby-numeric-ext/test/numeric.rb +28 -0
- data/resources/mruby/mrbgems/mruby-object-ext/mrbgem.rake +5 -0
- data/resources/mruby/mrbgems/mruby-object-ext/mrblib/object.rb +19 -0
- data/resources/mruby/mrbgems/mruby-object-ext/src/object.c +112 -0
- data/resources/mruby/mrbgems/mruby-object-ext/test/nil.rb +11 -0
- data/resources/mruby/mrbgems/mruby-object-ext/test/object.rb +53 -0
- data/resources/mruby/mrbgems/mruby-objectspace/mrbgem.rake +5 -0
- data/resources/mruby/mrbgems/mruby-objectspace/src/mruby_objectspace.c +187 -0
- data/resources/mruby/mrbgems/mruby-objectspace/test/objectspace.rb +60 -0
- data/resources/mruby/mrbgems/mruby-pack/README.md +70 -0
- data/resources/mruby/mrbgems/mruby-pack/mrbgem.rake +7 -0
- data/resources/mruby/mrbgems/mruby-pack/packtest.rb +157 -0
- data/resources/mruby/mrbgems/mruby-pack/run_test.rb +26 -0
- data/resources/mruby/mrbgems/mruby-pack/src/pack.c +1281 -0
- data/resources/mruby/mrbgems/mruby-pack/test/pack.rb +165 -0
- data/resources/mruby/mrbgems/mruby-print/mrbgem.rake +5 -0
- data/resources/mruby/mrbgems/mruby-print/mrblib/print.rb +64 -0
- data/resources/mruby/mrbgems/mruby-print/src/print.c +64 -0
- data/resources/mruby/mrbgems/mruby-proc-ext/mrbgem.rake +5 -0
- data/resources/mruby/mrbgems/mruby-proc-ext/mrblib/proc.rb +42 -0
- data/resources/mruby/mrbgems/mruby-proc-ext/src/proc.c +173 -0
- data/resources/mruby/mrbgems/mruby-proc-ext/test/proc.c +62 -0
- data/resources/mruby/mrbgems/mruby-proc-ext/test/proc.rb +96 -0
- data/resources/mruby/mrbgems/mruby-random/mrbgem.rake +5 -0
- data/resources/mruby/mrbgems/mruby-random/src/mt19937ar.c +224 -0
- data/resources/mruby/mrbgems/mruby-random/src/mt19937ar.h +80 -0
- data/resources/mruby/mrbgems/mruby-random/src/random.c +349 -0
- data/resources/mruby/mrbgems/mruby-random/src/random.h +12 -0
- data/resources/mruby/mrbgems/mruby-random/test/random.rb +88 -0
- data/resources/mruby/mrbgems/mruby-range-ext/mrbgem.rake +5 -0
- data/resources/mruby/mrbgems/mruby-range-ext/mrblib/range.rb +31 -0
- data/resources/mruby/mrbgems/mruby-range-ext/src/range.c +176 -0
- data/resources/mruby/mrbgems/mruby-range-ext/test/range.rb +32 -0
- data/resources/mruby/mrbgems/mruby-socket/README.md +55 -0
- data/resources/mruby/mrbgems/mruby-socket/mrbgem.rake +17 -0
- data/resources/mruby/mrbgems/mruby-socket/mrblib/socket.rb +621 -0
- data/resources/mruby/mrbgems/mruby-socket/run_test.rb +28 -0
- data/resources/mruby/mrbgems/mruby-socket/src/const.cstub +453 -0
- data/resources/mruby/mrbgems/mruby-socket/src/const.def +163 -0
- data/resources/mruby/mrbgems/mruby-socket/src/gen.rb +17 -0
- data/resources/mruby/mrbgems/mruby-socket/src/socket.c +928 -0
- data/resources/mruby/mrbgems/mruby-socket/test/addrinfo.rb +91 -0
- data/resources/mruby/mrbgems/mruby-socket/test/basicsocket.rb +17 -0
- data/resources/mruby/mrbgems/mruby-socket/test/ipsocket.rb +44 -0
- data/resources/mruby/mrbgems/mruby-socket/test/socket.rb +38 -0
- data/resources/mruby/mrbgems/mruby-socket/test/sockettest.c +46 -0
- data/resources/mruby/mrbgems/mruby-socket/test/tcpsocket.rb +4 -0
- data/resources/mruby/mrbgems/mruby-socket/test/udpsocket.rb +16 -0
- data/resources/mruby/mrbgems/mruby-socket/test/unix.rb +130 -0
- data/resources/mruby/mrbgems/mruby-sprintf/mrbgem.rake +5 -0
- data/resources/mruby/mrbgems/mruby-sprintf/mrblib/string.rb +9 -0
- data/resources/mruby/mrbgems/mruby-sprintf/src/kernel.c +30 -0
- data/resources/mruby/mrbgems/mruby-sprintf/src/sprintf.c +1126 -0
- data/resources/mruby/mrbgems/mruby-sprintf/test/sprintf.rb +110 -0
- data/resources/mruby/mrbgems/mruby-string-ext/mrbgem.rake +6 -0
- data/resources/mruby/mrbgems/mruby-string-ext/mrblib/string.rb +368 -0
- data/resources/mruby/mrbgems/mruby-string-ext/src/string.c +804 -0
- data/resources/mruby/mrbgems/mruby-string-ext/test/string.rb +682 -0
- data/resources/mruby/mrbgems/mruby-struct/mrbgem.rake +5 -0
- data/resources/mruby/mrbgems/mruby-struct/mrblib/struct.rb +103 -0
- data/resources/mruby/mrbgems/mruby-struct/src/struct.c +726 -0
- data/resources/mruby/mrbgems/mruby-struct/test/struct.rb +205 -0
- data/resources/mruby/mrbgems/mruby-symbol-ext/mrbgem.rake +5 -0
- data/resources/mruby/mrbgems/mruby-symbol-ext/mrblib/symbol.rb +78 -0
- data/resources/mruby/mrbgems/mruby-symbol-ext/src/symbol.c +64 -0
- data/resources/mruby/mrbgems/mruby-symbol-ext/test/symbol.rb +48 -0
- data/resources/mruby/mrbgems/mruby-test/README.md +7 -0
- data/resources/mruby/mrbgems/mruby-test/driver.c +175 -0
- data/resources/mruby/mrbgems/mruby-test/init_mrbtest.c +38 -0
- data/resources/mruby/mrbgems/mruby-test/mrbgem.rake +191 -0
- data/resources/mruby/mrbgems/mruby-time/mrbgem.rake +5 -0
- data/resources/mruby/mrbgems/mruby-time/mrblib/time.rb +9 -0
- data/resources/mruby/mrbgems/mruby-time/src/time.c +869 -0
- data/resources/mruby/mrbgems/mruby-time/test/time.rb +228 -0
- data/resources/mruby/mrbgems/mruby-toplevel-ext/mrbgem.rake +5 -0
- data/resources/mruby/mrbgems/mruby-toplevel-ext/mrblib/toplevel.rb +11 -0
- data/resources/mruby/mrbgems/mruby-toplevel-ext/test/toplevel.rb +24 -0
- data/resources/mruby/mrblib/00class.rb +29 -0
- data/resources/mruby/mrblib/10error.rb +59 -0
- data/resources/mruby/mrblib/array.rb +243 -0
- data/resources/mruby/mrblib/compar.rb +84 -0
- data/resources/mruby/mrblib/enum.rb +348 -0
- data/resources/mruby/mrblib/float.rb +9 -0
- data/resources/mruby/mrblib/hash.rb +358 -0
- data/resources/mruby/mrblib/init_mrblib.c +11 -0
- data/resources/mruby/mrblib/kernel.rb +50 -0
- data/resources/mruby/mrblib/mrblib.rake +21 -0
- data/resources/mruby/mrblib/numeric.rb +163 -0
- data/resources/mruby/mrblib/range.rb +67 -0
- data/resources/mruby/mrblib/string.rb +275 -0
- data/resources/mruby/mruby-source.gemspec +18 -0
- data/resources/mruby/src/array.c +1251 -0
- data/resources/mruby/src/backtrace.c +285 -0
- data/resources/mruby/src/class.c +2546 -0
- data/resources/mruby/src/codedump.c +477 -0
- data/resources/mruby/src/compar.c +13 -0
- data/resources/mruby/src/crc.c +39 -0
- data/resources/mruby/src/debug.c +217 -0
- data/resources/mruby/src/dump.c +1106 -0
- data/resources/mruby/src/enum.c +14 -0
- data/resources/mruby/src/error.c +513 -0
- data/resources/mruby/src/error.h +3 -0
- data/resources/mruby/src/etc.c +246 -0
- data/resources/mruby/src/fmt_fp.c +374 -0
- data/resources/mruby/src/gc.c +1835 -0
- data/resources/mruby/src/hash.c +916 -0
- data/resources/mruby/src/init.c +51 -0
- data/resources/mruby/src/kernel.c +1264 -0
- data/resources/mruby/src/load.c +706 -0
- data/resources/mruby/src/mruby_core.rake +20 -0
- data/resources/mruby/src/numeric.c +1574 -0
- data/resources/mruby/src/object.c +618 -0
- data/resources/mruby/src/opcode.h +2 -0
- data/resources/mruby/src/pool.c +209 -0
- data/resources/mruby/src/print.c +47 -0
- data/resources/mruby/src/proc.c +313 -0
- data/resources/mruby/src/range.c +446 -0
- data/resources/mruby/src/state.c +307 -0
- data/resources/mruby/src/string.c +3025 -0
- data/resources/mruby/src/symbol.c +494 -0
- data/resources/mruby/src/value_array.h +27 -0
- data/resources/mruby/src/variable.c +982 -0
- data/resources/mruby/src/version.c +17 -0
- data/resources/mruby/src/vm.c +3020 -0
- data/resources/mruby/tasks/benchmark.rake +91 -0
- data/resources/mruby/tasks/gitlab.rake +118 -0
- data/resources/mruby/tasks/libmruby.rake +24 -0
- data/resources/mruby/tasks/mrbgems.rake +98 -0
- data/resources/mruby/tasks/toolchains/android.rake +321 -0
- data/resources/mruby/tasks/toolchains/clang.rake +9 -0
- data/resources/mruby/tasks/toolchains/gcc.rake +66 -0
- data/resources/mruby/tasks/toolchains/openwrt.rake +38 -0
- data/resources/mruby/tasks/toolchains/visualcpp.rake +68 -0
- data/resources/mruby/test/assert.rb +249 -0
- data/resources/mruby/test/bintest.rb +33 -0
- data/resources/mruby/test/report.rb +4 -0
- data/resources/mruby/test/t/argumenterror.rb +16 -0
- data/resources/mruby/test/t/array.rb +394 -0
- data/resources/mruby/test/t/basicobject.rb +11 -0
- data/resources/mruby/test/t/bs_block.rb +521 -0
- data/resources/mruby/test/t/bs_literal.rb +38 -0
- data/resources/mruby/test/t/class.rb +451 -0
- data/resources/mruby/test/t/codegen.rb +197 -0
- data/resources/mruby/test/t/comparable.rb +80 -0
- data/resources/mruby/test/t/ensure.rb +54 -0
- data/resources/mruby/test/t/enumerable.rb +134 -0
- data/resources/mruby/test/t/exception.rb +422 -0
- data/resources/mruby/test/t/false.rb +31 -0
- data/resources/mruby/test/t/float.rb +209 -0
- data/resources/mruby/test/t/gc.rb +45 -0
- data/resources/mruby/test/t/hash.rb +375 -0
- data/resources/mruby/test/t/indexerror.rb +6 -0
- data/resources/mruby/test/t/integer.rb +277 -0
- data/resources/mruby/test/t/iterations.rb +61 -0
- data/resources/mruby/test/t/kernel.rb +600 -0
- data/resources/mruby/test/t/lang.rb +74 -0
- data/resources/mruby/test/t/literals.rb +337 -0
- data/resources/mruby/test/t/localjumperror.rb +13 -0
- data/resources/mruby/test/t/methods.rb +109 -0
- data/resources/mruby/test/t/module.rb +914 -0
- data/resources/mruby/test/t/nameerror.rb +28 -0
- data/resources/mruby/test/t/nil.rb +39 -0
- data/resources/mruby/test/t/nomethoderror.rb +22 -0
- data/resources/mruby/test/t/numeric.rb +43 -0
- data/resources/mruby/test/t/object.rb +11 -0
- data/resources/mruby/test/t/proc.rb +180 -0
- data/resources/mruby/test/t/range.rb +95 -0
- data/resources/mruby/test/t/rangeerror.rb +6 -0
- data/resources/mruby/test/t/regexperror.rb +4 -0
- data/resources/mruby/test/t/runtimeerror.rb +6 -0
- data/resources/mruby/test/t/standarderror.rb +6 -0
- data/resources/mruby/test/t/string.rb +728 -0
- data/resources/mruby/test/t/superclass.rb +47 -0
- data/resources/mruby/test/t/symbol.rb +30 -0
- data/resources/mruby/test/t/syntax.rb +468 -0
- data/resources/mruby/test/t/true.rb +31 -0
- data/resources/mruby/test/t/typeerror.rb +6 -0
- data/resources/mruby/test/t/unicode.rb +39 -0
- data/resources/mruby/travis_config.rb +53 -0
- 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", ×);
|
|
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
|