untested

Signed-off-by: Bernhard Reutner-Fischer <[email protected]>
---
 include/libbb.h              |    1 +
 libbb/compare_string_array.c |   25 +++++++++++++++++++++----
 networking/udhcp/files.c     |   14 +++++---------
 3 files changed, 27 insertions(+), 13 deletions(-)

diff --git a/include/libbb.h b/include/libbb.h
index 9d99b0d..c24c4c1 100644
--- a/include/libbb.h
+++ b/include/libbb.h
@@ -1190,6 +1190,7 @@ int index_in_strings(const char *strings, const char 
*key) FAST_FUNC;
 int index_in_substr_array(const char *const string_array[], const char *key) 
FAST_FUNC;
 int index_in_substrings(const char *strings, const char *key) FAST_FUNC;
 const char *nth_string(const char *strings, int n) FAST_FUNC;
+smallint yesno(const char *str) FAST_FUNC;
 
 extern void print_login_issue(const char *issue_file, const char *tty) 
FAST_FUNC;
 extern void print_login_prompt(void) FAST_FUNC;
diff --git a/libbb/compare_string_array.c b/libbb/compare_string_array.c
index 43c59e8..e382cda 100644
--- a/libbb/compare_string_array.c
+++ b/libbb/compare_string_array.c
@@ -53,19 +53,26 @@ 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);
+       const size_t len = strlen(key) /*key ? strlen(key) : 0*/;
+       int idx, best_len, best_idx = -1;
 
        if (len) {
-               int idx = 0;
+               idx = best_len = 0;
                while (*strings) {
                        if (strncmp(strings, key, len) == 0) {
-                               return idx;
+                               size_t string_len = strlen(strings);
+                               if (string_len > best_len) {
+                                       best_len = string_len;
+                                       best_idx = idx;
+                               } else if (string_len == best_len) {
+                                       return -1; /* Ambiguous match */
+                               }
                        }
                        strings += strlen(strings) + 1; /* skip NUL */
                        idx++;
                }
        }
-       return -1;
+       return best_idx;
 }
 
 const char* FAST_FUNC nth_string(const char *strings, int n)
@@ -76,3 +83,13 @@ const char* FAST_FUNC nth_string(const char *strings, int n)
        }
        return strings;
 }
+
+/* Returns 0 for no, 1 for yes or a negative value on error.  */
+smallint FAST_FUNC yesno(const char *str)
+{
+       static const char yes_no[] ALIGN1 =
+               "0\0" "off\0" "no\0"
+               "1\0" "on\0"  "yes\0";
+       int ret = str ? index_in_substrings(yes_no, str) : -1;
+       return (ret == -1) ? -1 : (ret > 2);
+}
diff --git a/networking/udhcp/files.c b/networking/udhcp/files.c
index 1b2cc96..6697c09 100644
--- a/networking/udhcp/files.c
+++ b/networking/udhcp/files.c
@@ -63,16 +63,12 @@ static int FAST_FUNC read_u32(const char *line, void *arg)
 static int FAST_FUNC read_yn(const char *line, void *arg)
 {
        char *dest = arg;
+       smallint yn = yesno(line);
 
-       if (!strcasecmp("yes", line)) {
-               *dest = 1;
-               return 1;
-       }
-       if (!strcasecmp("no", line)) {
-               *dest = 0;
-               return 1;
-       }
-       return 0;
+       if (yn == -1)
+               return 0;
+       *dest = yn;
+       return 1;
 }
 
 
-- 
1.7.0

_______________________________________________
busybox mailing list
[email protected]
http://lists.busybox.net/mailman/listinfo/busybox

Reply via email to