blob: 13ae44d9380a2e1bd3e7b0fdf60697b9378ae1dd [file] [log] [blame]
David Tolnay6b7aaf02016-09-04 10:39:25 -07001// Copied from nom master:
2// https://github.com/Geal/nom/blob/a38188f333c29d00c32a3082bec5491d2eefa33f/src/sequence.rs#L591-L687
3// Will be released in nom 2.0.
4
David Tolnay9d8f1972016-09-04 11:58:48 -07005#![cfg(feature = "parsing")]
6
David Tolnay6b7aaf02016-09-04 10:39:25 -07007#[macro_export]
David Tolnay29230372016-09-07 08:25:41 -07008#[doc(hidden)]
David Tolnay6b7aaf02016-09-04 10:39:25 -07009macro_rules! do_parse (
10 ($i:expr, $($rest:tt)*) => (
11 {
12 do_parse_impl!($i, 0usize, $($rest)*)
13 }
14 );
15);
16
17/// Internal parser, do not use directly
18#[doc(hidden)]
19#[macro_export]
20macro_rules! do_parse_impl (
21
22 ($i:expr, $consumed:expr, ( $($rest:expr),* )) => (
23 ::nom::IResult::Done($i, ( $($rest),* ))
24 );
25
26 ($i:expr, $consumed:expr, $e:ident >> $($rest:tt)*) => (
27 do_parse_impl!($i, $consumed, call!($e) >> $($rest)*);
28 );
29 ($i:expr, $consumed:expr, $submac:ident!( $($args:tt)* ) >> $($rest:tt)*) => (
30 {
31 match $submac!($i, $($args)*) {
32 ::nom::IResult::Error(e) => ::nom::IResult::Error(e),
33 ::nom::IResult::Incomplete(::nom::Needed::Unknown) =>
34 ::nom::IResult::Incomplete(::nom::Needed::Unknown),
35 ::nom::IResult::Incomplete(::nom::Needed::Size(i)) =>
36 ::nom::IResult::Incomplete(::nom::Needed::Size($consumed + i)),
37 ::nom::IResult::Done(i,_) => {
38 do_parse_impl!(i,
39 $consumed + (::nom::InputLength::input_len(&($i)) -
40 ::nom::InputLength::input_len(&i)), $($rest)*)
41 },
42 }
43 }
44 );
45
46 ($i:expr, $consumed:expr, $field:ident : $e:ident >> $($rest:tt)*) => (
47 do_parse_impl!($i, $consumed, $field: call!($e) >> $($rest)*);
48 );
49
50 ($i:expr, $consumed:expr, $field:ident : $submac:ident!( $($args:tt)* ) >> $($rest:tt)*) => (
51 {
52 match $submac!($i, $($args)*) {
53 ::nom::IResult::Error(e) => ::nom::IResult::Error(e),
54 ::nom::IResult::Incomplete(::nom::Needed::Unknown) =>
55 ::nom::IResult::Incomplete(::nom::Needed::Unknown),
56 ::nom::IResult::Incomplete(::nom::Needed::Size(i)) =>
57 ::nom::IResult::Incomplete(::nom::Needed::Size($consumed + i)),
58 ::nom::IResult::Done(i,o) => {
59 let $field = o;
60 do_parse_impl!(i,
61 $consumed + (::nom::InputLength::input_len(&($i)) -
62 ::nom::InputLength::input_len(&i)), $($rest)*)
63 },
64 }
65 }
66 );
67
68 // ending the chain
69 ($i:expr, $consumed:expr, $e:ident >> ( $($rest:tt)* )) => (
70 do_parse_impl!($i, $consumed, call!($e) >> ( $($rest)* ));
71 );
72
73 ($i:expr, $consumed:expr, $submac:ident!( $($args:tt)* ) >> ( $($rest:tt)* )) => (
74 match $submac!($i, $($args)*) {
75 ::nom::IResult::Error(e) => ::nom::IResult::Error(e),
76 ::nom::IResult::Incomplete(::nom::Needed::Unknown) =>
77 ::nom::IResult::Incomplete(::nom::Needed::Unknown),
78 ::nom::IResult::Incomplete(::nom::Needed::Size(i)) =>
79 ::nom::IResult::Incomplete(::nom::Needed::Size($consumed + i)),
80 ::nom::IResult::Done(i,_) => {
81 ::nom::IResult::Done(i, ( $($rest)* ))
82 },
83 }
84 );
85
86 ($i:expr, $consumed:expr, $field:ident : $e:ident >> ( $($rest:tt)* )) => (
87 do_parse_impl!($i, $consumed, $field: call!($e) >> ( $($rest)* ) );
88 );
89
90 ($i:expr, $consumed:expr, $field:ident : $submac:ident!( $($args:tt)* ) >> ( $($rest:tt)* )) => (
91 match $submac!($i, $($args)*) {
92 ::nom::IResult::Error(e) => ::nom::IResult::Error(e),
93 ::nom::IResult::Incomplete(::nom::Needed::Unknown) =>
94 ::nom::IResult::Incomplete(::nom::Needed::Unknown),
95 ::nom::IResult::Incomplete(::nom::Needed::Size(i)) =>
96 ::nom::IResult::Incomplete(::nom::Needed::Size($consumed + i)),
97 ::nom::IResult::Done(i,o) => {
98 let $field = o;
99 ::nom::IResult::Done(i, ( $($rest)* ))
100 },
101 }
102 );
103
104);