script_core 0.1.1 → 0.2.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 +4 -4
- data/.gitignore +2 -0
- data/.rubocop.yml +8 -6
- data/.ruby-version +1 -1
- data/Gemfile +2 -1
- data/bin/sandbox +1 -1
- data/ext/enterprise_script_service/Rakefile +1 -1
- data/ext/enterprise_script_service/flags.rb +5 -0
- data/ext/enterprise_script_service/libseccomp/CHANGELOG +15 -0
- data/ext/enterprise_script_service/libseccomp/CREDITS +3 -0
- data/ext/enterprise_script_service/libseccomp/Makefile.am +1 -1
- data/ext/enterprise_script_service/libseccomp/README.md +1 -1
- data/ext/enterprise_script_service/libseccomp/SECURITY.md +45 -0
- data/ext/enterprise_script_service/libseccomp/configure.ac +3 -3
- data/ext/enterprise_script_service/libseccomp/doc/admin/MAINTAINER_PROCESS.md +95 -0
- data/ext/enterprise_script_service/libseccomp/{RELEASE_PROCESS.md → doc/admin/RELEASE_PROCESS.md} +9 -1
- data/ext/enterprise_script_service/libseccomp/include/Makefile.am +1 -1
- data/ext/enterprise_script_service/libseccomp/include/seccomp-syscalls.h +2292 -0
- data/ext/enterprise_script_service/libseccomp/include/seccomp.h.in +3 -1065
- data/ext/enterprise_script_service/libseccomp/src/arch-aarch64-syscalls.c +35 -3
- data/ext/enterprise_script_service/libseccomp/src/arch-arm-syscalls.c +35 -3
- data/ext/enterprise_script_service/libseccomp/src/arch-mips-syscalls.c +43 -11
- data/ext/enterprise_script_service/libseccomp/src/arch-mips64-syscalls.c +33 -1
- data/ext/enterprise_script_service/libseccomp/src/arch-mips64n32-syscalls.c +33 -1
- data/ext/enterprise_script_service/libseccomp/src/arch-parisc-syscalls.c +34 -2
- data/ext/enterprise_script_service/libseccomp/src/arch-ppc-syscalls.c +43 -11
- data/ext/enterprise_script_service/libseccomp/src/arch-ppc64-syscalls.c +44 -12
- data/ext/enterprise_script_service/libseccomp/src/arch-s390-syscalls.c +46 -14
- data/ext/enterprise_script_service/libseccomp/src/arch-s390.c +142 -18
- data/ext/enterprise_script_service/libseccomp/src/arch-s390x-syscalls.c +47 -15
- data/ext/enterprise_script_service/libseccomp/src/arch-s390x.c +143 -17
- data/ext/enterprise_script_service/libseccomp/src/arch-x32-syscalls.c +33 -1
- data/ext/enterprise_script_service/libseccomp/src/arch-x86-syscalls.c +94 -12
- data/ext/enterprise_script_service/libseccomp/src/arch-x86.c +142 -19
- data/ext/enterprise_script_service/libseccomp/src/arch-x86_64-syscalls.c +33 -1
- data/ext/enterprise_script_service/libseccomp/src/db.c +1 -0
- data/ext/enterprise_script_service/libseccomp/src/gen_bpf.c +10 -3
- data/ext/enterprise_script_service/libseccomp/src/python/Makefile.am +4 -4
- data/ext/enterprise_script_service/libseccomp/src/python/seccomp.pyx +2 -0
- data/ext/enterprise_script_service/libseccomp/tests/.gitignore +1 -0
- data/ext/enterprise_script_service/libseccomp/tests/50-sim-hash_collision.c +98 -0
- data/ext/enterprise_script_service/libseccomp/tests/50-sim-hash_collision.py +61 -0
- data/ext/enterprise_script_service/libseccomp/tests/50-sim-hash_collision.tests +18 -0
- data/ext/enterprise_script_service/libseccomp/tests/Makefile.am +6 -3
- data/ext/enterprise_script_service/libseccomp/tools/Makefile.am +0 -2
- data/ext/enterprise_script_service/libseccomp/tools/check-syntax +1 -0
- data/ext/enterprise_script_service/libseccomp/tools/scmp_bpf_sim.c +2 -0
- data/ext/enterprise_script_service/mruby-mpdecimal/src/ext.c +1 -1
- data/ext/enterprise_script_service/mruby/.gitignore +2 -2
- data/ext/enterprise_script_service/mruby/CONTRIBUTING.md +10 -3
- data/ext/enterprise_script_service/mruby/Doxyfile +2408 -0
- data/ext/enterprise_script_service/mruby/README.md +21 -8
- data/ext/enterprise_script_service/mruby/Rakefile +4 -13
- data/ext/enterprise_script_service/mruby/appveyor_config.rb +1 -1
- data/ext/enterprise_script_service/mruby/build_config.rb +3 -3
- data/ext/enterprise_script_service/mruby/doc/guides/compile.md +42 -42
- data/ext/enterprise_script_service/mruby/doc/guides/debugger.md +1 -1
- data/ext/enterprise_script_service/mruby/doc/guides/mrbconf.md +45 -6
- data/ext/enterprise_script_service/mruby/doc/guides/mrbgems.md +5 -0
- data/ext/enterprise_script_service/mruby/doc/limitations.md +88 -38
- data/ext/enterprise_script_service/mruby/doc/mruby_logo_red_icon.png +0 -0
- data/ext/enterprise_script_service/mruby/doc/opcode.md +94 -94
- data/ext/enterprise_script_service/mruby/include/mrbconf.h +74 -11
- data/ext/enterprise_script_service/mruby/include/mruby.h +242 -146
- data/ext/enterprise_script_service/mruby/include/mruby/array.h +7 -7
- data/ext/enterprise_script_service/mruby/include/mruby/boxing_nan.h +2 -9
- data/ext/enterprise_script_service/mruby/include/mruby/boxing_no.h +11 -10
- data/ext/enterprise_script_service/mruby/include/mruby/boxing_word.h +104 -69
- data/ext/enterprise_script_service/mruby/include/mruby/class.h +7 -5
- data/ext/enterprise_script_service/mruby/include/mruby/common.h +9 -7
- data/ext/enterprise_script_service/mruby/include/mruby/compile.h +6 -6
- data/ext/enterprise_script_service/mruby/include/mruby/data.h +5 -5
- data/ext/enterprise_script_service/mruby/include/mruby/debug.h +2 -2
- data/ext/enterprise_script_service/mruby/include/mruby/dump.h +3 -7
- data/ext/enterprise_script_service/mruby/include/mruby/error.h +34 -6
- data/ext/enterprise_script_service/mruby/include/mruby/gc.h +2 -2
- data/ext/enterprise_script_service/mruby/include/mruby/hash.h +4 -11
- data/ext/enterprise_script_service/mruby/include/mruby/irep.h +16 -4
- data/ext/enterprise_script_service/mruby/include/mruby/istruct.h +4 -4
- data/ext/enterprise_script_service/mruby/include/mruby/khash.h +2 -2
- data/ext/enterprise_script_service/mruby/include/mruby/numeric.h +41 -7
- data/ext/enterprise_script_service/mruby/include/mruby/object.h +8 -9
- data/ext/enterprise_script_service/mruby/include/mruby/opcode.h +2 -2
- data/ext/enterprise_script_service/mruby/include/mruby/ops.h +6 -6
- data/ext/enterprise_script_service/mruby/include/mruby/proc.h +19 -13
- data/ext/enterprise_script_service/mruby/include/mruby/range.h +10 -4
- data/ext/enterprise_script_service/mruby/include/mruby/re.h +2 -2
- data/ext/enterprise_script_service/mruby/include/mruby/string.h +130 -107
- data/ext/enterprise_script_service/mruby/include/mruby/throw.h +2 -2
- data/ext/enterprise_script_service/mruby/include/mruby/value.h +137 -49
- data/ext/enterprise_script_service/mruby/include/mruby/variable.h +3 -5
- data/ext/enterprise_script_service/mruby/include/mruby/version.h +24 -10
- data/ext/enterprise_script_service/mruby/lib/mruby-core-ext.rb +2 -39
- data/ext/enterprise_script_service/mruby/lib/mruby/build.rb +32 -15
- data/ext/enterprise_script_service/mruby/lib/mruby/build/command.rb +63 -17
- data/ext/enterprise_script_service/mruby/lib/mruby/build/load_gems.rb +24 -10
- data/ext/enterprise_script_service/mruby/lib/mruby/gem.rb +11 -7
- data/ext/enterprise_script_service/mruby/lib/mruby/lockfile.rb +81 -0
- data/ext/enterprise_script_service/mruby/minirake +27 -11
- data/ext/enterprise_script_service/mruby/mrbgems/default.gembox +3 -0
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-array-ext/mrbgem.rake +0 -1
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-array-ext/mrblib/array.rb +47 -9
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-array-ext/src/array.c +3 -3
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-array-ext/test/array.rb +50 -29
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/apibreak.c +3 -3
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/apiprint.c +2 -2
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/cmdprint.c +3 -3
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/mrdb.c +2 -2
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/mrdb.h +1 -1
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/mrdbconf.h +4 -0
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-bin-mirb/tools/mirb/mirb.c +28 -1
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-bin-mrbc/tools/mrbc/mrbc.c +1 -2
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-bin-mruby/bintest/mruby.rb +75 -8
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-bin-mruby/tools/mruby/mruby.c +134 -90
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-class-ext/src/class.c +7 -8
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-compiler/core/codegen.c +69 -46
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-compiler/core/keywords +0 -3
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-compiler/core/lex.def +51 -59
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-compiler/core/parse.y +430 -241
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-complex/mrbgem.rake +10 -0
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-complex/mrblib/complex.rb +122 -0
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-complex/src/complex.c +249 -0
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-complex/test/complex.rb +153 -0
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-enum-chain/mrblib/chain.rb +19 -17
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-enum-chain/test/enum_chain.rb +41 -9
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-enum-ext/mrblib/enum.rb +30 -4
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-enum-ext/test/enum.rb +8 -3
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-enumerator/mrbgem.rake +0 -1
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-enumerator/mrblib/enumerator.rb +46 -14
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-enumerator/test/enumerator.rb +51 -2
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-error/src/exception.c +10 -0
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-eval/src/eval.c +47 -44
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-eval/test/eval.rb +2 -2
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-exit/src/mruby-exit.c +9 -4
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-fiber/src/fiber.c +16 -12
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-fiber/test/fiber.rb +1 -1
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-hash-ext/mrbgem.rake +0 -2
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-hash-ext/mrblib/hash.rb +3 -0
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-hash-ext/test/hash.rb +3 -7
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-io/README.md +1 -3
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-io/mrbgem.rake +1 -1
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-io/mrblib/file.rb +0 -5
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-io/mrblib/io.rb +24 -38
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-io/mrblib/kernel.rb +16 -0
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-io/src/file.c +19 -18
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-io/src/file_test.c +5 -16
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-io/src/io.c +54 -42
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-io/test/file.rb +24 -20
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-io/test/file_test.rb +4 -9
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-io/test/io.rb +41 -35
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-io/test/mruby_io_test.c +9 -36
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-kernel-ext/mrbgem.rake +1 -1
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-kernel-ext/src/kernel.c +9 -27
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-kernel-ext/test/kernel.rb +2 -0
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-math/src/math.c +5 -2
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-metaprog/src/metaprog.c +39 -24
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-metaprog/test/metaprog.rb +48 -17
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-method/mrblib/method.rb +0 -12
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-method/src/method.c +134 -101
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-method/test/method.rb +9 -1
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-numeric-ext/mrblib/numeric_ext.rb +1 -5
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-numeric-ext/src/numeric_ext.c +17 -37
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-numeric-ext/test/numeric.rb +0 -8
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-object-ext/mrbgem.rake +1 -1
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-object-ext/mrblib/object.rb +15 -1
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-object-ext/src/object.c +35 -6
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-object-ext/test/nil.rb +4 -0
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-objectspace/src/mruby_objectspace.c +1 -5
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-objectspace/test/objectspace.rb +1 -1
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-pack/src/pack.c +28 -23
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-pack/test/pack.rb +43 -49
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-print/mrblib/print.rb +3 -9
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-proc-ext/src/proc.c +6 -9
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-proc-ext/test/proc.rb +21 -5
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-random/src/random.c +157 -124
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-random/test/random.rb +72 -26
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-range-ext/mrblib/range.rb +38 -0
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-range-ext/src/range.c +26 -11
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-range-ext/test/range.rb +111 -1
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-rational/mrbgem.rake +5 -0
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-rational/mrblib/rational.rb +117 -0
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-rational/src/rational.c +209 -0
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-rational/test/rational.rb +308 -0
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-socket/README.md +1 -1
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-socket/src/socket.c +10 -9
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-sprintf/src/kernel.c +2 -2
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-sprintf/src/sprintf.c +22 -24
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-string-ext/mrbgem.rake +0 -1
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-string-ext/mrblib/string.rb +8 -4
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-string-ext/src/string.c +116 -117
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-string-ext/test/numeric.rb +29 -0
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-string-ext/test/range.rb +26 -0
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-string-ext/test/string.rb +32 -50
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-struct/mrblib/struct.rb +5 -7
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-struct/src/struct.c +43 -57
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-struct/test/struct.rb +16 -11
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-symbol-ext/src/symbol.c +2 -2
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-symbol-ext/test/symbol.rb +1 -1
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-test/driver.c +152 -1
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-test/mrbgem.rake +4 -3
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-test/vformat.c +200 -0
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-time/include/mruby/time.h +2 -1
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-time/src/time.c +199 -68
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-time/test/time.rb +81 -46
- data/ext/enterprise_script_service/mruby/mrblib/array.rb +14 -16
- data/ext/enterprise_script_service/mruby/mrblib/enum.rb +13 -9
- data/ext/enterprise_script_service/mruby/mrblib/hash.rb +5 -7
- data/ext/enterprise_script_service/mruby/mrblib/kernel.rb +1 -1
- data/ext/enterprise_script_service/mruby/mrblib/numeric.rb +4 -4
- data/ext/enterprise_script_service/mruby/mrblib/range.rb +1 -1
- data/ext/enterprise_script_service/mruby/mrblib/string.rb +55 -112
- data/ext/enterprise_script_service/mruby/mruby-source.gemspec +1 -1
- data/ext/enterprise_script_service/mruby/oss-fuzz/config/mruby.dict +105 -0
- data/ext/enterprise_script_service/mruby/oss-fuzz/config/mruby_fuzzer.options +5 -0
- data/ext/enterprise_script_service/mruby/oss-fuzz/config/mruby_proto_fuzzer.options +4 -0
- data/ext/enterprise_script_service/mruby/oss-fuzz/mruby_fuzzer.c +18 -0
- data/ext/enterprise_script_service/mruby/oss-fuzz/mruby_proto_fuzzer.cpp +44 -0
- data/ext/enterprise_script_service/mruby/oss-fuzz/proto_to_ruby.cpp +455 -0
- data/ext/enterprise_script_service/mruby/oss-fuzz/proto_to_ruby.h +55 -0
- data/ext/enterprise_script_service/mruby/oss-fuzz/ruby.proto +201 -0
- data/ext/enterprise_script_service/mruby/src/array.c +95 -46
- data/ext/enterprise_script_service/mruby/src/backtrace.c +6 -8
- data/ext/enterprise_script_service/mruby/src/class.c +370 -278
- data/ext/enterprise_script_service/mruby/src/codedump.c +34 -34
- data/ext/enterprise_script_service/mruby/src/debug.c +2 -2
- data/ext/enterprise_script_service/mruby/src/dump.c +8 -6
- data/ext/enterprise_script_service/mruby/src/enum.c +1 -1
- data/ext/enterprise_script_service/mruby/src/error.c +157 -55
- data/ext/enterprise_script_service/mruby/src/etc.c +13 -46
- data/ext/enterprise_script_service/mruby/src/fmt_fp.c +2 -2
- data/ext/enterprise_script_service/mruby/src/gc.c +30 -11
- data/ext/enterprise_script_service/mruby/src/hash.c +23 -14
- data/ext/enterprise_script_service/mruby/src/kernel.c +16 -54
- data/ext/enterprise_script_service/mruby/src/load.c +40 -76
- data/ext/enterprise_script_service/mruby/src/numeric.c +164 -94
- data/ext/enterprise_script_service/mruby/src/object.c +16 -39
- data/ext/enterprise_script_service/mruby/src/pool.c +0 -2
- data/ext/enterprise_script_service/mruby/src/proc.c +47 -48
- data/ext/enterprise_script_service/mruby/src/range.c +22 -35
- data/ext/enterprise_script_service/mruby/src/state.c +5 -94
- data/ext/enterprise_script_service/mruby/src/string.c +874 -710
- data/ext/enterprise_script_service/mruby/src/symbol.c +73 -48
- data/ext/enterprise_script_service/mruby/src/variable.c +58 -38
- data/ext/enterprise_script_service/mruby/src/vm.c +133 -304
- data/ext/enterprise_script_service/mruby/tasks/doc.rake +48 -0
- data/ext/enterprise_script_service/mruby/tasks/toolchains/clang.rake +3 -4
- data/ext/enterprise_script_service/mruby/tasks/toolchains/gcc.rake +20 -19
- data/ext/enterprise_script_service/mruby/tasks/toolchains/visualcpp.rake +0 -12
- data/ext/enterprise_script_service/mruby/test/assert.rb +186 -25
- data/ext/enterprise_script_service/mruby/test/t/array.rb +34 -6
- data/ext/enterprise_script_service/mruby/test/t/class.rb +26 -0
- data/ext/enterprise_script_service/mruby/test/t/enumerable.rb +2 -2
- data/ext/enterprise_script_service/mruby/test/t/float.rb +17 -17
- data/ext/enterprise_script_service/mruby/test/t/hash.rb +2 -0
- data/ext/enterprise_script_service/mruby/test/t/integer.rb +14 -6
- data/ext/enterprise_script_service/mruby/test/t/kernel.rb +38 -19
- data/ext/enterprise_script_service/mruby/test/t/module.rb +87 -14
- data/ext/enterprise_script_service/mruby/test/t/numeric.rb +65 -23
- data/ext/enterprise_script_service/mruby/test/t/range.rb +4 -4
- data/ext/enterprise_script_service/mruby/test/t/string.rb +211 -49
- data/ext/enterprise_script_service/mruby/test/t/syntax.rb +19 -2
- data/ext/enterprise_script_service/mruby/test/t/vformat.rb +92 -0
- data/ext/enterprise_script_service/mruby/travis_config.rb +2 -2
- data/ext/enterprise_script_service/mruby_config.rb +10 -0
- data/ext/enterprise_script_service/mruby_engine.cpp +2 -2
- data/ext/enterprise_script_service/mruby_engine.gembox +1 -0
- data/ext/enterprise_script_service/msgpack/CHANGELOG.md +14 -0
- data/ext/enterprise_script_service/msgpack/Files.cmake +4 -0
- data/ext/enterprise_script_service/msgpack/README.md +1 -1
- data/ext/enterprise_script_service/msgpack/appveyor.yml +1 -1
- data/ext/enterprise_script_service/msgpack/erb/v1/cpp03_msgpack_tuple.hpp.erb +1 -1
- data/ext/enterprise_script_service/msgpack/erb/v1/cpp03_msgpack_tuple_decl.hpp.erb +1 -1
- data/ext/enterprise_script_service/msgpack/erb/v1/cpp03_zone.hpp.erb +3 -3
- data/ext/enterprise_script_service/msgpack/example/boost/asio_send_recv.cpp +1 -1
- data/ext/enterprise_script_service/msgpack/include/msgpack/adaptor/cpp11/timespec.hpp +16 -0
- data/ext/enterprise_script_service/msgpack/include/msgpack/adaptor/wstring.hpp +15 -0
- data/ext/enterprise_script_service/msgpack/include/msgpack/object.h +2 -0
- data/ext/enterprise_script_service/msgpack/include/msgpack/pack_template.h +17 -9
- data/ext/enterprise_script_service/msgpack/include/msgpack/sysdep.h +27 -16
- data/ext/enterprise_script_service/msgpack/include/msgpack/type.hpp +2 -0
- data/ext/enterprise_script_service/msgpack/include/msgpack/unpack_template.h +5 -0
- data/ext/enterprise_script_service/msgpack/include/msgpack/v1/adaptor/array_ref.hpp +0 -1
- data/ext/enterprise_script_service/msgpack/include/msgpack/v1/adaptor/check_container_size.hpp +1 -1
- data/ext/enterprise_script_service/msgpack/include/msgpack/v1/adaptor/cpp11/chrono.hpp +5 -5
- data/ext/enterprise_script_service/msgpack/include/msgpack/v1/adaptor/cpp11/timespec.hpp +140 -0
- data/ext/enterprise_script_service/msgpack/include/msgpack/v1/adaptor/detail/cpp03_msgpack_tuple.hpp +32 -32
- data/ext/enterprise_script_service/msgpack/include/msgpack/v1/adaptor/detail/cpp03_msgpack_tuple_decl.hpp +32 -32
- data/ext/enterprise_script_service/msgpack/include/msgpack/v1/adaptor/detail/cpp11_msgpack_tuple.hpp +6 -6
- data/ext/enterprise_script_service/msgpack/include/msgpack/v1/adaptor/detail/cpp11_msgpack_tuple_decl.hpp +10 -10
- data/ext/enterprise_script_service/msgpack/include/msgpack/v1/adaptor/ext.hpp +1 -1
- data/ext/enterprise_script_service/msgpack/include/msgpack/v1/adaptor/fixint.hpp +5 -4
- data/ext/enterprise_script_service/msgpack/include/msgpack/v1/adaptor/int.hpp +40 -13
- data/ext/enterprise_script_service/msgpack/include/msgpack/v1/adaptor/int_decl.hpp +3 -2
- data/ext/enterprise_script_service/msgpack/include/msgpack/v1/adaptor/wstring.hpp +121 -0
- data/ext/enterprise_script_service/msgpack/include/msgpack/v1/detail/cpp03_zone.hpp +3 -3
- data/ext/enterprise_script_service/msgpack/include/msgpack/v1/detail/cpp11_zone.hpp +3 -3
- data/ext/enterprise_script_service/msgpack/include/msgpack/v1/object.hpp +6 -6
- data/ext/enterprise_script_service/msgpack/include/msgpack/v1/object_fwd.hpp +1 -1
- data/ext/enterprise_script_service/msgpack/include/msgpack/v1/pack.hpp +40 -5
- data/ext/enterprise_script_service/msgpack/include/msgpack/v1/unpack.hpp +11 -11
- data/ext/enterprise_script_service/msgpack/include/msgpack/v1/vrefbuffer.hpp +7 -7
- data/ext/enterprise_script_service/msgpack/include/msgpack/v1/zbuffer.hpp +5 -5
- data/ext/enterprise_script_service/msgpack/include/msgpack/v2/adaptor/int_decl.hpp +1 -1
- data/ext/enterprise_script_service/msgpack/include/msgpack/v2/create_object_visitor.hpp +1 -1
- data/ext/enterprise_script_service/msgpack/include/msgpack/v2/parse.hpp +13 -13
- data/ext/enterprise_script_service/msgpack/include/msgpack/v2/x3_parse.hpp +28 -26
- data/ext/enterprise_script_service/msgpack/include/msgpack/v3/adaptor/int_decl.hpp +1 -1
- data/ext/enterprise_script_service/msgpack/include/msgpack/v3/parse.hpp +13 -13
- data/ext/enterprise_script_service/msgpack/include/msgpack/version_master.h +2 -2
- data/ext/enterprise_script_service/msgpack/include/msgpack/zbuffer.h +6 -6
- data/ext/enterprise_script_service/msgpack/include/msgpack/zone.h +1 -1
- data/ext/enterprise_script_service/msgpack/src/objectc.c +83 -148
- data/ext/enterprise_script_service/msgpack/src/unpack.c +73 -47
- data/ext/enterprise_script_service/msgpack/test/CMakeLists.txt +1 -1
- data/ext/enterprise_script_service/msgpack/test/array_ref.cpp +5 -0
- data/ext/enterprise_script_service/msgpack/test/boost_fusion.cpp +5 -0
- data/ext/enterprise_script_service/msgpack/test/boost_optional.cpp +7 -0
- data/ext/enterprise_script_service/msgpack/test/boost_string_ref.cpp +7 -0
- data/ext/enterprise_script_service/msgpack/test/boost_string_view.cpp +6 -0
- data/ext/enterprise_script_service/msgpack/test/boost_variant.cpp +15 -9
- data/ext/enterprise_script_service/msgpack/test/buffer.cpp +7 -0
- data/ext/enterprise_script_service/msgpack/test/carray.cpp +7 -0
- data/ext/enterprise_script_service/msgpack/test/cases.cpp +7 -1
- data/ext/enterprise_script_service/msgpack/test/convert.cpp +6 -0
- data/ext/enterprise_script_service/msgpack/test/fixint.cpp +7 -1
- data/ext/enterprise_script_service/msgpack/test/fixint_c.cpp +6 -1
- data/ext/enterprise_script_service/msgpack/test/fuzz_unpack_pack_fuzzer_cpp11.cpp +5 -0
- data/ext/enterprise_script_service/msgpack/test/iterator_cpp11.cpp +8 -2
- data/ext/enterprise_script_service/msgpack/test/json.cpp +6 -0
- data/ext/enterprise_script_service/msgpack/test/limit.cpp +7 -0
- data/ext/enterprise_script_service/msgpack/test/msgpack_basic.cpp +128 -6
- data/ext/enterprise_script_service/msgpack/test/msgpack_c.cpp +7 -2
- data/ext/enterprise_script_service/msgpack/test/msgpack_container.cpp +20 -3
- data/ext/enterprise_script_service/msgpack/test/msgpack_cpp11.cpp +159 -0
- data/ext/enterprise_script_service/msgpack/test/msgpack_cpp17.cpp +5 -0
- data/ext/enterprise_script_service/msgpack/test/msgpack_stream.cpp +8 -3
- data/ext/enterprise_script_service/msgpack/test/msgpack_tuple.cpp +6 -0
- data/ext/enterprise_script_service/msgpack/test/msgpack_vref.cpp +5 -0
- data/ext/enterprise_script_service/msgpack/test/msgpack_x3_parse.cpp +23 -18
- data/ext/enterprise_script_service/msgpack/test/object.cpp +77 -45
- data/ext/enterprise_script_service/msgpack/test/object_with_zone.cpp +28 -10
- data/ext/enterprise_script_service/msgpack/test/pack_unpack.cpp +25 -18
- data/ext/enterprise_script_service/msgpack/test/pack_unpack_c.cpp +7 -0
- data/ext/enterprise_script_service/msgpack/test/raw.cpp +17 -12
- data/ext/enterprise_script_service/msgpack/test/reference.cpp +6 -0
- data/ext/enterprise_script_service/msgpack/test/reference_cpp11.cpp +6 -0
- data/ext/enterprise_script_service/msgpack/test/reference_wrapper_cpp11.cpp +6 -0
- data/ext/enterprise_script_service/msgpack/test/shared_ptr_cpp11.cpp +6 -0
- data/ext/enterprise_script_service/msgpack/test/size_equal_only.cpp +6 -2
- data/ext/enterprise_script_service/msgpack/test/streaming.cpp +10 -3
- data/ext/enterprise_script_service/msgpack/test/streaming_c.cpp +7 -0
- data/ext/enterprise_script_service/msgpack/test/unique_ptr_cpp11.cpp +6 -0
- data/ext/enterprise_script_service/msgpack/test/user_class.cpp +5 -0
- data/ext/enterprise_script_service/msgpack/test/version.cpp +6 -0
- data/ext/enterprise_script_service/msgpack/test/visitor.cpp +7 -0
- data/ext/enterprise_script_service/msgpack/test/zone.cpp +6 -0
- data/lib/script_core/version.rb +1 -1
- data/lib/tasks/mruby/engine.gembox.example +1 -0
- data/lib/tasks/script_core.rake +21 -3
- data/spec/dummy/app/helpers/fields_helper.rb +2 -2
- data/spec/dummy/mruby/engine.gembox +1 -0
- data/spec/script_core_spec.rb +1 -1
- metadata +38 -22
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-io/.gitignore +0 -1
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-io/.travis.yml +0 -2
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-io/run_test.rb +0 -26
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-kernel-ext/mrblib/kernel.rb +0 -15
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-method/mrblib/unbound_method.rb +0 -9
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-pack/.gitignore +0 -5
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-pack/.travis.yml +0 -2
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-pack/packtest.rb +0 -157
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-pack/run_test.rb +0 -26
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-random/src/mt19937ar.c +0 -224
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-random/src/mt19937ar.h +0 -80
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-random/src/random.h +0 -12
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-sleep/.gitignore +0 -4
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-sleep/.travis.yml +0 -29
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-sleep/.travis_build_config.rb +0 -6
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-sleep/Rakefile +0 -29
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-socket/.travis.yml +0 -4
- data/ext/enterprise_script_service/mruby/mrbgems/mruby-socket/run_test.rb +0 -28
|
@@ -42,10 +42,6 @@ mrb_open_core(mrb_allocf f, void *ud)
|
|
|
42
42
|
|
|
43
43
|
mrb_init_core(mrb);
|
|
44
44
|
|
|
45
|
-
#if !defined(MRB_DISABLE_STDIO) && defined(_MSC_VER) && _MSC_VER < 1900
|
|
46
|
-
_set_output_format(_TWO_DIGIT_EXPONENT);
|
|
47
|
-
#endif
|
|
48
|
-
|
|
49
45
|
return mrb;
|
|
50
46
|
}
|
|
51
47
|
|
|
@@ -61,38 +57,6 @@ mrb_default_allocf(mrb_state *mrb, void *p, size_t size, void *ud)
|
|
|
61
57
|
}
|
|
62
58
|
}
|
|
63
59
|
|
|
64
|
-
struct alloca_header {
|
|
65
|
-
struct alloca_header *next;
|
|
66
|
-
char buf[1];
|
|
67
|
-
};
|
|
68
|
-
|
|
69
|
-
MRB_API void*
|
|
70
|
-
mrb_alloca(mrb_state *mrb, size_t size)
|
|
71
|
-
{
|
|
72
|
-
struct alloca_header *p;
|
|
73
|
-
|
|
74
|
-
p = (struct alloca_header*) mrb_malloc(mrb, sizeof(struct alloca_header)+size);
|
|
75
|
-
p->next = mrb->mems;
|
|
76
|
-
mrb->mems = p;
|
|
77
|
-
return (void*)p->buf;
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
static void
|
|
81
|
-
mrb_alloca_free(mrb_state *mrb)
|
|
82
|
-
{
|
|
83
|
-
struct alloca_header *p;
|
|
84
|
-
struct alloca_header *tmp;
|
|
85
|
-
|
|
86
|
-
if (mrb == NULL) return;
|
|
87
|
-
p = mrb->mems;
|
|
88
|
-
|
|
89
|
-
while (p) {
|
|
90
|
-
tmp = p;
|
|
91
|
-
p = p->next;
|
|
92
|
-
mrb_free(mrb, tmp);
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
|
|
96
60
|
MRB_API mrb_state*
|
|
97
61
|
mrb_open(void)
|
|
98
62
|
{
|
|
@@ -153,14 +117,14 @@ mrb_irep_free(mrb_state *mrb, mrb_irep *irep)
|
|
|
153
117
|
int i;
|
|
154
118
|
|
|
155
119
|
if (!(irep->flags & MRB_ISEQ_NO_FREE))
|
|
156
|
-
mrb_free(mrb, irep->iseq);
|
|
120
|
+
mrb_free(mrb, (void*)irep->iseq);
|
|
157
121
|
if (irep->pool) for (i=0; i<irep->plen; i++) {
|
|
158
|
-
if (
|
|
122
|
+
if (mrb_string_p(irep->pool[i])) {
|
|
159
123
|
mrb_gc_free_str(mrb, RSTRING(irep->pool[i]));
|
|
160
124
|
mrb_free(mrb, mrb_obj_ptr(irep->pool[i]));
|
|
161
125
|
}
|
|
162
126
|
#if defined(MRB_WORD_BOXING) && !defined(MRB_WITHOUT_FLOAT)
|
|
163
|
-
else if (
|
|
127
|
+
else if (mrb_float_p(irep->pool[i])) {
|
|
164
128
|
mrb_free(mrb, mrb_obj_ptr(irep->pool[i]));
|
|
165
129
|
}
|
|
166
130
|
#endif
|
|
@@ -177,58 +141,6 @@ mrb_irep_free(mrb_state *mrb, mrb_irep *irep)
|
|
|
177
141
|
mrb_free(mrb, irep);
|
|
178
142
|
}
|
|
179
143
|
|
|
180
|
-
mrb_value
|
|
181
|
-
mrb_str_pool(mrb_state *mrb, mrb_value str)
|
|
182
|
-
{
|
|
183
|
-
struct RString *s = mrb_str_ptr(str);
|
|
184
|
-
struct RString *ns;
|
|
185
|
-
char *ptr;
|
|
186
|
-
mrb_int len;
|
|
187
|
-
|
|
188
|
-
ns = (struct RString *)mrb_malloc(mrb, sizeof(struct RString));
|
|
189
|
-
ns->tt = MRB_TT_STRING;
|
|
190
|
-
ns->c = mrb->string_class;
|
|
191
|
-
|
|
192
|
-
if (RSTR_NOFREE_P(s)) {
|
|
193
|
-
ns->flags = MRB_STR_NOFREE;
|
|
194
|
-
ns->as.heap.ptr = s->as.heap.ptr;
|
|
195
|
-
ns->as.heap.len = s->as.heap.len;
|
|
196
|
-
ns->as.heap.aux.capa = 0;
|
|
197
|
-
}
|
|
198
|
-
else {
|
|
199
|
-
ns->flags = 0;
|
|
200
|
-
if (RSTR_EMBED_P(s)) {
|
|
201
|
-
ptr = s->as.ary;
|
|
202
|
-
len = RSTR_EMBED_LEN(s);
|
|
203
|
-
}
|
|
204
|
-
else {
|
|
205
|
-
ptr = s->as.heap.ptr;
|
|
206
|
-
len = s->as.heap.len;
|
|
207
|
-
}
|
|
208
|
-
|
|
209
|
-
if (len < RSTRING_EMBED_LEN_MAX) {
|
|
210
|
-
RSTR_SET_EMBED_FLAG(ns);
|
|
211
|
-
RSTR_SET_EMBED_LEN(ns, len);
|
|
212
|
-
if (ptr) {
|
|
213
|
-
memcpy(ns->as.ary, ptr, len);
|
|
214
|
-
}
|
|
215
|
-
ns->as.ary[len] = '\0';
|
|
216
|
-
}
|
|
217
|
-
else {
|
|
218
|
-
ns->as.heap.ptr = (char *)mrb_malloc(mrb, (size_t)len+1);
|
|
219
|
-
ns->as.heap.len = len;
|
|
220
|
-
ns->as.heap.aux.capa = len;
|
|
221
|
-
if (ptr) {
|
|
222
|
-
memcpy(ns->as.heap.ptr, ptr, len);
|
|
223
|
-
}
|
|
224
|
-
ns->as.heap.ptr[len] = '\0';
|
|
225
|
-
}
|
|
226
|
-
}
|
|
227
|
-
RSTR_SET_POOL_FLAG(ns);
|
|
228
|
-
MRB_SET_FROZEN_FLAG(ns);
|
|
229
|
-
return mrb_obj_value(ns);
|
|
230
|
-
}
|
|
231
|
-
|
|
232
144
|
void mrb_free_backtrace(mrb_state *mrb);
|
|
233
145
|
|
|
234
146
|
MRB_API void
|
|
@@ -257,11 +169,10 @@ mrb_close(mrb_state *mrb)
|
|
|
257
169
|
}
|
|
258
170
|
|
|
259
171
|
/* free */
|
|
260
|
-
|
|
172
|
+
mrb_gc_destroy(mrb, &mrb->gc);
|
|
261
173
|
mrb_free_context(mrb, mrb->root_c);
|
|
174
|
+
mrb_gc_free_gv(mrb);
|
|
262
175
|
mrb_free_symtbl(mrb);
|
|
263
|
-
mrb_alloca_free(mrb);
|
|
264
|
-
mrb_gc_destroy(mrb, &mrb->gc);
|
|
265
176
|
mrb_free(mrb, mrb);
|
|
266
177
|
}
|
|
267
178
|
|
|
@@ -21,13 +21,11 @@
|
|
|
21
21
|
#include <mruby/range.h>
|
|
22
22
|
#include <mruby/string.h>
|
|
23
23
|
#include <mruby/numeric.h>
|
|
24
|
-
#include <mruby/re.h>
|
|
25
24
|
|
|
26
25
|
typedef struct mrb_shared_string {
|
|
27
|
-
mrb_bool nofree : 1;
|
|
28
26
|
int refcnt;
|
|
27
|
+
mrb_ssize capa;
|
|
29
28
|
char *ptr;
|
|
30
|
-
mrb_int len;
|
|
31
29
|
} mrb_shared_string;
|
|
32
30
|
|
|
33
31
|
const char mrb_digitmap[] = "0123456789abcdefghijklmnopqrstuvwxyz";
|
|
@@ -35,55 +33,114 @@ const char mrb_digitmap[] = "0123456789abcdefghijklmnopqrstuvwxyz";
|
|
|
35
33
|
#define mrb_obj_alloc_string(mrb) ((struct RString*)mrb_obj_alloc((mrb), MRB_TT_STRING, (mrb)->string_class))
|
|
36
34
|
|
|
37
35
|
static struct RString*
|
|
38
|
-
|
|
36
|
+
str_init_normal_capa(mrb_state *mrb, struct RString *s,
|
|
37
|
+
const char *p, size_t len, size_t capa)
|
|
38
|
+
{
|
|
39
|
+
char *dst = (char *)mrb_malloc(mrb, capa + 1);
|
|
40
|
+
if (p) memcpy(dst, p, len);
|
|
41
|
+
dst[len] = '\0';
|
|
42
|
+
s->as.heap.ptr = dst;
|
|
43
|
+
s->as.heap.len = (mrb_ssize)len;
|
|
44
|
+
s->as.heap.aux.capa = (mrb_ssize)capa;
|
|
45
|
+
RSTR_UNSET_TYPE_FLAG(s);
|
|
46
|
+
return s;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
static struct RString*
|
|
50
|
+
str_init_normal(mrb_state *mrb, struct RString *s, const char *p, size_t len)
|
|
39
51
|
{
|
|
40
|
-
|
|
52
|
+
return str_init_normal_capa(mrb, s, p, len, len);
|
|
53
|
+
}
|
|
41
54
|
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
s
|
|
47
|
-
s
|
|
55
|
+
static struct RString*
|
|
56
|
+
str_init_embed(struct RString *s, const char *p, size_t len)
|
|
57
|
+
{
|
|
58
|
+
if (p) memcpy(RSTR_EMBED_PTR(s), p, len);
|
|
59
|
+
RSTR_EMBED_PTR(s)[len] = '\0';
|
|
60
|
+
RSTR_SET_TYPE_FLAG(s, EMBED);
|
|
61
|
+
RSTR_SET_EMBED_LEN(s, len);
|
|
62
|
+
return s;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
static struct RString*
|
|
66
|
+
str_init_nofree(struct RString *s, const char *p, size_t len)
|
|
67
|
+
{
|
|
48
68
|
s->as.heap.ptr = (char *)p;
|
|
49
|
-
s->
|
|
69
|
+
s->as.heap.len = (mrb_ssize)len;
|
|
70
|
+
s->as.heap.aux.capa = 0; /* nofree */
|
|
71
|
+
RSTR_SET_TYPE_FLAG(s, NOFREE);
|
|
72
|
+
return s;
|
|
73
|
+
}
|
|
50
74
|
|
|
75
|
+
static struct RString*
|
|
76
|
+
str_init_shared(mrb_state *mrb, const struct RString *orig, struct RString *s, mrb_shared_string *shared)
|
|
77
|
+
{
|
|
78
|
+
if (shared) {
|
|
79
|
+
shared->refcnt++;
|
|
80
|
+
}
|
|
81
|
+
else {
|
|
82
|
+
shared = (mrb_shared_string *)mrb_malloc(mrb, sizeof(mrb_shared_string));
|
|
83
|
+
shared->refcnt = 1;
|
|
84
|
+
shared->ptr = orig->as.heap.ptr;
|
|
85
|
+
shared->capa = orig->as.heap.aux.capa;
|
|
86
|
+
}
|
|
87
|
+
s->as.heap.ptr = orig->as.heap.ptr;
|
|
88
|
+
s->as.heap.len = orig->as.heap.len;
|
|
89
|
+
s->as.heap.aux.shared = shared;
|
|
90
|
+
RSTR_SET_TYPE_FLAG(s, SHARED);
|
|
51
91
|
return s;
|
|
52
92
|
}
|
|
53
93
|
|
|
54
94
|
static struct RString*
|
|
55
|
-
|
|
95
|
+
str_init_fshared(const struct RString *orig, struct RString *s, struct RString *fshared)
|
|
56
96
|
{
|
|
57
|
-
|
|
97
|
+
s->as.heap.ptr = orig->as.heap.ptr;
|
|
98
|
+
s->as.heap.len = orig->as.heap.len;
|
|
99
|
+
s->as.heap.aux.fshared = fshared;
|
|
100
|
+
RSTR_SET_TYPE_FLAG(s, FSHARED);
|
|
101
|
+
return s;
|
|
102
|
+
}
|
|
58
103
|
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
RSTR_SET_EMBED_FLAG(s);
|
|
65
|
-
RSTR_SET_EMBED_LEN(s, len);
|
|
66
|
-
if (p) {
|
|
67
|
-
memcpy(s->as.ary, p, len);
|
|
68
|
-
}
|
|
104
|
+
static struct RString*
|
|
105
|
+
str_init_modifiable(mrb_state *mrb, struct RString *s, const char *p, size_t len)
|
|
106
|
+
{
|
|
107
|
+
if (RSTR_EMBEDDABLE_P(len)) {
|
|
108
|
+
return str_init_embed(s, p, len);
|
|
69
109
|
}
|
|
70
110
|
else {
|
|
71
|
-
|
|
72
|
-
mrb_raise(mrb, E_ARGUMENT_ERROR, "string size too big");
|
|
73
|
-
}
|
|
74
|
-
s->as.heap.ptr = (char *)mrb_malloc(mrb, len+1);
|
|
75
|
-
s->as.heap.len = (mrb_int)len;
|
|
76
|
-
s->as.heap.aux.capa = (mrb_int)len;
|
|
77
|
-
if (p) {
|
|
78
|
-
memcpy(s->as.heap.ptr, p, len);
|
|
79
|
-
}
|
|
111
|
+
return str_init_normal(mrb, s, p, len);
|
|
80
112
|
}
|
|
81
|
-
|
|
82
|
-
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
static struct RString*
|
|
116
|
+
str_new_static(mrb_state *mrb, const char *p, size_t len)
|
|
117
|
+
{
|
|
118
|
+
if (RSTR_EMBEDDABLE_P(len)) {
|
|
119
|
+
return str_init_embed(mrb_obj_alloc_string(mrb), p, len);
|
|
120
|
+
}
|
|
121
|
+
if (len >= MRB_SSIZE_MAX) {
|
|
122
|
+
mrb_raise(mrb, E_ARGUMENT_ERROR, "string size too big");
|
|
123
|
+
}
|
|
124
|
+
return str_init_nofree(mrb_obj_alloc_string(mrb), p, len);
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
static struct RString*
|
|
128
|
+
str_new(mrb_state *mrb, const char *p, size_t len)
|
|
129
|
+
{
|
|
130
|
+
if (RSTR_EMBEDDABLE_P(len)) {
|
|
131
|
+
return str_init_embed(mrb_obj_alloc_string(mrb), p, len);
|
|
132
|
+
}
|
|
133
|
+
if (len >= MRB_SSIZE_MAX) {
|
|
134
|
+
mrb_raise(mrb, E_ARGUMENT_ERROR, "string size too big");
|
|
135
|
+
}
|
|
136
|
+
if (p && mrb_ro_data_p(p)) {
|
|
137
|
+
return str_init_nofree(mrb_obj_alloc_string(mrb), p, len);
|
|
138
|
+
}
|
|
139
|
+
return str_init_normal(mrb, mrb_obj_alloc_string(mrb), p, len);
|
|
83
140
|
}
|
|
84
141
|
|
|
85
142
|
static inline void
|
|
86
|
-
str_with_class(
|
|
143
|
+
str_with_class(struct RString *s, mrb_value obj)
|
|
87
144
|
{
|
|
88
145
|
s->c = mrb_str_ptr(obj)->c;
|
|
89
146
|
}
|
|
@@ -93,7 +150,7 @@ mrb_str_new_empty(mrb_state *mrb, mrb_value str)
|
|
|
93
150
|
{
|
|
94
151
|
struct RString *s = str_new(mrb, 0, 0);
|
|
95
152
|
|
|
96
|
-
str_with_class(
|
|
153
|
+
str_with_class(s, str);
|
|
97
154
|
return mrb_obj_value(s);
|
|
98
155
|
}
|
|
99
156
|
|
|
@@ -102,15 +159,17 @@ mrb_str_new_capa(mrb_state *mrb, size_t capa)
|
|
|
102
159
|
{
|
|
103
160
|
struct RString *s;
|
|
104
161
|
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
162
|
+
if (RSTR_EMBEDDABLE_P(capa)) {
|
|
163
|
+
s = str_init_embed(mrb_obj_alloc_string(mrb), NULL, 0);
|
|
164
|
+
}
|
|
165
|
+
else if (capa >= MRB_SSIZE_MAX) {
|
|
108
166
|
mrb_raise(mrb, E_ARGUMENT_ERROR, "string capacity size too big");
|
|
167
|
+
/* not reached */
|
|
168
|
+
s = NULL;
|
|
169
|
+
}
|
|
170
|
+
else {
|
|
171
|
+
s = str_init_normal_capa(mrb, mrb_obj_alloc_string(mrb), NULL, 0, capa);
|
|
109
172
|
}
|
|
110
|
-
s->as.heap.len = 0;
|
|
111
|
-
s->as.heap.aux.capa = (mrb_int)capa;
|
|
112
|
-
s->as.heap.ptr = (char *)mrb_malloc(mrb, capa+1);
|
|
113
|
-
RSTR_PTR(s)[0] = '\0';
|
|
114
173
|
|
|
115
174
|
return mrb_obj_value(s);
|
|
116
175
|
}
|
|
@@ -131,23 +190,17 @@ mrb_str_buf_new(mrb_state *mrb, size_t capa)
|
|
|
131
190
|
static void
|
|
132
191
|
resize_capa(mrb_state *mrb, struct RString *s, size_t capacity)
|
|
133
192
|
{
|
|
134
|
-
#if SIZE_MAX >
|
|
135
|
-
mrb_assert(capacity <
|
|
193
|
+
#if SIZE_MAX > MRB_SSIZE_MAX
|
|
194
|
+
mrb_assert(capacity < MRB_SSIZE_MAX);
|
|
136
195
|
#endif
|
|
137
196
|
if (RSTR_EMBED_P(s)) {
|
|
138
|
-
if (
|
|
139
|
-
|
|
140
|
-
const mrb_int len = RSTR_EMBED_LEN(s);
|
|
141
|
-
memcpy(tmp, s->as.ary, len);
|
|
142
|
-
RSTR_UNSET_EMBED_FLAG(s);
|
|
143
|
-
s->as.heap.ptr = tmp;
|
|
144
|
-
s->as.heap.len = len;
|
|
145
|
-
s->as.heap.aux.capa = (mrb_int)capacity;
|
|
197
|
+
if (!RSTR_EMBEDDABLE_P(capacity)) {
|
|
198
|
+
str_init_normal_capa(mrb, s, RSTR_EMBED_PTR(s), RSTR_EMBED_LEN(s), capacity);
|
|
146
199
|
}
|
|
147
200
|
}
|
|
148
201
|
else {
|
|
149
202
|
s->as.heap.ptr = (char*)mrb_realloc(mrb, RSTR_PTR(s), capacity+1);
|
|
150
|
-
s->as.heap.aux.capa = (
|
|
203
|
+
s->as.heap.aux.capa = (mrb_ssize)capacity;
|
|
151
204
|
}
|
|
152
205
|
}
|
|
153
206
|
|
|
@@ -187,13 +240,42 @@ str_decref(mrb_state *mrb, mrb_shared_string *shared)
|
|
|
187
240
|
{
|
|
188
241
|
shared->refcnt--;
|
|
189
242
|
if (shared->refcnt == 0) {
|
|
190
|
-
|
|
191
|
-
mrb_free(mrb, shared->ptr);
|
|
192
|
-
}
|
|
243
|
+
mrb_free(mrb, shared->ptr);
|
|
193
244
|
mrb_free(mrb, shared);
|
|
194
245
|
}
|
|
195
246
|
}
|
|
196
247
|
|
|
248
|
+
static void
|
|
249
|
+
str_modify_keep_ascii(mrb_state *mrb, struct RString *s)
|
|
250
|
+
{
|
|
251
|
+
if (RSTR_SHARED_P(s)) {
|
|
252
|
+
mrb_shared_string *shared = s->as.heap.aux.shared;
|
|
253
|
+
|
|
254
|
+
if (shared->refcnt == 1 && s->as.heap.ptr == shared->ptr) {
|
|
255
|
+
s->as.heap.aux.capa = shared->capa;
|
|
256
|
+
s->as.heap.ptr[s->as.heap.len] = '\0';
|
|
257
|
+
RSTR_UNSET_SHARED_FLAG(s);
|
|
258
|
+
mrb_free(mrb, shared);
|
|
259
|
+
}
|
|
260
|
+
else {
|
|
261
|
+
str_init_modifiable(mrb, s, s->as.heap.ptr, (size_t)s->as.heap.len);
|
|
262
|
+
str_decref(mrb, shared);
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
else if (RSTR_NOFREE_P(s) || RSTR_FSHARED_P(s)) {
|
|
266
|
+
str_init_modifiable(mrb, s, s->as.heap.ptr, (size_t)s->as.heap.len);
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
static void
|
|
271
|
+
check_null_byte(mrb_state *mrb, mrb_value str)
|
|
272
|
+
{
|
|
273
|
+
mrb_to_str(mrb, str);
|
|
274
|
+
if (memchr(RSTRING_PTR(str), '\0', RSTRING_LEN(str))) {
|
|
275
|
+
mrb_raise(mrb, E_ARGUMENT_ERROR, "string contains null byte");
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
|
|
197
279
|
void
|
|
198
280
|
mrb_gc_free_str(mrb_state *mrb, struct RString *str)
|
|
199
281
|
{
|
|
@@ -224,8 +306,10 @@ utf8len(const char* p, const char* e)
|
|
|
224
306
|
mrb_int len;
|
|
225
307
|
mrb_int i;
|
|
226
308
|
|
|
309
|
+
if ((unsigned char)*p < 0x80) return 1;
|
|
227
310
|
len = utf8len_codepage[(unsigned char)*p];
|
|
228
|
-
if (
|
|
311
|
+
if (len == 1) return 1;
|
|
312
|
+
if (len > e - p) return 1;
|
|
229
313
|
for (i = 1; i < len; ++i)
|
|
230
314
|
if ((p[i] & 0xc0) != 0x80)
|
|
231
315
|
return 1;
|
|
@@ -249,14 +333,15 @@ mrb_utf8_len(const char *str, mrb_int byte_len)
|
|
|
249
333
|
static mrb_int
|
|
250
334
|
utf8_strlen(mrb_value str)
|
|
251
335
|
{
|
|
252
|
-
|
|
336
|
+
struct RString *s = mrb_str_ptr(str);
|
|
337
|
+
mrb_int byte_len = RSTR_LEN(s);
|
|
253
338
|
|
|
254
|
-
if (
|
|
339
|
+
if (RSTR_ASCII_P(s)) {
|
|
255
340
|
return byte_len;
|
|
256
341
|
}
|
|
257
342
|
else {
|
|
258
|
-
mrb_int utf8_len = mrb_utf8_len(
|
|
259
|
-
if (byte_len == utf8_len)
|
|
343
|
+
mrb_int utf8_len = mrb_utf8_len(RSTR_PTR(s), byte_len);
|
|
344
|
+
if (byte_len == utf8_len) RSTR_SET_ASCII_FLAG(s);
|
|
260
345
|
return utf8_len;
|
|
261
346
|
}
|
|
262
347
|
}
|
|
@@ -267,39 +352,155 @@ utf8_strlen(mrb_value str)
|
|
|
267
352
|
static mrb_int
|
|
268
353
|
chars2bytes(mrb_value s, mrb_int off, mrb_int idx)
|
|
269
354
|
{
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
355
|
+
if (RSTR_ASCII_P(mrb_str_ptr(s))) {
|
|
356
|
+
return idx;
|
|
357
|
+
}
|
|
358
|
+
else {
|
|
359
|
+
mrb_int i, b, n;
|
|
360
|
+
const char *p = RSTRING_PTR(s) + off;
|
|
361
|
+
const char *e = RSTRING_END(s);
|
|
273
362
|
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
363
|
+
for (b=i=0; p<e && i<idx; i++) {
|
|
364
|
+
n = utf8len(p, e);
|
|
365
|
+
b += n;
|
|
366
|
+
p += n;
|
|
367
|
+
}
|
|
368
|
+
return b;
|
|
278
369
|
}
|
|
279
|
-
return b;
|
|
280
370
|
}
|
|
281
371
|
|
|
282
372
|
/* map byte offset to character index */
|
|
283
373
|
static mrb_int
|
|
284
|
-
bytes2chars(char *p, mrb_int bi)
|
|
374
|
+
bytes2chars(char *p, mrb_int len, mrb_int bi)
|
|
285
375
|
{
|
|
286
|
-
|
|
376
|
+
const char *e = p + (size_t)len;
|
|
377
|
+
const char *pivot = p + bi;
|
|
378
|
+
mrb_int i;
|
|
287
379
|
|
|
288
|
-
for (
|
|
289
|
-
|
|
290
|
-
b += n;
|
|
291
|
-
p += n;
|
|
380
|
+
for (i = 0; p < pivot; i ++) {
|
|
381
|
+
p += utf8len(p, e);
|
|
292
382
|
}
|
|
293
|
-
if (
|
|
383
|
+
if (p != pivot) return -1;
|
|
294
384
|
return i;
|
|
295
385
|
}
|
|
296
386
|
|
|
387
|
+
static const char *
|
|
388
|
+
char_adjust(const char *beg, const char *end, const char *ptr)
|
|
389
|
+
{
|
|
390
|
+
if ((ptr > beg || ptr < end) && (*ptr & 0xc0) == 0x80) {
|
|
391
|
+
const int utf8_adjust_max = 3;
|
|
392
|
+
const char *p;
|
|
393
|
+
|
|
394
|
+
if (ptr - beg > utf8_adjust_max) {
|
|
395
|
+
beg = ptr - utf8_adjust_max;
|
|
396
|
+
}
|
|
397
|
+
|
|
398
|
+
p = ptr;
|
|
399
|
+
while (p > beg) {
|
|
400
|
+
p --;
|
|
401
|
+
if ((*p & 0xc0) != 0x80) {
|
|
402
|
+
int clen = utf8len(p, end);
|
|
403
|
+
if (clen > ptr - p) return p;
|
|
404
|
+
break;
|
|
405
|
+
}
|
|
406
|
+
}
|
|
407
|
+
}
|
|
408
|
+
|
|
409
|
+
return ptr;
|
|
410
|
+
}
|
|
411
|
+
|
|
412
|
+
static const char *
|
|
413
|
+
char_backtrack(const char *ptr, const char *end)
|
|
414
|
+
{
|
|
415
|
+
if (ptr < end) {
|
|
416
|
+
const int utf8_bytelen_max = 4;
|
|
417
|
+
const char *p;
|
|
418
|
+
|
|
419
|
+
if (end - ptr > utf8_bytelen_max) {
|
|
420
|
+
ptr = end - utf8_bytelen_max;
|
|
421
|
+
}
|
|
422
|
+
|
|
423
|
+
p = end;
|
|
424
|
+
while (p > ptr) {
|
|
425
|
+
p --;
|
|
426
|
+
if ((*p & 0xc0) != 0x80) {
|
|
427
|
+
int clen = utf8len_codepage[(unsigned char)*p];
|
|
428
|
+
if (clen == end - p) { return p; }
|
|
429
|
+
break;
|
|
430
|
+
}
|
|
431
|
+
}
|
|
432
|
+
}
|
|
433
|
+
|
|
434
|
+
return end - 1;
|
|
435
|
+
}
|
|
436
|
+
|
|
437
|
+
static mrb_int
|
|
438
|
+
str_index_str_by_char_search(mrb_state *mrb, const char *p, const char *pend, const char *s, const mrb_int slen, mrb_int off)
|
|
439
|
+
{
|
|
440
|
+
/* Based on Quick Search algorithm (Boyer-Moore-Horspool algorithm) */
|
|
441
|
+
|
|
442
|
+
ptrdiff_t qstable[1 << CHAR_BIT];
|
|
443
|
+
|
|
444
|
+
/* Preprocessing */
|
|
445
|
+
{
|
|
446
|
+
mrb_int i;
|
|
447
|
+
|
|
448
|
+
for (i = 0; i < 1 << CHAR_BIT; i ++) {
|
|
449
|
+
qstable[i] = slen;
|
|
450
|
+
}
|
|
451
|
+
for (i = 0; i < slen; i ++) {
|
|
452
|
+
qstable[(unsigned char)s[i]] = slen - (i + 1);
|
|
453
|
+
}
|
|
454
|
+
}
|
|
455
|
+
|
|
456
|
+
/* Searching */
|
|
457
|
+
while (p < pend && pend - p >= slen) {
|
|
458
|
+
const char *pivot;
|
|
459
|
+
|
|
460
|
+
if (memcmp(p, s, slen) == 0) {
|
|
461
|
+
return off;
|
|
462
|
+
}
|
|
463
|
+
|
|
464
|
+
pivot = p + qstable[(unsigned char)p[slen - 1]];
|
|
465
|
+
if (pivot > pend || pivot < p /* overflowed */) { return -1; }
|
|
466
|
+
|
|
467
|
+
do {
|
|
468
|
+
p += utf8len(p, pend);
|
|
469
|
+
off ++;
|
|
470
|
+
} while (p < pivot);
|
|
471
|
+
}
|
|
472
|
+
|
|
473
|
+
return -1;
|
|
474
|
+
}
|
|
475
|
+
|
|
476
|
+
static mrb_int
|
|
477
|
+
str_index_str_by_char(mrb_state *mrb, mrb_value str, mrb_value sub, mrb_int pos)
|
|
478
|
+
{
|
|
479
|
+
const char *p = RSTRING_PTR(str);
|
|
480
|
+
const char *pend = p + RSTRING_LEN(str);
|
|
481
|
+
const char *s = RSTRING_PTR(sub);
|
|
482
|
+
const mrb_int slen = RSTRING_LEN(sub);
|
|
483
|
+
mrb_int off = pos;
|
|
484
|
+
|
|
485
|
+
for (; pos > 0; pos --) {
|
|
486
|
+
if (pend - p < 1) { return -1; }
|
|
487
|
+
p += utf8len(p, pend);
|
|
488
|
+
}
|
|
489
|
+
|
|
490
|
+
if (slen < 1) { return off; }
|
|
491
|
+
|
|
492
|
+
return str_index_str_by_char_search(mrb, p, pend, s, slen, off);
|
|
493
|
+
}
|
|
494
|
+
|
|
297
495
|
#define BYTES_ALIGN_CHECK(pos) if (pos < 0) return mrb_nil_value();
|
|
298
496
|
#else
|
|
299
497
|
#define RSTRING_CHAR_LEN(s) RSTRING_LEN(s)
|
|
300
498
|
#define chars2bytes(p, off, ci) (ci)
|
|
301
|
-
#define bytes2chars(p, bi) (bi)
|
|
499
|
+
#define bytes2chars(p, end, bi) (bi)
|
|
500
|
+
#define char_adjust(beg, end, ptr) (ptr)
|
|
501
|
+
#define char_backtrack(ptr, end) ((end) - 1)
|
|
302
502
|
#define BYTES_ALIGN_CHECK(pos)
|
|
503
|
+
#define str_index_str_by_char(mrb, str, sub, pos) str_index_str(mrb, str, sub, pos)
|
|
303
504
|
#endif
|
|
304
505
|
|
|
305
506
|
static inline mrb_int
|
|
@@ -347,113 +548,116 @@ mrb_memsearch(const void *x0, mrb_int m, const void *y0, mrb_int n)
|
|
|
347
548
|
}
|
|
348
549
|
|
|
349
550
|
static void
|
|
350
|
-
|
|
551
|
+
str_share(mrb_state *mrb, struct RString *orig, struct RString *s)
|
|
351
552
|
{
|
|
352
|
-
|
|
353
|
-
mrb_int len = RSTR_LEN(orig);
|
|
553
|
+
size_t len = (size_t)orig->as.heap.len;
|
|
354
554
|
|
|
355
555
|
mrb_assert(!RSTR_EMBED_P(orig));
|
|
356
|
-
if (
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
s->as.heap.
|
|
361
|
-
s->as.heap.aux.shared = shared;
|
|
362
|
-
RSTR_SET_SHARED_FLAG(s);
|
|
363
|
-
RSTR_UNSET_EMBED_FLAG(s);
|
|
556
|
+
if (RSTR_NOFREE_P(orig) || RSTR_POOL_P(orig)) {
|
|
557
|
+
str_init_nofree(s, orig->as.heap.ptr, len);
|
|
558
|
+
}
|
|
559
|
+
else if (RSTR_SHARED_P(orig)) {
|
|
560
|
+
str_init_shared(mrb, orig, s, orig->as.heap.aux.shared);
|
|
364
561
|
}
|
|
365
562
|
else if (RSTR_FSHARED_P(orig)) {
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
s
|
|
370
|
-
s->as.heap.len = len;
|
|
371
|
-
s->as.heap.aux.fshared = fs;
|
|
372
|
-
RSTR_SET_FSHARED_FLAG(s);
|
|
373
|
-
RSTR_UNSET_EMBED_FLAG(s);
|
|
374
|
-
}
|
|
375
|
-
else if (MRB_FROZEN_P(orig) && !RSTR_POOL_P(orig)) {
|
|
376
|
-
s->as.heap.ptr = orig->as.heap.ptr;
|
|
377
|
-
s->as.heap.len = len;
|
|
378
|
-
s->as.heap.aux.fshared = orig;
|
|
379
|
-
RSTR_SET_FSHARED_FLAG(s);
|
|
380
|
-
RSTR_UNSET_EMBED_FLAG(s);
|
|
563
|
+
str_init_fshared(orig, s, orig->as.heap.aux.fshared);
|
|
564
|
+
}
|
|
565
|
+
else if (mrb_frozen_p(orig)) {
|
|
566
|
+
str_init_fshared(orig, s, orig);
|
|
381
567
|
}
|
|
382
568
|
else {
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
if (!shared->nofree && orig->as.heap.aux.capa > orig->as.heap.len) {
|
|
387
|
-
shared->ptr = (char *)mrb_realloc(mrb, orig->as.heap.ptr, len+1);
|
|
388
|
-
orig->as.heap.ptr = shared->ptr;
|
|
389
|
-
}
|
|
390
|
-
else {
|
|
391
|
-
shared->ptr = orig->as.heap.ptr;
|
|
569
|
+
if (orig->as.heap.aux.capa > orig->as.heap.len) {
|
|
570
|
+
orig->as.heap.ptr = (char *)mrb_realloc(mrb, orig->as.heap.ptr, len+1);
|
|
571
|
+
orig->as.heap.aux.capa = (mrb_ssize)len;
|
|
392
572
|
}
|
|
393
|
-
orig
|
|
394
|
-
|
|
395
|
-
shared->len = len;
|
|
396
|
-
s->as.heap.aux.shared = shared;
|
|
397
|
-
s->as.heap.ptr = shared->ptr;
|
|
398
|
-
s->as.heap.len = len;
|
|
399
|
-
RSTR_SET_SHARED_FLAG(s);
|
|
400
|
-
RSTR_UNSET_EMBED_FLAG(s);
|
|
573
|
+
str_init_shared(mrb, orig, s, NULL);
|
|
574
|
+
str_init_shared(mrb, orig, orig, s->as.heap.aux.shared);
|
|
401
575
|
}
|
|
402
576
|
}
|
|
403
577
|
|
|
404
|
-
|
|
405
|
-
|
|
578
|
+
mrb_value
|
|
579
|
+
mrb_str_pool(mrb_state *mrb, mrb_value str)
|
|
580
|
+
{
|
|
581
|
+
struct RString *s = (struct RString *)mrb_malloc(mrb, sizeof(struct RString));
|
|
582
|
+
struct RString *orig = mrb_str_ptr(str);
|
|
583
|
+
const char *p = RSTR_PTR(orig);
|
|
584
|
+
size_t len = (size_t)RSTR_LEN(orig);
|
|
585
|
+
|
|
586
|
+
s->tt = MRB_TT_STRING;
|
|
587
|
+
s->c = mrb->string_class;
|
|
588
|
+
s->flags = 0;
|
|
589
|
+
|
|
590
|
+
if (RSTR_EMBEDDABLE_P(len)) {
|
|
591
|
+
str_init_embed(s, p, len);
|
|
592
|
+
}
|
|
593
|
+
else if (RSTR_NOFREE_P(orig)) {
|
|
594
|
+
str_init_nofree(s, p, len);
|
|
595
|
+
}
|
|
596
|
+
else {
|
|
597
|
+
str_init_normal(mrb, s, p, len);
|
|
598
|
+
}
|
|
599
|
+
RSTR_SET_POOL_FLAG(s);
|
|
600
|
+
MRB_SET_FROZEN_FLAG(s);
|
|
601
|
+
return mrb_obj_value(s);
|
|
602
|
+
}
|
|
603
|
+
|
|
604
|
+
mrb_value
|
|
605
|
+
mrb_str_byte_subseq(mrb_state *mrb, mrb_value str, mrb_int beg, mrb_int len)
|
|
406
606
|
{
|
|
407
607
|
struct RString *orig, *s;
|
|
408
608
|
|
|
409
609
|
orig = mrb_str_ptr(str);
|
|
410
|
-
|
|
411
|
-
|
|
610
|
+
s = mrb_obj_alloc_string(mrb);
|
|
611
|
+
if (RSTR_EMBEDDABLE_P(len)) {
|
|
612
|
+
str_init_embed(s, RSTR_PTR(orig)+beg, len);
|
|
412
613
|
}
|
|
413
614
|
else {
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
s->as.heap.
|
|
417
|
-
s->as.heap.len = len;
|
|
615
|
+
str_share(mrb, orig, s);
|
|
616
|
+
s->as.heap.ptr += (mrb_ssize)beg;
|
|
617
|
+
s->as.heap.len = (mrb_ssize)len;
|
|
418
618
|
}
|
|
619
|
+
RSTR_COPY_ASCII_FLAG(s, orig);
|
|
419
620
|
return mrb_obj_value(s);
|
|
420
621
|
}
|
|
622
|
+
|
|
623
|
+
static void
|
|
624
|
+
str_range_to_bytes(mrb_value str, mrb_int *pos, mrb_int *len)
|
|
625
|
+
{
|
|
626
|
+
*pos = chars2bytes(str, 0, *pos);
|
|
627
|
+
*len = chars2bytes(str, *pos, *len);
|
|
628
|
+
}
|
|
421
629
|
#ifdef MRB_UTF8_STRING
|
|
422
630
|
static inline mrb_value
|
|
423
631
|
str_subseq(mrb_state *mrb, mrb_value str, mrb_int beg, mrb_int len)
|
|
424
632
|
{
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
return byte_subseq(mrb, str, beg, len);
|
|
633
|
+
str_range_to_bytes(str, &beg, &len);
|
|
634
|
+
return mrb_str_byte_subseq(mrb, str, beg, len);
|
|
429
635
|
}
|
|
430
636
|
#else
|
|
431
|
-
#define str_subseq(mrb, str, beg, len)
|
|
637
|
+
#define str_subseq(mrb, str, beg, len) mrb_str_byte_subseq(mrb, str, beg, len)
|
|
432
638
|
#endif
|
|
433
639
|
|
|
434
|
-
|
|
435
|
-
|
|
640
|
+
mrb_bool
|
|
641
|
+
mrb_str_beg_len(mrb_int str_len, mrb_int *begp, mrb_int *lenp)
|
|
436
642
|
{
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
len = 0;
|
|
442
|
-
}
|
|
443
|
-
else if (beg < 0) {
|
|
444
|
-
beg = clen + beg;
|
|
643
|
+
if (str_len < *begp || *lenp < 0) return FALSE;
|
|
644
|
+
if (*begp < 0) {
|
|
645
|
+
*begp += str_len;
|
|
646
|
+
if (*begp < 0) return FALSE;
|
|
445
647
|
}
|
|
446
|
-
if (
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
648
|
+
if (*lenp > str_len - *begp)
|
|
649
|
+
*lenp = str_len - *begp;
|
|
650
|
+
if (*lenp <= 0) {
|
|
651
|
+
*lenp = 0;
|
|
450
652
|
}
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
653
|
+
return TRUE;
|
|
654
|
+
}
|
|
655
|
+
|
|
656
|
+
static mrb_value
|
|
657
|
+
str_substr(mrb_state *mrb, mrb_value str, mrb_int beg, mrb_int len)
|
|
658
|
+
{
|
|
659
|
+
return mrb_str_beg_len(RSTRING_CHAR_LEN(str), &beg, &len) ?
|
|
660
|
+
str_subseq(mrb, str, beg, len) : mrb_nil_value();
|
|
457
661
|
}
|
|
458
662
|
|
|
459
663
|
MRB_API mrb_int
|
|
@@ -493,44 +697,28 @@ str_index_str(mrb_state *mrb, mrb_value str, mrb_value str2, mrb_int offset)
|
|
|
493
697
|
return mrb_str_index(mrb, str, ptr, len, offset);
|
|
494
698
|
}
|
|
495
699
|
|
|
496
|
-
static void
|
|
497
|
-
check_frozen(mrb_state *mrb, struct RString *s)
|
|
498
|
-
{
|
|
499
|
-
if (MRB_FROZEN_P(s)) {
|
|
500
|
-
mrb_raise(mrb, E_FROZEN_ERROR, "can't modify frozen string");
|
|
501
|
-
}
|
|
502
|
-
}
|
|
503
|
-
|
|
504
700
|
static mrb_value
|
|
505
701
|
str_replace(mrb_state *mrb, struct RString *s1, struct RString *s2)
|
|
506
702
|
{
|
|
507
|
-
|
|
703
|
+
size_t len;
|
|
508
704
|
|
|
509
|
-
|
|
705
|
+
mrb_check_frozen(mrb, s1);
|
|
510
706
|
if (s1 == s2) return mrb_obj_value(s1);
|
|
511
|
-
s1
|
|
512
|
-
s1->flags |= s2->flags&MRB_STR_NO_UTF;
|
|
513
|
-
len = RSTR_LEN(s2);
|
|
707
|
+
RSTR_COPY_ASCII_FLAG(s1, s2);
|
|
514
708
|
if (RSTR_SHARED_P(s1)) {
|
|
515
709
|
str_decref(mrb, s1->as.heap.aux.shared);
|
|
516
|
-
RSTR_UNSET_SHARED_FLAG(s1);
|
|
517
710
|
}
|
|
518
711
|
else if (!RSTR_EMBED_P(s1) && !RSTR_NOFREE_P(s1) && !RSTR_FSHARED_P(s1)
|
|
519
712
|
&& s1->as.heap.ptr) {
|
|
520
713
|
mrb_free(mrb, s1->as.heap.ptr);
|
|
521
714
|
}
|
|
522
715
|
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
RSTR_UNSET_SHARED_FLAG(s1);
|
|
527
|
-
RSTR_UNSET_FSHARED_FLAG(s1);
|
|
528
|
-
RSTR_SET_EMBED_FLAG(s1);
|
|
529
|
-
memcpy(s1->as.ary, RSTR_PTR(s2), len);
|
|
530
|
-
RSTR_SET_EMBED_LEN(s1, len);
|
|
716
|
+
len = (size_t)RSTR_LEN(s2);
|
|
717
|
+
if (RSTR_EMBEDDABLE_P(len)) {
|
|
718
|
+
str_init_embed(s1, RSTR_PTR(s2), len);
|
|
531
719
|
}
|
|
532
720
|
else {
|
|
533
|
-
|
|
721
|
+
str_share(mrb, s2, s1);
|
|
534
722
|
}
|
|
535
723
|
|
|
536
724
|
return mrb_obj_value(s1);
|
|
@@ -539,7 +727,7 @@ str_replace(mrb_state *mrb, struct RString *s1, struct RString *s2)
|
|
|
539
727
|
static mrb_int
|
|
540
728
|
str_rindex(mrb_state *mrb, mrb_value str, mrb_value sub, mrb_int pos)
|
|
541
729
|
{
|
|
542
|
-
char *s, *sbeg, *t;
|
|
730
|
+
const char *s, *sbeg, *t;
|
|
543
731
|
struct RString *ps = mrb_str_ptr(str);
|
|
544
732
|
mrb_int len = RSTRING_LEN(sub);
|
|
545
733
|
|
|
@@ -552,11 +740,12 @@ str_rindex(mrb_state *mrb, mrb_value str, mrb_value sub, mrb_int pos)
|
|
|
552
740
|
s = RSTR_PTR(ps) + pos;
|
|
553
741
|
t = RSTRING_PTR(sub);
|
|
554
742
|
if (len) {
|
|
743
|
+
s = char_adjust(sbeg, sbeg + RSTR_LEN(ps), s);
|
|
555
744
|
while (sbeg <= s) {
|
|
556
745
|
if (memcmp(s, t, len) == 0) {
|
|
557
746
|
return (mrb_int)(s - RSTR_PTR(ps));
|
|
558
747
|
}
|
|
559
|
-
s
|
|
748
|
+
s = char_backtrack(sbeg, s);
|
|
560
749
|
}
|
|
561
750
|
return -1;
|
|
562
751
|
}
|
|
@@ -644,65 +833,17 @@ mrb_locale_from_utf8(const char *utf8, int len)
|
|
|
644
833
|
#endif
|
|
645
834
|
|
|
646
835
|
MRB_API void
|
|
647
|
-
|
|
836
|
+
mrb_str_modify_keep_ascii(mrb_state *mrb, struct RString *s)
|
|
648
837
|
{
|
|
649
|
-
|
|
650
|
-
s
|
|
651
|
-
|
|
652
|
-
mrb_shared_string *shared = s->as.heap.aux.shared;
|
|
653
|
-
|
|
654
|
-
if (shared->nofree == 0 && shared->refcnt == 1 && s->as.heap.ptr == shared->ptr) {
|
|
655
|
-
s->as.heap.ptr = shared->ptr;
|
|
656
|
-
s->as.heap.aux.capa = shared->len;
|
|
657
|
-
RSTR_PTR(s)[s->as.heap.len] = '\0';
|
|
658
|
-
mrb_free(mrb, shared);
|
|
659
|
-
}
|
|
660
|
-
else {
|
|
661
|
-
char *ptr, *p;
|
|
662
|
-
mrb_int len;
|
|
663
|
-
|
|
664
|
-
p = RSTR_PTR(s);
|
|
665
|
-
len = s->as.heap.len;
|
|
666
|
-
if (len < RSTRING_EMBED_LEN_MAX) {
|
|
667
|
-
RSTR_SET_EMBED_FLAG(s);
|
|
668
|
-
RSTR_SET_EMBED_LEN(s, len);
|
|
669
|
-
ptr = RSTR_PTR(s);
|
|
670
|
-
}
|
|
671
|
-
else {
|
|
672
|
-
ptr = (char *)mrb_malloc(mrb, (size_t)len + 1);
|
|
673
|
-
s->as.heap.ptr = ptr;
|
|
674
|
-
s->as.heap.aux.capa = len;
|
|
675
|
-
}
|
|
676
|
-
if (p) {
|
|
677
|
-
memcpy(ptr, p, len);
|
|
678
|
-
}
|
|
679
|
-
ptr[len] = '\0';
|
|
680
|
-
str_decref(mrb, shared);
|
|
681
|
-
}
|
|
682
|
-
RSTR_UNSET_SHARED_FLAG(s);
|
|
683
|
-
return;
|
|
684
|
-
}
|
|
685
|
-
if (RSTR_NOFREE_P(s) || RSTR_FSHARED_P(s)) {
|
|
686
|
-
char *p = s->as.heap.ptr;
|
|
687
|
-
mrb_int len = s->as.heap.len;
|
|
838
|
+
mrb_check_frozen(mrb, s);
|
|
839
|
+
str_modify_keep_ascii(mrb, s);
|
|
840
|
+
}
|
|
688
841
|
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
RSTR_SET_EMBED_LEN(s, len);
|
|
695
|
-
}
|
|
696
|
-
else {
|
|
697
|
-
s->as.heap.ptr = (char *)mrb_malloc(mrb, (size_t)len+1);
|
|
698
|
-
s->as.heap.aux.capa = len;
|
|
699
|
-
}
|
|
700
|
-
if (p) {
|
|
701
|
-
memcpy(RSTR_PTR(s), p, len);
|
|
702
|
-
}
|
|
703
|
-
RSTR_PTR(s)[len] = '\0';
|
|
704
|
-
return;
|
|
705
|
-
}
|
|
842
|
+
MRB_API void
|
|
843
|
+
mrb_str_modify(mrb_state *mrb, struct RString *s)
|
|
844
|
+
{
|
|
845
|
+
mrb_str_modify_keep_ascii(mrb, s);
|
|
846
|
+
RSTR_UNSET_ASCII_FLAG(s);
|
|
706
847
|
}
|
|
707
848
|
|
|
708
849
|
MRB_API mrb_value
|
|
@@ -731,14 +872,8 @@ mrb_str_to_cstr(mrb_state *mrb, mrb_value str0)
|
|
|
731
872
|
{
|
|
732
873
|
struct RString *s;
|
|
733
874
|
|
|
734
|
-
|
|
735
|
-
mrb_raise(mrb, E_TYPE_ERROR, "expected String");
|
|
736
|
-
}
|
|
737
|
-
|
|
875
|
+
check_null_byte(mrb, str0);
|
|
738
876
|
s = str_new(mrb, RSTRING_PTR(str0), RSTRING_LEN(str0));
|
|
739
|
-
if ((strlen(RSTR_PTR(s)) ^ RSTR_LEN(s)) != 0) {
|
|
740
|
-
mrb_raise(mrb, E_ARGUMENT_ERROR, "string contains null byte");
|
|
741
|
-
}
|
|
742
877
|
return RSTR_PTR(s);
|
|
743
878
|
}
|
|
744
879
|
|
|
@@ -826,13 +961,13 @@ mrb_str_times(mrb_state *mrb, mrb_value self)
|
|
|
826
961
|
if (times < 0) {
|
|
827
962
|
mrb_raise(mrb, E_ARGUMENT_ERROR, "negative argument");
|
|
828
963
|
}
|
|
829
|
-
if (times &&
|
|
964
|
+
if (times && MRB_SSIZE_MAX / times < RSTRING_LEN(self)) {
|
|
830
965
|
mrb_raise(mrb, E_ARGUMENT_ERROR, "argument too big");
|
|
831
966
|
}
|
|
832
967
|
|
|
833
968
|
len = RSTRING_LEN(self)*times;
|
|
834
969
|
str2 = str_new(mrb, 0, len);
|
|
835
|
-
str_with_class(
|
|
970
|
+
str_with_class(str2, self);
|
|
836
971
|
p = RSTR_PTR(str2);
|
|
837
972
|
if (len > 0) {
|
|
838
973
|
n = RSTRING_LEN(self);
|
|
@@ -844,6 +979,7 @@ mrb_str_times(mrb_state *mrb, mrb_value self)
|
|
|
844
979
|
memcpy(p + n, p, len-n);
|
|
845
980
|
}
|
|
846
981
|
p[RSTR_LEN(str2)] = '\0';
|
|
982
|
+
RSTR_COPY_ASCII_FLAG(str2, mrb_str_ptr(self));
|
|
847
983
|
|
|
848
984
|
return mrb_obj_value(str2);
|
|
849
985
|
}
|
|
@@ -912,21 +1048,7 @@ mrb_str_cmp_m(mrb_state *mrb, mrb_value str1)
|
|
|
912
1048
|
|
|
913
1049
|
mrb_get_args(mrb, "o", &str2);
|
|
914
1050
|
if (!mrb_string_p(str2)) {
|
|
915
|
-
|
|
916
|
-
return mrb_nil_value();
|
|
917
|
-
}
|
|
918
|
-
else if (!mrb_respond_to(mrb, str2, mrb_intern_lit(mrb, "<=>"))) {
|
|
919
|
-
return mrb_nil_value();
|
|
920
|
-
}
|
|
921
|
-
else {
|
|
922
|
-
mrb_value tmp = mrb_funcall(mrb, str2, "<=>", 1, str1);
|
|
923
|
-
|
|
924
|
-
if (mrb_nil_p(tmp)) return mrb_nil_value();
|
|
925
|
-
if (!mrb_fixnum_p(tmp)) {
|
|
926
|
-
return mrb_funcall(mrb, mrb_fixnum_value(0), "-", 1, tmp);
|
|
927
|
-
}
|
|
928
|
-
result = -mrb_fixnum(tmp);
|
|
929
|
-
}
|
|
1051
|
+
return mrb_nil_value();
|
|
930
1052
|
}
|
|
931
1053
|
else {
|
|
932
1054
|
result = mrb_str_cmp(mrb, str1, str2);
|
|
@@ -981,6 +1103,8 @@ mrb_str_to_str(mrb_state *mrb, mrb_value str)
|
|
|
981
1103
|
switch (mrb_type(str)) {
|
|
982
1104
|
case MRB_TT_STRING:
|
|
983
1105
|
return str;
|
|
1106
|
+
case MRB_TT_SYMBOL:
|
|
1107
|
+
return mrb_sym_str(mrb, mrb_symbol(str));
|
|
984
1108
|
case MRB_TT_FIXNUM:
|
|
985
1109
|
return mrb_fixnum_to_str(mrb, str, 10);
|
|
986
1110
|
case MRB_TT_CLASS:
|
|
@@ -991,6 +1115,7 @@ mrb_str_to_str(mrb_state *mrb, mrb_value str)
|
|
|
991
1115
|
}
|
|
992
1116
|
}
|
|
993
1117
|
|
|
1118
|
+
/* obslete: use RSTRING_PTR() */
|
|
994
1119
|
MRB_API const char*
|
|
995
1120
|
mrb_string_value_ptr(mrb_state *mrb, mrb_value str)
|
|
996
1121
|
{
|
|
@@ -998,6 +1123,7 @@ mrb_string_value_ptr(mrb_state *mrb, mrb_value str)
|
|
|
998
1123
|
return RSTRING_PTR(str);
|
|
999
1124
|
}
|
|
1000
1125
|
|
|
1126
|
+
/* obslete: use RSTRING_LEN() */
|
|
1001
1127
|
MRB_API mrb_int
|
|
1002
1128
|
mrb_string_value_len(mrb_state *mrb, mrb_value ptr)
|
|
1003
1129
|
{
|
|
@@ -1005,76 +1131,101 @@ mrb_string_value_len(mrb_state *mrb, mrb_value ptr)
|
|
|
1005
1131
|
return RSTRING_LEN(ptr);
|
|
1006
1132
|
}
|
|
1007
1133
|
|
|
1008
|
-
void
|
|
1009
|
-
mrb_noregexp(mrb_state *mrb, mrb_value self)
|
|
1010
|
-
{
|
|
1011
|
-
mrb_raise(mrb, E_NOTIMP_ERROR, "Regexp class not implemented");
|
|
1012
|
-
}
|
|
1013
|
-
|
|
1014
|
-
void
|
|
1015
|
-
mrb_regexp_check(mrb_state *mrb, mrb_value obj)
|
|
1016
|
-
{
|
|
1017
|
-
if (mrb_regexp_p(mrb, obj)) {
|
|
1018
|
-
mrb_noregexp(mrb, obj);
|
|
1019
|
-
}
|
|
1020
|
-
}
|
|
1021
|
-
|
|
1022
1134
|
MRB_API mrb_value
|
|
1023
1135
|
mrb_str_dup(mrb_state *mrb, mrb_value str)
|
|
1024
1136
|
{
|
|
1025
1137
|
struct RString *s = mrb_str_ptr(str);
|
|
1026
1138
|
struct RString *dup = str_new(mrb, 0, 0);
|
|
1027
1139
|
|
|
1028
|
-
str_with_class(
|
|
1140
|
+
str_with_class(dup, str);
|
|
1029
1141
|
return str_replace(mrb, dup, s);
|
|
1030
1142
|
}
|
|
1031
1143
|
|
|
1032
|
-
|
|
1033
|
-
|
|
1034
|
-
|
|
1035
|
-
mrb_int idx;
|
|
1144
|
+
enum str_convert_range {
|
|
1145
|
+
/* `beg` and `len` are byte unit in `0 ... str.bytesize` */
|
|
1146
|
+
STR_BYTE_RANGE_CORRECTED = 1,
|
|
1036
1147
|
|
|
1037
|
-
|
|
1038
|
-
|
|
1039
|
-
case MRB_TT_FIXNUM:
|
|
1040
|
-
idx = mrb_fixnum(indx);
|
|
1148
|
+
/* `beg` and `len` are char unit in any range */
|
|
1149
|
+
STR_CHAR_RANGE = 2,
|
|
1041
1150
|
|
|
1042
|
-
|
|
1043
|
-
|
|
1044
|
-
if (!mrb_nil_p(str) && RSTRING_LEN(str) == 0) return mrb_nil_value();
|
|
1045
|
-
return str;
|
|
1151
|
+
/* `beg` and `len` are char unit in `0 ... str.size` */
|
|
1152
|
+
STR_CHAR_RANGE_CORRECTED = 3,
|
|
1046
1153
|
|
|
1047
|
-
|
|
1048
|
-
|
|
1049
|
-
|
|
1050
|
-
return mrb_nil_value();
|
|
1154
|
+
/* `beg` is out of range */
|
|
1155
|
+
STR_OUT_OF_RANGE = -1
|
|
1156
|
+
};
|
|
1051
1157
|
|
|
1052
|
-
|
|
1053
|
-
|
|
1158
|
+
static enum str_convert_range
|
|
1159
|
+
str_convert_range(mrb_state *mrb, mrb_value str, mrb_value indx, mrb_value alen, mrb_int *beg, mrb_int *len)
|
|
1160
|
+
{
|
|
1161
|
+
if (!mrb_undef_p(alen)) {
|
|
1162
|
+
*beg = mrb_int(mrb, indx);
|
|
1163
|
+
*len = mrb_int(mrb, alen);
|
|
1164
|
+
return STR_CHAR_RANGE;
|
|
1165
|
+
}
|
|
1166
|
+
else {
|
|
1167
|
+
switch (mrb_type(indx)) {
|
|
1168
|
+
case MRB_TT_FIXNUM:
|
|
1169
|
+
*beg = mrb_fixnum(indx);
|
|
1170
|
+
*len = 1;
|
|
1171
|
+
return STR_CHAR_RANGE;
|
|
1054
1172
|
|
|
1055
|
-
|
|
1056
|
-
|
|
1057
|
-
|
|
1058
|
-
|
|
1059
|
-
|
|
1060
|
-
|
|
1061
|
-
|
|
1062
|
-
|
|
1063
|
-
|
|
1064
|
-
|
|
1065
|
-
|
|
1066
|
-
|
|
1067
|
-
|
|
1173
|
+
case MRB_TT_STRING:
|
|
1174
|
+
*beg = str_index_str(mrb, str, indx, 0);
|
|
1175
|
+
if (*beg < 0) { break; }
|
|
1176
|
+
*len = RSTRING_LEN(indx);
|
|
1177
|
+
return STR_BYTE_RANGE_CORRECTED;
|
|
1178
|
+
|
|
1179
|
+
case MRB_TT_RANGE:
|
|
1180
|
+
goto range_arg;
|
|
1181
|
+
|
|
1182
|
+
default:
|
|
1183
|
+
indx = mrb_to_int(mrb, indx);
|
|
1184
|
+
if (mrb_fixnum_p(indx)) {
|
|
1185
|
+
*beg = mrb_fixnum(indx);
|
|
1186
|
+
*len = 1;
|
|
1187
|
+
return STR_CHAR_RANGE;
|
|
1188
|
+
}
|
|
1189
|
+
range_arg:
|
|
1190
|
+
*len = RSTRING_CHAR_LEN(str);
|
|
1191
|
+
switch (mrb_range_beg_len(mrb, indx, beg, len, *len, TRUE)) {
|
|
1192
|
+
case MRB_RANGE_OK:
|
|
1193
|
+
return STR_CHAR_RANGE_CORRECTED;
|
|
1194
|
+
case MRB_RANGE_OUT:
|
|
1195
|
+
return STR_OUT_OF_RANGE;
|
|
1068
1196
|
default:
|
|
1069
1197
|
break;
|
|
1070
|
-
}
|
|
1071
1198
|
}
|
|
1199
|
+
|
|
1072
1200
|
mrb_raise(mrb, E_TYPE_ERROR, "can't convert to Fixnum");
|
|
1201
|
+
}
|
|
1202
|
+
}
|
|
1203
|
+
return STR_OUT_OF_RANGE;
|
|
1204
|
+
}
|
|
1205
|
+
|
|
1206
|
+
static mrb_value
|
|
1207
|
+
mrb_str_aref(mrb_state *mrb, mrb_value str, mrb_value indx, mrb_value alen)
|
|
1208
|
+
{
|
|
1209
|
+
mrb_int beg, len;
|
|
1210
|
+
|
|
1211
|
+
switch (str_convert_range(mrb, str, indx, alen, &beg, &len)) {
|
|
1212
|
+
case STR_CHAR_RANGE_CORRECTED:
|
|
1213
|
+
return str_subseq(mrb, str, beg, len);
|
|
1214
|
+
case STR_CHAR_RANGE:
|
|
1215
|
+
str = str_substr(mrb, str, beg, len);
|
|
1216
|
+
if (mrb_undef_p(alen) && !mrb_nil_p(str) && RSTRING_LEN(str) == 0) return mrb_nil_value();
|
|
1217
|
+
return str;
|
|
1218
|
+
case STR_BYTE_RANGE_CORRECTED:
|
|
1219
|
+
if (mrb_string_p(indx)) {
|
|
1220
|
+
return mrb_str_dup(mrb, indx);
|
|
1073
1221
|
}
|
|
1074
|
-
|
|
1075
|
-
|
|
1222
|
+
else {
|
|
1223
|
+
return mrb_str_byte_subseq(mrb, str, beg, len);
|
|
1224
|
+
}
|
|
1225
|
+
case STR_OUT_OF_RANGE:
|
|
1226
|
+
default:
|
|
1227
|
+
return mrb_nil_value();
|
|
1076
1228
|
}
|
|
1077
|
-
return mrb_nil_value(); /* not reached */
|
|
1078
1229
|
}
|
|
1079
1230
|
|
|
1080
1231
|
/* 15.2.10.5.6 */
|
|
@@ -1084,8 +1235,6 @@ num_index:
|
|
|
1084
1235
|
* str[fixnum] => fixnum or nil
|
|
1085
1236
|
* str[fixnum, fixnum] => new_str or nil
|
|
1086
1237
|
* str[range] => new_str or nil
|
|
1087
|
-
* str[regexp] => new_str or nil
|
|
1088
|
-
* str[regexp, fixnum] => new_str or nil
|
|
1089
1238
|
* str[other_str] => new_str or nil
|
|
1090
1239
|
* str.slice(fixnum) => fixnum or nil
|
|
1091
1240
|
* str.slice(fixnum, fixnum) => new_str or nil
|
|
@@ -1121,20 +1270,198 @@ static mrb_value
|
|
|
1121
1270
|
mrb_str_aref_m(mrb_state *mrb, mrb_value str)
|
|
1122
1271
|
{
|
|
1123
1272
|
mrb_value a1, a2;
|
|
1124
|
-
mrb_int argc;
|
|
1125
1273
|
|
|
1126
|
-
|
|
1127
|
-
|
|
1128
|
-
|
|
1274
|
+
if (mrb_get_args(mrb, "o|o", &a1, &a2) == 1) {
|
|
1275
|
+
a2 = mrb_undef_value();
|
|
1276
|
+
}
|
|
1277
|
+
|
|
1278
|
+
return mrb_str_aref(mrb, str, a1, a2);
|
|
1279
|
+
}
|
|
1280
|
+
|
|
1281
|
+
static mrb_noreturn void
|
|
1282
|
+
str_out_of_index(mrb_state *mrb, mrb_value index)
|
|
1283
|
+
{
|
|
1284
|
+
mrb_raisef(mrb, E_INDEX_ERROR, "index %v out of string", index);
|
|
1285
|
+
}
|
|
1286
|
+
|
|
1287
|
+
static mrb_value
|
|
1288
|
+
str_replace_partial(mrb_state *mrb, mrb_value src, mrb_int pos, mrb_int end, mrb_value rep)
|
|
1289
|
+
{
|
|
1290
|
+
const mrb_int shrink_threshold = 256;
|
|
1291
|
+
struct RString *str = mrb_str_ptr(src);
|
|
1292
|
+
mrb_int len = RSTR_LEN(str);
|
|
1293
|
+
mrb_int replen, newlen;
|
|
1294
|
+
char *strp;
|
|
1295
|
+
|
|
1296
|
+
if (end > len) { end = len; }
|
|
1297
|
+
|
|
1298
|
+
if (pos < 0 || pos > len) {
|
|
1299
|
+
str_out_of_index(mrb, mrb_fixnum_value(pos));
|
|
1300
|
+
}
|
|
1301
|
+
|
|
1302
|
+
replen = (mrb_nil_p(rep) ? 0 : RSTRING_LEN(rep));
|
|
1303
|
+
newlen = replen + len - (end - pos);
|
|
1304
|
+
|
|
1305
|
+
if (newlen >= MRB_SSIZE_MAX || newlen < replen /* overflowed */) {
|
|
1306
|
+
mrb_raise(mrb, E_RUNTIME_ERROR, "string size too big");
|
|
1307
|
+
}
|
|
1308
|
+
|
|
1309
|
+
mrb_str_modify(mrb, str);
|
|
1310
|
+
|
|
1311
|
+
if (len < newlen) {
|
|
1312
|
+
resize_capa(mrb, str, newlen);
|
|
1313
|
+
}
|
|
1314
|
+
|
|
1315
|
+
strp = RSTR_PTR(str);
|
|
1316
|
+
|
|
1317
|
+
memmove(strp + newlen - (len - end), strp + end, len - end);
|
|
1318
|
+
if (!mrb_nil_p(rep)) {
|
|
1319
|
+
memmove(strp + pos, RSTRING_PTR(rep), replen);
|
|
1320
|
+
}
|
|
1321
|
+
RSTR_SET_LEN(str, newlen);
|
|
1322
|
+
strp[newlen] = '\0';
|
|
1129
1323
|
|
|
1130
|
-
|
|
1131
|
-
|
|
1132
|
-
return str_substr(mrb, str, n1, n2);
|
|
1324
|
+
if (len - newlen >= shrink_threshold) {
|
|
1325
|
+
resize_capa(mrb, str, newlen);
|
|
1133
1326
|
}
|
|
1134
|
-
|
|
1135
|
-
|
|
1327
|
+
|
|
1328
|
+
return src;
|
|
1329
|
+
}
|
|
1330
|
+
|
|
1331
|
+
#define IS_EVSTR(p,e) ((p) < (e) && (*(p) == '$' || *(p) == '@' || *(p) == '{'))
|
|
1332
|
+
|
|
1333
|
+
static mrb_value
|
|
1334
|
+
str_escape(mrb_state *mrb, mrb_value str, mrb_bool inspect)
|
|
1335
|
+
{
|
|
1336
|
+
const char *p, *pend;
|
|
1337
|
+
char buf[4]; /* `\x??` or UTF-8 character */
|
|
1338
|
+
mrb_value result = mrb_str_new_lit(mrb, "\"");
|
|
1339
|
+
#ifdef MRB_UTF8_STRING
|
|
1340
|
+
uint32_t ascii_flag = MRB_STR_ASCII;
|
|
1341
|
+
#endif
|
|
1342
|
+
|
|
1343
|
+
p = RSTRING_PTR(str); pend = RSTRING_END(str);
|
|
1344
|
+
for (;p < pend; p++) {
|
|
1345
|
+
unsigned char c, cc;
|
|
1346
|
+
#ifdef MRB_UTF8_STRING
|
|
1347
|
+
if (inspect) {
|
|
1348
|
+
mrb_int clen = utf8len(p, pend);
|
|
1349
|
+
if (clen > 1) {
|
|
1350
|
+
mrb_int i;
|
|
1351
|
+
|
|
1352
|
+
for (i=0; i<clen; i++) {
|
|
1353
|
+
buf[i] = p[i];
|
|
1354
|
+
}
|
|
1355
|
+
mrb_str_cat(mrb, result, buf, clen);
|
|
1356
|
+
p += clen-1;
|
|
1357
|
+
ascii_flag = 0;
|
|
1358
|
+
continue;
|
|
1359
|
+
}
|
|
1360
|
+
}
|
|
1361
|
+
#endif
|
|
1362
|
+
c = *p;
|
|
1363
|
+
if (c == '"'|| c == '\\' || (c == '#' && IS_EVSTR(p+1, pend))) {
|
|
1364
|
+
buf[0] = '\\'; buf[1] = c;
|
|
1365
|
+
mrb_str_cat(mrb, result, buf, 2);
|
|
1366
|
+
continue;
|
|
1367
|
+
}
|
|
1368
|
+
if (ISPRINT(c)) {
|
|
1369
|
+
buf[0] = c;
|
|
1370
|
+
mrb_str_cat(mrb, result, buf, 1);
|
|
1371
|
+
continue;
|
|
1372
|
+
}
|
|
1373
|
+
switch (c) {
|
|
1374
|
+
case '\n': cc = 'n'; break;
|
|
1375
|
+
case '\r': cc = 'r'; break;
|
|
1376
|
+
case '\t': cc = 't'; break;
|
|
1377
|
+
case '\f': cc = 'f'; break;
|
|
1378
|
+
case '\013': cc = 'v'; break;
|
|
1379
|
+
case '\010': cc = 'b'; break;
|
|
1380
|
+
case '\007': cc = 'a'; break;
|
|
1381
|
+
case 033: cc = 'e'; break;
|
|
1382
|
+
default: cc = 0; break;
|
|
1383
|
+
}
|
|
1384
|
+
if (cc) {
|
|
1385
|
+
buf[0] = '\\';
|
|
1386
|
+
buf[1] = (char)cc;
|
|
1387
|
+
mrb_str_cat(mrb, result, buf, 2);
|
|
1388
|
+
continue;
|
|
1389
|
+
}
|
|
1390
|
+
else {
|
|
1391
|
+
buf[0] = '\\';
|
|
1392
|
+
buf[1] = 'x';
|
|
1393
|
+
buf[3] = mrb_digitmap[c % 16]; c /= 16;
|
|
1394
|
+
buf[2] = mrb_digitmap[c % 16];
|
|
1395
|
+
mrb_str_cat(mrb, result, buf, 4);
|
|
1396
|
+
continue;
|
|
1397
|
+
}
|
|
1398
|
+
}
|
|
1399
|
+
mrb_str_cat_lit(mrb, result, "\"");
|
|
1400
|
+
#ifdef MRB_UTF8_STRING
|
|
1401
|
+
if (inspect) {
|
|
1402
|
+
mrb_str_ptr(str)->flags |= ascii_flag;
|
|
1403
|
+
mrb_str_ptr(result)->flags |= ascii_flag;
|
|
1404
|
+
}
|
|
1405
|
+
else {
|
|
1406
|
+
RSTR_SET_ASCII_FLAG(mrb_str_ptr(result));
|
|
1407
|
+
}
|
|
1408
|
+
#endif
|
|
1409
|
+
|
|
1410
|
+
return result;
|
|
1411
|
+
}
|
|
1412
|
+
|
|
1413
|
+
static void
|
|
1414
|
+
mrb_str_aset(mrb_state *mrb, mrb_value str, mrb_value indx, mrb_value alen, mrb_value replace)
|
|
1415
|
+
{
|
|
1416
|
+
mrb_int beg, len, charlen;
|
|
1417
|
+
|
|
1418
|
+
mrb_to_str(mrb, replace);
|
|
1419
|
+
|
|
1420
|
+
switch (str_convert_range(mrb, str, indx, alen, &beg, &len)) {
|
|
1421
|
+
case STR_OUT_OF_RANGE:
|
|
1422
|
+
default:
|
|
1423
|
+
mrb_raise(mrb, E_INDEX_ERROR, "string not matched");
|
|
1424
|
+
case STR_CHAR_RANGE:
|
|
1425
|
+
if (len < 0) {
|
|
1426
|
+
mrb_raisef(mrb, E_INDEX_ERROR, "negative length %v", alen);
|
|
1427
|
+
}
|
|
1428
|
+
charlen = RSTRING_CHAR_LEN(str);
|
|
1429
|
+
if (beg < 0) { beg += charlen; }
|
|
1430
|
+
if (beg < 0 || beg > charlen) { str_out_of_index(mrb, indx); }
|
|
1431
|
+
/* fall through */
|
|
1432
|
+
case STR_CHAR_RANGE_CORRECTED:
|
|
1433
|
+
str_range_to_bytes(str, &beg, &len);
|
|
1434
|
+
/* fall through */
|
|
1435
|
+
case STR_BYTE_RANGE_CORRECTED:
|
|
1436
|
+
str_replace_partial(mrb, str, beg, beg + len, replace);
|
|
1437
|
+
}
|
|
1438
|
+
}
|
|
1439
|
+
|
|
1440
|
+
/*
|
|
1441
|
+
* call-seq:
|
|
1442
|
+
* str[fixnum] = replace
|
|
1443
|
+
* str[fixnum, fixnum] = replace
|
|
1444
|
+
* str[range] = replace
|
|
1445
|
+
* str[other_str] = replace
|
|
1446
|
+
*
|
|
1447
|
+
* Modify +self+ by replacing the content of +self+.
|
|
1448
|
+
* The portion of the string affected is determined using the same criteria as +String#[]+.
|
|
1449
|
+
*/
|
|
1450
|
+
static mrb_value
|
|
1451
|
+
mrb_str_aset_m(mrb_state *mrb, mrb_value str)
|
|
1452
|
+
{
|
|
1453
|
+
mrb_value indx, alen, replace;
|
|
1454
|
+
|
|
1455
|
+
switch (mrb_get_args(mrb, "oo|S!", &indx, &alen, &replace)) {
|
|
1456
|
+
case 2:
|
|
1457
|
+
replace = alen;
|
|
1458
|
+
alen = mrb_undef_value();
|
|
1459
|
+
break;
|
|
1460
|
+
case 3:
|
|
1461
|
+
break;
|
|
1136
1462
|
}
|
|
1137
|
-
|
|
1463
|
+
mrb_str_aset(mrb, str, indx, alen, replace);
|
|
1464
|
+
return str;
|
|
1138
1465
|
}
|
|
1139
1466
|
|
|
1140
1467
|
/* 15.2.10.5.8 */
|
|
@@ -1157,7 +1484,7 @@ mrb_str_capitalize_bang(mrb_state *mrb, mrb_value str)
|
|
|
1157
1484
|
mrb_bool modify = FALSE;
|
|
1158
1485
|
struct RString *s = mrb_str_ptr(str);
|
|
1159
1486
|
|
|
1160
|
-
|
|
1487
|
+
mrb_str_modify_keep_ascii(mrb, s);
|
|
1161
1488
|
if (RSTR_LEN(s) == 0 || !RSTR_PTR(s)) return mrb_nil_value();
|
|
1162
1489
|
p = RSTR_PTR(s); pend = RSTR_PTR(s) + RSTR_LEN(s);
|
|
1163
1490
|
if (ISLOWER(*p)) {
|
|
@@ -1216,7 +1543,7 @@ mrb_str_chomp_bang(mrb_state *mrb, mrb_value str)
|
|
|
1216
1543
|
struct RString *s = mrb_str_ptr(str);
|
|
1217
1544
|
|
|
1218
1545
|
argc = mrb_get_args(mrb, "|S", &rs);
|
|
1219
|
-
|
|
1546
|
+
mrb_str_modify_keep_ascii(mrb, s);
|
|
1220
1547
|
len = RSTR_LEN(s);
|
|
1221
1548
|
if (argc == 0) {
|
|
1222
1549
|
if (len == 0) return mrb_nil_value();
|
|
@@ -1278,9 +1605,8 @@ mrb_str_chomp_bang(mrb_state *mrb, mrb_value str)
|
|
|
1278
1605
|
* str.chomp(separator="\n") => new_str
|
|
1279
1606
|
*
|
|
1280
1607
|
* Returns a new <code>String</code> with the given record separator removed
|
|
1281
|
-
* from the end of <i>str</i> (if present).
|
|
1282
|
-
*
|
|
1283
|
-
* removes carriage return characters (that is it will remove <code>\n</code>,
|
|
1608
|
+
* from the end of <i>str</i> (if present). <code>chomp</code> also removes
|
|
1609
|
+
* carriage return characters (that is it will remove <code>\n</code>,
|
|
1284
1610
|
* <code>\r</code>, and <code>\r\n</code>).
|
|
1285
1611
|
*
|
|
1286
1612
|
* "hello".chomp #=> "hello"
|
|
@@ -1315,7 +1641,7 @@ mrb_str_chop_bang(mrb_state *mrb, mrb_value str)
|
|
|
1315
1641
|
{
|
|
1316
1642
|
struct RString *s = mrb_str_ptr(str);
|
|
1317
1643
|
|
|
1318
|
-
|
|
1644
|
+
mrb_str_modify_keep_ascii(mrb, s);
|
|
1319
1645
|
if (RSTR_LEN(s) > 0) {
|
|
1320
1646
|
mrb_int len;
|
|
1321
1647
|
#ifdef MRB_UTF8_STRING
|
|
@@ -1384,7 +1710,7 @@ mrb_str_downcase_bang(mrb_state *mrb, mrb_value str)
|
|
|
1384
1710
|
mrb_bool modify = FALSE;
|
|
1385
1711
|
struct RString *s = mrb_str_ptr(str);
|
|
1386
1712
|
|
|
1387
|
-
|
|
1713
|
+
mrb_str_modify_keep_ascii(mrb, s);
|
|
1388
1714
|
p = RSTR_PTR(s);
|
|
1389
1715
|
pend = RSTR_PTR(s) + RSTR_LEN(s);
|
|
1390
1716
|
while (p < pend) {
|
|
@@ -1452,7 +1778,7 @@ mrb_str_eql(mrb_state *mrb, mrb_value self)
|
|
|
1452
1778
|
mrb_bool eql_p;
|
|
1453
1779
|
|
|
1454
1780
|
mrb_get_args(mrb, "o", &str2);
|
|
1455
|
-
eql_p = (
|
|
1781
|
+
eql_p = (mrb_string_p(str2)) && str_eql(mrb, self, str2);
|
|
1456
1782
|
|
|
1457
1783
|
return mrb_bool_value(eql_p);
|
|
1458
1784
|
}
|
|
@@ -1521,71 +1847,36 @@ mrb_str_include(mrb_state *mrb, mrb_value self)
|
|
|
1521
1847
|
/*
|
|
1522
1848
|
* call-seq:
|
|
1523
1849
|
* str.index(substring [, offset]) => fixnum or nil
|
|
1524
|
-
* str.index(fixnum [, offset]) => fixnum or nil
|
|
1525
|
-
* str.index(regexp [, offset]) => fixnum or nil
|
|
1526
1850
|
*
|
|
1527
1851
|
* Returns the index of the first occurrence of the given
|
|
1528
|
-
* <i>substring</i
|
|
1529
|
-
* character (<i>fixnum</i>), or pattern (<i>regexp</i>) in <i>str</i>.
|
|
1530
|
-
* Returns
|
|
1531
|
-
* <code>nil</code> if not found.
|
|
1852
|
+
* <i>substring</i>. Returns <code>nil</code> if not found.
|
|
1532
1853
|
* If the second parameter is present, it
|
|
1533
1854
|
* specifies the position in the string to begin the search.
|
|
1534
1855
|
*
|
|
1535
|
-
* "hello".index('
|
|
1856
|
+
* "hello".index('l') #=> 2
|
|
1536
1857
|
* "hello".index('lo') #=> 3
|
|
1537
1858
|
* "hello".index('a') #=> nil
|
|
1538
|
-
* "hello".index(
|
|
1539
|
-
* "hello".index(/[aeiou]/, -3) #=> 4
|
|
1859
|
+
* "hello".index('l', -2) #=> 3
|
|
1540
1860
|
*/
|
|
1541
1861
|
static mrb_value
|
|
1542
1862
|
mrb_str_index_m(mrb_state *mrb, mrb_value str)
|
|
1543
1863
|
{
|
|
1544
|
-
mrb_value *argv;
|
|
1545
|
-
mrb_int argc;
|
|
1546
1864
|
mrb_value sub;
|
|
1547
|
-
mrb_int pos
|
|
1865
|
+
mrb_int pos;
|
|
1548
1866
|
|
|
1549
|
-
mrb_get_args(mrb, "
|
|
1550
|
-
if (argc == 2) {
|
|
1551
|
-
mrb_get_args(mrb, "oi", &sub, &pos);
|
|
1552
|
-
}
|
|
1553
|
-
else {
|
|
1867
|
+
if (mrb_get_args(mrb, "S|i", &sub, &pos) == 1) {
|
|
1554
1868
|
pos = 0;
|
|
1555
|
-
if (argc > 0)
|
|
1556
|
-
sub = argv[0];
|
|
1557
|
-
else
|
|
1558
|
-
sub = mrb_nil_value();
|
|
1559
1869
|
}
|
|
1560
|
-
|
|
1561
|
-
|
|
1562
|
-
if (pos < 0) {
|
|
1870
|
+
else if (pos < 0) {
|
|
1871
|
+
mrb_int clen = RSTRING_CHAR_LEN(str);
|
|
1563
1872
|
pos += clen;
|
|
1564
1873
|
if (pos < 0) {
|
|
1565
1874
|
return mrb_nil_value();
|
|
1566
1875
|
}
|
|
1567
1876
|
}
|
|
1568
|
-
|
|
1569
|
-
pos = chars2bytes(str, 0, pos);
|
|
1570
|
-
|
|
1571
|
-
switch (mrb_type(sub)) {
|
|
1572
|
-
default: {
|
|
1573
|
-
mrb_value tmp;
|
|
1574
|
-
|
|
1575
|
-
tmp = mrb_check_string_type(mrb, sub);
|
|
1576
|
-
if (mrb_nil_p(tmp)) {
|
|
1577
|
-
mrb_raisef(mrb, E_TYPE_ERROR, "type mismatch: %S given", sub);
|
|
1578
|
-
}
|
|
1579
|
-
sub = tmp;
|
|
1580
|
-
}
|
|
1581
|
-
/* fall through */
|
|
1582
|
-
case MRB_TT_STRING:
|
|
1583
|
-
pos = str_index_str(mrb, str, sub, pos);
|
|
1584
|
-
break;
|
|
1585
|
-
}
|
|
1877
|
+
pos = str_index_str_by_char(mrb, str, sub, pos);
|
|
1586
1878
|
|
|
1587
1879
|
if (pos == -1) return mrb_nil_value();
|
|
1588
|
-
pos = bytes2chars(RSTRING_PTR(str), pos);
|
|
1589
1880
|
BYTES_ALIGN_CHECK(pos);
|
|
1590
1881
|
return mrb_fixnum_value(pos);
|
|
1591
1882
|
}
|
|
@@ -1658,15 +1949,10 @@ mrb_str_intern(mrb_state *mrb, mrb_value self)
|
|
|
1658
1949
|
MRB_API mrb_value
|
|
1659
1950
|
mrb_obj_as_string(mrb_state *mrb, mrb_value obj)
|
|
1660
1951
|
{
|
|
1661
|
-
mrb_value str;
|
|
1662
|
-
|
|
1663
1952
|
if (mrb_string_p(obj)) {
|
|
1664
1953
|
return obj;
|
|
1665
1954
|
}
|
|
1666
|
-
|
|
1667
|
-
if (!mrb_string_p(str))
|
|
1668
|
-
return mrb_any_to_s(mrb, obj);
|
|
1669
|
-
return str;
|
|
1955
|
+
return mrb_str_to_str(mrb, obj);
|
|
1670
1956
|
}
|
|
1671
1957
|
|
|
1672
1958
|
MRB_API mrb_value
|
|
@@ -1699,6 +1985,18 @@ mrb_ptr_to_str(mrb_state *mrb, void *p)
|
|
|
1699
1985
|
return mrb_obj_value(p_str);
|
|
1700
1986
|
}
|
|
1701
1987
|
|
|
1988
|
+
static inline void
|
|
1989
|
+
str_reverse(char *p, char *e)
|
|
1990
|
+
{
|
|
1991
|
+
char c;
|
|
1992
|
+
|
|
1993
|
+
while (p < e) {
|
|
1994
|
+
c = *p;
|
|
1995
|
+
*p++ = *e;
|
|
1996
|
+
*e-- = c;
|
|
1997
|
+
}
|
|
1998
|
+
}
|
|
1999
|
+
|
|
1702
2000
|
/* 15.2.10.5.30 */
|
|
1703
2001
|
/*
|
|
1704
2002
|
* call-seq:
|
|
@@ -1709,53 +2007,38 @@ mrb_ptr_to_str(mrb_state *mrb, void *p)
|
|
|
1709
2007
|
static mrb_value
|
|
1710
2008
|
mrb_str_reverse_bang(mrb_state *mrb, mrb_value str)
|
|
1711
2009
|
{
|
|
2010
|
+
struct RString *s = mrb_str_ptr(str);
|
|
2011
|
+
char *p, *e;
|
|
2012
|
+
|
|
1712
2013
|
#ifdef MRB_UTF8_STRING
|
|
1713
2014
|
mrb_int utf8_len = RSTRING_CHAR_LEN(str);
|
|
1714
|
-
mrb_int len =
|
|
1715
|
-
|
|
1716
|
-
if (utf8_len == len) goto bytes;
|
|
1717
|
-
if (utf8_len > 1) {
|
|
1718
|
-
char *buf;
|
|
1719
|
-
char *p, *e, *r;
|
|
1720
|
-
|
|
1721
|
-
mrb_str_modify(mrb, mrb_str_ptr(str));
|
|
1722
|
-
len = RSTRING_LEN(str);
|
|
1723
|
-
buf = (char*)mrb_malloc(mrb, (size_t)len);
|
|
1724
|
-
p = buf;
|
|
1725
|
-
e = buf + len;
|
|
1726
|
-
|
|
1727
|
-
memcpy(buf, RSTRING_PTR(str), len);
|
|
1728
|
-
r = RSTRING_PTR(str) + len;
|
|
2015
|
+
mrb_int len = RSTR_LEN(s);
|
|
1729
2016
|
|
|
2017
|
+
if (utf8_len < 2) return str;
|
|
2018
|
+
if (utf8_len < len) {
|
|
2019
|
+
mrb_str_modify(mrb, s);
|
|
2020
|
+
p = RSTR_PTR(s);
|
|
2021
|
+
e = p + RSTR_LEN(s);
|
|
1730
2022
|
while (p<e) {
|
|
1731
2023
|
mrb_int clen = utf8len(p, e);
|
|
1732
|
-
|
|
1733
|
-
memcpy(r, p, clen);
|
|
2024
|
+
str_reverse(p, p + clen - 1);
|
|
1734
2025
|
p += clen;
|
|
1735
2026
|
}
|
|
1736
|
-
|
|
2027
|
+
goto bytes;
|
|
1737
2028
|
}
|
|
1738
|
-
return str;
|
|
1739
|
-
|
|
1740
|
-
bytes:
|
|
1741
2029
|
#endif
|
|
1742
|
-
{
|
|
1743
|
-
struct RString *s = mrb_str_ptr(str);
|
|
1744
|
-
char *p, *e;
|
|
1745
|
-
char c;
|
|
1746
2030
|
|
|
2031
|
+
if (RSTR_LEN(s) > 1) {
|
|
1747
2032
|
mrb_str_modify(mrb, s);
|
|
1748
|
-
|
|
1749
|
-
p = RSTR_PTR(s);
|
|
1750
|
-
e = p + RSTR_LEN(s) - 1;
|
|
1751
|
-
while (p < e) {
|
|
1752
|
-
c = *p;
|
|
1753
|
-
*p++ = *e;
|
|
1754
|
-
*e-- = c;
|
|
1755
|
-
}
|
|
1756
|
-
}
|
|
1757
|
-
return str;
|
|
2033
|
+
goto bytes;
|
|
1758
2034
|
}
|
|
2035
|
+
return str;
|
|
2036
|
+
|
|
2037
|
+
bytes:
|
|
2038
|
+
p = RSTR_PTR(s);
|
|
2039
|
+
e = p + RSTR_LEN(s) - 1;
|
|
2040
|
+
str_reverse(p, e);
|
|
2041
|
+
return str;
|
|
1759
2042
|
}
|
|
1760
2043
|
|
|
1761
2044
|
/* ---------------------------------- */
|
|
@@ -1779,73 +2062,43 @@ mrb_str_reverse(mrb_state *mrb, mrb_value str)
|
|
|
1779
2062
|
/* 15.2.10.5.31 */
|
|
1780
2063
|
/*
|
|
1781
2064
|
* call-seq:
|
|
1782
|
-
* str.rindex(substring [,
|
|
1783
|
-
* str.rindex(fixnum [, fixnum]) => fixnum or nil
|
|
1784
|
-
* str.rindex(regexp [, fixnum]) => fixnum or nil
|
|
2065
|
+
* str.rindex(substring [, offset]) => fixnum or nil
|
|
1785
2066
|
*
|
|
1786
|
-
* Returns the index of the last occurrence of the given <i>substring</i
|
|
1787
|
-
*
|
|
1788
|
-
*
|
|
1789
|
-
*
|
|
1790
|
-
* this point will not be considered.
|
|
2067
|
+
* Returns the index of the last occurrence of the given <i>substring</i>.
|
|
2068
|
+
* Returns <code>nil</code> if not found. If the second parameter is
|
|
2069
|
+
* present, it specifies the position in the string to end the
|
|
2070
|
+
* search---characters beyond this point will not be considered.
|
|
1791
2071
|
*
|
|
1792
2072
|
* "hello".rindex('e') #=> 1
|
|
1793
2073
|
* "hello".rindex('l') #=> 3
|
|
1794
2074
|
* "hello".rindex('a') #=> nil
|
|
1795
|
-
* "hello".rindex(
|
|
1796
|
-
* "hello".rindex(/[aeiou]/, -2) #=> 1
|
|
2075
|
+
* "hello".rindex('l', 2) #=> 2
|
|
1797
2076
|
*/
|
|
1798
2077
|
static mrb_value
|
|
1799
2078
|
mrb_str_rindex(mrb_state *mrb, mrb_value str)
|
|
1800
2079
|
{
|
|
1801
|
-
mrb_value *argv;
|
|
1802
|
-
mrb_int argc;
|
|
1803
2080
|
mrb_value sub;
|
|
1804
2081
|
mrb_int pos, len = RSTRING_CHAR_LEN(str);
|
|
1805
2082
|
|
|
1806
|
-
mrb_get_args(mrb, "
|
|
1807
|
-
|
|
1808
|
-
|
|
2083
|
+
if (mrb_get_args(mrb, "S|i", &sub, &pos) == 1) {
|
|
2084
|
+
pos = len;
|
|
2085
|
+
}
|
|
2086
|
+
else {
|
|
1809
2087
|
if (pos < 0) {
|
|
1810
2088
|
pos += len;
|
|
1811
2089
|
if (pos < 0) {
|
|
1812
|
-
mrb_regexp_check(mrb, sub);
|
|
1813
2090
|
return mrb_nil_value();
|
|
1814
2091
|
}
|
|
1815
2092
|
}
|
|
1816
2093
|
if (pos > len) pos = len;
|
|
1817
2094
|
}
|
|
1818
|
-
else {
|
|
1819
|
-
pos = len;
|
|
1820
|
-
if (argc > 0)
|
|
1821
|
-
sub = argv[0];
|
|
1822
|
-
else
|
|
1823
|
-
sub = mrb_nil_value();
|
|
1824
|
-
}
|
|
1825
2095
|
pos = chars2bytes(str, 0, pos);
|
|
1826
|
-
|
|
1827
|
-
|
|
1828
|
-
|
|
1829
|
-
|
|
1830
|
-
|
|
1831
|
-
|
|
1832
|
-
tmp = mrb_check_string_type(mrb, sub);
|
|
1833
|
-
if (mrb_nil_p(tmp)) {
|
|
1834
|
-
mrb_raisef(mrb, E_TYPE_ERROR, "type mismatch: %S given", sub);
|
|
1835
|
-
}
|
|
1836
|
-
sub = tmp;
|
|
1837
|
-
}
|
|
1838
|
-
/* fall through */
|
|
1839
|
-
case MRB_TT_STRING:
|
|
1840
|
-
pos = str_rindex(mrb, str, sub, pos);
|
|
1841
|
-
if (pos >= 0) {
|
|
1842
|
-
pos = bytes2chars(RSTRING_PTR(str), pos);
|
|
1843
|
-
BYTES_ALIGN_CHECK(pos);
|
|
1844
|
-
return mrb_fixnum_value(pos);
|
|
1845
|
-
}
|
|
1846
|
-
break;
|
|
1847
|
-
|
|
1848
|
-
} /* end of switch (TYPE(sub)) */
|
|
2096
|
+
pos = str_rindex(mrb, str, sub, pos);
|
|
2097
|
+
if (pos >= 0) {
|
|
2098
|
+
pos = bytes2chars(RSTRING_PTR(str), RSTRING_LEN(str), pos);
|
|
2099
|
+
BYTES_ALIGN_CHECK(pos);
|
|
2100
|
+
return mrb_fixnum_value(pos);
|
|
2101
|
+
}
|
|
1849
2102
|
return mrb_nil_value();
|
|
1850
2103
|
}
|
|
1851
2104
|
|
|
@@ -1853,23 +2106,18 @@ mrb_str_rindex(mrb_state *mrb, mrb_value str)
|
|
|
1853
2106
|
|
|
1854
2107
|
/*
|
|
1855
2108
|
* call-seq:
|
|
1856
|
-
* str.split(
|
|
2109
|
+
* str.split(separator=nil, [limit]) => anArray
|
|
1857
2110
|
*
|
|
1858
2111
|
* Divides <i>str</i> into substrings based on a delimiter, returning an array
|
|
1859
2112
|
* of these substrings.
|
|
1860
2113
|
*
|
|
1861
|
-
* If <i>
|
|
1862
|
-
* the delimiter when splitting <i>str</i>. If <i>
|
|
2114
|
+
* If <i>separator</i> is a <code>String</code>, then its contents are used as
|
|
2115
|
+
* the delimiter when splitting <i>str</i>. If <i>separator</i> is a single
|
|
1863
2116
|
* space, <i>str</i> is split on whitespace, with leading whitespace and runs
|
|
1864
2117
|
* of contiguous whitespace characters ignored.
|
|
1865
2118
|
*
|
|
1866
|
-
* If <i>
|
|
1867
|
-
*
|
|
1868
|
-
* <i>str</i> is split into individual characters.
|
|
1869
|
-
*
|
|
1870
|
-
* If <i>pattern</i> is omitted, the value of <code>$;</code> is used. If
|
|
1871
|
-
* <code>$;</code> is <code>nil</code> (which is the default), <i>str</i> is
|
|
1872
|
-
* split on whitespace as if ' ' were specified.
|
|
2119
|
+
* If <i>separator</i> is omitted or <code>nil</code> (which is the default),
|
|
2120
|
+
* <i>str</i> is split on whitespace as if ' ' were specified.
|
|
1873
2121
|
*
|
|
1874
2122
|
* If the <i>limit</i> parameter is omitted, trailing null fields are
|
|
1875
2123
|
* suppressed. If <i>limit</i> is a positive number, at most that number of
|
|
@@ -1880,9 +2128,6 @@ mrb_str_rindex(mrb_state *mrb, mrb_value str)
|
|
|
1880
2128
|
*
|
|
1881
2129
|
* " now's the time".split #=> ["now's", "the", "time"]
|
|
1882
2130
|
* " now's the time".split(' ') #=> ["now's", "the", "time"]
|
|
1883
|
-
* " now's the time".split(/ /) #=> ["", "now's", "", "the", "time"]
|
|
1884
|
-
* "hello".split(//) #=> ["h", "e", "l", "l", "o"]
|
|
1885
|
-
* "hello".split(//, 3) #=> ["h", "e", "llo"]
|
|
1886
2131
|
*
|
|
1887
2132
|
* "mellow yellow".split("ello") #=> ["m", "w y", "w"]
|
|
1888
2133
|
* "1,2,,3,4,,".split(',') #=> ["1", "2", "", "3", "4"]
|
|
@@ -1895,7 +2140,7 @@ mrb_str_split_m(mrb_state *mrb, mrb_value str)
|
|
|
1895
2140
|
{
|
|
1896
2141
|
mrb_int argc;
|
|
1897
2142
|
mrb_value spat = mrb_nil_value();
|
|
1898
|
-
enum {awk, string
|
|
2143
|
+
enum {awk, string} split_type = string;
|
|
1899
2144
|
mrb_int i = 0;
|
|
1900
2145
|
mrb_int beg;
|
|
1901
2146
|
mrb_int end;
|
|
@@ -1917,16 +2162,11 @@ mrb_str_split_m(mrb_state *mrb, mrb_value str)
|
|
|
1917
2162
|
if (argc == 0 || mrb_nil_p(spat)) {
|
|
1918
2163
|
split_type = awk;
|
|
1919
2164
|
}
|
|
1920
|
-
else {
|
|
1921
|
-
|
|
1922
|
-
|
|
1923
|
-
|
|
1924
|
-
|
|
1925
|
-
}
|
|
1926
|
-
}
|
|
1927
|
-
else {
|
|
1928
|
-
mrb_noregexp(mrb, str);
|
|
1929
|
-
}
|
|
2165
|
+
else if (!mrb_string_p(spat)) {
|
|
2166
|
+
mrb_raise(mrb, E_TYPE_ERROR, "expected String");
|
|
2167
|
+
}
|
|
2168
|
+
else if (RSTRING_LEN(spat) == 1 && RSTRING_PTR(spat)[0] == ' ') {
|
|
2169
|
+
split_type = awk;
|
|
1930
2170
|
}
|
|
1931
2171
|
|
|
1932
2172
|
result = mrb_ary_new(mrb);
|
|
@@ -1952,7 +2192,7 @@ mrb_str_split_m(mrb_state *mrb, mrb_value str)
|
|
|
1952
2192
|
}
|
|
1953
2193
|
}
|
|
1954
2194
|
else if (ISSPACE(c)) {
|
|
1955
|
-
mrb_ary_push(mrb, result,
|
|
2195
|
+
mrb_ary_push(mrb, result, mrb_str_byte_subseq(mrb, str, beg, end-beg));
|
|
1956
2196
|
mrb_gc_arena_restore(mrb, ai);
|
|
1957
2197
|
skip = TRUE;
|
|
1958
2198
|
beg = idx;
|
|
@@ -1963,7 +2203,7 @@ mrb_str_split_m(mrb_state *mrb, mrb_value str)
|
|
|
1963
2203
|
}
|
|
1964
2204
|
}
|
|
1965
2205
|
}
|
|
1966
|
-
else
|
|
2206
|
+
else { /* split_type == string */
|
|
1967
2207
|
mrb_int str_len = RSTRING_LEN(str);
|
|
1968
2208
|
mrb_int pat_len = RSTRING_LEN(spat);
|
|
1969
2209
|
mrb_int idx = 0;
|
|
@@ -1977,22 +2217,19 @@ mrb_str_split_m(mrb_state *mrb, mrb_value str)
|
|
|
1977
2217
|
else {
|
|
1978
2218
|
end = chars2bytes(str, idx, 1);
|
|
1979
2219
|
}
|
|
1980
|
-
mrb_ary_push(mrb, result,
|
|
2220
|
+
mrb_ary_push(mrb, result, mrb_str_byte_subseq(mrb, str, idx, end));
|
|
1981
2221
|
mrb_gc_arena_restore(mrb, ai);
|
|
1982
2222
|
idx += end + pat_len;
|
|
1983
2223
|
if (lim_p && lim <= ++i) break;
|
|
1984
2224
|
}
|
|
1985
2225
|
beg = idx;
|
|
1986
2226
|
}
|
|
1987
|
-
else {
|
|
1988
|
-
mrb_noregexp(mrb, str);
|
|
1989
|
-
}
|
|
1990
2227
|
if (RSTRING_LEN(str) > 0 && (lim_p || RSTRING_LEN(str) > beg || lim < 0)) {
|
|
1991
2228
|
if (RSTRING_LEN(str) == beg) {
|
|
1992
2229
|
tmp = mrb_str_new_empty(mrb, str);
|
|
1993
2230
|
}
|
|
1994
2231
|
else {
|
|
1995
|
-
tmp =
|
|
2232
|
+
tmp = mrb_str_byte_subseq(mrb, str, beg, RSTRING_LEN(str)-beg);
|
|
1996
2233
|
}
|
|
1997
2234
|
mrb_ary_push(mrb, result, tmp);
|
|
1998
2235
|
}
|
|
@@ -2090,7 +2327,7 @@ mrb_str_len_to_inum(mrb_state *mrb, const char *str, mrb_int len, mrb_int base,
|
|
|
2090
2327
|
break;
|
|
2091
2328
|
default:
|
|
2092
2329
|
if (base < 2 || 36 < base) {
|
|
2093
|
-
mrb_raisef(mrb, E_ARGUMENT_ERROR, "illegal radix %
|
|
2330
|
+
mrb_raisef(mrb, E_ARGUMENT_ERROR, "illegal radix %i", base);
|
|
2094
2331
|
}
|
|
2095
2332
|
break;
|
|
2096
2333
|
} /* end of switch (base) { */
|
|
@@ -2150,8 +2387,7 @@ mrb_str_len_to_inum(mrb_state *mrb, const char *str, mrb_int len, mrb_int base,
|
|
|
2150
2387
|
else
|
|
2151
2388
|
#endif
|
|
2152
2389
|
{
|
|
2153
|
-
mrb_raisef(mrb,
|
|
2154
|
-
mrb_str_new(mrb, str, pend-str));
|
|
2390
|
+
mrb_raisef(mrb, E_RANGE_ERROR, "string (%l) too big for integer", str, pend-str);
|
|
2155
2391
|
}
|
|
2156
2392
|
}
|
|
2157
2393
|
}
|
|
@@ -2167,8 +2403,7 @@ mrb_str_len_to_inum(mrb_state *mrb, const char *str, mrb_int len, mrb_int base,
|
|
|
2167
2403
|
mrb_raise(mrb, E_ARGUMENT_ERROR, "string contains null byte");
|
|
2168
2404
|
/* not reached */
|
|
2169
2405
|
bad:
|
|
2170
|
-
mrb_raisef(mrb, E_ARGUMENT_ERROR, "invalid string for number(
|
|
2171
|
-
mrb_inspect(mrb, mrb_str_new(mrb, str, pend-str)));
|
|
2406
|
+
mrb_raisef(mrb, E_ARGUMENT_ERROR, "invalid string for number(%!l)", str, pend-str);
|
|
2172
2407
|
/* not reached */
|
|
2173
2408
|
return mrb_fixnum_value(0);
|
|
2174
2409
|
}
|
|
@@ -2179,23 +2414,35 @@ mrb_cstr_to_inum(mrb_state *mrb, const char *str, mrb_int base, mrb_bool badchec
|
|
|
2179
2414
|
return mrb_str_len_to_inum(mrb, str, strlen(str), base, badcheck);
|
|
2180
2415
|
}
|
|
2181
2416
|
|
|
2417
|
+
/* obslete: use RSTRING_CSTR() or mrb_string_cstr() */
|
|
2182
2418
|
MRB_API const char*
|
|
2183
2419
|
mrb_string_value_cstr(mrb_state *mrb, mrb_value *ptr)
|
|
2184
2420
|
{
|
|
2185
|
-
|
|
2186
|
-
|
|
2187
|
-
mrb_int len
|
|
2188
|
-
char *p = RSTR_PTR(ps);
|
|
2421
|
+
struct RString *ps;
|
|
2422
|
+
const char *p;
|
|
2423
|
+
mrb_int len;
|
|
2189
2424
|
|
|
2190
|
-
|
|
2191
|
-
|
|
2192
|
-
|
|
2193
|
-
|
|
2194
|
-
|
|
2195
|
-
|
|
2196
|
-
return RSTR_PTR(ps);
|
|
2425
|
+
check_null_byte(mrb, *ptr);
|
|
2426
|
+
ps = mrb_str_ptr(*ptr);
|
|
2427
|
+
p = RSTR_PTR(ps);
|
|
2428
|
+
len = RSTR_LEN(ps);
|
|
2429
|
+
if (p[len] == '\0') {
|
|
2430
|
+
return p;
|
|
2197
2431
|
}
|
|
2198
|
-
|
|
2432
|
+
|
|
2433
|
+
/*
|
|
2434
|
+
* Even after str_modify_keep_ascii(), NULL termination is not ensured if
|
|
2435
|
+
* RSTR_SET_LEN() is used explicitly (e.g. String#delete_suffix!).
|
|
2436
|
+
*/
|
|
2437
|
+
str_modify_keep_ascii(mrb, ps);
|
|
2438
|
+
RSTR_PTR(ps)[len] = '\0';
|
|
2439
|
+
return RSTR_PTR(ps);
|
|
2440
|
+
}
|
|
2441
|
+
|
|
2442
|
+
MRB_API const char*
|
|
2443
|
+
mrb_string_cstr(mrb_state *mrb, mrb_value str)
|
|
2444
|
+
{
|
|
2445
|
+
return mrb_string_value_cstr(mrb, &str);
|
|
2199
2446
|
}
|
|
2200
2447
|
|
|
2201
2448
|
MRB_API mrb_value
|
|
@@ -2204,7 +2451,8 @@ mrb_str_to_inum(mrb_state *mrb, mrb_value str, mrb_int base, mrb_bool badcheck)
|
|
|
2204
2451
|
const char *s;
|
|
2205
2452
|
mrb_int len;
|
|
2206
2453
|
|
|
2207
|
-
|
|
2454
|
+
mrb_to_str(mrb, str);
|
|
2455
|
+
s = RSTRING_PTR(str);
|
|
2208
2456
|
len = RSTRING_LEN(str);
|
|
2209
2457
|
return mrb_str_len_to_inum(mrb, s, len, base, badcheck);
|
|
2210
2458
|
}
|
|
@@ -2237,7 +2485,7 @@ mrb_str_to_i(mrb_state *mrb, mrb_value self)
|
|
|
2237
2485
|
|
|
2238
2486
|
mrb_get_args(mrb, "|i", &base);
|
|
2239
2487
|
if (base < 0) {
|
|
2240
|
-
mrb_raisef(mrb, E_ARGUMENT_ERROR, "illegal radix %
|
|
2488
|
+
mrb_raisef(mrb, E_ARGUMENT_ERROR, "illegal radix %i", base);
|
|
2241
2489
|
}
|
|
2242
2490
|
return mrb_str_to_inum(mrb, self, base, FALSE);
|
|
2243
2491
|
}
|
|
@@ -2250,8 +2498,6 @@ mrb_cstr_to_dbl(mrb_state *mrb, const char * p, mrb_bool badcheck)
|
|
|
2250
2498
|
char buf[DBL_DIG * 4 + 10];
|
|
2251
2499
|
double d;
|
|
2252
2500
|
|
|
2253
|
-
enum {max_width = 20};
|
|
2254
|
-
|
|
2255
2501
|
if (!p) return 0.0;
|
|
2256
2502
|
while (ISSPACE(*p)) p++;
|
|
2257
2503
|
|
|
@@ -2262,7 +2508,7 @@ mrb_cstr_to_dbl(mrb_state *mrb, const char * p, mrb_bool badcheck)
|
|
|
2262
2508
|
if (p == end) {
|
|
2263
2509
|
if (badcheck) {
|
|
2264
2510
|
bad:
|
|
2265
|
-
mrb_raisef(mrb, E_ARGUMENT_ERROR, "invalid string for float(%
|
|
2511
|
+
mrb_raisef(mrb, E_ARGUMENT_ERROR, "invalid string for float(%s)", p);
|
|
2266
2512
|
/* not reached */
|
|
2267
2513
|
}
|
|
2268
2514
|
return d;
|
|
@@ -2309,22 +2555,7 @@ bad:
|
|
|
2309
2555
|
MRB_API double
|
|
2310
2556
|
mrb_str_to_dbl(mrb_state *mrb, mrb_value str, mrb_bool badcheck)
|
|
2311
2557
|
{
|
|
2312
|
-
|
|
2313
|
-
mrb_int len;
|
|
2314
|
-
|
|
2315
|
-
mrb_to_str(mrb, str);
|
|
2316
|
-
s = RSTRING_PTR(str);
|
|
2317
|
-
len = RSTRING_LEN(str);
|
|
2318
|
-
if (s) {
|
|
2319
|
-
if (badcheck && memchr(s, '\0', len)) {
|
|
2320
|
-
mrb_raise(mrb, E_ARGUMENT_ERROR, "string for Float contains null byte");
|
|
2321
|
-
}
|
|
2322
|
-
if (s[len]) { /* no sentinel somehow */
|
|
2323
|
-
struct RString *temp_str = str_new(mrb, s, len);
|
|
2324
|
-
s = RSTR_PTR(temp_str);
|
|
2325
|
-
}
|
|
2326
|
-
}
|
|
2327
|
-
return mrb_cstr_to_dbl(mrb, s, badcheck);
|
|
2558
|
+
return mrb_cstr_to_dbl(mrb, RSTRING_CSTR(mrb, str), badcheck);
|
|
2328
2559
|
}
|
|
2329
2560
|
|
|
2330
2561
|
/* 15.2.10.5.39 */
|
|
@@ -2379,7 +2610,7 @@ mrb_str_upcase_bang(mrb_state *mrb, mrb_value str)
|
|
|
2379
2610
|
char *p, *pend;
|
|
2380
2611
|
mrb_bool modify = FALSE;
|
|
2381
2612
|
|
|
2382
|
-
|
|
2613
|
+
mrb_str_modify_keep_ascii(mrb, s);
|
|
2383
2614
|
p = RSTRING_PTR(str);
|
|
2384
2615
|
pend = RSTRING_END(str);
|
|
2385
2616
|
while (p < pend) {
|
|
@@ -2415,8 +2646,6 @@ mrb_str_upcase(mrb_state *mrb, mrb_value self)
|
|
|
2415
2646
|
return str;
|
|
2416
2647
|
}
|
|
2417
2648
|
|
|
2418
|
-
#define IS_EVSTR(p,e) ((p) < (e) && (*(p) == '$' || *(p) == '@' || *(p) == '{'))
|
|
2419
|
-
|
|
2420
2649
|
/*
|
|
2421
2650
|
* call-seq:
|
|
2422
2651
|
* str.dump -> new_str
|
|
@@ -2427,113 +2656,7 @@ mrb_str_upcase(mrb_state *mrb, mrb_value self)
|
|
|
2427
2656
|
mrb_value
|
|
2428
2657
|
mrb_str_dump(mrb_state *mrb, mrb_value str)
|
|
2429
2658
|
{
|
|
2430
|
-
|
|
2431
|
-
const char *p, *pend;
|
|
2432
|
-
char *q;
|
|
2433
|
-
struct RString *result;
|
|
2434
|
-
|
|
2435
|
-
len = 2; /* "" */
|
|
2436
|
-
p = RSTRING_PTR(str); pend = p + RSTRING_LEN(str);
|
|
2437
|
-
while (p < pend) {
|
|
2438
|
-
unsigned char c = *p++;
|
|
2439
|
-
switch (c) {
|
|
2440
|
-
case '"': case '\\':
|
|
2441
|
-
case '\n': case '\r':
|
|
2442
|
-
case '\t': case '\f':
|
|
2443
|
-
case '\013': case '\010': case '\007': case '\033':
|
|
2444
|
-
len += 2;
|
|
2445
|
-
break;
|
|
2446
|
-
|
|
2447
|
-
case '#':
|
|
2448
|
-
len += IS_EVSTR(p, pend) ? 2 : 1;
|
|
2449
|
-
break;
|
|
2450
|
-
|
|
2451
|
-
default:
|
|
2452
|
-
if (ISPRINT(c)) {
|
|
2453
|
-
len++;
|
|
2454
|
-
}
|
|
2455
|
-
else {
|
|
2456
|
-
len += 4; /* \NNN */
|
|
2457
|
-
}
|
|
2458
|
-
break;
|
|
2459
|
-
}
|
|
2460
|
-
}
|
|
2461
|
-
|
|
2462
|
-
result = str_new(mrb, 0, len);
|
|
2463
|
-
str_with_class(mrb, result, str);
|
|
2464
|
-
p = RSTRING_PTR(str); pend = p + RSTRING_LEN(str);
|
|
2465
|
-
q = RSTR_PTR(result);
|
|
2466
|
-
*q++ = '"';
|
|
2467
|
-
while (p < pend) {
|
|
2468
|
-
unsigned char c = *p++;
|
|
2469
|
-
|
|
2470
|
-
switch (c) {
|
|
2471
|
-
case '"':
|
|
2472
|
-
case '\\':
|
|
2473
|
-
*q++ = '\\';
|
|
2474
|
-
*q++ = c;
|
|
2475
|
-
break;
|
|
2476
|
-
|
|
2477
|
-
case '\n':
|
|
2478
|
-
*q++ = '\\';
|
|
2479
|
-
*q++ = 'n';
|
|
2480
|
-
break;
|
|
2481
|
-
|
|
2482
|
-
case '\r':
|
|
2483
|
-
*q++ = '\\';
|
|
2484
|
-
*q++ = 'r';
|
|
2485
|
-
break;
|
|
2486
|
-
|
|
2487
|
-
case '\t':
|
|
2488
|
-
*q++ = '\\';
|
|
2489
|
-
*q++ = 't';
|
|
2490
|
-
break;
|
|
2491
|
-
|
|
2492
|
-
case '\f':
|
|
2493
|
-
*q++ = '\\';
|
|
2494
|
-
*q++ = 'f';
|
|
2495
|
-
break;
|
|
2496
|
-
|
|
2497
|
-
case '\013':
|
|
2498
|
-
*q++ = '\\';
|
|
2499
|
-
*q++ = 'v';
|
|
2500
|
-
break;
|
|
2501
|
-
|
|
2502
|
-
case '\010':
|
|
2503
|
-
*q++ = '\\';
|
|
2504
|
-
*q++ = 'b';
|
|
2505
|
-
break;
|
|
2506
|
-
|
|
2507
|
-
case '\007':
|
|
2508
|
-
*q++ = '\\';
|
|
2509
|
-
*q++ = 'a';
|
|
2510
|
-
break;
|
|
2511
|
-
|
|
2512
|
-
case '\033':
|
|
2513
|
-
*q++ = '\\';
|
|
2514
|
-
*q++ = 'e';
|
|
2515
|
-
break;
|
|
2516
|
-
|
|
2517
|
-
case '#':
|
|
2518
|
-
if (IS_EVSTR(p, pend)) *q++ = '\\';
|
|
2519
|
-
*q++ = '#';
|
|
2520
|
-
break;
|
|
2521
|
-
|
|
2522
|
-
default:
|
|
2523
|
-
if (ISPRINT(c)) {
|
|
2524
|
-
*q++ = c;
|
|
2525
|
-
}
|
|
2526
|
-
else {
|
|
2527
|
-
*q++ = '\\';
|
|
2528
|
-
*q++ = 'x';
|
|
2529
|
-
q[1] = mrb_digitmap[c % 16]; c /= 16;
|
|
2530
|
-
q[0] = mrb_digitmap[c % 16];
|
|
2531
|
-
q += 2;
|
|
2532
|
-
}
|
|
2533
|
-
}
|
|
2534
|
-
}
|
|
2535
|
-
*q = '"';
|
|
2536
|
-
return mrb_obj_value(result);
|
|
2659
|
+
return str_escape(mrb, str, FALSE);
|
|
2537
2660
|
}
|
|
2538
2661
|
|
|
2539
2662
|
MRB_API mrb_value
|
|
@@ -2552,21 +2675,21 @@ mrb_str_cat(mrb_state *mrb, mrb_value str, const char *ptr, size_t len)
|
|
|
2552
2675
|
|
|
2553
2676
|
capa = RSTR_CAPA(s);
|
|
2554
2677
|
total = RSTR_LEN(s)+len;
|
|
2555
|
-
if (total >=
|
|
2678
|
+
if (total >= MRB_SSIZE_MAX) {
|
|
2556
2679
|
size_error:
|
|
2557
2680
|
mrb_raise(mrb, E_ARGUMENT_ERROR, "string size too big");
|
|
2558
2681
|
}
|
|
2559
2682
|
if (capa <= total) {
|
|
2560
2683
|
if (capa == 0) capa = 1;
|
|
2561
2684
|
while (capa <= total) {
|
|
2562
|
-
if (capa <=
|
|
2685
|
+
if (capa <= MRB_SSIZE_MAX / 2) {
|
|
2563
2686
|
capa *= 2;
|
|
2564
2687
|
}
|
|
2565
2688
|
else {
|
|
2566
2689
|
capa = total+1;
|
|
2567
2690
|
}
|
|
2568
2691
|
}
|
|
2569
|
-
if (capa <= total || capa >
|
|
2692
|
+
if (capa <= total || capa > MRB_SSIZE_MAX) {
|
|
2570
2693
|
goto size_error;
|
|
2571
2694
|
}
|
|
2572
2695
|
resize_capa(mrb, s, capa);
|
|
@@ -2575,7 +2698,7 @@ mrb_str_cat(mrb_state *mrb, mrb_value str, const char *ptr, size_t len)
|
|
|
2575
2698
|
ptr = RSTR_PTR(s) + off;
|
|
2576
2699
|
}
|
|
2577
2700
|
memcpy(RSTR_PTR(s) + RSTR_LEN(s), ptr, len);
|
|
2578
|
-
mrb_assert_int_fit(size_t, total,
|
|
2701
|
+
mrb_assert_int_fit(size_t, total, mrb_ssize, MRB_SSIZE_MAX);
|
|
2579
2702
|
RSTR_SET_LEN(s, total);
|
|
2580
2703
|
RSTR_PTR(s)[total] = '\0'; /* sentinel */
|
|
2581
2704
|
return str;
|
|
@@ -2603,8 +2726,6 @@ mrb_str_append(mrb_state *mrb, mrb_value str1, mrb_value str2)
|
|
|
2603
2726
|
return mrb_str_cat_str(mrb, str1, str2);
|
|
2604
2727
|
}
|
|
2605
2728
|
|
|
2606
|
-
#define CHAR_ESC_LEN 13 /* sizeof(\x{ hex of 32bit unsigned int } \0) */
|
|
2607
|
-
|
|
2608
2729
|
/*
|
|
2609
2730
|
* call-seq:
|
|
2610
2731
|
* str.inspect -> string
|
|
@@ -2619,68 +2740,7 @@ mrb_str_append(mrb_state *mrb, mrb_value str1, mrb_value str2)
|
|
|
2619
2740
|
mrb_value
|
|
2620
2741
|
mrb_str_inspect(mrb_state *mrb, mrb_value str)
|
|
2621
2742
|
{
|
|
2622
|
-
|
|
2623
|
-
char buf[CHAR_ESC_LEN + 1];
|
|
2624
|
-
mrb_value result = mrb_str_new_lit(mrb, "\"");
|
|
2625
|
-
|
|
2626
|
-
p = RSTRING_PTR(str); pend = RSTRING_END(str);
|
|
2627
|
-
for (;p < pend; p++) {
|
|
2628
|
-
unsigned char c, cc;
|
|
2629
|
-
#ifdef MRB_UTF8_STRING
|
|
2630
|
-
mrb_int clen;
|
|
2631
|
-
|
|
2632
|
-
clen = utf8len(p, pend);
|
|
2633
|
-
if (clen > 1) {
|
|
2634
|
-
mrb_int i;
|
|
2635
|
-
|
|
2636
|
-
for (i=0; i<clen; i++) {
|
|
2637
|
-
buf[i] = p[i];
|
|
2638
|
-
}
|
|
2639
|
-
mrb_str_cat(mrb, result, buf, clen);
|
|
2640
|
-
p += clen-1;
|
|
2641
|
-
continue;
|
|
2642
|
-
}
|
|
2643
|
-
#endif
|
|
2644
|
-
c = *p;
|
|
2645
|
-
if (c == '"'|| c == '\\' || (c == '#' && IS_EVSTR(p+1, pend))) {
|
|
2646
|
-
buf[0] = '\\'; buf[1] = c;
|
|
2647
|
-
mrb_str_cat(mrb, result, buf, 2);
|
|
2648
|
-
continue;
|
|
2649
|
-
}
|
|
2650
|
-
if (ISPRINT(c)) {
|
|
2651
|
-
buf[0] = c;
|
|
2652
|
-
mrb_str_cat(mrb, result, buf, 1);
|
|
2653
|
-
continue;
|
|
2654
|
-
}
|
|
2655
|
-
switch (c) {
|
|
2656
|
-
case '\n': cc = 'n'; break;
|
|
2657
|
-
case '\r': cc = 'r'; break;
|
|
2658
|
-
case '\t': cc = 't'; break;
|
|
2659
|
-
case '\f': cc = 'f'; break;
|
|
2660
|
-
case '\013': cc = 'v'; break;
|
|
2661
|
-
case '\010': cc = 'b'; break;
|
|
2662
|
-
case '\007': cc = 'a'; break;
|
|
2663
|
-
case 033: cc = 'e'; break;
|
|
2664
|
-
default: cc = 0; break;
|
|
2665
|
-
}
|
|
2666
|
-
if (cc) {
|
|
2667
|
-
buf[0] = '\\';
|
|
2668
|
-
buf[1] = (char)cc;
|
|
2669
|
-
mrb_str_cat(mrb, result, buf, 2);
|
|
2670
|
-
continue;
|
|
2671
|
-
}
|
|
2672
|
-
else {
|
|
2673
|
-
buf[0] = '\\';
|
|
2674
|
-
buf[1] = 'x';
|
|
2675
|
-
buf[3] = mrb_digitmap[c % 16]; c /= 16;
|
|
2676
|
-
buf[2] = mrb_digitmap[c % 16];
|
|
2677
|
-
mrb_str_cat(mrb, result, buf, 4);
|
|
2678
|
-
continue;
|
|
2679
|
-
}
|
|
2680
|
-
}
|
|
2681
|
-
mrb_str_cat_lit(mrb, result, "\"");
|
|
2682
|
-
|
|
2683
|
-
return result;
|
|
2743
|
+
return str_escape(mrb, str, TRUE);
|
|
2684
2744
|
}
|
|
2685
2745
|
|
|
2686
2746
|
/*
|
|
@@ -2706,13 +2766,112 @@ mrb_str_bytes(mrb_state *mrb, mrb_value str)
|
|
|
2706
2766
|
return a;
|
|
2707
2767
|
}
|
|
2708
2768
|
|
|
2769
|
+
/*
|
|
2770
|
+
* call-seq:
|
|
2771
|
+
* str.getbyte(index) -> 0 .. 255
|
|
2772
|
+
*
|
|
2773
|
+
* returns the <i>index</i>th byte as an integer.
|
|
2774
|
+
*/
|
|
2775
|
+
static mrb_value
|
|
2776
|
+
mrb_str_getbyte(mrb_state *mrb, mrb_value str)
|
|
2777
|
+
{
|
|
2778
|
+
mrb_int pos;
|
|
2779
|
+
mrb_get_args(mrb, "i", &pos);
|
|
2780
|
+
|
|
2781
|
+
if (pos < 0)
|
|
2782
|
+
pos += RSTRING_LEN(str);
|
|
2783
|
+
if (pos < 0 || RSTRING_LEN(str) <= pos)
|
|
2784
|
+
return mrb_nil_value();
|
|
2785
|
+
|
|
2786
|
+
return mrb_fixnum_value((unsigned char)RSTRING_PTR(str)[pos]);
|
|
2787
|
+
}
|
|
2788
|
+
|
|
2789
|
+
/*
|
|
2790
|
+
* call-seq:
|
|
2791
|
+
* str.setbyte(index, integer) -> integer
|
|
2792
|
+
*
|
|
2793
|
+
* modifies the <i>index</i>th byte as <i>integer</i>.
|
|
2794
|
+
*/
|
|
2795
|
+
static mrb_value
|
|
2796
|
+
mrb_str_setbyte(mrb_state *mrb, mrb_value str)
|
|
2797
|
+
{
|
|
2798
|
+
mrb_int pos, byte;
|
|
2799
|
+
mrb_int len;
|
|
2800
|
+
|
|
2801
|
+
mrb_get_args(mrb, "ii", &pos, &byte);
|
|
2802
|
+
|
|
2803
|
+
len = RSTRING_LEN(str);
|
|
2804
|
+
if (pos < -len || len <= pos)
|
|
2805
|
+
mrb_raisef(mrb, E_INDEX_ERROR, "index %i out of string", pos);
|
|
2806
|
+
if (pos < 0)
|
|
2807
|
+
pos += len;
|
|
2808
|
+
|
|
2809
|
+
mrb_str_modify(mrb, mrb_str_ptr(str));
|
|
2810
|
+
byte &= 0xff;
|
|
2811
|
+
RSTRING_PTR(str)[pos] = (unsigned char)byte;
|
|
2812
|
+
return mrb_fixnum_value((unsigned char)byte);
|
|
2813
|
+
}
|
|
2814
|
+
|
|
2815
|
+
/*
|
|
2816
|
+
* call-seq:
|
|
2817
|
+
* str.byteslice(integer) -> new_str or nil
|
|
2818
|
+
* str.byteslice(integer, integer) -> new_str or nil
|
|
2819
|
+
* str.byteslice(range) -> new_str or nil
|
|
2820
|
+
*
|
|
2821
|
+
* Byte Reference---If passed a single Integer, returns a
|
|
2822
|
+
* substring of one byte at that position. If passed two Integer
|
|
2823
|
+
* objects, returns a substring starting at the offset given by the first, and
|
|
2824
|
+
* a length given by the second. If given a Range, a substring containing
|
|
2825
|
+
* bytes at offsets given by the range is returned. In all three cases, if
|
|
2826
|
+
* an offset is negative, it is counted from the end of <i>str</i>. Returns
|
|
2827
|
+
* <code>nil</code> if the initial offset falls outside the string, the length
|
|
2828
|
+
* is negative, or the beginning of the range is greater than the end.
|
|
2829
|
+
* The encoding of the resulted string keeps original encoding.
|
|
2830
|
+
*
|
|
2831
|
+
* "hello".byteslice(1) #=> "e"
|
|
2832
|
+
* "hello".byteslice(-1) #=> "o"
|
|
2833
|
+
* "hello".byteslice(1, 2) #=> "el"
|
|
2834
|
+
* "\x80\u3042".byteslice(1, 3) #=> "\u3042"
|
|
2835
|
+
* "\x03\u3042\xff".byteslice(1..3) #=> "\u3042"
|
|
2836
|
+
*/
|
|
2837
|
+
static mrb_value
|
|
2838
|
+
mrb_str_byteslice(mrb_state *mrb, mrb_value str)
|
|
2839
|
+
{
|
|
2840
|
+
mrb_value a1, a2;
|
|
2841
|
+
mrb_int str_len = RSTRING_LEN(str), beg, len;
|
|
2842
|
+
mrb_bool empty = TRUE;
|
|
2843
|
+
|
|
2844
|
+
if (mrb_get_args(mrb, "o|o", &a1, &a2) == 2) {
|
|
2845
|
+
beg = mrb_fixnum(mrb_to_int(mrb, a1));
|
|
2846
|
+
len = mrb_fixnum(mrb_to_int(mrb, a2));
|
|
2847
|
+
}
|
|
2848
|
+
else if (mrb_range_p(a1)) {
|
|
2849
|
+
if (mrb_range_beg_len(mrb, a1, &beg, &len, str_len, TRUE) != MRB_RANGE_OK) {
|
|
2850
|
+
return mrb_nil_value();
|
|
2851
|
+
}
|
|
2852
|
+
}
|
|
2853
|
+
else {
|
|
2854
|
+
beg = mrb_fixnum(mrb_to_int(mrb, a1));
|
|
2855
|
+
len = 1;
|
|
2856
|
+
empty = FALSE;
|
|
2857
|
+
}
|
|
2858
|
+
|
|
2859
|
+
if (mrb_str_beg_len(str_len, &beg, &len) && (empty || len != 0)) {
|
|
2860
|
+
return mrb_str_byte_subseq(mrb, str, beg, len);
|
|
2861
|
+
}
|
|
2862
|
+
else {
|
|
2863
|
+
return mrb_nil_value();
|
|
2864
|
+
}
|
|
2865
|
+
}
|
|
2866
|
+
|
|
2709
2867
|
/* ---------------------------*/
|
|
2710
2868
|
void
|
|
2711
2869
|
mrb_init_string(mrb_state *mrb)
|
|
2712
2870
|
{
|
|
2713
2871
|
struct RClass *s;
|
|
2714
2872
|
|
|
2715
|
-
mrb_static_assert(RSTRING_EMBED_LEN_MAX < (1 <<
|
|
2873
|
+
mrb_static_assert(RSTRING_EMBED_LEN_MAX < (1 << MRB_STR_EMBED_LEN_BIT),
|
|
2874
|
+
"pointer size too big for embedded string");
|
|
2716
2875
|
|
|
2717
2876
|
mrb->string_class = s = mrb_define_class(mrb, "String", mrb->object_class); /* 15.2.10 */
|
|
2718
2877
|
MRB_SET_INSTANCE_TT(s, MRB_TT_STRING);
|
|
@@ -2724,6 +2883,7 @@ mrb_init_string(mrb_state *mrb)
|
|
|
2724
2883
|
mrb_define_method(mrb, s, "+", mrb_str_plus_m, MRB_ARGS_REQ(1)); /* 15.2.10.5.4 */
|
|
2725
2884
|
mrb_define_method(mrb, s, "*", mrb_str_times, MRB_ARGS_REQ(1)); /* 15.2.10.5.5 */
|
|
2726
2885
|
mrb_define_method(mrb, s, "[]", mrb_str_aref_m, MRB_ARGS_ANY()); /* 15.2.10.5.6 */
|
|
2886
|
+
mrb_define_method(mrb, s, "[]=", mrb_str_aset_m, MRB_ARGS_ANY());
|
|
2727
2887
|
mrb_define_method(mrb, s, "capitalize", mrb_str_capitalize, MRB_ARGS_NONE()); /* 15.2.10.5.7 */
|
|
2728
2888
|
mrb_define_method(mrb, s, "capitalize!", mrb_str_capitalize_bang, MRB_ARGS_NONE()); /* 15.2.10.5.8 */
|
|
2729
2889
|
mrb_define_method(mrb, s, "chomp", mrb_str_chomp, MRB_ARGS_ANY()); /* 15.2.10.5.9 */
|
|
@@ -2737,7 +2897,7 @@ mrb_init_string(mrb_state *mrb)
|
|
|
2737
2897
|
|
|
2738
2898
|
mrb_define_method(mrb, s, "hash", mrb_str_hash_m, MRB_ARGS_NONE()); /* 15.2.10.5.20 */
|
|
2739
2899
|
mrb_define_method(mrb, s, "include?", mrb_str_include, MRB_ARGS_REQ(1)); /* 15.2.10.5.21 */
|
|
2740
|
-
mrb_define_method(mrb, s, "index", mrb_str_index_m,
|
|
2900
|
+
mrb_define_method(mrb, s, "index", mrb_str_index_m, MRB_ARGS_ARG(1,1)); /* 15.2.10.5.22 */
|
|
2741
2901
|
mrb_define_method(mrb, s, "initialize", mrb_str_init, MRB_ARGS_REQ(1)); /* 15.2.10.5.23 */
|
|
2742
2902
|
mrb_define_method(mrb, s, "initialize_copy", mrb_str_replace, MRB_ARGS_REQ(1)); /* 15.2.10.5.24 */
|
|
2743
2903
|
mrb_define_method(mrb, s, "intern", mrb_str_intern, MRB_ARGS_NONE()); /* 15.2.10.5.25 */
|
|
@@ -2761,6 +2921,10 @@ mrb_init_string(mrb_state *mrb)
|
|
|
2761
2921
|
mrb_define_method(mrb, s, "upcase!", mrb_str_upcase_bang, MRB_ARGS_NONE()); /* 15.2.10.5.43 */
|
|
2762
2922
|
mrb_define_method(mrb, s, "inspect", mrb_str_inspect, MRB_ARGS_NONE()); /* 15.2.10.5.46(x) */
|
|
2763
2923
|
mrb_define_method(mrb, s, "bytes", mrb_str_bytes, MRB_ARGS_NONE());
|
|
2924
|
+
|
|
2925
|
+
mrb_define_method(mrb, s, "getbyte", mrb_str_getbyte, MRB_ARGS_REQ(1));
|
|
2926
|
+
mrb_define_method(mrb, s, "setbyte", mrb_str_setbyte, MRB_ARGS_REQ(2));
|
|
2927
|
+
mrb_define_method(mrb, s, "byteslice", mrb_str_byteslice, MRB_ARGS_ARG(1,1));
|
|
2764
2928
|
}
|
|
2765
2929
|
|
|
2766
2930
|
#ifndef MRB_WITHOUT_FLOAT
|