summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/interactive.cc36
-rw-r--r--src/value.h20
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();
}