mirror of
https://github.com/boykopovar/AnyPS5.git
synced 2026-10-31 12:35:51 +00:00
Replace the five Unknown stubs whose NIDs hash these ICU names with the uchar.cpp definitions of ICU 78.1 (049e0d6a), over the Zs, Zl, Zp and White_Space code points that ICU 65.1 to 78.1 ship. Values outside U+0000..U+10FFFF return 0, as ICU's trie error value gives. Co-Authored-By: Claude Opus 5.5 <[email protected]>
68 lines
2.1 KiB
C++
68 lines
2.1 KiB
C++
#include "prx/libSceIcu/libSceIcu.hpp"
|
|
#include <algorithm>
|
|
#include <array>
|
|
#include <cstdint>
|
|
#include <span>
|
|
|
|
namespace {
|
|
|
|
struct Range {
|
|
std::int32_t first;
|
|
std::int32_t last;
|
|
};
|
|
|
|
constexpr std::array<Range, 7> SpaceSeparators{{
|
|
{0x20, 0x20}, {0xa0, 0xa0}, {0x1680, 0x1680}, {0x2000, 0x200a}, {0x202f, 0x202f}, {0x205f, 0x205f}, {0x3000, 0x3000}}};
|
|
constexpr std::array<Range, 10> WhiteSpace{{
|
|
{0x09, 0x0d}, {0x20, 0x20}, {0x85, 0x85}, {0xa0, 0xa0}, {0x1680, 0x1680},
|
|
{0x2000, 0x200a}, {0x2028, 0x2029}, {0x202f, 0x202f}, {0x205f, 0x205f}, {0x3000, 0x3000}}};
|
|
|
|
bool Contains(std::span<const Range> ranges, std::int32_t character) {
|
|
return std::any_of(ranges.begin(), ranges.end(), [character](const Range& range) {
|
|
return character >= range.first && character <= range.last;
|
|
});
|
|
}
|
|
|
|
bool IsSpaceSeparator(std::int32_t character) {
|
|
return Contains(SpaceSeparators, character);
|
|
}
|
|
|
|
bool IsSeparator(std::int32_t character) {
|
|
return IsSpaceSeparator(character) || character == 0x2028 || character == 0x2029;
|
|
}
|
|
|
|
bool IsAsciiControlSpace(std::int32_t character) {
|
|
return (character >= 0x09 && character <= 0x0d) || (character >= 0x1c && character <= 0x1f);
|
|
}
|
|
|
|
bool IsNoBreakSpace(std::int32_t character) {
|
|
return character == 0xa0 || character == 0x2007 || character == 0x202f;
|
|
}
|
|
|
|
}
|
|
|
|
extern "C" {
|
|
|
|
std::int8_t APS5_VABI u_isspace_nid_postfix(std::int32_t character) {
|
|
return IsSeparator(character) || IsAsciiControlSpace(character) || character == 0x85;
|
|
}
|
|
|
|
std::int8_t APS5_VABI u_isblank_nid_postfix(std::int32_t character) {
|
|
if (static_cast<std::uint32_t>(character) <= 0x9f) return character == 0x09 || character == 0x20;
|
|
return IsSpaceSeparator(character);
|
|
}
|
|
|
|
std::int8_t APS5_VABI u_isWhitespace_nid_postfix(std::int32_t character) {
|
|
return (IsSeparator(character) && !IsNoBreakSpace(character)) || IsAsciiControlSpace(character);
|
|
}
|
|
|
|
std::int8_t APS5_VABI u_isJavaSpaceChar_nid_postfix(std::int32_t character) {
|
|
return IsSeparator(character);
|
|
}
|
|
|
|
std::int8_t APS5_VABI u_isUWhiteSpace_nid_postfix(std::int32_t character) {
|
|
return Contains(WhiteSpace, character);
|
|
}
|
|
|
|
}
|