complete: Stringify

This commit is contained in:
Fabian Homborg 2018-10-20 15:33:26 +02:00
parent 57cf9055d5
commit 7533fa89d4

View file

@ -864,12 +864,8 @@ static void complete_load(const wcstring &name, bool reload) {
/// echo hello world<tab> -> ("echo", "hello", "world") /// echo hello world<tab> -> ("echo", "hello", "world")
/// ///
/// Insert results into comp_out. Return true to perform file completion, false to disable it. /// Insert results into comp_out. Return true to perform file completion, false to disable it.
bool completer_t::complete_param(const wcstring &scmd_orig, const wcstring &spopt, bool completer_t::complete_param(const wcstring &cmd_orig, const wcstring &popt,
const wcstring &sstr, bool use_switches) { const wcstring &str, bool use_switches) {
const wchar_t *const cmd_orig = scmd_orig.c_str();
const wchar_t *const popt = spopt.c_str();
const wchar_t *const str = sstr.c_str();
bool use_common = 1, use_files = 1; bool use_common = 1, use_files = 1;
wcstring cmd, path; wcstring cmd, path;
@ -905,7 +901,7 @@ bool completer_t::complete_param(const wcstring &scmd_orig, const wcstring &spop
env_vars_snapshot_t((wchar_t const *const[]){L"fish_function_path", nullptr})); env_vars_snapshot_t((wchar_t const *const[]){L"fish_function_path", nullptr}));
}); });
head_exists = function_exists_no_autoload(cmd.c_str(), completion_snapshot); head_exists = function_exists_no_autoload(cmd, completion_snapshot);
// While it may seem like first testing `path_get_path` before resorting to an env lookup // While it may seem like first testing `path_get_path` before resorting to an env lookup
// may be faster, path_get_path can potentially do a lot of FS/IO access, so env.get() + // may be faster, path_get_path can potentially do a lot of FS/IO access, so env.get() +
// function_exists() should still be faster. // function_exists() should still be faster.
@ -946,7 +942,7 @@ bool completer_t::complete_param(const wcstring &scmd_orig, const wcstring &spop
// Check if we are entering a combined option and argument (like --color=auto or // Check if we are entering a combined option and argument (like --color=auto or
// -I/usr/include). // -I/usr/include).
for (const complete_entry_opt_t &o : options) { for (const complete_entry_opt_t &o : options) {
const wchar_t *arg = param_match2(&o, str); const wchar_t *arg = param_match2(&o, str.c_str());
if (arg != NULL && this->condition_test(o.condition)) { if (arg != NULL && this->condition_test(o.condition)) {
if (o.result_mode & NO_COMMON) use_common = false; if (o.result_mode & NO_COMMON) use_common = false;
if (o.result_mode & NO_FILES) use_files = false; if (o.result_mode & NO_FILES) use_files = false;
@ -961,7 +957,7 @@ bool completer_t::complete_param(const wcstring &scmd_orig, const wcstring &spop
// If we are using old style long options, check for them first. // If we are using old style long options, check for them first.
for (const complete_entry_opt_t &o : options) { for (const complete_entry_opt_t &o : options) {
if (o.type == option_type_single_long && param_match(&o, popt) && if (o.type == option_type_single_long && param_match(&o, popt.c_str()) &&
this->condition_test(o.condition)) { this->condition_test(o.condition)) {
old_style_match = true; old_style_match = true;
if (o.result_mode & NO_COMMON) use_common = false; if (o.result_mode & NO_COMMON) use_common = false;
@ -981,7 +977,7 @@ bool completer_t::complete_param(const wcstring &scmd_orig, const wcstring &spop
if (o.type == option_type_double_long && !(o.result_mode & NO_COMMON)) if (o.type == option_type_double_long && !(o.result_mode & NO_COMMON))
continue; continue;
if (param_match(&o, popt) && this->condition_test(o.condition)) { if (param_match(&o, popt.c_str()) && this->condition_test(o.condition)) {
if (o.result_mode & NO_COMMON) use_common = false; if (o.result_mode & NO_COMMON) use_common = false;
if (o.result_mode & NO_FILES) use_files = false; if (o.result_mode & NO_FILES) use_files = false;
complete_from_args(str, o.comp, o.localized_desc(), o.flags); complete_from_args(str, o.comp, o.localized_desc(), o.flags);
@ -1004,7 +1000,7 @@ bool completer_t::complete_param(const wcstring &scmd_orig, const wcstring &spop
complete_from_args(str, o.comp, o.localized_desc(), o.flags); complete_from_args(str, o.comp, o.localized_desc(), o.flags);
} }
if (!use_switches || wcslen(str) == 0) { if (!use_switches || str.empty()) {
continue; continue;
} }
@ -1026,7 +1022,7 @@ bool completer_t::complete_param(const wcstring &scmd_orig, const wcstring &spop
int match = string_prefixes_string(str, whole_opt); int match = string_prefixes_string(str, whole_opt);
if (!match) { if (!match) {
bool match_no_case = wcsncasecmp(str, whole_opt.c_str(), wcslen(str)) == 0; bool match_no_case = wcsncasecmp(str.c_str(), whole_opt.c_str(), str.length()) == 0;
if (!match_no_case) { if (!match_no_case) {
continue; continue;
@ -1039,7 +1035,7 @@ bool completer_t::complete_param(const wcstring &scmd_orig, const wcstring &spop
complete_flags_t flags = 0; complete_flags_t flags = 0;
if (match) { if (match) {
offset = wcslen(str); offset = str.length();
} else { } else {
flags = COMPLETE_REPLACES_TOKEN; flags = COMPLETE_REPLACES_TOKEN;
} }
@ -1128,7 +1124,7 @@ void completer_t::complete_param_expand(const wcstring &str, bool do_file,
bool completer_t::complete_variable(const wcstring &str, size_t start_offset) { bool completer_t::complete_variable(const wcstring &str, size_t start_offset) {
const wchar_t *const whole_var = str.c_str(); const wchar_t *const whole_var = str.c_str();
const wchar_t *var = &whole_var[start_offset]; const wchar_t *var = &whole_var[start_offset];
size_t varlen = wcslen(var); size_t varlen = str.length() - start_offset;
bool res = false; bool res = false;
const wcstring_list_t names = complete_get_variable_names(); const wcstring_list_t names = complete_get_variable_names();
@ -1255,7 +1251,7 @@ bool completer_t::try_complete_user(const wcstring &str) {
double start_time = timef(); double start_time = timef();
bool result = false; bool result = false;
size_t name_len = wcslen(user_name); size_t name_len = str.length() - 1;
// We don't bother with the thread-safe `getpwent_r()` variant because this is the sole place // We don't bother with the thread-safe `getpwent_r()` variant because this is the sole place
// where we call getpwent(). // where we call getpwent().