diff --git a/dlls/shlwapi/shlwapi.spec b/dlls/shlwapi/shlwapi.spec index deb8a48..40e2ee9 100644 --- a/dlls/shlwapi/shlwapi.spec +++ b/dlls/shlwapi/shlwapi.spec @@ -804,6 +804,8 @@ @ stdcall StrStrNW(wstr wstr long) @ stdcall StrStrNIW(wstr wstr long) @ stdcall StrStrW(wstr wstr) +@ stdcall StrToInt64ExA(str long ptr) +@ stdcall StrToInt64ExW(wstr long ptr) @ stdcall StrToIntA(str) @ stdcall StrToIntExA(str long ptr) @ stdcall StrToIntExW(wstr long ptr) diff --git a/dlls/shlwapi/string.c b/dlls/shlwapi/string.c index 903c981..d9ebd0b 100644 --- a/dlls/shlwapi/string.c +++ b/dlls/shlwapi/string.c @@ -91,7 +91,7 @@ static void FillNumberFmt(NUMBERFMTW *fmt, LPWSTR decimal_buffer, int decimal_bu * Format an integer according to the current locale * * RETURNS - * The number of bytes written on success or 0 on failure + * The number of characters written on success or 0 on failure */ static int FormatInt(LONGLONG qdwValue, LPWSTR pszBuf, int cchBuf) { @@ -124,7 +124,7 @@ static int FormatInt(LONGLONG qdwValue, LPWSTR pszBuf, int cchBuf) * after the decimal point * * RETURNS - * The number of bytes written on success or 0 on failure + * The number of characters written on success or 0 on failure */ static int FormatDouble(double value, int decimals, LPWSTR pszBuf, int cchBuf) { @@ -855,8 +855,30 @@ int WINAPI StrToIntW(LPCWSTR lpszStr) */ BOOL WINAPI StrToIntExA(LPCSTR lpszStr, DWORD dwFlags, LPINT lpiRet) { + LARGE_INTEGER li; + BOOL bRes; + + TRACE("(%s,%08X,%p)\n", debugstr_a(lpszStr), dwFlags, lpiRet); + + if (!lpiRet) + return FALSE; + + bRes = StrToInt64ExA(lpszStr, dwFlags, &li.QuadPart); + if (bRes) + *lpiRet = li.u.LowPart; + + return bRes; +} + +/************************************************************************* + * StrToInt64ExA [SHLWAPI.@] + * + * See StrToIntExA. + */ +BOOL WINAPI StrToInt64ExA(LPCSTR lpszStr, DWORD dwFlags, LONGLONG *lpiRet) +{ BOOL bNegative = FALSE; - int iRet = 0; + LONGLONG iRet = 0; TRACE("(%s,%08X,%p)\n", debugstr_a(lpszStr), dwFlags, lpiRet); @@ -922,8 +944,30 @@ BOOL WINAPI StrToIntExA(LPCSTR lpszStr, DWORD dwFlags, LPINT lpiRet) */ BOOL WINAPI StrToIntExW(LPCWSTR lpszStr, DWORD dwFlags, LPINT lpiRet) { + LARGE_INTEGER li; + BOOL bRes; + + TRACE("(%s,%08X,%p)\n", debugstr_w(lpszStr), dwFlags, lpiRet); + + if (!lpiRet) + return FALSE; + + bRes = StrToInt64ExW(lpszStr, dwFlags, &li.QuadPart); + if (bRes) + *lpiRet = li.u.LowPart; + + return bRes; +} + +/************************************************************************* + * StrToInt64ExW [SHLWAPI.@] + * + * See StrToIntExA. + */ +BOOL WINAPI StrToInt64ExW(LPCWSTR lpszStr, DWORD dwFlags, LONGLONG *lpiRet) +{ BOOL bNegative = FALSE; - int iRet = 0; + LONGLONG iRet = 0; TRACE("(%s,%08X,%p)\n", debugstr_w(lpszStr), dwFlags, lpiRet); diff --git a/dlls/shlwapi/tests/string.c b/dlls/shlwapi/tests/string.c index 5522137..6310a85 100644 --- a/dlls/shlwapi/tests/string.c +++ b/dlls/shlwapi/tests/string.c @@ -79,30 +79,34 @@ typedef struct tagStrToIntResult int str_to_int; int str_to_int_ex; int str_to_int_hex; + LONGLONG str_to_int64_ex; + LONGLONG str_to_int64_hex; } StrToIntResult; static const StrToIntResult StrToInt_results[] = { - { "1099", 1099, 1099, 1099 }, - { "+88987", 0, 88987, 88987 }, - { "012", 12, 12, 12 }, - { "-55", -55, -55, -55 }, - { "-0", 0, 0, 0 }, - { "0x44ff", 0, 0, 0x44ff }, - { "+0x44f4", 0, 0, 0x44f4 }, - { "-0x44fd", 0, 0, 0x44fd }, - { "+ 88987", 0, 0, 0 }, - { "- 55", 0, 0, 0 }, - { "- 0", 0, 0, 0 }, - { "+ 0x44f4", 0, 0, 0 }, - { "--0x44fd", 0, 0, 0 }, - { " 1999", 0, 1999, 1999 }, - { " +88987", 0, 88987, 88987 }, - { " 012", 0, 12, 12 }, - { " -55", 0, -55, -55 }, - { " 0x44ff", 0, 0, 0x44ff }, - { " +0x44f4", 0, 0, 0x44f4 }, - { " -0x44fd", 0, 0, 0x44fd }, - { NULL, 0, 0, 0 } + { "1099", 1099, 1099, 1099, 1099, 1099 }, + { "4294967319", 23, 23, 23, 4294967319, 4294967319 }, + { "+88987", 0, 88987, 88987, 88987, 88987 }, + { "012", 12, 12, 12, 12, 12 }, + { "-55", -55, -55, -55, -55, -55 }, + { "-0", 0, 0, 0, 0, 0 }, + { "0x44ff", 0, 0, 0x44ff, 0, 0x44ff }, + { "0x2bdc546291f4b1", 0, 0, 0x6291f4b1, 0, 0x2bdc546291f4b1 }, + { "+0x44f4", 0, 0, 0x44f4, 0, 0x44f4 }, + { "-0x44fd", 0, 0, 0x44fd, 0, 0x44fd }, + { "+ 88987", 0, 0, 0, 0, 0 }, + { "- 55", 0, 0, 0, 0, 0 }, + { "- 0", 0, 0, 0, 0, 0 }, + { "+ 0x44f4", 0, 0, 0, 0, 0 }, + { "--0x44fd", 0, 0, 0, 0, 0 }, + { " 1999", 0, 1999, 1999, 1999, 1999 }, + { " +88987", 0, 88987, 88987, 88987, 88987 }, + { " 012", 0, 12, 12, 12, 12 }, + { " -55", 0, -55, -55, -55, -55 }, + { " 0x44ff", 0, 0, 0x44ff, 0, 0x44ff }, + { " +0x44f4", 0, 0, 0x44f4, 0, 0x44f4 }, + { " -0x44fd", 0, 0, 0x44fd, 0, 0x44fd }, + { NULL, 0, 0, 0, 0, 0 } }; /* pStrFormatByteSize64/StrFormatKBSize results */ @@ -534,6 +538,73 @@ static void test_StrToIntExW(void) } } +static void test_StrToInt64ExA(void) +{ + const StrToIntResult *result = StrToInt_results; + LONGLONG return_val; + BOOL bRet; + + while (result->string) + { + return_val = -1; + bRet = StrToInt64ExA(result->string,0,&return_val); + ok(!bRet || return_val != -1, "No result returned from '%s'\n", + result->string); + if (bRet) + ok(return_val == result->str_to_int64_ex, "converted '%s' wrong (%lld)\n", + result->string, return_val); + result++; + } + + result = StrToInt_results; + while (result->string) + { + return_val = -1; + bRet = StrToInt64ExA(result->string,STIF_SUPPORT_HEX,&return_val); + ok(!bRet || return_val != -1, "No result returned from '%s'\n", + result->string); + if (bRet) + ok(return_val == result->str_to_int64_hex, "converted '%s' wrong (%xlld)\n", + result->string, return_val); + result++; + } +} + +static void test_StrToInt64ExW(void) +{ + WCHAR szBuff[256]; + const StrToIntResult *result = StrToInt_results; + LONGLONG return_val; + BOOL bRet; + + while (result->string) + { + return_val = -1; + MultiByteToWideChar(0,0,result->string,-1,szBuff,sizeof(szBuff)/sizeof(WCHAR)); + bRet = StrToInt64ExW(szBuff, 0, &return_val); + ok(!bRet || return_val != -1, "No result returned from '%s'\n", + result->string); + if (bRet) + ok(return_val == result->str_to_int64_ex, "converted '%s' wrong (%lld)\n", + result->string, return_val); + result++; + } + + result = StrToInt_results; + while (result->string) + { + return_val = -1; + MultiByteToWideChar(0,0,result->string,-1,szBuff,sizeof(szBuff)/sizeof(WCHAR)); + bRet = StrToInt64ExW(szBuff, STIF_SUPPORT_HEX, &return_val); + ok(!bRet || return_val != -1, "No result returned from '%s'\n", + result->string); + if (bRet) + ok(return_val == result->str_to_int64_hex, "converted '%s' wrong (%lld)\n", + result->string, return_val); + result++; + } +} + static void test_StrDupA(void) { LPSTR lpszStr; @@ -1435,6 +1506,8 @@ START_TEST(string) test_StrToIntW(); test_StrToIntExA(); test_StrToIntExW(); + test_StrToInt64ExA(); + test_StrToInt64ExW(); test_StrDupA(); /* language-dependent test */