From dde3bda516bb4d84922e4068c77ee4b4b7492342 Mon Sep 17 00:00:00 2001 From: Amy Gale Ruth Bowersox Date: Fri, 6 Dec 2019 22:37:20 -0700 Subject: [PATCH] added command line parsing for options --- src/config.c | 76 +++++++++++++++++++++++++++++++++++++++++++++++++++- src/config.h | 2 +- src/main.c | 6 ++++- 3 files changed, 81 insertions(+), 3 deletions(-) diff --git a/src/config.c b/src/config.c index f16c844..1ede164 100644 --- a/src/config.c +++ b/src/config.c @@ -1,7 +1,25 @@ #include +#include +#include #include "config.h" #include "log.h" +static const struct option long_options[] = { + {"framebuffer", required_argument, 0, 'F'}, + {"help", no_argument, 0, 'h'}, + { NULL, 0, 0, 0 } +}; + +static const char *short_options = "F:h"; + +static const char *helptext = + "UPIWIN - Micro Pi Windows server program\n\n" + "Usage: upiwin [options] scriptname [scriptargs]\n\n" + "Available options:\n" + " -F,--framebuffer [devname] - Specifies the framebuffer device name\n" + " -h,--help - Displays this help message.\n" + ""; + #define EXITFUNCBLOCK_FUNCCOUNT 64 typedef struct tagEXITFUNCBLOCK @@ -38,14 +56,70 @@ static void init_defaults(void) Gconfig.sys_mq_length = 64; } -HRESULT Config_setup(void) +static HRESULT parse_cmdline(int argc, char *argv[], GLOBAL_CONFIG *parsed) { + int c; + PSTR pstr; + BOOL help = FALSE; + + memset(parsed, 0, sizeof(GLOBAL_CONFIG)); + for (;;) + { + c = getopt_long(argc, argv, short_options, long_options, NULL); + if (c==-1) + break; + switch (c) + { + case 'F': + pstr = strdup(optarg); + if (!pstr) + { + Log(LERROR, "Out of memory in parse_cmdline"); + return E_OUTOFMEMORY; + } + if (parsed->framebuffer_device) + free(parsed->framebuffer_device); + parsed->framebuffer_device = pstr; + break; + + case 'h': + help = TRUE; + break; + + default: + fprintf(stderr, "%s: unexpected option -%c\n", argv[0], c); + return E_UNEXPECTED; + } + } + if (help) + { + fputs(helptext, stdout); + return S_FALSE; + } + return S_OK; +} + +static void overlay_config(GLOBAL_CONFIG *p) +{ + if (p->framebuffer_device) + Gconfig.framebuffer_device = p->framebuffer_device; +} + +HRESULT Config_setup(int argc, char *argv[]) +{ + HRESULT hr; + GLOBAL_CONFIG from_commandline; + if (atexit(run_exit_funcs)) { Log(LFATAL, "Unable to set up exit function mechanism"); return E_FAIL; } init_defaults(); + hr = parse_cmdline(argc, argv, &from_commandline); + if (hr != S_OK) + return hr; + overlay_config(&from_commandline) return S_OK; } diff --git a/src/config.h b/src/config.h index b716af5..4916612 100644 --- a/src/config.h +++ b/src/config.h @@ -13,7 +13,7 @@ typedef struct tagGLOBAL_CONFIG { extern GLOBAL_CONFIG Gconfig; -extern HRESULT Config_setup(void); +extern HRESULT Config_setup(int argc, char *argv[]); extern HRESULT Config_exitfunc(PEXITFUNC pfn); #endif /* __CONFIG_H_INCLUDED */ diff --git a/src/main.c b/src/main.c index d56555b..8716e56 100644 --- a/src/main.c +++ b/src/main.c @@ -27,13 +27,17 @@ static void do_draw(void) int main(int argc, char *argv[]) { + HRESULT hr; int running = 1; MSG msg; char *tmp; Time_init(); - if (FAILED(Config_setup())) + hr = Config_setup(argc, argv); + if (FAILED(hr)) return EXIT_FAILURE; + else if (hr != S_OK) + return EXIT_SUCCESS; if (FAILED(Fb_setup())) return EXIT_FAILURE; if (FAILED(Gpio_setup()))