From: Evgeny Bobkin Date: Wed, 16 May 2018 12:15:07 +0000 (+0200) Subject: genie: Add support for the \uXXXX escape sequence X-Git-Tag: 0.34.18~5 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=34fc7bfdac86cf7c6c383cf74315d972fb73292f;p=thirdparty%2Fvala.git genie: Add support for the \uXXXX escape sequence An additional checks to validate the escape sequences \xYY and \uYYYY were added, where Y represents a hex digit. Ported from 04422d716cf226b5e8a6c11306e07adbde26fd67 --- diff --git a/vala/valageniescanner.vala b/vala/valageniescanner.vala index 894ab387d..d46a767ca 100644 --- a/vala/valageniescanner.vala +++ b/vala/valageniescanner.vala @@ -230,14 +230,31 @@ public class Vala.Genie.Scanner { current++; token_length_in_chars++; break; + case 'u': + // u escape character has four hex digits + current++; + token_length_in_chars++; + int digit_length; + for (digit_length = 0; digit_length < 4 && current < end && current[0].isxdigit (); digit_length++) { + current++; + token_length_in_chars++; + } + if (digit_length != 4) { + Report.error (get_source_reference (token_length_in_chars), "\\u requires four hex digits"); + } + break; case 'x': - // hexadecimal escape character + // hexadecimal escape character requires two hex digits current++; token_length_in_chars++; - while (current < end && current[0].isxdigit ()) { + int digit_length; + for (digit_length = 0; digit_length < 2 && current < end && current[0].isxdigit (); digit_length++) { current++; token_length_in_chars++; } + if (digit_length != 2) { + Report.error (get_source_reference (token_length_in_chars), "\\x requires two hex digits"); + } break; default: // back references \1 through \99 @@ -739,14 +756,31 @@ public class Vala.Genie.Scanner { current++; token_length_in_chars++; break; + case 'u': + // u escape character has four hex digits + current++; + token_length_in_chars++; + int digit_length; + for (digit_length = 0; digit_length < 4 && current < end && current[0].isxdigit (); digit_length++) { + current++; + token_length_in_chars++; + } + if (digit_length != 4) { + Report.error (get_source_reference (token_length_in_chars), "\\u requires four hex digits"); + } + break; case 'x': - // hexadecimal escape character + // hexadecimal escape character requires two hex digits current++; token_length_in_chars++; - while (current < end && current[0].isxdigit ()) { + int digit_length; + for (digit_length = 0; digit_length < 2 && current < end && current[0].isxdigit (); digit_length++) { current++; token_length_in_chars++; } + if (digit_length != 2) { + Report.error (get_source_reference (token_length_in_chars), "\\x requires two hex digits"); + } break; default: Report.error (get_source_reference (token_length_in_chars), "invalid escape sequence"); @@ -1295,14 +1329,31 @@ public class Vala.Genie.Scanner { current++; token_length_in_chars++; break; + case 'u': + // u escape character has four hex digits + current++; + token_length_in_chars++; + int digit_length; + for (digit_length = 0; digit_length < 4 && current < end && current[0].isxdigit (); digit_length++) { + current++; + token_length_in_chars++; + } + if (digit_length != 4) { + Report.error (get_source_reference (token_length_in_chars), "\\u requires four hex digits"); + } + break; case 'x': - // hexadecimal escape character + // hexadecimal escape character requires two hex digits current++; token_length_in_chars++; - while (current < end && current[0].isxdigit ()) { + int digit_length; + for (digit_length = 0; digit_length < 2 && current < end && current[0].isxdigit (); digit_length++) { current++; token_length_in_chars++; } + if (digit_length != 2) { + Report.error (get_source_reference (token_length_in_chars), "\\x requires two hex digits"); + } break; default: Report.error (get_source_reference (token_length_in_chars), "invalid escape sequence");