Sumit Bose 461678
From 4208646609da9b25b70c21f5f39c92fabbd59dfc Mon Sep 17 00:00:00 2001
Sumit Bose 461678
From: Sumit Bose <sbose@redhat.com>
Sumit Bose 461678
Date: Thu, 14 Jun 2018 16:48:22 +0200
Sumit Bose 461678
Subject: [PATCH 21/23] util: add _adcli_strv_remove_unsorted
Sumit Bose 461678
Sumit Bose 461678
Related to https://bugzilla.redhat.com/show_bug.cgi?id=1547014
Sumit Bose 461678
---
Sumit Bose 461678
 library/adprivate.h |   4 ++
Sumit Bose 461678
 library/adutil.c    |  21 ++++++++
Sumit Bose 461678
 library/seq.c       | 149 +++++++++++++++++++++++++++++++++++++++++++++++++---
Sumit Bose 461678
 library/seq.h       |  12 +++++
Sumit Bose 461678
 4 files changed, 179 insertions(+), 7 deletions(-)
Sumit Bose 461678
Sumit Bose 461678
diff --git a/library/adprivate.h b/library/adprivate.h
Sumit Bose 461678
index 7485249..bc9df6d 100644
Sumit Bose 461678
--- a/library/adprivate.h
Sumit Bose 461678
+++ b/library/adprivate.h
Sumit Bose 461678
@@ -111,6 +111,10 @@ char **        _adcli_strv_add               (char **strv,
Sumit Bose 461678
                                               char *string,
Sumit Bose 461678
                                               int *length) GNUC_WARN_UNUSED;
Sumit Bose 461678
 
Sumit Bose 461678
+void           _adcli_strv_remove_unsorted   (char **strv,
Sumit Bose 461678
+                                              const char *string,
Sumit Bose 461678
+                                              int *length);
Sumit Bose 461678
+
Sumit Bose 461678
 void           _adcli_strv_free              (char **strv);
Sumit Bose 461678
 
