tenc-iso-8859.lisp - clic - Clic is an command line interactive client for gopher written in Common LISP
(HTM) git clone git://bitreich.org/clic/ git://hg6vgqziawt5s4dj.onion/clic/
(DIR) Log
(DIR) Files
(DIR) Refs
(DIR) Tags
(DIR) LICENSE
---
tenc-iso-8859.lisp (46406B)
---
1 ;;;; -*- Mode: lisp; indent-tabs-mode: nil -*-
2 ;;;
3 ;;; enc-iso-8859.lisp --- ISO-8859-* encodings.
4 ;;;
5 ;;; Copyright (C) 2007, Luis Oliveira <loliveira@common-lisp.net>
6 ;;;
7 ;;; Permission is hereby granted, free of charge, to any person
8 ;;; obtaining a copy of this software and associated documentation
9 ;;; files (the "Software"), to deal in the Software without
10 ;;; restriction, including without limitation the rights to use, copy,
11 ;;; modify, merge, publish, distribute, sublicense, and/or sell copies
12 ;;; of the Software, and to permit persons to whom the Software is
13 ;;; furnished to do so, subject to the following conditions:
14 ;;;
15 ;;; The above copyright notice and this permission notice shall be
16 ;;; included in all copies or substantial portions of the Software.
17 ;;;
18 ;;; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
19 ;;; EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20 ;;; MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
21 ;;; NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
22 ;;; HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
23 ;;; WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
24 ;;; OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
25 ;;; DEALINGS IN THE SOFTWARE.
26
27 ;;; This implementation is largely based on OpenMCL's l1-unicode.lisp
28 ;;; Copyright (C) 2006 Clozure Associates and contributors.
29
30 (in-package #:babel-encodings)
31
32 ;;; Typically, ISO-8859-* codes in the range #x00-#x9f map straight
33 ;;; through, while codes #xa0-#xff select arbitrary Unicode characters
34 ;;; that are commonly used in some locale. (Sometimes the break is at
35 ;;; #x80 instead of #xa0).
36 ;;;
37 ;;; (comment from OpenMCL's ccl/level-1/l1-unicode.lisp)
38
39 (define-character-encoding :iso-8859-1
40 "An 8-bit, fixed-width character encoding in which all
41 character codes map to their Unicode equivalents. Intended to
42 support most characters used in most Western European languages."
43 :aliases '(:latin-1 :latin1)
44 :literal-char-code-limit 256)
45
46 (define-unibyte-encoder :iso-8859-1 (code)
47 (if (>= code 256)
48 (handle-error)
49 code))
50
51 (define-unibyte-decoder :iso-8859-1 (octet)
52 octet)
53
54 (define-character-encoding :iso-8859-2
55 "An 8-bit, fixed-width character encoding in which codes
56 #x00-#x9f map to their Unicode equivalents and other codes map to
57 other Unicode character values. Intended to provide most
58 characters found in most languages used in Central/Eastern
59 Europe."
60 :aliases '(:latin-2 :latin2)
61 :literal-char-code-limit #xa0)
62
63 (define-constant +unicode-00a0-0180-to-iso-8859-2+
64 #(#xa0 nil nil nil #xa4 nil nil #xa7 ; #xa0-#xa7
65 #xa8 nil nil nil nil #xad nil nil ; #xa8-#xaf
66 #xb0 nil nil nil #xb4 nil nil nil ; #xb0-#xb7
67 #xb8 nil nil nil nil nil nil nil ; #xb8-#xbf
68 nil #xc1 #xc2 nil #xc4 nil nil #xc7 ; #xc0-#xc7
69 nil #xc9 nil #xcb nil #xcd #xce nil ; #xc8-#xcf
70 nil nil nil #xd3 #xd4 nil #xd6 #xd7 ; #xd0-#xd7
71 nil nil #xda nil #xdc #xdd nil #xdf ; #xd8-#xdf
72 nil #xe1 #xe2 nil #xe4 nil nil #xe7 ; #xe0-#xe7
73 nil #xe9 nil #xeb nil #xed #xee nil ; #xe8-#xef
74 nil nil nil #xf3 #xf4 nil #xf6 #xf7 ; #xf0-#xf7
75 nil nil #xfa nil #xfc #xfd nil nil ; #xf8-#xff
76 ;; #x0100
77 nil nil #xc3 #xe3 #xa1 #xb1 #xc6 #xe6 ; #x100-#x107
78 nil nil nil nil #xc8 #xe8 #xcf #xef ; #x108-#x10f
79 #xd0 #xf0 nil nil nil nil nil nil ; #x110-#x117
80 #xca #xea #xcc #xec nil nil nil nil ; #x118-#x11f
81 nil nil nil nil nil nil nil nil ; #x120-#x127
82 nil nil nil nil nil nil nil nil ; #x128-#x12f
83 nil nil nil nil nil nil nil nil ; #x130-#x137
84 nil #xc5 #xe5 nil nil #xa5 #xb5 nil ; #x138-#x13f
85 nil #xa3 #xb3 #xd1 #xf1 nil nil #xd2 ; #x140-#x147
86 #xf2 nil nil nil nil nil nil nil ; #x148-#x14f
87 #xd5 #xf5 nil nil #xc0 #xe0 nil nil ; #x150-#x157
88 #xd8 #xf8 #xa6 #xb6 nil nil #xaa #xba ; #x158-#x15f
89 #xa9 #xb9 #xde #xfe #xab #xbb nil nil ; #x160-#x167
90 nil nil nil nil nil nil #xd9 #xf9 ; #x168-#x16f
91 #xdb #xfb nil nil nil nil nil nil ; #x170-#x177
92 nil #xac #xbc #xaf #xbf #xae #xbe nil) ; #x178-#x17f
93 :test #'equalp)
94
95 (define-constant +unicode-02c0-02e0-to-iso-8859-2+
96 #(nil nil nil nil nil nil nil #xb7 ; #x2c0-#x2c7
97 nil nil nil nil nil nil nil nil ; #x2c8-#x2cf
98 nil nil nil nil nil nil nil nil ; #x2d0-#x2d7
99 #xa2 #xff nil #xb2 nil #xbd nil nil) ; #x2d8-#x2df
100 :test #'equalp)
101
102 (define-unibyte-encoder :iso-8859-2 (code)
103 (or (cond ((< code #xa0) code)
104 ((< code #x180)
105 (svref +unicode-00a0-0180-to-iso-8859-2+
106 (the ub8 (- code #xa0))))
107 ((<= #x2c0 code #x2df)
108 (svref +unicode-02c0-02e0-to-iso-8859-2+
109 (the ub8 (- code #x2c0)))))
110 (handle-error)))
111
112 (define-constant +iso-8859-2-to-unicode+
113 #(;; #xa0
114 #x00a0 #x0104 #x02d8 #x0141 #x00a4 #x013d #x015a #x00a7
115 #x00a8 #x0160 #x015e #x0164 #x0179 #x00ad #x017d #x017b
116 ;; #xb0
117 #x00b0 #x0105 #x02db #x0142 #x00b4 #x013e #x015b #x02c7
118 #x00b8 #x0161 #x015f #x0165 #x017a #x02dd #x017e #x017c
119 ;; #xc0
120 #x0154 #x00c1 #x00c2 #x0102 #x00c4 #x0139 #x0106 #x00c7
121 #x010c #x00c9 #x0118 #x00cb #x011a #x00cd #x00ce #x010e
122 ;; #xd0
123 #x0110 #x0143 #x0147 #x00d3 #x00d4 #x0150 #x00d6 #x00d7
124 #x0158 #x016e #x00da #x0170 #x00dc #x00dd #x0162 #x00df
125 ;; #xe0
126 #x0155 #x00e1 #x00e2 #x0103 #x00e4 #x013a #x0107 #x00e7
127 #x010d #x00e9 #x0119 #x00eb #x011b #x00ed #x00ee #x010f
128 ;; #xf0
129 #x0111 #x0144 #x0148 #x00f3 #x00f4 #x0151 #x00f6 #x00f7
130 #x0159 #x016f #x00fa #x0171 #x00fc #x00fd #x0163 #x02d9)
131 :test #'equalp)
132
133 (define-unibyte-decoder :iso-8859-2 (octet)
134 (if (< octet #xa0)
135 octet
136 (svref +iso-8859-2-to-unicode+ (the ub8 (- octet #xa0)))))
137
138 (define-character-encoding :iso-8859-3
139 "An 8-bit, fixed-width character encoding in which codes
140 #x00-#x9f map to their Unicode equivalents and other codes map to
141 other Unicode character values. Intended to provide most
142 characters found in most languages used in Southern Europe."
143 :aliases '(:latin-3 :latin3)
144 :literal-char-code-limit #xa0)
145
146 (define-constant +unicode-a0-100-to-iso-8859-3+
147 #(#xa0 nil nil #xa3 #xa4 nil nil #xa7 ; #xa0-#xa7
148 #xa8 nil nil nil nil #xad nil nil ; #xa8-#xaf
149 #xb0 nil #xb2 #xb3 #xb4 #xb5 nil #xb7 ; #xb0-#xb7
150 #xb8 nil nil nil nil #xbd nil nil ; #xb8-#xbf
151 #xc0 #xc1 #xc2 nil #xc4 nil nil #xc7 ; #xc0-#xc7
152 #xc8 #xc9 #xca #xcb #xcc #xcd #xce #xcf ; #xc8-#xcf
153 nil #xd1 #xd2 #xd3 #xd4 nil #xd6 #xd7 ; #xd0-#xd7
154 nil #xd9 #xda #xdb #xdc nil nil #xdf ; #xd8-#xdf
155 #xe0 #xe1 #xe2 nil #xe4 nil nil #xe7 ; #xe0-#xe7
156 #xe8 #xe9 #xea #xeb #xec #xed #xee #xef ; #xe8-#xef
157 nil #xf1 #xf2 #xf3 #xf4 nil #xf6 #xf7 ; #xf0-#xf7
158 nil #xf9 #xfa #xfb #xfc nil nil nil) ; #xf8-#xff
159 :test #'equalp)
160
161 (define-constant +unicode-108-180-to-iso-8859-3+
162 #(#xc6 #xe6 #xc5 #xe5 #x00 #x00 #x00 #x00 ; #x108-#x10f
163 nil nil nil nil nil nil nil nil ; #x110-#x117
164 nil nil nil nil #xd8 #xf8 #xab #xbb ; #x118-#x11f
165 #xd5 #xf5 nil nil #xa6 #xb6 #xa1 #xb1 ; #x120-#x127
166 nil nil nil nil nil nil nil nil ; #x128-#x12f
167 #xa9 #xb9 nil nil #xac #xbc nil nil ; #x130-#x137
168 nil nil nil nil nil nil nil nil ; #x138-#x13f
169 nil nil nil nil nil nil nil nil ; #x140-#x147
170 nil nil nil nil nil nil nil nil ; #x148-#x14f
171 nil nil nil nil nil nil nil nil ; #x150-#x157
172 nil nil nil nil #xde #xfe #xaa #xba ; #x158-#x15f
173 nil nil nil nil nil nil nil nil ; #x160-#x167
174 nil nil nil nil #xdd #xfd nil nil ; #x168-#x16f
175 nil nil nil nil nil nil nil nil ; #x170-#x177
176 nil nil nil #xaf #xbf nil nil nil) ; #x178-#x17f
177 :test #'equalp)
178
179 (define-constant +unicode-2d8-2e0-to-iso-8859-3+
180 #(#xa2 #xff nil nil nil nil nil nil) ; #x2d8-#x2df
181 :test #'equalp)
182
183 (define-unibyte-encoder :iso-8859-3 (code)
184 (or (cond ((< code #xa0) code)
185 ((< code #x100)
186 (svref +unicode-a0-100-to-iso-8859-3+
187 (the ub8 (- code #xa0))))
188 ((<= #x108 code #x17f)
189 (svref +unicode-108-180-to-iso-8859-3+
190 (the ub8 (- code #x108))))
191 ((<= #x2d8 code #x2df)
192 (svref +unicode-2d8-2e0-to-iso-8859-3+
193 (the ub8 (- code #x2d8)))))
194 (handle-error)))
195
196 (define-constant +iso-8859-3-to-unicode+
197 #(;; #xa0
198 #x00a0 #x0126 #x02d8 #x00a3 #x00a4 #xfffd #x0124 #x00a7
199 #x00a8 #x0130 #x015e #x011e #x0134 #x00ad #xfffd #x017b
200 ;; #xb0
201 #x00b0 #x0127 #x00b2 #x00b3 #x00b4 #x00b5 #x0125 #x00b7
202 #x00b8 #x0131 #x015f #x011f #x0135 #x00bd #xfffd #x017c
203 ;; #xc0
204 #x00c0 #x00c1 #x00c2 #xfffd #x00c4 #x010a #x0108 #x00c7
205 #x00c8 #x00c9 #x00ca #x00cb #x00cc #x00cd #x00ce #x00cf
206 ;; #xd0
207 #xfffd #x00d1 #x00d2 #x00d3 #x00d4 #x0120 #x00d6 #x00d7
208 #x011c #x00d9 #x00da #x00db #x00dc #x016c #x015c #x00df
209 ;; #xe0
210 #x00e0 #x00e1 #x00e2 #xfffd #x00e4 #x010b #x0109 #x00e7
211 #x00e8 #x00e9 #x00ea #x00eb #x00ec #x00ed #x00ee #x00ef
212 ;; #xf0
213 #xfffd #x00f1 #x00f2 #x00f3 #x00f4 #x0121 #x00f6 #x00f7
214 #x011d #x00f9 #x00fa #x00fb #x00fc #x016d #x015d #x02d9)
215 :test #'equalp)
216
217 (define-unibyte-decoder :iso-8859-3 (octet)
218 (if (< octet #xa0)
219 octet
220 (svref +iso-8859-3-to-unicode+ (the ub8 (- octet #xa0)))))
221
222 (define-character-encoding :iso-8859-4
223 "An 8-bit, fixed-width character encoding in which codes
224 #x00-#x9f map to their Unicode equivalents and other codes map to
225 other Unicode character values. Intended to provide most
226 characters found in most languages used in Northern Europe."
227 :aliases '(:latin-4 :latin4)
228 :literal-char-code-limit #xa0)
229
230 (define-constant +unicode-a0-180-to-iso-8859-4+
231 #(#xa0 nil nil nil #xa4 nil nil #xa7 ; #xa0-#xa7
232 #xa8 nil nil nil nil #xad nil #xaf ; #xa8-#xaf
233 #xb0 nil nil nil #xb4 nil nil nil ; #xb0-#xb7
234 #xb8 nil nil nil nil nil nil nil ; #xb8-#xbf
235 nil #xc1 #xc2 #xc3 #xc4 #xc5 #xc6 nil ; #xc0-#xc7
236 nil #xc9 nil #xcb nil #xcd #xce nil ; #xc8-#xcf
237 nil nil nil nil #xd4 #xd5 #xd6 #xd7 ; #xd0-#xd7
238 #xd8 nil #xda #xdb #xdc nil nil #xdf ; #xd8-#xdf
239 nil #xe1 #xe2 #xe3 #xe4 #xe5 #xe6 nil ; #xe0-#xe7
240 nil #xe9 nil #xeb nil #xed #xee nil ; #xe8-#xef
241 nil nil nil nil #xf4 #xf5 #xf6 #xf7 ; #xf0-#xf7
242 #xf8 nil #xfa #xfb #xfc nil nil nil ; #xf8-#xff
243 #xc0 #xe0 nil nil #xa1 #xb1 nil nil ; #x100-#x107
244 nil nil nil nil #xc8 #xe8 nil nil ; #x108-#x10f
245 #xd0 #xf0 #xaa #xba nil nil #xcc #xec ; #x110-#x117
246 #xca #xea nil nil nil nil nil nil ; #x118-#x11f
247 nil nil #xab #xbb nil nil nil nil ; #x120-#x127
248 #xa5 #xb5 #xcf #xef nil nil #xc7 #xe7 ; #x128-#x12f
249 nil nil nil nil nil nil #xd3 #xf3 ; #x130-#x137
250 #xa2 nil nil #xa6 #xb6 nil nil nil ; #x138-#x13f
251 nil nil nil nil nil #xd1 #xf1 nil ; #x140-#x147
252 nil nil #xbd #xbf #xd2 #xf2 nil nil ; #x148-#x14f
253 nil nil nil nil nil nil #xa3 #xb3 ; #x150-#x157
254 nil nil nil nil nil nil nil nil ; #x158-#x15f
255 #xa9 #xb9 nil nil nil nil #xac #xbc ; #x160-#x167
256 #xdd #xfd #xde #xfe nil nil nil nil ; #x168-#x16f
257 nil nil #xd9 #xf9 nil nil nil nil ; #x170-#x177
258 nil nil nil nil nil #xae #xbe nil) ; #x178-#x17f
259 :test #'equalp)
260
261 (define-constant +unicode-2c0-2e0-to-iso-8859-4+
262 #(nil nil nil nil nil nil nil #xb7 ; #x2c0-#x2c7
263 nil nil nil nil nil nil nil nil ; #x2c8-#x2cf
264 nil nil nil nil nil nil nil nil ; #x2d0-#x2d7
265 nil #xff nil #xb2 nil nil nil nil) ; #x2d8-#x2df
266 :test #'equalp)
267
268 (define-unibyte-encoder :iso-8859-4 (code)
269 (or (cond ((< code #xa0) code)
270 ((< code #x180)
271 (svref +unicode-a0-180-to-iso-8859-4+
272 (the ub8 (- code #xa0))))
273 ((<= #x2c0 code #x2df)
274 (svref +unicode-2c0-2e0-to-iso-8859-4+
275 (the ub8 (- code #x2c0)))))
276 (handle-error)))
277
278 (define-constant +iso-8859-4-to-unicode+
279 #(;; #xa0
280 #x00a0 #x0104 #x0138 #x0156 #x00a4 #x0128 #x013b #x00a7
281 #x00a8 #x0160 #x0112 #x0122 #x0166 #x00ad #x017d #x00af
282 ;; #xb0
283 #x00b0 #x0105 #x02db #x0157 #x00b4 #x0129 #x013c #x02c7
284 #x00b8 #x0161 #x0113 #x0123 #x0167 #x014a #x017e #x014b
285 ;; #xc0
286 #x0100 #x00c1 #x00c2 #x00c3 #x00c4 #x00c5 #x00c6 #x012e
287 #x010c #x00c9 #x0118 #x00cb #x0116 #x00cd #x00ce #x012a
288 ;; #xd0
289 #x0110 #x0145 #x014c #x0136 #x00d4 #x00d5 #x00d6 #x00d7
290 #x00d8 #x0172 #x00da #x00db #x00dc #x0168 #x016a #x00df
291 ;; #xe0
292 #x0101 #x00e1 #x00e2 #x00e3 #x00e4 #x00e5 #x00e6 #x012f
293 #x010d #x00e9 #x0119 #x00eb #x0117 #x00ed #x00ee #x012b
294 ;; #xf0
295 #x0111 #x0146 #x014d #x0137 #x00f4 #x00f5 #x00f6 #x00f7
296 #x00f8 #x0173 #x00fa #x00fb #x00fc #x0169 #x016b #x02d9)
297 :test #'equalp)
298
299 (define-unibyte-decoder :iso-8859-4 (octet)
300 (if (< octet #xa0)
301 octet
302 (svref +iso-8859-4-to-unicode+ (the ub8 (- octet #xa0)))))
303
304 (define-character-encoding :iso-8859-5
305 "An 8-bit, fixed-width character encoding in which codes
306 #x00-#x9f map to their Unicode equivalents and other codes map to
307 other Unicode character values. Intended to provide most
308 characters found in the Cyrillic alphabet."
309 :aliases '(:cyrillic)
310 :literal-char-code-limit #xa0)
311
312 (define-constant +unicode-a0-b0-to-iso-8859-5+
313 #(#xa0 nil nil nil nil nil nil #xfd ; #xa0-#xa7
314 nil nil nil nil nil #xad nil nil) ; #xa8-#xaf
315 :test #'equalp)
316
317 (define-constant +unicode-400-460-to-iso-8859-5+
318 #(nil #xa1 #xa2 #xa3 #xa4 #xa5 #xa6 #xa7 ; #x400-#x407
319 #xa8 #xa9 #xaa #xab #xac nil #xae #xaf ; #x408-#x40f
320 #xb0 #xb1 #xb2 #xb3 #xb4 #xb5 #xb6 #xb7 ; #x410-#x417
321 #xb8 #xb9 #xba #xbb #xbc #xbd #xbe #xbf ; #x418-#x41f
322 #xc0 #xc1 #xc2 #xc3 #xc4 #xc5 #xc6 #xc7 ; #x420-#x427
323 #xc8 #xc9 #xca #xcb #xcc #xcd #xce #xcf ; #x428-#x42f
324 #xd0 #xd1 #xd2 #xd3 #xd4 #xd5 #xd6 #xd7 ; #x430-#x437
325 #xd8 #xd9 #xda #xdb #xdc #xdd #xde #xdf ; #x438-#x43f
326 #xe0 #xe1 #xe2 #xe3 #xe4 #xe5 #xe6 #xe7 ; #x440-#x447
327 #xe8 #xe9 #xea #xeb #xec #xed #xee #xef ; #x448-#x44f
328 nil #xf1 #xf2 #xf3 #xf4 #xf5 #xf6 #xf7 ; #x450-#x457
329 #xf8 #xf9 #xfa #xfb #xfc nil #xfe #xff) ; #x458-#x45f
330 :test #'equalp)
331
332 (define-unibyte-encoder :iso-8859-5 (code)
333 (or (cond ((< code #xa0) code)
334 ((< code #xb0)
335 (svref +unicode-a0-b0-to-iso-8859-5+
336 (the ub8 (- code #xa0))))
337 ((<= #x400 code #x45f)
338 (svref +unicode-400-460-to-iso-8859-5+
339 (the ub8 (- code #x400))))
340 ;; the Numero sign
341 ((= code #x2116) #xf0))
342 (handle-error)))
343
344 (define-constant +iso-8859-5-to-unicode+
345 #(;; #xa0
346 #x00a0 #x0401 #x0402 #x0403 #x0404 #x0405 #x0406 #x0407
347 #x0408 #x0409 #x040a #x040b #x040c #x00ad #x040e #x040f
348 ;; #xb0
349 #x0410 #x0411 #x0412 #x0413 #x0414 #x0415 #x0416 #x0417
350 #x0418 #x0419 #x041a #x041b #x041c #x041d #x041e #x041f
351 ;; #xc0
352 #x0420 #x0421 #x0422 #x0423 #x0424 #x0425 #x0426 #x0427
353 #x0428 #x0429 #x042a #x042b #x042c #x042d #x042e #x042f
354 ;; #xd0
355 #x0430 #x0431 #x0432 #x0433 #x0434 #x0435 #x0436 #x0437
356 #x0438 #x0439 #x043a #x043b #x043c #x043d #x043e #x043f
357 ;; #xe0
358 #x0440 #x0441 #x0442 #x0443 #x0444 #x0445 #x0446 #x0447
359 #x0448 #x0449 #x044a #x044b #x044c #x044d #x044e #x044f
360 ;; #xf0
361 #x2116 #x0451 #x0452 #x0453 #x0454 #x0455 #x0456 #x0457
362 #x0458 #x0459 #x045a #x045b #x045c #x00a7 #x045e #x045f)
363 :test #'equalp)
364
365 (define-unibyte-decoder :iso-8859-5 (octet)
366 (if (< octet #xa0)
367 octet
368 (svref +iso-8859-5-to-unicode+ (the ub8 (- octet #xa0)))))
369
370 (define-character-encoding :iso-8859-6
371 "An 8-bit, fixed-width character encoding in which codes #x00-#x9f
372 map to their Unicode equivalents and other codes map to other Unicode
373 character values. Intended to provide most characters found in the
374 Arabic alphabet."
375 :aliases '(:arabic)
376 :literal-char-code-limit #xa0)
377
378 (define-constant +unicode-a0-b0-to-iso-8859-6+
379 #(#xa0 nil nil nil #xa4 nil nil nil ; #xa0-#xa7
380 nil nil nil nil nil #xad nil nil) ; #xa8-#xaf
381 :test #'equalp)
382
383 (define-constant +unicode-608-658-to-iso-8859-6+
384 #(nil nil nil nil #xac nil nil nil ; #x608-#x60f
385 nil nil nil nil nil nil nil nil ; #x610-#x617
386 nil nil nil #xbb nil nil nil #xbf ; #x618-#x61f
387 nil #xc1 #xc2 #xc3 #xc4 #xc5 #xc6 #xc7 ; #x620-#x627
388 #xc8 #xc9 #xca #xcb #xcc #xcd #xce #xcf ; #x628-#x62f
389 #xd0 #xd1 #xd2 #xd3 #xd4 #xd5 #xd6 #xd7 ; #x630-#x637
390 #xd8 #xd9 #xda nil nil nil nil nil ; #x638-#x63f
391 #xe0 #xe1 #xe2 #xe3 #xe4 #xe5 #xe6 #xe7 ; #x640-#x647
392 #xe8 #xe9 #xea #xeb #xec #xed #xee #xef ; #x648-#x64f
393 #xf0 #xf1 #xf2 nil nil nil nil nil) ; #x650-#x657
394 :test #'equalp)
395
396 (define-unibyte-encoder :iso-8859-6 (code)
397 (or (cond ((< code #xa0) code)
398 ((< code #xb0)
399 (svref +unicode-a0-b0-to-iso-8859-6+
400 (the ub8 (- code #xa0))))
401 ((<= #x608 code #x657)
402 (svref +unicode-608-658-to-iso-8859-6+
403 (the ub8 (- code #x608)))))
404 (handle-error)))
405
406 (define-constant +iso-8859-6-to-unicode+
407 #(;; #xa0
408 #x00a0 #xfffd #xfffd #xfffd #x00a4 #xfffd #xfffd #xfffd
409 #xfffd #xfffd #xfffd #xfffd #x060c #x00ad #xfffd #xfffd
410 ;; #xb0
411 #xfffd #xfffd #xfffd #xfffd #xfffd #xfffd #xfffd #xfffd
412 #xfffd #xfffd #xfffd #x061b #xfffd #xfffd #xfffd #x061f
413 ;; #xc0
414 #xfffd #x0621 #x0622 #x0623 #x0624 #x0625 #x0626 #x0627
415 #x0628 #x0629 #x062a #x062b #x062c #x062d #x062e #x062f
416 ;; #xd0
417 #x0630 #x0631 #x0632 #x0633 #x0634 #x0635 #x0636 #x0637
418 #x0638 #x0639 #x063a #xfffd #xfffd #xfffd #xfffd #xfffd
419 ;; #xe0
420 #x0640 #x0641 #x0642 #x0643 #x0644 #x0645 #x0646 #x0647
421 #x0648 #x0649 #x064a #x064b #x064c #x064d #x064e #x064f
422 ;; #xf0
423 #x0650 #x0651 #x0652 #xfffd #xfffd #xfffd #xfffd #xfffd
424 #xfffd #xfffd #xfffd #xfffd #xfffd #xfffd #xfffd #xfffd)
425 :test #'equalp)
426
427 (define-unibyte-decoder :iso-8859-6 (octet)
428 (if (< octet #xa0)
429 octet
430 (svref +iso-8859-6-to-unicode+ (the ub8 (- octet #xa0)))))
431
432 (define-character-encoding :iso-8859-7
433 "An 8-bit, fixed-width character encoding in which codes
434 #x00-#x9f map to their Unicode equivalents and other codes map to
435 other Unicode character values. Intended to provide most
436 characters found in the Greek alphabet."
437 :aliases '(:greek)
438 :literal-char-code-limit #xa0)
439
440 (define-constant +unicode-a0-c0-to-iso-8859-7+
441 #(#xa0 nil nil #xa3 nil nil #xa6 #xa7 ; #xa0-#xa7
442 #xa8 #xa9 nil #xab #xac #xad nil nil ; #xa8-#xaf
443 #xb0 #xb1 #xb2 #xb3 nil nil nil #xb7 ; #xb0-#xb7
444 nil nil nil #xbb nil #xbd nil nil) ; #xb8-#xbf
445 :test #'equalp)
446
447 (define-constant +unicode-378-3d0-to-iso-8859-7+
448 #(nil nil #xaa nil nil nil nil nil ; #x378-#x37f
449 nil nil nil nil #xb4 #xb5 #xb6 nil ; #x380-#x387
450 #xb8 #xb9 #xba nil #xbc nil #xbe #xbf ; #x388-#x38f
451 #xc0 #xc1 #xc2 #xc3 #xc4 #xc5 #xc6 #xc7 ; #x390-#x397
452 #xc8 #xc9 #xca #xcb #xcc #xcd #xce #xcf ; #x398-#x39f
453 #xd0 #xd1 nil #xd3 #xd4 #xd5 #xd6 #xd7 ; #x3a0-#x3a7
454 #xd8 #xd9 #xda #xdb #xdc #xdd #xde #xdf ; #x3a8-#x3af
455 #xe0 #xe1 #xe2 #xe3 #xe4 #xe5 #xe6 #xe7 ; #x3b0-#x3b7
456 #xe8 #xe9 #xea #xeb #xec #xed #xee #xef ; #x3b8-#x3bf
457 #xf0 #xf1 #xf2 #xf3 #xf4 #xf5 #xf6 #xf7 ; #x3c0-#x3c7
458 #xf8 #xf9 #xfa #xfb #xfc #xfd #xfe nil) ; #x3c8-#x3cf
459 :test #'equalp)
460
461 (define-constant +unicode-2010-2020-to-iso-8859-7+
462 #(nil nil nil nil nil #xaf nil nil ; #x2010-#x2017
463 #xa1 #xa2 nil nil nil nil nil nil) ; #x2018-#x201f
464 :test #'equalp)
465
466 (define-constant +unicode-20ac-20b0-to-iso-8859-7+
467 #(#xa4 nil nil #xa5)
468 :test #'equalp)
469
470 (define-unibyte-encoder :iso-8859-7 (code)
471 (or (cond ((< code #xa0) code)
472 ((< code #xc0)
473 (svref +unicode-a0-c0-to-iso-8859-7+
474 (the ub8 (- code #xa0))))
475 ((<= #x378 code #x3cf)
476 (svref +unicode-378-3d0-to-iso-8859-7+
477 (the ub8 (- code #x378))))
478 ((<= #x2010 code #x201f)
479 (svref +unicode-2010-2020-to-iso-8859-7+
480 (the ub8 (- code #x2010))))
481 ((<= #x201c code #x20af)
482 (svref +unicode-20ac-20b0-to-iso-8859-7+
483 (the ub8 (- code #x20ac)))))
484 (handle-error)))
485
486 (define-constant +iso-8859-7-to-unicode+
487 #(;; #xa0
488 #x00a0 #x2018 #x2019 #x00a3 #x20ac #x20af #x00a6 #x00a7
489 #x00a8 #x00a9 #x037a #x00ab #x00ac #x00ad #xfffd #x2015
490 ;; #xb0
491 #x00b0 #x00b1 #x00b2 #x00b3 #x0384 #x0385 #x0386 #x00b7
492 #x0388 #x0389 #x038a #x00bb #x038c #x00bd #x038e #x038f
493 ;; #xc0
494 #x0390 #x0391 #x0392 #x0393 #x0394 #x0395 #x0396 #x0397
495 #x0398 #x0399 #x039a #x039b #x039c #x039d #x039e #x039f
496 ;; #xd0
497 #x03a0 #x03a1 #xfffd #x03a3 #x03a4 #x03a5 #x03a6 #x03a7
498 #x03a8 #x03a9 #x03aa #x03ab #x03ac #x03ad #x03ae #x03af
499 ;; #xe0
500 #x03b0 #x03b1 #x03b2 #x03b3 #x03b4 #x03b5 #x03b6 #x03b7
501 #x03b8 #x03b9 #x03ba #x03bb #x03bc #x03bd #x03be #x03bf
502 ;; #xf0
503 #x03c0 #x03c1 #x03c2 #x03c3 #x03c4 #x03c5 #x03c6 #x03c7
504 #x03c8 #x03c9 #x03ca #x03cb #x03cc #x03cd #x03ce #xfffd)
505 :test #'equalp)
506
507 (define-unibyte-decoder :iso-8859-7 (octet)
508 (if (< octet #xa0)
509 octet
510 (svref +iso-8859-7-to-unicode+ (the ub8 (- octet #xa0)))))
511
512 (define-character-encoding :iso-8859-8
513 "An 8-bit, fixed-width character encoding in which codes #x00-#x9f
514 map to their Unicode equivalents and other codes map to other Unicode
515 character values. Intended to provide most characters found in the
516 Hebrew alphabet."
517 :aliases '(:hebrew)
518 :literal-char-code-limit #xa0)
519
520 (define-constant +unicode-a0-f8-to-iso-8859-8+
521 #(#xa0 nil #xa2 #xa3 #xa4 #xa5 #xa6 #xa7 ; #xa0-#xa7
522 #xa8 #xa9 nil #xab #xac #xad #xae #xaf ; #xa8-#xaf
523 #xb0 #xb1 #xb2 #xb3 #xb4 #xb5 #xb6 #xb7 ; #xb0-#xb7
524 #xb8 #xb9 nil #xbb #xbc #xbd #xbe nil ; #xb8-#xbf
525 nil nil nil nil nil nil nil nil ; #xc0-#xc7
526 nil nil nil nil nil nil nil nil ; #xc8-#xcf
527 nil nil nil nil nil nil nil #xaa ; #xd0-#xd7
528 nil nil nil nil nil nil nil nil ; #xd8-#xdf
529 nil nil nil nil nil nil nil nil ; #xe0-#xe7
530 nil nil nil nil nil nil nil nil ; #xe8-#xef
531 nil nil nil nil nil nil nil #xba) ; #xf0-#xf7
532 :test #'equalp)
533
534 (define-constant +unicode-5d0-5f0-to-iso-8859-8+
535 #(#xe0 #xe1 #xe2 #xe3 #xe4 #xe5 #xe6 #xe7 ; #x5d0-#x5d7
536 #xe8 #xe9 #xea #xeb #xec #xed #xee #xef ; #x5d8-#x5df
537 #xf0 #xf1 #xf2 #xf3 #xf4 #xf5 #xf6 #xf7 ; #x5e0-#x5e7
538 #xf8 #xf9 #xfa nil nil nil nil nil) ; #x5e8-#x5ef
539 :test #'equalp)
540
541 (define-constant +unicode-2008-2018-to-iso-8859-8+
542 #(nil nil nil nil nil nil #xfd #xfe ; #x2008-#x200f
543 nil nil nil nil nil nil nil #xdf) ; #x2010-#x2017
544 :test #'equalp)
545
546 (define-unibyte-encoder :iso-8859-8 (code)
547 (or (cond ((< code #xa0) code)
548 ((< code #xf8)
549 (svref +unicode-a0-f8-to-iso-8859-8+
550 (the ub8 (- code #xa0))))
551 ((<= #x5d0 code #x5ef)
552 (svref +unicode-5d0-5f0-to-iso-8859-8+
553 (the ub8 (- code #x5d0))))
554 ((<= #x2008 code #x201f)
555 (svref +unicode-2008-2018-to-iso-8859-8+
556 (the ub8 (- code #x2008)))))
557 (handle-error)))
558
559 (define-constant +iso-8859-8-to-unicode+
560 #(;; #xa0
561 #x00a0 #xfffd #x00a2 #x00a3 #x00a4 #x00a5 #x00a6 #x00a7
562 #x00a8 #x00a9 #x00d7 #x00ab #x00ac #x00ad #x00ae #x00af
563 ;; #xb0
564 #x00b0 #x00b1 #x00b2 #x00b3 #x00b4 #x00b5 #x00b6 #x00b7
565 #x00b8 #x00b9 #x00f7 #x00bb #x00bc #x00bd #x00be #xfffd
566 ;; #xc0
567 #xfffd #xfffd #xfffd #xfffd #xfffd #xfffd #xfffd #xfffd
568 #xfffd #xfffd #xfffd #xfffd #xfffd #xfffd #xfffd #xfffd
569 ;; #xd0
570 #xfffd #xfffd #xfffd #xfffd #xfffd #xfffd #xfffd #xfffd
571 #xfffd #xfffd #xfffd #xfffd #xfffd #xfffd #xfffd #x2017
572 ;; #xe0
573 #x05d0 #x05d1 #x05d2 #x05d3 #x05d4 #x05d5 #x05d6 #x05d7
574 #x05d8 #x05d9 #x05da #x05db #x05dc #x05dd #x05de #x05df
575 ;; #xf0
576 #x05e0 #x05e1 #x05e2 #x05e3 #x05e4 #x05e5 #x05e6 #x05e7
577 #x05e8 #x05e9 #x05ea #xfffd #xfffd #x200e #x200f #xfffd)
578 :test #'equalp)
579
580 (define-unibyte-decoder :iso-8859-8 (octet)
581 (if (< octet #xa0)
582 octet
583 (svref +iso-8859-8-to-unicode+ (the ub8 (- octet #xa0)))))
584
585 (define-character-encoding :iso-8859-9
586 "An 8-bit, fixed-width character encoding in which codes
587 #x00-#xcf map to their Unicode equivalents and other codes map to
588 other Unicode character values. Intended to provide most
589 characters found in the Turkish alphabet."
590 :aliases '(:latin-5 :latin5)
591 :decode-literal-code-unit-limit #xd0
592 :encode-literal-code-unit-limit #xa0)
593
594 (define-constant +unicode-d0-100-to-iso-8859-9+
595 #(nil #xd1 #xd2 #xd3 #xd4 #xd5 #xd6 #xd7 ; #xd0-#xd7
596 #xd8 #xd9 #xda #xdb #xdc nil nil #xdf ; #xd8-#xdf
597 #xe0 #xe1 #xe2 #xe3 #xe4 #xe5 #xe6 #xe7 ; #xe0-#xe7
598 #xe8 #xe9 #xea #xeb #xec #xed #xee #xef ; #xe8-#xef
599 nil #xf1 #xf2 #xf3 #xf4 #xf5 #xf6 #xf7 ; #xf0-#xf7
600 #xf8 #xf9 #xfa #xfb #xfc nil nil #xff) ; #xf8-#xff
601 :test #'equalp)
602
603 (define-constant +unicode-118-160-to-iso-8859-9+
604 #(nil nil nil nil nil nil #xd0 #xf0 ; #x118-#x11f
605 nil nil nil nil nil nil nil nil ; #x120-#x127
606 nil nil nil nil nil nil nil nil ; #x128-#x12f
607 #xdd #xfd nil nil nil nil nil nil ; #x130-#x137
608 nil nil nil nil nil nil nil nil ; #x138-#x13f
609 nil nil nil nil nil nil nil nil ; #x140-#x147
610 nil nil nil nil nil nil nil nil ; #x148-#x14f
611 nil nil nil nil nil nil nil nil ; #x150-#x157
612 nil nil nil nil nil nil #xde #xfe) ; #x158-#x15f
613 :test #'equalp)
614
615 (define-unibyte-encoder :iso-8859-9 (code)
616 (or (cond ((< code #xd0) code)
617 ((< code #x100)
618 (svref +unicode-d0-100-to-iso-8859-9+
619 (the ub8 (- code #xd0))))
620 ((<= #x118 code #x15f)
621 (svref +unicode-118-160-to-iso-8859-9+
622 (the ub8 (- code #x118)))))
623 (handle-error)))
624
625 (define-constant +iso-8859-9-to-unicode+
626 #(;; #xd0
627 #x011e #x00d1 #x00d2 #x00d3 #x00d4 #x00d5 #x00d6 #x00d7
628 #x00d8 #x00d9 #x00da #x00db #x00dc #x0130 #x015e #x00df
629 ;; #xe0
630 #x00e0 #x00e1 #x00e2 #x00e3 #x00e4 #x00e5 #x00e6 #x00e7
631 #x00e8 #x00e9 #x00ea #x00eb #x00ec #x00ed #x00ee #x00ef
632 ;; #xf0
633 #x011f #x00f1 #x00f2 #x00f3 #x00f4 #x00f5 #x00f6 #x00f7
634 #x00f8 #x00f9 #x00fa #x00fb #x00fc #x0131 #x015f #x00ff)
635 :test #'equalp)
636
637 (define-unibyte-decoder :iso-8859-9 (octet)
638 (if (< octet #xd0)
639 octet
640 (svref +iso-8859-9-to-unicode+ (the ub8 (- octet #xd0)))))
641
642 (define-character-encoding :iso-8859-10
643 "An 8-bit, fixed-width character encoding in which codes
644 #x00-#x9f map to their Unicode equivalents and other codes map to
645 other Unicode character values. Intended to provide most
646 characters found in Nordic alphabets."
647 :aliases '(:latin-6 :latin6)
648 :literal-char-code-limit #xa0)
649
650 (define-constant +unicode-a0-180-to-iso-8859-10+
651 #(#xa0 nil nil nil nil nil nil #xa7 ; #xa0-#xa7
652 nil nil nil nil nil #xad nil nil ; #xa8-#xaf
653 #xb0 nil nil nil nil nil nil #xb7 ; #xb0-#xb7
654 nil nil nil nil nil #x2015 nil nil ; #xb8-#xbf
655 nil #xc1 #xc2 #xc3 #xc4 #xc5 #xc6 nil ; #xc0-#xc7
656 nil #xc9 nil #xcb nil #xcd #xce #xcf ; #xc8-#xcf
657 #xd0 nil nil #xd3 #xd4 #xd5 #xd6 nil ; #xd0-#xd7
658 #xd8 nil #xda #xdb #xdc #xdd #xde #xdf ; #xd8-#xdf
659 nil #xe1 #xe2 #xe3 #xe4 #xe5 #xe6 nil ; #xe0-#xe7
660 nil #xe9 nil #xeb nil #xed #xee #xef ; #xe8-#xef
661 #xf0 nil nil #xf3 #xf4 #xf5 #xf6 nil ; #xf0-#xf7
662 #xf8 nil #xfa #xfb #xfc #xfd #xfe nil ; #xf8-#xff
663 #xc0 #xe0 nil nil #xa1 #xb1 nil nil ; #x100-#x107
664 nil nil nil nil #xc8 #xe8 nil nil ; #x108-#x10f
665 #xa9 #xb9 #xa2 #xb2 nil nil #xcc #xec ; #x110-#x117
666 #xca #xea nil nil nil nil nil nil ; #x118-#x11f
667 nil nil #xa3 #xb3 nil nil nil nil ; #x120-#x127
668 #xa5 #xb5 #xa4 #xb4 nil nil #xc7 #xe7 ; #x128-#x12f
669 nil nil nil nil nil nil #xa6 #xb6 ; #x130-#x137
670 #xff nil nil #xa8 #xb8 nil nil nil ; #x138-#x13f
671 nil nil nil nil nil #xd1 #xf1 nil ; #x140-#x147
672 nil nil #xaf #xbf #xd2 #xf2 nil nil ; #x148-#x14f
673 nil nil nil nil nil nil nil nil ; #x150-#x157
674 nil nil nil nil nil nil nil nil ; #x158-#x15f
675 #xaa #xba nil nil nil nil #xab #xbb ; #x160-#x167
676 #xd7 #xf7 #xae #xbe nil nil nil nil ; #x168-#x16f
677 nil nil #xd9 #xf9 nil nil nil nil ; #x170-#x177
678 nil nil nil nil nil #xac #xbc nil) ; #x178-#x17f
679 :test #'equalp)
680
681 (define-unibyte-encoder :iso-8859-10 (code)
682 (or (cond ((< code #xa0) code)
683 ((< code #x180)
684 (svref +unicode-a0-180-to-iso-8859-10+
685 (the ub8 (- code #xa0))))
686 ;; Horizontal bar
687 ((= code #x2015) #xbd))
688 (handle-error)))
689
690 (define-constant +iso-8859-10-to-unicode+
691 #(;; #xa0
692 #x00a0 #x0104 #x0112 #x0122 #x012a #x0128 #x0136 #x00a7
693 #x013b #x0110 #x0160 #x0166 #x017d #x00ad #x016a #x014a
694 ;; #xb0
695 #x00b0 #x0105 #x0113 #x0123 #x012b #x0129 #x0137 #x00b7
696 #x013c #x0111 #x0161 #x0167 #x017e #x2015 #x016b #x014b
697 ;; #xc0
698 #x0100 #x00c1 #x00c2 #x00c3 #x00c4 #x00c5 #x00c6 #x012e
699 #x010c #x00c9 #x0118 #x00cb #x0116 #x00cd #x00ce #x00cf
700 ;; #xd0
701 #x00d0 #x0145 #x014c #x00d3 #x00d4 #x00d5 #x00d6 #x0168
702 #x00d8 #x0172 #x00da #x00db #x00dc #x00dd #x00de #x00df
703 ;; #xe0
704 #x0101 #x00e1 #x00e2 #x00e3 #x00e4 #x00e5 #x00e6 #x012f
705 #x010d #x00e9 #x0119 #x00eb #x0117 #x00ed #x00ee #x00ef
706 ;; #xf0
707 #x00f0 #x0146 #x014d #x00f3 #x00f4 #x00f5 #x00f6 #x0169
708 #x00f8 #x0173 #x00fa #x00fb #x00fc #x00fd #x00fe #x0138)
709 :test #'equalp)
710
711 (define-unibyte-decoder :iso-8859-10 (octet)
712 (if (< octet #xa0)
713 octet
714 (svref +iso-8859-10-to-unicode+ (the ub8 (- octet #xa0)))))
715
716 (define-character-encoding :iso-8859-11
717 "An 8-bit, fixed-width character encoding in which codes
718 #x00-#x9f map to their Unicode equivalents and other codes map to
719 other Unicode character values. Intended to provide most
720 characters found the Thai alphabet."
721 :aliases '()
722 :literal-char-code-limit #xa0)
723
724 (define-unibyte-encoder :iso-8859-11 (code)
725 (cond ((< code #xa1) code)
726 ((and (<= #xe01 code #xe5b)
727 (not (<= #xe3b code #xe3e))
728 (not (<= #xe5c code #xe5f)))
729 (- code #xd60))
730 (t (handle-error))))
731
732 (define-unibyte-decoder :iso-8859-11 (octet)
733 (cond ((<= octet #xa0) octet)
734 ((or (<= #xdb octet #xde)
735 (<= #xfc octet #xff))
736 #xfffd)
737 ((<= octet #xfb)
738 (+ octet #x0d60))
739 (t (handle-error))))
740
741 ;;; There is no iso-8859-12 encoding.
742
743 (define-character-encoding :iso-8859-13
744 "An 8-bit, fixed-width character encoding in which codes
745 #x00-#x9f map to their Unicode equivalents and other codes map to
746 other Unicode character values. Intended to provide most
747 characters found in Baltic alphabets."
748 :aliases '()
749 :literal-char-code-limit #xa0)
750
751 (define-constant +unicode-a0-180-to-iso-8859-13+
752 #(#xa0 nil #xa2 #xa3 #xa4 nil #xa6 #xa7 ; #xa0-#xa7
753 nil #xa9 nil #xab #xac #xad #xae nil ; #xa8-#xaf
754 #xb0 #xb1 #xb2 #xb3 nil #xb5 #xb6 #xb7 ; #xb0-#xb7
755 nil #xb9 nil #xbb #xbc #xbd #xbe nil ; #xb8-#xbf
756 nil nil nil nil #xc4 #xc5 #xaf nil ; #xc0-#xc7
757 nil #xc9 nil nil nil nil nil nil ; #xc8-#xcf
758 nil nil nil #xd3 nil #xd5 #xd6 #xd7 ; #xd0-#xd7
759 #xa8 nil nil nil #xdc nil nil #xdf ; #xd8-#xdf
760 nil nil nil nil #xe4 #xe5 #xbf nil ; #xe0-#xe7
761 nil #xe9 nil nil nil nil nil nil ; #xe8-#xef
762 nil nil nil #xf3 nil #xf5 #xf6 #xf7 ; #xf0-#xf7
763 #xb8 nil nil nil #xfc nil nil nil ; #xf8-#xff
764 #xc2 #xe2 nil nil #xc0 #xe0 #xc3 #xe3 ; #x100-#x107
765 nil nil nil nil #xc8 #xe8 nil nil ; #x108-#x10f
766 nil nil #xc7 #xe7 nil nil #xcb #xeb ; #x110-#x117
767 #xc6 #xe6 nil nil nil nil nil nil ; #x118-#x11f
768 nil nil #xcc #xec nil nil nil nil ; #x120-#x127
769 nil nil #xce #xee nil nil #xc1 #xe1 ; #x128-#x12f
770 nil nil nil nil nil nil #xcd #xed ; #x130-#x137
771 nil nil nil #xcf #xef nil nil nil ; #x138-#x13f
772 nil #xd9 #xf9 #xd1 #xf1 #xd2 #xf2 nil ; #x140-#x147
773 nil nil nil nil #xd4 #xf4 nil nil ; #x148-#x14f
774 nil nil nil nil nil nil #xaa #xba ; #x150-#x157
775 nil nil #xda #xfa nil nil nil nil ; #x158-#x15f
776 #xd0 #xf0 nil nil nil nil nil nil ; #x160-#x167
777 nil nil #xdb #xfb nil nil nil nil ; #x168-#x16f
778 nil nil #xd8 #xf8 nil nil nil nil ; #x170-#x177
779 nil #xca #xea #xdd #xfd #xde #xfe nil) ; #x178-#x17f
780 :test #'equalp)
781
782 (define-constant +unicode-2018-2020-to-iso-8859-13+
783 #(nil #xff nil nil #xb4 #xa1 #xa5 nil) ; #x2018-#x201f
784 :test #'equalp)
785
786 (define-unibyte-encoder :iso-8859-13 (code)
787 (or (cond ((< code #xa0) code)
788 ((< code #x180)
789 (svref +unicode-a0-180-to-iso-8859-13+
790 (the ub8 (- code #xa0))))
791 ((<= #x2018 code #x201f)
792 (svref +unicode-2018-2020-to-iso-8859-13+
793 (the ub8 (- code #x2018)))))
794 (handle-error)))
795
796 (define-constant +iso-8859-13-to-unicode+
797 #(;; #xa0
798 #x00a0 #x201d #x00a2 #x00a3 #x00a4 #x201e #x00a6 #x00a7
799 #x00d8 #x00a9 #x0156 #x00ab #x00ac #x00ad #x00ae #x00c6
800 ;; #xb0
801 #x00b0 #x00b1 #x00b2 #x00b3 #x201c #x00b5 #x00b6 #x00b7
802 #x00f8 #x00b9 #x0157 #x00bb #x00bc #x00bd #x00be #x00e6
803 ;; #xc0
804 #x0104 #x012e #x0100 #x0106 #x00c4 #x00c5 #x0118 #x0112
805 #x010c #x00c9 #x0179 #x0116 #x0122 #x0136 #x012a #x013b
806 ;; #xd0
807 #x0160 #x0143 #x0145 #x00d3 #x014c #x00d5 #x00d6 #x00d7
808 #x0172 #x0141 #x015a #x016a #x00dc #x017b #x017d #x00df
809 ;; #xe0
810 #x0105 #x012f #x0101 #x0107 #x00e4 #x00e5 #x0119 #x0113
811 #x010d #x00e9 #x017a #x0117 #x0123 #x0137 #x012b #x013c
812 ;; #xf0
813 #x0161 #x0144 #x0146 #x00f3 #x014d #x00f5 #x00f6 #x00f7
814 #x0173 #x0142 #x015b #x016b #x00fc #x017c #x017e #x2019)
815 :test #'equalp)
816
817 (define-unibyte-decoder :iso-8859-13 (octet)
818 (if (< octet #xa0)
819 octet
820 (svref +iso-8859-13-to-unicode+ (the ub8 (- octet #xa0)))))
821
822 (define-character-encoding :iso-8859-14
823 "An 8-bit, fixed-width character encoding in which codes
824 #x00-#x9f map to their Unicode equivalents and other codes map to
825 other Unicode character values. Intended to provide most
826 characters found in Celtic languages."
827 :aliases '(:latin-8 :latin8)
828 :literal-char-code-limit #xa0)
829
830 (define-constant +unicode-a0-100-to-iso-8859-14+
831 #(#xa0 nil nil #xa3 nil nil nil #xa7 ; #xa0-#xa7
832 nil #xa9 nil nil nil #xad #xae nil ; #xa8-#xaf
833 nil nil nil nil nil nil #xb6 nil ; #xb0-#xb7
834 nil nil nil nil nil nil nil nil ; #xb8-#xbf
835 #xc0 #xc1 #xc2 #xc3 #xc4 #xc5 #xc6 #xc7 ; #xc0-#xc7
836 #xc8 #xc9 #xca #xcb #xcc #xcd #xce #xcf ; #xc8-#xcf
837 nil #xd1 #xd2 #xd3 #xd4 #xd5 #xd6 nil ; #xd0-#xd7
838 #xd8 #xd9 #xda #xdb #xdc #xdd nil #xdf ; #xd8-#xdf
839 #xe0 #xe1 #xe2 #xe3 #xe4 #xe5 #xe6 #xe7 ; #xe0-#xe7
840 #xe8 #xe9 #xea #xeb #xec #xed #xee #xef ; #xe8-#xef
841 nil #xf1 #xf2 #xf3 #xf4 #xf5 #xf6 nil ; #xf0-#xf7
842 #xf8 #xf9 #xfa #xfb #xfc #xfd nil #xff) ; #xf8-#xff
843 :test #'equalp)
844
845 (define-constant +unicode-108-128-to-iso-8859-14+
846 #(nil nil #xa4 #xa5 nil nil nil nil ; #x108-#x10f
847 nil nil nil nil nil nil nil nil ; #x110-#x117
848 nil nil nil nil nil nil nil nil ; #x118-#x11f
849 #xb2 #xb3 nil nil nil nil nil nil) ; #x120-#x127
850 :test #'equalp)
851
852 (define-constant +unicode-170-180-to-iso-8859-14+
853 #(nil nil nil nil #xd0 #xf0 #xde #xfe ; #x170-#x177
854 #xaf nil nil nil nil nil nil nil) ; #x178-#x17f
855 :test #'equalp)
856
857 (define-constant +unicode-1e00-1e88-to-iso-8859-14+
858 #(nil nil #xa1 #xa2 nil nil nil nil ; #x1e00-#x1e07
859 nil nil #xa6 #xab nil nil nil nil ; #x1e08-#x1e0f
860 nil nil nil nil nil nil nil nil ; #x1e10-#x1e17
861 nil nil nil nil nil nil #xb0 #xb1 ; #x1e18-#x1e1f
862 nil nil nil nil nil nil nil nil ; #x1e20-#x1e27
863 nil nil nil nil nil nil nil nil ; #x1e28-#x1e2f
864 nil nil nil nil nil nil nil nil ; #x1e30-#x1e37
865 nil nil nil nil nil nil nil nil ; #x1e38-#x1e3f
866 #xb4 #xb5 nil nil nil nil nil nil ; #x1e40-#x1e47
867 nil nil nil nil nil nil nil nil ; #x1e48-#x1e4f
868 nil nil nil nil nil nil #xb7 #xb9 ; #x1e50-#x1e57
869 nil nil nil nil nil nil nil nil ; #x1e58-#x1e5f
870 #xbb #xbf nil nil nil nil nil nil ; #x1e60-#x1e67
871 nil nil #xd7 #xf7 nil nil nil nil ; #x1e68-#x1e6f
872 nil nil nil nil nil nil nil nil ; #x1e70-#x1e77
873 nil nil nil nil nil nil nil nil ; #x1e78-#x1e7f
874 #xa8 #xb8 #xaa #xba #xbd #xbe nil nil) ; #x1e80-#x1e87
875 :test #'equalp)
876
877 (define-constant +unicode-1ef0-1ef8-to-iso-8859-14+
878 #(nil nil #xac #xbc nil nil nil nil) ; #x1ef0-#x1ef7
879 :test #'equalp)
880
881 (define-unibyte-encoder :iso-8859-14 (code)
882 (or (cond ((< code #xa0) code)
883 ((< code #x100)
884 (svref +unicode-a0-100-to-iso-8859-14+
885 (the ub8 (- code #xa0))))
886 ((<= #x108 code #x127)
887 (svref +unicode-108-128-to-iso-8859-14+
888 (the ub8 (- code #x108))))
889 ((<= #x170 code #x17f)
890 (svref +unicode-170-180-to-iso-8859-14+
891 (the ub8 (- code #x170))))
892 ((<= #x1e00 code #x1e87)
893 (svref +unicode-1e00-1e88-to-iso-8859-14+
894 (the ub8 (- code #x1e00))))
895 ((<= #x1ef0 code #x1ef7)
896 (svref +unicode-1ef0-1ef8-to-iso-8859-14+
897 (the ub8 (- code #x1ef0)))))
898 (handle-error)))
899
900 (define-constant +iso-8859-14-to-unicode+
901 #(;; #xa0
902 #x00a0 #x1e02 #x1e03 #x00a3 #x010a #x010b #x1e0a #x00a7
903 #x1e80 #x00a9 #x1e82 #x1e0b #x1ef2 #x00ad #x00ae #x0178
904 ;; #xb0
905 #x1e1e #x1e1f #x0120 #x0121 #x1e40 #x1e41 #x00b6 #x1e56
906 #x1e81 #x1e57 #x1e83 #x1e60 #x1ef3 #x1e84 #x1e85 #x1e61
907 ;; #xc0
908 #x00c0 #x00c1 #x00c2 #x00c3 #x00c4 #x00c5 #x00c6 #x00c7
909 #x00c8 #x00c9 #x00ca #x00cb #x00cc #x00cd #x00ce #x00cf
910 ;; #xd0
911 #x0174 #x00d1 #x00d2 #x00d3 #x00d4 #x00d5 #x00d6 #x1e6a
912 #x00d8 #x00d9 #x00da #x00db #x00dc #x00dd #x0176 #x00df
913 ;; #xe0
914 #x00e0 #x00e1 #x00e2 #x00e3 #x00e4 #x00e5 #x00e6 #x00e7
915 #x00e8 #x00e9 #x00ea #x00eb #x00ec #x00ed #x00ee #x00ef
916 ;; #xf0
917 #x0175 #x00f1 #x00f2 #x00f3 #x00f4 #x00f5 #x00f6 #x1e6b
918 #x00f8 #x00f9 #x00fa #x00fb #x00fc #x00fd #x0177 #x00ff)
919 :test #'equalp)
920
921 (define-unibyte-decoder :iso-8859-14 (octet)
922 (if (< octet #xa0)
923 octet
924 (svref +iso-8859-14-to-unicode+ (the ub8 (- octet #xa0)))))
925
926 (define-character-encoding :iso-8859-15
927 "An 8-bit, fixed-width character encoding in which codes
928 #x00-#x9f map to their Unicode equivalents and other codes map to
929 other Unicode character values. Intended to provide most
930 characters found in Western European languages (including the
931 Euro sign and some other characters missing from ISO-8859-1."
932 :aliases '(:latin-9 :latin9)
933 :literal-char-code-limit #xa0)
934
935 (define-constant +unicode-a0-100-to-iso-8859-15+
936 #(#xa0 #xa1 #xa2 #xa3 nil #xa5 nil #xa7 ; #xa0-#xa7
937 nil #xa9 #xaa #xab #xac #xad #xae #xaf ; #xa8-#xaf
938 #xb0 #xb1 #xb2 #xb3 nil #xb5 #xb6 #xb7 ; #xb0-#xb7
939 nil #xb9 #xba #xbb nil nil nil #xbf ; #xb8-0xbf
940 #xc0 #xc1 #xc2 #xc3 #xc4 #xc5 #xc6 #xc7 ; #xc0-#xc7
941 #xc8 #xc9 #xca #xcb #xcc #xcd #xce #xcf ; #xc8-#xcf
942 #xd0 #xd1 #xd2 #xd3 #xd4 #xd5 #xd6 #xd7 ; #xd0-#xd7
943 #xd8 #xd9 #xda #xdb #xdc #xdd #xde #xdf ; #xd8-#xdf
944 #xe0 #xe1 #xe2 #xe3 #xe4 #xe5 #xe6 #xe7 ; #xe0-#xe7
945 #xe8 #xe9 #xea #xeb #xec #xed #xee #xef ; #xe8-#xef
946 #xf0 #xf1 #xf2 #xf3 #xf4 #xf5 #xf6 #xf7 ; #xf0-#xf7
947 #xf8 #xf9 #xfa #xfb #xfc #xfd #xfe #xff) ; #xf8-#xff
948 :test #'equalp)
949
950 (define-constant +unicode-150-180-to-iso-8859-15+
951 #(nil nil #xbc #xbd nil nil nil nil ; #x150-#x157
952 nil nil nil nil nil nil nil nil ; #x158-#x15f
953 #xa6 #xa8 nil nil nil nil nil nil ; #x160-#x167
954 nil nil nil nil nil nil nil nil ; #x168-#x16f
955 nil nil nil nil nil nil nil nil ; #x170-#x177
956 #xbe nil nil nil nil #xb4 #xb8 nil) ; #x178-#x17f
957 :test #'equalp)
958
959 (define-unibyte-encoder :iso-8859-15 (code)
960 (or (cond ((< code #xa0) code)
961 ((< code #x100)
962 (svref +unicode-a0-100-to-iso-8859-15+
963 (the ub8 (- code #xa0))))
964 ((<= #x150 code #x1f7)
965 (svref +unicode-150-180-to-iso-8859-15+
966 (the ub8 (- code #x150))))
967 ;; Euro sign
968 ((= code #x20ac) #xa4))
969 (handle-error)))
970
971 (define-constant +iso-8859-15-to-unicode+
972 #(;; #xa0
973 #x00a0 #x00a1 #x00a2 #x00a3 #x20ac #x00a5 #x0160 #x00a7
974 #x0161 #x00a9 #x00aa #x00ab #x00ac #x00ad #x00ae #x00af
975 ;; #xb0
976 #x00b0 #x00b1 #x00b2 #x00b3 #x017d #x00b5 #x00b6 #x00b7
977 #x017e #x00b9 #x00ba #x00bb #x0152 #x0153 #x0178 #x00bf
978 ;; #xc0
979 #x00c0 #x00c1 #x00c2 #x00c3 #x00c4 #x00c5 #x00c6 #x00c7
980 ;; #xc8
981 #x00c8 #x00c9 #x00ca #x00cb #x00cc #x00cd #x00ce #x00cf
982 ;; #xd0
983 #x00d0 #x00d1 #x00d2 #x00d3 #x00d4 #x00d5 #x00d6 #x00d7
984 ;; #xd8
985 #x00d8 #x00d9 #x00da #x00db #x00dc #x00dd #x00de #x00df
986 ;; #xe0
987 #x00e0 #x00e1 #x00e2 #x00e3 #x00e4 #x00e5 #x00e6 #x00e7
988 ;; #xe8
989 #x00e8 #x00e9 #x00ea #x00eb #x00ec #x00ed #x00ee #x00ef
990 ;; #xf0
991 #x00f0 #x00f1 #x00f2 #x00f3 #x00f4 #x00f5 #x00f6 #x00f7
992 ;; #xf8
993 #x00f8 #x00f9 #x00fa #x00fb #x00fc #x00fd #x00fe #x00ff)
994 :test #'equalp)
995
996 (define-unibyte-decoder :iso-8859-15 (octet)
997 (if (< octet #xa0)
998 octet
999 (svref +iso-8859-15-to-unicode+ (the ub8 (- octet #xa0)))))
1000
1001 (define-character-encoding :iso-8859-16
1002 "An 8-bit, fixed-width character encoding in which codes
1003 #x00-#x9f map to their Unicode equivalents and other codes map to
1004 other Unicode character values. Intended to provide most
1005 characters found in Southeast European languages."
1006 :aliases '(:latin-10 :latin10)
1007 :literal-char-code-limit #xa0)
1008
1009 (define-constant +unicode-a0-180-to-iso-8859-16+
1010 #(#xa0 nil nil nil nil nil nil #xa7 ; #xa0-#xa7
1011 nil #xa9 nil #xab nil #xad nil nil ; #xa8-#xaf
1012 #xb0 #xb1 nil nil nil nil #xb6 #xb7 ; #xb0-#xb7
1013 nil nil nil #xbb nil nil nil nil ; #xb8-#xbf
1014 #xc0 #xc1 #xc2 nil #xc4 nil #xc6 #xc7 ; #xc0-#xc7
1015 #xc8 #xc9 #xca #xcb #xcc #xcd #xce #xcf ; #xc8-#xcf
1016 nil nil #xd2 #xd3 #xd4 nil #xd6 nil ; #xd0-#xd7
1017 nil #xd9 #xda #xdb #xdc nil nil #xdf ; #xd8-#xdf
1018 #xe0 #xe1 #xe2 nil #xe4 nil #xe6 #xe7 ; #xe0-#xe7
1019 #xe8 #xe9 #xea #xeb #xec #xed #xee #xef ; #xe8-#xef
1020 nil nil #xf2 #xf3 #xf4 nil #xf6 nil ; #xf0-#xf7
1021 nil #xf9 #xfa #xfb #xfc nil nil #xff ; #xf8-#xff
1022 nil nil #xc3 #xe3 #xa1 #xa2 #xc5 #xe5 ; #x100-#x107
1023 nil nil nil nil #xb2 #xb9 nil nil ; #x108-#x10f
1024 #xd0 #xf0 nil nil nil nil nil nil ; #x110-#x117
1025 #xdd #xfd nil nil nil nil nil nil ; #x118-#x11f
1026 nil nil nil nil nil nil nil nil ; #x120-#x127
1027 nil nil nil nil nil nil nil nil ; #x128-#x12f
1028 nil nil nil nil nil nil nil nil ; #x130-#x137
1029 nil nil nil nil nil nil nil nil ; #x138-#x13f
1030 nil #xa3 #xb3 #xd1 #xf1 nil nil nil ; #x140-#x147
1031 nil nil nil nil nil nil nil nil ; #x148-#x14f
1032 #xd5 #xf5 #xbc #xbd nil nil nil nil ; #x150-#x157
1033 nil nil #xd7 #xf7 nil nil nil nil ; #x158-#x15f
1034 #xa6 #xa8 nil nil nil nil nil nil ; #x160-#x167
1035 nil nil nil nil nil nil nil nil ; #x168-#x16f
1036 #xd8 #xf8 nil nil nil nil nil nil ; #x170-#x177
1037 #xbe #xac #xae #xaf #xbf #xb4 #xb8 nil) ; #x178-#x17f
1038 :test #'equalp)
1039
1040 (define-constant +unicode-218-220-to-iso-8859-16+
1041 #(#xaa #xba #xde #xfe nil nil nil nil) ; #x218-#x21f
1042 :test #'equalp)
1043
1044 (define-constant +unicode-2018-2020-to-iso-8859-16+
1045 #(nil nil nil nil nil #xb5 #xa5 nil) ; #x2018-#x201f
1046 :test #'equalp)
1047
1048 (define-unibyte-encoder :iso-8859-16 (code)
1049 (or (cond ((< code #xa0) code)
1050 ((< code #x180)
1051 (svref +unicode-a0-180-to-iso-8859-16+
1052 (the ub8 (- code #xa0))))
1053 ((<= #x218 code #x21f)
1054 (svref +unicode-218-220-to-iso-8859-16+
1055 (the ub8 (- code #x218))))
1056 ((< #x2018 code #x201f)
1057 (svref +unicode-2018-2020-to-iso-8859-16+
1058 (the ub8 (- code #x2018))))
1059 ;; Euro sign
1060 ((= code #x20ac) #xa4))
1061 (handle-error)))
1062
1063 (define-constant +iso-8859-16-to-unicode+
1064 #(;; #xa0
1065 #x00a0 #x0104 #x0105 #x0141 #x20ac #x201e #x0160 #x00a7
1066 #x0161 #x00a9 #x0218 #x00ab #x0179 #x00ad #x017a #x017b
1067 ;; #xb0
1068 #x00b0 #x00b1 #x010c #x0142 #x017d #x201d #x00b6 #x00b7
1069 #x017e #x010d #x0219 #x00bb #x0152 #x0153 #x0178 #x017c
1070 ;; #xc0
1071 #x00c0 #x00c1 #x00c2 #x0102 #x00c4 #x0106 #x00c6 #x00c7
1072 #x00c8 #x00c9 #x00ca #x00cb #x00cc #x00cd #x00ce #x00cf
1073 ;; #xd0
1074 #x0110 #x0143 #x00d2 #x00d3 #x00d4 #x0150 #x00d6 #x015a
1075 #x0170 #x00d9 #x00da #x00db #x00dc #x0118 #x021a #x00df
1076 ;; #xe0
1077 #x00e0 #x00e1 #x00e2 #x0103 #x00e4 #x0107 #x00e6 #x00e7
1078 #x00e8 #x00e9 #x00ea #x00eb #x00ec #x00ed #x00ee #x00ef
1079 ;; #xf0
1080 #x0111 #x0144 #x00f2 #x00f3 #x00f4 #x0151 #x00f6 #x015b
1081 #x0171 #x00f9 #x00fa #x00fb #x00fc #x0119 #x021b #x00ff)
1082 :test #'equalp)
1083
1084 (define-unibyte-decoder :iso-8859-16 (octet)
1085 (if (< octet #xa0)
1086 octet
1087 (svref +iso-8859-16-to-unicode+ (the ub8 (- octet #xa0)))))