Added the capability for value expression regexps targetted at

specific parts of a transaction: c// (entry code), p// (payee), w//
(short account name), W// (full account name), and e// (transaction
note).
This commit is contained in:
John Wiegley 2005-02-14 00:58:36 +00:00
parent ff48992067
commit 83f0d1455b
2 changed files with 65 additions and 15 deletions

View file

@ -233,6 +233,14 @@ void value_expr_t::compute(value_t& result, const details_t& details) const
break; break;
} }
case F_CODE_MASK:
assert(mask);
if (details.entry)
result = mask->match(details.entry->code);
else
result = false;
break;
case F_PAYEE_MASK: case F_PAYEE_MASK:
assert(mask); assert(mask);
if (details.entry) if (details.entry)
@ -241,6 +249,14 @@ void value_expr_t::compute(value_t& result, const details_t& details) const
result = false; result = false;
break; break;
case F_NOTE_MASK:
assert(mask);
if (details.xact)
result = mask->match(details.xact->note);
else
result = false;
break;
case F_ACCOUNT_MASK: case F_ACCOUNT_MASK:
assert(mask); assert(mask);
if (details.account) if (details.account)
@ -495,32 +511,54 @@ value_expr_t * parse_value_term(std::istream& in)
break; break;
// Other // Other
case 'c':
case 'p':
case 'w':
case 'W':
case 'e':
case '/': { case '/': {
bool payee_mask = false; bool code_mask = c == 'c';
bool short_account_mask = false; bool payee_mask = c == 'p';
bool note_mask = c == 'e';
bool short_account_mask = c == 'w';
c = peek_next_nonws(in);
if (c == '/') { if (c == '/') {
in.get(c); c = peek_next_nonws(in);
c = in.peek();
if (c == '/') { if (c == '/') {
in.get(c); in.get(c);
c = in.peek(); c = in.peek();
short_account_mask = true; if (c == '/') {
} else { in.get(c);
payee_mask = true; c = in.peek();
short_account_mask = true;
} else {
payee_mask = true;
}
} }
} else {
in.get(c);
} }
// Read in the regexp
READ_INTO(in, buf, 255, c, c != '/'); READ_INTO(in, buf, 255, c, c != '/');
if (c != '/') if (c != '/')
unexpected(c, '/'); unexpected(c, '/');
value_expr_t::kind_t kind;
if (short_account_mask)
kind = value_expr_t::F_SHORT_ACCOUNT_MASK;
else if (code_mask)
kind = value_expr_t::F_CODE_MASK;
else if (payee_mask)
kind = value_expr_t::F_PAYEE_MASK;
else if (note_mask)
kind = value_expr_t::F_NOTE_MASK;
else
kind = value_expr_t::F_ACCOUNT_MASK;
in.get(c); in.get(c);
node.reset(new value_expr_t(short_account_mask ? node.reset(new value_expr_t(kind));
value_expr_t::F_SHORT_ACCOUNT_MASK :
(payee_mask ? value_expr_t::F_PAYEE_MASK :
value_expr_t::F_ACCOUNT_MASK)));
node->mask = new mask_t(buf); node->mask = new mask_t(buf);
break; break;
} }
@ -825,19 +863,29 @@ void dump_value_expr(std::ostream& out, const value_expr_t * node)
out << ')'; out << ')';
break; break;
case value_expr_t::F_CODE_MASK:
assert(node->mask);
out << "M_CODE(" << node->mask->pattern << ')';
break;
case value_expr_t::F_PAYEE_MASK: case value_expr_t::F_PAYEE_MASK:
assert(node->mask); assert(node->mask);
out << "P_MASK(" << node->mask->pattern << ')'; out << "M_PAYEE(" << node->mask->pattern << ')';
break;
case value_expr_t::F_NOTE_MASK:
assert(node->mask);
out << "M_NOTE(" << node->mask->pattern << ')';
break; break;
case value_expr_t::F_ACCOUNT_MASK: case value_expr_t::F_ACCOUNT_MASK:
assert(node->mask); assert(node->mask);
out << "A_MASK(" << node->mask->pattern << ')'; out << "M_ACCT(" << node->mask->pattern << ')';
break; break;
case value_expr_t::F_SHORT_ACCOUNT_MASK: case value_expr_t::F_SHORT_ACCOUNT_MASK:
assert(node->mask); assert(node->mask);
out << "A_SMASK(" << node->mask->pattern << ')'; out << "M_SACCT(" << node->mask->pattern << ')';
break; break;
case value_expr_t::F_VALUE: case value_expr_t::F_VALUE:

View file

@ -69,7 +69,9 @@ struct value_expr_t
F_NEG, F_NEG,
F_ABS, F_ABS,
F_STRIP, F_STRIP,
F_CODE_MASK,
F_PAYEE_MASK, F_PAYEE_MASK,
F_NOTE_MASK,
F_ACCOUNT_MASK, F_ACCOUNT_MASK,
F_SHORT_ACCOUNT_MASK, F_SHORT_ACCOUNT_MASK,
F_INTERP_FUNC, F_INTERP_FUNC,