From bb742d73524107ef66cf9c86c6b6e524739d17eb Mon Sep 17 00:00:00 2001 From: Sami Kerola Date: Sun, 7 Dec 2014 00:16:56 +0000 Subject: [PATCH] getopt: prefer switch-case rather than long if statement And avoid testing same thing time after time. CC: Frodo Looijaard Signed-off-by: Sami Kerola --- misc-utils/getopt.c | 64 ++++++++++++++++++++++++++------------------- 1 file changed, 37 insertions(+), 27 deletions(-) diff --git a/misc-utils/getopt.c b/misc-utils/getopt.c index 67603b52e3..8134558d1a 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 \ */ + *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 \ */ - *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 == ':') -- 2.47.2