make read_data use expr for $b

png-branch
an 2019-03-12 16:28:24 -04:00
parent 119a45310d
commit 1eb7088a8b
1 changed files with 39 additions and 39 deletions

View File

@ -7,80 +7,80 @@ use std::{fmt, num::NonZeroU16};
#[macro_export] #[macro_export]
macro_rules! _durandal_read_impl { macro_rules! _durandal_read_impl {
// big endian // big endian
(BE $b:ident $nam:ident u16 $n:expr) => { (BE $b:expr; $nam:ident u16 $n:expr) => {
_durandal_read_impl!($b u16::from_be_bytes, $nam 2 $n); _durandal_read_impl!($b; u16::from_be_bytes, $nam 2 $n);
}; };
(BE $b:ident $nam:ident i16 $n:expr) => { (BE $b:expr; $nam:ident i16 $n:expr) => {
_durandal_read_impl!($b i16::from_be_bytes, $nam 2 $n); _durandal_read_impl!($b; i16::from_be_bytes, $nam 2 $n);
}; };
(BE $b:ident $nam:ident u32 $n:expr) => { (BE $b:expr; $nam:ident u32 $n:expr) => {
_durandal_read_impl!($b u32::from_be_bytes, $nam 4 $n); _durandal_read_impl!($b; u32::from_be_bytes, $nam 4 $n);
}; };
(BE $b:ident $nam:ident i32 $n:expr) => { (BE $b:expr; $nam:ident i32 $n:expr) => {
_durandal_read_impl!($b i32::from_be_bytes, $nam 4 $n); _durandal_read_impl!($b; i32::from_be_bytes, $nam 4 $n);
}; };
// little endian // little endian
(LE $b:ident $nam:ident u16 $n:expr) => { (LE $b:expr; $nam:ident u16 $n:expr) => {
_durandal_read_impl!($b u16::from_le_bytes, $nam 2 $n); _durandal_read_impl!($b; u16::from_le_bytes, $nam 2 $n);
}; };
(LE $b:ident $nam:ident i16 $n:expr) => { (LE $b:expr; $nam:ident i16 $n:expr) => {
_durandal_read_impl!($b i16::from_le_bytes, $nam 2 $n); _durandal_read_impl!($b; i16::from_le_bytes, $nam 2 $n);
}; };
(LE $b:ident $nam:ident u32 $n:expr) => { (LE $b:expr; $nam:ident u32 $n:expr) => {
_durandal_read_impl!($b u32::from_le_bytes, $nam 4 $n); _durandal_read_impl!($b; u32::from_le_bytes, $nam 4 $n);
}; };
(LE $b:ident $nam:ident i32 $n:expr) => { (LE $b:expr; $nam:ident i32 $n:expr) => {
_durandal_read_impl!($b i32::from_le_bytes, $nam 4 $n); _durandal_read_impl!($b; i32::from_le_bytes, $nam 4 $n);
}; };
// either endianness // either endianness
($e:ident $b:ident $nam:ident Angle $n:expr) => { ($e:ident $b:expr; $nam:ident Angle $n:expr) => {
_durandal_read_impl!($e $b $nam u16 $n); _durandal_read_impl!($e $b; $nam u16 $n);
let $nam = Angle::from_bits($nam); let $nam = Angle::from_bits($nam);
}; };
($e:ident $b:ident $nam:ident Fixed $n:expr) => { ($e:ident $b:expr; $nam:ident Fixed $n:expr) => {
_durandal_read_impl!($e $b $nam u32 $n); _durandal_read_impl!($e $b; $nam u32 $n);
let $nam = Fixed::from_bits($nam); let $nam = Fixed::from_bits($nam);
}; };
($e:ident $b:ident $nam:ident Unit $n:expr) => { ($e:ident $b:expr; $nam:ident Unit $n:expr) => {
_durandal_read_impl!($e $b $nam u16 $n); _durandal_read_impl!($e $b; $nam u16 $n);
let $nam = Unit::from_bits($nam); let $nam = Unit::from_bits($nam);
}; };
($e:ident $b:ident $nam:ident OptU16 $n:expr) => { ($e:ident $b:expr; $nam:ident OptU16 $n:expr) => {
_durandal_read_impl!($e $b $nam u16 $n); _durandal_read_impl!($e $b; $nam u16 $n);
let $nam = OptU16::from_repr($nam); let $nam = OptU16::from_repr($nam);
}; };
($e:ident $b:ident $nam:ident usize u16 $n:expr) => { ($e:ident $b:expr; $nam:ident usize u16 $n:expr) => {
_durandal_read_impl!($e $b $nam u16 $n); _durandal_read_impl!($e $b; $nam u16 $n);
let $nam = usize::from($nam); let $nam = usize::from($nam);
}; };
($e:ident $b:ident $nam:ident usize u32 $n:expr) => { ($e:ident $b:expr; $nam:ident usize u32 $n:expr) => {
_durandal_read_impl!($e $b $nam u32 $n); _durandal_read_impl!($e $b; $nam u32 $n);
let $nam = usize_from_u32($nam); let $nam = usize_from_u32($nam);
}; };
// no endianness // no endianness
($_:ident $b:ident $nam:ident u8 $n:expr) => {let $nam = $b[$n];}; ($_:ident $b:expr; $nam:ident u8 $n:expr) => {let $nam = $b[$n];};
($_:ident $b:ident $nam:ident slice u8 $n:expr) => {let $nam = &$b[$n];}; ($_:ident $b:expr; $nam:ident slice u8 $n:expr) => {let $nam = &$b[$n];};
($_:ident $b:ident $nam:ident i8 $n:expr) => { ($_:ident $b:expr; $nam:ident i8 $n:expr) => {
let $nam = i8::from_ne_bytes([$b[$n]]); let $nam = i8::from_ne_bytes([$b[$n]]);
}; };
($_:ident $b:ident $nam:ident Ident $n:expr) => { ($_:ident $b:expr; $nam:ident Ident $n:expr) => {
let $nam = Ident([$b[$n], $b[$n + 1], $b[$n + 2], $b[$n + 3]]); let $nam = Ident([$b[$n], $b[$n + 1], $b[$n + 2], $b[$n + 3]]);
}; };
($_:ident $b:ident $nam:ident $f:ident $n:expr) => { ($_:ident $b:expr; $nam:ident $f:ident $n:expr) => {
let $nam = $f(&$b[$n])?; let $nam = $f(&$b[$n])?;
}; };
($_:ident $b:ident $nam:ident no_try $f:ident $n:expr) => { ($_:ident $b:expr; $nam:ident no_try $f:ident $n:expr) => {
let $nam = $f(&$b[$n]); let $nam = $f(&$b[$n]);
}; };
// worker - creates let statement // worker - creates let statement
($b:ident $pth:path , $nam:ident 2 $n:expr) => { ($b:expr; $pth:path , $nam:ident 2 $n:expr) => {
let $nam = $pth([$b[$n], $b[$n + 1]]); let $nam = $pth([$b[$n], $b[$n + 1]]);
}; };
($b:ident $pth:path , $nam:ident 4 $n:expr) => { ($b:expr; $pth:path , $nam:ident 4 $n:expr) => {
let $nam = $pth([$b[$n], $b[$n + 1], $b[$n + 2], $b[$n + 3]]); let $nam = $pth([$b[$n], $b[$n + 1], $b[$n + 2], $b[$n + 3]]);
}; };
} }
@ -159,11 +159,11 @@ macro_rules! _durandal_read_impl {
#[macro_export] #[macro_export]
macro_rules! read_data { macro_rules! read_data {
( (
$sz:expr , $ty:ident in $b:ident => $sz:expr , $ty:ident in $b:expr =>
$( $nam:ident = $t:ident [ $n:expr ] $( $ex:ident )* ; )* $( $nam:ident = $t:ident [ $n:expr ] $( $ex:ident )* ; )*
) => { ) => {
$crate::check_data!($sz, $b); $crate::check_data!($sz, $b);
$($crate::_durandal_read_impl!($ty $b $nam $($ex)* $t $n);)* $($crate::_durandal_read_impl!($ty $b; $nam $($ex)* $t $n);)*
}; };
} }
@ -171,7 +171,7 @@ macro_rules! read_data {
#[macro_export] #[macro_export]
macro_rules! check_data { macro_rules! check_data {
( (
$sz:expr , $b:ident $sz:expr , $b:expr
) => { ) => {
if $b.len() < $sz { if $b.len() < $sz {
return Err(err_msg("not enough data")); return Err(err_msg("not enough data"));