+ (external-format-decoding-error stream byte)))
+ iso-8859-14->string-aref
+ string->iso-8859-14) ;; TODO -- error check
+
+(define-unibyte-mapper
+ latin9->code-mapper
+ code->latin9-mapper
+ (#xA4 #x20AC)
+ (#xA6 #x0160)
+ (#xA8 #x0161)
+ (#xB4 #x017D)
+ (#xB8 #x017E)
+ (#xBC #x0152)
+ (#xBD #x0153)
+ (#xBE #x0178))
+
+(declaim (inline get-latin9-bytes))
+(defun get-latin9-bytes (string pos)
+ (declare (optimize speed (safety 0))
+ (type simple-string string)
+ (type array-range pos))
+ (get-latin-bytes #'code->latin9-mapper :latin-9 string pos))
+
+(defun string->latin9 (string sstart send null-padding)
+ (declare (optimize speed (safety 0))
+ (type simple-string string)
+ (type array-range sstart send))
+ (values (string->latin% string sstart send #'get-latin9-bytes null-padding)))
+
+(defmacro define-latin9->string* (accessor type)
+ (declare (ignore type))
+ (let ((name (make-od-name 'latin9->string* accessor)))
+ `(progn
+ (defun ,name (string sstart send array astart aend)
+ (,(make-od-name 'latin->string* accessor) string sstart send array astart aend #'latin9->code-mapper)))))
+(instantiate-octets-definition define-latin9->string*)
+
+(defmacro define-latin9->string (accessor type)
+ (declare (ignore type))
+ `(defun ,(make-od-name 'latin9->string accessor) (array astart aend)
+ (,(make-od-name 'latin->string accessor) array astart aend #'latin9->code-mapper)))
+ (instantiate-octets-definition define-latin9->string)
+
+;;; The names for latin9 are different due to a historical accident.
+(define-external-format (:latin-9 :latin9 :iso-8859-15 :iso8859-15)
+ 1 t
+ (let ((latin-9-byte (code->latin9-mapper bits)))
+ (if latin-9-byte
+ (setf (sap-ref-8 sap tail) latin-9-byte)
+ (external-format-encoding-error stream bits)))
+ (let ((code (latin9->code-mapper byte)))
+ (if code
+ (code-char code)
+ (external-format-decoding-error stream byte)))
+ latin9->string-aref
+ string->latin9)