2015-12-31 12:23:09 +00:00
|
|
|
//#![feature(trace_macros)]
|
2017-06-16 12:34:49 +00:00
|
|
|
#![allow(dead_code)]
|
2017-12-10 13:03:25 +00:00
|
|
|
#![cfg_attr(feature = "cargo-clippy", allow(redundant_closure))]
|
2017-06-16 12:34:49 +00:00
|
|
|
|
2015-08-04 07:07:55 +00:00
|
|
|
#[macro_use]
|
|
|
|
extern crate nom;
|
|
|
|
|
2017-12-10 17:39:11 +00:00
|
|
|
use nom::{Err, IResult, Needed, space, be_u16, le_u64};
|
2015-08-04 07:07:55 +00:00
|
|
|
|
|
|
|
#[allow(dead_code)]
|
|
|
|
struct Range {
|
|
|
|
start: char,
|
2017-12-10 17:39:11 +00:00
|
|
|
end: char,
|
2015-08-04 07:07:55 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
pub fn take_char(input: &[u8]) -> IResult<&[u8], char> {
|
2017-12-10 13:03:25 +00:00
|
|
|
if !input.is_empty() {
|
2017-09-07 12:28:33 +00:00
|
|
|
Ok((&input[1..], input[0] as char))
|
2015-08-04 07:07:55 +00:00
|
|
|
} else {
|
2017-09-07 12:28:33 +00:00
|
|
|
Err(Err::Incomplete(Needed::Size(1)))
|
2015-08-04 07:07:55 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
//trace_macros!(true);
|
|
|
|
|
|
|
|
#[allow(dead_code)]
|
|
|
|
named!(range<&[u8], Range>,
|
|
|
|
alt!(
|
2016-10-18 10:28:58 +00:00
|
|
|
do_parse!(
|
|
|
|
start: take_char >>
|
|
|
|
tag!("-") >>
|
|
|
|
end: take_char >>
|
|
|
|
(Range {
|
|
|
|
start: start,
|
|
|
|
end: end,
|
|
|
|
})
|
2015-08-04 07:07:55 +00:00
|
|
|
) |
|
|
|
|
map!(
|
|
|
|
take_char,
|
|
|
|
|c| {
|
|
|
|
Range {
|
|
|
|
start: c,
|
2016-10-18 10:28:58 +00:00
|
|
|
end: c,
|
2015-08-04 07:07:55 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
)
|
|
|
|
)
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
|
|
#[allow(dead_code)]
|
|
|
|
named!(literal<&[u8], Vec<char> >,
|
|
|
|
map!(
|
|
|
|
many1!(take_char),
|
|
|
|
|cs| {
|
|
|
|
cs
|
|
|
|
}
|
|
|
|
)
|
|
|
|
);
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn issue_58() {
|
2017-12-09 15:12:57 +00:00
|
|
|
let _ = range(&b"abcd"[..]);
|
|
|
|
let _ = literal(&b"abcd"[..]);
|
2015-08-04 07:07:55 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
//trace_macros!(false);
|
2015-12-30 15:24:10 +00:00
|
|
|
|
2017-05-09 11:00:21 +00:00
|
|
|
#[cfg(feature = "std")]
|
|
|
|
mod parse_int {
|
|
|
|
use nom::HexDisplay;
|
2017-12-10 17:39:11 +00:00
|
|
|
use nom::{IResult, space, digit};
|
2017-05-09 11:00:21 +00:00
|
|
|
use std::str;
|
|
|
|
|
|
|
|
named!(parse_ints< Vec<i32> >, many0!(spaces_or_int));
|
|
|
|
|
2017-12-10 17:39:11 +00:00
|
|
|
fn spaces_or_int(input: &[u8]) -> IResult<&[u8], i32> {
|
2017-05-09 11:00:21 +00:00
|
|
|
println!("{}", input.to_hex(8));
|
|
|
|
do_parse!(input,
|
|
|
|
opt!(complete!(space)) >>
|
|
|
|
res: map!(complete!(digit),
|
|
|
|
|x| {
|
|
|
|
println!("x: {:?}", x);
|
|
|
|
let result = str::from_utf8(x).unwrap();
|
|
|
|
println!("Result: {}", result);
|
|
|
|
println!("int is empty?: {}", x.is_empty());
|
|
|
|
match result.parse(){
|
|
|
|
Ok(i) => i,
|
2017-12-10 13:03:25 +00:00
|
|
|
Err(e) => panic!("UH OH! NOT A DIGIT! {:?}", e)
|
2017-05-09 11:00:21 +00:00
|
|
|
}
|
|
|
|
}) >>
|
|
|
|
(res)
|
|
|
|
)
|
|
|
|
}
|
2015-12-30 15:24:10 +00:00
|
|
|
|
2017-05-09 11:00:21 +00:00
|
|
|
#[test]
|
2017-12-10 17:39:11 +00:00
|
|
|
fn issue_142() {
|
2018-01-11 18:29:46 +00:00
|
|
|
let subject = parse_ints(&b"12 34 5689a"[..]);
|
|
|
|
let expected = Ok((&b"a"[..], vec![12, 34, 5689]));
|
2017-12-10 17:39:11 +00:00
|
|
|
assert_eq!(subject, expected);
|
|
|
|
|
|
|
|
let subject = parse_ints(&b"12 34 5689 "[..]);
|
|
|
|
let expected = Ok((&b" "[..], vec![12, 34, 5689]));
|
|
|
|
assert_eq!(subject, expected)
|
2017-05-09 11:00:21 +00:00
|
|
|
}
|
2015-12-30 15:24:10 +00:00
|
|
|
}
|
2015-12-31 12:23:09 +00:00
|
|
|
|
2016-03-28 08:07:03 +00:00
|
|
|
#[test]
|
2017-12-10 17:39:11 +00:00
|
|
|
fn usize_length_bytes_issue() {
|
|
|
|
let _: IResult<&[u8], &[u8], u32> = length_bytes!(b"012346", be_u16);
|
2016-03-28 08:07:03 +00:00
|
|
|
}
|
|
|
|
|
2015-12-31 12:23:09 +00:00
|
|
|
/*
|
|
|
|
DOES NOT COMPILE
|
|
|
|
#[test]
|
|
|
|
fn issue_152() {
|
|
|
|
named!(take4, take!(4));
|
|
|
|
named!(xyz, tag!("XYZ"));
|
|
|
|
named!(abc, tag!("abc"));
|
|
|
|
|
|
|
|
|
|
|
|
named!(sw,
|
|
|
|
switch!(take4,
|
|
|
|
b"abcd" => xyz |
|
|
|
|
b"efgh" => abc
|
|
|
|
)
|
|
|
|
);
|
|
|
|
}
|
|
|
|
*/
|
2016-04-11 21:59:50 +00:00
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn take_till_issue() {
|
2017-12-10 17:39:11 +00:00
|
|
|
named!(nothing,
|
2016-04-11 21:59:50 +00:00
|
|
|
take_till!(call!(|_| true))
|
|
|
|
);
|
|
|
|
|
2018-01-11 14:36:51 +00:00
|
|
|
assert_eq!(nothing(b""), Err(Err::Incomplete(Needed::Size(1))));
|
2017-12-10 17:39:11 +00:00
|
|
|
assert_eq!(nothing(b"abc"), Ok((&b"abc"[..], &b""[..])));
|
2016-04-11 21:59:50 +00:00
|
|
|
}
|
2017-05-09 14:10:53 +00:00
|
|
|
|
|
|
|
named!(issue_498< Vec<&[u8]> >, separated_nonempty_list!( opt!(space), tag!("abcd") ));
|
|
|
|
|
|
|
|
named!(issue_308(&str) -> bool,
|
|
|
|
do_parse! (
|
|
|
|
tag_s! ("foo") >>
|
|
|
|
b: alt_complete! (
|
|
|
|
map! (tag_s! ("1"), |_: &str|->bool {true}) |
|
|
|
|
value! (false)
|
|
|
|
) >>
|
|
|
|
(b) ));
|
|
|
|
|
2017-05-09 14:17:50 +00:00
|
|
|
|
2017-12-10 17:39:11 +00:00
|
|
|
fn issue_302(input: &[u8]) -> IResult<&[u8], Option<Vec<u64>>> {
|
|
|
|
do_parse!(input,
|
2017-05-09 14:10:53 +00:00
|
|
|
entries: cond!(true, count!(le_u64, 3)) >>
|
|
|
|
( entries )
|
|
|
|
)
|
|
|
|
}
|