From b3f7a478671c02f4054a8f8ae83753fd4fed77b9 Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Thu, 21 Jul 2011 13:33:09 -0700 Subject: [PATCH] formatter: dump float, simplify pending_string stuff Signed-off-by: Sage Weil --- src/common/Formatter.cc | 27 +++++++++++++++------------ src/common/Formatter.h | 13 ++++++++----- 2 files changed, 23 insertions(+), 17 deletions(-) diff --git a/src/common/Formatter.cc b/src/common/Formatter.cc index 5a76e69697d11..0fed1cb5d15dd 100644 --- a/src/common/Formatter.cc +++ b/src/common/Formatter.cc @@ -7,6 +7,7 @@ #include +#include "assert.h" #include "Formatter.h" // ----------------------- @@ -22,6 +23,7 @@ void Formatter::reset() void Formatter::flush(std::ostream& os) { finish_pending_string(); + assert(m_stack.empty()); os << m_ss.str(); m_ss.clear(); } @@ -44,12 +46,13 @@ void JSONFormatter::print_comma(formatter_stack_entry_d& entry) for (unsigned i=1; i < m_stack.size(); i++) m_ss << " "; } - if (entry.is_array) + if (m_pretty && entry.is_array) m_ss << " "; } void JSONFormatter::print_name(const char *name) { + finish_pending_string(); if (m_stack.empty()) return; struct formatter_stack_entry_d& entry = m_stack.back(); @@ -81,18 +84,17 @@ void JSONFormatter::open_section(const char *name, bool is_array) void JSONFormatter::open_array_section(const char *name) { - finish_pending_string(); open_section(name, true); } void JSONFormatter::open_object_section(const char *name) { - finish_pending_string(); open_section(name, false); } void JSONFormatter::close_section() { + assert(!m_stack.empty()); finish_pending_string(); struct formatter_stack_entry_d& entry = m_stack.back(); @@ -102,41 +104,43 @@ void JSONFormatter::close_section() void JSONFormatter::finish_pending_string() { - struct formatter_stack_entry_d& entry = m_stack.back(); - if (entry.pending_string) { + if (m_is_pending_string) { // FIXME: escape this properly m_ss << "\"" << m_pending_string.str() << "\""; m_pending_string.str(std::string()); - entry.pending_string = false; + m_is_pending_string = false; } } void JSONFormatter::dump_unsigned(const char *name, uint64_t u) { - finish_pending_string(); print_name(name); m_ss << u; } void JSONFormatter::dump_int(const char *name, int64_t s) { - finish_pending_string(); print_name(name); m_ss << s; } +void JSONFormatter::dump_float(const char *name, double d) +{ + char foo[30]; + snprintf(foo, sizeof(foo), "%lf", d); + dump_string(name, foo); +} + void JSONFormatter::dump_string(const char *name, std::string s) { - finish_pending_string(); print_name(name); m_ss << "\"" << s << "\""; } std::ostream& JSONFormatter::dump_stream(const char *name) { - finish_pending_string(); print_name(name); - m_stack.back().pending_string = true; + m_is_pending_string = true; return m_pending_string; } @@ -148,7 +152,6 @@ void JSONFormatter::dump_format(const char *name, const char *fmt, ...) vsnprintf(buf, LARGE_SIZE, fmt, ap); va_end(ap); - finish_pending_string(); print_name(name); m_ss << "\"" << buf << "\""; } diff --git a/src/common/Formatter.h b/src/common/Formatter.h index f68cfe6305a10..b9910f35c7d20 100644 --- a/src/common/Formatter.h +++ b/src/common/Formatter.h @@ -10,14 +10,12 @@ namespace ceph { struct formatter_stack_entry_d { int size; - bool is_array, pending_string; - formatter_stack_entry_d() : size(0), is_array(false), pending_string(false) {} + bool is_array; + formatter_stack_entry_d() : size(0), is_array(false) {} }; class Formatter { public: - virtual ~Formatter() {} - virtual void reset(); virtual void flush(std::ostream& os); @@ -27,14 +25,18 @@ class Formatter { virtual void close_section() = 0; virtual void dump_unsigned(const char *name, uint64_t u) = 0; virtual void dump_int(const char *name, int64_t s) = 0; + virtual void dump_float(const char *name, double d) = 0; virtual void dump_string(const char *name, std::string s) = 0; virtual std::ostream& dump_stream(const char *name) = 0; virtual void dump_format(const char *name, const char *fmt, ...) = 0; + Formatter() : m_is_pending_string(false) {} + virtual ~Formatter() {} + protected: std::stringstream m_ss, m_pending_string; std::list m_stack; - + bool m_is_pending_string; virtual void finish_pending_string() = 0; }; @@ -46,6 +48,7 @@ class JSONFormatter : public Formatter { void close_section(); void dump_unsigned(const char *name, uint64_t u); void dump_int(const char *name, int64_t u); + void dump_float(const char *name, double d); void dump_string(const char *name, std::string s); std::ostream& dump_stream(const char *name); void dump_format(const char *name, const char *fmt, ...); -- 2.39.5