mirror of
https://github.com/thunderbrewhq/squall.git
synced 2025-12-12 02:22:30 +00:00
feat(unicode): add SUniSPutUTF8
This commit is contained in:
parent
4bef36fcae
commit
9e00ad7036
3 changed files with 85 additions and 0 deletions
|
|
@ -57,3 +57,57 @@ uint32_t SUniSGetUTF8(const uint8_t* strptr, int32_t* chars) {
|
||||||
|
|
||||||
return value;
|
return value;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SUniSPutUTF8(uint32_t c, char* strptr) {
|
||||||
|
if (!strptr) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
auto curstr = strptr;
|
||||||
|
auto v3 = c;
|
||||||
|
char v4, v5, v6, v7;
|
||||||
|
|
||||||
|
if (c >= 0x80) {
|
||||||
|
if (c >= 0x800) {
|
||||||
|
if (c >= 0x10000) {
|
||||||
|
if (c >= 0x200000) {
|
||||||
|
if (c >= 0x400000) {
|
||||||
|
if (c >= 0x80000000) {
|
||||||
|
*curstr = 0;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
*strptr = (c >> 30) | 0xFC;
|
||||||
|
curstr = strptr + 1;
|
||||||
|
// TODO this seems likely to be bitwise right shift 24, not 8
|
||||||
|
v7 = ((c >> 8) & 0x3F) | 0x80;
|
||||||
|
} else {
|
||||||
|
// TODO this seems likely to be bitwise right shift 24, not 8
|
||||||
|
v7 = (c >> 8) | 0xF8;
|
||||||
|
}
|
||||||
|
|
||||||
|
*curstr++ = v7;
|
||||||
|
v6 = ((c >> 18) & 0x3F) | 0x80;
|
||||||
|
} else {
|
||||||
|
v6 = (c >> 18) | 0xF0;
|
||||||
|
}
|
||||||
|
|
||||||
|
*curstr++ = v6;
|
||||||
|
v5 = ((c >> 12) & 0x3F) | 0x80;
|
||||||
|
} else {
|
||||||
|
v5 = (c >> 12) | 0xE0;
|
||||||
|
}
|
||||||
|
|
||||||
|
*curstr++ = v5;
|
||||||
|
v4 = ((c >> 6) & 0x3F) | 0x80;
|
||||||
|
} else {
|
||||||
|
v4 = (c >> 6) | 0xC0;
|
||||||
|
}
|
||||||
|
|
||||||
|
*curstr++ = v4;
|
||||||
|
v3 = (c & 0x3F) | 0x80;
|
||||||
|
}
|
||||||
|
|
||||||
|
*curstr++ = v3;
|
||||||
|
*curstr = '\0';
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -5,4 +5,6 @@
|
||||||
|
|
||||||
uint32_t SUniSGetUTF8(const uint8_t* strptr, int32_t* chars);
|
uint32_t SUniSGetUTF8(const uint8_t* strptr, int32_t* chars);
|
||||||
|
|
||||||
|
void SUniSPutUTF8(uint32_t c, char* strptr);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,5 @@
|
||||||
#include "storm/Unicode.hpp"
|
#include "storm/Unicode.hpp"
|
||||||
|
#include "storm/String.hpp"
|
||||||
#include "test/Test.hpp"
|
#include "test/Test.hpp"
|
||||||
|
|
||||||
TEST_CASE("SUniSGetUTF8", "[unicode]") {
|
TEST_CASE("SUniSGetUTF8", "[unicode]") {
|
||||||
|
|
@ -30,3 +31,31 @@ TEST_CASE("SUniSGetUTF8", "[unicode]") {
|
||||||
REQUIRE(chars == 0);
|
REQUIRE(chars == 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST_CASE("SUniSPutUTF8", "[unicode]") {
|
||||||
|
SECTION("writes ascii-range utf-8 first character") {
|
||||||
|
auto code = 'f';
|
||||||
|
char buffer[100] = { 0 };
|
||||||
|
SUniSPutUTF8(code, buffer);
|
||||||
|
|
||||||
|
REQUIRE(SStrLen(buffer) == 1);
|
||||||
|
REQUIRE(!SStrCmp(buffer, "f", SStrLen(buffer)));
|
||||||
|
}
|
||||||
|
|
||||||
|
SECTION("writes non-ascii-range utf-8 first character") {
|
||||||
|
auto code = 0x1F642;
|
||||||
|
char buffer[100] = { 0 };
|
||||||
|
SUniSPutUTF8(code, buffer);
|
||||||
|
|
||||||
|
REQUIRE(SStrLen(buffer) == 4);
|
||||||
|
REQUIRE(!SStrCmp(buffer, "\xF0\x9F\x99\x82", SStrLen(buffer)));
|
||||||
|
}
|
||||||
|
|
||||||
|
SECTION("writes null first character") {
|
||||||
|
auto code = '\0';
|
||||||
|
char buffer[100] = { 0 };
|
||||||
|
SUniSPutUTF8(code, buffer);
|
||||||
|
|
||||||
|
REQUIRE(SStrLen(buffer) == 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue