Browse Source

tal/str: make tal_count() work for strsplit.

Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Rusty Russell 13 years ago
parent
commit
737dcc0fe9
3 changed files with 12 additions and 2 deletions
  1. 5 0
      ccan/tal/str/str.c
  2. 2 1
      ccan/tal/str/str.h
  3. 5 1
      ccan/tal/str/test/run.c

+ 5 - 0
ccan/tal/str/str.c

@@ -49,6 +49,11 @@ char **strsplit(const tal_t *ctx,
 			goto fail;
 	}
 	parts[num] = NULL;
+
+	/* Ensure that tal_count() is correct. */
+	if (unlikely(!tal_resize(&parts, num+1)))
+		goto fail;
+
 	if (taken(delims))
 		tal_free(delims);
 	return parts;

+ 2 - 1
ccan/tal/str/str.h

@@ -26,7 +26,8 @@ enum strsplit {
  * Multiple delimiters result in empty substrings.  By definition, no
  * delimiters will appear in the substrings.
  *
- * The final char * in the array will be NULL.
+ * The final char * in the array will be NULL, and tal_count() will
+ * return the number of elements plus 1 (for that NULL).
  *
  * Example:
  *	#include <ccan/tal/str/str.h>

+ 5 - 1
ccan/tal/str/test/run.c

@@ -14,24 +14,27 @@ int main(int argc, char *argv[])
 	char **split, *str;
 	void *ctx;
 
-	plan_tests(65);
+	plan_tests(69);
 	split = strsplit(NULL, "hello  world", " ", STR_EMPTY_OK);
 	ok1(!strcmp(split[0], "hello"));
 	ok1(!strcmp(split[1], ""));
 	ok1(!strcmp(split[2], "world"));
 	ok1(split[3] == NULL);
+	ok1(tal_count(split) == 4);
 	tal_free(split);
 
 	split = strsplit(NULL, "hello  world", " ", STR_NO_EMPTY);
 	ok1(!strcmp(split[0], "hello"));
 	ok1(!strcmp(split[1], "world"));
 	ok1(split[2] == NULL);
+	ok1(tal_count(split) == 3);
 	tal_free(split);
 
 	split = strsplit(NULL, "  hello  world", " ", STR_NO_EMPTY);
 	ok1(!strcmp(split[0], "hello"));
 	ok1(!strcmp(split[1], "world"));
 	ok1(split[2] == NULL);
+	ok1(tal_count(split) == 3);
 	tal_free(split);
 
 	split = strsplit(NULL, "hello  world", "o ", STR_EMPTY_OK);
@@ -41,6 +44,7 @@ int main(int argc, char *argv[])
 	ok1(!strcmp(split[3], "w"));
 	ok1(!strcmp(split[4], "rld"));
 	ok1(split[5] == NULL);
+	ok1(tal_count(split) == 6);
 
 	ctx = split;
 	split = strsplit(ctx, "hello  world", "o ", STR_EMPTY_OK);