|
|
|
@ -333,12 +333,12 @@ template <typename OutputIt, typename Char> class basic_printf_context {
|
|
|
|
|
static void parse_flags(format_specs& specs, const Char*& it,
|
|
|
|
|
const Char* end);
|
|
|
|
|
|
|
|
|
|
// Returns the argument with specified index or, if arg_index is equal
|
|
|
|
|
// to the maximum unsigned value, the next argument.
|
|
|
|
|
format_arg get_arg(unsigned arg_index = internal::max_value<unsigned>());
|
|
|
|
|
// Returns the argument with specified index or, if arg_index is -1, the next
|
|
|
|
|
// argument.
|
|
|
|
|
format_arg get_arg(int arg_index = -1);
|
|
|
|
|
|
|
|
|
|
// Parses argument index, flags and width and returns the argument index.
|
|
|
|
|
unsigned parse_header(const Char*& it, const Char* end, format_specs& specs);
|
|
|
|
|
int parse_header(const Char*& it, const Char* end, format_specs& specs);
|
|
|
|
|
|
|
|
|
|
public:
|
|
|
|
|
/**
|
|
|
|
@ -355,7 +355,7 @@ template <typename OutputIt, typename Char> class basic_printf_context {
|
|
|
|
|
OutputIt out() { return out_; }
|
|
|
|
|
void advance_to(OutputIt it) { out_ = it; }
|
|
|
|
|
|
|
|
|
|
format_arg arg(unsigned id) const { return args_.get(id); }
|
|
|
|
|
format_arg arg(int id) const { return args_.get(id); }
|
|
|
|
|
|
|
|
|
|
basic_format_parse_context<Char>& parse_context() { return parse_ctx_; }
|
|
|
|
|
|
|
|
|
@ -397,8 +397,8 @@ void basic_printf_context<OutputIt, Char>::parse_flags(format_specs& specs,
|
|
|
|
|
|
|
|
|
|
template <typename OutputIt, typename Char>
|
|
|
|
|
typename basic_printf_context<OutputIt, Char>::format_arg
|
|
|
|
|
basic_printf_context<OutputIt, Char>::get_arg(unsigned arg_index) {
|
|
|
|
|
if (arg_index == internal::max_value<unsigned>())
|
|
|
|
|
basic_printf_context<OutputIt, Char>::get_arg(int arg_index) {
|
|
|
|
|
if (arg_index < 0)
|
|
|
|
|
arg_index = parse_ctx_.next_arg_id();
|
|
|
|
|
else
|
|
|
|
|
parse_ctx_.check_arg_id(--arg_index);
|
|
|
|
@ -406,15 +406,15 @@ basic_printf_context<OutputIt, Char>::get_arg(unsigned arg_index) {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
template <typename OutputIt, typename Char>
|
|
|
|
|
unsigned basic_printf_context<OutputIt, Char>::parse_header(
|
|
|
|
|
int basic_printf_context<OutputIt, Char>::parse_header(
|
|
|
|
|
const Char*& it, const Char* end, format_specs& specs) {
|
|
|
|
|
unsigned arg_index = internal::max_value<unsigned>();
|
|
|
|
|
int arg_index = -1;
|
|
|
|
|
char_type c = *it;
|
|
|
|
|
if (c >= '0' && c <= '9') {
|
|
|
|
|
// Parse an argument index (if followed by '$') or a width possibly
|
|
|
|
|
// preceded with '0' flag(s).
|
|
|
|
|
internal::error_handler eh;
|
|
|
|
|
unsigned value = parse_nonnegative_int(it, end, eh);
|
|
|
|
|
int value = parse_nonnegative_int(it, end, eh);
|
|
|
|
|
if (it != end && *it == '$') { // value is an argument index
|
|
|
|
|
++it;
|
|
|
|
|
arg_index = value;
|
|
|
|
@ -436,8 +436,8 @@ unsigned basic_printf_context<OutputIt, Char>::parse_header(
|
|
|
|
|
specs.width = parse_nonnegative_int(it, end, eh);
|
|
|
|
|
} else if (*it == '*') {
|
|
|
|
|
++it;
|
|
|
|
|
specs.width = visit_format_arg(
|
|
|
|
|
internal::printf_width_handler<char_type>(specs), get_arg());
|
|
|
|
|
specs.width = static_cast<int>(visit_format_arg(
|
|
|
|
|
internal::printf_width_handler<char_type>(specs), get_arg()));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return arg_index;
|
|
|
|
@ -464,7 +464,7 @@ OutputIt basic_printf_context<OutputIt, Char>::format() {
|
|
|
|
|
specs.align = align::right;
|
|
|
|
|
|
|
|
|
|
// Parse argument index, flags and width.
|
|
|
|
|
unsigned arg_index = parse_header(it, end, specs);
|
|
|
|
|
int arg_index = parse_header(it, end, specs);
|
|
|
|
|
if (arg_index == 0) on_error("argument index out of range");
|
|
|
|
|
|
|
|
|
|
// Parse precision.
|
|
|
|
@ -473,11 +473,11 @@ OutputIt basic_printf_context<OutputIt, Char>::format() {
|
|
|
|
|
c = it != end ? *it : 0;
|
|
|
|
|
if ('0' <= c && c <= '9') {
|
|
|
|
|
internal::error_handler eh;
|
|
|
|
|
specs.precision = static_cast<int>(parse_nonnegative_int(it, end, eh));
|
|
|
|
|
specs.precision = parse_nonnegative_int(it, end, eh);
|
|
|
|
|
} else if (c == '*') {
|
|
|
|
|
++it;
|
|
|
|
|
specs.precision =
|
|
|
|
|
visit_format_arg(internal::printf_precision_handler(), get_arg());
|
|
|
|
|
static_cast<int>(visit_format_arg(internal::printf_precision_handler(), get_arg()));
|
|
|
|
|
} else {
|
|
|
|
|
specs.precision = 0;
|
|
|
|
|
}
|
|
|
|
|