/// Converts an arbitrary sequence of bytes to a literal suitable for building
/// a regular expression.
pub fn bytes_to_regex(bs: &[u8]) -> String {
    use regex_syntax::is_meta_character;
    use std::fmt::Write;

    let mut s = String::with_capacity(bs.len());
    for &b in bs {
        if b <= 0x7F && !is_meta_character(b as char) {
            write!(s, r"{}", b as char).unwrap();
        } else {
            write!(s, r"\x{:02x}", b).unwrap();
        }
    }
    s
}

/// Converts arbitrary bytes to a nice string.
pub fn show_bytes(bs: &[u8]) -> String {
    use std::ascii::escape_default;
    use std::str;

    let mut nice = String::new();
    for &b in bs {
        let part: Vec<u8> = escape_default(b).collect();
        nice.push_str(str::from_utf8(&part).unwrap());
    }
    nice
}