[PATCH v2 1/4] util: Introduce virStringListRemoveDuplicates

Jiri Denemark posted 4 patches 2 months, 3 weeks ago
[PATCH v2 1/4] util: Introduce virStringListRemoveDuplicates
Posted by Jiri Denemark 2 months, 3 weeks ago
Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
---

Notes:
    Version 2:
    - new patch

 src/libvirt_private.syms |  1 +
 src/util/virstring.c     | 29 +++++++++++++++++++++++++++++
 src/util/virstring.h     |  2 ++
 3 files changed, 32 insertions(+)

diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
index c1542847f4..89cd20eece 100644
--- a/src/libvirt_private.syms
+++ b/src/libvirt_private.syms
@@ -3438,6 +3438,7 @@ virStringHasControlChars;
 virStringHasSuffix;
 virStringIsEmpty;
 virStringIsPrintable;
+virStringListRemoveDuplicates;
 virStringMatch;
 virStringMatchesNameSuffix;
 virStringParsePort;
diff --git a/src/util/virstring.c b/src/util/virstring.c
index 81c9aff304..bc9b6cd40e 100644
--- a/src/util/virstring.c
+++ b/src/util/virstring.c
@@ -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);
+}
diff --git a/src/util/virstring.h b/src/util/virstring.h
index 8f9b1edc8f..31a404e106 100644
--- a/src/util/virstring.h
+++ b/src/util/virstring.h
@@ -138,3 +138,5 @@ int virStringParseYesNo(const char *str,
 int virStringParseVersion(unsigned long long *version,
                           const char *str,
                           bool allowMissing);
+
+void virStringListRemoveDuplicates(char ***list);
-- 
2.47.0
Re: [PATCH v2 1/4] util: Introduce virStringListRemoveDuplicates
Posted by Peter Krempa 2 months, 3 weeks ago
On Wed, Oct 23, 2024 at 16:54:50 +0200, Jiri Denemark wrote:
> Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
> ---
> 
> Notes:
>     Version 2:
>     - new patch
> 
>  src/libvirt_private.syms |  1 +
>  src/util/virstring.c     | 29 +++++++++++++++++++++++++++++
>  src/util/virstring.h     |  2 ++
>  3 files changed, 32 insertions(+)
> 
> diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
> index c1542847f4..89cd20eece 100644
> --- a/src/libvirt_private.syms
> +++ b/src/libvirt_private.syms
> @@ -3438,6 +3438,7 @@ virStringHasControlChars;
>  virStringHasSuffix;
>  virStringIsEmpty;
>  virStringIsPrintable;
> +virStringListRemoveDuplicates;
>  virStringMatch;
>  virStringMatchesNameSuffix;
>  virStringParsePort;
> diff --git a/src/util/virstring.c b/src/util/virstring.c
> index 81c9aff304..bc9b6cd40e 100644
> --- a/src/util/virstring.c
> +++ b/src/util/virstring.c
> @@ -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 *));

Please use g_new0(char *, len + 1) instead.
Re: [PATCH v2 1/4] util: Introduce virStringListRemoveDuplicates
Posted by Ján Tomko 2 months, 3 weeks ago
On a Wednesday in 2024, Jiri Denemark wrote:
>Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
>---
>
>Notes:
>    Version 2:
>    - new patch
>
> src/libvirt_private.syms |  1 +
> src/util/virstring.c     | 29 +++++++++++++++++++++++++++++
> src/util/virstring.h     |  2 ++
> 3 files changed, 32 insertions(+)
>

Reviewed-by: Ján Tomko <jtomko@redhat.com>

Jano