Browse Source

cdump: handle , at end of enums.

Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Rusty Russell 11 years ago
parent
commit
8e4b51ade5
2 changed files with 38 additions and 0 deletions
  1. 4 0
      ccan/cdump/cdump.c
  2. 34 0
      ccan/cdump/test/run-enum-comma.c

+ 4 - 0
ccan/cdump/cdump.c

@@ -428,6 +428,10 @@ static bool tok_take_enum(struct parse_state *ps)
 	do {
 		struct cdump_enum_val *v;
 
+		/* GCC extension: comma and end of enum */
+		if (tok_is(&ps->toks, "}"))
+			break;
+
 		tal_resize(&e->u.enum_vals, n+1);
 		v = &e->u.enum_vals[n++];
 

+ 34 - 0
ccan/cdump/test/run-enum-comma.c

@@ -0,0 +1,34 @@
+#include <ccan/cdump/cdump.h>
+/* Include the C files directly. */
+#include <ccan/cdump/cdump.c>
+#include <ccan/tap/tap.h>
+
+int main(void)
+{
+	struct cdump_definitions *defs;
+	const struct cdump_type *t;
+	char *problems;
+
+	/* This is how many tests you plan to run */
+	plan_tests(12);
+
+	defs = cdump_extract(NULL, "enum foo { BAR, BAZ, };", &problems);
+	ok1(defs);
+	ok1(!problems);
+
+	ok1(strmap_empty(&defs->structs));
+	ok1(strmap_empty(&defs->unions));
+	t = strmap_get(&defs->enums, "foo");
+	ok1(t);
+	ok1(t->kind == CDUMP_ENUM);
+	ok1(streq(t->name, "foo"));
+	ok1(tal_count(t->u.enum_vals) == 2);
+	ok1(streq(t->u.enum_vals[0].name, "BAR"));
+	ok1(!t->u.enum_vals[0].value);
+	ok1(streq(t->u.enum_vals[1].name, "BAZ"));
+	ok1(!t->u.enum_vals[1].value);
+	tal_free(defs);
+
+	/* This exits depending on whether all tests passed */
+	return exit_status();
+}