(rmail-summary-previous-msg): Add docstring.
[emacs.git] / lisp / language / cyrillic.el
blobb4135c68bfbfffee92bc903bf46846c55a45420e
1 ;;; cyrillic.el --- support for Cyrillic -*- coding: iso-2022-7bit; -*-
3 ;; Copyright (C) 1995 Electrotechnical Laboratory, JAPAN.
4 ;; Licensed to the Free Software Foundation.
5 ;; Copyright (C) 2001, 2002 Free Software Foundation, Inc.
7 ;; Author: Kenichi Handa <handa@etl.go.jp>
8 ;; Keywords: multilingual, Cyrillic, i18n
10 ;; This file is part of GNU Emacs.
12 ;; GNU Emacs is free software; you can redistribute it and/or modify
13 ;; it under the terms of the GNU General Public License as published by
14 ;; the Free Software Foundation; either version 2, or (at your option)
15 ;; any later version.
17 ;; GNU Emacs is distributed in the hope that it will be useful,
18 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
19 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20 ;; GNU General Public License for more details.
22 ;; You should have received a copy of the GNU General Public License
23 ;; along with GNU Emacs; see the file COPYING. If not, write to the
24 ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
25 ;; Boston, MA 02111-1307, USA.
27 ;;; Commentary:
29 ;; The character set ISO8859-5 is supported. KOI-8 and ALTERNATIVNYJ
30 ;; are converted to Unicode internally. See
31 ;; <URL:http://www.ecma.ch/ecma1/STAND/ECMA-113.HTM>. For more info
32 ;; on Cyrillic charsets, see
33 ;; <URL:http://czyborra.com/charsets/cyrillic.html>. The KOI and
34 ;; Alternativnyj coding systems should live in code-pages.el, but
35 ;; they've always been preloaded and the coding system autoload
36 ;; mechanism didn't get accepted, so they have to stay here and
37 ;; duplicate code-pages stuff.
39 ;; Note that 8859-5 maps directly onto the Unicode Cyrillic block,
40 ;; apart from codepoints 160 (NBSP, c.f. U+0400), 173 (soft hyphen,
41 ;; c.f. U+04OD) and 253 (section sign, c.f U+045D). The KOI-8 and
42 ;; Alternativnyj coding systems encode both 8859-5 and Unicode.
43 ;; ucs-tables.el provides unification for cyrillic-iso-8bit.
45 ;; Customizing `utf-fragment-on-decoding' allows decoding characters
46 ;; from KOI and Alternativnyj into 8859-5 where that's possible.
47 ;; cyrillic-iso8859-5 characters take half as much space in the buffer
48 ;; as the mule-unicode-0100-24ff equivalents, though that's probably
49 ;; not normally a big deal.
51 ;;; Code:
53 ;; Cyrillic (general)
55 ;; ISO-8859-5 stuff
57 (make-coding-system
58 'cyrillic-iso-8bit 2 ?5
59 "ISO 2022 based 8-bit encoding for Cyrillic script (MIME:ISO-8859-5)."
60 '(ascii cyrillic-iso8859-5 nil nil
61 nil nil nil nil nil nil nil nil nil nil nil t)
62 '((safe-charsets ascii cyrillic-iso8859-5)
63 (mime-charset . iso-8859-5)))
65 (define-coding-system-alias 'iso-8859-5 'cyrillic-iso-8bit)
67 (set-language-info-alist
68 "Cyrillic-ISO" '((charset cyrillic-iso8859-5)
69 (coding-system cyrillic-iso-8bit)
70 (coding-priority cyrillic-iso-8bit)
71 (input-method . "cyrillic-yawerty") ; fixme
72 (nonascii-translation . cyrillic-iso8859-5)
73 (unibyte-display . cyrillic-iso-8bit)
74 (features cyril-util)
75 (sample-text . "Russian (\e,L@caaZXY\e(B) \e,L7T`PRabRcYbU\e(B!")
76 (documentation . "Support for Cyrillic ISO-8859-5."))
77 '("Cyrillic"))
79 ;; KOI-8R stuff
81 ;; The mule-unicode portion of this is from
82 ;; http://www.unicode.org/Public/MAPPINGS/VENDORS/MISC/KOI8-R.TXT,
83 ;; which references RFC 1489.
84 (defvar cyrillic-koi8-r-decode-table
86 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
87 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
88 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
89 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
90 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79
91 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95
92 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111
93 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127
94 ;; 8859-5 plus Unicode
95 ?\e$,2 \e(B ?\e$,2 "\e(B ?\e$,2 ,\e(B ?\e$,2 0\e(B ?\e$,2 4\e(B ?\e$,2 8\e(B ?\e$,2 <\e(B ?\e$,2 D\e(B ?\e$,2 L\e(B ?\e$,2 T\e(B ?\e$,2 \\e(B ?\e$,2!@\e(B ?\e$,2!D\e(B ?\e$,2!H\e(B ?\e$,2!L\e(B ?\e$,2!P\e(B
96 ?\e$,2!Q\e(B ?\e$,2!R\e(B ?\e$,2!S\e(B ?\e$,1{ \e(B ?\e$,2!`\e(B ?\e$,1s"\e(B ?\e$,1x:\e(B ?\e$,1xh\e(B ?\e$,1y$\e(B ?\e$,1y%\e(B ?\e,L \e(B ?\e$,1{!\e(B ?\e,A0\e(B ?\e,A2\e(B ?\e,A7\e(B ?\e,Aw\e(B
97 ?\e$,2 p\e(B ?\e$,2 q\e(B ?\e$,2 r\e(B ?\e,Lq\e(B ?\e$,2 s\e(B ?\e$,2 t\e(B ?\e$,2 u\e(B ?\e$,2 v\e(B ?\e$,2 w\e(B ?\e$,2 x\e(B ?\e$,2 y\e(B ?\e$,2 z\e(B ?\e$,2 {\e(B ?\e$,2 |\e(B ?\e$,2 }\e(B ?\e$,2 ~\e(B
98 ?\e$,2 \x7f\e(B ?\e$,2! \e(B ?\e$,2!!\e(B ?\e,L!\e(B ?\e$,2!"\e(B ?\e$,2!#\e(B ?\e$,2!$\e(B ?\e$,2!%\e(B ?\e$,2!&\e(B ?\e$,2!'\e(B ?\e$,2!(\e(B ?\e$,2!)\e(B ?\e$,2!*\e(B ?\e$,2!+\e(B ?\e$,2!,\e(B ?\e,A)\e(B
99 ?\e,Ln\e(B ?\e,LP\e(B ?\e,LQ\e(B ?\e,Lf\e(B ?\e,LT\e(B ?\e,LU\e(B ?\e,Ld\e(B ?\e,LS\e(B ?\e,Le\e(B ?\e,LX\e(B ?\e,LY\e(B ?\e,LZ\e(B ?\e,L[\e(B ?\e,L\\e(B ?\e,L]\e(B ?\e,L^\e(B
100 ?\e,L_\e(B ?\e,Lo\e(B ?\e,L`\e(B ?\e,La\e(B ?\e,Lb\e(B ?\e,Lc\e(B ?\e,LV\e(B ?\e,LR\e(B ?\e,Ll\e(B ?\e,Lk\e(B ?\e,LW\e(B ?\e,Lh\e(B ?\e,Lm\e(B ?\e,Li\e(B ?\e,Lg\e(B ?\e,Lj\e(B
101 ?\e,LN\e(B ?\e,L0\e(B ?\e,L1\e(B ?\e,LF\e(B ?\e,L4\e(B ?\e,L5\e(B ?\e,LD\e(B ?\e,L3\e(B ?\e,LE\e(B ?\e,L8\e(B ?\e,L9\e(B ?\e,L:\e(B ?\e,L;\e(B ?\e,L<\e(B ?\e,L=\e(B ?\e,L>\e(B
102 ?\e,L?\e(B ?\e,LO\e(B ?\e,L@\e(B ?\e,LA\e(B ?\e,LB\e(B ?\e,LC\e(B ?\e,L6\e(B ?\e,L2\e(B ?\e,LL\e(B ?\e,LK\e(B ?\e,L7\e(B ?\e,LH\e(B ?\e,LM\e(B ?\e,LI\e(B ?\e,LG\e(B ?\e,LJ\e(B
103 ;; All Unicode:
104 ;; ?\e$,2 \e(B ?\e$,2 "\e(B ?\e$,2 ,\e(B ?\e$,2 0\e(B ?\e$,2 4\e(B ?\e$,2 8\e(B ?\e$,2 <\e(B ?\e$,2 D\e(B ?\e$,2 L\e(B ?\e$,2 T\e(B ?\e$,2 \\e(B ?\e$,2!@\e(B ?\e$,2!D\e(B ?\e$,2!H\e(B ?\e$,2!L\e(B ?\e$,2!P\e(B
105 ;; ?\e$,2!Q\e(B ?\e$,2!R\e(B ?\e$,2!S\e(B ?\e$,1{ \e(B ?\e$,2!`\e(B ?\e$,1s"\e(B ?\e$,1x:\e(B ?\e$,1xh\e(B ?\e$,1y$\e(B ?\e$,1y%\e(B ?\e,A \e(B ?\e$,1{!\e(B ?\e,A0\e(B ?\e,A2\e(B ?\e,A7\e(B ?\e,Aw\e(B
106 ;; ?\e$,2 p\e(B ?\e$,2 q\e(B ?\e$,2 r\e(B ?\e$,1(q\e(B ?\e$,2 s\e(B ?\e$,2 t\e(B ?\e$,2 u\e(B ?\e$,2 v\e(B ?\e$,2 w\e(B ?\e$,2 x\e(B ?\e$,2 y\e(B ?\e$,2 z\e(B ?\e$,2 {\e(B ?\e$,2 |\e(B ?\e$,2 }\e(B ?\e$,2 ~\e(B
107 ;; ?\e$,2 \x7f\e(B ?\e$,2! \e(B ?\e$,2!!\e(B ?\e$,1(!\e(B ?\e$,2!"\e(B ?\e$,2!#\e(B ?\e$,2!$\e(B ?\e$,2!%\e(B ?\e$,2!&\e(B ?\e$,2!'\e(B ?\e$,2!(\e(B ?\e$,2!)\e(B ?\e$,2!*\e(B ?\e$,2!+\e(B ?\e$,2!,\e(B ?\e,A)\e(B
108 ;; ?\e$,1(n\e(B ?\e$,1(P\e(B ?\e$,1(Q\e(B ?\e$,1(f\e(B ?\e$,1(T\e(B ?\e$,1(U\e(B ?\e$,1(d\e(B ?\e$,1(S\e(B ?\e$,1(e\e(B ?\e$,1(X\e(B ?\e$,1(Y\e(B ?\e$,1(Z\e(B ?\e$,1([\e(B ?\e$,1(\\e(B ?\e$,1(]\e(B ?\e$,1(^\e(B
109 ;; ?\e$,1(_\e(B ?\e$,1(o\e(B ?\e$,1(`\e(B ?\e$,1(a\e(B ?\e$,1(b\e(B ?\e$,1(c\e(B ?\e$,1(V\e(B ?\e$,1(R\e(B ?\e$,1(l\e(B ?\e$,1(k\e(B ?\e$,1(W\e(B ?\e$,1(h\e(B ?\e$,1(m\e(B ?\e$,1(i\e(B ?\e$,1(g\e(B ?\e$,1(j\e(B
110 ;; ?\e$,1(N\e(B ?\e$,1(0\e(B ?\e$,1(1\e(B ?\e$,1(F\e(B ?\e$,1(4\e(B ?\e$,1(5\e(B ?\e$,1(D\e(B ?\e$,1(3\e(B ?\e$,1(E\e(B ?\e$,1(8\e(B ?\e$,1(9\e(B ?\e$,1(:\e(B ?\e$,1(;\e(B ?\e$,1(<\e(B ?\e$,1(=\e(B ?\e$,1(>\e(B
111 ;; ?\e$,1(?\e(B ?\e$,1(O\e(B ?\e$,1(@\e(B ?\e$,1(A\e(B ?\e$,1(B\e(B ?\e$,1(C\e(B ?\e$,1(6\e(B ?\e$,1(2\e(B ?\e$,1(L\e(B ?\e$,1(K\e(B ?\e$,1(7\e(B ?\e$,1(H\e(B ?\e$,1(M\e(B ?\e$,1(I\e(B ?\e$,1(G\e(B ?\e$,1(J\e(B
113 "Cyrillic KOI8-R decoding table.")
115 (let ((table (make-translation-table-from-vector
116 cyrillic-koi8-r-decode-table)))
117 (define-translation-table 'cyrillic-koi8-r-nonascii-translation-table table)
118 (define-translation-table 'cyrillic-koi8-r-encode-table
119 (char-table-extra-slot table 0)))
121 ;; No point in keeping it around. (It can't be let-bound, since it's
122 ;; needed for macro expansion.)
123 (makunbound 'cyrillic-koi8-r-decode-table)
125 (define-ccl-program ccl-decode-koi8
127 ((loop
128 (r0 = 0)
129 (read r1)
130 (if (r1 < 128)
131 (write-repeat r1)
132 ((translate-character cyrillic-koi8-r-nonascii-translation-table r0 r1)
133 (translate-character ucs-translation-table-for-decode r0 r1)
134 (write-multibyte-character r0 r1)
135 (repeat))))))
136 "CCL program to decode KOI8-R.")
138 (define-ccl-program ccl-encode-koi8
140 ((loop
141 (read-multibyte-character r0 r1)
142 (translate-character cyrillic-koi8-r-encode-table r0 r1)
143 (if (r0 != ,(charset-id 'ascii))
144 (if (r0 != ,(charset-id 'eight-bit-graphic))
145 (if (r0 != ,(charset-id 'eight-bit-control))
146 (r1 = ??))))
147 (write-repeat r1))))
148 "CCL program to encode KOI8-R.")
150 (defun cyrillic-unify-encoding (table)
151 "Set up equivalent characters in the encoding TABLE.
152 This works whether or not the table is Unicode-based or
153 8859-5-based. (Only appropriate for Cyrillic.)"
154 (let ((table (get table 'translation-table)))
155 (dotimes (i 96)
156 (let* ((c (make-char 'cyrillic-iso8859-5 (+ i 32)))
157 (u ; equivalent Unicode char
158 (cond ((eq c ?\e,L \e(B) ?\e,A \e(B)
159 ((eq c ?\e,L-\e(B) ?\e,A-\e(B)
160 ((eq c ?\e,L}\e(B) ?\e,A'\e(B)
161 (t (decode-char 'ucs (+ #x400 i)))))
162 (ec (aref table c)) ; encoding of 8859-5
163 (uc (aref table u))) ; encoding of Unicode
164 (unless (memq c '(?\e,L \e(B ?\e,L-\e(B ?\e,L}\e(B)) ; 8859-5 exceptions
165 (unless uc
166 (aset table u ec))
167 (unless ec
168 (aset table c uc)))))))
170 (cyrillic-unify-encoding 'cyrillic-koi8-r-encode-table)
172 (make-coding-system
173 'cyrillic-koi8 4
174 ;; We used to use ?K. It is true that ?K is more strictly correct,
175 ;; but it is also used for Korean.
176 ;; So people who use koi8 for languages other than Russian
177 ;; will have to forgive us.
178 ?R "KOI8-R 8-bit encoding for Cyrillic (MIME: KOI8-R)."
179 '(ccl-decode-koi8 . ccl-encode-koi8)
180 `((safe-chars . cyrillic-koi8-r-encode-table)
181 (mime-charset . koi8-r)
182 (valid-codes (0 . 255))
183 (dependency unify-8859-on-encoding-mode unify-8859-on-decoding-mode)))
185 (define-coding-system-alias 'koi8-r 'cyrillic-koi8)
186 (define-coding-system-alias 'koi8 'cyrillic-koi8)
187 (define-coding-system-alias 'cp878 'cyrillic-koi8)
189 ;; Allow displaying some of KOI & al with an 8859-5-encoded font. We
190 ;; won't bother about the exceptions when encoding the font, since
191 ;; NBSP will fall through below and work anyhow, and we'll have
192 ;; avoided setting the fontset for the other two to 8859-5 -- they're
193 ;; not in KOI and Alternativnyj anyhow.
194 (define-ccl-program ccl-encode-8859-5-font
196 ((if (r0 == ,(charset-id 'cyrillic-iso8859-5))
197 (r1 += 128)
198 (if (r0 == ,(charset-id 'mule-unicode-0100-24ff))
199 (r1 = (r2 + 128))))))
200 "Encode ISO 8859-5 and Cyrillic Unicode chars to 8859-5 font.")
202 (add-to-list 'font-ccl-encoder-alist '("iso8859-5" . ccl-encode-8859-5-font))
204 ;; The table is set up later to encode both Unicode and 8859-5.
205 (define-ccl-program ccl-encode-koi8-font
207 (translate-character cyrillic-koi8-r-encode-table r0 r1))
208 "CCL program to encode Cyrillic chars to KOI font.")
210 (add-to-list 'font-ccl-encoder-alist '("koi8" . ccl-encode-koi8-font))
212 (set-language-info-alist
213 "Cyrillic-KOI8" `((charset cyrillic-iso8859-5)
214 (nonascii-translation
215 . ,(get 'cyrillic-koi8-r-nonascii-translation-table
216 'translation-table))
217 (coding-system cyrillic-koi8)
218 (coding-priority cyrillic-koi8 cyrillic-iso-8bit)
219 (input-method . "cyrillic-jcuken")
220 (features cyril-util)
221 (unibyte-display . cyrillic-koi8)
222 (sample-text . "Russian (\e,L@caaZXY\e(B) \e,L7T`PRabRcYbU\e(B!")
223 (documentation . "Support for Cyrillic KOI8-R."))
224 '("Cyrillic"))
227 (defvar cyrillic-koi8-u-decode-table
229 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
230 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
231 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
232 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
233 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79
234 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95
235 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111
236 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127
237 ;; All Unicode:
238 ;; ?\e$,2 \e(B ?\e$,2 "\e(B ?\e$,2 ,\e(B ?\e$,2 0\e(B ?\e$,2 4\e(B ?\e$,2 8\e(B ?\e$,2 <\e(B ?\e$,2 D\e(B ?\e$,2 L\e(B ?\e$,2 T\e(B ?\e$,2 \\e(B ?\e$,2!@\e(B ?\e$,2!D\e(B ?\e$,2!H\e(B ?\e$,2!L\e(B ?\e$,2!P\e(B
239 ;; ?\e$,2!Q\e(B ?\e$,2!R\e(B ?\e$,2!S\e(B ?\e$,1{ \e(B ?\e$,2!`\e(B ?\e$,1x9\e(B ?\e$,1x:\e(B ?\e$,1xh\e(B ?\e$,1y$\e(B ?\e$,1y%\e(B ?\e,L \e(B ?\e$,1{!\e(B ?\e,A0\e(B ?\e,A2\e(B ?\e,A7\e(B ?\e,Aw\e(B
240 ;; ?\e$,2 p\e(B ?\e$,2 q\e(B ?\e$,2 r\e(B ?\e$,1(q\e(B ?\e$,1(t\e(B ?\e$,2 t\e(B ?\e$,1(v\e(B ?\e$,1(w\e(B ?\e$,2 w\e(B ?\e$,2 x\e(B ?\e$,2 y\e(B ?\e$,2 z\e(B ?\e$,2 {\e(B ?\e$,1)Q\e(B ?\e$,2 }\e(B ?\e$,2 ~\e(B
241 ;; ?\e$,2 \x7f\e(B ?\e$,2! \e(B ?\e$,2!!\e(B ?\e$,1(!\e(B ?\e$,1($\e(B ?\e$,2!#\e(B ?\e$,1(&\e(B ?\e$,1('\e(B ?\e$,2!&\e(B ?\e$,2!'\e(B ?\e$,2!(\e(B ?\e$,2!)\e(B ?\e$,2!*\e(B ?\e$,1)P\e(B ?\e$,2!,\e(B ?\e,A)\e(B
242 ;; ?\e$,1(n\e(B ?\e$,1(P\e(B ?\e$,1(Q\e(B ?\e$,1(f\e(B ?\e$,1(T\e(B ?\e$,1(U\e(B ?\e$,1(d\e(B ?\e$,1(S\e(B ?\e$,1(e\e(B ?\e$,1(X\e(B ?\e$,1(Y\e(B ?\e$,1(Z\e(B ?\e$,1([\e(B ?\e$,1(\\e(B ?\e$,1(]\e(B ?\e$,1(^\e(B
243 ;; ?\e$,1(_\e(B ?\e$,1(o\e(B ?\e$,1(`\e(B ?\e$,1(a\e(B ?\e$,1(b\e(B ?\e$,1(c\e(B ?\e$,1(V\e(B ?\e$,1(R\e(B ?\e$,1(l\e(B ?\e$,1(k\e(B ?\e$,1(W\e(B ?\e$,1(h\e(B ?\e$,1(m\e(B ?\e$,1(i\e(B ?\e$,1(g\e(B ?\e$,1(j\e(B
244 ;; ?\e$,1(N\e(B ?\e$,1(0\e(B ?\e$,1(1\e(B ?\e$,1(F\e(B ?\e$,1(4\e(B ?\e$,1(5\e(B ?\e$,1(D\e(B ?\e$,1(3\e(B ?\e$,1(E\e(B ?\e$,1(8\e(B ?\e$,1(9\e(B ?\e$,1(:\e(B ?\e$,1(;\e(B ?\e$,1(<\e(B ?\e$,1(=\e(B ?\e$,1(>\e(B
245 ;; ?\e$,1(?\e(B ?\e$,1(O\e(B ?\e$,1(@\e(B ?\e$,1(A\e(B ?\e$,1(B\e(B ?\e$,1(C\e(B ?\e$,1(6\e(B ?\e$,1(2\e(B ?\e$,1(L\e(B ?\e$,1(K\e(B ?\e$,1(7\e(B ?\e$,1(H\e(B ?\e$,1(M\e(B ?\e$,1(I\e(B ?\e$,1(G\e(B ?\e$,1(J\e(B
246 ;; 8859-5 plus Unicode:
247 ?\e$,2 \e(B ?\e$,2 "\e(B ?\e$,2 ,\e(B ?\e$,2 0\e(B ?\e$,2 4\e(B ?\e$,2 8\e(B ?\e$,2 <\e(B ?\e$,2 D\e(B ?\e$,2 L\e(B ?\e$,2 T\e(B ?\e$,2 \\e(B ?\e$,2!@\e(B ?\e$,2!D\e(B ?\e$,2!H\e(B ?\e$,2!L\e(B ?\e$,2!P\e(B
248 ?\e$,2!Q\e(B ?\e$,2!R\e(B ?\e$,2!S\e(B ?\e$,1{ \e(B ?\e$,2!`\e(B ?\e$,1x9\e(B ?\e$,1x:\e(B ?\e$,1xh\e(B ?\e$,1y$\e(B ?\e$,1y%\e(B ?\e,L \e(B ?\e$,1{!\e(B ?\e,A0\e(B ?\e,A2\e(B ?\e,A7\e(B ?\e,Aw\e(B
249 ?\e$,2 p\e(B ?\e$,2 q\e(B ?\e$,2 r\e(B ?\e,Lq\e(B ?\e,Lt\e(B ?\e$,2 t\e(B ?\e,Lv\e(B ?\e,Lw\e(B ?\e$,2 w\e(B ?\e$,2 x\e(B ?\e$,2 y\e(B ?\e$,2 z\e(B ?\e$,2 {\e(B ?\e$,1)Q\e(B ?\e$,2 }\e(B ?\e$,2 ~\e(B
250 ?\e$,2 \x7f\e(B ?\e$,2! \e(B ?\e$,2!!\e(B ?\e,L!\e(B ?\e,L$\e(B ?\e$,2!#\e(B ?\e,L&\e(B ?\e,L'\e(B ?\e$,2!&\e(B ?\e$,2!'\e(B ?\e$,2!(\e(B ?\e$,2!)\e(B ?\e$,2!*\e(B ?\e$,1)P\e(B ?\e$,2!,\e(B ?\e,A)\e(B
251 ?\e,Ln\e(B ?\e,LP\e(B ?\e,LQ\e(B ?\e,Lf\e(B ?\e,LT\e(B ?\e,LU\e(B ?\e,Ld\e(B ?\e,LS\e(B ?\e,Le\e(B ?\e,LX\e(B ?\e,LY\e(B ?\e,LZ\e(B ?\e,L[\e(B ?\e,L\\e(B ?\e,L]\e(B ?\e,L^\e(B
252 ?\e,L_\e(B ?\e,Lo\e(B ?\e,L`\e(B ?\e,La\e(B ?\e,Lb\e(B ?\e,Lc\e(B ?\e,LV\e(B ?\e,LR\e(B ?\e,Ll\e(B ?\e,Lk\e(B ?\e,LW\e(B ?\e,Lh\e(B ?\e,Lm\e(B ?\e,Li\e(B ?\e,Lg\e(B ?\e,Lj\e(B
253 ?\e,LN\e(B ?\e,L0\e(B ?\e,L1\e(B ?\e,LF\e(B ?\e,L4\e(B ?\e,L5\e(B ?\e,LD\e(B ?\e,L3\e(B ?\e,LE\e(B ?\e,L8\e(B ?\e,L9\e(B ?\e,L:\e(B ?\e,L;\e(B ?\e,L<\e(B ?\e,L=\e(B ?\e,L>\e(B
254 ?\e,L?\e(B ?\e,LO\e(B ?\e,L@\e(B ?\e,LA\e(B ?\e,LB\e(B ?\e,LC\e(B ?\e,L6\e(B ?\e,L2\e(B ?\e,LL\e(B ?\e,LK\e(B ?\e,L7\e(B ?\e,LH\e(B ?\e,LM\e(B ?\e,LI\e(B ?\e,LG\e(B ?\e,LJ\e(B
256 "Cyrillic KOI8-U decoding table.")
258 (let ((table (make-translation-table-from-vector
259 cyrillic-koi8-u-decode-table)))
260 (define-translation-table 'cyrillic-koi8-u-nonascii-translation-table table)
261 (define-translation-table 'cyrillic-koi8-u-encode-table
262 (char-table-extra-slot table 0)))
264 (makunbound 'cyrillic-koi8-u-decode-table)
266 (define-ccl-program ccl-decode-koi8-u
268 ((loop
269 (r0 = 0)
270 (read r1)
271 (if (r1 < 128)
272 (write-repeat r1)
273 ((translate-character cyrillic-koi8-u-nonascii-translation-table r0 r1)
274 (translate-character ucs-translation-table-for-decode r0 r1)
275 (write-multibyte-character r0 r1)
276 (repeat))))))
277 "CCL program to decode KOI8-U.")
279 (define-ccl-program ccl-encode-koi8-u
281 ((loop
282 (read-multibyte-character r0 r1)
283 (translate-character cyrillic-koi8-u-encode-table r0 r1)
284 (if (r0 != ,(charset-id 'ascii))
285 (if (r0 != ,(charset-id 'eight-bit-graphic))
286 (if (r0 != ,(charset-id 'eight-bit-control))
287 (r1 = ??))))
288 (write-repeat r1))))
289 "CCL program to encode KOI8-U.")
291 (cyrillic-unify-encoding 'cyrillic-koi8-u-encode-table)
293 (make-coding-system
294 'koi8-u 4
295 ?U "KOI8-U 8-bit encoding for Cyrillic (MIME: KOI8-U)"
296 '(ccl-decode-koi8-u . ccl-encode-koi8-u)
297 `((safe-chars . cyrillic-koi8-u-encode-table)
298 (mime-charset . koi8-u)
299 (valid-codes (0 . 255))
300 (dependency unify-8859-on-encoding-mode unify-8859-on-decoding-mode)))
302 (define-ccl-program ccl-encode-koi8-u-font
304 (translate-character cyrillic-koi8-u-encode-table r0 r1))
305 "CCL program to encode Cyrillic chars to KOI-U font.")
307 (add-to-list 'font-ccl-encoder-alist '("koi8-u" . ccl-encode-koi8-u-font))
309 (set-language-info-alist
310 "Ukrainian" `((coding-system koi8-u)
311 (coding-priority koi8-u)
312 (nonascii-translation
313 . ,(get 'cyrillic-koi8-u-nonascii-translation-table
314 'translation-table))
315 (input-method . "ukrainian-computer")
316 (features code-pages)
317 (documentation
318 . "Support for Ukrainian with KOI8-U character set."))
319 '("Cyrillic"))
321 ;;; ALTERNATIVNYJ stuff
323 ;; Fixme: It's unclear what's the correct table. I've found
324 ;; statements both that it's the same as cp866 and somewhat different,
325 ;; but nothing that looks really definitive.
326 (defvar cyrillic-alternativnyj-decode-table
328 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
329 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
330 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
331 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
332 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79
333 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95
334 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111
335 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127
336 ;; ?\e$,1(0\e(B ?\e$,1(1\e(B ?\e$,1(2\e(B ?\e$,1(3\e(B ?\e$,1(4\e(B ?\e$,1(5\e(B ?\e$,1(6\e(B ?\e$,1(7\e(B ?\e$,1(8\e(B ?\e$,1(9\e(B ?\e$,1(:\e(B ?\e$,1(;\e(B ?\e$,1(<\e(B ?\e$,1(=\e(B ?\e$,1(>\e(B ?\e$,1(?\e(B
337 ;; ?\e$,1(@\e(B ?\e$,1(A\e(B ?\e$,1(B\e(B ?\e$,1(C\e(B ?\e$,1(D\e(B ?\e$,1(E\e(B ?\e$,1(F\e(B ?\e$,1(G\e(B ?\e$,1(H\e(B ?\e$,1(I\e(B ?\e$,1(J\e(B ?\e$,1(K\e(B ?\e$,1(L\e(B ?\e$,1(M\e(B ?\e$,1(N\e(B ?\e$,1(O\e(B
338 ;; ?\e$,1(P\e(B ?\e$,1(Q\e(B ?\e$,1(R\e(B ?\e$,1(S\e(B ?\e$,1(T\e(B ?\e$,1(U\e(B ?\e$,1(V\e(B ?\e$,1(W\e(B ?\e$,1(X\e(B ?\e$,1(Y\e(B ?\e$,1(Z\e(B ?\e$,1([\e(B ?\e$,1(\\e(B ?\e$,1(]\e(B ?\e$,1(^\e(B ?\e$,1(_\e(B
339 ;; ?\e$,2!Q\e(B ?\e$,2!R\e(B ?\e$,2!S\e(B ?\e$,2 "\e(B ?\e$,2 D\e(B ?\e$,2!!\e(B ?\e$,2!"\e(B ?\e$,2 v\e(B ?\e$,2 u\e(B ?\e$,2!#\e(B ?\e$,2 q\e(B ?\e$,2 w\e(B ?\e$,2 }\e(B ?\e$,2 |\e(B ?\e$,2 {\e(B ?\e$,2 0\e(B
340 ;; ?\e$,2 4\e(B ?\e$,2 T\e(B ?\e$,2 L\e(B ?\e$,2 <\e(B ?\e$,2 \e(B ?\e$,2 \\e(B ?\e$,2 ~\e(B ?\e$,2 \x7f\e(B ?\e$,2 z\e(B ?\e$,2 t\e(B ?\e$,2!)\e(B ?\e$,2!&\e(B ?\e$,2! \e(B ?\e$,2 p\e(B ?\e$,2!,\e(B ?\e$,2!'\e(B
341 ;; ?\e$,2!(\e(B ?\e$,2!$\e(B ?\e$,2!%\e(B ?\e$,2 y\e(B ?\e$,2 x\e(B ?\e$,2 r\e(B ?\e$,2 s\e(B ?\e$,2!+\e(B ?\e$,2!*\e(B ?\e$,2 8\e(B ?\e$,2 ,\e(B ?\e$,2!H\e(B ?\e$,2!D\e(B ?\e$,2!L\e(B ?\e$,2!P\e(B ?\e$,2!@\e(B
342 ;; ?\e$,1(`\e(B ?\e$,1(a\e(B ?\e$,1(b\e(B ?\e$,1(c\e(B ?\e$,1(d\e(B ?\e$,1(e\e(B ?\e$,1(f\e(B ?\e$,1(g\e(B ?\e$,1(h\e(B ?\e$,1(i\e(B ?\e$,1(j\e(B ?\e$,1(k\e(B ?\e$,1(l\e(B ?\e$,1(m\e(B ?\e$,1(n\e(B ?\e$,1(o\e(B
343 ;; ?\e$,1(!\e(B ?\e$,1(q\e(B ?\e$,1ry\e(B ?\e$,1rx\e(B ?\e$,1%A\e(B ?\e$,1%@\e(B ?\e$,1s:\e(B ?\e$,1s9\e(B ?\e$,1vq\e(B ?\e$,1vs\e(B ?\e,A1\e(B ?\e,Aw\e(B ?\e$,1uV\e(B ?\e,A$\e(B ?\e$,2!`\e(B ?\e,A \e(B ;
344 ;; 8859+Unicode
345 ?\e,L0\e(B ?\e,L1\e(B ?\e,L2\e(B ?\e,L3\e(B ?\e,L4\e(B ?\e,L5\e(B ?\e,L6\e(B ?\e,L7\e(B ?\e,L8\e(B ?\e,L9\e(B ?\e,L:\e(B ?\e,L;\e(B ?\e,L<\e(B ?\e,L=\e(B ?\e,L>\e(B ?\e,L?\e(B
346 ?\e,L@\e(B ?\e,LA\e(B ?\e,LB\e(B ?\e,LC\e(B ?\e,LD\e(B ?\e,LE\e(B ?\e,LF\e(B ?\e,LG\e(B ?\e,LH\e(B ?\e,LI\e(B ?\e,LJ\e(B ?\e,LK\e(B ?\e,LL\e(B ?\e,LM\e(B ?\e,LN\e(B ?\e,LO\e(B
347 ?\e,LP\e(B ?\e,LQ\e(B ?\e,LR\e(B ?\e,LS\e(B ?\e,LT\e(B ?\e,LU\e(B ?\e,LV\e(B ?\e,LW\e(B ?\e,LX\e(B ?\e,LY\e(B ?\e,LZ\e(B ?\e,L[\e(B ?\e,L\\e(B ?\e,L]\e(B ?\e,L^\e(B ?\e,L_\e(B
348 ?\e$,2!Q\e(B ?\e$,2!R\e(B ?\e$,2!S\e(B ?\e$,2 "\e(B ?\e$,2 D\e(B ?\e$,2!!\e(B ?\e$,2!"\e(B ?\e$,2 v\e(B ?\e$,2 u\e(B ?\e$,2!#\e(B ?\e$,2 q\e(B ?\e$,2 w\e(B ?\e$,2 }\e(B ?\e$,2 |\e(B ?\e$,2 {\e(B ?\e$,2 0\e(B
349 ?\e$,2 4\e(B ?\e$,2 T\e(B ?\e$,2 L\e(B ?\e$,2 <\e(B ?\e$,2 \e(B ?\e$,2 \\e(B ?\e$,2 ~\e(B ?\e$,2 \x7f\e(B ?\e$,2 z\e(B ?\e$,2 t\e(B ?\e$,2!)\e(B ?\e$,2!&\e(B ?\e$,2! \e(B ?\e$,2 p\e(B ?\e$,2!,\e(B ?\e$,2!'\e(B
350 ?\e$,2!(\e(B ?\e$,2!$\e(B ?\e$,2!%\e(B ?\e$,2 y\e(B ?\e$,2 x\e(B ?\e$,2 r\e(B ?\e$,2 s\e(B ?\e$,2!+\e(B ?\e$,2!*\e(B ?\e$,2 8\e(B ?\e$,2 ,\e(B ?\e$,2!H\e(B ?\e$,2!D\e(B ?\e$,2!L\e(B ?\e$,2!P\e(B ?\e$,2!@\e(B
351 ?\e,L`\e(B ?\e,La\e(B ?\e,Lb\e(B ?\e,Lc\e(B ?\e,Ld\e(B ?\e,Le\e(B ?\e,Lf\e(B ?\e,Lg\e(B ?\e,Lh\e(B ?\e,Li\e(B ?\e,Lj\e(B ?\e,Lk\e(B ?\e,Ll\e(B ?\e,Lm\e(B ?\e,Ln\e(B ?\e,Lo\e(B
352 ;; Taken from http://www.cyrillic.com/ref/cyrillic/koi-8alt.html
353 ;; with guesses for the Unicodes of the glyphs in the absence of a
354 ;; table.
355 ?\e,L!\e(B ?\e,Lq\e(B ?\e$,1ry\e(B ?\e$,1rx\e(B ?\e$,1%A\e(B ?\e$,1%@\e(B ?\e$,1s:\e(B ?\e$,1s9\e(B ?\e$,1vq\e(B ?\e$,1vs\e(B ?\e,A1\e(B ?\e,Aw\e(B ?\e,Lp\e(B ?\e,A$\e(B ?\e$,2!`\e(B ?\e,L \e(B]
356 "Cyrillic ALTERNATIVNYJ decoding table.")
358 (let ((table (make-translation-table-from-vector
359 cyrillic-alternativnyj-decode-table)))
360 (define-translation-table 'cyrillic-alternativnyj-nonascii-translation-table
361 table)
362 (define-translation-table 'cyrillic-alternativnyj-encode-table
363 (char-table-extra-slot table 0)))
365 (makunbound 'cyrillic-alternativnyj-decode-table)
367 (define-ccl-program ccl-decode-alternativnyj
369 ((loop
370 (r0 = 0)
371 (read r1)
372 (if (r1 < 128)
373 (write-repeat r1)
374 ((translate-character cyrillic-alternativnyj-nonascii-translation-table
375 r0 r1)
376 (translate-character ucs-translation-table-for-decode r0 r1)
377 (write-multibyte-character r0 r1)
378 (repeat))))))
379 "CCL program to decode Alternativnyj.")
381 (define-ccl-program ccl-encode-alternativnyj
383 ((loop
384 (read-multibyte-character r0 r1)
385 (translate-character cyrillic-alternativnyj-encode-table r0 r1)
386 (if (r0 != ,(charset-id 'ascii))
387 (if (r0 != ,(charset-id 'eight-bit-graphic))
388 (if (r0 != ,(charset-id 'eight-bit-control))
389 (r1 = ??))))
390 (write-repeat r1))))
391 "CCL program to encode Alternativnyj.")
393 (cyrillic-unify-encoding 'cyrillic-alternativnyj-encode-table)
395 (make-coding-system
396 'cyrillic-alternativnyj 4 ?A
397 "ALTERNATIVNYJ 8-bit encoding for Cyrillic."
398 '(ccl-decode-alternativnyj . ccl-encode-alternativnyj)
399 `((safe-chars . cyrillic-alternativnyj-encode-table)
400 (valid-codes (0 . 255))
401 (dependency unify-8859-on-encoding-mode unify-8859-on-decoding-mode)))
403 (define-coding-system-alias 'alternativnyj 'cyrillic-alternativnyj)
405 (define-ccl-program ccl-encode-alternativnyj-font
407 (translate-character cyrillic-alternativnyj-encode-table r0 r1))
408 "CCL program to encode Cyrillic chars to Alternativnyj font.")
410 (add-to-list 'font-ccl-encoder-alist
411 '("alternativnyj" . ccl-encode-alternativnyj-font))
413 (set-language-info-alist
414 "Cyrillic-ALT" `((charset cyrillic-iso8859-5)
415 (nonascii-translation
416 . ,(get 'cyrillic-alternativnyj-nonascii-translation-table
417 'translation-table))
418 (coding-system cyrillic-alternativnyj)
419 (coding-priority cyrillic-alternativnyj)
420 (input-method . "russian-typewriter")
421 (features cyril-util)
422 (unibyte-display . cyrillic-alternativnyj)
423 (sample-text . "Russian (\e,L@caaZXY\e(B) \e,L7T`PRabRcYbU\e(B!")
424 (documentation . "Support for Cyrillic ALTERNATIVNYJ."))
425 '("Cyrillic"))
427 (set-language-info-alist
428 "Windows-1251" `((coding-system windows-1251)
429 (coding-priority windows-1251)
430 (nonascii-translation
431 . ,(get 'decode-windows-1252 'translation-table))
432 (input-method . "russian-typewriter") ; fixme?
433 (features code-pages)
434 (documentation . "Support for windows-1251 character set."))
435 '("Cyrillic"))
437 (set-language-info-alist
438 "Tajik" `((coding-system cyrillic-koi8-t)
439 (coding-priority cyrillic-koi8-t)
440 (nonascii-translation
441 . ,(get 'decode-koi8-t 'translation-table))
442 (input-method . "russian-typewriter") ; fixme?
443 (features code-pages)
444 (documentation . "Support for Tajik using KOI8-T."))
445 '("Cyrillic"))
447 (set-language-info-alist
448 "Bulgarian" `((coding-system windows-1251)
449 (coding-priority windows-1251)
450 (nonascii-translation
451 . ,(get 'decode-windows-1251 'translation-table))
452 (input-method . "bulgarian-bds")
453 (features code-pages)
454 (documentation
455 . "Support for Bulgarian with windows-1251 character set."))
456 '("Cyrillic"))
458 (set-language-info-alist
459 "Belarusian" `((coding-system windows-1251)
460 (coding-priority windows-1251)
461 (nonascii-translation
462 . ,(get 'decode-windows-1251 'translation-table))
463 (input-method . "belarusian")
464 (features code-pages)
465 (documentation
466 . "Support for Belarusian with windows-1251 character set.
467 \(The name Belarusian replaced Byelorussian in the early 1990s.)"))
468 '("Cyrillic"))
470 (provide 'cyrillic)
472 ;;; cyrillic.el ends here