git.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: "Rubén Justo" <rjusto@gmail.com>
To: Patrick Steinhardt <ps@pks.im>, git@vger.kernel.org
Subject: Re: [PATCH 09/26] strvec: introduce new `strvec_splice()` function
Date: Sun, 10 Nov 2024 22:39:08 +0100	[thread overview]
Message-ID: <41165e8c-eb5d-4fda-8f6b-67b7ec74bcbe@gmail.com> (raw)
In-Reply-To: <c23e1a08854530f5c2474725ddde1da1068c2c12.1730901926.git.ps@pks.im>

On Wed, Nov 06, 2024 at 04:10:44PM +0100, Patrick Steinhardt wrote:
> Introduce a new `strvec_splice()` function that can replace a range of
> strings in the vector with another array of strings. This function will
> be used in subsequent commits.
> 
> Signed-off-by: Patrick Steinhardt <ps@pks.im>
> ---
>  strvec.c              | 19 +++++++++++++
>  strvec.h              |  9 ++++++
>  t/unit-tests/strvec.c | 65 +++++++++++++++++++++++++++++++++++++++++++
>  3 files changed, 93 insertions(+)
> 
> diff --git a/strvec.c b/strvec.c
> index f712070f574..81075c50cca 100644
> --- a/strvec.c
> +++ b/strvec.c
> @@ -56,6 +56,25 @@ void strvec_pushv(struct strvec *array, const char **items)
>  		strvec_push(array, *items);
>  }
>  
> +void strvec_splice(struct strvec *array, size_t pos, size_t len,
> +		   const char **replacement, size_t replacement_len)

There's nothing wrong with `replacement_len`, but it has caught my
attention because in other strvec APIs we use null-terminated arrays.

