Merge pull request #358 from attaulasad/fix-hex-escape-handling

fix: handle hex escapes in strings and reject invalid escapes
This commit is contained in:
BLUELOVETH 2025-04-08 10:54:36 +08:00 committed by GitHub
commit 28f70cf286
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -280,10 +280,22 @@ static Error* _eat_string(Lexer* self, c11_sbuf* buff, char quote, enum StringTy
case 'x': {
char hex[3] = {eatchar(self), eatchar(self), '\0'};
int code;
if(sscanf(hex, "%x", &code) != 1) {
return LexerError(self, "invalid hex char");
if (sscanf(hex, "%x", &code) != 1 || code > 0xFF) {
return LexerError(self, "invalid hex escape");
}
if (type == NORMAL_BYTES) {
// Bytes literals: write raw byte
c11_sbuf__write_char(buff, (char)code);
} else {
// Regular strings: encode as UTF-8
if (code <= 0x7F) {
c11_sbuf__write_char(buff, (char)code);
} else {
// Encode as 2-byte UTF-8 for code points 0x80-0xFF
c11_sbuf__write_char(buff, 0xC0 | (code >> 6)); // Leading byte
c11_sbuf__write_char(buff, 0x80 | (code & 0x3F)); // Continuation byte
}
}
c11_sbuf__write_char(buff, (char)code);
} break;
default: return LexerError(self, "invalid escape char");
}