macro_rules! collect_digits16 {
($context:expr, $error:expr, $digit:expr, $max:expr, $on_eos:expr) => ({
bs_collect_digits32!($context, $digit,
if $digit > $max {
return Err($error($context.byte));
},
return Err($error($context.byte)),
$on_eos
);
});
}
macro_rules! collect_field {
($context:expr, $error:expr, $stop:expr, $byte_error:expr, $on_eos:expr) => ({
bs_collect!($context, {
if $stop {
break;
} else if $context.byte > 0x1F && $context.byte < 0x7F && !$byte_error {
continue;
} else {
return Err($error($context.byte));
}
},
$on_eos
);
});
($context:expr, $error:expr, $stop:expr, $on_eos:expr) => ({
bs_collect!($context, {
if $stop {
break;
} else if $context.byte > 0x1F && $context.byte < 0x7F {
continue;
}
return Err($error($context.byte));
},
$on_eos
);
});
}
macro_rules! collect_field_iter {
($iter:expr, $context:expr, $error:expr, $stop:expr, $byte_error:expr, $on_eos:expr) => ({
bs_collect!($context, {
if $stop {
break;
} else if $context.byte > 0x1F && $context.byte < 0x7F && !$byte_error {
continue;
} else {
bs_jump!($context, bs_available!($context));
(*$iter.on_error)($error($context.byte));
return None;
}
},
$on_eos
);
});
($iter:expr, $context:expr, $error:expr, $stop:expr, $on_eos:expr) => ({
bs_collect!($context, {
if $stop {
break;
} else if $context.byte > 0x1F && $context.byte < 0x7F {
continue;
}
bs_jump!($context, bs_available!($context));
(*$iter.on_error)($error($context.byte));
return None;
},
$on_eos
);
});
}
macro_rules! collect_hex64 {
($context:expr, $error:expr, $digit:expr, $ty:ty, $on_eos:expr) => ({
bs_collect_hex64!($context, $digit, {}, return Err($error), $on_eos, $ty);
});
}
macro_rules! collect_quoted {
($context:expr, $error:expr, $byte_error:expr, $on_eos:expr) => ({
bs_collect!($context,
if $context.byte == b'"' || $context.byte == b'\\' {
break;
} else if is_visible_7bit!($context.byte) || $context.byte == b' ' || !$byte_error {
continue;
} else {
return Err($error($context.byte));
},
$on_eos
);
});
($context:expr, $error:expr, $on_eos:expr) => ({
bs_collect!($context,
if $context.byte == b'"' || $context.byte == b'\\' {
break;
} else if is_visible_7bit!($context.byte) || $context.byte == b' ' {
continue;
} else {
return Err($error($context.byte));
},
$on_eos
);
});
}
macro_rules! collect_quoted_iter {
($iter:expr, $context:expr, $error:expr, $byte_error:expr, $on_eos:expr) => ({
bs_collect!($context,
if $context.byte == b'"' || $context.byte == b'\\' {
break;
} else if is_visible_7bit!($context.byte) || $context.byte == b' ' || !$byte_error {
continue;
} else {
bs_jump!($context, bs_available!($context));
(*$iter.on_error)($error($context.byte));
return None;
},
$on_eos
);
});
($iter:expr, $context:expr, $error:expr, $on_eos:expr) => ({
bs_collect!($context,
if $context.byte == b'"' || $context.byte == b'\\' {
break;
} else if is_visible_7bit!($context.byte) || $context.byte == b' ' {
continue;
} else {
bs_jump!($context, bs_available!($context));
(*$iter.on_error)($error($context.byte));
return None;
},
$on_eos
);
});
}
macro_rules! collect_tokens {
($context:expr, $error:expr, $stop:expr, $on_eos:expr) => ({
bs_collect!($context,
if $stop {
break;
} else if is_token($context.byte) {
continue;
} else {
return Err($error($context.byte));
},
$on_eos
);
});
($context:expr, $error:expr, $on_eos:expr) => ({
bs_collect!($context,
if is_token($context.byte) {
continue;
} else {
return Err($error($context.byte));
},
$on_eos
);
});
}
macro_rules! collect_tokens_iter {
($iter:expr, $context:expr, $error:expr, $stop:expr, $on_eos:expr) => ({
bs_collect!($context,
if $stop {
break;
} else if is_token($context.byte) {
continue;
} else {
bs_jump!($context, bs_available!($context));
(*$iter.on_error)($error($context.byte));
return None;
},
$on_eos
);
});
($iter:expr, $context:expr, $error:expr, $on_eos:expr) => ({
bs_collect!($context,
if is_token($context.byte) {
continue;
} else {
bs_jump!($context, bs_available!($context));
(*$iter.on_error)($error($context.byte));
return None;
},
$on_eos
);
});
}
macro_rules! collect_visible {
($context:expr, $error:expr, $stop:expr, $on_eos:expr) => ({
bs_collect!($context,
if $stop {
break;
} else if is_not_visible_7bit!($context.byte) {
return Err($error($context.byte));
},
$on_eos
);
});
($context:expr, $error:expr, $on_eos:expr) => ({
bs_collect!($context,
if is_not_visible_7bit!($context.byte) {
return Err($error($context.byte));
},
$on_eos
);
});
}
macro_rules! collect_visible_iter {
($iter:expr, $context:expr, $error:expr, $stop:expr, $on_eos:expr) => ({
bs_collect!($context,
if $stop {
break;
} else if is_not_visible_7bit!($context.byte) {
bs_jump!($context, bs_available!($context));
(*$iter.on_error)($error($context.byte));
return None;
},
$on_eos
);
});
($iter:expr, $context:expr, $error:expr, $on_eos:expr) => ({
bs_collect!($context,
if is_not_visible_7bit!($context.byte) {
bs_jump!($context, bs_available!($context));
(*$iter.on_error)($error($context.byte));
return None;
},
$on_eos
);
});
}
macro_rules! consume_empty_space {
($context:expr, $on_eos:expr) => ({
if bs_is_eos!($context) {
$on_eos
}
if bs_starts_with1!($context, b"\r") || bs_starts_with1!($context, b"\n")
|| bs_starts_with1!($context, b" ") || bs_starts_with1!($context, b"\t") {
loop {
if bs_is_eos!($context) {
$on_eos
}
bs_next!($context);
if $context.byte == b'\r' || $context.byte == b'\n'
|| $context.byte == b' ' || $context.byte == b'\t' {
continue;
} else {
bs_replay!($context);
break;
}
}
}
});
}
macro_rules! consume_linear_space {
($context:expr, $on_eos:expr) => ({
if bs_is_eos!($context) {
$on_eos
}
if bs_starts_with1!($context, b" ") || bs_starts_with1!($context, b"\t") {
loop {
if bs_is_eos!($context) {
$on_eos
}
bs_next!($context);
if $context.byte == b' ' || $context.byte == b'\t' {
continue;
} else {
bs_replay!($context);
break;
}
}
}
});
}
macro_rules! consume_spaces {
($context:expr, $on_eos:expr) => ({
if bs_is_eos!($context) {
$on_eos
}
if bs_starts_with1!($context, b" ") {
loop {
if bs_is_eos!($context) {
$on_eos
}
bs_next!($context);
if $context.byte == b' ' {
continue;
} else {
bs_replay!($context);
break;
}
}
}
});
}