annotate lib/mbsncasecmp.c @ 17249:e542fd46ad6f

maint: update all copyright year number ranges Run "make update-copyright". Compare to commit 1602f0a from last year. Signed-off-by: Eric Blake <eblake@redhat.com>
author Eric Blake <eblake@redhat.com>
date Tue, 01 Jan 2013 00:50:58 +0000 (2013-01-01)
parents 8250f2777afc
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
8156
4610755b157b New module 'mbsncasecmp'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1 /* Case-insensitive string comparison function.
17249
e542fd46ad6f maint: update all copyright year number ranges
Eric Blake <eblake@redhat.com>
parents: 16201
diff changeset
2 Copyright (C) 1998-1999, 2005-2013 Free Software Foundation, Inc.
8156
4610755b157b New module 'mbsncasecmp'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
3 Written by Bruno Haible <bruno@clisp.org>, 2005,
4610755b157b New module 'mbsncasecmp'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
4 based on earlier glibc code.
4610755b157b New module 'mbsncasecmp'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
5
9309
bbbbbf4cd1c5 Change copyright notice from GPLv2+ to GPLv3+.
Bruno Haible <bruno@clisp.org>
parents: 8156
diff changeset
6 This program is free software: you can redistribute it and/or modify
8156
4610755b157b New module 'mbsncasecmp'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
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: 8156
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: 8156
diff changeset
9 (at your option) any later version.
8156
4610755b157b New module 'mbsncasecmp'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
10
4610755b157b New module 'mbsncasecmp'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
11 This program is distributed in the hope that it will be useful,
4610755b157b New module 'mbsncasecmp'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
4610755b157b New module 'mbsncasecmp'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
4610755b157b New module 'mbsncasecmp'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
14 GNU General Public License for more details.
4610755b157b New module 'mbsncasecmp'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
15
4610755b157b New module 'mbsncasecmp'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
16 You should have received a copy of the GNU General Public License
9309
bbbbbf4cd1c5 Change copyright notice from GPLv2+ to GPLv3+.
Bruno Haible <bruno@clisp.org>
parents: 8156
diff changeset
17 along with this program. If not, see <http://www.gnu.org/licenses/>. */
8156
4610755b157b New module 'mbsncasecmp'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
18
4610755b157b New module 'mbsncasecmp'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
19 #include <config.h>
4610755b157b New module 'mbsncasecmp'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
20
4610755b157b New module 'mbsncasecmp'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
21 /* Specification. */
4610755b157b New module 'mbsncasecmp'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
22 #include <string.h>
4610755b157b New module 'mbsncasecmp'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
23
4610755b157b New module 'mbsncasecmp'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
24 #include <ctype.h>
4610755b157b New module 'mbsncasecmp'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
25 #include <limits.h>
4610755b157b New module 'mbsncasecmp'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
26
10954
a0bbe1a6f787 Remove HAVE_MBRTOWC conditionals. Use mbrtowc unconditionally.
Bruno Haible <bruno@clisp.org>
parents: 9309
diff changeset
27 #include "mbuiter.h"
8156
4610755b157b New module 'mbsncasecmp'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
28
4610755b157b New module 'mbsncasecmp'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
29 #define TOLOWER(Ch) (isupper (Ch) ? tolower (Ch) : (Ch))
4610755b157b New module 'mbsncasecmp'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
30
4610755b157b New module 'mbsncasecmp'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
31 /* Compare the initial segment of the character string S1 consisting of at most
4610755b157b New module 'mbsncasecmp'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
32 N characters with the initial segment of the character string S2 consisting
4610755b157b New module 'mbsncasecmp'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
33 of at most N characters, ignoring case, returning less than, equal to or
4610755b157b New module 'mbsncasecmp'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
34 greater than zero if the initial segment of S1 is lexicographically less
4610755b157b New module 'mbsncasecmp'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
35 than, equal to or greater than the initial segment of S2.
4610755b157b New module 'mbsncasecmp'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
36 Note: This function may, in multibyte locales, return 0 for initial segments
4610755b157b New module 'mbsncasecmp'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
37 of different lengths! */
4610755b157b New module 'mbsncasecmp'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
38 int
4610755b157b New module 'mbsncasecmp'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
39 mbsncasecmp (const char *s1, const char *s2, size_t n)
4610755b157b New module 'mbsncasecmp'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
40 {
4610755b157b New module 'mbsncasecmp'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
41 if (s1 == s2 || n == 0)
4610755b157b New module 'mbsncasecmp'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
42 return 0;
4610755b157b New module 'mbsncasecmp'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
43
4610755b157b New module 'mbsncasecmp'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
44 /* Be careful not to look at the entire extent of s1 or s2 until needed.
4610755b157b New module 'mbsncasecmp'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
45 This is useful because when two strings differ, the difference is
4610755b157b New module 'mbsncasecmp'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
46 most often already in the very few first characters. */
4610755b157b New module 'mbsncasecmp'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
47 if (MB_CUR_MAX > 1)
4610755b157b New module 'mbsncasecmp'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
48 {
4610755b157b New module 'mbsncasecmp'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
49 mbui_iterator_t iter1;
4610755b157b New module 'mbsncasecmp'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
50 mbui_iterator_t iter2;
4610755b157b New module 'mbsncasecmp'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
51
4610755b157b New module 'mbsncasecmp'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
52 mbui_init (iter1, s1);
4610755b157b New module 'mbsncasecmp'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
53 mbui_init (iter2, s2);
4610755b157b New module 'mbsncasecmp'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
54
4610755b157b New module 'mbsncasecmp'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
55 while (mbui_avail (iter1) && mbui_avail (iter2))
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 10954
diff changeset
56 {
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 10954
diff changeset
57 int cmp = mb_casecmp (mbui_cur (iter1), mbui_cur (iter2));
8156
4610755b157b New module 'mbsncasecmp'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
58
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 10954
diff changeset
59 if (cmp != 0)
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 10954
diff changeset
60 return cmp;
8156
4610755b157b New module 'mbsncasecmp'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
61
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 10954
diff changeset
62 if (--n == 0)
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 10954
diff changeset
63 return 0;
8156
4610755b157b New module 'mbsncasecmp'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
64
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 10954
diff changeset
65 mbui_advance (iter1);
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 10954
diff changeset
66 mbui_advance (iter2);
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 10954
diff changeset
67 }
8156
4610755b157b New module 'mbsncasecmp'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
68 if (mbui_avail (iter1))
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 10954
diff changeset
69 /* s2 terminated before s1 and n. */
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 10954
diff changeset
70 return 1;
8156
4610755b157b New module 'mbsncasecmp'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
71 if (mbui_avail (iter2))
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 10954
diff changeset
72 /* s1 terminated before s2 and n. */
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 10954
diff changeset
73 return -1;
8156
4610755b157b New module 'mbsncasecmp'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
74 return 0;
4610755b157b New module 'mbsncasecmp'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
75 }
4610755b157b New module 'mbsncasecmp'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
76 else
4610755b157b New module 'mbsncasecmp'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
77 {
4610755b157b New module 'mbsncasecmp'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
78 const unsigned char *p1 = (const unsigned char *) s1;
4610755b157b New module 'mbsncasecmp'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
79 const unsigned char *p2 = (const unsigned char *) s2;
4610755b157b New module 'mbsncasecmp'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
80 unsigned char c1, c2;
4610755b157b New module 'mbsncasecmp'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
81
4610755b157b New module 'mbsncasecmp'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
82 for (; ; p1++, p2++)
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 10954
diff changeset
83 {
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 10954
diff changeset
84 c1 = TOLOWER (*p1);
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 10954
diff changeset
85 c2 = TOLOWER (*p2);
8156
4610755b157b New module 'mbsncasecmp'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
86
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 10954
diff changeset
87 if (--n == 0 || c1 == '\0' || c1 != c2)
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 10954
diff changeset
88 break;
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 10954
diff changeset
89 }
8156
4610755b157b New module 'mbsncasecmp'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
90
4610755b157b New module 'mbsncasecmp'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
91 if (UCHAR_MAX <= INT_MAX)
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 10954
diff changeset
92 return c1 - c2;
8156
4610755b157b New module 'mbsncasecmp'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
93 else
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 10954
diff changeset
94 /* 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
95 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
96 doesn't fit in an 'int'. */
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 10954
diff changeset
97 return (c1 > c2 ? 1 : c1 < c2 ? -1 : 0);
8156
4610755b157b New module 'mbsncasecmp'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
98 }
4610755b157b New module 'mbsncasecmp'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
99 }