OpenCoverage

mbscasecmp.c

Absolute File Name:/home/opencoverage/opencoverage/guest-scripts/coreutils/src/gnulib/lib/mbscasecmp.c
Source codeSwitch to Preprocessed file
LineSourceCount
1/* Case-insensitive string comparison function.-
2 Copyright (C) 1998-1999, 2005-2018 Free Software Foundation, Inc.-
3 Written by Bruno Haible <bruno@clisp.org>, 2005,-
4 based on earlier glibc code.-
5-
6 This program is free software: you can redistribute it and/or modify-
7 it under the terms of the GNU General Public License as published by-
8 the Free Software Foundation; either version 3 of the License, or-
9 (at your option) any later version.-
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-
17 along with this program. If not, see <https://www.gnu.org/licenses/>. */-
18-
19#include <config.h>-
20-
21/* Specification. */-
22#include <string.h>-
23-
24#include <ctype.h>-
25#include <limits.h>-
26-
27#include "mbuiter.h"-
28-
29#define TOLOWER(Ch) (isupper (Ch) ? tolower (Ch) : (Ch))-
30-
31/* Compare the character strings S1 and S2, ignoring case, returning less than,-
32 equal to or greater than zero if S1 is lexicographically less than, equal to-
33 or greater than S2.-
34 Note: This function may, in multibyte locales, return 0 for strings of-
35 different lengths! */-
36int-
37mbscasecmp (const char *s1, const char *s2)-
38{-
39 if (s1 == s2)
s1 == s2Description
TRUEnever evaluated
FALSEnever evaluated
0
40 return 0;
never executed: return 0;
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)
(__ctype_get_m...ur_max ()) > 1Description
TRUEnever evaluated
FALSEnever evaluated
0
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))
((iter1).cur).wc_validDescription
TRUEnever evaluated
FALSEnever evaluated
((iter1).cur).wc == 0Description
TRUEnever evaluated
FALSEnever evaluated
((iter2).cur).wc_validDescription
TRUEnever evaluated
FALSEnever evaluated
((iter2).cur).wc == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
54 {-
55 int cmp = mb_casecmp (mbui_cur (iter1), mbui_cur (iter2));
((iter1).cur).wc_validDescription
TRUEnever evaluated
FALSEnever evaluated
((iter2).cur).wc_validDescription
TRUEnever evaluated
FALSEnever evaluated
((iter2).cur).wc_validDescription
TRUEnever evaluated
FALSEnever evaluated
((iter1).cur)....r2).cur).bytesDescription
TRUEnever evaluated
FALSEnever evaluated
((iter1).cur)....r2).cur).bytesDescription
TRUEnever evaluated
FALSEnever evaluated
memcmp (((iter...ur).bytes) > 0Description
TRUEnever evaluated
FALSEnever evaluated
memcmp (((iter...r).bytes) >= 0Description
TRUEnever evaluated
FALSEnever evaluated
0
56-
57 if (cmp != 0)
cmp != 0Description
TRUEnever evaluated
FALSEnever evaluated
0
58 return cmp;
never executed: return cmp;
0
59-
60 mbui_advance (iter1);-
61 mbui_advance (iter2);-
62 }
never executed: end of block
0
63 if (mbui_avail (iter1))
((iter1).cur).wc_validDescription
TRUEnever evaluated
FALSEnever evaluated
((iter1).cur).wc == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
64 /* s2 terminated before s1. */-
65 return 1;
never executed: return 1;
0
66 if (mbui_avail (iter2))
((iter2).cur).wc_validDescription
TRUEnever evaluated
FALSEnever evaluated
((iter2).cur).wc == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
67 /* s1 terminated before s2. */-
68 return -1;
never executed: return -1;
0
69 return 0;
never executed: return 0;
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);
never executed: end of block
never executed: __res = tolower ( *p1 );
never executed: __res = (*__ctype_tolower_loc ())[(int) ( *p1 )];
sizeof ( *p1 ) > 1Description
TRUEnever evaluated
FALSEnever evaluated
__builtin_constant_p ( *p1 )Description
TRUEnever evaluated
FALSEnever evaluated
((*__ctype_b_l...int) _ISupper)Description
TRUEnever evaluated
FALSEnever evaluated
__c < -128Description
TRUEnever evaluated
FALSEnever evaluated
__c > 255Description
TRUEnever evaluated
FALSEnever evaluated
0
80 c2 = TOLOWER (*p2);
never executed: end of block
never executed: __res = tolower ( *p2 );
never executed: __res = (*__ctype_tolower_loc ())[(int) ( *p2 )];
sizeof ( *p2 ) > 1Description
TRUEnever evaluated
FALSEnever evaluated
__builtin_constant_p ( *p2 )Description
TRUEnever evaluated
FALSEnever evaluated
((*__ctype_b_l...int) _ISupper)Description
TRUEnever evaluated
FALSEnever evaluated
__c < -128Description
TRUEnever evaluated
FALSEnever evaluated
__c > 255Description
TRUEnever evaluated
FALSEnever evaluated
0
81-
82 if (c1 == '\0')
c1 == '\0'Description
TRUEnever evaluated
FALSEnever evaluated
0
83 break;
never executed: break;
0
84-
85 ++p1;-
86 ++p2;-
87 }
never executed: end of block
0
88 while (c1 == c2);
c1 == c2Description
TRUEnever evaluated
FALSEnever evaluated
0
89-
90 if (UCHAR_MAX <= INT_MAX)
(0x7f * 2 + 1) <= 0x7fffffffDescription
TRUEnever evaluated
FALSEnever evaluated
0
91 return c1 - c2;
never executed: return c1 - c2;
0
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);
never executed: return (c1 > c2 ? 1 : c1 < c2 ? -1 : 0);
0
97 }-
98}-
Source codeSwitch to Preprocessed file

Generated by Squish Coco 4.1.2