Skip to content

Commit e46aec7

Browse files
authored
Merge pull request #8519 from cakebaker/nl_number_separator_non_utf8
nl: use `OsString` for `--number-separator`
2 parents b415826 + 7a9f88a commit e46aec7

3 files changed

Lines changed: 30 additions & 5 deletions

File tree

src/uu/nl/src/helper.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
// file that was distributed with this source code.
55
// spell-checker:ignore (ToDO) conv
66

7+
use std::ffi::OsString;
8+
79
use crate::options;
810
use uucore::translate;
911

@@ -23,7 +25,7 @@ pub fn parse_options(settings: &mut crate::Settings, opts: &clap::ArgMatches) ->
2325
delimiter.clone()
2426
};
2527
}
26-
if let Some(val) = opts.get_one::<String>(options::NUMBER_SEPARATOR) {
28+
if let Some(val) = opts.get_one::<OsString>(options::NUMBER_SEPARATOR) {
2729
settings.number_separator.clone_from(val);
2830
}
2931
settings.number_format = opts

src/uu/nl/src/nl.rs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ pub struct Settings {
3434
number_format: NumberFormat,
3535
renumber: bool,
3636
// The string appended to each line number output.
37-
number_separator: String,
37+
number_separator: OsString,
3838
}
3939

4040
impl Default for Settings {
@@ -50,7 +50,7 @@ impl Default for Settings {
5050
number_width: 6,
5151
number_format: NumberFormat::Right,
5252
renumber: true,
53-
number_separator: String::from("\t"),
53+
number_separator: OsString::from("\t"),
5454
}
5555
}
5656
}
@@ -314,6 +314,7 @@ pub fn uu_app() -> Command {
314314
.short('s')
315315
.long(options::NUMBER_SEPARATOR)
316316
.help(translate!("nl-help-number-separator"))
317+
.value_parser(clap::value_parser!(OsString))
317318
.value_name("STRING"),
318319
)
319320
.arg(
@@ -389,7 +390,7 @@ fn nl<T: Read>(reader: &mut BufReader<T>, stats: &mut Stats, settings: &Settings
389390
settings
390391
.number_format
391392
.format(line_number, settings.number_width),
392-
settings.number_separator,
393+
settings.number_separator.to_string_lossy(),
393394
);
394395
// update line number for the potential next line
395396
match line_number.checked_add(settings.line_increment) {

tests/by-util/test_nl.rs

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ use uutests::util_name;
1111

1212
#[test]
1313
#[cfg(target_os = "linux")]
14-
fn test_nl_non_utf8_paths() {
14+
fn test_non_utf8_paths() {
1515
use std::os::unix::ffi::OsStringExt;
1616
let (at, mut ucmd) = at_and_ucmd!();
1717

@@ -209,6 +209,28 @@ fn test_number_separator() {
209209
}
210210
}
211211

212+
#[test]
213+
#[cfg(target_os = "linux")]
214+
fn test_number_separator_non_utf8() {
215+
use std::{
216+
ffi::{OsStr, OsString},
217+
os::unix::ffi::{OsStrExt, OsStringExt},
218+
};
219+
220+
let separator_bytes = [0xFF, 0xFE];
221+
let mut v = b"--number-separator=".to_vec();
222+
v.extend_from_slice(&separator_bytes);
223+
224+
let arg = OsString::from_vec(v);
225+
let separator = OsStr::from_bytes(&separator_bytes);
226+
227+
new_ucmd!()
228+
.arg(arg)
229+
.pipe_in("test")
230+
.succeeds()
231+
.stdout_is(format!(" 1{}test\n", separator.to_string_lossy()));
232+
}
233+
212234
#[test]
213235
fn test_starting_line_number() {
214236
for arg in ["-v10", "--starting-line-number=10"] {

0 commit comments

Comments
 (0)