From 0262ded968ece38cff5cb80626299155ef040228 Mon Sep 17 00:00:00 2001 From: Jesse Luehrs Date: Thu, 18 Nov 2021 23:14:47 +0000 Subject: add fuzzer input generator --- tests/helpers/mod.rs | 59 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) (limited to 'tests') diff --git a/tests/helpers/mod.rs b/tests/helpers/mod.rs index 20de2d4..d3dd05d 100644 --- a/tests/helpers/mod.rs +++ b/tests/helpers/mod.rs @@ -289,3 +289,62 @@ fn hex_char(c: u8) -> Result { pub fn hex(upper: u8, lower: u8) -> Result { Ok(hex_char(upper)? * 16 + hex_char(lower)?) } + +#[allow(dead_code)] +pub fn unhex(s: &[u8]) -> Vec { + let mut ret = vec![]; + let mut i = 0; + while i < s.len() { + if s[i] == b'\\' { + match s[i + 1] { + b'\\' => { + ret.push(b'\\'); + i += 2; + } + b'x' => { + let upper = s[i + 2]; + let lower = s[i + 3]; + ret.push(hex(upper, lower).unwrap()); + i += 4; + } + b'u' => { + assert_eq!(s[i + 2], b'{'); + let mut digits = vec![]; + let mut j = i + 3; + while s[j] != b'}' { + digits.push(s[j]); + j += 1; + } + let digits: Vec<_> = digits + .iter() + .copied() + .skip_while(|x| x == &b'0') + .collect(); + let digits = String::from_utf8(digits).unwrap(); + let codepoint = u32::from_str_radix(&digits, 16).unwrap(); + let c = char::try_from(codepoint).unwrap(); + let mut bytes = [0; 4]; + ret.extend(c.encode_utf8(&mut bytes).bytes()); + i = j + 1; + } + b'r' => { + ret.push(0x0d); + i += 2; + } + b'n' => { + ret.push(0x0a); + i += 2; + } + b't' => { + ret.push(0x09); + i += 2; + } + _ => panic!("invalid escape"), + } + } else { + ret.push(s[i]); + i += 1; + } + } + ret +} -- cgit v1.2.3-54-g00ecf