possible problems. - New file breakage.c handles (so far) missing functions. - Get rid of some signed/unsigned/const warnings thanks to solaris-cc - Add autoconf/automake input files, and helper scripts to populate missing (but auto-generated) files. This change adds a configure.in and Makefile.am to build everything using autoconf, automake, and libtool - and adds "gunk" scripts to generate the various files those things need (and clean then up again after). This means that "autogunk.sh" needs to be run first on a system with the autotools, but the resulting directory should be "configure"able and compilable on systems without those tools.
		
			
				
	
	
		
			67 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			67 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
#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
 |