asarih
1
Bug #2323: “Z”…“Z”.succe$B$,6ue(B
http://redmine.ruby-lang.org/issues/show/2323
e$B5/I<<Te(B: Hiro A.
e$B%9%F!<%?%9e(B: Open, e$BM%@hEYe(B: Normal
e$B%+%F%4%je(B: core
ruby -v: ruby 1.9.2dev (2009-11-02 trunk 25625) [x86_64-darwin10.0.0]
surfboard:~$ ruby1.9 -v; ruby1.9 -e ‘p (“Z”…“Z”.succ); p
(“Z”…“Z”.succ).to_a’
ruby 1.9.2dev (2009-11-02 trunk 25625) [x86_64-darwin10.0.0]
“Z”…“AA”
[]
“Z”.succe$B$G$O$J$/$F$b$&$A$g$C$H!IN%$l$?!I%d%D$re(BRangee$B$N=*$o$j$H$7$F;XDj$9$k$He(B"AA"e$B$O$7$C$+$j$HF~$C$F$$$^$9!#e(B
surfboard:~$ ruby1.9 -e ‘p (“Z”…“ZA”).include? “Z”.succ’
true
e$B$G$bH>C<$J!IN%$l!IJ}$G$O$$$1$^$;$s!#e(B
surfboard:~$ ruby1.9 -e ‘p (“Z”…“CA”).include? “Z”.succ’
false
to_ae$B$r2p$7$F$bF1MM$G$9!#e(B
surfboard:~$ ruby1.9 -e ‘p (“Z”…“ZA”).to_a.include? “Z”.succ’
true
surfboard:~$ ruby1.9 -e ‘p (“Z”…“CA”).to_a.include? “Z”.succ’
false
asarih
2
e$B$J$+$@$G$9!#e(B
At Mon, 2 Nov 2009 16:19:40 +0900,
Hiro A. wrote in [ruby-dev:39604]:
surfboard:~$ ruby1.9 -v; ruby1.9 -e ‘p (“Z”…“Z”.succ); p (“Z”…“Z”.succ).to_a’
ruby 1.9.2dev (2009-11-02 trunk 25625) [x86_64-darwin10.0.0]
“Z”…“AA”
[]
e$B$3$s$J$H$3$m$G$7$g$&$+!#e(B
Index: string.c
— string.c (revision 25629)
+++ string.c (working copy)
@@ -2844,4 +2844,44 @@ rb_str_succ_bang(VALUE str)
}
+static int
+str_succ_cmp(VALUE str1, VALUE str2, rb_encoding *enc)
+{
- const char *p1 = RSTRING_PTR(str1), *e1 = RSTRING_END(str1);
- const char *p2 = RSTRING_PTR(str2), *e2 = RSTRING_END(str2);
- size_t l1, l2;
- do {
- if (ISUPPER(*p1) && ISUPPER(*p2)) {
-
for (l1 = 1; p1+l1 < e1 && ISUPPER(p1[l1]); l1++);
-
for (l2 = 1; p2+l2 < e2 && ISUPPER(p2[l2]); l2++);
- }
- else if (ISLOWER(*p1) && ISLOWER(*p2)) {
-
for (l1 = 1; p1+l1 < e1 && ISLOWER(p1[l1]); l1++);
-
for (l2 = 1; p2+l2 < e2 && ISLOWER(p2[l2]); l2++);
- }
- else if (ISDIGIT(*p1) && ISDIGIT(*p2)) {
-
for (l1 = 1; p1+l1 < e1 && ISDIGIT(p1[l1]); l1++);
-
for (l2 = 1; p2+l2 < e2 && ISDIGIT(p2[l2]); l2++);
- }
- else {
-
int n, c;
-
for (l1 = 0; p1+l1 < e1; l1 += n) {
- c = rb_enc_ascget(p1+l1, e1, &n, enc);
- if (ISALNUM©) break;
-
}
-
for (l2 = 0; p2+l2 < e2; l2 += n) {
- c = rb_enc_ascget(p2+l2, e2, &n, enc);
- if (ISALNUM©) break;
-
}
-
if (l1 == 0 || l2 == 0) return 1;
- }
- if (l1 > l2) return 1;
- if (l1 == l2) {
-
if (memcmp(p1, p2, l1) > 0) return 0;
- }
- p1 += l1;
- p2 += l2;
- } while (p1 < e1 || p2 < e2);
- return -(p1 == e1 && p2 == e2);
+}
/*
@@ -2881,4 +2921,5 @@ rb_str_upto(int argc, VALUE *argv, VALUE
ID succ;
int n, excl, ascii;
- char c, e;
rb_encoding *enc;
@@ -2891,8 +2932,9 @@ rb_str_upto(int argc, VALUE argv, VALUE
ascii = (is_ascii_string(beg) && is_ascii_string(end));
/ single character */
- if (RSTRING_LEN(beg) == 1 && RSTRING_LEN(end) == 1 && ascii) {
- char c = RSTRING_PTR(beg)[0];
- char e = RSTRING_PTR(end)[0];
-
- if (ascii &&
- RSTRING_LEN(beg) == 1 && RSTRING_LEN(end) == 1 &&
- (c = RSTRING_PTR(beg)[0], ISALPHA©) &&
- (e = RSTRING_PTR(end)[0], ISALPHA(e)) &&
- (ISUPPER© == ISUPPER(e))) {
if (c > e || (excl && c == e)) return beg;
for (; {
@@ -2906,5 +2948,5 @@ rb_str_upto(int argc, VALUE argv, VALUE
/ both edges are all digits */
if (ascii && ISDIGIT(RSTRING_PTR(beg)[0]) &&
ISDIGIT(RSTRING_PTR(end)[0])) {
- const char *s, *send;
VALUE b, e;
int width;
@@ -2949,5 +2991,8 @@ rb_str_upto(int argc, VALUE argv, VALUE
/ normal case */
no_digits:
- n = rb_str_cmp(beg, end);
- if (ascii && rb_enc_str_coderange(beg) ==
rb_enc_str_coderange(end))
- n = str_succ_cmp(beg, end, enc);
- else
- n = rb_str_cmp(beg, end);
if (n > 0 || (excl && n == 0)) return beg;
Index: test/ruby/test_range.rb
— test/ruby/test_range.rb (revision 25629)
+++ test/ruby/test_range.rb (working copy)
@@ -256,4 +256,7 @@ class TestRange < Test::Unit::TestCase
assert(!((“a”…“z”).include?(“z”)))
assert(!((“a”…“z”).include?(“cc”)))
- assert((“Z”…“ZA”).include?(“AA”))
- assert(!(“Z”…“za”).include?(“AA”))
- assert((“Z”…“CA”).include?(“AA”))
assert((0…10).include?(5))
end
Index: test/ruby/test_string.rb
===================================================================
— test/ruby/test_string.rb (revision 25629)
+++ test/ruby/test_string.rb (working copy)
@@ -1588,4 +1588,8 @@ class TestString < Test::Unit::TestCase
})
assert_equal(676, count)
-
- a = []
- S(“Z”).upto(S(“AA”)) {|s| a << s}
- assert_equal([S(“Z”), S(“AA”)], a)
end
asarih
3
e$B@uN$$G$9!#e(B
2009/11/2 Nobuyoshi N. [email protected]:
e$B$J$+$@$G$9!#e(B
At Mon, 2 Nov 2009 16:19:40 +0900,
Hiro A. wrote in [ruby-dev:39604]:
surfboard:~$ ruby1.9 -v; ruby1.9 -e ‘p (“Z”…“Z”.succ); p (“Z”…“Z”.succ).to_a’
ruby 1.9.2dev (2009-11-02 trunk 25625) [x86_64-darwin10.0.0]
“Z”…“AA”
[]
e$B$3$s$J$H$3$m$G$7$g$&$+!#e(B
e$B$3$N%Q%C%A$G7o$NLdBj$O2r7h$5$l$F$$$^$9$,!"$A$g$C$HJL$J$H$3$m$GLdBj$K$J$k$+$b$7$l$^$;$s!#e(B
e$B$3$N%Q%C%A$rEv$F$F$_$?$H$3$m!“e(B"Z”…"a"e$B$O6u$G$9!#e(B1.8e$B$G$Oe(B[“Z”]e$B$,JV$C$F$-$^$9!#e(B
e$B99$K!"e(B
http://redmine.ruby-lang.org/issues/show/1891e$B$K$"$k$h$&$K!"e(B
e$B%Q%C%AL5$7$G$Oe(B[“Z”, “[”, “\”, “]”, “^”, “_”, “`”,
“a”]e$B$G$9!#e(B
e$B$3$l$KBP1~$7$?%j%S%8%g%s!Je(Br24573e$B!K$G$O2C$($Fe(B:Z…:ae$B$,G’$a$i$l$F$$$F!“e(B
e$B$=$l$K$O%”%9%-!<G[Ns$KB’$C$?%7%s%%k$,4^$^$l$F$$$^$9!#e(B
e$B8D?ME*$K$Oe(B"Z".succe$B$,e(B"AA"e$B$G$"$k$J$i$P!"Fs$D0J>e$NMWAG$r;}$De(B"Z"e$B$+$i;O$^$ke(BRangee$B$Oe(B"AA"e$B$r4^$`$Y$-$@$H9M$($^$9!#e(B
Rangee$B$rH>=g=x=89g$KDj5A$9$k$N$b2DG=$H$O;W$$$^$9$,!“FCJL$JF0$-$r$9$k;v$,$”$k$N$J$i$P!"e(B
e$B$=$l$OL@3N$K=q$+$l$F$$$J$$$H:.Mp$r>7$/$H;W$$$^$9!#e(B
e$B;29M$^$G$K;XE&$7$F$*$-$^$9!#e(B
asarih
4
e$B@.@%$G$9!#e(B
Yukihiro M. wrote:
e$BJ8;zNs$Ne(BRangee$B$K$D$$$F$O!"e(B
- e$BN>C<$H$be(BASCII1e$BJ8;z$G$"$k>l9g$K$O!"e(BASCIIe$BJ8;z%3!<%IE*$J=g=xe(B
e$B$K$J$C$F$^$9!#$G!"$3$N$$$:$l$K$b$"$F$O$^$i$J$$%1!<%9$N;EMM$Oe(B
e$B@5D>3NDj$7$F$^$;$s!#6lO+$7$F$b$"$s$^$j;H$o$l$J$5$=$&$@$7!#e(B
e$BG0$N$?$aJdB-$7$F$$-$^$9$H!“e(B
Range#each e$B$N%^%K%e%”%k$K$Oe(B succ
e$B$rMQ$$$k$H=q$$$F$"$j$^$9$,!"e(B
String e$B$de(B Symbol e$B$N>l9g$O<B:]$K$Oe(B upto e$B$r8F$s$G$$j!"e(B
String#upto e$B$O>o$K$Oe(B String#succ e$B$r8F$s$G$$$^$;$s!#e(B
e$B>e5-$N$^$D$b$H$5$s$N@bL@$Oe(B String#upto e$B$N@bL@$K$J$j$^$9!#e(B
e$B8@$$49$($k$H!"e(BRange#to_a e$B$+$ie(B Range#eache$B$,8F$P$l!"e(B
range_each e$B7PM3$Ge(B String#upto e$B$K9T$C$F$$$k$N$G!"e(B
e$B$3$NLdBj$O0J2<$N$h$&$K=q$-49$($k$3$H$,=PMh$^$9!#e(B
% ruby19 -ve’“Z”.upto(“AA”){|x|p x}’
ruby 1.9.2dev (2009-11-02 trunk 25632) [x86_64-freebsd8.0]
e$B$"$H$O!"$"$kJ8;zNs$+$iJL$Ne(B
e$BJ8;zNs$Ke(Bsucce$B$NO":?$GE~C#$G$-$k$+$I$&$+4J0W$KH=Dj$G$-$k$N$G$“e(B
e$B$l$P!”$=$l$K=>$C$F=g=x$r=hM}$9$k$HNI$$$H;W$&$N$G$9$1$I!"$G$-e(B
e$B$k$s$@$C$1$+!#e(B
e$B$A$g$C$H4J0W$H$O8@$$$E$i$$5$$,$7$^$9!#e(B
e$B@h$NCfED$5$s$N%Q%C%A$@$He(B “0 0” e$B$+$iE~C#$G$-$J$$e(B “0 00”
e$B$KBP$7$F!"e(B
upto e$B$,HyL/$KF0$$$?$j$7$F$$$^$9!#e(B
“0 0”.upto(“0 00”){|x|p x}
e$B1Q?t$N4V$KHs1Q?t$,$O$5$^$C$?$j!“Hs1Q?t$,7+$j>e$,$C$F1Q?t$KFMF~$9$k%1!<%9$Oe(B
e$B$J$+$J$+Fq$7$$$h$&$K;W$$$^$9!#e(B
e$B0lEY$-$C$A$j9M$($FJ8=q2=$7$5$($9$l$P!”$"$H$O<BAu$9$k$@$1$G$O$"$j$^$9$,!#e(B
e$BBeBX0F$H$7$F!">o$Ke(B succ
e$B$r;H$&$h$&$K$7$F!"$J$s$H$J$/F0$/$h$&$K$7$D$D!“e(B
e$B$H$j$”$($:3N<B$KDd;$9$k$h$&$K$9$k$H$$$&J}K!$b$"$j$^$9$+$M!#e(B
e$BCfED$5$s$N%Q%C%A$O$=$N$h$&$J<q;]$G$"$k$h$&$K$$($^$9!#e(B
asarih
5
e$B$^$D$b$He(B e$B$f$-$R$m$G$9e(B
In message “Re: [ruby-dev:39622] Re: [Bug #2323]
“Z”…“Z”.succe$B$,6ue(B”
on Tue, 3 Nov 2009 22:22:58 +0900, Hiro A. [email protected]
writes:
|e$B8D?ME*$K$Oe(B"Z".succe$B$,e(B"AA"e$B$G$"$k$J$i$P!"Fs$D0J>e$NMWAG$r;}$De(B"Z"e$B$+$i;O$^$ke(BRangee$B$Oe(B"AA"e$B$r4^$`$Y$-$@$H9M$($^$9!#e(B
|Rangee$B$rH>=g=x=89g$KDj5A$9$k$N$b2DG=$H$O;W$$$^$9$,!“FCJL$JF0$-$r$9$k;v$,$”$k$N$J$i$P!"e(B
|e$B$=$l$OL@3N$K=q$+$l$F$$$J$$$H:.Mp$r>7$/$H;W$$$^$9!#e(B
e$BJ8;zNs$Ne(BRangee$B$K$D$$$F$O!"e(B
e$BJ8;zNs$N=g=x$NDj5A$,J#?t$"$ke(B(e$B<-=q=g$He(Bsucce$B$K$h$k$b$Ne(B)
- Rangee$B$Oe(Bsucce$B$r;H$&$,!"$3$l$OH>=g=x=89g$G$$$m$$$mLLE]e(B
e$B$H$$$&;v>p$,$"$j$^$9!#$G!“8=:_!”$A$g$C$HCfESH>C<$J>uBV$K$J$Ce(B
e$B$F$^$9!#:G=E$J;EMM$r8!F$$9$k;~4Ve(B(e$B$H$d$k5$e(B)e$B$,<h$l$J$/$F!#e(B
e$B8=>ue(B
- e$BN>C<$H$b$9$Y$Fe(BASCIIe$B?t;z$G$“$k>l9g$K$O!”?tE*$J=g=xe(B
-
e$BN>C<$H$be(BASCII1e$BJ8;z$G$"$k>l9g$K$O!"e(BASCIIe$BJ8;z%3!<%IE*$J=g=xe(B
e$B$K$J$C$F$^$9!#$G!“$3$N$$$:$l$K$b$”$F$O$^$i$J$$%1!<%9$N;EMM$Oe(B
e$B@5D>3NDj$7$F$^$;$s!#6lO+$7$F$b$"$s$^$j;H$o$l$J$5$=$&$@$7!#e(B
e$B$?$@!"e(B
e$BN>C<$,6&DL$N@hF,ItJ,$r;}$A!“Hs6&DLItJ,$,$9$Y$Fe(BASCIIe$B?t;z$Ge(B
e$B$”$k>l9g$K$O?tE*$J=g=xe(B
e$B$H$$$&$N$O:NMQ$7$h$&$H;W$C$F$^$9!#$“$H$O!”$“$kJ8;zNs$+$iJL$Ne(B
e$BJ8;zNs$Ke(Bsucce$B$NO”:?$GE~C#$G$-$k$+$I$&$+4J0W$KH=Dj$G$-$k$N$G$“e(B
e$B$l$P!”$=$l$K=>$C$F=g=x$r=hM}$9$k$HNI$$$H;W$&$N$G$9$1$I!"$G$-e(B
e$B$k$s$@$C$1$+!#e(B
e$B$^$D$b$He(B e$B$f$-$R$me(B /:|)
asarih
6
e$B%A%1%C%He(B #2323 e$B$,99?7$5$l$^$7$?!#e(B (by Yui NARUSE)
e$B%+%F%4%je(B coree$B$K%;%C%He(B
e$B%9%F!<%?%9e(B Opene$B$+$ie(BAssignede$B$KJQ99e(B
e$BC4Ev<Te(B Yukihiro M.e$B$K%;%C%He(B
e$BM%@hEYe(B Normale$B$+$ie(BLowe$B$KJQ99e(B
Ruby 1.9 Feature e$B$K0\F0$7$?>e$G!"M%@hEYe(B Low e$B$K$7$F$*$-$^$9e(B
http://redmine.ruby-lang.org/issues/show/2323