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_rules! _durandal_read_impl {
// big endian
(BE $b:ident $nam:ident u16 $n:expr) => {
_durandal_read_impl!($b u16::from_be_bytes, $nam 2 $n);
(BE $b:expr; $nam:ident u16 $n:expr) => {
_durandal_read_impl!($b; u16::from_be_bytes, $nam 2 $n);
};
(BE $b:ident $nam:ident i16 $n:expr) => {
_durandal_read_impl!($b i16::from_be_bytes, $nam 2 $n);
(BE $b:expr; $nam:ident i16 $n:expr) => {
_durandal_read_impl!($b; i16::from_be_bytes, $nam 2 $n);
};
(BE $b:ident $nam:ident u32 $n:expr) => {
_durandal_read_impl!($b u32::from_be_bytes, $nam 4 $n);
(BE $b:expr; $nam:ident u32 $n:expr) => {
_durandal_read_impl!($b; u32::from_be_bytes, $nam 4 $n);
};
(BE $b:ident $nam:ident i32 $n:expr) => {
_durandal_read_impl!($b i32::from_be_bytes, $nam 4 $n);
(BE $b:expr; $nam:ident i32 $n:expr) => {
_durandal_read_impl!($b; i32::from_be_bytes, $nam 4 $n);
};
// little endian
(LE $b:ident $nam:ident u16 $n:expr) => {
_durandal_read_impl!($b u16::from_le_bytes, $nam 2 $n);
(LE $b:expr; $nam:ident u16 $n:expr) => {
_durandal_read_impl!($b; u16::from_le_bytes, $nam 2 $n);
};
(LE $b:ident $nam:ident i16 $n:expr) => {
_durandal_read_impl!($b i16::from_le_bytes, $nam 2 $n);
(LE $b:expr; $nam:ident i16 $n:expr) => {
_durandal_read_impl!($b; i16::from_le_bytes, $nam 2 $n);
};
(LE $b:ident $nam:ident u32 $n:expr) => {
_durandal_read_impl!($b u32::from_le_bytes, $nam 4 $n);
(LE $b:expr; $nam:ident u32 $n:expr) => {
_durandal_read_impl!($b; u32::from_le_bytes, $nam 4 $n);
};
(LE $b:ident $nam:ident i32 $n:expr) => {
_durandal_read_impl!($b i32::from_le_bytes, $nam 4 $n);
(LE $b:expr; $nam:ident i32 $n:expr) => {
_durandal_read_impl!($b; i32::from_le_bytes, $nam 4 $n);
};
// either endianness
($e:ident $b:ident $nam:ident Angle $n:expr) => {
_durandal_read_impl!($e $b $nam u16 $n);
($e:ident $b:expr; $nam:ident Angle $n:expr) => {
_durandal_read_impl!($e $b; $nam u16 $n);
let $nam = Angle::from_bits($nam);
};
($e:ident $b:ident $nam:ident Fixed $n:expr) => {
_durandal_read_impl!($e $b $nam u32 $n);
($e:ident $b:expr; $nam:ident Fixed $n:expr) => {
_durandal_read_impl!($e $b; $nam u32 $n);
let $nam = Fixed::from_bits($nam);
};
($e:ident $b:ident $nam:ident Unit $n:expr) => {
_durandal_read_impl!($e $b $nam u16 $n);
($e:ident $b:expr; $nam:ident Unit $n:expr) => {
_durandal_read_impl!($e $b; $nam u16 $n);
let $nam = Unit::from_bits($nam);
};
($e:ident $b:ident $nam:ident OptU16 $n:expr) => {
_durandal_read_impl!($e $b $nam u16 $n);
($e:ident $b:expr; $nam:ident OptU16 $n:expr) => {
_durandal_read_impl!($e $b; $nam u16 $n);
let $nam = OptU16::from_repr($nam);
};
($e:ident $b:ident $nam:ident usize u16 $n:expr) => {
_durandal_read_impl!($e $b $nam u16 $n);
($e:ident $b:expr; $nam:ident usize u16 $n:expr) => {
_durandal_read_impl!($e $b; $nam u16 $n);
let $nam = usize::from($nam);
};
($e:ident $b:ident $nam:ident usize u32 $n:expr) => {
_durandal_read_impl!($e $b $nam u32 $n);
($e:ident $b:expr; $nam:ident usize u32 $n:expr) => {
_durandal_read_impl!($e $b; $nam u32 $n);
let $nam = usize_from_u32($nam);
};
// no endianness
($_:ident $b:ident $nam:ident u8 $n:expr) => {let $nam = $b[$n];};
($_:ident $b:ident $nam:ident slice u8 $n:expr) => {let $nam = &$b[$n];};
($_:ident $b:ident $nam:ident i8 $n:expr) => {
($_:ident $b:expr; $nam:ident u8 $n:expr) => {let $nam = $b[$n];};
($_:ident $b:expr; $nam:ident slice u8 $n:expr) => {let $nam = &$b[$n];};
($_:ident $b:expr; $nam:ident i8 $n:expr) => {
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]]);
};
($_:ident $b:ident $nam:ident $f:ident $n:expr) => {
($_:ident $b:expr; $nam:ident $f:ident $n:expr) => {
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]);
};
// 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]]);
};
($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]]);
};
}
@ -159,11 +159,11 @@ macro_rules! _durandal_read_impl {
#[macro_export]
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 )* ; )*
) => {
$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_rules! check_data {
(
$sz:expr , $b:ident
$sz:expr , $b:expr
) => {
if $b.len() < $sz {
return Err(err_msg("not enough data"));