getopt: prefer switch-case rather than long if statement

And avoid testing same thing time after time.

CC: Frodo Looijaard <frodo@frodo.looijaard.name>
Signed-off-by: Sami Kerola <kerolasa@iki.fi>
This commit is contained in:
Sami Kerola 2014-12-07 00:16:56 +00:00
parent 0640689c20
commit bb742d7352
1 changed files with 37 additions and 27 deletions

View File

@ -122,42 +122,49 @@ static void normalize(const struct getopt_control *ctl, const char *arg)
* quote, and one extra character for '\0'.
*/
buf = xmalloc(strlen(arg) * 4 + 3);
bufptr = buf;
*bufptr++ = '\'';
while (*argptr) {
for (*bufptr++ = '\''; *argptr; argptr++) {
if (ctl->shell == TCSH) {
switch (*argptr) {
case '\\':
/* Backslash: replace it with: '\\' */
*bufptr++ = '\\';
*bufptr++ = '\\';
continue;
case '!':
/* Exclamation mark: replace it with: \! */
*bufptr++ = '\'';
*bufptr++ = '\\';
*bufptr++ = '!';
*bufptr++ = '\'';
continue;
case '\n':
/* Newline: replace it with: \n */
*bufptr++ = '\\';
*bufptr++ = 'n';
continue;
}
if (isspace(*argptr)) {
/* Non-newline whitespace: replace it with \<ws> */
*bufptr++ = '\'';
*bufptr++ = '\\';
*bufptr++ = *argptr;
*bufptr++ = '\'';
continue;
}
}
if (*argptr == '\'') {
/* Quote: replace it with: '\'' */
*bufptr++ = '\'';
*bufptr++ = '\\';
*bufptr++ = '\'';
*bufptr++ = '\'';
} else if (ctl->shell == TCSH && *argptr == '\\') {
/* Backslash: replace it with: '\\' */
*bufptr++ = '\\';
*bufptr++ = '\\';
} else if (ctl->shell == TCSH && *argptr == '!') {
/* Exclamation mark: replace it with: \! */
*bufptr++ = '\'';
*bufptr++ = '\\';
*bufptr++ = '!';
*bufptr++ = '\'';
} else if (ctl->shell == TCSH && *argptr == '\n') {
/* Newline: replace it with: \n */
*bufptr++ = '\\';
*bufptr++ = 'n';
} else if (ctl->shell == TCSH && isspace(*argptr)) {
/* Non-newline whitespace: replace it with \<ws> */
*bufptr++ = '\'';
*bufptr++ = '\\';
*bufptr++ = *argptr;
*bufptr++ = '\'';
} else
/* Just copy */
*bufptr++ = *argptr;
argptr++;
}
*bufptr++ = '\'';
*bufptr++ = '\0';
printf(" %s", buf);
@ -190,13 +197,16 @@ static int generate_output(const struct getopt_control *ctl, char *argv[], int a
if (opt == '?' || opt == ':')
exit_code = GETOPT_EXIT_CODE;
else if (!ctl->quiet_output) {
if (opt == LONG_OPT) {
switch (opt) {
case LONG_OPT:
printf(" --%s", ctl->long_options[longindex].name);
if (ctl->long_options[longindex].has_arg)
normalize(ctl, optarg ? optarg : "");
} else if (opt == NON_OPT)
break;
case NON_OPT:
normalize(ctl, optarg ? optarg : "");
else {
break;
default:
printf(" -%c", opt);
charptr = strchr(ctl->optstr, opt);
if (charptr != NULL && *++charptr == ':')