diff options
Diffstat (limited to 'parser.l')
-rw-r--r-- | parser.l | 20 |
1 files changed, 14 insertions, 6 deletions
@@ -903,9 +903,13 @@ UONLY {U2}{U}|{U3}{U}{U}|{U4}{U}{U}{U} } <REGEX,SREGEX>{UANYN} { - wchar_t buf[8]; - utf8_from(buf, yytext); - yylval->chr = buf[0]; + wchar_t wchr[8]; + if (utf8_from_buf(wchr, coerce(unsigned char *, yytext), yyleng) != 2) { + yyerrprepf(yyg, lit("non-UTF-8 byte in regex: '\\x~02x'"), + num(convert(unsigned char, yytext[0])), nao); + return ERRTOK; + } + yylval->chr = wchr[0]; return REGCHAR; } @@ -1057,9 +1061,13 @@ UONLY {U2}{U}|{U3}{U}{U}|{U4}{U}{U}{U} } <STRLIT,CHRLIT,QSILIT,WLIT,QWLIT>{UANYN} { - wchar_t buf[8]; - utf8_from(buf, yytext); - yylval->chr = buf[0]; + wchar_t wchr[8]; + if (utf8_from_buf(wchr, coerce(unsigned char *, yytext), yyleng) != 2) { + yyerrprepf(yyg, lit("non-UTF-8 byte in literal: '\\x~02x'"), + num(convert(unsigned char, yytext[0])), nao); + return ERRTOK; + } + yylval->chr = wchr[0]; return LITCHAR; } |