diff options
author | Thomas Voss <mail@thomasvoss.com> | 2024-04-22 23:27:07 +0200 |
---|---|---|
committer | Thomas Voss <mail@thomasvoss.com> | 2024-04-22 23:31:01 +0200 |
commit | 291803b886fdbe2ff49dd248c19f38b3d7b68524 (patch) | |
tree | b3d6e706fb8eabb7df391ebce3af322b56e2ab23 | |
parent | c62ed622ee5612e155e4176767ab1028f89a3b82 (diff) |
Add usage()
-rw-r--r-- | README | 3 | ||||
-rw-r--r-- | include/errors.h | 3 | ||||
-rw-r--r-- | lib/errors/usage.c | 26 |
3 files changed, 31 insertions, 1 deletions
@@ -77,6 +77,7 @@ FEATURES: • Functions for getting and setting the program name • Functions for printing diagnostics and optionally crashing with strerror() support + • Generate usage strings • macros.h • MIN()/MAX()/CLAMP() • Better assertion macro @@ -112,7 +113,7 @@ FEATURES: PLANNED FEATURES: - • String Case Conversions (unicode/string.h) + • Titlecase Conversions (unicode/string.h) • Unicode Normalization (unicode/string.h) • Line- and Sentence Segmentation (unicode/string.h) diff --git a/include/errors.h b/include/errors.h index 961ecf1..c8576f0 100644 --- a/include/errors.h +++ b/include/errors.h @@ -5,6 +5,9 @@ #include "_attrs.h" +void usage(const char *, ...); +#define usage(...) usage(__VA_ARGS__, nullptr) + [[gnu::format(printf, 1, 2)]] void warn(const char *, ...); void vwarn(const char *, va_list); diff --git a/lib/errors/usage.c b/lib/errors/usage.c new file mode 100644 index 0000000..50ca04f --- /dev/null +++ b/lib/errors/usage.c @@ -0,0 +1,26 @@ +#include <stdarg.h> +#include <stdio.h> +#include <string.h> + +#include "errors.h" +#include "macros.h" + +void +(usage)(const char *s, ...) +{ + ASSUME(s != nullptr); + ASSUME(mlib_progname() != nullptr); + + va_list ap; + va_start(ap, s); + + fprintf(stderr, "Usage: %s %s\n", mlib_progname(), s); + + while ((s = va_arg(ap, char *)) != nullptr) { + for (size_t i = 0; i < lengthof("Usage: ") - 1; i++) + fputc(' ', stderr); + fprintf(stderr, "%s %s\n", mlib_progname(), s); + } + + va_end(ap); +} |