1 /* MIT License
2 *
3 * Copyright (c) 1998 Massachusetts Institute of Technology
4 * Copyright (c) The c-ares project and its contributors
5 *
6 * Permission is hereby granted, free of charge, to any person obtaining a copy
7 * of this software and associated documentation files (the "Software"), to deal
8 * in the Software without restriction, including without limitation the rights
9 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 * copies of the Software, and to permit persons to whom the Software is
11 * furnished to do so, subject to the following conditions:
12 *
13 * The above copyright notice and this permission notice (including the next
14 * paragraph) shall be included in all copies or substantial portions of the
15 * Software.
16 *
17 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
20 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
22 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
23 * SOFTWARE.
24 *
25 * SPDX-License-Identifier: MIT
26 */
27
28 #include "ares_setup.h"
29 #include "ares_str.h"
30 #include "ares.h"
31 #include "ares_private.h"
32
33 #ifdef HAVE_STDINT_H
34 # include <stdint.h>
35 #endif
36
ares_strlen(const char * str)37 size_t ares_strlen(const char *str)
38 {
39 if (str == NULL) {
40 return 0;
41 }
42
43 return strlen(str);
44 }
45
ares_strdup(const char * s1)46 char *ares_strdup(const char *s1)
47 {
48 size_t len;
49 char *out;
50
51 if (s1 == NULL) {
52 return NULL;
53 }
54
55 len = ares_strlen(s1);
56
57 /* Don't see how this is possible */
58 if (len == SIZE_MAX) {
59 return NULL;
60 }
61
62 out = ares_malloc(len + 1);
63 if (out == NULL) {
64 return NULL;
65 }
66
67 if (len) {
68 memcpy(out, s1, len);
69 }
70
71 out[len] = 0;
72 return out;
73 }
74
ares_strcpy(char * dest,const char * src,size_t dest_size)75 size_t ares_strcpy(char *dest, const char *src, size_t dest_size)
76 {
77 size_t len = 0;
78
79 if (dest == NULL || dest_size == 0) {
80 return 0;
81 }
82
83 len = ares_strlen(src);
84
85 if (len >= dest_size) {
86 len = dest_size - 1;
87 }
88
89 if (len) {
90 memcpy(dest, src, len);
91 }
92
93 dest[len] = 0;
94 return len;
95 }
96
ares_str_isnum(const char * str)97 ares_bool_t ares_str_isnum(const char *str)
98 {
99 size_t i;
100
101 if (str == NULL || *str == 0) {
102 return ARES_FALSE;
103 }
104
105 for (i = 0; str[i] != 0; i++) {
106 if (str[i] < '0' || str[i] > '9') {
107 return ARES_FALSE;
108 }
109 }
110 return ARES_TRUE;
111 }
112
113 /* tolower() is locale-specific. Use a lookup table fast conversion that only
114 * operates on ASCII */
115 static const unsigned char ares__tolower_lookup[] = {
116 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C,
117 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19,
118 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26,
119 0x27, 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F, 0x30, 0x31, 0x32, 0x33,
120 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F, 0x40,
121 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D,
122 0x6E, 0x6F, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A,
123 0x5B, 0x5C, 0x5D, 0x5E, 0x5F, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
124 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F, 0x70, 0x71, 0x72, 0x73, 0x74,
125 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0x7B, 0x7C, 0x7D, 0x7E, 0x7F, 0x80, 0x81,
126 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E,
127 0x8F, 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9A, 0x9B,
128 0x9C, 0x9D, 0x9E, 0x9F, 0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8,
129 0xA9, 0xAA, 0xAB, 0xAC, 0xAD, 0xAE, 0xAF, 0xB0, 0xB1, 0xB2, 0xB3, 0xB4, 0xB5,
130 0xB6, 0xB7, 0xB8, 0xB9, 0xBA, 0xBB, 0xBC, 0xBD, 0xBE, 0xBF, 0xC0, 0xC1, 0xC2,
131 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF,
132 0xD0, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7, 0xD8, 0xD9, 0xDA, 0xDB, 0xDC,
133 0xDD, 0xDE, 0xDF, 0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9,
134 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF, 0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6,
135 0xF7, 0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE, 0xFF
136 };
137
ares__tolower(unsigned char c)138 unsigned char ares__tolower(unsigned char c)
139 {
140 return ares__tolower_lookup[c];
141 }
142
ares__memeq_ci(const unsigned char * ptr,const unsigned char * val,size_t len)143 ares_bool_t ares__memeq_ci(const unsigned char *ptr, const unsigned char *val,
144 size_t len)
145 {
146 size_t i;
147 for (i = 0; i < len; i++) {
148 if (ares__tolower_lookup[ptr[i]] != ares__tolower_lookup[val[i]]) {
149 return ARES_FALSE;
150 }
151 }
152 return ARES_TRUE;
153 }
154