#ifndef NULL
#define NULL ((void*)0)
#endif

static inline void*  memset(void *mem, int c, unsigned size)
{
unsigned i;

for ( i = 0; i < size; i++ )
	 *((char *)mem+i) = (char) c;

return NULL;	
}


static inline void* memcpy(void *dst, const void *src, unsigned size)
{

unsigned i;

for ( i = 0; i < size; i++)
	*(char *)(dst+i) = *(char *)(src+i);

return NULL;
}


static inline int memcmp(const void* buf1, const void* buf2, int count)
{
int i;
for (i=0;i<count;i++)
	{
	if (*(unsigned char*)buf1<*(unsigned char*)buf2)
		return -1;
	if (*(unsigned char*)buf1>*(unsigned char*)buf2)			
		return 1;
	}
return 0;
}

static inline char *strcat(char strDest[], char strSource[])
{
	int i, j; 
	i = j = 0;
	while (strDest[i] != '\0') i++;
	while ((strDest[i++] = strSource[j++]) != '\0');
	return strDest;
}


static inline int strcmp(char* string1,char* string2)
{

while (1)
{
if (*string1<*string2)
	return -1;
if (*string1>*string2)
	return 1;

if (*string1=='\0')
	return 0;

string1++;
string2++;
}

}

static inline char *strcpy(char strDest[], const char strSource[])
{
	unsigned i;
	i = 0;
	while ((strDest[i] = strSource[i]) != '\0') i++;
	return strDest;
}


char* strncpy(char *strDest, const char *strSource, unsigned n)
{
	unsigned i;

	if (! n )
		return strDest;

	i = 0;
	while ((strDest[i] = strSource[i]) != '\0')
		if ( (n-1) == i )
			break;
		else
			i++;

	return strDest;
}


static inline int strlen(const char* string)
{
	int i;

	i=0;
	while (*string++) i++;
	return i;
}



static inline char* strchr(const char* string, int c)
{
	while (*string)
	{
		if (*string==c)
			return (char*)string;
		string++;
	}	
	return (char*)0;
}


static inline char* strrchr(const char* string, int c)
{
	char* last_found;
	while (*string)
	{
		if (*string==c)
		{
			last_found = (char*)string;
		}
		string++;
	}	
	return last_found;
}



static inline void _itoa(int i, char *s)
{
	int a, b, c, d;
	a = (i - i%1000)/1000;
	b = (i - i%100)/100 - a*10;
	c = (i - i%10)/10 - a*100 - b*10;
	d = i%10;
	s[0] = a + '0';
	s[1] = b + '0';
	s[2] = c + '0';
	s[3] = d + '0';
	s[4] = 0;
}


 /* reverse:  �������������� ������ s �� ����� */
static inline void reverse(char s[])
 {
     int i, j;
     char c;
 
     for (i = 0, j = strlen(s)-1; i<j; i++, j--) {
         c = s[i];
         s[i] = s[j];
         s[j] = c;
     }
 }


 /* itoa:  ������������ n � ������� � s */
static inline void itoa(int n, char s[])
 {
     int i, sign;
 
     if ((sign = n) < 0)
         n = -n;
     i = 0;
     do {
         s[i++] = n % 10 + '0';
     } while ((n /= 10) > 0);
     if (sign < 0)
         s[i++] = '-';
     s[i] = '\0';
     reverse(s);
 }



static inline int atoi ( char *s )
{
	int i, n;

	n = 0;
	for ( i = 0; s[i]!= '\0'; ++i)
		if ((s[i]<'0') || (s[i]>'9'))
			return 0;
		else
			n = 10 * n + s[i] - '0';

	return n;
}