Skip to content

Commit d8bdce0

Browse files
committed
nl: output number separator as bytes
not as lossy string
1 parent 3108c45 commit d8bdce0

File tree

2 files changed

+18
-16
lines changed

2 files changed

+18
-16
lines changed

src/uu/nl/src/nl.rs

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -409,16 +409,20 @@ fn nl<T: Read>(reader: &mut BufReader<T>, stats: &mut Stats, settings: &Settings
409409
translate!("nl-error-line-number-overflow"),
410410
));
411411
};
412-
writeln!(
413-
writer,
414-
"{}{}{}",
415-
settings
416-
.number_format
417-
.format(line_number, settings.number_width),
418-
settings.number_separator.to_string_lossy(),
419-
String::from_utf8_lossy(&line),
420-
)
421-
.map_err_context(|| translate!("nl-error-could-not-write"))?;
412+
let mut buf = settings
413+
.number_format
414+
.format(line_number, settings.number_width)
415+
.as_bytes()
416+
.to_vec();
417+
418+
buf.extend(settings.number_separator.as_encoded_bytes());
419+
buf.extend(String::from_utf8_lossy(&line).as_bytes());
420+
buf.push(b'\n');
421+
422+
writer
423+
.write_all(&buf)
424+
.map_err_context(|| translate!("nl-error-could-not-write"))?;
425+
422426
// update line number for the potential next line
423427
match line_number.checked_add(settings.line_increment) {
424428
Some(new_line_number) => stats.line_number = Some(new_line_number),

tests/by-util/test_nl.rs

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -209,23 +209,21 @@ fn test_number_separator() {
209209
#[test]
210210
#[cfg(target_os = "linux")]
211211
fn test_number_separator_non_utf8() {
212-
use std::{
213-
ffi::{OsStr, OsString},
214-
os::unix::ffi::{OsStrExt, OsStringExt},
215-
};
212+
use std::{ffi::OsString, os::unix::ffi::OsStringExt};
216213

217214
let separator_bytes = [0xFF, 0xFE];
218215
let mut v = b"--number-separator=".to_vec();
219216
v.extend_from_slice(&separator_bytes);
220217

221218
let arg = OsString::from_vec(v);
222-
let separator = OsStr::from_bytes(&separator_bytes);
223219

224220
new_ucmd!()
225221
.arg(arg)
226222
.pipe_in("test")
227223
.succeeds()
228-
.stdout_is(format!(" 1{}test\n", separator.to_string_lossy()));
224+
.stdout_is_bytes([
225+
b' ', b' ', b' ', b' ', b' ', b'1', 0xFF, 0xFE, b't', b'e', b's', b't', b'\n',
226+
]);
229227
}
230228

231229
#[test]

0 commit comments

Comments
 (0)