@ -1,7 +1,12 @@
#![ allow(dead_code) ]
#[ cfg(feature= " threads " ) ] use rayon ::prelude ::* ;
#[ cfg(feature= " threads " ) ] use rayon ::prelude ::* ;
#[ allow(unused_imports) ]
use std ::{
use std ::{
path ::Path ,
path ::Path ,
io , fs ::{ self , OpenOptions , } ,
io , fs ::{ self , OpenOptions , } ,
convert ::TryInto ,
} ;
} ;
use smallvec ::SmallVec ;
use smallvec ::SmallVec ;
use cfg_if ::cfg_if ;
use cfg_if ::cfg_if ;
@ -18,8 +23,9 @@ mod error;
use error ::ResultPrintExt as _ ;
use error ::ResultPrintExt as _ ;
mod map ;
mod map ;
use map ::MappedFile as _ ;
struct UnmatchError;
use error :: UnmatchError;
fn main ( ) {
fn main ( ) {
let ( map1 , rest ) = {
let ( map1 , rest ) = {
@ -34,15 +40,15 @@ fn main() {
std ::process ::exit ( {
std ::process ::exit ( {
if let Some ( map1 ) = map ::map ( & map1 ) . discard_msg ( format! ( "Failed to map file {}" , map1 ) ) {
if let Some ( map1 ) = map ::map ( & map1 ) . discard_msg ( format! ( "Failed to map file {}" , map1 ) ) {
let slice = map1 . as_slice ( ) ;
let slice = map1 . as_slice ( ) ;
#[ cfg(feature= " threads " ) ] let map1_sz : u64 = slice . len ( ) . try_into ( ) . expect ( "File size could not fit into u64. This should never happen." ) ; // For now, non-threaded mode doesn't use this.
let mut ok = true ;
let mut ok = true ;
let chk : SmallVec < [ _ ; 32 ] > = rest . filter_map ( | filename | {
let chk : SmallVec < [ _ ; 32 ] > = rest . filter_map ( | filename | {
let path = Path ::new ( & filename ) ;
let path = Path ::new ( & filename ) ;
if path . exists ( ) & & path . is_file ( ) {
if path . exists ( ) & & path . is_file ( ) {
map ::map ( path ) . discard_msg ( format! ( "Failed to map file {}" , filename ) )
map ::map ( path ) . discard_msg ( format! ( "Failed to map file {}" , filename ) )
. or_else ( | | { ok = false ; None } )
} else {
} else {
eprintln! ( "File {} does not exist or is not a normal file" , filename ) ;
eprintln! ( "File {} does not exist or is not a normal file" , filename ) ;
ok = false ;
ok = false ;
None
None
}
}
} ) . collect ( ) ;
} ) . collect ( ) ;
@ -55,24 +61,34 @@ fn main() {
if #[ cfg(feature= " threads " ) ] {
if #[ cfg(feature= " threads " ) ] {
match chk . into_par_iter ( )
match chk . into_par_iter ( )
. map ( | map | {
. map ( | map | {
if let Ok ( stat ) = map . as_file ( ) . metadata ( ) {
if stat . len ( ) ! = map1_sz {
return Err ( UnmatchError ::Size ) ;
}
if ! stat . is_file ( ) {
return Err ( UnmatchError ::Unknown ) ;
}
}
if slice = = map . as_slice ( ) {
if slice = = map . as_slice ( ) {
Ok ( ( ) )
Ok ( ( ) )
} else {
} else {
Err ( UnmatchError )
Err ( UnmatchError ::Data )
}
}
} )
} )
. try_reduce_with ( | _ , _ | Ok ( ( ) ) )
. try_reduce_with ( | _ , _ | Ok ( ( ) ) )
{
{
Some ( Ok ( _ ) ) = > 0 ,
Some ( Ok ( _ ) ) = > 0 ,
Some ( Err ( _ ) ) = > 1 ,
Some ( Err ( UnmatchError ::Data ) ) = > 1 ,
Some ( Err ( UnmatchError ::Size ) ) = > 2 ,
None = > usage ( ) ,
None = > usage ( ) ,
_ = > - 1 ,
}
}
} else {
} else {
match chk . into_iter ( )
match chk . into_iter ( )
. map ( | map | {
. map ( | map | {
slice = = map . as_slice ( )
slice = = map . as_slice ( )
} )
} )
. try_fold ( ( false , true ) , | ( _ , a ) , b | if a & & b { Ok ( ( true , true ) ) } else { Err ( UnmatchError ) } )
. try_fold ( ( false , true ) , | ( _ , a ) , b | if a & & b { Ok ( ( true , true ) ) } else { Err ( UnmatchError ::Data ) } )
{
{
Ok ( ( true , _ ) ) = > 0 ,
Ok ( ( true , _ ) ) = > 0 ,
Ok ( ( false , _ ) ) = > usage ( ) ,
Ok ( ( false , _ ) ) = > usage ( ) ,