aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRon Yorston <rmy@pobox.com>2021-01-29 13:23:27 +0000
committerDenys Vlasenko <vda.linux@googlemail.com>2021-02-02 14:37:37 +0100
commitbcf91d276047910538c5de0a45f3a4645e3ff471 (patch)
tree87feb6eb824d4fc2ee27918a559a03df28e15a99
parent59120c330330467c9e6aaec6d4ca8295baa653af (diff)
downloadbusybox-w32-bcf91d276047910538c5de0a45f3a4645e3ff471.tar.gz
busybox-w32-bcf91d276047910538c5de0a45f3a4645e3ff471.tar.bz2
busybox-w32-bcf91d276047910538c5de0a45f3a4645e3ff471.zip
libbb: code shrink and speed up index_in_strings()
Rewrite index_in_strings() to replace calls to strcmp()/strlen(). With this change searching for valid names in the applet_names array (for example) is 40% faster. The code has to assume the strings aren't sorted, so will always scan the entire array when presented with an invalid name. function old new delta index_in_strings 63 56 -7 ------------------------------------------------------------------------------ (add/remove: 0/0 grow/shrink: 0/1 up/down: 0/-7) Total: -7 bytes Signed-off-by: Ron Yorston <rmy@pobox.com> Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
-rw-r--r--libbb/compare_string_array.c14
1 files changed, 10 insertions, 4 deletions
diff --git a/libbb/compare_string_array.c b/libbb/compare_string_array.c
index a06e57d3d..d8cd033a3 100644
--- a/libbb/compare_string_array.c
+++ b/libbb/compare_string_array.c
@@ -63,13 +63,19 @@ int FAST_FUNC index_in_str_array(const char *const string_array[], const char *k
63 63
64int FAST_FUNC index_in_strings(const char *strings, const char *key) 64int FAST_FUNC index_in_strings(const char *strings, const char *key)
65{ 65{
66 int idx = 0; 66 int j, idx = 0;
67 67
68 while (*strings) { 68 while (*strings) {
69 if (strcmp(strings, key) == 0) { 69 /* Do we see "key\0" at current position in strings? */
70 return idx; 70 for (j = 0; *strings == key[j]; ++j) {
71 if (*strings++ == '\0') {
72 //bb_error_msg("found:'%s' i:%u", key, idx);
73 return idx; /* yes */
74 }
71 } 75 }
72 strings += strlen(strings) + 1; /* skip NUL */ 76 /* No. Move to the start of the next string. */
77 while (*strings++ != '\0')
78 continue;
73 idx++; 79 idx++;
74 } 80 }
75 return -1; 81 return -1;