diff options
author | Vito Caputo <vcaputo@pengaru.com> | 2021-10-03 17:15:09 -0700 |
---|---|---|
committer | Vito Caputo <vcaputo@pengaru.com> | 2021-10-03 17:24:24 -0700 |
commit | 9a98cfe6224757ad21c223f74efb537d9edca24f (patch) | |
tree | c2ccfe5d4d4b1a56c7f02af54bec88bb2a0fe87e | |
parent | b686b405c6a22b26e9b8082c92ed91513608bea3 (diff) |
args: move argument parsing/help output to libtil
This is totally opt-in for libtil callers, but is a step
towards enabling uniform cli invocations across frontends.
The help side of this is particularly janky, but since what's
appropriate there is directly related to the args parsing it
seems appropriate to bring along. The janky part is the
implicit output formatting assumptions being made, as-is it
doesn't really lend itself well to being augmented into broader
frontend help output. Alas, this is rototiller playground, so
let's just go easy and assume frontends will largely spit out
whatever this provides - or completely replace it if appropriate.
-rw-r--r-- | src/Makefile.am | 2 | ||||
-rw-r--r-- | src/main.c | 61 | ||||
-rw-r--r-- | src/til_args.c | 47 | ||||
-rw-r--r-- | src/til_args.h | 17 |
4 files changed, 73 insertions, 54 deletions
diff --git a/src/Makefile.am b/src/Makefile.am index c0a20b5..6ca1d77 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -1,7 +1,7 @@ SUBDIRS = libs modules noinst_LTLIBRARIES = libtil.la -libtil_la_SOURCES = til_fb.c til_fb.h til_knobs.h til.c til.h til_settings.h til_settings.c til_threads.c til_threads.h til_util.c til_util.h +libtil_la_SOURCES = til_args.c til_args.h til_fb.c til_fb.h til_knobs.h til.c til.h til_settings.h til_settings.c til_threads.c til_threads.h til_util.c til_util.h libtil_la_CPPFLAGS = -I@top_srcdir@/src libtil_la_LIBADD = modules/compose/libcompose.la modules/drizzle/libdrizzle.la modules/flui2d/libflui2d.la modules/julia/libjulia.la modules/meta2d/libmeta2d.la modules/montage/libmontage.la modules/pixbounce/libpixbounce.la modules/plasma/libplasma.la modules/plato/libplato.la modules/ray/libray.la modules/roto/libroto.la modules/rtv/librtv.la modules/snow/libsnow.la modules/sparkler/libsparkler.la modules/spiro/libspiro.la modules/stars/libstars.la modules/submit/libsubmit.la modules/swab/libswab.la modules/swarm/libswarm.la libs/grid/libgrid.la libs/puddle/libpuddle.la libs/ray/libray.la libs/sig/libsig.la libs/txt/libtxt.la libs/ascii/libascii.la libs/din/libdin.la @@ -11,6 +11,7 @@ #include <unistd.h> #include "til.h" +#include "til_args.h" #include "til_settings.h" #include "til_fb.h" #include "til_util.h" @@ -44,48 +45,6 @@ typedef struct rototiller_t { static rototiller_t rototiller; -typedef struct argv_t { - const char *module; - const char *video; - - unsigned use_defaults:1; - unsigned help:1; -} argv_t; - -/* - * ./rototiller --video=drm,dev=/dev/dri/card3,connector=VGA-1,mode=640x480@60 - * ./rototiller --video=sdl,size=640x480 - * ./rototiller --module=roto,foo=bar,module=settings - * ./rototiller --defaults - */ -static int parse_argv(int argc, const char *argv[], argv_t *res_args) -{ - int i; - - assert(argc > 0); - assert(argv); - assert(res_args); - - /* this is intentionally being kept very simple, no new dependencies like getopt. */ - - for (i = 1; i < argc; i++) { - if (!strncmp("--video=", argv[i], 8)) { - res_args->video = &argv[i][8]; - } else if (!strncmp("--module=", argv[i], 9)) { - res_args->module = &argv[i][9]; - } else if (!strcmp("--defaults", argv[i])) { - res_args->use_defaults = 1; - } else if (!strcmp("--help", argv[i])) { - res_args->help = 1; - } else { - return -EINVAL; - } - } - - return 0; -} - - typedef struct setup_t { til_settings_t *module; til_settings_t *video; @@ -148,7 +107,7 @@ static int setup_video(til_settings_t *settings, til_setting_desc_t **next_setti /* turn args into settings, automatically applying defaults if appropriate, or interactively if appropriate. */ /* returns negative value on error, 0 when settings unchanged from args, 1 when changed */ -static int setup_from_args(argv_t *args, setup_t *res_setup) +static int setup_from_args(til_args_t *args, setup_t *res_setup) { int r, changes = 0; setup_t setup; @@ -232,15 +191,11 @@ _out: static int print_help(void) { - return printf( - "Run without any flags or partial settings for interactive mode.\n" + printf("Run without any flags or partial settings for interactive mode.\n" "\n" - "Supported flags:\n" - " --defaults use defaults for unspecified settings\n" - " --help this help\n" - " --module= module settings\n" - " --video= video settings\n" - ); + "Supported flags:\n"); + + return til_args_help(stdout); } @@ -282,10 +237,10 @@ static void * rototiller_thread(void *_rt) int main(int argc, const char *argv[]) { setup_t setup = {}; - argv_t args = {}; + til_args_t args = {}; int r; - exit_if(parse_argv(argc, argv, &args) < 0, + exit_if(til_args_parse(argc, argv, &args) < 0, "unable to process arguments"); if (args.help) diff --git a/src/til_args.c b/src/til_args.c new file mode 100644 index 0000000..ae1346c --- /dev/null +++ b/src/til_args.c @@ -0,0 +1,47 @@ +#include <assert.h> +#include <errno.h> +#include <string.h> + +#include "til_args.h" + +/* + * ./rototiller --video=drm,dev=/dev/dri/card3,connector=VGA-1,mode=640x480@60 + * ./rototiller --video=sdl,size=640x480 + * ./rototiller --module=roto,foo=bar,module=settings + * ./rototiller --defaults + */ +int til_args_parse(int argc, const char *argv[], til_args_t *res_args) +{ + assert(argc > 0); + assert(argv); + assert(res_args); + + /* this is intentionally being kept very simple, no new dependencies like getopt. */ + + for (int i = 1; i < argc; i++) { + if (!strncmp("--video=", argv[i], 8)) { + res_args->video = &argv[i][8]; + } else if (!strncmp("--module=", argv[i], 9)) { + res_args->module = &argv[i][9]; + } else if (!strcmp("--defaults", argv[i])) { + res_args->use_defaults = 1; + } else if (!strcmp("--help", argv[i])) { + res_args->help = 1; + } else { + return -EINVAL; + } + } + + return 0; +} + + +int til_args_help(FILE *out) +{ + return fprintf(out, + " --defaults use defaults for unspecified settings\n" + " --help this help\n" + " --module= module settings\n" + " --video= video settings\n" + ); +} diff --git a/src/til_args.h b/src/til_args.h new file mode 100644 index 0000000..018ae80 --- /dev/null +++ b/src/til_args.h @@ -0,0 +1,17 @@ +#ifndef _TIL_ARGS_H +#define _TIL_ARGS_H + +#include <stdio.h> + +typedef struct til_args_t { + const char *module; + const char *video; + + unsigned use_defaults:1; + unsigned help:1; +} til_args_t; + +int til_args_parse(int argc, const char *argv[], til_args_t *res_args); +int til_args_help(FILE *out); + +#endif |