libbb: make index_in_substrings return -1 on ambiguous matches
No binary (build failed)
—
(log yok)
| @@ -53,19 +53,24 @@ int FAST_FUNC index_in_substr_array(const char *const string_array[], const char | |
| int FAST_FUNC index_in_substrings(const char *strings, const char *key) | |
| { | |
| - | int len = strlen(key); |
| + | int matched_idx = -1; |
| + | const int len = strlen(key); |
| if (len) { | |
| int idx = 0; | |
| while (*strings) { | |
| if (strncmp(strings, key, len) == 0) { | |
| - | return idx; |
| + | if (strings[len] == '\0') |
| + | return idx; /* exact match */ |
| + | if (matched_idx >= 0) |
| + | return -1; /* ambiguous match */ |
| + | matched_idx = idx; |
| } | |
| strings += strlen(strings) + 1; /* skip NUL */ | |
| idx++; | |
| } | |
| } | |
| - | return -1; |
| + | return matched_idx; |
| } | |
| const char* FAST_FUNC nth_string(const char *strings, int n) | |
| @@ -76,3 +81,15 @@ const char* FAST_FUNC nth_string(const char *strings, int n) | |
| } | |
| return strings; | |
| } | |
| + | |
| + | #ifdef UNUSED_SO_FAR /* only brctl.c needs it yet */ |
| + | /* Returns 0 for no, 1 for yes or a negative value on error. */ |
| + | smallint FAST_FUNC yesno(const char *str) |
| + | { |
| + | static const char no_yes[] ALIGN1 = |
| + | "0\0" "off\0" "no\0" |
| + | "1\0" "on\0" "yes\0"; |
| + | int ret = index_in_substrings(no_yes, str); |
| + | return ret / 3; |
| + | } |
| + | #endif |
| @@ -220,10 +220,10 @@ int brctl_main(int argc UNUSED_PARAM, char **argv) | |
| } | |
| #if ENABLE_FEATURE_BRCTL_FANCY | |
| if (key == ARG_stp) { /* stp */ | |
| - | static const char stp_opts[] ALIGN1 = |
| + | static const char no_yes[] ALIGN1 = |
| "0\0" "off\0" "n\0" "no\0" /* 0 .. 3 */ | |
| "1\0" "on\0" "y\0" "yes\0"; /* 4 .. 7 */ | |
| - | int onoff = index_in_strings(stp_opts, *argv); |
| + | int onoff = index_in_strings(no_yes, *argv); |
| if (onoff < 0) | |
| bb_error_msg_and_die(bb_msg_invalid_arg, *argv, applet_name); | |
| onoff = (unsigned)onoff / 4; | |
| @@ -435,8 +435,8 @@ int FAST_FUNC udhcp_str2optset(const char *const_str, void *arg) | |
| } | |
| break; | |
| // case OPTION_BOOLEAN: { | |
| - | // static const char noyes[] ALIGN1 = "no\0yes\0"; |
| - | // buffer[0] = retval = index_in_strings(noyes, val); |
| + | // static const char no_yes[] ALIGN1 = "no\0yes\0"; |
| + | // buffer[0] = retval = index_in_strings(no_yes, val); |
| // retval++; /* 0 - bad; 1: "no" 2: "yes" */ | |
| // break; | |
| // } | |