From 1bf50bed96ec2e9ae37c1627f2b25fb9017d9ebc Mon Sep 17 00:00:00 2001 From: Juan Jose Garcia Ripoll Date: Thu, 8 Jan 2009 19:52:01 +0100 Subject: [PATCH] Added support for more complex character encodings (ISO-2022-JP) --- contrib/encodings/ISO-2022-JP | 55 +++++++++ contrib/encodings/ISO-2022-JP-1 | 57 ++++++++++ contrib/encodings/JISX0201.BIN | Bin 0 -> 634 bytes contrib/encodings/JISX0208.BIN | Bin 0 -> 27518 bytes contrib/encodings/JISX0212.BIN | Bin 0 -> 24270 bytes contrib/encodings/SHIFT-JIS.BIN | Bin 0 -> 28150 bytes contrib/encodings/generate.lisp | 133 ++-------------------- contrib/encodings/tools.lisp | 194 ++++++++++++++++++++++++++++++++ src/c/file.d | 108 ++++++++++++++++-- src/lsp/iolib.lsp | 4 +- 10 files changed, 419 insertions(+), 132 deletions(-) create mode 100644 contrib/encodings/ISO-2022-JP create mode 100644 contrib/encodings/ISO-2022-JP-1 create mode 100644 contrib/encodings/JISX0201.BIN create mode 100644 contrib/encodings/JISX0208.BIN create mode 100644 contrib/encodings/JISX0212.BIN create mode 100644 contrib/encodings/SHIFT-JIS.BIN create mode 100644 contrib/encodings/tools.lisp diff --git a/contrib/encodings/ISO-2022-JP b/contrib/encodings/ISO-2022-JP new file mode 100644 index 000000000..999ce3edc --- /dev/null +++ b/contrib/encodings/ISO-2022-JP @@ -0,0 +1,55 @@ +(cl:unless (cl:find-package :ISO-2022-JP) + (make-package :ISO-2022-JP)) +(in-package :ISO-2022-JP) + +(defun compose (bytes) + (loop for i in bytes + with cum = 0 + do (setf cum (+ (ash cum 8) i)) + finally (return cum))) + +(defun mapping-hash-table (sequence &optional (mask 0)) + (loop with hash = (make-hash-table :size (floor (* 1.5 (length sequence))) + :test 'eq) + for i from 0 below (length sequence) by 2 + for multibyte = (elt sequence i) + for codepoint = (elt sequence (1+ i)) + for unicode-char = (code-char codepoint) + when (zerop (logand multibyte mask)) + do (progn + (setf (gethash multibyte hash) unicode-char) + (setf (gethash unicode-char hash) multibyte) + (when (> multibyte #xFF) + (setf (gethash (ash multibyte -8) hash) t))) + finally (return hash))) + +(defun multimap (escapes tables) + (loop for seq in escapes + for table in tables + for table-cons = (member table tables :test 'eq) + do (progn + ;; Change escape sequence into byte codes + (setf seq (mapcar #'char-code seq)) + ;; Store it in the hash table + (setf (gethash t table) seq) + (loop for other-table in tables + do (loop for i from 1 + for precedings = (butlast seq i) + while precedings + do (setf (gethash (compose precedings) other-table) t) + finally (setf (gethash (compose seq) other-table) table-cons))))) + (nconc tables tables)) + +(defparameter ext::iso-2022-jp + (let* ((ascii-no-esc (mapping-hash-table (loop for i from 0 to 127 + unless (= i (char-code #\esc)) + nconc (list i i)))) + (jis208 (mapping-hash-table (ext::load-encoding :jisx0208) #x8080)) + (jis201 (mapping-hash-table (ext::load-encoding :jisx0201) #x80))) + (multimap '((#\Esc #\( #\B) + (#\Esc #\( #\J) + (#\Esc #\$ #\@) + (#\Esc #\$ #\B)) + (list ascii-no-esc jis201 jis208 jis208)))) + +(delete-package :ISO-2022-JP) diff --git a/contrib/encodings/ISO-2022-JP-1 b/contrib/encodings/ISO-2022-JP-1 new file mode 100644 index 000000000..aba8da88d --- /dev/null +++ b/contrib/encodings/ISO-2022-JP-1 @@ -0,0 +1,57 @@ +(cl:unless (cl:find-package :ISO-2022-JP-1) + (make-package :ISO-2022-JP-1)) +(in-package :ISO-2022-JP-1) + +(defun compose (bytes) + (loop for i in bytes + with cum = 0 + do (setf cum (+ (ash cum 8) i)) + finally (return cum))) + +(defun mapping-hash-table (sequence &optional (mask 0)) + (loop with hash = (make-hash-table :size (floor (* 1.5 (length sequence))) + :test 'eq) + for i from 0 below (length sequence) by 2 + for multibyte = (elt sequence i) + for codepoint = (elt sequence (1+ i)) + for unicode-char = (code-char codepoint) + when (zerop (logand multibyte mask)) + do (progn + (setf (gethash multibyte hash) unicode-char) + (setf (gethash unicode-char hash) multibyte) + (when (> multibyte #xFF) + (setf (gethash (ash multibyte -8) hash) t))) + finally (return hash))) + +(defun multimap (escapes tables) + (loop for seq in escapes + for table in tables + for table-cons = (member table tables :test 'eq) + do (progn + ;; Change escape sequence into byte codes + (setf seq (mapcar #'char-code seq)) + ;; Store it in the hash table + (setf (gethash t table) seq) + (loop for other-table in tables + do (loop for i from 1 + for precedings = (butlast seq i) + while precedings + do (setf (gethash (compose precedings) other-table) t) + finally (setf (gethash (compose seq) other-table) table-cons))))) + (nconc tables tables)) + +(defparameter ext::iso-2022-jp-1 + (let* ((ascii-no-esc (mapping-hash-table (loop for i from 0 to 127 + unless (= i (char-code #\esc)) + nconc (list i i)))) + (jis212 (mapping-hash-table (ext::load-encoding :jisx0212) #x8080)) + (jis208 (mapping-hash-table (ext::load-encoding :jisx0208) #x8080)) + (jis201 (mapping-hash-table (ext::load-encoding :jisx0201) #x80))) + (multimap '((#\Esc #\( #\B) + (#\Esc #\( #\J) + (#\Esc #\$ #\@) + (#\Esc #\$ #\B) + (#\Esc #\$ #\( #\D)) + (list ascii-no-esc jis201 jis208 jis208 jis212)))) + +(delete-package :ISO-2022-JP-1) diff --git a/contrib/encodings/JISX0201.BIN b/contrib/encodings/JISX0201.BIN new file mode 100644 index 0000000000000000000000000000000000000000..c66e30fb3b7871688f59dd5b8947d28054cbec90 GIT binary patch literal 634 zcmZRyVNhUDU{GXGWKd#IVo+vKW>8^JVNhjIWl&>KV^C*MXV75KV9;dHWYA*JV$f#L zX3$~KVbEpJWzb{LW6)>NXE0zeU@&AbWH4edVlZYfW-wteVK8MdWiVqfV=!khXRu(f zV6bGcWUykeVz6egX0TzfVX$SeWw2wgW3XqiXK-L}U~pt`WN>0|VsK_~W^iF}VQ^(| zWpHC~V{m71XYgR~VDMz{Wbk6}V(@10X7FL~Ven<}W$jUvt0$dJU4#E{I8%#gy6!jQ_4%87!H~(2$&kg6#gNUA&5*;8 z!;s66%aF&A$B@sE&rrZnz);9g$WX*k#8Avo%uvEm!cfXk%238o#!${s&QQTn!BELi z$xy{m#Zb*q%}~Qo!%)jm%TT9a$FT5!BEzEpNeqksCo?ShpTe;8e=5VW|7i@%|EDvo z_@BYB@_#17s{dIGtN&*+tofhAu=am0!@B=@4D0{rGi>-@z_9UuA;YHsMGTw&7c*@6 zU&65Ue<{PZ|78r@|CclD_+P=W^M577uK!gGyZ=`+?D=2Au=js0!@mD@4Ez7rGaUHe zz;N(?Bg3KpO$>+sH!~dh-@;I=S-1t9( j;pYFD47dKzVz~W(Hp89&a~SUapUZIX|2&5K|K|e$pO46j literal 0 HcmV?d00001 diff --git a/contrib/encodings/JISX0208.BIN b/contrib/encodings/JISX0208.BIN new file mode 100644 index 0000000000000000000000000000000000000000..3b3a15370de74e0e322e14c01391132c2d0ab61f GIT binary patch literal 27518 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 literal 0 HcmV?d00001 diff --git a/contrib/encodings/SHIFT-JIS.BIN b/contrib/encodings/SHIFT-JIS.BIN new file mode 100644 index 0000000000000000000000000000000000000000..9beafe5c9c48546639d818c1ee31c16659911e88 GIT binary patch literal 28150 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 literal 0 HcmV?d00001 diff --git a/contrib/encodings/generate.lisp b/contrib/encodings/generate.lisp index b7a93d630..95ad3f035 100644 --- a/contrib/encodings/generate.lisp +++ b/contrib/encodings/generate.lisp @@ -1,6 +1,6 @@ ;;; -*- Mode: Lisp; Syntax: Common-Lisp; -*- ;;; -;;; Copyright (c) 2009, Giuseppe Attardi. +;;; Copyright (c) 2009, Juan Jose Garcia-Ripoll ;;; ;;; This program is free software; you can redistribute it and/or ;;; modify it under the terms of the GNU Library General Public @@ -9,130 +9,18 @@ ;;; ;;; See file '../Copyright' for full details. -(defconstant +sequence-type+ '(unsigned-byte 16)) - -(defun read-mapping (url) - (let ((command (format nil "curl \"~A\" | sed '/^#.*$/d;s,0x,#x,g;s,U+\\([0-9A-Fa-f]*\\),#x\\1,g;s,#UNDEFINED,NIL # UNDEFINED,g;/LEAD BYTE/d' | grep -v '' | sed 's,# .*$,,g;/#x.*/!d' > tmp.txt" url))) - (unless (zerop (si::system command)) - (error "Unable to retrieve file ~A" url))) - (let ((mapping '())) - (with-open-file (s "tmp.txt" :direction :input :external-format :utf-8) - (loop for line = (read-line s nil nil) - while line - do (with-input-from-string (aux line) - (let ((byte 0) - (unicode 0)) - (when (and (setf byte (read aux nil nil)) - (setf unicode (read aux nil nil))) - (unless (and (typep byte +sequence-type+) - (typep unicode +sequence-type+)) - (error "Sequence type ~A is unable to capture this encoding (codes ~X and ~X found)" - +sequence-type+ byte unicode)) - (setf mapping (list* unicode byte mapping))))))) - (unless mapping - (error "Error reading file ~A" url)) - (si::system "rm -f tmp.txt") - (print (reduce #'max mapping :initial-value 0)) - (make-array (length mapping) :element-type +sequence-type+ :initial-contents (nreverse mapping)))) - -(defun generate-mapping (name url output-file) - (let* ((mapping (read-mapping url))) - (format t "~&;;; Generating ~A~%;;; ~Tfrom ~A" output-file url) - (force-output t) - (if (pathname-type output-file) - (with-open-file (s output-file :direction :output :if-exists :supersede - :element-type +sequence-type+ :external-format :big-endian) - (write-byte (length mapping) s) - (write-sequence mapping s)) - (with-open-file (s output-file :direction :output :if-exists :supersede) - (print mapping s))))) - -(defconstant +all-mappings+ - '(("ATARIST" "http://unicode.org/Public/MAPPINGS/VENDORS/MISC/ATARIST.TXT") - - ("ISO-8859-1" "http://unicode.org/Public/MAPPINGS/ISO8859/8859-1.TXT") - ("ISO-8859-2" "http://unicode.org/Public/MAPPINGS/ISO8859/8859-2.TXT") - ("ISO-8859-3" "http://unicode.org/Public/MAPPINGS/ISO8859/8859-3.TXT") - ("ISO-8859-4" "http://unicode.org/Public/MAPPINGS/ISO8859/8859-4.TXT") - ("ISO-8859-5" "http://unicode.org/Public/MAPPINGS/ISO8859/8859-5.TXT") - ("ISO-8859-6" "http://unicode.org/Public/MAPPINGS/ISO8859/8859-6.TXT") - ("ISO-8859-7" "http://unicode.org/Public/MAPPINGS/ISO8859/8859-7.TXT") - ("ISO-8859-8" "http://unicode.org/Public/MAPPINGS/ISO8859/8859-8.TXT") - ("ISO-8859-9" "http://unicode.org/Public/MAPPINGS/ISO8859/8859-9.TXT") - ("ISO-8859-10" "http://unicode.org/Public/MAPPINGS/ISO8859/8859-10.TXT") - ("ISO-8859-11" "http://unicode.org/Public/MAPPINGS/ISO8859/8859-11.TXT") - ("ISO-8859-13" "http://unicode.org/Public/MAPPINGS/ISO8859/8859-13.TXT") - ("ISO-8859-14" "http://unicode.org/Public/MAPPINGS/ISO8859/8859-14.TXT") - ("ISO-8859-15" "http://unicode.org/Public/MAPPINGS/ISO8859/8859-15.TXT") - ("ISO-8859-16" "http://unicode.org/Public/MAPPINGS/ISO8859/8859-16.TXT") - ("KOI8-R" "http://unicode.org/Public/MAPPINGS/VENDORS/MISC/KOI8-R.TXT") - ("KOI8-U" "http://unicode.org/Public/MAPPINGS/VENDORS/MISC/KOI8-U.TXT") - ("CP-856" "http://unicode.org/Public/MAPPINGS/VENDORS/MISC/CP856.TXT") - ("CP-856" "http://unicode.org/Public/MAPPINGS/VENDORS/MISC/CP856.TXT") - - ("DOS-CP437" "http://unicode.org/Public/MAPPINGS/VENDORS/MICSFT/PC/CP437.TXT") - ("DOS-CP737" "http://unicode.org/Public/MAPPINGS/VENDORS/MICSFT/PC/CP737.TXT") - ("DOS-CP775" "http://unicode.org/Public/MAPPINGS/VENDORS/MICSFT/PC/CP775.TXT") - ("DOS-CP850" "http://unicode.org/Public/MAPPINGS/VENDORS/MICSFT/PC/CP850.TXT") - ("DOS-CP852" "http://unicode.org/Public/MAPPINGS/VENDORS/MICSFT/PC/CP852.TXT") - ("DOS-CP855" "http://unicode.org/Public/MAPPINGS/VENDORS/MICSFT/PC/CP855.TXT") - ("DOS-CP857" "http://unicode.org/Public/MAPPINGS/VENDORS/MICSFT/PC/CP857.TXT") - ("DOS-CP860" "http://unicode.org/Public/MAPPINGS/VENDORS/MICSFT/PC/CP860.TXT") - ("DOS-CP861" "http://unicode.org/Public/MAPPINGS/VENDORS/MICSFT/PC/CP861.TXT") - ("DOS-CP862" "http://unicode.org/Public/MAPPINGS/VENDORS/MICSFT/PC/CP862.TXT") - ("DOS-CP863" "http://unicode.org/Public/MAPPINGS/VENDORS/MICSFT/PC/CP863.TXT") - ("DOS-CP864" "http://unicode.org/Public/MAPPINGS/VENDORS/MICSFT/PC/CP864.TXT") - ("DOS-CP865" "http://unicode.org/Public/MAPPINGS/VENDORS/MICSFT/PC/CP865.TXT") - ("DOS-CP866" "http://unicode.org/Public/MAPPINGS/VENDORS/MICSFT/PC/CP866.TXT") - ("DOS-CP869" "http://unicode.org/Public/MAPPINGS/VENDORS/MICSFT/PC/CP869.TXT") - ("DOS-CP874" "http://unicode.org/Public/MAPPINGS/VENDORS/MICSFT/PC/CP874.TXT") - - ; Redundant WINDOWS-CP874 DOS-CP874 - ;("WINDOWS-CP874" "http://unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WINDOWS/CP874.TXT") - - ("WINDOWS-CP932" "http://unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WINDOWS/CP932.TXT" "BIN") - ("WINDOWS-CP936" "http://unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WINDOWS/CP936.TXT" "BIN") - ("WINDOWS-CP949" "http://unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WINDOWS/CP949.TXT" "BIN") - ("WINDOWS-CP950" "http://unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WINDOWS/CP950.TXT" "BIN") - - ("WINDOWS-CP1250" "http://unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WINDOWS/CP1250.TXT") - ("WINDOWS-CP1251" "http://unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WINDOWS/CP1251.TXT") - ("WINDOWS-CP1252" "http://unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WINDOWS/CP1252.TXT") - ("WINDOWS-CP1253" "http://unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WINDOWS/CP1253.TXT") - ("WINDOWS-CP1254" "http://unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WINDOWS/CP1254.TXT") - ("WINDOWS-CP1255" "http://unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WINDOWS/CP1255.TXT") - ("WINDOWS-CP1256" "http://unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WINDOWS/CP1256.TXT") - ("WINDOWS-CP1257" "http://unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WINDOWS/CP1257.TXT") - ("WINDOWS-CP1258" "http://unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WINDOWS/CP1258.TXT") - - ;("JISX0201" "http://unicode.org/Public/MAPPINGS/OBSOLETE/EASTASIA/JIS/JIS0201.TXT") - ;("JISX0212" "http://unicode.org/Public/MAPPINGS/OBSOLETE/EASTASIA/JIS/JIS0212.TXT") - ;("SHIFT-JIS" "http://unicode.org/Public/MAPPINGS/OBSOLETE/EASTASIA/JIS/SHIFTJIS.TXT") - - ;Unable to parse because they output more than one Unicode character - ;("SJIS-0213" "http://x0213.org/codetable/sjis-0213-2004-std.txt") - ;("EUC-JISX0213" "http://x0213.org/codetable/euc-jis") - )) - -(defun copy-file (in out) - (let ((buffer (make-array 8192 :element-type '(unsigned-byte 8)))) - (format t "~%;;; Copying ~A to ~A" in out) - (with-open-file (sin in :direction :input :element-type '(unsigned-byte 8)) - (with-open-file (sout out :direction :output :element-type '(unsigned-byte 8) - :if-exists :supersede :if-does-not-exist :create) - (loop for nbytes = (read-sequence buffer sin) - until (zerop nbytes) - do (write-sequence buffer sout :end nbytes)))))) +(load (merge-pathnames "tools" *load-pathname*)) (loop for entry in +all-mappings+ for name = (first entry) - for url = (second entry) - for type = (or (third entry) "BIN") - for orig = (make-pathname :name name :type type :defaults "ext:encodings;") - for copy = (ensure-directories-exist (make-pathname :name name :type type :defaults "build:encodings;")) + for orig = (make-pathname :name name :type "BIN" :defaults "ext:encodings;") + for copy = (merge-pathnames "build:encodings;" orig) do (progn (unless (probe-file orig) - (generate-mapping name url orig)) + (let ((mapping (if (equalp name "JISX0208") + (mapcar #'rest (read-mapping name 3)) + (read-mapping name)))) + (dump-mapping-array mapping orig))) (copy-file orig copy))) (defconstant +aliases+ @@ -197,4 +85,7 @@ do (with-open-file (out filename :direction :output :if-exists :supersede :if-does-not-exist :create :element-type 'base-char) (format t "~%;;; Creating alias ~A -> ~A, ~A" alias name filename) - (princ name out)))) + (format out "(defparameter ext::~A 'ext::~A)" alias name)))) + +(copy-file "ext:encodings;ISO-2022-JP" "build:encodings;ISO-2022-JP") +(copy-file "ext:encodings;ISO-2022-JP-1" "build:encodings;ISO-2022-JP-1") diff --git a/contrib/encodings/tools.lisp b/contrib/encodings/tools.lisp new file mode 100644 index 000000000..0b13a391d --- /dev/null +++ b/contrib/encodings/tools.lisp @@ -0,0 +1,194 @@ +;;; -*- Mode: Lisp; Syntax: Common-Lisp; -*- +;;; +;;; Copyright (c) 2009, Juan Jose Garcia-Ripoll +;;; +;;; This program is free software; you can redistribute it and/or +;;; modify it under the terms of the GNU Library General Public +;;; License as published by the Free Software Foundation; either +;;; version 2 of the License, or (at your option) any later version. +;;; +;;; See file '../Copyright' for full details. + +(defconstant +sequence-type+ '(unsigned-byte 16)) + +(defconstant +source-pathname+ + (make-pathname :name nil :type nil + :defaults (merge-pathnames "ext:;sources;" *load-pathname*))) + +(defconstant +all-mappings+ + '(("ATARIST" "http://unicode.org/Public/MAPPINGS/VENDORS/MISC/ATARIST.TXT") + + ("ISO-8859-1" "http://unicode.org/Public/MAPPINGS/ISO8859/8859-1.TXT") + ("ISO-8859-2" "http://unicode.org/Public/MAPPINGS/ISO8859/8859-2.TXT") + ("ISO-8859-3" "http://unicode.org/Public/MAPPINGS/ISO8859/8859-3.TXT") + ("ISO-8859-4" "http://unicode.org/Public/MAPPINGS/ISO8859/8859-4.TXT") + ("ISO-8859-5" "http://unicode.org/Public/MAPPINGS/ISO8859/8859-5.TXT") + ("ISO-8859-6" "http://unicode.org/Public/MAPPINGS/ISO8859/8859-6.TXT") + ("ISO-8859-7" "http://unicode.org/Public/MAPPINGS/ISO8859/8859-7.TXT") + ("ISO-8859-8" "http://unicode.org/Public/MAPPINGS/ISO8859/8859-8.TXT") + ("ISO-8859-9" "http://unicode.org/Public/MAPPINGS/ISO8859/8859-9.TXT") + ("ISO-8859-10" "http://unicode.org/Public/MAPPINGS/ISO8859/8859-10.TXT") + ("ISO-8859-11" "http://unicode.org/Public/MAPPINGS/ISO8859/8859-11.TXT") + ("ISO-8859-13" "http://unicode.org/Public/MAPPINGS/ISO8859/8859-13.TXT") + ("ISO-8859-14" "http://unicode.org/Public/MAPPINGS/ISO8859/8859-14.TXT") + ("ISO-8859-15" "http://unicode.org/Public/MAPPINGS/ISO8859/8859-15.TXT") + ("ISO-8859-16" "http://unicode.org/Public/MAPPINGS/ISO8859/8859-16.TXT") + ("KOI8-R" "http://unicode.org/Public/MAPPINGS/VENDORS/MISC/KOI8-R.TXT") + ("KOI8-U" "http://unicode.org/Public/MAPPINGS/VENDORS/MISC/KOI8-U.TXT") + ("CP-856" "http://unicode.org/Public/MAPPINGS/VENDORS/MISC/CP856.TXT") + ("CP-856" "http://unicode.org/Public/MAPPINGS/VENDORS/MISC/CP856.TXT") + + ("DOS-CP437" "http://unicode.org/Public/MAPPINGS/VENDORS/MICSFT/PC/CP437.TXT") + ("DOS-CP737" "http://unicode.org/Public/MAPPINGS/VENDORS/MICSFT/PC/CP737.TXT") + ("DOS-CP775" "http://unicode.org/Public/MAPPINGS/VENDORS/MICSFT/PC/CP775.TXT") + ("DOS-CP850" "http://unicode.org/Public/MAPPINGS/VENDORS/MICSFT/PC/CP850.TXT") + ("DOS-CP852" "http://unicode.org/Public/MAPPINGS/VENDORS/MICSFT/PC/CP852.TXT") + ("DOS-CP855" "http://unicode.org/Public/MAPPINGS/VENDORS/MICSFT/PC/CP855.TXT") + ("DOS-CP857" "http://unicode.org/Public/MAPPINGS/VENDORS/MICSFT/PC/CP857.TXT") + ("DOS-CP860" "http://unicode.org/Public/MAPPINGS/VENDORS/MICSFT/PC/CP860.TXT") + ("DOS-CP861" "http://unicode.org/Public/MAPPINGS/VENDORS/MICSFT/PC/CP861.TXT") + ("DOS-CP862" "http://unicode.org/Public/MAPPINGS/VENDORS/MICSFT/PC/CP862.TXT") + ("DOS-CP863" "http://unicode.org/Public/MAPPINGS/VENDORS/MICSFT/PC/CP863.TXT") + ("DOS-CP864" "http://unicode.org/Public/MAPPINGS/VENDORS/MICSFT/PC/CP864.TXT") + ("DOS-CP865" "http://unicode.org/Public/MAPPINGS/VENDORS/MICSFT/PC/CP865.TXT") + ("DOS-CP866" "http://unicode.org/Public/MAPPINGS/VENDORS/MICSFT/PC/CP866.TXT") + ("DOS-CP869" "http://unicode.org/Public/MAPPINGS/VENDORS/MICSFT/PC/CP869.TXT") + ("DOS-CP874" "http://unicode.org/Public/MAPPINGS/VENDORS/MICSFT/PC/CP874.TXT") + + ; Redundant WINDOWS-CP874 DOS-CP874 + ;("WINDOWS-CP874" "http://unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WINDOWS/CP874.TXT") + + ("WINDOWS-CP932" "http://unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WINDOWS/CP932.TXT") + ("WINDOWS-CP936" "http://unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WINDOWS/CP936.TXT") + ("WINDOWS-CP949" "http://unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WINDOWS/CP949.TXT") + ("WINDOWS-CP950" "http://unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WINDOWS/CP950.TXT") + + ("WINDOWS-CP1250" "http://unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WINDOWS/CP1250.TXT") + ("WINDOWS-CP1251" "http://unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WINDOWS/CP1251.TXT") + ("WINDOWS-CP1252" "http://unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WINDOWS/CP1252.TXT") + ("WINDOWS-CP1253" "http://unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WINDOWS/CP1253.TXT") + ("WINDOWS-CP1254" "http://unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WINDOWS/CP1254.TXT") + ("WINDOWS-CP1255" "http://unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WINDOWS/CP1255.TXT") + ("WINDOWS-CP1256" "http://unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WINDOWS/CP1256.TXT") + ("WINDOWS-CP1257" "http://unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WINDOWS/CP1257.TXT") + ("WINDOWS-CP1258" "http://unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WINDOWS/CP1258.TXT") + + ("JISX0201" "http://unicode.org/Public/MAPPINGS/OBSOLETE/EASTASIA/JIS/JIS0201.TXT") + ("JISX0208" "http://unicode.org/Public/MAPPINGS/OBSOLETE/EASTASIA/JIS/JIS0208.TXT" + ;; Fixes compatible with libiconv: we replace a reverse solidus with a + ;; fullwidth reverse solidus, so that JISX0208 does not contain characters + ;; in the ASCII range (Needed by ISO-2022-JP-1) + ((#x815F #x2140 #xff3c))) + + ("JISX0212" "http://unicode.org/Public/MAPPINGS/OBSOLETE/EASTASIA/JIS/JIS0212.TXT" + ;; Fixes compatible with libiconv: we replace a tilde with a + ;; fullwidth tilde, so that JISX0212 does not contain characters + ;; in the ASCII range (Needed by ISO-2022-JP-1) + ((#x2237 #xff5e))) + + ("SHIFT-JIS" "http://unicode.org/Public/MAPPINGS/OBSOLETE/EASTASIA/JIS/SHIFTJIS.TXT") + + ;Unable to parse because they output more than one Unicode character + ;("SJIS-0213" "http://x0213.org/codetable/sjis-0213-2004-std.txt") + ;("EUC-JISX0213" "http://x0213.org/codetable/euc-jis") + )) + +(defun download (filename url) + (unless (probe-file filename) + (let ((command (format nil "curl \"~A\" > ~A" url filename))) + (unless (zerop (si::system command)) + (error "Unable to retrieve file ~A" url))))) + +(defun reformat (line) + (loop with l = (length line) + for i from 0 below l + for c = (char line i) + do (cond ((eql c #\#) + (return (if (zerop i) "" (subseq line 0 (1- i))))) + ((not (standard-char-p c)) + (setf (char line i) #\space)) + ((and (eql c #\0) + (let ((j (1+ i))) + (and (< j l) (member (char line j) '(#\x #\X))))) + (setf (char line i) #\#))) + finally (return line))) + +(defun read-mapping (name &optional (n 2)) + (let* ((source-file (make-pathname :name name :defaults +source-pathname+)) + (record (find name +all-mappings+ :key #'first :test #'equalp)) + (fixes (third record)) + (source-url (fourth record))) + (unless (probe-file source-file) + (unless source-url + (error "Unknown encoding ~A" name)) + (download file source-url)) + (with-open-file (in source-file :direction :input) + (loop with output = '() + for line = (reformat (read-line in nil nil)) + while line + unless (zerop (length line)) + do (with-input-from-string (aux line) + (let ((byte-list (loop for byte = (read aux nil nil) + while byte + collect byte))) + (unless (/= (length byte-list) n) + (loop for i in fixes + when (= (first i) (first byte-list)) + do (progn (setf byte-list i) (return))) + (push byte-list output)))) + finally (return (nreverse output)))))) + +(defun mapping-hash-table (mapping) + (loop with hash = (make-hash-table :size (floor (* 1.5 (length mapping))) + :test 'eq) + for (multibyte codepoint) in mapping + for unicode-char = (code-char codepoint) + do (progn + (setf (gethash multibyte hash) unicode-char) + (setf (gethash unicode-char hash) multibyte) + (when (> multibyte #xFF) + (setf (gethash (ash multibyte -8) hash) t))) + finally (return hash))) + +(defun dump-mapping-array (mapping-assoc output-file) + (let* ((mapping-list (reduce #'nconc mapping-assoc)) + (mapping-array (make-array (length mapping-list) :element-type +sequence-type+ + :initial-contents mapping-list))) + (format t "~%;;; Generating ~A" output-file) + (force-output t) + (with-open-file (s output-file :direction :output :if-exists :supersede + :element-type +sequence-type+ :external-format :big-endian) + (write-byte (length mapping-array) s) + (write-sequence mapping-array s)))) + +(defun copy-file (in out) + (let ((buffer (make-array 8192 :element-type '(unsigned-byte 8)))) + (format t "~%;;; Copying ~A to ~A" in out) + (with-open-file (sin in :direction :input :element-type '(unsigned-byte 8)) + (with-open-file (sout out :direction :output :element-type '(unsigned-byte 8) + :if-exists :supersede :if-does-not-exist :create) + (loop for nbytes = (read-sequence buffer sin) + until (zerop nbytes) + do (write-sequence buffer sout :end nbytes)))))) + +(defun all-valid-unicode-chars (mapping) + (if (consp mapping) + (loop for sublist on mapping + for i from 0 below 10 + until (and (eq sublist mapping) (plusp i)) + collect (all-valid-unicode-chars (first sublist))) + (concatenate 'string (loop for key being the hash-key in mapping + when (characterp key) + collect key)))) + +(defun compare-hashes (h1 h2) + (flet ((h1-in-h2 (h1 h2) + (loop for k being the hash-key in h1 using (hash-value v) + for v2 = (gethash k h2 nil) + unless (or (consp v2) (consp v) (equal v v2)) + do (progn (print (list h1 k v h2 k v2)) + (error) + (return nil)) + finally (return t)))) + (and (h1-in-h2 h1 h2) + (h1-in-h2 h2 h1)))) diff --git a/src/c/file.d b/src/c/file.d index 3acfa31da..023067eb1 100644 --- a/src/c/file.d +++ b/src/c/file.d @@ -60,6 +60,12 @@ #define ecl_ftello ftello #endif +/* Maximum number of bytes required to encode a character. + * This currently corresponds to (4 + 2) for the ISO-2022-JP-* encodings + * with 4 being the charset prefix, 2 for the character. + */ +#define ENCODING_BUFFER_MAX_SIZE 6 + static cl_index ecl_read_byte8(cl_object stream, unsigned char *c, cl_index n); static cl_index ecl_write_byte8(cl_object stream, unsigned char *c, cl_index n); @@ -565,7 +571,7 @@ eformat_unread_char(cl_object strm, int c) } { cl_object l = Cnil; - unsigned char buffer[10]; + unsigned char buffer[2*ENCODING_BUFFER_MAX_SIZE]; int ndx = 0; cl_fixnum i = strm->stream.last_code[0]; if (i != EOF) { @@ -598,7 +604,7 @@ eformat_read_char(cl_object strm) static int eformat_write_char(cl_object strm, int c) { - unsigned char buffer[4]; + unsigned char buffer[ENCODING_BUFFER_MAX_SIZE]; int nbytes = strm->stream.encoder(strm, buffer, c); if (nbytes == 0) { character_size_overflow(strm, c); @@ -926,7 +932,7 @@ ucs_2_encoder(cl_object stream, unsigned char *buffer, int c) } /* - * USER DEFINED ENCODINGS + * USER DEFINED ENCODINGS. SIMPLE CASE. */ static int @@ -975,6 +981,84 @@ user_encoder(cl_object stream, unsigned char *buffer, int c) } } +/* + * USER DEFINED ENCODINGS. SIMPLE CASE. + */ + +static int +user_multistate_decoder(cl_object stream, cl_eformat_read_byte8 read_byte8, + cl_object source) +{ + cl_object table_list = stream->stream.format_table; + cl_object table = ECL_CONS_CAR(table_list); + cl_object character; + cl_fixnum i, j; + unsigned char buffer[ENCODING_BUFFER_MAX_SIZE]; + for (i = j = 0; i < ENCODING_BUFFER_MAX_SIZE; i++) { + if (read_byte8(source, buffer+i, 1) < 1) { + return EOF; + } + j = (j << 8) | buffer[i]; + character = ecl_gethash_safe(MAKE_FIXNUM(j), table, Cnil); + if (CHARACTERP(character)) { + return CHAR_CODE(character); + } + if (Null(character)) { + invalid_codepoint(stream, buffer[0]); + } + if (character == Ct) { + /* Need more characters */ + continue; + } + if (CONSP(character)) { + /* Changed the state. */ + stream->stream.format_table = table_list = character; + table = ECL_CONS_CAR(table_list); + i = j = 0; + continue; + } + break; + } + FEerror("Internal error in decoder table.", 0); +} + +static int +user_multistate_encoder(cl_object stream, unsigned char *buffer, int c) +{ + cl_object table_list = stream->stream.format_table; + cl_object p = table_list; + do { + cl_object table = ECL_CONS_CAR(p); + cl_object byte = ecl_gethash_safe(CODE_CHAR(c), table, Cnil); + if (!Null(byte)) { + cl_fixnum code = fix(byte); + int n = 0; + if (p != table_list) { + /* Must output a escape sequence */ + cl_object x = ecl_gethash_safe(Ct, table, Cnil); + while (!Null(x)) { + buffer[0] = fix(ECL_CONS_CAR(x)); + buffer++; + x = ECL_CONS_CDR(x); + n++; + } + stream->stream.format_table = p; + } + if (code > 0xFF) { + buffer[1] = code & 0xFF; code >>= 8; + buffer[0] = code; + return n+2; + } else { + buffer[0] = code; + return n+1; + } + } + p = ECL_CONS_CDR(p); + } while (p != table_list); + /* Exhausted all lists */ + return 0; +} + /* * UTF-8 */ @@ -2880,7 +2964,7 @@ set_stream_elt_type(cl_object stream, cl_fixnum byte_size, int flags, switch (flags & ECL_STREAM_FORMAT) { case ECL_STREAM_BINARY: IO_STREAM_ELT_TYPE(stream) = cl_list(2, t, MAKE_FIXNUM(byte_size)); - stream->stream.format = Cnil; + stream->stream.format = t; stream->stream.ops->read_char = not_character_read_char; stream->stream.ops->write_char = not_character_write_char; break; @@ -2944,8 +3028,13 @@ set_stream_elt_type(cl_object stream, cl_fixnum byte_size, int flags, IO_STREAM_ELT_TYPE(stream) = @'character'; byte_size = 8; stream->stream.format = stream->stream.format_table; - stream->stream.encoder = user_encoder; - stream->stream.decoder = user_decoder; + if (CONSP(stream->stream.format)) { + stream->stream.encoder = user_multistate_encoder; + stream->stream.decoder = user_multistate_decoder; + } else { + stream->stream.encoder = user_encoder; + stream->stream.decoder = user_decoder; + } break; case ECL_STREAM_US_ASCII: IO_STREAM_ELT_TYPE(stream) = @'base-char'; @@ -2967,20 +3056,21 @@ set_stream_elt_type(cl_object stream, cl_fixnum byte_size, int flags, FEerror("Invalid or unsupported external format ~A with code ~D", 2, external_format, MAKE_FIXNUM(flags)); } + t = @':LF'; if (stream->stream.ops->write_char == eformat_write_char && (flags & ECL_STREAM_CR)) { cl_object key; if (flags & ECL_STREAM_LF) { stream->stream.ops->read_char = eformat_read_char_crlf; stream->stream.ops->write_char = eformat_write_char_crlf; - key = @':CRLF'; + t = @':CRLF'; } else { stream->stream.ops->read_char = eformat_read_char_cr; stream->stream.ops->write_char = eformat_write_char_cr; - key = @':CR'; + t = @':CR'; } - stream->stream.format = cl_list(2, key, stream->stream.format); } + stream->stream.format = cl_list(2, stream->stream.format, t); { cl_object (*read_byte)(cl_object); void (*write_byte)(cl_object,cl_object); diff --git a/src/lsp/iolib.lsp b/src/lsp/iolib.lsp index 4b6d0f684..f0c62520c 100644 --- a/src/lsp/iolib.lsp +++ b/src/lsp/iolib.lsp @@ -291,8 +291,8 @@ the one defined in the ANSI standard. *print-base* is 10, *print-array* is t, (defun ext:load-encoding (name) (let ((filename (make-pathname :name (symbol-name name) :defaults "sys:encodings;"))) (cond ((probe-file filename) - (with-open-file (s filename :direction :input) - (read s))) + (load filename :verbose nil) + name) ((probe-file (setf filename (make-pathname :type "BIN" :defaults filename))) (with-open-file (in filename :element-type '(unsigned-byte 16) :external-format :big-endian)