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