]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
util: Introduce virStringListRemoveDuplicates
authorJiri Denemark <jdenemar@redhat.com>
Wed, 23 Oct 2024 13:56:41 +0000 (15:56 +0200)
committerJiri Denemark <jdenemar@redhat.com>
Thu, 24 Oct 2024 13:53:51 +0000 (15:53 +0200)
Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
src/libvirt_private.syms
src/util/virstring.c
src/util/virstring.h

index c1542847f4a2d5840ba9f7016d9f794ba6382491..89cd20eece3498a746f83446290ab31ea722e206 100644 (file)
@@ -3438,6 +3438,7 @@ virStringHasControlChars;
 virStringHasSuffix;
 virStringIsEmpty;
 virStringIsPrintable;
+virStringListRemoveDuplicates;
 virStringMatch;
 virStringMatchesNameSuffix;
 virStringParsePort;
index 81c9aff3042eb1e0fba78a4aef569b1f3814cd25..bc9b6cd40e25b3a4b77e1abde81fbb8ad469c70f 100644 (file)
@@ -1065,3 +1065,32 @@ virStringParseVersion(unsigned long long *version,
 
     return 0;
 }
+
+
+/**
+ * virStringListRemoveDuplicates:
+ * @list: pointer to a sorted NULL-terminated string list
+ *
+ * Replace the list pointed to by @list with a new list without duplicate
+ * strings. The original list has to be sorted.
+ */
+void
+virStringListRemoveDuplicates(char ***list)
+{
+    size_t len = g_strv_length(*list);
+    char **unique;
+    size_t n = 0;
+    size_t i;
+
+    unique = g_malloc0_n(len + 1, sizeof(char *));
+
+    for (i = 0; i < len; i++) {
+        if (n > 0 && STREQ_NULLABLE(unique[n - 1], (*list)[i]))
+            g_free((*list)[i]);
+        else
+            unique[n++] = (*list)[i];
+    }
+
+    g_free(*list);
+    *list = g_renew(char *, unique, n + 1);
+}
index 8f9b1edc8fe524f355ad436c4ff0aacc0c5d1ed4..31a404e1063409117849feb8dacfd74de7797ca6 100644 (file)
@@ -138,3 +138,5 @@ int virStringParseYesNo(const char *str,
 int virStringParseVersion(unsigned long long *version,
                           const char *str,
                           bool allowMissing);
+
+void virStringListRemoveDuplicates(char ***list);