summaryrefslogtreecommitdiff
path: root/lib/c-strcasecmp.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/c-strcasecmp.c')
-rw-r--r--lib/c-strcasecmp.c35
1 files changed, 15 insertions, 20 deletions
diff --git a/lib/c-strcasecmp.c b/lib/c-strcasecmp.c
index 2d963c30..2e7f5405 100644
--- a/lib/c-strcasecmp.c
+++ b/lib/c-strcasecmp.c
@@ -1,5 +1,5 @@
/* c-strcasecmp.c -- case insensitive string comparator in C locale
- Copyright (C) 1998-1999, 2005-2006, 2009-2025 Free Software Foundation, Inc.
+ Copyright (C) 1998-1999, 2005-2006, 2009-2026 Free Software Foundation, Inc.
This file is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as
@@ -28,29 +28,24 @@ c_strcasecmp (const char *s1, const char *s2)
{
register const unsigned char *p1 = (const unsigned char *) s1;
register const unsigned char *p2 = (const unsigned char *) s2;
- unsigned char c1, c2;
if (p1 == p2)
return 0;
- do
+ for (;; p1++, p2++)
{
- c1 = c_tolower (*p1);
- c2 = c_tolower (*p2);
-
- if (c1 == '\0')
- break;
-
- ++p1;
- ++p2;
+ unsigned char c1 = c_tolower (*p1);
+ unsigned char c2 = c_tolower (*p2);
+
+ if (c1 == '\0' || c1 != c2)
+ {
+ if (UCHAR_MAX <= INT_MAX)
+ return c1 - c2;
+ else
+ /* On machines where 'char' and 'int' are types of the same size,
+ the difference of two 'unsigned char' values - including the
+ sign bit - doesn't fit in an 'int'. */
+ return _GL_CMP (c1, c2);
+ }
}
- while (c1 == c2);
-
- if (UCHAR_MAX <= INT_MAX)
- return c1 - c2;
- else
- /* On machines where 'char' and 'int' are types of the same size, the
- difference of two 'unsigned char' values - including the sign bit -
- doesn't fit in an 'int'. */
- return _GL_CMP (c1, c2);
}