From e71262463f8fd2d9509b5646b4e08cfa09fc2889 Mon Sep 17 00:00:00 2001
From: Perttu Ahola <celeron55@gmail.com>
Date: Sun, 25 Mar 2012 12:48:14 +0300
Subject: [PATCH] Add removeStringEnd()

---
 src/test.cpp         |  6 ++++++
 src/utility_string.h | 15 +++++++++++++++
 2 files changed, 21 insertions(+)

diff --git a/src/test.cpp b/src/test.cpp
index 6588f113c..1b9dfcb5d 100644
--- a/src/test.cpp
+++ b/src/test.cpp
@@ -35,6 +35,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #include "mapsector.h"
 #include "settings.h"
 #include "log.h"
+#include "utility_string.h"
 
 /*
 	Asserts that the exception occurs
@@ -120,6 +121,11 @@ struct TestUtilities
 		assert(is_yes("YeS") == true);
 		assert(is_yes("") == false);
 		assert(is_yes("FAlse") == false);
+		const char *ends[] = {"abc", "c", "bc", NULL};
+		assert(removeStringEnd("abc", ends) == "");
+		assert(removeStringEnd("bc", ends) == "b");
+		assert(removeStringEnd("12c", ends) == "12");
+		assert(removeStringEnd("foo", ends) == "");
 	}
 };
 
diff --git a/src/utility_string.h b/src/utility_string.h
index f29057ad7..df283ba69 100644
--- a/src/utility_string.h
+++ b/src/utility_string.h
@@ -31,5 +31,20 @@ static inline std::string padStringRight(std::string s, size_t len)
 	return s;
 }
 
+// ends: NULL- or ""-terminated array of strings
+// Returns "" if no end could be removed.
+static inline std::string removeStringEnd(const std::string &s, const char *ends[])
+{
+	const char **p = ends;
+	for(; (*p) && (*p)[0] != '\0'; p++){
+		std::string end = *p;
+		if(s.size() < end.size())
+			continue;
+		if(s.substr(s.size()-end.size(), end.size()) == end)
+			return s.substr(0, s.size() - end.size());
+	}
+	return "";
+}
+
 #endif
 
-- 
GitLab