Piotr Caban : msvcrt: Fixed floating point numbers printing when flags.Sign =' '.
Alexandre Julliard
julliard at winehq.org
Wed Dec 12 15:14:54 CST 2012
Module: wine
Branch: master
Commit: d958ecbc6931cc560b5b2c562a4bcd1b1b84a68d
URL: http://source.winehq.org/git/wine.git/?a=commit;h=d958ecbc6931cc560b5b2c562a4bcd1b1b84a68d
Author: Piotr Caban <piotr at codeweavers.com>
Date: Wed Dec 12 11:15:12 2012 +0100
msvcrt: Fixed floating point numbers printing when flags.Sign=' '.
---
dlls/msvcrt/printf.h | 40 +++++++++++++++++++++++-----------------
dlls/msvcrt/tests/printf.c | 20 ++++++++++++++++++++
2 files changed, 43 insertions(+), 17 deletions(-)
diff --git a/dlls/msvcrt/printf.h b/dlls/msvcrt/printf.h
index 0500360..d02115e 100644
--- a/dlls/msvcrt/printf.h
+++ b/dlls/msvcrt/printf.h
@@ -78,7 +78,7 @@ static inline int FUNC_NAME(pf_fill)(FUNC_NAME(puts_clbk) pf_puts, void *puts_ct
{
int i, r = 0, written;
- if(flags->Sign && !(flags->Format=='d' || flags->Format=='i'))
+ if(flags->Sign && !strchr("diaeEfgG", flags->Format))
flags->Sign = 0;
if(left && flags->Sign) {
@@ -228,18 +228,8 @@ static inline int FUNC_NAME(pf_handle_string)(FUNC_NAME(puts_clbk) pf_puts, void
static inline void FUNC_NAME(pf_rebuild_format_string)(char *p, FUNC_NAME(pf_flags) *flags)
{
*p++ = '%';
- if(flags->Sign)
- *p++ = flags->Sign;
- if(flags->LeftAlign)
- *p++ = flags->LeftAlign;
if(flags->Alternate)
*p++ = flags->Alternate;
- if(flags->PadZero)
- *p++ = flags->PadZero;
- if(flags->FieldLength) {
- sprintf(p, "%d", flags->FieldLength);
- p += strlen(p);
- }
if(flags->Precision >= 0) {
sprintf(p, ".%d", flags->Precision);
p += strlen(p);
@@ -541,8 +531,9 @@ int FUNC_NAME(pf_printf)(FUNC_NAME(puts_clbk) pf_puts, void *puts_ctx, const API
HeapFree(GetProcessHeap(), 0, tmp);
} else if(flags.Format && strchr("aeEfgG", flags.Format)) {
char float_fmt[20], buf_a[32], *tmp = buf_a, *decimal_point;
- int max_len = (flags.FieldLength>flags.Precision ? flags.FieldLength : flags.Precision) + 10;
+ int len = flags.Precision + 10;
double val = pf_args(args_ctx, pos, VT_R8, valist).get_double;
+ int r;
if(flags.Format=='f') {
if(val>-10.0 && val<10.0)
@@ -552,16 +543,20 @@ int FUNC_NAME(pf_printf)(FUNC_NAME(puts_clbk) pf_puts, void *puts_ctx, const API
/* Default precision is 6, additional space for sign, separator and nullbyte is required */
i += (flags.Precision==-1 ? 6 : flags.Precision) + 3;
- if(i > max_len)
- max_len = i;
+ if(i > len)
+ len = i;
}
- if(max_len > sizeof(buf_a))
- tmp = HeapAlloc(GetProcessHeap(), 0, max_len);
+ if(len > sizeof(buf_a))
+ tmp = HeapAlloc(GetProcessHeap(), 0, len);
if(!tmp)
return -1;
FUNC_NAME(pf_rebuild_format_string)(float_fmt, &flags);
+ if(val < 0) {
+ flags.Sign = '-';
+ val = -val;
+ }
sprintf(tmp, float_fmt, val);
if(toupper(flags.Format)=='E' || toupper(flags.Format)=='G')
@@ -571,9 +566,20 @@ int FUNC_NAME(pf_printf)(FUNC_NAME(puts_clbk) pf_puts, void *puts_ctx, const API
if(decimal_point)
*decimal_point = *locinfo->lconv->decimal_point;
- i = FUNC_NAME(pf_output_str)(pf_puts, puts_ctx, tmp, strlen(tmp), locinfo);
+ len = strlen(tmp);
+ i = FUNC_NAME(pf_fill)(pf_puts, puts_ctx, len, &flags, TRUE);
+ if(i < 0)
+ return i;
+ r = FUNC_NAME(pf_output_str)(pf_puts, puts_ctx, tmp, len, locinfo);
+ if(r < 0)
+ return r;
+ i += r;
if(tmp != buf_a)
HeapFree(GetProcessHeap(), 0, tmp);
+ r = FUNC_NAME(pf_fill)(pf_puts, puts_ctx, len, &flags, FALSE);
+ if(r < 0)
+ return r;
+ i += r;
} else {
if(invoke_invalid_param_handler) {
MSVCRT__invalid_parameter(NULL, NULL, NULL, 0, 0);
diff --git a/dlls/msvcrt/tests/printf.c b/dlls/msvcrt/tests/printf.c
index 1507a01..7780327 100644
--- a/dlls/msvcrt/tests/printf.c
+++ b/dlls/msvcrt/tests/printf.c
@@ -515,6 +515,26 @@ static void test_sprintf( void )
ok(!strcmp(buffer,"8.6000e+000"), "failed\n");
ok( r==11, "return count wrong\n");
+ format = "% 2.4e";
+ r = sprintf(buffer, format,8.6);
+ ok(!strcmp(buffer," 8.6000e+000"), "failed: %s\n", buffer);
+ ok( r==12, "return count wrong\n");
+
+ format = "% 014.4e";
+ r = sprintf(buffer, format,8.6);
+ ok(!strcmp(buffer," 008.6000e+000"), "failed: %s\n", buffer);
+ ok( r==14, "return count wrong\n");
+
+ format = "% 2.4e";
+ r = sprintf(buffer, format,-8.6);
+ ok(!strcmp(buffer,"-8.6000e+000"), "failed: %s\n", buffer);
+ ok( r==12, "return count wrong\n");
+
+ format = "%+2.4e";
+ r = sprintf(buffer, format,8.6);
+ ok(!strcmp(buffer,"+8.6000e+000"), "failed: %s\n", buffer);
+ ok( r==12, "return count wrong\n");
+
format = "%2.4g";
r = sprintf(buffer, format,8.6);
ok(!strcmp(buffer,"8.6"), "failed\n");
More information about the wine-cvs
mailing list