Coverage Report

Created: 2025-12-05 06:38

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