slight fixes

This commit is contained in:
John Wiegley 2004-08-17 01:50:38 -04:00
parent 3a44545540
commit cd7d7e5b88
8 changed files with 140 additions and 65 deletions

View file

@ -23,7 +23,7 @@ static std::vector<commodity_t *> commodities;
static commodity_t::ident_t c_ident;
#ifdef RELEASE_LEVEL >= ALPHA
#if RELEASE_LEVEL >= ALPHA
#define read_binary_guard(in, id) { \
unsigned short guard; \
in.read((char *)&guard, sizeof(guard)); \
@ -252,7 +252,7 @@ unsigned int read_binary_journal(std::istream& in,
}
#ifdef RELEASE_LEVEL >= ALPHA
#if RELEASE_LEVEL >= ALPHA
#define write_binary_guard(in, id) { \
unsigned short guard = id; \
out.write((char *)&guard, sizeof(guard)); \

View file

@ -113,21 +113,21 @@ Commands:\n\
DEF_OPT_HANDLERS();
OPT_BEGIN(help, "h", false) {
OPT_BEGIN(help, "h") {
option_help(std::cout);
std::exit(0);
} OPT_END(help);
OPT_BEGIN(version, "v", false) {
OPT_BEGIN(version, "v") {
show_version(std::cout);
std::exit(0);
} OPT_END(version);
OPT_BEGIN(init, "i:", true) {
OPT_BEGIN(init, "i:") {
config->init_file = optarg;
} OPT_END(init);
OPT_BEGIN(file, "f:", true) {
OPT_BEGIN(file, "f:") {
char * buf = new char[std::strlen(optarg) + 1];
std::strcpy(buf, optarg);
for (char * p = std::strtok(buf, ":");
@ -137,16 +137,16 @@ OPT_BEGIN(file, "f:", true) {
delete[] buf;
} OPT_END(file);
OPT_BEGIN(cache, ":", false) {
OPT_BEGIN(cache, ":") {
config->cache_file = optarg;
} OPT_END(cache);
OPT_BEGIN(output, "o:", false) {
OPT_BEGIN(output, "o:") {
if (std::string(optarg) != "-")
config->output_file = optarg;
} OPT_END(output);
OPT_BEGIN(set_price, "p:", true) {
OPT_BEGIN(set_price, "p:") {
if (std::strchr(optarg, '='))
config->price_settings.push_back(optarg);
else
@ -157,7 +157,7 @@ OPT_BEGIN(set_price, "p:", true) {
//
// Report filtering
OPT_BEGIN(begin_date, "b:", false) {
OPT_BEGIN(begin_date, "b:") {
if (! config->predicate.empty())
config->predicate += "&";
config->predicate += "(d>=[";
@ -165,7 +165,7 @@ OPT_BEGIN(begin_date, "b:", false) {
config->predicate += "])";
} OPT_END(begin_date);
OPT_BEGIN(end_date, "e:", false) {
OPT_BEGIN(end_date, "e:") {
if (! config->predicate.empty())
config->predicate += "&";
config->predicate += "(d<[";
@ -173,25 +173,25 @@ OPT_BEGIN(end_date, "e:", false) {
config->predicate += "])";
} OPT_END(end_date);
OPT_BEGIN(current, "c", false) {
OPT_BEGIN(current, "c") {
if (! config->predicate.empty())
config->predicate += "&";
config->predicate += "(d<t)";
} OPT_END(current);
OPT_BEGIN(cleared, "C", false) {
OPT_BEGIN(cleared, "C") {
if (! config->predicate.empty())
config->predicate += "&";
config->predicate += "X";
} OPT_END(cleared);
OPT_BEGIN(uncleared, "U", false) {
OPT_BEGIN(uncleared, "U") {
if (! config->predicate.empty())
config->predicate += "&";
config->predicate += "!X";
} OPT_END(uncleared);
OPT_BEGIN(real, "R", false) {
OPT_BEGIN(real, "R") {
if (! config->predicate.empty())
config->predicate += "&";
config->predicate += "R";
@ -201,55 +201,55 @@ OPT_BEGIN(real, "R", false) {
//
// Output customization
OPT_BEGIN(format, "F:", false) {
OPT_BEGIN(format, "F:") {
config->format_string = optarg;
} OPT_END(format);
OPT_BEGIN(date_format, "y:", false) {
OPT_BEGIN(date_format, "y:") {
config->date_format = optarg;
} OPT_END(date_format);
OPT_BEGIN(empty, "E", false) {
OPT_BEGIN(empty, "E") {
config->show_empty = true;
} OPT_END(empty);
OPT_BEGIN(collapse, "n", false) {
OPT_BEGIN(collapse, "n") {
config->show_subtotals = false;
} OPT_END(collapse);
OPT_BEGIN(show_all, "s", false) {
OPT_BEGIN(show_all, "s") {
config->show_expanded = true;
} OPT_END(show_all);
OPT_BEGIN(sort, "S:", false) {
OPT_BEGIN(sort, "S:") {
config->sort_string = optarg;
} OPT_END(sort);
OPT_BEGIN(related, "r", false) {
OPT_BEGIN(related, "r") {
config->show_related = true;
} OPT_END(related);
OPT_BEGIN(interval, "z:", false) {
OPT_BEGIN(interval, "z:") {
config->interval_text = optarg;
} OPT_END(interval);
OPT_BEGIN(weekly, "W", false) {
OPT_BEGIN(weekly, "W") {
config->interval_text = "weekly";
} OPT_END(weekly);
OPT_BEGIN(dow, "w", false) {
OPT_BEGIN(dow, "w") {
config->days_of_the_week = true;
} OPT_END(dow);
OPT_BEGIN(monthly, "M", false) {
OPT_BEGIN(monthly, "M") {
config->interval_text = "monthly";
} OPT_END(monthly);
OPT_BEGIN(yearly, "Y", false) {
OPT_BEGIN(yearly, "Y") {
config->interval_text = "yearly";
} OPT_END(yearly);
OPT_BEGIN(limit, "l:", false) {
OPT_BEGIN(limit, "l:") {
if (! config->predicate.empty())
config->predicate += "&";
config->predicate += "(";
@ -257,7 +257,7 @@ OPT_BEGIN(limit, "l:", false) {
config->predicate += ")";
} OPT_END(limit);
OPT_BEGIN(display, "d:", false) {
OPT_BEGIN(display, "d:") {
if (! config->display_predicate.empty())
config->display_predicate += "&";
config->display_predicate += "(";
@ -265,20 +265,20 @@ OPT_BEGIN(display, "d:", false) {
config->display_predicate += ")";
} OPT_END(display);
OPT_BEGIN(value, "t:", false) {
OPT_BEGIN(value, "t:") {
config->value_expr = optarg;
} OPT_END(value);
OPT_BEGIN(total, "T:", false) {
OPT_BEGIN(total, "T:") {
config->total_expr = optarg;
} OPT_END(total);
OPT_BEGIN(value_data, "j", false) {
OPT_BEGIN(value_data, "j") {
config->value_expr = "S" + config->value_expr;
config->format_string = plot_value_fmt;
} OPT_END(value_data);
OPT_BEGIN(total_data, "J", false) {
OPT_BEGIN(total_data, "J") {
config->total_expr = "S" + config->total_expr;
config->format_string = plot_total_fmt;
} OPT_END(total_data);
@ -287,36 +287,36 @@ OPT_BEGIN(total_data, "J", false) {
//
// Commodity reporting
OPT_BEGIN(price_db, "P:", false) {
OPT_BEGIN(price_db, "P:") {
config->price_db = optarg;
} OPT_END(price_db);
OPT_BEGIN(price_exp, "L:", false) {
OPT_BEGIN(price_exp, "L:") {
config->pricing_leeway = std::atol(optarg) * 60;
} OPT_END(price_exp);
OPT_BEGIN(download, "Q", false) {
OPT_BEGIN(download, "Q") {
config->download_quotes = true;
} OPT_END(download);
OPT_BEGIN(quantity, "O", false) {
OPT_BEGIN(quantity, "O") {
config->value_expr = "a";
config->total_expr = "T";
} OPT_END(quantity);
OPT_BEGIN(basis, "B", false) {
OPT_BEGIN(basis, "B") {
config->value_expr = "c";
config->total_expr = "C";
} OPT_END(basis);
OPT_BEGIN(market, "V", false) {
OPT_BEGIN(market, "V") {
config->show_revalued = true;
config->value_expr = "v";
config->total_expr = "V";
} OPT_END(market);
OPT_BEGIN(gain, "G", false) {
OPT_BEGIN(gain, "G") {
config->show_revalued =
config->show_revalued_only = true;
@ -324,22 +324,22 @@ OPT_BEGIN(gain, "G", false) {
config->total_expr = "G";
} OPT_END(gain);
OPT_BEGIN(average, "A", false) {
OPT_BEGIN(average, "A") {
config->value_expr = "a";
config->total_expr = "MT";
} OPT_END(average);
OPT_BEGIN(deviation, "D", false) {
OPT_BEGIN(deviation, "D") {
config->value_expr = "a";
config->total_expr = "DMT";
} OPT_END(deviation);
OPT_BEGIN(trend, "X", false) {
OPT_BEGIN(trend, "X") {
config->value_expr = "a";
config->total_expr = "MDMT";
} OPT_END(trend);
OPT_BEGIN(weighted_trend, "Z", false) {
OPT_BEGIN(weighted_trend, "Z") {
config->value_expr = "a";
config->total_expr
= "MD(MT/(1+(((t-d)/(30*86400))<0?0:((t-d)/(30*86400)))))";

View file

@ -169,14 +169,10 @@ bool quick_parse_date(char * date_str, std::time_t * result)
if (base == -1 || year != base_year) {
struct std::tm when;
when.tm_hour = 0;
when.tm_min = 0;
when.tm_sec = 0;
std::memset(&when, 0, sizeof(when));
base_year = year == -1 ? now_tm->tm_year + 1900 : year;
when.tm_year = year == -1 ? now_tm->tm_year : year - 1900;
when.tm_mon = 0;
when.tm_mday = 1;
base = std::mktime(&when);

View file

@ -2,8 +2,79 @@
#ifdef DEBUG_ENABLED
#include <map>
#include <fstream>
#include <cstdlib>
#include <cstring>
int offset = 0;
std::map<void *, int> ptrs;
#define PRINT_INC(x) { \
char buf[128]; \
std::sprintf(buf, "%d: %p: %s", ++offset, ptr, x); \
write(1, buf, std::strlen(buf)); \
}
#define PRINT_DEC(x) { \
char buf[128]; \
std::sprintf(buf, "%d: %p: %s", --offset, ptr, x); \
write(1, buf, std::strlen(buf)); \
}
void * operator new(std::size_t size) throw (std::bad_alloc) {
void * ptr = std::malloc(size);
if (DEBUG("ledger.debug.alloc")) {
PRINT_INC("void * operator new(std::size_t size) throw (std::bad_alloc)\n");
}
return ptr;
}
void * operator new[](std::size_t size) throw (std::bad_alloc) {
void * ptr = std::malloc(size);
if (DEBUG("ledger.debug.alloc")) {
PRINT_INC("void * operator new[](std::size_t) throw (std::bad_alloc)\n");
}
return ptr;
}
void * operator new(std::size_t size, const std::nothrow_t&) throw() {
void * ptr = std::malloc(size);
if (DEBUG("ledger.debug.alloc")) {
PRINT_INC("void * operator new(std::size_t size, const std::nothrow_t&) throw()\n");
}
return ptr;
}
void * operator new[](std::size_t size, const std::nothrow_t&) throw() {
void * ptr = std::malloc(size);
if (DEBUG("ledger.debug.alloc")) {
PRINT_INC("void * operator new[](std::size_t size, const std::nothrow_t&) throw()\n");
}
return ptr;
}
void operator delete(void * ptr) throw() {
if (DEBUG("ledger.debug.alloc")) {
PRINT_DEC("void operator delete(void * ptr) throw()\n");
}
std::free(ptr);
}
void operator delete[](void * ptr) throw() {
if (DEBUG("ledger.debug.alloc")) {
PRINT_DEC("void operator delete[](void * ptr) throw()\n");
}
std::free(ptr);
}
void operator delete(void * ptr, const std::nothrow_t&) throw() {
if (DEBUG("ledger.debug.alloc")) {
PRINT_DEC("void operator delete(void * ptr, const std::nothrow_t&) throw()\n");
}
std::free(ptr);
}
void operator delete[](void * ptr, const std::nothrow_t&) throw() {
if (DEBUG("ledger.debug.alloc")) {
PRINT_DEC("void operator delete[](void * ptr, const std::nothrow_t&) throw()\n");
}
std::free(ptr);
}
namespace ledger {
@ -19,16 +90,13 @@ static struct init_streams {
free_debug_stream = true;
}
}
} _debug_init;
static struct free_streams {
~free_streams() {
~init_streams() {
if (free_debug_stream && debug_stream) {
delete debug_stream;
debug_stream = NULL;
}
}
} _debug_cleanup;
} _debug_init;
} // namespace ledger

13
debug.h
View file

@ -139,4 +139,17 @@ extern std::ostream * warning_stream;
} // namespace ledger
#ifdef DEBUG_ENABLED
void * operator new(std::size_t) throw (std::bad_alloc);
void * operator new[](std::size_t) throw (std::bad_alloc);
void operator delete(void*) throw();
void operator delete[](void*) throw();
void * operator new(std::size_t, const std::nothrow_t&) throw();
void * operator new[](std::size_t, const std::nothrow_t&) throw();
void operator delete(void*, const std::nothrow_t&) throw();
void operator delete[](void*, const std::nothrow_t&) throw();
#endif // DEBUG_ENABLED
#endif // _DEBUG_H

View file

@ -4,9 +4,8 @@
#include <cstdarg>
option_handler::option_handler(const std::string& label,
const std::string& opt_chars,
const bool _multiple)
: handled(false), multiple(_multiple)
const std::string& opt_chars)
: handled(false)
{
option_t opt;
@ -33,7 +32,7 @@ option_handler::option_handler(const std::string& label,
static inline void process_option(const option_t& opt,
const char * arg = NULL) {
if (! opt.handler->handled || opt.handler->multiple) {
if (! opt.handler->handled) {
opt.handler->handle_option(arg);
opt.handler->handled = true;
}
@ -43,7 +42,7 @@ bool process_option(const std::string& opt, const char * arg)
{
option_handler_map::iterator handler = option_handler::handlers.find(opt);
if (handler != option_handler::handlers.end()) {
if (! (*handler).second->handled || (*handler).second->multiple) {
if (! (*handler).second->handled) {
(*handler).second->handle_option(arg);
(*handler).second->handled = true;
}

View file

@ -22,14 +22,12 @@ typedef std::pair<const std::string, option_handler *> option_handler_pair;
struct option_handler {
bool handled;
bool multiple;
static std::vector<option_t> options;
static option_handler_map handlers;
option_handler(const std::string& label,
const std::string& opt_chars,
const bool _multiple);
const std::string& opt_chars);
virtual void handle_option(const char * arg = NULL) = 0;
};
@ -43,9 +41,9 @@ void process_environment(char ** envp, const std::string& tag);
std::vector<option_t> option_handler::options; \
option_handler_map option_handler::handlers
#define OPT_BEGIN(tag, chars, multi) \
#define OPT_BEGIN(tag, chars) \
static struct tag ## _handler : public option_handler { \
tag ## _handler() : option_handler(#tag, chars, multi) {} \
tag ## _handler() : option_handler(#tag, chars) {} \
virtual void handle_option(const char * optarg)
#define OPT_END(tag) } tag ## _handler_obj

View file

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