From 50660812be5588036a14fc85af16bccef68fac02 Mon Sep 17 00:00:00 2001 From: Manuel Novoa III Date: Sun, 24 Aug 2003 03:49:13 +0000 Subject: Fix a few bugs in the new extended locale functions. Move stub gettext functions to a stub libintl to make switching in gnu gettext easier. Also add a few gnu-isms. Change to using hidden names with global weak aliases for the extended locale functions, as expected by libstd++. Slightly rework the locale data generation stuff to allow pregenerated locale data to be used with buildroot. --- libc/misc/ctype/ctype.c | 14 +++++- libc/misc/gnu/obstack.c | 2 +- libc/misc/intl/Makefile | 3 +- libc/misc/intl/intl.c | 106 +++----------------------------------------- libc/misc/locale/.cvsignore | 1 + libc/misc/locale/Makefile | 22 +++++---- libc/misc/locale/locale.c | 71 ++++++++++++++++++----------- libc/misc/time/time.c | 8 +++- libc/misc/wctype/wctype.c | 9 ---- 9 files changed, 82 insertions(+), 154 deletions(-) (limited to 'libc/misc') diff --git a/libc/misc/ctype/ctype.c b/libc/misc/ctype/ctype.c index 0eb97140d..a89e1e75c 100644 --- a/libc/misc/ctype/ctype.c +++ b/libc/misc/ctype/ctype.c @@ -256,8 +256,9 @@ int tolower(int c) #ifdef L_tolower_l #undef tolower_l +#undef __tolower_l -int tolower_l(int c, __locale_t l) +int __tolower_l(int c, __locale_t l) { #if defined(__UCLIBC_HAS_CTYPE_ENFORCED__) assert(CTYPE_DOMAIN_CHECK(c)); @@ -265,6 +266,8 @@ int tolower_l(int c, __locale_t l) return __UCLIBC_CTYPE_IN_TO_DOMAIN(c) ? l->__ctype_tolower[c] : c; } +weak_alias(__tolower_l, tolower_l) + #endif /**********************************************************************/ #ifdef L_toupper @@ -282,8 +285,9 @@ int toupper(int c) #ifdef L_toupper_l #undef toupper_l +#undef __toupper_l -int toupper_l(int c, __locale_t l) +int __toupper_l(int c, __locale_t l) { #if defined(__UCLIBC_HAS_CTYPE_ENFORCED__) assert(CTYPE_DOMAIN_CHECK(c)); @@ -291,6 +295,8 @@ int toupper_l(int c, __locale_t l) return __UCLIBC_CTYPE_IN_TO_DOMAIN(c) ? l->__ctype_toupper[c] : c; } +weak_alias(__toupper_l, toupper_l) + #endif /**********************************************************************/ #if defined(L_isascii) || defined(L_isascii_l) @@ -300,6 +306,8 @@ int __XL(isascii)(int c) return __isascii(c); /* locale-independent */ } +__XL_ALIAS(isascii) + #endif /**********************************************************************/ #if defined(L_toascii) || defined(L_toascii_l) @@ -309,6 +317,8 @@ int __XL(toascii)(int c) return __toascii(c); /* locale-independent */ } +__XL_ALIAS(toascii) + #endif /**********************************************************************/ /* old uClibc extensions */ diff --git a/libc/misc/gnu/obstack.c b/libc/misc/gnu/obstack.c index 87b294c25..a3f7f3f45 100644 --- a/libc/misc/gnu/obstack.c +++ b/libc/misc/gnu/obstack.c @@ -466,7 +466,7 @@ _obstack_memory_used (h) # if (HAVE_LIBINTL_H && ENABLE_NLS) || defined _LIBC # include # ifndef _ -# define _(Str) gettext (Str) +# define _(Str) __dcgettext (NULL, Str, LC_MESSAGES) # endif # else # define _(Str) (Str) diff --git a/libc/misc/intl/Makefile b/libc/misc/intl/Makefile index 75fbb321f..9975e5eb1 100644 --- a/libc/misc/intl/Makefile +++ b/libc/misc/intl/Makefile @@ -25,8 +25,7 @@ TOPDIR=../../../ include $(TOPDIR)Rules.mak MSRC= intl.c -MOBJ= gettext.o ngettext.o dgettext.o dcgettext.o dngettext.o dcngettext.o \ - textdomain.o bindtextdomain.o bind_textdomain_codeset.o +MOBJ= __uClibc_dgettext.o __uClibc_dcgettext.o OBJS=$(MOBJ) diff --git a/libc/misc/intl/intl.c b/libc/misc/intl/intl.c index 183ffcc92..eca6fa96a 100644 --- a/libc/misc/intl/intl.c +++ b/libc/misc/intl/intl.c @@ -16,7 +16,7 @@ */ /* - * Supply some weaks for gettext and friends. Used by strerror*(). + * Supply some weaks for use by strerror*(), etc. */ #include @@ -27,123 +27,27 @@ #include /**********************************************************************/ -#ifdef L_gettext - -char *weak_function gettext(const char *msgid) -{ - return (char *) msgid; -} - -#endif -/**********************************************************************/ -#ifdef L_dgettext +#ifdef L___uClibc_dgettext char *__uClibc_dgettext(const char *domainname, - const char *msgid) + const char *msgid) { return (char *) msgid; } weak_alias (__uClibc_dgettext, __dgettext) -weak_alias (__uClibc_dgettext, dgettext) #endif /**********************************************************************/ -#ifdef L_dcgettext +#ifdef L___uClibc_dcgettext char * __uClibc_dcgettext(const char *domainname, - const char *msgid, int category) + const char *msgid, int category) { return (char *) msgid; } weak_alias (__uClibc_dcgettext, __dcgettext) -weak_alias (__uClibc_dcgettext, dcgettext) - -#endif -/**********************************************************************/ -#ifdef L_ngettext - -char *weak_function ngettext(const char *msgid1, const char *msgid2, - unsigned long int n) -{ - return (char *) ((n == 1) ? msgid1 : msgid2); -} - -#endif -/**********************************************************************/ -#ifdef L_dngettext - -char *weak_function dngettext(const char *domainname, const char *msgid1, - const char *msgid2, unsigned long int n) -{ - return (char *) ((n == 1) ? msgid1 : msgid2); -} - -#endif -/**********************************************************************/ -#ifdef L_dcngettext - -char *weak_function dcngettext(const char *domainname, const char *msgid1, - const char *msgid2, unsigned long int n, - int category) -{ - return (char *) ((n == 1) ? msgid1 : msgid2); -} - -#endif -/**********************************************************************/ -#ifdef L_textdomain - -char *weak_function textdomain(const char *domainname) -{ - static const char default_str[] = "messages"; - - if (domainname && *domainname && strcmp(domainname, default_str)) { - __set_errno(EINVAL); - return NULL; - } - return (char *) default_str; -} - -#endif -/**********************************************************************/ -#ifdef L_bindtextdomain - -char *weak_function bindtextdomain(const char *domainname, const char *dirname) -{ - static const char dir[] = "/"; - - if (!domainname || !*domainname - || (dirname -#if 1 - && ((dirname[0] != '/') || dirname[1]) -#else - && strcmp(dirname, dir) -#endif - ) - ) { - __set_errno(EINVAL); - return NULL; - } - - return (char *) dir; -} - -#endif -/**********************************************************************/ -#ifdef L_bind_textdomain_codeset - -/* Specify the character encoding in which the messages from the - DOMAINNAME message catalog will be returned. */ -char *weak_function bind_textdomain_codeset(const char *domainname, - const char *codeset) -{ - if (!domainname || !*domainname || codeset) { - __set_errno(EINVAL); - } - return NULL; -} #endif /**********************************************************************/ diff --git a/libc/misc/locale/.cvsignore b/libc/misc/locale/.cvsignore index 11e4e51bc..3209b4ee4 100644 --- a/libc/misc/locale/.cvsignore +++ b/libc/misc/locale/.cvsignore @@ -1 +1,2 @@ +locale_data.c locale_data.o diff --git a/libc/misc/locale/Makefile b/libc/misc/locale/Makefile index 8ad041e69..17b208b2e 100644 --- a/libc/misc/locale/Makefile +++ b/libc/misc/locale/Makefile @@ -36,18 +36,14 @@ ifeq ($(UCLIBC_HAS_XLOCALE),y) MOBJx += nl_langinfo_l.o duplocale.o freelocale.o uselocale.o __curlocale.o endif -OBJS= $(MOBJ) $(MOBJx) - -ifeq ($(UCLIBC_HAS_LOCALE),y) - OBJS += $(COBJS) locale_data.o -endif - DATA= ifeq ($(UCLIBC_HAS_LOCALE),y) - DATA += locale_data.o + DATA = locale_data.o endif -all: $(DATA) $(OBJS) $(LIBC) +OBJS= $(MOBJ) $(MOBJx) $(DATA) + +all: $(OBJS) $(LIBC) $(LIBC): ar-target @@ -63,12 +59,14 @@ $(MOBJx): $(MSRC) $(CC) $(CFLAGS) -DL_$* -D__UCLIBC_DO_XLOCALE $< -c -o $*.o $(STRIPTOOL) -x -R .note -R .comment $*.o -$(OBJS): Makefile +locale_data.o: + ln -sf ../../../extra/locale/locale_data.c + $(CC) $(CFLAGS) -c -D__WCHAR_ENABLED -I../../../extra/locale locale_data.c -o $@ + $(STRIPTOOL) -x -R .note -R .comment $*.o -# locale_data.o: -# make -C $(TOPDIR)/extra/locale +$(OBJS): Makefile clean: - rm -f *.[oa] *~ core + rm -f *.[oa] *~ core locale_data.c .PHONY: data diff --git a/libc/misc/locale/locale.c b/libc/misc/locale/locale.c index b101f6dad..8f0cbd415 100644 --- a/libc/misc/locale/locale.c +++ b/libc/misc/locale/locale.c @@ -16,7 +16,6 @@ */ /* Nov. 1, 2002 - * * Reworked setlocale() return values and locale arg processing to * be more like glibc. Applications expecting to be able to * query locale settings should now work... at the cost of almost @@ -24,8 +23,15 @@ * Fixed a bug in the internal fixed-size-string locale specifier code. * * Dec 20, 2002 - * * Added in collation support and updated stub nl_langinfo. + * + * Aug 1, 2003 + * Added glibc-like extended locale stuff (newlocale, duplocale, etc). + * + * Aug 18, 2003 + * Bug in duplocale... collation data wasn't copied. + * Bug in newlocale... translate 1< #include #include +#warning devel code +#include #undef __LOCALE_C_ONLY #ifndef __UCLIBC_HAS_LOCALE__ @@ -249,10 +257,8 @@ char *setlocale(int category, const char *locale) } if (locale != NULL) { /* Not just a query... */ - if (!__newlocale((category == LC_ALL) ? LC_ALL_MASK : (1 << category), - locale, __global_locale) - ) { /* Failed! */ - return NULL; + if (!__newlocale((1 << category), locale, __global_locale)) { + return NULL; /* Failed! */ } update_hr_locale(__global_locale->cur_locale); } @@ -436,35 +442,36 @@ static int init_cur_collate(int der_num, __collate_t *cur_collate) cur_collate->ti_mask = (1 << cur_collate->ti_shift)-1; cur_collate->ii_mask = (1 << cur_collate->ii_shift)-1; -/* printf("base=%d num_col_base: %d %d\n", cdd->base_idx ,cur_collate->num_col_base, cdb->num_col_base); */ +/* fflush(stdout); */ +/* fprintf(stderr,"base=%d num_col_base: %d %d\n", cdd->base_idx ,cur_collate->num_col_base, cdb->num_col_base); */ n = (sizeof(coldata_header_t) + cdh->num_base * sizeof(coldata_base_t) + cdh->num_der * sizeof(coldata_der_t))/2; -/* printf("n = %d\n", n); */ +/* fprintf(stderr,"n = %d\n", n); */ cur_collate->index2weight_tbl = __locale_collate_tbl + n + cdb->index2weight_offset; -/* printf("i2w = %d\n", n + cdb->index2weight_offset); */ +/* fprintf(stderr,"i2w = %d\n", n + cdb->index2weight_offset); */ n += cdh->num_index2weight; cur_collate->index2ruleidx_tbl = __locale_collate_tbl + n + cdb->index2ruleidx_offset; -/* printf("i2r = %d\n", n + cdb->index2ruleidx_offset); */ +/* fprintf(stderr,"i2r = %d\n", n + cdb->index2ruleidx_offset); */ n += cdh->num_index2ruleidx; cur_collate->multistart_tbl = __locale_collate_tbl + n + cdd->multistart_offset; -/* printf("mts = %d\n", n + cdb->multistart_offset); */ +/* fprintf(stderr,"mts = %d\n", n + cdb->multistart_offset); */ n += cdh->num_multistart; cur_collate->overrides_tbl = __locale_collate_tbl + n + cdd->overrides_offset; -/* printf("ovr = %d\n", n + cdd->overrides_offset); */ +/* fprintf(stderr,"ovr = %d\n", n + cdd->overrides_offset); */ n += cdh->num_override; cur_collate->ruletable = __locale_collate_tbl + n; -/* printf("rtb = %d\n", n); */ +/* fprintf(stderr, "rtb = %d\n", n); */ n += cdh->num_ruletable; cur_collate->weightstr = __locale_collate_tbl + n; -/* printf("wts = %d\n", n); */ +/* fprintf(stderr,"wts = %d\n", n); */ n += cdh->num_weightstr; cur_collate->wcs2colidt_tbl = __locale_collate_tbl + n + (((unsigned long)(cdb->wcs2colidt_offset_hi)) << 16) + cdb->wcs2colidt_offset_low; -/* printf("wcs = %lu\n", n + (((unsigned long)(cdb->wcs2colidt_offset_hi)) << 16) */ -/* + cdb->wcs2colidt_offset_low); */ +/* fprintf(stderr,"wcs = %lu\n", n + (((unsigned long)(cdb->wcs2colidt_offset_hi)) << 16) */ +/* + cdb->wcs2colidt_offset_low); */ cur_collate->MAX_WEIGHTS = cdh->MAX_WEIGHTS; @@ -494,13 +501,15 @@ static int init_cur_collate(int der_num, __collate_t *cur_collate) w = *p++; do { i = *p++; -/* fprintf(stderr, " i=%d w=%d *p=%d\n", i, w, *p); */ +/* fprintf(stderr, " i=%d (%#x) w=%d *p=%d\n", i, i, w, *p); */ cur_collate->index2weight[i-1] = w++; cur_collate->index2ruleidx[i-1] = *p++; } while (--n); } + assert(*p == 1); while (*++p) { i = *p; +/* fprintf(stderr, " i=%d (%#x) w=%d *p=%d\n", i, i, p[1], p[2]); */ cur_collate->index2weight[i-1] = *++p; cur_collate->index2ruleidx[i-1] = *++p; } @@ -869,7 +878,7 @@ char *nl_langinfo(nl_item item) char *nl_langinfo(nl_item item) { - return nl_langinfo_l(item, __UCLIBC_CURLOCALE); + return __nl_langinfo_l(item, __UCLIBC_CURLOCALE); } #else /* defined(__UCLIBC_HAS_XLOCALE__) && !defined(__UCLIBC_DO_XLOCALE) */ @@ -1056,6 +1065,10 @@ __locale_t __newlocale(int category_mask, const char *locale, __locale_t base) int i, j, k; unsigned char new_selector[LOCALE_SELECTOR_SIZE]; + if (category_mask == (1 << LC_ALL)) { + category_mask = LC_ALL_MASK; + } + if (!locale || (((unsigned int)(category_mask)) > LC_ALL_MASK)) { INVALID: __set_errno(EINVAL); @@ -1141,20 +1154,22 @@ weak_alias(__newlocale, newlocale) #warning REMINDER: When we allocate ctype tables, remember to dup them. #endif -__locale_t duplocale(__locale_t dataset) +__locale_t __duplocale(__locale_t dataset) { __locale_t r; uint16_t * i2w; + size_t n; assert(dataset != LC_GLOBAL_LOCALE); if ((r = malloc(sizeof(__uclibc_locale_t))) != NULL) { - if ((i2w = calloc(2*dataset->collate.max_col_index+2, - sizeof(uint16_t))) + n = 2*dataset->collate.max_col_index+2; + if ((i2w = calloc(n, sizeof(uint16_t))) != NULL ) { memcpy(r, dataset, sizeof(__uclibc_locale_t)); r->collate.index2weight = i2w; + memcpy(i2w, dataset->collate.index2weight, n * sizeof(uint16_t)); } else { free(r); r = NULL; @@ -1163,6 +1178,8 @@ __locale_t duplocale(__locale_t dataset) return r; } +weak_alias(__duplocale, duplocale) + #endif /**********************************************************************/ #ifdef L_freelocale @@ -1171,7 +1188,7 @@ __locale_t duplocale(__locale_t dataset) #warning REMINDER: When we allocate ctype tables, remember to free them. #endif -void freelocale(__locale_t dataset) +void __freelocale(__locale_t dataset) { assert(dataset != __global_locale); assert(dataset != LC_GLOBAL_LOCALE); @@ -1180,11 +1197,13 @@ void freelocale(__locale_t dataset) free(dataset); /* Free locale */ } +weak_alias(__freelocale, freelocale) + #endif /**********************************************************************/ #ifdef L_uselocale -__locale_t uselocale(__locale_t dataset) +__locale_t __uselocale(__locale_t dataset) { __locale_t old; @@ -1208,6 +1227,8 @@ __locale_t uselocale(__locale_t dataset) return old; } +weak_alias(__uselocale, uselocale) + #endif /**********************************************************************/ #ifdef L___curlocale @@ -1283,8 +1304,8 @@ int __locale_mbrtowc_l(wchar_t *__restrict dst, #ifdef __CTYPE_HAS_8_BIT_LOCALES if (loc->encoding == __ctype_encoding_8_bit) { wchar_t wc = *dst - 0x80; - *dst = __LOCALE_PTR->tbl8c2wc[ - (__LOCALE_PTR->idx8c2wc[wc >> Cc2wc_IDX_SHIFT] + *dst = loc->tbl8c2wc[ + (loc->idx8c2wc[wc >> Cc2wc_IDX_SHIFT] << Cc2wc_IDX_SHIFT) + (wc & (Cc2wc_ROW_LEN - 1))]; if (*dst) { return 1; diff --git a/libc/misc/time/time.c b/libc/misc/time/time.c index 0ae91f69a..9bc8bc4cf 100644 --- a/libc/misc/time/time.c +++ b/libc/misc/time/time.c @@ -652,7 +652,7 @@ size_t strftime(char *__restrict s, size_t maxsize, const char *__restrict format, const struct tm *__restrict timeptr) { - return strftime_l(s, maxsize, format, timeptr, __UCLIBC_CURLOCALE); + return __strftime_l(s, maxsize, format, timeptr, __UCLIBC_CURLOCALE); } #else /* defined(__UCLIBC_HAS_XLOCALE__) && !defined(__UCLIBC_DO_XLOCALE) */ @@ -1106,6 +1106,8 @@ size_t __XL(strftime)(char *__restrict s, size_t maxsize, goto LOOP; } +__XL_ALIAS(strftime) + #endif /* defined(__UCLIBC_HAS_XLOCALE__) && !defined(__UCLIBC_DO_XLOCALE) */ #endif @@ -1127,7 +1129,7 @@ size_t __XL(strftime)(char *__restrict s, size_t maxsize, char *strptime(const char *__restrict buf, const char *__restrict format, struct tm *__restrict tm) { - return strptime_l(buf, format, tm, __UCLIBC_CURLOCALE); + return __strptime_l(buf, format, tm, __UCLIBC_CURLOCALE); } #else /* defined(__UCLIBC_HAS_XLOCALE__) && !defined(__UCLIBC_DO_XLOCALE) */ @@ -1482,6 +1484,8 @@ char *__XL(strptime)(const char *__restrict buf, const char *__restrict format, return NULL; } +__XL_ALIAS(strptime) + #endif /* defined(__UCLIBC_HAS_XLOCALE__) && !defined(__UCLIBC_DO_XLOCALE) */ #endif diff --git a/libc/misc/wctype/wctype.c b/libc/misc/wctype/wctype.c index e0dde3a1f..851d2625b 100644 --- a/libc/misc/wctype/wctype.c +++ b/libc/misc/wctype/wctype.c @@ -44,15 +44,6 @@ #ifdef __UCLIBC_HAS_XLOCALE__ #include - -extern int __iswctype_l (wint_t __wc, wctype_t __desc, __locale_t __locale); - __THROW; -extern wint_t __towlower_l (wint_t __wc, __locale_t __locale) __THROW; - -extern wint_t __towupper_l (wint_t __wc, __locale_t __locale) __THROW; -extern wint_t __towctrans_l (wint_t __wc, wctrans_t __desc, - __locale_t __locale) __THROW; - #endif /* __UCLIBC_HAS_XLOCALE__ */ /* We know wide char support is enabled. We wouldn't be here otherwise. */ -- cgit v1.2.3