#include <jit/jit-util.h>
#include "jit-config.h"
#include <stdio.h>
#ifdef HAVE_STDLIB_H
# include <stdlib.h>
#endif
#if defined(HAVE_STRING_H)
# include <string.h>
#elif defined(HAVE_STRINGS_H)
# include <strings.h>
#endif
#if defined(HAVE_MEMORY_H)
# include <memory.h>
#endif
#if defined(HAVE_STDARG_H)
# include <stdarg.h>
#elif defined(HAVE_VARARGS_H)
# include <varargs.h>
#endif
#undef jit_memset
#undef jit_memcpy
#undef jit_memmove
#undef jit_memcmp
#undef jit_memchr
void *jit_malloc(unsigned int size)
{
return malloc(size);
}
void *jit_calloc(unsigned int num, unsigned int size)
{
return calloc(num, size);
}
void *jit_realloc(void *ptr, unsigned int size)
{
return realloc(ptr, size);
}
void jit_free(void *ptr)
{
if(ptr)
{
free(ptr);
}
}
void *jit_memset(void *dest, int ch, unsigned int len)
{
#ifdef HAVE_MEMSET
return memset(dest, ch, len);
#else
unsigned char *d = (unsigned char *)dest;
while(len > 0)
{
*d++ = (unsigned char)ch;
--len;
}
return dest;
#endif
}
void *jit_memcpy(void *dest, const void *src, unsigned int len)
{
#if defined(HAVE_MEMCPY)
return memcpy(dest, src, len);
#elif defined(HAVE_BCOPY)
bcopy(src, dest, len);
return dest;
#else
unsigned char *d = (unsigned char *)dest;
const unsigned char *s = (const unsigned char *)src;
while(len > 0)
{
*d++ = *s++;
--len;
}
return dest;
#endif
}
void *jit_memmove(void *dest, const void *src, unsigned int len)
{
#ifdef HAVE_MEMMOVE
return memmove(dest, src, len);
#else
unsigned char *d = (unsigned char *)dest;
const unsigned char *s = (const unsigned char *)src;
if(((const unsigned char *)d) < s)
{
while(len > 0)
{
*d++ = *s++;
--len;
}
}
else
{
d += len;
s += len;
while(len > 0)
{
*(--d) = *(--s);
--len;
}
}
return dest;
#endif
}
int jit_memcmp(const void *s1, const void *s2, unsigned int len)
{
#if defined(HAVE_MEMCMP)
return memcmp(s1, s2, len);
#elif defined(HAVE_BCMP)
return bcmp(s1, s2, len);
#else
const unsigned char *str1 = (const unsigned char *)s1;
const unsigned char *str2 = (const unsigned char *)s2;
while(len > 0)
{
if(*str1 < *str2)
return -1;
else if(*str1 > *str2)
return 1;
++str1;
++str2;
--len;
}
return 0;
#endif
}
void *jit_memchr(const void *str, int ch, unsigned int len)
{
#ifdef HAVE_MEMCHR
return memchr(str, ch, len);
#else
const unsigned char *s = (const unsigned char *)str;
while(len > 0)
{
if(*s == (unsigned char)ch)
{
return (void *)s;
}
++s;
--len;
}
return (void *)0;
#endif
}
unsigned int jit_strlen(const char *str)
{
#ifdef HAVE_STRLEN
return (unsigned int)(strlen(str));
#else
unsigned int len = 0;
while(*str++ != '\0')
{
++len;
}
return len;
#endif
}
char *jit_strcpy(char *dest, const char *src)
{
#ifdef HAVE_STRCPY
return strcpy(dest, src);
#else
char ch;
char *d = dest;
while((ch = *src++) != '\0')
{
*d++ = ch;
}
*d = '\0';
return dest;
#endif
}
char *jit_strcat(char *dest, const char *src)
{
#ifdef HAVE_STRCAT
return strcat(dest, src);
#else
char ch;
char *d = dest + jit_strlen(dest);
while((ch = *src++) != '\0')
{
*d++ = ch;
}
*d = '\0';
return dest;
#endif
}
char *jit_strncpy(char *dest, const char *src, unsigned int len)
{
#ifdef HAVE_STRNCPY
return strncpy(dest, src, len);
#else
char ch;
char *d = dest;
while(len > 0 && (ch = *src++) != '\0')
{
*d++ = ch;
--len;
}
while(len > 0)
{
*d++ = '\0';
--len;
}
return dest;
#endif
}
char *jit_strdup(const char *str)
{
char *new_str;
if(!str)
{
return 0;
}
new_str = jit_malloc(strlen(str) + 1);
if(!new_str)
{
return 0;
}
strcpy(new_str, str);
return new_str;
}
char *jit_strndup(const char *str, unsigned int len)
{
char *new_str;
if(!str)
{
return 0;
}
new_str = jit_malloc(len + 1);
if(!new_str)
{
return 0;
}
jit_memcpy(new_str, str, len);
new_str[len] = '\0';
return new_str;
}
int jit_strcmp(const char *str1, const char *str2)
{
#ifdef HAVE_STRCMP
return strcmp(str1, str2);
#else
int ch1, ch2;
for(;;)
{
ch1 = *str1++;
ch2 = *str2++;
if(ch1 != ch2 || !ch1 || !ch2)
{
break;
}
}
return (ch1 - ch2);
#endif
}
int jit_strncmp(const char *str1, const char *str2, unsigned int len)
{
#ifdef HAVE_STRNCMP
return strncmp(str1, str2, len);
#else
int ch1, ch2;
while(len > 0)
{
ch1 = *str1++;
ch2 = *str2++;
if(ch1 != ch2 || !ch1 || !ch2)
{
return (ch1 - ch2);
}
--len;
}
return 0;
#endif
}
int jit_stricmp(const char *str1, const char *str2)
{
int ch1, ch2;
for(;;)
{
ch1 = *str1++;
ch2 = *str2++;
if(ch1 >= 'A' && ch1 <= 'Z')
{
ch1 = ch1 - 'A' + 'a';
}
if(ch2 >= 'A' && ch2 <= 'Z')
{
ch2 = ch2 - 'A' + 'a';
}
if(ch1 != ch2 || !ch1 || !ch2)
{
break;
}
}
return (ch1 - ch2);
}
int jit_strnicmp(const char *str1, const char *str2, unsigned int len)
{
int ch1, ch2;
while(len > 0)
{
ch1 = *str1++;
ch2 = *str2++;
if(ch1 >= 'A' && ch1 <= 'Z')
{
ch1 = ch1 - 'A' + 'a';
}
if(ch2 >= 'A' && ch2 <= 'Z')
{
ch2 = ch2 - 'A' + 'a';
}
if(ch1 != ch2 || !ch1 || !ch2)
{
return (ch1 - ch2);
}
--len;
}
return 0;
}
char *jit_strchr(const char *str, int ch)
{
#ifdef HAVE_STRCHR
return strchr(str, ch);
#else
char *s = (char *)str;
for(;;)
{
if(*s == (char)ch)
{
return s;
}
else if(*s == '\0')
{
break;
}
++s;
}
return 0;
#endif
}
char *jit_strrchr(const char *str, int ch)
{
#ifdef HAVE_STRRCHR
return strrchr(str, ch);
#else
unsigned int len = jit_strlen(str);
char *s = (char *)(str + len);
while(len > 0)
{
--s;
if(*s == (char)ch)
{
return s;
}
--len;
}
return 0;
#endif
}
int jit_sprintf(char *str, const char *format, ...)
{
va_list va;
int result;
#ifdef HAVE_STDARG_H
va_start(va, format);
#else
va_start(va);
#endif
#ifdef VSPRINTF
result = vsprintf(str, format, va);
#else
*str = '\0';
result = 0;
#endif
va_end(va);
return result;
}
int jit_snprintf(char *str, unsigned int len, const char *format, ...)
{
va_list va;
int result;
#ifdef HAVE_STDARG_H
va_start(va, format);
#else
va_start(va);
#endif
#if defined(HAVE_VSNPRINTF)
result = vsnprintf(str, len, format, va);
#elif defined(HAVE__VSNPRINTF)
result = _vsnprintf(str, len, format, va);
#else
*str = '\0';
result = 0;
#endif
va_end(va);
return result;
}