liboptcfg

changeset 4:a6f127f3408d

implemented -no- and -disable- prefixes
author John Tsiombikas <nuclear@member.fsf.org>
date Wed, 27 Jul 2016 05:05:45 +0300
parents f971dfa66076
children aca7267dfee0
files src/optcfg.c src/optcfg.h
diffstat 2 files changed, 25 insertions(+), 12 deletions(-) [+]
line diff
     1.1 --- a/src/optcfg.c	Wed Jul 27 04:31:40 2016 +0300
     1.2 +++ b/src/optcfg.c	Wed Jul 27 05:05:45 2016 +0300
     1.3 @@ -22,6 +22,7 @@
     1.4  	/* argument parsing state */
     1.5  	char **argv;
     1.6  	int argidx;
     1.7 +	int disable_opt;
     1.8  
     1.9  	/* config file parsing state */
    1.10  	const char *cfg_fname;
    1.11 @@ -29,7 +30,7 @@
    1.12  	char *cfg_value;
    1.13  };
    1.14  
    1.15 -static int get_opt(struct optcfg *oc, const char *s);
    1.16 +static int get_opt(struct optcfg *oc, const char *s, int *disable_opt);
    1.17  static char *skip_spaces(char *s);
    1.18  static void strip_comments(char *s);
    1.19  static void strip_trailing_spaces(char *s);
    1.20 @@ -86,9 +87,10 @@
    1.21  
    1.22  		if(argv[i][0] == '-') {
    1.23  			if(oc->opt_func) {
    1.24 -				int o = get_opt(oc, argv[i]);
    1.25 +				int o = get_opt(oc, argv[i], &oc->disable_opt);
    1.26  				if(o == -1 || oc->opt_func(oc, o, oc->opt_cls) == -1) {
    1.27  					if(oc->err_abort) {
    1.28 +						fprintf(stderr, "unexpected option: %s\n", argv[i]);
    1.29  						return -1;
    1.30  					}
    1.31  				}
    1.32 @@ -102,6 +104,7 @@
    1.33  			if(oc->arg_func) {
    1.34  				if(oc->arg_func(oc, argv[i], oc->arg_cls) == -1) {
    1.35  					if(oc->err_abort) {
    1.36 +						fprintf(stderr, "unexpected argument: %s\n", argv[i]);
    1.37  						return -1;
    1.38  					}
    1.39  				}
    1.40 @@ -173,7 +176,7 @@
    1.41  		return -1;
    1.42  	}
    1.43  	oc->cfg_value = val;
    1.44 -	if((opt = get_opt(oc, start)) == -1) {
    1.45 +	if((opt = get_opt(oc, start, 0)) == -1) {
    1.46  		fprintf(stderr, "error parsing %s line %d: unknown option: %s\n", oc->cfg_fname ? oc->cfg_fname : "",
    1.47  				oc->cfg_nline, start);
    1.48  		return -1;
    1.49 @@ -191,7 +194,7 @@
    1.50  int optcfg_enabled_value(struct optcfg *oc, int *enabledp)
    1.51  {
    1.52  	if(oc->argidx) {
    1.53 -		*enabledp = 1; /* TODO take -no- prefix into account */
    1.54 +		*enabledp = ~oc->disable_opt & 1;
    1.55  	} else {
    1.56  		char *val = optcfg_next_value(oc);
    1.57  		if(optcfg_bool_value(val, enabledp) == -1) {
    1.58 @@ -270,17 +273,27 @@
    1.59  
    1.60  
    1.61  
    1.62 -static int get_opt(struct optcfg *oc, const char *arg)
    1.63 +static int get_opt(struct optcfg *oc, const char *arg, int *disable_opt)
    1.64  {
    1.65  	int i, ndashes = 0;
    1.66  
    1.67  	while(*arg && *arg == '-') {
    1.68 -		ndashes++;
    1.69 -		arg++;
    1.70 +		++ndashes;
    1.71 +		++arg;
    1.72  	}
    1.73  
    1.74  	if(ndashes > 2) {
    1.75  		arg -= ndashes;
    1.76 +		ndashes = 0;
    1.77 +	}
    1.78 +
    1.79 +	if(disable_opt) {
    1.80 +		if(ndashes && (strstr(arg, "no-") == arg || strstr(arg, "disable-") == arg)) {
    1.81 +			*disable_opt = 1;
    1.82 +			arg = strchr(arg, '-') + 1;	/* guaranteed to exist at this point */
    1.83 +		} else {
    1.84 +			*disable_opt = 0;
    1.85 +		}
    1.86  	}
    1.87  
    1.88  	if(arg[1]) {	/* match long options */
     2.1 --- a/src/optcfg.h	Wed Jul 27 04:31:40 2016 +0300
     2.2 +++ b/src/optcfg.h	Wed Jul 27 05:05:45 2016 +0300
     2.3 @@ -7,10 +7,10 @@
     2.4  struct optcfg;
     2.5  
     2.6  struct optcfg_option {
     2.7 -	char c;		/* short (optional): used only for argument parsing */
     2.8 -	char *s;	/* long: used for long options and config files */
     2.9 -	int opt;	/* the corresponding option enumeration */
    2.10 -	char *desc;	/* text description for printing usage information */
    2.11 +	char c;				/* short (optional): used only for argument parsing */
    2.12 +	const char *s;		/* long: used for long options and config files */
    2.13 +	int opt;			/* the corresponding option enumeration */
    2.14 +	const char *desc;	/* text description for printing usage information */
    2.15  };
    2.16  
    2.17  #define OPTCFG_OPTIONS_END	{0, 0, -1, 0}
    2.18 @@ -63,7 +63,7 @@
    2.19   * optcfg_bool_value in sequence.
    2.20   * For argument parsing however, it doesn't consume further arguments. Merely
    2.21   * the presence of the option makes it enabled, and its presence with a -no-
    2.22 - * prefix disables it. (TODO the second part of this)
    2.23 + * or -disable- prefix disables it.
    2.24   */
    2.25  int optcfg_enabled_value(struct optcfg *oc, int *enabledp);
    2.26