Print this page
2964 need POSIX 2008 locale object support

*** 4,13 **** --- 4,18 ---- * The Regents of the University of California. All rights reserved. * * This code is derived from software contributed to Berkeley by * Paul Borman at Krystal Technologies. * + * Copyright (c) 2011 The FreeBSD Foundation + * All rights reserved. + * Portions of this software were developed by David Chisnall + * under sponsorship from the FreeBSD Foundation. + * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer.
*** 45,66 **** #include "mblocal.h" #include "setlocale.h" #include "_ctype.h" #include "../i18n/_locale.h" extern _RuneLocale *_Read_RuneMagi(FILE *); extern unsigned char __ctype_C[]; ! static int __setrunelocale(const char *); static int ! __setrunelocale(const char *encoding) { FILE *fp; char name[PATH_MAX]; _RuneLocale *rl; int saverr, ret; size_t (*old__mbrtowc)(wchar_t *_RESTRICT_KYWD, const char *_RESTRICT_KYWD, size_t, mbstate_t *_RESTRICT_KYWD); size_t (*old__wcrtomb)(char *_RESTRICT_KYWD, wchar_t, mbstate_t *_RESTRICT_KYWD); int (*old__mbsinit)(const mbstate_t *); --- 50,77 ---- #include "mblocal.h" #include "setlocale.h" #include "_ctype.h" #include "../i18n/_locale.h" + /* + * A cached version of the runes for this thread. Used by ctype.h + */ + __thread const _RuneLocale *_ThreadRuneLocale; + extern _RuneLocale *_Read_RuneMagi(FILE *); extern unsigned char __ctype_C[]; ! static int __setrunelocale(struct xlocale_ctype *, const char *); static int ! __setrunelocale(struct xlocale_ctype *l, const char *encoding) { FILE *fp; char name[PATH_MAX]; _RuneLocale *rl; int saverr, ret; + struct xlocale_ctype saved = *l; /* XXX DOUBLE NOT USED */ size_t (*old__mbrtowc)(wchar_t *_RESTRICT_KYWD, const char *_RESTRICT_KYWD, size_t, mbstate_t *_RESTRICT_KYWD); size_t (*old__wcrtomb)(char *_RESTRICT_KYWD, wchar_t, mbstate_t *_RESTRICT_KYWD); int (*old__mbsinit)(const mbstate_t *);
*** 96,120 **** __ctype_mask[i] = _DefaultRuneLocale.__runetype[i]; __trans_upper[i] = _DefaultRuneLocale.__mapupper[i]; __trans_lower[i] = _DefaultRuneLocale.__maplower[i]; } ! (void) _none_init(&_DefaultRuneLocale); return (0); } /* * If the locale name is the same as our cache, use the cache. */ if (CachedRuneLocale != NULL && strcmp(encoding, ctype_encoding) == 0) { ! _CurrentRuneLocale = CachedRuneLocale; ! __mbrtowc = Cached__mbrtowc; ! __mbsinit = Cached__mbsinit; ! __mbsnrtowcs = Cached__mbsnrtowcs; ! __wcrtomb = Cached__wcrtomb; ! __wcsnrtombs = Cached__wcsnrtombs; return (0); } /* * Slurp the locale file into the cache. --- 107,131 ---- __ctype_mask[i] = _DefaultRuneLocale.__runetype[i]; __trans_upper[i] = _DefaultRuneLocale.__mapupper[i]; __trans_lower[i] = _DefaultRuneLocale.__maplower[i]; } ! (void) _none_init(l, &_DefaultRuneLocale); return (0); } /* * If the locale name is the same as our cache, use the cache. */ if (CachedRuneLocale != NULL && strcmp(encoding, ctype_encoding) == 0) { ! l->runes = CachedRuneLocale; ! l->__mbrtowc = Cached__mbrtowc; ! l->__mbsinit = Cached__mbsinit; ! l->__mbsnrtowcs = Cached__mbsnrtowcs; ! l->__wcrtomb = Cached__wcrtomb; ! l->__wcsnrtombs = Cached__wcsnrtombs; return (0); } /* * Slurp the locale file into the cache.
*** 137,154 **** old__mbsinit = __mbsinit; old__mbsnrtowcs = __mbsnrtowcs; old__wcrtomb = __wcrtomb; old__wcsnrtombs = __wcsnrtombs; ! __mbrtowc = NULL; ! __mbsinit = NULL; ! __mbsnrtowcs = __mbsnrtowcs_std; ! __wcrtomb = NULL; ! __wcsnrtombs = __wcsnrtombs_std; if (strcmp(rl->__encoding, "NONE") == 0) ! ret = _none_init(rl); else if (strcmp(rl->__encoding, "UTF-8") == 0) ret = _UTF8_init(rl); else if (strcmp(rl->__encoding, "EUC-CN") == 0) ret = _EUC_CN_init(rl); else if (strcmp(rl->__encoding, "EUC-JP") == 0) --- 148,165 ---- old__mbsinit = __mbsinit; old__mbsnrtowcs = __mbsnrtowcs; old__wcrtomb = __wcrtomb; old__wcsnrtombs = __wcsnrtombs; ! l->__mbrtowc = NULL; ! l->__mbsinit = NULL; ! l->__mbsnrtowcs = __mbsnrtowcs_std; ! l->__wcrtomb = NULL; ! l->__wcsnrtombs = __wcsnrtombs_std; if (strcmp(rl->__encoding, "NONE") == 0) ! ret = _none_init(l, rl); else if (strcmp(rl->__encoding, "UTF-8") == 0) ret = _UTF8_init(rl); else if (strcmp(rl->__encoding, "EUC-CN") == 0) ret = _EUC_CN_init(rl); else if (strcmp(rl->__encoding, "EUC-JP") == 0)
*** 172,187 **** if (ret == 0) { if (CachedRuneLocale != NULL) { free(CachedRuneLocale); } ! CachedRuneLocale = _CurrentRuneLocale; ! Cached__mbrtowc = __mbrtowc; ! Cached__mbsinit = __mbsinit; ! Cached__mbsnrtowcs = __mbsnrtowcs; ! Cached__wcrtomb = __wcrtomb; ! Cached__wcsnrtombs = __wcsnrtombs; (void) strcpy(ctype_encoding, encoding); /* * We need to overwrite the _ctype array. This requires * some finagling. This is because references to it may --- 183,198 ---- if (ret == 0) { if (CachedRuneLocale != NULL) { free(CachedRuneLocale); } ! CachedRuneLocale = l->runes; ! Cached__mbrtowc = l->__mbrtowc; ! Cached__mbsinit = l->__mbsinit; ! Cached__mbsnrtowcs = l->__mbsnrtowcs; ! Cached__wcrtomb = l->__wcrtomb; ! Cached__wcsnrtombs = l->__wcsnrtombs; (void) strcpy(ctype_encoding, encoding); /* * We need to overwrite the _ctype array. This requires * some finagling. This is because references to it may
*** 226,252 **** /* * Note that we expect the init code will have populated * the CSWIDTH array (__ctype[514-520]) properly. */ } else { ! __mbrtowc = old__mbrtowc; ! __mbsinit = old__mbsinit; ! __mbsnrtowcs = old__mbsnrtowcs; ! __wcrtomb = old__wcrtomb; ! __wcsnrtombs = old__wcsnrtombs; free(rl); } return (ret); } int __wrap_setrunelocale(const char *locale) { ! int ret = __setrunelocale(locale); if (ret != 0) { errno = ret; return (_LDP_ERROR); } return (_LDP_LOADED); } --- 237,289 ---- /* * Note that we expect the init code will have populated * the CSWIDTH array (__ctype[514-520]) properly. */ } else { ! l->__mbrtowc = old__mbrtowc; ! l->__mbsinit = old__mbsinit; ! l->__mbsnrtowcs = old__mbsnrtowcs; ! l->__wcrtomb = old__wcrtomb; ! l->__wcsnrtombs = old__wcsnrtombs; free(rl); } return (ret); } int __wrap_setrunelocale(const char *locale) { ! int ret = __setrunelocale(&__xlocale_global_ctype, locale); if (ret != 0) { errno = ret; return (_LDP_ERROR); } + /* XXX */ + // __mb_cur_max = __xlocale_global_ctype.__mb_cur_max; + // __mb_sb_limit = __xlocale_global_ctype.__mb_sb_limit; + _CurrentRuneLocale = __xlocale_global_ctype.runes; return (_LDP_LOADED); } + + void + __set_thread_rune_locale(locale_t loc) + { + + if (loc == NULL) { + _ThreadRuneLocale = &_DefaultRuneLocale; + } else { + _ThreadRuneLocale = XLOCALE_CTYPE(loc)->runes; + } + } + + void * + __ctype_load(const char *locale, locale_t unused) + { + struct xlocale_ctype *l; + + l = calloc(sizeof(struct xlocale_ctype), 1); + /* XXX */ + + return (l); + }