aboutsummaryrefslogtreecommitdiffstats
path: root/LibOVR/Src/Kernel/OVR_Std.h
diff options
context:
space:
mode:
Diffstat (limited to 'LibOVR/Src/Kernel/OVR_Std.h')
-rw-r--r--LibOVR/Src/Kernel/OVR_Std.h1006
1 files changed, 503 insertions, 503 deletions
diff --git a/LibOVR/Src/Kernel/OVR_Std.h b/LibOVR/Src/Kernel/OVR_Std.h
index b20a376..f8d8a3c 100644
--- a/LibOVR/Src/Kernel/OVR_Std.h
+++ b/LibOVR/Src/Kernel/OVR_Std.h
@@ -1,503 +1,503 @@
-/************************************************************************************
-
-PublicHeader: OVR.h
-Filename : OVR_Std.h
-Content : Standard C function interface
-Created : September 19, 2012
-Notes :
-
-Copyright : Copyright 2012 Oculus VR, Inc. All Rights reserved.
-
-Use of this software is subject to the terms of the Oculus license
-agreement provided at the time of installation or download, or which
-otherwise accompanies this software in either electronic or hard copy form.
-
-************************************************************************************/
-
-#ifndef OVR_Std_h
-#define OVR_Std_h
-
-#include "OVR_Types.h"
-#include <stdarg.h> // for va_list args
-#include <string.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <ctype.h>
-
-#if !defined(OVR_OS_WINCE) && defined(OVR_CC_MSVC) && (OVR_CC_MSVC >= 1400)
-#define OVR_MSVC_SAFESTRING
-#include <errno.h>
-#endif
-
-// Wide-char funcs
-#include <wchar.h>
-#include <wctype.h>
-
-namespace OVR {
-
-#if defined(OVR_OS_WIN32)
-inline char* OVR_CDECL OVR_itoa(int val, char *dest, UPInt destsize, int radix)
-{
-#if defined(OVR_MSVC_SAFESTRING)
- _itoa_s(val, dest, destsize, radix);
- return dest;
-#else
- OVR_UNUSED(destsize);
- return itoa(val, dest, radix);
-#endif
-}
-#else // OVR_OS_WIN32
-inline char* OVR_itoa(int val, char* dest, unsigned int len, int radix)
-{
- if (val == 0)
- {
- if (len > 1)
- {
- dest[0] = '0';
- dest[1] = '\0';
- }
- return dest;
- }
-
- int cur = val;
- unsigned int i = 0;
- unsigned int sign = 0;
-
- if (val < 0)
- {
- val = -val;
- sign = 1;
- }
-
- while ((val != 0) && (i < (len - 1 - sign)))
- {
- cur = val % radix;
- val /= radix;
-
- if (radix == 16)
- {
- switch(cur)
- {
- case 10:
- dest[i] = 'a';
- break;
- case 11:
- dest[i] = 'b';
- break;
- case 12:
- dest[i] = 'c';
- break;
- case 13:
- dest[i] = 'd';
- break;
- case 14:
- dest[i] = 'e';
- break;
- case 15:
- dest[i] = 'f';
- break;
- default:
- dest[i] = (char)('0' + cur);
- break;
- }
- }
- else
- {
- dest[i] = (char)('0' + cur);
- }
- ++i;
- }
-
- if (sign)
- {
- dest[i++] = '-';
- }
-
- for (unsigned int j = 0; j < i / 2; ++j)
- {
- char tmp = dest[j];
- dest[j] = dest[i - 1 - j];
- dest[i - 1 - j] = tmp;
- }
- dest[i] = '\0';
-
- return dest;
-}
-
-#endif
-
-
-// String functions
-
-inline UPInt OVR_CDECL OVR_strlen(const char* str)
-{
- return strlen(str);
-}
-
-inline char* OVR_CDECL OVR_strcpy(char* dest, UPInt destsize, const char* src)
-{
-#if defined(OVR_MSVC_SAFESTRING)
- strcpy_s(dest, destsize, src);
- return dest;
-#else
- OVR_UNUSED(destsize);
- return strcpy(dest, src);
-#endif
-}
-
-inline char* OVR_CDECL OVR_strncpy(char* dest, UPInt destsize, const char* src, UPInt count)
-{
-#if defined(OVR_MSVC_SAFESTRING)
- strncpy_s(dest, destsize, src, count);
- return dest;
-#else
- OVR_UNUSED(destsize);
- return strncpy(dest, src, count);
-#endif
-}
-
-inline char * OVR_CDECL OVR_strcat(char* dest, UPInt destsize, const char* src)
-{
-#if defined(OVR_MSVC_SAFESTRING)
- strcat_s(dest, destsize, src);
- return dest;
-#else
- OVR_UNUSED(destsize);
- return strcat(dest, src);
-#endif
-}
-
-inline int OVR_CDECL OVR_strcmp(const char* dest, const char* src)
-{
- return strcmp(dest, src);
-}
-
-inline const char* OVR_CDECL OVR_strchr(const char* str, char c)
-{
- return strchr(str, c);
-}
-
-inline char* OVR_CDECL OVR_strchr(char* str, char c)
-{
- return strchr(str, c);
-}
-
-inline const char* OVR_strrchr(const char* str, char c)
-{
- UPInt len = OVR_strlen(str);
- for (UPInt i=len; i>0; i--)
- if (str[i]==c)
- return str+i;
- return 0;
-}
-
-inline const UByte* OVR_CDECL OVR_memrchr(const UByte* str, UPInt size, UByte c)
-{
- for (SPInt i = (SPInt)size - 1; i >= 0; i--)
- {
- if (str[i] == c)
- return str + i;
- }
- return 0;
-}
-
-inline char* OVR_CDECL OVR_strrchr(char* str, char c)
-{
- UPInt len = OVR_strlen(str);
- for (UPInt i=len; i>0; i--)
- if (str[i]==c)
- return str+i;
- return 0;
-}
-
-
-double OVR_CDECL OVR_strtod(const char* string, char** tailptr);
-
-inline long OVR_CDECL OVR_strtol(const char* string, char** tailptr, int radix)
-{
- return strtol(string, tailptr, radix);
-}
-
-inline long OVR_CDECL OVR_strtoul(const char* string, char** tailptr, int radix)
-{
- return strtoul(string, tailptr, radix);
-}
-
-inline int OVR_CDECL OVR_strncmp(const char* ws1, const char* ws2, UPInt size)
-{
- return strncmp(ws1, ws2, size);
-}
-
-inline UInt64 OVR_CDECL OVR_strtouq(const char *nptr, char **endptr, int base)
-{
-#if defined(OVR_CC_MSVC) && !defined(OVR_OS_WINCE)
- return _strtoui64(nptr, endptr, base);
-#else
- return strtoull(nptr, endptr, base);
-#endif
-}
-
-inline SInt64 OVR_CDECL OVR_strtoq(const char *nptr, char **endptr, int base)
-{
-#if defined(OVR_CC_MSVC) && !defined(OVR_OS_WINCE)
- return _strtoi64(nptr, endptr, base);
-#else
- return strtoll(nptr, endptr, base);
-#endif
-}
-
-
-inline SInt64 OVR_CDECL OVR_atoq(const char* string)
-{
-#if defined(OVR_CC_MSVC) && !defined(OVR_OS_WINCE)
- return _atoi64(string);
-#else
- return atoll(string);
-#endif
-}
-
-inline UInt64 OVR_CDECL OVR_atouq(const char* string)
-{
- return OVR_strtouq(string, NULL, 10);
-}
-
-
-// Implemented in GStd.cpp in platform-specific manner.
-int OVR_CDECL OVR_stricmp(const char* dest, const char* src);
-int OVR_CDECL OVR_strnicmp(const char* dest, const char* src, UPInt count);
-
-inline UPInt OVR_CDECL OVR_sprintf(char *dest, UPInt destsize, const char* format, ...)
-{
- va_list argList;
- va_start(argList,format);
- UPInt ret;
-#if defined(OVR_CC_MSVC)
- #if defined(OVR_MSVC_SAFESTRING)
- ret = _vsnprintf_s(dest, destsize, _TRUNCATE, format, argList);
- OVR_ASSERT(ret != -1);
- #else
- OVR_UNUSED(destsize);
- ret = _vsnprintf(dest, destsize - 1, format, argList); // -1 for space for the null character
- OVR_ASSERT(ret != -1);
- dest[destsize-1] = 0;
- #endif
-#else
- OVR_UNUSED(destsize);
- ret = vsprintf(dest, format, argList);
- OVR_ASSERT(ret < destsize);
-#endif
- va_end(argList);
- return ret;
-}
-
-inline UPInt OVR_CDECL OVR_vsprintf(char *dest, UPInt destsize, const char * format, va_list argList)
-{
- UPInt ret;
-#if defined(OVR_CC_MSVC)
- #if defined(OVR_MSVC_SAFESTRING)
- dest[0] = '\0';
- int rv = vsnprintf_s(dest, destsize, _TRUNCATE, format, argList);
- if (rv == -1)
- {
- dest[destsize - 1] = '\0';
- ret = destsize - 1;
- }
- else
- ret = (UPInt)rv;
- #else
- OVR_UNUSED(destsize);
- int rv = _vsnprintf(dest, destsize - 1, format, argList);
- OVR_ASSERT(rv != -1);
- ret = (UPInt)rv;
- dest[destsize-1] = 0;
- #endif
-#else
- OVR_UNUSED(destsize);
- ret = (UPInt)vsprintf(dest, format, argList);
- OVR_ASSERT(ret < destsize);
-#endif
- return ret;
-}
-
-// Returns the number of characters in the formatted string.
-inline UPInt OVR_CDECL OVR_vscprintf(const char * format, va_list argList)
-{
- UPInt ret;
-#if defined(OVR_CC_MSVC)
- ret = (UPInt) _vscprintf(format, argList);
-#else
- ret = (UPInt) vsnprintf(NULL, 0, format, argList);
-#endif
- return ret;
-}
-
-
-wchar_t* OVR_CDECL OVR_wcscpy(wchar_t* dest, UPInt destsize, const wchar_t* src);
-wchar_t* OVR_CDECL OVR_wcsncpy(wchar_t* dest, UPInt destsize, const wchar_t* src, UPInt count);
-wchar_t* OVR_CDECL OVR_wcscat(wchar_t* dest, UPInt destsize, const wchar_t* src);
-UPInt OVR_CDECL OVR_wcslen(const wchar_t* str);
-int OVR_CDECL OVR_wcscmp(const wchar_t* a, const wchar_t* b);
-int OVR_CDECL OVR_wcsicmp(const wchar_t* a, const wchar_t* b);
-
-inline int OVR_CDECL OVR_wcsicoll(const wchar_t* a, const wchar_t* b)
-{
-#if defined(OVR_OS_WIN32)
-#if defined(OVR_CC_MSVC) && (OVR_CC_MSVC >= 1400)
- return ::_wcsicoll(a, b);
-#else
- return ::wcsicoll(a, b);
-#endif
-#else
- // not supported, use regular wcsicmp
- return OVR_wcsicmp(a, b);
-#endif
-}
-
-inline int OVR_CDECL OVR_wcscoll(const wchar_t* a, const wchar_t* b)
-{
-#if defined(OVR_OS_WIN32) || defined(OVR_OS_LINUX)
- return wcscoll(a, b);
-#else
- // not supported, use regular wcscmp
- return OVR_wcscmp(a, b);
-#endif
-}
-
-#ifndef OVR_NO_WCTYPE
-
-inline int OVR_CDECL UnicodeCharIs(const UInt16* table, wchar_t charCode)
-{
- unsigned offset = table[charCode >> 8];
- if (offset == 0) return 0;
- if (offset == 1) return 1;
- return (table[offset + ((charCode >> 4) & 15)] & (1 << (charCode & 15))) != 0;
-}
-
-extern const UInt16 UnicodeAlnumBits[];
-extern const UInt16 UnicodeAlphaBits[];
-extern const UInt16 UnicodeDigitBits[];
-extern const UInt16 UnicodeSpaceBits[];
-extern const UInt16 UnicodeXDigitBits[];
-
-// Uncomment if necessary
-//extern const UInt16 UnicodeCntrlBits[];
-//extern const UInt16 UnicodeGraphBits[];
-//extern const UInt16 UnicodeLowerBits[];
-//extern const UInt16 UnicodePrintBits[];
-//extern const UInt16 UnicodePunctBits[];
-//extern const UInt16 UnicodeUpperBits[];
-
-inline int OVR_CDECL OVR_iswalnum (wchar_t charCode) { return UnicodeCharIs(UnicodeAlnumBits, charCode); }
-inline int OVR_CDECL OVR_iswalpha (wchar_t charCode) { return UnicodeCharIs(UnicodeAlphaBits, charCode); }
-inline int OVR_CDECL OVR_iswdigit (wchar_t charCode) { return UnicodeCharIs(UnicodeDigitBits, charCode); }
-inline int OVR_CDECL OVR_iswspace (wchar_t charCode) { return UnicodeCharIs(UnicodeSpaceBits, charCode); }
-inline int OVR_CDECL OVR_iswxdigit(wchar_t charCode) { return UnicodeCharIs(UnicodeXDigitBits, charCode); }
-
-// Uncomment if necessary
-//inline int OVR_CDECL OVR_iswcntrl (wchar_t charCode) { return UnicodeCharIs(UnicodeCntrlBits, charCode); }
-//inline int OVR_CDECL OVR_iswgraph (wchar_t charCode) { return UnicodeCharIs(UnicodeGraphBits, charCode); }
-//inline int OVR_CDECL OVR_iswlower (wchar_t charCode) { return UnicodeCharIs(UnicodeLowerBits, charCode); }
-//inline int OVR_CDECL OVR_iswprint (wchar_t charCode) { return UnicodeCharIs(UnicodePrintBits, charCode); }
-//inline int OVR_CDECL OVR_iswpunct (wchar_t charCode) { return UnicodeCharIs(UnicodePunctBits, charCode); }
-//inline int OVR_CDECL OVR_iswupper (wchar_t charCode) { return UnicodeCharIs(UnicodeUpperBits, charCode); }
-
-int OVR_CDECL OVR_towupper(wchar_t charCode);
-int OVR_CDECL OVR_towlower(wchar_t charCode);
-
-#else // OVR_NO_WCTYPE
-
-inline int OVR_CDECL OVR_iswspace(wchar_t c)
-{
- return iswspace(c);
-}
-
-inline int OVR_CDECL OVR_iswdigit(wchar_t c)
-{
- return iswdigit(c);
-}
-
-inline int OVR_CDECL OVR_iswxdigit(wchar_t c)
-{
- return iswxdigit(c);
-}
-
-inline int OVR_CDECL OVR_iswalpha(wchar_t c)
-{
- return iswalpha(c);
-}
-
-inline int OVR_CDECL OVR_iswalnum(wchar_t c)
-{
- return iswalnum(c);
-}
-
-inline wchar_t OVR_CDECL OVR_towlower(wchar_t c)
-{
- return (wchar_t)towlower(c);
-}
-
-inline wchar_t OVR_towupper(wchar_t c)
-{
- return (wchar_t)towupper(c);
-}
-
-#endif // OVR_NO_WCTYPE
-
-// ASCII versions of tolower and toupper. Don't use "char"
-inline int OVR_CDECL OVR_tolower(int c)
-{
- return (c >= 'A' && c <= 'Z') ? c - 'A' + 'a' : c;
-}
-
-inline int OVR_CDECL OVR_toupper(int c)
-{
- return (c >= 'a' && c <= 'z') ? c - 'a' + 'A' : c;
-}
-
-
-
-inline double OVR_CDECL OVR_wcstod(const wchar_t* string, wchar_t** tailptr)
-{
-#if defined(OVR_OS_OTHER)
- OVR_UNUSED(tailptr);
- char buffer[64];
- char* tp = NULL;
- UPInt max = OVR_wcslen(string);
- if (max > 63) max = 63;
- unsigned char c = 0;
- for (UPInt i=0; i < max; i++)
- {
- c = (unsigned char)string[i];
- buffer[i] = ((c) < 128 ? (char)c : '!');
- }
- buffer[max] = 0;
- return OVR_strtod(buffer, &tp);
-#else
- return wcstod(string, tailptr);
-#endif
-}
-
-inline long OVR_CDECL OVR_wcstol(const wchar_t* string, wchar_t** tailptr, int radix)
-{
-#if defined(OVR_OS_OTHER)
- OVR_UNUSED(tailptr);
- char buffer[64];
- char* tp = NULL;
- UPInt max = OVR_wcslen(string);
- if (max > 63) max = 63;
- unsigned char c = 0;
- for (UPInt i=0; i < max; i++)
- {
- c = (unsigned char)string[i];
- buffer[i] = ((c) < 128 ? (char)c : '!');
- }
- buffer[max] = 0;
- return strtol(buffer, &tp, radix);
-#else
- return wcstol(string, tailptr, radix);
-#endif
-}
-
-} // OVR
-
-#endif // OVR_Std_h
+/************************************************************************************
+
+PublicHeader: OVR.h
+Filename : OVR_Std.h
+Content : Standard C function interface
+Created : September 19, 2012
+Notes :
+
+Copyright : Copyright 2012 Oculus VR, Inc. All Rights reserved.
+
+Use of this software is subject to the terms of the Oculus license
+agreement provided at the time of installation or download, or which
+otherwise accompanies this software in either electronic or hard copy form.
+
+************************************************************************************/
+
+#ifndef OVR_Std_h
+#define OVR_Std_h
+
+#include "OVR_Types.h"
+#include <stdarg.h> // for va_list args
+#include <string.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <ctype.h>
+
+#if !defined(OVR_OS_WINCE) && defined(OVR_CC_MSVC) && (OVR_CC_MSVC >= 1400)
+#define OVR_MSVC_SAFESTRING
+#include <errno.h>
+#endif
+
+// Wide-char funcs
+#include <wchar.h>
+#include <wctype.h>
+
+namespace OVR {
+
+#if defined(OVR_OS_WIN32)
+inline char* OVR_CDECL OVR_itoa(int val, char *dest, UPInt destsize, int radix)
+{
+#if defined(OVR_MSVC_SAFESTRING)
+ _itoa_s(val, dest, destsize, radix);
+ return dest;
+#else
+ OVR_UNUSED(destsize);
+ return itoa(val, dest, radix);
+#endif
+}
+#else // OVR_OS_WIN32
+inline char* OVR_itoa(int val, char* dest, unsigned int len, int radix)
+{
+ if (val == 0)
+ {
+ if (len > 1)
+ {
+ dest[0] = '0';
+ dest[1] = '\0';
+ }
+ return dest;
+ }
+
+ int cur = val;
+ unsigned int i = 0;
+ unsigned int sign = 0;
+
+ if (val < 0)
+ {
+ val = -val;
+ sign = 1;
+ }
+
+ while ((val != 0) && (i < (len - 1 - sign)))
+ {
+ cur = val % radix;
+ val /= radix;
+
+ if (radix == 16)
+ {
+ switch(cur)
+ {
+ case 10:
+ dest[i] = 'a';
+ break;
+ case 11:
+ dest[i] = 'b';
+ break;
+ case 12:
+ dest[i] = 'c';
+ break;
+ case 13:
+ dest[i] = 'd';
+ break;
+ case 14:
+ dest[i] = 'e';
+ break;
+ case 15:
+ dest[i] = 'f';
+ break;
+ default:
+ dest[i] = (char)('0' + cur);
+ break;
+ }
+ }
+ else
+ {
+ dest[i] = (char)('0' + cur);
+ }
+ ++i;
+ }
+
+ if (sign)
+ {
+ dest[i++] = '-';
+ }
+
+ for (unsigned int j = 0; j < i / 2; ++j)
+ {
+ char tmp = dest[j];
+ dest[j] = dest[i - 1 - j];
+ dest[i - 1 - j] = tmp;
+ }
+ dest[i] = '\0';
+
+ return dest;
+}
+
+#endif
+
+
+// String functions
+
+inline UPInt OVR_CDECL OVR_strlen(const char* str)
+{
+ return strlen(str);
+}
+
+inline char* OVR_CDECL OVR_strcpy(char* dest, UPInt destsize, const char* src)
+{
+#if defined(OVR_MSVC_SAFESTRING)
+ strcpy_s(dest, destsize, src);
+ return dest;
+#else
+ OVR_UNUSED(destsize);
+ return strcpy(dest, src);
+#endif
+}
+
+inline char* OVR_CDECL OVR_strncpy(char* dest, UPInt destsize, const char* src, UPInt count)
+{
+#if defined(OVR_MSVC_SAFESTRING)
+ strncpy_s(dest, destsize, src, count);
+ return dest;
+#else
+ OVR_UNUSED(destsize);
+ return strncpy(dest, src, count);
+#endif
+}
+
+inline char * OVR_CDECL OVR_strcat(char* dest, UPInt destsize, const char* src)
+{
+#if defined(OVR_MSVC_SAFESTRING)
+ strcat_s(dest, destsize, src);
+ return dest;
+#else
+ OVR_UNUSED(destsize);
+ return strcat(dest, src);
+#endif
+}
+
+inline int OVR_CDECL OVR_strcmp(const char* dest, const char* src)
+{
+ return strcmp(dest, src);
+}
+
+inline const char* OVR_CDECL OVR_strchr(const char* str, char c)
+{
+ return strchr(str, c);
+}
+
+inline char* OVR_CDECL OVR_strchr(char* str, char c)
+{
+ return strchr(str, c);
+}
+
+inline const char* OVR_strrchr(const char* str, char c)
+{
+ UPInt len = OVR_strlen(str);
+ for (UPInt i=len; i>0; i--)
+ if (str[i]==c)
+ return str+i;
+ return 0;
+}
+
+inline const UByte* OVR_CDECL OVR_memrchr(const UByte* str, UPInt size, UByte c)
+{
+ for (SPInt i = (SPInt)size - 1; i >= 0; i--)
+ {
+ if (str[i] == c)
+ return str + i;
+ }
+ return 0;
+}
+
+inline char* OVR_CDECL OVR_strrchr(char* str, char c)
+{
+ UPInt len = OVR_strlen(str);
+ for (UPInt i=len; i>0; i--)
+ if (str[i]==c)
+ return str+i;
+ return 0;
+}
+
+
+double OVR_CDECL OVR_strtod(const char* string, char** tailptr);
+
+inline long OVR_CDECL OVR_strtol(const char* string, char** tailptr, int radix)
+{
+ return strtol(string, tailptr, radix);
+}
+
+inline long OVR_CDECL OVR_strtoul(const char* string, char** tailptr, int radix)
+{
+ return strtoul(string, tailptr, radix);
+}
+
+inline int OVR_CDECL OVR_strncmp(const char* ws1, const char* ws2, UPInt size)
+{
+ return strncmp(ws1, ws2, size);
+}
+
+inline UInt64 OVR_CDECL OVR_strtouq(const char *nptr, char **endptr, int base)
+{
+#if defined(OVR_CC_MSVC) && !defined(OVR_OS_WINCE)
+ return _strtoui64(nptr, endptr, base);
+#else
+ return strtoull(nptr, endptr, base);
+#endif
+}
+
+inline SInt64 OVR_CDECL OVR_strtoq(const char *nptr, char **endptr, int base)
+{
+#if defined(OVR_CC_MSVC) && !defined(OVR_OS_WINCE)
+ return _strtoi64(nptr, endptr, base);
+#else
+ return strtoll(nptr, endptr, base);
+#endif
+}
+
+
+inline SInt64 OVR_CDECL OVR_atoq(const char* string)
+{
+#if defined(OVR_CC_MSVC) && !defined(OVR_OS_WINCE)
+ return _atoi64(string);
+#else
+ return atoll(string);
+#endif
+}
+
+inline UInt64 OVR_CDECL OVR_atouq(const char* string)
+{
+ return OVR_strtouq(string, NULL, 10);
+}
+
+
+// Implemented in GStd.cpp in platform-specific manner.
+int OVR_CDECL OVR_stricmp(const char* dest, const char* src);
+int OVR_CDECL OVR_strnicmp(const char* dest, const char* src, UPInt count);
+
+inline UPInt OVR_CDECL OVR_sprintf(char *dest, UPInt destsize, const char* format, ...)
+{
+ va_list argList;
+ va_start(argList,format);
+ UPInt ret;
+#if defined(OVR_CC_MSVC)
+ #if defined(OVR_MSVC_SAFESTRING)
+ ret = _vsnprintf_s(dest, destsize, _TRUNCATE, format, argList);
+ OVR_ASSERT(ret != -1);
+ #else
+ OVR_UNUSED(destsize);
+ ret = _vsnprintf(dest, destsize - 1, format, argList); // -1 for space for the null character
+ OVR_ASSERT(ret != -1);
+ dest[destsize-1] = 0;
+ #endif
+#else
+ OVR_UNUSED(destsize);
+ ret = vsprintf(dest, format, argList);
+ OVR_ASSERT(ret < destsize);
+#endif
+ va_end(argList);
+ return ret;
+}
+
+inline UPInt OVR_CDECL OVR_vsprintf(char *dest, UPInt destsize, const char * format, va_list argList)
+{
+ UPInt ret;
+#if defined(OVR_CC_MSVC)
+ #if defined(OVR_MSVC_SAFESTRING)
+ dest[0] = '\0';
+ int rv = vsnprintf_s(dest, destsize, _TRUNCATE, format, argList);
+ if (rv == -1)
+ {
+ dest[destsize - 1] = '\0';
+ ret = destsize - 1;
+ }
+ else
+ ret = (UPInt)rv;
+ #else
+ OVR_UNUSED(destsize);
+ int rv = _vsnprintf(dest, destsize - 1, format, argList);
+ OVR_ASSERT(rv != -1);
+ ret = (UPInt)rv;
+ dest[destsize-1] = 0;
+ #endif
+#else
+ OVR_UNUSED(destsize);
+ ret = (UPInt)vsprintf(dest, format, argList);
+ OVR_ASSERT(ret < destsize);
+#endif
+ return ret;
+}
+
+// Returns the number of characters in the formatted string.
+inline UPInt OVR_CDECL OVR_vscprintf(const char * format, va_list argList)
+{
+ UPInt ret;
+#if defined(OVR_CC_MSVC)
+ ret = (UPInt) _vscprintf(format, argList);
+#else
+ ret = (UPInt) vsnprintf(NULL, 0, format, argList);
+#endif
+ return ret;
+}
+
+
+wchar_t* OVR_CDECL OVR_wcscpy(wchar_t* dest, UPInt destsize, const wchar_t* src);
+wchar_t* OVR_CDECL OVR_wcsncpy(wchar_t* dest, UPInt destsize, const wchar_t* src, UPInt count);
+wchar_t* OVR_CDECL OVR_wcscat(wchar_t* dest, UPInt destsize, const wchar_t* src);
+UPInt OVR_CDECL OVR_wcslen(const wchar_t* str);
+int OVR_CDECL OVR_wcscmp(const wchar_t* a, const wchar_t* b);
+int OVR_CDECL OVR_wcsicmp(const wchar_t* a, const wchar_t* b);
+
+inline int OVR_CDECL OVR_wcsicoll(const wchar_t* a, const wchar_t* b)
+{
+#if defined(OVR_OS_WIN32)
+#if defined(OVR_CC_MSVC) && (OVR_CC_MSVC >= 1400)
+ return ::_wcsicoll(a, b);
+#else
+ return ::wcsicoll(a, b);
+#endif
+#else
+ // not supported, use regular wcsicmp
+ return OVR_wcsicmp(a, b);
+#endif
+}
+
+inline int OVR_CDECL OVR_wcscoll(const wchar_t* a, const wchar_t* b)
+{
+#if defined(OVR_OS_WIN32) || defined(OVR_OS_LINUX)
+ return wcscoll(a, b);
+#else
+ // not supported, use regular wcscmp
+ return OVR_wcscmp(a, b);
+#endif
+}
+
+#ifndef OVR_NO_WCTYPE
+
+inline int OVR_CDECL UnicodeCharIs(const UInt16* table, wchar_t charCode)
+{
+ unsigned offset = table[charCode >> 8];
+ if (offset == 0) return 0;
+ if (offset == 1) return 1;
+ return (table[offset + ((charCode >> 4) & 15)] & (1 << (charCode & 15))) != 0;
+}
+
+extern const UInt16 UnicodeAlnumBits[];
+extern const UInt16 UnicodeAlphaBits[];
+extern const UInt16 UnicodeDigitBits[];
+extern const UInt16 UnicodeSpaceBits[];
+extern const UInt16 UnicodeXDigitBits[];
+
+// Uncomment if necessary
+//extern const UInt16 UnicodeCntrlBits[];
+//extern const UInt16 UnicodeGraphBits[];
+//extern const UInt16 UnicodeLowerBits[];
+//extern const UInt16 UnicodePrintBits[];
+//extern const UInt16 UnicodePunctBits[];
+//extern const UInt16 UnicodeUpperBits[];
+
+inline int OVR_CDECL OVR_iswalnum (wchar_t charCode) { return UnicodeCharIs(UnicodeAlnumBits, charCode); }
+inline int OVR_CDECL OVR_iswalpha (wchar_t charCode) { return UnicodeCharIs(UnicodeAlphaBits, charCode); }
+inline int OVR_CDECL OVR_iswdigit (wchar_t charCode) { return UnicodeCharIs(UnicodeDigitBits, charCode); }
+inline int OVR_CDECL OVR_iswspace (wchar_t charCode) { return UnicodeCharIs(UnicodeSpaceBits, charCode); }
+inline int OVR_CDECL OVR_iswxdigit(wchar_t charCode) { return UnicodeCharIs(UnicodeXDigitBits, charCode); }
+
+// Uncomment if necessary
+//inline int OVR_CDECL OVR_iswcntrl (wchar_t charCode) { return UnicodeCharIs(UnicodeCntrlBits, charCode); }
+//inline int OVR_CDECL OVR_iswgraph (wchar_t charCode) { return UnicodeCharIs(UnicodeGraphBits, charCode); }
+//inline int OVR_CDECL OVR_iswlower (wchar_t charCode) { return UnicodeCharIs(UnicodeLowerBits, charCode); }
+//inline int OVR_CDECL OVR_iswprint (wchar_t charCode) { return UnicodeCharIs(UnicodePrintBits, charCode); }
+//inline int OVR_CDECL OVR_iswpunct (wchar_t charCode) { return UnicodeCharIs(UnicodePunctBits, charCode); }
+//inline int OVR_CDECL OVR_iswupper (wchar_t charCode) { return UnicodeCharIs(UnicodeUpperBits, charCode); }
+
+int OVR_CDECL OVR_towupper(wchar_t charCode);
+int OVR_CDECL OVR_towlower(wchar_t charCode);
+
+#else // OVR_NO_WCTYPE
+
+inline int OVR_CDECL OVR_iswspace(wchar_t c)
+{
+ return iswspace(c);
+}
+
+inline int OVR_CDECL OVR_iswdigit(wchar_t c)
+{
+ return iswdigit(c);
+}
+
+inline int OVR_CDECL OVR_iswxdigit(wchar_t c)
+{
+ return iswxdigit(c);
+}
+
+inline int OVR_CDECL OVR_iswalpha(wchar_t c)
+{
+ return iswalpha(c);
+}
+
+inline int OVR_CDECL OVR_iswalnum(wchar_t c)
+{
+ return iswalnum(c);
+}
+
+inline wchar_t OVR_CDECL OVR_towlower(wchar_t c)
+{
+ return (wchar_t)towlower(c);
+}
+
+inline wchar_t OVR_towupper(wchar_t c)
+{
+ return (wchar_t)towupper(c);
+}
+
+#endif // OVR_NO_WCTYPE
+
+// ASCII versions of tolower and toupper. Don't use "char"
+inline int OVR_CDECL OVR_tolower(int c)
+{
+ return (c >= 'A' && c <= 'Z') ? c - 'A' + 'a' : c;
+}
+
+inline int OVR_CDECL OVR_toupper(int c)
+{
+ return (c >= 'a' && c <= 'z') ? c - 'a' + 'A' : c;
+}
+
+
+
+inline double OVR_CDECL OVR_wcstod(const wchar_t* string, wchar_t** tailptr)
+{
+#if defined(OVR_OS_OTHER)
+ OVR_UNUSED(tailptr);
+ char buffer[64];
+ char* tp = NULL;
+ UPInt max = OVR_wcslen(string);
+ if (max > 63) max = 63;
+ unsigned char c = 0;
+ for (UPInt i=0; i < max; i++)
+ {
+ c = (unsigned char)string[i];
+ buffer[i] = ((c) < 128 ? (char)c : '!');
+ }
+ buffer[max] = 0;
+ return OVR_strtod(buffer, &tp);
+#else
+ return wcstod(string, tailptr);
+#endif
+}
+
+inline long OVR_CDECL OVR_wcstol(const wchar_t* string, wchar_t** tailptr, int radix)
+{
+#if defined(OVR_OS_OTHER)
+ OVR_UNUSED(tailptr);
+ char buffer[64];
+ char* tp = NULL;
+ UPInt max = OVR_wcslen(string);
+ if (max > 63) max = 63;
+ unsigned char c = 0;
+ for (UPInt i=0; i < max; i++)
+ {
+ c = (unsigned char)string[i];
+ buffer[i] = ((c) < 128 ? (char)c : '!');
+ }
+ buffer[max] = 0;
+ return strtol(buffer, &tp, radix);
+#else
+ return wcstol(string, tailptr, radix);
+#endif
+}
+
+} // OVR
+
+#endif // OVR_Std_h