Improve error reporting in parse_arg_index.

This commit is contained in:
Victor Zverovich
2014-08-27 09:04:51 -07:00
parent 42de4f1f7d
commit da0f7c0a51
2 changed files with 23 additions and 28 deletions

View File

@@ -753,27 +753,24 @@ void fmt::BasicWriter<Char>::write_str(
template <typename Char>
inline const Arg
&fmt::BasicFormatter<Char>::parse_arg_index(const Char *&s) {
unsigned arg_index = 0;
const Arg *arg = 0;
if (*s < '0' || *s > '9') {
if (*s != '}' && *s != ':')
throw FormatError("invalid format string");
const Arg &arg = next_arg();
if (error_)
throw FormatError(error_);
return arg;
arg = &next_arg();
} else {
if (next_arg_index_ > 0)
error_ = "cannot switch from automatic to manual argument indexing";
next_arg_index_ = -1;
unsigned arg_index = parse_nonnegative_int(s, error_);
if (arg_index < args_.size())
arg = &args_[arg_index];
else if (!error_)
error_ = "argument index is out of range in format";
}
if (next_arg_index_ > 0) {
if (error_) {
throw FormatError(
"cannot switch from automatic to manual argument indexing");
*s != '}' && *s != ':' ? "invalid format string" : error_);
}
next_arg_index_ = -1;
arg_index = parse_nonnegative_int(s, error_);
if (arg_index >= args_.size()) {
if (!error_)
error_ = "argument index is out of range in format";
return DUMMY_ARG;
}
return args_[arg_index];
return *arg;
}
template <typename Char>
@@ -1198,8 +1195,6 @@ const Char *fmt::BasicFormatter<Char>::format(
if (*s++ != '}')
throw FormatError("unmatched '{' in format");
if (error_)
throw FormatError(error_);
start_ = s;
// Format argument.