getopt: code shrink
No binary (build failed)
—
(log yok)
| @@ -156,57 +156,43 @@ enum { | |
| static const char *normalize(const char *arg) | |
| { | |
| char *bufptr; | |
| - | #if ENABLE_FEATURE_CLEAN_UP |
| - | static char *BUFFER = NULL; |
| - | free(BUFFER); |
| - | #else |
| char *BUFFER; | |
| - | #endif |
| - | if (!quote) { /* Just copy arg */ |
| - | BUFFER = xstrdup(arg); |
| - | return BUFFER; |
| + | if (!quote) { /* Just return arg */ |
| + | return arg; |
| } | |
| /* Each character in arg may take up to four characters in the result: | |
| For a quote we need a closing quote, a backslash, a quote and an | |
| opening quote! We need also the global opening and closing quote, | |
| and one extra character for '\0'. */ | |
| - | BUFFER = xmalloc(strlen(arg)*4 + 3); |
| + | BUFFER = auto_string(xmalloc(strlen(arg)*4 + 3)); |
| bufptr = BUFFER; | |
| *bufptr ++= '\''; | |
| while (*arg) { | |
| - | if (*arg == '\'') { |
| - | /* Quote: replace it with: '\'' */ |
| - | *bufptr ++= '\''; |
| - | *bufptr ++= '\\'; |
| - | *bufptr ++= '\''; |
| - | *bufptr ++= '\''; |
| - | } else if (shell_TCSH && *arg == '!') { |
| - | /* Exclamation mark: replace it with: \! */ |
| - | *bufptr ++= '\''; |
| - | *bufptr ++= '\\'; |
| - | *bufptr ++= '!'; |
| - | *bufptr ++= '\''; |
| - | } else if (shell_TCSH && *arg == '\n') { |
| + | if (shell_TCSH && *arg == '\n') { |
| /* Newline: replace it with: \n */ | |
| - | *bufptr ++= '\\'; |
| - | *bufptr ++= 'n'; |
| - | } else if (shell_TCSH && isspace(*arg)) { |
| - | /* Non-newline whitespace: replace it with \<ws> */ |
| - | *bufptr ++= '\''; |
| - | *bufptr ++= '\\'; |
| - | *bufptr ++= *arg; |
| - | *bufptr ++= '\''; |
| + | *bufptr++ = '\\'; |
| + | *bufptr++ = 'n'; |
| } else | |
| + | if ((shell_TCSH && (*arg == '!' || isspace(*arg))) |
| + | || *arg == '\'' |
| + | ) { |
| + | /* Quote exclamation marks, non-NL whitespace and quotes */ |
| + | *bufptr++ = '\''; |
| + | *bufptr++ = '\\'; |
| + | *bufptr++ = *arg; |
| + | *bufptr++ = '\''; |
| + | } else { |
| /* Just copy */ | |
| *bufptr ++= *arg; | |
| + | } |
| arg++; | |
| } | |
| - | *bufptr ++= '\''; |
| - | *bufptr ++= '\0'; |
| + | *bufptr++ = '\''; |
| + | *bufptr++ = '\0'; |
| return BUFFER; | |
| } | |
| @@ -327,12 +313,18 @@ static struct option *add_long_options(struct option *long_options, char *option | |
| static void set_shell(const char *new_shell) | |
| { | |
| - | if (strcmp(new_shell, "bash") == 0 || strcmp(new_shell, "sh") == 0) |
| - | return; |
| - | if (strcmp(new_shell, "tcsh") == 0 || strcmp(new_shell, "csh") == 0) |
| + | switch (index_in_strings("bash\0sh\0tcsh\0csh\0", new_shell)) { |
| + | case 0: |
| + | case 1: |
| + | break; |
| + | case 2: |
| + | case 3: |
| option_mask32 |= SHELL_IS_TCSH; | |
| - | else |
| + | break; |
| + | default: |
| bb_error_msg("unknown shell '%s', assuming bash", new_shell); | |
| + | break; |
| + | } |
| } | |