Alexandre Julliard : ntdll: Move the user locale initialization to the Unix side.

Alexandre Julliard julliard at winehq.org
Thu Jun 9 16:28:33 CDT 2022


Module: wine
Branch: master
Commit: 21a1c3097236e7de6451ce13958a6dc7edf27285
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=21a1c3097236e7de6451ce13958a6dc7edf27285

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Thu Jun  9 12:41:29 2022 +0200

ntdll: Move the user locale initialization to the Unix side.

Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/ntdll/locale.c   | 16 +---------------
 dlls/ntdll/unix/env.c | 51 ++++++++++++++++++++++++++++++++++++---------------
 2 files changed, 37 insertions(+), 30 deletions(-)

diff --git a/dlls/ntdll/locale.c b/dlls/ntdll/locale.c
index b5a11c41516..b4bfdf48f0c 100644
--- a/dlls/ntdll/locale.c
+++ b/dlls/ntdll/locale.c
@@ -92,10 +92,9 @@ void locale_init(void)
 {
     USHORT utf8[2] = { 0, CP_UTF8 };
     WCHAR locale[LOCALE_NAME_MAX_LENGTH];
-    UNICODE_STRING name, value;
     LARGE_INTEGER unused;
     SIZE_T size;
-    LCID system_lcid, user_lcid = 0;
+    LCID system_lcid;
     UINT ansi_cp = 1252, oem_cp = 437;
     void *ansi_ptr = utf8, *oem_ptr = utf8, *case_ptr;
     NTSTATUS status;
@@ -109,21 +108,8 @@ void locale_init(void)
     }
     locale_table = (const NLS_LOCALE_HEADER *)((char *)header + header->locales);
 
-    value.Buffer = locale;
-    value.MaximumLength = sizeof(locale);
-    RtlInitUnicodeString( &name, L"WINEUSERLOCALE" );
-    if (!RtlQueryEnvironmentVariable_U( NULL, &name, &value ))
-    {
-        const NLS_LOCALE_LCNAME_INDEX *entry = find_lcname_entry( locale_table, locale );
-        if (entry) user_lcid = get_locale_data( locale_table, entry->idx )->idefaultlanguage;
-    }
-    if (!user_lcid) user_lcid = system_lcid;
-    NtSetDefaultUILanguage( user_lcid );
-    NtSetDefaultLocale( TRUE, user_lcid );
-
     if (system_lcid == LOCALE_CUSTOM_UNSPECIFIED)
     {
-        system_lcid = MAKELANGID( LANG_ENGLISH, SUBLANG_DEFAULT );
         ansi_cp = oem_cp = CP_UTF8;
     }
     else
diff --git a/dlls/ntdll/unix/env.c b/dlls/ntdll/unix/env.c
index 6f67ed40245..a71df03966f 100644
--- a/dlls/ntdll/unix/env.c
+++ b/dlls/ntdll/unix/env.c
@@ -113,13 +113,17 @@ static char *get_nls_file_path( ULONG type, ULONG id )
     return path;
 }
 
-static void *read_nls_file( ULONG type, ULONG id )
+static void *read_nls_file( const char *name )
 {
-    char *path = get_nls_file_path( type, id );
+    const char *dir = build_dir ? build_dir : data_dir;
+    char *path;
     struct stat st;
     void *data, *ret = NULL;
     int fd;
 
+    if (!(path = malloc( strlen(dir) + strlen(name) + 10 ))) return NULL;
+    sprintf( path, "%s/nls/%s", dir, name );
+
     if ((fd = open( path, O_RDONLY )) != -1)
     {
         fstat( fd, &st );
@@ -135,7 +139,7 @@ static void *read_nls_file( ULONG type, ULONG id )
         }
         close( fd );
     }
-    else ERR( "failed to load %u/%u\n", type, id );
+    else ERR( "failed to load %s\n", path );
     free( path );
     return ret;
 }
@@ -201,7 +205,7 @@ static struct norm_table *nfc_table;
 
 static void init_unix_codepage(void)
 {
-    nfc_table = read_nls_file( NLS_SECTION_NORMALIZE, NormalizationC );
+    nfc_table = read_nls_file( "normnfc.nls" );
 }
 
 #elif defined(__ANDROID__)  /* Android always uses UTF-8 */
