Annotation of embedaddon/ntp/lib/isc/string.c, revision 1.1.1.1
1.1 misho 1: /*
2: * Copyright (C) 2004-2007 Internet Systems Consortium, Inc. ("ISC")
3: * Copyright (C) 1999-2001, 2003 Internet Software Consortium.
4: *
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.
8: *
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.
16: */
17:
18: /* $Id: string.c,v 1.20 2007/06/19 23:47:17 tbox Exp $ */
19:
20: /*! \file */
21:
22: #include <config.h>
23:
24: #include <ctype.h>
25:
26: #include <isc/mem.h>
27: #include <isc/print.h>
28: #include <isc/region.h>
29: #include <isc/string.h>
30: #include <isc/util.h>
31:
32: static char digits[] = "0123456789abcdefghijklmnoprstuvwxyz";
33:
34: isc_uint64_t
35: isc_string_touint64(char *source, char **end, int base) {
36: isc_uint64_t tmp;
37: isc_uint64_t overflow;
38: char *s = source;
39: char *o;
40: char c;
41:
42: if ((base < 0) || (base == 1) || (base > 36)) {
43: *end = source;
44: return (0);
45: }
46:
47: while (*s != 0 && isascii(*s&0xff) && isspace(*s&0xff))
48: s++;
49: if (*s == '+' /* || *s == '-' */)
50: s++;
51: if (base == 0) {
52: if (*s == '0' && (*(s+1) == 'X' || *(s+1) == 'x')) {
53: s += 2;
54: base = 16;
55: } else if (*s == '0')
56: base = 8;
57: else
58: base = 10;
59: }
60: if (*s == 0) {
61: *end = source;
62: return (0);
63: }
64: overflow = ~0;
65: overflow /= base;
66: tmp = 0;
67:
68: while ((c = *s) != 0) {
69: c = tolower(c&0xff);
70: /* end ? */
71: if ((o = strchr(digits, c)) == NULL) {
72: *end = s;
73: return (tmp);
74: }
75: /* end ? */
76: if ((o - digits) >= base) {
77: *end = s;
78: return (tmp);
79: }
80: /* overflow ? */
81: if (tmp > overflow) {
82: *end = source;
83: return (0);
84: }
85: tmp *= base;
86: /* overflow ? */
87: if ((tmp + (o - digits)) < tmp) {
88: *end = source;
89: return (0);
90: }
91: tmp += o - digits;
92: s++;
93: }
94: *end = s;
95: return (tmp);
96: }
97:
98: isc_result_t
99: isc_string_copy(char *target, size_t size, const char *source) {
100: REQUIRE(size > 0U);
101:
102: if (strlcpy(target, source, size) >= size) {
103: memset(target, ISC_STRING_MAGIC, size);
104: return (ISC_R_NOSPACE);
105: }
106:
107: ENSURE(strlen(target) < size);
108:
109: return (ISC_R_SUCCESS);
110: }
111:
112: void
113: isc_string_copy_truncate(char *target, size_t size, const char *source) {
114: REQUIRE(size > 0U);
115:
116: strlcpy(target, source, size);
117:
118: ENSURE(strlen(target) < size);
119: }
120:
121: isc_result_t
122: isc_string_append(char *target, size_t size, const char *source) {
123: REQUIRE(size > 0U);
124: REQUIRE(strlen(target) < size);
125:
126: if (strlcat(target, source, size) >= size) {
127: memset(target, ISC_STRING_MAGIC, size);
128: return (ISC_R_NOSPACE);
129: }
130:
131: ENSURE(strlen(target) < size);
132:
133: return (ISC_R_SUCCESS);
134: }
135:
136: void
137: isc_string_append_truncate(char *target, size_t size, const char *source) {
138: REQUIRE(size > 0U);
139: REQUIRE(strlen(target) < size);
140:
141: strlcat(target, source, size);
142:
143: ENSURE(strlen(target) < size);
144: }
145:
146: isc_result_t
147: isc_string_printf(char *target, size_t size, const char *format, ...) {
148: va_list args;
149: size_t n;
150:
151: REQUIRE(size > 0U);
152:
153: va_start(args, format);
154: n = vsnprintf(target, size, format, args);
155: va_end(args);
156:
157: if (n >= size) {
158: memset(target, ISC_STRING_MAGIC, size);
159: return (ISC_R_NOSPACE);
160: }
161:
162: ENSURE(strlen(target) < size);
163:
164: return (ISC_R_SUCCESS);
165: }
166:
167: void
168: isc_string_printf_truncate(char *target, size_t size, const char *format, ...) {
169: va_list args;
170: size_t n;
171:
172: REQUIRE(size > 0U);
173:
174: va_start(args, format);
175: n = vsnprintf(target, size, format, args);
176: va_end(args);
177:
178: ENSURE(strlen(target) < size);
179: }
180:
181: char *
182: isc_string_regiondup(isc_mem_t *mctx, const isc_region_t *source) {
183: char *target;
184:
185: REQUIRE(mctx != NULL);
186: REQUIRE(source != NULL);
187:
188: target = (char *) isc_mem_allocate(mctx, source->length + 1);
189: if (target != NULL) {
190: memcpy(source->base, target, source->length);
191: target[source->length] = '\0';
192: }
193:
194: return (target);
195: }
196:
197: char *
198: isc_string_separate(char **stringp, const char *delim) {
199: char *string = *stringp;
200: char *s;
201: const char *d;
202: char sc, dc;
203:
204: if (string == NULL)
205: return (NULL);
206:
207: for (s = string; (sc = *s) != '\0'; s++)
208: for (d = delim; (dc = *d) != '\0'; d++)
209: if (sc == dc) {
210: *s++ = '\0';
211: *stringp = s;
212: return (string);
213: }
214: *stringp = NULL;
215: return (string);
216: }
217:
218: size_t
219: isc_string_strlcpy(char *dst, const char *src, size_t size)
220: {
221: char *d = dst;
222: const char *s = src;
223: size_t n = size;
224:
225: /* Copy as many bytes as will fit */
226: if (n != 0U && --n != 0U) {
227: do {
228: if ((*d++ = *s++) == 0)
229: break;
230: } while (--n != 0U);
231: }
232:
233: /* Not enough room in dst, add NUL and traverse rest of src */
234: if (n == 0U) {
235: if (size != 0U)
236: *d = '\0'; /* NUL-terminate dst */
237: while (*s++)
238: ;
239: }
240:
241: return(s - src - 1); /* count does not include NUL */
242: }
243:
244: size_t
245: isc_string_strlcat(char *dst, const char *src, size_t size)
246: {
247: char *d = dst;
248: const char *s = src;
249: size_t n = size;
250: size_t dlen;
251:
252: /* Find the end of dst and adjust bytes left but don't go past end */
253: while (n-- != 0U && *d != '\0')
254: d++;
255: dlen = d - dst;
256: n = size - dlen;
257:
258: if (n == 0U)
259: return(dlen + strlen(s));
260: while (*s != '\0') {
261: if (n != 1U) {
262: *d++ = *s;
263: n--;
264: }
265: s++;
266: }
267: *d = '\0';
268:
269: return(dlen + (s - src)); /* count does not include NUL */
270: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>