From 0d2e0de42bab54c31ba37f1c6fd10dcdc7008ccf Mon Sep 17 00:00:00 2001 From: Denys Vlasenko Date: Tue, 17 Jul 2018 14:33:19 +0200 Subject: 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 --- shell/hush.c | 31 ++++++++++++++++++------------- 1 file 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) char *exp_str; struct in_str input; o_string dest = NULL_O_STRING; + const char *cp; - if (!strchr(str, '$') - && !strchr(str, '\\') + cp = str; + for (;;) { + if (!*cp) return NULL; /* string has no special chars */ + if (*cp == '$') break; + if (*cp == '\\') break; #if ENABLE_HUSH_TICK - && !strchr(str, '`') + if (*cp == '`') break; #endif - ) { - return NULL; + cp++; } /* We need to expand. Example: @@ -5768,17 +5771,19 @@ static char *encode_then_expand_vararg(const char *str, int handle_squotes, int char *exp_str; struct in_str input; o_string dest = NULL_O_STRING; + const char *cp; - if (!strchr(str, '$') - && !strchr(str, '\\') - && !strchr(str, '\'') -//todo:better code - && !strchr(str, '"') + cp = str; + for (;;) { + if (!*cp) return NULL; /* string has no special chars */ + if (*cp == '$') break; + if (*cp == '\\') break; + if (*cp == '\'') break; + if (*cp == '"') break; #if ENABLE_HUSH_TICK - && !strchr(str, '`') + if (*cp == '`') break; #endif - ) { - return NULL; + cp++; } /* Expanding ARG in ${var#ARG}, ${var%ARG}, or ${var/ARG/ARG}. -- cgit v1.2.3