diff options
author | John Wiegley <johnw@newartisans.com> | 2009-02-26 05:42:59 -0400 |
---|---|---|
committer | John Wiegley <johnw@newartisans.com> | 2009-02-26 05:42:59 -0400 |
commit | b302c340b607d1607174faefbe53416b6e9aafbc (patch) | |
tree | 08913a3c565e89c0342807763d6ecd63588b8478 /src | |
parent | a0d8d84b8702e97de11622f35ffd9b2ffa03e4f6 (diff) | |
download | fork-ledger-b302c340b607d1607174faefbe53416b6e9aafbc.tar.gz fork-ledger-b302c340b607d1607174faefbe53416b6e9aafbc.tar.bz2 fork-ledger-b302c340b607d1607174faefbe53416b6e9aafbc.zip |
Enriched the context report during textual parsing
Diffstat (limited to 'src')
-rw-r--r-- | src/textual.cc | 109 |
1 files changed, 80 insertions, 29 deletions
diff --git a/src/textual.cc b/src/textual.cc index fb03f04d..3a03937f 100644 --- a/src/textual.cc +++ b/src/textual.cc @@ -525,19 +525,27 @@ void instance_t::option_directive(char * line) void instance_t::automated_xact_directive(char * line) { + istream_pos_type pos = line_beg_pos; + std::size_t lnum = linenum; + + bool reveal_context = true; + + try { + if (! auto_xact_finalizer.get()) { auto_xact_finalizer.reset(new auto_xact_finalizer_t(&journal)); journal.add_xact_finalizer(auto_xact_finalizer.get()); } - istream_pos_type pos = curr_pos; - std::size_t lnum = linenum; - std::auto_ptr<auto_xact_t> ae (new auto_xact_t(item_predicate(skip_ws(line + 1), keep_details_t(true, true, true)))); + reveal_context = false; + if (parse_posts(account_stack.front(), *ae.get())) { + reveal_context = true; + journal.auto_xacts.push_back(ae.get()); ae->pathname = pathname; @@ -548,18 +556,35 @@ void instance_t::automated_xact_directive(char * line) ae.release(); } + + } + catch (const std::exception& err) { + if (reveal_context) { + add_error_context(_("While parsing periodic transaction:")); + add_error_context(source_context(pathname, pos, curr_pos, "> ")); + } + throw; + } } void instance_t::period_xact_directive(char * line) { + istream_pos_type pos = line_beg_pos; + std::size_t lnum = linenum; + + bool reveal_context = true; + + try { + std::auto_ptr<period_xact_t> pe(new period_xact_t(skip_ws(line + 1))); if (! pe->period) throw_(parse_error, _("Parsing time period '%1'") << line); - istream_pos_type pos = curr_pos; - std::size_t lnum = linenum; + reveal_context = false; if (parse_posts(account_stack.front(), *pe.get())) { + reveal_context = true; + if (pe->finalize()) { extend_xact_base(&journal, *pe.get(), true); @@ -576,6 +601,15 @@ void instance_t::period_xact_directive(char * line) throw parse_error(_("Period transaction failed to balance")); } } + + } + catch (const std::exception& err) { + if (reveal_context) { + add_error_context(_("While parsing periodic transaction:")); + add_error_context(source_context(pathname, pos, curr_pos, "> ")); + } + throw; + } } void instance_t::xact_directive(char * line, std::streamsize len) @@ -1043,17 +1077,21 @@ bool instance_t::parse_posts(account_t * account, return added; } -xact_t * instance_t::parse_xact(char * line, - std::streamsize len, - account_t * account) +xact_t * instance_t::parse_xact(char * line, + std::streamsize len, + account_t * account) { TRACE_START(xact_text, 1, "Time spent parsing transaction text:"); - std::auto_ptr<xact_t> curr(new xact_t); + std::auto_ptr<xact_t> xact(new xact_t); + + xact->pathname = pathname; + xact->beg_pos = line_beg_pos; + xact->beg_line = linenum; - curr->pathname = pathname; - curr->beg_pos = line_beg_pos; - curr->beg_line = linenum; + bool reveal_context = true; + + try { // Parse the date @@ -1061,20 +1099,20 @@ xact_t * instance_t::parse_xact(char * line, if (char * p = std::strchr(line, '=')) { *p++ = '\0'; - curr->_date_eff = parse_date(p, current_year); + xact->_date_eff = parse_date(p, current_year); } - curr->_date = parse_date(line, current_year); + xact->_date = parse_date(line, current_year); // Parse the optional cleared flag: * if (next) { switch (*next) { case '*': - curr->_state = item_t::CLEARED; + xact->_state = item_t::CLEARED; next = skip_ws(++next); break; case '!': - curr->_state = item_t::PENDING; + xact->_state = item_t::PENDING; next = skip_ws(++next); break; } @@ -1085,7 +1123,7 @@ xact_t * instance_t::parse_xact(char * line, if (next && *next == '(') { if (char * p = std::strchr(next++, ')')) { *p++ = '\0'; - curr->code = next; + xact->code = next; next = skip_ws(p); } } @@ -1093,16 +1131,16 @@ xact_t * instance_t::parse_xact(char * line, // Parse the description text if (next && *next) { - curr->payee = next; + xact->payee = next; next = next_element(next, true); } else { - curr->payee = _("<Unspecified payee>"); + xact->payee = _("<Unspecified payee>"); } // Parse the xact note if (next && *next == ';') - curr->append_note(next, current_year); + xact->append_note(next, current_year); TRACE_STOP(xact_text, 1); @@ -1124,26 +1162,39 @@ xact_t * instance_t::parse_xact(char * line, if (last_post) item = last_post; else - item = curr.get(); + item = xact.get(); // This is a trailing note, and possibly a metadata info tag item->append_note(p + 1, current_year); item->end_pos = curr_pos; item->end_line++; - } - else if (post_t * post = parse_post(p, len - (p - line), account, - curr.get())) { - curr->add_post(post); - last_post = post; + } else { + reveal_context = false; + + if (post_t * post = + parse_post(p, len - (p - line), account, xact.get())) { + xact->add_post(post); + last_post = post; + } } } - curr->end_pos = curr_pos; - curr->end_line = linenum; + xact->end_pos = curr_pos; + xact->end_line = linenum; TRACE_STOP(xact_details, 1); - return curr.release(); + return xact.release(); + + } + catch (const std::exception& err) { + if (reveal_context) { + add_error_context(_("While parsing transaction:")); + add_error_context(source_context(xact->pathname, + xact->beg_pos, curr_pos, "> ")); + } + throw; + } } expr_t::ptr_op_t instance_t::lookup(const string& name) |