summaryrefslogtreecommitdiff
path: root/csv.cc
diff options
context:
space:
mode:
Diffstat (limited to 'csv.cc')
-rw-r--r--csv.cc105
1 files changed, 105 insertions, 0 deletions
diff --git a/csv.cc b/csv.cc
new file mode 100644
index 00000000..4a8c1157
--- /dev/null
+++ b/csv.cc
@@ -0,0 +1,105 @@
+#include "csv.h"
+
+namespace ledger {
+
+namespace {
+ inline void write_escaped_string(std::ostream& out, const std::string& xact)
+ {
+ out << "\"";
+ for (std::string::const_iterator i = xact.begin(); i != xact.end(); i++)
+ if (*i == '"') {
+ out << "\\";
+ out << "\"";
+ } else {
+ out << *i;
+ }
+ out << "\"";
+ }
+}
+
+void format_csv_transactions::operator()(transaction_t& xact)
+{
+ if (! transaction_has_xdata(xact) ||
+ ! (transaction_xdata_(xact).dflags & TRANSACTION_DISPLAYED)) {
+
+ {
+ format_t fmt("%D");
+ std::ostringstream str;
+ fmt.format(str, details_t(xact));
+ write_escaped_string(out, str.str());
+ }
+ out << ',';
+
+ {
+ format_t fmt("%P");
+ std::ostringstream str;
+ fmt.format(str, details_t(xact));
+ write_escaped_string(out, str.str());
+ }
+ out << ',';
+
+ {
+ format_t fmt("%A");
+ std::ostringstream str;
+ fmt.format(str, details_t(xact));
+ write_escaped_string(out, str.str());
+ }
+ out << ',';
+
+ {
+ format_t fmt("%t");
+ std::ostringstream str;
+ fmt.format(str, details_t(xact));
+ write_escaped_string(out, str.str());
+ }
+ out << ',';
+
+ {
+ format_t fmt("%T");
+ std::ostringstream str;
+ fmt.format(str, details_t(xact));
+ write_escaped_string(out, str.str());
+ }
+ out << ',';
+
+ switch (xact.state) {
+ case transaction_t::CLEARED:
+ write_escaped_string(out, "*");
+ break;
+ case transaction_t::PENDING:
+ write_escaped_string(out, "!");
+ break;
+ default: {
+ transaction_t::state_t state;
+ if (xact.entry->get_state(&state))
+ switch (state) {
+ case transaction_t::CLEARED:
+ write_escaped_string(out, "*");
+ break;
+ case transaction_t::PENDING:
+ write_escaped_string(out, "!");
+ break;
+ default:
+ write_escaped_string(out, "");
+ break;
+ }
+ }
+ }
+ out << ',';
+
+ write_escaped_string(out, xact.entry->code);
+ out << ',';
+
+ {
+ format_t fmt("%N");
+ std::ostringstream str;
+ fmt.format(str, details_t(xact));
+ write_escaped_string(out, str.str());
+ }
+ out << '\n';
+
+ transaction_xdata(xact).dflags |= TRANSACTION_DISPLAYED;
+ }
+}
+
+} // namespace ledger