From 8c5b124e9961d3ee64105e1576e79f304c18b40e Mon Sep 17 00:00:00 2001 From: John Wiegley Date: Wed, 29 Oct 2003 07:47:41 +0000 Subject: [PATCH] changes --- Makefile | 4 +-- ledger.cc | 6 ++-- ledger.el | 89 +++++++++++++++++++++++++++++++++++++++++++++++++++++- ledger.h | 9 +++++- parse.cc | 3 +- reports.cc | 2 +- 6 files changed, 105 insertions(+), 8 deletions(-) diff --git a/Makefile b/Makefile index 44153cd9..a1478b4f 100644 --- a/Makefile +++ b/Makefile @@ -3,8 +3,8 @@ OBJS = $(patsubst %.cc,%.o,$(CODE)) CFLAGS = -Wall -ansi -pedantic DFLAGS = -O3 -fomit-frame-pointer #DFLAGS = -g -DDEBUG=1 -INCS = -LIBS = -lgmpxx -lgmp -lpcre +INCS = -I/sw/include +LIBS = -L/sw/lib -lgmpxx -lgmp -lpcre ifdef GNUCASH CODE := $(CODE) gnucash.cc diff --git a/ledger.cc b/ledger.cc index 37623f5c..8a1a61ce 100644 --- a/ledger.cc +++ b/ledger.cc @@ -6,6 +6,8 @@ namespace ledger { book * main_ledger; +extern int linenum; + commodity::~commodity() { if (price) @@ -197,7 +199,7 @@ bool entry::finalize(bool do_compute) if (! empty_allowed || balance.amounts.empty() || balance.amounts.size() != 1) { - std::cerr << "Error, line " //<< linenum + std::cerr << "Error, line " << linenum << ": Transaction entry is lacking an amount." << std::endl; return false; @@ -271,7 +273,7 @@ bool entry::finalize(bool do_compute) // right (i.e., zero for every commodity). if (! validate()) { - std::cerr << "Error, line " //<< (linenum - 1) + std::cerr << "Error, line " << (linenum - 1) << ": Failed to balance the following transaction:" << std::endl; validate(true); diff --git a/ledger.el b/ledger.el index 42be85a6..a987a018 100644 --- a/ledger.el +++ b/ledger.el @@ -9,8 +9,95 @@ (delete-char 5) (exchange-point-and-mark))) +(defun ledger-clear-current () + (interactive) + (save-excursion + (when (re-search-backward "^[0-9]" nil t) + (skip-chars-forward "0-9./") + (insert " *")))) + (define-derived-mode ledger-mode text-mode "Ledger" "A mode for editing ledger data files." (setq comment-start ";" comment-end nil) (let ((map (current-local-map))) - (define-key map [(control ?c) ?n] 'ledger-add-entry))) + (define-key map [(control ?c) (control ?n)] 'ledger-add-entry) + (define-key map [(control ?c) (control ?c)] + 'ledger-clear-current))) + +(defun ledger-parse-entries (account) + (let* ((now (current-time)) + (current-year (nth 5 (decode-time now))) + (then now) + entries) + ;; `then' is 45 days ago + (setq then (time-subtract then (seconds-to-time (* 45 24 60 60)))) + (while (not (eobp)) + (when (looking-at + (concat "\\(Y\\s-+\\([0-9]+\\)\\|\\([0-9]{4}+\\)?[./]?" + "\\([0-9]+\\)[./]\\([0-9]+\\)\\s-+" + "\\(\\*\\s-+\\)?\\(.+\\)\\)")) + (let ((found (match-string 2)) + when) + (if found + (setq current-year (string-to-number found)) + (let ((start (match-beginning 0)) + (year (match-string 3)) + (month (string-to-number (match-string 4))) + (day (string-to-number (match-string 5))) + (mark (match-string 6)) + (desc (match-string 7))) + (if (and year (> (length year) 0)) + (setq year (string-to-number year))) + (setq when (encode-time 0 0 0 day month + (or year current-year))) + (when (or (not mark) (time-less-p then when)) + (forward-line) + (while (looking-at + (concat "\\s-+\\([A-Za-z_].+?\\) \\s-*" + "\\([^0-9]+\\)\\s-*\\([0-9.]+\\)")) + (let ((acct (match-string 1)) + (amt (match-string 3))) + (if (string= account acct) + (setq entries + (cons (list (copy-marker start) + mark when desc amt) + entries)))) + (forward-line))))))) + (forward-line)) + (nreverse entries))) + +(define-derived-mode ledger-reconcile-mode text-mode "Reconcile" + "A mode for reconciling ledger entries." + (let ((map (make-sparse-keymap))) + (define-key map [space] 'ledger-reconcile-toggle) + (use-local-map map))) + +(defvar ledger-buf nil) +(make-variable-buffer-local 'ledger-buf) + +(defun ledger-reconcile-toggle () + (interactive) + (let ((where (get-text-property (point) 'where))) + (with-current-buffer ledger-buf + (goto-char where) + (ledger-clear-current)))) + +(defun ledger-reconcile (account) + (interactive "sAccount to reconcile: ") + (let ((items (save-excursion + (goto-char (point-min)) + (ledger-parse-entries account))) + (buf (current-buffer))) + (pop-to-buffer (generate-new-buffer "*Reconcile*")) + (ledger-reconcile-mode) + (setq ledger-buf buf) + (dolist (item items) + (let ((beg (point))) + (insert (format "%s %-30s %8.2f\n" + (format-time-string "%Y.%m.%d" (nth 2 item)) + (nth 3 item) + (string-to-number (nth 4 item)))) + (if (nth 1 item) + (set-text-properties beg (1- (point)) + (list 'face 'bold + 'where (nth 0 item)))))))) diff --git a/ledger.h b/ledger.h index c63ce574..de30843e 100644 --- a/ledger.h +++ b/ledger.h @@ -1,5 +1,5 @@ #ifndef _LEDGER_H -#define _LEDGER_H "$Revision: 1.27 $" +#define _LEDGER_H "$Revision: 1.28 $" ////////////////////////////////////////////////////////////////////// // @@ -20,6 +20,9 @@ #ifdef DEBUG #include #else +#ifdef assert +#undef assert +#endif #define assert(x) #endif @@ -297,9 +300,13 @@ inline commodity::commodity(const std::string& sym, bool pre, bool sep, bool thou, bool euro, int prec) : symbol(sym), price(NULL), prefix(pre), separate(sep), thousands(thou), european(euro), precision(prec) { +#ifdef DEBUG std::pair result = +#endif main_ledger->commodities.insert(commodities_map_pair(sym, this)); +#ifdef DEBUG assert(result.second); +#endif } // Parsing routines diff --git a/parse.cc b/parse.cc index 4af13a43..1e0c9ffa 100644 --- a/parse.cc +++ b/parse.cc @@ -117,7 +117,8 @@ void parse_price_setting(const std::string& setting) #define MAX_LINE 1024 -static int linenum; +int linenum; + static bool do_compute; transaction * parse_transaction(std::istream& in, book * ledger) diff --git a/reports.cc b/reports.cc index 5d5aea18..7add7379 100644 --- a/reports.cc +++ b/reports.cc @@ -491,7 +491,7 @@ void book::print(std::ostream& out, regexps_map& regexps, for (entries_list_const_iterator i = entries.begin(); i != entries.end(); i++) { - if ((show_cleared && ! (*i)->cleared) || + if ((! show_cleared && (*i)->cleared) || ! matches_date_range(*i) || ! (*i)->matches(regexps)) continue;