diff --git a/modules/rostests/winetests/msvcrt/printf.c b/modules/rostests/winetests/msvcrt/printf.c index 4bf55afc1ff..8a0fdde161a 100644 --- a/modules/rostests/winetests/msvcrt/printf.c +++ b/modules/rostests/winetests/msvcrt/printf.c @@ -38,24 +38,6 @@ #include "wine/test.h" -#ifndef __REACTOS__ - -static inline float __port_infinity(void) -{ - static const unsigned __inf_bytes = 0x7f800000; - return *(const float *)&__inf_bytes; -} -#define INFINITY __port_infinity() - -static inline float __port_nan(void) -{ - static const unsigned __nan_bytes = 0x7fc00000; - return *(const float *)&__nan_bytes; -} -#define NAN __port_nan() - -#endif - static inline float __port_ind(void) { static const unsigned __ind_bytes = 0xffc00000; @@ -63,11 +45,11 @@ static inline float __port_ind(void) } #define IND __port_ind() -static int (__cdecl *p__vscprintf)(const char *format, __ms_va_list valist); -static int (__cdecl *p__vscwprintf)(const wchar_t *format, __ms_va_list valist); +static int (__cdecl *p__vscprintf)(const char *format, va_list valist); +static int (__cdecl *p__vscwprintf)(const wchar_t *format, va_list valist); static int (__cdecl *p__vsnwprintf_s)(wchar_t *str, size_t sizeOfBuffer, size_t count, const wchar_t *format, - __ms_va_list valist); + va_list valist); static int (__cdecl *p__ecvt_s)(char *buffer, size_t length, double number, int ndigits, int *decpt, int *sign); static int (__cdecl *p__fcvt_s)(char *buffer, size_t length, double number, @@ -75,17 +57,17 @@ static int (__cdecl *p__fcvt_s)(char *buffer, size_t length, double number, static unsigned int (__cdecl *p__get_output_format)(void); static unsigned int (__cdecl *p__set_output_format)(unsigned int); static int (WINAPIV *p_sprintf)(char*, ...); -static int (__cdecl *p__vsprintf_p)(char*, size_t, const char*, __ms_va_list); -static int (__cdecl *p_vswprintf)(wchar_t *str, const wchar_t *format, __ms_va_list valist); -static int (__cdecl *p__vswprintf)(wchar_t *str, const wchar_t *format, __ms_va_list valist); +static int (__cdecl *p__vsprintf_p)(char*, size_t, const char*, va_list); +static int (__cdecl *p_vswprintf)(wchar_t *str, const wchar_t *format, va_list valist); +static int (__cdecl *p__vswprintf)(wchar_t *str, const wchar_t *format, va_list valist); static int (__cdecl *p__vswprintf_l)(wchar_t *str, const wchar_t *format, - void *locale, __ms_va_list valist); + void *locale, va_list valist); static int (__cdecl *p__vswprintf_c)(wchar_t *str, size_t size, const wchar_t *format, - __ms_va_list valist); + va_list valist); static int (__cdecl *p__vswprintf_c_l)(wchar_t *str, size_t size, const wchar_t *format, - void *locale, __ms_va_list valist); + void *locale, va_list valist); static int (__cdecl *p__vswprintf_p_l)(wchar_t *str, size_t size, const wchar_t *format, - void *locale, __ms_va_list valist); + void *locale, va_list valist); static void init( void ) { @@ -110,466 +92,277 @@ static void init( void ) static void test_sprintf( void ) { - char buffer[100]; - const char *format; - double pnumber=789456123; - int x, r; - WCHAR wide[] = { 'w','i','d','e',0}; - WCHAR buf_w[2]; - - format = "%+#23.15e"; - r = p_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 = p_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 = p_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 = p_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 = p_sprintf(buffer,format,((ULONGLONG)0xffffffff)*0xffffffff); - ok(!strcmp(buffer,"-8589934591"),"Problem with long long\n"); - ok( r==11, "return count wrong\n"); - - format = "%+8I64d"; - r = p_sprintf(buffer,format,(LONGLONG)100); - ok(!strcmp(buffer," +100") && r==8,"+8I64d failed: '%s'\n", buffer); - - format = "%+.8I64d"; - r = p_sprintf(buffer,format,(LONGLONG)100); - ok(!strcmp(buffer,"+00000100") && r==9,"+.8I64d failed: '%s'\n", buffer); - - format = "%+10.8I64d"; - r = p_sprintf(buffer,format,(LONGLONG)100); - ok(!strcmp(buffer," +00000100") && r==10,"+10.8I64d failed: '%s'\n", buffer); - format = "%_1I64d"; - r = p_sprintf(buffer,format,(LONGLONG)100); - ok(!strcmp(buffer,"_1I64d") && r==6,"_1I64d failed\n"); - - format = "%-1.5I64d"; - r = p_sprintf(buffer,format,(LONGLONG)-100); - ok(!strcmp(buffer,"-00100") && r==6,"-1.5I64d failed: '%s'\n", buffer); - - format = "%5I64d"; - r = p_sprintf(buffer,format,(LONGLONG)100); - ok(!strcmp(buffer," 100") && r==5,"5I64d failed: '%s'\n", buffer); - - format = "%5I64d"; - r = p_sprintf(buffer,format,(LONGLONG)-100); - ok(!strcmp(buffer," -100") && r==5,"5I64d failed: '%s'\n", buffer); - - format = "%-5I64d"; - r = p_sprintf(buffer,format,(LONGLONG)100); - ok(!strcmp(buffer,"100 ") && r==5,"-5I64d failed: '%s'\n", buffer); - - format = "%-5I64d"; - r = p_sprintf(buffer,format,(LONGLONG)-100); - ok(!strcmp(buffer,"-100 ") && r==5,"-5I64d failed: '%s'\n", buffer); - - format = "%-.5I64d"; - r = p_sprintf(buffer,format,(LONGLONG)100); - ok(!strcmp(buffer,"00100") && r==5,"-.5I64d failed: '%s'\n", buffer); - - format = "%-.5I64d"; - r = p_sprintf(buffer,format,(LONGLONG)-100); - ok(!strcmp(buffer,"-00100") && r==6,"-.5I64d failed: '%s'\n", buffer); - - format = "%-8.5I64d"; - r = p_sprintf(buffer,format,(LONGLONG)100); - ok(!strcmp(buffer,"00100 ") && r==8,"-8.5I64d failed: '%s'\n", buffer); - - format = "%-8.5I64d"; - r = p_sprintf(buffer,format,(LONGLONG)-100); - ok(!strcmp(buffer,"-00100 ") && r==8,"-8.5I64d failed: '%s'\n", buffer); - - format = "%05I64d"; - r = p_sprintf(buffer,format,(LONGLONG)100); - ok(!strcmp(buffer,"00100") && r==5,"05I64d failed: '%s'\n", buffer); - - format = "%05I64d"; - r = p_sprintf(buffer,format,(LONGLONG)-100); - ok(!strcmp(buffer,"-0100") && r==5,"05I64d failed: '%s'\n", buffer); - - format = "% I64d"; - r = p_sprintf(buffer,format,(LONGLONG)100); - ok(!strcmp(buffer," 100") && r==4,"' I64d' failed: '%s'\n", buffer); - - format = "% I64d"; - r = p_sprintf(buffer,format,(LONGLONG)-100); - ok(!strcmp(buffer,"-100") && r==4,"' I64d' failed: '%s'\n", buffer); - - format = "% 5I64d"; - r = p_sprintf(buffer,format,(LONGLONG)100); - ok(!strcmp(buffer," 100") && r==5,"' 5I64d' failed: '%s'\n", buffer); - - format = "% 5I64d"; - r = p_sprintf(buffer,format,(LONGLONG)-100); - ok(!strcmp(buffer," -100") && r==5,"' 5I64d' failed: '%s'\n", buffer); - - format = "% .5I64d"; - r = p_sprintf(buffer,format,(LONGLONG)100); - ok(!strcmp(buffer," 00100") && r==6,"' .5I64d' failed: '%s'\n", buffer); - - format = "% .5I64d"; - r = p_sprintf(buffer,format,(LONGLONG)-100); - ok(!strcmp(buffer,"-00100") && r==6,"' .5I64d' failed: '%s'\n", buffer); - - format = "% 8.5I64d"; - r = p_sprintf(buffer,format,(LONGLONG)100); - ok(!strcmp(buffer," 00100") && r==8,"' 8.5I64d' failed: '%s'\n", buffer); - - format = "% 8.5I64d"; - r = p_sprintf(buffer,format,(LONGLONG)-100); - ok(!strcmp(buffer," -00100") && r==8,"' 8.5I64d' failed: '%s'\n", buffer); - - format = "%.0I64d"; - r = p_sprintf(buffer,format,(LONGLONG)0); - ok(r==0,".0I64d failed: '%s'\n", buffer); - - format = "%#+21.18I64x"; - r = p_sprintf(buffer,format,(LONGLONG)-100); - ok(!strcmp(buffer," 0x00ffffffffffffff9c") && r==21,"#+21.18I64x failed: '%s'\n", buffer); - - format = "%#.25I64o"; - r = p_sprintf(buffer,format,(LONGLONG)-100); - ok(!strcmp(buffer,"0001777777777777777777634") && r==25,"#.25I64o failed: '%s'\n", buffer); - - format = "%#+24.20I64o"; - r = p_sprintf(buffer,format,(LONGLONG)-100); - ok(!strcmp(buffer," 01777777777777777777634") && r==24,"#+24.20I64o failed: '%s'\n", buffer); - - format = "%#+18.21I64X"; - r = p_sprintf(buffer,format,(LONGLONG)-100); - ok(!strcmp(buffer,"0X00000FFFFFFFFFFFFFF9C") && r==23,"#+18.21I64X failed: '%s '\n", buffer); - - format = "%#+20.24I64o"; - r = p_sprintf(buffer,format,(LONGLONG)-100); - ok(!strcmp(buffer,"001777777777777777777634") && r==24,"#+20.24I64o failed: '%s'\n", buffer); - - format = "%#+25.22I64u"; - r = p_sprintf(buffer,format,(LONGLONG)-1); - ok(!strcmp(buffer," 0018446744073709551615") && r==25,"#+25.22I64u conversion failed: '%s'\n", buffer); - - format = "%#+25.22I64u"; - r = p_sprintf(buffer,format,(LONGLONG)-1); - ok(!strcmp(buffer," 0018446744073709551615") && r==25,"#+25.22I64u failed: '%s'\n", buffer); - - format = "%#+30.25I64u"; - r = p_sprintf(buffer,format,(LONGLONG)-1); - ok(!strcmp(buffer," 0000018446744073709551615") && r==30,"#+30.25I64u failed: '%s'\n", buffer); - - format = "%+#25.22I64d"; - r = p_sprintf(buffer,format,(LONGLONG)-1); - ok(!strcmp(buffer," -0000000000000000000001") && r==25,"+#25.22I64d failed: '%s'\n", buffer); - - format = "%#-8.5I64o"; - r = p_sprintf(buffer,format,(LONGLONG)100); - ok(!strcmp(buffer,"00144 ") && r==8,"-8.5I64o failed: '%s'\n", buffer); - - format = "%#-+ 08.5I64d"; - r = p_sprintf(buffer,format,(LONGLONG)100); - ok(!strcmp(buffer,"+00100 ") && r==8,"'#-+ 08.5I64d failed: '%s'\n", buffer); - - format = "%#-+ 08.5I64d"; - r = p_sprintf(buffer,format,(LONGLONG)100); - ok(!strcmp(buffer,"+00100 ") && r==8,"#-+ 08.5I64d failed: '%s'\n", buffer); - - format = "%.80I64d"; - r = p_sprintf(buffer,format,(LONGLONG)1); - ok(r==80,"%s format failed\n", format); - - format = "% .80I64d"; - r = p_sprintf(buffer,format,(LONGLONG)1); - ok(r==81,"%s format failed\n", format); - - format = "% .80d"; - r = p_sprintf(buffer,format,1); - ok(r==81,"%s format failed\n", format); - - format = "%lld"; - r = p_sprintf(buffer,format,((ULONGLONG)0xffffffff)*0xffffffff); - ok( r == 1 || r == 11, "return count wrong %d\n", r); - if (r == 11) /* %ll works on Vista */ - ok(!strcmp(buffer, "-8589934591"), "Problem with \"ll\" interpretation '%s'\n", buffer); - else - ok(!strcmp(buffer, "1"), "Problem with \"ll\" interpretation '%s'\n", buffer); + enum { + NO_ARG, + INT_ARG, + ULONGLONG_ARG, + DOUBLE_ARG, + PTR_ARG, + TODO_FLAG = 0x1000 + }; - format = "%I"; - r = p_sprintf(buffer,format,1); - ok(!strcmp(buffer, "I"), "Problem with \"I\" interpretation\n"); - ok( r==1, "return count wrong\n"); + struct { + const char *format; + const char *out; + const char *broken; + int type; + int arg_i; + ULONGLONG arg_ull; + double arg_d; + const void *arg_ptr; + } tests[] = { + { "%+#23.15e", "+7.894561230000000e+008", 0, DOUBLE_ARG, 0, 0, 789456123 }, + { "%-#23.15e", "7.894561230000000e+008 ", 0, DOUBLE_ARG, 0, 0, 789456123 }, + { "%#23.15e", " 7.894561230000000e+008", 0, DOUBLE_ARG, 0, 0, 789456123 }, + { "%#1.1g", "8.e+008", 0, DOUBLE_ARG, 0, 0, 789456123 }, + { "%I64d", "-8589934591", 0, ULONGLONG_ARG, 0, ((ULONGLONG)0xffffffff)*0xffffffff }, + { "%+8I64d", " +100", 0, ULONGLONG_ARG, 0, 100 }, + { "%+.8I64d", "+00000100", 0, ULONGLONG_ARG, 0, 100 }, + { "%+10.8I64d", " +00000100", 0, ULONGLONG_ARG, 0, 100 }, + { "%_1I64d", "_1I64d", 0, ULONGLONG_ARG, 0, 100 }, + { "%-1.5I64d", "-00100", 0, ULONGLONG_ARG, 0, -100 }, + { "%5I64d", " 100", 0, ULONGLONG_ARG, 0, 100 }, + { "%5I64d", " -100", 0, ULONGLONG_ARG, 0, -100 }, + { "%-5I64d", "100 ", 0, ULONGLONG_ARG, 0, 100 }, + { "%-5I64d", "-100 ", 0, ULONGLONG_ARG, 0, -100 }, + { "%-.5I64d", "00100", 0, ULONGLONG_ARG, 0, 100 }, + { "%-.5I64d", "-00100", 0, ULONGLONG_ARG, 0, -100 }, + { "%-8.5I64d", "00100 ", 0, ULONGLONG_ARG, 0, 100 }, + { "%-8.5I64d", "-00100 ", 0, ULONGLONG_ARG, 0, -100 }, + { "%05I64d", "00100", 0, ULONGLONG_ARG, 0, 100 }, + { "%05I64d", "-0100", 0, ULONGLONG_ARG, 0, -100 }, + { "% I64d", " 100", 0, ULONGLONG_ARG, 0, 100 }, + { "% I64d", "-100", 0, ULONGLONG_ARG, 0, -100 }, + { "% 5I64d", " 100", 0, ULONGLONG_ARG, 0, 100 }, + { "% 5I64d", " -100", 0, ULONGLONG_ARG, 0, -100 }, + { "% .5I64d", " 00100", 0, ULONGLONG_ARG, 0, 100 }, + { "% .5I64d", "-00100", 0, ULONGLONG_ARG, 0, -100 }, + { "% 8.5I64d", " 00100", 0, ULONGLONG_ARG, 0, 100 }, + { "% 8.5I64d", " -00100", 0, ULONGLONG_ARG, 0, -100 }, + { "%.0I64d", "", 0, ULONGLONG_ARG }, + { "%#+21.18I64x", " 0x00ffffffffffffff9c", 0, ULONGLONG_ARG, 0, -100 }, + { "%#.25I64o", "0001777777777777777777634", 0, ULONGLONG_ARG, 0, -100 }, + { "%#+24.20I64o", " 01777777777777777777634", 0, ULONGLONG_ARG, 0, -100 }, + { "%#+18.21I64X", "0X00000FFFFFFFFFFFFFF9C", 0, ULONGLONG_ARG, 0, -100 }, + { "%#+20.24I64o", "001777777777777777777634", 0, ULONGLONG_ARG, 0, -100 }, + { "%#+25.22I64u", " 0018446744073709551615", 0, ULONGLONG_ARG, 0, -1 }, + { "%#+25.22I64u", " 0018446744073709551615", 0, ULONGLONG_ARG, 0, -1 }, + { "%#+30.25I64u", " 0000018446744073709551615", 0, ULONGLONG_ARG, 0, -1 }, + { "%+#25.22I64d", " -0000000000000000000001", 0, ULONGLONG_ARG, 0, -1 }, + { "%#-8.5I64o", "00144 ", 0, ULONGLONG_ARG, 0, 100 }, + { "%#-+ 08.5I64d", "+00100 ", 0, ULONGLONG_ARG, 0, 100 }, + { "%.80I64d", + "00000000000000000000000000000000000000000000000000000000000000000000000000000001", + 0, ULONGLONG_ARG, 0, 1 }, + { "% .80I64d", + " 00000000000000000000000000000000000000000000000000000000000000000000000000000001", + 0, ULONGLONG_ARG, 0, 1 }, + { "% .80d", + " 00000000000000000000000000000000000000000000000000000000000000000000000000000001", + 0, INT_ARG, 1 }, + { "%I", "I", 0, INT_ARG, 1 }, + { "%Iq", "Iq", 0, INT_ARG, 1 }, + { "%Ihd", "Ihd", 0, INT_ARG, 1 }, + { "%I0d", "I0d", 0, INT_ARG, 1 }, + { "%I64D", "D", 0, ULONGLONG_ARG, 0, -1 }, + { "%zx", "1", "zx", INT_ARG, 1 }, + { "%z", "z", 0, INT_ARG, 1 }, + { "%tx", "1", "tx", INT_ARG, 1 }, + { "%t", "t", 0, INT_ARG, 1 }, + { "% d", " 1", 0, INT_ARG, 1 }, + { "%+ d", "+1", 0, INT_ARG, 1 }, + { "%S", "wide", 0, PTR_ARG, 0, 0, 0, L"wide" }, + { "%04c", "0001", 0, INT_ARG, '1' }, + { "%-04c", "1 ", 0, INT_ARG, '1' }, + { "%#012x", "0x0000000001", 0, INT_ARG, 1 }, + { "%#012x", "000000000000", 0, INT_ARG, 0 }, + { "%#04.8x", "0x00000001", 0, INT_ARG, 1 }, + { "%#04.8x", "00000000", 0, INT_ARG, 0 }, + { "%#-08.2x", "0x01 ", 0, INT_ARG, 1 }, + { "%#-08.2x", "00 ", 0, INT_ARG, 0 }, + { "%#.0x", "0x1", 0, INT_ARG, 1 }, + { "%#.0x", "", 0, INT_ARG, 0 }, + { "%#08o", "00000001", 0, INT_ARG, 1 }, + { "%#o", "01", 0, INT_ARG, 1 }, + { "%#o", "0", 0, INT_ARG, 0 }, + { "%04s", "0foo", 0, PTR_ARG, 0, 0, 0, "foo" }, + { "%.1s", "f", 0, PTR_ARG, 0, 0, 0, "foo" }, + { "hello", "hello", 0, NO_ARG }, + { "%ws", "wide", 0, PTR_ARG, 0, 0, 0, L"wide" }, + { "%-10ws", "wide ", 0, PTR_ARG, 0, 0, 0, L"wide" }, + { "%10ws", " wide", 0, PTR_ARG, 0, 0, 0, L"wide" }, + { "%#+ -03whlls", "wide", 0, PTR_ARG, 0, 0, 0, L"wide" }, + { "%w0s", "0s", 0, PTR_ARG, 0, 0, 0, L"wide" }, + { "%w-s", "-s", 0, PTR_ARG, 0, 0, 0, L"wide" }, + { "%ls", "wide", 0, PTR_ARG, 0, 0, 0, L"wide" }, + { "%Ls", "not wide", 0, PTR_ARG, 0, 0, 0, "not wide" }, + { "%b", "b", 0, NO_ARG }, + { "%3c", " a", 0, INT_ARG, 'a' }, + { "%3d", "1234", 0, INT_ARG, 1234 }, + { "%3h", "", 0, NO_ARG }, + { "%k%m%q%r%t%v%y%z", "kmqrtvyz", 0, NO_ARG }, + { "%-1d", "2", 0, INT_ARG, 2 }, + { "%2.4f", "8.6000", 0, DOUBLE_ARG, 0, 0, 8.6 }, + { "%0f", "0.600000", 0, DOUBLE_ARG, 0, 0, 0.6 }, + { "%.0f", "1", 0, DOUBLE_ARG, 0, 0, 0.6 }, + { "%2.4e", "8.6000e+000", 0, DOUBLE_ARG, 0, 0, 8.6 }, + { "% 2.4e", " 8.6000e+000", 0, DOUBLE_ARG, 0, 0, 8.6 }, + { "% 014.4e", " 008.6000e+000", 0, DOUBLE_ARG, 0, 0, 8.6 }, + { "% 2.4e", "-8.6000e+000", 0, DOUBLE_ARG, 0, 0, -8.6 }, + { "%+2.4e", "+8.6000e+000", 0, DOUBLE_ARG, 0, 0, 8.6 }, + { "%2.4g", "8.6", 0, DOUBLE_ARG, 0, 0, 8.6 }, + { "%-i", "-1", 0, INT_ARG, -1 }, + { "%-i", "1", 0, INT_ARG, 1 }, + { "%+i", "+1", 0, INT_ARG, 1 }, + { "%o", "12", 0, INT_ARG, 10 }, + { "%s", "(null)", 0, PTR_ARG, 0, 0, 0, NULL }, + { "%s", "%%%%", 0, PTR_ARG, 0, 0, 0, "%%%%" }, + { "%u", "4294967295", 0, INT_ARG, -1 }, + { "%w", "", 0, INT_ARG, -1 }, + { "%h", "", 0, INT_ARG, -1 }, + { "%j", "", "j", ULONGLONG_ARG, 0, -1 }, + { "%jd", "-1", "jd", ULONGLONG_ARG, 0, -1 }, + { "%F", "", 0, INT_ARG, -1 }, + { "%N", "", 0, INT_ARG, -1 }, + { "%H", "H", 0, INT_ARG, -1 }, + { "x%cx", "xXx", 0, INT_ARG, 0x100+'X' }, + { "%%0", "%0", 0, NO_ARG }, + { "%hx", "2345", 0, INT_ARG, 0x12345 }, + { "%hhx", "123", 0, INT_ARG, 0x123 }, + { "%hhx", "2345", 0, INT_ARG, 0x12345 }, + { "%lf", "-1.#IND00", 0, DOUBLE_ARG, 0, 0, IND }, + { "%lf", "1.#QNAN0", 0, DOUBLE_ARG, 0, 0, NAN }, + { "%lf", "1.#INF00", 0, DOUBLE_ARG, 0, 0, INFINITY }, + { "%le", "-1.#IND00e+000", 0, DOUBLE_ARG, 0, 0, IND }, + { "%le", "1.#QNAN0e+000", 0, DOUBLE_ARG, 0, 0, NAN }, + { "%le", "1.#INF00e+000", 0, DOUBLE_ARG, 0, 0, INFINITY }, + { "%lg", "-1.#IND", 0, DOUBLE_ARG, 0, 0, IND }, + { "%lg", "1.#QNAN", 0, DOUBLE_ARG, 0, 0, NAN }, + { "%lg", "1.#INF", 0, DOUBLE_ARG, 0, 0, INFINITY }, + { "%010.2lf", "-000001.#J", 0, DOUBLE_ARG, 0, 0, IND }, + { "%010.2lf", "0000001.#R", 0, DOUBLE_ARG, 0, 0, NAN }, + { "%010.2lf", "0000001.#J", 0, DOUBLE_ARG, 0, 0, INFINITY }, + { "%c", "a", 0, INT_ARG, 'a' }, + { "%c", "\x82", 0, INT_ARG, 0xa082 }, + { "%C", "a", 0, INT_ARG, 'a' }, + { "%C", "", 0, INT_ARG, 0x3042 }, + { "a%Cb", "ab", 0, INT_ARG, 0x3042 }, + { "%lld", "-8589934591", "1", ULONGLONG_ARG, 0, ((ULONGLONG)0xffffffff)*0xffffffff }, + { "%I32d", "1", "I32d", INT_ARG, 1 }, + { "%.0f", "-2", 0, DOUBLE_ARG, 0, 0, -1.5 }, + { "%.0f", "-1", 0, DOUBLE_ARG, 0, 0, -0.5 }, + { "%.0f", "1", 0, DOUBLE_ARG, 0, 0, 0.5 }, + { "%.0f", "2", 0, DOUBLE_ARG, 0, 0, 1.5 }, + { "%.30f", "0.333333333333333310000000000000", 0, TODO_FLAG | DOUBLE_ARG, 0, 0, 1.0/3.0 }, + { "%.30lf", "1.414213562373095100000000000000", 0, TODO_FLAG | DOUBLE_ARG, 0, 0, sqrt(2) }, + }; - format = "%I0d"; - r = p_sprintf(buffer,format,1); - ok(!strcmp(buffer,"I0d"),"I0d failed\n"); - ok( r==3, "return count wrong\n"); + char buffer[100]; + int i, x, r; + + for (i=0; i 1.0 with 0 or -ve precision */ + { -0.0, 5, "00000", "00000", 0, 0, 1 }, + { -0.0, 0, "", "", 0, 0, 1 }, + { -0.0, -1, "", "", 0, 0, 1 }, { -123.0001, 0, "", "123", 3, 3, 1 }, { -123.0001, -1, "", "12", 3, 3, 1 }, { -123.0001, -2, "", "1", 3, 3, 1 }, { -123.0001, -3, "", "", 3, 3, 1 }, - /* Numbers > 1.0, but with rounding at the point of precision */ { 99.99, 1, "1", "1000", 3, 3, 0 }, - /* Numbers < 1.0 where rounding occurs at the point of precision */ { 0.0063, 2, "63", "1", -2, -1, 0 }, { 0.0063, 3, "630", "6", -2, -2, 0 }, { 0.09999999996, 2, "10", "10", 0, 0, 0 }, @@ -1105,12 +673,18 @@ static struct { { 0.4, 0, "", "", 0, 0, 0 }, { 0.49, 0, "", "", 0, 0, 0 }, { 0.51, 0, "", "1", 1, 1, 0 }, - /* ask for ridiculous precision, ruin formatting this table */ + { NAN, 2, "1$", "1#R", 1, 1, 0 }, + { NAN, 5, "1#QNB", "1#QNAN", 1, 1, 0 }, + { -NAN, 2, "1$", "1#J", 1, 1, 1 }, + { -NAN, 5, "1#IND", "1#IND0", 1, 1, 1 }, + { INFINITY, 2, "1$", "1#J", 1, 1, 0 }, + { INFINITY, 5, "1#INF", "1#INF0", 1, 1, 0 }, + { -INFINITY, 2, "1$", "1#J", 1, 1, 1 }, + { -INFINITY, 5, "1#INF", "1#INF0", 1, 1, 1 }, { 1.0, 30, "100000000000000000000000000000", "1000000000000000000000000000000", 1, 1, 0}, { 123456789012345678901.0, 30, "123456789012345680000000000000", "123456789012345680000000000000000000000000000000000", 21, 21, 0}, - /* end marker */ { 0, 0, "END"} }; @@ -1125,14 +699,14 @@ static void test_xcvt(void) test_cvt_testcases[i].nrdigits, &decpt, &sign); - ok( 0 == strncmp( str, test_cvt_testcases[i].expstr_e, 15), - "_ecvt() bad return, got \n'%s' expected \n'%s'\n", str, + ok( !strncmp( str, test_cvt_testcases[i].expstr_e, 15), + "%d) _ecvt() bad return, got '%s' expected '%s'\n", i, str, test_cvt_testcases[i].expstr_e); ok( decpt == test_cvt_testcases[i].expdecpt_e, - "_ecvt() decimal point wrong, got %d expected %d\n", decpt, + "%d) _ecvt() decimal point wrong, got %d expected %d\n", i, decpt, test_cvt_testcases[i].expdecpt_e); ok( sign == test_cvt_testcases[i].expsign, - "_ecvt() sign wrong, got %d expected %d\n", sign, + "%d) _ecvt() sign wrong, got %d expected %d\n", i, sign, test_cvt_testcases[i].expsign); } for( i = 0; strcmp( test_cvt_testcases[i].expstr_e, "END"); i++){ @@ -1141,14 +715,14 @@ static void test_xcvt(void) test_cvt_testcases[i].nrdigits, &decpt, &sign); - ok( 0 == strncmp( str, test_cvt_testcases[i].expstr_f, 15), - "_fcvt() bad return, got \n'%s' expected \n'%s'\n", str, + ok( !strncmp( str, test_cvt_testcases[i].expstr_f, 15), + "%d) _fcvt() bad return, got '%s' expected '%s'\n", i, str, test_cvt_testcases[i].expstr_f); ok( decpt == test_cvt_testcases[i].expdecpt_f, - "_fcvt() decimal point wrong, got %d expected %d\n", decpt, + "%d) _fcvt() decimal point wrong, got %d expected %d\n", i, decpt, test_cvt_testcases[i].expdecpt_f); ok( sign == test_cvt_testcases[i].expsign, - "_fcvt() sign wrong, got %d expected %d\n", sign, + "%d) _fcvt() sign wrong, got %d expected %d\n", i, sign, test_cvt_testcases[i].expsign); } @@ -1159,14 +733,14 @@ static void test_xcvt(void) decpt = sign = 100; err = p__ecvt_s(str, 1024, test_cvt_testcases[i].value, test_cvt_testcases[i].nrdigits, &decpt, &sign); ok(err == 0, "_ecvt_s() failed with error code %d\n", err); - ok( 0 == strncmp( str, test_cvt_testcases[i].expstr_e, 15), - "_ecvt_s() bad return, got \n'%s' expected \n'%s'\n", str, + ok( !strncmp( str, test_cvt_testcases[i].expstr_e, 15), + "%d) _ecvt_s() bad return, got '%s' expected '%s'\n", i, str, test_cvt_testcases[i].expstr_e); ok( decpt == test_cvt_testcases[i].expdecpt_e, - "_ecvt_s() decimal point wrong, got %d expected %d\n", decpt, + "%d) _ecvt_s() decimal point wrong, got %d expected %d\n", i, decpt, test_cvt_testcases[i].expdecpt_e); ok( sign == test_cvt_testcases[i].expsign, - "_ecvt_s() sign wrong, got %d expected %d\n", sign, + "%d) _ecvt_s() sign wrong, got %d expected %d\n", i, sign, test_cvt_testcases[i].expsign); } free(str); @@ -1203,15 +777,15 @@ static void test_xcvt(void) for( i = 0; strcmp( test_cvt_testcases[i].expstr_e, "END"); i++){ decpt = sign = 100; err = p__fcvt_s(str, 1024, test_cvt_testcases[i].value, test_cvt_testcases[i].nrdigits, &decpt, &sign); - ok(err == 0, "_fcvt_s() failed with error code %d\n", err); - ok( 0 == strncmp( str, test_cvt_testcases[i].expstr_f, 15), - "_fcvt_s() bad return, got '%s' expected '%s'. test %d\n", str, + ok(!err, "%d) _fcvt_s() failed with error code %d\n", i, err); + ok( !strncmp( str, test_cvt_testcases[i].expstr_f, 15), + "%d) _fcvt_s() bad return, got '%s' expected '%s'. test %d\n", i, str, test_cvt_testcases[i].expstr_f, i); ok( decpt == test_cvt_testcases[i].expdecpt_f, - "_fcvt_s() decimal point wrong, got %d expected %d\n", decpt, + "%d) _fcvt_s() decimal point wrong, got %d expected %d\n", i, decpt, test_cvt_testcases[i].expdecpt_f); ok( sign == test_cvt_testcases[i].expsign, - "_fcvt_s() sign wrong, got %d expected %d\n", sign, + "%d) _fcvt_s() sign wrong, got %d expected %d\n", i, sign, test_cvt_testcases[i].expsign); } free(str); @@ -1223,104 +797,94 @@ static void test_xcvt(void) static int WINAPIV _vsnwprintf_wrapper(wchar_t *str, size_t len, const wchar_t *format, ...) { int ret; - __ms_va_list valist; - __ms_va_start(valist, format); + va_list valist; + va_start(valist, format); ret = _vsnwprintf(str, len, format, valist); - __ms_va_end(valist); + va_end(valist); return ret; } static void test_vsnwprintf(void) { - const wchar_t format[] = {'%','w','s','%','w','s','%','w','s',0}; - const wchar_t one[] = {'o','n','e',0}; - const wchar_t two[] = {'t','w','o',0}; - const wchar_t three[] = {'t','h','r','e','e',0}; - int ret; wchar_t str[32]; char buf[32]; - ret = _vsnwprintf_wrapper( str, ARRAY_SIZE(str), format, one, two, three ); - + ret = _vsnwprintf_wrapper( str, ARRAY_SIZE(str), L"%ws%ws%ws", L"one", L"two", L"three" ); ok( ret == 11, "got %d expected 11\n", ret ); WideCharToMultiByte( CP_ACP, 0, str, -1, buf, sizeof(buf), NULL, NULL ); ok( !strcmp(buf, "onetwothree"), "got %s expected 'onetwothree'\n", buf ); - ret = _vsnwprintf_wrapper( str, 0, format, one, two, three ); + ret = _vsnwprintf_wrapper( str, 0, L"%ws%ws%ws", L"one", L"two", L"three" ); ok( ret == -1, "got %d, expected -1\n", ret ); - ret = _vsnwprintf_wrapper( NULL, 0, format, one, two, three ); + ret = _vsnwprintf_wrapper( NULL, 0, L"%ws%ws%ws", L"one", L"two", L"three" ); ok( ret == 11 || broken(ret == -1 /* Win2k */), "got %d, expected 11\n", ret ); } static int WINAPIV vswprintf_wrapper(wchar_t *str, const wchar_t *format, ...) { int ret; - __ms_va_list valist; - __ms_va_start(valist, format); + va_list valist; + va_start(valist, format); ret = p_vswprintf(str, format, valist); - __ms_va_end(valist); + va_end(valist); return ret; } static int WINAPIV _vswprintf_wrapper(wchar_t *str, const wchar_t *format, ...) { int ret; - __ms_va_list valist; - __ms_va_start(valist, format); + va_list valist; + va_start(valist, format); ret = p__vswprintf(str, format, valist); - __ms_va_end(valist); + va_end(valist); return ret; } static int WINAPIV _vswprintf_l_wrapper(wchar_t *str, const wchar_t *format, void *locale, ...) { int ret; - __ms_va_list valist; - __ms_va_start(valist, locale); + va_list valist; + va_start(valist, locale); ret = p__vswprintf_l(str, format, locale, valist); - __ms_va_end(valist); + va_end(valist); return ret; } static int WINAPIV _vswprintf_c_wrapper(wchar_t *str, size_t size, const wchar_t *format, ...) { int ret; - __ms_va_list valist; - __ms_va_start(valist, format); + va_list valist; + va_start(valist, format); ret = p__vswprintf_c(str, size, format, valist); - __ms_va_end(valist); + va_end(valist); return ret; } static int WINAPIV _vswprintf_c_l_wrapper(wchar_t *str, size_t size, const wchar_t *format, void *locale, ...) { int ret; - __ms_va_list valist; - __ms_va_start(valist, locale); + va_list valist; + va_start(valist, locale); ret = p__vswprintf_c_l(str, size, format, locale, valist); - __ms_va_end(valist); + va_end(valist); return ret; } static int WINAPIV _vswprintf_p_l_wrapper(wchar_t *str, size_t size, const wchar_t *format, void *locale, ...) { int ret; - __ms_va_list valist; - __ms_va_start(valist, locale); + va_list valist; + va_start(valist, locale); ret = p__vswprintf_p_l(str, size, format, locale, valist); - __ms_va_end(valist); + va_end(valist); return ret; } static void test_vswprintf(void) { - const wchar_t format[] = {'%','s',' ','%','d',0}; - const wchar_t number[] = {'n','u','m','b','e','r',0}; - const wchar_t out[] = {'n','u','m','b','e','r',' ','1','2','3',0}; wchar_t buf[20]; - int ret; if (!p_vswprintf || !p__vswprintf || !p__vswprintf_l ||!p__vswprintf_c @@ -1330,43 +894,48 @@ static void test_vswprintf(void) return; } - ret = vswprintf_wrapper(buf, format, number, 123); + ret = vswprintf_wrapper(buf, L"%s %d", L"number", 123); ok(ret == 10, "got %d, expected 10\n", ret); - ok(!memcmp(buf, out, sizeof(out)), "buf = %s\n", wine_dbgstr_w(buf)); + ok(!wcscmp(buf, L"number 123"), "buf = %s\n", wine_dbgstr_w(buf)); memset(buf, 0, sizeof(buf)); - ret = _vswprintf_wrapper(buf, format, number, 123); + ret = _vswprintf_wrapper(buf, L"%s %d", L"number", 123); ok(ret == 10, "got %d, expected 10\n", ret); - ok(!memcmp(buf, out, sizeof(out)), "buf = %s\n", wine_dbgstr_w(buf)); + ok(!wcscmp(buf, L"number 123"), "buf = %s\n", wine_dbgstr_w(buf)); memset(buf, 0, sizeof(buf)); - ret = _vswprintf_l_wrapper(buf, format, NULL, number, 123); + ret = _vswprintf_l_wrapper(buf, L"%s %d", NULL, L"number", 123); ok(ret == 10, "got %d, expected 10\n", ret); - ok(!memcmp(buf, out, sizeof(out)), "buf = %s\n", wine_dbgstr_w(buf)); + ok(!wcscmp(buf, L"number 123"), "buf = %s\n", wine_dbgstr_w(buf)); memset(buf, 0, sizeof(buf)); - ret = _vswprintf_c_wrapper(buf, 20, format, number, 123); + ret = _vswprintf_c_wrapper(buf, 20, L"%s %d", L"number", 123); ok(ret == 10, "got %d, expected 10\n", ret); - ok(!memcmp(buf, out, sizeof(out)), "buf = %s\n", wine_dbgstr_w(buf)); + ok(!wcscmp(buf, L"number 123"), "buf = %s\n", wine_dbgstr_w(buf)); + + memset(buf, 'x', sizeof(buf)); + ret = _vswprintf_c_wrapper(buf, 10, L"%s %d", L"number", 123); + ok(ret == -1, "got %d, expected -1\n", ret); + ok(!wcscmp(buf, L"number 12"), "buf = %s\n", wine_dbgstr_w(buf)); memset(buf, 0, sizeof(buf)); - ret = _vswprintf_c_l_wrapper(buf, 20, format, NULL, number, 123); + ret = _vswprintf_c_l_wrapper(buf, 20, L"%s %d", NULL, L"number", 123); ok(ret == 10, "got %d, expected 10\n", ret); - ok(!memcmp(buf, out, sizeof(out)), "buf = %s\n", wine_dbgstr_w(buf)); + ok(!wcscmp(buf, L"number 123"), "buf = %s\n", wine_dbgstr_w(buf)); memset(buf, 0, sizeof(buf)); - ret = _vswprintf_p_l_wrapper(buf, 20, format, NULL, number, 123); + ret = _vswprintf_p_l_wrapper(buf, 20, L"%s %d", NULL, L"number", 123); ok(ret == 10, "got %d, expected 10\n", ret); - ok(!memcmp(buf, out, sizeof(out)), "buf = %s\n", wine_dbgstr_w(buf)); + ok(!wcscmp(buf, L"number 123"), "buf = %s\n", wine_dbgstr_w(buf)); } static int WINAPIV _vscprintf_wrapper(const char *format, ...) { int ret; - __ms_va_list valist; - __ms_va_start(valist, format); + va_list valist; + va_start(valist, format); ret = p__vscprintf(format, valist); - __ms_va_end(valist); + va_end(valist); return ret; } @@ -1387,18 +956,15 @@ static void test_vscprintf(void) static int WINAPIV _vscwprintf_wrapper(const wchar_t *format, ...) { int ret; - __ms_va_list valist; - __ms_va_start(valist, format); + va_list valist; + va_start(valist, format); ret = p__vscwprintf(format, valist); - __ms_va_end(valist); + va_end(valist); return ret; } static void test_vscwprintf(void) { - const wchar_t format[] = {'%','s',' ','%','d',0}; - const wchar_t number[] = {'n','u','m','b','e','r',0}; - int ret; if (!p__vscwprintf) @@ -1407,7 +973,7 @@ static void test_vscwprintf(void) return; } - ret = _vscwprintf_wrapper( format, number, 1 ); + ret = _vscwprintf_wrapper(L"%s %d", L"number", 1 ); ok( ret == 8, "got %d expected 8\n", ret ); } @@ -1415,22 +981,17 @@ static int WINAPIV _vsnwprintf_s_wrapper(wchar_t *str, size_t sizeOfBuffer, size_t count, const wchar_t *format, ...) { int ret; - __ms_va_list valist; - __ms_va_start(valist, format); + va_list valist; + va_start(valist, format); ret = p__vsnwprintf_s(str, sizeOfBuffer, count, format, valist); - __ms_va_end(valist); + va_end(valist); return ret; } static void test_vsnwprintf_s(void) { - const wchar_t format[] = { 'A','B','%','u','C',0 }; - const wchar_t out7[] = { 'A','B','1','2','3','C',0 }; - const wchar_t out6[] = { 'A','B','1','2','3',0 }; - const wchar_t out2[] = { 'A',0 }; - const wchar_t out1[] = { 0 }; wchar_t buffer[14] = { 0 }; - int exp, got; + int ret; if (!p__vsnwprintf_s) { @@ -1439,44 +1000,40 @@ static void test_vsnwprintf_s(void) } /* Enough room. */ - exp = wcslen(out7); - - got = _vsnwprintf_s_wrapper(buffer, 14, _TRUNCATE, format, 123); - ok( exp == got, "length wrong, expect=%d, got=%d\n", exp, got); - ok( !wcscmp(out7, buffer), "buffer wrong, got=%s\n", wine_dbgstr_w(buffer)); + ret = _vsnwprintf_s_wrapper(buffer, 14, _TRUNCATE, L"AB%uC", 123); + ok( ret == 6, "length wrong, expect=6, got=%d\n", ret); + ok( !wcscmp(L"AB123C", buffer), "buffer wrong, got=%s\n", wine_dbgstr_w(buffer)); - got = _vsnwprintf_s_wrapper(buffer, 12, _TRUNCATE, format, 123); - ok( exp == got, "length wrong, expect=%d, got=%d\n", exp, got); - ok( !wcscmp(out7, buffer), "buffer wrong, got=%s\n", wine_dbgstr_w(buffer)); + ret = _vsnwprintf_s_wrapper(buffer, 12, _TRUNCATE, L"AB%uC", 123); + ok( ret == 6, "length wrong, expect=6, got=%d\n", ret); + ok( !wcscmp(L"AB123C", buffer), "buffer wrong, got=%s\n", wine_dbgstr_w(buffer)); - got = _vsnwprintf_s_wrapper(buffer, 7, _TRUNCATE, format, 123); - ok( exp == got, "length wrong, expect=%d, got=%d\n", exp, got); - ok( !wcscmp(out7, buffer), "buffer wrong, got=%s\n", wine_dbgstr_w(buffer)); + ret = _vsnwprintf_s_wrapper(buffer, 7, _TRUNCATE, L"AB%uC", 123); + ok( ret == 6, "length wrong, expect=6, got=%d\n", ret); + ok( !wcscmp(L"AB123C", buffer), "buffer wrong, got=%s\n", wine_dbgstr_w(buffer)); /* Not enough room. */ - exp = -1; - - got = _vsnwprintf_s_wrapper(buffer, 6, _TRUNCATE, format, 123); - ok( exp == got, "length wrong, expect=%d, got=%d\n", exp, got); - ok( !wcscmp(out6, buffer), "buffer wrong, got=%s\n", wine_dbgstr_w(buffer)); + ret = _vsnwprintf_s_wrapper(buffer, 6, _TRUNCATE, L"AB%uC", 123); + ok( ret == -1, "length wrong, expect=-1, got=%d\n", ret); + ok( !wcscmp(L"AB123", buffer), "buffer wrong, got=%s\n", wine_dbgstr_w(buffer)); - got = _vsnwprintf_s_wrapper(buffer, 2, _TRUNCATE, format, 123); - ok( exp == got, "length wrong, expect=%d, got=%d\n", exp, got); - ok( !wcscmp(out2, buffer), "buffer wrong, got=%s\n", wine_dbgstr_w(buffer)); + ret = _vsnwprintf_s_wrapper(buffer, 2, _TRUNCATE, L"AB%uC", 123); + ok( ret == -1, "length wrong, expect=-1, got=%d\n", ret); + ok( !wcscmp(L"A", buffer), "buffer wrong, got=%s\n", wine_dbgstr_w(buffer)); - got = _vsnwprintf_s_wrapper(buffer, 1, _TRUNCATE, format, 123); - ok( exp == got, "length wrong, expect=%d, got=%d\n", exp, got); - ok( !wcscmp(out1, buffer), "buffer wrong, got=%s\n", wine_dbgstr_w(buffer)); + ret = _vsnwprintf_s_wrapper(buffer, 1, _TRUNCATE, L"AB%uC", 123); + ok( ret == -1, "length wrong, expect=-1, got=%d\n", ret); + ok( !wcscmp(L"", buffer), "buffer wrong, got=%s\n", wine_dbgstr_w(buffer)); } static int WINAPIV _vsprintf_p_wrapper(char *str, size_t sizeOfBuffer, const char *format, ...) { int ret; - __ms_va_list valist; - __ms_va_start(valist, format); + va_list valist; + va_start(valist, format); ret = p__vsprintf_p(str, sizeOfBuffer, format, valist); - __ms_va_end(valist); + va_end(valist); return ret; } diff --git a/sdk/lib/crt/stdlib/fcvt.c b/sdk/lib/crt/stdlib/fcvt.c index b4e51a12fe2..96a741419ac 100644 --- a/sdk/lib/crt/stdlib/fcvt.c +++ b/sdk/lib/crt/stdlib/fcvt.c @@ -9,6 +9,14 @@ char *fcvtbuf (double, int, int *, int *, char *); char * _fcvt (double value, int ndigits, int *decpt, int *sign) { - static char fcvt_buf[2 * DBL_MAX_10_EXP + 10]; + static char fcvt_buf[2 * DBL_MAX_10_EXP + 10] = { 0 }; + if (value != value) + ERR("ReactOS does not handle NAN's yet\n"); + if (value == INFINITY) + ERR("ReactOS does not handle INFINITY yet\n"); + if (value == -INFINITY) + ERR("ReactOS does not handle -INFINITY yet\n"); + if (value != value || value < -FLT_MAX || value > FLT_MAX) + return fcvt_buf; return fcvtbuf (value, ndigits, decpt, sign, fcvt_buf); }