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 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
|
static inline void
|
||||||
string_strim(string_t v)
|
string_strim(string_t v, const char charac[])
|
||||||
{
|
{
|
||||||
STRINGI_CONTRACT (v);
|
STRINGI_CONTRACT (v);
|
||||||
char *b = v->ptr;
|
char *b = v->ptr;
|
||||||
size_t size = v->size;
|
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 --;
|
size --;
|
||||||
if (size == 0) {
|
if (size == 0) {
|
||||||
v->ptr[0] = 0;
|
v->ptr[0] = 0;
|
||||||
v->size = size;
|
v->size = size;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
while (*b == ' ' || *b == '\n' || *b == '\r' || *b == '\t')
|
while (stringi_strim_char(*b, charac))
|
||||||
b++;
|
b++;
|
||||||
M_ASSUME (b >= v->ptr && size >= (size_t) (b - v->ptr) );
|
M_ASSUME (b >= v->ptr && size >= (size_t) (b - v->ptr) );
|
||||||
size -= (b - v->ptr);
|
size -= (b - v->ptr);
|
||||||
@@ -749,6 +760,7 @@ string_strim(string_t v)
|
|||||||
STRINGI_CONTRACT (v);
|
STRINGI_CONTRACT (v);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* I/O */
|
/* I/O */
|
||||||
static inline void
|
static inline void
|
||||||
string_get_str(string_t v, const string_t v2, bool append)
|
string_get_str(string_t v, const string_t v2, bool append)
|
||||||
@@ -1136,6 +1148,9 @@ namespace m_string {
|
|||||||
#define string_replace(v, s1, ...) \
|
#define string_replace(v, s1, ...) \
|
||||||
M_APPLY(string_replace, v, s1, M_IF_DEFAULT1(0, __VA_ARGS__))
|
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 */
|
/* Macro encapsulation for C11 */
|
||||||
#if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 201112L
|
#if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 201112L
|
||||||
|
|
||||||
|
|||||||
@@ -277,6 +277,10 @@ static void test0(void)
|
|||||||
string_strim(s1);
|
string_strim(s1);
|
||||||
assert (string_cmp_str (s1, "") == 0);
|
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_set_str(s1, "Hello world");
|
||||||
string_get_str(s2, s1, false);
|
string_get_str(s2, s1, false);
|
||||||
assert (string_cmp_str (s2, "\"Hello world\"") == 0);
|
assert (string_cmp_str (s2, "\"Hello world\"") == 0);
|
||||||
|
|||||||
Reference in new issue
Block a user