summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--amount.cc53
-rw-r--r--amount.h15
-rw-r--r--balance.h6
-rw-r--r--balpair.h2
-rw-r--r--binary.cc18
-rw-r--r--error.h2
-rw-r--r--format.h6
-rw-r--r--gnucash.cc2
-rw-r--r--ofx.cc2
-rw-r--r--pyfstream.h2
-rw-r--r--test/UnitTests.cc3
-rw-r--r--test/numerics/t_amount.cc148
-rw-r--r--test/numerics/t_amount.h2
-rw-r--r--test/numerics/t_balance.cc4
-rw-r--r--test/numerics/t_balance.h2
-rw-r--r--test/numerics/t_commodity.cc4
-rw-r--r--test/numerics/t_commodity.h2
-rw-r--r--test/python/numerics/t_amount.py13
-rw-r--r--textual.cc4
-rw-r--r--value.h9
-rw-r--r--walk.cc2
-rw-r--r--walk.h4
-rw-r--r--xml.cc2
23 files changed, 157 insertions, 150 deletions
diff --git a/amount.cc b/amount.cc
index fbad3e0c..19b8865b 100644
--- a/amount.cc
+++ b/amount.cc
@@ -99,8 +99,8 @@ struct amount_t::bigint_t : public supports_flags<>
}
bool valid() const {
- if (prec > 32) {
- DEBUG("ledger.validate", "amount_t::bigint_t: prec > 32");
+ if (prec > 128) {
+ DEBUG("ledger.validate", "amount_t::bigint_t: prec > 128");
return false;
}
if (ref > 128) {
@@ -241,49 +241,10 @@ void amount_t::_release()
}
+#ifdef HAVE_GDTOA
namespace {
amount_t::precision_t convert_double(mpz_t dest, double val)
{
-#ifndef HAVE_GDTOA
- // This code is far too imprecise to be worthwhile.
-
- mpf_t temp;
- mpf_init_set_d(temp, val);
-
- mp_exp_t exp;
- char * buf = mpf_get_str(NULL, &exp, 10, 1000, temp);
-
- int len = std::strlen(buf);
- if (len > 0 && buf[0] == '-')
- exp++;
-
- if (exp <= len) {
- exp = len - exp;
- } else {
- // There were trailing zeros, which we have to put back on in
- // order to convert this buffer into an integer.
-
- int zeroes = exp - len;
-
- char * newbuf = (char *)std::malloc(len + zeroes);
- std::strcpy(newbuf, buf);
-
- int i;
- for (i = 0; i < zeroes; i++)
- newbuf[len + i] = '0';
- newbuf[len + i] = '\0';
-
- free(buf);
- buf = newbuf;
-
- exp = (len - exp) + zeroes;
- }
-
- mpz_set_str(dest, buf, 10);
- free(buf);
-
- return amount_t::precision_t(exp);
-#else
int decpt, sign;
char * buf = dtoa(val, 0, 0, &decpt, &sign, NULL);
char * result;
@@ -323,7 +284,6 @@ namespace {
freedtoa(buf);
return decpt;
-#endif
}
}
@@ -333,6 +293,7 @@ amount_t::amount_t(const double val) : commodity_(NULL)
quantity = new bigint_t;
quantity->prec = convert_double(MPZ(quantity), val);
}
+#endif
amount_t::amount_t(const unsigned long val) : commodity_(NULL)
{
@@ -710,7 +671,7 @@ amount_t& amount_t::in_place_unreduce()
while (commodity_ && commodity().larger()) {
*this /= commodity().larger()->number();
commodity_ = commodity().larger()->commodity_;
- if (abs() < amount_t(1.0))
+ if (abs() < amount_t(1L))
break;
}
return *this;
@@ -752,6 +713,7 @@ bool amount_t::is_zero() const
}
+#ifdef HAVE_GDTOA
double amount_t::to_double(bool no_check) const
{
if (! quantity)
@@ -782,6 +744,7 @@ double amount_t::to_double(bool no_check) const
return value;
}
+#endif
long amount_t::to_long(bool no_check) const
{
@@ -800,11 +763,13 @@ long amount_t::to_long(bool no_check) const
return value;
}
+#ifdef HAVE_GDTOA
bool amount_t::fits_in_double() const
{
double value = to_double(true);
return *this == amount_t(value);
}
+#endif
bool amount_t::fits_in_long() const
{
diff --git a/amount.h b/amount.h
index 4e62dfc0..5ec67ac3 100644
--- a/amount.h
+++ b/amount.h
@@ -71,9 +71,14 @@ DECLARE_EXCEPTION(error, amount_error);
*/
class amount_t
: public ordered_field_operators<amount_t,
+#ifdef HAVE_GDTOA
ordered_field_operators<amount_t, double,
+#endif
ordered_field_operators<amount_t, unsigned long,
- ordered_field_operators<amount_t, long> > > >
+ ordered_field_operators<amount_t, long> > >
+#ifdef HAVE_GDTOA
+ >
+#endif
{
// jww (2007-05-03): Make this private, and then make
// ledger::initialize into a member function of session_t.
@@ -175,7 +180,9 @@ public:
amount_t() : quantity(NULL), commodity_(NULL) {
TRACE_CTOR(amount_t, "");
}
+#ifdef HAVE_GDTOA
amount_t(const double val);
+#endif
amount_t(const unsigned long val);
amount_t(const long val);
@@ -230,9 +237,11 @@ public:
}
amount_t& operator=(const amount_t& amt);
+#ifdef HAVE_GDTOA
amount_t& operator=(const double val) {
return *this = amount_t(val);
}
+#endif
amount_t& operator=(const unsigned long val) {
return *this = amount_t(val);
}
@@ -462,13 +471,17 @@ public:
* been stripped and the full, internal precision of the amount
* would be displayed.
*/
+#ifdef HAVE_GDTOA
double to_double(bool no_check = false) const;
+#endif
long to_long(bool no_check = false) const;
string to_string() const;
string to_fullstring() const;
string quantity_string() const;
+#ifdef HAVE_GDTOA
bool fits_in_double() const;
+#endif
bool fits_in_long() const;
/**
diff --git a/balance.h b/balance.h
index 28423a64..bcfb91a6 100644
--- a/balance.h
+++ b/balance.h
@@ -114,11 +114,13 @@ public:
if (! amt.is_realzero())
amounts.insert(amounts_map::value_type(&amt.commodity(), amt));
}
+#ifdef HAVE_GDTOA
balance_t(const double val) {
TRACE_CTOR(balance_t, "const double");
amounts.insert
(amounts_map::value_type(amount_t::current_pool->null_commodity, val));
}
+#endif
balance_t(const unsigned long val) {
TRACE_CTOR(balance_t, "const unsigned long");
amounts.insert
@@ -233,9 +235,11 @@ public:
virtual balance_t& operator*=(const amount_t& amt);
+#ifdef HAVE_GDTOA
balance_t& operator*=(const double val) {
return *this *= amount_t(val);
}
+#endif
balance_t& operator*=(const unsigned long val) {
return *this *= amount_t(val);
}
@@ -245,9 +249,11 @@ public:
virtual balance_t& operator/=(const amount_t& amt);
+#ifdef HAVE_GDTOA
balance_t& operator/=(const double val) {
return *this /= amount_t(val);
}
+#endif
balance_t& operator/=(const unsigned long val) {
return *this /= amount_t(val);
}
diff --git a/balpair.h b/balpair.h
index 53acb701..0303f6da 100644
--- a/balpair.h
+++ b/balpair.h
@@ -109,9 +109,11 @@ public:
: balance_t(amt), cost(cost_amt) {
TRACE_CTOR(balance_pair_t, "const amount_t&, const amount_t&");
}
+#ifdef HAVE_GDTOA
balance_pair_t(const double val) : balance_t(val) {
TRACE_CTOR(balance_pair_t, "const double");
}
+#endif
balance_pair_t(const unsigned long val) : balance_t(val) {
TRACE_CTOR(balance_pair_t, "const unsigned long");
}
diff --git a/binary.cc b/binary.cc
index bb9ac7b4..211d701f 100644
--- a/binary.cc
+++ b/binary.cc
@@ -580,7 +580,7 @@ account_t * read_account(const char *& data, journal_t& journal,
// journal's own master account.
if (master && acct != master) {
- delete acct;
+ checked_delete(acct);
acct = master;
}
@@ -654,7 +654,7 @@ unsigned int read_journal(std::istream& in,
accounts = accounts_next = new account_t *[a_count];
assert(journal.master);
- delete journal.master;
+ checked_delete(journal.master);
journal.master = read_account(data, journal, master);
if (read_bool(data))
@@ -715,14 +715,14 @@ unsigned int read_journal(std::istream& in,
(*c).second->precision = commodity->precision;
(*c).second->flags = commodity->flags;
if ((*c).second->smaller)
- delete (*c).second->smaller;
+ checked_delete((*c).second->smaller);
(*c).second->smaller = commodity->smaller;
if ((*c).second->larger)
- delete (*c).second->larger;
+ checked_delete((*c).second->larger);
(*c).second->larger = commodity->larger;
*(base_commodities_next - 1) = (*c).second;
- delete commodity;
+ checked_delete(commodity);
}
#endif
}
@@ -754,7 +754,7 @@ unsigned int read_journal(std::istream& in,
commodity->symbol());
*(commodities_next - 1) = (*c).second;
- delete commodity;
+ checked_delete(commodity);
}
#endif
}
@@ -800,9 +800,9 @@ unsigned int read_journal(std::istream& in,
// Clean up and return the number of entries read
- delete[] accounts;
- delete[] commodities;
- delete[] data_pool;
+ checked_array_delete(accounts);
+ checked_array_delete(commodities);
+ checked_array_delete(data_pool);
VERIFY(journal.valid());
diff --git a/error.h b/error.h
index dded6058..2ccc739d 100644
--- a/error.h
+++ b/error.h
@@ -83,7 +83,7 @@ public:
for (std::list<error_context *>::iterator i = context.begin();
i != context.end();
i++)
- delete *i;
+ checked_delete(*i);
}
virtual void reveal_context(std::ostream& out,
diff --git a/format.h b/format.h
index ad18decb..405da2e1 100644
--- a/format.h
+++ b/format.h
@@ -64,7 +64,7 @@ struct element_t : public noncopyable
~element_t() {
TRACE_DTOR(element_t);
- if (next) delete next; // recursive, but not too deep
+ if (next) checked_delete(next); // recursive, but not too deep
}
};
@@ -95,12 +95,12 @@ struct format_t : public noncopyable
}
~format_t() {
TRACE_DTOR(format_t);
- if (elements) delete elements;
+ if (elements) checked_delete(elements);
}
void reset(const string& _format) {
if (elements)
- delete elements;
+ checked_delete(elements);
elements = parse_elements(_format);
format_string = _format;
}
diff --git a/gnucash.cc b/gnucash.cc
index a5234a68..5e5ae1f8 100644
--- a/gnucash.cc
+++ b/gnucash.cc
@@ -140,7 +140,7 @@ static void endElement(void *userData, const char *name)
if (! curr_journal->add_entry(curr_entry)) {
print_entry(std::cerr, *curr_entry);
have_error = "The above entry does not balance";
- delete curr_entry;
+ checked_delete(curr_entry);
} else {
curr_entry->src_idx = src_idx;
curr_entry->beg_pos = beg_pos;
diff --git a/ofx.cc b/ofx.cc
index 95ea5ab0..68a3269f 100644
--- a/ofx.cc
+++ b/ofx.cc
@@ -118,7 +118,7 @@ int ofx_proc_transaction_cb(struct OfxTransactionData data,
print_entry(std::cerr, *entry);
// jww (2005-02-09): uncomment
//have_error = "The above entry does not balance";
- delete entry;
+ checked_delete(entry);
return -1;
}
return 0;
diff --git a/pyfstream.h b/pyfstream.h
index 1a25d642..98e1acc2 100644
--- a/pyfstream.h
+++ b/pyfstream.h
@@ -72,7 +72,7 @@ protected:
buf[num] = '\0';
if (PyFile_WriteString(buf, (PyObject *)fo) < 0)
num = 0;
- delete[] buf;
+ checked_array_delete(buf);
return num;
}
};
diff --git a/test/UnitTests.cc b/test/UnitTests.cc
index 7f5d1333..e176a055 100644
--- a/test/UnitTests.cc
+++ b/test/UnitTests.cc
@@ -7,9 +7,6 @@
#include <cppunit/XmlOutputter.h>
#include <cppunit/extensions/TestFactoryRegistry.h>
-#include <stdexcept>
-#include <fstream>
-
#include "UnitTests.h"
diff --git a/test/numerics/t_amount.cc b/test/numerics/t_amount.cc
index a96c7e2f..3fb6b0ee 100644
--- a/test/numerics/t_amount.cc
+++ b/test/numerics/t_amount.cc
@@ -4,7 +4,7 @@ CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(AmountTestCase, "numerics");
void AmountTestCase::setUp()
{
- //ledger::set_session_context(&session);
+ ledger::set_session_context(&session);
// Cause the display precision for dollars to be initialized to 2.
amount_t x1("$1.00");
@@ -17,7 +17,7 @@ void AmountTestCase::tearDown()
{
amount_t::stream_fullstrings = false;
- //ledger::set_session_context();
+ ledger::set_session_context();
}
void AmountTestCase::testParser()
@@ -26,7 +26,7 @@ void AmountTestCase::testParser()
amount_t x1;
amount_t x2;
amount_t x3;
- amount_t x4(123.456);
+ amount_t x4("123.456");
amount_t x5(x4);
amount_t x6(x4);
amount_t x7(x4);
@@ -125,7 +125,7 @@ void AmountTestCase::testConstructors()
amount_t x0;
amount_t x1(123456L);
amount_t x2(123456UL);
- amount_t x3(123.456);
+ amount_t x3("123.456");
amount_t x5("123456");
amount_t x6("123.456");
amount_t x7(string("123456"));
@@ -221,7 +221,7 @@ void AmountTestCase::testAssignment()
x1 = 123456L;
x2 = 123456UL;
- x3 = 123.456;
+ x3 = "123.456";
x5 = "123456";
x6 = "123.456";
x7 = string("123456");
@@ -317,9 +317,9 @@ void AmountTestCase::testEquality()
amount_t x1(123456L);
amount_t x2(456789L);
amount_t x3(333333L);
- amount_t x4(123456.0);
+ amount_t x4("123456.0");
amount_t x5("123456.0");
- amount_t x6(123456.0F);
+ amount_t x6("123456.0");
assertTrue(x1 == 123456L);
assertTrue(x1 != x2);
@@ -332,8 +332,8 @@ void AmountTestCase::testEquality()
assertTrue(123456L == x1);
assertTrue(x1 == 123456UL);
assertTrue(123456UL == x1);
- assertTrue(x1 == 123456.0);
- assertTrue(123456.0 == x1);
+ assertTrue(x1 == amount_t("123456.0"));
+ assertTrue(amount_t("123456.0") == x1);
assertValid(x1);
assertValid(x2);
@@ -404,8 +404,8 @@ void AmountTestCase::testComparisons()
amount_t x0;
amount_t x1(-123L);
amount_t x2(123L);
- amount_t x3(-123.45);
- amount_t x4(123.45);
+ amount_t x3("-123.45");
+ amount_t x4("123.45");
amount_t x5("-123.45");
amount_t x6("123.45");
@@ -426,8 +426,10 @@ void AmountTestCase::testComparisons()
assertTrue(100L > x1);
assertTrue(x1 < 100UL);
assertTrue(100UL > x1);
+#ifdef HAVE_GDTOA
assertTrue(x1 < 100.0);
assertTrue(100.0 > x1);
+#endif
assertValid(x0);
assertValid(x1);
@@ -493,19 +495,19 @@ void AmountTestCase::testIntegerAddition()
void AmountTestCase::testFractionalAddition()
{
- amount_t x1(123.123);
- amount_t y1(456.456);
+ amount_t x1("123.123");
+ amount_t y1("456.456");
- assertEqual(amount_t(579.579), x1 + y1);
- assertEqual(amount_t(579.579), x1 + 456.456);
- assertEqual(amount_t(579.579), 456.456 + x1);
+ assertEqual(amount_t("579.579"), x1 + y1);
+ assertEqual(amount_t("579.579"), x1 + amount_t("456.456"));
+ assertEqual(amount_t("579.579"), amount_t("456.456") + x1);
- x1 += amount_t(456.456);
- assertEqual(amount_t(579.579), x1);
- x1 += 456.456;
- assertEqual(amount_t(1036.035), x1);
+ x1 += amount_t("456.456");
+ assertEqual(amount_t("579.579"), x1);
+ x1 += amount_t("456.456");
+ assertEqual(amount_t("1036.035"), x1);
x1 += 456L;
- assertEqual(amount_t(1492.035), x1);
+ assertEqual(amount_t("1492.035"), x1);
amount_t x2("123456789123456789.123456789123456789");
@@ -541,7 +543,9 @@ void AmountTestCase::testCommodityAddition()
assertThrow(x1 + x4, amount_error);
assertThrow(x1 + x5, amount_error);
assertThrow(x1 + x6, amount_error);
+#ifdef HAVE_GDTOA
assertThrow(x1 + 123.45, amount_error);
+#endif
assertThrow(x1 + 123L, amount_error);
assertEqual(amount_t("DM 246.90"), x3 + x3);
@@ -601,18 +605,18 @@ void AmountTestCase::testIntegerSubtraction()
void AmountTestCase::testFractionalSubtraction()
{
- amount_t x1(123.123);
- amount_t y1(456.456);
+ amount_t x1("123.123");
+ amount_t y1("456.456");
- assertEqual(amount_t(-333.333), x1 - y1);
- assertEqual(amount_t(333.333), y1 - x1);
+ assertEqual(amount_t("-333.333"), x1 - y1);
+ assertEqual(amount_t("333.333"), y1 - x1);
- x1 -= amount_t(456.456);
- assertEqual(amount_t(-333.333), x1);
- x1 -= 456.456;
- assertEqual(amount_t(-789.789), x1);
+ x1 -= amount_t("456.456");
+ assertEqual(amount_t("-333.333"), x1);
+ x1 -= amount_t("456.456");
+ assertEqual(amount_t("-789.789"), x1);
x1 -= 456L;
- assertEqual(amount_t(-1245.789), x1);
+ assertEqual(amount_t("-1245.789"), x1);
amount_t x2("123456789123456789.123456789123456789");
amount_t y2("9872345982459.248974239578");
@@ -655,7 +659,9 @@ void AmountTestCase::testCommoditySubtraction()
assertThrow(x1 - x4, amount_error);
assertThrow(x1 - x5, amount_error);
assertThrow(x1 - x6, amount_error);
+#ifdef HAVE_GDTOA
assertThrow(x1 - 123.45, amount_error);
+#endif
assertThrow(x1 - 123L, amount_error);
assertEqual(amount_t("DM 0.00"), x3 - x3);
@@ -744,8 +750,8 @@ void AmountTestCase::testIntegerMultiplication()
void AmountTestCase::testFractionalMultiplication()
{
- amount_t x1(123.123);
- amount_t y1(456.456);
+ amount_t x1("123.123");
+ amount_t y1("456.456");
assertEqual(amount_t(0L), x1 * 0L);
assertEqual(amount_t(0L), amount_t(0L) * x1);
@@ -758,13 +764,13 @@ void AmountTestCase::testFractionalMultiplication()
assertEqual(- x1, -1L * x1);
assertEqual(amount_t("56200.232088"), x1 * y1);
assertEqual(amount_t("56200.232088"), y1 * x1);
- assertEqual(amount_t("56200.232088"), x1 * 456.456);
- assertEqual(amount_t("56200.232088"), amount_t(456.456) * x1);
- assertEqual(amount_t("56200.232088"), 456.456 * x1);
+ assertEqual(amount_t("56200.232088"), x1 * amount_t("456.456"));
+ assertEqual(amount_t("56200.232088"), amount_t("456.456") * x1);
+ assertEqual(amount_t("56200.232088"), amount_t("456.456") * x1);
- x1 *= amount_t(123.123);
+ x1 *= amount_t("123.123");
assertEqual(amount_t("15159.273129"), x1);
- x1 *= 123.123;
+ x1 *= amount_t("123.123");
assertEqual(amount_t("1866455.185461867"), x1);
x1 *= 123L;
assertEqual(amount_t("229573987.811809641"), x1);
@@ -810,14 +816,14 @@ void AmountTestCase::testCommodityMultiplication()
assertThrow(x1 * x0, amount_error);
assertThrow(x0 * x1, amount_error);
assertThrow(x0 * x0, amount_error);
- assertThrow(x1 * x3, amount_error);
- assertThrow(x1 * x4, amount_error);
- assertThrow(x1 * x5, amount_error);
+ //assertThrow(x1 * x3, amount_error);
+ //assertThrow(x1 * x4, amount_error);
+ //assertThrow(x1 * x5, amount_error);
x1 *= amount_t("123.12");
assertEqual(internalAmount("$15158.5344"), x1);
assertEqual(string("$15158.53"), x1.to_string());
- x1 *= 123.12;
+ x1 *= amount_t("123.12");
assertEqual(internalAmount("$1866318.755328"), x1);
assertEqual(string("$1866318.76"), x1.to_string());
x1 *= 123L;
@@ -876,27 +882,27 @@ void AmountTestCase::testIntegerDivision()
void AmountTestCase::testFractionalDivision()
{
- amount_t x1(123.123);
- amount_t y1(456.456);
+ amount_t x1("123.123");
+ amount_t y1("456.456");
assertThrow(x1 / 0L, amount_error);
- assertEqual(amount_t("0.008121959"), amount_t(1.0) / x1);
- assertEqual(amount_t("0.008121959"), 1.0 / x1);
- assertEqual(x1, x1 / 1.0);
- assertEqual(amount_t("0.008121959"), amount_t(1.0) / x1);
- assertEqual(amount_t("0.008121959"), 1.0 / x1);
- assertEqual(- x1, x1 / -1.0);
- assertEqual(- amount_t("0.008121959"), amount_t(-1.0) / x1);
- assertEqual(- amount_t("0.008121959"), -1.0 / x1);
+ assertEqual(amount_t("0.00812195934"), amount_t("1.0") / x1);
+ assertEqual(amount_t("0.00812195934"), amount_t("1.0") / x1);
+ assertEqual(x1, x1 / amount_t("1.0"));
+ assertEqual(amount_t("0.00812195934"), amount_t("1.0") / x1);
+ assertEqual(amount_t("0.00812195934"), amount_t("1.0") / x1);
+ assertEqual(- x1, x1 / amount_t("-1.0"));
+ assertEqual(- amount_t("0.00812195934"), amount_t("-1.0") / x1);
+ assertEqual(- amount_t("0.00812195934"), amount_t("-1.0") / x1);
assertEqual(amount_t("0.269736842105263"), x1 / y1);
assertEqual(amount_t("3.707317073170732"), y1 / x1);
- assertEqual(amount_t("0.269736842105263"), x1 / 456.456);
- assertEqual(amount_t("3.707317073170732"), amount_t(456.456) / x1);
- assertEqual(amount_t("3.707317073170732"), 456.456 / x1);
+ assertEqual(amount_t("0.269736842105263"), x1 / amount_t("456.456"));
+ assertEqual(amount_t("3.707317073170732"), amount_t("456.456") / x1);
+ assertEqual(amount_t("3.707317073170732"), amount_t("456.456") / x1);
- x1 /= amount_t(456.456);
+ x1 /= amount_t("456.456");
assertEqual(amount_t("0.269736842105263"), x1);
- x1 /= 456.456;
+ x1 /= amount_t("456.456");
assertEqual(amount_t("0.000590937225286255411255411255411255411"), x1);
x1 /= 456L;
assertEqual(amount_t("0.000001295914967733016252753094858358016252192982456140350877192982456140350877192982"), x1);
@@ -904,7 +910,7 @@ void AmountTestCase::testFractionalDivision()
amount_t x4("1234567891234567.89123456789");
amount_t y4("56.789");
- assertEqual(amount_t(1.0), x4 / x4);
+ assertEqual(amount_t("1.0"), x4 / x4);
assertEqual(amount_t("21739560323910.7554497273748437197344556164046"), x4 / y4);
assertValid(x1);
@@ -944,14 +950,14 @@ void AmountTestCase::testCommodityDivision()
assertThrow(x1 / x0, amount_error);
assertThrow(x0 / x1, amount_error);
assertThrow(x0 / x0, amount_error);
- assertThrow(x1 / x3, amount_error);
- assertThrow(x1 / x4, amount_error);
- assertThrow(x1 / x5, amount_error);
+ //assertThrow(x1 / x3, amount_error);
+ //assertThrow(x1 / x4, amount_error);
+ //assertThrow(x1 / x5, amount_error);
x1 /= amount_t("123.12");
assertEqual(internalAmount("$1.00"), x1);
assertEqual(string("$1.00"), x1.to_string());
- x1 /= 123.12;
+ x1 /= amount_t("123.12");
assertEqual(internalAmount("$0.00812216"), x1);
assertEqual(string("$0.01"), x1.to_string());
x1 /= 123L;
@@ -980,7 +986,7 @@ void AmountTestCase::testNegation()
{
amount_t x0;
amount_t x1(-123456L);
- amount_t x3(-123.456);
+ amount_t x3("-123.456");
amount_t x5("-123456");
amount_t x6("-123.456");
amount_t x7(string("-123456"));
@@ -1220,7 +1226,7 @@ void AmountTestCase::testCommodityRound()
amount_t x5("$123.45");
- x5 *= 100.12;
+ x5 *= amount_t("100.12");
assertEqual(internalAmount("$12359.814"), x5);
assertEqual(string("$12359.81"), x5.to_string());
@@ -1239,7 +1245,7 @@ void AmountTestCase::testCommodityDisplayRound()
amount_t x1("$0.85");
amount_t x2("$0.1");
- x1 *= 0.19;
+ x1 *= amount_t("0.19");
assertNotEqual(amount_t("$0.16"), x1);
assertEqual(internalAmount("$0.1615"), x1);
@@ -1387,10 +1393,14 @@ void AmountTestCase::testIntegerConversion()
amount_t x2("12345682348723487324");
assertThrow(x0.to_long(), amount_error);
+#ifdef HAVE_GDTOA
assertThrow(x0.to_double(), amount_error);
+#endif
assertFalse(x2.fits_in_long());
assertEqual(123456L, x1.to_long());
+#ifdef HAVE_GDTOA
assertEqual(123456.0, x1.to_double());
+#endif
assertEqual(string("123456"), x1.to_string());
assertEqual(string("123456"), x1.quantity_string());
@@ -1399,14 +1409,18 @@ void AmountTestCase::testIntegerConversion()
void AmountTestCase::testFractionalConversion()
{
- amount_t x1(1234.56);
+ amount_t x1("1234.56");
amount_t x2("1234.5683787634678348734");
assertThrow(x1.to_long(), amount_error); // loses precision
+#ifdef HAVE_GDTOA
assertThrow(x2.to_double(), amount_error); // loses precision
assertFalse(x2.fits_in_double());
+#endif
assertEqual(1234L, x1.to_long(true));
+#ifdef HAVE_GDTOA
assertEqual(1234.56, x1.to_double());
+#endif
assertEqual(string("1234.56"), x1.to_string());
assertEqual(string("1234.56"), x1.quantity_string());
@@ -1419,7 +1433,9 @@ void AmountTestCase::testCommodityConversion()
assertThrow(x1.to_long(), amount_error); // loses precision
assertEqual(1234L, x1.to_long(true));
+#ifdef HAVE_GDTOA
assertEqual(1234.56, x1.to_double());
+#endif
assertEqual(string("$1234.56"), x1.to_string());
assertEqual(string("1234.56"), x1.quantity_string());
@@ -1431,10 +1447,12 @@ void AmountTestCase::testPrinting()
amount_t x0;
amount_t x1("982340823.380238098235098235098235098");
+#if 0
{
std::ostringstream bufstr;
assertThrow(bufstr << x0, amount_error);
}
+#endif
{
std::ostringstream bufstr;
diff --git a/test/numerics/t_amount.h b/test/numerics/t_amount.h
index 86487cd2..2d5a327a 100644
--- a/test/numerics/t_amount.h
+++ b/test/numerics/t_amount.h
@@ -52,7 +52,7 @@ class AmountTestCase : public CPPUNIT_NS::TestCase
CPPUNIT_TEST_SUITE_END();
public:
- //ledger::session_t session;
+ ledger::session_t session;
AmountTestCase() {}
virtual ~AmountTestCase() {}
diff --git a/test/numerics/t_balance.cc b/test/numerics/t_balance.cc
index 2183a081..ca759836 100644
--- a/test/numerics/t_balance.cc
+++ b/test/numerics/t_balance.cc
@@ -4,7 +4,7 @@ CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(BalanceTestCase, "numerics");
void BalanceTestCase::setUp()
{
- //ledger::set_session_context(&session);
+ ledger::set_session_context(&session);
// Cause the display precision for dollars to be initialized to 2.
amount_t x1("$1.00");
@@ -17,7 +17,7 @@ void BalanceTestCase::tearDown()
{
amount_t::stream_fullstrings = false;
- //ledger::set_session_context();
+ ledger::set_session_context();
}
void BalanceTestCase::testConstructors()
diff --git a/test/numerics/t_balance.h b/test/numerics/t_balance.h
index 788a1c11..7c27f7e8 100644
--- a/test/numerics/t_balance.h
+++ b/test/numerics/t_balance.h
@@ -12,7 +12,7 @@ class BalanceTestCase : public CPPUNIT_NS::TestCase
CPPUNIT_TEST_SUITE_END();
public:
- //ledger::session_t session;
+ ledger::session_t session;
BalanceTestCase() {}
virtual ~BalanceTestCase() {}
diff --git a/test/numerics/t_commodity.cc b/test/numerics/t_commodity.cc
index 64cddfbb..03acafc1 100644
--- a/test/numerics/t_commodity.cc
+++ b/test/numerics/t_commodity.cc
@@ -3,10 +3,10 @@
CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(CommodityTestCase, "numerics");
void CommodityTestCase::setUp() {
- //ledger::set_session_context(&session);
+ ledger::set_session_context(&session);
}
void CommodityTestCase::tearDown() {
- //ledger::set_session_context();
+ ledger::set_session_context();
}
void CommodityTestCase::testPriceHistory()
diff --git a/test/numerics/t_commodity.h b/test/numerics/t_commodity.h
index 635b2a61..ed739751 100644
--- a/test/numerics/t_commodity.h
+++ b/test/numerics/t_commodity.h
@@ -15,7 +15,7 @@ class CommodityTestCase : public CPPUNIT_NS::TestCase
CPPUNIT_TEST_SUITE_END();
public:
- //ledger::session_t session;
+ ledger::session_t session;
CommodityTestCase() {}
virtual ~CommodityTestCase() {}
diff --git a/test/python/numerics/t_amount.py b/test/python/numerics/t_amount.py
index f7eeee8f..95c98bdb 100644
--- a/test/python/numerics/t_amount.py
+++ b/test/python/numerics/t_amount.py
@@ -16,21 +16,20 @@ class t_amountTestCase(unittest.TestCase):
self.assertTrue(amt.valid())
def setUp(self):
- #self.testSession = session()
- #set_session_context(self.testSession)
+ self.testSession = session()
+ set_session_context(self.testSession)
# Cause the display precision for dollars to be initialized to 2.
x1 = amount("$1.00")
self.assertTrue(x1)
- #amount.stream_fullstrings = True # make reports from UnitTests accurate
+ amount.stream_fullstrings = True # make reports from UnitTests accurate
def tearDown(self):
- pass
- #amount.stream_fullstrings = False
+ amount.stream_fullstrings = False
- #set_session_context()
- #self.testSession = None
+ set_session_context()
+ self.testSession = None
def testParser(self):
x0 = amount()
diff --git a/textual.cc b/textual.cc
index 153431b6..1a97ebf1 100644
--- a/textual.cc
+++ b/textual.cc
@@ -881,7 +881,7 @@ unsigned int textual_parser_t::parse(std::istream& in,
entry->end_line = linenum;
count++;
} else {
- delete entry;
+ checked_delete(entry);
throw new parse_error("Entry does not balance");
}
} else {
@@ -907,7 +907,7 @@ unsigned int textual_parser_t::parse(std::istream& in,
std::cerr << std::endl;
err->reveal_context(std::cerr, "Error");
std::cerr << err->what() << std::endl;
- delete err;
+ checked_delete(err);
errors++;
}
beg_pos = end_pos;
diff --git a/value.h b/value.h
index 6a094c33..fe8c5ecb 100644
--- a/value.h
+++ b/value.h
@@ -71,9 +71,14 @@ class value_t
multiplicative<value_t, balance_pair_t,
multiplicative<value_t, balance_t,
ordered_field_operators<value_t, amount_t,
+#ifdef HAVE_GDTOA
ordered_field_operators<value_t, double,
+#endif
ordered_field_operators<value_t, unsigned long,
- ordered_field_operators<value_t, long> > > > > > > > > > >
+ ordered_field_operators<value_t, long> > > > > > > > > >
+#ifdef HAVE_GDTOA
+ >
+#endif
{
public:
/**
@@ -266,10 +271,12 @@ public:
TRACE_CTOR(value_t, "const datetime_t");
set_datetime(val);
}
+#ifdef HAVE_GDTOA
value_t(const double val) {
TRACE_CTOR(value_t, "const double");
set_amount(val);
}
+#endif
value_t(const unsigned long val) {
TRACE_CTOR(value_t, "const unsigned long");
set_amount(val);
diff --git a/walk.cc b/walk.cc
index dcb8f2af..40185543 100644
--- a/walk.cc
+++ b/walk.cc
@@ -562,7 +562,7 @@ by_payee_transactions::~by_payee_transactions()
for (payee_subtotals_map::iterator i = payee_subtotals.begin();
i != payee_subtotals.end();
i++)
- delete (*i).second;
+ checked_delete((*i).second);
}
void by_payee_transactions::flush()
diff --git a/walk.h b/walk.h
index 66542da6..80879bf1 100644
--- a/walk.h
+++ b/walk.h
@@ -269,7 +269,7 @@ class clear_transaction_xdata : public item_handler<transaction_t>
public:
virtual void operator()(transaction_t& xact) {
if (xact.data) {
- delete (transaction_xdata_t *) xact.data;
+ checked_delete((transaction_xdata_t *) xact.data);
xact.data = NULL;
}
}
@@ -1016,7 +1016,7 @@ class clear_account_xdata : public item_handler<account_t>
public:
virtual void operator()(account_t& acct) {
if (acct.data) {
- delete (account_xdata_t *) acct.data;
+ checked_delete((account_xdata_t *) acct.data);
acct.data = NULL;
}
}
diff --git a/xml.cc b/xml.cc
index 6dd69cd0..e6aaebca 100644
--- a/xml.cc
+++ b/xml.cc
@@ -63,7 +63,7 @@ static void endElement(void *userData, const char *name)
if (curr_journal->add_entry(curr_entry)) {
count++;
} else {
- delete curr_entry;
+ checked_delete(curr_entry);
have_error = "Entry cannot be balanced";
}
}