77
88use clap:: { Arg , ArgAction , Command } ;
99use std:: fs:: File ;
10- use std:: io:: { Read , stdin} ;
10+ use std:: io:: { ErrorKind , Read , Write , stdin, stdout } ;
1111use std:: path:: Path ;
1212use uucore:: display:: Quotable ;
1313use uucore:: error:: { FromIo , UResult , USimpleError } ;
@@ -16,42 +16,46 @@ use uucore::{format_usage, help_about, help_usage, show};
1616const USAGE : & str = help_usage ! ( "sum.md" ) ;
1717const ABOUT : & str = help_about ! ( "sum.md" ) ;
1818
19- fn bsd_sum ( mut reader : Box < dyn Read > ) -> ( usize , u16 ) {
19+ fn bsd_sum ( mut reader : impl Read ) -> std :: io :: Result < ( usize , u16 ) > {
2020 let mut buf = [ 0 ; 4096 ] ;
2121 let mut bytes_read = 0 ;
2222 let mut checksum: u16 = 0 ;
2323 loop {
2424 match reader. read ( & mut buf) {
25- Ok ( n) if n != 0 => {
25+ Ok ( 0 ) => break ,
26+ Ok ( n) => {
2627 bytes_read += n;
27- for & byte in & buf[ ..n] {
28- checksum = checksum . rotate_right ( 1 ) ;
29- checksum = checksum . wrapping_add ( u16:: from ( byte) ) ;
30- }
28+ checksum = buf[ ..n] . iter ( ) . fold ( checksum , |acc , & byte| {
29+ let rotated = acc . rotate_right ( 1 ) ;
30+ rotated . wrapping_add ( u16:: from ( byte) )
31+ } ) ;
3132 }
32- _ => break ,
33+ Err ( e) if e. kind ( ) == ErrorKind :: Interrupted => continue ,
34+ Err ( e) => return Err ( e) ,
3335 }
3436 }
3537
3638 // Report blocks read in terms of 1024-byte blocks.
3739 let blocks_read = bytes_read. div_ceil ( 1024 ) ;
38- ( blocks_read, checksum)
40+ Ok ( ( blocks_read, checksum) )
3941}
4042
41- fn sysv_sum ( mut reader : Box < dyn Read > ) -> ( usize , u16 ) {
43+ fn sysv_sum ( mut reader : impl Read ) -> std :: io :: Result < ( usize , u16 ) > {
4244 let mut buf = [ 0 ; 4096 ] ;
4345 let mut bytes_read = 0 ;
4446 let mut ret = 0u32 ;
4547
4648 loop {
4749 match reader. read ( & mut buf) {
48- Ok ( n) if n != 0 => {
50+ Ok ( 0 ) => break ,
51+ Ok ( n) => {
4952 bytes_read += n;
50- for & byte in & buf[ ..n] {
51- ret = ret . wrapping_add ( u32 :: from ( byte ) ) ;
52- }
53+ ret = buf[ ..n]
54+ . iter ( )
55+ . fold ( ret , |acc , & byte| acc . wrapping_add ( u32 :: from ( byte ) ) ) ;
5356 }
54- _ => break ,
57+ Err ( e) if e. kind ( ) == ErrorKind :: Interrupted => continue ,
58+ Err ( e) => return Err ( e) ,
5559 }
5660 }
5761
@@ -60,7 +64,7 @@ fn sysv_sum(mut reader: Box<dyn Read>) -> (usize, u16) {
6064
6165 // Report blocks read in terms of 512-byte blocks.
6266 let blocks_read = bytes_read. div_ceil ( 512 ) ;
63- ( blocks_read, ret as u16 )
67+ Ok ( ( blocks_read, ret as u16 ) )
6468}
6569
6670fn open ( name : & str ) -> UResult < Box < dyn Read > > {
@@ -119,12 +123,13 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> {
119123 sysv_sum ( reader)
120124 } else {
121125 bsd_sum ( reader)
122- } ;
126+ } ? ;
123127
128+ let mut stdout = stdout ( ) . lock ( ) ;
124129 if print_names {
125- println ! ( "{sum:0width$} {blocks:width$} {file}" ) ;
130+ writeln ! ( stdout , "{sum:0width$} {blocks:width$} {file}" ) ? ;
126131 } else {
127- println ! ( "{sum:0width$} {blocks:width$}" ) ;
132+ writeln ! ( stdout , "{sum:0width$} {blocks:width$}" ) ? ;
128133 }
129134 }
130135 Ok ( ( ) )
0 commit comments