summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Haller <thaller@redhat.com>2015-11-07 23:52:13 +0100
committerThomas Haller <thaller@redhat.com>2015-11-18 15:12:51 +0100
commit1654e2828e83d2a8068b86eacaf3efe6fcd5cb3a (patch)
tree1b8b012dd81ce33a0c445d84c3c2a27dcdbf6bbc
parenta7727830f51c9de9c699a15ed941d2b6384717ac (diff)
downloadNetworkManager-th/wip/run-state-1.tar.gz
core: add nm_utils_carray_remove_at_indexes() functionth/wip/run-state-1th/run-state
-rw-r--r--src/NetworkManagerUtils.c39
-rw-r--r--src/NetworkManagerUtils.h1
2 files changed, 26 insertions, 14 deletions
diff --git a/src/NetworkManagerUtils.c b/src/NetworkManagerUtils.c
index 45e8fbb91f..3ea37d8c2c 100644
--- a/src/NetworkManagerUtils.c
+++ b/src/NetworkManagerUtils.c
@@ -315,34 +315,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 {
@@ -358,7 +355,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);
@@ -371,8 +368,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;
@@ -382,11 +379,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/NetworkManagerUtils.h b/src/NetworkManagerUtils.h
index bf14153c26..0cf461f1bb 100644
--- a/src/NetworkManagerUtils.h
+++ b/src/NetworkManagerUtils.h
@@ -295,6 +295,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);