diff options
author | Nick Mathewson <nickm@torproject.org> | 2005-09-09 23:12:54 +0000 |
---|---|---|
committer | Nick Mathewson <nickm@torproject.org> | 2005-09-09 23:12:54 +0000 |
commit | 035b1953eba11febfd975727b7101f7bd423c3fc (patch) | |
tree | cd6dc1afe3e89b6afd390771d5b742a8bbfe0ef0 /src/common/container.c | |
parent | 67b27f566c1ebb516be8bc6f411a5f502d555cc9 (diff) | |
download | tor-035b1953eba11febfd975727b7101f7bd423c3fc.tar tor-035b1953eba11febfd975727b7101f7bd423c3fc.tar.gz |
Add sorting/searching to smartlist
svn:r4977
Diffstat (limited to 'src/common/container.c')
-rw-r--r-- | src/common/container.c | 31 |
1 files changed, 31 insertions, 0 deletions
diff --git a/src/common/container.c b/src/common/container.c index ac10d60f0..74b2dd907 100644 --- a/src/common/container.c +++ b/src/common/container.c @@ -387,6 +387,37 @@ char *smartlist_join_strings2(smartlist_t *sl, const char *join, return r; } +/** Sort the members of <b>sl</b> into an order defined by + * the ordering function <b>compare</b>, which returns less then 0 if a + * precedes b, greater than 0 if b precedes a, and 0 if a 'equals' b. + */ +void +smartlist_sort(smartlist_t *sl, int (*compare)(const void **a, const void **b)) +{ + if (!sl->num_used) + return; + qsort(sl->list, sl->num_used, sizeof(void*), + (int (*)(const void *,const void*))compare); +} + +/** Assuming the members of <b>sl</b> are in order, return a pointer to the + * member which matches <b>key</b>. Ordering and matching are defined by a + * <b>compare</b> function, which returns 0 on a match; less than 0 if key is + * less than member, and greater than 0 if key is greater then member. + */ +void * +smartlist_bsearch(smartlist_t *sl, const void *key, + int (*compare)(const void *key, const void **member)) +{ + void ** r; + if (!sl->num_used) + return NULL; + + r = bsearch(key, sl->list, sl->num_used, sizeof(void*), + (int (*)(const void *, const void *))compare); + return r ? *r : NULL; +} + /* Splay-tree implementation of string-to-void* map */ typedef struct strmap_entry_t { |