diff options
author | Sami Kerola | 2014-12-07 01:16:56 +0100 |
---|---|---|
committer | Sami Kerola | 2014-12-08 21:07:01 +0100 |
commit | bb742d73524107ef66cf9c86c6b6e524739d17eb (patch) | |
tree | 27d80fe781ede156cb28e05337c9c925e079dd7a /misc-utils/getopt.c | |
parent | getopt: remove unnecessary code (diff) | |
download | kernel-qcow2-util-linux-bb742d73524107ef66cf9c86c6b6e524739d17eb.tar.gz kernel-qcow2-util-linux-bb742d73524107ef66cf9c86c6b6e524739d17eb.tar.xz kernel-qcow2-util-linux-bb742d73524107ef66cf9c86c6b6e524739d17eb.zip |
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>
Diffstat (limited to 'misc-utils/getopt.c')
-rw-r--r-- | misc-utils/getopt.c | 64 |
1 files changed, 37 insertions, 27 deletions
diff --git a/misc-utils/getopt.c b/misc-utils/getopt.c index 67603b52e..8134558d1 100644 --- a/misc-utils/getopt.c +++ b/misc-utils/getopt.c @@ -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 == ':') |