hush: faster/smaller code to check for presense of multiple chars in string
authorDenys Vlasenko <vda.linux@googlemail.com>
Tue, 17 Jul 2018 12:33:19 +0000 (14:33 +0200)
committerDenys Vlasenko <vda.linux@googlemail.com>
Tue, 17 Jul 2018 12:33:19 +0000 (14:33 +0200)
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>
shell/hush.c

index 415993e7184a3a29e1daee452b70cccf1e4fc7c0..238f997da2f992eed35ffb7ab58adb2738d1d786 100644 (file)
@@ -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}.