summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Haller <thaller@redhat.com>2015-11-07 23:52:13 +0100
committerThomas Haller <thaller@redhat.com>2016-04-07 11:03:12 +0200
commit2e4c56f518866983f9bed1c321bb9df0fededf55 (patch)
tree9386293c3f0c6d666e4475f25f146307a755b72c
parent1b43c880ba43260fe551b0ac923826f16737484f (diff)
downloadNetworkManager-th/wip/util/carray-remove-at-indexes.tar.gz
utils: add nm_utils_carray_remove_at_indexes() functionth/wip/util/carray-remove-at-indexesth/util/carray-remove-at-indexes
-rw-r--r--src/nm-core-utils.c39
-rw-r--r--src/nm-core-utils.h1
2 files changed, 26 insertions, 14 deletions
diff --git a/src/nm-core-utils.c b/src/nm-core-utils.c
index 6cdd00e0d7..7ea3fe873d 100644
--- a/src/nm-core-utils.c
+++ b/src/nm-core-utils.c
@@ -280,34 +280,31 @@ nm_utils_ip6_address_clear_host_address (struct in6_addr *dst, const struct in6_
}
void
-nm_utils_array_remove_at_indexes (GArray *array, const guint *indexes_to_delete, gsize len)
+nm_utils_carray_remove_at_indexes (gpointer carray, gsize elt_size, gsize *array_len, const guint *indexes_to_delete, gsize len)
{
- gsize elt_size;
guint index_to_delete;
guint i_src;
guint mm_src, mm_dst, mm_len;
gsize i_itd;
guint res_length;
+ char *array = carray;
- g_return_if_fail (array);
if (!len)
return;
g_return_if_fail (indexes_to_delete);
- elt_size = g_array_get_element_size (array);
-
i_itd = 0;
index_to_delete = indexes_to_delete[0];
- if (index_to_delete >= array->len)
+ if (index_to_delete >= *array_len)
g_return_if_reached ();
- res_length = array->len - 1;
+ res_length = *array_len - 1;
mm_dst = index_to_delete;
mm_src = index_to_delete;
mm_len = 0;
- for (i_src = index_to_delete; i_src < array->len; i_src++) {
+ for (i_src = index_to_delete; i_src < *array_len; i_src++) {
if (i_src < index_to_delete)
mm_len++;
else {
@@ -323,7 +320,7 @@ nm_utils_array_remove_at_indexes (GArray *array, const guint *indexes_to_delete,
dd = indexes_to_delete[++i_itd];
if (dd > index_to_delete) {
- if (dd >= array->len)
+ if (dd >= *array_len)
g_warn_if_reached ();
else {
g_assert (res_length > 0);
@@ -336,8 +333,8 @@ nm_utils_array_remove_at_indexes (GArray *array, const guint *indexes_to_delete,
}
if (mm_len) {
- memmove (&array->data[mm_dst * elt_size],
- &array->data[mm_src * elt_size],
+ memmove (&array[mm_dst * elt_size],
+ &array[mm_src * elt_size],
mm_len * elt_size);
mm_dst += mm_len;
mm_src += mm_len + 1;
@@ -347,11 +344,25 @@ nm_utils_array_remove_at_indexes (GArray *array, const guint *indexes_to_delete,
}
}
if (mm_len) {
- memmove (&array->data[mm_dst * elt_size],
- &array->data[mm_src * elt_size],
+ memmove (&array[mm_dst * elt_size],
+ &array[mm_src * elt_size],
mm_len * elt_size);
}
- g_array_set_size (array, res_length);
+
+ *array_len = res_length;
+}
+
+void
+nm_utils_array_remove_at_indexes (GArray *array, const guint *indexes_to_delete, gsize len)
+{
+ gsize array_len;
+
+ /* We cannot invoke the clear function for the deleted elements. */
+ g_array_set_clear_func (array, NULL);
+
+ array_len = array->len;
+ nm_utils_carray_remove_at_indexes (array->data, g_array_get_element_size (array), &array_len, indexes_to_delete, len);
+ g_array_set_size (array, array_len);
}
int
diff --git a/src/nm-core-utils.h b/src/nm-core-utils.h
index f77b43e2a3..e121987557 100644
--- a/src/nm-core-utils.h
+++ b/src/nm-core-utils.h
@@ -346,6 +346,7 @@ gboolean nm_utils_ipv6_addr_set_stable_privacy (struct in6_addr *addr,
void nm_utils_ipv6_interface_identfier_get_from_addr (NMUtilsIPv6IfaceId *iid,
const struct in6_addr *addr);
+void nm_utils_carray_remove_at_indexes (gpointer array, gsize elt_size, gsize *array_len, const guint *indexes_to_delete, gsize len);
void nm_utils_array_remove_at_indexes (GArray *array, const guint *indexes_to_delete, gsize len);
void nm_utils_setpgid (gpointer unused);