Merge pull request #228 from ChristianKaeser/ckfix
String escape sequence bug fix
This commit is contained in:
commit
7507223c8b
@ -961,6 +961,40 @@ 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);
|
||||||
|
|
||||||
|
if (hex_matches.size() == 2*sizeof(char_type)) {
|
||||||
|
// This rule differs from the C/C++ standard, but ChaiScript
|
||||||
|
// does not offer the same workaround options, and having
|
||||||
|
// hexadecimal sequences longer than can fit into the char
|
||||||
|
// type is undefined behavior anyway.
|
||||||
|
process_hex();
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
} else {
|
||||||
|
process_hex();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (t_char == '\\') {
|
if (t_char == '\\') {
|
||||||
if (is_escaped) {
|
if (is_escaped) {
|
||||||
match.push_back('\\');
|
match.push_back('\\');
|
||||||
@ -970,31 +1004,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') {
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
|
|
||||||
assert_equal("\x39", "9")
|
assert_equal("\x39", "9")
|
||||||
assert_equal("\x039", "9")
|
assert_equal("\x39ec", "9ec")
|
||||||
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