From 07423999f1759af064316aa4c1a1f499322c5ddc Mon Sep 17 00:00:00 2001
From: Ben Pfaff <blp@nicira.com>
Date: Thu, 29 Oct 2009 14:51:25 -0700
Subject: [PATCH] shash: New function shash_sort().

---
 lib/shash.c | 31 +++++++++++++++++++++++++++++++
 lib/shash.h |  1 +
 2 files changed, 32 insertions(+)

diff --git a/lib/shash.c b/lib/shash.c
index 002174741..c35164bd9 100644
--- a/lib/shash.c
+++ b/lib/shash.c
@@ -126,3 +126,34 @@ shash_first(const struct shash *shash)
     return node ? CONTAINER_OF(node, struct shash_node, node) : NULL;
 }
 
+static int
+compare_nodes_by_name(const void *a_, const void *b_)
+{
+    const struct shash_node *const *a = a_;
+    const struct shash_node *const *b = b_;
+    return strcmp((*a)->name, (*b)->name);
+}
+
+const struct shash_node **
+shash_sort(const struct shash *sh)
+{
+    if (shash_is_empty(sh)) {
+        return NULL;
+    } else {
+        const struct shash_node **nodes;
+        struct shash_node *node;
+        size_t i, n;
+
+        n = shash_count(sh);
+        nodes = xmalloc(n * sizeof *nodes);
+        i = 0;
+        SHASH_FOR_EACH (node, sh) {
+            nodes[i++] = node;
+        }
+        assert(i == n);
+
+        qsort(nodes, n, sizeof *nodes, compare_nodes_by_name);
+
+        return nodes;
+    }
+}
diff --git a/lib/shash.h b/lib/shash.h
index 67be119ef..c2d13b157 100644
--- a/lib/shash.h
+++ b/lib/shash.h
@@ -49,5 +49,6 @@ struct shash_node *shash_find(const struct shash *, const char *);
 void *shash_find_data(const struct shash *, const char *);
 void *shash_find_and_delete(struct shash *, const char *);
 struct shash_node *shash_first(const struct shash *);
+const struct shash_node **shash_sort(const struct shash *);
 
 #endif /* shash.h */
-- 
2.47.0