From 19fff8444e7074f546a0af1133fc32829bc2bc1d Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Mon, 6 Apr 2020 11:58:35 +0200 Subject: [PATCH] shared/strbuf: add nm_str_buf_erase() helper --- shared/nm-glib-aux/nm-str-buf.h | 38 +++++++++++++++++++ .../nm-glib-aux/tests/test-shared-general.c | 35 +++++++++++++++++ 2 files changed, 73 insertions(+) diff --git a/shared/nm-glib-aux/nm-str-buf.h b/shared/nm-glib-aux/nm-str-buf.h index 83cf27562..fdf7e3aaf 100644 --- a/shared/nm-glib-aux/nm-str-buf.h +++ b/shared/nm-glib-aux/nm-str-buf.h @@ -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) diff --git a/shared/nm-glib-aux/tests/test-shared-general.c b/shared/nm-glib-aux/tests/test-shared-general.c index 61c6c4a4c..5c8bdf18e 100644 --- a/shared/nm-glib-aux/tests/test-shared-general.c +++ b/shared/nm-glib-aux/tests/test-shared-general.c @@ -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 (); }