[arch-commits] Commit in glibc/trunk (3 files)
Frederik Schwan
freswa at gemini.archlinux.org
Wed Mar 2 14:22:25 UTC 2022
Date: Wednesday, March 2, 2022 @ 14:22:24
Author: freswa
Revision: 438319
Fix C.UTF-8 generation errors
fixes FS#73797
Added:
glibc/trunk/0001-localedata-Do-not-generate-output-if-warnings-were-p.patch
glibc/trunk/0001-localedef-Update-LC_MONETARY-handling-Bug-28845.patch
Modified:
glibc/trunk/PKGBUILD
-----------------------------------------------------------------+
0001-localedata-Do-not-generate-output-if-warnings-were-p.patch | 69 ++
0001-localedef-Update-LC_MONETARY-handling-Bug-28845.patch | 302 ++++++++++
PKGBUILD | 13
3 files changed, 382 insertions(+), 2 deletions(-)
Added: 0001-localedata-Do-not-generate-output-if-warnings-were-p.patch
===================================================================
--- 0001-localedata-Do-not-generate-output-if-warnings-were-p.patch (rev 0)
+++ 0001-localedata-Do-not-generate-output-if-warnings-were-p.patch 2022-03-02 14:22:24 UTC (rev 438319)
@@ -0,0 +1,69 @@
+From 732dd3a63d39c7ca77e817b462285c14551c8b49 Mon Sep 17 00:00:00 2001
+From: Carlos O'Donell <carlos at redhat.com>
+Date: Thu, 3 Feb 2022 16:01:52 -0500
+Subject: [PATCH] localedata: Do not generate output if warnings were present.
+
+With LC_MONETARY parsing fixed we can now generate locales
+without forcing output with '-c'.
+
+Removing '-c' from localedef invocation is the equivalent of
+using -Werror for localedef. The glibc locale sources should
+always be clean and free from warnings.
+
+We remove '-c' from both test locale generation and the targets
+used for installing locales e.g. install-locale-archive, and
+install-locale-files.
+
+Tested on x86_64 and i686 without regressions.
+Tested with install-locale-archive target.
+Tested with install-locale-files target.
+
+Reviewed-by: DJ Delorie <dj at redhat.com>
+(cherry picked from commit 1c7a34567d21fbd3b706c77cd794956b43daefe7)
+---
+ localedata/Makefile | 4 ++--
+ localedata/gen-locale.sh | 10 ++++++++--
+ 2 files changed, 10 insertions(+), 4 deletions(-)
+
+diff --git a/localedata/Makefile b/localedata/Makefile
+index 9ae2e5c161..7741ac3b5e 100644
+--- a/localedata/Makefile
++++ b/localedata/Makefile
+@@ -468,11 +468,11 @@ define build-one-locale
+ endef
+
+ $(INSTALL-SUPPORTED-LOCALE-ARCHIVE): install-locales-dir
+- @flags="-c"; \
++ @flags=""; \
+ $(build-one-locale)
+
+ $(INSTALL-SUPPORTED-LOCALE-FILES): install-locales-dir
+- @flags="-c --no-archive --no-hard-links"; \
++ @flags="--no-archive --no-hard-links"; \
+ $(build-one-locale)
+
+ tst-setlocale-ENV = LC_ALL=ja_JP.EUC-JP
+diff --git a/localedata/gen-locale.sh b/localedata/gen-locale.sh
+index 7fce35f212..8053c816a6 100644
+--- a/localedata/gen-locale.sh
++++ b/localedata/gen-locale.sh
+@@ -54,8 +54,14 @@ modifier=`echo $locfile|sed 's|[^.]*[.]\([^@ ]*\)\(@[^ ]*\)\?/LC_CTYPE|\2|'`
+
+ echo "Generating locale $locale.$charmap: this might take a while..."
+
+-# Run quietly and force output.
+-flags="--quiet -c"
++# Do not force output with '-c', all locales should compile without
++# warning or errors. There is likewise no need to run quietly with
++# '--quiet' since all locales should compile without additional
++# diagnostics. If there are messages printed then we want to see
++# them, fix them, and the associated error or warning. During
++# development it may be beneficialy to put '--quiet -c' here to allow
++# you to develop in-progress locales.
++flags=""
+
+ # For SJIS the charmap is SHIFT_JIS. We just want the locale to have
+ # a slightly nicer name instead of using "*.SHIFT_SJIS", but that
+--
+2.35.1
+
Added: 0001-localedef-Update-LC_MONETARY-handling-Bug-28845.patch
===================================================================
--- 0001-localedef-Update-LC_MONETARY-handling-Bug-28845.patch (rev 0)
+++ 0001-localedef-Update-LC_MONETARY-handling-Bug-28845.patch 2022-03-02 14:22:24 UTC (rev 438319)
@@ -0,0 +1,302 @@
+From 3feecd80013c822a12d4b01c5c25e155dfbc6e2f Mon Sep 17 00:00:00 2001
+From: Carlos O'Donell <carlos at redhat.com>
+Date: Thu, 3 Feb 2022 16:51:59 -0500
+Subject: [PATCH] localedef: Update LC_MONETARY handling (Bug 28845)
+
+ISO C17, POSIX Issue 7, and ISO 30112 all allow the char*
+types to be empty strings i.e. "", integer or char values to
+be -1 or CHAR_MAX respectively, with the exception of
+decimal_point which must be non-empty in ISO C. Note that
+the defaults for mon_grouping vary, but are functionaly
+equivalent e.g. "\177" (no further grouping reuqired) vs.
+"" (no grouping defined for all groups).
+
+We include a broad comment talking about harmonizing ISO C,
+POSIX, ISO 30112, and the default C/POSIX locale for glibc.
+
+We reorder all setting based on locale/categories.def order.
+
+We soften all missing definitions from errors to warnings when
+defaults exist.
+
+Given that ISO C, POSIX and ISO 30112 allow the empty string
+we change LC_MONETARY handling of mon_decimal_point to allow
+the empty string. If mon_decimal_point is not defined at all
+then we pick the existing legacy glibc default value of
+<U002E> i.e. ".".
+
+We also set the default for mon_thousands_sep_wc at the
+same time as mon_thousands_sep, but this is not a change in
+behaviour, it is always either a matching value or L'\0',
+but if in the future we change the default to a non-empty
+string we would need to update both at the same time.
+
+Tested on x86_64 and i686 without regressions.
+Tested with install-locale-archive target.
+Tested with install-locale-files target.
+
+Reviewed-by: DJ Delorie <dj at redhat.com>
+(cherry picked from commit 2ab8b74567dc0a9a3c98696e6444881997dd6c49)
+---
+ locale/programs/ld-monetary.c | 182 +++++++++++++++++++++++++++-------
+ 1 file changed, 146 insertions(+), 36 deletions(-)
+
+diff --git a/locale/programs/ld-monetary.c b/locale/programs/ld-monetary.c
+index 3b0412b405..18698bbe94 100644
+--- a/locale/programs/ld-monetary.c
++++ b/locale/programs/ld-monetary.c
+@@ -196,21 +196,105 @@ No definition for %s category found"), "LC_MONETARY");
+ }
+ }
+
++ /* Generally speaking there are 3 standards the define the default,
++ warning, and error behaviour of LC_MONETARY. They are ISO/IEC TR 30112,
++ ISO/IEC 9899:2018 (ISO C17), and POSIX.1-2017. Within 30112 we have the
++ definition of a standard i18n FDCC-set, which for LC_MONETARY has the
++ following default values:
++ int_curr_symbol ""
++ currency_symbol ""
++ mon_decimal_point "<U002C>" i.e. ","
++ mon_thousand_sep ""
++ mon_grouping "\177" i.e. CHAR_MAX
++ positive_sign ""
++ negative_sign "<U002E>" i.e. "."
++ int_frac_digits -1
++ frac_digits -1
++ p_cs_precedes -1
++ p_sep_by_space -1
++ n_cs_precedes -1
++ n_sep_by_space -1
++ p_sign_posn -1
++ n_sign_posn -1
++ Under 30112 a keyword that is not provided implies an empty string ""
++ for string values or a -1 for integer values, and indicates the value
++ is unspecified with no default implied. No errors are considered.
++ The exception is mon_grouping which is a string with a terminating
++ CHAR_MAX.
++ For POSIX Issue 7 we have:
++ https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap07.html
++ and again values not provided default to "" or -1, and indicate the value
++ is not available to the locale. The exception is mon_grouping which is
++ a string with a terminating CHAR_MAX. For the POSIX locale the values of
++ LC_MONETARY should be:
++ int_curr_symbol ""
++ currency_symbol ""
++ mon_decimal_point ""
++ mon_thousands_sep ""
++ mon_grouping "\177" i.e. CHAR_MAX
++ positive_sign ""
++ negative_sign ""
++ int_frac_digits -1
++ frac_digits -1
++ p_cs_precedes -1
++ p_sep_by_space -1
++ n_cs_precedes -1
++ n_sep_by_space -1
++ p_sign_posn -1
++ n_sign_posn -1
++ int_p_cs_precedes -1
++ int_p_sep_by_space -1
++ int_n_cs_precedes -1
++ int_n_sep_by_space -1
++ int_p_sign_posn -1
++ int_n_sign_posn -1
++ Like with 30112, POSIX also considers no error if the keywords are
++ missing, only that if the cateory as a whole is missing the referencing
++ of the category results in unspecified behaviour.
++ For ISO C17 there is no default value provided, but the localeconv
++ specification in 7.11.2.1 admits that members of char * type may point
++ to "" to indicate a value is not available or is of length zero.
++ The exception is decimal_point (not mon_decimal_point) which must be a
++ defined non-empty string. The values of char, which are generally
++ mapped to integer values in 30112 and POSIX, must be non-negative
++ numbers that map to CHAR_MAX when a value is not available in the
++ locale.
++ In ISO C17 for the "C" locale all values are empty strings "", or
++ CHAR_MAX, with the exception of decimal_point which is "." (defined
++ in LC_NUMERIC). ISO C17 makes no exception for mon_grouping like
++ 30112 and POSIX, but a value of "" is functionally equivalent to
++ "\177" since neither defines a grouping (though the latter terminates
++ the grouping).
++
++ Lastly, we must consider the legacy C/POSIX locale that implemented
++ as a builtin in glibc and wether a default value mapping to the
++ C/POSIX locale may benefit the user from a compatibility perspective.
++
++ Thus given 30112, POSIX, ISO C, and the builtin C/POSIX locale we
++ need to pick appropriate defaults below. */
++
++ /* The members of LC_MONETARY are handled in the order of their definition
++ in locale/categories.def. Please keep them in that order. */
++
++ /* The purpose of TEST_ELEM is to define a default value for the fields
++ in the category if the field was not defined in the cateory. If the
++ category was present but we didn't see a definition for the field then
++ we also issue a warning, otherwise the only warning you get is the one
++ earlier when a default category is created (completely missing category).
++ This missing field warning is glibc-specific since no standard requires
++ this warning, but we consider it valuable to print a warning for all
++ missing fields in the category. */
+ #define TEST_ELEM(cat, initval) \
+ if (monetary->cat == NULL) \
+ { \
+ if (! nothing) \
+- record_error (0, 0, _("%s: field `%s' not defined"), \
+- "LC_MONETARY", #cat); \
++ record_warning (_("%s: field `%s' not defined"), \
++ "LC_MONETARY", #cat); \
+ monetary->cat = initval; \
+ }
+
++ /* Keyword: int_curr_symbol. */
+ TEST_ELEM (int_curr_symbol, "");
+- TEST_ELEM (currency_symbol, "");
+- TEST_ELEM (mon_thousands_sep, "");
+- TEST_ELEM (positive_sign, "");
+- TEST_ELEM (negative_sign, "");
+-
+ /* The international currency symbol must come from ISO 4217. */
+ if (monetary->int_curr_symbol != NULL)
+ {
+@@ -247,41 +331,63 @@ not correspond to a valid name in ISO 4217 [--no-warnings=intcurrsym]"),
+ }
+ }
+
+- /* The decimal point must not be empty. This is not said explicitly
+- in POSIX but ANSI C (ISO/IEC 9899) says in 4.4.2.1 it has to be
+- != "". */
++ /* Keyword: currency_symbol */
++ TEST_ELEM (currency_symbol, "");
++
++ /* Keyword: mon_decimal_point */
++ /* ISO C17 7.11.2.1.3 explicitly allows mon_decimal_point to be the
++ empty string e.g. "". This indicates the value is not available in the
++ current locale or is of zero length. However, if the value was never
++ defined then we issue a warning and use a glibc-specific default. ISO
++ 30112 in the i18n FDCC-Set uses <U002C> ",", and POSIX Issue 7 in the
++ POSIX locale uses "". It is specific to glibc that the default is <U002E>
++ "."; we retain this existing behaviour for backwards compatibility. */
+ if (monetary->mon_decimal_point == NULL)
+ {
+ if (! nothing)
+- record_error (0, 0, _("%s: field `%s' not defined"),
+- "LC_MONETARY", "mon_decimal_point");
++ record_warning (_("%s: field `%s' not defined, using defaults"),
++ "LC_MONETARY", "mon_decimal_point");
+ monetary->mon_decimal_point = ".";
+ monetary->mon_decimal_point_wc = L'.';
+ }
+- else if (monetary->mon_decimal_point[0] == '\0' && ! be_quiet && ! nothing)
++
++ /* Keyword: mon_thousands_sep */
++ if (monetary->mon_thousands_sep == NULL)
+ {
+- record_error (0, 0, _("\
+-%s: value for field `%s' must not be an empty string"),
+- "LC_MONETARY", "mon_decimal_point");
++ if (! nothing)
++ record_warning (_("%s: field `%s' not defined, using defaults"),
++ "LC_MONETARY", "mon_thousands_sep");
++ monetary->mon_thousands_sep = "";
++ monetary->mon_thousands_sep_wc = L'\0';
+ }
+
++ /* Keyword: mon_grouping */
+ if (monetary->mon_grouping_len == 0)
+ {
+ if (! nothing)
+- record_error (0, 0, _("%s: field `%s' not defined"),
+- "LC_MONETARY", "mon_grouping");
+-
++ record_warning (_("%s: field `%s' not defined"),
++ "LC_MONETARY", "mon_grouping");
++ /* Missing entries are given 1 element in their bytearray with
++ a value of CHAR_MAX which indicates that "No further grouping
++ is to be performed" (functionally equivalent to ISO C's "C"
++ locale default of ""). */
+ monetary->mon_grouping = (char *) "\177";
+ monetary->mon_grouping_len = 1;
+ }
+
++ /* Keyword: positive_sign */
++ TEST_ELEM (positive_sign, "");
++
++ /* Keyword: negative_sign */
++ TEST_ELEM (negative_sign, "");
++
+ #undef TEST_ELEM
+ #define TEST_ELEM(cat, min, max, initval) \
+ if (monetary->cat == -2) \
+ { \
+ if (! nothing) \
+- record_error (0, 0, _("%s: field `%s' not defined"), \
+- "LC_MONETARY", #cat); \
++ record_warning (_("%s: field `%s' not defined"), \
++ "LC_MONETARY", #cat); \
+ monetary->cat = initval; \
+ } \
+ else if ((monetary->cat < min || monetary->cat > max) \
+@@ -300,16 +406,11 @@ not correspond to a valid name in ISO 4217 [--no-warnings=intcurrsym]"),
+ TEST_ELEM (p_sign_posn, -1, 4, -1);
+ TEST_ELEM (n_sign_posn, -1, 4, -1);
+
+- /* The non-POSIX.2 extensions are optional. */
+- if (monetary->duo_int_curr_symbol == NULL)
+- monetary->duo_int_curr_symbol = monetary->int_curr_symbol;
+- if (monetary->duo_currency_symbol == NULL)
+- monetary->duo_currency_symbol = monetary->currency_symbol;
+-
+- if (monetary->duo_int_frac_digits == -2)
+- monetary->duo_int_frac_digits = monetary->int_frac_digits;
+- if (monetary->duo_frac_digits == -2)
+- monetary->duo_frac_digits = monetary->frac_digits;
++ /* Keyword: crncystr */
++ monetary->crncystr = (char *) xmalloc (strlen (monetary->currency_symbol)
++ + 2);
++ monetary->crncystr[0] = monetary->p_cs_precedes ? '-' : '+';
++ strcpy (&monetary->crncystr[1], monetary->currency_symbol);
+
+ #undef TEST_ELEM
+ #define TEST_ELEM(cat, alt, min, max) \
+@@ -327,6 +428,17 @@ not correspond to a valid name in ISO 4217 [--no-warnings=intcurrsym]"),
+ TEST_ELEM (int_p_sign_posn, p_sign_posn, -1, 4);
+ TEST_ELEM (int_n_sign_posn, n_sign_posn, -1, 4);
+
++ /* The non-POSIX.2 extensions are optional. */
++ if (monetary->duo_int_curr_symbol == NULL)
++ monetary->duo_int_curr_symbol = monetary->int_curr_symbol;
++ if (monetary->duo_currency_symbol == NULL)
++ monetary->duo_currency_symbol = monetary->currency_symbol;
++
++ if (monetary->duo_int_frac_digits == -2)
++ monetary->duo_int_frac_digits = monetary->int_frac_digits;
++ if (monetary->duo_frac_digits == -2)
++ monetary->duo_frac_digits = monetary->frac_digits;
++
+ TEST_ELEM (duo_p_cs_precedes, p_cs_precedes, -1, 1);
+ TEST_ELEM (duo_p_sep_by_space, p_sep_by_space, -1, 2);
+ TEST_ELEM (duo_n_cs_precedes, n_cs_precedes, -1, 1);
+@@ -349,17 +461,15 @@ not correspond to a valid name in ISO 4217 [--no-warnings=intcurrsym]"),
+ if (monetary->duo_valid_to == 0)
+ monetary->duo_valid_to = 99991231;
+
++ /* Keyword: conversion_rate */
+ if (monetary->conversion_rate[0] == 0)
+ {
+ monetary->conversion_rate[0] = 1;
+ monetary->conversion_rate[1] = 1;
+ }
+
+- /* Create the crncystr entry. */
+- monetary->crncystr = (char *) xmalloc (strlen (monetary->currency_symbol)
+- + 2);
+- monetary->crncystr[0] = monetary->p_cs_precedes ? '-' : '+';
+- strcpy (&monetary->crncystr[1], monetary->currency_symbol);
++ /* A value for monetary-decimal-point-wc was set when
++ monetary_decimal_point was set, likewise for monetary-thousands-sep-wc. */
+ }
+
+
+--
+2.35.1
+
Modified: PKGBUILD
===================================================================
--- PKGBUILD 2022-03-02 13:35:25 UTC (rev 438318)
+++ PKGBUILD 2022-03-02 14:22:24 UTC (rev 438319)
@@ -23,7 +23,10 @@
locale-gen
lib32-glibc.conf
sdt.h sdt-config.h
- disable-clone3.diff)
+ disable-clone3.diff
+ 0001-localedef-Update-LC_MONETARY-handling-Bug-28845.patch
+ 0001-localedata-Do-not-generate-output-if-warnings-were-p.patch
+)
validpgpkeys=(7273542B39962DF7B299931416792B4EA25340F8 # Carlos O'Donell
BC7C7372637EC10C57D7AA6579C43DFBF1CF2187) # Siddhesh Poyarekar
b2sums=('623c728884f070cd87ffeb9203f74206197c52405ac9bc44f3dd519a3468b8e8ae2536c883e5d17d94417dbd1e91775de2e674314e4ff7424f9720026d6b7063'
@@ -33,7 +36,9 @@
'7c265e6d36a5c0dff127093580827d15519b6c7205c2e1300e82f0fb5b9dd00b6accb40c56581f18179c4fbbc95bd2bf1b900ace867a83accde0969f7b609f8a'
'a6a5e2f2a627cc0d13d11a82458cfd0aa75ec1c5a3c7647e5d5a3bb1d4c0770887a3909bfda1236803d5bc9801bfd6251e13483e9adf797e4725332cd0d91a0e'
'214e995e84b342fe7b2a7704ce011b7c7fc74c2971f98eeb3b4e677b99c860addc0a7d91b8dc0f0b8be7537782ee331999e02ba48f4ccc1c331b60f27d715678'
- 'edef5f724f68ea95c6b0127bd13a10245f548afc381b2d0a6d1d06ee9f87b7dd89c6becd35d5ae722bf838594eb870a747f67f07f46e7d63f8c8d1a43cce4a52')
+ 'edef5f724f68ea95c6b0127bd13a10245f548afc381b2d0a6d1d06ee9f87b7dd89c6becd35d5ae722bf838594eb870a747f67f07f46e7d63f8c8d1a43cce4a52'
+ '3c4de02d6308a4d39693e6effa08894ae096397347e439b93b0b5328aba41a373f7f2eeb88c109970f69cca65aaa74ba14e384d6d033f6a913438f4f920854a6'
+ 'b6014af23688ea971d7af38d58829c8016a0af63770b7f5e8bc986c13ea2cafefe0935ff483b1b37c87ebe3e652b6e0c48ab43dd8ae752d0ed7fecc3751432f4')
prepare() {
mkdir -p glibc-build lib32-glibc-build
@@ -47,6 +52,10 @@
# Patch src: https://patchwork.ozlabs.org/project/glibc/patch/87eebkf8ph.fsf@oldenburg.str.redhat.com/
patch -Np1 -i "${srcdir}"/disable-clone3.diff
+ # Fix C.UTF-8 generation errors
+ # https://bugs.archlinux.org/task/73797
+ patch -Np1 -i "${srcdir}"/0001-localedef-Update-LC_MONETARY-handling-Bug-28845.patch
+ patch -Np1 -i "${srcdir}"/0001-localedata-Do-not-generate-output-if-warnings-were-p.patch
}
build() {
More information about the arch-commits
mailing list