aboutsummaryrefslogtreecommitdiff
path: root/vendor/optparse-master/examples/subcommands.c
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/optparse-master/examples/subcommands.c')
-rw-r--r--vendor/optparse-master/examples/subcommands.c120
1 files changed, 120 insertions, 0 deletions
diff --git a/vendor/optparse-master/examples/subcommands.c b/vendor/optparse-master/examples/subcommands.c
new file mode 100644
index 0000000..3d6238c
--- /dev/null
+++ b/vendor/optparse-master/examples/subcommands.c
@@ -0,0 +1,120 @@
+/* This is free and unencumbered software released into the public domain. */
+#include <stdbool.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+#define OPTPARSE_IMPLEMENTATION
+#include "../optparse.h"
+
+static int cmd_echo(char **argv)
+{
+ int i, option;
+ bool newline = true;
+ struct optparse options;
+
+ optparse_init(&options, argv);
+ options.permute = 0;
+ while ((option = optparse(&options, "hn")) != -1) {
+ switch (option) {
+ case 'h':
+ puts("usage: echo [-hn] [ARG]...");
+ return 0;
+ case 'n':
+ newline = false;
+ break;
+ case '?':
+ fprintf(stderr, "%s: %s\n", argv[0], options.errmsg);
+ return 1;
+ }
+ }
+ argv += options.optind;
+
+ for (i = 0; argv[i]; i++) {
+ printf("%s%s", i ? " " : "", argv[i]);
+ }
+ if (newline) {
+ putchar('\n');
+ }
+
+ fflush(stdout);
+ return !!ferror(stdout);
+}
+
+static int cmd_sleep(char **argv)
+{
+ int i, option;
+ struct optparse options;
+
+ optparse_init(&options, argv);
+ while ((option = optparse(&options, "h")) != -1) {
+ switch (option) {
+ case 'h':
+ puts("usage: sleep [-h] [NUMBER]...");
+ return 0;
+ case '?':
+ fprintf(stderr, "%s: %s\n", argv[0], options.errmsg);
+ return 1;
+ }
+ }
+
+ for (i = 0; argv[i]; i++) {
+ if (sleep(atoi(argv[i]))) {
+ return 1;
+ }
+ }
+ return 0;
+}
+
+static void
+usage(FILE *f)
+{
+ fprintf(f, "usage: example [-h] <echo|sleep> [OPTION]...\n");
+}
+
+int main(int argc, char **argv)
+{
+ int i, option;
+ char **subargv;
+ struct optparse options;
+
+ static const struct {
+ char name[8];
+ int (*cmd)(char **);
+ } cmds[] = {
+ {"echo", cmd_echo },
+ {"sleep", cmd_sleep},
+ };
+ int ncmds = sizeof(cmds) / sizeof(*cmds);
+
+ (void)argc;
+ optparse_init(&options, argv);
+ options.permute = 0;
+ while ((option = optparse(&options, "h")) != -1) {
+ switch (option) {
+ case 'h':
+ usage(stdout);
+ return 0;
+ case '?':
+ usage(stderr);
+ fprintf(stderr, "%s: %s\n", argv[0], options.errmsg);
+ return 1;
+ }
+ }
+
+ subargv = argv + options.optind;
+ if (!subargv[0]) {
+ fprintf(stderr, "%s: missing subcommand\n", argv[0]);
+ usage(stderr);
+ return 1;
+ }
+
+ for (i = 0; i < ncmds; i++) {
+ if (!strcmp(cmds[i].name, subargv[0])) {
+ return cmds[i].cmd(subargv);
+ }
+ }
+ fprintf(stderr, "%s: invalid subcommand: %s\n", argv[0], subargv[0]);
+ return 1;
+}