Coverage Report

Created: 2026-03-12 06:35

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/CMake/Utilities/cmcurl/lib/strcase.c
Line
Count
Source
1
/***************************************************************************
2
 *                                  _   _ ____  _
3
 *  Project                     ___| | | |  _ \| |
4
 *                             / __| | | | |_) | |
5
 *                            | (__| |_| |  _ <| |___
6
 *                             \___|\___/|_| \_\_____|
7
 *
8
 * Copyright (C) Daniel Stenberg, <daniel@haxx.se>, et al.
9
 *
10
 * This software is licensed as described in the file COPYING, which
11
 * you should have received as part of this distribution. The terms
12
 * are also available at https://curl.se/docs/copyright.html.
13
 *
14
 * You may opt to use, copy, modify, merge, publish, distribute and/or sell
15
 * copies of the Software, and permit persons to whom the Software is
16
 * furnished to do so, under the terms of the COPYING file.
17
 *
18
 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
19
 * KIND, either express or implied.
20
 *
21
 * SPDX-License-Identifier: curl
22
 *
23
 ***************************************************************************/
24
#include "curl_setup.h"
25
26
#include "strcase.h"
27
28
/* Mapping table to go from lowercase to uppercase for plain ASCII.*/
29
static const unsigned char touppermap[256] = {
30
  0,   1,   2,   3,   4,   5,   6,   7,   8,   9,   10,  11,  12,  13,  14,
31
  15,  16,  17,  18,  19,  20,  21,  22,  23,  24,  25,  26,  27,  28,  29,
32
  30,  31,  32,  33,  34,  35,  36,  37,  38,  39,  40,  41,  42,  43,  44,
33
  45,  46,  47,  48,  49,  50,  51,  52,  53,  54,  55,  56,  57,  58,  59,
34
  60,  61,  62,  63,  64,  65,  66,  67,  68,  69,  70,  71,  72,  73,  74,
35
  75,  76,  77,  78,  79,  80,  81,  82,  83,  84,  85,  86,  87,  88,  89,
36
  90,  91,  92,  93,  94,  95,  96,  65,  66,  67,  68,  69,  70,  71,  72,
37
  73,  74,  75,  76,  77,  78,  79,  80,  81,  82,  83,  84,  85,  86,  87,
38
  88,  89,  90,  123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134,
39
  135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149,
40
  150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164,
41
  165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179,
42
  180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194,
43
  195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209,
44
  210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224,
45
  225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239,
46
  240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254,
47
  255
48
};
49
50
/* Mapping table to go from uppercase to lowercase for plain ASCII.*/
51
static const unsigned char tolowermap[256] = {
52
  0,   1,   2,   3,   4,   5,   6,   7,   8,   9,   10,  11,  12,  13,  14,
53
  15,  16,  17,  18,  19,  20,  21,  22,  23,  24,  25,  26,  27,  28,  29,
54
  30,  31,  32,  33,  34,  35,  36,  37,  38,  39,  40,  41,  42,  43,  44,
55
  45,  46,  47,  48,  49,  50,  51,  52,  53,  54,  55,  56,  57,  58,  59,
56
  60,  61,  62,  63,  64,  97,  98,  99,  100, 101, 102, 103, 104, 105, 106,
57
  107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121,
58
  122, 91,  92,  93,  94,  95,  96,  97,  98,  99,  100, 101, 102, 103, 104,
59
  105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119,
60
  120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134,
61
  135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149,
62
  150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164,
63
  165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179,
64
  180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194,
65
  195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209,
66
  210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224,
67
  225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239,
68
  240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254,
69
  255
70
};
71
72
/* Portable, consistent toupper. Do not use toupper() because its behavior is
73
   altered by the current locale. */
74
char Curl_raw_toupper(char in)
75
0
{
76
0
  return (char)touppermap[(unsigned char)in];
77
0
}
78
79
/* Portable, consistent tolower. Do not use tolower() because its behavior is
80
   altered by the current locale. */
81
char Curl_raw_tolower(char in)
82
0
{
83
0
  return (char)tolowermap[(unsigned char)in];
84
0
}
85
86
/* Copy an upper case version of the string from src to dest. The
87
 * strings may overlap. No more than n characters of the string are copied
88
 * (including any NUL) and the destination string will NOT be
89
 * null-terminated if that limit is reached.
90
 */
91
void Curl_strntoupper(char *dest, const char *src, size_t n)
92
0
{
93
0
  if(n < 1)
94
0
    return;
95
96
0
  do {
97
0
    *dest++ = Curl_raw_toupper(*src);
98
0
  } while(*src++ && --n);
99
0
}
100
101
/* Copy a lower case version of the string from src to dest. The
102
 * strings may overlap. No more than n characters of the string are copied
103
 * (including any NUL) and the destination string will NOT be
104
 * null-terminated if that limit is reached.
105
 */
106
void Curl_strntolower(char *dest, const char *src, size_t n)
107
0
{
108
0
  if(n < 1)
109
0
    return;
110
111
0
  do {
112
0
    *dest++ = Curl_raw_tolower(*src);
113
0
  } while(*src++ && --n);
114
0
}
115
116
/* Compare case-sensitive null-terminated strings, taking care of possible
117
 * null pointers. Return true if arguments match.
118
 */
119
bool Curl_safecmp(char *a, char *b)
120
0
{
121
0
  if(a && b)
122
0
    return !strcmp(a, b);
123
0
  return !a && !b;
124
0
}
125
126
/*
127
 * Curl_timestrcmp() returns 0 if the two strings are identical. The time this
128
 * function spends is a function of the shortest string, not of the contents.
129
 */
130
int Curl_timestrcmp(const char *a, const char *b)
131
0
{
132
0
  int match = 0;
133
0
  int i = 0;
134
135
0
  if(a && b) {
136
0
    while(1) {
137
0
      match |= a[i] ^ b[i];
138
0
      if(!a[i] || !b[i])
139
0
        break;
140
0
      i++;
141
0
    }
142
0
  }
143
0
  else
144
0
    return a || b;
145
0
  return match;
146
0
}