Improve error handling when parsing year directives
A literal Y directive or ‘year’ directive with an empty or invalid argument, e.g. ‘2o14’ (that is a small letter ‘oh’ instead of a zero) would fail with the following rather unhelpful error message: Error: bad lexical cast: source type value could not be interpreted as target
This commit is contained in:
parent
e716980c7d
commit
0462c887ae
1 changed files with 14 additions and 9 deletions
|
|
@ -419,7 +419,9 @@ void instance_t::read_next_directive(bool& error_flag)
|
||||||
price_xact_directive(line);
|
price_xact_directive(line);
|
||||||
break;
|
break;
|
||||||
case 'Y': // set the current year
|
case 'Y': // set the current year
|
||||||
apply_year_directive(line + 1);
|
if (std::strlen(line+1) == 0)
|
||||||
|
throw_(parse_error, _f("Directive '%1%' requires an argument") % line[0]);
|
||||||
|
apply_year_directive(line+1);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -863,14 +865,17 @@ void instance_t::apply_rate_directive(char * line)
|
||||||
|
|
||||||
void instance_t::apply_year_directive(char * line)
|
void instance_t::apply_year_directive(char * line)
|
||||||
{
|
{
|
||||||
apply_stack.push_front(application_t("year", epoch));
|
try {
|
||||||
|
unsigned short year(lexical_cast<unsigned short>(skip_ws(line)));
|
||||||
// This must be set to the last day of the year, otherwise partial
|
apply_stack.push_front(application_t("year", epoch));
|
||||||
// dates like "11/01" will refer to last year's november, not the
|
DEBUG("times.epoch", "Setting current year to " << year);
|
||||||
// current year.
|
// This must be set to the last day of the year, otherwise partial
|
||||||
unsigned short year(lexical_cast<unsigned short>(skip_ws(line)));
|
// dates like "11/01" will refer to last year's november, not the
|
||||||
DEBUG("times.epoch", "Setting current year to " << year);
|
// current year.
|
||||||
epoch = datetime_t(date_t(year, 12, 31));
|
epoch = datetime_t(date_t(year, 12, 31));
|
||||||
|
} catch(bad_lexical_cast &) {
|
||||||
|
throw_(parse_error, _f("Argument '%1%' not a valid year") % skip_ws(line));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void instance_t::end_apply_directive(char * kind)
|
void instance_t::end_apply_directive(char * kind)
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue