string_strim allows optionnal second argument which list the characters to strim.

This commit is contained in:
Patrick Pelissier committed 2018-04-20 20:46:44 +02:00
1 parent fbbca37b55
commit da07a5b613
2 files changed
+22 -3

No files matched your search

+18 -3
View File
@@ -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
+4
View File
@@ -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);