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:
parent
ff48992067
commit
83f0d1455b
2 changed files with 65 additions and 15 deletions
78
valexpr.cc
78
valexpr.cc
|
|
@ -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:
|
||||||
|
|
|
||||||
|
|
@ -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,
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue