[#15625] rb_hash_initialize — Takaaki Tateishi <ttate@...>

立石です.

22 messages 2002/01/04
[#15627] Re: rb_hash_initialize — matz@... (Yukihiro Matsumoto) 2002/01/04

まつもと ゆきひろです

[#15628] Re: rb_hash_initialize — Takaaki Tateishi <ttate@...> 2002/01/04

立石です.

[#15685] undefined method `inherited' for false (NameError) — WATANABE Hirofumi <eban@...>

わたなべです。

13 messages 2002/01/15
[#15686] Re: undefined method `inherited' for false (NameError) — nobu.nakada@... 2002/01/15

なかだです。

[#15757] 文字列→整数変換 — nobu.nakada@...

なかだです。

30 messages 2002/01/25

[#15830] [ 提案 ] puts, print 等を IO から分離 — UENO Katsuhiro <unnie@...>

うえのです。

14 messages 2002/01/31

[ruby-dev:15684] Integer()/Float()

From: nobu.nakada@...
Date: 2002-01-15 12:22:03 UTC
List: ruby-dev #15684
なかだです。

2001/01/04の変更でInteger("0x ")がエラーにならなくなってますが、
これは意図的でしょうか。これはどう見てもエラーじゃないかと思え
るのですが。

Index: bignum.c
===================================================================
RCS file: /cvs/ruby/src/ruby/bignum.c,v
retrieving revision 1.49
retrieving revision 1.50
diff -u -2 -p -I$Author -I$Date -Irb_raise -Irb_invalid_str -r1.49 -r1.50
--- bignum.c	2001/12/27 09:53:54	1.49
+++ bignum.c	2002/01/04 14:14:34	1.50
@@ -253,6 +253,6 @@ rb_cstr2inum(str, base)
 	if (*end == '_') goto bigparse;
 	if (badcheck) {
-	    if (end == str) goto bad; /* no number */
 	    while (*end && ISSPACE(*end)) end++;
+	    if (end == str) goto bad; /* no number */
 	    if (*end) {		      /* trailing garbage */
 	      bad:

それともう一つ、Float("0x_0")みたいのもエラーになりません。数字
に挟まれた"_"だけ無視するようにしたほうがいいのでは。


Index: object.c
===================================================================
RCS file: /cvs/ruby/src/ruby/object.c,v
retrieving revision 1.67
diff -u -2 -p -r1.67 object.c
--- object.c	2002/01/11 09:18:50	1.67
+++ object.c	2002/01/14 15:20:41
@@ -967,5 +967,4 @@ rb_Float(val)
 	    q = p = StringValuePtr(val);
 	    while (*p && ISSPACE(*p)) p++;
-	  again:
 	    d = strtod(p, &end);
 	    if (p == end) {
@@ -976,10 +975,17 @@ rb_Float(val)
 		if (*end == '_') {
 		    char *buf = ALLOCA_N(char, strlen(p));
-		    char *n = buf, *last;
+		    char *n = buf, *last = p;
 
+		    while (p < end) *n++ = *p++;
 		    while (*p) {
-			if (*p == '_') {
+			if (*p == '_' && (n > buf && ISDIGIT(n[-1]))) {
+			    /* remove underscores between digits */
 			    last = ++p;
-			    continue;
+			    while (*p == '_') ++p;
+			    if (!ISDIGIT(*p)) {
+				while (last < p) *n++ = *last++;
+				continue;
+			    }
+			    last = p;
 			}
 			*n++ = *p++;
@@ -990,5 +996,6 @@ rb_Float(val)
 		    *n = '\0';
 		    p = buf;
-		    goto again;
+		    d = strtod(p, &end);
+		    if (p == end) goto bad;
 		}
 		while (*end && ISSPACE(*end)) end++;


-- 
--- 僕の前にBugはない。
--- 僕の後ろにBugはできる。
    中田 伸悦

In This Thread

Prev Next