diff options
| author | Rich Felker <dalias@aerifal.cx> | 2014-12-20 19:44:37 -0500 | 
|---|---|---|
| committer | Rich Felker <dalias@aerifal.cx> | 2014-12-20 19:44:37 -0500 | 
| commit | 91184c4f16b143107fa9935edebe5d2b20bd70d8 (patch) | |
| tree | 6f74e3f852498ae639bcc6250e53620f062ad5e4 /src | |
| parent | d3357268791f5279b64665a9a5b5629c962c8a15 (diff) | |
| download | musl-91184c4f16b143107fa9935edebe5d2b20bd70d8.tar.gz | |
add error message printing to getopt_long and make related improvements
some related changes are also made to getopt, and the return value of
getopt_long in the case of missing arguments is fixed.
Diffstat (limited to 'src')
| -rw-r--r-- | src/misc/getopt.c | 4 | ||||
| -rw-r--r-- | src/misc/getopt_long.c | 34 | 
2 files changed, 32 insertions, 6 deletions
diff --git a/src/misc/getopt.c b/src/misc/getopt.c index 9db5eaac..92179830 100644 --- a/src/misc/getopt.c +++ b/src/misc/getopt.c @@ -12,7 +12,7 @@ int optind=1, opterr=1, optopt, __optpos, __optreset=0;  #define optpos __optpos  weak_alias(__optreset, optreset); -void __getopt_msg(const char *a, const char *b, const char *c, int l) +void __getopt_msg(const char *a, const char *b, const char *c, size_t l)  {  	FILE *f = stderr;  	b = __lctrans_cur(b); @@ -80,7 +80,7 @@ int getopt(int argc, char * const argv[], const char *optstring)  	if (d != c) {  		if (optstring[0] != ':' && opterr) -			__getopt_msg(argv[0], ": illegal option: ", optchar, k); +			__getopt_msg(argv[0], ": unrecognized option: ", optchar, k);  		return '?';  	}  	if (optstring[i] == ':') { diff --git a/src/misc/getopt_long.c b/src/misc/getopt_long.c index df2083bb..45992f85 100644 --- a/src/misc/getopt_long.c +++ b/src/misc/getopt_long.c @@ -2,6 +2,7 @@  #include <stddef.h>  #include <getopt.h>  #include <stdio.h> +#include <string.h>  extern int __optpos, __optreset; @@ -15,11 +16,14 @@ static void permute(char *const *argv, int dest, int src)  	av[dest] = tmp;  } +void __getopt_msg(const char *, const char *, const char *, size_t); +  static int __getopt_long_core(int argc, char *const *argv, const char *optstring, const struct option *longopts, int *idx, int longonly);  static int __getopt_long(int argc, char *const *argv, const char *optstring, const struct option *longopts, int *idx, int longonly)  {  	int ret, skipped, resumed; +	const char *optstring2 = optstring + 1;  	if (!optind || __optreset) {  		__optreset = 0;  		__optpos = 0; @@ -34,9 +38,10 @@ static int __getopt_long(int argc, char *const *argv, const char *optstring, con  			if (argv[i][0] == '-' && argv[i][1]) break;  		}  		optind = i; +		optstring2 = optstring;  	}  	resumed = optind; -	ret = __getopt_long_core(argc, argv, optstring, longopts, idx, longonly); +	ret = __getopt_long_core(argc, argv, optstring2, longopts, idx, longonly);  	if (resumed > skipped) {  		int i, cnt = optind-resumed;  		for (i=0; i<cnt; i++) @@ -72,12 +77,27 @@ static int __getopt_long_core(int argc, char *const *argv, const char *optstring  			i = match;  			optind++;  			if (*opt == '=') { -				if (!longopts[i].has_arg) return '?'; +				if (!longopts[i].has_arg) { +					if (optstring[0] == ':' || !opterr) +						return '?'; +					__getopt_msg(argv[0], +						": option does not take an argument: ", +						longopts[i].name, +						strlen(longopts[i].name)); +					return '?'; +				}  				optarg = opt+1;  			} else {  				if (longopts[i].has_arg == required_argument) { -					if (!(optarg = argv[optind])) -						return ':'; +					if (!(optarg = argv[optind])) { +						if (optstring[0] == ':' || !opterr) +							return ':'; +						__getopt_msg(argv[0], +							": option requires an argument: ", +							longopts[i].name, +							strlen(longopts[i].name)); +						return '?'; +					}  					optind++;  				} else optarg = NULL;  			} @@ -89,6 +109,12 @@ static int __getopt_long_core(int argc, char *const *argv, const char *optstring  			return longopts[i].val;  		}  		if (argv[optind][1] == '-') { +			if (optstring[0] != ':' && opterr) +				__getopt_msg(argv[0], cnt ? +					": option is ambiguous: " : +					": unrecognized option: ", +					argv[optind]+2, +					strlen(argv[optind]+2));  			optind++;  			return '?';  		}  | 
