Mercurial > hg > octave-kai > gnulib-hg
annotate lib/mbscasecmp.c @ 11653:ecb384fccb5b
fpurge: migrate into <stdio.h>
* lib/fpurge.h: Delete...
* lib/stdio.in.h (fpurge): ...and declare here, instead.
* lib/fpurge.c (fpurge): Change declaring header.
* modules/fpurge (Files): Drop deleted file.
(Depends-on): Add stdio.
(configure.ac): Set witness.
* modules/stdio (Makefile.am): Support fpurge macros.
* m4/stdio_h.m4 (gl_STDIO_H_DEFAULTS): Likewise.
* m4/fpurge.m4 (gl_FUNC_FPURGE): Set appropriate variables.
* lib/fflush.c: Update client.
* tests/test-fpurge.c: Likewise.
* NEWS: Mention the change.
Signed-off-by: Eric Blake <ebb9@byu.net>
author | Eric Blake <ebb9@byu.net> |
---|---|
date | Wed, 24 Jun 2009 06:49:00 -0600 |
parents | a0bbe1a6f787 |
children | e8d2c6fc33ad |
rev | line source |
---|---|
8089 | 1 /* Case-insensitive string comparison function. |
10954
a0bbe1a6f787
Remove HAVE_MBRTOWC conditionals. Use mbrtowc unconditionally.
Bruno Haible <bruno@clisp.org>
parents:
9309
diff
changeset
|
2 Copyright (C) 1998-1999, 2005-2008 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 | |
9309
bbbbbf4cd1c5
Change copyright notice from GPLv2+ to GPLv3+.
Bruno Haible <bruno@clisp.org>
parents:
8091
diff
changeset
|
17 along with this program. If not, see <http://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)) | |
54 { | |
55 int cmp = mb_casecmp (mbui_cur (iter1), mbui_cur (iter2)); | |
56 | |
57 if (cmp != 0) | |
58 return cmp; | |
59 | |
60 mbui_advance (iter1); | |
61 mbui_advance (iter2); | |
62 } | |
63 if (mbui_avail (iter1)) | |
64 /* s2 terminated before s1. */ | |
65 return 1; | |
66 if (mbui_avail (iter2)) | |
67 /* s1 terminated before s2. */ | |
68 return -1; | |
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 | |
78 { | |
79 c1 = TOLOWER (*p1); | |
80 c2 = TOLOWER (*p2); | |
81 | |
82 if (c1 == '\0') | |
83 break; | |
84 | |
85 ++p1; | |
86 ++p2; | |
87 } | |
88 while (c1 == c2); | |
89 | |
90 if (UCHAR_MAX <= INT_MAX) | |
91 return c1 - c2; | |
92 else | |
93 /* On machines where 'char' and 'int' are types of the same size, the | |
94 difference of two 'unsigned char' values - including the sign bit - | |
95 doesn't fit in an 'int'. */ | |
96 return (c1 > c2 ? 1 : c1 < c2 ? -1 : 0); | |
97 } | |
98 } |