From da07a5b613da8bff4599eb0ffc2203d39500b9be Mon Sep 17 00:00:00 2001 From: Patrick Pelissier Date: Fri, 20 Apr 2018 20:46:44 +0200 Subject: [PATCH] string_strim allows optionnal second argument which list the characters to strim. --- m-string.h | 21 ++++++++++++++++++--- tests/test-mstring.c | 4 ++++ 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/m-string.h b/m-string.h index f633d57c..f8f650c2 100644 --- a/m-string.h +++ b/m-string.h @@ -726,20 +726,31 @@ string_hash(const string_t v) return m_core_hash(v->ptr, v->size); } +// Return true if c is a character from charac +static bool +stringi_strim_char(char c, const char charac[]) +{ + for(const char *s = charac; *s; s++) { + if (c == *s) + return true; + } + return false; +} + static inline void -string_strim(string_t v) +string_strim(string_t v, const char charac[]) { STRINGI_CONTRACT (v); char *b = v->ptr; size_t size = v->size; - while (size > 0 && (b[size-1] == ' ' || b[size-1] == '\n' || b[size-1] == '\r' || b[size-1] == '\t')) + while (size > 0 && stringi_strim_char(b[size-1], charac)) size --; if (size == 0) { v->ptr[0] = 0; v->size = size; return; } - while (*b == ' ' || *b == '\n' || *b == '\r' || *b == '\t') + while (stringi_strim_char(*b, charac)) b++; M_ASSUME (b >= v->ptr && size >= (size_t) (b - v->ptr) ); size -= (b - v->ptr); @@ -749,6 +760,7 @@ string_strim(string_t v) STRINGI_CONTRACT (v); } + /* I/O */ static inline void string_get_str(string_t v, const string_t v2, bool append) @@ -1136,6 +1148,9 @@ namespace m_string { #define string_replace(v, s1, ...) \ M_APPLY(string_replace, v, s1, M_IF_DEFAULT1(0, __VA_ARGS__)) +#define string_strim(...) \ + M_APPLY(string_strim, M_IF_DEFAULT1(" \n\r\t", __VA_ARGS__)) + /* Macro encapsulation for C11 */ #if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 201112L diff --git a/tests/test-mstring.c b/tests/test-mstring.c index 99b48bca..59947bd5 100644 --- a/tests/test-mstring.c +++ b/tests/test-mstring.c @@ -277,6 +277,10 @@ static void test0(void) string_strim(s1); assert (string_cmp_str (s1, "") == 0); + string_set_str(s1, " \r\n\t++\t YES ++ \n\r\t"); + string_strim(s1, "\r\n\t +"); + assert (string_cmp_str (s1, "YES") == 0); + string_set_str(s1, "Hello world"); string_get_str(s2, s1, false); assert (string_cmp_str (s2, "\"Hello world\"") == 0);