# HG changeset patch # User Roland McGrath # Date 748291865 0 # Node ID 6aeb2227ed308920604c2752a6d60c134d81f159 # Parent 97c1e7309a2df8bc5332b905af1cdb8a0a9bc0a1 (read-cookie): New function. diff -r 97c1e7309a2d -r 6aeb2227ed30 lisp/play/cookie1.el --- a/lisp/play/cookie1.el Fri Sep 17 17:51:40 1993 +0000 +++ b/lisp/play/cookie1.el Fri Sep 17 18:51:05 1993 +0000 @@ -91,9 +91,9 @@ ;;;###autoload (defun cookie-snarf (phrase-file startmsg endmsg) - "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." + "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." (let ((sym (intern-soft phrase-file cookie-cache))) (and sym (not (equal (symbol-function sym) (nth 5 (file-attributes phrase-file)))) @@ -120,6 +120,26 @@ (message endmsg) (set sym (apply 'vector result))))))) +(defun read-cookie (prompt phrase-file startmsg endmsg &optional require-match) + "Prompt with PROMPT and read with completion among cookies in PHRASE-FILE. +STARTMSG and ENDMSG are passed along to `cookie-snarf'. +Optional fifth arg REQUIRE-MATCH non-nil forces a matching cookie." + ;; Make sure the cookies are in the cache. + (or (intern-soft phrase-file cookie-cache) + (cookie-snarf phrase-file startmsg endmsg)) + (completing-read prompt + (let ((sym (intern phrase-file cookie-cache))) + ;; We cache the alist form of the cookie in a property. + (or (get sym 'completion-alist) + (let* ((alist nil) + (vec (cookie-snarf phrase-file + startmsg endmsg)) + (i (length vec))) + (while (> (setq i (1- i)) 0) + (setq alist (cons (list (aref vec i)) alist))) + (put sym 'completion-alist alist)))) + nil require-match nil nil)) + ; Thanks to Ian G Batten ; [of the University of Birmingham Computer Science Department] ; for the iterative version of this shuffle.