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