diff options
author | Mike Frysinger <vapier@gentoo.org> | 2013-04-15 22:13:12 -0400 |
---|---|---|
committer | David Gibson <david@gibson.dropbear.id.au> | 2013-05-24 18:20:53 +1000 |
commit | be8d1c82cb0a9caeb7e2f804f9a9f845063d7d53 (patch) | |
tree | c850c488754c0d3144eaf2a4c7861e5eea50e6fb /util.h | |
parent | 4e76ec796c90d44d417f82d9db2d67cfe575f8ed (diff) | |
download | dtc-be8d1c82cb0a9caeb7e2f804f9a9f845063d7d53.tar.gz |
fdtdump: make usage a bit more friendly
This starts a new usage framework and then cuts fdtdump over to it.
Now we can do `fdtdump -h` and get something useful back.
Signed-off-by: Mike Frysinger <vapier@gentoo.org>
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
Diffstat (limited to 'util.h')
-rw-r--r-- | util.h | 61 |
1 files changed, 61 insertions, 0 deletions
@@ -2,6 +2,7 @@ #define _UTIL_H #include <stdarg.h> +#include <getopt.h> /* * Copyright 2011 The Chromium Authors, All Rights Reserved. @@ -184,4 +185,64 @@ void utilfdt_print_data(const char *data, int len); */ void util_version(void) __attribute__((noreturn)); +/** + * Show usage and exit + * + * This helps standardize the output of various utils. You most likely want + * to use the long_usage() helper below rather than call this. + * + * @param errmsg If non-NULL, an error message to display + * @param synopsis The initial example usage text (and possible examples) + * @param short_opts The string of short options + * @param long_opts The structure of long options + * @param opts_help An array of help strings (should align with long_opts) + */ +void util_long_usage(const char *errmsg, const char *synopsis, + const char *short_opts, struct option const long_opts[], + const char * const opts_help[]) __attribute__((noreturn)); + +/** + * Show usage and exit + * + * If you name all your usage variables with usage_xxx, then you can call this + * help macro rather than expanding all arguments yourself. + * + * @param errmsg If non-NULL, an error message to display + */ +#define long_usage(errmsg) \ + util_long_usage(errmsg, usage_synopsis, usage_short_opts, \ + usage_long_opts, usage_opts_help) + +/** + * Call getopt_long() with standard options + * + * Since all util code runs getopt in the same way, provide a helper. + */ +#define util_getopt_long() getopt_long(argc, argv, usage_short_opts, \ + usage_long_opts, NULL) + +/* Helper for aligning long_opts array */ +#define a_argument required_argument + +/* Helper for usage_short_opts string constant */ +#define USAGE_COMMON_SHORT_OPTS "hV" + +/* Helper for usage_long_opts option array */ +#define USAGE_COMMON_LONG_OPTS \ + {"help", no_argument, NULL, 'h'}, \ + {"version", no_argument, NULL, 'V'}, \ + {NULL, no_argument, NULL, 0x0} + +/* Helper for usage_opts_help array */ +#define USAGE_COMMON_OPTS_HELP \ + "Print this help and exit", \ + "Print version and exit", \ + NULL + +/* Helper for getopt case statements */ +#define case_USAGE_COMMON_FLAGS \ + case 'h': long_usage(NULL); \ + case 'V': util_version(); \ + case '?': long_usage("unknown option"); + #endif /* _UTIL_H */ |