Coverage report: /home/ellis/.stash/quicklisp/dists/ultralisp/software/cl-babel-babel-20240610131823/src/enc-iso-8859.lisp

KindCoveredAll%
expression0138 0.0
branch00nil
Key
Not instrumented
Conditionalized out
Executed
Not executed
 
Both branches taken
One branch taken
Neither branch taken
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)))))