From c6b0fe49b5482891215656f6f4024dd717ed631e Mon Sep 17 00:00:00 2001 From: King_DuckZ Date: Tue, 15 Mar 2016 21:10:52 +0100 Subject: [PATCH] Use getopt_long() to parse command line. --- src/main/main.c | 117 +++++++++++++++++++++++++++++++++--------------- 1 file changed, 82 insertions(+), 35 deletions(-) diff --git a/src/main/main.c b/src/main/main.c index 6a33ca0..f9c5d12 100644 --- a/src/main/main.c +++ b/src/main/main.c @@ -15,67 +15,57 @@ * along with "dindexer". If not, see . */ +#define _GNU_SOURCE 1 + +#include "dindexerConfig.h" +#include "findactions.h" +#include "helpers/lengthof.h" +#include "builtin_feats.h" #include #include #include #include #include -#include "dindexerConfig.h" -#include "findactions.h" -#include "helpers/lengthof.h" -#include "builtin_feats.h" +#include static size_t foreach_avail_action ( int(*parFunc)(const char*, const void*), char** parList, size_t parCount, const void* parPass ); static int printf_stream ( const char* parMsg, const void* parStream ); static int same_action ( const char* parAction1, const void* parAction2 ); static void print_usage ( void ); +static int manage_commandline ( int parArgc, char* parArgv[], char** parActions, size_t parActionCount, int* parShouldQuit ); int main (int parArgc, char* parArgv[]) { size_t z; size_t actions_count; char** actions; char* action_path; + char* specified_action; size_t action_path_length; size_t selected_action; char** argv; - FILE* streamout; int retval; - int showbuiltin; + int should_quit; - showbuiltin = (parArgc >= 2 ? not strcmp("--builtin", parArgv[1]) : 0); find_actions(&actions, &actions_count); - if (0 == actions_count and not showbuiltin) { + retval = manage_commandline(parArgc, parArgv, actions, actions_count, &should_quit); + if (should_quit) { + free_actions(actions, actions_count); + return retval; + } + if (0 == actions_count) { fprintf(stderr, "No actions found in \"%s\"\n", ACTIONS_SEARCH_PATH); return 1; } - if (parArgc < 2 or strcmp("-h", parArgv[1]) == 0 or strcmp("--help", parArgv[1]) == 0) { - if (parArgc < 2) { - streamout = stderr; - fprintf(stderr, "No action specified. "); - retval = 2; - } - else { - print_usage(); - printf("\n"); - streamout = stdout; - retval = 0; - } - fprintf(streamout, "Available actions are:\n"); - foreach_avail_action(&printf_stream, actions, actions_count, streamout); - free_actions(actions, actions_count); - return retval; - } - else if (showbuiltin) { - print_builtin_feats(); - free_actions(actions, actions_count); - return 0; - } - selected_action = foreach_avail_action(&same_action, actions, actions_count, parArgv[1]); + if (optind < parArgc) + specified_action = parArgv[optind]; + else + specified_action = ""; + selected_action = foreach_avail_action(&same_action, actions, actions_count, specified_action); if (actions_count == selected_action) { - fprintf(stderr, "Unrecognized action \"%s\" - available actions are:\n", parArgv[1]); + fprintf(stderr, "Unrecognized action \"%s\" - available actions are:\n", specified_action); foreach_avail_action(&printf_stream, actions, actions_count, stderr); free_actions(actions, actions_count); return 2; @@ -102,7 +92,7 @@ int main (int parArgc, char* parArgv[]) { argv = (char**)malloc(sizeof(char*) * (parArgc - 1 + 1)); argv[0] = action_path; for (z = 2; z <= parArgc; ++z) { - argv[z - 1] = parArgv[z]; + argv[z - 1] = specified_action; } /*printf("would call %s\n", action_path);*/ @@ -146,6 +136,63 @@ static int same_action (const char* parAction1, const void* parAction2) { } static void print_usage() { - printf("--help - show this help\n"); - printf("--builtin - show build info\n"); + printf("--help, -h - show this help\n"); + printf("--builtin, -b - show build info\n"); +} + +static int manage_commandline (int parArgc, char* parArgv[], char** parActions, size_t parActionCount, int* parShouldQuit) { + int showbuiltin; + int showhelp; + int option_index; + int getopt_retval; + FILE* streamout; + int retval; + + struct option opts[] = { + { "builtin", no_argument, &showbuiltin, 1 }, + { "help", no_argument, &showhelp, 1 }, + { 0, 0, 0, 0 } + }; + + option_index = 0; + showbuiltin = showhelp = 0; + *parShouldQuit = 0; + while (0 <= (getopt_retval = getopt_long(parArgc, parArgv, "bh", opts, &option_index))) { + switch (getopt_retval) { + case 'h': + showhelp = 1; + break; + case 'b': + showbuiltin = 1; + break; + case '?': + *parShouldQuit = 1; + return 2; + } + option_index = 0; + } + + if (parArgc < 2 or showhelp) { + *parShouldQuit = 1; + if (parArgc < 2) { + streamout = stderr; + fprintf(stderr, "No action specified. "); + retval = 2; + } + else { + print_usage(); + printf("\n"); + streamout = stdout; + retval = 0; + } + fprintf(streamout, "Available actions are:\n"); + foreach_avail_action(&printf_stream, parActions, parActionCount, streamout); + return retval; + } + else if (showbuiltin) { + *parShouldQuit = 1; + print_builtin_feats(); + return 0; + } + return 0; }