[#36672] [Bug #616] instance_eval and Module#to_s — Shyouhei Urabe <redmine@...>

Bug #616: instance_eval and Module#to_s

12 messages 2008/10/06

[#36750] [Bug #650] Marshal.load raises RegexpError — Shyouhei Urabe <redmine@...>

Bug #650: Marshal.load raises RegexpError

30 messages 2008/10/15
[#36769] Re: [Bug #650] Marshal.load raises RegexpError — Yukihiro Matsumoto <matz@...> 2008/10/17

まつもと ゆきひろです

[#36771] Re: [Bug #650] Marshal.load raises RegexpError — Urabe Shyouhei <shyouhei@...> 2008/10/17

卜部です。

[#36772] Re: [Bug #650] Marshal.load raises RegexpError — Yukihiro Matsumoto <matz@...> 2008/10/17

まつもと ゆきひろです

[#36773] Re: [Bug #650] Marshal.load raises RegexpError — Urabe Shyouhei <shyouhei@...> 2008/10/17

卜部です。

[#36784] Re: [Bug #650] Marshal.load raises RegexpError — Yukihiro Matsumoto <matz@...> 2008/10/18

まつもと ゆきひろです

[#36785] Re: [Bug #650] Marshal.load raises RegexpError — Urabe Shyouhei <shyouhei@...> 2008/10/18

卜部です。

[#36793] Re: [Bug #650] Marshal.load raises RegexpError — Yukihiro Matsumoto <matz@...> 2008/10/19

まつもと ゆきひろです

[#36794] Re: [Bug #650] Marshal.load raises RegexpError — Urabe Shyouhei <shyouhei@...> 2008/10/19

Yukihiro Matsumoto さんは書きました:

[#36823] Re: [Bug #650] Marshal.load raises RegexpError — Yukihiro Matsumoto <matz@...> 2008/10/21

まつもと ゆきひろです

[#36830] Re: [Bug #650] Marshal.load raises RegexpError — Urabe Shyouhei <shyouhei@...> 2008/10/21

もとの正規表現にバグがあるのは認めますが、それに巻き込まれてでかいPStore

[#36833] Re: [Bug #650] Marshal.load raises RegexpError — Yukihiro Matsumoto <matz@...> 2008/10/21

まつもと ゆきひろです

[#36764] Re: [ruby-cvs:27036] Ruby:r19818 (trunk): * transcode.c (str_transcode0): String#encode without argument now — Martin Duerst <duerst@...>

まつもとさん、こんばんは。

11 messages 2008/10/17
[#36767] Re: [ruby-cvs:27036] Ruby:r19818 (trunk): * transcode.c (str_transcode0): String#encode without argument now — Yukihiro Matsumoto <matz@...> 2008/10/17

まつもと ゆきひろです

[#36799] Re: [ruby-cvs:27036] Ruby:r19818 (trunk): * transcode.c (str_transcode0): String#encode without argument now — Martin Duerst <duerst@...> 2008/10/20

まつもとさん、こんにちは。

[#36774] ConverterNotFoundError while making Ruby in Windows(trunk) — Masaki Suketa <masaki.suketa@...>

助田です。

13 messages 2008/10/17
[#36797] Re: ConverterNotFoundError while making Ruby in Windows(trunk) — "U.Nakamura" <usa@...> 2008/10/20

こんにちは、なかむら(う)です。

[#36800] Re: ConverterNotFoundError while making Ruby in Windows(trunk) — "U.Nakamura" <usa@...> 2008/10/20

こんにちは、なかむら(う)です。

[#36789] [Bug #660] 数字を3桁ずつコンマで区切るsprintf書式指定 — "rubikitch ." <redmine@...>

Bug #660: 数字を3桁ずつコンマで区切るsprintf書式指定

13 messages 2008/10/19

[#37007] [Bug:1.9] 1+1+1+...+1 dumps core — "Yusuke ENDOH" <mame@...>

遠藤です。

13 messages 2008/10/31

[ruby-dev:36935] Re: [Bug #6] sprintf() of %f on Windows(MSVCRT)

From: wanabe <s.wanabe@...>
Date: 2008-10-26 11:42:54 UTC
List: ruby-dev #36935
ワナベです。

2008/10/26 15:45 Nobuyoshi Nakada <nobu@ruby-lang.org>:
> At Sun, 26 Oct 2008 10:35:17 +0900,
> _ wanabe wrote in [ruby-dev:36932]:
>> vsnprintf.c 中の vsnprintf を外に出すやり方があまりうまくないように思うので
>> 何かうまい方法をご存知の方は教えていただけるとありがたいです。
>
> win32/Makefile.subのHAVE_VSNPRINTFを消せばmissingのほうを使うよ
> うになるはずです。

mingw では configure で生成されたconfig.h を使うようですし
bcc では msvcrt を使わないようなので、それは最後の手段にしたいと思います。
ですがアドバイスのおかげでうまくいかない原因がわかりました。ありがとうございます。
vsnprintf を rb_win32_vsnprintf で上書きしなければいいだけだったようです。

> ちなみに、missing/vsnprintf.cへの修正はどういうものでしょうか。

説明不足でした。すみません。
test_sprintf_comb.rb が通るように修正しました。具体的には以下の通りです。

(1) sprintf("%e", -1.0000000000000000159e+100)
 ->修正前:"-1e+100" 修正後:"-1.000000e+100"
(2) sprintf("%.0f", 0.010000000000000000208)
 ->修正前:"0." 修正後:"0"
(3) sprintf("% #+-0.f", -0)
 ->修正前:"-0" 修正後:"-0."
(4) sprintf("%.0G", 1)
 ->修正前:"1E+00" 修正後:"1"

ですが今見直してみると、(1)の修正法が冗長かつ意味不明でしたので
先の rb_win32_vsnprintf の件と併せてパッチを書き直しました。

Index: include/ruby/win32.h
===================================================================
--- include/ruby/win32.h	(revision 19941)
+++ include/ruby/win32.h	(working copy)
@@ -243,7 +243,11 @@
 extern void   rb_w32_free_environ(char **);
 extern int    rb_w32_map_errno(DWORD);

+#if (defined(_MSC_VER) && defined(_DLL)) || defined(__MSVCRT__)
+#undef HAVE_VSNPRINTF
+#else
 #define vsnprintf(s,n,f,l) rb_w32_vsnprintf(s,n,f,l)
+#endif
 #define snprintf   rb_w32_snprintf
 extern int rb_w32_vsnprintf(char *, size_t, const char *, va_list);
 extern int rb_w32_snprintf(char *, size_t, const char *, ...);
Index: sprintf.c
===================================================================
--- sprintf.c	(revision 19941)
+++ sprintf.c	(working copy)
@@ -1018,7 +1018,7 @@
 		need += 20;

 		CHECK(need);
-		sprintf(&buf[blen], fbuf, fval);
+		snprintf(&buf[blen], need, fbuf, fval);
 		blen += strlen(&buf[blen]);
 	    }
 	    break;
Index: numeric.c
===================================================================
--- numeric.c	(revision 19941)
+++ numeric.c	(working copy)
@@ -530,12 +530,12 @@
     else if(isnan(value))
 	return rb_usascii_str_new2("NaN");

-    sprintf(buf, "%#.15g", value); /* ensure to print decimal point */
+    snprintf(buf, 32, "%#.15g", value); /* ensure to print decimal point */
     if (!(e = strchr(buf, 'e'))) {
 	e = buf + strlen(buf);
     }
     if (!ISDIGIT(e[-1])) { /* reformat if ended with decimal point
(ex 111111111111111.) */
-	sprintf(buf, "%#.14e", value);
+	snprintf(buf, 32, "%#.14e", value);
 	if (!(e = strchr(buf, 'e'))) {
 	    e = buf + strlen(buf);
 	}
@@ -1548,7 +1548,7 @@
 	    char buf[24];
 	    char *s;

-	    sprintf(buf, "%-.10g", RFLOAT_VALUE(val));
+	    snprintf(buf, 24, "%-.10g", RFLOAT_VALUE(val));
 	    if ((s = strchr(buf, ' ')) != 0) *s = '\0';
 	    rb_raise(rb_eRangeError, "float %s out of range of integer", buf);
 	}
@@ -1694,7 +1694,7 @@
 	    char buf[24];
 	    char *s;

-	    sprintf(buf, "%-.10g", RFLOAT_VALUE(val));
+	    snprintf(buf, 24, "%-.10g", RFLOAT_VALUE(val));
 	    if ((s = strchr(buf, ' ')) != 0) *s = '\0';
 	    rb_raise(rb_eRangeError, "float %s out of range of long long", buf);
 	}
Index: missing/vsnprintf.c
===================================================================
--- missing/vsnprintf.c	(revision 19941)
+++ missing/vsnprintf.c	(working copy)
@@ -753,6 +753,8 @@
 #ifdef FLOATING_POINT
 		case 'e':		/* anomalous precision */
 		case 'E':
+			if (prec != 0)
+				flags |= ALT;
 			prec = (prec == -1) ?
 				DEFPREC + 1 : prec + 1;
 			/* FALLTHROUGH */
@@ -782,7 +784,7 @@
 			cp = cvt(_double, prec, flags, &softsign,
 				&expt, ch, &ndig);
 			if (ch == 'g' || ch == 'G') {
-				if (expt <= -4 || expt > prec)
+				if (expt <= -4 || (expt > prec && expt > 1))
 					ch = (ch == 'g') ? 'e' : 'E';
 				else
 					ch = 'g';
@@ -798,6 +800,8 @@
 					size = expt;
 					if (prec || flags & ALT)
 						size += prec + 1;
+				} else if (!prec) { /* "0" */
+					size = 1;
 				} else	/* "0.X" */
 					size = prec + 2;
 			} else if (expt >= ndig) {	/* fixed g fmt */
@@ -1008,13 +1012,15 @@
 			if (ch >= 'f') {	/* 'f' or 'g' */
 				if (_double == 0) {
 				/* kludge for __dtoa irregularity */
-					if (prec == 0 ||
+					if (ndig <= 1 &&
 					    (flags & ALT) == 0) {
 						PRINT("0", 1);
 					} else {
 						PRINT("0.", 2);
 						PAD(ndig - 1, zeroes);
 					}
+				} else if (expt == 0 && ndig == 0 && (flags & ALT) == 0) {
+					PRINT("0", 1);
 				} else if (expt <= 0) {
 					PRINT("0.", 2);
 					PAD(-expt, zeroes);


-- 
ワナベ

In This Thread