339 lines
5.4 KiB
C++
339 lines
5.4 KiB
C++
|
|
#include <stdarg.h>
|
||
|
|
#include <stdio.h>
|
||
|
|
|
||
|
|
#include "fmod_string.h"
|
||
|
|
#include "fmod_memory.h"
|
||
|
|
|
||
|
|
using namespace FMOD;
|
||
|
|
|
||
|
|
int FMOD_strlen(const char * s)
|
||
|
|
{
|
||
|
|
const char *sc;
|
||
|
|
|
||
|
|
for (sc = s; *sc != '\0'; ++sc) /* nothing */;
|
||
|
|
|
||
|
|
return (int)(sc - s);
|
||
|
|
}
|
||
|
|
|
||
|
|
char * FMOD_strcpy(char * dest,const char *src)
|
||
|
|
{
|
||
|
|
char *tmp = dest;
|
||
|
|
|
||
|
|
while ((*dest++ = *src++) != '\0') /* nothing */;
|
||
|
|
|
||
|
|
return tmp;
|
||
|
|
}
|
||
|
|
|
||
|
|
char * FMOD_strncpy(char * dest, const char *src, int count)
|
||
|
|
{
|
||
|
|
char *tmp = dest;
|
||
|
|
|
||
|
|
while (count-- && (*dest++ = *src++) != '\0') /* nothing */;
|
||
|
|
|
||
|
|
return tmp;
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
char * FMOD_strcat(char * dest, const char * src)
|
||
|
|
{
|
||
|
|
char *tmp = dest;
|
||
|
|
|
||
|
|
while (*dest) dest++;
|
||
|
|
while ((*dest++ = *src++) != '\0') ;
|
||
|
|
|
||
|
|
return tmp;
|
||
|
|
}
|
||
|
|
|
||
|
|
char * FMOD_strncat(char *dest, const char *src, int count)
|
||
|
|
{
|
||
|
|
char *tmp = dest;
|
||
|
|
|
||
|
|
if (count)
|
||
|
|
{
|
||
|
|
while (*dest) dest++;
|
||
|
|
|
||
|
|
while ((*dest++ = *src++))
|
||
|
|
{
|
||
|
|
if (--count == 0)
|
||
|
|
{
|
||
|
|
*dest = '\0';
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
return tmp;
|
||
|
|
}
|
||
|
|
|
||
|
|
char FMOD_tolower(char in)
|
||
|
|
{
|
||
|
|
if (in >= 'A' && in <= 'Z')
|
||
|
|
{
|
||
|
|
in += 'a' - 'A';
|
||
|
|
}
|
||
|
|
|
||
|
|
return in;
|
||
|
|
}
|
||
|
|
|
||
|
|
char *FMOD_strupr(char *string)
|
||
|
|
{
|
||
|
|
char * cp;
|
||
|
|
|
||
|
|
for (cp=string; *cp; ++cp)
|
||
|
|
{
|
||
|
|
if (*cp >= 'a' && *cp <= 'z')
|
||
|
|
{
|
||
|
|
*cp += 'A' - 'a';
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
return(string);
|
||
|
|
}
|
||
|
|
|
||
|
|
char *FMOD_strlwr(char *string)
|
||
|
|
{
|
||
|
|
char * cp;
|
||
|
|
|
||
|
|
for (cp=string; *cp; ++cp)
|
||
|
|
{
|
||
|
|
if (*cp >= 'A' && *cp <= 'Z')
|
||
|
|
{
|
||
|
|
*cp += 'a' - 'A';
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
return(string);
|
||
|
|
}
|
||
|
|
|
||
|
|
int FMOD_strcmp( const char *string1, const char *string2 )
|
||
|
|
{
|
||
|
|
register char c1, c2;
|
||
|
|
do
|
||
|
|
{
|
||
|
|
c1 = *string1++;
|
||
|
|
c2 = *string2++;
|
||
|
|
} while ( c1 && (c1 == c2) );
|
||
|
|
|
||
|
|
return c1 - c2;
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
int FMOD_strncmp( const char *string1, const char *string2, int len )
|
||
|
|
{
|
||
|
|
register char c1, c2;
|
||
|
|
int count=0;
|
||
|
|
do
|
||
|
|
{
|
||
|
|
c1 = *string1++;
|
||
|
|
c2 = *string2++;
|
||
|
|
count++;
|
||
|
|
} while ( c1 && (c1 == c2) && count < len);
|
||
|
|
|
||
|
|
return c1 - c2;
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
int FMOD_stricmp( const char *string1, const char *string2 )
|
||
|
|
{
|
||
|
|
register char c1, c2;
|
||
|
|
do
|
||
|
|
{
|
||
|
|
c1 = FMOD_tolower(*string1++);
|
||
|
|
c2 = FMOD_tolower(*string2++);
|
||
|
|
} while ( c1 && (c1 == c2) );
|
||
|
|
|
||
|
|
return c1 - c2;
|
||
|
|
}
|
||
|
|
|
||
|
|
int FMOD_strnicmp( const char *string1, const char *string2, int len )
|
||
|
|
{
|
||
|
|
register char c1, c2;
|
||
|
|
int count=0;
|
||
|
|
do
|
||
|
|
{
|
||
|
|
c1 = FMOD_tolower(*string1++);
|
||
|
|
c2 = FMOD_tolower(*string2++);
|
||
|
|
count++;
|
||
|
|
} while ( c1 && (c1 == c2) && count < len);
|
||
|
|
|
||
|
|
return c1 - c2;
|
||
|
|
}
|
||
|
|
|
||
|
|
char * FMOD_strchr(const char * s1, int c)
|
||
|
|
{
|
||
|
|
int l1;
|
||
|
|
|
||
|
|
l1 = FMOD_strlen(s1);
|
||
|
|
|
||
|
|
while (l1)
|
||
|
|
{
|
||
|
|
l1--;
|
||
|
|
|
||
|
|
if (*s1 == c) return (char *) s1;
|
||
|
|
|
||
|
|
s1++;
|
||
|
|
}
|
||
|
|
return (char *)0;
|
||
|
|
}
|
||
|
|
|
||
|
|
char * FMOD_strstr(const char * s1,const char * s2)
|
||
|
|
{
|
||
|
|
int l1, l2;
|
||
|
|
|
||
|
|
l2 = FMOD_strlen(s2);
|
||
|
|
|
||
|
|
if (!l2)
|
||
|
|
{
|
||
|
|
return (char *) s1;
|
||
|
|
}
|
||
|
|
|
||
|
|
l1 = FMOD_strlen(s1);
|
||
|
|
|
||
|
|
while (l1 >= l2)
|
||
|
|
{
|
||
|
|
l1--;
|
||
|
|
|
||
|
|
if (!FMOD_memcmp(s1,s2,l2)) return (char *) s1;
|
||
|
|
|
||
|
|
s1++;
|
||
|
|
}
|
||
|
|
return (char *)0;
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
int FMOD_memcmp(const void * cs,const void * ct, int count)
|
||
|
|
{
|
||
|
|
const unsigned char *su1, *su2;
|
||
|
|
signed char res = 0;
|
||
|
|
|
||
|
|
for( su1 = (const unsigned char *)cs, su2 = (const unsigned char *)ct; 0 < count; ++su1, ++su2, count--)
|
||
|
|
if ((res = *su1 - *su2) != 0)
|
||
|
|
break;
|
||
|
|
|
||
|
|
return res;
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
void * FMOD_memmove(void * dest,const void *src, int count)
|
||
|
|
{
|
||
|
|
char *tmp, *s;
|
||
|
|
|
||
|
|
if (dest <= src)
|
||
|
|
{
|
||
|
|
tmp = (char *) dest;
|
||
|
|
s = (char *) src;
|
||
|
|
while (count--) *tmp++ = *s++;
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{
|
||
|
|
tmp = (char *) dest + count;
|
||
|
|
s = (char *) src + count;
|
||
|
|
while (count--) *--tmp = *--s;
|
||
|
|
}
|
||
|
|
|
||
|
|
return dest;
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
char *FMOD_strdup(const char * src)
|
||
|
|
{
|
||
|
|
char *ret = 0;
|
||
|
|
|
||
|
|
ret = (char *)FMOD_Memory_Alloc(FMOD_strlen(src) + 1);
|
||
|
|
if (ret)
|
||
|
|
{
|
||
|
|
FMOD_strcpy(ret, src);
|
||
|
|
}
|
||
|
|
|
||
|
|
return ret;
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
char *FMOD_eatwhite(const char *string)
|
||
|
|
{
|
||
|
|
for (;*string && FMOD_isspace(*string);string++) ;
|
||
|
|
|
||
|
|
return (char *)string;
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
/*
|
||
|
|
AJS This only handles decimal integers. Feel free to extend it if you need to
|
||
|
|
*/
|
||
|
|
int FMOD_atoi(const char *s)
|
||
|
|
{
|
||
|
|
if (!s)
|
||
|
|
{
|
||
|
|
return 0;
|
||
|
|
}
|
||
|
|
|
||
|
|
int val = 0;
|
||
|
|
const char *p = s;
|
||
|
|
|
||
|
|
for (; *p; p++) ;
|
||
|
|
|
||
|
|
p--;
|
||
|
|
for (int i=1; p >= s; p--, i *= 10)
|
||
|
|
{
|
||
|
|
val += ((*p - '0') * i);
|
||
|
|
}
|
||
|
|
|
||
|
|
return val;
|
||
|
|
}
|
||
|
|
|
||
|
|
int FMOD_atoi_hex(const char *s)
|
||
|
|
{
|
||
|
|
if (!s)
|
||
|
|
{
|
||
|
|
return 0;
|
||
|
|
}
|
||
|
|
|
||
|
|
int val = 0;
|
||
|
|
|
||
|
|
for(const char *p = s; *p; p++)
|
||
|
|
{
|
||
|
|
val *= 16;
|
||
|
|
|
||
|
|
if(*p >= '0' && *p <= '9')
|
||
|
|
{
|
||
|
|
val += (*p - '0');
|
||
|
|
}
|
||
|
|
else if(*p >= 'A' && *p <= 'F')
|
||
|
|
{
|
||
|
|
val += (*p - 'A' + 10);
|
||
|
|
}
|
||
|
|
else if(*p >= 'a' && *p <= 'f')
|
||
|
|
{
|
||
|
|
val += (*p - 'a' + 10);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
return val;
|
||
|
|
}
|
||
|
|
|
||
|
|
int FMOD_snprintf(char *str, int size, const char *format, ...)
|
||
|
|
{
|
||
|
|
va_list arglist;
|
||
|
|
|
||
|
|
va_start(arglist, format);
|
||
|
|
|
||
|
|
int result = FMOD_vsnprintf(str, size, format, arglist);
|
||
|
|
|
||
|
|
va_end(arglist);
|
||
|
|
|
||
|
|
return result;
|
||
|
|
}
|
||
|
|
|
||
|
|
int FMOD_vsnprintf(char *str, int size, const char *format, va_list arglist)
|
||
|
|
{
|
||
|
|
#ifdef PLATFORM_PS2_IOP
|
||
|
|
int result = vsprintf(str, format, arglist);
|
||
|
|
#else
|
||
|
|
int result = vsnprintf(str, size, format, arglist);
|
||
|
|
#endif
|
||
|
|
|
||
|
|
str[size - 1] = 0;
|
||
|
|
|
||
|
|
return result;
|
||
|
|
}
|