Allow hex escapes greater than \x7F in byte literals
diff --git a/src/escape.rs b/src/escape.rs
index 2adf06b..eb30d90 100644
--- a/src/escape.rs
+++ b/src/escape.rs
@@ -122,6 +122,35 @@
}
}
+pub fn cooked_byte(input: &str) -> IResult<&str, u8> {
+ let mut bytes = input.bytes().enumerate();
+ let b = match bytes.next().map(|(_, b)| b) {
+ Some(b'\\') => {
+ match bytes.next().map(|(_, b)| b) {
+ Some(b'x') => backslash_x_byte(&mut bytes),
+ Some(b'n') => Some(b'\n'),
+ Some(b'r') => Some(b'\r'),
+ Some(b't') => Some(b'\t'),
+ Some(b'\\') => Some(b'\\'),
+ Some(b'0') => Some(b'\0'),
+ Some(b'\'') => Some(b'\''),
+ Some(b'"') => Some(b'"'),
+ _ => None,
+ }
+ }
+ b => b,
+ };
+ match b {
+ Some(b) => {
+ match bytes.next() {
+ Some((offset, _)) => IResult::Done(&input[offset..], b),
+ None => IResult::Done("", b),
+ }
+ }
+ None => IResult::Error,
+ }
+}
+
pub fn raw_string(input: &str) -> IResult<&str, (String, usize)> {
let mut chars = input.char_indices();
let mut n = 0;
diff --git a/src/lit.rs b/src/lit.rs
index 4829803..857832d 100644
--- a/src/lit.rs
+++ b/src/lit.rs
@@ -129,7 +129,7 @@
#[cfg(feature = "parsing")]
pub mod parsing {
use super::*;
- use escape::{cooked_byte_string, cooked_char, cooked_string, raw_string};
+ use escape::{cooked_byte, cooked_byte_string, cooked_char, cooked_string, raw_string};
use space::skip_whitespace;
use nom::IResult;
use unicode_xid::UnicodeXID;
@@ -181,9 +181,9 @@
named!(byte -> Lit, do_parse!(
punct!("b") >>
tag!("'") >>
- ch: cooked_char >>
+ b: cooked_byte >>
tag!("'") >>
- (Lit::Byte(ch as u8))
+ (Lit::Byte(b))
));
named!(character -> Lit, do_parse!(
diff --git a/tests/cases/lit.rs b/tests/cases/lit.rs
index b9e43ea..257d045 100644
--- a/tests/cases/lit.rs
+++ b/tests/cases/lit.rs
@@ -25,6 +25,7 @@
b'\n'
b'"'
b'\''
+ b'\x91'
// Char
'0'