66use clap:: { Arg , ArgAction , Command } ;
77use std:: ffi:: { OsStr , OsString } ;
88use std:: fs:: File ;
9- use std:: io:: { BufRead , BufReader , Read , stdin} ;
9+ use std:: io:: { BufRead , BufReader , BufWriter , Read , Write , stdin, stdout } ;
1010use std:: path:: Path ;
1111use uucore:: error:: { FromIo , UResult , USimpleError , set_exit_code} ;
1212use uucore:: { format_usage, show_error, translate} ;
@@ -346,6 +346,7 @@ pub fn uu_app() -> Command {
346346
347347/// `nl` implements the main functionality for an individual buffer.
348348fn nl < T : Read > ( reader : & mut BufReader < T > , stats : & mut Stats , settings : & Settings ) -> UResult < ( ) > {
349+ let mut writer = BufWriter :: new ( stdout ( ) ) ;
349350 let mut current_numbering_style = & settings. body_numbering ;
350351 let mut line = Vec :: new ( ) ;
351352
@@ -382,7 +383,7 @@ fn nl<T: Read>(reader: &mut BufReader<T>, stats: &mut Stats, settings: &Settings
382383 if settings. renumber {
383384 stats. line_number = Some ( settings. starting_line_number ) ;
384385 }
385- println ! ( ) ;
386+ writeln ! ( writer ) . map_err_context ( || translate ! ( "nl-error-could-not-write" ) ) ? ;
386387 } else {
387388 let is_line_numbered = match current_numbering_style {
388389 // consider $join_blank_lines consecutive empty lines to be one logical line
@@ -407,25 +408,31 @@ fn nl<T: Read>(reader: &mut BufReader<T>, stats: &mut Stats, settings: &Settings
407408 translate ! ( "nl-error-line-number-overflow" ) ,
408409 ) ) ;
409410 } ;
410- println ! (
411+ writeln ! (
412+ writer,
411413 "{}{}{}" ,
412414 settings
413415 . number_format
414416 . format( line_number, settings. number_width) ,
415417 settings. number_separator. to_string_lossy( ) ,
416418 String :: from_utf8_lossy( & line) ,
417- ) ;
419+ )
420+ . map_err_context ( || translate ! ( "nl-error-could-not-write" ) ) ?;
418421 // update line number for the potential next line
419422 match line_number. checked_add ( settings. line_increment ) {
420423 Some ( new_line_number) => stats. line_number = Some ( new_line_number) ,
421424 None => stats. line_number = None , // overflow
422425 }
423426 } else {
424427 let spaces = " " . repeat ( settings. number_width + 1 ) ;
425- println ! ( "{spaces}{}" , String :: from_utf8_lossy( & line) ) ;
428+ writeln ! ( writer, "{spaces}{}" , String :: from_utf8_lossy( & line) )
429+ . map_err_context ( || translate ! ( "nl-error-could-not-write" ) ) ?;
426430 }
427431 }
428432 }
433+ writer
434+ . flush ( )
435+ . map_err_context ( || translate ! ( "nl-error-could-not-write" ) ) ?;
429436 Ok ( ( ) )
430437}
431438
0 commit comments