From: Ben Pfaff Date: Thu, 29 Oct 2009 21:51:25 +0000 (-0700) Subject: shash: New function shash_sort(). X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=07423999f1759af064316aa4c1a1f499322c5ddc;p=openvswitch shash: New function shash_sort(). --- diff --git a/lib/shash.c b/lib/shash.c index 00217474..c35164bd 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 67be119e..c2d13b15 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 */