aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--editors/awk.c35
1 files changed, 27 insertions, 8 deletions
diff --git a/editors/awk.c b/editors/awk.c
index 509f4ddd8..57d354858 100644
--- a/editors/awk.c
+++ b/editors/awk.c
@@ -30,6 +30,14 @@
30//config: * simultaneous use of -f and -e on the command line. 30//config: * simultaneous use of -f and -e on the command line.
31//config: This enables the use of awk library files. 31//config: This enables the use of awk library files.
32//config: Example: awk -f mylib.awk -e '{print myfunction($1);}' ... 32//config: Example: awk -f mylib.awk -e '{print myfunction($1);}' ...
33//config:config FEATURE_AWK_FASTER
34//config: bool "Enable some speed enhancements"
35//config: default n
36//config: depends on AWK
37//config: help
38//config: Enable enhancements that speed up string concatenation and
39//config: assignment of temporary strings to a variable. Increases
40//config: size of binary by 144 bytes.
33 41
34//applet:IF_AWK(APPLET_NOEXEC(awk, awk, BB_DIR_USR_BIN, BB_SUID_DROP, awk)) 42//applet:IF_AWK(APPLET_NOEXEC(awk, awk, BB_DIR_USR_BIN, BB_SUID_DROP, awk))
35 43
@@ -2766,15 +2774,14 @@ static var *evaluate(node *op, var *res)
2766 2774
2767 case XC( OC_MOVE ): 2775 case XC( OC_MOVE ):
2768 debug_printf_eval("MOVE\n"); 2776 debug_printf_eval("MOVE\n");
2769 /* if source is a temporary string, jusk relink it to dest */ 2777#if ENABLE_FEATURE_AWK_FASTER
2770//Disabled: if R.v is numeric but happens to have cached R.v->string, 2778 /* if source is a temporary string, just relink it to dest */
2771//then L.v ends up being a string, which is wrong 2779 if (R.v == v1+1 && R.v->string && !(R.v->type & VF_NUMBER)) {
2772// if (R.v == v1+1 && R.v->string) { 2780 res = setvar_p(L.v, R.v->string);
2773// res = setvar_p(L.v, R.v->string); 2781 R.v->string = NULL;
2774// R.v->string = NULL; 2782 } else
2775// } else { 2783#endif
2776 res = copyvar(L.v, R.v); 2784 res = copyvar(L.v, R.v);
2777// }
2778 break; 2785 break;
2779 2786
2780 case XC( OC_TERNARY ): 2787 case XC( OC_TERNARY ):
@@ -3025,9 +3032,21 @@ static var *evaluate(node *op, var *res)
3025 case XC( OC_CONCAT ): 3032 case XC( OC_CONCAT ):
3026 case XC( OC_COMMA ): { 3033 case XC( OC_COMMA ): {
3027 const char *sep = ""; 3034 const char *sep = "";
3035#if ENABLE_FEATURE_AWK_FASTER
3036 char *buf;
3037#endif
3028 if ((opinfo & OPCLSMASK) == OC_COMMA) 3038 if ((opinfo & OPCLSMASK) == OC_COMMA)
3029 sep = getvar_s(intvar[SUBSEP]); 3039 sep = getvar_s(intvar[SUBSEP]);
3040#if ENABLE_FEATURE_AWK_FASTER
3041 buf = xmalloc(strlen(L.s) + strlen(sep) + strlen(R.s) + 1);
3042 strcpy(buf, L.s);
3043 if (*sep != '\0')
3044 strcat(buf, sep);
3045 strcat(buf, R.s);
3046 setvar_p(res, buf);
3047#else
3030 setvar_p(res, xasprintf("%s%s%s", L.s, sep, R.s)); 3048 setvar_p(res, xasprintf("%s%s%s", L.s, sep, R.s));
3049#endif
3031 break; 3050 break;
3032 } 3051 }
3033 3052