From c0285de46b2534f4d6ff39df64b2a445adc19d77 Mon Sep 17 00:00:00 2001 From: John Wiegley Date: Wed, 16 Feb 2005 05:52:31 +0000 Subject: [PATCH] Moved `format_xml_entries' to xml.cc. --- format.cc | 208 ----------------------------------------------------- format.h | 18 ----- xml.cc | 210 +++++++++++++++++++++++++++++++++++++++++++++++++++++- xml.h | 20 ++++++ 4 files changed, 229 insertions(+), 227 deletions(-) diff --git a/format.cc b/format.cc index b6cce9f1..2e437cfd 100644 --- a/format.cc +++ b/format.cc @@ -555,203 +555,6 @@ void format_entries::operator()(transaction_t& xact) last_entry = xact.entry; } -void xml_write_amount(std::ostream& out, const amount_t& amount, - const int depth = 0) -{ - for (int i = 0; i < depth; i++) out << ' '; - out << "\n"; - - commodity_t& c = amount.commodity(); - for (int i = 0; i < depth + 2; i++) out << ' '; - out << "" << c.symbol << "\n"; - - for (int i = 0; i < depth + 2; i++) out << ' '; - out << ""; - out << amount.quantity_string() << "\n"; - - for (int i = 0; i < depth; i++) out << ' '; - out << "\n"; -} - -void xml_write_value(std::ostream& out, const value_t& value, - const int depth = 0) -{ - balance_t * bal = NULL; - - for (int i = 0; i < depth; i++) out << ' '; - out << "\n"; - - switch (value.type) { - case value_t::BOOLEAN: - for (int i = 0; i < depth + 2; i++) out << ' '; - out << "" << *((bool *) value.data) << "\n"; - break; - - case value_t::INTEGER: - for (int i = 0; i < depth + 2; i++) out << ' '; - out << "" << *((long *) value.data) << "\n"; - break; - - case value_t::AMOUNT: - xml_write_amount(out, *((amount_t *) value.data), depth + 2); - break; - - case value_t::BALANCE: - bal = (balance_t *) value.data; - // fall through... - - case value_t::BALANCE_PAIR: - if (! bal) - bal = &((balance_pair_t *) value.data)->quantity; - - for (int i = 0; i < depth + 2; i++) out << ' '; - out << "\n"; - - for (amounts_map::const_iterator i = bal->amounts.begin(); - i != bal->amounts.end(); - i++) - xml_write_amount(out, (*i).second, depth + 4); - - for (int i = 0; i < depth + 2; i++) out << ' '; - out << "\n"; - break; - - default: - assert(0); - break; - } - - for (int i = 0; i < depth; i++) out << ' '; - out << "\n"; -} - -void output_xml_string(std::ostream& out, const std::string& str) -{ - for (const char * s = str.c_str(); *s; s++) { - switch (*s) { - case '<': - out << "<"; - break; - case '>': - out << "&rt;"; - break; - case '&': - out << "&"; - break; - default: - out << *s; - break; - } - } -} - -void format_xml_entries::format_last_entry() -{ - char buf[256]; - std::strftime(buf, 255, format_t::date_format.c_str(), - std::localtime(&last_entry->date)); - - output_stream << " \n" - << " " << buf << "\n"; - - if (last_entry->state == entry_t::CLEARED) - output_stream << " \n"; - else if (last_entry->state == entry_t::PENDING) - output_stream << " \n"; - - if (! last_entry->code.empty()) { - output_stream << " "; - output_xml_string(output_stream, last_entry->code); - output_stream << "\n"; - } - - if (! last_entry->payee.empty()) { - output_stream << " "; - output_xml_string(output_stream, last_entry->payee); - output_stream << "\n"; - } - - bool first = true; - for (transactions_list::const_iterator i = last_entry->transactions.begin(); - i != last_entry->transactions.end(); - i++) { - if (transaction_has_xdata(**i) && - transaction_xdata_(**i).dflags & TRANSACTION_TO_DISPLAY) { - if (first) { - output_stream << " \n"; - first = false; - } - - output_stream << " \n"; - - if ((*i)->flags & TRANSACTION_VIRTUAL) - output_stream << " \n"; - if ((*i)->flags & TRANSACTION_AUTO) - output_stream << " \n"; - - if ((*i)->account) { - std::string name = (*i)->account->fullname(); - if (name == "") - name = "[TOTAL]"; - else if (name == "") - name = "[UNKNOWN]"; - - output_stream << " "; - output_xml_string(output_stream, name); - output_stream << "\n"; - } - - output_stream << " \n"; - if (transaction_xdata_(**i).dflags & TRANSACTION_COMPOSITE) - xml_write_value(output_stream, - transaction_xdata_(**i).composite_amount, 10); - else - xml_write_value(output_stream, value_t((*i)->amount), 10); - output_stream << " \n"; - - if ((*i)->cost) { - output_stream << " \n"; - xml_write_value(output_stream, value_t(*(*i)->cost), 10); - output_stream << " \n"; - } - - if (! (*i)->note.empty()) { - output_stream << " "; - output_xml_string(output_stream, (*i)->note); - output_stream << "\n"; - } - - if (show_totals) { - output_stream << " \n"; - xml_write_value(output_stream, transaction_xdata_(**i).total, 10); - output_stream << " \n"; - } - - output_stream << " \n"; - - transaction_xdata_(**i).dflags |= TRANSACTION_DISPLAYED; - } - } - - if (! first) - output_stream << " \n"; - - output_stream << " \n"; -} - void print_entry(std::ostream& out, const entry_t& entry) { const std::string print_format @@ -964,17 +767,6 @@ void export_format() .def("__call__", &format_entries_wrap::operator()) ; - typedef - pystream_handler_wrap - format_xml_entries_wrap; - - class_< format_xml_entries_wrap, bases > > - ("FormatXmlEntries", - init()[with_custodian_and_ward<1, 2>()]) - .def("flush", &format_xml_entries_wrap::flush) - .def("__call__", &format_xml_entries_wrap::operator()) - ; - typedef pystream_handler_wrap format_account_wrap; diff --git a/format.h b/format.h index d1b7a8dc..abff0083 100644 --- a/format.h +++ b/format.h @@ -126,24 +126,6 @@ class format_entries : public format_transactions virtual void operator()(transaction_t& xact); }; -class format_xml_entries : public format_entries -{ - bool show_totals; - public: - format_xml_entries(std::ostream& output_stream, - const bool _show_totals = false) - : format_entries(output_stream, ""), show_totals(_show_totals) { - output_stream << "\n\n"; - } - - virtual void flush() { - format_entries::flush(); - output_stream << "" << std::endl; - } - - virtual void format_last_entry(); -}; - void print_entry(std::ostream& out, const entry_t& entry); bool disp_subaccounts_p(const account_t& account, diff --git a/xml.cc b/xml.cc index c5cf9f31..00280c38 100644 --- a/xml.cc +++ b/xml.cc @@ -143,7 +143,7 @@ bool xml_parser_t::test(std::istream& in) const } in.getline(buf, 255); - if (! std::strstr(buf, "")) { + if (! std::strstr(buf, "\n"; + + commodity_t& c = amount.commodity(); + for (int i = 0; i < depth + 2; i++) out << ' '; + out << "" << c.symbol << "\n"; + + for (int i = 0; i < depth + 2; i++) out << ' '; + out << ""; + out << amount.quantity_string() << "\n"; + + for (int i = 0; i < depth; i++) out << ' '; + out << "\n"; +} + +void xml_write_value(std::ostream& out, const value_t& value, + const int depth = 0) +{ + balance_t * bal = NULL; + + for (int i = 0; i < depth; i++) out << ' '; + out << "\n"; + + switch (value.type) { + case value_t::BOOLEAN: + for (int i = 0; i < depth + 2; i++) out << ' '; + out << "" << *((bool *) value.data) << "\n"; + break; + + case value_t::INTEGER: + for (int i = 0; i < depth + 2; i++) out << ' '; + out << "" << *((long *) value.data) << "\n"; + break; + + case value_t::AMOUNT: + xml_write_amount(out, *((amount_t *) value.data), depth + 2); + break; + + case value_t::BALANCE: + bal = (balance_t *) value.data; + // fall through... + + case value_t::BALANCE_PAIR: + if (! bal) + bal = &((balance_pair_t *) value.data)->quantity; + + for (int i = 0; i < depth + 2; i++) out << ' '; + out << "\n"; + + for (amounts_map::const_iterator i = bal->amounts.begin(); + i != bal->amounts.end(); + i++) + xml_write_amount(out, (*i).second, depth + 4); + + for (int i = 0; i < depth + 2; i++) out << ' '; + out << "\n"; + break; + + default: + assert(0); + break; + } + + for (int i = 0; i < depth; i++) out << ' '; + out << "\n"; +} + +void output_xml_string(std::ostream& out, const std::string& str) +{ + for (const char * s = str.c_str(); *s; s++) { + switch (*s) { + case '<': + out << "<"; + break; + case '>': + out << "&rt;"; + break; + case '&': + out << "&"; + break; + default: + out << *s; + break; + } + } +} + +void format_xml_entries::format_last_entry() +{ + char buf[256]; + std::strftime(buf, 255, format_t::date_format.c_str(), + std::localtime(&last_entry->date)); + + output_stream << " \n" + << " " << buf << "\n"; + + if (last_entry->state == entry_t::CLEARED) + output_stream << " \n"; + else if (last_entry->state == entry_t::PENDING) + output_stream << " \n"; + + if (! last_entry->code.empty()) { + output_stream << " "; + output_xml_string(output_stream, last_entry->code); + output_stream << "\n"; + } + + if (! last_entry->payee.empty()) { + output_stream << " "; + output_xml_string(output_stream, last_entry->payee); + output_stream << "\n"; + } + + bool first = true; + for (transactions_list::const_iterator i = last_entry->transactions.begin(); + i != last_entry->transactions.end(); + i++) { + if (transaction_has_xdata(**i) && + transaction_xdata_(**i).dflags & TRANSACTION_TO_DISPLAY) { + if (first) { + output_stream << " \n"; + first = false; + } + + output_stream << " \n"; + + if ((*i)->flags & TRANSACTION_VIRTUAL) + output_stream << " \n"; + if ((*i)->flags & TRANSACTION_AUTO) + output_stream << " \n"; + + if ((*i)->account) { + std::string name = (*i)->account->fullname(); + if (name == "") + name = "[TOTAL]"; + else if (name == "") + name = "[UNKNOWN]"; + + output_stream << " "; + output_xml_string(output_stream, name); + output_stream << "\n"; + } + + output_stream << " \n"; + if (transaction_xdata_(**i).dflags & TRANSACTION_COMPOSITE) + xml_write_value(output_stream, + transaction_xdata_(**i).composite_amount, 10); + else + xml_write_value(output_stream, value_t((*i)->amount), 10); + output_stream << " \n"; + + if ((*i)->cost) { + output_stream << " \n"; + xml_write_value(output_stream, value_t(*(*i)->cost), 10); + output_stream << " \n"; + } + + if (! (*i)->note.empty()) { + output_stream << " "; + output_xml_string(output_stream, (*i)->note); + output_stream << "\n"; + } + + if (show_totals) { + output_stream << " \n"; + xml_write_value(output_stream, transaction_xdata_(**i).total, 10); + output_stream << " \n"; + } + + output_stream << " \n"; + + transaction_xdata_(**i).dflags |= TRANSACTION_DISPLAYED; + } + } + + if (! first) + output_stream << " \n"; + + output_stream << " \n"; +} + } // namespace ledger #ifdef USE_BOOST_PYTHON @@ -224,6 +421,17 @@ void export_xml() { .def("test", &xml_parser_t::test) .def("parse", &xml_parser_t::parse, xml_parse_overloads()) ; + + typedef + pystream_handler_wrap + format_xml_entries_wrap; + + class_< format_xml_entries_wrap, bases > > + ("FormatXmlEntries", + init()[with_custodian_and_ward<1, 2>()]) + .def("flush", &format_xml_entries_wrap::flush) + .def("__call__", &format_xml_entries_wrap::operator()) + ; } #endif // USE_BOOST_PYTHON diff --git a/xml.h b/xml.h index 750dafb7..a4a4ebe8 100644 --- a/xml.h +++ b/xml.h @@ -2,6 +2,7 @@ #define _XML_H #include "parser.h" +#include "format.h" namespace ledger { @@ -16,6 +17,25 @@ class xml_parser_t : public parser_t const std::string * original_file = NULL); }; +class format_xml_entries : public format_entries +{ + bool show_totals; + public: + format_xml_entries(std::ostream& output_stream, + const bool _show_totals = false) + : format_entries(output_stream, ""), show_totals(_show_totals) { + output_stream << "\n" + << "\n"; + } + + virtual void flush() { + format_entries::flush(); + output_stream << "" << std::endl; + } + + virtual void format_last_entry(); +}; + } // namespace ledger #endif // _XML_H