Jon Griffiths : msvcrt: Fix exponents in *printf family.
Alexandre Julliard
julliard at winehq.org
Wed Jul 16 13:33:06 CDT 2008
Module: wine
Branch: master
Commit: 8e86162be59d999b35a5d8664bee22ceda5b75a8
URL: http://source.winehq.org/git/wine.git/?a=commit;h=8e86162be59d999b35a5d8664bee22ceda5b75a8
Author: Jon Griffiths <jon_p_griffiths at yahoo.com>
Date: Sun Jul 13 10:35:37 2008 -0700
msvcrt: Fix exponents in *printf family.
---
dlls/msvcrt/tests/printf.c | 26 +++++++++++++++++---------
dlls/msvcrt/wcs.c | 43 +++++++++++++++++++++++++++++++++++++++++++
2 files changed, 60 insertions(+), 9 deletions(-)
diff --git a/dlls/msvcrt/tests/printf.c b/dlls/msvcrt/tests/printf.c
index 846b844..d7abacd 100644
--- a/dlls/msvcrt/tests/printf.c
+++ b/dlls/msvcrt/tests/printf.c
@@ -39,11 +39,24 @@ static void test_sprintf( void )
format = "%+#23.15e";
r = sprintf(buffer,format,pnumber);
- todo_wine {
- ok(!strcmp(buffer,"+7.894561230000000e+008"),"exponent format incorrect\n");
- }
+ ok(!strcmp(buffer,"+7.894561230000000e+008"),"+#23.15e failed: '%s'\n", buffer);
+ ok( r==23, "return count wrong\n");
+
+ format = "%-#23.15e";
+ r = sprintf(buffer,format,pnumber);
+ ok(!strcmp(buffer,"7.894561230000000e+008 "),"-#23.15e failed: '%s'\n", buffer);
+ ok( r==23, "return count wrong\n");
+
+ format = "%#23.15e";
+ r = sprintf(buffer,format,pnumber);
+ ok(!strcmp(buffer," 7.894561230000000e+008"),"#23.15e failed: '%s'\n", buffer);
ok( r==23, "return count wrong\n");
+ format = "%#1.1g";
+ r = sprintf(buffer,format,pnumber);
+ ok(!strcmp(buffer,"8.e+008"),"#1.1g failed: '%s'\n", buffer);
+ ok( r==7, "return count wrong\n");
+
format = "%I64d";
r = sprintf(buffer,format,((ULONGLONG)0xffffffff)*0xffffffff);
ok(!strcmp(buffer,"-8589934591"),"Problem with long long\n");
@@ -401,12 +414,10 @@ static void test_sprintf( void )
ok(!strcmp(buffer,"1"), "failed\n");
ok( r==1, "return count wrong\n");
- todo_wine {
format = "%2.4e";
r = sprintf(buffer, format,8.6);
ok(!strcmp(buffer,"8.6000e+000"), "failed\n");
ok( r==11, "return count wrong\n");
- }
format = "%2.4g";
r = sprintf(buffer, format,8.6);
@@ -507,10 +518,7 @@ static void test_swprintf( void )
const wchar_t hs[] = {'%', 'h', 's', 0};
swprintf(buffer,TwentyThreePoint15e,pnumber);
- todo_wine
- {
- ok(wcsstr(buffer,e008) != 0,"Sprintf different\n");
- }
+ ok(wcsstr(buffer,e008) != 0,"Sprintf different\n");
swprintf(buffer,I64d,((ULONGLONG)0xffffffff)*0xffffffff);
ok(wcslen(buffer) == 11,"Problem with long long\n");
swprintf(buffer,S,string);
diff --git a/dlls/msvcrt/wcs.c b/dlls/msvcrt/wcs.c
index 14daf90..8eccb39 100644
--- a/dlls/msvcrt/wcs.c
+++ b/dlls/msvcrt/wcs.c
@@ -481,6 +481,45 @@ static void pf_integer_conv( char *buf, int buf_len, pf_flags *flags,
return;
}
+/* pf_fixup_exponent: convert a string containing a 2 digit exponent
+ to 3 digits, accounting for padding, in place. Needed to match
+ the native printf's which always use 3 digits. */
+static void pf_fixup_exponent( char *buf )
+{
+ char* tmp = buf;
+
+ while (tmp[0] && toupper(tmp[0]) != 'E')
+ tmp++;
+
+ if (tmp[0] && (tmp[1] == '+' || tmp[1] == '-') &&
+ isdigit(tmp[2]) && isdigit(tmp[3]))
+ {
+ char final;
+
+ if (isdigit(tmp[4]))
+ return; /* Exponent already 3 digits */
+
+ /* We have a 2 digit exponent. Prepend '0' to make it 3 */
+ tmp += 2;
+ final = tmp[2];
+ tmp[2] = tmp[1];
+ tmp[1] = tmp[0];
+ tmp[0] = '0';
+ if (final == '\0')
+ {
+ /* We didn't expand into trailing space, so this string isn't left
+ * justified. Terminate the string and strip a ' ' at the start of
+ * the string if there is one (as there may be if the string is
+ * right justified).
+ */
+ tmp[3] = '\0';
+ if (buf[0] == ' ')
+ memmove(buf, buf + 1, (tmp - buf) + 3);
+ }
+ /* Otherwise, we expanded into trailing space -> nothing to do */
+ }
+}
+
/*********************************************************************
* pf_vsnprintf (INTERNAL)
*
@@ -693,7 +732,11 @@ static int pf_vsnprintf( pf_output *out, const WCHAR *format, va_list valist )
pf_rebuild_format_string( fmt, &flags );
if( pf_is_double_format( flags.Format ) )
+ {
sprintf( x, fmt, va_arg(valist, double) );
+ if (toupper(flags.Format) == 'E' || toupper(flags.Format) == 'G')
+ pf_fixup_exponent( x );
+ }
else
sprintf( x, fmt, va_arg(valist, int) );
More information about the wine-cvs
mailing list