diff options
Diffstat (limited to '')
-rw-r--r-- | src/options.c | 251 |
1 files changed, 118 insertions, 133 deletions
diff --git a/src/options.c b/src/options.c index ab383a38f..60101c478 100644 --- a/src/options.c +++ b/src/options.c @@ -38,22 +38,19 @@ #define ERROR_GOT_ARGUMENT 0x03 #define ERROR_MISSING_ARGUMENT 0x04 - - -typedef struct -{ - int shortopt; - char *longopt; - char *argument; - char *descrition; +typedef struct { + int shortopt; + char *longopt; + char *argument; + char *descrition; } arg_opt_t; -typedef void (*option_callback_fn_t) (int c, char *arg); +typedef void (*option_callback_fn_t)(int c, char *arg); options_t options; - + static arg_opt_t option_table[] = { { '?', "help", NULL, "Show this help message" }, { 'V', "version", NULL, "Display version information" }, @@ -238,138 +235,126 @@ handle_option(int c, char *arg) options_t * options_parse(int argc, const char *argv[]) { - int i; - arg_opt_t *opt = NULL; - option_callback_fn_t option_cb = handle_option; + int i; + arg_opt_t *opt = NULL; + option_callback_fn_t option_cb = handle_option; - i=1; - while( i<argc ) - { - char *arg = (char *) argv[i]; - size_t len=strlen(arg); - - /* check for a long option */ - if( g_str_has_prefix(arg, "--") ) - { - char *name, *value; - - /* make shure we got an argument for the previous option */ - if( opt && opt->argument ) - option_error(ERROR_MISSING_ARGUMENT, opt->longopt, opt->argument); - - /* retreive a option argument */ - if( (value=g_strrstr(arg+2, "=")) ) - { - *value = '\0'; - name = g_strdup(arg); - *value = '='; - value++; - } - else - name = g_strdup(arg); - - /* check if the option exists */ - if( (opt=lookup_option(0, name+2)) == NULL ) - option_error(ERROR_UNKNOWN_OPTION, name, NULL); - g_free(name); - - /* abort if we got an argument to the option and dont want one */ - if( value && opt->argument==NULL ) - option_error(ERROR_GOT_ARGUMENT, arg, value); - - /* execute option callback */ - if( value || opt->argument==NULL ) - { - option_cb (opt->shortopt, value); - opt = NULL; - } - } - /* check for short options */ - else if( len>=2 && g_str_has_prefix(arg, "-") ) - { - int j; - - for(j=1; j<len; j++) - { - /* make shure we got an argument for the previous option */ - if( opt && opt->argument ) - option_error(ERROR_MISSING_ARGUMENT, - opt->longopt, opt->argument); - - /* check if the option exists */ - if( (opt=lookup_option(arg[j], NULL))==NULL ) - option_error(ERROR_UNKNOWN_OPTION, arg, NULL); - - /* if no option argument is needed execute callback */ - if( opt->argument==NULL ) - { - option_cb (opt->shortopt, NULL); - opt = NULL; + i=1; + while (i < argc) { + char *arg = (char *) argv[i]; + size_t len = strlen(arg); + + /* check for a long option */ + if (g_str_has_prefix(arg, "--")) { + char *name, *value; + + /* make shure we got an argument for the previous option */ + if( opt && opt->argument ) + option_error(ERROR_MISSING_ARGUMENT, opt->longopt, opt->argument); + + /* retreive a option argument */ + if ((value=g_strrstr(arg+2, "="))) { + *value = '\0'; + name = g_strdup(arg); + *value = '='; + value++; + } else + name = g_strdup(arg); + + /* check if the option exists */ + if( (opt=lookup_option(0, name+2)) == NULL ) + option_error(ERROR_UNKNOWN_OPTION, name, NULL); + g_free(name); + + /* abort if we got an argument to the option and dont want one */ + if( value && opt->argument==NULL ) + option_error(ERROR_GOT_ARGUMENT, arg, value); + + /* execute option callback */ + if (value || opt->argument==NULL) { + option_cb (opt->shortopt, value); + opt = NULL; + } } - } - } - else - { - /* is this a option argument? */ - if( opt && opt->argument) - { - option_cb (opt->shortopt, arg); - opt = NULL; - } - else - option_error(ERROR_BAD_ARGUMENT, arg, NULL); + /* check for short options */ + else if (len>=2 && g_str_has_prefix(arg, "-")) { + int j; + + for(j=1; j<len; j++) { + /* make shure we got an argument for the previous option */ + if( opt && opt->argument ) + option_error(ERROR_MISSING_ARGUMENT, + opt->longopt, opt->argument); + + /* check if the option exists */ + if( (opt=lookup_option(arg[j], NULL))==NULL ) + option_error(ERROR_UNKNOWN_OPTION, arg, NULL); + + /* if no option argument is needed execute callback */ + if( opt->argument==NULL ) { + option_cb (opt->shortopt, NULL); + opt = NULL; + } + } + } else { + /* is this a option argument? */ + if( opt && opt->argument) { + option_cb (opt->shortopt, arg); + opt = NULL; + } else + option_error(ERROR_BAD_ARGUMENT, arg, NULL); + } + i++; } - i++; - } - - if( opt && opt->argument==NULL) - option_cb (opt->shortopt, NULL); - else if( opt && opt->argument ) - option_error(ERROR_MISSING_ARGUMENT, opt->longopt, opt->argument); - return &options; -} + if( opt && opt->argument==NULL) + option_cb (opt->shortopt, NULL); + else if( opt && opt->argument ) + option_error(ERROR_MISSING_ARGUMENT, opt->longopt, opt->argument); + return &options; +} options_t * options_init( void ) { - const char *value; - char *tmp; + const char *value; + char *tmp; - memset(&options, 0, sizeof(options_t)); + memset(&options, 0, sizeof(options_t)); - /* get initial values for host and password from MPD_HOST (enviroment) */ - if( (value=g_getenv(MPD_HOST_ENV)) ) - options.host = g_strdup(value); - else - options.host = g_strdup(DEFAULT_HOST); - if( (tmp=g_strstr_len(options.host, strlen(options.host), "@")) ) - { - char *oldhost = options.host; - *tmp = '\0'; - options.password = locale_to_utf8(oldhost); - options.host = g_strdup(tmp+1); - g_free(oldhost); - } - /* get initial values for port from MPD_PORT (enviroment) */ - if( (value=g_getenv(MPD_PORT_ENV)) ) - options.port = atoi(value); - else - options.port = DEFAULT_PORT; - - /* default option values */ - options.reconnect = TRUE; - options.find_wrap = TRUE; - options.wide_cursor = TRUE; - options.audible_bell = TRUE; - options.crossfade_time = DEFAULT_CROSSFADE_TIME; - options.seek_time = 1; - options.screen_list = g_strsplit_set(DEFAULT_SCREEN_LIST, " ", 0); - options.timedisplay_type = DEFAULT_TIMEDISPLAY_TYPE; - options.lyrics_timeout = DEFAULT_LYRICS_TIMEOUT; - options.scroll = DEFAULT_SCROLL; - options.scroll_sep = g_strdup(DEFAULT_SCROLL_SEP); - - return &options; + /* get initial values for host and password from MPD_HOST (enviroment) */ + if ((value=g_getenv(MPD_HOST_ENV))) + options.host = g_strdup(value); + else + options.host = g_strdup(DEFAULT_HOST); + + if ((tmp=g_strstr_len(options.host, strlen(options.host), "@"))) { + char *oldhost = options.host; + *tmp = '\0'; + options.password = locale_to_utf8(oldhost); + options.host = g_strdup(tmp+1); + g_free(oldhost); + } + + /* get initial values for port from MPD_PORT (enviroment) */ + if ((value=g_getenv(MPD_PORT_ENV))) + options.port = atoi(value); + else + options.port = DEFAULT_PORT; + + /* default option values */ + options.reconnect = TRUE; + options.find_wrap = TRUE; + options.wide_cursor = TRUE; + options.audible_bell = TRUE; + options.crossfade_time = DEFAULT_CROSSFADE_TIME; + options.seek_time = 1; + options.screen_list = g_strsplit_set(DEFAULT_SCREEN_LIST, " ", 0); + options.timedisplay_type = DEFAULT_TIMEDISPLAY_TYPE; + options.lyrics_timeout = DEFAULT_LYRICS_TIMEOUT; + options.scroll = DEFAULT_SCROLL; + options.scroll_sep = g_strdup(DEFAULT_SCROLL_SEP); + + return &options; } |