Blame SOURCES/0001-adutil-add-_adcli_strv_add_unique.patch

a5a4ce
From 85d127fd52a8469f9f3ce0d1130fe17e756fdd75 Mon Sep 17 00:00:00 2001
a5a4ce
From: Sumit Bose <sbose@redhat.com>
a5a4ce
Date: Fri, 16 Nov 2018 13:32:33 +0100
a5a4ce
Subject: [PATCH 1/2] adutil: add _adcli_strv_add_unique
a5a4ce
a5a4ce
_adcli_strv_add_unique checks is the new value already exists in the
a5a4ce
strv before adding it. Check can be done case-sensitive or not.
a5a4ce
a5a4ce
Related to https://gitlab.freedesktop.org/realmd/adcli/issues/16
a5a4ce
---
a5a4ce
 library/adprivate.h |  5 ++++
a5a4ce
 library/adutil.c    | 65 ++++++++++++++++++++++++++++++++++++++-------
a5a4ce
 2 files changed, 61 insertions(+), 9 deletions(-)
a5a4ce
a5a4ce
diff --git a/library/adprivate.h b/library/adprivate.h
a5a4ce
index bc9df6d..0806430 100644
a5a4ce
--- a/library/adprivate.h
a5a4ce
+++ b/library/adprivate.h
a5a4ce
@@ -111,6 +111,11 @@ char **        _adcli_strv_add               (char **strv,
a5a4ce
                                               char *string,
a5a4ce
                                               int *length) GNUC_WARN_UNUSED;
a5a4ce
 
a5a4ce
+char **        _adcli_strv_add_unique        (char **strv,
a5a4ce
+                                              char *string,
a5a4ce
+                                              int *length,
a5a4ce
+                                              bool case_sensitive) GNUC_WARN_UNUSED;
a5a4ce
+
a5a4ce
 void           _adcli_strv_remove_unsorted   (char **strv,
a5a4ce
                                               const char *string,
a5a4ce
                                               int *length);
a5a4ce
diff --git a/library/adutil.c b/library/adutil.c
a5a4ce
index 17d2caa..76ea158 100644
a5a4ce
--- a/library/adutil.c
a5a4ce
+++ b/library/adutil.c
a5a4ce
@@ -221,6 +221,34 @@ _adcli_strv_add (char **strv,
a5a4ce
 	return seq_push (strv, length, string);
a5a4ce
 }
a5a4ce
 
a5a4ce
+static int
a5a4ce
+_adcli_strv_has_ex (char **strv,
a5a4ce
+                    const char *str,
a5a4ce
+                    int (* compare) (const char *match, const char*value))
a5a4ce
+{
a5a4ce
+	int i;
a5a4ce
+
a5a4ce
+	for (i = 0; strv && strv[i] != NULL; i++) {
a5a4ce
+		if (compare (strv[i], str) == 0)
a5a4ce
+			return 1;
a5a4ce
+	}
a5a4ce
+
a5a4ce
+	return 0;
a5a4ce
+}
a5a4ce
+
a5a4ce
+char **
a5a4ce
+_adcli_strv_add_unique (char **strv,
a5a4ce
+                        char *string,
a5a4ce
+                        int *length,
a5a4ce
+                        bool case_sensitive)
a5a4ce
+{
a5a4ce
+	if (_adcli_strv_has_ex (strv, string, case_sensitive ? strcmp : strcasecmp) == 1) {
a5a4ce
+		return strv;
a5a4ce
+	}
a5a4ce
+
a5a4ce
+	return _adcli_strv_add (strv, string, length);
a5a4ce
+}
a5a4ce
+
a5a4ce
 #define discard_const(ptr) ((void *)((uintptr_t)(ptr)))
a5a4ce
 
a5a4ce
 void
a5a4ce
@@ -241,19 +269,11 @@ _adcli_strv_remove_unsorted (char **strv,
a5a4ce
 	                            (seq_compar)strcasecmp, free);
a5a4ce
 }
a5a4ce
 
a5a4ce
-
a5a4ce
 int
a5a4ce
 _adcli_strv_has (char **strv,
a5a4ce
                  const char *str)
a5a4ce
 {
a5a4ce
-	int i;
a5a4ce
-
a5a4ce
-	for (i = 0; strv && strv[i] != NULL; i++) {
a5a4ce
-		if (strcmp (strv[i], str) == 0)
a5a4ce
-			return 1;
a5a4ce
-	}
a5a4ce
-
a5a4ce
-	return 0;
a5a4ce
+	return _adcli_strv_has_ex (strv, str, strcmp);
a5a4ce
 }
a5a4ce
 
a5a4ce
 void
a5a4ce
@@ -704,6 +724,32 @@ test_strv_add_free (void)
a5a4ce
 	_adcli_strv_free (strv);
a5a4ce
 }
a5a4ce
 
a5a4ce
+static void
a5a4ce
+test_strv_add_unique_free (void)
a5a4ce
+{
a5a4ce
+	char **strv = NULL;
a5a4ce
+
a5a4ce
+	strv = _adcli_strv_add_unique (strv, strdup ("one"), NULL, false);
a5a4ce
+	strv = _adcli_strv_add_unique (strv, strdup ("one"), NULL, false);
a5a4ce
+	strv = _adcli_strv_add_unique (strv, strdup ("two"), NULL, false);
a5a4ce
+	strv = _adcli_strv_add_unique (strv, strdup ("two"), NULL, false);
a5a4ce
+	strv = _adcli_strv_add_unique (strv, strdup ("tWo"), NULL, false);
a5a4ce
+	strv = _adcli_strv_add_unique (strv, strdup ("three"), NULL, false);
a5a4ce
+	strv = _adcli_strv_add_unique (strv, strdup ("three"), NULL, false);
a5a4ce
+	strv = _adcli_strv_add_unique (strv, strdup ("TWO"), NULL, true);
a5a4ce
+
a5a4ce
+	assert_num_eq (_adcli_strv_len (strv), 4);
a5a4ce
+
a5a4ce
+	assert_str_eq (strv[0], "one");
a5a4ce
+	assert_str_eq (strv[1], "two");
a5a4ce
+	assert_str_eq (strv[2], "three");
a5a4ce
+	assert_str_eq (strv[3], "TWO");
a5a4ce
+	assert (strv[4] == NULL);
a5a4ce
+
a5a4ce
+	_adcli_strv_free (strv);
a5a4ce
+}
a5a4ce
+
a5a4ce
+
a5a4ce
 static void
a5a4ce
 test_strv_dup (void)
a5a4ce
 {
a5a4ce
@@ -856,6 +902,7 @@ main (int argc,
a5a4ce
       char *argv[])
a5a4ce
 {
a5a4ce
 	test_func (test_strv_add_free, "/util/strv_add_free");
a5a4ce
+	test_func (test_strv_add_unique_free, "/util/strv_add_unique_free");
a5a4ce
 	test_func (test_strv_dup, "/util/strv_dup");
a5a4ce
 	test_func (test_strv_count, "/util/strv_count");
a5a4ce
 	test_func (test_check_nt_time_string_lifetime, "/util/check_nt_time_string_lifetime");
a5a4ce
-- 
a5a4ce
2.20.1
a5a4ce