diff options
author | Samuel Thibault <samuel.thibault@ens-lyon.org> | 2016-08-20 20:54:39 +0200 |
---|---|---|
committer | Samuel Thibault <samuel.thibault@ens-lyon.org> | 2016-08-20 20:54:39 +0200 |
commit | 29af7775cfef6ed3b466b92e44387574122ed61b (patch) | |
tree | c968738daba6d87d69dc4e8b4cb1445a7b6420cb /locale | |
parent | 4893e0ed57daaff901442bacc10ae09cd3e1850f (diff) | |
parent | f76453c31593957fec1a99b986bfa5506618b79c (diff) |
Merge branch 'baseline' into refs/top-bases/tschwinge/Roger_Whittaker
Diffstat (limited to 'locale')
101 files changed, 547 insertions, 526 deletions
diff --git a/locale/C-address.c b/locale/C-address.c index 1fc2364432..d740505f47 100644 --- a/locale/C-address.c +++ b/locale/C-address.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1998-2014 Free Software Foundation, Inc. +/* Copyright (C) 1998-2015 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@cygnus.com>, 1998. diff --git a/locale/C-collate.c b/locale/C-collate.c index 447233fc5c..d7f3c550a5 100644 --- a/locale/C-collate.c +++ b/locale/C-collate.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1995-2014 Free Software Foundation, Inc. +/* Copyright (C) 1995-2015 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@cygnus.com>, 1995. @@ -144,6 +144,8 @@ const struct __locale_data _nl_C_LC_COLLATE attribute_hidden = /* _NL_COLLATE_COLLSEQWC */ { .string = (const char *) collseqwc }, /* _NL_COLLATE_CODESET */ - { .string = _nl_C_codeset } + { .string = _nl_C_codeset }, + /* _NL_COLLATE_ENCODING_TYPE */ + { .word = __cet_8bit } } }; diff --git a/locale/C-ctype.c b/locale/C-ctype.c index b3fac115e3..aa5f19f838 100644 --- a/locale/C-ctype.c +++ b/locale/C-ctype.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1995-2014 Free Software Foundation, Inc. +/* Copyright (C) 1995-2015 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@cygnus.com>, 1995. @@ -569,22 +569,9 @@ const struct __locale_data _nl_C_LC_CTYPE attribute_hidden = { .string = NULL }, /* _NL_CTYPE_CLASS_NAMES */ { .string = "upper\0" "lower\0" "alpha\0" "digit\0" "xdigit\0" "space\0" - "print\0" "graph\0" "blank\0" "cntrl\0" "punct\0" "alnum\0" -#ifdef PREDEFINED_CLASSES - "left_to_right\0" "right_to_left\0" "num_terminator\0" - "num_separator\0" "segment_separator\0" "block_separator\0" - "direction_control\0" "sym_swap_layout\0" "char_shape_selector\0" - "num_shape_selector\0" "non_spacing\0" "non_spacing_level3\0" - "r_connect\0" "no_connect\0" "no_connect-space\0" - "vowel_connect\0" -#endif - }, + "print\0" "graph\0" "blank\0" "cntrl\0" "punct\0" "alnum\0" }, /* _NL_CTYPE_MAP_NAMES */ - { .string = "toupper\0" "tolower\0" -#ifdef PREDEFINED_CLASSES - "tosymmetric\0" -#endif - }, + { .string = "toupper\0" "tolower\0" }, /* _NL_CTYPE_WIDTH */ { .string = (const char *) _nl_C_LC_CTYPE_width.header }, /* _NL_CTYPE_MB_CUR_MAX */ diff --git a/locale/C-identification.c b/locale/C-identification.c index a306d93730..3864279faf 100644 --- a/locale/C-identification.c +++ b/locale/C-identification.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1998-2014 Free Software Foundation, Inc. +/* Copyright (C) 1998-2015 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@cygnus.com>, 1998. diff --git a/locale/C-measurement.c b/locale/C-measurement.c index 14116343ba..34ec1e8fbd 100644 --- a/locale/C-measurement.c +++ b/locale/C-measurement.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1998-2014 Free Software Foundation, Inc. +/* Copyright (C) 1998-2015 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@cygnus.com>, 1998. diff --git a/locale/C-messages.c b/locale/C-messages.c index ab2c75a99b..bf25bd4e7b 100644 --- a/locale/C-messages.c +++ b/locale/C-messages.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1995-2014 Free Software Foundation, Inc. +/* Copyright (C) 1995-2015 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1995. diff --git a/locale/C-monetary.c b/locale/C-monetary.c index d90631f371..e6066e57ea 100644 --- a/locale/C-monetary.c +++ b/locale/C-monetary.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1995-2014 Free Software Foundation, Inc. +/* Copyright (C) 1995-2015 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@cygnus.com>, 1995. diff --git a/locale/C-name.c b/locale/C-name.c index 29c1b50c78..38659ac11c 100644 --- a/locale/C-name.c +++ b/locale/C-name.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1998-2014 Free Software Foundation, Inc. +/* Copyright (C) 1998-2015 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@cygnus.com>, 1998. diff --git a/locale/C-numeric.c b/locale/C-numeric.c index 121263e318..6703d3593a 100644 --- a/locale/C-numeric.c +++ b/locale/C-numeric.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1995-2014 Free Software Foundation, Inc. +/* Copyright (C) 1995-2015 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@cygnus.com>, 1995. diff --git a/locale/C-paper.c b/locale/C-paper.c index 0b0129d98b..949aefbccc 100644 --- a/locale/C-paper.c +++ b/locale/C-paper.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1998-2014 Free Software Foundation, Inc. +/* Copyright (C) 1998-2015 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@cygnus.com>, 1998. diff --git a/locale/C-telephone.c b/locale/C-telephone.c index a8b49ba301..b2300ad992 100644 --- a/locale/C-telephone.c +++ b/locale/C-telephone.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1998-2014 Free Software Foundation, Inc. +/* Copyright (C) 1998-2015 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@cygnus.com>, 1998. diff --git a/locale/C-time.c b/locale/C-time.c index 8731f39e51..7b5342549f 100644 --- a/locale/C-time.c +++ b/locale/C-time.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1995-2014 Free Software Foundation, Inc. +/* Copyright (C) 1995-2015 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@gnu.org>, 1995. diff --git a/locale/C-translit.h.in b/locale/C-translit.h.in index dbe8723328..71bef640a3 100644 --- a/locale/C-translit.h.in +++ b/locale/C-translit.h.in @@ -1,5 +1,5 @@ /* Transliteration for the C locale. -*-C-*- - Copyright (C) 2000-2014 Free Software Foundation, Inc. + Copyright (C) 2000-2015 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@redhat.com>, 2000. diff --git a/locale/Makefile b/locale/Makefile index 51b383afa8..f1b4343935 100644 --- a/locale/Makefile +++ b/locale/Makefile @@ -1,4 +1,4 @@ -# Copyright (C) 1991-2014 Free Software Foundation, Inc. +# Copyright (C) 1991-2015 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 @@ -20,6 +20,8 @@ # subdir := locale +include ../Makeconfig + headers = locale.h bits/locale.h langinfo.h xlocale.h routines = setlocale findlocale loadlocale loadarchive \ localeconv nl_langinfo nl_langinfo_l mb_cur_max \ @@ -86,15 +88,14 @@ locale-CPPFLAGS = -DLOCALEDIR='"$(localedir)"' \ CPPFLAGS-locale-programs = -DLOCALE_PATH='$(localepath)' \ -DCHARMAP_PATH='"$(i18ndir)/charmaps"' \ -DREPERTOIREMAP_PATH='"$(i18ndir)/repertoiremaps"' \ - -DLOCSRCDIR='"$(i18ndir)/locales"' \ - -DHAVE_CONFIG_H -DNOT_IN_libc + -DLOCSRCDIR='"$(i18ndir)/locales"' CFLAGS-charmap.c = -Wno-write-strings -Wno-char-subscripts CFLAGS-locfile.c = -Wno-write-strings -Wno-char-subscripts CFLAGS-charmap-dir.c = -Wno-write-strings -# This makes sure -DNOT_IN_libc et al are passed for all these modules. -cpp-srcs-left := $(addsuffix .c,$(localedef-modules) $(localedef-aux) \ - $(locale-modules) $(lib-modules)) +# Set libof-* for each routine. +cpp-srcs-left := $(localedef-modules) $(localedef-aux) $(locale-modules) \ + $(lib-modules) lib := locale-programs include $(patsubst %,$(..)cppflags-iterator.mk,$(cpp-srcs-left)) diff --git a/locale/bits/locale.h b/locale/bits/locale.h index 481228f686..41939e2880 100644 --- a/locale/bits/locale.h +++ b/locale/bits/locale.h @@ -1,5 +1,5 @@ /* Definition of locale category symbol values. - Copyright (C) 2001-2014 Free Software Foundation, Inc. + Copyright (C) 2001-2015 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 diff --git a/locale/broken_cur_max.c b/locale/broken_cur_max.c index 7d213402be..1eddbc8ba8 100644 --- a/locale/broken_cur_max.c +++ b/locale/broken_cur_max.c @@ -1,6 +1,6 @@ /* Return number of characters in multibyte representation for current character set. - Copyright (C) 1996-2014 Free Software Foundation, Inc. + Copyright (C) 1996-2015 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996. diff --git a/locale/categories.def b/locale/categories.def index 6a53a6bf7c..045489d741 100644 --- a/locale/categories.def +++ b/locale/categories.def @@ -1,5 +1,5 @@ /* Definition of all available locale categories and their items. -*- C -*- - Copyright (C) 1995-2014 Free Software Foundation, Inc. + Copyright (C) 1995-2015 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 @@ -58,6 +58,7 @@ DEFINE_CATEGORY DEFINE_ELEMENT (_NL_COLLATE_COLLSEQMB, "collate-collseqmb", std, wstring) DEFINE_ELEMENT (_NL_COLLATE_COLLSEQWC, "collate-collseqwc", std, wstring) DEFINE_ELEMENT (_NL_COLLATE_CODESET, "collate-codeset", std, string) + DEFINE_ELEMENT (_NL_COLLATE_ENCODING_TYPE, "collate-encoding-type", std, word) ), NO_POSTLOAD) diff --git a/locale/coll-lookup.c b/locale/coll-lookup.c index dd2a1d7305..a07c497005 100644 --- a/locale/coll-lookup.c +++ b/locale/coll-lookup.c @@ -1,4 +1,4 @@ -/* Copyright (C) 2000-2014 Free Software Foundation, Inc. +/* Copyright (C) 2000-2015 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Bruno Haible <haible@clisp.cons.org>, 2000. diff --git a/locale/coll-lookup.h b/locale/coll-lookup.h index ed65341edf..504b7f1292 100644 --- a/locale/coll-lookup.h +++ b/locale/coll-lookup.h @@ -1,4 +1,4 @@ -/* Copyright (C) 2000-2014 Free Software Foundation, Inc. +/* Copyright (C) 2000-2015 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Bruno Haible <haible@clisp.cons.org>, 2000. diff --git a/locale/duplocale.c b/locale/duplocale.c index 5ea80e59b2..dd048405f8 100644 --- a/locale/duplocale.c +++ b/locale/duplocale.c @@ -1,5 +1,5 @@ /* Duplicate handle for selection of locales. - Copyright (C) 1997-2014 Free Software Foundation, Inc. + Copyright (C) 1997-2015 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997. diff --git a/locale/elem-hash.h b/locale/elem-hash.h index 177e0bc645..74da88ec13 100644 --- a/locale/elem-hash.h +++ b/locale/elem-hash.h @@ -1,4 +1,4 @@ -/* Copyright (C) 1999-2014 Free Software Foundation, Inc. +/* Copyright (C) 1999-2015 Free Software Foundation, Inc. This file is part of the GNU C Library. Written by Ulrich Drepper, <drepper@cygnus.com>. diff --git a/locale/findlocale.c b/locale/findlocale.c index 0c42b99251..9e7df12c72 100644 --- a/locale/findlocale.c +++ b/locale/findlocale.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1996-2014 Free Software Foundation, Inc. +/* Copyright (C) 1996-2015 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996. @@ -17,6 +17,7 @@ <http://www.gnu.org/licenses/>. */ #include <assert.h> +#include <errno.h> #include <locale.h> #include <stdlib.h> #include <string.h> @@ -57,6 +58,45 @@ struct loaded_l10nfile *_nl_locale_file_list[__LC_LAST]; const char _nl_default_locale_path[] attribute_hidden = LOCALEDIR; +/* Checks if the name is actually present, that is, not NULL and not + empty. */ +static inline int +name_present (const char *name) +{ + return name != NULL && name[0] != '\0'; +} + +/* Checks that the locale name neither extremely long, nor contains a + ".." path component (to prevent directory traversal). */ +static inline int +valid_locale_name (const char *name) +{ + /* Not set. */ + size_t namelen = strlen (name); + /* Name too long. The limit is arbitrary and prevents stack overflow + issues later. */ + if (__glibc_unlikely (namelen > 255)) + return 0; + /* Directory traversal attempt. */ + static const char slashdot[4] = {'/', '.', '.', '/'}; + if (__glibc_unlikely (__memmem (name, namelen, + slashdot, sizeof (slashdot)) != NULL)) + return 0; + if (namelen == 2 && __glibc_unlikely (name[0] == '.' && name [1] == '.')) + return 0; + if (namelen >= 3 + && __glibc_unlikely (((name[0] == '.' + && name[1] == '.' + && name[2] == '/') + || (name[namelen - 3] == '/' + && name[namelen - 2] == '.' + && name[namelen - 1] == '.')))) + return 0; + /* If there is a slash in the name, it must start with one. */ + if (__glibc_unlikely (memchr (name, '/', namelen) != NULL) && name[0] != '/') + return 0; + return 1; +} struct __locale_data * internal_function @@ -65,7 +105,7 @@ _nl_find_locale (const char *locale_path, size_t locale_path_len, { int mask; /* Name of the locale for this category. */ - char *loc_name; + const char *cloc_name = *name; const char *language; const char *modifier; const char *territory; @@ -73,56 +113,75 @@ _nl_find_locale (const char *locale_path, size_t locale_path_len, const char *normalized_codeset; struct loaded_l10nfile *locale_file; - if ((*name)[0] == '\0') + if (cloc_name[0] == '\0') { /* The user decides which locale to use by setting environment variables. */ - *name = getenv ("LC_ALL"); - if (*name == NULL || (*name)[0] == '\0') - *name = getenv (_nl_category_names.str - + _nl_category_name_idxs[category]); - if (*name == NULL || (*name)[0] == '\0') - *name = getenv ("LANG"); + cloc_name = getenv ("LC_ALL"); + if (!name_present (cloc_name)) + cloc_name = getenv (_nl_category_names.str + + _nl_category_name_idxs[category]); + if (!name_present (cloc_name)) + cloc_name = getenv ("LANG"); + if (!name_present (cloc_name)) + cloc_name = _nl_C_name; } - if (*name == NULL || (*name)[0] == '\0' - || (__builtin_expect (__libc_enable_secure, 0) - && strchr (*name, '/') != NULL)) - *name = (char *) _nl_C_name; + /* We used to fall back to the C locale if the name contains a slash + character '/', but we now check for directory traversal in + valid_locale_name, so this is no longer necessary. */ - if (__builtin_expect (strcmp (*name, _nl_C_name), 1) == 0 - || __builtin_expect (strcmp (*name, _nl_POSIX_name), 1) == 0) + if (__builtin_expect (strcmp (cloc_name, _nl_C_name), 1) == 0 + || __builtin_expect (strcmp (cloc_name, _nl_POSIX_name), 1) == 0) { /* We need not load anything. The needed data is contained in the library itself. */ - *name = (char *) _nl_C_name; + *name = _nl_C_name; return _nl_C[category]; } + else if (!valid_locale_name (cloc_name)) + { + __set_errno (EINVAL); + return NULL; + } + + *name = cloc_name; /* We really have to load some data. First we try the archive, but only if there was no LOCPATH environment variable specified. */ - if (__builtin_expect (locale_path == NULL, 1)) + if (__glibc_likely (locale_path == NULL)) { struct __locale_data *data = _nl_load_locale_from_archive (category, name); - if (__builtin_expect (data != NULL, 1)) + if (__glibc_likely (data != NULL)) return data; + /* Nothing in the archive with the given name. Expanding it as + an alias and retry. */ + cloc_name = _nl_expand_alias (*name); + if (cloc_name != NULL) + { + data = _nl_load_locale_from_archive (category, &cloc_name); + if (__builtin_expect (data != NULL, 1)) + return data; + } + /* Nothing in the archive. Set the default path to search below. */ locale_path = _nl_default_locale_path; locale_path_len = sizeof _nl_default_locale_path; } + else + /* We really have to load some data. First see whether the name is + an alias. Please note that this makes it impossible to have "C" + or "POSIX" as aliases. */ + cloc_name = _nl_expand_alias (*name); - /* We really have to load some data. First see whether the name is - an alias. Please note that this makes it impossible to have "C" - or "POSIX" as aliases. */ - loc_name = (char *) _nl_expand_alias (*name); - if (loc_name == NULL) + if (cloc_name == NULL) /* It is no alias. */ - loc_name = (char *) *name; + cloc_name = *name; /* Make a writable copy of the locale name. */ - loc_name = strdupa (loc_name); + char *loc_name = strdupa (cloc_name); /* LOCALE can consist of up to four recognized parts for the XPG syntax: diff --git a/locale/freelocale.c b/locale/freelocale.c index 4d3b70c8c1..51f723ec40 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-2014 Free Software Foundation, Inc. + Copyright (C) 1996-2015 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996. diff --git a/locale/global-locale.c b/locale/global-locale.c index b0799fbb38..25c82782dd 100644 --- a/locale/global-locale.c +++ b/locale/global-locale.c @@ -1,5 +1,5 @@ /* Locale object representing the global locale controlled by setlocale. - Copyright (C) 2002-2014 Free Software Foundation, Inc. + Copyright (C) 2002-2015 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 diff --git a/locale/hashval.h b/locale/hashval.h index eadb513d2c..9a79d45f76 100644 --- a/locale/hashval.h +++ b/locale/hashval.h @@ -1,5 +1,5 @@ /* Implement simple hashing table with string based keys. - Copyright (C) 1994-2014 Free Software Foundation, Inc. + Copyright (C) 1994-2015 Free Software Foundation, Inc. This file is part of the GNU C Library. Written by Ulrich Drepper <drepper@gnu.ai.mit.edu>, October 1994. diff --git a/locale/indigits.h b/locale/indigits.h index f251efdd2e..59068c5ca1 100644 --- a/locale/indigits.h +++ b/locale/indigits.h @@ -1,4 +1,4 @@ -/* Copyright (C) 2000-2014 Free Software Foundation, Inc. +/* Copyright (C) 2000-2015 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@gnu.org>, 2000. diff --git a/locale/indigitswc.h b/locale/indigitswc.h index 25a49ee7fb..8c5623fb33 100644 --- a/locale/indigitswc.h +++ b/locale/indigitswc.h @@ -1,4 +1,4 @@ -/* Copyright (C) 2000-2014 Free Software Foundation, Inc. +/* Copyright (C) 2000-2015 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@gnu.org>, 2000. diff --git a/locale/iso-4217.def b/locale/iso-4217.def index bcc170bfb3..414f69bca5 100644 --- a/locale/iso-4217.def +++ b/locale/iso-4217.def @@ -162,6 +162,7 @@ DEFINE_INT_CURR("VUV") /* Vanuatu Vatu */ DEFINE_INT_CURR("WST") /* Samoa Tala */ DEFINE_INT_CURR("XAF") /* Central African Franc (United Republic of Cameroon, Central African Republic, Chad, Congo, Gabon) */ DEFINE_INT_CURR("XCD") /* East Caribbean Dollar (Antiqua, Dominica, Grenada, Montserrat, St. Kitts-Nevis-Anguilla, Saint Lucia, Saint Vincent and the Grenadines) */ +DEFINE_INT_CURR("XDR") /* International Monetary Fund */ DEFINE_INT_CURR("XOF") /* West African Franc (Benin, Ivory Coast, Niger, Senegal, Togo, Upper Volta) */ DEFINE_INT_CURR("XPF") /* French polynesia, New Caledonia, Wallis and Futuna Islands */ DEFINE_INT_CURR("YER") /* Yemeni Rial */ diff --git a/locale/iso-639.def b/locale/iso-639.def index 994792e085..4bea116180 100644 --- a/locale/iso-639.def +++ b/locale/iso-639.def @@ -65,6 +65,7 @@ DEFINE_LANGUAGE_CODE ("Belarusian", be, bel, bel) DEFINE_LANGUAGE_CODE3 ("Bemba", bem, bem) DEFINE_LANGUAGE_CODE ("Bengali", bn, ben, ben) DEFINE_LANGUAGE_CODE3 ("Berber (Other)", ber, ber) +DEFINE_LANGUAGE_CODE3 ("Bhili", bhb, bhb) DEFINE_LANGUAGE_CODE3 ("Bhojpuri", bho, bho) DEFINE_LANGUAGE_CODE ("Bihari", bh, bih, bih) DEFINE_LANGUAGE_CODE3 ("Bikol", bik, bik) @@ -474,6 +475,7 @@ DEFINE_LANGUAGE_CODE ("Tonga (Tonga Islands)", to, ton, ton) DEFINE_LANGUAGE_CODE3 ("Tsimshian", tsi, tsi) DEFINE_LANGUAGE_CODE ("Tsonga", ts, tso, tso) DEFINE_LANGUAGE_CODE ("Tswana", tn, tsn, tsn) +DEFINE_LANGUAGE_CODE3 ("Tulu", tcy, tcy) DEFINE_LANGUAGE_CODE3 ("Tumbuka", tum, tum) DEFINE_LANGUAGE_CODE3 ("Tupi languages", tup, tup) DEFINE_LANGUAGE_CODE3 ("Turkish, Ottoman (1500-1928)", ota, ota) diff --git a/locale/langinfo.h b/locale/langinfo.h index a0155b50fd..ffc5c7f471 100644 --- a/locale/langinfo.h +++ b/locale/langinfo.h @@ -1,5 +1,5 @@ /* Access to locale-dependent parameters. - Copyright (C) 1995-2014 Free Software Foundation, Inc. + Copyright (C) 1995-2015 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 @@ -255,6 +255,7 @@ enum _NL_COLLATE_COLLSEQMB, _NL_COLLATE_COLLSEQWC, _NL_COLLATE_CODESET, + _NL_COLLATE_ENCODING_TYPE, _NL_NUM_LC_COLLATE, /* LC_CTYPE category: character classification. diff --git a/locale/lc-address.c b/locale/lc-address.c index 9c78bfb4fb..98f1530bd5 100644 --- a/locale/lc-address.c +++ b/locale/lc-address.c @@ -1,5 +1,5 @@ /* Define current locale data for LC_ADDRESS category. - Copyright (C) 1998-2014 Free Software Foundation, Inc. + Copyright (C) 1998-2015 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 diff --git a/locale/lc-collate.c b/locale/lc-collate.c index fdfb8a79b7..abeb7b082b 100644 --- a/locale/lc-collate.c +++ b/locale/lc-collate.c @@ -1,5 +1,5 @@ /* Define current locale data for LC_COLLATE category. - Copyright (C) 1995-2014 Free Software Foundation, Inc. + Copyright (C) 1995-2015 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 diff --git a/locale/lc-ctype.c b/locale/lc-ctype.c index 2a2f48d1cd..564864ea95 100644 --- a/locale/lc-ctype.c +++ b/locale/lc-ctype.c @@ -1,5 +1,5 @@ /* Define current locale data for LC_CTYPE category. - Copyright (C) 1995-2014 Free Software Foundation, Inc. + Copyright (C) 1995-2015 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 diff --git a/locale/lc-identification.c b/locale/lc-identification.c index ebdfe5c4b8..083dbfcb09 100644 --- a/locale/lc-identification.c +++ b/locale/lc-identification.c @@ -1,5 +1,5 @@ /* Define current locale data for LC_IDENTIFICATION category. - Copyright (C) 1998-2014 Free Software Foundation, Inc. + Copyright (C) 1998-2015 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 diff --git a/locale/lc-measurement.c b/locale/lc-measurement.c index fff215a63d..c6fc9c296b 100644 --- a/locale/lc-measurement.c +++ b/locale/lc-measurement.c @@ -1,5 +1,5 @@ /* Define current locale data for LC_MEASUREMENT category. - Copyright (C) 1998-2014 Free Software Foundation, Inc. + Copyright (C) 1998-2015 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 diff --git a/locale/lc-messages.c b/locale/lc-messages.c index de385e4b1b..e9be2610f9 100644 --- a/locale/lc-messages.c +++ b/locale/lc-messages.c @@ -1,5 +1,5 @@ /* Define current locale data for LC_MESSAGES category. - Copyright (C) 1995-2014 Free Software Foundation, Inc. + Copyright (C) 1995-2015 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 diff --git a/locale/lc-monetary.c b/locale/lc-monetary.c index d1eadaec90..65af216bc4 100644 --- a/locale/lc-monetary.c +++ b/locale/lc-monetary.c @@ -1,5 +1,5 @@ /* Define current locale data for LC_MONETARY category. - Copyright (C) 1995-2014 Free Software Foundation, Inc. + Copyright (C) 1995-2015 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 diff --git a/locale/lc-name.c b/locale/lc-name.c index ce3c6f737f..0fa7e6999f 100644 --- a/locale/lc-name.c +++ b/locale/lc-name.c @@ -1,5 +1,5 @@ /* Define current locale data for LC_NAME category. - Copyright (C) 1998-2014 Free Software Foundation, Inc. + Copyright (C) 1998-2015 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 diff --git a/locale/lc-numeric.c b/locale/lc-numeric.c index 68a2c79bf1..f678df2203 100644 --- a/locale/lc-numeric.c +++ b/locale/lc-numeric.c @@ -1,5 +1,5 @@ /* Define current locale data for LC_NUMERIC category. - Copyright (C) 1995-2014 Free Software Foundation, Inc. + Copyright (C) 1995-2015 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 diff --git a/locale/lc-paper.c b/locale/lc-paper.c index 69e00f58c0..2bf1cb076c 100644 --- a/locale/lc-paper.c +++ b/locale/lc-paper.c @@ -1,5 +1,5 @@ /* Define current locale data for LC_PAPER category. - Copyright (C) 1998-2014 Free Software Foundation, Inc. + Copyright (C) 1998-2015 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 diff --git a/locale/lc-telephone.c b/locale/lc-telephone.c index 7db0e9b03d..4b44fcf722 100644 --- a/locale/lc-telephone.c +++ b/locale/lc-telephone.c @@ -1,5 +1,5 @@ /* Define current locale data for LC_TELEPHONE category. - Copyright (C) 1998-2014 Free Software Foundation, Inc. + Copyright (C) 1998-2015 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 diff --git a/locale/lc-time.c b/locale/lc-time.c index 49ffe19c63..c7a34b2973 100644 --- a/locale/lc-time.c +++ b/locale/lc-time.c @@ -1,5 +1,5 @@ /* Define current locale data for LC_TIME category. - Copyright (C) 1995-2014 Free Software Foundation, Inc. + Copyright (C) 1995-2015 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 diff --git a/locale/loadarchive.c b/locale/loadarchive.c index e14535e7c0..ce5c21036c 100644 --- a/locale/loadarchive.c +++ b/locale/loadarchive.c @@ -1,5 +1,5 @@ /* Code to load locale data from the locale archive file. - Copyright (C) 2002-2014 Free Software Foundation, Inc. + Copyright (C) 2002-2015 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 @@ -263,7 +263,7 @@ _nl_load_locale_from_archive (int category, const char **namep) } /* If there is no archive or it cannot be loaded for some reason fail. */ - if (__builtin_expect (headmap.ptr == NULL, 0)) + if (__glibc_unlikely (headmap.ptr == NULL)) goto close_and_out; /* We have the archive available. To find the name we first have to @@ -459,11 +459,11 @@ _nl_load_locale_from_archive (int category, const char **namep) Now we need the expected data structures to point into the data. */ lia = malloc (sizeof *lia); - if (__builtin_expect (lia == NULL, 0)) + if (__glibc_unlikely (lia == NULL)) return NULL; lia->name = strdup (*namep); - if (__builtin_expect (lia->name == NULL, 0)) + if (__glibc_unlikely (lia->name == NULL)) { free (lia); return NULL; @@ -478,7 +478,7 @@ _nl_load_locale_from_archive (int category, const char **namep) lia->data[cnt] = _nl_intern_locale_data (cnt, results[cnt].addr, results[cnt].len); - if (__builtin_expect (lia->data[cnt] != NULL, 1)) + if (__glibc_likely (lia->data[cnt] != NULL)) { /* _nl_intern_locale_data leaves us these fields to initialize. */ lia->data[cnt]->alloc = ld_archive; diff --git a/locale/loadlocale.c b/locale/loadlocale.c index f926036208..fdba6e93c4 100644 --- a/locale/loadlocale.c +++ b/locale/loadlocale.c @@ -1,5 +1,5 @@ /* Functions to read locale data files. - Copyright (C) 1996-2014 Free Software Foundation, Inc. + Copyright (C) 1996-2015 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996. @@ -107,7 +107,7 @@ _nl_intern_locale_data (int category, const void *data, size_t datasize) for (cnt = 0; cnt < newdata->nstrings; ++cnt) { size_t idx = filedata->strindex[cnt]; - if (__builtin_expect (idx > (size_t) newdata->filesize, 0)) + if (__glibc_unlikely (idx > (size_t) newdata->filesize)) { puntdata: free (newdata); @@ -183,7 +183,7 @@ _nl_load_locale (struct loaded_l10nfile *file, int category) close_not_cancel_no_status (fd); return; } - if (__builtin_expect (S_ISDIR (st.st_mode), 0)) + if (__glibc_unlikely (S_ISDIR (st.st_mode))) { /* LOCALE/LC_foo is a directory; open LOCALE/LC_foo/SYS_LC_foo instead. */ @@ -221,7 +221,7 @@ _nl_load_locale (struct loaded_l10nfile *file, int category) # endif filedata = __mmap ((caddr_t) 0, st.st_size, PROT_READ, MAP_FILE|MAP_COPY, fd, 0); - if (__builtin_expect (filedata == MAP_FAILED, 0)) + if (__glibc_unlikely (filedata == MAP_FAILED)) { filedata = NULL; if (__builtin_expect (errno, ENOSYS) == ENOSYS) @@ -258,12 +258,12 @@ _nl_load_locale (struct loaded_l10nfile *file, int category) /* We have mapped the data, so we no longer need the descriptor. */ close_not_cancel_no_status (fd); - if (__builtin_expect (filedata == NULL, 0)) + if (__glibc_unlikely (filedata == NULL)) /* We failed to map or read the data. */ return; newdata = _nl_intern_locale_data (category, filedata, st.st_size); - if (__builtin_expect (newdata == NULL, 0)) + if (__glibc_unlikely (newdata == NULL)) /* Bad data. */ { #ifdef _POSIX_MAPPED_FILES diff --git a/locale/locale.h b/locale/locale.h index 269b61cd2b..76d8b56cbb 100644 --- a/locale/locale.h +++ b/locale/locale.h @@ -1,4 +1,4 @@ -/* Copyright (C) 1991-2014 Free Software Foundation, Inc. +/* Copyright (C) 1991-2015 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 diff --git a/locale/localeconv.c b/locale/localeconv.c index 3cb2e2b12b..bbbc3bf55c 100644 --- a/locale/localeconv.c +++ b/locale/localeconv.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1991-2014 Free Software Foundation, Inc. +/* Copyright (C) 1991-2015 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 diff --git a/locale/localeinfo.h b/locale/localeinfo.h index 070914dd51..bdab9fe745 100644 --- a/locale/localeinfo.h +++ b/locale/localeinfo.h @@ -1,5 +1,5 @@ /* Declarations for internal libc locale interfaces - Copyright (C) 1995-2014 Free Software Foundation, Inc. + Copyright (C) 1995-2015 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 @@ -110,6 +110,14 @@ enum coll_sort_rule sort_mask }; +/* Collation encoding type. */ +enum collation_encoding_type +{ + __cet_other, + __cet_8bit, + __cet_utf8 +}; + /* We can map the types of the entries into a few categories. */ enum value_type { diff --git a/locale/localename.c b/locale/localename.c index 7e1a378171..b05b334ff2 100644 --- a/locale/localename.c +++ b/locale/localename.c @@ -1,5 +1,5 @@ /* current locale setting names - Copyright (C) 2002-2014 Free Software Foundation, Inc. + Copyright (C) 2002-2015 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 diff --git a/locale/locarchive.h b/locale/locarchive.h index e00aee46ad..1750ef145f 100644 --- a/locale/locarchive.h +++ b/locale/locarchive.h @@ -1,5 +1,5 @@ /* Definitions for locale archive handling. - Copyright (C) 2002-2014 Free Software Foundation, Inc. + Copyright (C) 2002-2015 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 diff --git a/locale/mb_cur_max.c b/locale/mb_cur_max.c index 2a91ac1c1d..77aa7c2a65 100644 --- a/locale/mb_cur_max.c +++ b/locale/mb_cur_max.c @@ -1,6 +1,6 @@ /* Return number of characters in multibyte representation for current character set. - Copyright (C) 1996-2014 Free Software Foundation, Inc. + Copyright (C) 1996-2015 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996. diff --git a/locale/newlocale.c b/locale/newlocale.c index 18fb6e2606..b495659e63 100644 --- a/locale/newlocale.c +++ b/locale/newlocale.c @@ -1,5 +1,5 @@ /* Return a reference to locale information record. - Copyright (C) 1996-2014 Free Software Foundation, Inc. + Copyright (C) 1996-2015 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996. diff --git a/locale/nl_langinfo.c b/locale/nl_langinfo.c index f30f12a254..ccd7ea4001 100644 --- a/locale/nl_langinfo.c +++ b/locale/nl_langinfo.c @@ -1,5 +1,5 @@ /* User interface for extracting locale-dependent parameters. - Copyright (C) 1995-2014 Free Software Foundation, Inc. + Copyright (C) 1995-2015 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 diff --git a/locale/nl_langinfo_l.c b/locale/nl_langinfo_l.c index b9d02aa8b8..156e09a32f 100644 --- a/locale/nl_langinfo_l.c +++ b/locale/nl_langinfo_l.c @@ -1,5 +1,5 @@ /* User interface for extracting locale-dependent parameters. - Copyright (C) 1995-2014 Free Software Foundation, Inc. + Copyright (C) 1995-2015 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 @@ -20,6 +20,7 @@ #include <locale.h> #include <errno.h> #include <stddef.h> +#include <stdlib.h> #include "localeinfo.h" @@ -43,7 +44,21 @@ __nl_langinfo_l (item, l) if (index == _NL_ITEM_INDEX (_NL_LOCALE_NAME (category))) return (char *) l->__names[category]; +#if defined NL_CURRENT_INDIRECT + /* Make direct reference to every _nl_current_CATEGORY symbol, + since we know only at runtime which categories are used. */ + switch (category) + { +# define DEFINE_CATEGORY(category, category_name, items, a) \ + case category: data = *_nl_current_##category; break; +# include "categories.def" +# undef DEFINE_CATEGORY + default: /* Should be impossible. */ + abort(); + } +#else data = l->__locales[category]; +#endif if (index >= data->nstrings) /* Bogus index for this category: bogus item. */ diff --git a/locale/outdigits.h b/locale/outdigits.h index 37815f0567..11a1b3367d 100644 --- a/locale/outdigits.h +++ b/locale/outdigits.h @@ -1,4 +1,4 @@ -/* Copyright (C) 2000-2014 Free Software Foundation, Inc. +/* Copyright (C) 2000-2015 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@gnu.org>, 2000. diff --git a/locale/outdigitswc.h b/locale/outdigitswc.h index b563372ee4..d872903b3b 100644 --- a/locale/outdigitswc.h +++ b/locale/outdigitswc.h @@ -1,4 +1,4 @@ -/* Copyright (C) 2000-2014 Free Software Foundation, Inc. +/* Copyright (C) 2000-2015 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@gnu.org>, 2000. diff --git a/locale/programs/3level.h b/locale/programs/3level.h index c83cdf205e..5602fd8d88 100644 --- a/locale/programs/3level.h +++ b/locale/programs/3level.h @@ -1,4 +1,4 @@ -/* Copyright (C) 2000-2014 Free Software Foundation, Inc. +/* Copyright (C) 2000-2015 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Bruno Haible <haible@clisp.cons.org>, 2000. diff --git a/locale/programs/charmap-dir.c b/locale/programs/charmap-dir.c index 1317650a10..cf7adea1b5 100644 --- a/locale/programs/charmap-dir.c +++ b/locale/programs/charmap-dir.c @@ -1,4 +1,4 @@ -/* Copyright (C) 2000-2014 Free Software Foundation, Inc. +/* Copyright (C) 2000-2015 Free Software Foundation, Inc. This file is part of the GNU C Library. This program is free software; you can redistribute it and/or modify diff --git a/locale/programs/charmap-dir.h b/locale/programs/charmap-dir.h index b586a259f4..33cd062538 100644 --- a/locale/programs/charmap-dir.h +++ b/locale/programs/charmap-dir.h @@ -1,4 +1,4 @@ -/* Copyright (C) 2000-2014 Free Software Foundation, Inc. +/* Copyright (C) 2000-2015 Free Software Foundation, Inc. This file is part of the GNU C Library. This program is free software; you can redistribute it and/or modify diff --git a/locale/programs/charmap-kw.gperf b/locale/programs/charmap-kw.gperf index cfb5b7c53a..2ce7493aa0 100644 --- a/locale/programs/charmap-kw.gperf +++ b/locale/programs/charmap-kw.gperf @@ -1,5 +1,5 @@ %{ -/* Copyright (C) 1995-2014 Free Software Foundation, Inc. +/* Copyright (C) 1995-2015 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper, <drepper@gnu.org>. diff --git a/locale/programs/charmap-kw.h b/locale/programs/charmap-kw.h index 02ecf4ba36..9a8e5c761f 100644 --- a/locale/programs/charmap-kw.h +++ b/locale/programs/charmap-kw.h @@ -30,7 +30,7 @@ #line 1 "charmap-kw.gperf" -/* Copyright (C) 1995-2014 Free Software Foundation, Inc. +/* Copyright (C) 1995-2015 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper, <drepper@gnu.org>. diff --git a/locale/programs/charmap.c b/locale/programs/charmap.c index 1fcce5c327..1685988003 100644 --- a/locale/programs/charmap.c +++ b/locale/programs/charmap.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1996-2014 Free Software Foundation, Inc. +/* Copyright (C) 1996-2015 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@gnu.org>, 1996. diff --git a/locale/programs/charmap.h b/locale/programs/charmap.h index 1531e02369..08d7e1a623 100644 --- a/locale/programs/charmap.h +++ b/locale/programs/charmap.h @@ -1,4 +1,4 @@ -/* Copyright (C) 1996-2014 Free Software Foundation, Inc. +/* Copyright (C) 1996-2015 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@gnu.org>, 1996. diff --git a/locale/programs/config.h b/locale/programs/config.h index 18334182d1..b5876a6525 100644 --- a/locale/programs/config.h +++ b/locale/programs/config.h @@ -1,5 +1,5 @@ /* Configuration for localedef program. - Copyright (C) 1995-2014 Free Software Foundation, Inc. + Copyright (C) 1995-2015 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@cygnus.com>, 1995. diff --git a/locale/programs/ld-address.c b/locale/programs/ld-address.c index 643f081730..0597e11539 100644 --- a/locale/programs/ld-address.c +++ b/locale/programs/ld-address.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1998-2014 Free Software Foundation, Inc. +/* Copyright (C) 1998-2015 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@cygnus.com>, 1998. diff --git a/locale/programs/ld-collate.c b/locale/programs/ld-collate.c index 037fd2fcc5..a39a94f2cc 100644 --- a/locale/programs/ld-collate.c +++ b/locale/programs/ld-collate.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1995-2014 Free Software Foundation, Inc. +/* Copyright (C) 1995-2015 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@gnu.org>, 1995. @@ -32,6 +32,7 @@ #include "linereader.h" #include "locfile.h" #include "elem-hash.h" +#include "../localeinfo.h" /* Uncomment the following line in the production version. */ /* #define NDEBUG 1 */ @@ -2130,6 +2131,8 @@ collate_output (struct localedef_t *locale, const struct charmap_t *charmap, /* The words have to be handled specially. */ if (idx == _NL_ITEM_INDEX (_NL_COLLATE_SYMB_HASH_SIZEMB)) add_locale_uint32 (&file, 0); + else if (idx == _NL_ITEM_INDEX (_NL_COLLATE_ENCODING_TYPE)) + add_locale_uint32 (&file, __cet_other); else add_locale_empty (&file); } @@ -2493,6 +2496,12 @@ collate_output (struct localedef_t *locale, const struct charmap_t *charmap, add_locale_raw_data (&file, collate->mbseqorder, 256); add_locale_collseq_table (&file, &collate->wcseqorder); add_locale_string (&file, charmap->code_set_name); + if (strcmp (charmap->code_set_name, "UTF-8") == 0) + add_locale_uint32 (&file, __cet_utf8); + else if (charmap->mb_cur_max == 1) + add_locale_uint32 (&file, __cet_8bit); + else + add_locale_uint32 (&file, __cet_other); write_locale_data (output_path, LC_COLLATE, "LC_COLLATE", &file); obstack_free (&weightpool, NULL); diff --git a/locale/programs/ld-ctype.c b/locale/programs/ld-ctype.c index 505cb13c54..3f464ef904 100644 --- a/locale/programs/ld-ctype.c +++ b/locale/programs/ld-ctype.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1995-2014 Free Software Foundation, Inc. +/* Copyright (C) 1995-2015 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@gnu.org>, 1995. @@ -43,15 +43,6 @@ #include <assert.h> -#ifdef PREDEFINED_CLASSES -/* These are the extra bits not in wctype.h since these are not preallocated - classes. */ -# define _ISwspecial1 (1 << 29) -# define _ISwspecial2 (1 << 30) -# define _ISwspecial3 (1 << 31) -#endif - - /* The bit used for representing a special class. */ #define BITPOS(class) ((class) - tok_upper) #define BIT(class) (_ISbit (BITPOS (class))) @@ -114,6 +105,9 @@ struct translit_include_t struct translit_include_t *next; }; +/* Provide some dummy pointer for empty string. */ +static uint32_t no_str[] = { 0 }; + /* Sparse table of uint32_t. */ #define TABLE idx_table @@ -334,26 +328,6 @@ ctype_startup (struct linereader *lr, struct localedef_t *locale, ctype_class_new (lr, ctype, "cntrl"); ctype_class_new (lr, ctype, "punct"); ctype_class_new (lr, ctype, "alnum"); -#ifdef PREDEFINED_CLASSES - /* The following are extensions from ISO 14652. */ - ctype_class_new (lr, ctype, "left_to_right"); - ctype_class_new (lr, ctype, "right_to_left"); - ctype_class_new (lr, ctype, "num_terminator"); - ctype_class_new (lr, ctype, "num_separator"); - ctype_class_new (lr, ctype, "segment_separator"); - ctype_class_new (lr, ctype, "block_separator"); - ctype_class_new (lr, ctype, "direction_control"); - ctype_class_new (lr, ctype, "sym_swap_layout"); - ctype_class_new (lr, ctype, "char_shape_selector"); - ctype_class_new (lr, ctype, "num_shape_selector"); - ctype_class_new (lr, ctype, "non_spacing"); - ctype_class_new (lr, ctype, "non_spacing_level3"); - ctype_class_new (lr, ctype, "normal_connect"); - ctype_class_new (lr, ctype, "r_connect"); - ctype_class_new (lr, ctype, "no_connect"); - ctype_class_new (lr, ctype, "no_connect-space"); - ctype_class_new (lr, ctype, "vowel_connect"); -#endif ctype->class_collection_max = charmap->mb_cur_max == 1 ? 256 : 512; ctype->class_collection @@ -365,18 +339,13 @@ ctype_startup (struct linereader *lr, struct localedef_t *locale, ctype->last_map_idx = MAX_NR_CHARMAP; ctype_map_new (lr, ctype, "toupper", charmap); ctype_map_new (lr, ctype, "tolower", charmap); -#ifdef PREDEFINED_CLASSES - ctype_map_new (lr, ctype, "tosymmetric", charmap); -#endif /* Fill first 256 entries in `toXXX' arrays. */ for (cnt = 0; cnt < 256; ++cnt) { ctype->map_collection[0][cnt] = cnt; ctype->map_collection[1][cnt] = cnt; -#ifdef PREDEFINED_CLASSES - ctype->map_collection[2][cnt] = cnt; -#endif + ctype->map256_collection[0][cnt] = cnt; ctype->map256_collection[1][cnt] = cnt; } @@ -1777,7 +1746,7 @@ find_translit2 (struct locale_ctype_t *ctype, const struct charmap_t *charmap, for (wi = tirunp->from; wi <= wch; wi += tirunp->step) if (wi == wch) - return (uint32_t []) { 0 }; + return no_str; } } @@ -1831,7 +1800,7 @@ read_widestring (struct linereader *ldfile, struct token *now, if (now->tok == tok_default_missing) /* The special name "" will denote this case. */ - wstr = ((uint32_t *) { 0 }); + wstr = no_str; else if (now->tok == tok_bsymbol) { /* Get the value from the repertoire. */ @@ -2266,24 +2235,10 @@ ctype_read (struct linereader *ldfile, struct localedef_t *result, break; if (cnt >= ctype->nr_charclass) { -#ifdef PREDEFINED_CLASSES - if (now->val.str.lenmb == 8 - && memcmp ("special1", now->val.str.startmb, 8) == 0) - class_bit = _ISwspecial1; - else if (now->val.str.lenmb == 8 - && memcmp ("special2", now->val.str.startmb, 8) == 0) - class_bit = _ISwspecial2; - else if (now->val.str.lenmb == 8 - && memcmp ("special3", now->val.str.startmb, 8) == 0) - class_bit = _ISwspecial3; - else -#endif - { - /* OK, it's a new class. */ - ctype_class_new (ldfile, ctype, now->val.str.startmb); + /* OK, it's a new class. */ + ctype_class_new (ldfile, ctype, now->val.str.startmb); - class_bit = _ISwbit (ctype->nr_charclass - 1); - } + class_bit = _ISwbit (ctype->nr_charclass - 1); } else { @@ -2871,31 +2826,6 @@ previous definition was here"))); free (now->val.str.startmb); goto read_mapping; } -#ifdef PREDEFINED_CLASSES - if (strcmp (now->val.str.startmb, "special1") == 0) - { - class_bit = _ISwspecial1; - free (now->val.str.startmb); - goto read_charclass; - } - if (strcmp (now->val.str.startmb, "special2") == 0) - { - class_bit = _ISwspecial2; - free (now->val.str.startmb); - goto read_charclass; - } - if (strcmp (now->val.str.startmb, "special3") == 0) - { - class_bit = _ISwspecial3; - free (now->val.str.startmb); - goto read_charclass; - } - if (strcmp (now->val.str.startmb, "tosymmetric") == 0) - { - mapidx = 2; - goto read_mapping; - } -#endif break; case tok_end: @@ -2928,61 +2858,64 @@ previous definition was here"))); } +/* Subroutine of set_class_defaults, below. */ +static void +set_one_default (struct locale_ctype_t *ctype, + const struct charmap_t *charmap, + int bitpos, int from, int to) +{ + char tmp[2]; + int ch; + int bit = _ISbit (bitpos); + int bitw = _ISwbit (bitpos); + /* Define string. */ + strcpy (tmp, "?"); + + for (ch = from; ch <= to; ++ch) + { + struct charseq *seq; + tmp[0] = ch; + + seq = charmap_find_value (charmap, tmp, 1); + if (seq == NULL) + { + char buf[10]; + sprintf (buf, "U%08X", ch); + seq = charmap_find_value (charmap, buf, 9); + } + if (seq == NULL) + { + if (!be_quiet) + WITH_CUR_LOCALE (error (0, 0, _("\ +%s: character `%s' not defined while needed as default value"), + "LC_CTYPE", tmp)); + } + else if (seq->nbytes != 1) + WITH_CUR_LOCALE (error (0, 0, _("\ +%s: character `%s' in charmap not representable with one byte"), + "LC_CTYPE", tmp)); + else + ctype->class256_collection[seq->bytes[0]] |= bit; + + /* No need to search here, the ASCII value is also the Unicode + value. */ + ELEM (ctype, class_collection, , ch) |= bitw; + } +} + static void set_class_defaults (struct locale_ctype_t *ctype, const struct charmap_t *charmap, struct repertoire_t *repertoire) { - size_t cnt; +#define set_default(bitpos, from, to) \ + set_one_default (ctype, charmap, bitpos, from, to) /* These function defines the default values for the classes and conversions according to POSIX.2 2.5.2.1. It may seem that the order of these if-blocks is arbitrary but it is NOT. Don't move them unless you know what you do! */ - auto void set_default (int bitpos, int from, int to); - - void set_default (int bitpos, int from, int to) - { - char tmp[2]; - int ch; - int bit = _ISbit (bitpos); - int bitw = _ISwbit (bitpos); - /* Define string. */ - strcpy (tmp, "?"); - - for (ch = from; ch <= to; ++ch) - { - struct charseq *seq; - tmp[0] = ch; - - seq = charmap_find_value (charmap, tmp, 1); - if (seq == NULL) - { - char buf[10]; - sprintf (buf, "U%08X", ch); - seq = charmap_find_value (charmap, buf, 9); - } - if (seq == NULL) - { - if (!be_quiet) - WITH_CUR_LOCALE (error (0, 0, _("\ -%s: character `%s' not defined while needed as default value"), - "LC_CTYPE", tmp)); - } - else if (seq->nbytes != 1) - WITH_CUR_LOCALE (error (0, 0, _("\ -%s: character `%s' in charmap not representable with one byte"), - "LC_CTYPE", tmp)); - else - ctype->class256_collection[seq->bytes[0]] |= bit; - - /* No need to search here, the ASCII value is also the Unicode - value. */ - ELEM (ctype, class_collection, , ch) |= bitw; - } - } - /* Set default values if keyword was not present. */ if ((ctype->class_done & BITw (tok_upper)) == 0) /* "If this keyword [lower] is not specified, the lowercase letters @@ -3003,11 +2936,11 @@ set_class_defaults (struct locale_ctype_t *ctype, unsigned long int mask = BIT (tok_upper) | BIT (tok_lower); unsigned long int maskw = BITw (tok_upper) | BITw (tok_lower); - for (cnt = 0; cnt < 256; ++cnt) + for (size_t cnt = 0; cnt < 256; ++cnt) if ((ctype->class256_collection[cnt] & mask) != 0) ctype->class256_collection[cnt] |= BIT (tok_alpha); - for (cnt = 0; cnt < ctype->class_collection_act; ++cnt) + for (size_t cnt = 0; cnt < ctype->class_collection_act; ++cnt) if ((ctype->class_collection[cnt] & maskw) != 0) ctype->class_collection[cnt] |= BITw (tok_alpha); } @@ -3025,11 +2958,11 @@ set_class_defaults (struct locale_ctype_t *ctype, unsigned long int mask = BIT (tok_alpha) | BIT (tok_digit); unsigned long int maskw = BITw (tok_alpha) | BITw (tok_digit); - for (cnt = 0; cnt < 256; ++cnt) + for (size_t cnt = 0; cnt < 256; ++cnt) if ((ctype->class256_collection[cnt] & mask) != 0) ctype->class256_collection[cnt] |= BIT (tok_alnum); - for (cnt = 0; cnt < ctype->class_collection_act; ++cnt) + for (size_t cnt = 0; cnt < ctype->class_collection_act; ++cnt) if ((ctype->class_collection[cnt] & maskw) != 0) ctype->class_collection[cnt] |= BITw (tok_alnum); } @@ -3240,13 +3173,12 @@ set_class_defaults (struct locale_ctype_t *ctype, unsigned long int maskw = BITw (tok_upper) | BITw (tok_lower) | BITw (tok_alpha) | BITw (tok_digit) | BITw (tok_xdigit) | BITw (tok_punct); - size_t cnt; - for (cnt = 0; cnt < ctype->class_collection_act; ++cnt) + for (size_t cnt = 0; cnt < ctype->class_collection_act; ++cnt) if ((ctype->class_collection[cnt] & maskw) != 0) ctype->class_collection[cnt] |= BITw (tok_graph); - for (cnt = 0; cnt < 256; ++cnt) + for (size_t cnt = 0; cnt < 256; ++cnt) if ((ctype->class256_collection[cnt] & mask) != 0) ctype->class256_collection[cnt] |= BIT (tok_graph); } @@ -3262,14 +3194,13 @@ set_class_defaults (struct locale_ctype_t *ctype, unsigned long int maskw = BITw (tok_upper) | BITw (tok_lower) | BITw (tok_alpha) | BITw (tok_digit) | BITw (tok_xdigit) | BITw (tok_punct); - size_t cnt; struct charseq *seq; - for (cnt = 0; cnt < ctype->class_collection_act; ++cnt) + for (size_t cnt = 0; cnt < ctype->class_collection_act; ++cnt) if ((ctype->class_collection[cnt] & maskw) != 0) ctype->class_collection[cnt] |= BITw (tok_print); - for (cnt = 0; cnt < 256; ++cnt) + for (size_t cnt = 0; cnt < 256; ++cnt) if ((ctype->class256_collection[cnt] & mask) != 0) ctype->class256_collection[cnt] |= BIT (tok_print); @@ -3376,13 +3307,13 @@ set_class_defaults (struct locale_ctype_t *ctype, /* "If this keyword [tolower] is not specified, the mapping shall be the reverse mapping of the one specified to `toupper'." [P1003.2] */ { - for (cnt = 0; cnt < ctype->map_collection_act[0]; ++cnt) + for (size_t cnt = 0; cnt < ctype->map_collection_act[0]; ++cnt) if (ctype->map_collection[0][cnt] != 0) ELEM (ctype, map_collection, [1], ctype->map_collection[0][cnt]) = ctype->charnames[cnt]; - for (cnt = 0; cnt < 256; ++cnt) + for (size_t cnt = 0; cnt < 256; ++cnt) if (ctype->map256_collection[0][cnt] != 0) ctype->map256_collection[1][ctype->map256_collection[0][cnt]] = cnt; } @@ -3394,7 +3325,7 @@ set_class_defaults (struct locale_ctype_t *ctype, %s: field `%s' does not contain exactly ten entries"), "LC_CTYPE", "outdigit")); - for (cnt = ctype->outdigits_act; cnt < 10; ++cnt) + for (size_t cnt = ctype->outdigits_act; cnt < 10; ++cnt) { ctype->mboutdigits[cnt] = charmap_find_symbol (charmap, (char *) digits + cnt, @@ -3429,6 +3360,8 @@ no output digits defined and none of the standard names in the charmap"))); ctype->outdigits_act = 10; } + +#undef set_default } @@ -3878,76 +3811,72 @@ allocate_arrays (struct locale_ctype_t *ctype, const struct charmap_t *charmap, /* Now add the explicitly specified widths. */ if (charmap->width_rules != NULL) - { - size_t cnt; - - for (cnt = 0; cnt < charmap->nwidth_rules; ++cnt) - { - unsigned char bytes[charmap->mb_cur_max]; - int nbytes = charmap->width_rules[cnt].from->nbytes; - - /* We have the range of character for which the width is - specified described using byte sequences of the multibyte - charset. We have to convert this to UCS4 now. And we - cannot simply convert the beginning and the end of the - sequence, we have to iterate over the byte sequence and - convert it for every single character. */ - memcpy (bytes, charmap->width_rules[cnt].from->bytes, nbytes); - - while (nbytes < charmap->width_rules[cnt].to->nbytes - || memcmp (bytes, charmap->width_rules[cnt].to->bytes, - nbytes) <= 0) - { - /* Find the UCS value for `bytes'. */ - int inner; - uint32_t wch; - struct charseq *seq = - charmap_find_symbol (charmap, (char *) bytes, nbytes); - - if (seq == NULL) - wch = ILLEGAL_CHAR_VALUE; - else if (seq->ucs4 != UNINITIALIZED_CHAR_VALUE) - wch = seq->ucs4; - else - wch = repertoire_find_value (ctype->repertoire, seq->name, - strlen (seq->name)); - - if (wch != ILLEGAL_CHAR_VALUE) - { - /* Store the value. */ - uint32_t *class_bits = - find_idx (ctype, &ctype->class_collection, NULL, - &ctype->class_collection_act, wch); - - if (class_bits != NULL && (*class_bits & BITw (tok_print))) - wcwidth_table_add (t, wch, - charmap->width_rules[cnt].width); - } - - /* "Increment" the bytes sequence. */ - inner = nbytes - 1; - while (inner >= 0 && bytes[inner] == 0xff) - --inner; - - if (inner < 0) - { - /* We have to extend the byte sequence. */ - if (nbytes >= charmap->width_rules[cnt].to->nbytes) - break; - - bytes[0] = 1; - memset (&bytes[1], 0, nbytes); - ++nbytes; - } - else - { - ++bytes[inner]; - while (++inner < nbytes) - bytes[inner] = 0; - } - } - } - } + for (size_t cnt = 0; cnt < charmap->nwidth_rules; ++cnt) + { + unsigned char bytes[charmap->mb_cur_max]; + int nbytes = charmap->width_rules[cnt].from->nbytes; + + /* We have the range of character for which the width is + specified described using byte sequences of the multibyte + charset. We have to convert this to UCS4 now. And we + cannot simply convert the beginning and the end of the + sequence, we have to iterate over the byte sequence and + convert it for every single character. */ + memcpy (bytes, charmap->width_rules[cnt].from->bytes, nbytes); + + while (nbytes < charmap->width_rules[cnt].to->nbytes + || memcmp (bytes, charmap->width_rules[cnt].to->bytes, + nbytes) <= 0) + { + /* Find the UCS value for `bytes'. */ + int inner; + uint32_t wch; + struct charseq *seq = + charmap_find_symbol (charmap, (char *) bytes, nbytes); + + if (seq == NULL) + wch = ILLEGAL_CHAR_VALUE; + else if (seq->ucs4 != UNINITIALIZED_CHAR_VALUE) + wch = seq->ucs4; + else + wch = repertoire_find_value (ctype->repertoire, seq->name, + strlen (seq->name)); + + if (wch != ILLEGAL_CHAR_VALUE) + { + /* Store the value. */ + uint32_t *class_bits = + find_idx (ctype, &ctype->class_collection, NULL, + &ctype->class_collection_act, wch); + + if (class_bits != NULL && (*class_bits & BITw (tok_print))) + wcwidth_table_add (t, wch, + charmap->width_rules[cnt].width); + } + + /* "Increment" the bytes sequence. */ + inner = nbytes - 1; + while (inner >= 0 && bytes[inner] == 0xff) + --inner; + + if (inner < 0) + { + /* We have to extend the byte sequence. */ + if (nbytes >= charmap->width_rules[cnt].to->nbytes) + break; + + bytes[0] = 1; + memset (&bytes[1], 0, nbytes); + ++nbytes; + } + else + { + ++bytes[inner]; + while (++inner < nbytes) + bytes[inner] = 0; + } + } + } /* Set the width of L'\0' to 0. */ wcwidth_table_add (t, 0, 0); @@ -3976,7 +3905,6 @@ allocate_arrays (struct locale_ctype_t *ctype, const struct charmap_t *charmap, /* First count how many entries we have. This is the upper limit since some entries from the included files might be overwritten. */ size_t number = 0; - size_t cnt; struct translit_t *runp = ctype->translit; struct translit_t **sorted; size_t from_len, to_len; @@ -4036,7 +3964,7 @@ allocate_arrays (struct locale_ctype_t *ctype, const struct charmap_t *charmap, - to-string array. */ from_len = to_len = 0; - for (cnt = 0; cnt < number; ++cnt) + for (size_t cnt = 0; cnt < number; ++cnt) { struct translit_to_t *srunp; from_len += wcslen ((const wchar_t *) sorted[cnt]->from) + 1; @@ -4059,7 +3987,7 @@ allocate_arrays (struct locale_ctype_t *ctype, const struct charmap_t *charmap, from_len = 0; to_len = 0; - for (cnt = 0; cnt < number; ++cnt) + for (size_t cnt = 0; cnt < number; ++cnt) { size_t len; struct translit_to_t *srunp; @@ -4092,12 +4020,9 @@ allocate_arrays (struct locale_ctype_t *ctype, const struct charmap_t *charmap, } else { - /* Provide some dummy pointers since we have nothing to write out. */ - static uint32_t no_str = { 0 }; - - ctype->translit_from_idx = &no_str; - ctype->translit_from_tbl = &no_str; - ctype->translit_to_tbl = &no_str; + ctype->translit_from_idx = no_str; + ctype->translit_from_tbl = no_str; + ctype->translit_to_tbl = no_str; ctype->translit_idx_size = 0; ctype->translit_from_tbl_size = 0; ctype->translit_to_tbl_size = 0; diff --git a/locale/programs/ld-identification.c b/locale/programs/ld-identification.c index 2247b7c38f..7932dc482b 100644 --- a/locale/programs/ld-identification.c +++ b/locale/programs/ld-identification.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1998-2014 Free Software Foundation, Inc. +/* Copyright (C) 1998-2015 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@cygnus.com>, 1998. diff --git a/locale/programs/ld-measurement.c b/locale/programs/ld-measurement.c index fe54b4be1c..f66197f0db 100644 --- a/locale/programs/ld-measurement.c +++ b/locale/programs/ld-measurement.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1998-2014 Free Software Foundation, Inc. +/* Copyright (C) 1998-2015 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@cygnus.com>, 1998. diff --git a/locale/programs/ld-messages.c b/locale/programs/ld-messages.c index 591ffaf5be..ec1a80b467 100644 --- a/locale/programs/ld-messages.c +++ b/locale/programs/ld-messages.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1995-2014 Free Software Foundation, Inc. +/* Copyright (C) 1995-2015 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@gnu.org>, 1995. diff --git a/locale/programs/ld-monetary.c b/locale/programs/ld-monetary.c index 16c8329e77..25270298df 100644 --- a/locale/programs/ld-monetary.c +++ b/locale/programs/ld-monetary.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1995-2014 Free Software Foundation, Inc. +/* Copyright (C) 1995-2015 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@gnu.org>, 1995. diff --git a/locale/programs/ld-name.c b/locale/programs/ld-name.c index d409874753..611eede3cf 100644 --- a/locale/programs/ld-name.c +++ b/locale/programs/ld-name.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1998-2014 Free Software Foundation, Inc. +/* Copyright (C) 1998-2015 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@cygnus.com>, 1998. diff --git a/locale/programs/ld-numeric.c b/locale/programs/ld-numeric.c index f2bd597f78..09244c636c 100644 --- a/locale/programs/ld-numeric.c +++ b/locale/programs/ld-numeric.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1995-2014 Free Software Foundation, Inc. +/* Copyright (C) 1995-2015 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@gnu.org>, 1995. diff --git a/locale/programs/ld-paper.c b/locale/programs/ld-paper.c index eec92da671..da4dae450f 100644 --- a/locale/programs/ld-paper.c +++ b/locale/programs/ld-paper.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1998-2014 Free Software Foundation, Inc. +/* Copyright (C) 1998-2015 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@cygnus.com>, 1998. diff --git a/locale/programs/ld-telephone.c b/locale/programs/ld-telephone.c index 4ae241a88f..7e081d8d32 100644 --- a/locale/programs/ld-telephone.c +++ b/locale/programs/ld-telephone.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1998-2014 Free Software Foundation, Inc. +/* Copyright (C) 1998-2015 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@cygnus.com>, 1998. diff --git a/locale/programs/ld-time.c b/locale/programs/ld-time.c index a40edfd474..db490c6cdf 100644 --- a/locale/programs/ld-time.c +++ b/locale/programs/ld-time.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1995-2014 Free Software Foundation, Inc. +/* Copyright (C) 1995-2015 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@gnu.org>, 1995. diff --git a/locale/programs/linereader.c b/locale/programs/linereader.c index d3eb17acc1..2e05130161 100644 --- a/locale/programs/linereader.c +++ b/locale/programs/linereader.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1996-2014 Free Software Foundation, Inc. +/* Copyright (C) 1996-2015 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@gnu.org>, 1996. diff --git a/locale/programs/linereader.h b/locale/programs/linereader.h index e0b58d1a5c..646915b887 100644 --- a/locale/programs/linereader.h +++ b/locale/programs/linereader.h @@ -1,4 +1,4 @@ -/* Copyright (C) 1996-2014 Free Software Foundation, Inc. +/* Copyright (C) 1996-2015 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper, <drepper@gnu.org>. diff --git a/locale/programs/locale-spec.c b/locale/programs/locale-spec.c index dff344633a..9f1925d47d 100644 --- a/locale/programs/locale-spec.c +++ b/locale/programs/locale-spec.c @@ -1,5 +1,5 @@ /* Handle special requests. - Copyright (C) 1996-2014 Free Software Foundation, Inc. + Copyright (C) 1996-2015 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1996. diff --git a/locale/programs/locale.c b/locale/programs/locale.c index 4b3d15a3fd..b1de17f0d2 100644 --- a/locale/programs/locale.c +++ b/locale/programs/locale.c @@ -1,5 +1,5 @@ /* Implementation of the locale program according to POSIX 9945-2. - Copyright (C) 1995-2014 Free Software Foundation, Inc. + Copyright (C) 1995-2015 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@cygnus.com>, 1995. @@ -295,7 +295,7 @@ print_version (FILE *stream, struct argp_state *state) Copyright (C) %s Free Software Foundation, Inc.\n\ This is free software; see the source for copying conditions. There is NO\n\ warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\ -"), "2014"); +"), "2015"); fprintf (stream, gettext ("Written by %s.\n"), "Ulrich Drepper"); } @@ -792,188 +792,181 @@ print_assignment (const char *name, const char *val, bool dquote) static void show_locale_vars (void) { - size_t cat_no; - const char *lcall = getenv ("LC_ALL") ? : ""; - const char *lang = getenv ("LANG") ? : ""; - - auto void get_source (const char *name); - - void get_source (const char *name) - { - char *val = getenv (name); - - if (lcall[0] != '\0' || val == NULL) - print_assignment (name, lcall[0] ? lcall : lang[0] ? lang : "POSIX", - true); - else - print_assignment (name, val, false); - } + const char *lcall = getenv ("LC_ALL") ?: ""; + const char *lang = getenv ("LANG") ?: ""; /* LANG has to be the first value. */ print_assignment ("LANG", lang, false); /* Now all categories in an unspecified order. */ - for (cat_no = 0; cat_no < NCATEGORIES; ++cat_no) + for (size_t cat_no = 0; cat_no < NCATEGORIES; ++cat_no) if (cat_no != LC_ALL) - get_source (category[cat_no].name); + { + const char *name = category[cat_no].name; + const char *val = getenv (name); + + if (lcall[0] != '\0' || val == NULL) + print_assignment (name, + lcall[0] != '\0' ? lcall + : lang[0] != '\0' ? lang + : "POSIX", + true); + else + print_assignment (name, val, false); + } /* The last is the LC_ALL value. */ print_assignment ("LC_ALL", lcall, false); } -/* Show the information request for NAME. */ +/* Subroutine of show_info, below. */ static void -show_info (const char *name) +print_item (struct cat_item *item) { - size_t cat_no; - - auto void print_item (struct cat_item *item); - - void print_item (struct cat_item *item) + switch (item->value_type) { - switch (item->value_type) - { - case string: - if (show_keyword_name) - printf ("%s=\"", item->name); - fputs (nl_langinfo (item->item_id) ? : "", stdout); - if (show_keyword_name) - putchar ('"'); - putchar ('\n'); - break; - case stringarray: - { - int cnt; - const char *val; - - if (show_keyword_name) - printf ("%s=\"", item->name); + case string: + if (show_keyword_name) + printf ("%s=\"", item->name); + fputs (nl_langinfo (item->item_id) ? : "", stdout); + if (show_keyword_name) + putchar ('"'); + putchar ('\n'); + break; + case stringarray: + { + const char *val; + int cnt; - for (cnt = 0; cnt < item->max - 1; ++cnt) - { - val = nl_langinfo (item->item_id + cnt); - if (val != NULL) - fputs (val, stdout); - putchar (';'); - } + if (show_keyword_name) + printf ("%s=\"", item->name); + for (cnt = 0; cnt < item->max - 1; ++cnt) + { val = nl_langinfo (item->item_id + cnt); if (val != NULL) fputs (val, stdout); - - if (show_keyword_name) - putchar ('"'); - putchar ('\n'); + putchar (';'); } - break; - case stringlist: + + val = nl_langinfo (item->item_id + cnt); + if (val != NULL) + fputs (val, stdout); + + if (show_keyword_name) + putchar ('"'); + putchar ('\n'); + } + break; + case stringlist: + { + int first = 1; + const char *val = nl_langinfo (item->item_id) ? : ""; + + if (show_keyword_name) + printf ("%s=", item->name); + + for (int cnt = 0; cnt < item->max && *val != '\0'; ++cnt) { - int first = 1; - const char *val = nl_langinfo (item->item_id) ? : ""; - int cnt; - - if (show_keyword_name) - printf ("%s=", item->name); - - for (cnt = 0; cnt < item->max && *val != '\0'; ++cnt) - { - printf ("%s%s%s%s", first ? "" : ";", - show_keyword_name ? "\"" : "", val, - show_keyword_name ? "\"" : ""); - val = strchr (val, '\0') + 1; - first = 0; - } - putchar ('\n'); + printf ("%s%s%s%s", first ? "" : ";", + show_keyword_name ? "\"" : "", val, + show_keyword_name ? "\"" : ""); + val = strchr (val, '\0') + 1; + first = 0; } - break; - case byte: - { - const char *val = nl_langinfo (item->item_id); + putchar ('\n'); + } + break; + case byte: + { + const char *val = nl_langinfo (item->item_id); - if (show_keyword_name) - printf ("%s=", item->name); + if (show_keyword_name) + printf ("%s=", item->name); - if (val != NULL) - printf ("%d", *val == '\377' ? -1 : *val); - putchar ('\n'); - } - break; - case bytearray: + if (val != NULL) + printf ("%d", *val == '\377' ? -1 : *val); + putchar ('\n'); + } + break; + case bytearray: + { + const char *val = nl_langinfo (item->item_id); + int cnt = val ? strlen (val) : 0; + + if (show_keyword_name) + printf ("%s=", item->name); + + while (cnt > 1) { - const char *val = nl_langinfo (item->item_id); - int cnt = val ? strlen (val) : 0; + printf ("%d;", *val == '\177' ? -1 : *val); + --cnt; + ++val; + } - if (show_keyword_name) - printf ("%s=", item->name); + printf ("%d\n", cnt == 0 || *val == '\177' ? -1 : *val); + } + break; + case word: + { + union { unsigned int word; char *string; } val; + val.string = nl_langinfo (item->item_id); + if (show_keyword_name) + printf ("%s=", item->name); - while (cnt > 1) - { - printf ("%d;", *val == '\177' ? -1 : *val); - --cnt; - ++val; - } + printf ("%d\n", val.word); + } + break; + case wordarray: + { + int first = 1; + union { unsigned int *wordarray; char *string; } val; - printf ("%d\n", cnt == 0 || *val == '\177' ? -1 : *val); - } - break; - case word: - { - union { unsigned int word; char *string; } val; - val.string = nl_langinfo (item->item_id); - if (show_keyword_name) - printf ("%s=", item->name); + val.string = nl_langinfo (item->item_id); + if (show_keyword_name) + printf ("%s=", item->name); - printf ("%d\n", val.word); - } - break; - case wordarray: + for (int cnt = 0; cnt < item->max; ++cnt) { - int first = 1; - union { unsigned int *wordarray; char *string; } val; - int cnt; - - val.string = nl_langinfo (item->item_id); - if (show_keyword_name) - printf ("%s=", item->name); - - for (cnt = 0; cnt < item->max; ++cnt) - { - printf ("%s%d", first ? "" : ";", val.wordarray[cnt]); - first = 0; - } - putchar ('\n'); + printf ("%s%d", first ? "" : ";", val.wordarray[cnt]); + first = 0; } - break; - case wstring: - case wstringarray: - case wstringlist: - /* We don't print wide character information since the same - information is available in a multibyte string. */ - default: - break; - - } + putchar ('\n'); + } + break; + case wstring: + case wstringarray: + case wstringlist: + /* We don't print wide character information since the same + information is available in a multibyte string. */ + default: + break; } +} - for (cat_no = 0; cat_no < NCATEGORIES; ++cat_no) +/* Show the information request for NAME. */ +static void +show_info (const char *name) +{ + for (size_t cat_no = 0; cat_no < NCATEGORIES; ++cat_no) if (cat_no != LC_ALL) { - size_t item_no; - if (strcmp (name, category[cat_no].name) == 0) /* Print the whole category. */ { if (show_category_name != 0) puts (category[cat_no].name); - for (item_no = 0; item_no < category[cat_no].number; ++item_no) + for (size_t item_no = 0; + item_no < category[cat_no].number; + ++item_no) print_item (&category[cat_no].item_desc[item_no]); return; } - for (item_no = 0; item_no < category[cat_no].number; ++item_no) + for (size_t item_no = 0; item_no < category[cat_no].number; ++item_no) if (strcmp (name, category[cat_no].item_desc[item_no].name) == 0) { if (show_category_name != 0) diff --git a/locale/programs/localedef.c b/locale/programs/localedef.c index 97af5e77c3..2a0f2aa709 100644 --- a/locale/programs/localedef.c +++ b/locale/programs/localedef.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1995-2014 Free Software Foundation, Inc. +/* Copyright (C) 1995-2015 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@cygnus.com>, 1995. @@ -403,7 +403,7 @@ print_version (FILE *stream, struct argp_state *state) Copyright (C) %s Free Software Foundation, Inc.\n\ This is free software; see the source for copying conditions. There is NO\n\ warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\ -"), "2014"); +"), "2015"); fprintf (stream, gettext ("Written by %s.\n"), "Ulrich Drepper"); } diff --git a/locale/programs/localedef.h b/locale/programs/localedef.h index 5cdeabdcda..7e19ff0604 100644 --- a/locale/programs/localedef.h +++ b/locale/programs/localedef.h @@ -1,5 +1,5 @@ /* General definitions for localedef(1). - Copyright (C) 1998-2014 Free Software Foundation, Inc. + Copyright (C) 1998-2015 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@cygnus.com>, 1998. diff --git a/locale/programs/locarchive.c b/locale/programs/locarchive.c index ff4b32e0d2..0b79b9d366 100644 --- a/locale/programs/locarchive.c +++ b/locale/programs/locarchive.c @@ -1,4 +1,4 @@ -/* Copyright (C) 2002-2014 Free Software Foundation, Inc. +/* Copyright (C) 2002-2015 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. diff --git a/locale/programs/locfile-kw.gperf b/locale/programs/locfile-kw.gperf index 71adc10fba..ab40f28d93 100644 --- a/locale/programs/locfile-kw.gperf +++ b/locale/programs/locfile-kw.gperf @@ -1,5 +1,5 @@ %{ -/* Copyright (C) 1996-2014 Free Software Foundation, Inc. +/* Copyright (C) 1996-2015 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@gnu.org>, 1996. diff --git a/locale/programs/locfile-kw.h b/locale/programs/locfile-kw.h index 727df05cda..0978861eed 100644 --- a/locale/programs/locfile-kw.h +++ b/locale/programs/locfile-kw.h @@ -30,7 +30,7 @@ #line 1 "locfile-kw.gperf" -/* Copyright (C) 1996-2014 Free Software Foundation, Inc. +/* Copyright (C) 1996-2015 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@gnu.org>, 1996. diff --git a/locale/programs/locfile-token.h b/locale/programs/locfile-token.h index d8859aebd8..10c9907b1f 100644 --- a/locale/programs/locfile-token.h +++ b/locale/programs/locfile-token.h @@ -1,4 +1,4 @@ -/* Copyright (C) 1996-2014 Free Software Foundation, Inc. +/* Copyright (C) 1996-2015 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@gnu.org>, 1996. diff --git a/locale/programs/locfile.c b/locale/programs/locfile.c index de6b426f0c..33da52e1ee 100644 --- a/locale/programs/locfile.c +++ b/locale/programs/locfile.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1996-2014 Free Software Foundation, Inc. +/* Copyright (C) 1996-2015 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@gnu.org>, 1996. @@ -84,7 +84,7 @@ locfile_read (struct localedef_t *result, const struct charmap_t *charmap) if (ldfile == NULL) { - stpcpy (stpcpy (path, next), filename); + stpcpy (stpcpy (stpcpy (path, next), "/"), filename); ldfile = lr_open (path, locfile_hash); } diff --git a/locale/programs/locfile.h b/locale/programs/locfile.h index b579a4626c..6fc441b2d8 100644 --- a/locale/programs/locfile.h +++ b/locale/programs/locfile.h @@ -1,4 +1,4 @@ -/* Copyright (C) 1996-2014 Free Software Foundation, Inc. +/* Copyright (C) 1996-2015 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@gnu.org>, 1996. @@ -81,7 +81,8 @@ set_big_endian (bool big_endian) /* Munge VALUE so that, when stored, it has the correct byte order for the output files. */ -static inline uint32_t +static uint32_t +__attribute__ ((unused)) maybe_swap_uint32 (uint32_t value) { return swap_endianness_p ? bswap_32 (value) : value; diff --git a/locale/programs/repertoire.c b/locale/programs/repertoire.c index 28e4bcc15f..e7b41eb7c7 100644 --- a/locale/programs/repertoire.c +++ b/locale/programs/repertoire.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1998-2014 Free Software Foundation, Inc. +/* Copyright (C) 1998-2015 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@cygnus.com>, 1998. @@ -96,7 +96,7 @@ repertoire_read (const char *filename) if (repfile == NULL) { - stpcpy (stpcpy (path, next), filename); + stpcpy (stpcpy (stpcpy (path, next), "/"), filename); repfile = lr_open (path, repertoiremap_hash); } diff --git a/locale/programs/repertoire.h b/locale/programs/repertoire.h index 05d0cbc094..559e127a07 100644 --- a/locale/programs/repertoire.h +++ b/locale/programs/repertoire.h @@ -1,4 +1,4 @@ -/* Copyright (C) 1998-2014 Free Software Foundation, Inc. +/* Copyright (C) 1998-2015 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@cygnus.com>, 1998. diff --git a/locale/programs/simple-hash.c b/locale/programs/simple-hash.c index ef371a080c..a4412f9787 100644 --- a/locale/programs/simple-hash.c +++ b/locale/programs/simple-hash.c @@ -1,5 +1,5 @@ /* Implement simple hashing table with string based keys. - Copyright (C) 1994-2014 Free Software Foundation, Inc. + Copyright (C) 1994-2015 Free Software Foundation, Inc. This file is part of the GNU C Library. Written by Ulrich Drepper <drepper@gnu.ai.mit.edu>, October 1994. @@ -27,11 +27,7 @@ #include <stdint.h> #include <sys/types.h> -#if HAVE_OBSTACK -# include <obstack.h> -#else -# include "obstack.h" -#endif +#include <obstack.h> #ifdef HAVE_VALUES_H # include <values.h> @@ -46,10 +42,6 @@ # define BITSPERBYTE 8 #endif -#ifndef bcopy -# define bcopy(s, d, n) memcpy ((d), (s), (n)) -#endif - #define hashval_t uint32_t #include "hashval.h" diff --git a/locale/programs/simple-hash.h b/locale/programs/simple-hash.h index cd85290c0c..a7f97769a8 100644 --- a/locale/programs/simple-hash.h +++ b/locale/programs/simple-hash.h @@ -1,4 +1,4 @@ -/* Copyright (C) 1995-2014 Free Software Foundation, Inc. +/* Copyright (C) 1995-2015 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@gnu.org>, 1995. diff --git a/locale/programs/xmalloc.c b/locale/programs/xmalloc.c index 361c2b49f6..36bc17fe89 100644 --- a/locale/programs/xmalloc.c +++ b/locale/programs/xmalloc.c @@ -1,5 +1,5 @@ /* xmalloc.c -- malloc with out of memory checking - Copyright (C) 1990-2014 Free Software Foundation, Inc. + Copyright (C) 1990-2015 Free Software Foundation, Inc. This file is part of the GNU C Library. This program is free software; you can redistribute it and/or modify diff --git a/locale/programs/xstrdup.c b/locale/programs/xstrdup.c index f8dc00a5d4..a8fadb3d15 100644 --- a/locale/programs/xstrdup.c +++ b/locale/programs/xstrdup.c @@ -1,5 +1,5 @@ /* xstrdup.c -- copy a string with out of memory checking - Copyright (C) 1990-2014 Free Software Foundation, Inc. + Copyright (C) 1990-2015 Free Software Foundation, Inc. This file is part of the GNU C Library. This program is free software; you can redistribute it and/or modify diff --git a/locale/setlocale.c b/locale/setlocale.c index b70fa6cbce..fa9cb3a1d6 100644 --- a/locale/setlocale.c +++ b/locale/setlocale.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1991-2014 Free Software Foundation, Inc. +/* Copyright (C) 1991-2015 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 @@ -272,16 +272,24 @@ setlocale (int category, const char *locale) of entries of the form `CATEGORY=VALUE'. */ const char *newnames[__LC_LAST]; struct __locale_data *newdata[__LC_LAST]; + /* Copy of the locale argument, for in-place splitting. */ + char *locale_copy = NULL; /* Set all name pointers to the argument name. */ for (category = 0; category < __LC_LAST; ++category) if (category != LC_ALL) newnames[category] = (char *) locale; - if (__builtin_expect (strchr (locale, ';') != NULL, 0)) + if (__glibc_unlikely (strchr (locale, ';') != NULL)) { /* This is a composite name. Make a copy and split it up. */ - char *np = strdupa (locale); + locale_copy = strdup (locale); + if (__glibc_unlikely (locale_copy == NULL)) + { + __libc_rwlock_unlock (__libc_setlocale_lock); + return NULL; + } + char *np = locale_copy; char *cp; int cnt; @@ -299,6 +307,7 @@ setlocale (int category, const char *locale) { error_return: __libc_rwlock_unlock (__libc_setlocale_lock); + free (locale_copy); /* Bogus category name. */ ERROR_RETURN; @@ -391,8 +400,9 @@ setlocale (int category, const char *locale) /* Critical section left. */ __libc_rwlock_unlock (__libc_setlocale_lock); - /* Free the resources (the locale path variable). */ + /* Free the resources. */ free (locale_path); + free (locale_copy); return composite; } diff --git a/locale/strlen-hash.h b/locale/strlen-hash.h index b161f2d649..181fbc08b5 100644 --- a/locale/strlen-hash.h +++ b/locale/strlen-hash.h @@ -1,5 +1,5 @@ /* Implements hashing function for string with known length. - Copyright (C) 1996-2014 Free Software Foundation, Inc. + Copyright (C) 1996-2015 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996. diff --git a/locale/tst-C-locale.c b/locale/tst-C-locale.c index afe4dc9a88..12d5e254b8 100644 --- a/locale/tst-C-locale.c +++ b/locale/tst-C-locale.c @@ -1,5 +1,5 @@ /* Tests of C and POSIX locale contents. - Copyright (C) 2000-2014 Free Software Foundation, Inc. + Copyright (C) 2000-2015 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@redhat.com>, 2000. diff --git a/locale/uselocale.c b/locale/uselocale.c index b9114cdf0d..5b253bd5b5 100644 --- a/locale/uselocale.c +++ b/locale/uselocale.c @@ -1,5 +1,5 @@ /* uselocale -- fetch and set the current per-thread locale - Copyright (C) 2002-2014 Free Software Foundation, Inc. + Copyright (C) 2002-2015 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 diff --git a/locale/weight.h b/locale/weight.h index 9eb8ac666a..721bf7dabf 100644 --- a/locale/weight.h +++ b/locale/weight.h @@ -1,4 +1,4 @@ -/* Copyright (C) 1996-2014 Free Software Foundation, Inc. +/* Copyright (C) 1996-2015 Free Software Foundation, Inc. This file is part of the GNU C Library. Written by Ulrich Drepper, <drepper@cygnus.com>. @@ -16,10 +16,15 @@ License along with the GNU C Library; if not, see <http://www.gnu.org/licenses/>. */ +#ifndef _WEIGHT_H_ +#define _WEIGHT_H_ 1 + /* Find index of weight. */ -auto inline int32_t -__attribute ((always_inline)) -findidx (const unsigned char **cpp, size_t len) +static inline int32_t __attribute__ ((always_inline)) +findidx (const int32_t *table, + const int32_t *indirect, + const unsigned char *extra, + const unsigned char **cpp, size_t len) { int_fast32_t i = table[*(*cpp)++]; const unsigned char *cp; @@ -130,3 +135,5 @@ findidx (const unsigned char **cpp, size_t len) /* NOTREACHED */ return 0x43219876; } + +#endif /* weight.h */ diff --git a/locale/weightwc.h b/locale/weightwc.h index 8f047e3ba7..3cd7a69845 100644 --- a/locale/weightwc.h +++ b/locale/weightwc.h @@ -1,4 +1,4 @@ -/* Copyright (C) 1996-2014 Free Software Foundation, Inc. +/* Copyright (C) 1996-2015 Free Software Foundation, Inc. This file is part of the GNU C Library. Written by Ulrich Drepper, <drepper@cygnus.com>. @@ -16,10 +16,15 @@ License along with the GNU C Library; if not, see <http://www.gnu.org/licenses/>. */ +#ifndef _WEIGHTWC_H_ +#define _WEIGHTWC_H_ 1 + /* Find index of weight. */ -auto inline int32_t -__attribute ((always_inline)) -findidx (const wint_t **cpp, size_t len) +static inline int32_t __attribute__ ((always_inline)) +findidx (const int32_t *table, + const int32_t *indirect, + const wint_t *extra, + const wint_t **cpp, size_t len) { wint_t ch = *(*cpp)++; int32_t i = __collidx_table_lookup ((const char *) table, ch); @@ -109,3 +114,5 @@ findidx (const wint_t **cpp, size_t len) /* NOTREACHED */ return 0x43219876; } + +#endif /* weightwc.h */ diff --git a/locale/xlocale.c b/locale/xlocale.c index 67ee392afa..fec4564702 100644 --- a/locale/xlocale.c +++ b/locale/xlocale.c @@ -1,5 +1,5 @@ /* C locale object. - Copyright (C) 2001-2014 Free Software Foundation, Inc. + Copyright (C) 2001-2015 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@cygnus.com>, 2001. diff --git a/locale/xlocale.h b/locale/xlocale.h index f58208fe6f..f920874855 100644 --- a/locale/xlocale.h +++ b/locale/xlocale.h @@ -1,5 +1,5 @@ /* Definition of locale datatype. - Copyright (C) 1997-2014 Free Software Foundation, Inc. + Copyright (C) 1997-2015 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997. |