From 7049352e61ee26082fd8bbbe8c3570bb167f936c Mon Sep 17 00:00:00 2001
From: Johannes Altmanninger <aclopte@gmail.com>
Date: Wed, 1 Jan 2025 09:47:14 +0100
Subject: [PATCH] Extract function for potentially case-insensitive prefix
 check

---
 src/reader.rs       | 21 +++++++++++++--------
 src/wcstringutil.rs | 12 ++++++++++++
 2 files changed, 25 insertions(+), 8 deletions(-)

diff --git a/src/reader.rs b/src/reader.rs
index a1c77915f..8046a60b1 100644
--- a/src/reader.rs
+++ b/src/reader.rs
@@ -131,9 +131,9 @@ use crate::tokenizer::{
     TOK_SHOW_COMMENTS,
 };
 use crate::wchar::prelude::*;
+use crate::wcstringutil::string_prefixes_string_maybe_case_insensitive;
 use crate::wcstringutil::{
-    count_preceding_backslashes, join_strings, string_prefixes_string,
-    string_prefixes_string_case_insensitive, StringFuzzyMatch,
+    count_preceding_backslashes, join_strings, string_prefixes_string, StringFuzzyMatch,
 };
 use crate::wildcard::wildcard_has;
 use crate::wutil::{fstat, perror};
@@ -4496,7 +4496,11 @@ impl<'a> Reader<'a> {
             self.update_autosuggestion();
         } else if !result.is_empty()
             && self.can_autosuggest()
-            && string_prefixes_string_case_insensitive(&result.search_string, &result.text)
+            && string_prefixes_string_maybe_case_insensitive(
+                result.icase,
+                &result.search_string,
+                &result.text,
+            )
         {
             // Autosuggestion is active and the search term has not changed, so we're good to go.
             self.autosuggestion = result.autosuggestion;
@@ -4520,12 +4524,13 @@ impl<'a> Reader<'a> {
         // This is also the main mechanism by which readline commands that don't change the command line
         // text avoid recomputing the autosuggestion.
         let el = &self.data.command_line;
+        let autosuggestion = &self.autosuggestion;
         if self.autosuggestion.text.len() > el.text().len()
-            && if self.autosuggestion.icase {
-                string_prefixes_string_case_insensitive(el.text(), &self.autosuggestion.text)
-            } else {
-                string_prefixes_string(el.text(), &self.autosuggestion.text)
-            }
+            && string_prefixes_string_maybe_case_insensitive(
+                autosuggestion.icase,
+                &el.text(),
+                &autosuggestion.text,
+            )
         {
             return;
         }
diff --git a/src/wcstringutil.rs b/src/wcstringutil.rs
index 88728156b..cbb415bde 100644
--- a/src/wcstringutil.rs
+++ b/src/wcstringutil.rs
@@ -28,6 +28,18 @@ pub fn string_prefixes_string_case_insensitive(proposed_prefix: &wstr, value: &w
     prefix_size <= value.len() && wcscasecmp(&value[..prefix_size], proposed_prefix).is_eq()
 }
 
+pub fn string_prefixes_string_maybe_case_insensitive(
+    icase: bool,
+    proposed_prefix: &wstr,
+    value: &wstr,
+) -> bool {
+    (if icase {
+        string_prefixes_string_case_insensitive
+    } else {
+        string_prefixes_string
+    })(proposed_prefix, value)
+}
+
 /// Test if a string is a suffix of another.
 pub fn string_suffixes_string_case_insensitive(proposed_suffix: &wstr, value: &wstr) -> bool {
     let suffix_size = proposed_suffix.len();