   "Take a date descriptor string and return a function that
 returns true if the date meets the requirements"
   (with-temp-buffer
+    ;; copy the descriptor string into a temp buffer for manipulation
     (let (pos)
+      ;; Replace brackets with parens
       (insert descriptor-string)
       (goto-char (point-min))
       (replace-string "[" "(")
       (goto-char (point-min))
       (replace-string "]" ")")
       (goto-char (point-max))
+      ;; double quote all the descriptors for string processing later
       (while (re-search-backward 
-	      (concat "\\([0-9]+\\|[\*]\\)/"  ;; Year slot
-		      "\\([\*EO]\\|[0-9]+\\)/" ;; Month slot
+	      (concat "\\(20[0-9][0-9]\\|[\*]\\)[/\\-]"  ;; Year slot
+		      "\\([\*EO]\\|[0-9]+\\)[/\\-]" ;; Month slot
 		      "\\([\*]\\|\\([0-9][0-9]\\)\\|"
 		      "\\([0-5]"
 		      "\\(\\(Su\\)\\|"

	     nil)
	(error "START-DATE day of week doesn't match DAY-OF-WEEK"))))

(defmacro ledger-auto-date-range-macro (month1 day1 month2 day2)
  "Return a form of DATE that is true if DATE falls between MONTH1 DAY1 and MONTH2 DAY2."
  (let ((decoded (gensym))
	(target-month (gensym))

	    (and (> ,target-day ,day1)
		 (< ,target-day ,day2))))))


(defun ledger-auto-is-holiday (date)
  "Return true if DATE is a holiday.")

(defun ledger-auto-scan-transactions (auto-file)
  (interactive "fFile name: ")
  (let ((xact-list (list)))
    (with-current-buffer
	(find-file-noselect auto-file)
      (goto-char (point-min))
      (while (re-search-forward "^\\[\\(.*\\)\\] " nil t)
	(let ((date-descriptor "")
