mirror of
https://github.com/fish-shell/fish-shell
synced 2024-12-27 21:33:09 +00:00
Minor fixes to builtin status
Use as_wstr() instead of from_ffi() in a few places to avoid an allocation, and make job_control_t work in &wstr instead of &str to reduce complexity at the call sites.
This commit is contained in:
parent
4061c7250c
commit
d26d4f36b0
2 changed files with 22 additions and 22 deletions
|
@ -6,19 +6,16 @@ use crate::builtins::shared::{
|
|||
BUILTIN_ERR_NOT_NUMBER, STATUS_CMD_ERROR, STATUS_CMD_OK, STATUS_INVALID_ARGS,
|
||||
};
|
||||
use crate::common::{get_executable_path, str2wcstring};
|
||||
|
||||
use crate::ffi::{
|
||||
get_job_control_mode, get_login, is_interactive_session, job_control_t, parser_t,
|
||||
set_job_control_mode, Repin,
|
||||
};
|
||||
use crate::future_feature_flags::{feature_metadata, feature_test};
|
||||
use crate::wchar::{wstr, L};
|
||||
|
||||
use crate::wchar_ffi::WCharFromFFI;
|
||||
|
||||
use crate::wchar_ffi::{AsWstr, WCharFromFFI};
|
||||
use crate::wgetopt::{wgetopter_t, wopt, woption, woption_argument_t};
|
||||
use crate::wutil::{
|
||||
fish_wcstoi, waccess, wbasename, wdirname, wgettext, wgettext_fmt, wrealpath, Error,
|
||||
fish_wcstoi, sprintf, waccess, wbasename, wdirname, wgettext, wgettext_fmt, wrealpath, Error,
|
||||
};
|
||||
use libc::{c_int, F_OK};
|
||||
use nix::errno::Errno;
|
||||
|
@ -191,13 +188,13 @@ fn print_features(streams: &mut io_streams_t) {
|
|||
} else {
|
||||
L!("off")
|
||||
};
|
||||
streams.out.append(wgettext_fmt!(
|
||||
streams.out.append(sprintf!(
|
||||
"%-*ls%-3s %ls %ls\n",
|
||||
max_len + 1,
|
||||
md.name.from_ffi(),
|
||||
md.name.as_wstr(),
|
||||
set,
|
||||
md.groups.from_ffi(),
|
||||
md.description.from_ffi(),
|
||||
md.groups.as_wstr(),
|
||||
md.description.as_wstr(),
|
||||
));
|
||||
}
|
||||
}
|
||||
|
@ -271,7 +268,7 @@ fn parse_cmd_opts(
|
|||
));
|
||||
return STATUS_CMD_ERROR;
|
||||
}
|
||||
let Ok(job_mode) = w.woptarg.unwrap().to_string().as_str().try_into() else {
|
||||
let Ok(job_mode) = w.woptarg.unwrap().try_into() else {
|
||||
streams.err.append(wgettext_fmt!("%ls: Invalid job control mode '%ls'\n", cmd, w.woptarg.unwrap()));
|
||||
return STATUS_CMD_ERROR;
|
||||
};
|
||||
|
@ -287,7 +284,7 @@ fn parse_cmd_opts(
|
|||
return STATUS_INVALID_ARGS;
|
||||
}
|
||||
c => {
|
||||
let Some(opt_cmd) = StatusCmd::from_u32(c as u32) else {
|
||||
let Some(opt_cmd) = StatusCmd::from_u32(c.into()) else {
|
||||
panic!("unexpected retval from wgetopt_long")
|
||||
};
|
||||
match opt_cmd {
|
||||
|
@ -379,7 +376,7 @@ pub fn status(
|
|||
streams
|
||||
.out
|
||||
.append(wgettext_fmt!("Job control: %ls\n", job_control_mode));
|
||||
streams.out.append(parser.stack_trace().from_ffi());
|
||||
streams.out.append(parser.stack_trace().as_wstr());
|
||||
|
||||
return STATUS_CMD_OK;
|
||||
};
|
||||
|
@ -412,7 +409,7 @@ pub fn status(
|
|||
));
|
||||
return STATUS_INVALID_ARGS;
|
||||
}
|
||||
let Ok(new_mode)= args[0].to_string().as_str().try_into() else {
|
||||
let Ok(new_mode)= args[0].try_into() else {
|
||||
streams.err.append(wgettext_fmt!("%ls: Invalid job control mode '%ls'\n", cmd, args[0]));
|
||||
return STATUS_CMD_ERROR;
|
||||
};
|
||||
|
@ -436,7 +433,7 @@ pub fn status(
|
|||
use TestFeatureRetVal::*;
|
||||
let mut retval = Some(TEST_FEATURE_NOT_RECOGNIZED as c_int);
|
||||
for md in &feature_metadata() {
|
||||
if md.name.from_ffi() == args[0] {
|
||||
if md.name.as_wstr() == args[0] {
|
||||
retval = match feature_test(md.flag) {
|
||||
true => Some(TEST_FEATURE_ON as c_int),
|
||||
false => Some(TEST_FEATURE_OFF as c_int),
|
||||
|
@ -539,7 +536,7 @@ pub fn status(
|
|||
}
|
||||
}
|
||||
STATUS_STACK_TRACE => {
|
||||
streams.out.append(parser.stack_trace().from_ffi());
|
||||
streams.out.append(parser.stack_trace().as_wstr());
|
||||
}
|
||||
STATUS_CURRENT_CMD => {
|
||||
let var = parser.pin().libdata().get_status_vars_command().from_ffi();
|
||||
|
|
|
@ -405,15 +405,18 @@ impl core::convert::From<void_ptr> for *const autocxx::c_void {
|
|||
}
|
||||
}
|
||||
|
||||
impl TryFrom<&str> for job_control_t {
|
||||
impl TryFrom<&wstr> for job_control_t {
|
||||
type Error = ();
|
||||
|
||||
fn try_from(value: &str) -> Result<Self, Self::Error> {
|
||||
match value {
|
||||
"full" => Ok(job_control_t::all),
|
||||
"interactive" => Ok(job_control_t::interactive),
|
||||
"none" => Ok(job_control_t::none),
|
||||
_ => Err(()),
|
||||
fn try_from(value: &wstr) -> Result<Self, Self::Error> {
|
||||
if value == "full" {
|
||||
Ok(job_control_t::all)
|
||||
} else if value == "interactive" {
|
||||
Ok(job_control_t::interactive)
|
||||
} else if value == "none" {
|
||||
Ok(job_control_t::none)
|
||||
} else {
|
||||
Err(())
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue