lib: add darr_strlen_fixup() to update len based on NUL term

Signed-off-by: Christian Hopps <chopps@labn.net>
This commit is contained in:
Christian Hopps 2025-03-13 20:32:59 +00:00
parent 2ab8cce2e1
commit d58a8f473b
2 changed files with 21 additions and 0 deletions

View file

@ -62,6 +62,7 @@
* - darr_strdup
* - darr_strdup_cap
* - darr_strlen
* - darr_strlen_fixup
* - darr_strnul
* - darr_sprintf, darr_vsprintf
*/
@ -752,6 +753,22 @@ void *__darr_resize(void *a, uint count, size_t esize, struct memtype *mt);
__size; \
})
/**
* Fixup darr_len (and thus darr_strlen) for `S` based on its strlen(S)
* (i.e., scan for NUL byte). The dynamic array length will be set to strlen(S) + 1.
*
* Args:
* S: The dynamic array with a NUL terminated string, cannot be NULL.
*
* Return:
* The calculated strlen() value.
*/
#define darr_strlen_fixup(S) \
({ \
_darr_len(S) = strlen(S) + 1; \
darr_strlen(S); \
})
/**
* darr_vsprintf() - vsprintf into a new dynamic array.
*

View file

@ -48,6 +48,7 @@
* [x] - darr_strdup
* [x] - darr_strdup_cap
* [x] - darr_strlen
* [x] - darr_strlen_fixup
* [x] - darr_strnul
* [ ] - darr_vsprintf
*/
@ -406,6 +407,9 @@ static void test_string(void)
assert(!strcmp(da1, "0123456789: DEADBEEF"));
assert(darr_strlen(da1) == 20);
assert(darr_cap(da1) == 128);
da1[5] = 0;
assert(darr_strlen_fixup(da1) == 5);
darr_free(da1);
da1 = darr_sprintf("0123456789: %08x", 0xDEADBEEF);