This eliminates a warning from MSVC, and makes the flow a little
clearer.
(Yes, it duplicates some code, but compilers have been pretty good at
merging common code sequences, so it might just turn it into the
equivalent of
if (optopt == (int)':')
goto label;
oli = strchr(ostr, optopt);
if (!oli) {
label:
/*
* Unknown option character.
*/
if (!*place)
++optind;
...
}
although it does mean that the same C code exists in two places.)
- if ((optchar = (int)*place++) == (int)':' ||
- (optchar == (int)'-' && *place != '\0') ||
- (oli = strchr(options, optchar)) == NULL) {
+ optchar = (int)*place++;
+ /*
+ * If the user specified "-" and '-' isn't listed in
+ * options, return -1 (non-option) as per POSIX.
+ */
+ if (optchar == (int)'-' && *place == '\0')
+ return (-1);
+ if (optchar == (int)':') {
+ if (!*place)
+ ++optind;
+#ifdef GNU_COMPATIBLE
+ if (PRINT_ERROR)
+ warnx(posixly_correct ? illoptchar : gnuoptchar,
+ optchar);
+#else
+ if (PRINT_ERROR)
+ warnx(illoptchar, optchar);
+#endif
+ optopt = optchar;
+ return (BADCH);
+ }
+ oli = strchr(options, optchar);
+ if (oli == NULL) {
- * If the user specified "-" and '-' isn't listed in
- * options, return -1 (non-option) as per POSIX.
- * Otherwise, it is an unknown option character (or ':').
+ * Unknown option character.
- if (optchar == (int)'-' && *place == '\0')
- return (-1);
if (!*place)
++optind;
#ifdef GNU_COMPATIBLE
if (!*place)
++optind;
#ifdef GNU_COMPATIBLE