From 607c2c5ba2c19f29c94690c5cc1e28c894286f70 Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Fri, 16 Oct 2015 19:15:30 +0200 Subject: util/StringUtil: add StringAfterPrefix() --- src/util/StringUtil.cxx | 16 ++++++++++++++++ src/util/StringUtil.hxx | 9 +++++++++ src/util/WStringUtil.cxx | 15 +++++++++++++++ src/util/WStringUtil.hxx | 9 +++++++++ 4 files changed, 49 insertions(+) (limited to 'src/util') diff --git a/src/util/StringUtil.cxx b/src/util/StringUtil.cxx index bb454e904..b9c99eb4a 100644 --- a/src/util/StringUtil.cxx +++ b/src/util/StringUtil.cxx @@ -18,6 +18,7 @@ */ #include "StringUtil.hxx" +#include "StringAPI.hxx" #include "CharUtil.hxx" #include "ASCII.hxx" @@ -44,6 +45,21 @@ StringEndsWith(const char *haystack, const char *needle) needle, needle_length) == 0; } +const char * +StringAfterPrefix(const char *string, const char *prefix) +{ +#if !CLANG_CHECK_VERSION(3,6) + /* disabled on clang due to -Wtautological-pointer-compare */ + assert(string != nullptr); + assert(prefix != nullptr); +#endif + + size_t prefix_length = strlen(prefix); + return StringIsEqual(string, prefix, prefix_length) + ? string + prefix_length + : nullptr; +} + const char * FindStringSuffix(const char *p, const char *suffix) { diff --git a/src/util/StringUtil.hxx b/src/util/StringUtil.hxx index 2d0773a62..7e6dc4d61 100644 --- a/src/util/StringUtil.hxx +++ b/src/util/StringUtil.hxx @@ -36,6 +36,15 @@ gcc_pure bool StringEndsWith(const char *haystack, const char *needle); +/** + * Returns the portion of the string after a prefix. If the string + * does not begin with the specified prefix, this function returns + * nullptr. + */ +gcc_pure gcc_nonnull_all +const char * +StringAfterPrefix(const char *string, const char *prefix); + /** * Check if the given string ends with the specified suffix. If yes, * returns the position of the suffix, and nullptr otherwise. diff --git a/src/util/WStringUtil.cxx b/src/util/WStringUtil.cxx index b70a7749e..19e4fc68d 100644 --- a/src/util/WStringUtil.cxx +++ b/src/util/WStringUtil.cxx @@ -42,6 +42,21 @@ StringEndsWith(const wchar_t *haystack, const wchar_t *needle) StringIsEqual(haystack + haystack_length - needle_length, needle); } +const wchar_t * +StringAfterPrefix(const wchar_t *string, const wchar_t *prefix) +{ +#if !CLANG_CHECK_VERSION(3,6) + /* disabled on clang due to -Wtautological-pointer-compare */ + assert(string != nullptr); + assert(prefix != nullptr); +#endif + + size_t prefix_length = StringLength(prefix); + return StringIsEqual(string, prefix, prefix_length) + ? string + prefix_length + : nullptr; +} + const wchar_t * FindStringSuffix(const wchar_t *p, const wchar_t *suffix) { diff --git a/src/util/WStringUtil.hxx b/src/util/WStringUtil.hxx index bfbfb5d1f..3dde0162e 100644 --- a/src/util/WStringUtil.hxx +++ b/src/util/WStringUtil.hxx @@ -32,6 +32,15 @@ gcc_pure bool StringEndsWith(const wchar_t *haystack, const wchar_t *needle); +/** + * Returns the portion of the string after a prefix. If the string + * does not begin with the specified prefix, this function returns + * nullptr. + */ +gcc_nonnull_all +const wchar_t * +StringAfterPrefix(const wchar_t *string, const wchar_t *prefix); + /** * Check if the given string ends with the specified suffix. If yes, * returns the position of the suffix, and nullptr otherwise. -- cgit v1.2.3