diff options
author | Thomas Haller <thaller@redhat.com> | 2015-11-07 23:52:13 +0100 |
---|---|---|
committer | Thomas Haller <thaller@redhat.com> | 2015-11-18 15:12:51 +0100 |
commit | 1654e2828e83d2a8068b86eacaf3efe6fcd5cb3a (patch) | |
tree | 1b8b012dd81ce33a0c445d84c3c2a27dcdbf6bbc | |
parent | a7727830f51c9de9c699a15ed941d2b6384717ac (diff) | |
download | NetworkManager-th/run-state.tar.gz |
core: add nm_utils_carray_remove_at_indexes() functionth/wip/run-state-1th/run-state
-rw-r--r-- | src/NetworkManagerUtils.c | 39 | ||||
-rw-r--r-- | src/NetworkManagerUtils.h | 1 |
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); |