Sumit Bose 461678
 int            _adcli_strv_has               (char **strv,
Sumit Bose 461678
diff --git a/library/adutil.c b/library/adutil.c
Sumit Bose 461678
index a27bd68..6334b52 100644
Sumit Bose 461678
--- a/library/adutil.c
Sumit Bose 461678
+++ b/library/adutil.c
Sumit Bose 461678
@@ -221,6 +221,27 @@ _adcli_strv_add (char **strv,
Sumit Bose 461678
 	return seq_push (strv, length, string);
Sumit Bose 461678
 }
Sumit Bose 461678
 
Sumit Bose 461678
+#define discard_const(ptr) ((void *)((uintptr_t)(ptr)))
Sumit Bose 461678
+
Sumit Bose 461678
+void
Sumit Bose 461678
+_adcli_strv_remove_unsorted (char **strv,
Sumit Bose 461678
+                             const char *string,
Sumit Bose 461678
+                             int *length)
Sumit Bose 461678
+{
Sumit Bose 461678
+	int len;
Sumit Bose 461678
+
Sumit Bose 461678
+	return_if_fail (string != NULL);
Sumit Bose 461678
+
Sumit Bose 461678
+	if (!length) {
Sumit Bose 461678
+		len = seq_count (strv);
Sumit Bose 461678
+		length = &len;
Sumit Bose 461678
+	}
Sumit Bose 461678
+
Sumit Bose 461678
+	return seq_remove_unsorted (strv, length, discard_const (string),
Sumit Bose 461678
+	                            (seq_compar)strcasecmp, free);
Sumit Bose 461678
+}
Sumit Bose 461678
+
Sumit Bose 461678
+
Sumit Bose 461678
 int
Sumit Bose 461678
 _adcli_strv_has (char **strv,
Sumit Bose 461678
                  const char *str)
Sumit Bose 461678
diff --git a/library/seq.c b/library/seq.c
Sumit Bose 461678
index 627dcaf..8e7475d 100644
Sumit Bose 461678
--- a/library/seq.c
Sumit Bose 461678
+++ b/library/seq.c
Sumit Bose 461678
@@ -111,6 +111,24 @@ seq_push (seq_voidp sequence,
Sumit Bose 461678
 	return seq;
Sumit Bose 461678
 }
Sumit Bose 461678
 
Sumit Bose 461678
+static int
Sumit Bose 461678
+linear_search (void **seq,
Sumit Bose 461678
+               int low,
Sumit Bose 461678
+               int high,
Sumit Bose 461678
+               void *match,
Sumit Bose 461678
+               seq_compar compar)
Sumit Bose 461678
+{
Sumit Bose 461678
+	int at;
Sumit Bose 461678
+
Sumit Bose 461678
+	for (at = low; at < high; at++) {
Sumit Bose 461678
+		if (compar (match, seq[at]) == 0) {
Sumit Bose 461678
+			break;
Sumit Bose 461678
+		}
Sumit Bose 461678
+	}
Sumit Bose 461678
+
Sumit Bose 461678
+	return at;
Sumit Bose 461678
+}
Sumit Bose 461678
+
Sumit Bose 461678
 static int
Sumit Bose 461678
 binary_search (void **seq,
Sumit Bose 461678
                int low,
Sumit Bose 461678
@@ -171,12 +189,13 @@ seq_insert (seq_voidp sequence,
Sumit Bose 461678
 	return seq;
Sumit Bose 461678
 }
Sumit Bose 461678
 
Sumit Bose 461678
-void
Sumit Bose 461678
-seq_remove (seq_voidp sequence,
Sumit Bose 461678
-            int *length,
Sumit Bose 461678
-            void *match,
Sumit Bose 461678
-            seq_compar compar,
Sumit Bose 461678
-            seq_destroy destroy)
Sumit Bose 461678
+static void
Sumit Bose 461678
+seq_remove_int (seq_voidp sequence,
Sumit Bose 461678
+                int *length,
Sumit Bose 461678
+                void *match,
Sumit Bose 461678
+                seq_search search,
Sumit Bose 461678
+                seq_compar compar,
Sumit Bose 461678
+                seq_destroy destroy)
Sumit Bose 461678
 {
Sumit Bose 461678
 	void **seq = sequence;
Sumit Bose 461678
 	int at;
Sumit Bose 461678
@@ -187,7 +206,7 @@ seq_remove (seq_voidp sequence,
Sumit Bose 461678
 	assert (match != NULL);
Sumit Bose 461678
 
Sumit Bose 461678
 	len = *length;
Sumit Bose 461678
-	at = binary_search (seq, 0, len, match, compar);
Sumit Bose 461678
+	at = search (seq, 0, len, match, compar);
Sumit Bose 461678
 
Sumit Bose 461678
 	/* We have a matching value */
Sumit Bose 461678
 	if (at < len && compar (match, seq[at]) == 0) {
Sumit Bose 461678
@@ -201,6 +220,26 @@ seq_remove (seq_voidp sequence,
Sumit Bose 461678
 	*length = len;
Sumit Bose 461678
 }
Sumit Bose 461678
 
Sumit Bose 461678
+void
Sumit Bose 461678
+seq_remove (seq_voidp sequence,
Sumit Bose 461678
+            int *length,
Sumit Bose 461678
+            void *match,
Sumit Bose 461678
+            seq_compar compar,
Sumit Bose 461678
+            seq_destroy destroy)
Sumit Bose 461678
+{
Sumit Bose 461678
+	return seq_remove_int (sequence, length, match, binary_search, compar, destroy);
Sumit Bose 461678
+}
Sumit Bose 461678
+
Sumit Bose 461678
+void
Sumit Bose 461678
+seq_remove_unsorted (seq_voidp sequence,
Sumit Bose 461678
+                     int *length,
Sumit Bose 461678
+                     void *match,
Sumit Bose 461678
+                     seq_compar compar,
Sumit Bose 461678
+                     seq_destroy destroy)
Sumit Bose 461678
+{
Sumit Bose 461678
+	return seq_remove_int (sequence, length, match, linear_search, compar, destroy);
Sumit Bose 461678
+}
Sumit Bose 461678
+
Sumit Bose 461678
 void
Sumit Bose 461678
 seq_filter (seq_voidp sequence,
Sumit Bose 461678
             int *length,
Sumit Bose 461678
@@ -430,6 +469,99 @@ test_remove (void)
Sumit Bose 461678
 	seq_free (seq, NULL);
Sumit Bose 461678
 }
Sumit Bose 461678
 
Sumit Bose 461678
+static void
Sumit Bose 461678
+test_remove_unsorted (void)
Sumit Bose 461678
+{
Sumit Bose 461678
+	void **seq = NULL;
Sumit Bose 461678
+	int len = 0;
Sumit Bose 461678
+
Sumit Bose 461678
+	seq = seq_push (seq, &len, "3");
Sumit Bose 461678
+	seq = seq_push (seq, &len, "5");
Sumit Bose 461678
+	seq = seq_push (seq, &len, "1");
Sumit Bose 461678
+	seq = seq_push (seq, &len, "4");
Sumit Bose 461678
+	seq = seq_push (seq, &len, "2");
Sumit Bose 461678
+
Sumit Bose 461678
+	assert_str_eq (seq[0], "3");
Sumit Bose 461678
+	assert_str_eq (seq[1], "5");
Sumit Bose 461678
+	assert_str_eq (seq[2], "1");
Sumit Bose 461678
+	assert_str_eq (seq[3], "4");
Sumit Bose 461678
+	assert_str_eq (seq[4], "2");
Sumit Bose 461678
+	assert (seq[5] == NULL);
Sumit Bose 461678
+	assert_num_eq (len, 5);
Sumit Bose 461678
+
Sumit Bose 461678
+	seq_remove_unsorted (seq, &len, "3", (seq_compar)strcmp, NULL);
Sumit Bose 461678
+	seq_remove_unsorted (seq, &len, "2", (seq_compar)strcmp, NULL);
Sumit Bose 461678
+
Sumit Bose 461678
+	assert_str_eq (seq[0], "5");
Sumit Bose 461678
+	assert_str_eq (seq[1], "1");
Sumit Bose 461678
+	assert_str_eq (seq[2], "4");
Sumit Bose 461678
+	assert (seq[3] == NULL);
Sumit Bose 461678
+	assert_num_eq (len, 3);
Sumit Bose 461678
+
Sumit Bose 461678
+	seq_free (seq, NULL);
Sumit Bose 461678
+}
Sumit Bose 461678
+
Sumit Bose 461678
+static void
Sumit Bose 461678
+test_remove_first (void)
Sumit Bose 461678
+{
Sumit Bose 461678
+	void **seq = NULL;
Sumit Bose 461678
+	int len = 0;
Sumit Bose 461678
+
Sumit Bose 461678
+	seq = seq_insert (seq, &len, "3", (seq_compar)strcmp, NULL);
Sumit Bose 461678
+	seq = seq_insert (seq, &len, "5", (seq_compar)strcmp, NULL);
Sumit Bose 461678
+	seq = seq_insert (seq, &len, "1", (seq_compar)strcmp, NULL);
Sumit Bose 461678
+	seq = seq_insert (seq, &len, "4", (seq_compar)strcmp, NULL);
Sumit Bose 461678
+	seq = seq_insert (seq, &len, "2", (seq_compar)strcmp, NULL);
Sumit Bose 461678
+
Sumit Bose 461678
+	assert_str_eq (seq[0], "1");
Sumit Bose 461678
+	assert_str_eq (seq[1], "2");
Sumit Bose 461678
+	assert_str_eq (seq[2], "3");
Sumit Bose 461678
+	assert_str_eq (seq[3], "4");
Sumit Bose 461678
+	assert_str_eq (seq[4], "5");
Sumit Bose 461678
+	assert (seq[5] == NULL);
Sumit Bose 461678
+	assert_num_eq (len, 5);
Sumit Bose 461678
+
Sumit Bose 461678
+	seq_remove (seq, &len, "1", (seq_compar)strcmp, NULL);
Sumit Bose 461678
+
Sumit Bose 461678
+	assert_str_eq (seq[0], "2");
Sumit Bose 461678
+	assert_str_eq (seq[1], "3");
Sumit Bose 461678
+	assert_str_eq (seq[2], "4");
Sumit Bose 461678
+	assert_str_eq (seq[3], "5");
Sumit Bose 461678
+	assert (seq[4] == NULL);
Sumit Bose 461678
+	assert_num_eq (len, 4);
Sumit Bose 461678
+
Sumit Bose 461678
+	seq_free (seq, NULL);
Sumit Bose 461678
+}
Sumit Bose 461678
+
Sumit Bose 461678
+static void
Sumit Bose 461678
+test_remove_last (void)
Sumit Bose 461678
+{
Sumit Bose 461678
+	void **seq = NULL;
Sumit Bose 461678
+	int len = 0;
Sumit Bose 461678
+
Sumit Bose 461678
+	seq = seq_insert (seq, &len, "3", (seq_compar)strcmp, NULL);
Sumit Bose 461678
+	seq = seq_insert (seq, &len, "1", (seq_compar)strcmp, NULL);
Sumit Bose 461678
+	seq = seq_insert (seq, &len, "4", (seq_compar)strcmp, NULL);
Sumit Bose 461678
+	seq = seq_insert (seq, &len, "2", (seq_compar)strcmp, NULL);
Sumit Bose 461678
+
Sumit Bose 461678
+	assert_str_eq (seq[0], "1");
Sumit Bose 461678
+	assert_str_eq (seq[1], "2");
Sumit Bose 461678
+	assert_str_eq (seq[2], "3");
Sumit Bose 461678
+	assert_str_eq (seq[3], "4");
Sumit Bose 461678
+	assert (seq[4] == NULL);
Sumit Bose 461678
+	assert_num_eq (len, 4);
Sumit Bose 461678
+
Sumit Bose 461678
+	seq_remove (seq, &len, "4", (seq_compar)strcmp, NULL);
Sumit Bose 461678
+
Sumit Bose 461678
+	assert_str_eq (seq[0], "1");
Sumit Bose 461678
+	assert_str_eq (seq[1], "2");
Sumit Bose 461678
+	assert_str_eq (seq[2], "3");
Sumit Bose 461678
+	assert (seq[3] == NULL);
Sumit Bose 461678
+	assert_num_eq (len, 3);
Sumit Bose 461678
+
Sumit Bose 461678
+	seq_free (seq, NULL);
Sumit Bose 461678
+}
Sumit Bose 461678
+
Sumit Bose 461678
 static int
Sumit Bose 461678
 compar_even (void *match,
Sumit Bose 461678
              void *value)
Sumit Bose 461678
@@ -631,6 +763,9 @@ main (int argc,
Sumit Bose 461678
 	test_func (test_insert, "/seq/insert");
Sumit Bose 461678
 	test_func (test_insert_destroys, "/seq/insert_destroys");
Sumit Bose 461678
 	test_func (test_remove, "/seq/remove");
Sumit Bose 461678
+	test_func (test_remove_unsorted, "/seq/remove_unsorted");
Sumit Bose 461678
+	test_func (test_remove_first, "/seq/remove_first");
Sumit Bose 461678
+	test_func (test_remove_last, "/seq/remove_last");
Sumit Bose 461678
 	test_func (test_remove_destroys, "/seq/remove_destroys");
Sumit Bose 461678
 	test_func (test_filter, "/seq/filter");
Sumit Bose 461678
 	test_func (test_filter_null, "/seq/filter_null");
Sumit Bose 461678
diff --git a/library/seq.h b/library/seq.h
Sumit Bose 461678
index 694965b..5d48848 100644
Sumit Bose 461678
--- a/library/seq.h
Sumit Bose 461678
+++ b/library/seq.h
Sumit Bose 461678
@@ -44,6 +44,12 @@ typedef void *     (* seq_copy)               (void *value);
Sumit Bose 461678
 
Sumit Bose 461678
 typedef void       (* seq_destroy)            (void *value);
Sumit Bose 461678
 
Sumit Bose 461678
+typedef int        (* seq_search)             (void **seq,
Sumit Bose 461678
+                                               int low,
Sumit Bose 461678
+                                               int high,
Sumit Bose 461678
+                                               void *match,
Sumit Bose 461678
+                                               seq_compar compar);
Sumit Bose 461678
+
Sumit Bose 461678
 seq_voidp          seq_push                   (seq_voidp seq,
Sumit Bose 461678
                                                int *length,
Sumit Bose 461678
                                                void *value) WARN_UNUSED;
Sumit Bose 461678
@@ -62,6 +68,12 @@ void               seq_remove                 (seq_voidp seq,
Sumit Bose 461678
                                                seq_compar compar,
Sumit Bose 461678
                                                seq_destroy destroy);
Sumit Bose 461678
 
Sumit Bose 461678
+void               seq_remove_unsorted        (seq_voidp seq,
Sumit Bose 461678
+                                               int *length,
Sumit Bose 461678
+                                               void *match,
Sumit Bose 461678
+                                               seq_compar compar,
Sumit Bose 461678
+                                               seq_destroy destroy);
Sumit Bose 461678
+
Sumit Bose 461678
 seq_voidp          seq_lookup                 (seq_voidp seq,
Sumit Bose 461678
                                                int *length,
Sumit Bose 461678
                                                void *match,
Sumit Bose 461678
-- 
Sumit Bose 461678
2.14.4
Sumit Bose 461678