diff --git a/ChangeLog b/ChangeLog index 258a4deadd..bfd26f488f 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,14 @@ 2006-05-15 Ulrich Drepper + * locale/setlocale.c: Change _nl_category_names into a string. + Add new _nl_category_name_idxs. Change all users. + * locale/localeinfo.h: Adjust declaration of _nl_category_names. + Declare _nl_category_name_idxs. + * locale/findlocale.c: Adjust for _nl_category_names change. + * locale/loadlocale.c: Likewise. + * locale/newlocale.c: Likewise. + * intl/dcigettext.c: Likewise. + * iconv/gconv_conf.c (add_alias): Move actual alias handling to... (add_alias2): ...here. New function. (__gconv_read_conf): Simplify builtin alias handling. diff --git a/intl/dcigettext.c b/intl/dcigettext.c index f294dedf2f..b56196ccbe 100644 --- a/intl/dcigettext.c +++ b/intl/dcigettext.c @@ -1,5 +1,5 @@ /* Implementation of the internal dcigettext function. - Copyright (C) 1995-2002,2003,2004,2005 Free Software Foundation, Inc. + Copyright (C) 1995-2005, 2006 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -286,7 +286,8 @@ static const char *guess_category_value PARAMS ((int category, internal_function; #ifdef _LIBC # include "../locale/localeinfo.h" -# define category_to_name(category) _nl_category_names[category] +# define category_to_name(category) \ + _nl_category_names.str + _nl_category_name_idxs[category] #else static const char *category_to_name PARAMS ((int category)) internal_function; #endif diff --git a/locale/findlocale.c b/locale/findlocale.c index 04b197d266..ea24170df5 100644 --- a/locale/findlocale.c +++ b/locale/findlocale.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1996-2001, 2002, 2003 Free Software Foundation, Inc. +/* Copyright (C) 1996-2001, 2002, 2003, 2006 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper , 1996. @@ -80,7 +80,8 @@ _nl_find_locale (const char *locale_path, size_t locale_path_len, variables. */ *name = getenv ("LC_ALL"); if (*name == NULL || (*name)[0] == '\0') - *name = getenv (_nl_category_names[category]); + *name = getenv (_nl_category_names.str + + _nl_category_name_idxs[category]); if (*name == NULL || (*name)[0] == '\0') *name = getenv ("LANG"); } @@ -145,7 +146,8 @@ _nl_find_locale (const char *locale_path, size_t locale_path_len, locale_path, locale_path_len, mask, language, territory, codeset, normalized_codeset, modifier, - _nl_category_names[category], 0); + _nl_category_names.str + + _nl_category_name_idxs[category], 0); if (locale_file == NULL) { @@ -155,7 +157,8 @@ _nl_find_locale (const char *locale_path, size_t locale_path_len, locale_path, locale_path_len, mask, language, territory, codeset, normalized_codeset, modifier, - _nl_category_names[category], 1); + _nl_category_names.str + + _nl_category_name_idxs[category], 1); if (locale_file == NULL) /* This means we are out of core. */ return NULL; diff --git a/locale/loadlocale.c b/locale/loadlocale.c index 2a5935087c..467dff157a 100644 --- a/locale/loadlocale.c +++ b/locale/loadlocale.c @@ -1,5 +1,5 @@ /* Functions to read locale data files. - Copyright (C) 1996-2004, 2005 Free Software Foundation, Inc. + Copyright (C) 1996-2004, 2005, 2006 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper , 1996. @@ -198,7 +198,7 @@ _nl_load_locale (struct loaded_l10nfile *file, int category) + 5 + _nl_category_name_sizes[category] + 1); __mempcpy (__mempcpy (__mempcpy (newp, file->filename, filenamelen), "/SYS_", 5), - _nl_category_names[category], + _nl_category_names.str + _nl_category_name_idxs[category], _nl_category_name_sizes[category] + 1); fd = open_not_cancel_2 (newp, O_RDONLY); diff --git a/locale/localeinfo.h b/locale/localeinfo.h index 3b0ed4f30b..4f746a298d 100644 --- a/locale/localeinfo.h +++ b/locale/localeinfo.h @@ -1,5 +1,5 @@ /* Declarations for internal libc locale interfaces - Copyright (C) 1995-2001, 2002, 2003, 2005 Free Software Foundation, Inc. + Copyright (C) 1995-2003, 2005, 2006 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -172,8 +172,22 @@ enum #define _ISCTYPE(c, desc) \ (((((const uint32_t *) (desc)) - 8)[(c) >> 5] >> ((c) & 0x1f)) & 1) -extern const char *const _nl_category_names[__LC_LAST] attribute_hidden; -extern const size_t _nl_category_name_sizes[__LC_LAST] attribute_hidden; +/* Category name handling variables. */ +#define CATNAMEMF(line) CATNAMEMF1 (line) +#define CATNAMEMF1(line) str##line +extern const union catnamestr_t +{ + struct + { +#define DEFINE_CATEGORY(category, category_name, items, a) \ + char CATNAMEMF (__LINE__)[sizeof (category_name)]; +#include "categories.def" +#undef DEFINE_CATEGORY + }; + char str[0]; +} _nl_category_names attribute_hidden; +const uint8_t _nl_category_name_idxs[__LC_LAST] attribute_hidden; +extern const uint8_t _nl_category_name_sizes[__LC_LAST] attribute_hidden; /* Name of the standard locales. */ extern const char _nl_C_name[] attribute_hidden; diff --git a/locale/newlocale.c b/locale/newlocale.c index b3d4b464b1..0c31ba48ae 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, 2000, 2001, 2002, 2004, 2005 + Copyright (C) 1996, 1997, 1999, 2000-2002, 2004, 2005, 2006 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper , 1996. @@ -133,7 +133,8 @@ __newlocale (int category_mask, const char *locale, __locale_t base) 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) + && memcmp (np, (_nl_category_names.str + + _nl_category_name_idxs[cnt]), cp - np) == 0) break; if (cnt == __LC_LAST) diff --git a/locale/setlocale.c b/locale/setlocale.c index 50bf8e772f..c1b8c3faec 100644 --- a/locale/setlocale.c +++ b/locale/setlocale.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1991, 1992, 1995-2000, 2002, 2003, 2004 +/* Copyright (C) 1991, 1992, 1995-2000, 2002, 2003, 2004, 2006 Free Software Foundation, Inc. This file is part of the GNU C Library. @@ -66,18 +66,27 @@ static char *const _nl_current_used[] = #endif -/* Define an array of category names (also the environment variable names), - indexed by integral category. */ -const char *const _nl_category_names[] = +/* Define an array of category names (also the environment variable names). */ +const union catnamestr_t _nl_category_names attribute_hidden = + { + { +#define DEFINE_CATEGORY(category, category_name, items, a) \ + category_name, +#include "categories.def" +#undef DEFINE_CATEGORY + } + }; + +const uint8_t _nl_category_name_idxs[__LC_LAST] attribute_hidden = { #define DEFINE_CATEGORY(category, category_name, items, a) \ - [category] = category_name, + [category] = offsetof (union catnamestr_t, CATNAMEMF (__LINE__)), #include "categories.def" -#undef DEFINE_CATEGORY - [LC_ALL] = "LC_ALL" +#undef DEFINE_CATEGORY }; + /* An array of their lengths, for convenience. */ -const size_t _nl_category_name_sizes[] = +const uint8_t _nl_category_name_sizes[] attribute_hidden = { #define DEFINE_CATEGORY(category, category_name, items, a) \ [category] = sizeof (category_name) - 1, @@ -173,7 +182,7 @@ new_composite_name (int category, const char *newnames[__LC_LAST]) const char *name = (category == LC_ALL ? newnames[i] : category == i ? newnames[0] : _nl_global_locale.__names[i]); - p = __stpcpy (p, _nl_category_names[i]); + p = __stpcpy (p, _nl_category_names.str + _nl_category_name_idxs[i]); *p++ = '='; p = __stpcpy (p, name); *p++ = ';'; @@ -275,7 +284,9 @@ setlocale (int category, const char *locale) 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) + && (memcmp (np, (_nl_category_names.str + + _nl_category_name_idxs[cnt]), cp - np) + == 0)) break; if (cnt == __LC_LAST)