


(defun expenses-buffer ()
  (or (get-buffer "*expenses*")
      (let ((b (find-file-noselect (expand-file-name "~/adm/expenses"))))
	(save-excursion
	  (set-buffer b)
	  (rename-buffer "*expenses*"))
	b)))

(defun add-expense (what howmuch)
  (interactive "sWhat did you buy: \nsHow much did you spend: ")
  (set-buffer (expenses-buffer))
  (or (string-match "^\\([0-9]+\\)\\.?\\([0-9]*\\)$" howmuch)
      (error "Bad amount format"))
  (let ((str (current-time-string))
	(dollar (substring howmuch (match-beginning 1) (match-end 1)))
	(penny (substring howmuch (match-beginning 2) (match-end 2))))
    (while (< (length penny) 2)
      (setq penny (concat penny "0")))
    (goto-char (point-max))
    (or (bolp) (insert "\n"))
    (insert (format "%s%s %6s.%s  %s\n" (substring str 0 11) (substring str 20 24) dollar penny what)))
  (save-buffer))

(defun parse-expense ()
  (beginning-of-line)
  (if (looking-at ".*[ \t]+\\([0-9]+\\)[.]\\([0-9][0-9]\\)[ \t]+\\(.*\\)$")
      (list (buffer-substring (match-beginning 1) (match-end 1))
	    (buffer-substring (match-beginning 2) (match-end 2))
	    (buffer-substring (match-beginning 3) (match-end 3)))
    nil))

(defun total-expenses (beg end)
  (interactive "r")
  (let ((cents 0))
    (save-restriction
      (narrow-to-region beg end)
      (goto-char (point-min))
      (while (< (point) (point-max))
	(let ((e (parse-expense)))
	  (if e
	      (setq cents (+ cents
			     (* 100 (car (read-from-string (car e))))
			     (car (read-from-string (car (cdr e))))))))
	(forward-line 1)))
    (message "Total in region: %d.%02d" (/ cents 100) (% cents 100))))


(defun goto-expenses ()
  (interactive)
  (switch-to-buffer-other-window (expenses-buffer)))
