[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