summaryrefslogtreecommitdiff
path: root/main.cc
diff options
context:
space:
mode:
Diffstat (limited to 'main.cc')
-rw-r--r--main.cc341
1 files changed, 0 insertions, 341 deletions
diff --git a/main.cc b/main.cc
deleted file mode 100644
index 8fca0150..00000000
--- a/main.cc
+++ /dev/null
@@ -1,341 +0,0 @@
-#include "ledger.h"
-
-#define LEDGER_VERSION "1.1"
-
-#include <fstream>
-
-namespace ledger {
- extern book * parse_ledger(std::istream& in, regexps_map& regexps,
- bool compute_balances);
-#ifdef READ_GNUCASH
- extern book * parse_gnucash(std::istream& in, bool compute_balances);
-#endif
-
- extern bool parse_date(const char * date_str, std::time_t * result,
- const int year = -1);
- extern void parse_price_setting(const std::string& setting);
-
- extern void report_balances(std::ostream& out, regexps_map& regexps);
- extern void print_register(const std::string& acct_name, std::ostream& out,
- regexps_map& regexps);
- extern void equity_ledger(std::ostream& out, regexps_map& regexps);
-
- bool show_cleared;
- bool show_virtual;
- bool get_quotes;
- bool show_children;
- bool show_empty;
- bool show_subtotals;
- bool full_names;
-
- std::time_t begin_date;
- bool have_beginning;
- std::time_t end_date;
- bool have_ending;
-}
-
-using namespace ledger;
-
-static void show_help(std::ostream& out)
-{
- std::cerr
- << "usage: ledger [options] COMMAND [options] [REGEXPS]" << std::endl
- << std::endl
- << "ledger options:" << std::endl
- << " -C also show cleared transactions" << std::endl
- << " -d DATE specify an implicit date range (e.g., -d april)"
- << std::endl
- << " -b DATE specify a beginning date" << std::endl
- << " -e DATE specify an ending date" << std::endl
- << " -c do not show future entries (same as -e TODAY)" << std::endl
- << " -f FILE specify pathname of ledger data file" << std::endl
- << " -h display this help text" << std::endl
- << " -R do not factor any virtual transactions" << std::endl
- << " -V FILE use virtual mappings listed in FILE" << std::endl
- << " -i FILE read the list of inclusion regexps from FILE" << std::endl
- << " -p FILE read the list of prices from FILE" << std::endl
- << " -P download price quotes from the Internet" << std::endl
- << " (works by running the command \"getquote SYMBOL\")"
- << std::endl
- << " -v display version information" << std::endl
- << " -w print out warnings where applicable" << std::endl
- << std::endl
- << "commands:" << std::endl
- << " balance show balance totals" << std::endl
- << " register display a register for ACCOUNT" << std::endl
- << " print print all ledger entries" << std::endl
- << " equity generate equity ledger for all entries" << std::endl
- << std::endl
- << "`balance' options:" << std::endl
- << " -F print each account's full name" << std::endl
- << " -n do not generate totals for parent accounts" << std::endl
- << " -s show sub-accounts in balance totals" << std::endl
- << " -S show empty accounts in balance totals" << std::endl;
-}
-
-//////////////////////////////////////////////////////////////////////
-//
-// Command-line parser and top-level logic.
-//
-
-int main(int argc, char * argv[])
-{
- std::istream * file = NULL;
- std::string prices;
- regexps_map regexps;
- int index;
-
- have_beginning = false;
- have_ending = false;
- show_cleared = false;
- show_virtual = true;
- show_children = false;
- show_empty = false;
- show_subtotals = true;
- full_names = false;
-
- // Parse the command-line options
-
- int c;
- while (-1 != (c = getopt(argc, argv, "+b:e:d:cChRV:wf:i:p:PvsSnF"))) {
- switch (char(c)) {
- case 'b':
- case 'e': {
- std::time_t when;
- if (! parse_date(optarg, &when)) {
- std::cerr << "Error: Bad date string: " << optarg << std::endl;
- return 1;
- }
-
- if (c == 'b') {
- begin_date = when;
- have_beginning = true;
- } else {
- end_date = when;
- have_ending = true;
- }
- break;
- }
-
-#if 0
- case 'd': {
- if (! parse_date(optarg, &begin_date)) {
- std::cerr << "Error: Bad date string: " << optarg << std::endl;
- return 1;
- }
- have_beginning = true;
-
- struct std::tm when, then;
- std::memset(&then, 0, sizeof(struct std::tm));
-
- std::time_t now = std::time(NULL);
- struct std::tm * now_tm = std::localtime(&now);
-
- for (const char ** f = formats; *f; f++) {
- memset(&when, INT_MAX, sizeof(struct std::tm));
- if (strptime(optarg, *f, &when)) {
- then.tm_hour = 0;
- then.tm_min = 0;
- then.tm_sec = 0;
-
- if (when.tm_year != -1)
- then.tm_year = when.tm_year + 1;
- else
- then.tm_year = now_tm->tm_year;
-
- if (std::strcmp(*f, "%Y") == 0) {
- then.tm_mon = 0;
- then.tm_mday = 1;
- } else {
- if (when.tm_mon != -1)
- then.tm_mon = when.tm_mon + 1;
- else
- then.tm_mon = now_tm->tm_mon;
-
- if (when.tm_mday != -1)
- then.tm_mday = when.tm_mday + 1;
- else
- then.tm_mday = now_tm->tm_mday;
- }
-
- end_date = std::mktime(&then);
- have_ending = true;
- break;
- }
- }
- break;
- }
-#endif
-
- case 'c':
- end_date = std::time(NULL);
- have_ending = true;
- break;
-
- case 'h': show_help(std::cout); break;
- case 'f': file = new std::ifstream(optarg); break;
-
- case 'C': show_cleared = true; break;
- case 'R': show_virtual = false; break;
- case 'w': use_warnings = true; break;
- case 's': show_children = true; break;
- case 'S': show_empty = true; break;
- case 'n': show_subtotals = false; break;
- case 'F': full_names = true; break;
-
- // -i path-to-file-of-regexps
- case 'i':
- read_regexps(optarg, regexps);
- break;
-
- // -p "COMMODITY=PRICE"
- // -p path-to-price-database
- case 'p':
- prices = optarg;
- break;
-
- case 'P':
- get_quotes = true;
- break;
-
- case 'v':
- std::cout
- << "Ledger Accouting Tool " LEDGER_VERSION << std::endl
- << " Copyright (c) 2003 John Wiegley <johnw@newartisans.com>"
- << std::endl << std::endl
- << "This program is made available under the terms of the BSD"
- << std::endl
- << "Public License. See the LICENSE file included with the"
- << std::endl
- << "distribution for details and disclaimer." << std::endl;
- return 0;
- }
- }
-
- if (optind == argc) {
- show_help(std::cout);
- return 1;
- }
-
- index = optind;
-
- if (use_warnings && (have_beginning || have_ending)) {
- std::cout << "Reporting";
-
- if (have_beginning) {
- char buf[32];
- std::strftime(buf, 31, "%Y.%m.%d", std::localtime(&begin_date));
- std::cout << " from " << buf;
- }
-
- if (have_ending) {
- char buf[32];
- std::strftime(buf, 31, "%Y.%m.%d", std::localtime(&end_date));
- std::cout << " until " << buf;
- }
-
- std::cout << std::endl;
- }
-
- // A ledger data file must be specified
-
- if (! file) {
- const char * p = std::getenv("LEDGER");
- if (p)
- file = new std::ifstream(p);
-
- if (! file || ! *file) {
- std::cerr << ("Please specify ledger file using -f option "
- "or LEDGER environment variable.")
- << std::endl;
- return 1;
- }
- }
-
- // Read the command word
-
- const std::string command = argv[index++];
-
- int name_index = index;
- if (command == "register") {
- if (optind == argc) {
- std::cerr << ("Error: Must specify an account name "
- "after the 'register' command.") << std::endl;
- return 1;
- }
- index++;
- }
-
- // Compile the list of specified regular expressions, which can be
- // specified after the command, or using the '-i FILE' option
-
- for (; index < argc; index++)
- regexps.push_back(new mask(argv[index]));
-
- // Parse the ledger
-
-#ifdef READ_GNUCASH
- char buf[32];
- file->get(buf, 31);
- file->seekg(0);
-
- if (std::strncmp(buf, "<?xml version=\"1.0\"?>", 21) == 0)
- main_ledger = parse_gnucash(*file, command == "equity");
- else
-#endif
- main_ledger = parse_ledger(*file, regexps, command == "equity");
-
- delete file;
-
- if (! main_ledger)
- std::exit(1);
-
- // Record any prices specified by the user
-
- if (! prices.empty()) {
- if (access(prices.c_str(), R_OK) != -1) {
- std::ifstream pricedb(prices.c_str());
- while (! pricedb.eof()) {
- char buf[80];
- pricedb.getline(buf, 79);
- if (*buf && ! std::isspace(*buf))
- parse_price_setting(buf);
- }
- } else {
- parse_price_setting(prices);
- }
- }
-
- // Process the command
-
- if (command == "balance") {
- report_balances(std::cout, regexps);
- }
- else if (command == "register") {
- print_register(argv[name_index], std::cout, regexps);
- }
- else if (command == "print") {
- main_ledger->sort(cmp_entry_date());
- main_ledger->print(std::cout, regexps, true);
- }
- else if (command == "equity") {
- equity_ledger(std::cout, regexps);
- }
-
-#ifdef DEBUG
- // Ordinarily, deleting the main ledger just isn't necessary at
- // this point.
-
- delete main_ledger;
-
- // Delete the known regexp maps.
-
- for (regexps_map_iterator r = regexps.begin();
- r != regexps.end();
- r++) {
- delete *r;
- }
-#endif
-}
-
-// main.cc ends here.