From 3233288a8c04f0d79f1d1670979d2db1705497d1 Mon Sep 17 00:00:00 2001
From: Leon Styhre <leon@leonstyhre.com>
Date: Sat, 25 Sep 2021 18:01:41 +0200
Subject: [PATCH] Improved the string trim function and replaced some inlined
 occurrences.

---
 es-app/src/CollectionSystemsManager.cpp    |  8 +-------
 es-app/src/guis/GuiScraperSearch.cpp       |  9 +--------
 es-app/src/scrapers/GamesDBJSONScraper.cpp | 10 +---------
 es-app/src/scrapers/ScreenScraper.cpp      | 10 +---------
 es-core/src/utils/StringUtil.cpp           | 17 ++++++++++++-----
 5 files changed, 16 insertions(+), 38 deletions(-)

diff --git a/es-app/src/CollectionSystemsManager.cpp b/es-app/src/CollectionSystemsManager.cpp
index b804698a7..df2ed075e 100644
--- a/es-app/src/CollectionSystemsManager.cpp
+++ b/es-app/src/CollectionSystemsManager.cpp
@@ -555,13 +555,7 @@ std::string CollectionSystemsManager::getValidNewCollectionName(std::string inNa
     std::string name = inName;
 
     // Trim leading and trailing whitespaces.
-    name.erase(name.begin(), std::find_if(name.begin(), name.end(), [](char c) {
-                   return !std::isspace(static_cast<unsigned char>(c));
-               }));
-    name.erase(std::find_if(name.rbegin(), name.rend(),
-                            [](char c) { return !std::isspace(static_cast<unsigned char>(c)); })
-                   .base(),
-               name.end());
+    name = Utils::String::trim(name);
 
     if (index == 0) {
         size_t remove = std::string::npos;
diff --git a/es-app/src/guis/GuiScraperSearch.cpp b/es-app/src/guis/GuiScraperSearch.cpp
index d749c1302..cb3ed5ba7 100644
--- a/es-app/src/guis/GuiScraperSearch.cpp
+++ b/es-app/src/guis/GuiScraperSearch.cpp
@@ -794,14 +794,7 @@ void GuiScraperSearch::openInputScreen(ScraperSearchParams& params)
 {
     auto searchForFunc = [&](std::string name) {
         // Trim leading and trailing whitespaces.
-        name.erase(name.begin(), std::find_if(name.begin(), name.end(), [](char c) {
-                       return !std::isspace(static_cast<unsigned char>(c));
-                   }));
-        name.erase(std::find_if(name.rbegin(), name.rend(),
-                                [](char c) { return !std::isspace(static_cast<unsigned char>(c)); })
-                       .base(),
-                   name.end());
-
+        name = Utils::String::trim(name);
         stop();
         mRefinedSearch = true;
         params.nameOverride = name;
diff --git a/es-app/src/scrapers/GamesDBJSONScraper.cpp b/es-app/src/scrapers/GamesDBJSONScraper.cpp
index 4c015d38c..327bbef30 100644
--- a/es-app/src/scrapers/GamesDBJSONScraper.cpp
+++ b/es-app/src/scrapers/GamesDBJSONScraper.cpp
@@ -160,15 +160,7 @@ void thegamesdb_generate_json_scraper_requests(
         }
 
         // Trim leading and trailing whitespaces.
-        cleanName.erase(cleanName.begin(),
-                        std::find_if(cleanName.begin(), cleanName.end(), [](char c) {
-                            return !std::isspace(static_cast<unsigned char>(c));
-                        }));
-        cleanName.erase(
-            std::find_if(cleanName.rbegin(), cleanName.rend(),
-                         [](char c) { return !std::isspace(static_cast<unsigned char>(c)); })
-                .base(),
-            cleanName.end());
+        cleanName = Utils::String::trim(cleanName);
 
         path += "/Games/ByGameName?" + apiKey +
                 "&fields=players,publishers,genres,overview,last_updated,rating,"
diff --git a/es-app/src/scrapers/ScreenScraper.cpp b/es-app/src/scrapers/ScreenScraper.cpp
index afdb9ea00..ea4cb1cab 100644
--- a/es-app/src/scrapers/ScreenScraper.cpp
+++ b/es-app/src/scrapers/ScreenScraper.cpp
@@ -553,15 +553,7 @@ std::string ScreenScraperRequest::ScreenScraperConfig::getGameSearchUrl(
     bool singleSearch = false;
 
     // Trim leading and trailing whitespaces.
-    searchName.erase(searchName.begin(),
-                     std::find_if(searchName.begin(), searchName.end(), [](char c) {
-                         return !std::isspace(static_cast<unsigned char>(c));
-                     }));
-    searchName.erase(
-        std::find_if(searchName.rbegin(), searchName.rend(),
-                     [](char c) { return !std::isspace(static_cast<unsigned char>(c)); })
-            .base(),
-        searchName.end());
+    searchName = Utils::String::trim(searchName);
 
     // If only whitespaces were entered as the search string, then search using a random string
     // that will not return any results. This is a quick and dirty way to avoid french error
diff --git a/es-core/src/utils/StringUtil.cpp b/es-core/src/utils/StringUtil.cpp
index 2bc8798ac..2a7adb093 100644
--- a/es-core/src/utils/StringUtil.cpp
+++ b/es-core/src/utils/StringUtil.cpp
@@ -564,13 +564,20 @@ namespace Utils
 
         std::string trim(const std::string& stringArg)
         {
-            const size_t strBegin = stringArg.find_first_not_of(" \t");
-            const size_t strEnd = stringArg.find_last_not_of(" \t");
+            std::string trimString = stringArg;
 
-            if (strBegin == std::string::npos)
-                return "";
+            // Trim leading and trailing whitespaces.
+            trimString.erase(trimString.begin(),
+                             std::find_if(trimString.begin(), trimString.end(), [](char c) {
+                                 return !std::isspace(static_cast<unsigned char>(c));
+                             }));
+            trimString.erase(
+                std::find_if(trimString.rbegin(), trimString.rend(),
+                             [](char c) { return !std::isspace(static_cast<unsigned char>(c)); })
+                    .base(),
+                trimString.end());
 
-            return stringArg.substr(strBegin, strEnd - strBegin + 1);
+            return trimString;
         }
 
         std::string replace(const std::string& stringArg,