if NO_CLEANUP is defined in the Makefile (now default), no cleanup is done

This commit is contained in:
John Wiegley 2004-08-17 03:09:46 -04:00
parent c0d7feac7f
commit b009998930
9 changed files with 85 additions and 16 deletions

View file

@ -21,9 +21,9 @@ OBJS = $(patsubst %.cc,%.o,$(CODE))
CXX = g++ CXX = g++
CFLAGS = -Wall -ansi -pedantic CFLAGS = -Wall -ansi -pedantic
#DFLAGS = -O3 -fomit-frame-pointer -DRELEASE_LEVEL=0 #DFLAGS = -O3 -fomit-frame-pointer -DRELEASE_LEVEL=0 -DNO_CLEANUP
DFLAGS = -g -DRELEASE_LEVEL=4 DFLAGS = -g -DRELEASE_LEVEL=4 -DNO_CLEANUP
#DFLAGS = -g -DRELEASE_LEVEL=2 -pg #DFLAGS = -g -DRELEASE_LEVEL=2 -pg -DNO_CLEANUP
INCS = -I/sw/include \ INCS = -I/sw/include \
-I/usr/include/gcc/darwin/3.3/c++ \ -I/usr/include/gcc/darwin/3.3/c++ \

View file

@ -13,19 +13,19 @@ namespace ledger {
static mpz_t full_divisor; static mpz_t full_divisor;
static mpz_t true_value; static mpz_t true_value;
static class init_amounts static struct init_amounts {
{
public:
init_amounts() { init_amounts() {
mpz_init(full_divisor); mpz_init(full_divisor);
mpz_init(true_value); mpz_init(true_value);
mpz_ui_pow_ui(full_divisor, 10, MAX_PRECISION); mpz_ui_pow_ui(full_divisor, 10, MAX_PRECISION);
mpz_mul_ui(true_value, full_divisor, 1); mpz_mul_ui(true_value, full_divisor, 1);
} }
#ifndef NO_CLEANUP
~init_amounts() { ~init_amounts() {
mpz_clear(full_divisor); mpz_clear(full_divisor);
mpz_clear(true_value); mpz_clear(true_value);
} }
#endif
} initializer; } initializer;
static void mpz_round(mpz_t out, mpz_t value, int precision) static void mpz_round(mpz_t out, mpz_t value, int precision)
@ -781,6 +781,7 @@ commodities_map commodity_t::commodities;
commodity_t * commodity_t::null_commodity = commodity_t * commodity_t::null_commodity =
commodity_t::find_commodity("", true); commodity_t::find_commodity("", true);
#ifndef NO_CLEANUP
static struct cleanup_commodities static struct cleanup_commodities
{ {
~cleanup_commodities() { ~cleanup_commodities() {
@ -794,6 +795,7 @@ static struct cleanup_commodities
delete (*i).second; delete (*i).second;
} }
} _cleanup; } _cleanup;
#endif
commodity_t * commodity_t::find_commodity(const std::string& symbol, commodity_t * commodity_t::find_commodity(const std::string& symbol,
bool auto_create) bool auto_create)

View file

@ -90,12 +90,14 @@ static struct init_streams {
free_debug_stream = true; free_debug_stream = true;
} }
} }
#ifndef NO_CLEANUP
~init_streams() { ~init_streams() {
if (free_debug_stream && debug_stream) { if (free_debug_stream && debug_stream) {
delete debug_stream; delete debug_stream;
debug_stream = NULL; debug_stream = NULL;
} }
} }
#endif
} _debug_init; } _debug_init;
} // namespace ledger } // namespace ledger

View file

