cdump-enumstr.c 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. #include <ccan/cdump/cdump.h>
  2. #include <ccan/tal/grab_file/grab_file.h>
  3. #include <ccan/err/err.h>
  4. static bool dump_map(const char *name, struct cdump_type *t, void *unused)
  5. {
  6. size_t i;
  7. printf("struct {\n"
  8. " enum %s v;\n"
  9. " const char *name;\n"
  10. "} enum_%s_names[] = {\n", name, name);
  11. for (i = 0; i < tal_count(t->u.enum_vals); i++)
  12. printf(" { %s, \"%s\" },\n",
  13. t->u.enum_vals[i].name,
  14. t->u.enum_vals[i].name);
  15. printf(" { 0, NULL } };\n");
  16. return true;
  17. }
  18. int main(int argc, char *argv[])
  19. {
  20. char *code, *problems;
  21. struct cdump_definitions *defs;
  22. if (argc < 2)
  23. errx(1, "Usage: cdump-enumstr <filename> [<enums>...]");
  24. code = grab_file(NULL, streq(argv[1], "-") ? NULL : argv[1]);
  25. if (!code)
  26. err(1, "Reading %s", argv[1]);
  27. defs = cdump_extract(code, code, &problems);
  28. if (!defs)
  29. errx(1, "Parsing %s:\n%s", argv[1], problems);
  30. if (argc == 2)
  31. strmap_iterate(&defs->enums, dump_map, NULL);
  32. else {
  33. unsigned int i;
  34. struct cdump_type *t;
  35. for (i = 2; i < argc; i++) {
  36. t = strmap_get(&defs->enums, argv[i]);
  37. if (!t)
  38. errx(1, "Enum %s not found", argv[i]);
  39. dump_map(argv[i], t, NULL);
  40. }
  41. }
  42. return 0;
  43. }