]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
Introduce standard methods for sorting strings with qsort
authorDaniel P. Berrange <berrange@redhat.com>
Thu, 28 Nov 2013 11:14:59 +0000 (11:14 +0000)
committerDaniel P. Berrange <berrange@redhat.com>
Thu, 28 Nov 2013 11:29:46 +0000 (11:29 +0000)
Add virStringSortCompare and virStringSortRevCompare as
standard functions to use with qsort.

Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
src/libvirt_private.syms
src/lxc/lxc_container.c
src/util/virstring.c
src/util/virstring.h
tests/virstringtest.c

index 205fe5611df2362892d346e7507973a65ec6eda3..040c6d99c6243080dad0084bc78b32c408dc411d 100644 (file)
@@ -1749,6 +1749,8 @@ virStringArrayHasString;
 virStringFreeList;
 virStringJoin;
 virStringListLength;
+virStringSortCompare;
+virStringSortRevCompare;
 virStringSplit;
 virStrncpy;
 virStrndup;
index c24e7fbcbf7b9f6bb90eeeb63e068c9fc7a5d0d0..688f82dda06d6835308e0a723ea0c28db07ebe9e 100644 (file)
@@ -486,16 +486,6 @@ error_out:
 /*_syscall2(int, pivot_root, char *, newroot, const char *, oldroot)*/
 extern int pivot_root(const char * new_root, const char * put_old);
 
-static int lxcContainerChildMountSort(const void *a, const void *b)
-{
-  const char **sa = (const char**)a;
-  const char **sb = (const char**)b;
-
-  /* Deliberately reversed args - we need to unmount deepest
-     children first */
-  return strcmp(*sb, *sa);
-}
-
 #ifndef MS_REC
 # define MS_REC          16384
 #endif
@@ -547,7 +537,7 @@ static int lxcContainerGetSubtree(const char *prefix,
 
     if (mounts)
         qsort(mounts, nmounts, sizeof(mounts[0]),
-              lxcContainerChildMountSort);
+              virStringSortRevCompare);
 
     ret = 0;
 cleanup:
@@ -816,7 +806,7 @@ static int lxcContainerSetReadOnly(void)
 
     if (mounts)
         qsort(mounts, nmounts, sizeof(mounts[0]),
-              lxcContainerChildMountSort);
+              virStringSortRevCompare);
 
     for (i = 0; i < nmounts; i++) {
         VIR_DEBUG("Bind readonly %s", mounts[i]);
index d11db5cbcc6bab3531f9b89cc560afddf81fbdbf..8d0ca70b25e5b84e13ea27008942548984fed047 100644 (file)
@@ -616,3 +616,32 @@ size_t virStringListLength(char **strings)
 
     return i;
 }
+
+
+/**
+ * virStringSortCompare:
+ *
+ * A comparator function for sorting strings in
+ * normal order with qsort().
+ */
+int virStringSortCompare(const void *a, const void *b)
+{
+    const char **sa = (const char**)a;
+    const char **sb = (const char**)b;
+
+    return strcmp(*sa, *sb);
+}
+
+/**
+ * virStringSortRevCompare:
+ *
+ * A comparator function for sorting strings in
+ * reverse order with qsort().
+ */
+int virStringSortRevCompare(const void *a, const void *b)
+{
+    const char **sa = (const char**)a;
+    const char **sb = (const char**)b;
+
+    return strcmp(*sb, *sa);
+}
index b39015005e253cab9f6f9fbda457bb27ad5c7e11..13a6e5a70c8958b5516ecd12229d63160bc0efe8 100644 (file)
@@ -223,4 +223,7 @@ size_t virStringListLength(char **strings);
     virAsprintfInternal(false, 0, NULL, NULL, 0, \
                         strp, __VA_ARGS__)
 
+int virStringSortCompare(const void *a, const void *b);
+int virStringSortRevCompare(const void *a, const void *b);
+
 #endif /* __VIR_STRING_H__ */
index 32a1e72c9aa7514c840afb3157261912d2db7ab7..c6adf9fddf2bf2da1cdf32c438ec4dd14dec0a32 100644 (file)
@@ -231,6 +231,49 @@ cleanup:
     return ret;
 }
 
+
+static int
+testStringSortCompare(const void *opaque ATTRIBUTE_UNUSED)
+{
+    const char *randlist[] = {
+        "tasty", "astro", "goat", "chicken", "turducken",
+    };
+    const char *randrlist[] = {
+        "tasty", "astro", "goat", "chicken", "turducken",
+    };
+    const char *sortlist[] = {
+        "astro", "chicken", "goat", "tasty", "turducken",
+    };
+    const char *sortrlist[] = {
+        "turducken", "tasty", "goat", "chicken", "astro",
+    };
+    int ret = -1;
+    size_t i;
+
+    qsort(randlist, ARRAY_CARDINALITY(randlist), sizeof(randlist[0]),
+          virStringSortCompare);
+    qsort(randrlist, ARRAY_CARDINALITY(randrlist), sizeof(randrlist[0]),
+          virStringSortRevCompare);
+
+    for (i = 0; i < ARRAY_CARDINALITY(randlist); i++) {
+        if (STRNEQ(randlist[i], sortlist[i])) {
+            fprintf(stderr, "sortlist[%zu] '%s' != randlist[%zu] '%s'\n",
+                    i, sortlist[i], i, randlist[i]);
+            goto cleanup;
+        }
+        if (STRNEQ(randrlist[i], sortrlist[i])) {
+            fprintf(stderr, "sortrlist[%zu] '%s' != randrlist[%zu] '%s'\n",
+                    i, sortrlist[i], i, randrlist[i]);
+            goto cleanup;
+        }
+    }
+
+    ret = 0;
+ cleanup:
+    return ret;
+}
+
+
 static int
 mymain(void)
 {
@@ -282,6 +325,9 @@ mymain(void)
     if (virtTestRun("strdup", testStrndupNegative, NULL) < 0)
         ret = -1;
 
+    if (virtTestRun("virStringSortCompare", testStringSortCompare, NULL) < 0)
+        ret = -1;
+
     return ret==0 ? EXIT_SUCCESS : EXIT_FAILURE;
 }