Switch to recommended form of GPLv3 permissions notice.
[bpt/emacs.git] / lisp / rot13.el
CommitLineData
52490bfc 1;;; rot13.el --- display a buffer in ROT13
c88ab9ce 2
c90f2757 3;; Copyright (C) 1988, 2001, 2002, 2003, 2004, 2005,
409cc4a3 4;; 2006, 2007, 2008 Free Software Foundation, Inc.
9750e079 5
55535639 6;; Author: Howard Gayle
e5167999 7;; Maintainer: FSF
3b4a6e27
JB
8
9;; This file is part of GNU Emacs.
10
eb3fa2cf 11;; GNU Emacs is free software: you can redistribute it and/or modify
3b4a6e27 12;; it under the terms of the GNU General Public License as published by
eb3fa2cf
GM
13;; the Free Software Foundation, either version 3 of the License, or
14;; (at your option) any later version.
3b4a6e27
JB
15
16;; GNU Emacs is distributed in the hope that it will be useful,
17;; but WITHOUT ANY WARRANTY; without even the implied warranty of
18;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19;; GNU General Public License for more details.
20
21;; You should have received a copy of the GNU General Public License
eb3fa2cf 22;; along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>.
3b4a6e27 23
07b3798c 24;;; Commentary:
3b4a6e27 25
280b8e59 26;; The entry point, `rot13-other-window', performs a Caesar cipher
f1180544 27;; encrypt/decrypt on the current buffer and displays the result in another
52490bfc 28;; window. ROT13 encryption is sometimes used on USENET as a read-at-your-
d9ecc911
ER
29;; own-risk wrapper for material some might consider offensive, such as
30;; ethnic humor.
31;;
716e9939 32;; Written by Howard Gayle.
3b4a6e27 33;; This hack is mainly to show off the char table stuff.
280b8e59
SJ
34;;
35;; New entry points, `rot13', `rot13-string', and `rot13-region' that
36;; performs Ceasar cipher encrypt/decrypt on buffers and strings, was
37;; added by Simon Josefsson.
3b4a6e27 38
e5167999
ER
39;;; Code:
40
3b4a6e27
JB
41(defvar rot13-display-table
42 (let ((table (make-display-table))
43 (i 0))
44 (while (< i 26)
342df1e2
RS
45 (aset table (+ i ?a) (vector (+ (% (+ i 13) 26) ?a)))
46 (aset table (+ i ?A) (vector (+ (% (+ i 13) 26) ?A)))
3b4a6e27
JB
47 (setq i (1+ i)))
48 table)
52490bfc 49 "Char table for ROT13 display.")
3b4a6e27 50
280b8e59
SJ
51(defvar rot13-translate-table
52 (let ((str (make-string 127 0))
53 (i 0))
54 (while (< i 127)
55 (aset str i i)
56 (setq i (1+ i)))
57 (setq i 0)
58 (while (< i 26)
59 (aset str (+ i ?a) (+ (% (+ i 13) 26) ?a))
60 (aset str (+ i ?A) (+ (% (+ i 13) 26) ?A))
61 (setq i (1+ i)))
62 str)
52490bfc 63 "String table for ROT13 translation.")
280b8e59
SJ
64
65;;;###autoload
66(defun rot13 (object &optional start end)
52490bfc 67 "Return ROT13 encryption of OBJECT, a buffer or string."
280b8e59
SJ
68 (if (bufferp object)
69 (with-current-buffer object
70 (rot13-region start end))
71 (rot13-string object)))
72
73;;;###autoload
74(defun rot13-string (string)
52490bfc 75 "Return ROT13 encryption of STRING."
280b8e59
SJ
76 (with-temp-buffer
77 (insert string)
78 (rot13-region (point-min) (point-max))
79 (buffer-string)))
80
81;;;###autoload
82(defun rot13-region (start end)
52490bfc 83 "ROT13 encrypt the region between START and END in current buffer."
280b8e59
SJ
84 (interactive "r")
85 (translate-region start end rot13-translate-table))
86
8931b34a 87;;;###autoload
3b4a6e27 88(defun rot13-other-window ()
52490bfc 89 "Display current buffer in ROT13 in another window.
c8c6b45a
EZ
90The text itself is not modified, only the way it is displayed is affected.
91
52490bfc 92To terminate the ROT13 display, delete that window. As long as that window
c8c6b45a 93is not deleted, any buffer displayed in it will become instantly encoded
52490bfc 94in ROT13.
c8c6b45a 95
1604ce98 96See also `toggle-rot13-mode'."
3b4a6e27
JB
97 (interactive)
98 (let ((w (display-buffer (current-buffer) t)))
99 (set-window-display-table w rot13-display-table)))
100
dcd12c89
RS
101;;;###autoload
102(defun toggle-rot13-mode ()
52490bfc 103 "Toggle the use of ROT13 encoding for the current window."
dcd12c89
RS
104 (interactive)
105 (if (eq (window-display-table (selected-window)) rot13-display-table)
106 (set-window-display-table (selected-window) nil)
107 (if (null (window-display-table (selected-window)))
108 (set-window-display-table (selected-window) rot13-display-table))))
109
3b4a6e27 110(provide 'rot13)
c88ab9ce 111
cbee283d 112;; arch-tag: ad5b9ca8-946c-4414-996f-e9b1bf9ec79f
c88ab9ce 113;;; rot13.el ends here