summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJohn Wiegley <johnw@newartisans.com>2009-10-25 04:38:43 -0400
committerJohn Wiegley <johnw@newartisans.com>2009-10-25 05:01:47 -0400
commit26ae1fdfad62a15a0762c052ed9785f3c0d5be29 (patch)
tree291b803c7795da513661d06273b20f1dac2b0334 /src
parent5a970554b822d50a6454b8a2e1434e248773adfd (diff)
downloadfork-ledger-26ae1fdfad62a15a0762c052ed9785f3c0d5be29.tar.gz
fork-ledger-26ae1fdfad62a15a0762c052ed9785f3c0d5be29.tar.bz2
fork-ledger-26ae1fdfad62a15a0762c052ed9785f3c0d5be29.zip
New valexpr functions: id, idstring, magnitude
id returns a unique SHA1 id of a transaction. idstring is the string that the SHA1 is based on. magnitude is the sum of the positive side of a transaction.
Diffstat (limited to 'src')
-rw-r--r--src/filters.cc15
-rw-r--r--src/utils.h13
-rw-r--r--src/xact.cc39
3 files changed, 52 insertions, 15 deletions
diff --git a/src/filters.cc b/src/filters.cc
index 5b087eea..08e7a22f 100644
--- a/src/filters.cc
+++ b/src/filters.cc
@@ -133,21 +133,6 @@ void sort_posts::post_accumulated_posts()
posts.clear();
}
-namespace {
- string to_hex(uint_least32_t * message_digest)
- {
- std::ostringstream buf;
-
- for(int i = 0; i < 5 ; i++) {
- buf.width(8);
- buf.fill('0');
- buf << std::hex << message_digest[i];
- break; // only output the first dword
- }
- return buf.str();
- }
-}
-
void anonymize_posts::operator()(post_t& post)
{
SHA1 sha;
diff --git a/src/utils.h b/src/utils.h
index 7042ddf6..7f5ca017 100644
--- a/src/utils.h
+++ b/src/utils.h
@@ -594,6 +594,19 @@ inline char peek_next_nonws(std::istream& in) {
*_p = '\0'; \
}
+inline string to_hex(uint_least32_t * message_digest)
+{
+ std::ostringstream buf;
+
+ for(int i = 0; i < 5 ; i++) {
+ buf.width(8);
+ buf.fill('0');
+ buf << std::hex << message_digest[i];
+ break; // only output the first dword
+ }
+ return buf.str();
+}
+
extern const string version;
} // namespace ledger
diff --git a/src/xact.cc b/src/xact.cc
index bd8a5955..175a1467 100644
--- a/src/xact.cc
+++ b/src/xact.cc
@@ -352,6 +352,33 @@ void xact_t::add_post(post_t * post)
}
namespace {
+ value_t get_magnitude(xact_t& xact) {
+ balance_t halfbal;
+ foreach (post_t * post, xact.posts)
+ if (post->amount.sign() > 0)
+ halfbal += post->amount.number();
+ return halfbal;
+ }
+
+ value_t get_idstring(xact_t& xact) {
+ std::ostringstream buf;
+ buf << *xact._date;
+ buf << xact.payee;
+
+ get_magnitude(xact).print(buf);
+
+ return string_value(buf.str());
+ }
+ value_t get_id(xact_t& xact) {
+ SHA1 sha;
+ sha.Reset();
+ sha << get_idstring(xact).as_string().c_str();
+
+ uint_least32_t message_digest[5];
+ sha.Result(message_digest);
+ return string_value(to_hex(message_digest));
+ }
+
value_t get_code(xact_t& xact) {
if (xact.code)
return string_value(*xact.code);
@@ -377,6 +404,18 @@ expr_t::ptr_op_t xact_t::lookup(const string& name)
return WRAP_FUNCTOR(get_wrapper<&get_code>);
break;
+ case 'i':
+ if (name == "id")
+ return WRAP_FUNCTOR(get_wrapper<&get_id>);
+ else if (name == "idstring")
+ return WRAP_FUNCTOR(get_wrapper<&get_idstring>);
+ break;
+
+ case 'm':
+ if (name == "magnitude")
+ return WRAP_FUNCTOR(get_wrapper<&get_magnitude>);
+ break;
+
case 'p':
if (name[1] == '\0' || name == "payee")
return WRAP_FUNCTOR(get_wrapper<&get_payee>);