Răsfoiți Sursa

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

fix: handle hex escapes in strings and reject invalid escapes
BLUELOVETH 11 luni în urmă
părinte
comite
28f70cf286
1 a modificat fișierele cu 15 adăugiri și 3 ștergeri
  1. 15 3
      src/compiler/lexer.c

+ 15 - 3
src/compiler/lexer.c

@@ -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");
             }