Properly quote output of locale

This commit is contained in:
Andreas Schwab 2010-08-12 09:05:50 -07:00 committed by Ulrich Drepper
parent 3cdaa6adb1
commit 026373745e
3 changed files with 38 additions and 9 deletions

View file

@ -1,3 +1,9 @@
2010-08-12 Andreas Schwab <schwab@redhat.com>
[BZ #11904]
* locale/programs/locale.c (print_assignment): New function.
(show_locale_vars): Use it.
2010-08-11 Ulrich Drepper <drepper@redhat.com>
* sysdeps/unix/sysv/linux/bits/statfs.h (struct statfs): Add f_flags

4
NEWS
View file

@ -1,4 +1,4 @@
GNU C Library NEWS -- history of user-visible changes. 2010-8-11
GNU C Library NEWS -- history of user-visible changes. 2010-8-12
Copyright (C) 1992-2009, 2010 Free Software Foundation, Inc.
See the end for copying conditions.
@ -9,7 +9,7 @@ Version 2.13
* The following bugs are resolved with this release:
11640, 11701, 11840, 11856, 11883, 11903
11640, 11701, 11840, 11856, 11883, 11903, 11904
* New Linux interfaces: prlimit, prlimit64, fanotify_init, fanotify_mark

View file

@ -762,6 +762,29 @@ write_charmaps (void)
twalk (all_data, print_names);
}
/* Print a properly quoted assignment of NAME with VAL, using double
quotes iff DQUOTE is true. */
static void
print_assignment (const char *name, const char *val, bool dquote)
{
printf ("%s=", name);
if (dquote)
putchar ('"');
while (*val != '\0')
{
size_t segment
= strcspn (val, dquote ? "$`\"\\" : "~|&;<>()$`\\\"' \t\n");
printf ("%.*s", (int) segment, val);
val += segment;
if (*val == '\0')
break;
putchar ('\\');
putchar (*val++);
}
if (dquote)
putchar ('"');
putchar ('\n');
}
/* We have to show the contents of the environments determining the
locale. */
@ -769,7 +792,7 @@ static void
show_locale_vars (void)
{
size_t cat_no;
const char *lcall = getenv ("LC_ALL");
const char *lcall = getenv ("LC_ALL") ? : "";
const char *lang = getenv ("LANG") ? : "";
auto void get_source (const char *name);
@ -778,15 +801,15 @@ show_locale_vars (void)
{
char *val = getenv (name);
if ((lcall ?: "")[0] != '\0' || val == NULL)
printf ("%s=\"%s\"\n", name,
(lcall ?: "")[0] ? lcall : (lang ?: "")[0] ? lang : "POSIX");
if (lcall[0] != '\0' || val == NULL)
print_assignment (name, lcall[0] ? lcall : lang[0] ? lang : "POSIX",
true);
else
printf ("%s=%s\n", name, val);
print_assignment (name, val, false);
}
/* LANG has to be the first value. */
printf ("LANG=%s\n", lang);
print_assignment ("LANG", lang, false);
/* Now all categories in an unspecified order. */
for (cat_no = 0; cat_no < NCATEGORIES; ++cat_no)
@ -794,7 +817,7 @@ show_locale_vars (void)
get_source (category[cat_no].name);
/* The last is the LC_ALL value. */
printf ("LC_ALL=%s\n", lcall ? : "");
print_assignment ("LC_ALL", lcall, false);
}