#include <string.h>
#include <stdarg.h>
+#include "diag-control.h"
+
#define GNU_COMPATIBLE /* Be more compatible, configure's use us! */
#define PRINT_ERROR ((opterr) && (*options != ':'))
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
}
}
}
}
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 ==
*/
optarg = nargv[optind++];
}
+DIAG_ON_CAST_QUAL
}
if ((long_options[match].has_arg == required_argument)
&& (optarg == NULL)) {
++optind;
} else { /* takes (optional) argument */
optarg = NULL;
+DIAG_OFF_CAST_QUAL
if (*place) /* no white space */
optarg = (char *)place;
+DIAG_ON_CAST_QUAL
else if (oli[1] != ':') { /* arg not optional */
if (++optind >= nargc) { /* no arg */
place = EMSG;