summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--config.cc6
-rw-r--r--config.h3
-rw-r--r--main.cc26
-rwxr-xr-xmain.py46
4 files changed, 57 insertions, 24 deletions
diff --git a/config.cc b/config.cc
index d22c1c34..9ed1031f 100644
--- a/config.cc
+++ b/config.cc
@@ -45,7 +45,6 @@ config_t::config_t()
use_cache = false;
cache_dirty = false;
sort_order = NULL;
- output_stream = NULL;
}
static void
@@ -219,11 +218,6 @@ void config_t::process_options(const std::string& command,
pricing_leeway,
cache_dirty);
- // Configure the output stream
-
- if (! output_stream && ! output_file.empty())
- output_stream = new std::ofstream(output_file.c_str());
-
// Parse the interval specifier, if provided
if (! report_interval && ! interval_text.empty()) {
diff --git a/config.h b/config.h
index 7f2a7707..72cc6cd6 100644
--- a/config.h
+++ b/config.h
@@ -61,7 +61,6 @@ struct config_t
format_t nformat;
value_expr_t * sort_order;
- std::ostream * output_stream;
config_t();
config_t(const config_t&) {
@@ -71,8 +70,6 @@ struct config_t
~config_t() {
if (sort_order)
delete sort_order;
- if (output_stream)
- delete output_stream;
}
void process_options(const std::string& command,
diff --git a/main.cc b/main.cc
index 8dd3d9c6..ffab30da 100644
--- a/main.cc
+++ b/main.cc
@@ -237,10 +237,16 @@ int parse_and_report(int argc, char * argv[], char * envp[])
return 1;
}
- // Walk the entries based on the report type and the options
+ // Configure the output stream
TIMER_START(report_gen);
+ std::ostream * out = &std::cout;
+ if (! config.output_file.empty())
+ out = new std::ofstream(config.output_file.c_str());
+
+ // Walk the entries based on the report type and the options
+
item_handler<transaction_t> * formatter;
std::list<item_handler<transaction_t> *> formatter_ptrs;
@@ -248,9 +254,7 @@ int parse_and_report(int argc, char * argv[], char * envp[])
formatter = new set_account_value;
formatter = chain_formatters(command, formatter, formatter_ptrs);
} else {
- std::ostream& out(config.output_stream ?
- *config.output_stream : std::cout);
- formatter = new format_transactions(out, config.format, config.nformat);
+ formatter = new format_transactions(*out, config.format, config.nformat);
formatter = chain_formatters(command, formatter, formatter_ptrs);
}
@@ -263,11 +267,8 @@ int parse_and_report(int argc, char * argv[], char * envp[])
// For the balance and equity reports, output the sum totals.
- std::ostream& out(config.output_stream ?
- *config.output_stream : std::cout);
-
if (command == "b") {
- format_account acct_formatter(out, config.format,
+ format_account acct_formatter(*out, config.format,
config.display_predicate);
sum_accounts(*journal->master);
walk_accounts(*journal->master, acct_formatter, config.sort_order);
@@ -277,13 +278,13 @@ int parse_and_report(int argc, char * argv[], char * envp[])
ACCT_DATA(journal->master)->value = ACCT_DATA(journal->master)->total;
if (ACCT_DATA(journal->master)->dflags & ACCOUNT_TO_DISPLAY) {
- out << "--------------------\n";
- config.format.format(out, details_t(*journal->master));
+ *out << "--------------------\n";
+ config.format.format(*out, details_t(*journal->master));
}
}
}
else if (command == "E") {
- format_equity acct_formatter(out, config.format, config.nformat,
+ format_equity acct_formatter(*out, config.format, config.nformat,
config.display_predicate);
sum_accounts(*journal->master);
walk_accounts(*journal->master, acct_formatter, config.sort_order);
@@ -291,6 +292,9 @@ int parse_and_report(int argc, char * argv[], char * envp[])
}
#if DEBUG_LEVEL >= BETA
+ if (! config.output_file.empty())
+ delete out;
+
for (std::list<item_handler<transaction_t> *>::iterator i
= formatter_ptrs.begin();
i != formatter_ptrs.end();
diff --git a/main.py b/main.py
index e514bd1a..3920916b 100755
--- a/main.py
+++ b/main.py
@@ -1,9 +1,21 @@
#!/usr/bin/env python
+# Ledger, the command-line accounting tool
+#
+# Copyright (c) 2003-2004, New Artisans LLC. All rights reserved.
+#
+# This program is made available under the terms of the BSD Public
+# License. See the LICENSE file included with the distribution for
+# details and disclaimer.
+#
+# This script provides a Python front-end to the ledger library, which
+# replicates the functionality of the C++ front-end found in main.cc.
+# It is provided as an alternative to main.cc, or as a starting point
+# for creating custom front-ends based on the Ledger module. See the
+# documentation for API references, and how to use that module.
+
import sys
import os
-import time
-import re
from ledger import *
@@ -12,7 +24,7 @@ journal = Journal ()
add_config_option_handlers ()
args = process_arguments (sys.argv[1:])
-config.use_cache = len (config.data_file) > 0
+config.use_cache = not config.data_file
process_environment (os.environ, "LEDGER_")
if os.environ.has_key ("LEDGER"):
@@ -100,7 +112,10 @@ class FormatTransaction (TransactionHandler):
self.output.write(self.formatter.format(xact))
self.last_entry = xact.entry
-handler = FormatTransaction()
+if command == "b" or command == "E":
+ handler = SetAccountValue()
+else:
+ handler = FormatTransaction()
if not (command == "b" or command == "E"):
if config.display_predicate:
@@ -140,5 +155,28 @@ else:
handler.flush ()
+#if command == "b":
+# format_account acct_formatter(out, config.format,
+# config.display_predicate);
+# sum_accounts(*journal->master);
+# walk_accounts(*journal->master, acct_formatter, config.sort_order);
+# acct_formatter.flush();
+#
+# if (journal->master->data) {
+# ACCT_DATA(journal->master)->value = ACCT_DATA(journal->master)->total;
+#
+# if (ACCT_DATA(journal->master)->dflags & ACCOUNT_TO_DISPLAY) {
+# out << "--------------------\n";
+# config.format.format(out, details_t(*journal->master));
+# }
+# }
+#elif command == "E":
+# format_equity acct_formatter(out, config.format, config.nformat,
+# config.display_predicate);
+# sum_accounts(*journal->master);
+# walk_accounts(*journal->master, acct_formatter, config.sort_order);
+# acct_formatter.flush();
+# }
+
if config.use_cache and config.cache_dirty and config.cache_file:
write_binary_journal(config.cache_file, journal);