summaryrefslogtreecommitdiffhomepage
path: root/src/string.c
diff options
context:
space:
mode:
authorYukihiro Matsumoto <[email protected]>2012-06-12 12:58:49 +0900
committerYukihiro Matsumoto <[email protected]>2012-06-12 12:58:49 +0900
commit30a062c165f31f31f8be65bd51d313a2d25f0bd9 (patch)
treea85b6477a724d5d6ca48c7484b427d2d8f328209 /src/string.c
parentff4925b804cc70aa8571e9aed2793114ef0223f6 (diff)
downloadmruby-30a062c165f31f31f8be65bd51d313a2d25f0bd9.tar.gz
mruby-30a062c165f31f31f8be65bd51d313a2d25f0bd9.zip
String#split("") should split per character (byte for now)
Diffstat (limited to 'src/string.c')
-rw-r--r--src/string.c22
1 files changed, 16 insertions, 6 deletions
diff --git a/src/string.c b/src/string.c
index fcd68a2f2..14041127a 100644
--- a/src/string.c
+++ b/src/string.c
@@ -2208,14 +2208,24 @@ mrb_str_split_m(mrb_state *mrb, mrb_value str)
char *ptr = RSTRING_PTR(str);
char *temp = ptr;
char *eptr = RSTRING_END(str);
- char *sptr = RSTRING_PTR(spat);
long slen = RSTRING_LEN(spat);
- while (ptr < eptr &&
- (end = mrb_memsearch(sptr, slen, ptr, eptr - ptr)) >= 0) {
- mrb_ary_push(mrb, result, mrb_str_subseq(mrb, str, ptr - temp, end));
- ptr += end + slen;
- if (lim >= 0 && lim <= ++i) break;
+ if (slen == 0) {
+ while (ptr < eptr) {
+ mrb_ary_push(mrb, result, mrb_str_subseq(mrb, str, ptr-temp, 1));
+ ptr++;
+ if (lim >= 0 && lim <= ++i) break;
+ }
+ }
+ else {
+ char *sptr = RSTRING_PTR(spat);
+
+ while (ptr < eptr &&
+ (end = mrb_memsearch(sptr, slen, ptr, eptr - ptr)) >= 0) {
+ mrb_ary_push(mrb, result, mrb_str_subseq(mrb, str, ptr - temp, end));
+ ptr += end + slen;
+ if (lim >= 0 && lim <= ++i) break;
+ }
}
beg = ptr - temp;
}