@@ -297,8 +301,11 @@ static void init_unix_codepage(void)
         {
             if (charset_names[pos].cp != CP_UTF8)
             {
-                void *data = read_nls_file( NLS_SECTION_CODEPAGE, charset_names[pos].cp );
-                if (data) init_codepage_table( data, &unix_cp );
+                char buffer[16];
+                void *data;
+
+                sprintf( buffer, "c_%03u.nls", charset_names[pos].cp );
+                if ((data = read_nls_file( buffer ))) init_codepage_table( data, &unix_cp );
             }
             return;
         }
@@ -761,17 +768,14 @@ static BOOL unix_to_win_locale( const char *unix_name, char *win_name )
 }
 
 
-static LCID init_system_lcid( const struct locale_nls_header *header )
+static const NLS_LOCALE_DATA *get_win_locale( const NLS_LOCALE_HEADER *header, const char *win_name )
 {
     WCHAR name[LOCALE_NAME_MAX_LENGTH];
-    const NLS_LOCALE_HEADER *locale_table = (const NLS_LOCALE_HEADER *)((char *)header + header->locales);
     const NLS_LOCALE_LCNAME_INDEX *entry;
 
-    ascii_to_unicode( name, system_locale, strlen(system_locale) + 1 );
-    if ((entry = find_lcname_entry( locale_table, name )))
-        return get_locale_data( locale_table, entry->idx )->idefaultlanguage;
-
-    return MAKELANGID( LANG_ENGLISH, SUBLANG_DEFAULT );
+    ascii_to_unicode( name, win_name, strlen(win_name) + 1 );
+    if (!(entry = find_lcname_entry( header, name ))) return NULL;
+    return get_locale_data( header, entry->idx );
 }
 
 
@@ -780,6 +784,10 @@ static LCID init_system_lcid( const struct locale_nls_header *header )
  */
 static void init_locale(void)
 {
+    struct locale_nls_header *header;
+    const NLS_LOCALE_HEADER *locale_table;
+    const NLS_LOCALE_DATA *locale;
+
     setlocale( LC_ALL, "" );
     if (!unix_to_win_locale( setlocale( LC_CTYPE, NULL ), system_locale )) system_locale[0] = 0;
     if (!unix_to_win_locale( setlocale( LC_MESSAGES, NULL ), user_locale )) user_locale[0] = 0;
@@ -834,6 +842,20 @@ static void init_locale(void)
         if (preferred_langs) CFRelease( preferred_langs );
     }
 #endif
+
+    if ((header = read_nls_file( "locale.nls" )))
+    {
+        locale_table = (const NLS_LOCALE_HEADER *)((char *)header + header->locales);
+        if ((locale =  get_win_locale( locale_table, system_locale )))
+            system_lcid = locale->idefaultlanguage;
+        if ((locale =  get_win_locale( locale_table, user_locale )))
+            user_lcid = locale->idefaultlanguage;
+        free( header );
+    }
+    if (!system_lcid) system_lcid = MAKELANGID( LANG_ENGLISH, SUBLANG_DEFAULT );
+    if (!user_lcid) user_lcid = system_lcid;
+    user_ui_language = user_lcid;
+
     setlocale( LC_NUMERIC, "C" );  /* FIXME: oleaut32 depends on this */
 }
 
@@ -848,7 +870,7 @@ void init_environment( int argc, char *argv[], char *envp[] )
     init_unix_codepage();
     init_locale();
 
-    if ((case_table = read_nls_file( NLS_SECTION_CASEMAP, 0 )))
+    if ((case_table = read_nls_file( "l_intl.nls" )))
     {
         uctable = case_table + 2;
         lctable = case_table + case_table[1] + 2;
@@ -2190,7 +2212,6 @@ NTSTATUS WINAPI NtInitializeNlsFiles( void **ptr, LCID *lcid, LARGE_INTEGER *siz
         status = map_section( handle, ptr, &mapsize, PAGE_READONLY );
         NtClose( handle );
     }
-    if (!status && !system_lcid) system_lcid = init_system_lcid( *ptr );
     *lcid = system_lcid;
     return status;
 }




More information about the wine-cvs mailing list