You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
68 lines
1.7 KiB
68 lines
1.7 KiB
#include "tunala.h" |
|
|
|
int int_strtoul(const char *str, unsigned long *val) |
|
{ |
|
#ifdef HAVE_STRTOUL |
|
char *tmp; |
|
unsigned long ret = strtoul(str, &tmp, 10); |
|
if ((str == tmp) || (*tmp != '\0')) |
|
/* The value didn't parse cleanly */ |
|
return 0; |
|
if (ret == ULONG_MAX) |
|
/* We hit a limit */ |
|
return 0; |
|
*val = ret; |
|
return 1; |
|
#else |
|
char buf[2]; |
|
unsigned long ret = 0; |
|
buf[1] = '\0'; |
|
if (str == '\0') |
|
/* An empty string ... */ |
|
return 0; |
|
while (*str != '\0') { |
|
/* |
|
* We have to multiply 'ret' by 10 before absorbing the next digit. |
|
* If this will overflow, catch it now. |
|
*/ |
|
if (ret && (((ULONG_MAX + 10) / ret) < 10)) |
|
return 0; |
|
ret *= 10; |
|
if (!isdigit(*str)) |
|
return 0; |
|
buf[0] = *str; |
|
ret += atoi(buf); |
|
str++; |
|
} |
|
*val = ret; |
|
return 1; |
|
#endif |
|
} |
|
|
|
#ifndef HAVE_STRSTR |
|
char *int_strstr(const char *haystack, const char *needle) |
|
{ |
|
const char *sub_haystack = haystack, *sub_needle = needle; |
|
unsigned int offset = 0; |
|
if (!needle) |
|
return haystack; |
|
if (!haystack) |
|
return NULL; |
|
while ((*sub_haystack != '\0') && (*sub_needle != '\0')) { |
|
if (sub_haystack[offset] == sub_needle) { |
|
/* sub_haystack is still a candidate */ |
|
offset++; |
|
sub_needle++; |
|
} else { |
|
/* sub_haystack is no longer a possibility */ |
|
sub_haystack++; |
|
offset = 0; |
|
sub_needle = needle; |
|
} |
|
} |
|
if (*sub_haystack == '\0') |
|
/* Found nothing */ |
|
return NULL; |
|
return sub_haystack; |
|
} |
|
#endif
|
|
|