From 77791325950bcb6596bad9e34b6341611db33432 Mon Sep 17 00:00:00 2001 From: Kurtis Rader <krader@skepticism.us> Date: Sun, 30 Oct 2016 14:16:32 -0700 Subject: [PATCH] lint: Use early exit/continue --- src/reader.cpp | 268 ++++++++++++++++++++++++------------------------- 1 file changed, 134 insertions(+), 134 deletions(-) diff --git a/src/reader.cpp b/src/reader.cpp index 859500233..0d981be16 100644 --- a/src/reader.cpp +++ b/src/reader.cpp @@ -1398,125 +1398,127 @@ static bool handle_completions(const std::vector<completion_t> &comp, success = true; } - if (!done) { - fuzzy_match_type_t best_match_type = get_best_match_type(comp); + if (done) { + return success; + } - // Determine whether we are going to replace the token or not. If any commands of the best - // type do not require replacement, then ignore all those that want to use replacement. - bool will_replace_token = true; - for (size_t i = 0; i < comp.size(); i++) { - const completion_t &el = comp.at(i); - if (el.match.type <= best_match_type && !(el.flags & COMPLETE_REPLACES_TOKEN)) { - will_replace_token = false; - break; - } - } + fuzzy_match_type_t best_match_type = get_best_match_type(comp); - // Decide which completions survived. There may be a lot of them; it would be nice if we - // could figure out how to avoid copying them here. - std::vector<completion_t> surviving_completions; - for (size_t i = 0; i < comp.size(); i++) { - const completion_t &el = comp.at(i); - // Ignore completions with a less suitable match type than the best. - if (el.match.type > best_match_type) continue; - - // Only use completions that match replace_token. - bool completion_replace_token = static_cast<bool>(el.flags & COMPLETE_REPLACES_TOKEN); - if (completion_replace_token != will_replace_token) continue; - - // Don't use completions that want to replace, if we cannot replace them. - if (completion_replace_token && !reader_can_replace(tok, el.flags)) continue; - - // This completion survived. - surviving_completions.push_back(el); - } - - bool use_prefix = false; - if (match_type_shares_prefix(best_match_type)) { - // Try to find a common prefix to insert among the surviving completions. - wcstring common_prefix; - complete_flags_t flags = 0; - bool prefix_is_partial_completion = false; - for (size_t i = 0; i < surviving_completions.size(); i++) { - const completion_t &el = surviving_completions.at(i); - if (i == 0) { - // First entry, use the whole string. - common_prefix = el.completion; - flags = el.flags; - } else { - // Determine the shared prefix length. - size_t idx, max = mini(common_prefix.size(), el.completion.size()); - for (idx = 0; idx < max; idx++) { - wchar_t ac = common_prefix.at(idx), bc = el.completion.at(idx); - bool matches = (ac == bc); - // If we are replacing the token, allow case to vary. - if (will_replace_token && !matches) { - // Hackish way to compare two strings in a case insensitive way, - // hopefully better than towlower(). - matches = (wcsncasecmp(&ac, &bc, 1) == 0); - } - if (!matches) break; - } - - // idx is now the length of the new common prefix. - common_prefix.resize(idx); - prefix_is_partial_completion = true; - - // Early out if we decide there's no common prefix. - if (idx == 0) break; - } - } - - // Determine if we use the prefix. We use it if it's non-empty and it will actually make - // the command line longer. It may make the command line longer by virtue of not using - // REPLACE_TOKEN (so it always appends to the command line), or by virtue of replacing - // the token but being longer than it. - use_prefix = common_prefix.size() > (will_replace_token ? tok.size() : 0); - assert(!use_prefix || !common_prefix.empty()); - - if (use_prefix) { - // We got something. If more than one completion contributed, then it means we have - // a prefix; don't insert a space after it. - if (prefix_is_partial_completion) flags |= COMPLETE_NO_SPACE; - completion_insert(common_prefix.c_str(), flags); - success = true; - } - } - - if (continue_after_prefix_insertion || !use_prefix) { - // We didn't get a common prefix, or we want to print the list anyways. - size_t len, prefix_start = 0; - wcstring prefix; - parse_util_get_parameter_info(el->text, el->position, NULL, &prefix_start, NULL); - - assert(el->position >= prefix_start); - len = el->position - prefix_start; - - if (will_replace_token || match_type_requires_full_replacement(best_match_type)) { - // No prefix. - prefix.clear(); - } else if (len <= PREFIX_MAX_LEN) { - prefix.append(el->text, prefix_start, len); - } else { - // Append just the end of the string. - prefix = wcstring(&ellipsis_char, 1); - prefix.append(el->text, prefix_start + len - PREFIX_MAX_LEN, PREFIX_MAX_LEN); - } - - wchar_t quote; - parse_util_get_parameter_info(el->text, el->position, "e, NULL, NULL); - // Update the pager data. - data->pager.set_prefix(prefix); - data->pager.set_completions(surviving_completions); - // Invalidate our rendering. - data->current_page_rendering = page_rendering_t(); - // Modify the command line to reflect the new pager. - data->pager_selection_changed(); - reader_repaint_needed(); - success = false; + // Determine whether we are going to replace the token or not. If any commands of the best + // type do not require replacement, then ignore all those that want to use replacement. + bool will_replace_token = true; + for (size_t i = 0; i < comp.size(); i++) { + const completion_t &el = comp.at(i); + if (el.match.type <= best_match_type && !(el.flags & COMPLETE_REPLACES_TOKEN)) { + will_replace_token = false; + break; } } - return success; + + // Decide which completions survived. There may be a lot of them; it would be nice if we could + // figure out how to avoid copying them here. + std::vector<completion_t> surviving_completions; + for (size_t i = 0; i < comp.size(); i++) { + const completion_t &el = comp.at(i); + // Ignore completions with a less suitable match type than the best. + if (el.match.type > best_match_type) continue; + + // Only use completions that match replace_token. + bool completion_replace_token = static_cast<bool>(el.flags & COMPLETE_REPLACES_TOKEN); + if (completion_replace_token != will_replace_token) continue; + + // Don't use completions that want to replace, if we cannot replace them. + if (completion_replace_token && !reader_can_replace(tok, el.flags)) continue; + + // This completion survived. + surviving_completions.push_back(el); + } + + bool use_prefix = false; + if (match_type_shares_prefix(best_match_type)) { + // Try to find a common prefix to insert among the surviving completions. + wcstring common_prefix; + complete_flags_t flags = 0; + bool prefix_is_partial_completion = false; + for (size_t i = 0; i < surviving_completions.size(); i++) { + const completion_t &el = surviving_completions.at(i); + if (i == 0) { + // First entry, use the whole string. + common_prefix = el.completion; + flags = el.flags; + } else { + // Determine the shared prefix length. + size_t idx, max = mini(common_prefix.size(), el.completion.size()); + for (idx = 0; idx < max; idx++) { + wchar_t ac = common_prefix.at(idx), bc = el.completion.at(idx); + bool matches = (ac == bc); + // If we are replacing the token, allow case to vary. + if (will_replace_token && !matches) { + // Hackish way to compare two strings in a case insensitive way, + // hopefully better than towlower(). + matches = (wcsncasecmp(&ac, &bc, 1) == 0); + } + if (!matches) break; + } + + // idx is now the length of the new common prefix. + common_prefix.resize(idx); + prefix_is_partial_completion = true; + + // Early out if we decide there's no common prefix. + if (idx == 0) break; + } + } + + // Determine if we use the prefix. We use it if it's non-empty and it will actually make + // the command line longer. It may make the command line longer by virtue of not using + // REPLACE_TOKEN (so it always appends to the command line), or by virtue of replacing + // the token but being longer than it. + use_prefix = common_prefix.size() > (will_replace_token ? tok.size() : 0); + assert(!use_prefix || !common_prefix.empty()); + + if (use_prefix) { + // We got something. If more than one completion contributed, then it means we have + // a prefix; don't insert a space after it. + if (prefix_is_partial_completion) flags |= COMPLETE_NO_SPACE; + completion_insert(common_prefix.c_str(), flags); + success = true; + } + } + + if (!continue_after_prefix_insertion && use_prefix) { + return success; + } + + // We didn't get a common prefix, or we want to print the list anyways. + size_t len, prefix_start = 0; + wcstring prefix; + parse_util_get_parameter_info(el->text, el->position, NULL, &prefix_start, NULL); + + assert(el->position >= prefix_start); + len = el->position - prefix_start; + + if (will_replace_token || match_type_requires_full_replacement(best_match_type)) { + prefix.clear(); // no prefix + } else if (len <= PREFIX_MAX_LEN) { + prefix.append(el->text, prefix_start, len); + } else { + // Append just the end of the string. + prefix = wcstring(&ellipsis_char, 1); + prefix.append(el->text, prefix_start + len - PREFIX_MAX_LEN, PREFIX_MAX_LEN); + } + + wchar_t quote; + parse_util_get_parameter_info(el->text, el->position, "e, NULL, NULL); + // Update the pager data. + data->pager.set_prefix(prefix); + data->pager.set_completions(surviving_completions); + // Invalidate our rendering. + data->current_page_rendering = page_rendering_t(); + // Modify the command line to reflect the new pager. + data->pager_selection_changed(); + reader_repaint_needed(); + return false; } /// Return true if we believe ourselves to be orphaned. loop_count is how many times we've tried to @@ -2652,26 +2654,24 @@ const wchar_t *reader_readline(int nchars) { } case R_BACKWARD_KILL_LINE: { editable_line_t *el = data->active_edit_line(); - if (el->position > 0) { - const wchar_t *buff = el->text.c_str(); - const wchar_t *end = &buff[el->position]; - const wchar_t *begin = end; - - begin--; // make sure we delete at least one character (see issue #580) - - // Delete until we hit a newline, or the beginning of the string. - while (begin > buff && *begin != L'\n') begin--; - - // If we landed on a newline, don't delete it. - if (*begin == L'\n') begin++; - - assert(end >= begin); - size_t len = maxi<size_t>(end - begin, 1); - begin = end - len; - - reader_kill(el, begin - buff, len, KILL_PREPEND, - last_char != R_BACKWARD_KILL_LINE); + if (el->position <= 0) { + break; } + const wchar_t *buff = el->text.c_str(); + const wchar_t *end = &buff[el->position]; + const wchar_t *begin = end; + + begin--; // make sure we delete at least one character (see issue #580) + + // Delete until we hit a newline, or the beginning of the string. + while (begin > buff && *begin != L'\n') begin--; + + // If we landed on a newline, don't delete it. + if (*begin == L'\n') begin++; + assert(end >= begin); + size_t len = maxi<size_t>(end - begin, 1); + begin = end - len; + reader_kill(el, begin - buff, len, KILL_PREPEND, last_char != R_BACKWARD_KILL_LINE); break; } case R_KILL_WHOLE_LINE: {