mirror of
https://gitlab.isc.org/isc-projects/bind9
synced 2025-08-31 14:35:26 +00:00
138. [cleanup] isc_strtouq moved from str.[ch] to string.[ch] and
renamed isc_string_touint64. isc_strsep moved from strsep.c to string.c and renamed isc_string_separate.
This commit is contained in:
109
lib/isc/string.c
Normal file
109
lib/isc/string.c
Normal file
@@ -0,0 +1,109 @@
|
||||
/*
|
||||
* Copyright (C) 2000 Internet Software Consortium.
|
||||
*
|
||||
* Permission to use, copy, modify, and distribute this software for any
|
||||
* purpose with or without fee is hereby granted, provided that the above
|
||||
* copyright notice and this permission notice appear in all copies.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM DISCLAIMS
|
||||
* ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES
|
||||
* OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL INTERNET SOFTWARE
|
||||
* CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
|
||||
* DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
|
||||
* PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
|
||||
* ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
|
||||
* SOFTWARE.
|
||||
*/
|
||||
|
||||
#include <config.h>
|
||||
|
||||
#include <ctype.h>
|
||||
|
||||
#include <isc/string.h>
|
||||
|
||||
static char digits[] = "0123456789abcdefghijklmnoprstuvwxyz";
|
||||
|
||||
isc_uint64_t
|
||||
isc_string_touint64(char *source, char **end, int base) {
|
||||
isc_uint64_t tmp;
|
||||
isc_uint64_t overflow;
|
||||
char *s = source;
|
||||
char *o;
|
||||
char c;
|
||||
|
||||
if ((base < 0) || (base == 1) || (base > 36)) {
|
||||
*end = source;
|
||||
return (0);
|
||||
}
|
||||
|
||||
while (*s != 0 && isascii(*s&0xff) && isspace(*s&0xff))
|
||||
s++;
|
||||
if (*s == '+' /* || *s == '-' */)
|
||||
s++;
|
||||
if (base == 0) {
|
||||
if (*s == '0' && (*(s+1) == 'X' || *(s+1) == 'x')) {
|
||||
s += 2;
|
||||
base = 16;
|
||||
} else if (*s == '0')
|
||||
base = 8;
|
||||
else
|
||||
base = 10;
|
||||
}
|
||||
if (*s == 0) {
|
||||
*end = source;
|
||||
return (0);
|
||||
}
|
||||
overflow = ~0;
|
||||
overflow /= base;
|
||||
tmp = 0;
|
||||
|
||||
while ((c = *s) != 0) {
|
||||
c = tolower(c);
|
||||
/* end ? */
|
||||
if ((o = strchr(digits, c)) == NULL) {
|
||||
*end = s;
|
||||
return (tmp);
|
||||
}
|
||||
/* end ? */
|
||||
if ((o - digits) >= base) {
|
||||
*end = s;
|
||||
return (tmp);
|
||||
}
|
||||
/* overflow ? */
|
||||
if (tmp > overflow) {
|
||||
*end = source;
|
||||
return (0);
|
||||
}
|
||||
tmp *= base;
|
||||
/* overflow ? */
|
||||
if ((tmp + (o - digits)) < tmp) {
|
||||
*end = source;
|
||||
return (0);
|
||||
}
|
||||
tmp += o - digits;
|
||||
s++;
|
||||
}
|
||||
*end = s;
|
||||
return (tmp);
|
||||
}
|
||||
|
||||
char *
|
||||
isc_string_separate(char **stringp, const char *delim) {
|
||||
char *string = *stringp;
|
||||
char *s;
|
||||
const char *d;
|
||||
char sc, dc;
|
||||
|
||||
if (string == NULL)
|
||||
return (NULL);
|
||||
|
||||
for (s = string; (sc = *s) != '\0'; s++)
|
||||
for (d = delim; (dc = *d) != '\0'; d++)
|
||||
if (sc == dc) {
|
||||
*s++ = '\0';
|
||||
*stringp = s;
|
||||
return (string);
|
||||
}
|
||||
*stringp = NULL;
|
||||
return (string);
|
||||
}
|
Reference in New Issue
Block a user