# HG changeset patch # User Roland McGrath # Date 742692964 0 # Node ID afa2afad53c4e10991d721c90b98fd8f53a297b6 # Parent 410395998370779b9d3ec661b10a8bb1395f6503 (cookie-cache): New defvar. (cookie-snarf): Cache cookies in `cookie-cache', not in obarray (idiot). Also store the modtime and punt the cache when it changes. diff -r 410395998370 -r afa2afad53c4 lisp/play/cookie1.el --- a/lisp/play/cookie1.el Wed Jul 14 20:56:19 1993 +0000 +++ b/lisp/play/cookie1.el Wed Jul 14 23:36:04 1993 +0000 @@ -60,6 +60,9 @@ (defconst cookie-delimiter "\n%%\n\\|\0" "Delimiter used to separate cookie file entries.") +(defvar cookie-cache (make-vector 511 0) + "Cache of cookie files that have already been snarfed.") + (defun cookie (phrase-file startmsg endmsg) "Return a random phrase from PHRASE-FILE. When the phrase file is read in, display STARTMSG at beginning of load, ENDMSG at end." @@ -89,23 +92,31 @@ "Reads in the PHRASE-FILE, returns it as a vector of strings. Emit STARTMSG and ENDMSG before and after. Caches the result; second and subsequent calls on the same file won't go to disk." - (if (boundp (intern phrase-file)) - (eval (intern phrase-file)) - (message startmsg) - (save-excursion - (let ((buf (generate-new-buffer "*cookie*")) - (result nil)) - (set-buffer buf) - (insert-file-contents (expand-file-name phrase-file)) - (re-search-forward cookie-delimiter) - (while (progn (skip-chars-forward " \t\n\r\f") (not (eobp))) - (let ((beg (point))) - (re-search-forward cookie-delimiter) - (setq result (cons (buffer-substring beg (1- (point))) - result)))) - (kill-buffer buf) - (message endmsg) - (set (intern phrase-file) (apply 'vector result)))))) + (let ((sym (intern-soft phrase-file cookie-cache))) + (and sym (not (equal (symbol-function sym) + (nth 5 (file-attributes phrase-file)))) + (yes-or-no-p (concat phrase-file + " has changed. Read new contents? ")) + (setq sym nil)) + (if sym + (symbol-value sym) + (setq sym (intern phrase-file cookie-cache)) + (message startmsg) + (save-excursion + (let ((buf (generate-new-buffer "*cookie*")) + (result nil)) + (set-buffer buf) + (fset sym (nth 5 (file-attributes phrase-file))) + (insert-file-contents (expand-file-name phrase-file)) + (re-search-forward cookie-delimiter) + (while (progn (skip-chars-forward " \t\n\r\f") (not (eobp))) + (let ((beg (point))) + (re-search-forward cookie-delimiter) + (setq result (cons (buffer-substring beg (1- (point))) + result)))) + (kill-buffer buf) + (message endmsg) + (set sym (apply 'vector result))))))) (defun pick-random (n) "Returns a random number from 0 to N-1 inclusive."