From 9a98cfe6224757ad21c223f74efb537d9edca24f Mon Sep 17 00:00:00 2001 From: Vito Caputo Date: Sun, 3 Oct 2021 17:15:09 -0700 Subject: 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. --- src/Makefile.am | 2 +- src/main.c | 61 ++++++++------------------------------------------------- src/til_args.c | 47 ++++++++++++++++++++++++++++++++++++++++++++ src/til_args.h | 17 ++++++++++++++++ 4 files changed, 73 insertions(+), 54 deletions(-) create mode 100644 src/til_args.c create mode 100644 src/til_args.h 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 diff --git a/src/main.c b/src/main.c index c028998..d07015b 100644 --- a/src/main.c +++ b/src/main.c @@ -11,6 +11,7 @@ #include #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 +#include +#include + +#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 + +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 -- cgit v1.2.3