mirror of
https://github.com/ChaiScript/ChaiScript.git
synced 2025-12-06 16:57:04 +08:00
Fix broken escape sequence parsing after octal/hex escape
The parser code just added the first character after an octal/hex sequence as raw text, resulting in erroneous data whenever another escape sequence follows directly after.
This commit is contained in:
parent
40b1549b3b
commit
34c6b17215
@ -961,6 +961,32 @@ namespace chaiscript
|
|||||||
}
|
}
|
||||||
|
|
||||||
void parse(const char_type t_char, const int line, const int col, const std::string &filename) {
|
void parse(const char_type t_char, const int line, const int col, const std::string &filename) {
|
||||||
|
const bool is_octal_char = t_char >= '0' && t_char <= '7';
|
||||||
|
|
||||||
|
if (is_octal) {
|
||||||
|
if (is_octal_char) {
|
||||||
|
octal_matches.push_back(t_char);
|
||||||
|
|
||||||
|
if (octal_matches.size() == 3) {
|
||||||
|
process_octal();
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
} else {
|
||||||
|
process_octal();
|
||||||
|
}
|
||||||
|
} else if (is_hex) {
|
||||||
|
const bool is_hex_char = (t_char >= '0' && t_char <= '9')
|
||||||
|
|| (t_char >= 'a' && t_char <= 'f')
|
||||||
|
|| (t_char >= 'A' && t_char <= 'F');
|
||||||
|
|
||||||
|
if (is_hex_char) {
|
||||||
|
hex_matches.push_back(t_char);
|
||||||
|
return;
|
||||||
|
} else {
|
||||||
|
process_hex();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (t_char == '\\') {
|
if (t_char == '\\') {
|
||||||
if (is_escaped) {
|
if (is_escaped) {
|
||||||
match.push_back('\\');
|
match.push_back('\\');
|
||||||
@ -970,31 +996,7 @@ namespace chaiscript
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (is_escaped) {
|
if (is_escaped) {
|
||||||
const bool is_octal_char = t_char >= '0' && t_char <= '7';
|
if (is_octal_char) {
|
||||||
|
|
||||||
if (is_octal) {
|
|
||||||
if (is_octal_char) {
|
|
||||||
octal_matches.push_back(t_char);
|
|
||||||
|
|
||||||
if (octal_matches.size() == 3) {
|
|
||||||
process_octal();
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
process_octal();
|
|
||||||
match.push_back(t_char);
|
|
||||||
}
|
|
||||||
} else if (is_hex) {
|
|
||||||
const bool is_hex_char = (t_char >= '0' && t_char <= '9')
|
|
||||||
|| (t_char >= 'a' && t_char <= 'f')
|
|
||||||
|| (t_char >= 'A' && t_char <= 'F');
|
|
||||||
|
|
||||||
if (is_hex_char) {
|
|
||||||
hex_matches.push_back(t_char);
|
|
||||||
} else {
|
|
||||||
process_hex();
|
|
||||||
match.push_back(t_char);
|
|
||||||
}
|
|
||||||
} else if (is_octal_char) {
|
|
||||||
is_octal = true;
|
is_octal = true;
|
||||||
octal_matches.push_back(t_char);
|
octal_matches.push_back(t_char);
|
||||||
} else if (t_char == 'x') {
|
} else if (t_char == 'x') {
|
||||||
|
|||||||
@ -3,4 +3,5 @@ assert_equal("\x39", "9")
|
|||||||
assert_equal("\x039", "9")
|
assert_equal("\x039", "9")
|
||||||
assert_equal("\x39g", "9g")
|
assert_equal("\x39g", "9g")
|
||||||
assert_equal("b\x39g", "b9g")
|
assert_equal("b\x39g", "b9g")
|
||||||
|
assert_equal("\x39\x38g", "98g")
|
||||||
|
|
||||||
|
|||||||
@ -3,4 +3,5 @@ assert_equal("\71", "9")
|
|||||||
assert_equal("\071", "9")
|
assert_equal("\071", "9")
|
||||||
assert_equal("\71a", "9a")
|
assert_equal("\71a", "9a")
|
||||||
assert_equal("b\71a", "b9a")
|
assert_equal("b\71a", "b9a")
|
||||||
|
assert_equal("\71\70a", "98a")
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user