And avoid testing same thing time after time. CC: Frodo Looijaard <frodo@xxxxxxxxxxxxxxxxxxxx> Signed-off-by: Sami Kerola <kerolasa@xxxxxx> --- 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 67603b5..8134558 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 == ':') -- 2.1.3 -- To unsubscribe from this list: send the line "unsubscribe util-linux" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html