From 7533fa89d475ff032e1e5583e2911201b57cd3b0 Mon Sep 17 00:00:00 2001 From: Fabian Homborg Date: Sat, 20 Oct 2018 15:33:26 +0200 Subject: [PATCH] complete: Stringify --- src/complete.cpp | 26 +++++++++++--------------- 1 file changed, 11 insertions(+), 15 deletions(-) diff --git a/src/complete.cpp b/src/complete.cpp index 38c9576fa..c6f2bf432 100644 --- a/src/complete.cpp +++ b/src/complete.cpp @@ -864,12 +864,8 @@ static void complete_load(const wcstring &name, bool reload) { /// echo hello world -> ("echo", "hello", "world") /// /// 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, - const wcstring &sstr, 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 completer_t::complete_param(const wcstring &cmd_orig, const wcstring &popt, + const wcstring &str, bool use_switches) { bool use_common = 1, use_files = 1; 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})); }); - 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 // may be faster, path_get_path can potentially do a lot of FS/IO access, so env.get() + // 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 // -I/usr/include). 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 (o.result_mode & NO_COMMON) use_common = 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. 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)) { old_style_match = true; 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)) 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_FILES) use_files = false; 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); } - if (!use_switches || wcslen(str) == 0) { + if (!use_switches || str.empty()) { 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); 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) { continue; @@ -1039,7 +1035,7 @@ bool completer_t::complete_param(const wcstring &scmd_orig, const wcstring &spop complete_flags_t flags = 0; if (match) { - offset = wcslen(str); + offset = str.length(); } else { 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) { const wchar_t *const whole_var = str.c_str(); const wchar_t *var = &whole_var[start_offset]; - size_t varlen = wcslen(var); + size_t varlen = str.length() - start_offset; bool res = false; 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(); 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 // where we call getpwent().