summaryrefslogtreecommitdiffstats
path: root/demos/tunala/breakage.c
blob: dcdd64b0ef183556f5ea977ebcfcdc3624a5c717 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#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