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
|
static inline void
|
||||||
nm_str_buf_append_c (NMStrBuf *strbuf,
|
nm_str_buf_append_c (NMStrBuf *strbuf,
|
||||||
char ch)
|
char ch)
|
||||||
|
@@ -9,6 +9,7 @@
|
|||||||
|
|
||||||
#include "nm-std-aux/unaligned.h"
|
#include "nm-std-aux/unaligned.h"
|
||||||
#include "nm-glib-aux/nm-random-utils.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-time-utils.h"
|
||||||
#include "nm-glib-aux/nm-ref-string.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 ();
|
NMTST_DEFINE ();
|
||||||
|
|
||||||
int main (int argc, char **argv)
|
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_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_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_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 ();
|
return g_test_run ();
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user