• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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