[libvirt] [PATCH v2 04/10] virstring: Introduce virStringListRemove

Martin Kletzander mkletzan at redhat.com
Mon Dec 5 15:23:46 UTC 2016


On Mon, Dec 05, 2016 at 11:31:50AM +0100, Michal Privoznik wrote:
>Signed-off-by: Michal Privoznik <mprivozn at redhat.com>
>---
> src/libvirt_private.syms |  1 +
> src/util/virstring.c     | 50 ++++++++++++++++++++++++++++++++++++++++++
> src/util/virstring.h     |  3 +++
> tests/virstringtest.c    | 56 ++++++++++++++++++++++++++++++++++++++++++++++++
> 4 files changed, 110 insertions(+)
>
>diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
>index bc6588969..3d4da7356 100644
>--- a/src/libvirt_private.syms
>+++ b/src/libvirt_private.syms
>@@ -2467,6 +2467,7 @@ virStringListGetFirstWithPrefix;
> virStringListHasString;
> virStringListJoin;
> virStringListLength;
>+virStringListRemove;
> virStringReplace;
> virStringSearch;
> virStringSortCompare;
>diff --git a/src/util/virstring.c b/src/util/virstring.c
>index 629f8ca32..96786db7f 100644
>--- a/src/util/virstring.c
>+++ b/src/util/virstring.c
>@@ -202,6 +202,56 @@ virStringListAdd(const char **strings,
> }
>
>
>+/**
>+ * virStringListRemove:
>+ * @strings: a NULL-terminated array of strings
>+ * @newStrings: new NULL-terminated array of strings
>+ * @item: string to remove
>+ *
>+ * Creates new strings list with all strings duplicated except
>+ * for every occurrence of @item. Callers is responsible for
>+ * freeing both @strings and returned list.
>+ *
>+ * Returns the number of items in the new list (excluding NULL
>+ * anchor), -1 on error.
>+ */
>+int
>+virStringListRemove(const char **strings,
>+                    char ***newStrings,
>+                    const char *item)
>+{
>+    char **ret = NULL;
>+    size_t i, j = 0;
>+
>+    for (i = 0; strings && strings[i]; i++) {
>+        if (STRNEQ(strings[i], item))
>+            j++;
>+    }
>+
>+    if (!j) {
>+        *newStrings = NULL;
>+        return 0;
>+    }
>+
>+    if (VIR_ALLOC_N(ret, j + 1) < 0)
>+        goto error;
>+
>+    for (i = 0, j = 0; strings[i]; i++) {
>+        if (STREQ(strings[i], item))
>+            continue;
>+        if (VIR_STRDUP(ret[j], strings[i]) < 0)
>+            goto error;
>+        j++;
>+    }
>+

Instead of going twice through the list, you can just do it once and
then VIR_REALLOC_N the list.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 833 bytes
Desc: Digital signature
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20161205/1e1575eb/attachment-0001.sig>


More information about the libvir-list mailing list