2 * Copyright (C) 2004-2007, 2011, 2012 Internet Systems Consortium, Inc. ("ISC")
3 * Copyright (C) 1999-2001, 2003 Internet Software Consortium.
5 * Permission to use, copy, modify, and/or distribute this software for any
6 * purpose with or without fee is hereby granted, provided that the above
7 * copyright notice and this permission notice appear in all copies.
9 * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
10 * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
11 * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
12 * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
13 * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
14 * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
15 * PERFORMANCE OF THIS SOFTWARE.
27 #include <isc/print.h>
28 #include <isc/region.h>
29 #include <isc/string.h>
32 static char digits[] = "0123456789abcdefghijklmnoprstuvwxyz";
35 isc_string_touint64(char *source, char **end, int base) {
37 isc_uint64_t overflow;
42 if ((base < 0) || (base == 1) || (base > 36)) {
47 while (*s != 0 && isascii(*s&0xff) && isspace(*s&0xff))
49 if (*s == '+' /* || *s == '-' */)
52 if (*s == '0' && (*(s+1) == 'X' || *(s+1) == 'x')) {
68 while ((c = *s) != 0) {
71 if ((o = strchr(digits, c)) == NULL) {
76 if ((o - digits) >= base) {
87 if ((tmp + (o - digits)) < tmp) {
99 isc_string_copy(char *target, size_t size, const char *source) {
102 if (strlcpy(target, source, size) >= size) {
103 memset(target, ISC_STRING_MAGIC, size);
104 return (ISC_R_NOSPACE);
107 ENSURE(strlen(target) < size);
109 return (ISC_R_SUCCESS);
113 isc_string_copy_truncate(char *target, size_t size, const char *source) {
116 strlcpy(target, source, size);
118 ENSURE(strlen(target) < size);
122 isc_string_append(char *target, size_t size, const char *source) {
124 REQUIRE(strlen(target) < size);
126 if (strlcat(target, source, size) >= size) {
127 memset(target, ISC_STRING_MAGIC, size);
128 return (ISC_R_NOSPACE);
131 ENSURE(strlen(target) < size);
133 return (ISC_R_SUCCESS);
137 isc_string_append_truncate(char *target, size_t size, const char *source) {
139 REQUIRE(strlen(target) < size);
141 strlcat(target, source, size);
143 ENSURE(strlen(target) < size);
147 isc_string_printf(char *target, size_t size, const char *format, ...) {
153 va_start(args, format);
154 n = vsnprintf(target, size, format, args);
158 memset(target, ISC_STRING_MAGIC, size);
159 return (ISC_R_NOSPACE);
162 ENSURE(strlen(target) < size);
164 return (ISC_R_SUCCESS);
168 isc_string_printf_truncate(char *target, size_t size, const char *format, ...)
174 va_start(args, format);
175 /* check return code? */
176 (void)vsnprintf(target, size, format, args);
179 ENSURE(strlen(target) < size);
183 isc_string_regiondup(isc_mem_t *mctx, const isc_region_t *source) {
186 REQUIRE(mctx != NULL);
187 REQUIRE(source != NULL);
189 target = (char *) isc_mem_allocate(mctx, source->length + 1);
190 if (target != NULL) {
191 memcpy(source->base, target, source->length);
192 target[source->length] = '\0';
199 isc_string_separate(char **stringp, const char *delim) {
200 char *string = *stringp;
208 for (s = string; (sc = *s) != '\0'; s++)
209 for (d = delim; (dc = *d) != '\0'; d++)
220 isc_string_strlcpy(char *dst, const char *src, size_t size)
226 /* Copy as many bytes as will fit */
227 if (n != 0U && --n != 0U) {
229 if ((*d++ = *s++) == 0)
234 /* Not enough room in dst, add NUL and traverse rest of src */
237 *d = '\0'; /* NUL-terminate dst */
242 return(s - src - 1); /* count does not include NUL */
246 isc_string_strlcat(char *dst, const char *src, size_t size)
253 /* Find the end of dst and adjust bytes left but don't go past end */
254 while (n-- != 0U && *d != '\0')
260 return(dlen + strlen(s));
270 return(dlen + (s - src)); /* count does not include NUL */