Author: cwittich
Date: Sun Oct 25 22:02:58 2009
New Revision: 43754

URL: http://svn.reactos.org/svn/reactos?rev=43754&view=rev
Log:
partial kernel32 GetLocaleInfo sync to wine 1.1.32

Modified:
    trunk/reactos/dll/win32/kernel32/misc/lang.c

Modified: trunk/reactos/dll/win32/kernel32/misc/lang.c
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/kernel32/misc/lang.c?rev=43754&r1=43753&r2=43754&view=diff
==============================================================================
--- trunk/reactos/dll/win32/kernel32/misc/lang.c [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/kernel32/misc/lang.c [iso-8859-1] Sun Oct 25 
22:02:58 2009
@@ -28,7 +28,8 @@
 
 #define LOCALE_RETURN_NUMBER 0x20000000
 #define LOCALE_USE_CP_ACP 0x40000000
-#define LOCALE_LOCALEINFOFLAGSMASK 
(LOCALE_NOUSEROVERRIDE|LOCALE_USE_CP_ACP|LOCALE_RETURN_NUMBER)
+#define LOCALE_LOCALEINFOFLAGSMASK (LOCALE_NOUSEROVERRIDE|LOCALE_USE_CP_ACP|\
+                                    
LOCALE_RETURN_NUMBER|LOCALE_RETURN_GENITIVE_NAMES)
 #define CALINFO_MAX_YEAR 2029
 
 //static LCID SystemLocale = MAKELCID(LANG_ENGLISH, SORT_DEFAULT);
@@ -52,6 +53,62 @@
 
 static const WCHAR szLocaleKeyName[] = 
L"\\Registry\\Machine\\System\\CurrentControlSet\\Control\\NLS\\Locale";
 static const WCHAR szLangGroupsKeyName[] = 
L"\\Registry\\Machine\\System\\CurrentControlSet\\Control\\NLS\\Language 
Groups";
+
+/***********************************************************************
+ *           is_genitive_name_supported
+ *
+ * Determine could LCTYPE basically support genitive name form or not.
+ */
+static BOOL is_genitive_name_supported( LCTYPE lctype )
+{
+    switch(lctype & 0xffff)
+    {
+    case LOCALE_SMONTHNAME1:
+    case LOCALE_SMONTHNAME2:
+    case LOCALE_SMONTHNAME3:
+    case LOCALE_SMONTHNAME4:
+    case LOCALE_SMONTHNAME5:
+    case LOCALE_SMONTHNAME6:
+    case LOCALE_SMONTHNAME7:
+    case LOCALE_SMONTHNAME8:
+    case LOCALE_SMONTHNAME9:
+    case LOCALE_SMONTHNAME10:
+    case LOCALE_SMONTHNAME11:
+    case LOCALE_SMONTHNAME12:
+    case LOCALE_SMONTHNAME13:
+         return TRUE;
+    default:
+         return FALSE;
+    }
+}
+
+/***********************************************************************
+ *             create_registry_key
+ *
+ * Create the Control Panel\\International registry key.
+ */
+static inline HANDLE create_registry_key(void)
+{
+    static const WCHAR intlW[] = {'C','o','n','t','r','o','l',' 
','P','a','n','e','l','\\',
+                                  
'I','n','t','e','r','n','a','t','i','o','n','a','l',0};
+    OBJECT_ATTRIBUTES attr;
+    UNICODE_STRING nameW;
+    HANDLE hkey;
+
+    if (RtlOpenCurrentUser( KEY_ALL_ACCESS, &hkey ) != STATUS_SUCCESS) return 
0;
+
+    attr.Length = sizeof(attr);
+    attr.RootDirectory = hkey;
+    attr.ObjectName = &nameW;
+    attr.Attributes = 0;
+    attr.SecurityDescriptor = NULL;
+    attr.SecurityQualityOfService = NULL;
+    RtlInitUnicodeString( &nameW, intlW );
+
+    if (NtCreateKey( &hkey, KEY_ALL_ACCESS, &attr, 0, NULL, 0, NULL ) != 
STATUS_SUCCESS) hkey = 0;
+    NtClose( attr.RootDirectory );
+    return hkey;
+}
 
 /******************************************************************************
  * @implemented
@@ -1751,6 +1808,13 @@
         SetLastError( ERROR_INVALID_PARAMETER );
         return 0;
     }
+    if (LCType & LOCALE_RETURN_GENITIVE_NAMES &&
+       !is_genitive_name_supported( LCType ))
+    {
+        SetLastError( ERROR_INVALID_FLAGS );
+        return 0;
+    }
+
     if (!cchData) lpLCData = NULL;
 
     if (Locale == LOCALE_NEUTRAL || Locale == LOCALE_SYSTEM_DEFAULT) Locale = 
GetSystemDefaultLCID();
@@ -1781,10 +1845,23 @@
         return 0;
 
     ch = LockResource( hMem );
-    for (i = 0; i < (int)(LCType & 0x0f); i++) ch += *ch + 1;
+    for (i = 0; i < (LCType & 0x0f); i++) ch += *ch + 1;
 
     if (uiFlags & LOCALE_RETURN_NUMBER) nRet = sizeof(UINT) / sizeof(WCHAR);
-    else nRet = (LCType == LOCALE_FONTSIGNATURE) ? *ch : *ch + 1;
+    else if (is_genitive_name_supported( LCType ) && *ch)
+    {
+        /* genitive form's stored after a null separator from a nominative */
+        for (i = 1; i <= *ch; i++) if (!ch[i]) break;
+
+        if (i <= *ch && (uiFlags & LOCALE_RETURN_GENITIVE_NAMES))
+        {
+            nRet = *ch - i + 1;
+            ch += i;
+        }
+        else nRet = i;
+    }
+    else
+        nRet = (LCType == LOCALE_FONTSIGNATURE) ? *ch : *ch + 1;
 
     if (!lpLCData) return nRet;
 
