summaryrefslogtreecommitdiffstats
path: root/gl/strncasecmp.c
diff options
context:
space:
mode:
Diffstat (limited to 'gl/strncasecmp.c')
-rw-r--r--gl/strncasecmp.c39
1 files changed, 17 insertions, 22 deletions
diff --git a/gl/strncasecmp.c b/gl/strncasecmp.c
index c79161f3..c6bec00d 100644
--- a/gl/strncasecmp.c
+++ b/gl/strncasecmp.c
@@ -1,5 +1,5 @@
1/* strncasecmp.c -- case insensitive string comparator 1/* Case-insensitive string comparison function for unibyte locales.
2 Copyright (C) 1998-1999, 2005-2007, 2009-2024 Free Software Foundation, Inc. 2 Copyright (C) 1998-1999, 2005-2007, 2009-2026 Free Software Foundation, Inc.
3 3
4 This file is free software: you can redistribute it and/or modify 4 This file is free software: you can redistribute it and/or modify
5 it under the terms of the GNU Lesser General Public License as 5 it under the terms of the GNU Lesser General Public License as
@@ -17,7 +17,7 @@
17#include <config.h> 17#include <config.h>
18 18
19/* Specification. */ 19/* Specification. */
20#include <string.h> 20#include <strings.h>
21 21
22#include <ctype.h> 22#include <ctype.h>
23#include <limits.h> 23#include <limits.h>
@@ -32,29 +32,24 @@ strncasecmp (const char *s1, const char *s2, size_t n)
32{ 32{
33 register const unsigned char *p1 = (const unsigned char *) s1; 33 register const unsigned char *p1 = (const unsigned char *) s1;
34 register const unsigned char *p2 = (const unsigned char *) s2; 34 register const unsigned char *p2 = (const unsigned char *) s2;
35 unsigned char c1, c2;
36 35
37 if (p1 == p2 || n == 0) 36 if (p1 == p2 || n == 0)
38 return 0; 37 return 0;
39 38
40 do 39 for (;; p1++, p2++)
41 { 40 {
42 c1 = tolower (*p1); 41 unsigned char c1 = tolower (*p1);
43 c2 = tolower (*p2); 42 unsigned char c2 = tolower (*p2);
44 43
45 if (--n == 0 || c1 == '\0') 44 if (--n == 0 || c1 == '\0' || c1 != c2)
46 break; 45 {
47 46 if (UCHAR_MAX <= INT_MAX)
48 ++p1; 47 return c1 - c2;
49 ++p2; 48 else
49 /* On machines where 'char' and 'int' are types of the same size,
50 the difference of two 'unsigned char' values - including the
51 sign bit - doesn't fit in an 'int'. */
52 return _GL_CMP (c1, c2);
53 }
50 } 54 }
51 while (c1 == c2);
52
53 if (UCHAR_MAX <= INT_MAX)
54 return c1 - c2;
55 else
56 /* On machines where 'char' and 'int' are types of the same size, the
57 difference of two 'unsigned char' values - including the sign bit -
58 doesn't fit in an 'int'. */
59 return _GL_CMP (c1, c2);
60} 55}