Mercurial > gnulib
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 |
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 } |