annotate lib/localeinfo.c @ 40231:9b3c79fdfe0b

strtod: fix clash with strtold Problem reported for RHEL 5 by Jesse Caldwell (Bug#34817). * lib/strtod.c (compute_minus_zero, minus_zero): Simplify by remving the macro / external variable, and having just a function. User changed. This avoids the need for an external variable that might clash.
author Paul Eggert <eggert@cs.ucla.edu>
date Mon, 11 Mar 2019 16:40:29 -0700
parents b06060465f09
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
18410
a8d2b9364721 dfa: new module, importing grep's DFA matcher
Jim Meyering <meyering@fb.com>
parents:
diff changeset
1 /* locale information
a8d2b9364721 dfa: new module, importing grep's DFA matcher
Jim Meyering <meyering@fb.com>
parents:
diff changeset
2
40057
b06060465f09 maint: Run 'make update-copyright'
Paul Eggert <eggert@cs.ucla.edu>
parents: 19484
diff changeset
3 Copyright 2016-2019 Free Software Foundation, Inc.
18410
a8d2b9364721 dfa: new module, importing grep's DFA matcher
Jim Meyering <meyering@fb.com>
parents:
diff changeset
4
a8d2b9364721 dfa: new module, importing grep's DFA matcher
Jim Meyering <meyering@fb.com>
parents:
diff changeset
5 This program is free software; you can redistribute it and/or modify
a8d2b9364721 dfa: new module, importing grep's DFA matcher
Jim Meyering <meyering@fb.com>
parents:
diff changeset
6 it under the terms of the GNU General Public License as published by
a8d2b9364721 dfa: new module, importing grep's DFA matcher
Jim Meyering <meyering@fb.com>
parents:
diff changeset
7 the Free Software Foundation; either version 3, or (at your option)
a8d2b9364721 dfa: new module, importing grep's DFA matcher
Jim Meyering <meyering@fb.com>
parents:
diff changeset
8 any later version.
a8d2b9364721 dfa: new module, importing grep's DFA matcher
Jim Meyering <meyering@fb.com>
parents:
diff changeset
9
a8d2b9364721 dfa: new module, importing grep's DFA matcher
Jim Meyering <meyering@fb.com>
parents:
diff changeset
10 This program is distributed in the hope that it will be useful,
a8d2b9364721 dfa: new module, importing grep's DFA matcher
Jim Meyering <meyering@fb.com>
parents:
diff changeset
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
a8d2b9364721 dfa: new module, importing grep's DFA matcher
Jim Meyering <meyering@fb.com>
parents:
diff changeset
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
a8d2b9364721 dfa: new module, importing grep's DFA matcher
Jim Meyering <meyering@fb.com>
parents:
diff changeset
13 GNU General Public License for more details.
a8d2b9364721 dfa: new module, importing grep's DFA matcher
Jim Meyering <meyering@fb.com>
parents:
diff changeset
14
a8d2b9364721 dfa: new module, importing grep's DFA matcher
Jim Meyering <meyering@fb.com>
parents:
diff changeset
15 You should have received a copy of the GNU General Public License
a8d2b9364721 dfa: new module, importing grep's DFA matcher
Jim Meyering <meyering@fb.com>
parents:
diff changeset
16 along with this program; if not, write to the Free Software
a8d2b9364721 dfa: new module, importing grep's DFA matcher
Jim Meyering <meyering@fb.com>
parents:
diff changeset
17 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
a8d2b9364721 dfa: new module, importing grep's DFA matcher
Jim Meyering <meyering@fb.com>
parents:
diff changeset
18 02110-1301, USA. */
a8d2b9364721 dfa: new module, importing grep's DFA matcher
Jim Meyering <meyering@fb.com>
parents:
diff changeset
19
a8d2b9364721 dfa: new module, importing grep's DFA matcher
Jim Meyering <meyering@fb.com>
parents:
diff changeset
20 /* Written by Paul Eggert. */
a8d2b9364721 dfa: new module, importing grep's DFA matcher
Jim Meyering <meyering@fb.com>
parents:
diff changeset
21
a8d2b9364721 dfa: new module, importing grep's DFA matcher
Jim Meyering <meyering@fb.com>
parents:
diff changeset
22 #include <config.h>
a8d2b9364721 dfa: new module, importing grep's DFA matcher
Jim Meyering <meyering@fb.com>
parents:
diff changeset
23
a8d2b9364721 dfa: new module, importing grep's DFA matcher
Jim Meyering <meyering@fb.com>
parents:
diff changeset
24 #include <localeinfo.h>
a8d2b9364721 dfa: new module, importing grep's DFA matcher
Jim Meyering <meyering@fb.com>
parents:
diff changeset
25
a8d2b9364721 dfa: new module, importing grep's DFA matcher
Jim Meyering <meyering@fb.com>
parents:
diff changeset
26 #include <verify.h>
a8d2b9364721 dfa: new module, importing grep's DFA matcher
Jim Meyering <meyering@fb.com>
parents:
diff changeset
27
a8d2b9364721 dfa: new module, importing grep's DFA matcher
Jim Meyering <meyering@fb.com>
parents:
diff changeset
28 #include <limits.h>
a8d2b9364721 dfa: new module, importing grep's DFA matcher
Jim Meyering <meyering@fb.com>
parents:
diff changeset
29 #include <locale.h>
a8d2b9364721 dfa: new module, importing grep's DFA matcher
Jim Meyering <meyering@fb.com>
parents:
diff changeset
30 #include <stdlib.h>
a8d2b9364721 dfa: new module, importing grep's DFA matcher
Jim Meyering <meyering@fb.com>
parents:
diff changeset
31 #include <string.h>
a8d2b9364721 dfa: new module, importing grep's DFA matcher
Jim Meyering <meyering@fb.com>
parents:
diff changeset
32 #include <wctype.h>
a8d2b9364721 dfa: new module, importing grep's DFA matcher
Jim Meyering <meyering@fb.com>
parents:
diff changeset
33
a8d2b9364721 dfa: new module, importing grep's DFA matcher
Jim Meyering <meyering@fb.com>
parents:
diff changeset
34 /* The sbclen implementation relies on this. */
a8d2b9364721 dfa: new module, importing grep's DFA matcher
Jim Meyering <meyering@fb.com>
parents:
diff changeset
35 verify (MB_LEN_MAX <= SCHAR_MAX);
a8d2b9364721 dfa: new module, importing grep's DFA matcher
Jim Meyering <meyering@fb.com>
parents:
diff changeset
36
a8d2b9364721 dfa: new module, importing grep's DFA matcher
Jim Meyering <meyering@fb.com>
parents:
diff changeset
37 /* Return true if the locale uses UTF-8. */
a8d2b9364721 dfa: new module, importing grep's DFA matcher
Jim Meyering <meyering@fb.com>
parents:
diff changeset
38
a8d2b9364721 dfa: new module, importing grep's DFA matcher
Jim Meyering <meyering@fb.com>
parents:
diff changeset
39 static bool
a8d2b9364721 dfa: new module, importing grep's DFA matcher
Jim Meyering <meyering@fb.com>
parents:
diff changeset
40 is_using_utf8 (void)
a8d2b9364721 dfa: new module, importing grep's DFA matcher
Jim Meyering <meyering@fb.com>
parents:
diff changeset
41 {
a8d2b9364721 dfa: new module, importing grep's DFA matcher
Jim Meyering <meyering@fb.com>
parents:
diff changeset
42 wchar_t wc;
a8d2b9364721 dfa: new module, importing grep's DFA matcher
Jim Meyering <meyering@fb.com>
parents:
diff changeset
43 mbstate_t mbs = {0};
a8d2b9364721 dfa: new module, importing grep's DFA matcher
Jim Meyering <meyering@fb.com>
parents:
diff changeset
44 return mbrtowc (&wc, "\xc4\x80", 2, &mbs) == 2 && wc == 0x100;
a8d2b9364721 dfa: new module, importing grep's DFA matcher
Jim Meyering <meyering@fb.com>
parents:
diff changeset
45 }
a8d2b9364721 dfa: new module, importing grep's DFA matcher
Jim Meyering <meyering@fb.com>
parents:
diff changeset
46
a8d2b9364721 dfa: new module, importing grep's DFA matcher
Jim Meyering <meyering@fb.com>
parents:
diff changeset
47 /* Initialize *LOCALEINFO from the current locale. */
a8d2b9364721 dfa: new module, importing grep's DFA matcher
Jim Meyering <meyering@fb.com>
parents:
diff changeset
48
a8d2b9364721 dfa: new module, importing grep's DFA matcher
Jim Meyering <meyering@fb.com>
parents:
diff changeset
49 void
a8d2b9364721 dfa: new module, importing grep's DFA matcher
Jim Meyering <meyering@fb.com>
parents:
diff changeset
50 init_localeinfo (struct localeinfo *localeinfo)
a8d2b9364721 dfa: new module, importing grep's DFA matcher
Jim Meyering <meyering@fb.com>
parents:
diff changeset
51 {
a8d2b9364721 dfa: new module, importing grep's DFA matcher
Jim Meyering <meyering@fb.com>
parents:
diff changeset
52 int i;
a8d2b9364721 dfa: new module, importing grep's DFA matcher
Jim Meyering <meyering@fb.com>
parents:
diff changeset
53
a8d2b9364721 dfa: new module, importing grep's DFA matcher
Jim Meyering <meyering@fb.com>
parents:
diff changeset
54 localeinfo->multibyte = MB_CUR_MAX > 1;
a8d2b9364721 dfa: new module, importing grep's DFA matcher
Jim Meyering <meyering@fb.com>
parents:
diff changeset
55 localeinfo->using_utf8 = is_using_utf8 ();
a8d2b9364721 dfa: new module, importing grep's DFA matcher
Jim Meyering <meyering@fb.com>
parents:
diff changeset
56
a8d2b9364721 dfa: new module, importing grep's DFA matcher
Jim Meyering <meyering@fb.com>
parents:
diff changeset
57 for (i = CHAR_MIN; i <= CHAR_MAX; i++)
a8d2b9364721 dfa: new module, importing grep's DFA matcher
Jim Meyering <meyering@fb.com>
parents:
diff changeset
58 {
a8d2b9364721 dfa: new module, importing grep's DFA matcher
Jim Meyering <meyering@fb.com>
parents:
diff changeset
59 char c = i;
a8d2b9364721 dfa: new module, importing grep's DFA matcher
Jim Meyering <meyering@fb.com>
parents:
diff changeset
60 unsigned char uc = i;
a8d2b9364721 dfa: new module, importing grep's DFA matcher
Jim Meyering <meyering@fb.com>
parents:
diff changeset
61 mbstate_t s = {0};
a8d2b9364721 dfa: new module, importing grep's DFA matcher
Jim Meyering <meyering@fb.com>
parents:
diff changeset
62 wchar_t wc;
a8d2b9364721 dfa: new module, importing grep's DFA matcher
Jim Meyering <meyering@fb.com>
parents:
diff changeset
63 size_t len = mbrtowc (&wc, &c, 1, &s);
a8d2b9364721 dfa: new module, importing grep's DFA matcher
Jim Meyering <meyering@fb.com>
parents:
diff changeset
64 localeinfo->sbclen[uc] = len <= 1 ? 1 : - (int) - len;
a8d2b9364721 dfa: new module, importing grep's DFA matcher
Jim Meyering <meyering@fb.com>
parents:
diff changeset
65 localeinfo->sbctowc[uc] = len <= 1 ? wc : WEOF;
a8d2b9364721 dfa: new module, importing grep's DFA matcher
Jim Meyering <meyering@fb.com>
parents:
diff changeset
66 }
a8d2b9364721 dfa: new module, importing grep's DFA matcher
Jim Meyering <meyering@fb.com>
parents:
diff changeset
67 }
a8d2b9364721 dfa: new module, importing grep's DFA matcher
Jim Meyering <meyering@fb.com>
parents:
diff changeset
68
a8d2b9364721 dfa: new module, importing grep's DFA matcher
Jim Meyering <meyering@fb.com>
parents:
diff changeset
69 /* The set of wchar_t values C such that there's a useful locale
a8d2b9364721 dfa: new module, importing grep's DFA matcher
Jim Meyering <meyering@fb.com>
parents:
diff changeset
70 somewhere where C != towupper (C) && C != towlower (towupper (C)).
a8d2b9364721 dfa: new module, importing grep's DFA matcher
Jim Meyering <meyering@fb.com>
parents:
diff changeset
71 For example, 0x00B5 (U+00B5 MICRO SIGN) is in this table, because
a8d2b9364721 dfa: new module, importing grep's DFA matcher
Jim Meyering <meyering@fb.com>
parents:
diff changeset
72 towupper (0x00B5) == 0x039C (U+039C GREEK CAPITAL LETTER MU), and
a8d2b9364721 dfa: new module, importing grep's DFA matcher
Jim Meyering <meyering@fb.com>
parents:
diff changeset
73 towlower (0x039C) == 0x03BC (U+03BC GREEK SMALL LETTER MU). */
a8d2b9364721 dfa: new module, importing grep's DFA matcher
Jim Meyering <meyering@fb.com>
parents:
diff changeset
74 static short const lonesome_lower[] =
a8d2b9364721 dfa: new module, importing grep's DFA matcher
Jim Meyering <meyering@fb.com>
parents:
diff changeset
75 {
a8d2b9364721 dfa: new module, importing grep's DFA matcher
Jim Meyering <meyering@fb.com>
parents:
diff changeset
76 0x00B5, 0x0131, 0x017F, 0x01C5, 0x01C8, 0x01CB, 0x01F2, 0x0345,
a8d2b9364721 dfa: new module, importing grep's DFA matcher
Jim Meyering <meyering@fb.com>
parents:
diff changeset
77 0x03C2, 0x03D0, 0x03D1, 0x03D5, 0x03D6, 0x03F0, 0x03F1,
a8d2b9364721 dfa: new module, importing grep's DFA matcher
Jim Meyering <meyering@fb.com>
parents:
diff changeset
78
a8d2b9364721 dfa: new module, importing grep's DFA matcher
Jim Meyering <meyering@fb.com>
parents:
diff changeset
79 /* U+03F2 GREEK LUNATE SIGMA SYMBOL lacks a specific uppercase
a8d2b9364721 dfa: new module, importing grep's DFA matcher
Jim Meyering <meyering@fb.com>
parents:
diff changeset
80 counterpart in locales predating Unicode 4.0.0 (April 2003). */
a8d2b9364721 dfa: new module, importing grep's DFA matcher
Jim Meyering <meyering@fb.com>
parents:
diff changeset
81 0x03F2,
a8d2b9364721 dfa: new module, importing grep's DFA matcher
Jim Meyering <meyering@fb.com>
parents:
diff changeset
82
a8d2b9364721 dfa: new module, importing grep's DFA matcher
Jim Meyering <meyering@fb.com>
parents:
diff changeset
83 0x03F5, 0x1E9B, 0x1FBE,
a8d2b9364721 dfa: new module, importing grep's DFA matcher
Jim Meyering <meyering@fb.com>
parents:
diff changeset
84 };
a8d2b9364721 dfa: new module, importing grep's DFA matcher
Jim Meyering <meyering@fb.com>
parents:
diff changeset
85
a8d2b9364721 dfa: new module, importing grep's DFA matcher
Jim Meyering <meyering@fb.com>
parents:
diff changeset
86 /* Verify that the worst case fits. This is 1 for towupper, 1 for
a8d2b9364721 dfa: new module, importing grep's DFA matcher
Jim Meyering <meyering@fb.com>
parents:
diff changeset
87 towlower, and 1 for each entry in LONESOME_LOWER. */
a8d2b9364721 dfa: new module, importing grep's DFA matcher
Jim Meyering <meyering@fb.com>
parents:
diff changeset
88 verify (1 + 1 + sizeof lonesome_lower / sizeof *lonesome_lower
a8d2b9364721 dfa: new module, importing grep's DFA matcher
Jim Meyering <meyering@fb.com>
parents:
diff changeset
89 <= CASE_FOLDED_BUFSIZE);
a8d2b9364721 dfa: new module, importing grep's DFA matcher
Jim Meyering <meyering@fb.com>
parents:
diff changeset
90
a8d2b9364721 dfa: new module, importing grep's DFA matcher
Jim Meyering <meyering@fb.com>
parents:
diff changeset
91 /* Find the characters equal to C after case-folding, other than C
a8d2b9364721 dfa: new module, importing grep's DFA matcher
Jim Meyering <meyering@fb.com>
parents:
diff changeset
92 itself, and store them into FOLDED. Return the number of characters
18674
5077a0eddc94 localeinfo: case_folded_counterparts and WEOF
Paul Eggert <eggert@cs.ucla.edu>
parents: 18626
diff changeset
93 stored; this is zero if C is WEOF. */
18410
a8d2b9364721 dfa: new module, importing grep's DFA matcher
Jim Meyering <meyering@fb.com>
parents:
diff changeset
94
a8d2b9364721 dfa: new module, importing grep's DFA matcher
Jim Meyering <meyering@fb.com>
parents:
diff changeset
95 int
18674
5077a0eddc94 localeinfo: case_folded_counterparts and WEOF
Paul Eggert <eggert@cs.ucla.edu>
parents: 18626
diff changeset
96 case_folded_counterparts (wint_t c, wchar_t folded[CASE_FOLDED_BUFSIZE])
18410
a8d2b9364721 dfa: new module, importing grep's DFA matcher
Jim Meyering <meyering@fb.com>
parents:
diff changeset
97 {
a8d2b9364721 dfa: new module, importing grep's DFA matcher
Jim Meyering <meyering@fb.com>
parents:
diff changeset
98 int i;
a8d2b9364721 dfa: new module, importing grep's DFA matcher
Jim Meyering <meyering@fb.com>
parents:
diff changeset
99 int n = 0;
a8d2b9364721 dfa: new module, importing grep's DFA matcher
Jim Meyering <meyering@fb.com>
parents:
diff changeset
100 wint_t uc = towupper (c);
a8d2b9364721 dfa: new module, importing grep's DFA matcher
Jim Meyering <meyering@fb.com>
parents:
diff changeset
101 wint_t lc = towlower (uc);
a8d2b9364721 dfa: new module, importing grep's DFA matcher
Jim Meyering <meyering@fb.com>
parents:
diff changeset
102 if (uc != c)
a8d2b9364721 dfa: new module, importing grep's DFA matcher
Jim Meyering <meyering@fb.com>
parents:
diff changeset
103 folded[n++] = uc;
a8d2b9364721 dfa: new module, importing grep's DFA matcher
Jim Meyering <meyering@fb.com>
parents:
diff changeset
104 if (lc != uc && lc != c && towupper (lc) == uc)
a8d2b9364721 dfa: new module, importing grep's DFA matcher
Jim Meyering <meyering@fb.com>
parents:
diff changeset
105 folded[n++] = lc;
a8d2b9364721 dfa: new module, importing grep's DFA matcher
Jim Meyering <meyering@fb.com>
parents:
diff changeset
106 for (i = 0; i < sizeof lonesome_lower / sizeof *lonesome_lower; i++)
a8d2b9364721 dfa: new module, importing grep's DFA matcher
Jim Meyering <meyering@fb.com>
parents:
diff changeset
107 {
a8d2b9364721 dfa: new module, importing grep's DFA matcher
Jim Meyering <meyering@fb.com>
parents:
diff changeset
108 wint_t li = lonesome_lower[i];
a8d2b9364721 dfa: new module, importing grep's DFA matcher
Jim Meyering <meyering@fb.com>
parents:
diff changeset
109 if (li != lc && li != uc && li != c && towupper (li) == uc)
a8d2b9364721 dfa: new module, importing grep's DFA matcher
Jim Meyering <meyering@fb.com>
parents:
diff changeset
110 folded[n++] = li;
a8d2b9364721 dfa: new module, importing grep's DFA matcher
Jim Meyering <meyering@fb.com>
parents:
diff changeset
111 }
a8d2b9364721 dfa: new module, importing grep's DFA matcher
Jim Meyering <meyering@fb.com>
parents:
diff changeset
112 return n;
a8d2b9364721 dfa: new module, importing grep's DFA matcher
Jim Meyering <meyering@fb.com>
parents:
diff changeset
113 }