* 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.
This commit is contained in:
parent
0e03c708be
commit
0ca6c6b802
|
@ -1,3 +1,11 @@
|
||||||
|
2009-10-02 Corinna Vinschen <corinna@vinschen.de>
|
||||||
|
|
||||||
|
* 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.
|
||||||
|
|
||||||
2009-10-02 Christopher Faylor <me+cygwin@cgf.cx>
|
2009-10-02 Christopher Faylor <me+cygwin@cgf.cx>
|
||||||
|
|
||||||
* dcrt0.cc (dll_crt0_1): Move cxx_malloc reset kluge from here.
|
* dcrt0.cc (dll_crt0_1): Move cxx_malloc reset kluge from here.
|
||||||
|
|
|
@ -768,6 +768,8 @@ dll_crt0_0 ()
|
||||||
void
|
void
|
||||||
dll_crt0_1 (void *)
|
dll_crt0_1 (void *)
|
||||||
{
|
{
|
||||||
|
extern void initial_setlocale ();
|
||||||
|
|
||||||
if (dynamically_loaded)
|
if (dynamically_loaded)
|
||||||
sigproc_init ();
|
sigproc_init ();
|
||||||
check_sanity_and_sync (user_data);
|
check_sanity_and_sync (user_data);
|
||||||
|
@ -940,9 +942,7 @@ dll_crt0_1 (void *)
|
||||||
LoadLibrary serialization. */
|
LoadLibrary serialization. */
|
||||||
ld_preload ();
|
ld_preload ();
|
||||||
/* Set internal locale to the environment settings. */
|
/* Set internal locale to the environment settings. */
|
||||||
setlocale (LC_CTYPE, "");
|
initial_setlocale ();
|
||||||
/* Reset application locale to "C" per POSIX */
|
|
||||||
_setlocale_r (_REENT, LC_CTYPE, "C");
|
|
||||||
if (user_data->main)
|
if (user_data->main)
|
||||||
cygwin_exit (user_data->main (__argc, __argv, *user_data->envptr));
|
cygwin_exit (user_data->main (__argc, __argv, *user_data->envptr));
|
||||||
__asm__ (" \n\
|
__asm__ (" \n\
|
||||||
|
|
|
@ -4209,6 +4209,24 @@ internal_setlocale ()
|
||||||
setenv ("PATH", c_path, 1);
|
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 *
|
extern "C" char *
|
||||||
setlocale (int category, const char *locale)
|
setlocale (int category, const char *locale)
|
||||||
{
|
{
|
||||||
|
@ -4216,13 +4234,7 @@ setlocale (int category, const char *locale)
|
||||||
if (locale && !wincap.has_always_all_codepages ())
|
if (locale && !wincap.has_always_all_codepages ())
|
||||||
stpcpy (old, _setlocale_r (_REENT, category, NULL));
|
stpcpy (old, _setlocale_r (_REENT, category, NULL));
|
||||||
char *ret = _setlocale_r (_REENT, category, locale);
|
char *ret = _setlocale_r (_REENT, category, locale);
|
||||||
if (ret && locale)
|
if (ret && locale && !(ret = check_codepage (ret)))
|
||||||
{
|
_setlocale_r (_REENT, category, old);
|
||||||
if (!(ret = check_codepage (ret)))
|
|
||||||
_setlocale_r (_REENT, category, old);
|
|
||||||
else if (!*locale && strcmp (cygheap->locale.charset,
|
|
||||||
__locale_charset ()) != 0)
|
|
||||||
internal_setlocale ();
|
|
||||||
}
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue