mirror of
https://gitlab.gnome.org/GNOME/glib.git
synced 2025-10-01 03:16:38 +02:00
Merge branch 'zero_terminate_null' into 'main'
garray: Support unallocated zero terminated arrays See merge request GNOME/glib!4684
This commit is contained in:
@@ -198,7 +198,9 @@ g_array_new_take (gpointer data,
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* g_array_new_take_zero_terminated: (skip)
|
* g_array_new_take_zero_terminated: (skip)
|
||||||
* @data: (array zero-terminated=1): an array of elements of @element_size
|
* @data: (array zero-terminated=1) (transfer full) (nullable): an array
|
||||||
|
* of elements of @element_size, %NULL terminated,
|
||||||
|
* or %NULL for an empty array
|
||||||
* @clear: %TRUE if #GArray elements should be automatically cleared
|
* @clear: %TRUE if #GArray elements should be automatically cleared
|
||||||
* to 0 when they are allocated
|
* to 0 when they are allocated
|
||||||
* @element_size: the size of each element in bytes
|
* @element_size: the size of each element in bytes
|
||||||
@@ -271,8 +273,9 @@ g_array_new_take_zero_terminated (gpointer data,
|
|||||||
* the underlying array is preserved for use elsewhere and returned
|
* the underlying array is preserved for use elsewhere and returned
|
||||||
* to the caller.
|
* to the caller.
|
||||||
*
|
*
|
||||||
* If the array was created with the @zero_terminate property
|
* Note that if the array was created with the @zero_terminate
|
||||||
* set to %TRUE, the returned data is zero terminated too.
|
* property set to %TRUE, this may still return %NULL if the length
|
||||||
|
* of the array was zero and data was not yet allocated.
|
||||||
*
|
*
|
||||||
* If array elements contain dynamically-allocated memory,
|
* If array elements contain dynamically-allocated memory,
|
||||||
* the array elements should also be freed by the caller.
|
* the array elements should also be freed by the caller.
|
||||||
@@ -770,11 +773,12 @@ g_array_set_size (GArray *farray,
|
|||||||
}
|
}
|
||||||
else if (length < array->len)
|
else if (length < array->len)
|
||||||
g_array_remove_range (farray, length, array->len - length);
|
g_array_remove_range (farray, length, array->len - length);
|
||||||
|
|
||||||
array->len = length;
|
array->len = length;
|
||||||
|
|
||||||
g_array_zero_terminate (array);
|
if (G_LIKELY (array->data != NULL))
|
||||||
|
g_array_zero_terminate (array);
|
||||||
|
|
||||||
return farray;
|
return farray;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -881,6 +885,9 @@ g_array_remove_range (GArray *farray,
|
|||||||
g_return_val_if_fail (index_ <= G_MAXUINT - length, NULL);
|
g_return_val_if_fail (index_ <= G_MAXUINT - length, NULL);
|
||||||
g_return_val_if_fail (index_ + length <= array->len, NULL);
|
g_return_val_if_fail (index_ + length <= array->len, NULL);
|
||||||
|
|
||||||
|
if (length == 0)
|
||||||
|
return farray;
|
||||||
|
|
||||||
if (array->clear_func != NULL)
|
if (array->clear_func != NULL)
|
||||||
{
|
{
|
||||||
guint i;
|
guint i;
|
||||||
|
@@ -100,6 +100,20 @@ array_set_size (gconstpointer test_data)
|
|||||||
g_array_unref (garray);
|
g_array_unref (garray);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Check that unallocated zero terminated arrays can be set to size 0. */
|
||||||
|
static void
|
||||||
|
array_set_size_zero_terminated_null (void)
|
||||||
|
{
|
||||||
|
GArray *garray;
|
||||||
|
|
||||||
|
garray = g_array_new_take_zero_terminated(NULL, FALSE, sizeof (gchar));
|
||||||
|
|
||||||
|
g_array_set_size (garray, 0);
|
||||||
|
g_assert_cmpuint (garray->len, ==, 0);
|
||||||
|
|
||||||
|
g_array_free (garray, TRUE);
|
||||||
|
}
|
||||||
|
|
||||||
/* As with array_set_size(), but with a sized array. */
|
/* As with array_set_size(), but with a sized array. */
|
||||||
static void
|
static void
|
||||||
array_set_size_sized (gconstpointer test_data)
|
array_set_size_sized (gconstpointer test_data)
|
||||||
@@ -307,6 +321,24 @@ array_new_take_zero_terminated (void)
|
|||||||
g_clear_pointer (&old_data_copy, g_free);
|
g_clear_pointer (&old_data_copy, g_free);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Check that a non-existing array becomes a zero-terminated one when requested. */
|
||||||
|
static void
|
||||||
|
array_new_take_zero_terminated_null (void)
|
||||||
|
{
|
||||||
|
GArray *garray;
|
||||||
|
gchar *out_str = NULL;
|
||||||
|
gsize len;
|
||||||
|
|
||||||
|
garray = g_array_new_take_zero_terminated (NULL, FALSE, sizeof (gchar));
|
||||||
|
g_assert_cmpuint (garray->len, ==, 0);
|
||||||
|
|
||||||
|
out_str = g_array_steal (garray, &len);
|
||||||
|
g_assert_cmpstr (out_str, ==, NULL);
|
||||||
|
g_assert_cmpuint (len, ==, 0);
|
||||||
|
|
||||||
|
g_free (out_str);
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
array_new_take_overflow (void)
|
array_new_take_overflow (void)
|
||||||
{
|
{
|
||||||
@@ -673,6 +705,21 @@ array_remove_range (gconstpointer test_data)
|
|||||||
g_array_free (garray, TRUE);
|
g_array_free (garray, TRUE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Check that g_array_remove_range() works with a zero terminated array
|
||||||
|
* without any data. */
|
||||||
|
static void
|
||||||
|
array_remove_range_zero_terminated_null (void)
|
||||||
|
{
|
||||||
|
GArray *garray;
|
||||||
|
|
||||||
|
garray = g_array_new_take_zero_terminated(NULL, FALSE, sizeof (gchar));
|
||||||
|
|
||||||
|
g_array_remove_range (garray, 0, 0);
|
||||||
|
g_assert_cmpuint (garray->len, ==, 0);
|
||||||
|
|
||||||
|
g_array_free (garray, TRUE);
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
array_ref_count (void)
|
array_ref_count (void)
|
||||||
{
|
{
|
||||||
@@ -3194,6 +3241,7 @@ main (int argc, char *argv[])
|
|||||||
g_test_add_func ("/array/new/take/empty", array_new_take_empty);
|
g_test_add_func ("/array/new/take/empty", array_new_take_empty);
|
||||||
g_test_add_func ("/array/new/take/overflow", array_new_take_overflow);
|
g_test_add_func ("/array/new/take/overflow", array_new_take_overflow);
|
||||||
g_test_add_func ("/array/new/take-zero-terminated", array_new_take_zero_terminated);
|
g_test_add_func ("/array/new/take-zero-terminated", array_new_take_zero_terminated);
|
||||||
|
g_test_add_func ("/array/new/take-zero-terminated/null", array_new_take_zero_terminated_null);
|
||||||
g_test_add_func ("/array/ref-count", array_ref_count);
|
g_test_add_func ("/array/ref-count", array_ref_count);
|
||||||
g_test_add_func ("/array/steal", array_steal);
|
g_test_add_func ("/array/steal", array_steal);
|
||||||
g_test_add_func ("/array/clear-func", array_clear_func);
|
g_test_add_func ("/array/clear-func", array_clear_func);
|
||||||
@@ -3201,6 +3249,8 @@ main (int argc, char *argv[])
|
|||||||
g_test_add_func ("/array/copy-sized", test_array_copy_sized);
|
g_test_add_func ("/array/copy-sized", test_array_copy_sized);
|
||||||
g_test_add_func ("/array/overflow-append-vals", array_overflow_append_vals);
|
g_test_add_func ("/array/overflow-append-vals", array_overflow_append_vals);
|
||||||
g_test_add_func ("/array/overflow-set-size", array_overflow_set_size);
|
g_test_add_func ("/array/overflow-set-size", array_overflow_set_size);
|
||||||
|
g_test_add_func ("/array/remove-range/zero-terminated-null", array_remove_range_zero_terminated_null);
|
||||||
|
g_test_add_func ("/array/set-size/zero-terminated-null", array_set_size_zero_terminated_null);
|
||||||
|
|
||||||
for (i = 0; i < G_N_ELEMENTS (array_configurations); i++)
|
for (i = 0; i < G_N_ELEMENTS (array_configurations); i++)
|
||||||
{
|
{
|
||||||
|
Reference in New Issue
Block a user