[prev in list] [next in list] [prev in thread] [next in thread]
List: busybox
Subject: Re: [PATCH] getopt: code shrink
From: Denys Vlasenko <vda.linux () googlemail ! com>
Date: 2021-09-15 23:26:10
Message-ID: CAK1hOcO7nzfqVH_1vbs4VmAEUWGOQmZZtN2nJ=UPAehJQqTnGA () mail ! gmail ! com
[Download RAW message or body]
Applied, thanks
On Sun, Sep 12, 2021 at 1:26 PM Ron Yorston <rmy@pobox.com> wrote:
>
> function old new delta
> .rodata 99277 99290 +13
> normalize 177 142 -35
> getopt_main 675 622 -53
> ------------------------------------------------------------------------------
> (add/remove: 0/0 grow/shrink: 1/2 up/down: 13/-88) Total: -75 bytes
>
> Signed-off-by: Ron Yorston <rmy@pobox.com>
> ---
> util-linux/getopt.c | 45 +++++++++++++++++----------------------------
> 1 file changed, 17 insertions(+), 28 deletions(-)
>
> diff --git a/util-linux/getopt.c b/util-linux/getopt.c
> index 1fa402429..c6d5dfc76 100644
> --- a/util-linux/getopt.c
> +++ b/util-linux/getopt.c
> @@ -156,46 +156,29 @@ 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> */
> + } else if ((shell_TCSH && (*arg == '!' || isspace(*arg))) ||
> + *arg == '\'') {
> + /* Quote exclamation marks, non-NL whitespace and quotes */
> *bufptr ++= '\'';
> *bufptr ++= '\\';
> *bufptr ++= *arg;
> @@ -327,12 +310,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;
> + }
> }
>
>
> --
> 2.31.1
>
> _______________________________________________
> busybox mailing list
> busybox@busybox.net
> http://lists.busybox.net/mailman/listinfo/busybox
_______________________________________________
busybox mailing list
busybox@busybox.net
http://lists.busybox.net/mailman/listinfo/busybox
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic