diff options
author | Denys Vlasenko <vda.linux@googlemail.com> | 2023-05-28 18:00:51 +0200 |
---|---|---|
committer | Denys Vlasenko <vda.linux@googlemail.com> | 2023-05-28 18:08:06 +0200 |
commit | 4d7339204f9f823f592562d9903db3ae79a6c640 (patch) | |
tree | 73974664b444b1a1a33da186a2ae010b9d264a56 | |
parent | 05e60007d42b8e4005085a22e122ef70bf888fa5 (diff) | |
download | busybox-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.c | 23 |
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 | ||
982 | static 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 */ |
983 | static var *setvar_u(var *v, const char *value) | 988 | static 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: |