diff options
Diffstat (limited to 'locale')
-rw-r--r-- | locale/duplocale.c | 15 | ||||
-rw-r--r-- | locale/freelocale.c | 6 | ||||
-rw-r--r-- | locale/newlocale.c | 43 | ||||
-rw-r--r-- | locale/nl_langinfo.c | 2 | ||||
-rw-r--r-- | locale/xlocale.h | 5 |
5 files changed, 35 insertions, 36 deletions
diff --git a/locale/duplocale.c b/locale/duplocale.c index 2dcc0f5b02..4b3bc89945 100644 --- a/locale/duplocale.c +++ b/locale/duplocale.c @@ -1,5 +1,5 @@ /* Duplicate handle for selection of locales. - Copyright (C) 1997 Free Software Foundation, Inc. + Copyright (C) 1997, 2000 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997. @@ -42,12 +42,13 @@ __duplocale (__locale_t dataset) if (result != NULL) { int cnt; - for (cnt = 0; cnt < LC_ALL; ++cnt) - { - result->__locales[cnt] = dataset->__locales[cnt]; - if (result->__locales[cnt]->usage_count < MAX_USAGE_COUNT) - ++result->__locales[cnt]->usage_count; - } + for (cnt = 0; cnt < __LC_LAST; ++cnt) + if (cnt != LC_ALL) + { + result->__locales[cnt] = dataset->__locales[cnt]; + if (result->__locales[cnt]->usage_count < MAX_USAGE_COUNT) + ++result->__locales[cnt]->usage_count; + } } /* It's done. */ diff --git a/locale/freelocale.c b/locale/freelocale.c index 3cfa5276ca..5e7dcbd9af 100644 --- a/locale/freelocale.c +++ b/locale/freelocale.c @@ -1,5 +1,5 @@ /* Free data allocated by a call to setlocale_r - Copyright (C) 1996, 1997 Free Software Foundation, Inc. + Copyright (C) 1996, 1997, 2000 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996. @@ -37,8 +37,8 @@ __freelocale (__locale_t dataset) /* We modify global data. */ __libc_lock_lock (__libc_setlocale_lock); - for (cnt = 0; cnt < LC_ALL; ++cnt) - if (dataset->__locales[cnt]->usage_count != UNDELETABLE) + for (cnt = 0; cnt < __LC_LAST; ++cnt) + if (cnt != LC_ALL && dataset->__locales[cnt]->usage_count != UNDELETABLE) /* We can remove the data. */ _nl_remove_locale (cnt, dataset->__locales[cnt]); diff --git a/locale/newlocale.c b/locale/newlocale.c index 4a2f14513f..5c0d7ba46a 100644 --- a/locale/newlocale.c +++ b/locale/newlocale.c @@ -1,5 +1,5 @@ /* Return a reference to locale information record. - Copyright (C) 1996, 1997, 1999 Free Software Foundation, Inc. + Copyright (C) 1996, 1997, 1999, 2000 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996. @@ -54,7 +54,7 @@ __newlocale (int category_mask, const char *locale, __locale_t base) category_mask = (1 << __LC_LAST) - 1 - (1 << LC_ALL); /* Sanity check for CATEGORY argument. */ - if ((category_mask & ~((1 << LC_ALL) - 1 - (1 << LC_ALL))) != 0) + if ((category_mask & ~((1 << __LC_LAST) - 1 - (1 << LC_ALL))) != 0) ERROR_RETURN; /* `newlocale' does not support asking for the locale name. */ @@ -63,28 +63,25 @@ __newlocale (int category_mask, const char *locale, __locale_t base) /* Allocate memory for the result. */ if (base != NULL) - { - if (base != NULL) - return base; - - result = *base; - } + result = *base; else { - /* Fill with pointers to C locale data to . */ + /* Fill with pointers to C locale data. */ for (cnt = 0; cnt < __LC_LAST; ++cnt) if (cnt != LC_ALL) result.__locales[cnt] = _nl_C[cnt]; + } - /* If no category is to be set we return BASE if available or a - dataset using the C locale data. */ - if (category_mask == 0) - { - result_ptr = (__locale_t) malloc (sizeof (struct __locale_struct)); - *result_ptr = result; + /* If no category is to be set we return BASE if available or a + dataset using the C locale data. */ + if (category_mask == 0) + { + result_ptr = (__locale_t) malloc (sizeof (struct __locale_struct)); + if (result_ptr == NULL) + return NULL; + *result_ptr = result; - goto update; - } + goto update; } /* We perhaps really have to load some data. So we determine the @@ -175,12 +172,12 @@ __newlocale (int category_mask, const char *locale, __locale_t base) update: { union locale_data_value *ctypes = result_ptr->__locales[LC_CTYPE]->values; - result_ptr->__ctype_b = (const unsigned short int *) - (ctypes[_NL_ITEM_INDEX (_NL_CTYPE_CLASS)] .string); - result_ptr->__ctype_tolower = (const int *) - (ctypes[_NL_ITEM_INDEX (_NL_CTYPE_TOLOWER)].string); - result_ptr->__ctype_toupper = (const int *) - (ctypes[_NL_ITEM_INDEX (_NL_CTYPE_TOUPPER)].string); + result_ptr->__ctype_b = (const unsigned short int *) + (ctypes[_NL_ITEM_INDEX (_NL_CTYPE_CLASS)].string); + result_ptr->__ctype_tolower = (const int *) + (ctypes[_NL_ITEM_INDEX (_NL_CTYPE_TOLOWER)].string); + result_ptr->__ctype_toupper = (const int *) + (ctypes[_NL_ITEM_INDEX (_NL_CTYPE_TOUPPER)].string); } return result_ptr; diff --git a/locale/nl_langinfo.c b/locale/nl_langinfo.c index 9b0b7c7e31..5347d79beb 100644 --- a/locale/nl_langinfo.c +++ b/locale/nl_langinfo.c @@ -33,7 +33,7 @@ nl_langinfo (item) unsigned int index = _NL_ITEM_INDEX (item); const struct locale_data *data; - if (category < 0 || category >= LC_ALL) + if (category < 0 || category == LC_ALL || category >= __LC_LAST) /* Bogus category: bogus item. */ return (char *) ""; diff --git a/locale/xlocale.h b/locale/xlocale.h index 809608037d..d1c3f978f1 100644 --- a/locale/xlocale.h +++ b/locale/xlocale.h @@ -1,5 +1,5 @@ /* Definition of locale datatype. - Copyright (C) 1997 Free Software Foundation, Inc. + Copyright (C) 1997, 2000 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997. @@ -27,7 +27,8 @@ go away without warning. */ typedef struct __locale_struct { - struct locale_data *__locales[6]; /* XXX LC_ALL should be used here */ + /* Note: LC_ALL is not a valid index into this array. */ + struct locale_data *__locales[13]; /* 13 = __LC_LAST. */ /* To increase the speed of this solution we add some special members. */ const unsigned short int *__ctype_b; |