From 666304633ac99adf52f5b69f093ac32875b4dd99 Mon Sep 17 00:00:00 2001 From: Juergen Spitzmueller Date: Sat, 6 Jul 2024 09:24:07 +0200 Subject: [PATCH] Improve 0f35e3141bc5b6ba * also handle replace string case-insensitively in case-insensitive mode * leaner code --- src/support/lstrings.cpp | 27 +++++++++++---------------- src/support/lstrings.h | 1 + 2 files changed, 12 insertions(+), 16 deletions(-) diff --git a/src/support/lstrings.cpp b/src/support/lstrings.cpp index 600885f80c..5d0c37694d 100644 --- a/src/support/lstrings.cpp +++ b/src/support/lstrings.cpp @@ -917,25 +917,20 @@ docstring const subst_string(docstring const & a, bool const case_sens) { LASSERT(!oldstr.empty(), return a); - docstring lstr = a; + docstring res = a; size_t i = 0; size_t const olen = oldstr.length(); - if (case_sens) - while ((i = lstr.find(oldstr, i)) != string::npos) { - lstr.replace(i, olen, newstr); - i += newstr.length(); // We need to be sure that we don't - // use the same i over and over again. - } - else { - docstring lcstr = lowercase(lstr); - while ((i = lcstr.find(oldstr, i)) != string::npos) { - lstr.replace(i, olen, newstr); - i += newstr.length(); // We need to be sure that we don't - // use the same i over and over again. - lcstr = lowercase(lstr); - } + // string to be searched in + docstring se_str = case_sens ? res : lowercase(res); + // token to be searched within the above + docstring const se_tok = case_sens ? oldstr : lowercase(oldstr); + while ((i = se_str.find(se_tok, i)) != string::npos) { + res.replace(i, olen, newstr); + i += newstr.length(); // We need to be sure that we don't + // use the same i over and over again. + se_str = case_sens ? res : lowercase(res); } - return lstr; + return res; } } // namespace diff --git a/src/support/lstrings.h b/src/support/lstrings.h index b406f30994..715d9b0b02 100644 --- a/src/support/lstrings.h +++ b/src/support/lstrings.h @@ -195,6 +195,7 @@ std::string const subst(std::string const & a, std::string const & oldstr, std::string const & newstr); /// substitutes all instances of \a oldstr with \a newstr +/// If \p case_sens is false, \a a and \a oldstr are treated case-insensitive docstring const subst(docstring const & a, docstring const & oldstr, docstring const & newstr, bool case_sens = true); -- 2.39.5