From 7e07aa9300f75bb4bbdacf97dce45213e7fa69c0 Mon Sep 17 00:00:00 2001 From: Steve Reinhardt Date: Sun, 11 Jan 2004 15:09:27 -0800 Subject: [PATCH] Fix cprintf bug, plus minor cleanup & better error messages. base/cprintf.cc: Fix bug where a call with a format string with no specifiers but one or more arguments would crash. Old code tried to print extra args using last available format, but in this case there was no format, hence the problem. Now we just print "" for each extra arg. Also reorganized code a bit to make scope of fmt variable match the scope in which you can be confident it's meaningful. base/cprintf.hh: Print specific error message instead of calling format_invalid(). base/cprintf_formats.hh: Clear Format object in constructor. Use specific error messages instead of format_invalid() function. --HG-- extra : convert_revision : 87d5e902174e3eb2583131d056742af166540db0 --- base/cprintf.cc | 39 ++++++++++++++++++++------------------- base/cprintf.hh | 2 +- base/cprintf_formats.hh | 19 ++++++------------- 3 files changed, 27 insertions(+), 33 deletions(-) diff --git a/base/cprintf.cc b/base/cprintf.cc index af3b26a57..5796a712b 100644 --- a/base/cprintf.cc +++ b/base/cprintf.cc @@ -45,8 +45,6 @@ ArgList::dump(const string &format) stream->fill(' '); stream->flags((ios::fmtflags)0); - Format fmt; - while (*p) { switch (*p) { case '%': { @@ -56,12 +54,7 @@ ArgList::dump(const string &format) continue; } - if (objects.empty()) - format_invalid(*stream); - - Base *data = objects.front(); - - fmt.clear(); + Format fmt; bool done = false; bool end_number = false; bool have_precision = false; @@ -205,18 +198,26 @@ ArgList::dump(const string &format) } } - ios::fmtflags saved_flags = stream->flags(); - char old_fill = stream->fill(); - int old_precision = stream->precision(); + if (!objects.empty()) + { + Base *data = objects.front(); + objects.pop_front(); + + ios::fmtflags saved_flags = stream->flags(); + char old_fill = stream->fill(); + int old_precision = stream->precision(); - data->process(*stream, fmt); + data->process(*stream, fmt); - stream->flags(saved_flags); - stream->fill(old_fill); - stream->precision(old_precision); + stream->flags(saved_flags); + stream->fill(old_fill); + stream->precision(old_precision); + + delete data; + } else { + *stream << ""; + } - delete data; - objects.pop_front(); ++p; } break; @@ -241,10 +242,10 @@ ArgList::dump(const string &format) } while (!objects.empty()) { + *stream << ""; Base *data = objects.front(); - data->process(*stream, fmt); - delete data; objects.pop_front(); + delete data; } } diff --git a/base/cprintf.hh b/base/cprintf.hh index 8360d227c..ac34cd252 100644 --- a/base/cprintf.hh +++ b/base/cprintf.hh @@ -75,7 +75,7 @@ class ArgList break; default: - format_invalid(out); + out << ""; break; } } diff --git a/base/cprintf_formats.hh b/base/cprintf_formats.hh index 1e5de4fdf..b921c0506 100644 --- a/base/cprintf_formats.hh +++ b/base/cprintf_formats.hh @@ -43,8 +43,10 @@ struct Format int precision; int width; - Format() { } - void clear() { + Format() { clear(); } + + void clear() + { alternate_form = false; flush_left = false; print_sign = false; @@ -58,15 +60,6 @@ struct Format } }; -inline void -format_invalid(std::ostream &out) -{ - using namespace std; - - out << "format invalid!!!" << endl; -} - - template inline void _format_char(std::ostream &out, const T& data, Format &fmt) @@ -233,7 +226,7 @@ _format_string(std::ostream &out, const T& data, Format &fmt) template inline void format_char(std::ostream &out, const T& data, Format &fmt) -{ format_invalid(out); } +{ out << ""; } inline void format_char(std::ostream &out, char data, Format &fmt) @@ -329,7 +322,7 @@ format_integer(std::ostream &out, unsigned long long data, Format &fmt) template inline void format_float(std::ostream &out, const T& data, Format &fmt) -{ format_invalid(out); } +{ out << ""; } inline void format_float(std::ostream &out, float data, Format &fmt) -- 2.30.2