/*
 *$Id$
 *
 * - various general purpose functions
 */

#ifndef ut_h
#define ut_h

#include "dprint.h"

/* converts a str to an u. short, returns the u. short and sets *err on 
 * error and if err!=null
 * */
static inline unsigned short str2s(unsigned char* str, unsigned int len,
									int *err)
{
	unsigned short ret;
	int i;
	unsigned char *limit;
	unsigned char *init;
	
	/*init*/
	ret=i=0;
	limit=str+len;
	init=str;
	
	for(;str<limit ;str++){
		if ( (*str <= '9' ) && (*str >= '0') ){
				ret=ret*10+*str-'0';
				i++;
				if (i>5) goto error_digits;
		}else{
				//error unknown char
				goto error_char;
		}
	}
	if (err) *err=0;
	return ret;
	
error_digits:
	DBG("str2s: ERROR: too many letters in [%s]\n", init);
	if (err) *err=1;
	return 0;
error_char:
	DBG("str2s: ERROR: unexpected char %c in %s\n", *str, init);
	if (err) *err=1;
	return 0;
}



/* converts a str to an ipv4 address, returns the address and sets *err
 * if error and err!=null
 */
static inline unsigned int str2ip(unsigned char* str, unsigned int len,
		int * err)
{
	unsigned int ret;
	int i;
	unsigned char *limit;
	unsigned char *init;

	/*init*/
	ret=i=0;
	limit=str+len;
	init=str;
	
	for(;str<limit ;str++){
		if (*str=='.'){
				i++;
				if (i>3) goto error_dots;
		}else if ( (*str <= '9' ) && (*str >= '0') ){
				((unsigned char*)&ret)[i]=((unsigned char*)&ret)[i]*10+
											*str-'0';
		}else{
				//error unknown char
				goto error_char;
		}
	}
	if (err) *err=0;
	return ret;
	
error_dots:
	DBG("str2ip: ERROR: too many dots in [%s]\n", init);
	if (err) *err=1;
	return 0;
error_char:
	DBG("str2ip: ERROR: unexpected char %c in %s\n", *str, init);
	if (err) *err=1;
	return 0;
}



/* faster memchr version */

static inline char* q_memchr(char* p, int c, unsigned int size)
{
	char* end;

	end=p+size;
	for(;p<end;p++){
		if (*p==(unsigned char)c) return p;
	}
	return 0;
}
	

#endif