diff options
Diffstat (limited to 'src/textual.h')
-rw-r--r-- | src/textual.h | 127 |
1 files changed, 101 insertions, 26 deletions
diff --git a/src/textual.h b/src/textual.h index 6cb12a56..8aa3a684 100644 --- a/src/textual.h +++ b/src/textual.h @@ -37,20 +37,113 @@ namespace ledger { +#define TIMELOG_SUPPORT 1 + +#if defined(TIMELOG_SUPPORT) +class time_log_t; +#endif + class textual_parser_t : public journal_t::parser_t { public: virtual bool test(std::istream& in) const; - virtual unsigned int parse(std::istream& in, - session_t& session, - journal_t& journal, - account_t * master = NULL, - const path * original_file = NULL); -}; + virtual std::size_t parse(std::istream& in, + session_t& session, + journal_t& journal, + account_t * master = NULL, + const path * original_file = NULL); + +protected: + class instance_t : public noncopyable, public scope_t + { + static const std::size_t MAX_LINE = 1024; + + public: + std::list<account_t *>& account_stack; +#if defined(TIMELOG_SUPPORT) + time_log_t& timelog; +#endif + + instance_t * parent; + std::istream& in; + session_t& session; + journal_t& journal; + account_t * master; + const path * original_file; + accounts_map account_aliases; + + path pathname; + std::size_t linenum; + std::size_t src_idx; + istream_pos_type beg_pos; + istream_pos_type end_pos; + unsigned long beg_line; + std::size_t count; + std::size_t errors; + + char linebuf[MAX_LINE + 1]; + + scoped_ptr<auto_entry_finalizer_t> auto_entry_finalizer; + + instance_t(std::list<account_t *>& _account_stack, +#if defined(TIMELOG_SUPPORT) + time_log_t& _timelog, +#endif + std::istream& _in, + session_t& _session, + journal_t& _journal, + account_t * _master = NULL, + const path * _original_file = NULL, + instance_t * _parent = NULL); + + ~instance_t(); -xact_t * parse_xact_text(char * line, account_t * account); -xact_t * parse_xact(std::istream& in, account_t * account); + void parse(); + void read_next_directive(); + +#if defined(TIMELOG_SUPPORT) + void clock_in_directive(char * line, bool capitalized); + void clock_out_directive(char * line, bool capitalized); +#endif + + void default_commodity_directive(char * line); + void default_account_directive(char * line); + void price_conversion_directive(char * line); + void price_entry_directive(char * line); + void nomarket_directive(char * line); + void year_directive(char * line); + void option_directive(char * line); + void automated_entry_directive(char * line); + void period_entry_directive(char * line); + void entry_directive(char * line); + void include_directive(char * line); + void account_directive(char * line); + void end_directive(char * line); + void alias_directive(char * line); + void define_directive(char * line); + void general_directive(char * line); + + xact_t * parse_xact(char * line, + account_t * account, + entry_t * entry); + + bool parse_xacts(std::istream& in, + account_t * account, + entry_base_t& entry, + const string& kind, + istream_pos_type beg_pos); + + entry_t * parse_entry(std::istream& in, + char * line, + account_t * master, + istream_pos_type& pos); + + virtual expr_t::ptr_op_t lookup(const string& name); + }; + + friend class instance_t; +}; void write_textual_journal(journal_t& journal, const path& pathname, @@ -58,24 +151,6 @@ void write_textual_journal(journal_t& journal, const string& write_hdr_format, std::ostream& out); -#if 0 -class include_context : public file_context -{ - public: - include_context(const path& file, unsigned long line, - const string& desc = "") throw() - : file_context(file, line, desc) {} - virtual ~include_context() throw() {} - - virtual void describe(std::ostream& out) const throw() { - if (! desc.empty()) - out << desc << ": "; - out << "\"" << file.string() << "\", line " << line << ":" - << std::endl; - } -}; -#endif - } // namespace ledger #endif // _TEXTUAL_H |