You've already forked godot
mirror of
https://github.com/godotengine/godot.git
synced 2025-11-17 14:11:06 +00:00
[Complex Test Layouts] Change String to use UTF-32 encoding on all platforms.
This commit is contained in:
@@ -156,26 +156,13 @@ void RegExMatch::_bind_methods() {
|
||||
}
|
||||
|
||||
void RegEx::_pattern_info(uint32_t what, void *where) const {
|
||||
if (sizeof(CharType) == 2) {
|
||||
pcre2_pattern_info_16((pcre2_code_16 *)code, what, where);
|
||||
|
||||
} else {
|
||||
pcre2_pattern_info_32((pcre2_code_32 *)code, what, where);
|
||||
}
|
||||
pcre2_pattern_info_32((pcre2_code_32 *)code, what, where);
|
||||
}
|
||||
|
||||
void RegEx::clear() {
|
||||
if (sizeof(CharType) == 2) {
|
||||
if (code) {
|
||||
pcre2_code_free_16((pcre2_code_16 *)code);
|
||||
code = nullptr;
|
||||
}
|
||||
|
||||
} else {
|
||||
if (code) {
|
||||
pcre2_code_free_32((pcre2_code_32 *)code);
|
||||
code = nullptr;
|
||||
}
|
||||
if (code) {
|
||||
pcre2_code_free_32((pcre2_code_32 *)code);
|
||||
code = nullptr;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -187,39 +174,20 @@ Error RegEx::compile(const String &p_pattern) {
|
||||
PCRE2_SIZE offset;
|
||||
uint32_t flags = PCRE2_DUPNAMES;
|
||||
|
||||
if (sizeof(CharType) == 2) {
|
||||
pcre2_general_context_16 *gctx = (pcre2_general_context_16 *)general_ctx;
|
||||
pcre2_compile_context_16 *cctx = pcre2_compile_context_create_16(gctx);
|
||||
PCRE2_SPTR16 p = (PCRE2_SPTR16)pattern.c_str();
|
||||
pcre2_general_context_32 *gctx = (pcre2_general_context_32 *)general_ctx;
|
||||
pcre2_compile_context_32 *cctx = pcre2_compile_context_create_32(gctx);
|
||||
PCRE2_SPTR32 p = (PCRE2_SPTR32)pattern.get_data();
|
||||
|
||||
code = pcre2_compile_16(p, pattern.length(), flags, &err, &offset, cctx);
|
||||
code = pcre2_compile_32(p, pattern.length(), flags, &err, &offset, cctx);
|
||||
|
||||
pcre2_compile_context_free_16(cctx);
|
||||
pcre2_compile_context_free_32(cctx);
|
||||
|
||||
if (!code) {
|
||||
PCRE2_UCHAR16 buf[256];
|
||||
pcre2_get_error_message_16(err, buf, 256);
|
||||
String message = String::num(offset) + ": " + String((const CharType *)buf);
|
||||
ERR_PRINT(message.utf8());
|
||||
return FAILED;
|
||||
}
|
||||
|
||||
} else {
|
||||
pcre2_general_context_32 *gctx = (pcre2_general_context_32 *)general_ctx;
|
||||
pcre2_compile_context_32 *cctx = pcre2_compile_context_create_32(gctx);
|
||||
PCRE2_SPTR32 p = (PCRE2_SPTR32)pattern.c_str();
|
||||
|
||||
code = pcre2_compile_32(p, pattern.length(), flags, &err, &offset, cctx);
|
||||
|
||||
pcre2_compile_context_free_32(cctx);
|
||||
|
||||
if (!code) {
|
||||
PCRE2_UCHAR32 buf[256];
|
||||
pcre2_get_error_message_32(err, buf, 256);
|
||||
String message = String::num(offset) + ": " + String((const CharType *)buf);
|
||||
ERR_PRINT(message.utf8());
|
||||
return FAILED;
|
||||
}
|
||||
if (!code) {
|
||||
PCRE2_UCHAR32 buf[256];
|
||||
pcre2_get_error_message_32(err, buf, 256);
|
||||
String message = String::num(offset) + ": " + String((const char32_t *)buf);
|
||||
ERR_PRINT(message.utf8());
|
||||
return FAILED;
|
||||
}
|
||||
return OK;
|
||||
}
|
||||
@@ -234,69 +202,39 @@ Ref<RegExMatch> RegEx::search(const String &p_subject, int p_offset, int p_end)
|
||||
length = p_end;
|
||||
}
|
||||
|
||||
if (sizeof(CharType) == 2) {
|
||||
pcre2_code_16 *c = (pcre2_code_16 *)code;
|
||||
pcre2_general_context_16 *gctx = (pcre2_general_context_16 *)general_ctx;
|
||||
pcre2_match_context_16 *mctx = pcre2_match_context_create_16(gctx);
|
||||
PCRE2_SPTR16 s = (PCRE2_SPTR16)p_subject.c_str();
|
||||
pcre2_code_32 *c = (pcre2_code_32 *)code;
|
||||
pcre2_general_context_32 *gctx = (pcre2_general_context_32 *)general_ctx;
|
||||
pcre2_match_context_32 *mctx = pcre2_match_context_create_32(gctx);
|
||||
PCRE2_SPTR32 s = (PCRE2_SPTR32)p_subject.get_data();
|
||||
|
||||
pcre2_match_data_16 *match = pcre2_match_data_create_from_pattern_16(c, gctx);
|
||||
pcre2_match_data_32 *match = pcre2_match_data_create_from_pattern_32(c, gctx);
|
||||
|
||||
int res = pcre2_match_16(c, s, length, p_offset, 0, match, mctx);
|
||||
|
||||
if (res < 0) {
|
||||
pcre2_match_data_free_16(match);
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
uint32_t size = pcre2_get_ovector_count_16(match);
|
||||
PCRE2_SIZE *ovector = pcre2_get_ovector_pointer_16(match);
|
||||
|
||||
result->data.resize(size);
|
||||
|
||||
for (uint32_t i = 0; i < size; i++) {
|
||||
result->data.write[i].start = ovector[i * 2];
|
||||
result->data.write[i].end = ovector[i * 2 + 1];
|
||||
}
|
||||
|
||||
pcre2_match_data_free_16(match);
|
||||
pcre2_match_context_free_16(mctx);
|
||||
|
||||
} else {
|
||||
pcre2_code_32 *c = (pcre2_code_32 *)code;
|
||||
pcre2_general_context_32 *gctx = (pcre2_general_context_32 *)general_ctx;
|
||||
pcre2_match_context_32 *mctx = pcre2_match_context_create_32(gctx);
|
||||
PCRE2_SPTR32 s = (PCRE2_SPTR32)p_subject.c_str();
|
||||
|
||||
pcre2_match_data_32 *match = pcre2_match_data_create_from_pattern_32(c, gctx);
|
||||
|
||||
int res = pcre2_match_32(c, s, length, p_offset, 0, match, mctx);
|
||||
|
||||
if (res < 0) {
|
||||
pcre2_match_data_free_32(match);
|
||||
pcre2_match_context_free_32(mctx);
|
||||
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
uint32_t size = pcre2_get_ovector_count_32(match);
|
||||
PCRE2_SIZE *ovector = pcre2_get_ovector_pointer_32(match);
|
||||
|
||||
result->data.resize(size);
|
||||
|
||||
for (uint32_t i = 0; i < size; i++) {
|
||||
result->data.write[i].start = ovector[i * 2];
|
||||
result->data.write[i].end = ovector[i * 2 + 1];
|
||||
}
|
||||
int res = pcre2_match_32(c, s, length, p_offset, 0, match, mctx);
|
||||
|
||||
if (res < 0) {
|
||||
pcre2_match_data_free_32(match);
|
||||
pcre2_match_context_free_32(mctx);
|
||||
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
uint32_t size = pcre2_get_ovector_count_32(match);
|
||||
PCRE2_SIZE *ovector = pcre2_get_ovector_pointer_32(match);
|
||||
|
||||
result->data.resize(size);
|
||||
|
||||
for (uint32_t i = 0; i < size; i++) {
|
||||
result->data.write[i].start = ovector[i * 2];
|
||||
result->data.write[i].end = ovector[i * 2 + 1];
|
||||
}
|
||||
|
||||
pcre2_match_data_free_32(match);
|
||||
pcre2_match_context_free_32(mctx);
|
||||
|
||||
result->subject = p_subject;
|
||||
|
||||
uint32_t count;
|
||||
const CharType *table;
|
||||
const char32_t *table;
|
||||
uint32_t entry_size;
|
||||
|
||||
_pattern_info(PCRE2_INFO_NAMECOUNT, &count);
|
||||
@@ -304,7 +242,7 @@ Ref<RegExMatch> RegEx::search(const String &p_subject, int p_offset, int p_end)
|
||||
_pattern_info(PCRE2_INFO_NAMEENTRYSIZE, &entry_size);
|
||||
|
||||
for (uint32_t i = 0; i < count; i++) {
|
||||
CharType id = table[i * entry_size];
|
||||
char32_t id = table[i * entry_size];
|
||||
if (result->data[id].start == -1) {
|
||||
continue;
|
||||
}
|
||||
@@ -344,7 +282,7 @@ String RegEx::sub(const String &p_subject, const String &p_replacement, bool p_a
|
||||
const int safety_zone = 1;
|
||||
|
||||
PCRE2_SIZE olength = p_subject.length() + 1; // space for output string and one terminating \0 character
|
||||
Vector<CharType> output;
|
||||
Vector<char32_t> output;
|
||||
output.resize(olength + safety_zone);
|
||||
|
||||
uint32_t flags = PCRE2_SUBSTITUTE_OVERFLOW_LENGTH;
|
||||
@@ -357,55 +295,28 @@ String RegEx::sub(const String &p_subject, const String &p_replacement, bool p_a
|
||||
length = p_end;
|
||||
}
|
||||
|
||||
if (sizeof(CharType) == 2) {
|
||||
pcre2_code_16 *c = (pcre2_code_16 *)code;
|
||||
pcre2_general_context_16 *gctx = (pcre2_general_context_16 *)general_ctx;
|
||||
pcre2_match_context_16 *mctx = pcre2_match_context_create_16(gctx);
|
||||
PCRE2_SPTR16 s = (PCRE2_SPTR16)p_subject.c_str();
|
||||
PCRE2_SPTR16 r = (PCRE2_SPTR16)p_replacement.c_str();
|
||||
PCRE2_UCHAR16 *o = (PCRE2_UCHAR16 *)output.ptrw();
|
||||
pcre2_code_32 *c = (pcre2_code_32 *)code;
|
||||
pcre2_general_context_32 *gctx = (pcre2_general_context_32 *)general_ctx;
|
||||
pcre2_match_context_32 *mctx = pcre2_match_context_create_32(gctx);
|
||||
PCRE2_SPTR32 s = (PCRE2_SPTR32)p_subject.get_data();
|
||||
PCRE2_SPTR32 r = (PCRE2_SPTR32)p_replacement.get_data();
|
||||
PCRE2_UCHAR32 *o = (PCRE2_UCHAR32 *)output.ptrw();
|
||||
|
||||
pcre2_match_data_16 *match = pcre2_match_data_create_from_pattern_16(c, gctx);
|
||||
pcre2_match_data_32 *match = pcre2_match_data_create_from_pattern_32(c, gctx);
|
||||
|
||||
int res = pcre2_substitute_16(c, s, length, p_offset, flags, match, mctx, r, p_replacement.length(), o, &olength);
|
||||
int res = pcre2_substitute_32(c, s, length, p_offset, flags, match, mctx, r, p_replacement.length(), o, &olength);
|
||||
|
||||
if (res == PCRE2_ERROR_NOMEMORY) {
|
||||
output.resize(olength + safety_zone);
|
||||
o = (PCRE2_UCHAR16 *)output.ptrw();
|
||||
res = pcre2_substitute_16(c, s, length, p_offset, flags, match, mctx, r, p_replacement.length(), o, &olength);
|
||||
}
|
||||
if (res == PCRE2_ERROR_NOMEMORY) {
|
||||
output.resize(olength + safety_zone);
|
||||
o = (PCRE2_UCHAR32 *)output.ptrw();
|
||||
res = pcre2_substitute_32(c, s, length, p_offset, flags, match, mctx, r, p_replacement.length(), o, &olength);
|
||||
}
|
||||
|
||||
pcre2_match_data_free_16(match);
|
||||
pcre2_match_context_free_16(mctx);
|
||||
pcre2_match_data_free_32(match);
|
||||
pcre2_match_context_free_32(mctx);
|
||||
|
||||
if (res < 0) {
|
||||
return String();
|
||||
}
|
||||
|
||||
} else {
|
||||
pcre2_code_32 *c = (pcre2_code_32 *)code;
|
||||
pcre2_general_context_32 *gctx = (pcre2_general_context_32 *)general_ctx;
|
||||
pcre2_match_context_32 *mctx = pcre2_match_context_create_32(gctx);
|
||||
PCRE2_SPTR32 s = (PCRE2_SPTR32)p_subject.c_str();
|
||||
PCRE2_SPTR32 r = (PCRE2_SPTR32)p_replacement.c_str();
|
||||
PCRE2_UCHAR32 *o = (PCRE2_UCHAR32 *)output.ptrw();
|
||||
|
||||
pcre2_match_data_32 *match = pcre2_match_data_create_from_pattern_32(c, gctx);
|
||||
|
||||
int res = pcre2_substitute_32(c, s, length, p_offset, flags, match, mctx, r, p_replacement.length(), o, &olength);
|
||||
|
||||
if (res == PCRE2_ERROR_NOMEMORY) {
|
||||
output.resize(olength + safety_zone);
|
||||
o = (PCRE2_UCHAR32 *)output.ptrw();
|
||||
res = pcre2_substitute_32(c, s, length, p_offset, flags, match, mctx, r, p_replacement.length(), o, &olength);
|
||||
}
|
||||
|
||||
pcre2_match_data_free_32(match);
|
||||
pcre2_match_context_free_32(mctx);
|
||||
|
||||
if (res < 0) {
|
||||
return String();
|
||||
}
|
||||
if (res < 0) {
|
||||
return String();
|
||||
}
|
||||
|
||||
return String(output.ptr(), olength);
|
||||
@@ -435,7 +346,7 @@ Array RegEx::get_names() const {
|
||||
ERR_FAIL_COND_V(!is_valid(), result);
|
||||
|
||||
uint32_t count;
|
||||
const CharType *table;
|
||||
const char32_t *table;
|
||||
uint32_t entry_size;
|
||||
|
||||
_pattern_info(PCRE2_INFO_NAMECOUNT, &count);
|
||||
@@ -453,39 +364,21 @@ Array RegEx::get_names() const {
|
||||
}
|
||||
|
||||
RegEx::RegEx() {
|
||||
if (sizeof(CharType) == 2) {
|
||||
general_ctx = pcre2_general_context_create_16(&_regex_malloc, &_regex_free, nullptr);
|
||||
|
||||
} else {
|
||||
general_ctx = pcre2_general_context_create_32(&_regex_malloc, &_regex_free, nullptr);
|
||||
}
|
||||
general_ctx = pcre2_general_context_create_32(&_regex_malloc, &_regex_free, nullptr);
|
||||
code = nullptr;
|
||||
}
|
||||
|
||||
RegEx::RegEx(const String &p_pattern) {
|
||||
if (sizeof(CharType) == 2) {
|
||||
general_ctx = pcre2_general_context_create_16(&_regex_malloc, &_regex_free, nullptr);
|
||||
|
||||
} else {
|
||||
general_ctx = pcre2_general_context_create_32(&_regex_malloc, &_regex_free, nullptr);
|
||||
}
|
||||
general_ctx = pcre2_general_context_create_32(&_regex_malloc, &_regex_free, nullptr);
|
||||
code = nullptr;
|
||||
compile(p_pattern);
|
||||
}
|
||||
|
||||
RegEx::~RegEx() {
|
||||
if (sizeof(CharType) == 2) {
|
||||
if (code) {
|
||||
pcre2_code_free_16((pcre2_code_16 *)code);
|
||||
}
|
||||
pcre2_general_context_free_16((pcre2_general_context_16 *)general_ctx);
|
||||
|
||||
} else {
|
||||
if (code) {
|
||||
pcre2_code_free_32((pcre2_code_32 *)code);
|
||||
}
|
||||
pcre2_general_context_free_32((pcre2_general_context_32 *)general_ctx);
|
||||
if (code) {
|
||||
pcre2_code_free_32((pcre2_code_32 *)code);
|
||||
}
|
||||
pcre2_general_context_free_32((pcre2_general_context_32 *)general_ctx);
|
||||
}
|
||||
|
||||
void RegEx::_bind_methods() {
|
||||
|
||||
Reference in New Issue
Block a user