summaryrefslogtreecommitdiffstats
path: root/winsup/cygwin/syscalls.cc
diff options
context:
space:
mode:
Diffstat (limited to 'winsup/cygwin/syscalls.cc')
-rw-r--r--winsup/cygwin/syscalls.cc28
1 files changed, 20 insertions, 8 deletions
diff --git a/winsup/cygwin/syscalls.cc b/winsup/cygwin/syscalls.cc
index 1d160d369..cd8909d89 100644
--- a/winsup/cygwin/syscalls.cc
+++ b/winsup/cygwin/syscalls.cc
@@ -4209,6 +4209,24 @@ internal_setlocale ()
setenv ("PATH", c_path, 1);
}
+/* Called from dll_crt0_1, before calling the application's main().
+ Set the internal charset according to the environment locale settings.
+ Check if a required codepage is available, and only switch internal
+ charset if so. Afterwards, reset application locale to "C" per POSIX. */
+void
+initial_setlocale ()
+{
+ char *ret = _setlocale_r (_REENT, LC_CTYPE, "");
+ if (ret && check_codepage (ret)
+ && strcmp (cygheap->locale.charset, __locale_charset ()) != 0)
+ internal_setlocale ();
+ _setlocale_r (_REENT, LC_CTYPE, "C");
+}
+
+/* Like newlib's setlocale, but additionally check if the charset needs
+ OS support and the required codepage is actually installed. If codepage
+ is not available, revert to previous locale and return NULL. For details
+ about codepage availability, see the comment in check_codepage() above. */
extern "C" char *
setlocale (int category, const char *locale)
{
@@ -4216,13 +4234,7 @@ setlocale (int category, const char *locale)
if (locale && !wincap.has_always_all_codepages ())
stpcpy (old, _setlocale_r (_REENT, category, NULL));
char *ret = _setlocale_r (_REENT, category, locale);
- if (ret && locale)
- {
- if (!(ret = check_codepage (ret)))
- _setlocale_r (_REENT, category, old);
- else if (!*locale && strcmp (cygheap->locale.charset,
- __locale_charset ()) != 0)
- internal_setlocale ();
- }
+ if (ret && locale && !(ret = check_codepage (ret)))
+ _setlocale_r (_REENT, category, old);
return ret;
}