aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDenys Vlasenko <vda.linux@googlemail.com>2018-07-17 14:33:19 +0200
committerDenys Vlasenko <vda.linux@googlemail.com>2018-07-17 14:33:19 +0200
commit0d2e0de42bab54c31ba37f1c6fd10dcdc7008ccf (patch)
tree9c84b82f6bb324a685ac8270aa44230121e7c7bb
parentb762c784caa78877a9949224af425e52db237beb (diff)
downloadbusybox-w32-0d2e0de42bab54c31ba37f1c6fd10dcdc7008ccf.tar.gz
busybox-w32-0d2e0de42bab54c31ba37f1c6fd10dcdc7008ccf.tar.bz2
busybox-w32-0d2e0de42bab54c31ba37f1c6fd10dcdc7008ccf.zip
hush: faster/smaller code to check for presense of multiple chars in string
Go over the string only once. function old new delta encode_then_expand_string 126 105 -21 encode_then_expand_vararg 443 399 -44 ------------------------------------------------------------------------------ (add/remove: 0/0 grow/shrink: 0/2 up/down: 0/-65) Total: -65 bytes Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
-rw-r--r--shell/hush.c31
1 files changed, 18 insertions, 13 deletions
diff --git a/shell/hush.c b/shell/hush.c
index 415993e71..238f997da 100644
--- a/shell/hush.c
+++ b/shell/hush.c
@@ -5730,14 +5730,17 @@ static char *encode_then_expand_string(const char *str)
5730 char *exp_str; 5730 char *exp_str;
5731 struct in_str input; 5731 struct in_str input;
5732 o_string dest = NULL_O_STRING; 5732 o_string dest = NULL_O_STRING;
5733 const char *cp;
5733 5734
5734 if (!strchr(str, '$') 5735 cp = str;
5735 && !strchr(str, '\\') 5736 for (;;) {
5737 if (!*cp) return NULL; /* string has no special chars */
5738 if (*cp == '$') break;
5739 if (*cp == '\\') break;
5736#if ENABLE_HUSH_TICK 5740#if ENABLE_HUSH_TICK
5737 && !strchr(str, '`') 5741 if (*cp == '`') break;
5738#endif 5742#endif
5739 ) { 5743 cp++;
5740 return NULL;
5741 } 5744 }
5742 5745
5743 /* We need to expand. Example: 5746 /* We need to expand. Example:
@@ -5768,17 +5771,19 @@ static char *encode_then_expand_vararg(const char *str, int handle_squotes, int
5768 char *exp_str; 5771 char *exp_str;
5769 struct in_str input; 5772 struct in_str input;
5770 o_string dest = NULL_O_STRING; 5773 o_string dest = NULL_O_STRING;
5774 const char *cp;
5771 5775
5772 if (!strchr(str, '$') 5776 cp = str;
5773 && !strchr(str, '\\') 5777 for (;;) {
5774 && !strchr(str, '\'') 5778 if (!*cp) return NULL; /* string has no special chars */
5775//todo:better code 5779 if (*cp == '$') break;
5776 && !strchr(str, '"') 5780 if (*cp == '\\') break;
5781 if (*cp == '\'') break;
5782 if (*cp == '"') break;
5777#if ENABLE_HUSH_TICK 5783#if ENABLE_HUSH_TICK
5778 && !strchr(str, '`') 5784 if (*cp == '`') break;
5779#endif 5785#endif
5780 ) { 5786 cp++;
5781 return NULL;
5782 } 5787 }
5783 5788
5784 /* Expanding ARG in ${var#ARG}, ${var%ARG}, or ${var/ARG/ARG}. 5789 /* Expanding ARG in ${var#ARG}, ${var%ARG}, or ${var/ARG/ARG}.