[PATCH] libbb: code shrink fgets_str

Denys Vlasenko vda.linux at googlemail.com
Wed Feb 3 19:44:00 UTC 2021


Applied, thanks!

On Sat, Jan 23, 2021 at 2:22 PM Ron Yorston <rmy at pobox.com> wrote:
>
> Use a NULL value of maxsz_p to indicate to xmalloc_fgets_internal()
> that the caller doesn't care about the maximum size of the buffer.
> This allows the default maximum size to be set once in
> xmalloc_fgets_internal() instead of separately in each caller.
>
> function                                             old     new   delta
> xmalloc_fgets_internal                               273     287     +14
> xmalloc_fgets_str                                     30       9     -21
> xmalloc_fgetline_str                                  33      12     -21
> xmalloc_fgets_str_len                                 38      10     -28
> ------------------------------------------------------------------------------
> (add/remove: 0/0 grow/shrink: 1/3 up/down: 14/-70)            Total: -56 bytes
>
> Signed-off-by: Ron Yorston <rmy at pobox.com>
> ---
>  libbb/fgets_str.c | 17 +++++------------
>  1 file changed, 5 insertions(+), 12 deletions(-)
>
> diff --git a/libbb/fgets_str.c b/libbb/fgets_str.c
> index 1a7f2e9e0..c884ef8af 100644
> --- a/libbb/fgets_str.c
> +++ b/libbb/fgets_str.c
> @@ -17,7 +17,7 @@ static char *xmalloc_fgets_internal(FILE *file, const char *terminating_string,
>         int linebufsz = 0;
>         int idx = 0;
>         int ch;
> -       size_t maxsz = *maxsz_p;
> +       size_t maxsz = maxsz_p ? *maxsz_p : INT_MAX - 4095;
>
>         while (1) {
>                 ch = fgetc(file);
> @@ -53,7 +53,8 @@ static char *xmalloc_fgets_internal(FILE *file, const char *terminating_string,
>         /* Grow/shrink *first*, then store NUL */
>         linebuf = xrealloc(linebuf, idx + 1);
>         linebuf[idx] = '\0';
> -       *maxsz_p = idx;
> +       if (maxsz_p)
> +               *maxsz_p = idx;
>         return linebuf;
>  }
>
> @@ -63,23 +64,15 @@ static char *xmalloc_fgets_internal(FILE *file, const char *terminating_string,
>   * Return NULL if EOF is reached immediately.  */
>  char* FAST_FUNC xmalloc_fgets_str(FILE *file, const char *terminating_string)
>  {
> -       size_t maxsz = INT_MAX - 4095;
> -       return xmalloc_fgets_internal(file, terminating_string, 0, &maxsz);
> +       return xmalloc_fgets_internal(file, terminating_string, 0, NULL);
>  }
>
>  char* FAST_FUNC xmalloc_fgets_str_len(FILE *file, const char *terminating_string, size_t *maxsz_p)
>  {
> -       size_t maxsz;
> -
> -       if (!maxsz_p) {
> -               maxsz = INT_MAX - 4095;
> -               maxsz_p = &maxsz;
> -       }
>         return xmalloc_fgets_internal(file, terminating_string, 0, maxsz_p);
>  }
>
>  char* FAST_FUNC xmalloc_fgetline_str(FILE *file, const char *terminating_string)
>  {
> -       size_t maxsz = INT_MAX - 4095;
> -       return xmalloc_fgets_internal(file, terminating_string, 1, &maxsz);
> +       return xmalloc_fgets_internal(file, terminating_string, 1, NULL);
>  }
> --
> 2.29.2
>
> _______________________________________________
> busybox mailing list
> busybox at busybox.net
> http://lists.busybox.net/mailman/listinfo/busybox


More information about the busybox mailing list