diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/interactive.cc | 36 | ||||
-rw-r--r-- | src/value.h | 20 |
2 files changed, 26 insertions, 30 deletions
diff --git a/src/interactive.cc b/src/interactive.cc index 1ae976e7..d2d6256b 100644 --- a/src/interactive.cc +++ b/src/interactive.cc @@ -62,6 +62,8 @@ void interactive_t::verify_arguments() const for (; ! wrong_arg && ! exit_loop && *p && next_arg; p++) { DEBUG("interactive.verify", "Want " << *p << " got: " << next_arg->label()); + + wrong_arg = false; switch (*p) { case 'a': label = _("an amount"); @@ -86,24 +88,24 @@ void interactive_t::verify_arguments() const case 'i': case 'l': label = _("an integer"); - if (next_arg->is_long() || - (next_arg->is_amount() && - ! next_arg->as_amount().has_commodity())) { - wrong_arg = false; - } - else if (next_arg->is_string()) { - wrong_arg = false; - for (const char * q = next_arg->as_string().c_str(); *q; q++) { - if (! std::isdigit(*q) && *q != '-') { - wrong_arg = true; - break; - } + if (next_arg->is_long() || + (next_arg->is_amount() && + ! next_arg->as_amount().has_commodity())) { + wrong_arg = false; + } + else if (next_arg->is_string()) { + wrong_arg = false; + for (const char * q = next_arg->as_string().c_str(); *q; q++) { + if (! std::isdigit(*q) && *q != '-') { + wrong_arg = true; + break; } } - else { - wrong_arg = true; - } - break; + } + else { + wrong_arg = true; + } + break; case 'm': label = _("a regex"); wrong_arg = ! next_arg->is_mask(); @@ -134,6 +136,8 @@ void interactive_t::verify_arguments() const dont_skip = true; break; } + if (wrong_arg && optional && next_arg->is_null()) + wrong_arg = false; if (wrong_arg) vlabel = next_arg->label(); diff --git a/src/value.h b/src/value.h index 9aa3cb04..31850894 100644 --- a/src/value.h +++ b/src/value.h @@ -818,13 +818,11 @@ public: } void push_back(const value_t& val) { - if (! val.is_null()) { - if (is_null()) - *this = sequence_t(); - if (! is_sequence()) - in_place_cast(SEQUENCE); - as_sequence_lval().push_back(val); - } + if (is_null()) + *this = sequence_t(); + if (! is_sequence()) + in_place_cast(SEQUENCE); + as_sequence_lval().push_back(val); } void pop_back() { @@ -855,24 +853,18 @@ public: } sequence_t::iterator begin() { - VERIFY(is_sequence()); return as_sequence_lval().begin(); } sequence_t::iterator end() { - VERIFY(is_sequence()); - // This special hack is because we never used end() in a context which - // needs us to call _dup(). - return boost::get<sequence_t *>(storage->data)->end(); + return as_sequence_lval().end(); } sequence_t::const_iterator begin() const { - VERIFY(is_sequence()); return as_sequence().begin(); } sequence_t::const_iterator end() const { - VERIFY(is_sequence()); return as_sequence().end(); } |