> +{
> +	if (pos + len > array->alloc)
> +		BUG("range outside of array boundary");
> +	if (replacement_len > len)
> +		ALLOC_GROW(array->v, array->nr + (replacement_len - len) + 1,
> +			   array->alloc);
> +	for (size_t i = 0; i < len; i++)
> +		free((char *)array->v[pos + i]);
> +	if (replacement_len != len) {
> +		memmove(array->v + pos + replacement_len, array->v + pos + len,
> +			(array->nr - pos - len + 1) * sizeof(char *));
> +		array->nr += (replacement_len - len);
> +	}
> +	for (size_t i = 0; i < replacement_len; i++)
> +		array->v[pos + i] = xstrdup(replacement[i]);
> +}
> +
>  const char *strvec_replace(struct strvec *array, size_t idx, const char *replacement)
>  {
>  	char *to_free;
> diff --git a/strvec.h b/strvec.h
> index 4b73c1f092e..4e61cc93369 100644
> --- a/strvec.h
> +++ b/strvec.h
> @@ -67,6 +67,15 @@ void strvec_pushl(struct strvec *, ...);
>  /* Push a null-terminated array of strings onto the end of the array. */
>  void strvec_pushv(struct strvec *, const char **);
>  
> +/*
> + * Replace `len` values starting at `pos` with the provided replacement
> + * strings. If `len` is zero this is effectively an insert at the given `pos`.
> + * If `replacement_len` is zero this is effectively a delete of `len` items
> + * starting at `pos`.
> + */
> +void strvec_splice(struct strvec *array, size_t pos, size_t len,
> +		   const char **replacement, size_t replacement_len);
> +
>  /**
>   * Replace the value at the given index with a new value. The index must be
>   * valid. Returns a pointer to the inserted value.
> diff --git a/t/unit-tests/strvec.c b/t/unit-tests/strvec.c
> index bf4c0cb172e..855b6023371 100644
> --- a/t/unit-tests/strvec.c
> +++ b/t/unit-tests/strvec.c
> @@ -88,6 +88,71 @@ void test_strvec__pushv(void)
>  	strvec_clear(&vec);
>  }
>  
> +void test_strvec__splice_with_same_size_replacement(void)
> +{
> +	struct strvec vec = STRVEC_INIT;
> +	const char *replacement[] = { "1" };
> +
> +	strvec_pushl(&vec, "foo", "bar", "baz", NULL);
> +	strvec_splice(&vec, 1, 1, replacement, ARRAY_SIZE(replacement));
> +	check_strvec(&vec, "foo", "1", "baz", NULL);
> +	strvec_clear(&vec);
> +}
> +
> +void test_strvec__splice_with_smaller_replacement(void)
> +{
> +	struct strvec vec = STRVEC_INIT;
> +	const char *replacement[] = { "1" };
> +
> +	strvec_pushl(&vec, "foo", "bar", "baz", NULL);
> +	strvec_splice(&vec, 1, 2, replacement, ARRAY_SIZE(replacement));
> +	check_strvec(&vec, "foo", "1", NULL);
> +	strvec_clear(&vec);
> +}
> +
> +void test_strvec__splice_with_bigger_replacement(void)
> +{
> +	struct strvec vec = STRVEC_INIT;
> +	const char *replacement[] = { "1", "2", "3" };
> +
> +	strvec_pushl(&vec, "foo", "bar", "baz", NULL);
> +	strvec_splice(&vec, 0, 2, replacement, ARRAY_SIZE(replacement));
> +	check_strvec(&vec, "1", "2", "3", "baz", NULL);
> +	strvec_clear(&vec);
> +}
> +
> +void test_strvec__splice_with_empty_replacement(void)
> +{
> +	struct strvec vec = STRVEC_INIT;
> +
> +	strvec_pushl(&vec, "foo", "bar", "baz", NULL);
> +	strvec_splice(&vec, 0, 2, NULL, 0);
> +	check_strvec(&vec, "baz", NULL);
> +	strvec_clear(&vec);
> +}
> +
> +void test_strvec__splice_with_empty_original(void)
> +{
> +	struct strvec vec = STRVEC_INIT;
> +	const char *replacement[] = { "1", "2" };
> +
> +	strvec_pushl(&vec, "foo", "bar", "baz", NULL);
> +	strvec_splice(&vec, 1, 0, replacement, ARRAY_SIZE(replacement));
> +	check_strvec(&vec, "foo", "1", "2", "bar", "baz", NULL);
> +	strvec_clear(&vec);
> +}
> +
> +void test_strvec__splice_at_tail(void)
> +{
> +	struct strvec vec = STRVEC_INIT;
> +	const char *replacement[] = { "1", "2" };
> +
> +	strvec_pushl(&vec, "foo", "bar", NULL);
> +	strvec_splice(&vec, 2, 0, replacement, ARRAY_SIZE(replacement));
> +	check_strvec(&vec, "foo", "bar", "1", "2", NULL);
> +	strvec_clear(&vec);
> +}
> +
>  void test_strvec__replace_at_head(void)
>  {
>  	struct strvec vec = STRVEC_INIT;
> -- 
> 2.47.0.229.g8f8d6eee53.dirty
> 

  reply	other threads:[~2024-11-10 21:39 UTC|newest]

Thread overview: 117+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-11-06 15:10 [PATCH 00/26] Memory leak fixes (pt.10, final) Patrick Steinhardt
2024-11-06 15:10 ` [PATCH 01/26] builtin/blame: fix leaking blame entries with `--incremental` Patrick Steinhardt
2024-11-06 15:10 ` [PATCH 02/26] bisect: fix leaking good/bad terms when reading multipe times Patrick Steinhardt
2024-11-06 15:10 ` [PATCH 03/26] bisect: fix leaking string in `handle_bad_merge_base()` Patrick Steinhardt
2024-11-06 15:10 ` [PATCH 04/26] bisect: fix leaking `current_bad_oid` Patrick Steinhardt
2024-11-06 15:10 ` [PATCH 05/26] bisect: fix multiple leaks in `bisect_next_all()` Patrick Steinhardt
2024-11-06 15:10 ` [PATCH 06/26] bisect: fix leaking commit list items in `check_merge_base()` Patrick Steinhardt
2024-11-06 15:10 ` [PATCH 07/26] bisect: fix various cases where we leak commit list items Patrick Steinhardt
2024-11-06 15:10 ` [PATCH 08/26] line-log: fix leak when rewriting commit parents Patrick Steinhardt
2024-11-06 15:10 ` [PATCH 09/26] strvec: introduce new `strvec_splice()` function Patrick Steinhardt
2024-11-10 21:39   ` Rubén Justo [this message]
2024-11-11  9:09     ` Patrick Steinhardt
2024-11-06 15:10 ` [PATCH 10/26] git: refactor alias handling to use a `struct strvec` Patrick Steinhardt
2024-11-10 21:41   ` Rubén Justo
2024-11-06 15:10 ` [PATCH 11/26] git: refactor builtin " Patrick Steinhardt
2024-11-06 15:10 ` [PATCH 12/26] split-index: fix memory leak in `move_cache_to_base_index()` Patrick Steinhardt
2024-11-10 21:45   ` Rubén Justo
2024-11-06 15:10 ` [PATCH 13/26] builtin/sparse-checkout: fix leaking sanitized patterns Patrick Steinhardt
2024-11-06 15:11 ` [PATCH 14/26] help: refactor to not use globals for reading config Patrick Steinhardt
2024-11-06 15:11 ` [PATCH 15/26] help: fix leaking `struct cmdnames` Patrick Steinhardt
2024-11-10 21:46   ` Rubén Justo
2024-11-11  9:09     ` Patrick Steinhardt
2024-11-06 15:11 ` [PATCH 16/26] help: fix leaking return value from `help_unknown_cmd()` Patrick Steinhardt
2024-11-06 15:11 ` [PATCH 17/26] builtin/help: fix leaks in `check_git_cmd()` Patrick Steinhardt
2024-11-06 15:11 ` [PATCH 18/26] builtin/init-db: fix leaking directory paths Patrick Steinhardt
2024-11-10 21:47   ` Rubén Justo
2024-11-06 15:11 ` [PATCH 19/26] builtin/branch: fix leaking sorting options Patrick Steinhardt
2024-11-10 21:47   ` Rubén Justo
2024-11-06 15:11 ` [PATCH 20/26] t/helper: fix leaking commit graph in "read-graph" subcommand Patrick Steinhardt
2024-11-06 15:11 ` [PATCH 21/26] git-compat-util: drop `UNLEAK()` annotation Patrick Steinhardt
2024-11-10 21:47   ` Rubén Justo
2024-11-11  9:09     ` Patrick Steinhardt
2024-11-06 15:11 ` [PATCH 22/26] t5601: work around leak sanitizer issue Patrick Steinhardt
2024-11-06 15:11 ` [PATCH 23/26] t: mark some tests as leak free Patrick Steinhardt
2024-11-06 15:11 ` [PATCH 24/26] t: remove unneeded !SANITIZE_LEAK prerequisites Patrick Steinhardt
2024-11-06 15:11 ` [PATCH 25/26] test-lib: unconditionally enable leak checking Patrick Steinhardt
2024-11-06 15:11 ` [PATCH 26/26] t: remove TEST_PASSES_SANITIZE_LEAK annotations Patrick Steinhardt
2024-11-10 21:48 ` [PATCH 00/26] Memory leak fixes (pt.10, final) Rubén Justo
2024-11-11  9:09   ` Patrick Steinhardt
2024-11-11 10:38 ` [PATCH v2 00/27] " Patrick Steinhardt
2024-11-11 10:38   ` [PATCH v2 01/27] builtin/blame: fix leaking blame entries with `--incremental` Patrick Steinhardt
2024-11-11 10:38   ` [PATCH v2 02/27] bisect: fix leaking good/bad terms when reading multipe times Patrick Steinhardt
2024-11-11 10:38   ` [PATCH v2 03/27] bisect: fix leaking string in `handle_bad_merge_base()` Patrick Steinhardt
2024-11-11 10:38   ` [PATCH v2 04/27] bisect: fix leaking `current_bad_oid` Patrick Steinhardt
2024-11-11 10:38   ` [PATCH v2 05/27] bisect: fix multiple leaks in `bisect_next_all()` Patrick Steinhardt
2024-11-11 10:38   ` [PATCH v2 06/27] bisect: fix leaking commit list items in `check_merge_base()` Patrick Steinhardt
2024-11-11 10:38   ` [PATCH v2 07/27] bisect: fix various cases where we leak commit list items Patrick Steinhardt
2024-11-20 10:32     ` Toon Claes
2024-11-20 12:41       ` Patrick Steinhardt
2024-11-11 10:38   ` [PATCH v2 08/27] line-log: fix leak when rewriting commit parents Patrick Steinhardt
2024-11-11 10:38   ` [PATCH v2 09/27] strvec: introduce new `strvec_splice()` function Patrick Steinhardt
2024-11-20  8:37     ` Toon Claes
2024-11-20 12:41       ` Patrick Steinhardt
2024-11-20 23:13         ` Junio C Hamano
2024-11-21  8:11           ` Jeff King
2024-11-21  8:22             ` Jeff King
2024-11-21 10:23             ` Doxygen-styled comments [was: Re: [PATCH v2 09/27] strvec: introduce new `strvec_splice()` function] Toon Claes
2024-11-21 10:32               ` Jeff King
2024-11-11 10:38   ` [PATCH v2 10/27] git: refactor alias handling to use a `struct strvec` Patrick Steinhardt
2024-11-11 10:38   ` [PATCH v2 11/27] git: refactor builtin " Patrick Steinhardt
2024-11-20 10:38     ` Toon Claes
2024-11-11 10:38   ` [PATCH v2 12/27] split-index: fix memory leak in `move_cache_to_base_index()` Patrick Steinhardt
2024-11-11 10:38   ` [PATCH v2 13/27] builtin/sparse-checkout: fix leaking sanitized patterns Patrick Steinhardt
2024-11-11 10:38   ` [PATCH v2 14/27] help: refactor to not use globals for reading config Patrick Steinhardt
2024-11-11 10:38   ` [PATCH v2 15/27] help: fix leaking `struct cmdnames` Patrick Steinhardt
2024-11-11 10:38   ` [PATCH v2 16/27] help: fix leaking return value from `help_unknown_cmd()` Patrick Steinhardt
2024-11-11 10:38   ` [PATCH v2 17/27] builtin/help: fix leaks in `check_git_cmd()` Patrick Steinhardt
2024-11-11 10:38   ` [PATCH v2 18/27] builtin/init-db: fix leaking directory paths Patrick Steinhardt
2024-11-11 10:38   ` [PATCH v2 19/27] builtin/branch: fix leaking sorting options Patrick Steinhardt
2024-11-11 10:38   ` [PATCH v2 20/27] t/helper: fix leaking commit graph in "read-graph" subcommand Patrick Steinhardt
2024-11-11 10:38   ` [PATCH v2 21/27] global: drop `UNLEAK()` annotation Patrick Steinhardt
2024-11-12  8:26     ` Jeff King
2024-11-12  8:53       ` Patrick Steinhardt
2024-11-12  9:03         ` Jeff King
2024-11-11 10:38   ` [PATCH v2 22/27] git-compat-util: drop now-unused `UNLEAK()` macro Patrick Steinhardt
2024-11-11 10:38   ` [PATCH v2 23/27] t5601: work around leak sanitizer issue Patrick Steinhardt
2024-11-11 10:38   ` [PATCH v2 24/27] t: mark some tests as leak free Patrick Steinhardt
2024-11-11 10:38   ` [PATCH v2 25/27] t: remove unneeded !SANITIZE_LEAK prerequisites Patrick Steinhardt
2024-11-11 10:38   ` [PATCH v2 26/27] test-lib: unconditionally enable leak checking Patrick Steinhardt
2024-11-11 10:38   ` [PATCH v2 27/27] t: remove TEST_PASSES_SANITIZE_LEAK annotations Patrick Steinhardt
2024-11-20 10:40     ` Toon Claes
2024-11-20 12:41       ` Patrick Steinhardt
2024-11-11 23:33   ` [PATCH v2 00/27] Memory leak fixes (pt.10, final) Rubén Justo
2024-11-12  8:06     ` Rubén Justo
2024-11-20 13:39 ` [PATCH v3 " Patrick Steinhardt
2024-11-20 13:39   ` [PATCH v3 01/27] builtin/blame: fix leaking blame entries with `--incremental` Patrick Steinhardt
2024-11-20 13:39   ` [PATCH v3 02/27] bisect: fix leaking good/bad terms when reading multipe times Patrick Steinhardt
2024-11-20 13:39   ` [PATCH v3 03/27] bisect: fix leaking string in `handle_bad_merge_base()` Patrick Steinhardt
2024-11-20 13:39   ` [PATCH v3 04/27] bisect: fix leaking `current_bad_oid` Patrick Steinhardt
2024-11-20 13:39   ` [PATCH v3 05/27] bisect: fix multiple leaks in `bisect_next_all()` Patrick Steinhardt
2024-11-20 13:39   ` [PATCH v3 06/27] bisect: fix leaking commit list items in `check_merge_base()` Patrick Steinhardt
2024-11-20 13:39   ` [PATCH v3 07/27] bisect: fix various cases where we leak commit list items Patrick Steinhardt
2024-11-25 11:27     ` Jeff King
2024-11-25 12:38       ` Patrick Steinhardt
2024-11-25 13:17         ` Jeff King
2024-11-25 14:08           ` Patrick Steinhardt
2024-11-20 13:39   ` [PATCH v3 08/27] line-log: fix leak when rewriting commit parents Patrick Steinhardt
2024-11-20 13:39   ` [PATCH v3 09/27] strvec: introduce new `strvec_splice()` function Patrick Steinhardt
2024-11-20 13:39   ` [PATCH v3 10/27] git: refactor alias handling to use a `struct strvec` Patrick Steinhardt
2024-11-20 13:39   ` [PATCH v3 11/27] git: refactor builtin " Patrick Steinhardt
2024-11-20 13:39   ` [PATCH v3 12/27] split-index: fix memory leak in `move_cache_to_base_index()` Patrick Steinhardt
2024-11-20 13:39   ` [PATCH v3 13/27] builtin/sparse-checkout: fix leaking sanitized patterns Patrick Steinhardt
2024-11-20 13:39   ` [PATCH v3 14/27] help: refactor to not use globals for reading config Patrick Steinhardt
2024-11-20 13:39   ` [PATCH v3 15/27] help: fix leaking `struct cmdnames` Patrick Steinhardt
2024-11-20 13:39   ` [PATCH v3 16/27] help: fix leaking return value from `help_unknown_cmd()` Patrick Steinhardt
2024-11-20 13:39   ` [PATCH v3 17/27] builtin/help: fix leaks in `check_git_cmd()` Patrick Steinhardt
2024-11-20 13:39   ` [PATCH v3 18/27] builtin/init-db: fix leaking directory paths Patrick Steinhardt
2024-11-20 13:39   ` [PATCH v3 19/27] builtin/branch: fix leaking sorting options Patrick Steinhardt
2024-11-20 13:39   ` [PATCH v3 20/27] t/helper: fix leaking commit graph in "read-graph" subcommand Patrick Steinhardt
2024-11-20 13:39   ` [PATCH v3 21/27] global: drop `UNLEAK()` annotation Patrick Steinhardt
2024-11-20 13:39   ` [PATCH v3 22/27] git-compat-util: drop now-unused `UNLEAK()` macro Patrick Steinhardt
2024-11-20 13:39   ` [PATCH v3 23/27] t5601: work around leak sanitizer issue Patrick Steinhardt
2024-11-20 13:39   ` [PATCH v3 24/27] t: mark some tests as leak free Patrick Steinhardt
2024-11-20 13:39   ` [PATCH v3 25/27] t: remove unneeded !SANITIZE_LEAK prerequisites Patrick Steinhardt
2024-11-20 13:39   ` [PATCH v3 26/27] test-lib: unconditionally enable leak checking Patrick Steinhardt
2024-11-20 13:39   ` [PATCH v3 27/27] t: remove TEST_PASSES_SANITIZE_LEAK annotations Patrick Steinhardt
2024-11-21 10:32   ` [PATCH v3 00/27] Memory leak fixes (pt.10, final) Toon Claes

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=41165e8c-eb5d-4fda-8f6b-67b7ec74bcbe@gmail.com \
    --to=rjusto@gmail.com \
    --cc=git@vger.kernel.org \
    --cc=ps@pks.im \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).