string_strim allows optionnal second argument which list the characters to strim.
This commit is contained in:
1 parent
fbbca37b55
commit
da07a5b613
2 files changed
+22
-3
No files matched your search
+18
-3
@@ -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
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in new issue
Block a user