From: Tadashi Saito Date: 2008-10-25T02:31:20+09:00 Subject: [ruby-dev:36913] dtoa() / freedtoa() の改造 斎藤と申します。 [ruby-dev:32792]の、C API 名前空間のお話の続きです。 10ヶ月前の話で、しかもABIフリーズまで24時間なくて、すみません。 取りこめる範囲だけで結構です。 util.cのfreedtoa()は、名前から察するに同ファイルのdtoa()の内部だけで使われる事を 意図しているのではないでしょうか。staticにしてほしいです。 またdtoa()も、外部に出す必要があるならばprefixを付けてほしいです。util.cの他の 関数を見るならば、ruby_でしょうか。 …というところまでが末尾のパッチの範囲なのですが、疑問に残る点があります。 dtoa()が使われるのはどうもmissing/vsnprintf.cの中、つまりvsnprintf() (とsnprintf()) が使えない環境のみのようです。 しかしvsnprintf()が存在するような自分の環境でも、使われないdtoa()が定義されて います。これは本来、必要ない事ではないでしょうか。 思うに、sprintf.cでHAVE_*をチェックせずに #include "missing/vsnprintf.c" しているのが問題だと思うのですが、これにはどんな理由があるのでしょうか。 自分にはちょっと分かりませんでした。 とりあえず * freedtoa()を staticに * dtoa()を ruby_dtoa()に するパッチが以下です。検討いただけるとありがたく思います。 Index: sprintf.c =================================================================== --- sprintf.c (revision 19921) +++ sprintf.c (working copy) @@ -1083,7 +1083,7 @@ #undef vsnprintf #undef snprintf #define FLOATING_POINT 1 -#define BSD__dtoa dtoa +#define BSD__dtoa ruby_dtoa #include "missing/vsnprintf.c" static int Index: util.c =================================================================== --- util.c (revision 19921) +++ util.c (working copy) @@ -3092,7 +3092,7 @@ * when MULTIPLE_THREADS is not defined. */ -void +static void freedtoa(char *s) { Bigint *b = (Bigint *)((int *)s - 1); @@ -3139,7 +3139,7 @@ */ char * -dtoa(double d, int mode, int ndigits, int *decpt, int *sign, char **rve) +ruby_dtoa(double d, int mode, int ndigits, int *decpt, int *sign, char **rve) { /* Arguments ndigits, decpt, sign are similar to those of ecvt and fcvt; trailing zeros are suppressed from -- 斎藤ただし