summaryrefslogtreecommitdiff
path: root/src/textual.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/textual.h')
-rw-r--r--src/textual.h127
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