From: Ben Pfaff <blp@nicira.com>
Date: Thu, 29 Oct 2009 21:51:25 +0000 (-0700)
Subject: shash: New function shash_sort().
X-Git-Tag: v1.0.0~259^2~535
X-Git-Url: http://git.onelab.eu/?a=commitdiff_plain;h=07423999f1759af064316aa4c1a1f499322c5ddc;p=sliver-openvswitch.git

shash: New function shash_sort().
---

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 */