Fixed copyright notice.
[bpt/emacs.git] / lisp / language / cyrillic.el
CommitLineData
60370d40 1;;; cyrillic.el --- support for Cyrillic -*- coding: iso-2022-7bit; -*-
4ed46869 2
d4877ac1
GM
3;; Copyright (C) 1997, 1998, 2001, 2002, 2003, 2004, 2005, 2006
4;; Free Software Foundation, Inc.
5;; Copyright (C) 1995, 1997, 1998, 1999, 2000, 2001, 2002, 2003,
6;; 2004, 2005, 2006
eaa61218
KH
7;; National Institute of Advanced Industrial Science and Technology (AIST)
8;; Registration Number H14PRO021
4ed46869 9
6f27e0f9
DL
10;; Author: Kenichi Handa <handa@etl.go.jp>
11;; Keywords: multilingual, Cyrillic, i18n
4ed46869
KH
12
13;; This file is part of GNU Emacs.
14
15;; GNU Emacs is free software; you can redistribute it and/or modify
16;; it under the terms of the GNU General Public License as published by
17;; the Free Software Foundation; either version 2, or (at your option)
18;; any later version.
19
20;; GNU Emacs is distributed in the hope that it will be useful,
21;; but WITHOUT ANY WARRANTY; without even the implied warranty of
22;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
23;; GNU General Public License for more details.
24
25;; You should have received a copy of the GNU General Public License
369314dc 26;; along with GNU Emacs; see the file COPYING. If not, write to the
3a35cf56
LK
27;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
28;; Boston, MA 02110-1301, USA.
4ed46869
KH
29
30;;; Commentary:
31
6f27e0f9
DL
32;; The character set ISO8859-5 is supported. KOI-8 and ALTERNATIVNYJ
33;; are converted to Unicode internally. See
34;; <URL:http://www.ecma.ch/ecma1/STAND/ECMA-113.HTM>. For more info
35;; on Cyrillic charsets, see
36;; <URL:http://czyborra.com/charsets/cyrillic.html>. The KOI and
37;; Alternativnyj coding systems should live in code-pages.el, but
38;; they've always been preloaded and the coding system autoload
39;; mechanism didn't get accepted, so they have to stay here and
40;; duplicate code-pages stuff.
41
42;; Note that 8859-5 maps directly onto the Unicode Cyrillic block,
43;; apart from codepoints 160 (NBSP, c.f. U+0400), 173 (soft hyphen,
44;; c.f. U+04OD) and 253 (section sign, c.f U+045D). The KOI-8 and
45;; Alternativnyj coding systems encode both 8859-5 and Unicode.
46;; ucs-tables.el provides unification for cyrillic-iso-8bit.
47
d98276be 48;; Customizing `utf-fragment-on-decoding' allows decoding characters
6f27e0f9
DL
49;; from KOI and Alternativnyj into 8859-5 where that's possible.
50;; cyrillic-iso8859-5 characters take half as much space in the buffer
51;; as the mule-unicode-0100-24ff equivalents, though that's probably
52;; not normally a big deal.
4ed46869
KH
53
54;;; Code:
55
5f1d80c7
KH
56;; Cyrillic (general)
57
6f27e0f9 58;; ISO-8859-5 stuff
2b01336d 59
4ed46869 60(make-coding-system
efbc7e89 61 'cyrillic-iso-8bit 2 ?5
5ef35063 62 "ISO 2022 based 8-bit encoding for Cyrillic script (MIME:ISO-8859-5)."
11b77f14 63 '(ascii cyrillic-iso8859-5 nil nil
6de22aea 64 nil nil nil nil nil nil nil nil nil nil nil t)
11b77f14
KH
65 '((safe-charsets ascii cyrillic-iso8859-5)
66 (mime-charset . iso-8859-5)))
4ed46869 67
71eabd24 68(define-coding-system-alias 'iso-8859-5 'cyrillic-iso-8bit)
efbc7e89 69
5f1d80c7 70(set-language-info-alist
a564ccf9 71 "Cyrillic-ISO" '((charset cyrillic-iso8859-5)
11b77f14
KH
72 (coding-system cyrillic-iso-8bit)
73 (coding-priority cyrillic-iso-8bit)
6f27e0f9 74 (input-method . "cyrillic-yawerty") ; fixme
a564ccf9
KH
75 (nonascii-translation . cyrillic-iso8859-5)
76 (unibyte-display . cyrillic-iso-8bit)
77 (features cyril-util)
5f1d80c7 78 (sample-text . "Russian (\e,L@caaZXY\e(B) \e,L7T`PRabRcYbU\e(B!")
11b77f14
KH
79 (documentation . "Support for Cyrillic ISO-8859-5."))
80 '("Cyrillic"))
5f1d80c7 81
6f27e0f9 82;; KOI-8R stuff
2b01336d 83
6f27e0f9
DL
84;; The mule-unicode portion of this is from
85;; http://www.unicode.org/Public/MAPPINGS/VENDORS/MISC/KOI8-R.TXT,
86;; which references RFC 1489.
70c58a1f
KH
87(defvar cyrillic-koi8-r-decode-table
88 [
89 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
90 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
91 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
92 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
93 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79
94 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95
95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111
96 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127
6f27e0f9
DL
97 ;; 8859-5 plus Unicode
98 ?\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
99 ?\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
100 ?\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
101 ?\e$,2 \7f\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
102 ?\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
103 ?\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
104 ?\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
105 ?\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
106 ;; All Unicode:
107;; ?\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
108;; ?\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
109;; ?\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
110;; ?\e$,2 \7f\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
111;; ?\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
112;; ?\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
113;; ?\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
114;; ?\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
115 ]
70c58a1f
KH
116 "Cyrillic KOI8-R decoding table.")
117
1f487ef8
KH
118(let ((table (make-translation-table-from-vector
119 cyrillic-koi8-r-decode-table)))
120 (define-translation-table 'cyrillic-koi8-r-nonascii-translation-table table)
121 (define-translation-table 'cyrillic-koi8-r-encode-table
122 (char-table-extra-slot table 0)))
70c58a1f 123
6f27e0f9
DL
124;; No point in keeping it around. (It can't be let-bound, since it's
125;; needed for macro expansion.)
126(makunbound 'cyrillic-koi8-r-decode-table)
127
2b01336d 128(define-ccl-program ccl-decode-koi8
6f27e0f9 129 `(4
1f487ef8
KH
130 ((loop
131 (r0 = 0)
132 (read r1)
133 (if (r1 < 128)
134 (write-repeat r1)
135 ((translate-character cyrillic-koi8-r-nonascii-translation-table r0 r1)
d98276be 136 (translate-character ucs-translation-table-for-decode r0 r1)
1f487ef8
KH
137 (write-multibyte-character r0 r1)
138 (repeat))))))
6f27e0f9 139 "CCL program to decode KOI8-R.")
2b01336d
KH
140
141(define-ccl-program ccl-encode-koi8
142 `(1
1f487ef8
KH
143 ((loop
144 (read-multibyte-character r0 r1)
6f27e0f9 145 (translate-character cyrillic-koi8-r-encode-table r0 r1)
58566dff
KH
146 (if (r0 != ,(charset-id 'ascii))
147 (if (r0 != ,(charset-id 'eight-bit-graphic))
148 (if (r0 != ,(charset-id 'eight-bit-control))
149 (r1 = ??))))
1f487ef8 150 (write-repeat r1))))
6f27e0f9
DL
151 "CCL program to encode KOI8-R.")
152
153(defun cyrillic-unify-encoding (table)
154 "Set up equivalent characters in the encoding TABLE.
d98276be 155This works whether or not the table is Unicode-based or
6f27e0f9
DL
1568859-5-based. (Only appropriate for Cyrillic.)"
157 (let ((table (get table 'translation-table)))
158 (dotimes (i 96)
159 (let* ((c (make-char 'cyrillic-iso8859-5 (+ i 32)))
160 (u ; equivalent Unicode char
161 (cond ((eq c ?\e,L \e(B) ?\e,A \e(B)
162 ((eq c ?\e,L-\e(B) ?\e,A-\e(B)
163 ((eq c ?\e,L}\e(B) ?\e,A'\e(B)
164 (t (decode-char 'ucs (+ #x400 i)))))
165 (ec (aref table c)) ; encoding of 8859-5
166 (uc (aref table u))) ; encoding of Unicode
167 (unless (memq c '(?\e,L \e(B ?\e,L-\e(B ?\e,L}\e(B)) ; 8859-5 exceptions
168 (unless uc
169 (aset table u ec))
170 (unless ec
171 (aset table c uc)))))))
172
173(cyrillic-unify-encoding 'cyrillic-koi8-r-encode-table)
174
2b01336d 175(make-coding-system
4b9121fc 176 'cyrillic-koi8 4
49716ecd
RS
177 ;; We used to use ?K. It is true that ?K is more strictly correct,
178 ;; but it is also used for Korean.
179 ;; So people who use koi8 for languages other than Russian
180 ;; will have to forgive us.
6f27e0f9 181 ?R "KOI8-R 8-bit encoding for Cyrillic (MIME: KOI8-R)."
7fbf766f 182 '(ccl-decode-koi8 . ccl-encode-koi8)
6f27e0f9 183 `((safe-chars . cyrillic-koi8-r-encode-table)
70c58a1f 184 (mime-charset . koi8-r)
d98276be
KH
185 (valid-codes (0 . 255))
186 (dependency unify-8859-on-encoding-mode unify-8859-on-decoding-mode)))
2b01336d 187
71eabd24
RS
188(define-coding-system-alias 'koi8-r 'cyrillic-koi8)
189(define-coding-system-alias 'koi8 'cyrillic-koi8)
6f27e0f9
DL
190(define-coding-system-alias 'cp878 'cyrillic-koi8)
191
7be5dbd4
KH
192(let ((elt `("koi8-r" koi8-r 1
193 ,(get 'cyrillic-koi8-r-encode-table 'translation-table)))
194 (slot (assoc "koi8-r" ctext-non-standard-encodings-alist)))
195 (if slot
196 (setcdr slot (cdr elt))
197 (push elt ctext-non-standard-encodings-alist)))
198
6f27e0f9
DL
199;; Allow displaying some of KOI & al with an 8859-5-encoded font. We
200;; won't bother about the exceptions when encoding the font, since
201;; NBSP will fall through below and work anyhow, and we'll have
202;; avoided setting the fontset for the other two to 8859-5 -- they're
203;; not in KOI and Alternativnyj anyhow.
204(define-ccl-program ccl-encode-8859-5-font
205 `(0
206 ((if (r0 == ,(charset-id 'cyrillic-iso8859-5))
207 (r1 += 128)
208 (if (r0 == ,(charset-id 'mule-unicode-0100-24ff))
209 (r1 = (r2 + 128))))))
210 "Encode ISO 8859-5 and Cyrillic Unicode chars to 8859-5 font.")
211
212(add-to-list 'font-ccl-encoder-alist '("iso8859-5" . ccl-encode-8859-5-font))
2b01336d 213
6f27e0f9 214;; The table is set up later to encode both Unicode and 8859-5.
2b01336d 215(define-ccl-program ccl-encode-koi8-font
70c58a1f 216 `(0
fd162724
KH
217 (if (r2 >= 0)
218 ((r1 <<= 7)
219 (r1 += r2)))
6f27e0f9 220 (translate-character cyrillic-koi8-r-encode-table r0 r1))
2b01336d
KH
221 "CCL program to encode Cyrillic chars to KOI font.")
222
6f27e0f9 223(add-to-list 'font-ccl-encoder-alist '("koi8" . ccl-encode-koi8-font))
70c58a1f 224
5f1d80c7 225(set-language-info-alist
a564ccf9
KH
226 "Cyrillic-KOI8" `((charset cyrillic-iso8859-5)
227 (nonascii-translation
1f487ef8
KH
228 . ,(get 'cyrillic-koi8-r-nonascii-translation-table
229 'translation-table))
11b77f14 230 (coding-system cyrillic-koi8)
6f27e0f9 231 (coding-priority cyrillic-koi8 cyrillic-iso-8bit)
a503f8b7 232 (ctext-non-standard-encodings "koi8-r")
76509389 233 (input-method . "russian-typewriter")
a564ccf9
KH
234 (features cyril-util)
235 (unibyte-display . cyrillic-koi8)
5f1d80c7 236 (sample-text . "Russian (\e,L@caaZXY\e(B) \e,L7T`PRabRcYbU\e(B!")
70c58a1f 237 (documentation . "Support for Cyrillic KOI8-R."))
11b77f14 238 '("Cyrillic"))
5f1d80c7 239
76509389
DL
240(set-language-info-alist
241 "Russian" `((charset cyrillic-iso8859-5)
242 (nonascii-translation
243 . ,(get 'cyrillic-koi8-r-nonascii-translation-table
244 'translation-table))
245 (coding-system cyrillic-koi8)
246 (coding-priority cyrillic-koi8 cyrillic-iso-8bit)
247 (input-method . "russian-computer")
248 (features cyril-util)
249 (unibyte-display . cyrillic-koi8)
250 (sample-text . "Russian (\e,L@caaZXY\e(B) \e,L7T`PRabRcYbU\e(B!")
251 (documentation . "\
252Support for Russian using koi8-r and the russian-computer input method.")
253 (tutorial . "TUTORIAL.ru"))
254 '("Cyrillic"))
255
6f27e0f9
DL
256
257(defvar cyrillic-koi8-u-decode-table
258 [
259 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
260 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
261 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
262 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
263 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79
264 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95
265 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111
266 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127
267 ;; All Unicode:
268;; ?\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
269;; ?\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
270;; ?\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
271;; ?\e$,2 \7f\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
272;; ?\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
273;; ?\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
274;; ?\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
275;; ?\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
276;; 8859-5 plus Unicode:
277 ?\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
278 ?\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
279 ?\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
280 ?\e$,2 \7f\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
281 ?\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
282 ?\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
283 ?\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
284 ?\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
285 ]
286 "Cyrillic KOI8-U decoding table.")
287
288(let ((table (make-translation-table-from-vector
289 cyrillic-koi8-u-decode-table)))
290 (define-translation-table 'cyrillic-koi8-u-nonascii-translation-table table)
291 (define-translation-table 'cyrillic-koi8-u-encode-table
292 (char-table-extra-slot table 0)))
293
294(makunbound 'cyrillic-koi8-u-decode-table)
295
296(define-ccl-program ccl-decode-koi8-u
297 `(4
298 ((loop
299 (r0 = 0)
300 (read r1)
301 (if (r1 < 128)
302 (write-repeat r1)
303 ((translate-character cyrillic-koi8-u-nonascii-translation-table r0 r1)
d98276be 304 (translate-character ucs-translation-table-for-decode r0 r1)
6f27e0f9
DL
305 (write-multibyte-character r0 r1)
306 (repeat))))))
307 "CCL program to decode KOI8-U.")
308
309(define-ccl-program ccl-encode-koi8-u
310 `(1
311 ((loop
312 (read-multibyte-character r0 r1)
313 (translate-character cyrillic-koi8-u-encode-table r0 r1)
58566dff
KH
314 (if (r0 != ,(charset-id 'ascii))
315 (if (r0 != ,(charset-id 'eight-bit-graphic))
316 (if (r0 != ,(charset-id 'eight-bit-control))
317 (r1 = ??))))
6f27e0f9
DL
318 (write-repeat r1))))
319 "CCL program to encode KOI8-U.")
320
321(cyrillic-unify-encoding 'cyrillic-koi8-u-encode-table)
322
323(make-coding-system
324 'koi8-u 4
325 ?U "KOI8-U 8-bit encoding for Cyrillic (MIME: KOI8-U)"
326 '(ccl-decode-koi8-u . ccl-encode-koi8-u)
327 `((safe-chars . cyrillic-koi8-u-encode-table)
328 (mime-charset . koi8-u)
d98276be
KH
329 (valid-codes (0 . 255))
330 (dependency unify-8859-on-encoding-mode unify-8859-on-decoding-mode)))
6f27e0f9
DL
331
332(define-ccl-program ccl-encode-koi8-u-font
333 `(0
334 (translate-character cyrillic-koi8-u-encode-table r0 r1))
335 "CCL program to encode Cyrillic chars to KOI-U font.")
336
337(add-to-list 'font-ccl-encoder-alist '("koi8-u" . ccl-encode-koi8-u-font))
338
339(set-language-info-alist
340 "Ukrainian" `((coding-system koi8-u)
d98276be 341 (coding-priority koi8-u)
6f27e0f9 342 (nonascii-translation
b9e98de5 343 . ,(get 'cyrillic-koi8-u-nonascii-translation-table
6f27e0f9
DL
344 'translation-table))
345 (input-method . "ukrainian-computer")
d98276be
KH
346 (documentation
347 . "Support for Ukrainian with KOI8-U character set."))
6f27e0f9
DL
348 '("Cyrillic"))
349
350;;; ALTERNATIVNYJ stuff
2b01336d 351
b9e98de5
DL
352;; Fixme: It's unclear what's the correct table. I've found
353;; statements both that it's the same as cp866 and somewhat different,
1d5f8bfc 354;; but nothing that looks really definitive.
70c58a1f
KH
355(defvar cyrillic-alternativnyj-decode-table
356 [
357 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
358 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
359 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
360 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
361 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79
362 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95
363 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111
364 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127
6f27e0f9
DL
365;; ?\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
366;; ?\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
367;; ?\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
368;; ?\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
369;; ?\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 \7f\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
370;; ?\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
371;; ?\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
1d5f8bfc 372;; ?\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 ;
6f27e0f9 373;; 8859+Unicode
70c58a1f
KH
374 ?\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
375 ?\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
376 ?\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
6f27e0f9
DL
377 ?\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
378 ?\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 \7f\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
379 ?\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
70c58a1f 380 ?\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
1d5f8bfc
KH
381 ;; Taken from http://www.cyrillic.com/ref/cyrillic/koi-8alt.html
382 ;; with guesses for the Unicodes of the glyphs in the absence of a
383 ;; table.
384 ?\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]
70c58a1f
KH
385 "Cyrillic ALTERNATIVNYJ decoding table.")
386
1f487ef8
KH
387(let ((table (make-translation-table-from-vector
388 cyrillic-alternativnyj-decode-table)))
389 (define-translation-table 'cyrillic-alternativnyj-nonascii-translation-table
70c58a1f 390 table)
1f487ef8
KH
391 (define-translation-table 'cyrillic-alternativnyj-encode-table
392 (char-table-extra-slot table 0)))
70c58a1f 393
6f27e0f9 394(makunbound 'cyrillic-alternativnyj-decode-table)
70c58a1f 395
2b01336d 396(define-ccl-program ccl-decode-alternativnyj
6f27e0f9 397 `(4
1f487ef8
KH
398 ((loop
399 (r0 = 0)
400 (read r1)
401 (if (r1 < 128)
402 (write-repeat r1)
403 ((translate-character cyrillic-alternativnyj-nonascii-translation-table
404 r0 r1)
d98276be 405 (translate-character ucs-translation-table-for-decode r0 r1)
1f487ef8
KH
406 (write-multibyte-character r0 r1)
407 (repeat))))))
2b01336d
KH
408 "CCL program to decode Alternativnyj.")
409
410(define-ccl-program ccl-encode-alternativnyj
411 `(1
1f487ef8
KH
412 ((loop
413 (read-multibyte-character r0 r1)
53a1db80 414 (translate-character cyrillic-alternativnyj-encode-table r0 r1)
58566dff
KH
415 (if (r0 != ,(charset-id 'ascii))
416 (if (r0 != ,(charset-id 'eight-bit-graphic))
417 (if (r0 != ,(charset-id 'eight-bit-control))
418 (r1 = ??))))
1f487ef8 419 (write-repeat r1))))
2b01336d 420 "CCL program to encode Alternativnyj.")
6f27e0f9
DL
421
422(cyrillic-unify-encoding 'cyrillic-alternativnyj-encode-table)
423
2b01336d 424(make-coding-system
efbc7e89 425 'cyrillic-alternativnyj 4 ?A
1d5f8bfc 426 "ALTERNATIVNYJ 8-bit encoding for Cyrillic."
7fbf766f 427 '(ccl-decode-alternativnyj . ccl-encode-alternativnyj)
6f27e0f9
DL
428 `((safe-chars . cyrillic-alternativnyj-encode-table)
429 (valid-codes (0 . 255))
d98276be 430 (dependency unify-8859-on-encoding-mode unify-8859-on-decoding-mode)))
2b01336d 431
71eabd24 432(define-coding-system-alias 'alternativnyj 'cyrillic-alternativnyj)
efbc7e89 433
2b01336d 434(define-ccl-program ccl-encode-alternativnyj-font
6f27e0f9
DL
435 `(0
436 (translate-character cyrillic-alternativnyj-encode-table r0 r1))
2b01336d
KH
437 "CCL program to encode Cyrillic chars to Alternativnyj font.")
438
6f27e0f9
DL
439(add-to-list 'font-ccl-encoder-alist
440 '("alternativnyj" . ccl-encode-alternativnyj-font))
2b01336d 441
4ed46869 442(set-language-info-alist
a564ccf9
KH
443 "Cyrillic-ALT" `((charset cyrillic-iso8859-5)
444 (nonascii-translation
1f487ef8
KH
445 . ,(get 'cyrillic-alternativnyj-nonascii-translation-table
446 'translation-table))
11b77f14
KH
447 (coding-system cyrillic-alternativnyj)
448 (coding-priority cyrillic-alternativnyj)
6f27e0f9 449 (input-method . "russian-typewriter")
a564ccf9
KH
450 (features cyril-util)
451 (unibyte-display . cyrillic-alternativnyj)
5f1d80c7 452 (sample-text . "Russian (\e,L@caaZXY\e(B) \e,L7T`PRabRcYbU\e(B!")
11b77f14
KH
453 (documentation . "Support for Cyrillic ALTERNATIVNYJ."))
454 '("Cyrillic"))
4ed46869 455
6f27e0f9
DL
456(set-language-info-alist
457 "Tajik" `((coding-system cyrillic-koi8-t)
76509389
DL
458 (coding-priority cyrillic-koi8-t)
459 (nonascii-translation
460 . ,(get 'decode-koi8-t 'translation-table))
461 (input-method . "russian-typewriter") ; fixme?
462 (features code-pages)
463 (documentation . "Support for Tajik using KOI8-T."))
6f27e0f9
DL
464 '("Cyrillic"))
465
a9707ecc
DL
466(eval-and-compile
467 (setq
468 non-iso-charset-alist
469 (cp-make-coding-system
470 windows-1251
471 [?\\e$,1("\e(B ?\\e$,1(#\e(B ?\\e$,1rz\e(B ?\\e$,1(s\e(B ?\\e$,1r~\e(B ?\\e$,1s&\e(B ?\\e$,1s \e(B ?\\e$,1s!\e(B ?\\e$,1tL\e(B ?\\e$,1s0\e(B ?\\e$,1()\e(B ?\\e$,1s9\e(B ?\\e$,1(*\e(B ?\\e$,1(,\e(B ?\\e$,1(+\e(B ?\\e$,1(/\e(B ?\\e$,1(r\e(B
472 ?\\e$,1rx\e(B ?\\e$,1ry\e(B ?\\e$,1r|\e(B ?\\e$,1r}\e(B ?\\e$,1s"\e(B ?\\e$,1rs\e(B ?\\e$,1rt\e(B nil ?\\e$,1ub\e(B ?\\e$,1(y\e(B ?\\e$,1s:\e(B ?\\e$,1(z\e(B ?\\e$,1(|\e(B ?\\e$,1({\e(B ?\\e$,1(\7f\e(B ?\\e,A \e(B ?\\e$,1(.\e(B
473 ?\\e$,1(~\e(B ?\\e$,1((\e(B ?\\e,A$\e(B ?\\e$,1)P\e(B ?\\e,A&\e(B ?\\e,A'\e(B ?\\e$,1(!\e(B ?\\e,A)\e(B ?\\e$,1($\e(B ?\\e,A+\e(B ?\\e,A,\e(B ?\\e,A-\e(B ?\\e,A.\e(B ?\\e$,1('\e(B ?\\e,A0\e(B ?\\e,A1\e(B ?\\e$,1(&\e(B
474 ?\\e$,1(v\e(B ?\\e$,1)Q\e(B ?\\e,A5\e(B ?\\e,A6\e(B ?\\e,A7\e(B ?\\e$,1(q\e(B ?\\e$,1uV\e(B ?\\e$,1(t\e(B ?\\e,A;\e(B ?\\e$,1(x\e(B ?\\e$,1(%\e(B ?\\e$,1(u\e(B ?\\e$,1(w\e(B ?\\e$,1(0\e(B ?\\e$,1(1\e(B ?\\e$,1(2\e(B ?\\e$,1(3\e(B
475 ?\\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 ?\\e$,1(@\e(B ?\\e$,1(A\e(B ?\\e$,1(B\e(B ?\\e$,1(C\e(B ?\\e$,1(D\e(B
476 ?\\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 ?\\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
477 ?\\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 ?\\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
478 ?\\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] nil ?b)))
479
968786fd
KH
480;; Register cyrillic-iso8859-5 characters in the encode table of
481;; windows-1251.
482(let ((table (get 'encode-windows-1251 'translation-table))
483 ;; Nth element is a cyrillic-iso8859-5 character encoded to a
484 ;; code (128 + N), or nil.
485 (vec [?\\e,L"\e(B ?\\e,L#\e(B nil ?\\e,Ls\e(B nil nil nil nil nil nil ?\\e,L)\e(B nil ?\\e,L*\e(B ?\\e,L,\e(B ?\\e,L+\e(B ?\\e,L/\e(B
486 ?\\e,Lr\e(B nil nil nil nil nil nil nil nil nil ?\\e,Ly\e(B nil ?\\e,Lz\e(B ?\\e,L|\e(B ?\\e,L{\e(B ?\\e,L\7f\e(B
487 nil ?\\e,L.\e(B ?\\e,L~\e(B ?\\e,L(\e(B nil nil nil nil ?\\e,L!\e(B nil ?\\e,L$\e(B nil nil nil nil ?\\e,L'\e(B
488 nil nil ?\\e,L&\e(B ?\\e,Lv\e(B nil nil nil nil ?\\e,Lq\e(B ?\\e,Lp\e(B ?\\e,Lt\e(B nil ?\\e,Lx\e(B ?\\e,L%\e(B ?\\e,Lu\e(B ?\\e,Lw\e(B
489 ?\\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
490 ?\\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
491 ?\\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
492 ?\\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]))
493 (dotimes (i (length vec))
494 (if (aref vec i)
495 (aset table (aref vec i) (+ 128 i)))))
496
9e4eea3d
DL
497(define-coding-system-alias 'cp1251 'windows-1251)
498
52d8246c
KH
499(let ((elt `("microsoft-cp1251" windows-1251 1
500 ,(get 'encode-windows-1251 'translation-table)))
501 (slot (assoc "microsoft-cp1251" ctext-non-standard-encodings-alist)))
502 (if slot
503 (setcdr slot (cdr elt))
504 (push elt ctext-non-standard-encodings-alist)))
505
fd162724 506(define-ccl-program ccl-encode-windows-1251-font
6a8b9ce4
KH
507 `(0
508 ((if (r0 == ,(charset-id 'mule-unicode-0100-24ff))
509 ((r1 <<= 7)
510 (r1 += r2)))
511 (translate-character encode-windows-1251 r0 r1))))
fd162724
KH
512
513(add-to-list 'font-ccl-encoder-alist
514 '("microsoft-cp1251" . ccl-encode-windows-1251-font))
515
6f27e0f9
DL
516(set-language-info-alist
517 "Bulgarian" `((coding-system windows-1251)
52d8246c
KH
518 (coding-priority windows-1251)
519 (ctext-non-standard-encodings "microsoft-cp1251")
fd162724
KH
520 (overriding-fontspec
521 (,(get 'encode-windows-1251 'translation-table)
522 . (nil . "microsoft-cp1251"))
523 (,(get 'cyrillic-koi8-r-encode-table 'translation-table)
524 . (nil . "koi8-r")))
6f27e0f9
DL
525 (nonascii-translation
526 . ,(get 'decode-windows-1251 'translation-table))
1d5f8bfc 527 (input-method . "bulgarian-bds")
6f27e0f9 528 (documentation
76509389
DL
529 . "Support for Bulgarian with windows-1251 character set.")
530 (tutorial . "TUTORIAL.bg"))
6f27e0f9
DL
531 '("Cyrillic"))
532
533(set-language-info-alist
534 "Belarusian" `((coding-system windows-1251)
535 (coding-priority windows-1251)
52d8246c 536 (ctext-non-standard-encodings "microsoft-cp1251")
fd162724
KH
537 (overriding-fontspec
538 (,(get 'encode-windows-1251 'translation-table)
539 . (nil . "microsoft-cp1251"))
540 (,(get 'cyrillic-koi8-r-encode-table 'translation-table)
541 . (nil . "koi8-r")))
6f27e0f9
DL
542 (nonascii-translation
543 . ,(get 'decode-windows-1251 'translation-table))
544 (input-method . "belarusian")
6f27e0f9
DL
545 (documentation
546 . "Support for Belarusian with windows-1251 character set.
547\(The name Belarusian replaced Byelorussian in the early 1990s.)"))
548 '("Cyrillic"))
549
41da80b1
DL
550(provide 'cyrillic)
551
ab5796a9 552;;; arch-tag: bda71ae0-ba41-4cb6-a6e0-1dff542313d3
4ed46869 553;;; cyrillic.el ends here