shared/strbuf: add nm_str_buf_erase() helper

This commit is contained in:
Thomas Haller
2020-04-06 11:58:35 +02:00
parent f8efed528d
commit 19fff8444e
2 changed files with 73 additions and 0 deletions

View File

@@ -119,6 +119,44 @@ nm_str_buf_set_size (NMStrBuf *strbuf,
/*****************************************************************************/
static inline void
nm_str_buf_erase (NMStrBuf *strbuf,
gsize pos,
gssize len,
gboolean honor_do_bzero_mem)
{
gsize new_len;
_nm_str_buf_assert (strbuf);
nm_assert (pos <= strbuf->len);
if (len == 0)
return;
if (len < 0) {
/* truncate the string before pos */
nm_assert (len == -1);
new_len = pos;
} else {
gsize l = len;
nm_assert (l <= strbuf->len - pos);
new_len = strbuf->len - l;
if (pos + l < strbuf->len) {
memmove (&strbuf->_str[pos],
&strbuf->_str[pos + l],
strbuf->len - (pos + l));
}
}
nm_assert (new_len <= strbuf->len);
nm_str_buf_set_size (strbuf, new_len, honor_do_bzero_mem, TRUE);
}
/*****************************************************************************/
static inline void
nm_str_buf_append_c (NMStrBuf *strbuf,
char ch)

View File

@@ -9,6 +9,7 @@
#include "nm-std-aux/unaligned.h"
#include "nm-glib-aux/nm-random-utils.h"
#include "nm-glib-aux/nm-str-buf.h"
#include "nm-glib-aux/nm-time-utils.h"
#include "nm-glib-aux/nm-ref-string.h"
@@ -737,6 +738,39 @@ test_nm_utils_get_next_realloc_size (void)
/*****************************************************************************/
static void
test_nm_str_buf (void)
{
guint i_run;
for (i_run = 0; TRUE; i_run++) {
nm_auto_str_buf NMStrBuf strbuf = { };
nm_auto_free_gstring GString *gstr = NULL;
int i, j, k;
int c;
nm_str_buf_init (&strbuf,
nmtst_get_rand_uint32 () % 200u + 1u,
nmtst_get_rand_bool ());
if (i_run < 1000) {
c = nmtst_get_rand_word_length (NULL);
for (i = 0; i < c; i++)
nm_str_buf_append_c (&strbuf, '0' + (i % 10));
gstr = g_string_new (nm_str_buf_get_str (&strbuf));
j = nmtst_get_rand_uint32 () % (strbuf.len + 1);
k = nmtst_get_rand_uint32 () % (strbuf.len - j + 2) - 1;
nm_str_buf_erase (&strbuf, j, k, nmtst_get_rand_bool ());
g_string_erase (gstr, j, k);
g_assert_cmpstr (gstr->str, ==, nm_str_buf_get_str (&strbuf));
} else
return;
}
}
/*****************************************************************************/
NMTST_DEFINE ();
int main (int argc, char **argv)
@@ -757,6 +791,7 @@ int main (int argc, char **argv)
g_test_add_func ("/general/test_nm_ref_string", test_nm_ref_string);
g_test_add_func ("/general/test_string_table_lookup", test_string_table_lookup);
g_test_add_func ("/general/test_nm_utils_get_next_realloc_size", test_nm_utils_get_next_realloc_size);
g_test_add_func ("/general/test_nm_str_buf", test_nm_str_buf);
return g_test_run ();
}