mirror of
https://github.com/OpenRCT2/OpenRCT2
synced 2025-12-26 01:03:03 +01:00
179 lines
4.1 KiB
C++
179 lines
4.1 KiB
C++
extern "C"
|
|
{
|
|
#include "../localisation/localisation.h"
|
|
#include "../util/util.h"
|
|
}
|
|
|
|
#include "Math.hpp"
|
|
#include "Memory.hpp"
|
|
#include "String.hpp"
|
|
|
|
namespace String
|
|
{
|
|
bool Equals(const utf8 * a, const utf8 * b, bool ignoreCase)
|
|
{
|
|
if (a == b) return true;
|
|
if (a == nullptr || b == nullptr) return false;
|
|
|
|
if (ignoreCase)
|
|
{
|
|
return _stricmp(a, b) == 0;
|
|
}
|
|
else
|
|
{
|
|
return strcmp(a, b) == 0;
|
|
}
|
|
}
|
|
|
|
bool StartsWith(const utf8 * str, const utf8 * match, bool ignoreCase)
|
|
{
|
|
if (ignoreCase)
|
|
{
|
|
while (*str != '\0' && *match != '\0')
|
|
{
|
|
if (tolower(*str++) != tolower(*match++))
|
|
{
|
|
return false;
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
else
|
|
{
|
|
while (*str != '\0' && *match != '\0')
|
|
{
|
|
if (*str++ != *match++)
|
|
{
|
|
return false;
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
}
|
|
|
|
size_t LengthOf(const utf8 * str)
|
|
{
|
|
return utf8_length(str);
|
|
}
|
|
|
|
size_t SizeOf(const utf8 * str)
|
|
{
|
|
return strlen(str);
|
|
}
|
|
|
|
utf8 * Set(utf8 * buffer, size_t bufferSize, const utf8 * src)
|
|
{
|
|
return safe_strcpy(buffer, src, bufferSize);
|
|
}
|
|
|
|
utf8 * Set(utf8 * buffer, size_t bufferSize, const utf8 * src, size_t srcSize)
|
|
{
|
|
utf8 * dst = buffer;
|
|
size_t minSize = Math::Min(bufferSize - 1, srcSize);
|
|
for (size_t i = 0; i < minSize; i++)
|
|
{
|
|
*dst++ = *src;
|
|
if (*src == '\0') break;
|
|
src++;
|
|
}
|
|
*dst = '\0';
|
|
return buffer;
|
|
}
|
|
|
|
utf8 * Append(utf8 * buffer, size_t bufferSize, const utf8 * src)
|
|
{
|
|
return safe_strcat(buffer, src, bufferSize);
|
|
}
|
|
|
|
utf8 * Format(utf8 * buffer, size_t bufferSize, const utf8 * format, ...)
|
|
{
|
|
va_list args;
|
|
|
|
va_start(args, format);
|
|
vsnprintf(buffer, bufferSize, format, args);
|
|
va_end(args);
|
|
|
|
// Terminate buffer in case formatted string overflowed
|
|
buffer[bufferSize - 1] = '\0';
|
|
|
|
return buffer;
|
|
}
|
|
|
|
utf8 * AppendFormat(utf8 * buffer, size_t bufferSize, const utf8 * format, ...)
|
|
{
|
|
va_list args;
|
|
|
|
utf8 * dst = buffer;
|
|
size_t i;
|
|
for (i = 0; i < bufferSize; i++)
|
|
{
|
|
if (*dst == '\0') break;
|
|
dst++;
|
|
}
|
|
|
|
if (i < bufferSize - 1)
|
|
{
|
|
va_start(args, format);
|
|
vsnprintf(buffer, bufferSize - i - 1, format, args);
|
|
va_end(args);
|
|
|
|
// Terminate buffer in case formatted string overflowed
|
|
buffer[bufferSize - 1] = '\0';
|
|
}
|
|
|
|
return buffer;
|
|
}
|
|
|
|
utf8 * Duplicate(const utf8 * src)
|
|
{
|
|
size_t srcSize = SizeOf(src);
|
|
return Memory::DuplicateArray(src, srcSize + 1);
|
|
}
|
|
|
|
utf8 * DiscardUse(utf8 * * ptr, utf8 * replacement)
|
|
{
|
|
Memory::Free(*ptr);
|
|
*ptr = replacement;
|
|
return replacement;
|
|
}
|
|
|
|
utf8 * DiscardDuplicate(utf8 * * ptr, utf8 * replacement)
|
|
{
|
|
return DiscardUse(ptr, String::Duplicate(replacement));
|
|
}
|
|
|
|
utf8 * SkipBOM(utf8 * buffer)
|
|
{
|
|
return (utf8*)SkipBOM(buffer);
|
|
}
|
|
|
|
const utf8 * SkipBOM(const utf8 * buffer)
|
|
{
|
|
if ((unsigned char)buffer[0] == 0xEF && (unsigned char)buffer[1] == 0xBB && (unsigned char)buffer[2] == 0xBF)
|
|
{
|
|
return buffer + 3;
|
|
}
|
|
return buffer;
|
|
}
|
|
|
|
size_t GetCodepointLength(codepoint_t codepoint)
|
|
{
|
|
return utf8_get_codepoint_length(codepoint);
|
|
}
|
|
|
|
codepoint_t GetNextCodepoint(utf8 * ptr, utf8 * * nextPtr)
|
|
{
|
|
return GetNextCodepoint((const utf8 *)ptr, (const utf8 * *)nextPtr);
|
|
}
|
|
|
|
codepoint_t GetNextCodepoint(const utf8 * ptr, const utf8 * * nextPtr)
|
|
{
|
|
return utf8_get_next(ptr, nextPtr);
|
|
}
|
|
|
|
utf8 * WriteCodepoint(utf8 * dst, codepoint_t codepoint)
|
|
{
|
|
return utf8_write_codepoint(dst, codepoint);
|
|
}
|
|
}
|