mirror of
https://github.com/libsdl-org/SDL.git
synced 2025-09-19 09:48:14 +00:00
Added SDL_wcstol()
This commit is contained in:
@@ -28,7 +28,7 @@
|
||||
#include <psp2/kernel/clib.h>
|
||||
#endif
|
||||
|
||||
#if !defined(HAVE_VSSCANF) || !defined(HAVE_STRTOL) || !defined(HAVE_STRTOUL) || !defined(HAVE_STRTOD) || !defined(HAVE_STRTOLL) || !defined(HAVE_STRTOULL)
|
||||
#if !defined(HAVE_VSSCANF) || !defined(HAVE_STRTOL) || !defined(HAVE_WCSTOL) || !defined(HAVE_STRTOUL) || !defined(HAVE_STRTOD) || !defined(HAVE_STRTOLL) || !defined(HAVE_STRTOULL)
|
||||
#define SDL_isupperhex(X) (((X) >= 'A') && ((X) <= 'F'))
|
||||
#define SDL_islowerhex(X) (((X) >= 'a') && ((X) <= 'f'))
|
||||
#endif
|
||||
@@ -93,6 +93,50 @@ static size_t SDL_ScanLong(const char *text, int count, int radix, long *valuep)
|
||||
}
|
||||
#endif
|
||||
|
||||
#if !defined(HAVE_WCSTOL)
|
||||
static size_t SDL_ScanLongW(const wchar_t *text, int count, int radix, long *valuep)
|
||||
{
|
||||
const wchar_t *textstart = text;
|
||||
long value = 0;
|
||||
SDL_bool negative = SDL_FALSE;
|
||||
|
||||
if (*text == '-') {
|
||||
negative = SDL_TRUE;
|
||||
++text;
|
||||
}
|
||||
if (radix == 16 && SDL_wcsncmp(text, L"0x", 2) == 0) {
|
||||
text += 2;
|
||||
}
|
||||
for (;;) {
|
||||
int v;
|
||||
if (*text >= '0' && *text <= '9') {
|
||||
v = *text - '0';
|
||||
} else if (radix == 16 && SDL_isupperhex(*text)) {
|
||||
v = 10 + (*text - 'A');
|
||||
} else if (radix == 16 && SDL_islowerhex(*text)) {
|
||||
v = 10 + (*text - 'a');
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
value *= radix;
|
||||
value += v;
|
||||
++text;
|
||||
|
||||
if (count > 0 && (text - textstart) == count) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (valuep && text > textstart) {
|
||||
if (negative && value) {
|
||||
*valuep = -value;
|
||||
} else {
|
||||
*valuep = value;
|
||||
}
|
||||
}
|
||||
return text - textstart;
|
||||
}
|
||||
#endif
|
||||
|
||||
#if !defined(HAVE_VSSCANF) || !defined(HAVE_STRTOUL) || !defined(HAVE_STRTOD)
|
||||
static size_t SDL_ScanUnsignedLong(const char *text, int count, int radix, unsigned long *valuep)
|
||||
{
|
||||
@@ -530,6 +574,30 @@ int SDL_wcsncasecmp(const wchar_t *str1, const wchar_t *str2, size_t maxlen)
|
||||
#endif /* HAVE__WCSNICMP */
|
||||
}
|
||||
|
||||
long SDL_wcstol(const wchar_t *string, wchar_t **endp, int base)
|
||||
{
|
||||
#ifdef HAVE_WCSTOL
|
||||
return wcstol(string, endp, base);
|
||||
#else
|
||||
size_t len;
|
||||
long value = 0;
|
||||
|
||||
if (!base) {
|
||||
if ((SDL_wcslen(string) > 2) && (SDL_wcsncmp(string, L"0x", 2) == 0)) {
|
||||
base = 16;
|
||||
} else {
|
||||
base = 10;
|
||||
}
|
||||
}
|
||||
|
||||
len = SDL_ScanLongW(string, 0, base, &value);
|
||||
if (endp) {
|
||||
*endp = (wchar_t *)string + len;
|
||||
}
|
||||
return value;
|
||||
#endif /* HAVE_WCSTOL */
|
||||
}
|
||||
|
||||
size_t SDL_strlcpy(SDL_OUT_Z_CAP(maxlen) char *dst, const char *src, size_t maxlen)
|
||||
{
|
||||
#ifdef HAVE_STRLCPY
|
||||
|
Reference in New Issue
Block a user