From df0bbe0b0eac1b7c1f6fcd3c7b26d44ae9b4176d Mon Sep 17 00:00:00 2001 From: Emery Hemingway Date: Fri, 28 Aug 2015 14:42:22 +0200 Subject: [PATCH] ascii_to() utility for boolean values Also, Genode::Arg was adapted to use the new utility for boolean tokens and strings. Issue #1648 --- repos/base/include/util/arg_string.h | 36 ++++++++++++---------------- repos/base/include/util/string.h | 18 ++++++++++++++ 2 files changed, 33 insertions(+), 21 deletions(-) diff --git a/repos/base/include/util/arg_string.h b/repos/base/include/util/arg_string.h index 7def211d1..d9ae850c0 100644 --- a/repos/base/include/util/arg_string.h +++ b/repos/base/include/util/arg_string.h @@ -139,32 +139,26 @@ class Genode::Arg bool bool_value(bool default_value) const { - /* check for known idents */ - if (_value.type() == Token::IDENT) { - char *p = _value.start(); - size_t l = _value.len(); + bool result = default_value; + switch(_value.type()) { - if (!strcmp(p, "yes", l)) return true; - if (!strcmp(p, "true", l)) return true; - if (!strcmp(p, "on", l)) return true; + /* result is passed to 'ascii_to' by reference */ + case Token::IDENT:; + if (ascii_to(_value.start(), result) == _value.len()) + return result; - if (!strcmp(p, "no", l)) return false; - if (!strcmp(p, "false", l)) return false; - if (!strcmp(p, "off", l)) return false; + case Token::STRING: + if (ascii_to(_value.start()+1, result) == _value.len()-2) + return result; - /* saxony mode ;) */ - if (!strcmp(p, "nu", l)) return true; - if (!strcmp(p, "nee", l)) return false; + default: + /* read values 0 (false) / !0 (true) */ + unsigned long value; + int sign; + bool valid = read_ulong(&value, &sign); - return default_value; + return valid ? value : default_value; } - - /* read values 0 (false) / !0 (true) */ - unsigned long value; - int sign; - bool valid = read_ulong(&value, &sign); - - return valid ? value : default_value; } void key(char *dst, size_t dst_len) const diff --git a/repos/base/include/util/string.h b/repos/base/include/util/string.h index 472c4aac3..ac975bac6 100644 --- a/repos/base/include/util/string.h +++ b/repos/base/include/util/string.h @@ -309,6 +309,24 @@ namespace Genode { } + /** + * Read boolean value from string + * + * \return number of consumed characters + */ + inline size_t ascii_to(char const *s, bool &result) + { + if (!strcmp(s, "yes", 3)) { result = true; return 3; } + if (!strcmp(s, "true", 4)) { result = true; return 4; } + if (!strcmp(s, "on", 2)) { result = true; return 2; } + if (!strcmp(s, "no", 2)) { result = false; return 2; } + if (!strcmp(s, "false", 5)) { result = false; return 5; } + if (!strcmp(s, "off", 3)) { result = false; return 3; } + + return 0; + } + + /** * Read unsigned long value from string *