summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDonald Lam <brainy.runt@gmail.com>2021-04-11 11:06:44 -0700
committerJohn Wiegley <johnw@newartisans.com>2021-05-02 11:35:33 -0700
commit4ba80c37c068dd1839101c6c1f8ceed49f696d5f (patch)
tree2de0e7cb110ba95986f069b5424289a4a82651ee
parent763a958094c6333bdd247e828300a3cff3c5d4de (diff)
downloadfork-ledger-4ba80c37c068dd1839101c6c1f8ceed49f696d5f.tar.gz
fork-ledger-4ba80c37c068dd1839101c6c1f8ceed49f696d5f.tar.bz2
fork-ledger-4ba80c37c068dd1839101c6c1f8ceed49f696d5f.zip
Fix amount tokenizer re: embedded minus sign.
An amount may have a (single) leading minus sign, but none after that. Bug #2001 (and #1809).
-rw-r--r--src/amount.cc11
-rw-r--r--test/regress/2001.test12
2 files changed, 21 insertions, 2 deletions
diff --git a/src/amount.cc b/src/amount.cc
index 788a140c..6baa903c 100644
--- a/src/amount.cc
+++ b/src/amount.cc
@@ -975,8 +975,15 @@ namespace {
{
char buf[256];
char c = peek_next_nonws(in);
- READ_INTO(in, buf, 255, c,
- std::isdigit(c) || c == '-' || c == '.' || c == ',');
+ int max = 255;
+ char *p = buf;
+ if (c == '-') {
+ *p++ = c;
+ max--;
+ in.get(c);
+ }
+ READ_INTO(in, p, max, c,
+ std::isdigit(c) || c == '.' || c == ',');
string::size_type len = std::strlen(buf);
while (len > 0 && ! std::isdigit(buf[len - 1])) {
diff --git a/test/regress/2001.test b/test/regress/2001.test
new file mode 100644
index 00000000..21c0fec8
--- /dev/null
+++ b/test/regress/2001.test
@@ -0,0 +1,12 @@
+2021/4/1 Was Already Working
+ Expenses:Something (3 - 1)
+ Assets:Cash
+
+2021/4/2 Now Fixed
+ Expenses:Something (3-1)
+ Assets:Cash
+
+test reg exp
+21-Apr-01 Was Already Working Expenses:Something 2 2
+21-Apr-02 Now Fixed Expenses:Something 2 4
+end test