summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRoger Dingledine <arma@torproject.org>2003-12-14 04:57:47 +0000
committerRoger Dingledine <arma@torproject.org>2003-12-14 04:57:47 +0000
commitf4cb5d8c93d13976bdcdf9dbefc0f6e85b85212a (patch)
tree18a06d150273ec8c50545df95fe030e10a04325f
parent2997ef8dd9d0187d798bc69baf363b2dc8843fa0 (diff)
downloadtor-f4cb5d8c93d13976bdcdf9dbefc0f6e85b85212a.tar.gz
tor-f4cb5d8c93d13976bdcdf9dbefc0f6e85b85212a.zip
extend smartlist with _remove() and _subtract()
svn:r922
-rw-r--r--src/common/util.c18
-rw-r--r--src/common/util.h2
2 files changed, 20 insertions, 0 deletions
diff --git a/src/common/util.c b/src/common/util.c
index 0757474a3c..a70f191700 100644
--- a/src/common/util.c
+++ b/src/common/util.c
@@ -92,6 +92,17 @@ void smartlist_add(smartlist_t *sl, void *element) {
log_fn(LOG_WARN,"We've already got %d elements, discarding.",sl->max);
}
+void smartlist_remove(smartlist_t *sl, void *element) {
+ int i;
+ if(element == NULL)
+ return;
+ for(i=0; i < sl->num_used; i++)
+ if(sl->list[i] == element) {
+ sl->list[i] = sl->list[--sl->num_used]; /* swap with the end */
+ i--; /* so we process the new i'th element */
+ }
+}
+
int smartlist_isin(smartlist_t *sl, void *element) {
int i;
for(i=0; i < sl->num_used; i++)
@@ -118,6 +129,13 @@ void smartlist_intersect(smartlist_t *sl1, smartlist_t *sl2) {
}
}
+/* remove all elements of sl2 from sl1 */
+void smartlist_subtract(smartlist_t *sl1, smartlist *sl2) {
+ int i;
+ for(i=0; i < sl2->num_used; i++)
+ smartlist_remove(sl1, sl2->list[i]);
+}
+
void *smartlist_choose(smartlist_t *sl) {
if(sl->num_used)
return sl->list[crypto_pseudo_rand_int(sl->num_used)];
diff --git a/src/common/util.h b/src/common/util.h
index c6a22c13a7..bfba0f131d 100644
--- a/src/common/util.h
+++ b/src/common/util.h
@@ -48,9 +48,11 @@ typedef struct {
smartlist_t *smartlist_create(int max_elements);
void smartlist_free(smartlist_t *sl);
void smartlist_add(smartlist_t *sl, void *element);
+void smartlist_remove(smartlist_t *sl, void *element);
int smartlist_isin(smartlist_t *sl, void *element);
int smartlist_overlap(smartlist_t *sl1, smartlist_t *sl2);
void smartlist_intersect(smartlist_t *sl1, smartlist_t *sl2);
+void smartlist_subtract(smartlist_t *sl1, smartlist *sl2);
void *smartlist_choose(smartlist_t *sl);
const char *eat_whitespace(const char *s);