From 4b10dd6c1959577f57850ca427a94fe22b9f3299 Mon Sep 17 00:00:00 2001 From: Ulrich Drepper Date: Tue, 31 Aug 1999 07:04:41 +0000 Subject: Update. * locale/Makefile (distribute): Add iso-639.def and iso-3166.def. Change charset.h to charmap.h. (categories): Add new categories. Leave out collate for now. Update build rules. * locale/categories.def: Add definitions for new categories. * locale/langinfo.h: Likewise. * locale/locale.h: Likewise. * locale/C-address.c: New file. * locale/C-identification.c: New file. * locale/C-measurement.c: New file. * locale/C-name.c: New file. * locale/C-paper.c: New file. * locale/C-telephone.c: New file. * locale/lc-address.c: Likewise. * locale/lc-identification.c: Likewise. * locale/lc-measurement.c: Likewise. * locale/lc-name.c: Likewise. * locale/lc-paper.c: Likewise. * locale/lc-telephone.c: Likewise. * locale/C-ctype.c: Update for locale rewrite. * locale/C-messages.c: Likewise. * locale/C-monetary.c: Likewise. * locale/C-time.c: Likewise. * locale/lc-collate.c: Likewise. * locale/lc-ctype.c: Likewise. * locale/lc-monetary.c: Likewise. * locale/lc-time.c: Likewise. * locale/localeinfo.h: Likewise. * locale/newlocale.c: Likewise. * locale/setlocale.c: Likewise. * locale/weight.h: Likewise. * locale/findlocale.c: Unconditionally use mmap. Handle new categories. * locale/loadlocale.c: Likewise. * locale/iso-3166.def: New file. * locale/iso-639.def: New file. * locale/programs/charmap-kw.gperf: Add new keywords. * locale/programs/locfile-kw.gperf: Likewise. * locale/programs/locfile-token.h: Define new tokens. * locale/programs/charmap.c: Rewrite to handle multibyte charsets. * locale/programs/charmap.h: New file. * locale/programs/charset.h: Removed. * locale/programs/config.h: Add __LC_LAST. * locale/programs/lc-address.c: New file. * locale/programs/lc-identification.c: New file. * locale/programs/lc-measurement.c: New file. * locale/programs/lc-name.c: New file. * locale/programs/lc-paper.c: New file. * locale/programs/lc-telephone.c: New file. * locale/programs/lc-collate.c: Update for locale rewrite. * locale/programs/lc-ctype.c: Likewise. * locale/programs/lc-messages.c: Likewise. * locale/programs/lc-monetary.c: Likewise. * locale/programs/lc-numeric.c: Likewise. * locale/programs/lc-time.c: Likewise. * locale/programs/locale.c: Likewise. * locale/programs/localedef.c: Likewise. * locale/programs/locfile.c: Likewise. * locale/programs/repertoire.c: Likewise. * locale/programs/repertoire.h: Likewise. * locale/programs/locfile.c: Update prototypes. Update handle_copy definition. * locale/programs/linereader.c: Add handling of wide char strings and new definition file syntax. * locale/programs/linereader.h (struct token): Add elements for wide character strings. * locale/programs/locale-spec.c: Disable handling of collation elements for now. * locale/programs/simple-hash.h: Cleanup. * locale/programs/stringtrans.h: Handle quite of end of line. * string/strcoll.c: Fall back on strcmp for now. * string/strxfrm.c: Fall back on strncpy/strlen for now. * time/strftime.c: Use new wide character data for wcsftime. * time/strptime.c: Remove _nl_C_LC_TIME declaration. * wctype/cname-lookup.h: Update for new LC_CTYPE data. --- locale/newlocale.c | 34 +++++++++++++++++++--------------- 1 file changed, 19 insertions(+), 15 deletions(-) (limited to 'locale/newlocale.c') diff --git a/locale/newlocale.c b/locale/newlocale.c index c54d1c8..61a72c4 100644 --- a/locale/newlocale.c +++ b/locale/newlocale.c @@ -1,5 +1,5 @@ /* Return a reference to locale information record. - Copyright (C) 1996, 1997 Free Software Foundation, Inc. + Copyright (C) 1996, 1997, 1999 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper , 1996. @@ -41,7 +41,7 @@ __locale_t __newlocale (int category_mask, const char *locale, __locale_t base) { /* Intermediate memory for result. */ - const char *newnames[LC_ALL]; + const char *newnames[__LC_LAST]; struct __locale_struct result; __locale_t result_ptr; char *locale_path; @@ -51,10 +51,10 @@ __newlocale (int category_mask, const char *locale, __locale_t base) /* We treat LC_ALL in the same way as if all bits were set. */ if (category_mask == LC_ALL) - category_mask = (1 << LC_ALL) - 1; + category_mask = (1 << __LC_LAST) - 1 - (1 << LC_ALL); /* Sanity check for CATEGORY argument. */ - if ((category_mask & ~((1 << LC_ALL) - 1)) != 0) + if ((category_mask & ~((1 << LC_ALL) - 1 - (1 << LC_ALL))) != 0) ERROR_RETURN; /* `newlocale' does not support asking for the locale name. */ @@ -72,8 +72,9 @@ __newlocale (int category_mask, const char *locale, __locale_t base) else { /* Fill with pointers to C locale data to . */ - for (cnt = 0; cnt < LC_ALL; ++cnt) - result.__locales[cnt] = _nl_C[cnt]; + 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. */ @@ -105,8 +106,9 @@ __newlocale (int category_mask, const char *locale, __locale_t base) /* Get the names for the locales we are interested in. We either allow a composite name or a single name. */ - for (cnt = 0; cnt < LC_ALL; ++cnt) - newnames[cnt] = locale; + for (cnt = 0; cnt < __LC_LAST; ++cnt) + if (cnt != LC_ALL) + newnames[cnt] = locale; if (strchr (locale, ';') != NULL) { /* This is a composite name. Make a copy and split it up. */ @@ -115,12 +117,13 @@ __newlocale (int category_mask, const char *locale, __locale_t base) while ((cp = strchr (np, '=')) != NULL) { - for (cnt = 0; cnt < LC_ALL; ++cnt) - if ((size_t) (cp - np) == _nl_category_name_sizes[cnt] + for (cnt = 0; cnt < __LC_LAST; ++cnt) + if (cnt != LC_ALL + && (size_t) (cp - np) == _nl_category_name_sizes[cnt] && memcmp (np, _nl_category_names[cnt], cp - np) == 0) break; - if (cnt == LC_ALL) + if (cnt == __LC_LAST) /* Bogus category name. */ ERROR_RETURN; @@ -138,15 +141,16 @@ __newlocale (int category_mask, const char *locale, __locale_t base) break; } - for (cnt = 0; cnt < LC_ALL; ++cnt) - if ((category_mask & 1 << cnt) != 0 && newnames[cnt] == locale) + for (cnt = 0; cnt < __LC_LAST; ++cnt) + if (cnt != LC_ALL + && (category_mask & 1 << cnt) != 0 && newnames[cnt] == locale) /* The composite name did not specify the category we need. */ ERROR_RETURN; } /* Now process all categories we are interested in. */ - for (cnt = 0; cnt < LC_ALL; ++cnt) - if ((category_mask & 1 << cnt) != 0) + for (cnt = 0; cnt < __LC_LAST; ++cnt) + if (cnt != LC_ALL && (category_mask & 1 << cnt) != 0) { result.__locales[cnt] = _nl_find_locale (locale_path, locale_path_len, cnt, &newnames[cnt]); -- cgit v1.1