POSIX-1.2008 per-thread locales, groundwork part 1

Introduce first cut of struct _thr_locale_t used for the locale_t definition.
Introduce global instance called __global_locale used by default.
Introduce internal inline functions __get_global_locale, __get_locale_r,
__get_current_locale.

Remove usage of global variables in favor of accessor functions pointing to
__global_locale for now.  Include all local headers in locale subdir from
setlocale.h to get single include for internal locale access.

Introduce __CTYPE_PTR macro to replace direct access to __ctype_ptr__
and use throughout in isxxx functions.

Signed-off by: Corinna Vinschen <corinna@vinschen.de>
This commit is contained in:
Corinna Vinschen
2016-07-13 16:51:33 +02:00
parent 51b669f679
commit a6a477fa81
31 changed files with 610 additions and 484 deletions

View File

@@ -1,6 +1,7 @@
#include "winsup.h"
extern "C" {
#include <ctype.h>
#include "../locale/setlocale.h"
#include <stdlib.h>
#include <wctype.h>
@@ -18,9 +19,10 @@ extern const char __ctype_cp[22][128 + 256]; /* Newlib */
extern const char __ctype_iso[15][128 + 256]; /* Newlib */
void
__set_ctype (const char *charset)
__set_ctype (struct _reent *reent, const char *charset)
{
int idx;
char *ctype_ptr = NULL;
switch (*charset)
{
@@ -36,8 +38,8 @@ __set_ctype (const char *charset)
memcpy (_ctype_b, __ctype_iso[idx], 128);
memcpy (_ctype_b + 256, __ctype_iso[idx] + 256, 128);
}
__ctype_ptr__ = (char *) (__ctype_iso[idx] + 127);
return;
ctype_ptr = (char *) __ctype_iso[idx];
break;
case 'C':
idx = __cp_index (charset + 2);
if (idx < 0)
@@ -47,17 +49,24 @@ __set_ctype (const char *charset)
memcpy (_ctype_b, __ctype_cp[idx], 128);
memcpy (_ctype_b + 256, __ctype_cp[idx] + 256, 128);
}
__ctype_ptr__ = (char *) (__ctype_cp[idx] + 127);
return;
ctype_ptr = (char *) __ctype_cp[idx];
break;
default:
break;
}
if (CYGWIN_VERSION_CHECK_FOR_OLD_CTYPE)
if (!ctype_ptr)
{
memset (_ctype_b, 0, 128);
memset (_ctype_b + 256, 0, 128);
if (CYGWIN_VERSION_CHECK_FOR_OLD_CTYPE)
{
memset (_ctype_b, 0, 128);
memset (_ctype_b + 256, 0, 128);
}
ctype_ptr = (char *) _ctype_b;
}
__ctype_ptr__ = (char *) _ctype_b + 127;
if (reent)
__get_locale_r (reent)->ctype_ptr = ctype_ptr + 127;
else
__ctype_ptr__ = ctype_ptr + 127;
}
} /* extern "C" */