summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNick Mathewson <nickm@torproject.org>2004-10-14 19:51:47 +0000
committerNick Mathewson <nickm@torproject.org>2004-10-14 19:51:47 +0000
commitc5964d67389aea3c7c740e8021a4b31a5c120dd7 (patch)
treeddd71ba15a3d0a9dc7dc2ee17e08bf16f007ce14
parent9e8e006c1eb3c2c79188ca55322c7a49686d37dc (diff)
downloadtor-c5964d67389aea3c7c740e8021a4b31a5c120dd7.tar.gz
tor-c5964d67389aea3c7c740e8021a4b31a5c120dd7.zip
Basic string-join functionality
svn:r2521
-rw-r--r--src/common/util.c26
-rw-r--r--src/common/util.h1
-rw-r--r--src/or/test.c19
3 files changed, 46 insertions, 0 deletions
diff --git a/src/common/util.c b/src/common/util.c
index 5a5fbdddaf..f99e29df2e 100644
--- a/src/common/util.c
+++ b/src/common/util.c
@@ -609,6 +609,32 @@ int smartlist_split_string(smartlist_t *sl, const char *str, const char *sep,
return n;
}
+char *smartlist_join_strings(smartlist_t *sl, const char *join, int terminate)
+{
+ int i;
+ size_t n = 0, jlen;
+ char *r = NULL, *dst, *src;
+
+ tor_assert(sl && join);
+ jlen = strlen(join);
+ for (i = 0; i < sl->num_used; ++i) {
+ n += strlen(sl->list[i]);
+ n += jlen;
+ }
+ if (!terminate) n -= jlen;
+ dst = r = tor_malloc(n+1);
+ for (i = 0; i < sl->num_used; ) {
+ for (src = sl->list[i]; *src; )
+ *dst++ = *src++;
+ if (++i < sl->num_used || terminate) {
+ memcpy(dst, join, jlen);
+ dst += jlen;
+ }
+ }
+ *dst = '\0';
+ return r;
+}
+
/* Splay-tree implementation of string-to-void* map
*/
struct strmap_entry_t {
diff --git a/src/common/util.h b/src/common/util.h
index 5961ca33e4..2155a3a06a 100644
--- a/src/common/util.h
+++ b/src/common/util.h
@@ -145,6 +145,7 @@ int smartlist_len(const smartlist_t *sl);
#define SPLIT_IGNORE_BLANK 0x02
int smartlist_split_string(smartlist_t *sl, const char *str, const char *sep,
int flags, int max);
+char *smartlist_join_strings(smartlist_t *sl, const char *join, int terminate);
#define SMARTLIST_FOREACH(sl, type, var, cmd) \
do { \
diff --git a/src/or/test.c b/src/or/test.c
index 1bac5648c3..a7b1e51eae 100644
--- a/src/or/test.c
+++ b/src/or/test.c
@@ -581,6 +581,22 @@ test_util() {
test_streq("a", smartlist_get(sl, 1));
test_streq("bc", smartlist_get(sl, 2));
test_streq("", smartlist_get(sl, 3));
+ cp = smartlist_join_strings(sl, "", 0);
+ test_streq(cp, "abcabc");
+ tor_free(cp);
+ cp = smartlist_join_strings(sl, "!", 0);
+ test_streq(cp, "abc!a!bc!");
+ tor_free(cp);
+ cp = smartlist_join_strings(sl, "XY", 0);
+ test_streq(cp, "abcXYaXYbcXY");
+ tor_free(cp);
+ cp = smartlist_join_strings(sl, "XY", 1);
+ test_streq(cp, "abcXYaXYbcXYXY");
+ tor_free(cp);
+ cp = smartlist_join_strings(sl, "", 1);
+ test_streq(cp, "abcabc");
+ tor_free(cp);
+
smartlist_split_string(sl, "/def/ /ghijk", "/", 0, 0);
test_eq(8, smartlist_len(sl));
test_streq("", smartlist_get(sl, 4));
@@ -615,6 +631,9 @@ test_util() {
test_eq(5, smartlist_len(sl));
test_streq("z", smartlist_get(sl, 3));
test_streq("zhasd <> <> bnud<>", smartlist_get(sl, 4));
+ SMARTLIST_FOREACH(sl, char *, cp, tor_free(cp));
+ smartlist_clear(sl);
+
/* Test tor_strstrip() */
strcpy(buf, "Testing 1 2 3");