]>
Commit | Line | Data |
---|---|---|
12788f63 MT |
1 | 2010-08-12 Andreas Schwab <schwab@redhat.com> |
2 | ||
3 | [BZ #11904] | |
4 | * locale/programs/locale.c (print_assignment): New function. | |
5 | (show_locale_vars): Use it. | |
6 | ||
7 | Index: glibc-2.12-2-gc4ccff1/locale/programs/locale.c | |
8 | =================================================================== | |
9 | --- glibc-2.12-2-gc4ccff1.orig/locale/programs/locale.c | |
10 | +++ glibc-2.12-2-gc4ccff1/locale/programs/locale.c | |
11 | @@ -762,6 +762,29 @@ write_charmaps (void) | |
12 | twalk (all_data, print_names); | |
13 | } | |
14 | ||
15 | +/* Print a properly quoted assignment of NAME with VAL, using double | |
16 | + quotes iff DQUOTE is true. */ | |
17 | +static void | |
18 | +print_assignment (const char *name, const char *val, bool dquote) | |
19 | +{ | |
20 | + printf ("%s=", name); | |
21 | + if (dquote) | |
22 | + putchar ('"'); | |
23 | + while (*val != '\0') | |
24 | + { | |
25 | + size_t segment | |
26 | + = strcspn (val, dquote ? "$`\"\\" : "~|&;<>()$`\\\"' \t\n"); | |
27 | + printf ("%.*s", (int) segment, val); | |
28 | + val += segment; | |
29 | + if (*val == '\0') | |
30 | + break; | |
31 | + putchar ('\\'); | |
32 | + putchar (*val++); | |
33 | + } | |
34 | + if (dquote) | |
35 | + putchar ('"'); | |
36 | + putchar ('\n'); | |
37 | +} | |
38 | ||
39 | /* We have to show the contents of the environments determining the | |
40 | locale. */ | |
41 | @@ -769,7 +792,7 @@ static void | |
42 | show_locale_vars (void) | |
43 | { | |
44 | size_t cat_no; | |
45 | - const char *lcall = getenv ("LC_ALL"); | |
46 | + const char *lcall = getenv ("LC_ALL") ? : ""; | |
47 | const char *lang = getenv ("LANG") ? : ""; | |
48 | ||
49 | auto void get_source (const char *name); | |
50 | @@ -778,15 +801,15 @@ show_locale_vars (void) | |
51 | { | |
52 | char *val = getenv (name); | |
53 | ||
54 | - if ((lcall ?: "")[0] != '\0' || val == NULL) | |
55 | - printf ("%s=\"%s\"\n", name, | |
56 | - (lcall ?: "")[0] ? lcall : (lang ?: "")[0] ? lang : "POSIX"); | |
57 | + if (lcall[0] != '\0' || val == NULL) | |
58 | + print_assignment (name, lcall[0] ? lcall : lang[0] ? lang : "POSIX", | |
59 | + true); | |
60 | else | |
61 | - printf ("%s=%s\n", name, val); | |
62 | + print_assignment (name, val, false); | |
63 | } | |
64 | ||
65 | /* LANG has to be the first value. */ | |
66 | - printf ("LANG=%s\n", lang); | |
67 | + print_assignment ("LANG", lang, false); | |
68 | ||
69 | /* Now all categories in an unspecified order. */ | |
70 | for (cat_no = 0; cat_no < NCATEGORIES; ++cat_no) | |
71 | @@ -794,7 +817,7 @@ show_locale_vars (void) | |
72 | get_source (category[cat_no].name); | |
73 | ||
74 | /* The last is the LC_ALL value. */ | |
75 | - printf ("LC_ALL=%s\n", lcall ? : ""); | |
76 | + print_assignment ("LC_ALL", lcall, false); | |
77 | } | |
78 | ||
79 |