Mercurial > gnulib
annotate lib/mbscasecmp.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 |
---|---|
8089 | 1 /* Case-insensitive string comparison function. |
40057
b06060465f09
maint: Run 'make update-copyright'
Paul Eggert <eggert@cs.ucla.edu>
parents:
19484
diff
changeset
|
2 Copyright (C) 1998-1999, 2005-2019 Free Software Foundation, Inc. |
8089 | 3 Written by Bruno Haible <bruno@clisp.org>, 2005, |
4 based on earlier glibc code. | |
5 | |
9309
bbbbbf4cd1c5
Change copyright notice from GPLv2+ to GPLv3+.
Bruno Haible <bruno@clisp.org>
parents:
8091
diff
changeset
|
6 This program is free software: you can redistribute it and/or modify |
8089 | 7 it under the terms of the GNU General Public License as published by |
9309
bbbbbf4cd1c5
Change copyright notice from GPLv2+ to GPLv3+.
Bruno Haible <bruno@clisp.org>
parents:
8091
diff
changeset
|
8 the Free Software Foundation; either version 3 of the License, or |
bbbbbf4cd1c5
Change copyright notice from GPLv2+ to GPLv3+.
Bruno Haible <bruno@clisp.org>
parents:
8091
diff
changeset
|
9 (at your option) any later version. |
8089 | 10 |
11 This program is distributed in the hope that it will be useful, | |
12 but WITHOUT ANY WARRANTY; without even the implied warranty of | |
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
14 GNU General Public License for more details. | |
15 | |
16 You should have received a copy of the GNU General Public License | |
19190 | 17 along with this program. If not, see <https://www.gnu.org/licenses/>. */ |
8089 | 18 |
19 #include <config.h> | |
20 | |
21 /* Specification. */ | |
22 #include <string.h> | |
23 | |
24 #include <ctype.h> | |
25 #include <limits.h> | |
26 | |
10954
a0bbe1a6f787
Remove HAVE_MBRTOWC conditionals. Use mbrtowc unconditionally.
Bruno Haible <bruno@clisp.org>
parents:
9309
diff
changeset
|
27 #include "mbuiter.h" |
8089 | 28 |
29 #define TOLOWER(Ch) (isupper (Ch) ? tolower (Ch) : (Ch)) | |
30 | |
8091
ebf2b19b5684
New module 'mbscasecmp'. strcasecmp is not expected to work with multibyte
Bruno Haible <bruno@clisp.org>
parents:
8089
diff
changeset
|
31 /* Compare the character strings S1 and S2, ignoring case, returning less than, |
ebf2b19b5684
New module 'mbscasecmp'. strcasecmp is not expected to work with multibyte
Bruno Haible <bruno@clisp.org>
parents:
8089
diff
changeset
|
32 equal to or greater than zero if S1 is lexicographically less than, equal to |
ebf2b19b5684
New module 'mbscasecmp'. strcasecmp is not expected to work with multibyte
Bruno Haible <bruno@clisp.org>
parents:
8089
diff
changeset
|
33 or greater than S2. |
8089 | 34 Note: This function may, in multibyte locales, return 0 for strings of |
35 different lengths! */ | |
36 int | |
8091
ebf2b19b5684
New module 'mbscasecmp'. strcasecmp is not expected to work with multibyte
Bruno Haible <bruno@clisp.org>
parents:
8089
diff
changeset
|
37 mbscasecmp (const char *s1, const char *s2) |
8089 | 38 { |
39 if (s1 == s2) | |
40 return 0; | |
41 | |
42 /* Be careful not to look at the entire extent of s1 or s2 until needed. | |
43 This is useful because when two strings differ, the difference is | |
44 most often already in the very few first characters. */ | |
45 if (MB_CUR_MAX > 1) | |
46 { | |
47 mbui_iterator_t iter1; | |
48 mbui_iterator_t iter2; | |
49 | |
50 mbui_init (iter1, s1); | |
51 mbui_init (iter2, s2); | |
52 | |
53 while (mbui_avail (iter1) && mbui_avail (iter2)) | |
12421
e8d2c6fc33ad
Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents:
10954
diff
changeset
|
54 { |
e8d2c6fc33ad
Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents:
10954
diff
changeset
|
55 int cmp = mb_casecmp (mbui_cur (iter1), mbui_cur (iter2)); |
8089 | 56 |
12421
e8d2c6fc33ad
Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents:
10954
diff
changeset
|
57 if (cmp != 0) |
e8d2c6fc33ad
Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents:
10954
diff
changeset
|
58 return cmp; |
8089 | 59 |
12421
e8d2c6fc33ad
Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents:
10954
diff
changeset
|
60 mbui_advance (iter1); |
e8d2c6fc33ad
Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents:
10954
diff
changeset
|
61 mbui_advance (iter2); |
e8d2c6fc33ad
Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents:
10954
diff
changeset
|
62 } |
8089 | 63 if (mbui_avail (iter1)) |
12421
e8d2c6fc33ad
Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents:
10954
diff
changeset
|
64 /* s2 terminated before s1. */ |
e8d2c6fc33ad
Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents:
10954
diff
changeset
|
65 return 1; |
8089 | 66 if (mbui_avail (iter2)) |
12421
e8d2c6fc33ad
Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents:
10954
diff
changeset
|
67 /* s1 terminated before s2. */ |
e8d2c6fc33ad
Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents:
10954
diff
changeset
|
68 return -1; |
8089 | 69 return 0; |
70 } | |
71 else | |
72 { | |
73 const unsigned char *p1 = (const unsigned char *) s1; | |
74 const unsigned char *p2 = (const unsigned char *) s2; | |
75 unsigned char c1, c2; | |
76 | |
77 do | |
12421
e8d2c6fc33ad
Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents:
10954
diff
changeset
|
78 { |
e8d2c6fc33ad
Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents:
10954
diff
changeset
|
79 c1 = TOLOWER (*p1); |
e8d2c6fc33ad
Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents:
10954
diff
changeset
|
80 c2 = TOLOWER (*p2); |
8089 | 81 |
12421
e8d2c6fc33ad
Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents:
10954
diff
changeset
|
82 if (c1 == '\0') |
e8d2c6fc33ad
Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents:
10954
diff
changeset
|
83 break; |
8089 | 84 |
12421
e8d2c6fc33ad
Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents:
10954
diff
changeset
|
85 ++p1; |
e8d2c6fc33ad
Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents:
10954
diff
changeset
|
86 ++p2; |
e8d2c6fc33ad
Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents:
10954
diff
changeset
|
87 } |
8089 | 88 while (c1 == c2); |
89 | |
90 if (UCHAR_MAX <= INT_MAX) | |
12421
e8d2c6fc33ad
Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents:
10954
diff
changeset
|
91 return c1 - c2; |
8089 | 92 else |
12421
e8d2c6fc33ad
Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents:
10954
diff
changeset
|
93 /* On machines where 'char' and 'int' are types of the same size, the |
e8d2c6fc33ad
Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents:
10954
diff
changeset
|
94 difference of two 'unsigned char' values - including the sign bit - |
e8d2c6fc33ad
Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents:
10954
diff
changeset
|
95 doesn't fit in an 'int'. */ |
e8d2c6fc33ad
Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents:
10954
diff
changeset
|
96 return (c1 > c2 ? 1 : c1 < c2 ? -1 : 0); |
8089 | 97 } |
98 } |