@@ -2092,6 +2169,12 @@
         SetLastError( ERROR_INVALID_PARAMETER );
         return 0;
     }
+    if (lctype & LOCALE_RETURN_GENITIVE_NAMES )
+    {
+        SetLastError( ERROR_INVALID_FLAGS );
+        return 0;
+    }
+
     if (!len) buffer = NULL;
 
     if (!(lenW = GetLocaleInfoW( lcid, lctype, NULL, 0 ))) return 0;
@@ -2234,35 +2317,6 @@
 }
 
 
-/***********************************************************************
- *             create_registry_key
- *
- * Create the Control Panel\\International registry key.
- */
-static inline HANDLE create_registry_key(void)
-{
-    static const WCHAR intlW[] = {'C','o','n','t','r','o','l',' 
','P','a','n','e','l','\\',
-                                  
'I','n','t','e','r','n','a','t','i','o','n','a','l',0};
-    OBJECT_ATTRIBUTES attr;
-    UNICODE_STRING nameW;
-    HANDLE hkey;
-
-    if (RtlOpenCurrentUser( KEY_ALL_ACCESS, &hkey ) != STATUS_SUCCESS) return 
0;
-
-    attr.Length = sizeof(attr);
-    attr.RootDirectory = hkey;
-    attr.ObjectName = &nameW;
-    attr.Attributes = 0;
-    attr.SecurityDescriptor = NULL;
-    attr.SecurityQualityOfService = NULL;
-    RtlInitUnicodeString( &nameW, intlW );
-
-    if (NtCreateKey( &hkey, KEY_ALL_ACCESS, &attr, 0, NULL, 0, NULL ) != 
STATUS_SUCCESS) hkey = 0;
-    NtClose( attr.RootDirectory );
-    return hkey;
-}
-
-
 /*
  * @unimplemented
  */


Reply via email to