1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
use internal::{IResult,Needed};
#[macro_export]
macro_rules! one_of (
($i:expr, $inp: expr) => (
{
use $crate::Slice;
use $crate::AsChar;
use $crate::FindToken;
use $crate::InputIter;
match ($i).iter_elements().next().map(|c| {
c.find_token($inp)
}) {
None => $crate::IResult::Incomplete::<_, _>($crate::Needed::Size(1)),
Some(false) => $crate::IResult::Error(error_position!($crate::ErrorKind::OneOf, $i)),
Some(true) => $crate::IResult::Done($i.slice(1..), $i.iter_elements().next().unwrap().as_char())
}
}
);
);
#[macro_export]
macro_rules! none_of (
($i:expr, $inp: expr) => (
{
use $crate::Slice;
use $crate::AsChar;
use $crate::FindToken;
use $crate::InputIter;
match ($i).iter_elements().next().map(|c| {
!c.find_token($inp)
}) {
None => $crate::IResult::Incomplete::<_, _>($crate::Needed::Size(1)),
Some(false) => $crate::IResult::Error(error_position!($crate::ErrorKind::NoneOf, $i)),
Some(true) => $crate::IResult::Done($i.slice(1..), $i.iter_elements().next().unwrap().as_char())
}
}
);
);
#[macro_export]
macro_rules! char (
($i:expr, $c: expr) => (
{
use $crate::Slice;
use $crate::AsChar;
use $crate::InputIter;
match ($i).iter_elements().next().map(|c| {
c.as_char() == $c
}) {
None => $crate::IResult::Incomplete::<_, _>($crate::Needed::Size(1)),
Some(false) => $crate::IResult::Error(error_position!($crate::ErrorKind::Char, $i)),
Some(true) => $crate::IResult::Done($i.slice(1..), $i.iter_elements().next().unwrap().as_char())
}
}
);
);
named!(#[doc="Matches a newline character '\\n'"], pub newline<char>, char!('\n'));
named!(#[doc="Matches a tab character '\\t'"], pub tab<char>, char!('\t'));
pub fn anychar(input:&[u8]) -> IResult<&[u8], char> {
if input.is_empty() {
IResult::Incomplete(Needed::Size(1))
} else {
IResult::Done(&input[1..], input[0] as char)
}
}
#[cfg(test)]
mod tests {
use internal::IResult::*;
use util::ErrorKind;
#[test]
fn one_of() {
named!(f<char>, one_of!("ab"));
let a = &b"abcd"[..];
assert_eq!(f(a), Done(&b"bcd"[..], 'a'));
let b = &b"cde"[..];
assert_eq!(f(b), Error(error_position!(ErrorKind::OneOf, b)));
}
#[test]
fn none_of() {
named!(f<char>, none_of!("ab"));
let a = &b"abcd"[..];
assert_eq!(f(a), Error(error_position!(ErrorKind::NoneOf, a)));
let b = &b"cde"[..];
assert_eq!(f(b), Done(&b"de"[..], 'c'));
}
#[test]
fn char() {
named!(f<char>, char!('c'));
let a = &b"abcd"[..];
assert_eq!(f(a), Error(error_position!(ErrorKind::Char, a)));
let b = &b"cde"[..];
assert_eq!(f(b), Done(&b"de"[..], 'c'));
}
}