@@ -117,52 +117,82 @@ where
117117 } ;
118118 // The BSD checksum output is 5 digit integer
119119 let bsd_width = 5 ;
120- match ( options. algo_name , not_file) {
121- ( ALGORITHM_OPTIONS_SYSV , true ) => println ! (
122- "{} {}" ,
123- sum. parse:: <u16 >( ) . unwrap( ) ,
124- div_ceil( sz, options. output_bits)
120+ let ( before_filename, print_filename, after_filename) = match ( options. algo_name , not_file)
121+ {
122+ ( ALGORITHM_OPTIONS_SYSV , true ) => (
123+ format ! (
124+ "{} {}" ,
125+ sum. parse:: <u16 >( ) . unwrap( ) ,
126+ div_ceil( sz, options. output_bits)
127+ ) ,
128+ false ,
129+ String :: new ( ) ,
125130 ) ,
126- ( ALGORITHM_OPTIONS_SYSV , false ) => println ! (
127- "{} {} {}" ,
128- sum. parse:: <u16 >( ) . unwrap( ) ,
129- div_ceil( sz, options. output_bits) ,
130- filename. display( )
131+ ( ALGORITHM_OPTIONS_SYSV , false ) => (
132+ format ! (
133+ "{} {} " ,
134+ sum. parse:: <u16 >( ) . unwrap( ) ,
135+ div_ceil( sz, options. output_bits)
136+ ) ,
137+ true ,
138+ String :: new ( ) ,
131139 ) ,
132- ( ALGORITHM_OPTIONS_BSD , true ) => println ! (
133- "{:0bsd_width$} {:bsd_width$}" ,
134- sum. parse:: <u16 >( ) . unwrap( ) ,
135- div_ceil( sz, options. output_bits)
140+ ( ALGORITHM_OPTIONS_BSD , true ) => (
141+ format ! (
142+ "{:0bsd_width$} {:bsd_width$}" ,
143+ sum. parse:: <u16 >( ) . unwrap( ) ,
144+ div_ceil( sz, options. output_bits)
145+ ) ,
146+ false ,
147+ String :: new ( ) ,
136148 ) ,
137- ( ALGORITHM_OPTIONS_BSD , false ) => println ! (
138- "{:0bsd_width$} {:bsd_width$} {}" ,
139- sum. parse:: <u16 >( ) . unwrap( ) ,
140- div_ceil( sz, options. output_bits) ,
141- filename. display( )
149+ ( ALGORITHM_OPTIONS_BSD , false ) => (
150+ format ! (
151+ "{:0bsd_width$} {:bsd_width$} " ,
152+ sum. parse:: <u16 >( ) . unwrap( ) ,
153+ div_ceil( sz, options. output_bits) ,
154+ ) ,
155+ true ,
156+ String :: new ( ) ,
142157 ) ,
143- ( ALGORITHM_OPTIONS_CRC , true ) => println ! ( "{sum} {sz}" ) ,
144- ( ALGORITHM_OPTIONS_CRC , false ) => println ! ( "{sum} {sz} {}" , filename . display ( ) ) ,
158+ ( ALGORITHM_OPTIONS_CRC , true ) => ( format ! ( "{sum} {sz}" ) , false , String :: new ( ) ) ,
159+ ( ALGORITHM_OPTIONS_CRC , false ) => ( format ! ( "{sum} {sz} " ) , true , String :: new ( ) ) ,
145160 ( ALGORITHM_OPTIONS_BLAKE2B , _) if options. tag => {
146- if let Some ( length) = options. length {
147- // Multiply by 8 here, as we want to print the length in bits.
148- println ! ( "BLAKE2b-{} ({}) = {sum}" , length * 8 , filename. display( ) ) ;
149- } else {
150- println ! ( "BLAKE2b ({}) = {sum}" , filename. display( ) ) ;
151- }
161+ (
162+ if let Some ( length) = options. length {
163+ // Multiply by 8 here, as we want to print the length in bits.
164+ format ! ( "BLAKE2b-{} (" , length * 8 )
165+ } else {
166+ format ! ( "BLAKE2b (" )
167+ } ,
168+ true ,
169+ format ! ( ") = {sum}" ) ,
170+ )
152171 }
153172 _ => {
154173 if options. tag {
155- println ! (
156- "{} ({}) = {sum}" ,
157- options . algo_name . to_ascii_uppercase ( ) ,
158- filename . display ( )
159- ) ;
174+ (
175+ format ! ( "{} (" , options . algo_name . to_ascii_uppercase ( ) ) ,
176+ true ,
177+ format ! ( ") = {sum}" )
178+ )
160179 } else {
161180 let prefix = if options. asterisk { "*" } else { " " } ;
162- println ! ( "{sum} {prefix}{}" , filename. display( ) ) ;
181+ (
182+ format ! ( "{sum} {prefix}" ) ,
183+ true ,
184+ String :: new ( )
185+ )
163186 }
164187 }
188+ } ;
189+ print ! ( "{}" , before_filename) ;
190+ if print_filename {
191+ // The filename might not be valid UTF-8, and filename.display() would mangle the names.
192+ // Therefore, emit the bytes directly to stdout, without any attempt at encoding them.
193+ stdout ( ) . write ( filename. as_os_str ( ) . as_encoded_bytes ( ) ) . expect ( "FIXME" ) ;
165194 }
195+ println ! ( "{}" , after_filename) ;
166196 }
167197
168198 Ok ( ( ) )
0 commit comments