0.9.4.13
[sbcl.git] / src / code / external-formats / enc-dos.lisp
1 (in-package #:sb!impl)
2
3 (define-unibyte-mapper cp437->code-mapper code->cp437-mapper
4   (#x80 #x00C7) ; LATIN CAPITAL LETTER C WITH CEDILLA
5   (#x81 #x00FC) ; LATIN SMALL LETTER U WITH DIAERESIS
6   (#x82 #x00E9) ; LATIN SMALL LETTER E WITH ACUTE
7   (#x83 #x00E2) ; LATIN SMALL LETTER A WITH CIRCUMFLEX
8   (#x84 #x00E4) ; LATIN SMALL LETTER A WITH DIAERESIS
9   (#x85 #x00E0) ; LATIN SMALL LETTER A WITH GRAVE
10   (#x86 #x00E5) ; LATIN SMALL LETTER A WITH RING ABOVE
11   (#x87 #x00E7) ; LATIN SMALL LETTER C WITH CEDILLA
12   (#x88 #x00EA) ; LATIN SMALL LETTER E WITH CIRCUMFLEX
13   (#x89 #x00EB) ; LATIN SMALL LETTER E WITH DIAERESIS
14   (#x8A #x00E8) ; LATIN SMALL LETTER E WITH GRAVE
15   (#x8B #x00EF) ; LATIN SMALL LETTER I WITH DIAERESIS
16   (#x8C #x00EE) ; LATIN SMALL LETTER I WITH CIRCUMFLEX
17   (#x8D #x00EC) ; LATIN SMALL LETTER I WITH GRAVE
18   (#x8E #x00C4) ; LATIN CAPITAL LETTER A WITH DIAERESIS
19   (#x8F #x00C5) ; LATIN CAPITAL LETTER A WITH RING ABOVE
20   (#x90 #x00C9) ; LATIN CAPITAL LETTER E WITH ACUTE
21   (#x91 #x00E6) ; LATIN SMALL LIGATURE AE
22   (#x92 #x00C6) ; LATIN CAPITAL LIGATURE AE
23   (#x93 #x00F4) ; LATIN SMALL LETTER O WITH CIRCUMFLEX
24   (#x94 #x00F6) ; LATIN SMALL LETTER O WITH DIAERESIS
25   (#x95 #x00F2) ; LATIN SMALL LETTER O WITH GRAVE
26   (#x96 #x00FB) ; LATIN SMALL LETTER U WITH CIRCUMFLEX
27   (#x97 #x00F9) ; LATIN SMALL LETTER U WITH GRAVE
28   (#x98 #x00FF) ; LATIN SMALL LETTER Y WITH DIAERESIS
29   (#x99 #x00D6) ; LATIN CAPITAL LETTER O WITH DIAERESIS
30   (#x9A #x00DC) ; LATIN CAPITAL LETTER U WITH DIAERESIS
31   (#x9B #x00A2) ; CENT SIGN
32   (#x9C #x00A3) ; POUND SIGN
33   (#x9D #x00A5) ; YEN SIGN
34   (#x9E #x20A7) ; PESETA SIGN
35   (#x9F #x0192) ; LATIN SMALL LETTER F WITH HOOK
36   (#xA0 #x00E1) ; LATIN SMALL LETTER A WITH ACUTE
37   (#xA1 #x00ED) ; LATIN SMALL LETTER I WITH ACUTE
38   (#xA2 #x00F3) ; LATIN SMALL LETTER O WITH ACUTE
39   (#xA3 #x00FA) ; LATIN SMALL LETTER U WITH ACUTE
40   (#xA4 #x00F1) ; LATIN SMALL LETTER N WITH TILDE
41   (#xA5 #x00D1) ; LATIN CAPITAL LETTER N WITH TILDE
42   (#xA6 #x00AA) ; FEMININE ORDINAL INDICATOR
43   (#xA7 #x00BA) ; MASCULINE ORDINAL INDICATOR
44   (#xA8 #x00BF) ; INVERTED QUESTION MARK
45   (#xA9 #x2310) ; REVERSED NOT SIGN
46   (#xAA #x00AC) ; NOT SIGN
47   (#xAB #x00BD) ; VULGAR FRACTION ONE HALF
48   (#xAC #x00BC) ; VULGAR FRACTION ONE QUARTER
49   (#xAD #x00A1) ; INVERTED EXCLAMATION MARK
50   (#xAE #x00AB) ; LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
51   (#xAF #x00BB) ; RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
52   (#xB0 #x2591) ; LIGHT SHADE
53   (#xB1 #x2592) ; MEDIUM SHADE
54   (#xB2 #x2593) ; DARK SHADE
55   (#xB3 #x2502) ; BOX DRAWINGS LIGHT VERTICAL
56   (#xB4 #x2524) ; BOX DRAWINGS LIGHT VERTICAL AND LEFT
57   (#xB5 #x2561) ; BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE
58   (#xB6 #x2562) ; BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE
59   (#xB7 #x2556) ; BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE
60   (#xB8 #x2555) ; BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE
61   (#xB9 #x2563) ; BOX DRAWINGS DOUBLE VERTICAL AND LEFT
62   (#xBA #x2551) ; BOX DRAWINGS DOUBLE VERTICAL
63   (#xBB #x2557) ; BOX DRAWINGS DOUBLE DOWN AND LEFT
64   (#xBC #x255D) ; BOX DRAWINGS DOUBLE UP AND LEFT
65   (#xBD #x255C) ; BOX DRAWINGS UP DOUBLE AND LEFT SINGLE
66   (#xBE #x255B) ; BOX DRAWINGS UP SINGLE AND LEFT DOUBLE
67   (#xBF #x2510) ; BOX DRAWINGS LIGHT DOWN AND LEFT
68   (#xC0 #x2514) ; BOX DRAWINGS LIGHT UP AND RIGHT
69   (#xC1 #x2534) ; BOX DRAWINGS LIGHT UP AND HORIZONTAL
70   (#xC2 #x252C) ; BOX DRAWINGS LIGHT DOWN AND HORIZONTAL
71   (#xC3 #x251C) ; BOX DRAWINGS LIGHT VERTICAL AND RIGHT
72   (#xC4 #x2500) ; BOX DRAWINGS LIGHT HORIZONTAL
73   (#xC5 #x253C) ; BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL
74   (#xC6 #x255E) ; BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE
75   (#xC7 #x255F) ; BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE
76   (#xC8 #x255A) ; BOX DRAWINGS DOUBLE UP AND RIGHT
77   (#xC9 #x2554) ; BOX DRAWINGS DOUBLE DOWN AND RIGHT
78   (#xCA #x2569) ; BOX DRAWINGS DOUBLE UP AND HORIZONTAL
79   (#xCB #x2566) ; BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL
80   (#xCC #x2560) ; BOX DRAWINGS DOUBLE VERTICAL AND RIGHT
81   (#xCD #x2550) ; BOX DRAWINGS DOUBLE HORIZONTAL
82   (#xCE #x256C) ; BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL
83   (#xCF #x2567) ; BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE
84   (#xD0 #x2568) ; BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE
85   (#xD1 #x2564) ; BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE
86   (#xD2 #x2565) ; BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE
87   (#xD3 #x2559) ; BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE
88   (#xD4 #x2558) ; BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE
89   (#xD5 #x2552) ; BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE
90   (#xD6 #x2553) ; BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE
91   (#xD7 #x256B) ; BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE
92   (#xD8 #x256A) ; BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE
93   (#xD9 #x2518) ; BOX DRAWINGS LIGHT UP AND LEFT
94   (#xDA #x250C) ; BOX DRAWINGS LIGHT DOWN AND RIGHT
95   (#xDB #x2588) ; FULL BLOCK
96   (#xDC #x2584) ; LOWER HALF BLOCK
97   (#xDD #x258C) ; LEFT HALF BLOCK
98   (#xDE #x2590) ; RIGHT HALF BLOCK
99   (#xDF #x2580) ; UPPER HALF BLOCK
100   (#xE0 #x03B1) ; GREEK SMALL LETTER ALPHA
101   (#xE1 #x00DF) ; LATIN SMALL LETTER SHARP S
102   (#xE2 #x0393) ; GREEK CAPITAL LETTER GAMMA
103   (#xE3 #x03C0) ; GREEK SMALL LETTER PI
104   (#xE4 #x03A3) ; GREEK CAPITAL LETTER SIGMA
105   (#xE5 #x03C3) ; GREEK SMALL LETTER SIGMA
106   (#xE6 #x00B5) ; MICRO SIGN
107   (#xE7 #x03C4) ; GREEK SMALL LETTER TAU
108   (#xE8 #x03A6) ; GREEK CAPITAL LETTER PHI
109   (#xE9 #x0398) ; GREEK CAPITAL LETTER THETA
110   (#xEA #x03A9) ; GREEK CAPITAL LETTER OMEGA
111   (#xEB #x03B4) ; GREEK SMALL LETTER DELTA
112   (#xEC #x221E) ; INFINITY
113   (#xED #x03C6) ; GREEK SMALL LETTER PHI
114   (#xEE #x03B5) ; GREEK SMALL LETTER EPSILON
115   (#xEF #x2229) ; INTERSECTION
116   (#xF0 #x2261) ; IDENTICAL TO
117   (#xF1 #x00B1) ; PLUS-MINUS SIGN
118   (#xF2 #x2265) ; GREATER-THAN OR EQUAL TO
119   (#xF3 #x2264) ; LESS-THAN OR EQUAL TO
120   (#xF4 #x2320) ; TOP HALF INTEGRAL
121   (#xF5 #x2321) ; BOTTOM HALF INTEGRAL
122   (#xF6 #x00F7) ; DIVISION SIGN
123   (#xF7 #x2248) ; ALMOST EQUAL TO
124   (#xF8 #x00B0) ; DEGREE SIGN
125   (#xF9 #x2219) ; BULLET OPERATOR
126   (#xFA #x00B7) ; MIDDLE DOT
127   (#xFB #x221A) ; SQUARE ROOT
128   (#xFC #x207F) ; SUPERSCRIPT LATIN SMALL LETTER N
129   (#xFD #x00B2) ; SUPERSCRIPT TWO
130   (#xFE #x25A0) ; BLACK SQUARE
131   (#xFF #x00A0) ; NO-BREAK SPACE
132 )
133
134 (declaim (inline get-cp437-bytes))
135 (defun get-cp437-bytes(string pos end)
136   (declare (optimize speed (safety 0))
137            (type simple-string string)
138            (type array-range pos end))
139   (get-latin-bytes #'identity :cp437 string pos end))
140
141 (defun string->cp437 (string sstart send null-padding)
142   (declare (optimize speed (safety 0))
143            (type simple-string string)
144            (type array-range sstart send))
145   (values (string->latin% string sstart send #'get-cp437-bytes null-padding)))
146
147 (defmacro define-cp437->string* (accessor type)
148   (declare (ignore type))
149   (let ((name (make-od-name 'cp437->string* accessor)))
150     `(progn
151       (defun ,name (string sstart send array astart aend)
152         (,(make-od-name 'latin->string* accessor) string sstart send array astart aend #'identity)))))
153
154 (instantiate-octets-definition define-cp437->string*)
155
156 (defmacro define-cp437->string (accessor type)
157   (declare (ignore type))
158   `(defun ,(make-od-name 'cp437->string accessor) (array astart aend)
159     (,(make-od-name 'latin->string accessor) array astart aend #'identity)))
160
161 (instantiate-octets-definition define-cp437->string)
162
163 (push '((:cp437 :|cp437|)
164         cp437->string-aref string->cp437)
165       *external-format-functions*)
166
167 (define-external-format (:cp437 :|cp437|)
168     1 t
169     (let ((cp437-byte (code->cp437-mapper bits)))
170       (if cp437-byte
171           (setf (sap-ref-8 sap tail) cp437-byte)
172           (stream-encoding-error-and-handle stream bits)))
173     (let ((code (cp437->code-mapper byte)))
174       (if code
175           (code-char code)
176           (stream-decoding-error stream byte)))) ;; TODO -- error check
177
178 (define-unibyte-mapper cp850->code-mapper code->cp850-mapper
179   (#x80 #x00C7) ; LATIN CAPITAL LETTER C WITH CEDILLA
180   (#x81 #x00FC) ; LATIN SMALL LETTER U WITH DIAERESIS
181   (#x82 #x00E9) ; LATIN SMALL LETTER E WITH ACUTE
182   (#x83 #x00E2) ; LATIN SMALL LETTER A WITH CIRCUMFLEX
183   (#x84 #x00E4) ; LATIN SMALL LETTER A WITH DIAERESIS
184   (#x85 #x00E0) ; LATIN SMALL LETTER A WITH GRAVE
185   (#x86 #x00E5) ; LATIN SMALL LETTER A WITH RING ABOVE
186   (#x87 #x00E7) ; LATIN SMALL LETTER C WITH CEDILLA
187   (#x88 #x00EA) ; LATIN SMALL LETTER E WITH CIRCUMFLEX
188   (#x89 #x00EB) ; LATIN SMALL LETTER E WITH DIAERESIS
189   (#x8A #x00E8) ; LATIN SMALL LETTER E WITH GRAVE
190   (#x8B #x00EF) ; LATIN SMALL LETTER I WITH DIAERESIS
191   (#x8C #x00EE) ; LATIN SMALL LETTER I WITH CIRCUMFLEX
192   (#x8D #x00EC) ; LATIN SMALL LETTER I WITH GRAVE
193   (#x8E #x00C4) ; LATIN CAPITAL LETTER A WITH DIAERESIS
194   (#x8F #x00C5) ; LATIN CAPITAL LETTER A WITH RING ABOVE
195   (#x90 #x00C9) ; LATIN CAPITAL LETTER E WITH ACUTE
196   (#x91 #x00E6) ; LATIN SMALL LIGATURE AE
197   (#x92 #x00C6) ; LATIN CAPITAL LIGATURE AE
198   (#x93 #x00F4) ; LATIN SMALL LETTER O WITH CIRCUMFLEX
199   (#x94 #x00F6) ; LATIN SMALL LETTER O WITH DIAERESIS
200   (#x95 #x00F2) ; LATIN SMALL LETTER O WITH GRAVE
201   (#x96 #x00FB) ; LATIN SMALL LETTER U WITH CIRCUMFLEX
202   (#x97 #x00F9) ; LATIN SMALL LETTER U WITH GRAVE
203   (#x98 #x00FF) ; LATIN SMALL LETTER Y WITH DIAERESIS
204   (#x99 #x00D6) ; LATIN CAPITAL LETTER O WITH DIAERESIS
205   (#x9A #x00DC) ; LATIN CAPITAL LETTER U WITH DIAERESIS
206   (#x9B #x00F8) ; LATIN SMALL LETTER O WITH STROKE
207   (#x9C #x00A3) ; POUND SIGN
208   (#x9D #x00D8) ; LATIN CAPITAL LETTER O WITH STROKE
209   (#x9E #x00D7) ; MULTIPLICATION SIGN
210   (#x9F #x0192) ; LATIN SMALL LETTER F WITH HOOK
211   (#xA0 #x00E1) ; LATIN SMALL LETTER A WITH ACUTE
212   (#xA1 #x00ED) ; LATIN SMALL LETTER I WITH ACUTE
213   (#xA2 #x00F3) ; LATIN SMALL LETTER O WITH ACUTE
214   (#xA3 #x00FA) ; LATIN SMALL LETTER U WITH ACUTE
215   (#xA4 #x00F1) ; LATIN SMALL LETTER N WITH TILDE
216   (#xA5 #x00D1) ; LATIN CAPITAL LETTER N WITH TILDE
217   (#xA6 #x00AA) ; FEMININE ORDINAL INDICATOR
218   (#xA7 #x00BA) ; MASCULINE ORDINAL INDICATOR
219   (#xA8 #x00BF) ; INVERTED QUESTION MARK
220   (#xA9 #x00AE) ; REGISTERED SIGN
221   (#xAA #x00AC) ; NOT SIGN
222   (#xAB #x00BD) ; VULGAR FRACTION ONE HALF
223   (#xAC #x00BC) ; VULGAR FRACTION ONE QUARTER
224   (#xAD #x00A1) ; INVERTED EXCLAMATION MARK
225   (#xAE #x00AB) ; LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
226   (#xAF #x00BB) ; RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
227   (#xB0 #x2591) ; LIGHT SHADE
228   (#xB1 #x2592) ; MEDIUM SHADE
229   (#xB2 #x2593) ; DARK SHADE
230   (#xB3 #x2502) ; BOX DRAWINGS LIGHT VERTICAL
231   (#xB4 #x2524) ; BOX DRAWINGS LIGHT VERTICAL AND LEFT
232   (#xB5 #x00C1) ; LATIN CAPITAL LETTER A WITH ACUTE
233   (#xB6 #x00C2) ; LATIN CAPITAL LETTER A WITH CIRCUMFLEX
234   (#xB7 #x00C0) ; LATIN CAPITAL LETTER A WITH GRAVE
235   (#xB8 #x00A9) ; COPYRIGHT SIGN
236   (#xB9 #x2563) ; BOX DRAWINGS DOUBLE VERTICAL AND LEFT
237   (#xBA #x2551) ; BOX DRAWINGS DOUBLE VERTICAL
238   (#xBB #x2557) ; BOX DRAWINGS DOUBLE DOWN AND LEFT
239   (#xBC #x255D) ; BOX DRAWINGS DOUBLE UP AND LEFT
240   (#xBD #x00A2) ; CENT SIGN
241   (#xBE #x00A5) ; YEN SIGN
242   (#xBF #x2510) ; BOX DRAWINGS LIGHT DOWN AND LEFT
243   (#xC0 #x2514) ; BOX DRAWINGS LIGHT UP AND RIGHT
244   (#xC1 #x2534) ; BOX DRAWINGS LIGHT UP AND HORIZONTAL
245   (#xC2 #x252C) ; BOX DRAWINGS LIGHT DOWN AND HORIZONTAL
246   (#xC3 #x251C) ; BOX DRAWINGS LIGHT VERTICAL AND RIGHT
247   (#xC4 #x2500) ; BOX DRAWINGS LIGHT HORIZONTAL
248   (#xC5 #x253C) ; BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL
249   (#xC6 #x00E3) ; LATIN SMALL LETTER A WITH TILDE
250   (#xC7 #x00C3) ; LATIN CAPITAL LETTER A WITH TILDE
251   (#xC8 #x255A) ; BOX DRAWINGS DOUBLE UP AND RIGHT
252   (#xC9 #x2554) ; BOX DRAWINGS DOUBLE DOWN AND RIGHT
253   (#xCA #x2569) ; BOX DRAWINGS DOUBLE UP AND HORIZONTAL
254   (#xCB #x2566) ; BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL
255   (#xCC #x2560) ; BOX DRAWINGS DOUBLE VERTICAL AND RIGHT
256   (#xCD #x2550) ; BOX DRAWINGS DOUBLE HORIZONTAL
257   (#xCE #x256C) ; BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL
258   (#xCF #x00A4) ; CURRENCY SIGN
259   (#xD0 #x00F0) ; LATIN SMALL LETTER ETH
260   (#xD1 #x00D0) ; LATIN CAPITAL LETTER ETH
261   (#xD2 #x00CA) ; LATIN CAPITAL LETTER E WITH CIRCUMFLEX
262   (#xD3 #x00CB) ; LATIN CAPITAL LETTER E WITH DIAERESIS
263   (#xD4 #x00C8) ; LATIN CAPITAL LETTER E WITH GRAVE
264   (#xD5 #x0131) ; LATIN SMALL LETTER DOTLESS I
265   (#xD6 #x00CD) ; LATIN CAPITAL LETTER I WITH ACUTE
266   (#xD7 #x00CE) ; LATIN CAPITAL LETTER I WITH CIRCUMFLEX
267   (#xD8 #x00CF) ; LATIN CAPITAL LETTER I WITH DIAERESIS
268   (#xD9 #x2518) ; BOX DRAWINGS LIGHT UP AND LEFT
269   (#xDA #x250C) ; BOX DRAWINGS LIGHT DOWN AND RIGHT
270   (#xDB #x2588) ; FULL BLOCK
271   (#xDC #x2584) ; LOWER HALF BLOCK
272   (#xDD #x00A6) ; BROKEN BAR
273   (#xDE #x00CC) ; LATIN CAPITAL LETTER I WITH GRAVE
274   (#xDF #x2580) ; UPPER HALF BLOCK
275   (#xE0 #x00D3) ; LATIN CAPITAL LETTER O WITH ACUTE
276   (#xE1 #x00DF) ; LATIN SMALL LETTER SHARP S
277   (#xE2 #x00D4) ; LATIN CAPITAL LETTER O WITH CIRCUMFLEX
278   (#xE3 #x00D2) ; LATIN CAPITAL LETTER O WITH GRAVE
279   (#xE4 #x00F5) ; LATIN SMALL LETTER O WITH TILDE
280   (#xE5 #x00D5) ; LATIN CAPITAL LETTER O WITH TILDE
281   (#xE6 #x00B5) ; MICRO SIGN
282   (#xE7 #x00FE) ; LATIN SMALL LETTER THORN
283   (#xE8 #x00DE) ; LATIN CAPITAL LETTER THORN
284   (#xE9 #x00DA) ; LATIN CAPITAL LETTER U WITH ACUTE
285   (#xEA #x00DB) ; LATIN CAPITAL LETTER U WITH CIRCUMFLEX
286   (#xEB #x00D9) ; LATIN CAPITAL LETTER U WITH GRAVE
287   (#xEC #x00FD) ; LATIN SMALL LETTER Y WITH ACUTE
288   (#xED #x00DD) ; LATIN CAPITAL LETTER Y WITH ACUTE
289   (#xEE #x00AF) ; MACRON
290   (#xEF #x00B4) ; ACUTE ACCENT
291   (#xF0 #x00AD) ; SOFT HYPHEN
292   (#xF1 #x00B1) ; PLUS-MINUS SIGN
293   (#xF2 #x2017) ; DOUBLE LOW LINE
294   (#xF3 #x00BE) ; VULGAR FRACTION THREE QUARTERS
295   (#xF4 #x00B6) ; PILCROW SIGN
296   (#xF5 #x00A7) ; SECTION SIGN
297   (#xF6 #x00F7) ; DIVISION SIGN
298   (#xF7 #x00B8) ; CEDILLA
299   (#xF8 #x00B0) ; DEGREE SIGN
300   (#xF9 #x00A8) ; DIAERESIS
301   (#xFA #x00B7) ; MIDDLE DOT
302   (#xFB #x00B9) ; SUPERSCRIPT ONE
303   (#xFC #x00B3) ; SUPERSCRIPT THREE
304   (#xFD #x00B2) ; SUPERSCRIPT TWO
305   (#xFE #x25A0) ; BLACK SQUARE
306   (#xFF #x00A0) ; NO-BREAK SPACE
307 )
308
309 (declaim (inline get-cp850-bytes))
310 (defun get-cp850-bytes(string pos end)
311   (declare (optimize speed (safety 0))
312            (type simple-string string)
313            (type array-range pos end))
314   (get-latin-bytes #'identity :cp850 string pos end))
315
316 (defun string->cp850 (string sstart send null-padding)
317   (declare (optimize speed (safety 0))
318            (type simple-string string)
319            (type array-range sstart send))
320   (values (string->latin% string sstart send #'get-cp850-bytes null-padding)))
321
322 (defmacro define-cp850->string* (accessor type)
323   (declare (ignore type))
324   (let ((name (make-od-name 'cp850->string* accessor)))
325     `(progn
326       (defun ,name (string sstart send array astart aend)
327         (,(make-od-name 'latin->string* accessor) string sstart send array astart aend #'identity)))))
328
329 (instantiate-octets-definition define-cp850->string*)
330
331 (defmacro define-cp850->string (accessor type)
332   (declare (ignore type))
333   `(defun ,(make-od-name 'cp850->string accessor) (array astart aend)
334     (,(make-od-name 'latin->string accessor) array astart aend #'identity)))
335
336 (instantiate-octets-definition define-cp850->string)
337
338 (push '((:cp850 :|cp850|)
339         cp850->string-aref string->cp850)
340       *external-format-functions*)
341
342 (define-external-format (:cp850 :|cp850|)
343     1 t
344     (let ((cp850-byte (code->cp850-mapper bits)))
345       (if cp850-byte
346           (setf (sap-ref-8 sap tail) cp850-byte)
347           (stream-encoding-error-and-handle stream bits)))
348     (let ((code (cp850->code-mapper byte)))
349       (if code
350           (code-char code)
351           (stream-decoding-error stream byte)))) ;; TODO -- error check
352
353 (define-unibyte-mapper cp852->code-mapper code->cp852-mapper
354   (#x80 #x00C7) ; LATIN CAPITAL LETTER C WITH CEDILLA
355   (#x81 #x00FC) ; LATIN SMALL LETTER U WITH DIAERESIS
356   (#x82 #x00E9) ; LATIN SMALL LETTER E WITH ACUTE
357   (#x83 #x00E2) ; LATIN SMALL LETTER A WITH CIRCUMFLEX
358   (#x84 #x00E4) ; LATIN SMALL LETTER A WITH DIAERESIS
359   (#x85 #x016F) ; LATIN SMALL LETTER U WITH RING ABOVE
360   (#x86 #x0107) ; LATIN SMALL LETTER C WITH ACUTE
361   (#x87 #x00E7) ; LATIN SMALL LETTER C WITH CEDILLA
362   (#x88 #x0142) ; LATIN SMALL LETTER L WITH STROKE
363   (#x89 #x00EB) ; LATIN SMALL LETTER E WITH DIAERESIS
364   (#x8A #x0150) ; LATIN CAPITAL LETTER O WITH DOUBLE ACUTE
365   (#x8B #x0151) ; LATIN SMALL LETTER O WITH DOUBLE ACUTE
366   (#x8C #x00EE) ; LATIN SMALL LETTER I WITH CIRCUMFLEX
367   (#x8D #x0179) ; LATIN CAPITAL LETTER Z WITH ACUTE
368   (#x8E #x00C4) ; LATIN CAPITAL LETTER A WITH DIAERESIS
369   (#x8F #x0106) ; LATIN CAPITAL LETTER C WITH ACUTE
370   (#x90 #x00C9) ; LATIN CAPITAL LETTER E WITH ACUTE
371   (#x91 #x0139) ; LATIN CAPITAL LETTER L WITH ACUTE
372   (#x92 #x013A) ; LATIN SMALL LETTER L WITH ACUTE
373   (#x93 #x00F4) ; LATIN SMALL LETTER O WITH CIRCUMFLEX
374   (#x94 #x00F6) ; LATIN SMALL LETTER O WITH DIAERESIS
375   (#x95 #x013D) ; LATIN CAPITAL LETTER L WITH CARON
376   (#x96 #x013E) ; LATIN SMALL LETTER L WITH CARON
377   (#x97 #x015A) ; LATIN CAPITAL LETTER S WITH ACUTE
378   (#x98 #x015B) ; LATIN SMALL LETTER S WITH ACUTE
379   (#x99 #x00D6) ; LATIN CAPITAL LETTER O WITH DIAERESIS
380   (#x9A #x00DC) ; LATIN CAPITAL LETTER U WITH DIAERESIS
381   (#x9B #x0164) ; LATIN CAPITAL LETTER T WITH CARON
382   (#x9C #x0165) ; LATIN SMALL LETTER T WITH CARON
383   (#x9D #x0141) ; LATIN CAPITAL LETTER L WITH STROKE
384   (#x9E #x00D7) ; MULTIPLICATION SIGN
385   (#x9F #x010D) ; LATIN SMALL LETTER C WITH CARON
386   (#xA0 #x00E1) ; LATIN SMALL LETTER A WITH ACUTE
387   (#xA1 #x00ED) ; LATIN SMALL LETTER I WITH ACUTE
388   (#xA2 #x00F3) ; LATIN SMALL LETTER O WITH ACUTE
389   (#xA3 #x00FA) ; LATIN SMALL LETTER U WITH ACUTE
390   (#xA4 #x0104) ; LATIN CAPITAL LETTER A WITH OGONEK
391   (#xA5 #x0105) ; LATIN SMALL LETTER A WITH OGONEK
392   (#xA6 #x017D) ; LATIN CAPITAL LETTER Z WITH CARON
393   (#xA7 #x017E) ; LATIN SMALL LETTER Z WITH CARON
394   (#xA8 #x0118) ; LATIN CAPITAL LETTER E WITH OGONEK
395   (#xA9 #x0119) ; LATIN SMALL LETTER E WITH OGONEK
396   (#xAA #x00AC) ; NOT SIGN
397   (#xAB #x017A) ; LATIN SMALL LETTER Z WITH ACUTE
398   (#xAC #x010C) ; LATIN CAPITAL LETTER C WITH CARON
399   (#xAD #x015F) ; LATIN SMALL LETTER S WITH CEDILLA
400   (#xAE #x00AB) ; LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
401   (#xAF #x00BB) ; RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
402   (#xB0 #x2591) ; LIGHT SHADE
403   (#xB1 #x2592) ; MEDIUM SHADE
404   (#xB2 #x2593) ; DARK SHADE
405   (#xB3 #x2502) ; BOX DRAWINGS LIGHT VERTICAL
406   (#xB4 #x2524) ; BOX DRAWINGS LIGHT VERTICAL AND LEFT
407   (#xB5 #x00C1) ; LATIN CAPITAL LETTER A WITH ACUTE
408   (#xB6 #x00C2) ; LATIN CAPITAL LETTER A WITH CIRCUMFLEX
409   (#xB7 #x011A) ; LATIN CAPITAL LETTER E WITH CARON
410   (#xB8 #x015E) ; LATIN CAPITAL LETTER S WITH CEDILLA
411   (#xB9 #x2563) ; BOX DRAWINGS DOUBLE VERTICAL AND LEFT
412   (#xBA #x2551) ; BOX DRAWINGS DOUBLE VERTICAL
413   (#xBB #x2557) ; BOX DRAWINGS DOUBLE DOWN AND LEFT
414   (#xBC #x255D) ; BOX DRAWINGS DOUBLE UP AND LEFT
415   (#xBD #x017B) ; LATIN CAPITAL LETTER Z WITH DOT ABOVE
416   (#xBE #x017C) ; LATIN SMALL LETTER Z WITH DOT ABOVE
417   (#xBF #x2510) ; BOX DRAWINGS LIGHT DOWN AND LEFT
418   (#xC0 #x2514) ; BOX DRAWINGS LIGHT UP AND RIGHT
419   (#xC1 #x2534) ; BOX DRAWINGS LIGHT UP AND HORIZONTAL
420   (#xC2 #x252C) ; BOX DRAWINGS LIGHT DOWN AND HORIZONTAL
421   (#xC3 #x251C) ; BOX DRAWINGS LIGHT VERTICAL AND RIGHT
422   (#xC4 #x2500) ; BOX DRAWINGS LIGHT HORIZONTAL
423   (#xC5 #x253C) ; BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL
424   (#xC6 #x0102) ; LATIN CAPITAL LETTER A WITH BREVE
425   (#xC7 #x0103) ; LATIN SMALL LETTER A WITH BREVE
426   (#xC8 #x255A) ; BOX DRAWINGS DOUBLE UP AND RIGHT
427   (#xC9 #x2554) ; BOX DRAWINGS DOUBLE DOWN AND RIGHT
428   (#xCA #x2569) ; BOX DRAWINGS DOUBLE UP AND HORIZONTAL
429   (#xCB #x2566) ; BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL
430   (#xCC #x2560) ; BOX DRAWINGS DOUBLE VERTICAL AND RIGHT
431   (#xCD #x2550) ; BOX DRAWINGS DOUBLE HORIZONTAL
432   (#xCE #x256C) ; BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL
433   (#xCF #x00A4) ; CURRENCY SIGN
434   (#xD0 #x0111) ; LATIN SMALL LETTER D WITH STROKE
435   (#xD1 #x0110) ; LATIN CAPITAL LETTER D WITH STROKE
436   (#xD2 #x010E) ; LATIN CAPITAL LETTER D WITH CARON
437   (#xD3 #x00CB) ; LATIN CAPITAL LETTER E WITH DIAERESIS
438   (#xD4 #x010F) ; LATIN SMALL LETTER D WITH CARON
439   (#xD5 #x0147) ; LATIN CAPITAL LETTER N WITH CARON
440   (#xD6 #x00CD) ; LATIN CAPITAL LETTER I WITH ACUTE
441   (#xD7 #x00CE) ; LATIN CAPITAL LETTER I WITH CIRCUMFLEX
442   (#xD8 #x011B) ; LATIN SMALL LETTER E WITH CARON
443   (#xD9 #x2518) ; BOX DRAWINGS LIGHT UP AND LEFT
444   (#xDA #x250C) ; BOX DRAWINGS LIGHT DOWN AND RIGHT
445   (#xDB #x2588) ; FULL BLOCK
446   (#xDC #x2584) ; LOWER HALF BLOCK
447   (#xDD #x0162) ; LATIN CAPITAL LETTER T WITH CEDILLA
448   (#xDE #x016E) ; LATIN CAPITAL LETTER U WITH RING ABOVE
449   (#xDF #x2580) ; UPPER HALF BLOCK
450   (#xE0 #x00D3) ; LATIN CAPITAL LETTER O WITH ACUTE
451   (#xE1 #x00DF) ; LATIN SMALL LETTER SHARP S
452   (#xE2 #x00D4) ; LATIN CAPITAL LETTER O WITH CIRCUMFLEX
453   (#xE3 #x0143) ; LATIN CAPITAL LETTER N WITH ACUTE
454   (#xE4 #x0144) ; LATIN SMALL LETTER N WITH ACUTE
455   (#xE5 #x0148) ; LATIN SMALL LETTER N WITH CARON
456   (#xE6 #x0160) ; LATIN CAPITAL LETTER S WITH CARON
457   (#xE7 #x0161) ; LATIN SMALL LETTER S WITH CARON
458   (#xE8 #x0154) ; LATIN CAPITAL LETTER R WITH ACUTE
459   (#xE9 #x00DA) ; LATIN CAPITAL LETTER U WITH ACUTE
460   (#xEA #x0155) ; LATIN SMALL LETTER R WITH ACUTE
461   (#xEB #x0170) ; LATIN CAPITAL LETTER U WITH DOUBLE ACUTE
462   (#xEC #x00FD) ; LATIN SMALL LETTER Y WITH ACUTE
463   (#xED #x00DD) ; LATIN CAPITAL LETTER Y WITH ACUTE
464   (#xEE #x0163) ; LATIN SMALL LETTER T WITH CEDILLA
465   (#xEF #x00B4) ; ACUTE ACCENT
466   (#xF0 #x00AD) ; SOFT HYPHEN
467   (#xF1 #x02DD) ; DOUBLE ACUTE ACCENT
468   (#xF2 #x02DB) ; OGONEK
469   (#xF3 #x02C7) ; CARON
470   (#xF4 #x02D8) ; BREVE
471   (#xF5 #x00A7) ; SECTION SIGN
472   (#xF6 #x00F7) ; DIVISION SIGN
473   (#xF7 #x00B8) ; CEDILLA
474   (#xF8 #x00B0) ; DEGREE SIGN
475   (#xF9 #x00A8) ; DIAERESIS
476   (#xFA #x02D9) ; DOT ABOVE
477   (#xFB #x0171) ; LATIN SMALL LETTER U WITH DOUBLE ACUTE
478   (#xFC #x0158) ; LATIN CAPITAL LETTER R WITH CARON
479   (#xFD #x0159) ; LATIN SMALL LETTER R WITH CARON
480   (#xFE #x25A0) ; BLACK SQUARE
481   (#xFF #x00A0) ; NO-BREAK SPACE
482 )
483
484 (declaim (inline get-cp852-bytes))
485 (defun get-cp852-bytes(string pos end)
486   (declare (optimize speed (safety 0))
487            (type simple-string string)
488            (type array-range pos end))
489   (get-latin-bytes #'identity :cp852 string pos end))
490
491 (defun string->cp852 (string sstart send null-padding)
492   (declare (optimize speed (safety 0))
493            (type simple-string string)
494            (type array-range sstart send))
495   (values (string->latin% string sstart send #'get-cp852-bytes null-padding)))
496
497 (defmacro define-cp852->string* (accessor type)
498   (declare (ignore type))
499   (let ((name (make-od-name 'cp852->string* accessor)))
500     `(progn
501       (defun ,name (string sstart send array astart aend)
502         (,(make-od-name 'latin->string* accessor) string sstart send array astart aend #'identity)))))
503
504 (instantiate-octets-definition define-cp852->string*)
505
506 (defmacro define-cp852->string (accessor type)
507   (declare (ignore type))
508   `(defun ,(make-od-name 'cp852->string accessor) (array astart aend)
509     (,(make-od-name 'latin->string accessor) array astart aend #'identity)))
510
511 (instantiate-octets-definition define-cp852->string)
512
513 (push '((:cp852 :|cp852|)
514         cp852->string-aref string->cp852)
515       *external-format-functions*)
516
517 (define-external-format (:cp852 :|cp852|)
518     1 t
519     (let ((cp852-byte (code->cp852-mapper bits)))
520       (if cp852-byte
521           (setf (sap-ref-8 sap tail) cp852-byte)
522           (stream-encoding-error-and-handle stream bits)))
523     (let ((code (cp852->code-mapper byte)))
524       (if code
525           (code-char code)
526           (stream-decoding-error stream byte)))) ;; TODO -- error check
527
528 (define-unibyte-mapper cp855->code-mapper code->cp855-mapper
529   (#x80 #x0452) ; CYRILLIC SMALL LETTER DJE
530   (#x81 #x0402) ; CYRILLIC CAPITAL LETTER DJE
531   (#x82 #x0453) ; CYRILLIC SMALL LETTER GJE
532   (#x83 #x0403) ; CYRILLIC CAPITAL LETTER GJE
533   (#x84 #x0451) ; CYRILLIC SMALL LETTER IO
534   (#x85 #x0401) ; CYRILLIC CAPITAL LETTER IO
535   (#x86 #x0454) ; CYRILLIC SMALL LETTER UKRAINIAN IE
536   (#x87 #x0404) ; CYRILLIC CAPITAL LETTER UKRAINIAN IE
537   (#x88 #x0455) ; CYRILLIC SMALL LETTER DZE
538   (#x89 #x0405) ; CYRILLIC CAPITAL LETTER DZE
539   (#x8A #x0456) ; CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I
540   (#x8B #x0406) ; CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I
541   (#x8C #x0457) ; CYRILLIC SMALL LETTER YI
542   (#x8D #x0407) ; CYRILLIC CAPITAL LETTER YI
543   (#x8E #x0458) ; CYRILLIC SMALL LETTER JE
544   (#x8F #x0408) ; CYRILLIC CAPITAL LETTER JE
545   (#x90 #x0459) ; CYRILLIC SMALL LETTER LJE
546   (#x91 #x0409) ; CYRILLIC CAPITAL LETTER LJE
547   (#x92 #x045A) ; CYRILLIC SMALL LETTER NJE
548   (#x93 #x040A) ; CYRILLIC CAPITAL LETTER NJE
549   (#x94 #x045B) ; CYRILLIC SMALL LETTER TSHE
550   (#x95 #x040B) ; CYRILLIC CAPITAL LETTER TSHE
551   (#x96 #x045C) ; CYRILLIC SMALL LETTER KJE
552   (#x97 #x040C) ; CYRILLIC CAPITAL LETTER KJE
553   (#x98 #x045E) ; CYRILLIC SMALL LETTER SHORT U
554   (#x99 #x040E) ; CYRILLIC CAPITAL LETTER SHORT U
555   (#x9A #x045F) ; CYRILLIC SMALL LETTER DZHE
556   (#x9B #x040F) ; CYRILLIC CAPITAL LETTER DZHE
557   (#x9C #x044E) ; CYRILLIC SMALL LETTER YU
558   (#x9D #x042E) ; CYRILLIC CAPITAL LETTER YU
559   (#x9E #x044A) ; CYRILLIC SMALL LETTER HARD SIGN
560   (#x9F #x042A) ; CYRILLIC CAPITAL LETTER HARD SIGN
561   (#xA0 #x0430) ; CYRILLIC SMALL LETTER A
562   (#xA1 #x0410) ; CYRILLIC CAPITAL LETTER A
563   (#xA2 #x0431) ; CYRILLIC SMALL LETTER BE
564   (#xA3 #x0411) ; CYRILLIC CAPITAL LETTER BE
565   (#xA4 #x0446) ; CYRILLIC SMALL LETTER TSE
566   (#xA5 #x0426) ; CYRILLIC CAPITAL LETTER TSE
567   (#xA6 #x0434) ; CYRILLIC SMALL LETTER DE
568   (#xA7 #x0414) ; CYRILLIC CAPITAL LETTER DE
569   (#xA8 #x0435) ; CYRILLIC SMALL LETTER IE
570   (#xA9 #x0415) ; CYRILLIC CAPITAL LETTER IE
571   (#xAA #x0444) ; CYRILLIC SMALL LETTER EF
572   (#xAB #x0424) ; CYRILLIC CAPITAL LETTER EF
573   (#xAC #x0433) ; CYRILLIC SMALL LETTER GHE
574   (#xAD #x0413) ; CYRILLIC CAPITAL LETTER GHE
575   (#xAE #x00AB) ; LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
576   (#xAF #x00BB) ; RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
577   (#xB0 #x2591) ; LIGHT SHADE
578   (#xB1 #x2592) ; MEDIUM SHADE
579   (#xB2 #x2593) ; DARK SHADE
580   (#xB3 #x2502) ; BOX DRAWINGS LIGHT VERTICAL
581   (#xB4 #x2524) ; BOX DRAWINGS LIGHT VERTICAL AND LEFT
582   (#xB5 #x0445) ; CYRILLIC SMALL LETTER HA
583   (#xB6 #x0425) ; CYRILLIC CAPITAL LETTER HA
584   (#xB7 #x0438) ; CYRILLIC SMALL LETTER I
585   (#xB8 #x0418) ; CYRILLIC CAPITAL LETTER I
586   (#xB9 #x2563) ; BOX DRAWINGS DOUBLE VERTICAL AND LEFT
587   (#xBA #x2551) ; BOX DRAWINGS DOUBLE VERTICAL
588   (#xBB #x2557) ; BOX DRAWINGS DOUBLE DOWN AND LEFT
589   (#xBC #x255D) ; BOX DRAWINGS DOUBLE UP AND LEFT
590   (#xBD #x0439) ; CYRILLIC SMALL LETTER SHORT I
591   (#xBE #x0419) ; CYRILLIC CAPITAL LETTER SHORT I
592   (#xBF #x2510) ; BOX DRAWINGS LIGHT DOWN AND LEFT
593   (#xC0 #x2514) ; BOX DRAWINGS LIGHT UP AND RIGHT
594   (#xC1 #x2534) ; BOX DRAWINGS LIGHT UP AND HORIZONTAL
595   (#xC2 #x252C) ; BOX DRAWINGS LIGHT DOWN AND HORIZONTAL
596   (#xC3 #x251C) ; BOX DRAWINGS LIGHT VERTICAL AND RIGHT
597   (#xC4 #x2500) ; BOX DRAWINGS LIGHT HORIZONTAL
598   (#xC5 #x253C) ; BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL
599   (#xC6 #x043A) ; CYRILLIC SMALL LETTER KA
600   (#xC7 #x041A) ; CYRILLIC CAPITAL LETTER KA
601   (#xC8 #x255A) ; BOX DRAWINGS DOUBLE UP AND RIGHT
602   (#xC9 #x2554) ; BOX DRAWINGS DOUBLE DOWN AND RIGHT
603   (#xCA #x2569) ; BOX DRAWINGS DOUBLE UP AND HORIZONTAL
604   (#xCB #x2566) ; BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL
605   (#xCC #x2560) ; BOX DRAWINGS DOUBLE VERTICAL AND RIGHT
606   (#xCD #x2550) ; BOX DRAWINGS DOUBLE HORIZONTAL
607   (#xCE #x256C) ; BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL
608   (#xCF #x00A4) ; CURRENCY SIGN
609   (#xD0 #x043B) ; CYRILLIC SMALL LETTER EL
610   (#xD1 #x041B) ; CYRILLIC CAPITAL LETTER EL
611   (#xD2 #x043C) ; CYRILLIC SMALL LETTER EM
612   (#xD3 #x041C) ; CYRILLIC CAPITAL LETTER EM
613   (#xD4 #x043D) ; CYRILLIC SMALL LETTER EN
614   (#xD5 #x041D) ; CYRILLIC CAPITAL LETTER EN
615   (#xD6 #x043E) ; CYRILLIC SMALL LETTER O
616   (#xD7 #x041E) ; CYRILLIC CAPITAL LETTER O
617   (#xD8 #x043F) ; CYRILLIC SMALL LETTER PE
618   (#xD9 #x2518) ; BOX DRAWINGS LIGHT UP AND LEFT
619   (#xDA #x250C) ; BOX DRAWINGS LIGHT DOWN AND RIGHT
620   (#xDB #x2588) ; FULL BLOCK
621   (#xDC #x2584) ; LOWER HALF BLOCK
622   (#xDD #x041F) ; CYRILLIC CAPITAL LETTER PE
623   (#xDE #x044F) ; CYRILLIC SMALL LETTER YA
624   (#xDF #x2580) ; UPPER HALF BLOCK
625   (#xE0 #x042F) ; CYRILLIC CAPITAL LETTER YA
626   (#xE1 #x0440) ; CYRILLIC SMALL LETTER ER
627   (#xE2 #x0420) ; CYRILLIC CAPITAL LETTER ER
628   (#xE3 #x0441) ; CYRILLIC SMALL LETTER ES
629   (#xE4 #x0421) ; CYRILLIC CAPITAL LETTER ES
630   (#xE5 #x0442) ; CYRILLIC SMALL LETTER TE
631   (#xE6 #x0422) ; CYRILLIC CAPITAL LETTER TE
632   (#xE7 #x0443) ; CYRILLIC SMALL LETTER U
633   (#xE8 #x0423) ; CYRILLIC CAPITAL LETTER U
634   (#xE9 #x0436) ; CYRILLIC SMALL LETTER ZHE
635   (#xEA #x0416) ; CYRILLIC CAPITAL LETTER ZHE
636   (#xEB #x0432) ; CYRILLIC SMALL LETTER VE
637   (#xEC #x0412) ; CYRILLIC CAPITAL LETTER VE
638   (#xED #x044C) ; CYRILLIC SMALL LETTER SOFT SIGN
639   (#xEE #x042C) ; CYRILLIC CAPITAL LETTER SOFT SIGN
640   (#xEF #x2116) ; NUMERO SIGN
641   (#xF0 #x00AD) ; SOFT HYPHEN
642   (#xF1 #x044B) ; CYRILLIC SMALL LETTER YERU
643   (#xF2 #x042B) ; CYRILLIC CAPITAL LETTER YERU
644   (#xF3 #x0437) ; CYRILLIC SMALL LETTER ZE
645   (#xF4 #x0417) ; CYRILLIC CAPITAL LETTER ZE
646   (#xF5 #x0448) ; CYRILLIC SMALL LETTER SHA
647   (#xF6 #x0428) ; CYRILLIC CAPITAL LETTER SHA
648   (#xF7 #x044D) ; CYRILLIC SMALL LETTER E
649   (#xF8 #x042D) ; CYRILLIC CAPITAL LETTER E
650   (#xF9 #x0449) ; CYRILLIC SMALL LETTER SHCHA
651   (#xFA #x0429) ; CYRILLIC CAPITAL LETTER SHCHA
652   (#xFB #x0447) ; CYRILLIC SMALL LETTER CHE
653   (#xFC #x0427) ; CYRILLIC CAPITAL LETTER CHE
654   (#xFD #x00A7) ; SECTION SIGN
655   (#xFE #x25A0) ; BLACK SQUARE
656   (#xFF #x00A0) ; NO-BREAK SPACE
657 )
658
659 (declaim (inline get-cp855-bytes))
660 (defun get-cp855-bytes(string pos end)
661   (declare (optimize speed (safety 0))
662            (type simple-string string)
663            (type array-range pos end))
664   (get-latin-bytes #'identity :cp855 string pos end))
665
666 (defun string->cp855 (string sstart send null-padding)
667   (declare (optimize speed (safety 0))
668            (type simple-string string)
669            (type array-range sstart send))
670   (values (string->latin% string sstart send #'get-cp855-bytes null-padding)))
671
672 (defmacro define-cp855->string* (accessor type)
673   (declare (ignore type))
674   (let ((name (make-od-name 'cp855->string* accessor)))
675     `(progn
676       (defun ,name (string sstart send array astart aend)
677         (,(make-od-name 'latin->string* accessor) string sstart send array astart aend #'identity)))))
678
679 (instantiate-octets-definition define-cp855->string*)
680
681 (defmacro define-cp855->string (accessor type)
682   (declare (ignore type))
683   `(defun ,(make-od-name 'cp855->string accessor) (array astart aend)
684     (,(make-od-name 'latin->string accessor) array astart aend #'identity)))
685
686 (instantiate-octets-definition define-cp855->string)
687
688 (push '((:cp855 :|cp855|)
689         cp855->string-aref string->cp855)
690       *external-format-functions*)
691
692 (define-external-format (:cp855 :|cp855|)
693     1 t
694     (let ((cp855-byte (code->cp855-mapper bits)))
695       (if cp855-byte
696           (setf (sap-ref-8 sap tail) cp855-byte)
697           (stream-encoding-error-and-handle stream bits)))
698     (let ((code (cp855->code-mapper byte)))
699       (if code
700           (code-char code)
701           (stream-decoding-error stream byte)))) ;; TODO -- error check
702
703 (define-unibyte-mapper cp857->code-mapper code->cp857-mapper
704   (#x80 #x00C7) ; LATIN CAPITAL LETTER C WITH CEDILLA
705   (#x81 #x00FC) ; LATIN SMALL LETTER U WITH DIAERESIS
706   (#x82 #x00E9) ; LATIN SMALL LETTER E WITH ACUTE
707   (#x83 #x00E2) ; LATIN SMALL LETTER A WITH CIRCUMFLEX
708   (#x84 #x00E4) ; LATIN SMALL LETTER A WITH DIAERESIS
709   (#x85 #x00E0) ; LATIN SMALL LETTER A WITH GRAVE
710   (#x86 #x00E5) ; LATIN SMALL LETTER A WITH RING ABOVE
711   (#x87 #x00E7) ; LATIN SMALL LETTER C WITH CEDILLA
712   (#x88 #x00EA) ; LATIN SMALL LETTER E WITH CIRCUMFLEX
713   (#x89 #x00EB) ; LATIN SMALL LETTER E WITH DIAERESIS
714   (#x8A #x00E8) ; LATIN SMALL LETTER E WITH GRAVE
715   (#x8B #x00EF) ; LATIN SMALL LETTER I WITH DIAERESIS
716   (#x8C #x00EE) ; LATIN SMALL LETTER I WITH CIRCUMFLEX
717   (#x8D #x0131) ; LATIN SMALL LETTER DOTLESS I
718   (#x8E #x00C4) ; LATIN CAPITAL LETTER A WITH DIAERESIS
719   (#x8F #x00C5) ; LATIN CAPITAL LETTER A WITH RING ABOVE
720   (#x90 #x00C9) ; LATIN CAPITAL LETTER E WITH ACUTE
721   (#x91 #x00E6) ; LATIN SMALL LIGATURE AE
722   (#x92 #x00C6) ; LATIN CAPITAL LIGATURE AE
723   (#x93 #x00F4) ; LATIN SMALL LETTER O WITH CIRCUMFLEX
724   (#x94 #x00F6) ; LATIN SMALL LETTER O WITH DIAERESIS
725   (#x95 #x00F2) ; LATIN SMALL LETTER O WITH GRAVE
726   (#x96 #x00FB) ; LATIN SMALL LETTER U WITH CIRCUMFLEX
727   (#x97 #x00F9) ; LATIN SMALL LETTER U WITH GRAVE
728   (#x98 #x0130) ; LATIN CAPITAL LETTER I WITH DOT ABOVE
729   (#x99 #x00D6) ; LATIN CAPITAL LETTER O WITH DIAERESIS
730   (#x9A #x00DC) ; LATIN CAPITAL LETTER U WITH DIAERESIS
731   (#x9B #x00F8) ; LATIN SMALL LETTER O WITH STROKE
732   (#x9C #x00A3) ; POUND SIGN
733   (#x9D #x00D8) ; LATIN CAPITAL LETTER O WITH STROKE
734   (#x9E #x015E) ; LATIN CAPITAL LETTER S WITH CEDILLA
735   (#x9F #x015F) ; LATIN SMALL LETTER S WITH CEDILLA
736   (#xA0 #x00E1) ; LATIN SMALL LETTER A WITH ACUTE
737   (#xA1 #x00ED) ; LATIN SMALL LETTER I WITH ACUTE
738   (#xA2 #x00F3) ; LATIN SMALL LETTER O WITH ACUTE
739   (#xA3 #x00FA) ; LATIN SMALL LETTER U WITH ACUTE
740   (#xA4 #x00F1) ; LATIN SMALL LETTER N WITH TILDE
741   (#xA5 #x00D1) ; LATIN CAPITAL LETTER N WITH TILDE
742   (#xA6 #x011E) ; LATIN CAPITAL LETTER G WITH BREVE
743   (#xA7 #x011F) ; LATIN SMALL LETTER G WITH BREVE
744   (#xA8 #x00BF) ; INVERTED QUESTION MARK
745   (#xA9 #x00AE) ; REGISTERED SIGN
746   (#xAA #x00AC) ; NOT SIGN
747   (#xAB #x00BD) ; VULGAR FRACTION ONE HALF
748   (#xAC #x00BC) ; VULGAR FRACTION ONE QUARTER
749   (#xAD #x00A1) ; INVERTED EXCLAMATION MARK
750   (#xAE #x00AB) ; LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
751   (#xAF #x00BB) ; RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
752   (#xB0 #x2591) ; LIGHT SHADE
753   (#xB1 #x2592) ; MEDIUM SHADE
754   (#xB2 #x2593) ; DARK SHADE
755   (#xB3 #x2502) ; BOX DRAWINGS LIGHT VERTICAL
756   (#xB4 #x2524) ; BOX DRAWINGS LIGHT VERTICAL AND LEFT
757   (#xB5 #x00C1) ; LATIN CAPITAL LETTER A WITH ACUTE
758   (#xB6 #x00C2) ; LATIN CAPITAL LETTER A WITH CIRCUMFLEX
759   (#xB7 #x00C0) ; LATIN CAPITAL LETTER A WITH GRAVE
760   (#xB8 #x00A9) ; COPYRIGHT SIGN
761   (#xB9 #x2563) ; BOX DRAWINGS DOUBLE VERTICAL AND LEFT
762   (#xBA #x2551) ; BOX DRAWINGS DOUBLE VERTICAL
763   (#xBB #x2557) ; BOX DRAWINGS DOUBLE DOWN AND LEFT
764   (#xBC #x255D) ; BOX DRAWINGS DOUBLE UP AND LEFT
765   (#xBD #x00A2) ; CENT SIGN
766   (#xBE #x00A5) ; YEN SIGN
767   (#xBF #x2510) ; BOX DRAWINGS LIGHT DOWN AND LEFT
768   (#xC0 #x2514) ; BOX DRAWINGS LIGHT UP AND RIGHT
769   (#xC1 #x2534) ; BOX DRAWINGS LIGHT UP AND HORIZONTAL
770   (#xC2 #x252C) ; BOX DRAWINGS LIGHT DOWN AND HORIZONTAL
771   (#xC3 #x251C) ; BOX DRAWINGS LIGHT VERTICAL AND RIGHT
772   (#xC4 #x2500) ; BOX DRAWINGS LIGHT HORIZONTAL
773   (#xC5 #x253C) ; BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL
774   (#xC6 #x00E3) ; LATIN SMALL LETTER A WITH TILDE
775   (#xC7 #x00C3) ; LATIN CAPITAL LETTER A WITH TILDE
776   (#xC8 #x255A) ; BOX DRAWINGS DOUBLE UP AND RIGHT
777   (#xC9 #x2554) ; BOX DRAWINGS DOUBLE DOWN AND RIGHT
778   (#xCA #x2569) ; BOX DRAWINGS DOUBLE UP AND HORIZONTAL
779   (#xCB #x2566) ; BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL
780   (#xCC #x2560) ; BOX DRAWINGS DOUBLE VERTICAL AND RIGHT
781   (#xCD #x2550) ; BOX DRAWINGS DOUBLE HORIZONTAL
782   (#xCE #x256C) ; BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL
783   (#xCF #x00A4) ; CURRENCY SIGN
784   (#xD0 #x00BA) ; MASCULINE ORDINAL INDICATOR
785   (#xD1 #x00AA) ; FEMININE ORDINAL INDICATOR
786   (#xD2 #x00CA) ; LATIN CAPITAL LETTER E WITH CIRCUMFLEX
787   (#xD3 #x00CB) ; LATIN CAPITAL LETTER E WITH DIAERESIS
788   (#xD4 #x00C8) ; LATIN CAPITAL LETTER E WITH GRAVE
789   (#xD5 nil)
790   (#xD6 #x00CD) ; LATIN CAPITAL LETTER I WITH ACUTE
791   (#xD7 #x00CE) ; LATIN CAPITAL LETTER I WITH CIRCUMFLEX
792   (#xD8 #x00CF) ; LATIN CAPITAL LETTER I WITH DIAERESIS
793   (#xD9 #x2518) ; BOX DRAWINGS LIGHT UP AND LEFT
794   (#xDA #x250C) ; BOX DRAWINGS LIGHT DOWN AND RIGHT
795   (#xDB #x2588) ; FULL BLOCK
796   (#xDC #x2584) ; LOWER HALF BLOCK
797   (#xDD #x00A6) ; BROKEN BAR
798   (#xDE #x00CC) ; LATIN CAPITAL LETTER I WITH GRAVE
799   (#xDF #x2580) ; UPPER HALF BLOCK
800   (#xE0 #x00D3) ; LATIN CAPITAL LETTER O WITH ACUTE
801   (#xE1 #x00DF) ; LATIN SMALL LETTER SHARP S
802   (#xE2 #x00D4) ; LATIN CAPITAL LETTER O WITH CIRCUMFLEX
803   (#xE3 #x00D2) ; LATIN CAPITAL LETTER O WITH GRAVE
804   (#xE4 #x00F5) ; LATIN SMALL LETTER O WITH TILDE
805   (#xE5 #x00D5) ; LATIN CAPITAL LETTER O WITH TILDE
806   (#xE6 #x00B5) ; MICRO SIGN
807   (#xE7 nil)
808   (#xE8 #x00D7) ; MULTIPLICATION SIGN
809   (#xE9 #x00DA) ; LATIN CAPITAL LETTER U WITH ACUTE
810   (#xEA #x00DB) ; LATIN CAPITAL LETTER U WITH CIRCUMFLEX
811   (#xEB #x00D9) ; LATIN CAPITAL LETTER U WITH GRAVE
812   (#xED #x00FF) ; LATIN SMALL LETTER Y WITH DIAERESIS
813   (#xEE #x00AF) ; MACRON
814   (#xEF #x00B4) ; ACUTE ACCENT
815   (#xF0 #x00AD) ; SOFT HYPHEN
816   (#xF1 #x00B1) ; PLUS-MINUS SIGN
817   (#xF2 nil)
818   (#xF3 #x00BE) ; VULGAR FRACTION THREE QUARTERS
819   (#xF4 #x00B6) ; PILCROW SIGN
820   (#xF5 #x00A7) ; SECTION SIGN
821   (#xF6 #x00F7) ; DIVISION SIGN
822   (#xF7 #x00B8) ; CEDILLA
823   (#xF8 #x00B0) ; DEGREE SIGN
824   (#xF9 #x00A8) ; DIAERESIS
825   (#xFA #x00B7) ; MIDDLE DOT
826   (#xFB #x00B9) ; SUPERSCRIPT ONE
827   (#xFC #x00B3) ; SUPERSCRIPT THREE
828   (#xFD #x00B2) ; SUPERSCRIPT TWO
829   (#xFE #x25A0) ; BLACK SQUARE
830   (#xFF #x00A0) ; NO-BREAK SPACE
831 )
832
833 (declaim (inline get-cp857-bytes))
834 (defun get-cp857-bytes(string pos end)
835   (declare (optimize speed (safety 0))
836            (type simple-string string)
837            (type array-range pos end))
838   (get-latin-bytes #'identity :cp857 string pos end))
839
840 (defun string->cp857 (string sstart send null-padding)
841   (declare (optimize speed (safety 0))
842            (type simple-string string)
843            (type array-range sstart send))
844   (values (string->latin% string sstart send #'get-cp857-bytes null-padding)))
845
846 (defmacro define-cp857->string* (accessor type)
847   (declare (ignore type))
848   (let ((name (make-od-name 'cp857->string* accessor)))
849     `(progn
850       (defun ,name (string sstart send array astart aend)
851         (,(make-od-name 'latin->string* accessor) string sstart send array astart aend #'identity)))))
852
853 (instantiate-octets-definition define-cp857->string*)
854
855 (defmacro define-cp857->string (accessor type)
856   (declare (ignore type))
857   `(defun ,(make-od-name 'cp857->string accessor) (array astart aend)
858     (,(make-od-name 'latin->string accessor) array astart aend #'identity)))
859
860 (instantiate-octets-definition define-cp857->string)
861
862 (push '((:cp857 :|cp857|)
863         cp857->string-aref string->cp857)
864       *external-format-functions*)
865
866 (define-external-format (:cp857 :|cp857|)
867     1 t
868     (let ((cp857-byte (code->cp857-mapper bits)))
869       (if cp857-byte
870           (setf (sap-ref-8 sap tail) cp857-byte)
871           (stream-encoding-error-and-handle stream bits)))
872     (let ((code (cp857->code-mapper byte)))
873       (if code
874           (code-char code)
875           (stream-decoding-error stream byte)))) ;; TODO -- error check
876
877 (define-unibyte-mapper cp860->code-mapper code->cp860-mapper
878   (#x80 #x00C7) ; LATIN CAPITAL LETTER C WITH CEDILLA
879   (#x81 #x00FC) ; LATIN SMALL LETTER U WITH DIAERESIS
880   (#x82 #x00E9) ; LATIN SMALL LETTER E WITH ACUTE
881   (#x83 #x00E2) ; LATIN SMALL LETTER A WITH CIRCUMFLEX
882   (#x84 #x00E3) ; LATIN SMALL LETTER A WITH TILDE
883   (#x85 #x00E0) ; LATIN SMALL LETTER A WITH GRAVE
884   (#x86 #x00C1) ; LATIN CAPITAL LETTER A WITH ACUTE
885   (#x87 #x00E7) ; LATIN SMALL LETTER C WITH CEDILLA
886   (#x88 #x00EA) ; LATIN SMALL LETTER E WITH CIRCUMFLEX
887   (#x89 #x00CA) ; LATIN CAPITAL LETTER E WITH CIRCUMFLEX
888   (#x8A #x00E8) ; LATIN SMALL LETTER E WITH GRAVE
889   (#x8B #x00CD) ; LATIN CAPITAL LETTER I WITH ACUTE
890   (#x8C #x00D4) ; LATIN CAPITAL LETTER O WITH CIRCUMFLEX
891   (#x8D #x00EC) ; LATIN SMALL LETTER I WITH GRAVE
892   (#x8E #x00C3) ; LATIN CAPITAL LETTER A WITH TILDE
893   (#x8F #x00C2) ; LATIN CAPITAL LETTER A WITH CIRCUMFLEX
894   (#x90 #x00C9) ; LATIN CAPITAL LETTER E WITH ACUTE
895   (#x91 #x00C0) ; LATIN CAPITAL LETTER A WITH GRAVE
896   (#x92 #x00C8) ; LATIN CAPITAL LETTER E WITH GRAVE
897   (#x93 #x00F4) ; LATIN SMALL LETTER O WITH CIRCUMFLEX
898   (#x94 #x00F5) ; LATIN SMALL LETTER O WITH TILDE
899   (#x95 #x00F2) ; LATIN SMALL LETTER O WITH GRAVE
900   (#x96 #x00DA) ; LATIN CAPITAL LETTER U WITH ACUTE
901   (#x97 #x00F9) ; LATIN SMALL LETTER U WITH GRAVE
902   (#x98 #x00CC) ; LATIN CAPITAL LETTER I WITH GRAVE
903   (#x99 #x00D5) ; LATIN CAPITAL LETTER O WITH TILDE
904   (#x9A #x00DC) ; LATIN CAPITAL LETTER U WITH DIAERESIS
905   (#x9B #x00A2) ; CENT SIGN
906   (#x9C #x00A3) ; POUND SIGN
907   (#x9D #x00D9) ; LATIN CAPITAL LETTER U WITH GRAVE
908   (#x9E #x20A7) ; PESETA SIGN
909   (#x9F #x00D3) ; LATIN CAPITAL LETTER O WITH ACUTE
910   (#xA0 #x00E1) ; LATIN SMALL LETTER A WITH ACUTE
911   (#xA1 #x00ED) ; LATIN SMALL LETTER I WITH ACUTE
912   (#xA2 #x00F3) ; LATIN SMALL LETTER O WITH ACUTE
913   (#xA3 #x00FA) ; LATIN SMALL LETTER U WITH ACUTE
914   (#xA4 #x00F1) ; LATIN SMALL LETTER N WITH TILDE
915   (#xA5 #x00D1) ; LATIN CAPITAL LETTER N WITH TILDE
916   (#xA6 #x00AA) ; FEMININE ORDINAL INDICATOR
917   (#xA7 #x00BA) ; MASCULINE ORDINAL INDICATOR
918   (#xA8 #x00BF) ; INVERTED QUESTION MARK
919   (#xA9 #x00D2) ; LATIN CAPITAL LETTER O WITH GRAVE
920   (#xAA #x00AC) ; NOT SIGN
921   (#xAB #x00BD) ; VULGAR FRACTION ONE HALF
922   (#xAC #x00BC) ; VULGAR FRACTION ONE QUARTER
923   (#xAD #x00A1) ; INVERTED EXCLAMATION MARK
924   (#xAE #x00AB) ; LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
925   (#xAF #x00BB) ; RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
926   (#xB0 #x2591) ; LIGHT SHADE
927   (#xB1 #x2592) ; MEDIUM SHADE
928   (#xB2 #x2593) ; DARK SHADE
929   (#xB3 #x2502) ; BOX DRAWINGS LIGHT VERTICAL
930   (#xB4 #x2524) ; BOX DRAWINGS LIGHT VERTICAL AND LEFT
931   (#xB5 #x2561) ; BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE
932   (#xB6 #x2562) ; BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE
933   (#xB7 #x2556) ; BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE
934   (#xB8 #x2555) ; BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE
935   (#xB9 #x2563) ; BOX DRAWINGS DOUBLE VERTICAL AND LEFT
936   (#xBA #x2551) ; BOX DRAWINGS DOUBLE VERTICAL
937   (#xBB #x2557) ; BOX DRAWINGS DOUBLE DOWN AND LEFT
938   (#xBC #x255D) ; BOX DRAWINGS DOUBLE UP AND LEFT
939   (#xBD #x255C) ; BOX DRAWINGS UP DOUBLE AND LEFT SINGLE
940   (#xBE #x255B) ; BOX DRAWINGS UP SINGLE AND LEFT DOUBLE
941   (#xBF #x2510) ; BOX DRAWINGS LIGHT DOWN AND LEFT
942   (#xC0 #x2514) ; BOX DRAWINGS LIGHT UP AND RIGHT
943   (#xC1 #x2534) ; BOX DRAWINGS LIGHT UP AND HORIZONTAL
944   (#xC2 #x252C) ; BOX DRAWINGS LIGHT DOWN AND HORIZONTAL
945   (#xC3 #x251C) ; BOX DRAWINGS LIGHT VERTICAL AND RIGHT
946   (#xC4 #x2500) ; BOX DRAWINGS LIGHT HORIZONTAL
947   (#xC5 #x253C) ; BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL
948   (#xC6 #x255E) ; BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE
949   (#xC7 #x255F) ; BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE
950   (#xC8 #x255A) ; BOX DRAWINGS DOUBLE UP AND RIGHT
951   (#xC9 #x2554) ; BOX DRAWINGS DOUBLE DOWN AND RIGHT
952   (#xCA #x2569) ; BOX DRAWINGS DOUBLE UP AND HORIZONTAL
953   (#xCB #x2566) ; BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL
954   (#xCC #x2560) ; BOX DRAWINGS DOUBLE VERTICAL AND RIGHT
955   (#xCD #x2550) ; BOX DRAWINGS DOUBLE HORIZONTAL
956   (#xCE #x256C) ; BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL
957   (#xCF #x2567) ; BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE
958   (#xD0 #x2568) ; BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE
959   (#xD1 #x2564) ; BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE
960   (#xD2 #x2565) ; BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE
961   (#xD3 #x2559) ; BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE
962   (#xD4 #x2558) ; BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE
963   (#xD5 #x2552) ; BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE
964   (#xD6 #x2553) ; BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE
965   (#xD7 #x256B) ; BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE
966   (#xD8 #x256A) ; BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE
967   (#xD9 #x2518) ; BOX DRAWINGS LIGHT UP AND LEFT
968   (#xDA #x250C) ; BOX DRAWINGS LIGHT DOWN AND RIGHT
969   (#xDB #x2588) ; FULL BLOCK
970   (#xDC #x2584) ; LOWER HALF BLOCK
971   (#xDD #x258C) ; LEFT HALF BLOCK
972   (#xDE #x2590) ; RIGHT HALF BLOCK
973   (#xDF #x2580) ; UPPER HALF BLOCK
974   (#xE0 #x03B1) ; GREEK SMALL LETTER ALPHA
975   (#xE1 #x00DF) ; LATIN SMALL LETTER SHARP S
976   (#xE2 #x0393) ; GREEK CAPITAL LETTER GAMMA
977   (#xE3 #x03C0) ; GREEK SMALL LETTER PI
978   (#xE4 #x03A3) ; GREEK CAPITAL LETTER SIGMA
979   (#xE5 #x03C3) ; GREEK SMALL LETTER SIGMA
980   (#xE6 #x00B5) ; MICRO SIGN
981   (#xE7 #x03C4) ; GREEK SMALL LETTER TAU
982   (#xE8 #x03A6) ; GREEK CAPITAL LETTER PHI
983   (#xE9 #x0398) ; GREEK CAPITAL LETTER THETA
984   (#xEA #x03A9) ; GREEK CAPITAL LETTER OMEGA
985   (#xEB #x03B4) ; GREEK SMALL LETTER DELTA
986   (#xEC #x221E) ; INFINITY
987   (#xED #x03C6) ; GREEK SMALL LETTER PHI
988   (#xEE #x03B5) ; GREEK SMALL LETTER EPSILON
989   (#xEF #x2229) ; INTERSECTION
990   (#xF0 #x2261) ; IDENTICAL TO
991   (#xF1 #x00B1) ; PLUS-MINUS SIGN
992   (#xF2 #x2265) ; GREATER-THAN OR EQUAL TO
993   (#xF3 #x2264) ; LESS-THAN OR EQUAL TO
994   (#xF4 #x2320) ; TOP HALF INTEGRAL
995   (#xF5 #x2321) ; BOTTOM HALF INTEGRAL
996   (#xF6 #x00F7) ; DIVISION SIGN
997   (#xF7 #x2248) ; ALMOST EQUAL TO
998   (#xF8 #x00B0) ; DEGREE SIGN
999   (#xF9 #x2219) ; BULLET OPERATOR
1000   (#xFA #x00B7) ; MIDDLE DOT
1001   (#xFB #x221A) ; SQUARE ROOT
1002   (#xFC #x207F) ; SUPERSCRIPT LATIN SMALL LETTER N
1003   (#xFD #x00B2) ; SUPERSCRIPT TWO
1004   (#xFE #x25A0) ; BLACK SQUARE
1005   (#xFF #x00A0) ; NO-BREAK SPACE
1006 )
1007
1008 (declaim (inline get-cp860-bytes))
1009 (defun get-cp860-bytes(string pos end)
1010   (declare (optimize speed (safety 0))
1011            (type simple-string string)
1012            (type array-range pos end))
1013   (get-latin-bytes #'identity :cp860 string pos end))
1014
1015 (defun string->cp860 (string sstart send null-padding)
1016   (declare (optimize speed (safety 0))
1017            (type simple-string string)
1018            (type array-range sstart send))
1019   (values (string->latin% string sstart send #'get-cp860-bytes null-padding)))
1020
1021 (defmacro define-cp860->string* (accessor type)
1022   (declare (ignore type))
1023   (let ((name (make-od-name 'cp860->string* accessor)))
1024     `(progn
1025       (defun ,name (string sstart send array astart aend)
1026         (,(make-od-name 'latin->string* accessor) string sstart send array astart aend #'identity)))))
1027
1028 (instantiate-octets-definition define-cp860->string*)
1029
1030 (defmacro define-cp860->string (accessor type)
1031   (declare (ignore type))
1032   `(defun ,(make-od-name 'cp860->string accessor) (array astart aend)
1033     (,(make-od-name 'latin->string accessor) array astart aend #'identity)))
1034
1035 (instantiate-octets-definition define-cp860->string)
1036
1037 (push '((:cp860 :|cp860|)
1038         cp860->string-aref string->cp860)
1039       *external-format-functions*)
1040
1041 (define-external-format (:cp860 :|cp860|)
1042     1 t
1043     (let ((cp860-byte (code->cp860-mapper bits)))
1044       (if cp860-byte
1045           (setf (sap-ref-8 sap tail) cp860-byte)
1046           (stream-encoding-error-and-handle stream bits)))
1047     (let ((code (cp860->code-mapper byte)))
1048       (if code
1049           (code-char code)
1050           (stream-decoding-error stream byte)))) ;; TODO -- error check
1051
1052 (define-unibyte-mapper cp861->code-mapper code->cp861-mapper
1053   (#x80 #x00C7) ; LATIN CAPITAL LETTER C WITH CEDILLA
1054   (#x81 #x00FC) ; LATIN SMALL LETTER U WITH DIAERESIS
1055   (#x82 #x00E9) ; LATIN SMALL LETTER E WITH ACUTE
1056   (#x83 #x00E2) ; LATIN SMALL LETTER A WITH CIRCUMFLEX
1057   (#x84 #x00E4) ; LATIN SMALL LETTER A WITH DIAERESIS
1058   (#x85 #x00E0) ; LATIN SMALL LETTER A WITH GRAVE
1059   (#x86 #x00E5) ; LATIN SMALL LETTER A WITH RING ABOVE
1060   (#x87 #x00E7) ; LATIN SMALL LETTER C WITH CEDILLA
1061   (#x88 #x00EA) ; LATIN SMALL LETTER E WITH CIRCUMFLEX
1062   (#x89 #x00EB) ; LATIN SMALL LETTER E WITH DIAERESIS
1063   (#x8A #x00E8) ; LATIN SMALL LETTER E WITH GRAVE
1064   (#x8B #x00D0) ; LATIN CAPITAL LETTER ETH
1065   (#x8C #x00F0) ; LATIN SMALL LETTER ETH
1066   (#x8D #x00DE) ; LATIN CAPITAL LETTER THORN
1067   (#x8E #x00C4) ; LATIN CAPITAL LETTER A WITH DIAERESIS
1068   (#x8F #x00C5) ; LATIN CAPITAL LETTER A WITH RING ABOVE
1069   (#x90 #x00C9) ; LATIN CAPITAL LETTER E WITH ACUTE
1070   (#x91 #x00E6) ; LATIN SMALL LIGATURE AE
1071   (#x92 #x00C6) ; LATIN CAPITAL LIGATURE AE
1072   (#x93 #x00F4) ; LATIN SMALL LETTER O WITH CIRCUMFLEX
1073   (#x94 #x00F6) ; LATIN SMALL LETTER O WITH DIAERESIS
1074   (#x95 #x00FE) ; LATIN SMALL LETTER THORN
1075   (#x96 #x00FB) ; LATIN SMALL LETTER U WITH CIRCUMFLEX
1076   (#x97 #x00DD) ; LATIN CAPITAL LETTER Y WITH ACUTE
1077   (#x98 #x00FD) ; LATIN SMALL LETTER Y WITH ACUTE
1078   (#x99 #x00D6) ; LATIN CAPITAL LETTER O WITH DIAERESIS
1079   (#x9A #x00DC) ; LATIN CAPITAL LETTER U WITH DIAERESIS
1080   (#x9B #x00F8) ; LATIN SMALL LETTER O WITH STROKE
1081   (#x9C #x00A3) ; POUND SIGN
1082   (#x9D #x00D8) ; LATIN CAPITAL LETTER O WITH STROKE
1083   (#x9E #x20A7) ; PESETA SIGN
1084   (#x9F #x0192) ; LATIN SMALL LETTER F WITH HOOK
1085   (#xA0 #x00E1) ; LATIN SMALL LETTER A WITH ACUTE
1086   (#xA1 #x00ED) ; LATIN SMALL LETTER I WITH ACUTE
1087   (#xA2 #x00F3) ; LATIN SMALL LETTER O WITH ACUTE
1088   (#xA3 #x00FA) ; LATIN SMALL LETTER U WITH ACUTE
1089   (#xA4 #x00C1) ; LATIN CAPITAL LETTER A WITH ACUTE
1090   (#xA5 #x00CD) ; LATIN CAPITAL LETTER I WITH ACUTE
1091   (#xA6 #x00D3) ; LATIN CAPITAL LETTER O WITH ACUTE
1092   (#xA7 #x00DA) ; LATIN CAPITAL LETTER U WITH ACUTE
1093   (#xA8 #x00BF) ; INVERTED QUESTION MARK
1094   (#xA9 #x2310) ; REVERSED NOT SIGN
1095   (#xAA #x00AC) ; NOT SIGN
1096   (#xAB #x00BD) ; VULGAR FRACTION ONE HALF
1097   (#xAC #x00BC) ; VULGAR FRACTION ONE QUARTER
1098   (#xAD #x00A1) ; INVERTED EXCLAMATION MARK
1099   (#xAE #x00AB) ; LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
1100   (#xAF #x00BB) ; RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
1101   (#xB0 #x2591) ; LIGHT SHADE
1102   (#xB1 #x2592) ; MEDIUM SHADE
1103   (#xB2 #x2593) ; DARK SHADE
1104   (#xB3 #x2502) ; BOX DRAWINGS LIGHT VERTICAL
1105   (#xB4 #x2524) ; BOX DRAWINGS LIGHT VERTICAL AND LEFT
1106   (#xB5 #x2561) ; BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE
1107   (#xB6 #x2562) ; BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE
1108   (#xB7 #x2556) ; BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE
1109   (#xB8 #x2555) ; BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE
1110   (#xB9 #x2563) ; BOX DRAWINGS DOUBLE VERTICAL AND LEFT
1111   (#xBA #x2551) ; BOX DRAWINGS DOUBLE VERTICAL
1112   (#xBB #x2557) ; BOX DRAWINGS DOUBLE DOWN AND LEFT
1113   (#xBC #x255D) ; BOX DRAWINGS DOUBLE UP AND LEFT
1114   (#xBD #x255C) ; BOX DRAWINGS UP DOUBLE AND LEFT SINGLE
1115   (#xBE #x255B) ; BOX DRAWINGS UP SINGLE AND LEFT DOUBLE
1116   (#xBF #x2510) ; BOX DRAWINGS LIGHT DOWN AND LEFT
1117   (#xC0 #x2514) ; BOX DRAWINGS LIGHT UP AND RIGHT
1118   (#xC1 #x2534) ; BOX DRAWINGS LIGHT UP AND HORIZONTAL
1119   (#xC2 #x252C) ; BOX DRAWINGS LIGHT DOWN AND HORIZONTAL
1120   (#xC3 #x251C) ; BOX DRAWINGS LIGHT VERTICAL AND RIGHT
1121   (#xC4 #x2500) ; BOX DRAWINGS LIGHT HORIZONTAL
1122   (#xC5 #x253C) ; BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL
1123   (#xC6 #x255E) ; BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE
1124   (#xC7 #x255F) ; BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE
1125   (#xC8 #x255A) ; BOX DRAWINGS DOUBLE UP AND RIGHT
1126   (#xC9 #x2554) ; BOX DRAWINGS DOUBLE DOWN AND RIGHT
1127   (#xCA #x2569) ; BOX DRAWINGS DOUBLE UP AND HORIZONTAL
1128   (#xCB #x2566) ; BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL
1129   (#xCC #x2560) ; BOX DRAWINGS DOUBLE VERTICAL AND RIGHT
1130   (#xCD #x2550) ; BOX DRAWINGS DOUBLE HORIZONTAL
1131   (#xCE #x256C) ; BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL
1132   (#xCF #x2567) ; BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE
1133   (#xD0 #x2568) ; BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE
1134   (#xD1 #x2564) ; BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE
1135   (#xD2 #x2565) ; BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE
1136   (#xD3 #x2559) ; BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE
1137   (#xD4 #x2558) ; BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE
1138   (#xD5 #x2552) ; BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE
1139   (#xD6 #x2553) ; BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE
1140   (#xD7 #x256B) ; BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE
1141   (#xD8 #x256A) ; BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE
1142   (#xD9 #x2518) ; BOX DRAWINGS LIGHT UP AND LEFT
1143   (#xDA #x250C) ; BOX DRAWINGS LIGHT DOWN AND RIGHT
1144   (#xDB #x2588) ; FULL BLOCK
1145   (#xDC #x2584) ; LOWER HALF BLOCK
1146   (#xDD #x258C) ; LEFT HALF BLOCK
1147   (#xDE #x2590) ; RIGHT HALF BLOCK
1148   (#xDF #x2580) ; UPPER HALF BLOCK
1149   (#xE0 #x03B1) ; GREEK SMALL LETTER ALPHA
1150   (#xE1 #x00DF) ; LATIN SMALL LETTER SHARP S
1151   (#xE2 #x0393) ; GREEK CAPITAL LETTER GAMMA
1152   (#xE3 #x03C0) ; GREEK SMALL LETTER PI
1153   (#xE4 #x03A3) ; GREEK CAPITAL LETTER SIGMA
1154   (#xE5 #x03C3) ; GREEK SMALL LETTER SIGMA
1155   (#xE6 #x00B5) ; MICRO SIGN
1156   (#xE7 #x03C4) ; GREEK SMALL LETTER TAU
1157   (#xE8 #x03A6) ; GREEK CAPITAL LETTER PHI
1158   (#xE9 #x0398) ; GREEK CAPITAL LETTER THETA
1159   (#xEA #x03A9) ; GREEK CAPITAL LETTER OMEGA
1160   (#xEB #x03B4) ; GREEK SMALL LETTER DELTA
1161   (#xEC #x221E) ; INFINITY
1162   (#xED #x03C6) ; GREEK SMALL LETTER PHI
1163   (#xEE #x03B5) ; GREEK SMALL LETTER EPSILON
1164   (#xEF #x2229) ; INTERSECTION
1165   (#xF0 #x2261) ; IDENTICAL TO
1166   (#xF1 #x00B1) ; PLUS-MINUS SIGN
1167   (#xF2 #x2265) ; GREATER-THAN OR EQUAL TO
1168   (#xF3 #x2264) ; LESS-THAN OR EQUAL TO
1169   (#xF4 #x2320) ; TOP HALF INTEGRAL
1170   (#xF5 #x2321) ; BOTTOM HALF INTEGRAL
1171   (#xF6 #x00F7) ; DIVISION SIGN
1172   (#xF7 #x2248) ; ALMOST EQUAL TO
1173   (#xF8 #x00B0) ; DEGREE SIGN
1174   (#xF9 #x2219) ; BULLET OPERATOR
1175   (#xFA #x00B7) ; MIDDLE DOT
1176   (#xFB #x221A) ; SQUARE ROOT
1177   (#xFC #x207F) ; SUPERSCRIPT LATIN SMALL LETTER N
1178   (#xFD #x00B2) ; SUPERSCRIPT TWO
1179   (#xFE #x25A0) ; BLACK SQUARE
1180   (#xFF #x00A0) ; NO-BREAK SPACE
1181 )
1182
1183 (declaim (inline get-cp861-bytes))
1184 (defun get-cp861-bytes(string pos end)
1185   (declare (optimize speed (safety 0))
1186            (type simple-string string)
1187            (type array-range pos end))
1188   (get-latin-bytes #'identity :cp861 string pos end))
1189
1190 (defun string->cp861 (string sstart send null-padding)
1191   (declare (optimize speed (safety 0))
1192            (type simple-string string)
1193            (type array-range sstart send))
1194   (values (string->latin% string sstart send #'get-cp861-bytes null-padding)))
1195
1196 (defmacro define-cp861->string* (accessor type)
1197   (declare (ignore type))
1198   (let ((name (make-od-name 'cp861->string* accessor)))
1199     `(progn
1200       (defun ,name (string sstart send array astart aend)
1201         (,(make-od-name 'latin->string* accessor) string sstart send array astart aend #'identity)))))
1202
1203 (instantiate-octets-definition define-cp861->string*)
1204
1205 (defmacro define-cp861->string (accessor type)
1206   (declare (ignore type))
1207   `(defun ,(make-od-name 'cp861->string accessor) (array astart aend)
1208     (,(make-od-name 'latin->string accessor) array astart aend #'identity)))
1209
1210 (instantiate-octets-definition define-cp861->string)
1211
1212 (push '((:cp861 :|cp861|)
1213         cp861->string-aref string->cp861)
1214       *external-format-functions*)
1215
1216 (define-external-format (:cp861 :|cp861|)
1217     1 t
1218     (let ((cp861-byte (code->cp861-mapper bits)))
1219       (if cp861-byte
1220           (setf (sap-ref-8 sap tail) cp861-byte)
1221           (stream-encoding-error-and-handle stream bits)))
1222     (let ((code (cp861->code-mapper byte)))
1223       (if code
1224           (code-char code)
1225           (stream-decoding-error stream byte)))) ;; TODO -- error check
1226
1227 (define-unibyte-mapper cp862->code-mapper code->cp862-mapper
1228   (#x80 #x05D0) ; HEBREW LETTER ALEF
1229   (#x81 #x05D1) ; HEBREW LETTER BET
1230   (#x82 #x05D2) ; HEBREW LETTER GIMEL
1231   (#x83 #x05D3) ; HEBREW LETTER DALET
1232   (#x84 #x05D4) ; HEBREW LETTER HE
1233   (#x85 #x05D5) ; HEBREW LETTER VAV
1234   (#x86 #x05D6) ; HEBREW LETTER ZAYIN
1235   (#x87 #x05D7) ; HEBREW LETTER HET
1236   (#x88 #x05D8) ; HEBREW LETTER TET
1237   (#x89 #x05D9) ; HEBREW LETTER YOD
1238   (#x8A #x05DA) ; HEBREW LETTER FINAL KAF
1239   (#x8B #x05DB) ; HEBREW LETTER KAF
1240   (#x8C #x05DC) ; HEBREW LETTER LAMED
1241   (#x8D #x05DD) ; HEBREW LETTER FINAL MEM
1242   (#x8E #x05DE) ; HEBREW LETTER MEM
1243   (#x8F #x05DF) ; HEBREW LETTER FINAL NUN
1244   (#x90 #x05E0) ; HEBREW LETTER NUN
1245   (#x91 #x05E1) ; HEBREW LETTER SAMEKH
1246   (#x92 #x05E2) ; HEBREW LETTER AYIN
1247   (#x93 #x05E3) ; HEBREW LETTER FINAL PE
1248   (#x94 #x05E4) ; HEBREW LETTER PE
1249   (#x95 #x05E5) ; HEBREW LETTER FINAL TSADI
1250   (#x96 #x05E6) ; HEBREW LETTER TSADI
1251   (#x97 #x05E7) ; HEBREW LETTER QOF
1252   (#x98 #x05E8) ; HEBREW LETTER RESH
1253   (#x99 #x05E9) ; HEBREW LETTER SHIN
1254   (#x9A #x05EA) ; HEBREW LETTER TAV
1255   (#x9B #x00A2) ; CENT SIGN
1256   (#x9C #x00A3) ; POUND SIGN
1257   (#x9D #x00A5) ; YEN SIGN
1258   (#x9E #x20A7) ; PESETA SIGN
1259   (#x9F #x0192) ; LATIN SMALL LETTER F WITH HOOK
1260   (#xA0 #x00E1) ; LATIN SMALL LETTER A WITH ACUTE
1261   (#xA1 #x00ED) ; LATIN SMALL LETTER I WITH ACUTE
1262   (#xA2 #x00F3) ; LATIN SMALL LETTER O WITH ACUTE
1263   (#xA3 #x00FA) ; LATIN SMALL LETTER U WITH ACUTE
1264   (#xA4 #x00F1) ; LATIN SMALL LETTER N WITH TILDE
1265   (#xA5 #x00D1) ; LATIN CAPITAL LETTER N WITH TILDE
1266   (#xA6 #x00AA) ; FEMININE ORDINAL INDICATOR
1267   (#xA7 #x00BA) ; MASCULINE ORDINAL INDICATOR
1268   (#xA8 #x00BF) ; INVERTED QUESTION MARK
1269   (#xA9 #x2310) ; REVERSED NOT SIGN
1270   (#xAA #x00AC) ; NOT SIGN
1271   (#xAB #x00BD) ; VULGAR FRACTION ONE HALF
1272   (#xAC #x00BC) ; VULGAR FRACTION ONE QUARTER
1273   (#xAD #x00A1) ; INVERTED EXCLAMATION MARK
1274   (#xAE #x00AB) ; LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
1275   (#xAF #x00BB) ; RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
1276   (#xB0 #x2591) ; LIGHT SHADE
1277   (#xB1 #x2592) ; MEDIUM SHADE
1278   (#xB2 #x2593) ; DARK SHADE
1279   (#xB3 #x2502) ; BOX DRAWINGS LIGHT VERTICAL
1280   (#xB4 #x2524) ; BOX DRAWINGS LIGHT VERTICAL AND LEFT
1281   (#xB5 #x2561) ; BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE
1282   (#xB6 #x2562) ; BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE
1283   (#xB7 #x2556) ; BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE
1284   (#xB8 #x2555) ; BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE
1285   (#xB9 #x2563) ; BOX DRAWINGS DOUBLE VERTICAL AND LEFT
1286   (#xBA #x2551) ; BOX DRAWINGS DOUBLE VERTICAL
1287   (#xBB #x2557) ; BOX DRAWINGS DOUBLE DOWN AND LEFT
1288   (#xBC #x255D) ; BOX DRAWINGS DOUBLE UP AND LEFT
1289   (#xBD #x255C) ; BOX DRAWINGS UP DOUBLE AND LEFT SINGLE
1290   (#xBE #x255B) ; BOX DRAWINGS UP SINGLE AND LEFT DOUBLE
1291   (#xBF #x2510) ; BOX DRAWINGS LIGHT DOWN AND LEFT
1292   (#xC0 #x2514) ; BOX DRAWINGS LIGHT UP AND RIGHT
1293   (#xC1 #x2534) ; BOX DRAWINGS LIGHT UP AND HORIZONTAL
1294   (#xC2 #x252C) ; BOX DRAWINGS LIGHT DOWN AND HORIZONTAL
1295   (#xC3 #x251C) ; BOX DRAWINGS LIGHT VERTICAL AND RIGHT
1296   (#xC4 #x2500) ; BOX DRAWINGS LIGHT HORIZONTAL
1297   (#xC5 #x253C) ; BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL
1298   (#xC6 #x255E) ; BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE
1299   (#xC7 #x255F) ; BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE
1300   (#xC8 #x255A) ; BOX DRAWINGS DOUBLE UP AND RIGHT
1301   (#xC9 #x2554) ; BOX DRAWINGS DOUBLE DOWN AND RIGHT
1302   (#xCA #x2569) ; BOX DRAWINGS DOUBLE UP AND HORIZONTAL
1303   (#xCB #x2566) ; BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL
1304   (#xCC #x2560) ; BOX DRAWINGS DOUBLE VERTICAL AND RIGHT
1305   (#xCD #x2550) ; BOX DRAWINGS DOUBLE HORIZONTAL
1306   (#xCE #x256C) ; BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL
1307   (#xCF #x2567) ; BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE
1308   (#xD0 #x2568) ; BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE
1309   (#xD1 #x2564) ; BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE
1310   (#xD2 #x2565) ; BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE
1311   (#xD3 #x2559) ; BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE
1312   (#xD4 #x2558) ; BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE
1313   (#xD5 #x2552) ; BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE
1314   (#xD6 #x2553) ; BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE
1315   (#xD7 #x256B) ; BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE
1316   (#xD8 #x256A) ; BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE
1317   (#xD9 #x2518) ; BOX DRAWINGS LIGHT UP AND LEFT
1318   (#xDA #x250C) ; BOX DRAWINGS LIGHT DOWN AND RIGHT
1319   (#xDB #x2588) ; FULL BLOCK
1320   (#xDC #x2584) ; LOWER HALF BLOCK
1321   (#xDD #x258C) ; LEFT HALF BLOCK
1322   (#xDE #x2590) ; RIGHT HALF BLOCK
1323   (#xDF #x2580) ; UPPER HALF BLOCK
1324   (#xE0 #x03B1) ; GREEK SMALL LETTER ALPHA
1325   (#xE1 #x00DF) ; LATIN SMALL LETTER SHARP S (GERMAN)
1326   (#xE2 #x0393) ; GREEK CAPITAL LETTER GAMMA
1327   (#xE3 #x03C0) ; GREEK SMALL LETTER PI
1328   (#xE4 #x03A3) ; GREEK CAPITAL LETTER SIGMA
1329   (#xE5 #x03C3) ; GREEK SMALL LETTER SIGMA
1330   (#xE6 #x00B5) ; MICRO SIGN
1331   (#xE7 #x03C4) ; GREEK SMALL LETTER TAU
1332   (#xE8 #x03A6) ; GREEK CAPITAL LETTER PHI
1333   (#xE9 #x0398) ; GREEK CAPITAL LETTER THETA
1334   (#xEA #x03A9) ; GREEK CAPITAL LETTER OMEGA
1335   (#xEB #x03B4) ; GREEK SMALL LETTER DELTA
1336   (#xEC #x221E) ; INFINITY
1337   (#xED #x03C6) ; GREEK SMALL LETTER PHI
1338   (#xEE #x03B5) ; GREEK SMALL LETTER EPSILON
1339   (#xEF #x2229) ; INTERSECTION
1340   (#xF0 #x2261) ; IDENTICAL TO
1341   (#xF1 #x00B1) ; PLUS-MINUS SIGN
1342   (#xF2 #x2265) ; GREATER-THAN OR EQUAL TO
1343   (#xF3 #x2264) ; LESS-THAN OR EQUAL TO
1344   (#xF4 #x2320) ; TOP HALF INTEGRAL
1345   (#xF5 #x2321) ; BOTTOM HALF INTEGRAL
1346   (#xF6 #x00F7) ; DIVISION SIGN
1347   (#xF7 #x2248) ; ALMOST EQUAL TO
1348   (#xF8 #x00B0) ; DEGREE SIGN
1349   (#xF9 #x2219) ; BULLET OPERATOR
1350   (#xFA #x00B7) ; MIDDLE DOT
1351   (#xFB #x221A) ; SQUARE ROOT
1352   (#xFC #x207F) ; SUPERSCRIPT LATIN SMALL LETTER N
1353   (#xFD #x00B2) ; SUPERSCRIPT TWO
1354   (#xFE #x25A0) ; BLACK SQUARE
1355   (#xFF #x00A0) ; NO-BREAK SPACE
1356 )
1357
1358 (declaim (inline get-cp862-bytes))
1359 (defun get-cp862-bytes(string pos end)
1360   (declare (optimize speed (safety 0))
1361            (type simple-string string)
1362            (type array-range pos end))
1363   (get-latin-bytes #'identity :cp862 string pos end))
1364
1365 (defun string->cp862 (string sstart send null-padding)
1366   (declare (optimize speed (safety 0))
1367            (type simple-string string)
1368            (type array-range sstart send))
1369   (values (string->latin% string sstart send #'get-cp862-bytes null-padding)))
1370
1371 (defmacro define-cp862->string* (accessor type)
1372   (declare (ignore type))
1373   (let ((name (make-od-name 'cp862->string* accessor)))
1374     `(progn
1375       (defun ,name (string sstart send array astart aend)
1376         (,(make-od-name 'latin->string* accessor) string sstart send array astart aend #'identity)))))
1377
1378 (instantiate-octets-definition define-cp862->string*)
1379
1380 (defmacro define-cp862->string (accessor type)
1381   (declare (ignore type))
1382   `(defun ,(make-od-name 'cp862->string accessor) (array astart aend)
1383     (,(make-od-name 'latin->string accessor) array astart aend #'identity)))
1384
1385 (instantiate-octets-definition define-cp862->string)
1386
1387 (push '((:cp862 :|cp862|)
1388         cp862->string-aref string->cp862)
1389       *external-format-functions*)
1390
1391 (define-external-format (:cp862 :|cp862|)
1392     1 t
1393     (let ((cp862-byte (code->cp862-mapper bits)))
1394       (if cp862-byte
1395           (setf (sap-ref-8 sap tail) cp862-byte)
1396           (stream-encoding-error-and-handle stream bits)))
1397     (let ((code (cp862->code-mapper byte)))
1398       (if code
1399           (code-char code)
1400           (stream-decoding-error stream byte)))) ;; TODO -- error check
1401
1402 (define-unibyte-mapper cp863->code-mapper code->cp863-mapper
1403   (#x80 #x00C7) ; LATIN CAPITAL LETTER C WITH CEDILLA
1404   (#x81 #x00FC) ; LATIN SMALL LETTER U WITH DIAERESIS
1405   (#x82 #x00E9) ; LATIN SMALL LETTER E WITH ACUTE
1406   (#x83 #x00E2) ; LATIN SMALL LETTER A WITH CIRCUMFLEX
1407   (#x84 #x00C2) ; LATIN CAPITAL LETTER A WITH CIRCUMFLEX
1408   (#x85 #x00E0) ; LATIN SMALL LETTER A WITH GRAVE
1409   (#x86 #x00B6) ; PILCROW SIGN
1410   (#x87 #x00E7) ; LATIN SMALL LETTER C WITH CEDILLA
1411   (#x88 #x00EA) ; LATIN SMALL LETTER E WITH CIRCUMFLEX
1412   (#x89 #x00EB) ; LATIN SMALL LETTER E WITH DIAERESIS
1413   (#x8A #x00E8) ; LATIN SMALL LETTER E WITH GRAVE
1414   (#x8B #x00EF) ; LATIN SMALL LETTER I WITH DIAERESIS
1415   (#x8C #x00EE) ; LATIN SMALL LETTER I WITH CIRCUMFLEX
1416   (#x8D #x2017) ; DOUBLE LOW LINE
1417   (#x8E #x00C0) ; LATIN CAPITAL LETTER A WITH GRAVE
1418   (#x8F #x00A7) ; SECTION SIGN
1419   (#x90 #x00C9) ; LATIN CAPITAL LETTER E WITH ACUTE
1420   (#x91 #x00C8) ; LATIN CAPITAL LETTER E WITH GRAVE
1421   (#x92 #x00CA) ; LATIN CAPITAL LETTER E WITH CIRCUMFLEX
1422   (#x93 #x00F4) ; LATIN SMALL LETTER O WITH CIRCUMFLEX
1423   (#x94 #x00CB) ; LATIN CAPITAL LETTER E WITH DIAERESIS
1424   (#x95 #x00CF) ; LATIN CAPITAL LETTER I WITH DIAERESIS
1425   (#x96 #x00FB) ; LATIN SMALL LETTER U WITH CIRCUMFLEX
1426   (#x97 #x00F9) ; LATIN SMALL LETTER U WITH GRAVE
1427   (#x98 #x00A4) ; CURRENCY SIGN
1428   (#x99 #x00D4) ; LATIN CAPITAL LETTER O WITH CIRCUMFLEX
1429   (#x9A #x00DC) ; LATIN CAPITAL LETTER U WITH DIAERESIS
1430   (#x9B #x00A2) ; CENT SIGN
1431   (#x9C #x00A3) ; POUND SIGN
1432   (#x9D #x00D9) ; LATIN CAPITAL LETTER U WITH GRAVE
1433   (#x9E #x00DB) ; LATIN CAPITAL LETTER U WITH CIRCUMFLEX
1434   (#x9F #x0192) ; LATIN SMALL LETTER F WITH HOOK
1435   (#xA0 #x00A6) ; BROKEN BAR
1436   (#xA1 #x00B4) ; ACUTE ACCENT
1437   (#xA2 #x00F3) ; LATIN SMALL LETTER O WITH ACUTE
1438   (#xA3 #x00FA) ; LATIN SMALL LETTER U WITH ACUTE
1439   (#xA4 #x00A8) ; DIAERESIS
1440   (#xA5 #x00B8) ; CEDILLA
1441   (#xA6 #x00B3) ; SUPERSCRIPT THREE
1442   (#xA7 #x00AF) ; MACRON
1443   (#xA8 #x00CE) ; LATIN CAPITAL LETTER I WITH CIRCUMFLEX
1444   (#xA9 #x2310) ; REVERSED NOT SIGN
1445   (#xAA #x00AC) ; NOT SIGN
1446   (#xAB #x00BD) ; VULGAR FRACTION ONE HALF
1447   (#xAC #x00BC) ; VULGAR FRACTION ONE QUARTER
1448   (#xAD #x00BE) ; VULGAR FRACTION THREE QUARTERS
1449   (#xAE #x00AB) ; LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
1450   (#xAF #x00BB) ; RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
1451   (#xB0 #x2591) ; LIGHT SHADE
1452   (#xB1 #x2592) ; MEDIUM SHADE
1453   (#xB2 #x2593) ; DARK SHADE
1454   (#xB3 #x2502) ; BOX DRAWINGS LIGHT VERTICAL
1455   (#xB4 #x2524) ; BOX DRAWINGS LIGHT VERTICAL AND LEFT
1456   (#xB5 #x2561) ; BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE
1457   (#xB6 #x2562) ; BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE
1458   (#xB7 #x2556) ; BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE
1459   (#xB8 #x2555) ; BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE
1460   (#xB9 #x2563) ; BOX DRAWINGS DOUBLE VERTICAL AND LEFT
1461   (#xBA #x2551) ; BOX DRAWINGS DOUBLE VERTICAL
1462   (#xBB #x2557) ; BOX DRAWINGS DOUBLE DOWN AND LEFT
1463   (#xBC #x255D) ; BOX DRAWINGS DOUBLE UP AND LEFT
1464   (#xBD #x255C) ; BOX DRAWINGS UP DOUBLE AND LEFT SINGLE
1465   (#xBE #x255B) ; BOX DRAWINGS UP SINGLE AND LEFT DOUBLE
1466   (#xBF #x2510) ; BOX DRAWINGS LIGHT DOWN AND LEFT
1467   (#xC0 #x2514) ; BOX DRAWINGS LIGHT UP AND RIGHT
1468   (#xC1 #x2534) ; BOX DRAWINGS LIGHT UP AND HORIZONTAL
1469   (#xC2 #x252C) ; BOX DRAWINGS LIGHT DOWN AND HORIZONTAL
1470   (#xC3 #x251C) ; BOX DRAWINGS LIGHT VERTICAL AND RIGHT
1471   (#xC4 #x2500) ; BOX DRAWINGS LIGHT HORIZONTAL
1472   (#xC5 #x253C) ; BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL
1473   (#xC6 #x255E) ; BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE
1474   (#xC7 #x255F) ; BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE
1475   (#xC8 #x255A) ; BOX DRAWINGS DOUBLE UP AND RIGHT
1476   (#xC9 #x2554) ; BOX DRAWINGS DOUBLE DOWN AND RIGHT
1477   (#xCA #x2569) ; BOX DRAWINGS DOUBLE UP AND HORIZONTAL
1478   (#xCB #x2566) ; BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL
1479   (#xCC #x2560) ; BOX DRAWINGS DOUBLE VERTICAL AND RIGHT
1480   (#xCD #x2550) ; BOX DRAWINGS DOUBLE HORIZONTAL
1481   (#xCE #x256C) ; BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL
1482   (#xCF #x2567) ; BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE
1483   (#xD0 #x2568) ; BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE
1484   (#xD1 #x2564) ; BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE
1485   (#xD2 #x2565) ; BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE
1486   (#xD3 #x2559) ; BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE
1487   (#xD4 #x2558) ; BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE
1488   (#xD5 #x2552) ; BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE
1489   (#xD6 #x2553) ; BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE
1490   (#xD7 #x256B) ; BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE
1491   (#xD8 #x256A) ; BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE
1492   (#xD9 #x2518) ; BOX DRAWINGS LIGHT UP AND LEFT
1493   (#xDA #x250C) ; BOX DRAWINGS LIGHT DOWN AND RIGHT
1494   (#xDB #x2588) ; FULL BLOCK
1495   (#xDC #x2584) ; LOWER HALF BLOCK
1496   (#xDD #x258C) ; LEFT HALF BLOCK
1497   (#xDE #x2590) ; RIGHT HALF BLOCK
1498   (#xDF #x2580) ; UPPER HALF BLOCK
1499   (#xE0 #x03B1) ; GREEK SMALL LETTER ALPHA
1500   (#xE1 #x00DF) ; LATIN SMALL LETTER SHARP S
1501   (#xE2 #x0393) ; GREEK CAPITAL LETTER GAMMA
1502   (#xE3 #x03C0) ; GREEK SMALL LETTER PI
1503   (#xE4 #x03A3) ; GREEK CAPITAL LETTER SIGMA
1504   (#xE5 #x03C3) ; GREEK SMALL LETTER SIGMA
1505   (#xE6 #x00B5) ; MICRO SIGN
1506   (#xE7 #x03C4) ; GREEK SMALL LETTER TAU
1507   (#xE8 #x03A6) ; GREEK CAPITAL LETTER PHI
1508   (#xE9 #x0398) ; GREEK CAPITAL LETTER THETA
1509   (#xEA #x03A9) ; GREEK CAPITAL LETTER OMEGA
1510   (#xEB #x03B4) ; GREEK SMALL LETTER DELTA
1511   (#xEC #x221E) ; INFINITY
1512   (#xED #x03C6) ; GREEK SMALL LETTER PHI
1513   (#xEE #x03B5) ; GREEK SMALL LETTER EPSILON
1514   (#xEF #x2229) ; INTERSECTION
1515   (#xF0 #x2261) ; IDENTICAL TO
1516   (#xF1 #x00B1) ; PLUS-MINUS SIGN
1517   (#xF2 #x2265) ; GREATER-THAN OR EQUAL TO
1518   (#xF3 #x2264) ; LESS-THAN OR EQUAL TO
1519   (#xF4 #x2320) ; TOP HALF INTEGRAL
1520   (#xF5 #x2321) ; BOTTOM HALF INTEGRAL
1521   (#xF6 #x00F7) ; DIVISION SIGN
1522   (#xF7 #x2248) ; ALMOST EQUAL TO
1523   (#xF8 #x00B0) ; DEGREE SIGN
1524   (#xF9 #x2219) ; BULLET OPERATOR
1525   (#xFA #x00B7) ; MIDDLE DOT
1526   (#xFB #x221A) ; SQUARE ROOT
1527   (#xFC #x207F) ; SUPERSCRIPT LATIN SMALL LETTER N
1528   (#xFD #x00B2) ; SUPERSCRIPT TWO
1529   (#xFE #x25A0) ; BLACK SQUARE
1530   (#xFF #x00A0) ; NO-BREAK SPACE
1531 )
1532
1533 (declaim (inline get-cp863-bytes))
1534 (defun get-cp863-bytes(string pos end)
1535   (declare (optimize speed (safety 0))
1536            (type simple-string string)
1537            (type array-range pos end))
1538   (get-latin-bytes #'identity :cp863 string pos end))
1539
1540 (defun string->cp863 (string sstart send null-padding)
1541   (declare (optimize speed (safety 0))
1542            (type simple-string string)
1543            (type array-range sstart send))
1544   (values (string->latin% string sstart send #'get-cp863-bytes null-padding)))
1545
1546 (defmacro define-cp863->string* (accessor type)
1547   (declare (ignore type))
1548   (let ((name (make-od-name 'cp863->string* accessor)))
1549     `(progn
1550       (defun ,name (string sstart send array astart aend)
1551         (,(make-od-name 'latin->string* accessor) string sstart send array astart aend #'identity)))))
1552
1553 (instantiate-octets-definition define-cp863->string*)
1554
1555 (defmacro define-cp863->string (accessor type)
1556   (declare (ignore type))
1557   `(defun ,(make-od-name 'cp863->string accessor) (array astart aend)
1558     (,(make-od-name 'latin->string accessor) array astart aend #'identity)))
1559
1560 (instantiate-octets-definition define-cp863->string)
1561
1562 (push '((:cp863 :|cp863|)
1563         cp863->string-aref string->cp863)
1564       *external-format-functions*)
1565
1566 (define-external-format (:cp863 :|cp863|)
1567     1 t
1568     (let ((cp863-byte (code->cp863-mapper bits)))
1569       (if cp863-byte
1570           (setf (sap-ref-8 sap tail) cp863-byte)
1571           (stream-encoding-error-and-handle stream bits)))
1572     (let ((code (cp863->code-mapper byte)))
1573       (if code
1574           (code-char code)
1575           (stream-decoding-error stream byte)))) ;; TODO -- error check
1576
1577 (define-unibyte-mapper cp864->code-mapper code->cp864-mapper
1578   (#x80 #x00B0) ; DEGREE SIGN
1579   (#x81 #x00B7) ; MIDDLE DOT
1580   (#x82 #x2219) ; BULLET OPERATOR
1581   (#x83 #x221A) ; SQUARE ROOT
1582   (#x84 #x2592) ; MEDIUM SHADE
1583   (#x85 #x2500) ; FORMS LIGHT HORIZONTAL
1584   (#x86 #x2502) ; FORMS LIGHT VERTICAL
1585   (#x87 #x253C) ; FORMS LIGHT VERTICAL AND HORIZONTAL
1586   (#x88 #x2524) ; FORMS LIGHT VERTICAL AND LEFT
1587   (#x89 #x252C) ; FORMS LIGHT DOWN AND HORIZONTAL
1588   (#x8A #x251C) ; FORMS LIGHT VERTICAL AND RIGHT
1589   (#x8B #x2534) ; FORMS LIGHT UP AND HORIZONTAL
1590   (#x8C #x2510) ; FORMS LIGHT DOWN AND LEFT
1591   (#x8D #x250C) ; FORMS LIGHT DOWN AND RIGHT
1592   (#x8E #x2514) ; FORMS LIGHT UP AND RIGHT
1593   (#x8F #x2518) ; FORMS LIGHT UP AND LEFT
1594   (#x90 #x03B2) ; GREEK SMALL BETA
1595   (#x91 #x221E) ; INFINITY
1596   (#x92 #x03C6) ; GREEK SMALL PHI
1597   (#x93 #x00B1) ; PLUS-OR-MINUS SIGN
1598   (#x94 #x00BD) ; FRACTION 1/2
1599   (#x95 #x00BC) ; FRACTION 1/4
1600   (#x96 #x2248) ; ALMOST EQUAL TO
1601   (#x97 #x00AB) ; LEFT POINTING GUILLEMET
1602   (#x98 #x00BB) ; RIGHT POINTING GUILLEMET
1603   (#x99 #xFEF7) ; ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE ISOLATED FORM
1604   (#x9A #xFEF8) ; ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE FINAL FORM
1605   (#x9B nil)
1606   (#x9C nil)
1607   (#x9D #xFEFB) ; ARABIC LIGATURE LAM WITH ALEF ISOLATED FORM
1608   (#x9E #xFEFC) ; ARABIC LIGATURE LAM WITH ALEF FINAL FORM
1609   (#x9F nil)
1610   (#xA1 #x00AD) ; SOFT HYPHEN
1611   (#xA2 #xFE82) ; ARABIC LETTER ALEF WITH MADDA ABOVE FINAL FORM
1612   (#xA5 #xFE84) ; ARABIC LETTER ALEF WITH HAMZA ABOVE FINAL FORM
1613   (#xA6 nil)
1614   (#xA7 nil)
1615   (#xA8 #xFE8E) ; ARABIC LETTER ALEF FINAL FORM
1616   (#xA9 #xFE8F) ; ARABIC LETTER BEH ISOLATED FORM
1617   (#xAA #xFE95) ; ARABIC LETTER TEH ISOLATED FORM
1618   (#xAB #xFE99) ; ARABIC LETTER THEH ISOLATED FORM
1619   (#xAC #x060C) ; ARABIC COMMA
1620   (#xAD #xFE9D) ; ARABIC LETTER JEEM ISOLATED FORM
1621   (#xAE #xFEA1) ; ARABIC LETTER HAH ISOLATED FORM
1622   (#xAF #xFEA5) ; ARABIC LETTER KHAH ISOLATED FORM
1623   (#xB0 #x0660) ; ARABIC-INDIC DIGIT ZERO
1624   (#xB1 #x0661) ; ARABIC-INDIC DIGIT ONE
1625   (#xB2 #x0662) ; ARABIC-INDIC DIGIT TWO
1626   (#xB3 #x0663) ; ARABIC-INDIC DIGIT THREE
1627   (#xB4 #x0664) ; ARABIC-INDIC DIGIT FOUR
1628   (#xB5 #x0665) ; ARABIC-INDIC DIGIT FIVE
1629   (#xB6 #x0666) ; ARABIC-INDIC DIGIT SIX
1630   (#xB7 #x0667) ; ARABIC-INDIC DIGIT SEVEN
1631   (#xB8 #x0668) ; ARABIC-INDIC DIGIT EIGHT
1632   (#xB9 #x0669) ; ARABIC-INDIC DIGIT NINE
1633   (#xBA #xFED1) ; ARABIC LETTER FEH ISOLATED FORM
1634   (#xBB #x061B) ; ARABIC SEMICOLON
1635   (#xBC #xFEB1) ; ARABIC LETTER SEEN ISOLATED FORM
1636   (#xBD #xFEB5) ; ARABIC LETTER SHEEN ISOLATED FORM
1637   (#xBE #xFEB9) ; ARABIC LETTER SAD ISOLATED FORM
1638   (#xBF #x061F) ; ARABIC QUESTION MARK
1639   (#xC0 #x00A2) ; CENT SIGN
1640   (#xC1 #xFE80) ; ARABIC LETTER HAMZA ISOLATED FORM
1641   (#xC2 #xFE81) ; ARABIC LETTER ALEF WITH MADDA ABOVE ISOLATED FORM
1642   (#xC3 #xFE83) ; ARABIC LETTER ALEF WITH HAMZA ABOVE ISOLATED FORM
1643   (#xC4 #xFE85) ; ARABIC LETTER WAW WITH HAMZA ABOVE ISOLATED FORM
1644   (#xC5 #xFECA) ; ARABIC LETTER AIN FINAL FORM
1645   (#xC6 #xFE8B) ; ARABIC LETTER YEH WITH HAMZA ABOVE INITIAL FORM
1646   (#xC7 #xFE8D) ; ARABIC LETTER ALEF ISOLATED FORM
1647   (#xC8 #xFE91) ; ARABIC LETTER BEH INITIAL FORM
1648   (#xC9 #xFE93) ; ARABIC LETTER TEH MARBUTA ISOLATED FORM
1649   (#xCA #xFE97) ; ARABIC LETTER TEH INITIAL FORM
1650   (#xCB #xFE9B) ; ARABIC LETTER THEH INITIAL FORM
1651   (#xCC #xFE9F) ; ARABIC LETTER JEEM INITIAL FORM
1652   (#xCD #xFEA3) ; ARABIC LETTER HAH INITIAL FORM
1653   (#xCE #xFEA7) ; ARABIC LETTER KHAH INITIAL FORM
1654   (#xCF #xFEA9) ; ARABIC LETTER DAL ISOLATED FORM
1655   (#xD0 #xFEAB) ; ARABIC LETTER THAL ISOLATED FORM
1656   (#xD1 #xFEAD) ; ARABIC LETTER REH ISOLATED FORM
1657   (#xD2 #xFEAF) ; ARABIC LETTER ZAIN ISOLATED FORM
1658   (#xD3 #xFEB3) ; ARABIC LETTER SEEN INITIAL FORM
1659   (#xD4 #xFEB7) ; ARABIC LETTER SHEEN INITIAL FORM
1660   (#xD5 #xFEBB) ; ARABIC LETTER SAD INITIAL FORM
1661   (#xD6 #xFEBF) ; ARABIC LETTER DAD INITIAL FORM
1662   (#xD7 #xFEC1) ; ARABIC LETTER TAH ISOLATED FORM
1663   (#xD8 #xFEC5) ; ARABIC LETTER ZAH ISOLATED FORM
1664   (#xD9 #xFECB) ; ARABIC LETTER AIN INITIAL FORM
1665   (#xDA #xFECF) ; ARABIC LETTER GHAIN INITIAL FORM
1666   (#xDB #x00A6) ; BROKEN VERTICAL BAR
1667   (#xDC #x00AC) ; NOT SIGN
1668   (#xDD #x00F7) ; DIVISION SIGN
1669   (#xDE #x00D7) ; MULTIPLICATION SIGN
1670   (#xDF #xFEC9) ; ARABIC LETTER AIN ISOLATED FORM
1671   (#xE0 #x0640) ; ARABIC TATWEEL
1672   (#xE1 #xFED3) ; ARABIC LETTER FEH INITIAL FORM
1673   (#xE2 #xFED7) ; ARABIC LETTER QAF INITIAL FORM
1674   (#xE3 #xFEDB) ; ARABIC LETTER KAF INITIAL FORM
1675   (#xE4 #xFEDF) ; ARABIC LETTER LAM INITIAL FORM
1676   (#xE5 #xFEE3) ; ARABIC LETTER MEEM INITIAL FORM
1677   (#xE6 #xFEE7) ; ARABIC LETTER NOON INITIAL FORM
1678   (#xE7 #xFEEB) ; ARABIC LETTER HEH INITIAL FORM
1679   (#xE8 #xFEED) ; ARABIC LETTER WAW ISOLATED FORM
1680   (#xE9 #xFEEF) ; ARABIC LETTER ALEF MAKSURA ISOLATED FORM
1681   (#xEA #xFEF3) ; ARABIC LETTER YEH INITIAL FORM
1682   (#xEB #xFEBD) ; ARABIC LETTER DAD ISOLATED FORM
1683   (#xEC #xFECC) ; ARABIC LETTER AIN MEDIAL FORM
1684   (#xED #xFECE) ; ARABIC LETTER GHAIN FINAL FORM
1685   (#xEE #xFECD) ; ARABIC LETTER GHAIN ISOLATED FORM
1686   (#xEF #xFEE1) ; ARABIC LETTER MEEM ISOLATED FORM
1687   (#xF0 #xFE7D) ; ARABIC SHADDA MEDIAL FORM
1688   (#xF1 #x0651) ; ARABIC SHADDAH
1689   (#xF2 #xFEE5) ; ARABIC LETTER NOON ISOLATED FORM
1690   (#xF3 #xFEE9) ; ARABIC LETTER HEH ISOLATED FORM
1691   (#xF4 #xFEEC) ; ARABIC LETTER HEH MEDIAL FORM
1692   (#xF5 #xFEF0) ; ARABIC LETTER ALEF MAKSURA FINAL FORM
1693   (#xF6 #xFEF2) ; ARABIC LETTER YEH FINAL FORM
1694   (#xF7 #xFED0) ; ARABIC LETTER GHAIN MEDIAL FORM
1695   (#xF8 #xFED5) ; ARABIC LETTER QAF ISOLATED FORM
1696   (#xF9 #xFEF5) ; ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE ISOLATED FORM
1697   (#xFA #xFEF6) ; ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE FINAL FORM
1698   (#xFB #xFEDD) ; ARABIC LETTER LAM ISOLATED FORM
1699   (#xFC #xFED9) ; ARABIC LETTER KAF ISOLATED FORM
1700   (#xFD #xFEF1) ; ARABIC LETTER YEH ISOLATED FORM
1701   (#xFE #x25A0) ; BLACK SQUARE
1702   (#xFF nil)
1703 )
1704
1705 (declaim (inline get-cp864-bytes))
1706 (defun get-cp864-bytes(string pos end)
1707   (declare (optimize speed (safety 0))
1708            (type simple-string string)
1709            (type array-range pos end))
1710   (get-latin-bytes #'identity :cp864 string pos end))
1711
1712 (defun string->cp864 (string sstart send null-padding)
1713   (declare (optimize speed (safety 0))
1714            (type simple-string string)
1715            (type array-range sstart send))
1716   (values (string->latin% string sstart send #'get-cp864-bytes null-padding)))
1717
1718 (defmacro define-cp864->string* (accessor type)
1719   (declare (ignore type))
1720   (let ((name (make-od-name 'cp864->string* accessor)))
1721     `(progn
1722       (defun ,name (string sstart send array astart aend)
1723         (,(make-od-name 'latin->string* accessor) string sstart send array astart aend #'identity)))))
1724
1725 (instantiate-octets-definition define-cp864->string*)
1726
1727 (defmacro define-cp864->string (accessor type)
1728   (declare (ignore type))
1729   `(defun ,(make-od-name 'cp864->string accessor) (array astart aend)
1730     (,(make-od-name 'latin->string accessor) array astart aend #'identity)))
1731
1732 (instantiate-octets-definition define-cp864->string)
1733
1734 (push '((:cp864 :|cp864|)
1735         cp864->string-aref string->cp864)
1736       *external-format-functions*)
1737
1738 (define-external-format (:cp864 :|cp864|)
1739     1 t
1740     (let ((cp864-byte (code->cp864-mapper bits)))
1741       (if cp864-byte
1742           (setf (sap-ref-8 sap tail) cp864-byte)
1743           (stream-encoding-error-and-handle stream bits)))
1744     (let ((code (cp864->code-mapper byte)))
1745       (if code
1746           (code-char code)
1747           (stream-decoding-error stream byte)))) ;; TODO -- error check
1748
1749 (define-unibyte-mapper cp865->code-mapper code->cp865-mapper
1750   (#x80 #x00C7) ; LATIN CAPITAL LETTER C WITH CEDILLA
1751   (#x81 #x00FC) ; LATIN SMALL LETTER U WITH DIAERESIS
1752   (#x82 #x00E9) ; LATIN SMALL LETTER E WITH ACUTE
1753   (#x83 #x00E2) ; LATIN SMALL LETTER A WITH CIRCUMFLEX
1754   (#x84 #x00E4) ; LATIN SMALL LETTER A WITH DIAERESIS
1755   (#x85 #x00E0) ; LATIN SMALL LETTER A WITH GRAVE
1756   (#x86 #x00E5) ; LATIN SMALL LETTER A WITH RING ABOVE
1757   (#x87 #x00E7) ; LATIN SMALL LETTER C WITH CEDILLA
1758   (#x88 #x00EA) ; LATIN SMALL LETTER E WITH CIRCUMFLEX
1759   (#x89 #x00EB) ; LATIN SMALL LETTER E WITH DIAERESIS
1760   (#x8A #x00E8) ; LATIN SMALL LETTER E WITH GRAVE
1761   (#x8B #x00EF) ; LATIN SMALL LETTER I WITH DIAERESIS
1762   (#x8C #x00EE) ; LATIN SMALL LETTER I WITH CIRCUMFLEX
1763   (#x8D #x00EC) ; LATIN SMALL LETTER I WITH GRAVE
1764   (#x8E #x00C4) ; LATIN CAPITAL LETTER A WITH DIAERESIS
1765   (#x8F #x00C5) ; LATIN CAPITAL LETTER A WITH RING ABOVE
1766   (#x90 #x00C9) ; LATIN CAPITAL LETTER E WITH ACUTE
1767   (#x91 #x00E6) ; LATIN SMALL LIGATURE AE
1768   (#x92 #x00C6) ; LATIN CAPITAL LIGATURE AE
1769   (#x93 #x00F4) ; LATIN SMALL LETTER O WITH CIRCUMFLEX
1770   (#x94 #x00F6) ; LATIN SMALL LETTER O WITH DIAERESIS
1771   (#x95 #x00F2) ; LATIN SMALL LETTER O WITH GRAVE
1772   (#x96 #x00FB) ; LATIN SMALL LETTER U WITH CIRCUMFLEX
1773   (#x97 #x00F9) ; LATIN SMALL LETTER U WITH GRAVE
1774   (#x98 #x00FF) ; LATIN SMALL LETTER Y WITH DIAERESIS
1775   (#x99 #x00D6) ; LATIN CAPITAL LETTER O WITH DIAERESIS
1776   (#x9A #x00DC) ; LATIN CAPITAL LETTER U WITH DIAERESIS
1777   (#x9B #x00F8) ; LATIN SMALL LETTER O WITH STROKE
1778   (#x9C #x00A3) ; POUND SIGN
1779   (#x9D #x00D8) ; LATIN CAPITAL LETTER O WITH STROKE
1780   (#x9E #x20A7) ; PESETA SIGN
1781   (#x9F #x0192) ; LATIN SMALL LETTER F WITH HOOK
1782   (#xA0 #x00E1) ; LATIN SMALL LETTER A WITH ACUTE
1783   (#xA1 #x00ED) ; LATIN SMALL LETTER I WITH ACUTE
1784   (#xA2 #x00F3) ; LATIN SMALL LETTER O WITH ACUTE
1785   (#xA3 #x00FA) ; LATIN SMALL LETTER U WITH ACUTE
1786   (#xA4 #x00F1) ; LATIN SMALL LETTER N WITH TILDE
1787   (#xA5 #x00D1) ; LATIN CAPITAL LETTER N WITH TILDE
1788   (#xA6 #x00AA) ; FEMININE ORDINAL INDICATOR
1789   (#xA7 #x00BA) ; MASCULINE ORDINAL INDICATOR
1790   (#xA8 #x00BF) ; INVERTED QUESTION MARK
1791   (#xA9 #x2310) ; REVERSED NOT SIGN
1792   (#xAA #x00AC) ; NOT SIGN
1793   (#xAB #x00BD) ; VULGAR FRACTION ONE HALF
1794   (#xAC #x00BC) ; VULGAR FRACTION ONE QUARTER
1795   (#xAD #x00A1) ; INVERTED EXCLAMATION MARK
1796   (#xAE #x00AB) ; LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
1797   (#xAF #x00A4) ; CURRENCY SIGN
1798   (#xB0 #x2591) ; LIGHT SHADE
1799   (#xB1 #x2592) ; MEDIUM SHADE
1800   (#xB2 #x2593) ; DARK SHADE
1801   (#xB3 #x2502) ; BOX DRAWINGS LIGHT VERTICAL
1802   (#xB4 #x2524) ; BOX DRAWINGS LIGHT VERTICAL AND LEFT
1803   (#xB5 #x2561) ; BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE
1804   (#xB6 #x2562) ; BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE
1805   (#xB7 #x2556) ; BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE
1806   (#xB8 #x2555) ; BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE
1807   (#xB9 #x2563) ; BOX DRAWINGS DOUBLE VERTICAL AND LEFT
1808   (#xBA #x2551) ; BOX DRAWINGS DOUBLE VERTICAL
1809   (#xBB #x2557) ; BOX DRAWINGS DOUBLE DOWN AND LEFT
1810   (#xBC #x255D) ; BOX DRAWINGS DOUBLE UP AND LEFT
1811   (#xBD #x255C) ; BOX DRAWINGS UP DOUBLE AND LEFT SINGLE
1812   (#xBE #x255B) ; BOX DRAWINGS UP SINGLE AND LEFT DOUBLE
1813   (#xBF #x2510) ; BOX DRAWINGS LIGHT DOWN AND LEFT
1814   (#xC0 #x2514) ; BOX DRAWINGS LIGHT UP AND RIGHT
1815   (#xC1 #x2534) ; BOX DRAWINGS LIGHT UP AND HORIZONTAL
1816   (#xC2 #x252C) ; BOX DRAWINGS LIGHT DOWN AND HORIZONTAL
1817   (#xC3 #x251C) ; BOX DRAWINGS LIGHT VERTICAL AND RIGHT
1818   (#xC4 #x2500) ; BOX DRAWINGS LIGHT HORIZONTAL
1819   (#xC5 #x253C) ; BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL
1820   (#xC6 #x255E) ; BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE
1821   (#xC7 #x255F) ; BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE
1822   (#xC8 #x255A) ; BOX DRAWINGS DOUBLE UP AND RIGHT
1823   (#xC9 #x2554) ; BOX DRAWINGS DOUBLE DOWN AND RIGHT
1824   (#xCA #x2569) ; BOX DRAWINGS DOUBLE UP AND HORIZONTAL
1825   (#xCB #x2566) ; BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL
1826   (#xCC #x2560) ; BOX DRAWINGS DOUBLE VERTICAL AND RIGHT
1827   (#xCD #x2550) ; BOX DRAWINGS DOUBLE HORIZONTAL
1828   (#xCE #x256C) ; BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL
1829   (#xCF #x2567) ; BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE
1830   (#xD0 #x2568) ; BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE
1831   (#xD1 #x2564) ; BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE
1832   (#xD2 #x2565) ; BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE
1833   (#xD3 #x2559) ; BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE
1834   (#xD4 #x2558) ; BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE
1835   (#xD5 #x2552) ; BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE
1836   (#xD6 #x2553) ; BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE
1837   (#xD7 #x256B) ; BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE
1838   (#xD8 #x256A) ; BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE
1839   (#xD9 #x2518) ; BOX DRAWINGS LIGHT UP AND LEFT
1840   (#xDA #x250C) ; BOX DRAWINGS LIGHT DOWN AND RIGHT
1841   (#xDB #x2588) ; FULL BLOCK
1842   (#xDC #x2584) ; LOWER HALF BLOCK
1843   (#xDD #x258C) ; LEFT HALF BLOCK
1844   (#xDE #x2590) ; RIGHT HALF BLOCK
1845   (#xDF #x2580) ; UPPER HALF BLOCK
1846   (#xE0 #x03B1) ; GREEK SMALL LETTER ALPHA
1847   (#xE1 #x00DF) ; LATIN SMALL LETTER SHARP S
1848   (#xE2 #x0393) ; GREEK CAPITAL LETTER GAMMA
1849   (#xE3 #x03C0) ; GREEK SMALL LETTER PI
1850   (#xE4 #x03A3) ; GREEK CAPITAL LETTER SIGMA
1851   (#xE5 #x03C3) ; GREEK SMALL LETTER SIGMA
1852   (#xE6 #x00B5) ; MICRO SIGN
1853   (#xE7 #x03C4) ; GREEK SMALL LETTER TAU
1854   (#xE8 #x03A6) ; GREEK CAPITAL LETTER PHI
1855   (#xE9 #x0398) ; GREEK CAPITAL LETTER THETA
1856   (#xEA #x03A9) ; GREEK CAPITAL LETTER OMEGA
1857   (#xEB #x03B4) ; GREEK SMALL LETTER DELTA
1858   (#xEC #x221E) ; INFINITY
1859   (#xED #x03C6) ; GREEK SMALL LETTER PHI
1860   (#xEE #x03B5) ; GREEK SMALL LETTER EPSILON
1861   (#xEF #x2229) ; INTERSECTION
1862   (#xF0 #x2261) ; IDENTICAL TO
1863   (#xF1 #x00B1) ; PLUS-MINUS SIGN
1864   (#xF2 #x2265) ; GREATER-THAN OR EQUAL TO
1865   (#xF3 #x2264) ; LESS-THAN OR EQUAL TO
1866   (#xF4 #x2320) ; TOP HALF INTEGRAL
1867   (#xF5 #x2321) ; BOTTOM HALF INTEGRAL
1868   (#xF6 #x00F7) ; DIVISION SIGN
1869   (#xF7 #x2248) ; ALMOST EQUAL TO
1870   (#xF8 #x00B0) ; DEGREE SIGN
1871   (#xF9 #x2219) ; BULLET OPERATOR
1872   (#xFA #x00B7) ; MIDDLE DOT
1873   (#xFB #x221A) ; SQUARE ROOT
1874   (#xFC #x207F) ; SUPERSCRIPT LATIN SMALL LETTER N
1875   (#xFD #x00B2) ; SUPERSCRIPT TWO
1876   (#xFE #x25A0) ; BLACK SQUARE
1877   (#xFF #x00A0) ; NO-BREAK SPACE
1878 )
1879
1880 (declaim (inline get-cp865-bytes))
1881 (defun get-cp865-bytes(string pos end)
1882   (declare (optimize speed (safety 0))
1883            (type simple-string string)
1884            (type array-range pos end))
1885   (get-latin-bytes #'identity :cp865 string pos end))
1886
1887 (defun string->cp865 (string sstart send null-padding)
1888   (declare (optimize speed (safety 0))
1889            (type simple-string string)
1890            (type array-range sstart send))
1891   (values (string->latin% string sstart send #'get-cp865-bytes null-padding)))
1892
1893 (defmacro define-cp865->string* (accessor type)
1894   (declare (ignore type))
1895   (let ((name (make-od-name 'cp865->string* accessor)))
1896     `(progn
1897       (defun ,name (string sstart send array astart aend)
1898         (,(make-od-name 'latin->string* accessor) string sstart send array astart aend #'identity)))))
1899
1900 (instantiate-octets-definition define-cp865->string*)
1901
1902 (defmacro define-cp865->string (accessor type)
1903   (declare (ignore type))
1904   `(defun ,(make-od-name 'cp865->string accessor) (array astart aend)
1905     (,(make-od-name 'latin->string accessor) array astart aend #'identity)))
1906
1907 (instantiate-octets-definition define-cp865->string)
1908
1909 (push '((:cp865 :|cp865|)
1910         cp865->string-aref string->cp865)
1911       *external-format-functions*)
1912
1913 (define-external-format (:cp865 :|cp865|)
1914     1 t
1915     (let ((cp865-byte (code->cp865-mapper bits)))
1916       (if cp865-byte
1917           (setf (sap-ref-8 sap tail) cp865-byte)
1918           (stream-encoding-error-and-handle stream bits)))
1919     (let ((code (cp865->code-mapper byte)))
1920       (if code
1921           (code-char code)
1922           (stream-decoding-error stream byte)))) ;; TODO -- error check
1923
1924 (define-unibyte-mapper cp866->code-mapper code->cp866-mapper
1925   (#x80 #x0410) ; CYRILLIC CAPITAL LETTER A
1926   (#x81 #x0411) ; CYRILLIC CAPITAL LETTER BE
1927   (#x82 #x0412) ; CYRILLIC CAPITAL LETTER VE
1928   (#x83 #x0413) ; CYRILLIC CAPITAL LETTER GHE
1929   (#x84 #x0414) ; CYRILLIC CAPITAL LETTER DE
1930   (#x85 #x0415) ; CYRILLIC CAPITAL LETTER IE
1931   (#x86 #x0416) ; CYRILLIC CAPITAL LETTER ZHE
1932   (#x87 #x0417) ; CYRILLIC CAPITAL LETTER ZE
1933   (#x88 #x0418) ; CYRILLIC CAPITAL LETTER I
1934   (#x89 #x0419) ; CYRILLIC CAPITAL LETTER SHORT I
1935   (#x8A #x041A) ; CYRILLIC CAPITAL LETTER KA
1936   (#x8B #x041B) ; CYRILLIC CAPITAL LETTER EL
1937   (#x8C #x041C) ; CYRILLIC CAPITAL LETTER EM
1938   (#x8D #x041D) ; CYRILLIC CAPITAL LETTER EN
1939   (#x8E #x041E) ; CYRILLIC CAPITAL LETTER O
1940   (#x8F #x041F) ; CYRILLIC CAPITAL LETTER PE
1941   (#x90 #x0420) ; CYRILLIC CAPITAL LETTER ER
1942   (#x91 #x0421) ; CYRILLIC CAPITAL LETTER ES
1943   (#x92 #x0422) ; CYRILLIC CAPITAL LETTER TE
1944   (#x93 #x0423) ; CYRILLIC CAPITAL LETTER U
1945   (#x94 #x0424) ; CYRILLIC CAPITAL LETTER EF
1946   (#x95 #x0425) ; CYRILLIC CAPITAL LETTER HA
1947   (#x96 #x0426) ; CYRILLIC CAPITAL LETTER TSE
1948   (#x97 #x0427) ; CYRILLIC CAPITAL LETTER CHE
1949   (#x98 #x0428) ; CYRILLIC CAPITAL LETTER SHA
1950   (#x99 #x0429) ; CYRILLIC CAPITAL LETTER SHCHA
1951   (#x9A #x042A) ; CYRILLIC CAPITAL LETTER HARD SIGN
1952   (#x9B #x042B) ; CYRILLIC CAPITAL LETTER YERU
1953   (#x9C #x042C) ; CYRILLIC CAPITAL LETTER SOFT SIGN
1954   (#x9D #x042D) ; CYRILLIC CAPITAL LETTER E
1955   (#x9E #x042E) ; CYRILLIC CAPITAL LETTER YU
1956   (#x9F #x042F) ; CYRILLIC CAPITAL LETTER YA
1957   (#xA0 #x0430) ; CYRILLIC SMALL LETTER A
1958   (#xA1 #x0431) ; CYRILLIC SMALL LETTER BE
1959   (#xA2 #x0432) ; CYRILLIC SMALL LETTER VE
1960   (#xA3 #x0433) ; CYRILLIC SMALL LETTER GHE
1961   (#xA4 #x0434) ; CYRILLIC SMALL LETTER DE
1962   (#xA5 #x0435) ; CYRILLIC SMALL LETTER IE
1963   (#xA6 #x0436) ; CYRILLIC SMALL LETTER ZHE
1964   (#xA7 #x0437) ; CYRILLIC SMALL LETTER ZE
1965   (#xA8 #x0438) ; CYRILLIC SMALL LETTER I
1966   (#xA9 #x0439) ; CYRILLIC SMALL LETTER SHORT I
1967   (#xAA #x043A) ; CYRILLIC SMALL LETTER KA
1968   (#xAB #x043B) ; CYRILLIC SMALL LETTER EL
1969   (#xAC #x043C) ; CYRILLIC SMALL LETTER EM
1970   (#xAD #x043D) ; CYRILLIC SMALL LETTER EN
1971   (#xAE #x043E) ; CYRILLIC SMALL LETTER O
1972   (#xAF #x043F) ; CYRILLIC SMALL LETTER PE
1973   (#xB0 #x2591) ; LIGHT SHADE
1974   (#xB1 #x2592) ; MEDIUM SHADE
1975   (#xB2 #x2593) ; DARK SHADE
1976   (#xB3 #x2502) ; BOX DRAWINGS LIGHT VERTICAL
1977   (#xB4 #x2524) ; BOX DRAWINGS LIGHT VERTICAL AND LEFT
1978   (#xB5 #x2561) ; BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE
1979   (#xB6 #x2562) ; BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE
1980   (#xB7 #x2556) ; BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE
1981   (#xB8 #x2555) ; BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE
1982   (#xB9 #x2563) ; BOX DRAWINGS DOUBLE VERTICAL AND LEFT
1983   (#xBA #x2551) ; BOX DRAWINGS DOUBLE VERTICAL
1984   (#xBB #x2557) ; BOX DRAWINGS DOUBLE DOWN AND LEFT
1985   (#xBC #x255D) ; BOX DRAWINGS DOUBLE UP AND LEFT
1986   (#xBD #x255C) ; BOX DRAWINGS UP DOUBLE AND LEFT SINGLE
1987   (#xBE #x255B) ; BOX DRAWINGS UP SINGLE AND LEFT DOUBLE
1988   (#xBF #x2510) ; BOX DRAWINGS LIGHT DOWN AND LEFT
1989   (#xC0 #x2514) ; BOX DRAWINGS LIGHT UP AND RIGHT
1990   (#xC1 #x2534) ; BOX DRAWINGS LIGHT UP AND HORIZONTAL
1991   (#xC2 #x252C) ; BOX DRAWINGS LIGHT DOWN AND HORIZONTAL
1992   (#xC3 #x251C) ; BOX DRAWINGS LIGHT VERTICAL AND RIGHT
1993   (#xC4 #x2500) ; BOX DRAWINGS LIGHT HORIZONTAL
1994   (#xC5 #x253C) ; BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL
1995   (#xC6 #x255E) ; BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE
1996   (#xC7 #x255F) ; BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE
1997   (#xC8 #x255A) ; BOX DRAWINGS DOUBLE UP AND RIGHT
1998   (#xC9 #x2554) ; BOX DRAWINGS DOUBLE DOWN AND RIGHT
1999   (#xCA #x2569) ; BOX DRAWINGS DOUBLE UP AND HORIZONTAL
2000   (#xCB #x2566) ; BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL
2001   (#xCC #x2560) ; BOX DRAWINGS DOUBLE VERTICAL AND RIGHT
2002   (#xCD #x2550) ; BOX DRAWINGS DOUBLE HORIZONTAL
2003   (#xCE #x256C) ; BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL
2004   (#xCF #x2567) ; BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE
2005   (#xD0 #x2568) ; BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE
2006   (#xD1 #x2564) ; BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE
2007   (#xD2 #x2565) ; BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE
2008   (#xD3 #x2559) ; BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE
2009   (#xD4 #x2558) ; BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE
2010   (#xD5 #x2552) ; BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE
2011   (#xD6 #x2553) ; BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE
2012   (#xD7 #x256B) ; BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE
2013   (#xD8 #x256A) ; BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE
2014   (#xD9 #x2518) ; BOX DRAWINGS LIGHT UP AND LEFT
2015   (#xDA #x250C) ; BOX DRAWINGS LIGHT DOWN AND RIGHT
2016   (#xDB #x2588) ; FULL BLOCK
2017   (#xDC #x2584) ; LOWER HALF BLOCK
2018   (#xDD #x258C) ; LEFT HALF BLOCK
2019   (#xDE #x2590) ; RIGHT HALF BLOCK
2020   (#xDF #x2580) ; UPPER HALF BLOCK
2021   (#xE0 #x0440) ; CYRILLIC SMALL LETTER ER
2022   (#xE1 #x0441) ; CYRILLIC SMALL LETTER ES
2023   (#xE2 #x0442) ; CYRILLIC SMALL LETTER TE
2024   (#xE3 #x0443) ; CYRILLIC SMALL LETTER U
2025   (#xE4 #x0444) ; CYRILLIC SMALL LETTER EF
2026   (#xE5 #x0445) ; CYRILLIC SMALL LETTER HA
2027   (#xE6 #x0446) ; CYRILLIC SMALL LETTER TSE
2028   (#xE7 #x0447) ; CYRILLIC SMALL LETTER CHE
2029   (#xE8 #x0448) ; CYRILLIC SMALL LETTER SHA
2030   (#xE9 #x0449) ; CYRILLIC SMALL LETTER SHCHA
2031   (#xEA #x044A) ; CYRILLIC SMALL LETTER HARD SIGN
2032   (#xEB #x044B) ; CYRILLIC SMALL LETTER YERU
2033   (#xEC #x044C) ; CYRILLIC SMALL LETTER SOFT SIGN
2034   (#xED #x044D) ; CYRILLIC SMALL LETTER E
2035   (#xEE #x044E) ; CYRILLIC SMALL LETTER YU
2036   (#xEF #x044F) ; CYRILLIC SMALL LETTER YA
2037   (#xF0 #x0401) ; CYRILLIC CAPITAL LETTER IO
2038   (#xF1 #x0451) ; CYRILLIC SMALL LETTER IO
2039   (#xF2 #x0404) ; CYRILLIC CAPITAL LETTER UKRAINIAN IE
2040   (#xF3 #x0454) ; CYRILLIC SMALL LETTER UKRAINIAN IE
2041   (#xF4 #x0407) ; CYRILLIC CAPITAL LETTER YI
2042   (#xF5 #x0457) ; CYRILLIC SMALL LETTER YI
2043   (#xF6 #x040E) ; CYRILLIC CAPITAL LETTER SHORT U
2044   (#xF7 #x045E) ; CYRILLIC SMALL LETTER SHORT U
2045   (#xF8 #x00B0) ; DEGREE SIGN
2046   (#xF9 #x2219) ; BULLET OPERATOR
2047   (#xFA #x00B7) ; MIDDLE DOT
2048   (#xFB #x221A) ; SQUARE ROOT
2049   (#xFC #x2116) ; NUMERO SIGN
2050   (#xFD #x00A4) ; CURRENCY SIGN
2051   (#xFE #x25A0) ; BLACK SQUARE
2052   (#xFF #x00A0) ; NO-BREAK SPACE
2053 )
2054
2055 (declaim (inline get-cp866-bytes))
2056 (defun get-cp866-bytes(string pos end)
2057   (declare (optimize speed (safety 0))
2058            (type simple-string string)
2059            (type array-range pos end))
2060   (get-latin-bytes #'identity :cp866 string pos end))
2061
2062 (defun string->cp866 (string sstart send null-padding)
2063   (declare (optimize speed (safety 0))
2064            (type simple-string string)
2065            (type array-range sstart send))
2066   (values (string->latin% string sstart send #'get-cp866-bytes null-padding)))
2067
2068 (defmacro define-cp866->string* (accessor type)
2069   (declare (ignore type))
2070   (let ((name (make-od-name 'cp866->string* accessor)))
2071     `(progn
2072       (defun ,name (string sstart send array astart aend)
2073         (,(make-od-name 'latin->string* accessor) string sstart send array astart aend #'identity)))))
2074
2075 (instantiate-octets-definition define-cp866->string*)
2076
2077 (defmacro define-cp866->string (accessor type)
2078   (declare (ignore type))
2079   `(defun ,(make-od-name 'cp866->string accessor) (array astart aend)
2080     (,(make-od-name 'latin->string accessor) array astart aend #'identity)))
2081
2082 (instantiate-octets-definition define-cp866->string)
2083
2084 (push '((:cp866 :|cp866|)
2085         cp866->string-aref string->cp866)
2086       *external-format-functions*)
2087
2088 (define-external-format (:cp866 :|cp866|)
2089     1 t
2090     (let ((cp866-byte (code->cp866-mapper bits)))
2091       (if cp866-byte
2092           (setf (sap-ref-8 sap tail) cp866-byte)
2093           (stream-encoding-error-and-handle stream bits)))
2094     (let ((code (cp866->code-mapper byte)))
2095       (if code
2096           (code-char code)
2097           (stream-decoding-error stream byte)))) ;; TODO -- error check
2098
2099 (define-unibyte-mapper cp869->code-mapper code->cp869-mapper
2100   (#x80 nil)
2101   (#x81 nil)
2102   (#x82 nil)
2103   (#x83 nil)
2104   (#x84 nil)
2105   (#x85 nil)
2106   (#x86 #x0386) ; GREEK CAPITAL LETTER ALPHA WITH TONOS
2107   (#x87 nil)
2108   (#x88 #x00B7) ; MIDDLE DOT
2109   (#x89 #x00AC) ; NOT SIGN
2110   (#x8A #x00A6) ; BROKEN BAR
2111   (#x8B #x2018) ; LEFT SINGLE QUOTATION MARK
2112   (#x8C #x2019) ; RIGHT SINGLE QUOTATION MARK
2113   (#x8D #x0388) ; GREEK CAPITAL LETTER EPSILON WITH TONOS
2114   (#x8E #x2015) ; HORIZONTAL BAR
2115   (#x8F #x0389) ; GREEK CAPITAL LETTER ETA WITH TONOS
2116   (#x90 #x038A) ; GREEK CAPITAL LETTER IOTA WITH TONOS
2117   (#x91 #x03AA) ; GREEK CAPITAL LETTER IOTA WITH DIALYTIKA
2118   (#x92 #x038C) ; GREEK CAPITAL LETTER OMICRON WITH TONOS
2119   (#x93 nil)
2120   (#x94 nil)
2121   (#x95 #x038E) ; GREEK CAPITAL LETTER UPSILON WITH TONOS
2122   (#x96 #x03AB) ; GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA
2123   (#x97 #x00A9) ; COPYRIGHT SIGN
2124   (#x98 #x038F) ; GREEK CAPITAL LETTER OMEGA WITH TONOS
2125   (#x99 #x00B2) ; SUPERSCRIPT TWO
2126   (#x9A #x00B3) ; SUPERSCRIPT THREE
2127   (#x9B #x03AC) ; GREEK SMALL LETTER ALPHA WITH TONOS
2128   (#x9C #x00A3) ; POUND SIGN
2129   (#x9D #x03AD) ; GREEK SMALL LETTER EPSILON WITH TONOS
2130   (#x9E #x03AE) ; GREEK SMALL LETTER ETA WITH TONOS
2131   (#x9F #x03AF) ; GREEK SMALL LETTER IOTA WITH TONOS
2132   (#xA0 #x03CA) ; GREEK SMALL LETTER IOTA WITH DIALYTIKA
2133   (#xA1 #x0390) ; GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS
2134   (#xA2 #x03CC) ; GREEK SMALL LETTER OMICRON WITH TONOS
2135   (#xA3 #x03CD) ; GREEK SMALL LETTER UPSILON WITH TONOS
2136   (#xA4 #x0391) ; GREEK CAPITAL LETTER ALPHA
2137   (#xA5 #x0392) ; GREEK CAPITAL LETTER BETA
2138   (#xA6 #x0393) ; GREEK CAPITAL LETTER GAMMA
2139   (#xA7 #x0394) ; GREEK CAPITAL LETTER DELTA
2140   (#xA8 #x0395) ; GREEK CAPITAL LETTER EPSILON
2141   (#xA9 #x0396) ; GREEK CAPITAL LETTER ZETA
2142   (#xAA #x0397) ; GREEK CAPITAL LETTER ETA
2143   (#xAB #x00BD) ; VULGAR FRACTION ONE HALF
2144   (#xAC #x0398) ; GREEK CAPITAL LETTER THETA
2145   (#xAD #x0399) ; GREEK CAPITAL LETTER IOTA
2146   (#xAE #x00AB) ; LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
2147   (#xAF #x00BB) ; RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
2148   (#xB0 #x2591) ; LIGHT SHADE
2149   (#xB1 #x2592) ; MEDIUM SHADE
2150   (#xB2 #x2593) ; DARK SHADE
2151   (#xB3 #x2502) ; BOX DRAWINGS LIGHT VERTICAL
2152   (#xB4 #x2524) ; BOX DRAWINGS LIGHT VERTICAL AND LEFT
2153   (#xB5 #x039A) ; GREEK CAPITAL LETTER KAPPA
2154   (#xB6 #x039B) ; GREEK CAPITAL LETTER LAMDA
2155   (#xB7 #x039C) ; GREEK CAPITAL LETTER MU
2156   (#xB8 #x039D) ; GREEK CAPITAL LETTER NU
2157   (#xB9 #x2563) ; BOX DRAWINGS DOUBLE VERTICAL AND LEFT
2158   (#xBA #x2551) ; BOX DRAWINGS DOUBLE VERTICAL
2159   (#xBB #x2557) ; BOX DRAWINGS DOUBLE DOWN AND LEFT
2160   (#xBC #x255D) ; BOX DRAWINGS DOUBLE UP AND LEFT
2161   (#xBD #x039E) ; GREEK CAPITAL LETTER XI
2162   (#xBE #x039F) ; GREEK CAPITAL LETTER OMICRON
2163   (#xBF #x2510) ; BOX DRAWINGS LIGHT DOWN AND LEFT
2164   (#xC0 #x2514) ; BOX DRAWINGS LIGHT UP AND RIGHT
2165   (#xC1 #x2534) ; BOX DRAWINGS LIGHT UP AND HORIZONTAL
2166   (#xC2 #x252C) ; BOX DRAWINGS LIGHT DOWN AND HORIZONTAL
2167   (#xC3 #x251C) ; BOX DRAWINGS LIGHT VERTICAL AND RIGHT
2168   (#xC4 #x2500) ; BOX DRAWINGS LIGHT HORIZONTAL
2169   (#xC5 #x253C) ; BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL
2170   (#xC6 #x03A0) ; GREEK CAPITAL LETTER PI
2171   (#xC7 #x03A1) ; GREEK CAPITAL LETTER RHO
2172   (#xC8 #x255A) ; BOX DRAWINGS DOUBLE UP AND RIGHT
2173   (#xC9 #x2554) ; BOX DRAWINGS DOUBLE DOWN AND RIGHT
2174   (#xCA #x2569) ; BOX DRAWINGS DOUBLE UP AND HORIZONTAL
2175   (#xCB #x2566) ; BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL
2176   (#xCC #x2560) ; BOX DRAWINGS DOUBLE VERTICAL AND RIGHT
2177   (#xCD #x2550) ; BOX DRAWINGS DOUBLE HORIZONTAL
2178   (#xCE #x256C) ; BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL
2179   (#xCF #x03A3) ; GREEK CAPITAL LETTER SIGMA
2180   (#xD0 #x03A4) ; GREEK CAPITAL LETTER TAU
2181   (#xD1 #x03A5) ; GREEK CAPITAL LETTER UPSILON
2182   (#xD2 #x03A6) ; GREEK CAPITAL LETTER PHI
2183   (#xD3 #x03A7) ; GREEK CAPITAL LETTER CHI
2184   (#xD4 #x03A8) ; GREEK CAPITAL LETTER PSI
2185   (#xD5 #x03A9) ; GREEK CAPITAL LETTER OMEGA
2186   (#xD6 #x03B1) ; GREEK SMALL LETTER ALPHA
2187   (#xD7 #x03B2) ; GREEK SMALL LETTER BETA
2188   (#xD8 #x03B3) ; GREEK SMALL LETTER GAMMA
2189   (#xD9 #x2518) ; BOX DRAWINGS LIGHT UP AND LEFT
2190   (#xDA #x250C) ; BOX DRAWINGS LIGHT DOWN AND RIGHT
2191   (#xDB #x2588) ; FULL BLOCK
2192   (#xDC #x2584) ; LOWER HALF BLOCK
2193   (#xDD #x03B4) ; GREEK SMALL LETTER DELTA
2194   (#xDE #x03B5) ; GREEK SMALL LETTER EPSILON
2195   (#xDF #x2580) ; UPPER HALF BLOCK
2196   (#xE0 #x03B6) ; GREEK SMALL LETTER ZETA
2197   (#xE1 #x03B7) ; GREEK SMALL LETTER ETA
2198   (#xE2 #x03B8) ; GREEK SMALL LETTER THETA
2199   (#xE3 #x03B9) ; GREEK SMALL LETTER IOTA
2200   (#xE4 #x03BA) ; GREEK SMALL LETTER KAPPA
2201   (#xE5 #x03BB) ; GREEK SMALL LETTER LAMDA
2202   (#xE6 #x03BC) ; GREEK SMALL LETTER MU
2203   (#xE7 #x03BD) ; GREEK SMALL LETTER NU
2204   (#xE8 #x03BE) ; GREEK SMALL LETTER XI
2205   (#xE9 #x03BF) ; GREEK SMALL LETTER OMICRON
2206   (#xEA #x03C0) ; GREEK SMALL LETTER PI
2207   (#xEB #x03C1) ; GREEK SMALL LETTER RHO
2208   (#xEC #x03C3) ; GREEK SMALL LETTER SIGMA
2209   (#xED #x03C2) ; GREEK SMALL LETTER FINAL SIGMA
2210   (#xEE #x03C4) ; GREEK SMALL LETTER TAU
2211   (#xEF #x0384) ; GREEK TONOS
2212   (#xF0 #x00AD) ; SOFT HYPHEN
2213   (#xF1 #x00B1) ; PLUS-MINUS SIGN
2214   (#xF2 #x03C5) ; GREEK SMALL LETTER UPSILON
2215   (#xF3 #x03C6) ; GREEK SMALL LETTER PHI
2216   (#xF4 #x03C7) ; GREEK SMALL LETTER CHI
2217   (#xF5 #x00A7) ; SECTION SIGN
2218   (#xF6 #x03C8) ; GREEK SMALL LETTER PSI
2219   (#xF7 #x0385) ; GREEK DIALYTIKA TONOS
2220   (#xF8 #x00B0) ; DEGREE SIGN
2221   (#xF9 #x00A8) ; DIAERESIS
2222   (#xFA #x03C9) ; GREEK SMALL LETTER OMEGA
2223   (#xFB #x03CB) ; GREEK SMALL LETTER UPSILON WITH DIALYTIKA
2224   (#xFC #x03B0) ; GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS
2225   (#xFD #x03CE) ; GREEK SMALL LETTER OMEGA WITH TONOS
2226   (#xFE #x25A0) ; BLACK SQUARE
2227   (#xFF #x00A0) ; NO-BREAK SPACE
2228 )
2229
2230 (declaim (inline get-cp869-bytes))
2231 (defun get-cp869-bytes(string pos end)
2232   (declare (optimize speed (safety 0))
2233            (type simple-string string)
2234            (type array-range pos end))
2235   (get-latin-bytes #'identity :cp869 string pos end))
2236
2237 (defun string->cp869 (string sstart send null-padding)
2238   (declare (optimize speed (safety 0))
2239            (type simple-string string)
2240            (type array-range sstart send))
2241   (values (string->latin% string sstart send #'get-cp869-bytes null-padding)))
2242
2243 (defmacro define-cp869->string* (accessor type)
2244   (declare (ignore type))
2245   (let ((name (make-od-name 'cp869->string* accessor)))
2246     `(progn
2247       (defun ,name (string sstart send array astart aend)
2248         (,(make-od-name 'latin->string* accessor) string sstart send array astart aend #'identity)))))
2249
2250 (instantiate-octets-definition define-cp869->string*)
2251
2252 (defmacro define-cp869->string (accessor type)
2253   (declare (ignore type))
2254   `(defun ,(make-od-name 'cp869->string accessor) (array astart aend)
2255     (,(make-od-name 'latin->string accessor) array astart aend #'identity)))
2256
2257 (instantiate-octets-definition define-cp869->string)
2258
2259 (push '((:cp869 :|cp869|)
2260         cp869->string-aref string->cp869)
2261       *external-format-functions*)
2262
2263 (define-external-format (:cp869 :|cp869|)
2264     1 t
2265     (let ((cp869-byte (code->cp869-mapper bits)))
2266       (if cp869-byte
2267           (setf (sap-ref-8 sap tail) cp869-byte)
2268           (stream-encoding-error-and-handle stream bits)))
2269     (let ((code (cp869->code-mapper byte)))
2270       (if code
2271           (code-char code)
2272           (stream-decoding-error stream byte)))) ;; TODO -- error check
2273
2274 (define-unibyte-mapper cp874->code-mapper code->cp874-mapper
2275   (#x80 #x20AC) ; EURO SIGN
2276   (#x81 nil)
2277   (#x82 nil)
2278   (#x83 nil)
2279   (#x84 nil)
2280   (#x85 #x2026) ; HORIZONTAL ELLIPSIS
2281   (#x86 nil)
2282   (#x87 nil)
2283   (#x88 nil)
2284   (#x89 nil)
2285   (#x8A nil)
2286   (#x8B nil)
2287   (#x8C nil)
2288   (#x8D nil)
2289   (#x8E nil)
2290   (#x8F nil)
2291   (#x90 nil)
2292   (#x91 #x2018) ; LEFT SINGLE QUOTATION MARK
2293   (#x92 #x2019) ; RIGHT SINGLE QUOTATION MARK
2294   (#x93 #x201C) ; LEFT DOUBLE QUOTATION MARK
2295   (#x94 #x201D) ; RIGHT DOUBLE QUOTATION MARK
2296   (#x95 #x2022) ; BULLET
2297   (#x96 #x2013) ; EN DASH
2298   (#x97 #x2014) ; EM DASH
2299   (#x98 nil)
2300   (#x99 nil)
2301   (#x9A nil)
2302   (#x9B nil)
2303   (#x9C nil)
2304   (#x9D nil)
2305   (#x9E nil)
2306   (#x9F nil)
2307   (#xA1 #x0E01) ; THAI CHARACTER KO KAI
2308   (#xA2 #x0E02) ; THAI CHARACTER KHO KHAI
2309   (#xA3 #x0E03) ; THAI CHARACTER KHO KHUAT
2310   (#xA4 #x0E04) ; THAI CHARACTER KHO KHWAI
2311   (#xA5 #x0E05) ; THAI CHARACTER KHO KHON
2312   (#xA6 #x0E06) ; THAI CHARACTER KHO RAKHANG
2313   (#xA7 #x0E07) ; THAI CHARACTER NGO NGU
2314   (#xA8 #x0E08) ; THAI CHARACTER CHO CHAN
2315   (#xA9 #x0E09) ; THAI CHARACTER CHO CHING
2316   (#xAA #x0E0A) ; THAI CHARACTER CHO CHANG
2317   (#xAB #x0E0B) ; THAI CHARACTER SO SO
2318   (#xAC #x0E0C) ; THAI CHARACTER CHO CHOE
2319   (#xAD #x0E0D) ; THAI CHARACTER YO YING
2320   (#xAE #x0E0E) ; THAI CHARACTER DO CHADA
2321   (#xAF #x0E0F) ; THAI CHARACTER TO PATAK
2322   (#xB0 #x0E10) ; THAI CHARACTER THO THAN
2323   (#xB1 #x0E11) ; THAI CHARACTER THO NANGMONTHO
2324   (#xB2 #x0E12) ; THAI CHARACTER THO PHUTHAO
2325   (#xB3 #x0E13) ; THAI CHARACTER NO NEN
2326   (#xB4 #x0E14) ; THAI CHARACTER DO DEK
2327   (#xB5 #x0E15) ; THAI CHARACTER TO TAO
2328   (#xB6 #x0E16) ; THAI CHARACTER THO THUNG
2329   (#xB7 #x0E17) ; THAI CHARACTER THO THAHAN
2330   (#xB8 #x0E18) ; THAI CHARACTER THO THONG
2331   (#xB9 #x0E19) ; THAI CHARACTER NO NU
2332   (#xBA #x0E1A) ; THAI CHARACTER BO BAIMAI
2333   (#xBB #x0E1B) ; THAI CHARACTER PO PLA
2334   (#xBC #x0E1C) ; THAI CHARACTER PHO PHUNG
2335   (#xBD #x0E1D) ; THAI CHARACTER FO FA
2336   (#xBE #x0E1E) ; THAI CHARACTER PHO PHAN
2337   (#xBF #x0E1F) ; THAI CHARACTER FO FAN
2338   (#xC0 #x0E20) ; THAI CHARACTER PHO SAMPHAO
2339   (#xC1 #x0E21) ; THAI CHARACTER MO MA
2340   (#xC2 #x0E22) ; THAI CHARACTER YO YAK
2341   (#xC3 #x0E23) ; THAI CHARACTER RO RUA
2342   (#xC4 #x0E24) ; THAI CHARACTER RU
2343   (#xC5 #x0E25) ; THAI CHARACTER LO LING
2344   (#xC6 #x0E26) ; THAI CHARACTER LU
2345   (#xC7 #x0E27) ; THAI CHARACTER WO WAEN
2346   (#xC8 #x0E28) ; THAI CHARACTER SO SALA
2347   (#xC9 #x0E29) ; THAI CHARACTER SO RUSI
2348   (#xCA #x0E2A) ; THAI CHARACTER SO SUA
2349   (#xCB #x0E2B) ; THAI CHARACTER HO HIP
2350   (#xCC #x0E2C) ; THAI CHARACTER LO CHULA
2351   (#xCD #x0E2D) ; THAI CHARACTER O ANG
2352   (#xCE #x0E2E) ; THAI CHARACTER HO NOKHUK
2353   (#xCF #x0E2F) ; THAI CHARACTER PAIYANNOI
2354   (#xD0 #x0E30) ; THAI CHARACTER SARA A
2355   (#xD1 #x0E31) ; THAI CHARACTER MAI HAN-AKAT
2356   (#xD2 #x0E32) ; THAI CHARACTER SARA AA
2357   (#xD3 #x0E33) ; THAI CHARACTER SARA AM
2358   (#xD4 #x0E34) ; THAI CHARACTER SARA I
2359   (#xD5 #x0E35) ; THAI CHARACTER SARA II
2360   (#xD6 #x0E36) ; THAI CHARACTER SARA UE
2361   (#xD7 #x0E37) ; THAI CHARACTER SARA UEE
2362   (#xD8 #x0E38) ; THAI CHARACTER SARA U
2363   (#xD9 #x0E39) ; THAI CHARACTER SARA UU
2364   (#xDA #x0E3A) ; THAI CHARACTER PHINTHU
2365   (#xDB nil)
2366   (#xDC nil)
2367   (#xDD nil)
2368   (#xDE nil)
2369   (#xDF #x0E3F) ; THAI CURRENCY SYMBOL BAHT
2370   (#xE0 #x0E40) ; THAI CHARACTER SARA E
2371   (#xE1 #x0E41) ; THAI CHARACTER SARA AE
2372   (#xE2 #x0E42) ; THAI CHARACTER SARA O
2373   (#xE3 #x0E43) ; THAI CHARACTER SARA AI MAIMUAN
2374   (#xE4 #x0E44) ; THAI CHARACTER SARA AI MAIMALAI
2375   (#xE5 #x0E45) ; THAI CHARACTER LAKKHANGYAO
2376   (#xE6 #x0E46) ; THAI CHARACTER MAIYAMOK
2377   (#xE7 #x0E47) ; THAI CHARACTER MAITAIKHU
2378   (#xE8 #x0E48) ; THAI CHARACTER MAI EK
2379   (#xE9 #x0E49) ; THAI CHARACTER MAI THO
2380   (#xEA #x0E4A) ; THAI CHARACTER MAI TRI
2381   (#xEB #x0E4B) ; THAI CHARACTER MAI CHATTAWA
2382   (#xEC #x0E4C) ; THAI CHARACTER THANTHAKHAT
2383   (#xED #x0E4D) ; THAI CHARACTER NIKHAHIT
2384   (#xEE #x0E4E) ; THAI CHARACTER YAMAKKAN
2385   (#xEF #x0E4F) ; THAI CHARACTER FONGMAN
2386   (#xF0 #x0E50) ; THAI DIGIT ZERO
2387   (#xF1 #x0E51) ; THAI DIGIT ONE
2388   (#xF2 #x0E52) ; THAI DIGIT TWO
2389   (#xF3 #x0E53) ; THAI DIGIT THREE
2390   (#xF4 #x0E54) ; THAI DIGIT FOUR
2391   (#xF5 #x0E55) ; THAI DIGIT FIVE
2392   (#xF6 #x0E56) ; THAI DIGIT SIX
2393   (#xF7 #x0E57) ; THAI DIGIT SEVEN
2394   (#xF8 #x0E58) ; THAI DIGIT EIGHT
2395   (#xF9 #x0E59) ; THAI DIGIT NINE
2396   (#xFA #x0E5A) ; THAI CHARACTER ANGKHANKHU
2397   (#xFB #x0E5B) ; THAI CHARACTER KHOMUT
2398   (#xFC nil)
2399   (#xFD nil)
2400   (#xFE nil)
2401   (#xFF nil)
2402 )
2403
2404 (declaim (inline get-cp874-bytes))
2405 (defun get-cp874-bytes(string pos end)
2406   (declare (optimize speed (safety 0))
2407            (type simple-string string)
2408            (type array-range pos end))
2409   (get-latin-bytes #'identity :cp874 string pos end))
2410
2411 (defun string->cp874 (string sstart send null-padding)
2412   (declare (optimize speed (safety 0))
2413            (type simple-string string)
2414            (type array-range sstart send))
2415   (values (string->latin% string sstart send #'get-cp874-bytes null-padding)))
2416
2417 (defmacro define-cp874->string* (accessor type)
2418   (declare (ignore type))
2419   (let ((name (make-od-name 'cp874->string* accessor)))
2420     `(progn
2421       (defun ,name (string sstart send array astart aend)
2422         (,(make-od-name 'latin->string* accessor) string sstart send array astart aend #'identity)))))
2423
2424 (instantiate-octets-definition define-cp874->string*)
2425
2426 (defmacro define-cp874->string (accessor type)
2427   (declare (ignore type))
2428   `(defun ,(make-od-name 'cp874->string accessor) (array astart aend)
2429     (,(make-od-name 'latin->string accessor) array astart aend #'identity)))
2430
2431 (instantiate-octets-definition define-cp874->string)
2432
2433 (push '((:cp874 :|cp874|)
2434         cp874->string-aref string->cp874)
2435       *external-format-functions*)
2436
2437 (define-external-format (:cp874 :|cp874|)
2438     1 t
2439     (let ((cp874-byte (code->cp874-mapper bits)))
2440       (if cp874-byte
2441           (setf (sap-ref-8 sap tail) cp874-byte)
2442           (stream-encoding-error-and-handle stream bits)))
2443     (let ((code (cp874->code-mapper byte)))
2444       (if code
2445           (code-char code)
2446           (stream-decoding-error stream byte)))) ;; TODO -- error check