summaryrefslogtreecommitdiff
path: root/ccan/cdump/tools/cdump-enumstr.c
blob: f0b70ecdb57460be181fcca49358f81c9b5104f8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#include <ccan/cdump/cdump.h>
#include <ccan/tal/grab_file/grab_file.h>
#include <ccan/err/err.h>

static bool dump_map(const char *name, struct cdump_type *t, void *unused)
{
	size_t i;

	printf("struct {\n"
	       "	enum %s v;\n"
	       "	const char *name;\n"
	       "} enum_%s_names[] = {\n", name, name);

	for (i = 0; i < tal_count(t->u.enum_vals); i++)
		printf("	{ %s, \"%s\" },\n",
		       t->u.enum_vals[i].name,
		       t->u.enum_vals[i].name);
	printf("	{ 0, NULL } };\n");
	return true;
}

int main(int argc, char *argv[])
{
	char *code, *problems;
	struct cdump_definitions *defs;

	if (argc < 2)
		errx(1, "Usage: cdump-enumstr <filename> [<enums>...]");

	code = grab_file(NULL, streq(argv[1], "-") ? NULL : argv[1]);
	if (!code)
		err(1, "Reading %s", argv[1]);

	defs = cdump_extract(code, code, &problems);
	if (!defs)
		errx(1, "Parsing %s:\n%s", argv[1], problems);

	if (argc == 2)
		strmap_iterate(&defs->enums, dump_map, NULL);
	else {
		unsigned int i;
		struct cdump_type *t;

		for (i = 2; i < argc; i++) {
			t = strmap_get(&defs->enums, argv[i]);
			if (!t)
				errx(1, "Enum %s not found", argv[i]);
			dump_map(argv[i], t, NULL);
		}
	}
	return 0;
}