[PATCH] mlang: Suppress country data in rfc1766, with tests
Detlef Riekenberg
wine.dev at web.de
Fri May 29 16:24:30 CDT 2009
---
dlls/mlang/mlang.c | 51 ++++++++++++++++++++++++++++++++++-----------
dlls/mlang/tests/mlang.c | 33 +++++++++++++++++------------
2 files changed, 57 insertions(+), 27 deletions(-)
diff --git a/dlls/mlang/mlang.c b/dlls/mlang/mlang.c
index bac4e48..4144ef5 100644
--- a/dlls/mlang/mlang.c
+++ b/dlls/mlang/mlang.c
@@ -1137,29 +1137,54 @@ HRESULT WINAPI IsConvertINetStringAvailable(
static inline HRESULT lcid_to_rfc1766A( LCID lcid, LPSTR rfc1766, INT len )
{
- INT n = GetLocaleInfoA( lcid, LOCALE_SISO639LANGNAME, rfc1766, len );
+ CHAR buffer[MAX_RFC1766_NAME];
+ INT n = GetLocaleInfoA(lcid, LOCALE_SISO639LANGNAME, buffer, MAX_RFC1766_NAME);
+ INT i;
+
if (n)
{
- rfc1766[n - 1] = '-';
- n += GetLocaleInfoA( lcid, LOCALE_SISO3166CTRYNAME, rfc1766 + n, len - n );
- LCMapStringA( LOCALE_USER_DEFAULT, LCMAP_LOWERCASE, rfc1766, n, rfc1766, len );
- return S_OK;
+ i = PRIMARYLANGID(lcid);
+ if ((((i == LANG_ENGLISH) || (i == LANG_CHINESE) || (i == LANG_ARABIC)) &&
+ (SUBLANGID(lcid) == SUBLANG_DEFAULT)) ||
+ (SUBLANGID(lcid) > SUBLANG_DEFAULT)) {
+
+ buffer[n - 1] = '-';
+ i = GetLocaleInfoA(lcid, LOCALE_SISO3166CTRYNAME, buffer + n, MAX_RFC1766_NAME - n);
+ if (!i)
+ buffer[n - 1] = '\0';
+ }
+ else
+ i = 0;
+
+ LCMapStringA( LOCALE_USER_DEFAULT, LCMAP_LOWERCASE, buffer, n + i, rfc1766, len );
+ return ((n + i) > len) ? E_INVALIDARG : S_OK;
}
return E_FAIL;
}
static inline HRESULT lcid_to_rfc1766W( LCID lcid, LPWSTR rfc1766, INT len )
{
- INT n = GetLocaleInfoW( lcid, LOCALE_SISO639LANGNAME, rfc1766, len );
- INT save = n;
+ WCHAR buffer[MAX_RFC1766_NAME];
+ INT n = GetLocaleInfoW(lcid, LOCALE_SISO639LANGNAME, buffer, MAX_RFC1766_NAME);
+ INT i;
+
if (n)
{
- rfc1766[n - 1] = '-';
- n += GetLocaleInfoW( lcid, LOCALE_SISO3166CTRYNAME, rfc1766 + n, len - n );
- if (n == save)
- rfc1766[n - 1] = '\0';
- LCMapStringW( LOCALE_USER_DEFAULT, LCMAP_LOWERCASE, rfc1766, n, rfc1766, len );
- return S_OK;
+ i = PRIMARYLANGID(lcid);
+ if ((((i == LANG_ENGLISH) || (i == LANG_CHINESE) || (i == LANG_ARABIC)) &&
+ (SUBLANGID(lcid) == SUBLANG_DEFAULT)) ||
+ (SUBLANGID(lcid) > SUBLANG_DEFAULT)) {
+
+ buffer[n - 1] = '-';
+ i = GetLocaleInfoW(lcid, LOCALE_SISO3166CTRYNAME, buffer + n, MAX_RFC1766_NAME - n);
+ if (!i)
+ buffer[n - 1] = '\0';
+ }
+ else
+ i = 0;
+
+ LCMapStringW(LOCALE_USER_DEFAULT, LCMAP_LOWERCASE, buffer, n + i, rfc1766, len);
+ return ((n + i) > len) ? E_INVALIDARG : S_OK;
}
return E_FAIL;
}
diff --git a/dlls/mlang/tests/mlang.c b/dlls/mlang/tests/mlang.c
index 2ae7c74..3d9511a 100644
--- a/dlls/mlang/tests/mlang.c
+++ b/dlls/mlang/tests/mlang.c
@@ -940,25 +940,30 @@ static void test_Rfc1766ToLcid(void)
static void test_GetRfc1766FromLcid(IMultiLanguage2 *iML2)
{
+ CHAR expected[MAX_RFC1766_NAME];
+ CHAR buffer[MAX_RFC1766_NAME + 1];
+ DWORD i;
HRESULT hr;
BSTR rfcstr;
- LCID lcid;
- static WCHAR kok[] = {'k','o','k',0};
+ for(i = 0; i < sizeof(lcid_table) / sizeof(lcid_table[0]); i++) {
+ buffer[0] = '\0';
- hr = IMultiLanguage2_GetLcidFromRfc1766(iML2, &lcid, kok);
- /*
- * S_FALSE happens when 'kok' instead matches to a different Rfc1766 name
- * for example 'ko' so it is not a failure but does not give us what
- * we are looking for
- */
- if (hr != S_FALSE)
- {
- ok(hr == S_OK, "Expected S_OK, got %08x\n", hr);
+ rfcstr = NULL;
+ hr = IMultiLanguage2_GetRfc1766FromLcid(iML2, lcid_table[i].lcid, &rfcstr);
+ ok(hr == lcid_table[i].hr,
+ "#%02d: HRESULT 0x%x (expected 0x%x)\n", i, hr, lcid_table[i].hr);
+
+ if (hr != S_OK)
+ continue; /* no result-string created */
+
+ WideCharToMultiByte(CP_ACP, 0, rfcstr, -1, buffer, sizeof(buffer), NULL, NULL);
+ LCMapStringA(LOCALE_USER_DEFAULT, LCMAP_LOWERCASE, lcid_table[i].rfc1766,
+ lstrlenA(lcid_table[i].rfc1766) + 1, expected, MAX_RFC1766_NAME);
+
+ ok(!lstrcmpA(buffer, expected),
+ "#%02d: got '%s' (expected '%s')\n", i, buffer, expected);
- hr = IMultiLanguage2_GetRfc1766FromLcid(iML2, lcid, &rfcstr);
- ok(hr == S_OK, "Expected S_OK, got %08x\n", hr);
- ok_w2("Expected \"%s\", got \"%s\"n", kok, rfcstr);
SysFreeString(rfcstr);
}
}
--
1.5.4.3
--=-6R44Ktx2lHdUS4j3qz0v--
More information about the wine-patches
mailing list