diff --git a/src/uu/nl/locales/en-US.ftl b/src/uu/nl/locales/en-US.ftl index 13ae5977ebb..b23c5965edd 100644 --- a/src/uu/nl/locales/en-US.ftl +++ b/src/uu/nl/locales/en-US.ftl @@ -31,6 +31,7 @@ nl-help-number-width = use NUMBER columns for line numbers # Error messages nl-error-invalid-arguments = Invalid arguments supplied. nl-error-could-not-read-line = could not read line +nl-error-could-not-write = could not write output nl-error-line-number-overflow = line number overflow nl-error-invalid-line-width = Invalid line number field width: ‘{ $value }’: Numerical result out of range nl-error-invalid-regex = invalid regular expression diff --git a/src/uu/nl/locales/fr-FR.ftl b/src/uu/nl/locales/fr-FR.ftl index 09ed4f4adf9..487f7b581f8 100644 --- a/src/uu/nl/locales/fr-FR.ftl +++ b/src/uu/nl/locales/fr-FR.ftl @@ -31,6 +31,7 @@ nl-help-number-width = utiliser NUMBER colonnes pour les numéros de ligne # Messages d'erreur nl-error-invalid-arguments = Arguments fournis invalides. nl-error-could-not-read-line = impossible de lire la ligne +nl-error-could-not-write = impossible d'écrire la sortie nl-error-line-number-overflow = débordement du numéro de ligne nl-error-invalid-line-width = Largeur de champ de numéro de ligne invalide : ‘{ $value }’ : Résultat numérique hors limites nl-error-invalid-regex = expression régulière invalide diff --git a/src/uu/nl/src/nl.rs b/src/uu/nl/src/nl.rs index 261d7897fad..e94fa847db2 100644 --- a/src/uu/nl/src/nl.rs +++ b/src/uu/nl/src/nl.rs @@ -6,7 +6,7 @@ use clap::{Arg, ArgAction, Command}; use std::ffi::{OsStr, OsString}; use std::fs::File; -use std::io::{BufRead, BufReader, Read, stdin}; +use std::io::{BufRead, BufReader, BufWriter, Read, Write, stdin, stdout}; use std::path::Path; use uucore::error::{FromIo, UResult, USimpleError, set_exit_code}; use uucore::{format_usage, show_error, translate}; @@ -346,6 +346,7 @@ pub fn uu_app() -> Command { /// `nl` implements the main functionality for an individual buffer. fn nl(reader: &mut BufReader, stats: &mut Stats, settings: &Settings) -> UResult<()> { + let mut writer = BufWriter::new(stdout()); let mut current_numbering_style = &settings.body_numbering; let mut line = Vec::new(); @@ -382,7 +383,7 @@ fn nl(reader: &mut BufReader, stats: &mut Stats, settings: &Settings if settings.renumber { stats.line_number = Some(settings.starting_line_number); } - println!(); + writeln!(writer).map_err_context(|| translate!("nl-error-could-not-write"))?; } else { let is_line_numbered = match current_numbering_style { // consider $join_blank_lines consecutive empty lines to be one logical line @@ -407,14 +408,16 @@ fn nl(reader: &mut BufReader, stats: &mut Stats, settings: &Settings translate!("nl-error-line-number-overflow"), )); }; - println!( + writeln!( + writer, "{}{}{}", settings .number_format .format(line_number, settings.number_width), settings.number_separator.to_string_lossy(), String::from_utf8_lossy(&line), - ); + ) + .map_err_context(|| translate!("nl-error-could-not-write"))?; // update line number for the potential next line match line_number.checked_add(settings.line_increment) { Some(new_line_number) => stats.line_number = Some(new_line_number), @@ -422,10 +425,14 @@ fn nl(reader: &mut BufReader, stats: &mut Stats, settings: &Settings } } else { let spaces = " ".repeat(settings.number_width + 1); - println!("{spaces}{}", String::from_utf8_lossy(&line)); + writeln!(writer, "{spaces}{}", String::from_utf8_lossy(&line)) + .map_err_context(|| translate!("nl-error-could-not-write"))?; } } } + writer + .flush() + .map_err_context(|| translate!("nl-error-could-not-write"))?; Ok(()) }