From 9d520ae73977b8f59f9895e7f21c291f800d2b7b Mon Sep 17 00:00:00 2001 From: mattn Date: Thu, 17 Apr 2014 18:22:07 +0900 Subject: Implement String#index, fixes #2073 --- mrbgems/mruby-string-utf8/src/string.c | 26 +++++++++++++++++++++----- 1 file changed, 21 insertions(+), 5 deletions(-) (limited to 'mrbgems/mruby-string-utf8/src') diff --git a/mrbgems/mruby-string-utf8/src/string.c b/mrbgems/mruby-string-utf8/src/string.c index 2ed25d648..7f323415f 100644 --- a/mrbgems/mruby-string-utf8/src/string.c +++ b/mrbgems/mruby-string-utf8/src/string.c @@ -33,11 +33,12 @@ utf8len(unsigned char* p) } static mrb_int -mrb_utf8_strlen(mrb_value str) +mrb_utf8_strlen(mrb_value str, mrb_int len) { mrb_int total = 0; unsigned char* p = (unsigned char*) RSTRING_PTR(str); - unsigned char* e = p + RSTRING_LEN(str); + unsigned char* e = p; + e += len < 0 ? RSTRING_LEN(str) : len; while (p 1) { mrb_int len = RSTRING_LEN(str); char *buf = (char *)mrb_malloc(mrb, (size_t)len); @@ -319,6 +334,7 @@ mrb_mruby_string_utf8_gem_init(mrb_state* mrb) mrb_define_method(mrb, s, "size", mrb_str_size, MRB_ARGS_NONE()); mrb_define_method(mrb, s, "length", mrb_str_size, MRB_ARGS_NONE()); + mrb_define_method(mrb, s, "index", mrb_str_index, MRB_ARGS_ANY()); mrb_define_method(mrb, s, "[]", mrb_str_aref_m, MRB_ARGS_ANY()); mrb_define_method(mrb, s, "slice", mrb_str_aref_m, MRB_ARGS_ANY()); mrb_define_method(mrb, s, "reverse", mrb_str_reverse, MRB_ARGS_NONE()); -- cgit v1.2.3