2001-07-23 19:03:48 +00:00
|
|
|
#include "tunala.h"
|
|
|
|
|
|
|
|
int int_strtoul(const char *str, unsigned long *val)
|
|
|
|
{
|
|
|
|
#ifdef HAVE_STRTOUL
|
2015-01-21 23:55:44 +00:00
|
|
|
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;
|
2001-07-23 19:03:48 +00:00
|
|
|
#else
|
2015-01-21 23:55:44 +00:00
|
|
|
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;
|
2001-07-23 19:03:48 +00:00
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
|
|
|
#ifndef HAVE_STRSTR
|
|
|
|
char *int_strstr(const char *haystack, const char *needle)
|
|
|
|
{
|
2015-01-21 23:55:44 +00:00
|
|
|
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;
|
2001-07-23 19:03:48 +00:00
|
|
|
}
|
|
|
|
#endif
|