summaryrefslogtreecommitdiff
path: root/format.h
diff options
context:
space:
mode:
Diffstat (limited to 'format.h')
-rw-r--r--format.h198
1 files changed, 198 insertions, 0 deletions
diff --git a/format.h b/format.h
new file mode 100644
index 00000000..37e5e21a
--- /dev/null
+++ b/format.h
@@ -0,0 +1,198 @@
+#ifndef _FORMAT_H
+#define _FORMAT_H
+
+#include "journal.h"
+#include "valexpr.h"
+#include "walk.h"
+
+namespace ledger {
+
+std::string truncated(const std::string& str, unsigned int width);
+
+std::string partial_account_name(const account_t& account,
+ const unsigned int start_depth);
+
+struct element_t
+{
+ enum kind_t {
+ STRING,
+ VALUE_EXPR,
+ DATE_STRING,
+ CLEARED,
+ CODE,
+ PAYEE,
+ ACCOUNT_NAME,
+ ACCOUNT_FULLNAME,
+ AMOUNT,
+ OPT_AMOUNT,
+ TOTAL,
+ NOTE,
+ OPT_NOTE,
+ SPACER,
+ DEPTH_SPACER,
+ INTERP_FUNC
+ };
+
+ bool align_left;
+ unsigned int min_width;
+ unsigned int max_width;
+
+ kind_t type;
+ std::string chars;
+ value_expr_t * val_expr;
+
+ struct element_t * next;
+
+ element_t() : align_left(false), min_width(0), max_width(0),
+ type(STRING), val_expr(NULL), next(NULL) {
+ DEBUG_PRINT("ledger.memory.ctors", "ctor element_t");
+ }
+
+ ~element_t() {
+ DEBUG_PRINT("ledger.memory.dtors", "dtor element_t");
+ if (val_expr) delete val_expr;
+ if (next) delete next; // recursive, but not too deep
+ }
+};
+
+struct format_t
+{
+ std::string format_string;
+ element_t * elements;
+
+ static std::string date_format;
+
+ format_t() : elements(NULL) {
+ DEBUG_PRINT("ledger.memory.ctors", "ctor format_t");
+ }
+ format_t(const std::string& _format) : elements(NULL) {
+ DEBUG_PRINT("ledger.memory.ctors", "ctor format_t");
+ reset(_format);
+ }
+ ~format_t() {
+ DEBUG_PRINT("ledger.memory.dtors", "dtor format_t");
+ if (elements) delete elements;
+ }
+
+ void reset(const std::string& _format) {
+ if (elements)
+ delete elements;
+ elements = parse_elements(_format);
+ format_string = _format;
+ }
+
+ static element_t * parse_elements(const std::string& fmt);
+
+ void format(std::ostream& out, const details_t& details) const;
+};
+
+class format_transactions : public item_handler<transaction_t>
+{
+ protected:
+ std::ostream& output_stream;
+ format_t first_line_format;
+ format_t next_lines_format;
+ entry_t * last_entry;
+
+ public:
+ format_transactions(std::ostream& _output_stream,
+ const std::string& format);
+
+ virtual void flush() {
+ output_stream.flush();
+ }
+ virtual void operator()(transaction_t& xact);
+};
+
+class format_entries : public format_transactions
+{
+ public:
+ format_entries(std::ostream& output_stream, const std::string& format)
+ : format_transactions(output_stream, format) {}
+
+ virtual void format_last_entry();
+
+ virtual void flush() {
+ if (last_entry) {
+ format_last_entry();
+ last_entry = NULL;
+ }
+ format_transactions::flush();
+ }
+ 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 << "<?xml version=\"1.0\"?>\n<ledger>\n";
+ }
+ virtual ~format_xml_entries() {
+ output_stream << "</ledger>" << 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,
+ const item_predicate<account_t>& disp_pred,
+ const account_t *& to_show);
+
+inline bool disp_subaccounts_p(const account_t& account) {
+ const account_t * temp;
+ return disp_subaccounts_p(account, item_predicate<account_t>(NULL), temp);
+}
+
+bool display_account(const account_t& account,
+ const item_predicate<account_t>& disp_pred);
+
+class format_account : public item_handler<account_t>
+{
+ std::ostream& output_stream;
+
+ item_predicate<account_t> disp_pred;
+
+ public:
+ format_t format;
+
+ format_account(std::ostream& _output_stream,
+ const std::string& _format,
+ const std::string& display_predicate = NULL)
+ : output_stream(_output_stream), format(_format),
+ disp_pred(display_predicate) {}
+
+ virtual void flush() {
+ output_stream.flush();
+ }
+
+ virtual void operator()(account_t& account);
+};
+
+class format_equity : public item_handler<account_t>
+{
+ std::ostream& output_stream;
+ format_t first_line_format;
+ format_t next_lines_format;
+
+ item_predicate<account_t> disp_pred;
+
+ mutable value_t total;
+
+ public:
+ format_equity(std::ostream& _output_stream,
+ const std::string& _format,
+ const std::string& display_predicate);
+
+ virtual void flush();
+ virtual void operator()(account_t& account);
+};
+
+} // namespace ledger
+
+#endif // _REPORT_H