OpenCoverage

memcoll.c

Absolute File Name:/home/opencoverage/opencoverage/guest-scripts/coreutils/src/gnulib/lib/memcoll.c
Source codeSwitch to Preprocessed file
LineSourceCount
1/* Locale-specific memory comparison.-
2-
3 Copyright (C) 1999, 2002-2004, 2006, 2009-2018 Free Software Foundation,-
4 Inc.-
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/* Contributed by Paul Eggert <eggert@twinsun.com>. */-
20-
21#include <config.h>-
22-
23#include "memcoll.h"-
24-
25#include <errno.h>-
26#include <stdlib.h>-
27#include <string.h>-
28-
29/* Compare S1 (with size S1SIZE) and S2 (with length S2SIZE) according-
30 to the LC_COLLATE locale. S1 and S2 are both blocks of memory with-
31 nonzero sizes, and the last byte in each block must be a null byte.-
32 Set errno to an error number if there is an error, and to zero-
33 otherwise. */-
34static int-
35strcoll_loop (char const *s1, size_t s1size, char const *s2, size_t s2size)-
36{-
37 int diff;-
38-
39 while (! (errno = 0, (diff = strcoll (s1, s2)) || errno))
(diff = strcoll (s1, s2))Description
TRUEnever evaluated
FALSEnever evaluated
(*__errno_location ())Description
TRUEnever evaluated
FALSEnever evaluated
0
40 {-
41 /* strcoll found no difference, but perhaps it was fooled by NUL-
42 characters in the data. Work around this problem by advancing-
43 past the NUL chars. */-
44 size_t size1 = strlen (s1) + 1;-
45 size_t size2 = strlen (s2) + 1;-
46 s1 += size1;-
47 s2 += size2;-
48 s1size -= size1;-
49 s2size -= size2;-
50-
51 if (s1size == 0)
s1size == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
52 return - (s2size != 0);
never executed: return - (s2size != 0);
0
53 if (s2size == 0)
s2size == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
54 return 1;
never executed: return 1;
0
55 }
never executed: end of block
0
56-
57 return diff;
never executed: return diff;
0
58}-
59-
60/* Compare S1 (with length S1LEN) and S2 (with length S2LEN) according-
61 to the LC_COLLATE locale. S1 and S2 do not overlap, and are not-
62 adjacent. Perhaps temporarily modify the bytes after S1 and S2,-
63 but restore their original contents before returning. Set errno to an-
64 error number if there is an error, and to zero otherwise. */-
65int-
66memcoll (char *s1, size_t s1len, char *s2, size_t s2len)-
67{-
68 int diff;-
69-
70 /* strcoll is slow on many platforms, so check for the common case-
71 where the arguments are bytewise equal. Otherwise, walk through-
72 the buffers using strcoll on each substring. */-
73-
74 if (s1len == s2len && memcmp (s1, s2, s1len) == 0)
s1len == s2lenDescription
TRUEnever evaluated
FALSEnever evaluated
memcmp (s1, s2, s1len) == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
75 {-
76 errno = 0;-
77 diff = 0;-
78 }
never executed: end of block
0
79 else-
80 {-
81 char n1 = s1[s1len];-
82 char n2 = s2[s2len];-
83-
84 s1[s1len] = '\0';-
85 s2[s2len] = '\0';-
86-
87 diff = strcoll_loop (s1, s1len + 1, s2, s2len + 1);-
88-
89 s1[s1len] = n1;-
90 s2[s2len] = n2;-
91 }
never executed: end of block
0
92-
93 return diff;
never executed: return diff;
0
94}-
95-
96/* Compare S1 (a memory block of size S1SIZE, with a NUL as last byte)-
97 and S2 (a memory block of size S2SIZE, with a NUL as last byte)-
98 according to the LC_COLLATE locale. S1SIZE and S2SIZE must be > 0.-
99 Set errno to an error number if there is an error, and to zero-
100 otherwise. */-
101int-
102memcoll0 (char const *s1, size_t s1size, char const *s2, size_t s2size)-
103{-
104 if (s1size == s2size && memcmp (s1, s2, s1size) == 0)
s1size == s2sizeDescription
TRUEnever evaluated
FALSEnever evaluated
memcmp (s1, s2, s1size) == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
105 {-
106 errno = 0;-
107 return 0;
never executed: return 0;
0
108 }-
109 else-
110 return strcoll_loop (s1, s1size, s2, s2size);
never executed: return strcoll_loop (s1, s1size, s2, s2size);
0
111}-
Source codeSwitch to Preprocessed file

Generated by Squish Coco 4.1.2