From db73e7af9ec09deb8fb6a8d38a1c6af98f3eb4fc Mon Sep 17 00:00:00 2001 From: Craig Earls Date: Thu, 26 Jun 2014 20:52:50 -0700 Subject: Fix Bug 1057: Emacs output does not escape special characters. --- src/emacs.cc | 154 +++++++++++++++++++++++++++++++---------------------------- 1 file changed, 80 insertions(+), 74 deletions(-) (limited to 'src/emacs.cc') diff --git a/src/emacs.cc b/src/emacs.cc index 2f8954ac..b7f20bd2 100644 --- a/src/emacs.cc +++ b/src/emacs.cc @@ -30,7 +30,7 @@ */ #include - +#include #include "emacs.h" #include "xact.h" #include "post.h" @@ -38,78 +38,84 @@ namespace ledger { -void format_emacs_posts::write_xact(xact_t& xact) -{ - if (xact.pos) - out << "\"" << xact.pos->pathname.string() << "\" " - << xact.pos->beg_line << " "; - else - out << "\"\" " << -1 << " "; - - tm when = gregorian::to_tm(xact.date()); - std::time_t date = std::mktime(&when); - - out << "(" << (date / 65536) << " " << (date % 65536) << " 0) "; - - if (xact.code) - out << "\"" << *xact.code << "\" "; - else - out << "nil "; - - if (xact.payee.empty()) - out << "nil"; - else - out << "\"" << xact.payee << "\""; - - out << "\n"; -} - -void format_emacs_posts::operator()(post_t& post) -{ - if (! post.has_xdata() || - ! post.xdata().has_flags(POST_EXT_DISPLAYED)) { - if (! last_xact) { - out << "(("; - write_xact(*post.xact); - } - else if (post.xact != last_xact) { - out << ")\n ("; - write_xact(*post.xact); - } - else { - out << "\n"; - } - - if (post.pos) - out << " (" << post.pos->beg_line << " "; - else - out << " (" << -1 << " "; - - out << "\"" << post.reported_account()->fullname() << "\" \"" - << post.amount << "\""; - - switch (post.state()) { - case item_t::UNCLEARED: - out << " nil"; - break; - case item_t::CLEARED: - out << " t"; - break; - case item_t::PENDING: - out << " pending"; - break; - } - - if (post.cost) - out << " \"" << *post.cost << "\""; - if (post.note) - out << " \"" << *post.note << "\""; - out << ")"; - - last_xact = post.xact; - - post.xdata().add_flags(POST_EXT_DISPLAYED); - } -} + void format_emacs_posts::write_xact(xact_t& xact) + { + if (xact.pos) + out << "\"" << xact.pos->pathname.string() << "\" " + << xact.pos->beg_line << " "; + else + out << "\"\" " << -1 << " "; + + tm when = gregorian::to_tm(xact.date()); + std::time_t date = std::mktime(&when); + + out << "(" << (date / 65536) << " " << (date % 65536) << " 0) "; + + if (xact.code) + out << "\"" << *xact.code << "\" "; + else + out << "nil "; + + if (xact.payee.empty()) + out << "nil"; + else + out << "\"" << xact.payee << "\""; + + out << "\n"; + } + + void format_emacs_posts::operator()(post_t& post) + { + if (! post.has_xdata() || + ! post.xdata().has_flags(POST_EXT_DISPLAYED)) { + if (! last_xact) { + out << "(("; + write_xact(*post.xact); + } + else if (post.xact != last_xact) { + out << ")\n ("; + write_xact(*post.xact); + } + else { + out << "\n"; + } + + if (post.pos) + out << " (" << post.pos->beg_line << " "; + else + out << " (" << -1 << " "; + + out << "\"" << post.reported_account()->fullname() << "\" \"" + << post.amount << "\""; + + switch (post.state()) { + case item_t::UNCLEARED: + out << " nil"; + break; + case item_t::CLEARED: + out << " t"; + break; + case item_t::PENDING: + out << " pending"; + break; + } + + if (post.cost) + out << " \"" << *post.cost << "\""; + if (post.note) + out << " \"" << escape_string(*post.note) << "\""; + out << ")"; + + last_xact = post.xact; + + post.xdata().add_flags(POST_EXT_DISPLAYED); + } + } + + string format_emacs_posts::escape_string(string raw){ + replace_all(raw, "\\", "\\\\"); + replace_all(raw, "\"", "\\\""); + return raw; + } } // namespace ledger -- cgit v1.2.3