On Mon, Dec 05, 2016 at 11:31:50AM +0100, Michal Privoznik wrote:
Signed-off-by: Michal Privoznik <mpriv...@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.

Attachment: signature.asc
Description: Digital signature

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list

Reply via email to