[PATCH] libbb: code shrink fgets_str

Ron Yorston rmy at pobox.com
Sat Jan 23 13:22:33 UTC 2021


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



More information about the busybox mailing list