From: Hugo Villeneuve Date: Thu, 10 Oct 2013 02:31:14 +0000 (-0400) Subject: Replace custom command-line options processing with argp X-Git-Tag: v2.0.0~135 X-Git-Url: http://gitweb.hugovil.com/?a=commitdiff_plain;h=7b400e8dd6a3f1a50247b74283c76e34f9e20ba1;p=emu8051.git Replace custom command-line options processing with argp --- diff --git a/src/emuconsole.c b/src/emuconsole.c index a3f563c..4c35f5a 100644 --- a/src/emuconsole.c +++ b/src/emuconsole.c @@ -33,6 +33,8 @@ #include "hexfile.h" #include "keyboard.h" +extern struct options_t options; + /* Capitalize all letters in buffer */ static void Capitalize(char *buffer) @@ -451,16 +453,12 @@ TooMuchParameters: int main(int argc, char **argv) { - char *hex_file; - - ParseCommandLineOptions(argc, argv); + parse_command_line_options(argc, argv); cpu8051_init(); - hex_file = get_hex_filename(); - - if (hex_file != NULL) - LoadHexFile(hex_file); + if (options.filename != NULL) + LoadHexFile(options.filename); console_main(); diff --git a/src/emugtk.c b/src/emugtk.c index 4b256f9..656a07e 100644 --- a/src/emugtk.c +++ b/src/emugtk.c @@ -53,6 +53,7 @@ static int running_function_tag; GtkWidget *mainwin; extern struct app_config_t *cfg; +extern struct options_t options; /* Step out of running state */ static void @@ -430,10 +431,7 @@ emugtk_new_file(char *file) int main(int argc, char **argv) { - char *hex_file; - - ParseCommandLineOptions(argc, argv); - + parse_command_line_options(argc, argv); app_config_load(); cpu8051_init(); @@ -444,10 +442,8 @@ main(int argc, char **argv) emugtk_window_init(); - hex_file = get_hex_filename(); - - if (hex_file != NULL) - emugtk_new_file(hex_file); + if (options.filename != NULL) + emugtk_new_file(options.filename); else emugtk_Reset(); diff --git a/src/options.c b/src/options.c index 8cb065a..94f1063 100644 --- a/src/options.c +++ b/src/options.c @@ -1,21 +1,12 @@ /* - * Processing command-line options and arguments. + * options.c -- functions for processing command-line options and arguments * - * Copyright (C) 1999 Hugo Villeneuve + * Copyright (C) 2011 Hugo Villeneuve * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. */ #if HAVE_CONFIG_H @@ -25,6 +16,7 @@ #include #include #include +#include #if STDC_HEADERS # include @@ -35,25 +27,27 @@ #include "common.h" #include "options.h" -static char *hex_file; +const char *argp_program_version = PACKAGE_VERSION; +const char *argp_program_bug_address = PACKAGE_BUGREPORT; -/* - * Return the hex file name - */ -char * -get_hex_filename(void) -{ - return hex_file; -} +#define PACKAGE_DOC_LENGTH 128 -/******************************************************************************* - * Display the help message and exit - ******************************************************************************/ -static void -DisplayUsage(void) -{ - printf(COMMAND_LINE_OPTIONS); -} +/* Program documentation. */ +static char str_doc[PACKAGE_DOC_LENGTH]; + +/* How many arguments we accept. */ +#define ARGS_COUNT 1 + +/* A description of the arguments we accept. */ +static const char args_doc[] = "[FILENAME]"; + +/* The options we understand. */ +static struct argp_option argp_options[] = { + {"debug", 'd', "level", 0, "Produce debugging output" }, + { 0 } +}; + +struct options_t options; const char * get_package_description(void) @@ -61,71 +55,69 @@ get_package_description(void) return "Emulator for 8051 family microcontrollers"; } -/******************************************************************************* - * Display version information and exit - ******************************************************************************/ static void -DisplayVersion(void) +decode_debug_option(char *arg, struct argp_state *state) { - printf("\n"); - printf(" %s, version %s\n", PACKAGE, VERSION); - printf(" Written by Jonathan St-André, Pascal Fecteau" - "and Hugo Villeneuve\n\n"); + char *endptr; + int log_level; + + log_level = strtol(arg, &endptr, 0); + + if (*endptr != '\0') { + log_fail_no_exit("Invalid log level"); + argp_usage(state); + } + + if (log_level > LOG_LEVEL_DEBUG) { + log_fail_no_exit("Invalid log level"); + argp_usage(state); + } + + log_set_level(log_level); } -static void -InvalidOption(const char *message, /*@null@*/ const char *string) +/* Parse a single option. */ +static error_t +parse_opt(int key, char *arg, struct argp_state *state) { - if (string == NULL) - fprintf(stderr, "%s: %s\n", PACKAGE, message); - else - fprintf(stderr, "%s: %s %s\n", PACKAGE, message, string); + switch (key) { + case 'd': + decode_debug_option(arg, state); + break; + case ARGP_KEY_ARG: + if (state->arg_num >= ARGS_COUNT) { + /* Too many arguments. */ + argp_usage(state); + } - fprintf(stderr, "Try `%s -h' for more information.\n", PACKAGE); + options.filename = arg; + break; + case ARGP_KEY_END: + if (state->arg_num < ARGS_COUNT) { + /* Not enough arguments, but the filename is optional. + So no error. */ + } + break; + default: + return ARGP_ERR_UNKNOWN; + } - exit(EXIT_FAILURE); + return 0; } +/* Our argp parser. */ +static struct argp argp = { argp_options, parse_opt, args_doc, str_doc }; -/******************************************************************************* - * Initializes the different options passed as arguments on the command line. - ******************************************************************************/ +/* Initializes the different options passed as arguments on the command line. */ void -ParseCommandLineOptions(int argc, char *argv[]) +parse_command_line_options(int argc, char *argv[]) { - int i; - char *token; - - for (i = 1; i < argc; i++) { - token = argv[i]; - switch (token[0]) { - case '-': - /* Processing options names */ - switch (token[1]) { - case 'h': - if (strlen(&token[1]) == 1) { - DisplayUsage(); - exit(EXIT_SUCCESS); - } - InvalidOption("invalid option", token); - break; - case 'v': - if (STREQ("version", &token[1])) { - DisplayVersion(); - exit(EXIT_SUCCESS); - } else - InvalidOption("invalid option", token); - break; - default: - InvalidOption("invalid option", token); - break; - } /* end switch(token[1]) */ - break; - default: - /* Processing options arguments */ - /* Must be the filename... */ - hex_file = token; - break; - } /* end switch(token[0]) */ - } /* end for */ + snprintf(str_doc, PACKAGE_DOC_LENGTH, "%s -- %s", PACKAGE_NAME, + get_package_description()); + + /* Setting default values. */ + options.filename = NULL; + + /* Parse our arguments. */ + argp_parse(&argp, argc, argv, 0, 0, NULL); } diff --git a/src/options.h b/src/options.h index 4c38439..f71427f 100644 --- a/src/options.h +++ b/src/options.h @@ -27,11 +27,12 @@ " -h display this help and exit\n" \ " -version display version information and exit\n" -void -ParseCommandLineOptions(int argc, char *argv[]); +struct options_t { + char *filename; +} options_t; -char * -get_hex_filename(void); +void +parse_command_line_options(int argc, char *argv[]); const char * get_package_description(void);