diff options
Diffstat (limited to 'src/json/json_spirit_writer_template.h')
-rw-r--r-- | src/json/json_spirit_writer_template.h | 201 |
1 files changed, 31 insertions, 170 deletions
diff --git a/src/json/json_spirit_writer_template.h b/src/json/json_spirit_writer_template.h index 014d9d4cd0..28c49ddc64 100644 --- a/src/json/json_spirit_writer_template.h +++ b/src/json/json_spirit_writer_template.h @@ -1,22 +1,16 @@ #ifndef JSON_SPIRIT_WRITER_TEMPLATE #define JSON_SPIRIT_WRITER_TEMPLATE -// Copyright John W. Wilkinson 2007 - 2013 +// Copyright John W. Wilkinson 2007 - 2009. // Distributed under the MIT License, see accompanying file LICENSE.txt -// json spirit version 4.06 - -#if defined(_MSC_VER) && (_MSC_VER >= 1020) -# pragma once -#endif +// json spirit version 4.03 #include "json_spirit_value.h" -#include "json_spirit_writer_options.h" #include <cassert> #include <sstream> #include <iomanip> -#include <boost/io/ios_state.hpp> namespace json_spirit { @@ -66,7 +60,7 @@ namespace json_spirit } template< class String_type > - String_type add_esc_chars( const String_type& s, bool raw_utf8, bool esc_nonascii ) + String_type add_esc_chars( const String_type& s ) { typedef typename String_type::const_iterator Iter_type; typedef typename String_type::value_type Char_type; @@ -81,80 +75,21 @@ namespace json_spirit if( add_esc_char( c, result ) ) continue; - if( raw_utf8 ) + const wint_t unsigned_c( ( c >= 0 ) ? c : 256 + c ); + + if( iswprint( unsigned_c ) ) { result += c; } else { - const wint_t unsigned_c( ( c >= 0 ) ? c : 256 + c ); - - if( !esc_nonascii && iswprint( unsigned_c ) ) - { - result += c; - } - else - { - result += non_printable_to_string< String_type >( unsigned_c ); - } - } - } - - return result; - } - - template< class Ostream > - void append_double( Ostream& os, const double d, const int precision ) - { - os << std::showpoint << std::setprecision( precision ) << d; - } - - template< class String_type > - void erase_and_extract_exponent( String_type& str, String_type& exp ) - { - const typename String_type::size_type exp_start= str.find( 'e' ); - - if( exp_start != String_type::npos ) - { - exp = str.substr( exp_start ); - str.erase( exp_start ); - } - } - - template< class String_type > - typename String_type::size_type find_first_non_zero( const String_type& str ) - { - typename String_type::size_type result = str.size() - 1; - - for( ; result != 0; --result ) - { - if( str[ result ] != '0' ) - { - break; + result += non_printable_to_string< String_type >( unsigned_c ); } } return result; } - template< class String_type > - void remove_trailing( String_type& str ) - { - String_type exp; - - erase_and_extract_exponent( str, exp ); - - const typename String_type::size_type first_non_zero = find_first_non_zero( str ); - - if( first_non_zero != 0 ) - { - const int offset = str[first_non_zero] == '.' ? 2 : 1; // note zero digits following a decimal point is non standard - str.erase( first_non_zero + offset ); - } - - str += exp; - } - // this class generates the JSON text, // it keeps track of the indentation level etc. // @@ -170,15 +105,10 @@ namespace json_spirit public: - Generator( const Value_type& value, Ostream_type& os, unsigned int options ) + Generator( const Value_type& value, Ostream_type& os, bool pretty ) : os_( os ) , indentation_level_( 0 ) - , pretty_( ( options & pretty_print ) != 0 || ( options & single_line_arrays ) != 0 ) - , raw_utf8_( ( options & raw_utf8 ) != 0 ) - , esc_nonascii_( ( options & always_escape_nonascii ) != 0 ) - , remove_trailing_zeros_( ( options & remove_trailing_zeros ) != 0 ) - , single_line_arrays_( ( options & single_line_arrays ) != 0 ) - , ios_saver_( os ) + , pretty_( pretty ) { output( value ); } @@ -193,8 +123,12 @@ namespace json_spirit case array_type: output( value.get_array() ); break; case str_type: output( value.get_str() ); break; case bool_type: output( value.get_bool() ); break; - case real_type: output( value.get_real() ); break; case int_type: output_int( value ); break; + + /// Bitcoin: Added std::fixed and changed precision from 16 to 8 + case real_type: os_ << std::showpoint << std::fixed << std::setprecision(8) + << value.get_real(); break; + case null_type: os_ << "null"; break; default: assert( false ); } @@ -205,6 +139,11 @@ namespace json_spirit output_array_or_obj( obj, '{', '}' ); } + void output( const Array_type& arr ) + { + output_array_or_obj( arr, '[', ']' ); + } + void output( const Obj_member_type& member ) { output( Config_type::get_name( member ) ); space(); @@ -226,7 +165,7 @@ namespace json_spirit void output( const String_type& s ) { - os_ << '"' << add_esc_chars( s, raw_utf8_, esc_nonascii_ ) << '"'; + os_ << '"' << add_esc_chars( s ) << '"'; } void output( bool b ) @@ -234,75 +173,6 @@ namespace json_spirit os_ << to_str< String_type >( b ? "true" : "false" ); } - void output( double d ) - { - if( remove_trailing_zeros_ ) - { - std::basic_ostringstream< Char_type > os; - - append_double( os, d, 16 ); // note precision is 16 so that we get some trailing space that we can remove, - // otherwise, 0.1234 gets converted to "0.12399999..." - - String_type str = os.str(); - - remove_trailing( str ); - - os_ << str; - } - else - { - append_double( os_, d, 17 ); - } - } - - static bool contains_composite_elements( const Array_type& arr ) - { - for( typename Array_type::const_iterator i = arr.begin(); i != arr.end(); ++i ) - { - const Value_type& val = *i; - - if( val.type() == obj_type || - val.type() == array_type ) - { - return true; - } - } - - return false; - } - - template< class Iter > - void output_composite_item( Iter i, Iter last ) - { - output( *i ); - - if( ++i != last ) - { - os_ << ','; - } - } - - void output( const Array_type& arr ) - { - if( single_line_arrays_ && !contains_composite_elements( arr ) ) - { - os_ << '['; space(); - - for( typename Array_type::const_iterator i = arr.begin(); i != arr.end(); ++i ) - { - output_composite_item( i, arr.end() ); - - space(); - } - - os_ << ']'; - } - else - { - output_array_or_obj( arr, '[', ']' ); - } - } - template< class T > void output_array_or_obj( const T& t, Char_type start_char, Char_type end_char ) { @@ -312,9 +182,14 @@ namespace json_spirit for( typename T::const_iterator i = t.begin(); i != t.end(); ++i ) { - indent(); + indent(); output( *i ); - output_composite_item( i, t.end() ); + typename T::const_iterator next = i; + + if( ++next != t.end()) + { + os_ << ','; + } new_line(); } @@ -349,36 +224,22 @@ namespace json_spirit Ostream_type& os_; int indentation_level_; bool pretty_; - bool raw_utf8_; - bool esc_nonascii_; - bool remove_trailing_zeros_; - bool single_line_arrays_; - boost::io::basic_ios_all_saver< Char_type > ios_saver_; // so that ostream state is reset after control is returned to the caller }; - // writes JSON Value to a stream, e.g. - // - // write_stream( value, os, pretty_print ); - // template< class Value_type, class Ostream_type > - void write_stream( const Value_type& value, Ostream_type& os, unsigned int options = 0 ) + void write_stream( const Value_type& value, Ostream_type& os, bool pretty ) { - os << std::dec; - Generator< Value_type, Ostream_type >( value, os, options ); + Generator< Value_type, Ostream_type >( value, os, pretty ); } - // writes JSON Value to a stream, e.g. - // - // const string json_str = write( value, pretty_print ); - // template< class Value_type > - typename Value_type::String_type write_string( const Value_type& value, unsigned int options = 0 ) + typename Value_type::String_type write_string( const Value_type& value, bool pretty ) { typedef typename Value_type::String_type::value_type Char_type; std::basic_ostringstream< Char_type > os; - write_stream( value, os, options ); + write_stream( value, os, pretty ); return os.str(); } |