@ -35,8 +35,13 @@ std::string partial_account_name(const account_t * account)
std::string format_t::date_format = "%Y/%m/%d"; std::string format_t::date_format = "%Y/%m/%d";
#ifdef NO_CLEANUP
value_expr_t * format_t::value_expr = NULL;
value_expr_t * format_t::total_expr = NULL;
#else
std::auto_ptr<value_expr_t> format_t::value_expr; std::auto_ptr<value_expr_t> format_t::value_expr;
std::auto_ptr<value_expr_t> format_t::total_expr; std::auto_ptr<value_expr_t> format_t::total_expr;
#endif
element_t * format_t::parse_elements(const std::string& fmt) element_t * format_t::parse_elements(const std::string& fmt)
{ {

View file

@ -54,8 +54,13 @@ struct format_t
static std::string date_format; static std::string date_format;
#ifdef NO_CLEANUP
static value_expr_t * value_expr;
static value_expr_t * total_expr;
#else
static std::auto_ptr<value_expr_t> value_expr; static std::auto_ptr<value_expr_t> value_expr;
static std::auto_ptr<value_expr_t> total_expr; static std::auto_ptr<value_expr_t> total_expr;
#endif
format_t(const std::string& _format) : elements(NULL) { format_t(const std::string& _format) : elements(NULL) {
reset(_format); reset(_format);
@ -75,12 +80,20 @@ struct format_t
void format_elements(std::ostream& out, const details_t& details) const; void format_elements(std::ostream& out, const details_t& details) const;
static void compute_value(balance_t& result, const details_t& details) { static void compute_value(balance_t& result, const details_t& details) {
#ifdef NO_CLEANUP
if (value_expr)
#else
if (value_expr.get()) if (value_expr.get())
#endif
value_expr->compute(result, details); value_expr->compute(result, details);
} }
static void compute_total(balance_t& result, const details_t& details) { static void compute_total(balance_t& result, const details_t& details) {
#ifdef NO_CLEANUP
if (total_expr)
#else
if (total_expr.get()) if (total_expr.get())
#endif
total_expr->compute(result, details); total_expr->compute(result, details);
} }
}; };

59
main.cc
View file

@ -31,6 +31,40 @@ namespace {
TIMER_DEF(read_cache, "reading cache file"); TIMER_DEF(read_cache, "reading cache file");
} }
#ifdef NO_CLEANUP
#define auto_ptr bogus_auto_ptr
// This version of auto_ptr does not delete on deconstruction.
namespace std {
template <typename T>
struct bogus_auto_ptr {
T * ptr;
bogus_auto_ptr() : ptr(NULL) {}
explicit bogus_auto_ptr(T * _ptr) : ptr(_ptr) {}
T& operator*() const throw() {
return *ptr;
}
T * operator->() const throw() {
return ptr;
}
T * get() const throw() { return ptr; }
T * release() throw() {
T * tmp = ptr;
ptr = 0;
return tmp;
}
void reset(T * p = 0) throw() {
if (p != ptr) {
delete ptr;
ptr = p;
}
}
};
}
#endif // NO_CLEANUP
int main(int argc, char * argv[], char * envp[]) int main(int argc, char * argv[], char * envp[])
{ {
std::auto_ptr<journal_t> journal(new journal_t); std::auto_ptr<journal_t> journal(new journal_t);
@ -242,7 +276,11 @@ int main(int argc, char * argv[], char * envp[])
// Setup the meaning of %t and %T, used in format strings // Setup the meaning of %t and %T, used in format strings
try { try {
#ifdef NO_CLEANUP
format_t::value_expr = parse_value_expr(config->value_expr);
#else
format_t::value_expr.reset(parse_value_expr(config->value_expr)); format_t::value_expr.reset(parse_value_expr(config->value_expr));
#endif
} }
catch (const value_expr_error& err) { catch (const value_expr_error& err) {
std::cerr << "Error in amount (-t) specifier: " << err.what() std::cerr << "Error in amount (-t) specifier: " << err.what()
@ -251,7 +289,11 @@ int main(int argc, char * argv[], char * envp[])
} }
try { try {
#ifdef NO_CLEANUP
format_t::total_expr = parse_value_expr(config->total_expr);
#else
format_t::total_expr.reset(parse_value_expr(config->total_expr)); format_t::total_expr.reset(parse_value_expr(config->total_expr));
#endif
} }
catch (const value_expr_error& err) { catch (const value_expr_error& err) {
std::cerr << "Error in total (-T) specifier: " << err.what() std::cerr << "Error in total (-T) specifier: " << err.what()
@ -321,7 +363,7 @@ int main(int argc, char * argv[], char * envp[])
if (! config->output_file.empty()) if (! config->output_file.empty())
output_stream.reset(new std::ofstream(config->output_file.c_str())); output_stream.reset(new std::ofstream(config->output_file.c_str()));
#define OUT() (output_stream.get() ? *output_stream.get() : std::cout) #define OUT() (output_stream.get() ? *output_stream : std::cout)
if (! config->interval_text.empty()) { if (! config->interval_text.empty()) {
std::istringstream stream(config->interval_text); std::istringstream stream(config->interval_text);
@ -356,12 +398,14 @@ int main(int argc, char * argv[], char * envp[])
show_all_related)); show_all_related));
formatter.reset(new filter_transactions(formatter.release(), formatter.reset(new filter_transactions(formatter.release(),
config->predicate)); config->predicate));
walk_entries(journal->entries, *formatter.get()); walk_entries(journal->entries, *formatter);
formatter->flush();
format_account acct_formatter(OUT(), format, config->display_predicate); format_account acct_formatter(OUT(), format, config->display_predicate);
if (config->show_subtotals) if (config->show_subtotals)
sum_accounts(journal->master); sum_accounts(journal->master);
walk_accounts(journal->master, acct_formatter, sort_order.get()); walk_accounts(journal->master, acct_formatter, sort_order.get());
acct_formatter.flush();
if (format_account::disp_subaccounts_p(journal->master)) { if (format_account::disp_subaccounts_p(journal->master)) {
std::string end_format = "--------------------\n"; std::string end_format = "--------------------\n";
@ -374,16 +418,19 @@ int main(int argc, char * argv[], char * envp[])
formatter.reset(new add_to_account_value); formatter.reset(new add_to_account_value);
formatter.reset(new filter_transactions(formatter.release(), formatter.reset(new filter_transactions(formatter.release(),
config->predicate)); config->predicate));
walk_entries(journal->entries, *formatter.get()); walk_entries(journal->entries, *formatter);
formatter->flush();
format_equity acct_formatter(OUT(), format, nformat, format_equity acct_formatter(OUT(), format, nformat,
config->display_predicate); config->display_predicate);
sum_accounts(journal->master); sum_accounts(journal->master);
walk_accounts(journal->master, acct_formatter, sort_order.get()); walk_accounts(journal->master, acct_formatter, sort_order.get());
acct_formatter.flush();
} }
else if (command == "e") { else if (command == "e") {
format_transactions formatter(OUT(), format, nformat); format_transactions formatter(OUT(), format, nformat);
walk_transactions(new_entry->transactions, formatter); walk_transactions(new_entry->transactions, formatter);
formatter.flush();
} }
else { else {
std::auto_ptr<item_handler<transaction_t> > formatter; std::auto_ptr<item_handler<transaction_t> > formatter;
@ -441,7 +488,7 @@ int main(int argc, char * argv[], char * envp[])
formatter.reset(new subtotal_transactions(formatter.release())); formatter.reset(new subtotal_transactions(formatter.release()));
else if (report_interval.get()) else if (report_interval.get())
formatter.reset(new interval_transactions(formatter.release(), formatter.reset(new interval_transactions(formatter.release(),
*report_interval.get(), *report_interval,
interval_begin)); interval_begin));
else if (config->days_of_the_week) else if (config->days_of_the_week)
formatter.reset(new dow_transactions(formatter.release())); formatter.reset(new dow_transactions(formatter.release()));
@ -462,7 +509,8 @@ int main(int argc, char * argv[], char * envp[])
// Once the filters are chained, walk `journal's entries and start // Once the filters are chained, walk `journal's entries and start
// feeding each transaction that matches `predicate' to the chain. // feeding each transaction that matches `predicate' to the chain.
walk_entries(journal->entries, *formatter.get()); walk_entries(journal->entries, *formatter);
formatter->flush();
#ifdef DEBUG_ENABLED #ifdef DEBUG_ENABLED
// The transaction display flags (dflags) are not recorded in the // The transaction display flags (dflags) are not recorded in the
@ -470,6 +518,7 @@ int main(int argc, char * argv[], char * envp[])
// are to be displayed a second time. // are to be displayed a second time.
clear_display_flags cleanup; clear_display_flags cleanup;
walk_entries(journal->entries, cleanup); walk_entries(journal->entries, cleanup);
cleanup.flush();
#endif #endif
} }

View file

@ -366,7 +366,7 @@ unsigned int parse_textual_journal(std::istream& in, journal_t * journal,
char * n = next_element(p, true); char * n = next_element(p, true);
last_desc = n ? n : ""; last_desc = n ? n : "";
static struct std::tm when; struct std::tm when;
if (strptime(date.c_str(), "%Y/%m/%d %H:%M:%S", &when)) { if (strptime(date.c_str(), "%Y/%m/%d %H:%M:%S", &when)) {
time_in = std::mktime(&when); time_in = std::mktime(&when);
last_account = account_stack.front()->find_account(p); last_account = account_stack.front()->find_account(p);
@ -392,7 +392,7 @@ unsigned int parse_textual_journal(std::istream& in, journal_t * journal,
date += " "; date += " ";
date += time; date += time;
static struct std::tm when; struct std::tm when;
if (strptime(date.c_str(), "%Y/%m/%d %H:%M:%S", &when)) { if (strptime(date.c_str(), "%Y/%m/%d %H:%M:%S", &when)) {
entry_t * curr = new entry_t; entry_t * curr = new entry_t;
curr->date = std::mktime(&when); curr->date = std::mktime(&when);

View file

@ -886,8 +886,7 @@ void dump_value_expr(std::ostream& out, const value_expr_t * node)
int main(int argc, char *argv[]) int main(int argc, char *argv[])
{ {
std::auto_ptr<ledger::value_expr_t> expr(ledger::parse_value_expr(argv[1])); ledger::dump_value_expr(std::cout, ledger::parse_value_expr(argv[1]));
ledger::dump_value_expr(std::cout, expr.get());
std::cout << std::endl; std::cout << std::endl;
} }

1
walk.h
View file

@ -20,7 +20,6 @@ struct item_handler {
item_handler(item_handler * _handler) : handler(_handler) {} item_handler(item_handler * _handler) : handler(_handler) {}
virtual ~item_handler() {} virtual ~item_handler() {}
virtual void close() { virtual void close() {
flush();
if (handler) { if (handler) {
delete handler; delete handler;
handler = NULL; handler = NULL;