Remove some allocations

This commit is contained in:
Nathan Fisher 2023-01-27 00:15:04 -05:00
parent 754f604603
commit fcc8abb67b
5 changed files with 86 additions and 85 deletions

View File

@ -24,11 +24,6 @@ impl Cmd for Base32 {
let Some(matches) = matches else {
return Err(io::Error::new(io::ErrorKind::Other, "No input").into());
};
let files: Vec<_> = match matches.get_many::<String>("INPUT") {
Some(c) => c.cloned().collect(),
None => vec![String::from("-")],
};
let len = files.len();
let color = match matches.get_one::<String>("color").map(String::as_str) {
Some("always") => ColorChoice::Always,
Some("ansi") => ColorChoice::AlwaysAnsi,
@ -41,31 +36,36 @@ impl Cmd for Base32 {
}
_ => ColorChoice::Never,
};
for (index, file) in files.into_iter().enumerate() {
if { len > 1 || matches.get_flag("verbose") } && !matches.get_flag("QUIET") {
let mut stdout = StandardStream::stdout(color);
stdout.set_color(ColorSpec::new().set_fg(Some(Color::Green)))?;
match index {
0 => writeln!(stdout, "===> {file} <==="),
_ => writeln!(stdout, "\n===> {file} <==="),
}?;
stdout.reset()?;
} else if index > 0 {
println!();
}
let contents = get_contents(&file)?;
if matches.get_flag("DECODE") {
decode_base32(contents, matches.get_flag("IGNORE"))?;
} else {
encode_base32(
&contents,
match matches.get_one::<usize>("WRAP") {
Some(c) => *c,
None => {
return Err(io::Error::new(io::ErrorKind::Other, "Invalid wrap").into())
}
},
);
if let Some(files) = matches.get_many::<String>("files") {
let (len, _) = files.size_hint();
for (index, file) in files.into_iter().enumerate() {
if { len > 1 || matches.get_flag("verbose") } && !matches.get_flag("QUIET") {
let mut stdout = StandardStream::stdout(color);
stdout.set_color(ColorSpec::new().set_fg(Some(Color::Green)))?;
match index {
0 => writeln!(stdout, "===> {file} <==="),
_ => writeln!(stdout, "\n===> {file} <==="),
}?;
stdout.reset()?;
} else if index > 0 {
println!();
}
let contents = get_contents(&file)?;
if matches.get_flag("DECODE") {
decode_base32(contents, matches.get_flag("IGNORE"))?;
} else {
encode_base32(
&contents,
match matches.get_one::<usize>("WRAP") {
Some(c) => *c,
None => {
return Err(
io::Error::new(io::ErrorKind::Other, "Invalid wrap").into()
)
}
},
);
}
}
}
Ok(())
@ -80,7 +80,8 @@ pub fn args() -> [Arg; 7] {
[
Arg::new("INPUT")
.help("The input file to use")
.num_args(1..),
.num_args(1..)
.default_value("-"),
Arg::new("DECODE")
.help("Decode rather than encode")
.short('d')

View File

@ -23,11 +23,6 @@ impl Cmd for Base64 {
let Some(matches) = matches else {
return Err(Box::new(io::Error::new(io::ErrorKind::Other, "No input")));
};
let files: Vec<_> = match matches.get_many::<String>("INPUT") {
Some(c) => c.cloned().collect(),
None => vec![String::from("-")],
};
let len = files.len();
let color = match matches.get_one::<String>("color").map(String::as_str) {
Some("always") => ColorChoice::Always,
Some("ansi") => ColorChoice::AlwaysAnsi,
@ -40,29 +35,32 @@ impl Cmd for Base64 {
}
_ => ColorChoice::Never,
};
for (index, file) in files.into_iter().enumerate() {
if { len > 1 || matches.get_flag("VERBOSE") } && !matches.get_flag("QUIET") {
let mut stdout = StandardStream::stdout(color);
stdout.set_color(ColorSpec::new().set_fg(Some(Color::Green)))?;
match index {
0 => writeln!(stdout, "===> {file} <==="),
_ => writeln!(stdout, "\n===> {file} <==="),
}?;
stdout.reset()?;
} else if index > 0 {
println!();
}
let contents = get_contents(&file)?;
if matches.get_flag("DECODE") {
decode_base64(contents, matches.get_flag("IGNORE"))?;
} else {
encode_base64(
&contents,
match matches.get_one("WRAP") {
Some(c) => *c,
None => 76,
},
);
if let Some(files) = matches.get_many::<String>("INPUT") {
let (len, _) = files.size_hint();
for (index, file) in files.enumerate() {
if { len > 1 || matches.get_flag("VERBOSE") } && !matches.get_flag("QUIET") {
let mut stdout = StandardStream::stdout(color);
stdout.set_color(ColorSpec::new().set_fg(Some(Color::Green)))?;
match index {
0 => writeln!(stdout, "===> {file} <==="),
_ => writeln!(stdout, "\n===> {file} <==="),
}?;
stdout.reset()?;
} else if index > 0 {
println!();
}
let contents = get_contents(&file)?;
if matches.get_flag("DECODE") {
decode_base64(contents, matches.get_flag("IGNORE"))?;
} else {
encode_base64(
&contents,
match matches.get_one("WRAP") {
Some(c) => *c,
None => 76,
},
);
}
}
}
Ok(())

View File

@ -25,6 +25,7 @@ impl Cmd for Head {
.args([
Arg::new("FILES")
.help("The input file to use")
.default_value("-")
.num_args(1..),
Arg::new("BYTES")
.help("Count bytes instead of lines")
@ -44,7 +45,10 @@ impl Cmd for Head {
.allow_negative_numbers(false)
.conflicts_with("num")
.value_parser(value_parser!(usize)),
args::color(),
Arg::new("color")
.short('C')
.long("color")
.value_parser(["always", "ansi", "auto", "never"]),
Arg::new("num")
.short('1')
.short_aliases(['2', '3', '4', '5', '6', '7', '8', '9'])
@ -82,12 +86,6 @@ impl Cmd for Head {
if let Some(l) = matches.get_one("LINES") {
lines = *l;
}
let files = match matches.get_many::<String>("FILES") {
Some(c) => c.map(std::string::ToString::to_string).collect(),
None => vec!["-".to_string()],
};
let header =
!matches.get_flag("QUIET") && { files.len() > 1 || matches.get_flag("HEADER") };
let color = match matches.get_one::<String>("color").map(String::as_str) {
Some("always") => ColorChoice::Always,
Some("ansi") => ColorChoice::AlwaysAnsi,
@ -100,11 +98,15 @@ impl Cmd for Head {
}
_ => ColorChoice::Never,
};
for (index, file) in files.into_iter().enumerate() {
if index == 1 && header {
println!();
if let Some(files) = matches.get_many::<String>("FILES") {
let (len, _) = files.size_hint();
let header = !matches.get_flag("QUIET") && { len > 1 || matches.get_flag("HEADER") };
for (index, file) in files.enumerate() {
if index == 1 && header {
println!();
}
head(file, lines, header, matches.get_flag("BYTES"), color)?;
}
head(&file, lines, header, matches.get_flag("BYTES"), color)?;
}
Ok(())
}

View File

@ -16,6 +16,7 @@ mod date;
mod dd;
mod dirname;
mod echo;
mod expand;
mod factor;
mod r#false;
mod fold;

View File

@ -20,7 +20,8 @@ impl Cmd for Rev {
args::color(),
Arg::new("file")
.help("if file is '-' read from stdin")
.num_args(0..),
.num_args(1..)
.default_value("-"),
])
}
@ -28,10 +29,6 @@ impl Cmd for Rev {
let Some(matches) = matches else {
return Err(Box::new(io::Error::new(ErrorKind::Other, "No input")));
};
let files: Vec<_> = match matches.get_many::<String>("file") {
Some(c) => c.cloned().collect(),
None => vec![String::from("-")],
};
let color = match matches.get_one::<String>("color").map(String::as_str) {
Some("always") => ColorChoice::Always,
Some("ansi") => ColorChoice::AlwaysAnsi,
@ -44,17 +41,19 @@ impl Cmd for Rev {
}
_ => ColorChoice::Never,
};
for (index, file) in files.into_iter().enumerate() {
if matches.get_flag("header") {
let mut stdout = StandardStream::stdout(color);
stdout.set_color(ColorSpec::new().set_fg(Some(Color::Green)))?;
match index {
0 => writeln!(stdout, "===> {file} <==="),
_ => writeln!(stdout, "\n===> {file} <==="),
}?;
stdout.reset()?;
if let Some(files) = matches.get_many::<String>("file") {
for (index, file) in files.enumerate() {
if matches.get_flag("HEADER") {
let mut stdout = StandardStream::stdout(color);
stdout.set_color(ColorSpec::new().set_fg(Some(Color::Green)))?;
match index {
0 => writeln!(stdout, "===> {file} <==="),
_ => writeln!(stdout, "\n===> {file} <==="),
}?;
stdout.reset()?;
}
rev_file(&file)?;
}
rev_file(&file)?;
}
Ok(())
}