add unicode escapes support

This commit is contained in:
MihailRis 2024-10-28 12:51:16 +03:00
parent 8dac3ffdac
commit 65f9caec87
2 changed files with 18 additions and 1 deletions

View File

@ -360,6 +360,13 @@ std::string BasicParser::parseString(char quote, bool closeRequired) {
ss << (char)parseSimpleInt(8); ss << (char)parseSimpleInt(8);
continue; continue;
} }
if (c == 'u') {
int codepoint = parseSimpleInt(16);
ubyte bytes[4];
int size = util::encode_utf8(codepoint, bytes);
ss.write(reinterpret_cast<char*>(bytes), size);
continue;
}
switch (c) { switch (c) {
case 'n': ss << '\n'; break; case 'n': ss << '\n'; break;
case 'r': ss << '\r'; break; case 'r': ss << '\r'; break;

View File

@ -11,7 +11,9 @@
std::string util::escape(const std::string& s) { std::string util::escape(const std::string& s) {
std::stringstream ss; std::stringstream ss;
ss << '"'; ss << '"';
for (char c : s) { size_t pos = 0;
while (pos < s.length()) {
char c = s[pos];
switch (c) { switch (c) {
case '\n': case '\n':
ss << "\\n"; ss << "\\n";
@ -35,6 +37,13 @@ std::string util::escape(const std::string& s) {
ss << "\\\\"; ss << "\\\\";
break; break;
default: default:
if (c & 0x80) {
uint cpsize;
int codepoint = decode_utf8(cpsize, s.data() + pos);
pos += cpsize-1;
ss << "\\u" << std::hex << codepoint;
break;
}
if (c < ' ') { if (c < ' ') {
ss << "\\" << std::oct << uint(ubyte(c)); ss << "\\" << std::oct << uint(ubyte(c));
break; break;
@ -42,6 +51,7 @@ std::string util::escape(const std::string& s) {
ss << c; ss << c;
break; break;
} }
pos++;
} }
ss << '"'; ss << '"';
return ss.str(); return ss.str();