Piotr Caban : msvcrt: Added _configthreadlocale implementation.

Alexandre Julliard julliard at winehq.org
Thu Apr 15 11:37:38 CDT 2010


Module: wine
Branch: master
Commit: 20b77f44289db4b072264d03bf83c4333346abf0
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=20b77f44289db4b072264d03bf83c4333346abf0

Author: Piotr Caban <piotr at codeweavers.com>
Date:   Thu Apr 15 14:25:47 2010 +0200

msvcrt: Added _configthreadlocale implementation.

---

 dlls/msvcr80/msvcr80.spec |    2 +-
 dlls/msvcr90/msvcr90.spec |    2 +-
 dlls/msvcrt/locale.c      |   37 +++++++++++++++++++++++++++++++++++++
 dlls/msvcrt/msvcrt.h      |    3 +++
 dlls/msvcrt/msvcrt.spec   |    1 +
 5 files changed, 43 insertions(+), 2 deletions(-)

diff --git a/dlls/msvcr80/msvcr80.spec b/dlls/msvcr80/msvcr80.spec
index ac3ca94..21367a9 100644
--- a/dlls/msvcr80/msvcr80.spec
+++ b/dlls/msvcr80/msvcr80.spec
@@ -324,7 +324,7 @@
 @ cdecl _close(long) msvcrt._close
 @ cdecl _commit(long) msvcrt._commit
 @ extern _commode msvcrt._commode
-@ stub _configthreadlocale
+@ cdecl _configthreadlocale(long) msvcrt._configthreadlocale
 @ cdecl _control87(long long) msvcrt._control87
 @ cdecl _controlfp(long long) msvcrt._controlfp
 @ cdecl _controlfp_s(ptr long long) msvcrt._controlfp_s
diff --git a/dlls/msvcr90/msvcr90.spec b/dlls/msvcr90/msvcr90.spec
index a038a8f..d084047 100644
--- a/dlls/msvcr90/msvcr90.spec
+++ b/dlls/msvcr90/msvcr90.spec
@@ -316,7 +316,7 @@
 @ cdecl _close(long) msvcrt._close
 @ cdecl _commit(long) msvcrt._commit
 @ extern _commode msvcrt._commode
-@ stub _configthreadlocale
+@ cdecl _configthreadlocale(long) msvcrt._configthreadlocale
 @ cdecl _control87(long long) msvcrt._control87
 @ cdecl _controlfp(long long) msvcrt._controlfp
 @ cdecl _controlfp_s(ptr long long) msvcrt._controlfp_s
diff --git a/dlls/msvcrt/locale.c b/dlls/msvcrt/locale.c
index 45547ae..bc65f04 100644
--- a/dlls/msvcrt/locale.c
+++ b/dlls/msvcrt/locale.c
@@ -954,6 +954,43 @@ MSVCRT__locale_t _create_locale(int category, const char *locale)
     return loc;
 }
 
+/* _configthreadlocale - not exported in native msvcrt */
+int CDECL _configthreadlocale(int type)
+{
+    thread_data_t *data = msvcrt_get_thread_data();
+    int ret;
+
+    if(!data)
+        return -1;
+
+    ret = (data->locale ? MSVCRT__ENABLE_PER_THREAD_LOCALE : MSVCRT__DISABLE_PER_THREAD_LOCALE);
+
+    if(type == MSVCRT__ENABLE_PER_THREAD_LOCALE) {
+        if(!data->locale) {
+            /* Copy current global locale */
+            data->locale = _create_locale(MSVCRT_LC_ALL, MSVCRT_setlocale(MSVCRT_LC_ALL, NULL));
+            if(!data->locale)
+                return -1;
+        }
+
+        return ret;
+    }
+
+    if(type == MSVCRT__DISABLE_PER_THREAD_LOCALE) {
+        if(data->locale) {
+            _free_locale(data->locale);
+            data->locale = NULL;
+        }
+
+        return ret;
+    }
+
+    if(!type)
+        return ret;
+
+    return -1;
+}
+
 /*********************************************************************
  *             setlocale (MSVCRT.@)
  */
diff --git a/dlls/msvcrt/msvcrt.h b/dlls/msvcrt/msvcrt.h
index 9b99cd7..2ed5aeb 100644
--- a/dlls/msvcrt/msvcrt.h
+++ b/dlls/msvcrt/msvcrt.h
@@ -791,6 +791,9 @@ typedef struct MSVCRT_localeinfo_struct
     MSVCRT_pthreadmbcinfo mbcinfo;
 } MSVCRT__locale_tstruct, *MSVCRT__locale_t;
 
+#define MSVCRT__ENABLE_PER_THREAD_LOCALE 1
+#define MSVCRT__DISABLE_PER_THREAD_LOCALE 2
+
 extern MSVCRT__locale_t MSVCRT_locale;
 MSVCRT__locale_t get_locale(void);
 void __cdecl _free_locale(MSVCRT__locale_t);
diff --git a/dlls/msvcrt/msvcrt.spec b/dlls/msvcrt/msvcrt.spec
index 22e921e..1f073d3 100644
--- a/dlls/msvcrt/msvcrt.spec
+++ b/dlls/msvcrt/msvcrt.spec
@@ -1417,3 +1417,4 @@
 @ cdecl _set_invalid_parameter_handler(ptr)
 @ cdecl _create_locale(long str)
 @ cdecl _free_locale(ptr)
+@ cdecl _configthreadlocale(long)




More information about the wine-cvs mailing list