diff options
author | Craig Earls <enderw88@gmail.com> | 2014-06-26 20:52:50 -0700 |
---|---|---|
committer | Craig Earls <enderw88@gmail.com> | 2014-06-26 20:52:50 -0700 |
commit | db73e7af9ec09deb8fb6a8d38a1c6af98f3eb4fc (patch) | |
tree | be53c03a1b53eebce0e0ebd300c94b249276f6d8 /src/emacs.cc | |
parent | 3a2eb94beff65f22463c119e4db55a2962ac02e0 (diff) | |
download | fork-ledger-db73e7af9ec09deb8fb6a8d38a1c6af98f3eb4fc.tar.gz fork-ledger-db73e7af9ec09deb8fb6a8d38a1c6af98f3eb4fc.tar.bz2 fork-ledger-db73e7af9ec09deb8fb6a8d38a1c6af98f3eb4fc.zip |
Fix Bug 1057: Emacs output does not escape special characters.
Diffstat (limited to 'src/emacs.cc')
-rw-r--r-- | src/emacs.cc | 154 |
1 files changed, 80 insertions, 74 deletions
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 <system.hh> - +#include <boost/algorithm/string.hpp> #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 |