shash: New function shash_sort().
authorBen Pfaff <blp@nicira.com>
Thu, 29 Oct 2009 21:51:25 +0000 (14:51 -0700)
committerBen Pfaff <blp@nicira.com>
Wed, 4 Nov 2009 23:01:02 +0000 (15:01 -0800)
lib/shash.c
lib/shash.h

index 002174741842cecad7c5c56eaf14d1503615bc9e..c35164bd92e277b98e5599c46f41f92485f909f5 100644 (file)
@@ -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;
+    }
+}
index 67be119ef27ee9d303a3620b876c033968b97665..c2d13b157f3f2870b0844fa65620b9599e4c045e 100644 (file)
@@ -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 */