(qif_parser_t::parse): Record the beginning and ending line/pos and
source index when reading QIF files.
This commit is contained in:
parent
2a690c7c47
commit
afa807a678
1 changed files with 25 additions and 1 deletions
26
qif.cc
26
qif.cc
|
|
@ -13,6 +13,7 @@ namespace ledger {
|
|||
|
||||
static char line[MAX_LINE + 1];
|
||||
static std::string path;
|
||||
static unsigned int src_idx;
|
||||
static unsigned int linenum;
|
||||
|
||||
static inline char * get_line(std::istream& in) {
|
||||
|
|
@ -53,9 +54,19 @@ unsigned int qif_parser_t::parse(std::istream& in,
|
|||
entry->add_transaction(xact);
|
||||
|
||||
path = journal->sources.back();
|
||||
src_idx = journal->sources.size() - 1;
|
||||
linenum = 1;
|
||||
|
||||
while (! in.eof()) {
|
||||
istream_pos_type beg_pos = 0;
|
||||
unsigned long beg_line = 0;
|
||||
|
||||
#define SET_BEG_POS_AND_LINE() \
|
||||
if (! beg_line) { \
|
||||
beg_pos = in.tellg(); \
|
||||
beg_line = linenum; \
|
||||
}
|
||||
|
||||
while (in.good() && ! in.eof()) {
|
||||
char c;
|
||||
in.get(c);
|
||||
switch (c) {
|
||||
|
|
@ -86,6 +97,7 @@ unsigned int qif_parser_t::parse(std::istream& in,
|
|||
break;
|
||||
|
||||
case 'D':
|
||||
SET_BEG_POS_AND_LINE();
|
||||
in >> line;
|
||||
if (! parse_date(line, &entry->date))
|
||||
throw parse_error(path, linenum, "Failed to parse date");
|
||||
|
|
@ -93,6 +105,7 @@ unsigned int qif_parser_t::parse(std::istream& in,
|
|||
|
||||
case 'T':
|
||||
case '$': {
|
||||
SET_BEG_POS_AND_LINE();
|
||||
in >> line;
|
||||
xact->amount.parse(line);
|
||||
|
||||
|
|
@ -113,6 +126,7 @@ unsigned int qif_parser_t::parse(std::istream& in,
|
|||
}
|
||||
|
||||
case 'C':
|
||||
SET_BEG_POS_AND_LINE();
|
||||
c = in.peek();
|
||||
if (c == '*' || c == 'X') {
|
||||
in.get(c);
|
||||
|
|
@ -121,6 +135,7 @@ unsigned int qif_parser_t::parse(std::istream& in,
|
|||
break;
|
||||
|
||||
case 'N':
|
||||
SET_BEG_POS_AND_LINE();
|
||||
if (std::isdigit(in.peek())) {
|
||||
in >> line;
|
||||
entry->code = line;
|
||||
|
|
@ -132,6 +147,7 @@ unsigned int qif_parser_t::parse(std::istream& in,
|
|||
case 'L':
|
||||
case 'S':
|
||||
case 'E': {
|
||||
SET_BEG_POS_AND_LINE();
|
||||
get_line(in);
|
||||
|
||||
switch (c) {
|
||||
|
|
@ -161,6 +177,7 @@ unsigned int qif_parser_t::parse(std::istream& in,
|
|||
}
|
||||
|
||||
case 'A':
|
||||
SET_BEG_POS_AND_LINE();
|
||||
// jww (2004-08-19): these are ignored right now
|
||||
get_line(in);
|
||||
break;
|
||||
|
|
@ -181,6 +198,11 @@ unsigned int qif_parser_t::parse(std::istream& in,
|
|||
entry->add_transaction(nxact);
|
||||
|
||||
if (journal->add_entry(entry.get())) {
|
||||
entry->src_idx = src_idx;
|
||||
entry->beg_pos = beg_pos;
|
||||
entry->beg_line = beg_line;
|
||||
entry->end_pos = in.tellg();
|
||||
entry->end_line = linenum;
|
||||
entry.release();
|
||||
count++;
|
||||
}
|
||||
|
|
@ -188,6 +210,8 @@ unsigned int qif_parser_t::parse(std::istream& in,
|
|||
entry.reset(new entry_t);
|
||||
xact = new transaction_t(master);
|
||||
entry->add_transaction(xact);
|
||||
|
||||
beg_line = 0; // reset for next entry
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue