shared/strbuf: add nm_str_buf_erase() helper
This commit is contained in:
@@ -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)
|
||||
|
@@ -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 ();
|
||||
}
|
||||
|
Reference in New Issue
Block a user