libbb: code shrink fgets_str

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@pobox.com>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
Ron Yorston 2021-01-23 13:22:33 +00:00 committed by Denys Vlasenko
parent c849e72c0b
commit 6ad38d66d0

View File

@ -17,7 +17,7 @@ static char *xmalloc_fgets_internal(FILE *file, const char *terminating_string,
int linebufsz = 0; int linebufsz = 0;
int idx = 0; int idx = 0;
int ch; int ch;
size_t maxsz = *maxsz_p; size_t maxsz = maxsz_p ? *maxsz_p : INT_MAX - 4095;
while (1) { while (1) {
ch = fgetc(file); ch = fgetc(file);
@ -53,6 +53,7 @@ static char *xmalloc_fgets_internal(FILE *file, const char *terminating_string,
/* Grow/shrink *first*, then store NUL */ /* Grow/shrink *first*, then store NUL */
linebuf = xrealloc(linebuf, idx + 1); linebuf = xrealloc(linebuf, idx + 1);
linebuf[idx] = '\0'; linebuf[idx] = '\0';
if (maxsz_p)
*maxsz_p = idx; *maxsz_p = idx;
return linebuf; return linebuf;
} }
@ -63,23 +64,15 @@ static char *xmalloc_fgets_internal(FILE *file, const char *terminating_string,
* Return NULL if EOF is reached immediately. */ * Return NULL if EOF is reached immediately. */
char* FAST_FUNC xmalloc_fgets_str(FILE *file, const char *terminating_string) 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, NULL);
return xmalloc_fgets_internal(file, terminating_string, 0, &maxsz);
} }
char* FAST_FUNC xmalloc_fgets_str_len(FILE *file, const char *terminating_string, size_t *maxsz_p) 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); return xmalloc_fgets_internal(file, terminating_string, 0, maxsz_p);
} }
char* FAST_FUNC xmalloc_fgetline_str(FILE *file, const char *terminating_string) 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, NULL);
return xmalloc_fgets_internal(file, terminating_string, 1, &maxsz);
} }