summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--amount.cc4
-rw-r--r--format.cc6
-rw-r--r--main.cc2
-rw-r--r--textual.cc62
-rw-r--r--times.h16
-rw-r--r--value.cc10
-rw-r--r--walk.cc8
7 files changed, 53 insertions, 55 deletions
diff --git a/amount.cc b/amount.cc
index 4ed30087..d96913d3 100644
--- a/amount.cc
+++ b/amount.cc
@@ -102,8 +102,8 @@ struct amount_t::bigint_t : public supports_flags<>
DEBUG("ledger.validate", "amount_t::bigint_t: prec > 128");
return false;
}
- if (ref > 128) {
- DEBUG("ledger.validate", "amount_t::bigint_t: ref > 128");
+ if (ref > 16535) {
+ DEBUG("ledger.validate", "amount_t::bigint_t: ref > 16535");
return false;
}
#if 0
diff --git a/format.cc b/format.cc
index b1e5a8e2..1c919421 100644
--- a/format.cc
+++ b/format.cc
@@ -13,7 +13,7 @@ bool format_t::ansi_codes = false;
bool format_t::ansi_invert = false;
string format_t::truncate(const string& str, unsigned int width,
- const bool is_account)
+ const bool is_account)
{
const unsigned int len = str.length();
if (len <= width)
@@ -735,10 +735,12 @@ void format_t::format(std::ostream& out_str, scope_t& scope) const
}
break;
+#endif
case element_t::SPACER:
out << " ";
break;
+#if 0
case element_t::DEPTH_SPACER:
for (const account_t * acct = details.account;
acct;
@@ -761,7 +763,7 @@ void format_t::format(std::ostream& out_str, scope_t& scope) const
string temp = out.str();
if (! ignore_max_width &&
elem->max_width > 0 && elem->max_width < temp.length())
- temp.erase(elem->max_width);
+ truncate(temp, elem->max_width);
out_str << temp;
}
}
diff --git a/main.cc b/main.cc
index c998b20c..6dfe4004 100644
--- a/main.cc
+++ b/main.cc
@@ -51,8 +51,6 @@ namespace ledger {
var_t<report_t> report(args, 0);
var_t<std::ostream> ostream(args, 1);
- std::cout << "Hello, world!" << std::endl;
-
report->xacts_report
(xact_handler_ptr(new format_xacts
(*ostream, report->session.register_format)));
diff --git a/textual.cc b/textual.cc
index 37c03c06..cb862ee7 100644
--- a/textual.cc
+++ b/textual.cc
@@ -68,20 +68,10 @@ namespace {
#endif
if (expr) {
- expr.compile(*xact);
-
- if (expr.is_constant()) {
- amount = expr.constant_value().as_amount();
- DEBUG("ledger.textual.parse", "line " << linenum << ": " <<
- "The transaction amount is " << amount);
- return expr_t(); // we will fill this in with text
- } else {
- if (SHOW_DEBUG("ledger.textual.parse")) {
- std::cout << "Value expression tree:" << std::endl;
- expr.dump(std::cout);
- }
- return expr;
- }
+ amount = expr.calc(*xact).as_amount();
+ DEBUG("ledger.textual.parse", "line " << linenum << ": " <<
+ "The transaction amount is " << amount);
+ return expr;
}
return none;
}
@@ -189,9 +179,12 @@ xact_t * parse_xact(char * line, account_t * account,
"Reduced amount is " << xact->amount);
}
- // jww (2008-07-24): I don't think this is right, since amount_expr is
- // always NULL right now
+ // We don't need to store the actual expression that resulted in the
+ // amount if it's constant
if (xact->amount_expr) {
+ if (xact->amount_expr->is_constant())
+ xact->amount_expr = expr_t();
+
unsigned long end = (long)in.tellg();
xact->amount_expr->set_text(string(line, beg, end - beg));
}
@@ -228,28 +221,19 @@ xact_t * parse_xact(char * line, account_t * account,
try {
unsigned long beg = (long)in.tellg();
- if (optional<expr_t> cost_expr =
- parse_amount_expr(in, *xact->cost, xact.get(),
- EXPR_PARSE_NO_MIGRATE |
- EXPR_PARSE_NO_ASSIGN)) {
- try {
- *xact->cost = cost_expr->calc(*xact).as_amount();
- assert(xact->cost->valid());
-
- xact->cost_expr = cost_expr;
-
- unsigned long end = (long)in.tellg();
- if (per_unit)
- xact->cost_expr->set_text(string("@") +
- string(line, beg, end - beg));
- else
- xact->cost_expr->set_text(string("@@") +
- string(line, beg, end - beg));
- }
- catch (...) {
- throw new parse_error
- ("A transaction's cost must evaluate to a constant value");
- }
+ xact->cost_expr =
+ parse_amount_expr(in, *xact->cost, xact.get(),
+ EXPR_PARSE_NO_MIGRATE |
+ EXPR_PARSE_NO_ASSIGN);
+
+ if (xact->cost_expr) {
+ unsigned long end = (long)in.tellg();
+ if (per_unit)
+ xact->cost_expr->set_text(string("@") +
+ string(line, beg, end - beg));
+ else
+ xact->cost_expr->set_text(string("@@") +
+ string(line, beg, end - beg));
}
}
catch (error * err) {
@@ -290,7 +274,7 @@ xact_t * parse_xact(char * line, account_t * account,
account_xdata_t& xdata(account_xdata(*xact->account));
- if (xact->amount) {
+ if (! xact->amount.is_null()) {
if (xdata.value.is_null())
xdata.value = xact->amount;
else
diff --git a/times.h b/times.h
index 65513ca8..1edaa2b2 100644
--- a/times.h
+++ b/times.h
@@ -152,8 +152,22 @@ inline datetime_t parse_datetime(const string& str) {
return parse_datetime(str.c_str());
}
+inline std::time_t to_time_t(const ptime& t)
+{
+ if( t == posix_time::neg_infin )
+ return 0;
+ else if( t == posix_time::pos_infin )
+ return LONG_MAX;
+ ptime start(date(1970,1,1));
+ return (t-start).total_seconds();
+}
+
inline string format_datetime(const datetime_t& when) {
- return ""; // jww (2008-07-19): NYI
+ char buf[64];
+ time_t moment = to_time_t(when);
+ // jww (2008-07-29): Need to make the output format configurable
+ std::strftime(buf, 63, "%Y/%m/%d", std::localtime(&moment));
+ return buf;
}
extern const ptime time_now;
diff --git a/value.cc b/value.cc
index 730ef2e6..a540068c 100644
--- a/value.cc
+++ b/value.cc
@@ -67,7 +67,7 @@ value_t::storage_t& value_t::storage_t::operator=(const value_t::storage_t& rhs)
break;
default:
- // The rest are fundamental types, which can copy using std::memcpy
+ // The rest are fundamental types, which can be copied using std::memcpy
std::memcpy(data, rhs.data, sizeof(data));
break;
}
@@ -1458,20 +1458,18 @@ value_t& value_t::add(const amount_t& amount, const optional<amount_t>& tcost)
else if (! is_amount()) {
in_place_cast(AMOUNT);
}
- *this += amount;
- break;
+ return *this += amount;
case BALANCE:
if (tcost) {
in_place_cast(BALANCE_PAIR);
return add(amount, tcost);
}
- *this += amount;
- break;
+ return *this += amount;
case BALANCE_PAIR:
as_balance_pair_lval().add(amount, tcost);
- break;
+ return *this;
default:
break;
diff --git a/walk.cc b/walk.cc
index 26555ec6..6acd86dd 100644
--- a/walk.cc
+++ b/walk.cc
@@ -54,8 +54,7 @@ void add_xact_to(const xact_t& xact, value_t& value)
value += xact_xdata_(xact).value;
}
else if (xact.cost || (! value.is_null() && ! value.is_realzero())) {
- // jww (2008-04-24): Is this costly?
- value.add(xact.amount, xact.cost ? optional<amount_t>(*xact.cost) : none);
+ value.add(xact.amount, xact.cost);
}
else {
value = xact.amount;
@@ -201,7 +200,10 @@ void calc_xacts::operator()(xact_t& xact)
xact_xdata_t& xdata(xact_xdata(xact));
if (last_xact && xact_has_xdata(*last_xact)) {
- xdata.total += xact_xdata_(*last_xact).total;
+ if (xdata.total.is_null())
+ xdata.total = xact_xdata_(*last_xact).total;
+ else
+ xdata.total += xact_xdata_(*last_xact).total;
xdata.index = xact_xdata_(*last_xact).index + 1;
} else {
xdata.index = 0;