X-Git-Url: https://git.tcpdump.org/tcpdump/blobdiff_plain/90488805cc1b8047d228850ba6670bc179b9e5c9..refs/heads/master:/missing/getopt_long.c diff --git a/missing/getopt_long.c b/missing/getopt_long.c index 245e7bd3..e9b1ef57 100644 --- a/missing/getopt_long.c +++ b/missing/getopt_long.c @@ -51,12 +51,14 @@ #include -#include "getopt.h" +#include "getopt_long.h" #include #include #include #include +#include "diag-control.h" + #define GNU_COMPATIBLE /* Be more compatible, configure's use us! */ #define PRINT_ERROR ((opterr) && (*options != ':')) @@ -68,7 +70,7 @@ /* return values */ #define BADCH (int)'?' #define BADARG ((*options == ':') ? (int)':' : (int)'?') -#define INORDER (int)1 +#define INORDER (int)1 #define EMSG "" @@ -80,7 +82,7 @@ #endif char *optarg; -int optind, opterr, optopt; +int optind, opterr = 1, optopt; static int getopt_internal(int, char * const *, const char *, const struct option *, int *, int); @@ -158,11 +160,29 @@ permute_args(int panonopt_start, int panonopt_end, int opt_end, pos -= nnonopts; else pos += nopts; + /* + * This is annoying - I guess the + * "char * const argv[]" in the declaration + * of getopt() - and thus getopt_long() - + * means that it makes a promise not to + * shuffle the arguments, but here we are, + * shuffling the arguments. + * + * (No, it's not a promise that it won't + * modify any of the argument strings. + * It's a promise that it won't modify + * the array of pointers to the argument + * strings.) + * + * So squelch the cast warnings. + */ swap = nargv[pos]; +DIAG_OFF_CAST_QUAL /* LINTED const cast */ ((char **) nargv)[pos] = nargv[cstart]; /* LINTED const cast */ ((char **)nargv)[cstart] = swap; +DIAG_ON_CAST_QUAL } } } @@ -291,6 +311,7 @@ parse_long_options(char * const *nargv, const char *options, } if (long_options[match].has_arg == required_argument || long_options[match].has_arg == optional_argument) { +DIAG_OFF_CAST_QUAL if (has_equal) optarg = (char *)has_equal; else if (long_options[match].has_arg == @@ -300,6 +321,7 @@ parse_long_options(char * const *nargv, const char *options, */ optarg = nargv[optind++]; } +DIAG_ON_CAST_QUAL } if ((long_options[match].has_arg == required_argument) && (optarg == NULL)) { @@ -397,8 +419,7 @@ start: permute_args(nonopt_start, nonopt_end, optind, nargv); optind -= nonopt_end - nonopt_start; - } - else if (nonopt_start != -1) { + } else if (nonopt_start != -1) { /* * If we skipped non-options, set optind * to the first of them. @@ -543,9 +564,11 @@ start: ++optind; } else { /* takes (optional) argument */ optarg = NULL; - if (*place) /* no white space */ + if (*place) { /* no white space */ +DIAG_OFF_CAST_QUAL optarg = (char *)place; - else if (oli[1] != ':') { /* arg not optional */ +DIAG_ON_CAST_QUAL + } else if (oli[1] != ':') { /* arg not optional */ if (++optind >= nargc) { /* no arg */ place = EMSG; if (PRINT_ERROR)