diff options
author | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2015-05-15 09:06:25 +0000 |
---|---|---|
committer | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2015-05-15 09:06:25 +0000 |
commit | d70228d1053f4a2400995e6b4d7a97f3eaac2026 (patch) | |
tree | 17da735cea99c08e431773d529b0449cbac821c8 /string.c | |
parent | 04c10b8af30161843f3e147deb3f94b684ec8036 (diff) | |
download | ruby-d70228d1053f4a2400995e6b4d7a97f3eaac2026.tar.gz |
string.c: all_digits_p
* string.c (all_digits_p): extract duplicate code from
rb_str_upto.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@50500 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'string.c')
-rw-r--r-- | string.c | 27 |
1 files changed, 13 insertions, 14 deletions
@@ -3449,6 +3449,15 @@ rb_str_succ_bang(VALUE str) return str; } +static int +all_digits_p(const char *s, long len) +{ + while (len-- > 0) { + if (!ISDIGIT(*s)) return 0; + s++; + } + return 1; +} /* * call-seq: @@ -3513,22 +3522,13 @@ rb_str_upto(int argc, VALUE *argv, VALUE beg) return beg; } /* both edges are all digits */ - if (ascii && ISDIGIT(RSTRING_PTR(beg)[0]) && ISDIGIT(RSTRING_PTR(end)[0])) { - char *s, *send; + if (ascii && ISDIGIT(RSTRING_PTR(beg)[0]) && ISDIGIT(RSTRING_PTR(end)[0]) && + all_digits_p(RSTRING_PTR(beg), RSTRING_LEN(beg)) && + all_digits_p(RSTRING_PTR(end), RSTRING_LEN(end))) { VALUE b, e; int width; - s = RSTRING_PTR(beg); send = RSTRING_END(beg); - width = rb_long2int(send - s); - while (s < send) { - if (!ISDIGIT(*s)) goto no_digits; - s++; - } - s = RSTRING_PTR(end); send = RSTRING_END(end); - while (s < send) { - if (!ISDIGIT(*s)) goto no_digits; - s++; - } + width = RSTRING_LENINT(beg); b = rb_str_to_inum(beg, 10, FALSE); e = rb_str_to_inum(end, 10, FALSE); if (FIXNUM_P(b) && FIXNUM_P(e)) { @@ -3556,7 +3556,6 @@ rb_str_upto(int argc, VALUE *argv, VALUE beg) return beg; } /* normal case */ - no_digits: n = rb_str_cmp(beg, end); if (n > 0 || (excl && n == 0)) return beg; |