aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDenys Vlasenko <vda.linux@googlemail.com>2023-05-28 18:00:51 +0200
committerDenys Vlasenko <vda.linux@googlemail.com>2023-05-28 18:08:06 +0200
commit4d7339204f9f823f592562d9903db3ae79a6c640 (patch)
tree73974664b444b1a1a33da186a2ae010b9d264a56
parent05e60007d42b8e4005085a22e122ef70bf888fa5 (diff)
downloadbusybox-w32-4d7339204f9f823f592562d9903db3ae79a6c640.tar.gz
busybox-w32-4d7339204f9f823f592562d9903db3ae79a6c640.tar.bz2
busybox-w32-4d7339204f9f823f592562d9903db3ae79a6c640.zip
awk: shrink - use setvar_sn() to set variables from non-NUL terminated strings
function old new delta setvar_sn - 39 +39 exec_builtin 1145 1136 -9 awk_getline 591 559 -32 ------------------------------------------------------------------------------ (add/remove: 1/0 grow/shrink: 0/2 up/down: 39/-41) Total: -2 bytes Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
-rw-r--r--editors/awk.c23
1 files changed, 9 insertions, 14 deletions
diff --git a/editors/awk.c b/editors/awk.c
index eb419e063..b5774a339 100644
--- a/editors/awk.c
+++ b/editors/awk.c
@@ -979,6 +979,11 @@ static var *setvar_s(var *v, const char *value)
979 return setvar_p(v, (value && *value) ? xstrdup(value) : NULL); 979 return setvar_p(v, (value && *value) ? xstrdup(value) : NULL);
980} 980}
981 981
982static var *setvar_sn(var *v, const char *value, int len)
983{
984 return setvar_p(v, (value && *value && len > 0) ? xstrndup(value, len) : NULL);
985}
986
982/* same as setvar_s but sets USER flag */ 987/* same as setvar_s but sets USER flag */
983static var *setvar_u(var *v, const char *value) 988static var *setvar_u(var *v, const char *value)
984{ 989{
@@ -2317,15 +2322,9 @@ static int awk_getline(rstream *rsm, var *v)
2317 if (p == 0) { 2322 if (p == 0) {
2318 retval--; 2323 retval--;
2319 } else { 2324 } else {
2320 char c = b[so]; 2325 setvar_sn(v, b+rp, so-rp);
2321 b[so] = '\0';
2322 setvar_s(v, b+rp);
2323 v->type |= VF_USER; 2326 v->type |= VF_USER;
2324 b[so] = c; 2327 setvar_sn(intvar[RT], b+so, eo-so);
2325 c = b[eo];
2326 b[eo] = '\0';
2327 setvar_s(intvar[RT], b+so);
2328 b[eo] = c;
2329 } 2328 }
2330 2329
2331 rsm->buffer = m; 2330 rsm->buffer = m;
@@ -2677,8 +2676,6 @@ static NOINLINE var *exec_builtin(node *op, var *res)
2677 } 2676 }
2678 2677
2679 case B_ss: { 2678 case B_ss: {
2680 char *s;
2681
2682 l = strlen(as[0]); 2679 l = strlen(as[0]);
2683 i = getvar_i(av[1]) - 1; 2680 i = getvar_i(av[1]) - 1;
2684 if (i > l) 2681 if (i > l)
@@ -2688,8 +2685,7 @@ static NOINLINE var *exec_builtin(node *op, var *res)
2688 n = (nargs > 2) ? getvar_i(av[2]) : l-i; 2685 n = (nargs > 2) ? getvar_i(av[2]) : l-i;
2689 if (n < 0) 2686 if (n < 0)
2690 n = 0; 2687 n = 0;
2691 s = xstrndup(as[0]+i, n); 2688 setvar_sn(res, as[0]+i, n);
2692 setvar_p(res, s);
2693 break; 2689 break;
2694 } 2690 }
2695 2691
@@ -2766,8 +2762,7 @@ static NOINLINE var *exec_builtin(node *op, var *res)
2766 i = strftime(g_buf, MAXVARFMT, 2762 i = strftime(g_buf, MAXVARFMT,
2767 ((nargs > 0) ? as[0] : "%a %b %d %H:%M:%S %Z %Y"), 2763 ((nargs > 0) ? as[0] : "%a %b %d %H:%M:%S %Z %Y"),
2768 localtime(&tt)); 2764 localtime(&tt));
2769 g_buf[i] = '\0'; 2765 setvar_sn(res, g_buf, i);
2770 setvar_s(res, g_buf);
2771 break; 2766 break;
2772 2767
2773 case B_mt: 2768 case B_mt: