diff options
author | Corinna Vinschen <corinna@vinschen.de> | 2009-10-02 14:58:10 +0000 |
---|---|---|
committer | Corinna Vinschen <corinna@vinschen.de> | 2009-10-02 14:58:10 +0000 |
commit | 0ca6c6b802e02d584e3f0ac4bfa2b5bf3676a897 (patch) | |
tree | e19896efd3e5372d153d27f392d736979594e3a4 /winsup/cygwin/syscalls.cc | |
parent | 0e03c708bedb2654cdf9fff96fb29ce0fdae62dc (diff) | |
download | cygnal-0ca6c6b802e02d584e3f0ac4bfa2b5bf3676a897.tar.gz cygnal-0ca6c6b802e02d584e3f0ac4bfa2b5bf3676a897.tar.bz2 cygnal-0ca6c6b802e02d584e3f0ac4bfa2b5bf3676a897.zip |
* dcrt0.cc (dll_crt0_1): Drop calls to setlocale/_setlocale_r. Just
call initial_setlocale from here.
* syscalls.cc (initial_setlocale): Set internal charset and revert
application locale to "C".
(setlocale): Don't set Cygwin's internal charset here.
Diffstat (limited to 'winsup/cygwin/syscalls.cc')
-rw-r--r-- | winsup/cygwin/syscalls.cc | 28 |
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; } |