]> code.delx.au - gnu-emacs/blobdiff - lisp/play/decipher.el
(gomoku-buffer-name): New constant.
[gnu-emacs] / lisp / play / decipher.el
index f90e1f4a3273c40e95e8ee16c2d80c9f29237015..4edbdbcb1a9ce134efe4dbe2e4e4ab638f00e336 100644 (file)
@@ -1,8 +1,8 @@
-;;; decipher.el --- Cryptanalyze monoalphabetic substitution ciphers
+;;; decipher.el --- cryptanalyze monoalphabetic substitution ciphers
 ;;
-;; Copyright (C) 1995, 1996 Free Software Foundation, Inc.
+;; Copyright (C) 1995, 1996, 2003 Free Software Foundation, Inc.
 ;;
-;; Author: Christopher J. Madsen <ac608@yfn.ysu.edu>
+;; Author: Christopher J. Madsen <chris_madsen@geocities.com>
 ;; Keywords: games
 ;;
 ;; This file is part of GNU Emacs.
 ;; GNU General Public License for more details.
 ;;
 ;; You should have received a copy of the GNU General Public License
-;; along with GNU Emacs; see the file COPYING.  If not, write to
-;; the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+;; along with GNU Emacs; see the file COPYING.  If not, write to the
+;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;; Boston, MA 02111-1307, USA.
 
+;;; Commentary:
+;;
 ;;; Quick Start:
 ;;
 ;; To decipher a message, type or load it into a buffer and type
@@ -36,8 +39,6 @@
 ;;   Helen Fouche Gaines
 ;;   ISBN 0-486-20097-3
 
-;;; Commentary:
-;;
 ;; This package is designed to help you crack simple substitution
 ;; ciphers where one letter stands for another.  It works for ciphers
 ;; with or without word divisions.  (You must set the variable
 (eval-when-compile
   (require 'cl))
 
-(defvar decipher-force-uppercase t
+(defgroup decipher nil
+  "Cryptanalyze monoalphabetic substitution ciphers."
+  :prefix "decipher-"
+  :group 'games)
+
+(defcustom decipher-force-uppercase t
   "*Non-nil means to convert ciphertext to uppercase.
-Nil means the case of the ciphertext is preserved.
-This variable must be set before typing `\\[decipher]'.")
+nil means the case of the ciphertext is preserved.
+This variable must be set before typing `\\[decipher]'."
+  :type 'boolean
+  :group 'decipher)
 
-(defvar decipher-ignore-spaces nil
+
+(defcustom decipher-ignore-spaces nil
   "*Non-nil means to ignore spaces and punctuation when counting digrams.
 You should set this to `nil' if the cipher message is divided into words,
 or `t' if it is not.
-This variable is buffer-local.")
+This variable is buffer-local."
+  :type 'boolean
+  :group 'decipher)
 (make-variable-buffer-local 'decipher-ignore-spaces)
 
-(defvar decipher-undo-limit 5000
+(defcustom decipher-undo-limit 5000
   "The maximum number of entries in the undo list.
 When the undo list exceeds this number, 100 entries are deleted from
-the tail of the list.")
+the tail of the list."
+  :type 'integer
+  :group 'decipher)
+
+(defcustom decipher-mode-hook nil
+  "Hook to run upon entry to decipher."
+  :type 'hook
+  :group 'decipher)
 
 ;; End of user modifiable variables
 ;;--------------------------------------------------------------------
@@ -115,7 +133,7 @@ the tail of the list.")
 (defvar decipher-font-lock-keywords
   '(("^:.*"  . font-lock-keyword-face)
     ("^>.*"  . font-lock-string-face)
-    ("^%!.*" . font-lock-reference-face)
+    ("^%!.*" . font-lock-constant-face)
     ("^%.*"  . font-lock-comment-face)
     ("\\`(\\([a-z]+\\) +\\([A-Z]+\\)"
      (1 font-lock-string-face)
@@ -124,12 +142,14 @@ the tail of the list.")
      (1 font-lock-keyword-face)
      (2 font-lock-string-face)))
   "Expressions to fontify in Decipher mode.
-! Ciphertext uses `font-lock-keyword-face', plaintext uses
+
+Ciphertext uses `font-lock-keyword-face', plaintext uses
 `font-lock-string-face', comments use `font-lock-comment-face', and
-checkpoints use `font-lock-reference-face'.  You can customize the
+checkpoints use `font-lock-constant-face'.  You can customize the
 display by changing these variables.  For best results, I recommend
 that all faces use the same background color.
-! For example, to display ciphertext in the `bold' face, use
+
+For example, to display ciphertext in the `bold' face, use
   (add-hook 'decipher-mode-hook
             (lambda () (set (make-local-variable 'font-lock-keyword-face)
                             'bold)))
@@ -150,10 +170,8 @@ in your `.emacs' file.")
       (define-key decipher-mode-map "R" 'decipher-restore-checkpoint)
       (define-key decipher-mode-map "U" 'decipher-undo)
       (define-key decipher-mode-map " " 'decipher-keypress)
-      (substitute-key-definition 'undo  'decipher-undo
-                                 decipher-mode-map global-map)
-      (substitute-key-definition 'advertised-undo  'decipher-undo
-                                 decipher-mode-map global-map)
+      (define-key decipher-mode-map [remap undo] 'decipher-undo)
+      (define-key decipher-mode-map [remap advertised-undo] 'decipher-undo)
       (let ((key ?a))
         (while (<= key ?z)
           (define-key decipher-mode-map (vector key) 'decipher-keypress)
@@ -291,7 +309,6 @@ The most useful commands are:
   (set (make-local-variable 'font-lock-defaults)
        '(decipher-font-lock-keywords t))
   ;; Make the buffer writable when we exit Decipher mode:
-  (make-local-hook 'change-major-mode-hook)
   (add-hook 'change-major-mode-hook
             (lambda () (setq buffer-read-only nil
                              buffer-undo-list nil))
@@ -405,13 +422,17 @@ The most useful commands are:
               (setcdr (nthcdr (1- new-size) decipher-undo-list) nil)
               (setq decipher-undo-list-size new-size))))))
 
+(defun decipher-copy-cons (cons)
+  (if cons
+      (cons (car cons) (cdr cons))))
+
 (defun decipher-get-undo (cipher-char plain-char)
   ;; Return an undo record that will undo the result of
   ;;   (decipher-set-map CIPHER-CHAR PLAIN-CHAR)
-  ;; We must use copy-list because the original cons cells will be
+  ;; We must copy the cons cell because the original cons cells will be
   ;; modified using setcdr.
-  (let ((cipher-map (copy-list (rassoc cipher-char decipher-alphabet)))
-        (plain-map  (copy-list (assoc  plain-char  decipher-alphabet))))
+  (let ((cipher-map (decipher-copy-cons (rassoc cipher-char decipher-alphabet)))
+        (plain-map  (decipher-copy-cons (assoc  plain-char  decipher-alphabet))))
     (cond ((equal ?\  plain-char)
            cipher-map)
           ((equal cipher-char (cdr plain-map))
@@ -663,7 +684,7 @@ ciphertext."
       (set-buffer (decipher-stats-buffer))
       (goto-char (point-min))
       (or (re-search-forward (format "^%c: " cipher-char) nil t)
-          (error "Character `%c' is not used in ciphertext." cipher-char))
+          (error "Character `%c' is not used in ciphertext" cipher-char))
       (forward-line -1)
       (setq start (point))
       (forward-line 3)