annotate lisp/mule/mule-coding.el @ 4625:4527fc976aa3

Meta on Mac. <87prh51rni.fsf@xemacs.org>
author Stephen J. Turnbull <stephen@xemacs.org>
date Thu, 26 Feb 2009 18:21:40 +0900
parents 1d74a1d115ee
children e0a8715fdb1f
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
502
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 448
diff changeset
1 ;;; mule-coding.el --- Coding-system functions for Mule. -*- coding: iso-2022-7bit; -*-
333
4f79e16b1112 Import from CVS: tag r21-0-64
cvs
parents:
diff changeset
2
4f79e16b1112 Import from CVS: tag r21-0-64
cvs
parents:
diff changeset
3 ;; Copyright (C) 1995 Electrotechnical Laboratory, JAPAN.
4f79e16b1112 Import from CVS: tag r21-0-64
cvs
parents:
diff changeset
4 ;; Licensed to the Free Software Foundation.
4f79e16b1112 Import from CVS: tag r21-0-64
cvs
parents:
diff changeset
5 ;; Copyright (C) 1995 Amdahl Corporation.
4f79e16b1112 Import from CVS: tag r21-0-64
cvs
parents:
diff changeset
6 ;; Copyright (C) 1995 Sun Microsystems.
4f79e16b1112 Import from CVS: tag r21-0-64
cvs
parents:
diff changeset
7 ;; Copyright (C) 1997 MORIOKA Tomohiko
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 528
diff changeset
8 ;; Copyright (C) 2001 Ben Wing.
333
4f79e16b1112 Import from CVS: tag r21-0-64
cvs
parents:
diff changeset
9
4f79e16b1112 Import from CVS: tag r21-0-64
cvs
parents:
diff changeset
10 ;; This file is part of XEmacs.
4f79e16b1112 Import from CVS: tag r21-0-64
cvs
parents:
diff changeset
11
4f79e16b1112 Import from CVS: tag r21-0-64
cvs
parents:
diff changeset
12 ;; XEmacs is free software; you can redistribute it and/or modify it
4f79e16b1112 Import from CVS: tag r21-0-64
cvs
parents:
diff changeset
13 ;; under the terms of the GNU General Public License as published by
4f79e16b1112 Import from CVS: tag r21-0-64
cvs
parents:
diff changeset
14 ;; the Free Software Foundation; either version 2, or (at your option)
4f79e16b1112 Import from CVS: tag r21-0-64
cvs
parents:
diff changeset
15 ;; any later version.
4f79e16b1112 Import from CVS: tag r21-0-64
cvs
parents:
diff changeset
16
4f79e16b1112 Import from CVS: tag r21-0-64
cvs
parents:
diff changeset
17 ;; XEmacs is distributed in the hope that it will be useful, but
4f79e16b1112 Import from CVS: tag r21-0-64
cvs
parents:
diff changeset
18 ;; WITHOUT ANY WARRANTY; without even the implied warranty of
4f79e16b1112 Import from CVS: tag r21-0-64
cvs
parents:
diff changeset
19 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
4f79e16b1112 Import from CVS: tag r21-0-64
cvs
parents:
diff changeset
20 ;; General Public License for more details.
4f79e16b1112 Import from CVS: tag r21-0-64
cvs
parents:
diff changeset
21
4f79e16b1112 Import from CVS: tag r21-0-64
cvs
parents:
diff changeset
22 ;; You should have received a copy of the GNU General Public License
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
23 ;; along with XEmacs; see the file COPYING. If not, write to the
333
4f79e16b1112 Import from CVS: tag r21-0-64
cvs
parents:
diff changeset
24 ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
4f79e16b1112 Import from CVS: tag r21-0-64
cvs
parents:
diff changeset
25 ;; Boston, MA 02111-1307, USA.
4f79e16b1112 Import from CVS: tag r21-0-64
cvs
parents:
diff changeset
26
4f79e16b1112 Import from CVS: tag r21-0-64
cvs
parents:
diff changeset
27 ;;; Commentary:
4f79e16b1112 Import from CVS: tag r21-0-64
cvs
parents:
diff changeset
28
4f79e16b1112 Import from CVS: tag r21-0-64
cvs
parents:
diff changeset
29 ;;; split off of mule.el and mostly moved to coding.el
4f79e16b1112 Import from CVS: tag r21-0-64
cvs
parents:
diff changeset
30
4072
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
31 ;; Needed for make-8-bit-coding-system.
4080
476d0799d704 [xemacs-hg @ 2007-07-27 18:56:45 by aidan]
aidan
parents: 4072
diff changeset
32 (eval-when-compile (require 'ccl))
4072
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
33
333
4f79e16b1112 Import from CVS: tag r21-0-64
cvs
parents:
diff changeset
34 ;;; Code:
4f79e16b1112 Import from CVS: tag r21-0-64
cvs
parents:
diff changeset
35
4f79e16b1112 Import from CVS: tag r21-0-64
cvs
parents:
diff changeset
36 (defun coding-system-force-on-output (coding-system register)
4f79e16b1112 Import from CVS: tag r21-0-64
cvs
parents:
diff changeset
37 "Return the 'force-on-output property of CODING-SYSTEM for the specified REGISTER."
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
38 (check-type register integer)
333
4f79e16b1112 Import from CVS: tag r21-0-64
cvs
parents:
diff changeset
39 (coding-system-property
4f79e16b1112 Import from CVS: tag r21-0-64
cvs
parents:
diff changeset
40 coding-system
4f79e16b1112 Import from CVS: tag r21-0-64
cvs
parents:
diff changeset
41 (case register
4f79e16b1112 Import from CVS: tag r21-0-64
cvs
parents:
diff changeset
42 (0 'force-g0-on-output)
4f79e16b1112 Import from CVS: tag r21-0-64
cvs
parents:
diff changeset
43 (1 'force-g1-on-output)
4f79e16b1112 Import from CVS: tag r21-0-64
cvs
parents:
diff changeset
44 (2 'force-g2-on-output)
4f79e16b1112 Import from CVS: tag r21-0-64
cvs
parents:
diff changeset
45 (3 'force-g3-on-output)
4f79e16b1112 Import from CVS: tag r21-0-64
cvs
parents:
diff changeset
46 (t (signal 'args-out-of-range (list register 0 3))))))
4f79e16b1112 Import from CVS: tag r21-0-64
cvs
parents:
diff changeset
47
4f79e16b1112 Import from CVS: tag r21-0-64
cvs
parents:
diff changeset
48 (defun coding-system-short (coding-system)
4f79e16b1112 Import from CVS: tag r21-0-64
cvs
parents:
diff changeset
49 "Return the 'short property of CODING-SYSTEM."
4f79e16b1112 Import from CVS: tag r21-0-64
cvs
parents:
diff changeset
50 (coding-system-property coding-system 'short))
4f79e16b1112 Import from CVS: tag r21-0-64
cvs
parents:
diff changeset
51
4f79e16b1112 Import from CVS: tag r21-0-64
cvs
parents:
diff changeset
52 (defun coding-system-no-ascii-eol (coding-system)
4f79e16b1112 Import from CVS: tag r21-0-64
cvs
parents:
diff changeset
53 "Return the 'no-ascii-eol property of CODING-SYSTEM."
4f79e16b1112 Import from CVS: tag r21-0-64
cvs
parents:
diff changeset
54 (coding-system-property coding-system 'no-ascii-eol))
4f79e16b1112 Import from CVS: tag r21-0-64
cvs
parents:
diff changeset
55
4f79e16b1112 Import from CVS: tag r21-0-64
cvs
parents:
diff changeset
56 (defun coding-system-no-ascii-cntl (coding-system)
4f79e16b1112 Import from CVS: tag r21-0-64
cvs
parents:
diff changeset
57 "Return the 'no-ascii-cntl property of CODING-SYSTEM."
4f79e16b1112 Import from CVS: tag r21-0-64
cvs
parents:
diff changeset
58 (coding-system-property coding-system 'no-ascii-cntl))
4f79e16b1112 Import from CVS: tag r21-0-64
cvs
parents:
diff changeset
59
4f79e16b1112 Import from CVS: tag r21-0-64
cvs
parents:
diff changeset
60 (defun coding-system-seven (coding-system)
4f79e16b1112 Import from CVS: tag r21-0-64
cvs
parents:
diff changeset
61 "Return the 'seven property of CODING-SYSTEM."
4f79e16b1112 Import from CVS: tag r21-0-64
cvs
parents:
diff changeset
62 (coding-system-property coding-system 'seven))
4f79e16b1112 Import from CVS: tag r21-0-64
cvs
parents:
diff changeset
63
4f79e16b1112 Import from CVS: tag r21-0-64
cvs
parents:
diff changeset
64 (defun coding-system-lock-shift (coding-system)
4f79e16b1112 Import from CVS: tag r21-0-64
cvs
parents:
diff changeset
65 "Return the 'lock-shift property of CODING-SYSTEM."
4f79e16b1112 Import from CVS: tag r21-0-64
cvs
parents:
diff changeset
66 (coding-system-property coding-system 'lock-shift))
4f79e16b1112 Import from CVS: tag r21-0-64
cvs
parents:
diff changeset
67
4f79e16b1112 Import from CVS: tag r21-0-64
cvs
parents:
diff changeset
68 ;;(defun coding-system-use-japanese-jisx0201-roman (coding-system)
4f79e16b1112 Import from CVS: tag r21-0-64
cvs
parents:
diff changeset
69 ;; "Return the 'use-japanese-jisx0201-roman property of CODING-SYSTEM."
4f79e16b1112 Import from CVS: tag r21-0-64
cvs
parents:
diff changeset
70 ;; (coding-system-property coding-system 'use-japanese-jisx0201-roman))
4f79e16b1112 Import from CVS: tag r21-0-64
cvs
parents:
diff changeset
71
4f79e16b1112 Import from CVS: tag r21-0-64
cvs
parents:
diff changeset
72 ;;(defun coding-system-use-japanese-jisx0208-1978 (coding-system)
4f79e16b1112 Import from CVS: tag r21-0-64
cvs
parents:
diff changeset
73 ;; "Return the 'use-japanese-jisx0208-1978 property of CODING-SYSTEM."
4f79e16b1112 Import from CVS: tag r21-0-64
cvs
parents:
diff changeset
74 ;; (coding-system-property coding-system 'use-japanese-jisx0208-2978))
4f79e16b1112 Import from CVS: tag r21-0-64
cvs
parents:
diff changeset
75
4f79e16b1112 Import from CVS: tag r21-0-64
cvs
parents:
diff changeset
76 (defun coding-system-no-iso6429 (coding-system)
4f79e16b1112 Import from CVS: tag r21-0-64
cvs
parents:
diff changeset
77 "Return the 'no-iso6429 property of CODING-SYSTEM."
4f79e16b1112 Import from CVS: tag r21-0-64
cvs
parents:
diff changeset
78 (coding-system-property coding-system 'no-iso6429))
4f79e16b1112 Import from CVS: tag r21-0-64
cvs
parents:
diff changeset
79
4f79e16b1112 Import from CVS: tag r21-0-64
cvs
parents:
diff changeset
80 (defun coding-system-ccl-encode (coding-system)
4f79e16b1112 Import from CVS: tag r21-0-64
cvs
parents:
diff changeset
81 "Return the CCL 'encode property of CODING-SYSTEM."
4f79e16b1112 Import from CVS: tag r21-0-64
cvs
parents:
diff changeset
82 (coding-system-property coding-system 'encode))
4f79e16b1112 Import from CVS: tag r21-0-64
cvs
parents:
diff changeset
83
4f79e16b1112 Import from CVS: tag r21-0-64
cvs
parents:
diff changeset
84 (defun coding-system-ccl-decode (coding-system)
4f79e16b1112 Import from CVS: tag r21-0-64
cvs
parents:
diff changeset
85 "Return the CCL 'decode property of CODING-SYSTEM."
4f79e16b1112 Import from CVS: tag r21-0-64
cvs
parents:
diff changeset
86 (coding-system-property coding-system 'decode))
4f79e16b1112 Import from CVS: tag r21-0-64
cvs
parents:
diff changeset
87
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 528
diff changeset
88 (defun coding-system-iso2022-charset (coding-system register)
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 528
diff changeset
89 "Return the charset initially designated to REGISTER in CODING-SYSTEM.
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 528
diff changeset
90 The allowable range of REGISTER is 0 through 3."
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 528
diff changeset
91 (if (or (< register 0) (> register 3))
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 528
diff changeset
92 (error 'args-out-of-range "coding-system-charset REGISTER" register 0 3))
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 528
diff changeset
93 (coding-system-property coding-system (nth register '(charset-g0
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 528
diff changeset
94 charset-g1
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 528
diff changeset
95 charset-g2
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 528
diff changeset
96 charset-g3))))
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 528
diff changeset
97
333
4f79e16b1112 Import from CVS: tag r21-0-64
cvs
parents:
diff changeset
98
4f79e16b1112 Import from CVS: tag r21-0-64
cvs
parents:
diff changeset
99 ;;;; Definitions of predefined coding systems
4f79e16b1112 Import from CVS: tag r21-0-64
cvs
parents:
diff changeset
100
4f79e16b1112 Import from CVS: tag r21-0-64
cvs
parents:
diff changeset
101 (make-coding-system
4f79e16b1112 Import from CVS: tag r21-0-64
cvs
parents:
diff changeset
102 'ctext 'iso2022
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 528
diff changeset
103 "Compound Text"
333
4f79e16b1112 Import from CVS: tag r21-0-64
cvs
parents:
diff changeset
104 '(charset-g0 ascii
4f79e16b1112 Import from CVS: tag r21-0-64
cvs
parents:
diff changeset
105 charset-g1 latin-iso8859-1
4f79e16b1112 Import from CVS: tag r21-0-64
cvs
parents:
diff changeset
106 eol-type nil
4568
1d74a1d115ee Add #'query-coding-region tests; do the work necessary to get them running.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4567
diff changeset
107 safe-charsets t ;; Reasonable
333
4f79e16b1112 Import from CVS: tag r21-0-64
cvs
parents:
diff changeset
108 mnemonic "CText"))
4f79e16b1112 Import from CVS: tag r21-0-64
cvs
parents:
diff changeset
109
4f79e16b1112 Import from CVS: tag r21-0-64
cvs
parents:
diff changeset
110 (make-coding-system
4f79e16b1112 Import from CVS: tag r21-0-64
cvs
parents:
diff changeset
111 'iso-2022-8bit-ss2 'iso2022
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 528
diff changeset
112 "ISO-2022 8-bit w/SS2"
333
4f79e16b1112 Import from CVS: tag r21-0-64
cvs
parents:
diff changeset
113 '(charset-g0 ascii
4f79e16b1112 Import from CVS: tag r21-0-64
cvs
parents:
diff changeset
114 charset-g1 latin-iso8859-1
4f79e16b1112 Import from CVS: tag r21-0-64
cvs
parents:
diff changeset
115 charset-g2 t ;; unspecified but can be used later.
4f79e16b1112 Import from CVS: tag r21-0-64
cvs
parents:
diff changeset
116 short t
4568
1d74a1d115ee Add #'query-coding-region tests; do the work necessary to get them running.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4567
diff changeset
117 safe-charsets (ascii katakana-jisx0201 japanese-jisx0208-1978
1d74a1d115ee Add #'query-coding-region tests; do the work necessary to get them running.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4567
diff changeset
118 japanese-jisx0208 japanese-jisx0212 japanese-jisx0213-1
1d74a1d115ee Add #'query-coding-region tests; do the work necessary to get them running.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4567
diff changeset
119 japanese-jisx0213-2)
333
4f79e16b1112 Import from CVS: tag r21-0-64
cvs
parents:
diff changeset
120 mnemonic "ISO8/SS"
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 528
diff changeset
121 documentation "ISO 2022 based 8-bit encoding using SS2 for 96-charset"
333
4f79e16b1112 Import from CVS: tag r21-0-64
cvs
parents:
diff changeset
122 ))
4f79e16b1112 Import from CVS: tag r21-0-64
cvs
parents:
diff changeset
123
4f79e16b1112 Import from CVS: tag r21-0-64
cvs
parents:
diff changeset
124 (make-coding-system
4f79e16b1112 Import from CVS: tag r21-0-64
cvs
parents:
diff changeset
125 'iso-2022-7bit-ss2 'iso2022
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 528
diff changeset
126 "ISO-2022 7-bit w/SS2"
333
4f79e16b1112 Import from CVS: tag r21-0-64
cvs
parents:
diff changeset
127 '(charset-g0 ascii
4f79e16b1112 Import from CVS: tag r21-0-64
cvs
parents:
diff changeset
128 charset-g2 t ;; unspecified but can be used later.
4f79e16b1112 Import from CVS: tag r21-0-64
cvs
parents:
diff changeset
129 seven t
4f79e16b1112 Import from CVS: tag r21-0-64
cvs
parents:
diff changeset
130 short t
4568
1d74a1d115ee Add #'query-coding-region tests; do the work necessary to get them running.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4567
diff changeset
131 safe-charsets t
333
4f79e16b1112 Import from CVS: tag r21-0-64
cvs
parents:
diff changeset
132 mnemonic "ISO7/SS"
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 528
diff changeset
133 documentation "ISO 2022 based 7-bit encoding using SS2 for 96-charset"
333
4f79e16b1112 Import from CVS: tag r21-0-64
cvs
parents:
diff changeset
134 eol-type nil))
4f79e16b1112 Import from CVS: tag r21-0-64
cvs
parents:
diff changeset
135
4f79e16b1112 Import from CVS: tag r21-0-64
cvs
parents:
diff changeset
136 ;; (copy-coding-system 'iso-2022-7bit-ss2 'iso-2022-jp-2)
4f79e16b1112 Import from CVS: tag r21-0-64
cvs
parents:
diff changeset
137 (make-coding-system
4f79e16b1112 Import from CVS: tag r21-0-64
cvs
parents:
diff changeset
138 'iso-2022-jp-2 'iso2022
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 528
diff changeset
139 "ISO-2022-JP-2"
333
4f79e16b1112 Import from CVS: tag r21-0-64
cvs
parents:
diff changeset
140 '(charset-g0 ascii
4f79e16b1112 Import from CVS: tag r21-0-64
cvs
parents:
diff changeset
141 charset-g2 t ;; unspecified but can be used later.
4f79e16b1112 Import from CVS: tag r21-0-64
cvs
parents:
diff changeset
142 seven t
4f79e16b1112 Import from CVS: tag r21-0-64
cvs
parents:
diff changeset
143 short t
4568
1d74a1d115ee Add #'query-coding-region tests; do the work necessary to get them running.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4567
diff changeset
144 safe-charsets t
333
4f79e16b1112 Import from CVS: tag r21-0-64
cvs
parents:
diff changeset
145 mnemonic "ISO7/SS"
4f79e16b1112 Import from CVS: tag r21-0-64
cvs
parents:
diff changeset
146 eol-type nil))
4f79e16b1112 Import from CVS: tag r21-0-64
cvs
parents:
diff changeset
147
4f79e16b1112 Import from CVS: tag r21-0-64
cvs
parents:
diff changeset
148 (make-coding-system
4f79e16b1112 Import from CVS: tag r21-0-64
cvs
parents:
diff changeset
149 'iso-2022-7bit 'iso2022
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 528
diff changeset
150 "ISO 2022 7-bit"
333
4f79e16b1112 Import from CVS: tag r21-0-64
cvs
parents:
diff changeset
151 '(charset-g0 ascii
4f79e16b1112 Import from CVS: tag r21-0-64
cvs
parents:
diff changeset
152 seven t
4f79e16b1112 Import from CVS: tag r21-0-64
cvs
parents:
diff changeset
153 short t
4568
1d74a1d115ee Add #'query-coding-region tests; do the work necessary to get them running.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4567
diff changeset
154 safe-charsets t
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 528
diff changeset
155 mnemonic "ISO7"
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 528
diff changeset
156 documentation "ISO-2022-based 7-bit encoding using only G0"
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 528
diff changeset
157 ))
333
4f79e16b1112 Import from CVS: tag r21-0-64
cvs
parents:
diff changeset
158
4f79e16b1112 Import from CVS: tag r21-0-64
cvs
parents:
diff changeset
159 ;; compatibility for old XEmacsen
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 528
diff changeset
160 (define-coding-system-alias 'iso-2022-7 'iso-2022-7bit)
333
4f79e16b1112 Import from CVS: tag r21-0-64
cvs
parents:
diff changeset
161
4f79e16b1112 Import from CVS: tag r21-0-64
cvs
parents:
diff changeset
162 (make-coding-system
4f79e16b1112 Import from CVS: tag r21-0-64
cvs
parents:
diff changeset
163 'iso-2022-8 'iso2022
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 528
diff changeset
164 "ISO-2022 8-bit"
333
4f79e16b1112 Import from CVS: tag r21-0-64
cvs
parents:
diff changeset
165 '(charset-g0 ascii
4f79e16b1112 Import from CVS: tag r21-0-64
cvs
parents:
diff changeset
166 charset-g1 latin-iso8859-1
4f79e16b1112 Import from CVS: tag r21-0-64
cvs
parents:
diff changeset
167 short t
4568
1d74a1d115ee Add #'query-coding-region tests; do the work necessary to get them running.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4567
diff changeset
168 safe-charsets t
333
4f79e16b1112 Import from CVS: tag r21-0-64
cvs
parents:
diff changeset
169 mnemonic "ISO8"
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 528
diff changeset
170 documentation "ISO-2022 eight-bit coding system. No single-shift or locking-shift."
333
4f79e16b1112 Import from CVS: tag r21-0-64
cvs
parents:
diff changeset
171 ))
4f79e16b1112 Import from CVS: tag r21-0-64
cvs
parents:
diff changeset
172
4f79e16b1112 Import from CVS: tag r21-0-64
cvs
parents:
diff changeset
173 (make-coding-system
4f79e16b1112 Import from CVS: tag r21-0-64
cvs
parents:
diff changeset
174 'escape-quoted 'iso2022
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 528
diff changeset
175 "Escape-Quoted (for .ELC files)"
333
4f79e16b1112 Import from CVS: tag r21-0-64
cvs
parents:
diff changeset
176 '(charset-g0 ascii
4f79e16b1112 Import from CVS: tag r21-0-64
cvs
parents:
diff changeset
177 charset-g1 latin-iso8859-1
4f79e16b1112 Import from CVS: tag r21-0-64
cvs
parents:
diff changeset
178 eol-type lf
4f79e16b1112 Import from CVS: tag r21-0-64
cvs
parents:
diff changeset
179 escape-quoted t
4568
1d74a1d115ee Add #'query-coding-region tests; do the work necessary to get them running.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4567
diff changeset
180 safe-charsets t
333
4f79e16b1112 Import from CVS: tag r21-0-64
cvs
parents:
diff changeset
181 mnemonic "ESC/Quot"
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 528
diff changeset
182 documentation "ISO-2022 eight-bit coding system with escape quoting; used for .ELC files."
333
4f79e16b1112 Import from CVS: tag r21-0-64
cvs
parents:
diff changeset
183 ))
4f79e16b1112 Import from CVS: tag r21-0-64
cvs
parents:
diff changeset
184
4f79e16b1112 Import from CVS: tag r21-0-64
cvs
parents:
diff changeset
185 (make-coding-system
4f79e16b1112 Import from CVS: tag r21-0-64
cvs
parents:
diff changeset
186 'iso-2022-lock 'iso2022
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 528
diff changeset
187 "ISO-2022 w/locking-shift"
333
4f79e16b1112 Import from CVS: tag r21-0-64
cvs
parents:
diff changeset
188 '(charset-g0 ascii
4f79e16b1112 Import from CVS: tag r21-0-64
cvs
parents:
diff changeset
189 charset-g1 t ;; unspecified but can be used later.
4f79e16b1112 Import from CVS: tag r21-0-64
cvs
parents:
diff changeset
190 seven t
4f79e16b1112 Import from CVS: tag r21-0-64
cvs
parents:
diff changeset
191 lock-shift t
4568
1d74a1d115ee Add #'query-coding-region tests; do the work necessary to get them running.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4567
diff changeset
192 safe-charsets t
333
4f79e16b1112 Import from CVS: tag r21-0-64
cvs
parents:
diff changeset
193 mnemonic "ISO7/Lock"
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 528
diff changeset
194 documentation "ISO-2022 coding system using Locking-Shift for 96-charset."
333
4f79e16b1112 Import from CVS: tag r21-0-64
cvs
parents:
diff changeset
195 ))
4072
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
196
333
4f79e16b1112 Import from CVS: tag r21-0-64
cvs
parents:
diff changeset
197
4072
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
198 ;; This is used by people writing CCL programs, but is called at runtime.
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
199 (defun define-translation-hash-table (symbol table)
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
200 "Define SYMBOL as the name of the hash translation TABLE for use in CCL.
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
201
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
202 Analogous to `define-translation-table', but updates
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
203 `translation-hash-table-vector' and the table is for use in the CCL
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
204 `lookup-integer' and `lookup-character' functions."
4145
edb00a8b4eff [xemacs-hg @ 2007-08-26 20:00:29 by aidan]
aidan
parents: 4103
diff changeset
205 (check-argument-type #'symbolp symbol)
edb00a8b4eff [xemacs-hg @ 2007-08-26 20:00:29 by aidan]
aidan
parents: 4103
diff changeset
206 (check-argument-type #'hash-table-p table)
4072
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
207 (let ((len (length translation-hash-table-vector))
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
208 (id 0)
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
209 done)
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
210 (put symbol 'translation-hash-table table)
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
211 (while (not done)
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
212 (if (>= id len)
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
213 (setq translation-hash-table-vector
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
214 (vconcat translation-hash-table-vector [nil])))
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
215 (let ((slot (aref translation-hash-table-vector id)))
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
216 (if (or (not slot)
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
217 (eq (car slot) symbol))
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
218 (progn
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
219 (aset translation-hash-table-vector id (cons symbol table))
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
220 (setq done t))
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
221 (setq id (1+ id)))))
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
222 (put symbol 'translation-hash-table-id id)
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
223 id))
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
224
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
225 (defvar make-8-bit-private-use-start (decode-char 'ucs #xE000)
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
226 "Start of a 256 code private use area for make-8-bit-coding-system.
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
227
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
228 This is used to ensure that distinct octets on disk for a given coding
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
229 system map to distinct XEmacs characters, preventing a spurious changes when
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
230 a file is read, not changed, and then written. ")
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
231
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
232 (defun make-8-bit-generate-helper (decode-table encode-table
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
233 encode-failure-octet)
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
234 "Helper function for `make-8-bit-generate-encode-program', which see.
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
235
4145
edb00a8b4eff [xemacs-hg @ 2007-08-26 20:00:29 by aidan]
aidan
parents: 4103
diff changeset
236 Deals with the case where ASCII and another character set can both be
edb00a8b4eff [xemacs-hg @ 2007-08-26 20:00:29 by aidan]
aidan
parents: 4103
diff changeset
237 encoded unambiguously and completely into the coding-system; if this is so,
edb00a8b4eff [xemacs-hg @ 2007-08-26 20:00:29 by aidan]
aidan
parents: 4103
diff changeset
238 returns a list corresponding to such a ccl-program. If not, it returns nil. "
4072
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
239 (let ((tentative-encode-program-parts
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
240 (eval-when-compile
4295
eded49463f9a [xemacs-hg @ 2007-11-29 13:37:51 by aidan]
aidan
parents: 4145
diff changeset
241 (let* ((vec-len 128)
eded49463f9a [xemacs-hg @ 2007-11-29 13:37:51 by aidan]
aidan
parents: 4145
diff changeset
242 (compiled
4072
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
243 (append
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
244 (ccl-compile
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
245 `(1
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
246 (loop
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
247 (read-multibyte-character r0 r1)
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
248 (if (r0 == ,(charset-id 'ascii))
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
249 (write r1)
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
250 ((if (r0 == #xABAB)
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
251 ;; #xBFFE is a sentinel in the compiled
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
252 ;; program.
4295
eded49463f9a [xemacs-hg @ 2007-11-29 13:37:51 by aidan]
aidan
parents: 4145
diff changeset
253 ((r0 = r1 & #x7F)
eded49463f9a [xemacs-hg @ 2007-11-29 13:37:51 by aidan]
aidan
parents: 4145
diff changeset
254 (write r0 ,(make-vector vec-len #xBFFE)))
4072
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
255 ((mule-to-unicode r0 r1)
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
256 (if (r0 == #xFFFD)
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
257 (write #xBEEF)
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
258 ((lookup-integer encode-table-sym r0 r3)
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
259 (if r7
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
260 (write-multibyte-character r0 r3)
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
261 (write #xBEEF))))))))
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
262 (repeat)))) nil))
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
263 (first-part compiled)
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
264 (last-part
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
265 (member-if-not (lambda (entr) (eq #xBFFE entr))
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
266 (member-if
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
267 (lambda (entr) (eq #xBFFE entr))
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
268 first-part))))
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
269 (while compiled
4295
eded49463f9a [xemacs-hg @ 2007-11-29 13:37:51 by aidan]
aidan
parents: 4145
diff changeset
270 (when (eq #xBFFE (cadr compiled))
eded49463f9a [xemacs-hg @ 2007-11-29 13:37:51 by aidan]
aidan
parents: 4145
diff changeset
271 (assert (= vec-len (search '(#xBFFE) (cdr compiled)
eded49463f9a [xemacs-hg @ 2007-11-29 13:37:51 by aidan]
aidan
parents: 4145
diff changeset
272 :test #'/=)) nil
eded49463f9a [xemacs-hg @ 2007-11-29 13:37:51 by aidan]
aidan
parents: 4145
diff changeset
273 "Strange ccl vector length")
eded49463f9a [xemacs-hg @ 2007-11-29 13:37:51 by aidan]
aidan
parents: 4145
diff changeset
274 (setcdr compiled nil))
4072
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
275 (setq compiled (cdr compiled)))
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
276 ;; Is the generated code as we expect it to be?
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
277 (assert (and (memq #xABAB first-part)
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
278 (memq #xBEEF14 last-part))
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
279 nil
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
280 "This code assumes that the constant #xBEEF is #xBEEF14 in \
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
281 compiled CCL code,\nand that the constant #xABAB is #xABAB. If that is
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
282 not the case, and it appears not to be--that's why you're getting this
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
283 message--it will not work. ")
4295
eded49463f9a [xemacs-hg @ 2007-11-29 13:37:51 by aidan]
aidan
parents: 4145
diff changeset
284 (list first-part last-part vec-len))))
4072
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
285 (charset-lower -1)
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
286 (charset-upper -1)
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
287 worth-trying known-charsets encode-program
4295
eded49463f9a [xemacs-hg @ 2007-11-29 13:37:51 by aidan]
aidan
parents: 4145
diff changeset
288 other-charset-vector ucs args-out-of-range)
4072
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
289
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
290 (loop for char across decode-table
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
291 do (pushnew (char-charset char) known-charsets))
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
292 (setq known-charsets (delq 'ascii known-charsets))
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
293
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
294 (loop for known-charset in known-charsets
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
295 do
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
296 ;; This is not possible for two dimensional charsets.
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
297 (when (eq 1 (charset-dimension known-charset))
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
298 (setq args-out-of-range t)
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
299 (if (eq 'control-1 known-charset)
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
300 (setq charset-lower 0
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
301 charset-upper 31)
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
302 ;; There should be a nicer way to get the limits here.
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
303 (condition-case args-out-of-range
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
304 (make-char known-charset #x100)
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
305 (args-out-of-range
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
306 (setq charset-lower (third args-out-of-range)
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
307 charset-upper (fourth args-out-of-range)))))
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
308 (loop
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
309 for i from charset-lower to charset-upper
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
310 always (and (setq ucs
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
311 (encode-char (make-char known-charset i) 'ucs))
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
312 (gethash ucs encode-table))
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
313 finally (setq worth-trying known-charset))
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
314
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
315 ;; Only trying this for one charset at a time, the first find.
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
316 (when worth-trying (return))
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
317
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
318 ;; Okay, this charset is not worth trying, Try the next.
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
319 (setq charset-lower -1
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
320 charset-upper -1
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
321 worth-trying nil)))
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
322
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
323 (when worth-trying
4295
eded49463f9a [xemacs-hg @ 2007-11-29 13:37:51 by aidan]
aidan
parents: 4145
diff changeset
324 (setq other-charset-vector
eded49463f9a [xemacs-hg @ 2007-11-29 13:37:51 by aidan]
aidan
parents: 4145
diff changeset
325 (make-vector (third tentative-encode-program-parts)
eded49463f9a [xemacs-hg @ 2007-11-29 13:37:51 by aidan]
aidan
parents: 4145
diff changeset
326 encode-failure-octet))
4072
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
327 (loop for i from charset-lower to charset-upper
4090
751ae075e76e [xemacs-hg @ 2007-08-01 13:53:32 by aidan]
aidan
parents: 4085
diff changeset
328 do (aset other-charset-vector i
4072
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
329 (gethash (encode-char (make-char worth-trying i)
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
330 'ucs) encode-table)))
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
331 (setq encode-program
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
332 (nsublis
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
333 (list (cons #xABAB (charset-id worth-trying)))
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
334 (nconc
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
335 (copy-list (first
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
336 tentative-encode-program-parts))
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
337 (append other-charset-vector nil)
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
338 (copy-tree (second
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
339 tentative-encode-program-parts))))))
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
340 encode-program))
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
341
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
342 (defun make-8-bit-generate-encode-program (decode-table encode-table
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
343 encode-failure-octet)
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
344 "Generate a CCL program to decode a 8-bit fixed-width charset.
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
345
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
346 DECODE-TABLE must have 256 non-cons entries, and will be regarded as
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
347 describing a map from the octet corresponding to an offset in the
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
348 table to the that entry in the table. ENCODE-TABLE is a hash table
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
349 map from unicode values to characters in the range [0,255].
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
350 ENCODE-FAILURE-OCTET describes an integer between 0 and 255
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
351 \(inclusive) to write in the event that a character cannot be encoded. "
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
352 (check-argument-type #'vectorp decode-table)
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
353 (check-argument-range (length decode-table) #x100 #x100)
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
354 (check-argument-type #'hash-table-p encode-table)
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
355 (check-argument-type #'integerp encode-failure-octet)
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
356 (check-argument-range encode-failure-octet #x00 #xFF)
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
357 (let ((encode-program nil)
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
358 (general-encode-program
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
359 (eval-when-compile
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
360 (let ((prog (append
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
361 (ccl-compile
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
362 `(1
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
363 (loop
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
364 (read-multibyte-character r0 r1)
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
365 (mule-to-unicode r0 r1)
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
366 (if (r0 == #xFFFD)
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
367 (write #xBEEF)
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
368 ((lookup-integer encode-table-sym r0 r3)
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
369 (if r7
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
370 (write-multibyte-character r0 r3)
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
371 (write #xBEEF))))
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
372 (repeat)))) nil)))
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
373 (assert (memq #xBEEF14 prog)
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
374 nil
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
375 "This code assumes that the constant #xBEEF is #xBEEF14 \
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
376 in compiled CCL code.\nIf that is not the case, and it appears not to
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
377 be--that's why you're getting this message--it will not work. ")
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
378 prog)))
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
379 (encode-program-with-ascii-optimisation
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
380 (eval-when-compile
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
381 (let ((prog (append
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
382 (ccl-compile
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
383 `(1
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
384 (loop
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
385 (read-multibyte-character r0 r1)
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
386 (if (r0 == ,(charset-id 'ascii))
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
387 (write r1)
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
388 ((mule-to-unicode r0 r1)
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
389 (if (r0 == #xFFFD)
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
390 (write #xBEEF)
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
391 ((lookup-integer encode-table-sym r0 r3)
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
392 (if r7
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
393 (write-multibyte-character r0 r3)
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
394 (write #xBEEF))))))
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
395 (repeat)))) nil)))
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
396 (assert (memq #xBEEF14 prog)
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
397 nil
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
398 "This code assumes that the constant #xBEEF is #xBEEF14 \
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
399 in compiled CCL code.\nIf that is not the case, and it appears not to
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
400 be--that's why you're getting this message--it will not work. ")
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
401 prog)))
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
402 (ascii-encodes-as-itself nil))
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
403
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
404 ;; Is this coding system ASCII-compatible? If so, we can avoid the hash
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
405 ;; table lookup for those characters.
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
406 (loop
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
407 for i from #x00 to #x7f
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
408 always (eq (int-to-char i) (gethash i encode-table))
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
409 finally (setq ascii-encodes-as-itself t))
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
410
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
411 ;; Note that this logic handles EBCDIC badly. For example, CP037,
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
412 ;; MIME name ebcdic-na, has the entire repertoire of ASCII and
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
413 ;; Latin 1, and thus a more optimal ccl encode program would check
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
414 ;; for those character sets and use tables. But for now, we do a
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
415 ;; hash table lookup for every character.
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
416 (if (null ascii-encodes-as-itself)
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
417 ;; General encode program. Pros; general and correct. Cons;
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
418 ;; slow, a hash table lookup + mule-unicode conversion is done
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
419 ;; for every character encoding.
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
420 (setq encode-program general-encode-program)
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
421 (setq encode-program
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
422 ;; Encode program with ascii-ascii mapping (based on a
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
423 ;; character's mule character set), and one other mule
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
424 ;; character set using table-based encoding, other
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
425 ;; character sets using hash table lookups.
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
426 ;; make-8-bit-non-ascii-completely-coveredp only returns
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
427 ;; such a mapping if some non-ASCII charset with
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
428 ;; characters in decode-table is entirely covered by
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
429 ;; encode-table.
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
430 (make-8-bit-generate-helper decode-table encode-table
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
431 encode-failure-octet))
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
432 (unless encode-program
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
433 ;; If make-8-bit-non-ascii-completely-coveredp returned nil,
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
434 ;; but ASCII still encodes as itself, do one-to-one mapping
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
435 ;; for ASCII, and a hash table lookup for everything else.
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
436 (setq encode-program encode-program-with-ascii-optimisation)))
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
437
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
438 (setq encode-program
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
439 (nsublis
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
440 (list (cons #xBEEF14
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
441 (logior (lsh encode-failure-octet 8)
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
442 #x14)))
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
443 (copy-tree encode-program)))
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
444 encode-program))
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
445
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
446 (defun make-8-bit-create-decode-encode-tables (unicode-map)
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
447 "Return a list \(DECODE-TABLE ENCODE-TABLE) given UNICODE-MAP.
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
448 UNICODE-MAP should be an alist mapping from integer octet values to
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
449 characters with UCS code points; DECODE-TABLE will be a 256-element
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
450 vector, and ENCODE-TABLE will be a hash table mapping from 256 numbers
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
451 to 256 distinct characters. "
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
452 (check-argument-type #'listp unicode-map)
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
453 (let ((decode-table (make-vector 256 nil))
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
454 (encode-table (make-hash-table :size 256))
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
455 (private-use-start (encode-char make-8-bit-private-use-start 'ucs))
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
456 desired-ucs)
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
457
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
458 (loop for (external internal)
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
459 in unicode-map
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
460 do
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
461 (aset decode-table external internal)
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
462 (assert (not (eq (encode-char internal 'ucs) -1))
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
463 nil
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
464 "Looks like you're calling make-8-bit-coding-system in a \
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
465 dumped file, \nand you're either not providing a literal UNICODE-MAP
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
466 or PROPS. Don't do that; make-8-bit-coding-system relies on sensible
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
467 Unicode mappings being available, which they are at compile time for
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
468 dumped files (but this requires the mentioned literals), but not, for
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
469 most of them, at run time. ")
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
470
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
471 (puthash (encode-char internal 'ucs)
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
472 ;; This is semantically an integer, but Dave Love's design
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
473 ;; for lookup-integer in CCL means we need to store it as a
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
474 ;; character.
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
475 (int-to-char external)
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
476 encode-table))
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
477
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
478 ;; Now, go through the decode table looking at the characters that
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
479 ;; remain nil. If the XEmacs character with that integer is already in
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
480 ;; the encode table, map the on-disk octet to a Unicode private use
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
481 ;; character. Otherwise map the on-disk octet to the XEmacs character
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
482 ;; with that numeric value, to make it clearer what it is.
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
483 (dotimes (i 256)
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
484 (when (null (aref decode-table i))
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
485 ;; Find a free code point.
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
486 (setq desired-ucs i)
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
487 (while (gethash desired-ucs encode-table)
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
488 ;; In the normal case, the code point chosen will be U+E0XY, where
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
489 ;; XY is the hexadecimal octet on disk. In pathological cases
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
490 ;; it'll be something else.
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
491 (setq desired-ucs (+ private-use-start desired-ucs)
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
492 private-use-start (+ private-use-start 1)))
4085
023ebc75c06e [xemacs-hg @ 2007-07-28 09:32:26 by aidan]
aidan
parents: 4080
diff changeset
493 (puthash desired-ucs (int-to-char i) encode-table)
023ebc75c06e [xemacs-hg @ 2007-07-28 09:32:26 by aidan]
aidan
parents: 4080
diff changeset
494 (setq desired-ucs (if (> desired-ucs #xFF)
023ebc75c06e [xemacs-hg @ 2007-07-28 09:32:26 by aidan]
aidan
parents: 4080
diff changeset
495 (decode-char 'ucs desired-ucs)
023ebc75c06e [xemacs-hg @ 2007-07-28 09:32:26 by aidan]
aidan
parents: 4080
diff changeset
496 ;; So we get Latin-1 when run at dump time,
023ebc75c06e [xemacs-hg @ 2007-07-28 09:32:26 by aidan]
aidan
parents: 4080
diff changeset
497 ;; instead of JIT-allocated characters.
023ebc75c06e [xemacs-hg @ 2007-07-28 09:32:26 by aidan]
aidan
parents: 4080
diff changeset
498 (int-to-char desired-ucs)))
023ebc75c06e [xemacs-hg @ 2007-07-28 09:32:26 by aidan]
aidan
parents: 4080
diff changeset
499 (aset decode-table i desired-ucs)))
4072
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
500 (values decode-table encode-table)))
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
501
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
502 (defun make-8-bit-generate-decode-program (decode-table)
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
503 "Given DECODE-TABLE, generate a CCL program to decode an 8-bit charset.
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
504 DECODE-TABLE must have 256 non-cons entries, and will be regarded as
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
505 describing a map from the octet corresponding to an offset in the
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
506 table to the that entry in the table. "
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
507 (check-argument-type #'vectorp decode-table)
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
508 (check-argument-range (length decode-table) #x100 #x100)
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
509 (let ((decode-program-parts
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
510 (eval-when-compile
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
511 (let* ((compiled
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
512 (append
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
513 (ccl-compile
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
514 `(3
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
515 ((read r0)
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
516 (loop
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
517 (write-read-repeat r0 ,(make-vector
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
518 256 'sentinel)))))) nil))
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
519 (first-part compiled)
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
520 (last-part
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
521 (member-if-not #'symbolp
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
522 (member-if-not #'integerp first-part))))
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
523 ;; Chop off the sentinel sentinel sentinel [..] part.
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
524 (while compiled
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
525 (if (symbolp (cadr compiled))
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
526 (setcdr compiled nil))
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
527 (setq compiled (cdr compiled)))
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
528 (list first-part last-part)))))
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
529 (nconc
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
530 ;; copy-list needed, because the structure of the literal provided
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
531 ;; by our eval-when-compile hangs around.
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
532 (copy-list (first decode-program-parts))
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
533 (append decode-table nil)
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
534 (second decode-program-parts))))
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
535
4145
edb00a8b4eff [xemacs-hg @ 2007-08-26 20:00:29 by aidan]
aidan
parents: 4103
diff changeset
536 (defun make-8-bit-choose-category (decode-table)
edb00a8b4eff [xemacs-hg @ 2007-08-26 20:00:29 by aidan]
aidan
parents: 4103
diff changeset
537 "Given DECODE-TABLE, return an appropriate coding category.
edb00a8b4eff [xemacs-hg @ 2007-08-26 20:00:29 by aidan]
aidan
parents: 4103
diff changeset
538 DECODE-TABLE is a 256-entry vector describing the mapping from octets on
edb00a8b4eff [xemacs-hg @ 2007-08-26 20:00:29 by aidan]
aidan
parents: 4103
diff changeset
539 disk to XEmacs characters for some fixed-width 8-bit coding system. "
edb00a8b4eff [xemacs-hg @ 2007-08-26 20:00:29 by aidan]
aidan
parents: 4103
diff changeset
540 (check-argument-type #'vectorp decode-table)
edb00a8b4eff [xemacs-hg @ 2007-08-26 20:00:29 by aidan]
aidan
parents: 4103
diff changeset
541 (check-argument-range (length decode-table) #x100 #x100)
4549
68d1ca56cffa First part of interactive checks that coding systems encode regions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4299
diff changeset
542 (loop
68d1ca56cffa First part of interactive checks that coding systems encode regions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4299
diff changeset
543 named category
4559
bd1a68c34d44 Merge my change of 2008-05-14 to the query-coding-region code.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4558
diff changeset
544 for i from #x80 to #x9F
4549
68d1ca56cffa First part of interactive checks that coding systems encode regions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4299
diff changeset
545 do (unless (= i (aref decode-table i))
68d1ca56cffa First part of interactive checks that coding systems encode regions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4299
diff changeset
546 (return-from category 'no-conversion))
68d1ca56cffa First part of interactive checks that coding systems encode regions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4299
diff changeset
547 finally return 'iso-8-1))
68d1ca56cffa First part of interactive checks that coding systems encode regions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4299
diff changeset
548
68d1ca56cffa First part of interactive checks that coding systems encode regions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4299
diff changeset
549 (defun 8-bit-fixed-query-coding-region (begin end coding-system
68d1ca56cffa First part of interactive checks that coding systems encode regions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4299
diff changeset
550 &optional buffer errorp highlightp)
68d1ca56cffa First part of interactive checks that coding systems encode regions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4299
diff changeset
551 "The `query-coding-region' implementation for 8-bit-fixed coding systems.
68d1ca56cffa First part of interactive checks that coding systems encode regions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4299
diff changeset
552
68d1ca56cffa First part of interactive checks that coding systems encode regions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4299
diff changeset
553 Uses the `8-bit-fixed-query-from-unicode' and `8-bit-fixed-query-skip-chars'
68d1ca56cffa First part of interactive checks that coding systems encode regions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4299
diff changeset
554 coding system properties. The former is a hash table mapping from valid
68d1ca56cffa First part of interactive checks that coding systems encode regions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4299
diff changeset
555 Unicode code points to on-disk octets in the coding system; the latter a set
68d1ca56cffa First part of interactive checks that coding systems encode regions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4299
diff changeset
556 of characters as used by `skip-chars-forward'. Both of these properties are
68d1ca56cffa First part of interactive checks that coding systems encode regions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4299
diff changeset
557 generated automatically by `make-8-bit-coding-system'.
68d1ca56cffa First part of interactive checks that coding systems encode regions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4299
diff changeset
558
68d1ca56cffa First part of interactive checks that coding systems encode regions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4299
diff changeset
559 See that the documentation of `query-coding-region'; see also
68d1ca56cffa First part of interactive checks that coding systems encode regions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4299
diff changeset
560 `make-8-bit-coding-system'. "
68d1ca56cffa First part of interactive checks that coding systems encode regions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4299
diff changeset
561 (check-argument-type #'coding-system-p
68d1ca56cffa First part of interactive checks that coding systems encode regions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4299
diff changeset
562 (setq coding-system (find-coding-system coding-system)))
68d1ca56cffa First part of interactive checks that coding systems encode regions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4299
diff changeset
563 (check-argument-type #'integer-or-marker-p begin)
68d1ca56cffa First part of interactive checks that coding systems encode regions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4299
diff changeset
564 (check-argument-type #'integer-or-marker-p end)
68d1ca56cffa First part of interactive checks that coding systems encode regions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4299
diff changeset
565 (let ((from-unicode
4551
6812571bfcb9 Fix some bugs.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4549
diff changeset
566 (or (coding-system-get coding-system '8-bit-fixed-query-from-unicode)
6812571bfcb9 Fix some bugs.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4549
diff changeset
567 (coding-system-get (coding-system-base coding-system)
6812571bfcb9 Fix some bugs.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4549
diff changeset
568 '8-bit-fixed-query-from-unicode)))
4549
68d1ca56cffa First part of interactive checks that coding systems encode regions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4299
diff changeset
569 (skip-chars-arg
4551
6812571bfcb9 Fix some bugs.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4549
diff changeset
570 (or (coding-system-get coding-system '8-bit-fixed-query-skip-chars)
6812571bfcb9 Fix some bugs.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4549
diff changeset
571 (coding-system-get (coding-system-base coding-system)
6812571bfcb9 Fix some bugs.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4549
diff changeset
572 '8-bit-fixed-query-skip-chars)))
4549
68d1ca56cffa First part of interactive checks that coding systems encode regions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4299
diff changeset
573 (ranges (make-range-table))
68d1ca56cffa First part of interactive checks that coding systems encode regions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4299
diff changeset
574 char-after fail-range-start fail-range-end previous-fail extent
68d1ca56cffa First part of interactive checks that coding systems encode regions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4299
diff changeset
575 failed)
68d1ca56cffa First part of interactive checks that coding systems encode regions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4299
diff changeset
576 (check-type from-unicode hash-table)
68d1ca56cffa First part of interactive checks that coding systems encode regions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4299
diff changeset
577 (check-type skip-chars-arg string)
68d1ca56cffa First part of interactive checks that coding systems encode regions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4299
diff changeset
578 (save-excursion
4551
6812571bfcb9 Fix some bugs.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4549
diff changeset
579 (when highlightp
6812571bfcb9 Fix some bugs.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4549
diff changeset
580 (map-extents #'(lambda (extent ignored-arg)
6812571bfcb9 Fix some bugs.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4549
diff changeset
581 (when (eq 'query-coding-warning-face
6812571bfcb9 Fix some bugs.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4549
diff changeset
582 (extent-face extent))
6812571bfcb9 Fix some bugs.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4549
diff changeset
583 (delete-extent extent))) buffer begin end))
4549
68d1ca56cffa First part of interactive checks that coding systems encode regions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4299
diff changeset
584 (goto-char begin buffer)
68d1ca56cffa First part of interactive checks that coding systems encode regions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4299
diff changeset
585 (skip-chars-forward skip-chars-arg end buffer)
68d1ca56cffa First part of interactive checks that coding systems encode regions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4299
diff changeset
586 (while (< (point buffer) end)
4568
1d74a1d115ee Add #'query-coding-region tests; do the work necessary to get them running.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4567
diff changeset
587 ; (message
1d74a1d115ee Add #'query-coding-region tests; do the work necessary to get them running.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4567
diff changeset
588 ; "fail-range-start is %S, previous-fail %S, point is %S, end is %S"
1d74a1d115ee Add #'query-coding-region tests; do the work necessary to get them running.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4567
diff changeset
589 ; fail-range-start previous-fail (point buffer) end)
4549
68d1ca56cffa First part of interactive checks that coding systems encode regions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4299
diff changeset
590 (setq char-after (char-after (point buffer) buffer)
68d1ca56cffa First part of interactive checks that coding systems encode regions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4299
diff changeset
591 fail-range-start (point buffer))
4568
1d74a1d115ee Add #'query-coding-region tests; do the work necessary to get them running.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4567
diff changeset
592 ; (message "arguments are %S %S"
1d74a1d115ee Add #'query-coding-region tests; do the work necessary to get them running.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4567
diff changeset
593 ; (< (point buffer) end)
1d74a1d115ee Add #'query-coding-region tests; do the work necessary to get them running.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4567
diff changeset
594 ; (not (gethash (encode-char char-after 'ucs) from-unicode)))
4549
68d1ca56cffa First part of interactive checks that coding systems encode regions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4299
diff changeset
595 (while (and
68d1ca56cffa First part of interactive checks that coding systems encode regions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4299
diff changeset
596 (< (point buffer) end)
68d1ca56cffa First part of interactive checks that coding systems encode regions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4299
diff changeset
597 (not (gethash (encode-char char-after 'ucs) from-unicode)))
68d1ca56cffa First part of interactive checks that coding systems encode regions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4299
diff changeset
598 (forward-char 1 buffer)
68d1ca56cffa First part of interactive checks that coding systems encode regions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4299
diff changeset
599 (setq char-after (char-after (point buffer) buffer)
68d1ca56cffa First part of interactive checks that coding systems encode regions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4299
diff changeset
600 failed t))
68d1ca56cffa First part of interactive checks that coding systems encode regions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4299
diff changeset
601 (if (= fail-range-start (point buffer))
68d1ca56cffa First part of interactive checks that coding systems encode regions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4299
diff changeset
602 ;; The character can actually be encoded by the coding
68d1ca56cffa First part of interactive checks that coding systems encode regions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4299
diff changeset
603 ;; system; check the characters past it.
68d1ca56cffa First part of interactive checks that coding systems encode regions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4299
diff changeset
604 (forward-char 1 buffer)
68d1ca56cffa First part of interactive checks that coding systems encode regions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4299
diff changeset
605 ;; The character actually failed.
4568
1d74a1d115ee Add #'query-coding-region tests; do the work necessary to get them running.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4567
diff changeset
606 ; (message "past the move through, point now %S" (point buffer))
4549
68d1ca56cffa First part of interactive checks that coding systems encode regions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4299
diff changeset
607 (when errorp
68d1ca56cffa First part of interactive checks that coding systems encode regions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4299
diff changeset
608 (error 'text-conversion-error
68d1ca56cffa First part of interactive checks that coding systems encode regions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4299
diff changeset
609 (format "Cannot encode %s using coding system"
4551
6812571bfcb9 Fix some bugs.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4549
diff changeset
610 (buffer-substring fail-range-start (point buffer)
4549
68d1ca56cffa First part of interactive checks that coding systems encode regions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4299
diff changeset
611 buffer))
68d1ca56cffa First part of interactive checks that coding systems encode regions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4299
diff changeset
612 (coding-system-name coding-system)))
68d1ca56cffa First part of interactive checks that coding systems encode regions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4299
diff changeset
613 (put-range-table fail-range-start
68d1ca56cffa First part of interactive checks that coding systems encode regions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4299
diff changeset
614 ;; If char-after is non-nil, we're not at
68d1ca56cffa First part of interactive checks that coding systems encode regions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4299
diff changeset
615 ;; the end of the buffer.
68d1ca56cffa First part of interactive checks that coding systems encode regions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4299
diff changeset
616 (setq fail-range-end (if char-after
68d1ca56cffa First part of interactive checks that coding systems encode regions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4299
diff changeset
617 (point buffer)
68d1ca56cffa First part of interactive checks that coding systems encode regions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4299
diff changeset
618 (point-max buffer)))
68d1ca56cffa First part of interactive checks that coding systems encode regions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4299
diff changeset
619 t ranges)
68d1ca56cffa First part of interactive checks that coding systems encode regions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4299
diff changeset
620 (when highlightp
4568
1d74a1d115ee Add #'query-coding-region tests; do the work necessary to get them running.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4567
diff changeset
621 ; (message "highlighting")
4549
68d1ca56cffa First part of interactive checks that coding systems encode regions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4299
diff changeset
622 (setq extent (make-extent fail-range-start fail-range-end buffer))
68d1ca56cffa First part of interactive checks that coding systems encode regions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4299
diff changeset
623 (set-extent-priority extent (+ mouse-highlight-priority 2))
68d1ca56cffa First part of interactive checks that coding systems encode regions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4299
diff changeset
624 (set-extent-face extent 'query-coding-warning-face))
4551
6812571bfcb9 Fix some bugs.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4549
diff changeset
625 (skip-chars-forward skip-chars-arg end buffer)))
4568
1d74a1d115ee Add #'query-coding-region tests; do the work necessary to get them running.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4567
diff changeset
626 ; (message "about to give the result, ranges %S" ranges)
4549
68d1ca56cffa First part of interactive checks that coding systems encode regions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4299
diff changeset
627 (if failed
68d1ca56cffa First part of interactive checks that coding systems encode regions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4299
diff changeset
628 (values nil ranges)
68d1ca56cffa First part of interactive checks that coding systems encode regions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4299
diff changeset
629 (values t nil)))))
4145
edb00a8b4eff [xemacs-hg @ 2007-08-26 20:00:29 by aidan]
aidan
parents: 4103
diff changeset
630
4072
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
631 ;;;###autoload
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
632 (defun make-8-bit-coding-system (name unicode-map &optional description props)
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
633 "Make and return a fixed-width 8-bit CCL coding system named NAME.
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
634 NAME must be a symbol, and UNICODE-MAP a list.
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
635
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
636 UNICODE-MAP is a plist describing a map from octets in the coding
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
637 system NAME (as integers) to XEmacs characters. Those XEmacs
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
638 characters will be used explicitly on decoding, but for encoding (most
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
639 relevantly, on writing to disk) XEmacs characters that map to the same
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
640 Unicode code point will be unified. This means that the ISO-8859-?
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
641 characters that map to the same Unicode code point will not be
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
642 distinct when written to disk, which is normally what is intended; it
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
643 also means that East Asian Han characters from different XEmacs
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
644 character sets will not be distinct when written to disk, which is
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
645 less often what is intended.
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
646
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
647 Any octets not mapped will be decoded into the ISO 8859-1 characters with
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
648 the corresponding numeric value; unless another octet maps to that
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
649 character, in which case the Unicode private use area will be used. This
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
650 avoids spurious changes to files on disk when they contain octets that would
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
651 be otherwise remapped to the canonical values for the corresponding
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
652 characters in the coding system.
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
653
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
654 DESCRIPTION and PROPS are as in `make-coding-system', which see. This
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
655 function also accepts two additional (optional) properties in PROPS;
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
656 `aliases', giving a list of aliases to be initialized for this
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
657 coding-system, and `encode-failure-octet', an integer between 0 and 256 to
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
658 write in place of XEmacs characters that cannot be encoded, defaulting to
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
659 the code for tilde `~'. "
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
660 (check-argument-type #'symbolp name)
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
661 (check-argument-type #'listp unicode-map)
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
662 (check-argument-type #'stringp
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
663 (or description
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
664 (setq description
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
665 (format "Coding system used for %s." name))))
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
666 (check-valid-plist props)
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
667 (let ((encode-failure-octet (or (plist-get props 'encode-failure-octet)
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
668 (char-to-int ?~)))
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
669 (aliases (plist-get props 'aliases))
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
670 (hash-table-sym (gentemp (format "%s-encode-table" name)))
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
671 encode-program decode-program result decode-table encode-table)
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
672
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
673 ;; Some more sanity checking.
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
674 (check-argument-range encode-failure-octet 0 #xFF)
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
675 (check-argument-type #'listp aliases)
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
676
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
677 ;; Don't pass on our extra data to make-coding-system.
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
678 (setq props (plist-remprop props 'encode-failure-octet)
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
679 props (plist-remprop props 'aliases))
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
680
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
681 (multiple-value-setq
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
682 (decode-table encode-table)
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
683 (make-8-bit-create-decode-encode-tables unicode-map))
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
684
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
685 ;; Register the decode-table.
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
686 (define-translation-hash-table hash-table-sym encode-table)
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
687
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
688 ;; Generate the programs.
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
689 (setq decode-program (make-8-bit-generate-decode-program decode-table)
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
690 encode-program (make-8-bit-generate-encode-program
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
691 decode-table encode-table encode-failure-octet))
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
692 (unless (vectorp encode-program)
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
693 (setq encode-program
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
694 (apply #'vector
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
695 (nsublis (list (cons 'encode-table-sym hash-table-sym))
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
696 (copy-tree encode-program)))))
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
697 (unless (vectorp decode-program)
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
698 (setq decode-program
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
699 (apply #'vector decode-program)))
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
700
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
701 ;; And now generate the actual coding system.
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
702 (setq result
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
703 (make-coding-system
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
704 name 'ccl
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
705 description
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
706 (plist-put (plist-put props 'decode decode-program)
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
707 'encode encode-program)))
4295
eded49463f9a [xemacs-hg @ 2007-11-29 13:37:51 by aidan]
aidan
parents: 4145
diff changeset
708 (coding-system-put name '8-bit-fixed t)
4145
edb00a8b4eff [xemacs-hg @ 2007-08-26 20:00:29 by aidan]
aidan
parents: 4103
diff changeset
709 (coding-system-put name 'category
edb00a8b4eff [xemacs-hg @ 2007-08-26 20:00:29 by aidan]
aidan
parents: 4103
diff changeset
710 (make-8-bit-choose-category decode-table))
4549
68d1ca56cffa First part of interactive checks that coding systems encode regions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4299
diff changeset
711 (coding-system-put name '8-bit-fixed-query-skip-chars
4567
84d618b355f5 2008-08-09 Aidan Kehoe <kehoea@parhasard.net>
Aidan Kehoe <kehoea@parhasard.net>
parents: 4559
diff changeset
712 (skip-chars-quote
84d618b355f5 2008-08-09 Aidan Kehoe <kehoea@parhasard.net>
Aidan Kehoe <kehoea@parhasard.net>
parents: 4559
diff changeset
713 (apply #'string (append decode-table nil))))
4549
68d1ca56cffa First part of interactive checks that coding systems encode regions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4299
diff changeset
714 (coding-system-put name '8-bit-fixed-query-from-unicode encode-table)
68d1ca56cffa First part of interactive checks that coding systems encode regions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4299
diff changeset
715
68d1ca56cffa First part of interactive checks that coding systems encode regions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4299
diff changeset
716 (coding-system-put name 'query-coding-function
68d1ca56cffa First part of interactive checks that coding systems encode regions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4299
diff changeset
717 #'8-bit-fixed-query-coding-region)
68d1ca56cffa First part of interactive checks that coding systems encode regions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4299
diff changeset
718 (coding-system-put (intern (format "%s-unix" name))
68d1ca56cffa First part of interactive checks that coding systems encode regions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4299
diff changeset
719 'query-coding-function
68d1ca56cffa First part of interactive checks that coding systems encode regions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4299
diff changeset
720 #'8-bit-fixed-query-coding-region)
68d1ca56cffa First part of interactive checks that coding systems encode regions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4299
diff changeset
721 (coding-system-put (intern (format "%s-dos" name))
68d1ca56cffa First part of interactive checks that coding systems encode regions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4299
diff changeset
722 'query-coding-function
68d1ca56cffa First part of interactive checks that coding systems encode regions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4299
diff changeset
723 #'8-bit-fixed-query-coding-region)
68d1ca56cffa First part of interactive checks that coding systems encode regions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4299
diff changeset
724 (coding-system-put (intern (format "%s-mac" name))
68d1ca56cffa First part of interactive checks that coding systems encode regions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4299
diff changeset
725 'query-coding-function
68d1ca56cffa First part of interactive checks that coding systems encode regions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4299
diff changeset
726 #'8-bit-fixed-query-coding-region)
4072
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
727 (loop for alias in aliases
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
728 do (define-coding-system-alias alias name))
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
729 result))
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
730
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
731 (define-compiler-macro make-8-bit-coding-system (&whole form name unicode-map
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
732 &optional description props)
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
733 ;; We provide the compiler macro (= macro that is expanded only on
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
734 ;; compilation, and that can punt to a runtime version of the
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
735 ;; associate function if necessary) not for reasons of speed, though
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
736 ;; it does speed up things at runtime a little, but because the
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
737 ;; Unicode mappings are available at compile time in the dumped
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
738 ;; files, but they are not available at run time for the vast
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
739 ;; majority of them.
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
740
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
741 (if (not (and (and (consp name) (eq (car name) 'quote))
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
742 (and (consp unicode-map) (eq (car unicode-map) 'quote))
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
743 (and (or (and (consp props) (eq (car props) 'quote))
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
744 (null props)))))
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
745 ;; The call does not use literals; do it at runtime.
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
746 form
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
747 (setq name (cadr name)
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
748 unicode-map (cadr unicode-map)
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
749 props (if props (cadr props)))
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
750 (let ((encode-failure-octet
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
751 (or (plist-get props 'encode-failure-octet) (char-to-int ?~)))
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
752 (aliases (plist-get props 'aliases))
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
753 encode-program decode-program
4103
b4f4e0cc90f1 [xemacs-hg @ 2007-08-07 23:08:47 by aidan]
aidan
parents: 4090
diff changeset
754 decode-table encode-table)
4072
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
755
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
756 ;; Some sanity checking.
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
757 (check-argument-range encode-failure-octet 0 #xFF)
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
758 (check-argument-type #'listp aliases)
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
759
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
760 ;; Don't pass on our extra data to make-coding-system.
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
761 (setq props (plist-remprop props 'encode-failure-octet)
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
762 props (plist-remprop props 'aliases))
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
763
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
764 ;; Work out encode-table and decode-table.
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
765 (multiple-value-setq
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
766 (decode-table encode-table)
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
767 (make-8-bit-create-decode-encode-tables unicode-map))
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
768
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
769 ;; Generate the decode and encode programs.
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
770 (setq decode-program (make-8-bit-generate-decode-program decode-table)
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
771 encode-program (make-8-bit-generate-encode-program
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
772 decode-table encode-table encode-failure-octet))
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
773
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
774 ;; And return the generated code.
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
775 `(let ((encode-table-sym (gentemp (format "%s-encode-table" ',name)))
4103
b4f4e0cc90f1 [xemacs-hg @ 2007-08-07 23:08:47 by aidan]
aidan
parents: 4090
diff changeset
776 ;; The case-fold-search bind shouldn't be necessary. If I take
b4f4e0cc90f1 [xemacs-hg @ 2007-08-07 23:08:47 by aidan]
aidan
parents: 4090
diff changeset
777 ;; it, out, though, I get:
b4f4e0cc90f1 [xemacs-hg @ 2007-08-07 23:08:47 by aidan]
aidan
parents: 4090
diff changeset
778 ;;
b4f4e0cc90f1 [xemacs-hg @ 2007-08-07 23:08:47 by aidan]
aidan
parents: 4090
diff changeset
779 ;; (invalid-read-syntax "Multiply defined symbol label" 1)
b4f4e0cc90f1 [xemacs-hg @ 2007-08-07 23:08:47 by aidan]
aidan
parents: 4090
diff changeset
780 ;;
b4f4e0cc90f1 [xemacs-hg @ 2007-08-07 23:08:47 by aidan]
aidan
parents: 4090
diff changeset
781 ;; when the file is byte compiled.
4549
68d1ca56cffa First part of interactive checks that coding systems encode regions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4299
diff changeset
782 (case-fold-search t)
68d1ca56cffa First part of interactive checks that coding systems encode regions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4299
diff changeset
783 (encode-table ,encode-table))
68d1ca56cffa First part of interactive checks that coding systems encode regions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4299
diff changeset
784 (define-translation-hash-table encode-table-sym encode-table)
4103
b4f4e0cc90f1 [xemacs-hg @ 2007-08-07 23:08:47 by aidan]
aidan
parents: 4090
diff changeset
785 (make-coding-system
b4f4e0cc90f1 [xemacs-hg @ 2007-08-07 23:08:47 by aidan]
aidan
parents: 4090
diff changeset
786 ',name 'ccl ,description
b4f4e0cc90f1 [xemacs-hg @ 2007-08-07 23:08:47 by aidan]
aidan
parents: 4090
diff changeset
787 (plist-put (plist-put ',props 'decode
b4f4e0cc90f1 [xemacs-hg @ 2007-08-07 23:08:47 by aidan]
aidan
parents: 4090
diff changeset
788 ,(apply #'vector decode-program))
b4f4e0cc90f1 [xemacs-hg @ 2007-08-07 23:08:47 by aidan]
aidan
parents: 4090
diff changeset
789 'encode
b4f4e0cc90f1 [xemacs-hg @ 2007-08-07 23:08:47 by aidan]
aidan
parents: 4090
diff changeset
790 (apply #'vector
b4f4e0cc90f1 [xemacs-hg @ 2007-08-07 23:08:47 by aidan]
aidan
parents: 4090
diff changeset
791 (nsublis
b4f4e0cc90f1 [xemacs-hg @ 2007-08-07 23:08:47 by aidan]
aidan
parents: 4090
diff changeset
792 (list (cons
b4f4e0cc90f1 [xemacs-hg @ 2007-08-07 23:08:47 by aidan]
aidan
parents: 4090
diff changeset
793 'encode-table-sym
b4f4e0cc90f1 [xemacs-hg @ 2007-08-07 23:08:47 by aidan]
aidan
parents: 4090
diff changeset
794 (symbol-value 'encode-table-sym)))
b4f4e0cc90f1 [xemacs-hg @ 2007-08-07 23:08:47 by aidan]
aidan
parents: 4090
diff changeset
795 ',encode-program))))
4295
eded49463f9a [xemacs-hg @ 2007-11-29 13:37:51 by aidan]
aidan
parents: 4145
diff changeset
796 (coding-system-put ',name '8-bit-fixed t)
4549
68d1ca56cffa First part of interactive checks that coding systems encode regions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4299
diff changeset
797 (coding-system-put ',name 'category
68d1ca56cffa First part of interactive checks that coding systems encode regions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4299
diff changeset
798 ',(make-8-bit-choose-category decode-table))
68d1ca56cffa First part of interactive checks that coding systems encode regions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4299
diff changeset
799 (coding-system-put ',name '8-bit-fixed-query-skip-chars
4567
84d618b355f5 2008-08-09 Aidan Kehoe <kehoea@parhasard.net>
Aidan Kehoe <kehoea@parhasard.net>
parents: 4559
diff changeset
800 ',(skip-chars-quote
84d618b355f5 2008-08-09 Aidan Kehoe <kehoea@parhasard.net>
Aidan Kehoe <kehoea@parhasard.net>
parents: 4559
diff changeset
801 (apply #'string (append decode-table nil))))
4549
68d1ca56cffa First part of interactive checks that coding systems encode regions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4299
diff changeset
802 (coding-system-put ',name '8-bit-fixed-query-from-unicode encode-table)
68d1ca56cffa First part of interactive checks that coding systems encode regions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4299
diff changeset
803 (coding-system-put ',name 'query-coding-function
68d1ca56cffa First part of interactive checks that coding systems encode regions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4299
diff changeset
804 #'8-bit-fixed-query-coding-region)
68d1ca56cffa First part of interactive checks that coding systems encode regions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4299
diff changeset
805 (coding-system-put ',(intern (format "%s-unix" name))
68d1ca56cffa First part of interactive checks that coding systems encode regions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4299
diff changeset
806 'query-coding-function
68d1ca56cffa First part of interactive checks that coding systems encode regions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4299
diff changeset
807 #'8-bit-fixed-query-coding-region)
68d1ca56cffa First part of interactive checks that coding systems encode regions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4299
diff changeset
808 (coding-system-put ',(intern (format "%s-dos" name))
68d1ca56cffa First part of interactive checks that coding systems encode regions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4299
diff changeset
809 'query-coding-function
68d1ca56cffa First part of interactive checks that coding systems encode regions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4299
diff changeset
810 #'8-bit-fixed-query-coding-region)
68d1ca56cffa First part of interactive checks that coding systems encode regions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4299
diff changeset
811 (coding-system-put ',(intern (format "%s-mac" name))
68d1ca56cffa First part of interactive checks that coding systems encode regions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4299
diff changeset
812 'query-coding-function
68d1ca56cffa First part of interactive checks that coding systems encode regions.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4299
diff changeset
813 #'8-bit-fixed-query-coding-region)
4072
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
814 ,(macroexpand `(loop for alias in ',aliases
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
815 do (define-coding-system-alias alias
aa28d959af41 [xemacs-hg @ 2007-07-22 22:03:29 by aidan]
aidan
parents: 771
diff changeset
816 ',name)))
4103
b4f4e0cc90f1 [xemacs-hg @ 2007-08-07 23:08:47 by aidan]
aidan
parents: 4090
diff changeset
817 (find-coding-system ',name)))))
4299
f4c3ffe60a4f [xemacs-hg @ 2007-12-01 14:24:46 by aidan]
aidan
parents: 4295
diff changeset
818
f4c3ffe60a4f [xemacs-hg @ 2007-12-01 14:24:46 by aidan]
aidan
parents: 4295
diff changeset
819 ;; Ideally this would be in latin.el, but code-init.el uses it.
f4c3ffe60a4f [xemacs-hg @ 2007-12-01 14:24:46 by aidan]
aidan
parents: 4295
diff changeset
820 (make-8-bit-coding-system
f4c3ffe60a4f [xemacs-hg @ 2007-12-01 14:24:46 by aidan]
aidan
parents: 4295
diff changeset
821 'iso-8859-1
f4c3ffe60a4f [xemacs-hg @ 2007-12-01 14:24:46 by aidan]
aidan
parents: 4295
diff changeset
822 '() ;; No differences from Latin 1.
f4c3ffe60a4f [xemacs-hg @ 2007-12-01 14:24:46 by aidan]
aidan
parents: 4295
diff changeset
823 "ISO-8859-1 (Latin-1)"
f4c3ffe60a4f [xemacs-hg @ 2007-12-01 14:24:46 by aidan]
aidan
parents: 4295
diff changeset
824 '(mnemonic "Latin 1"
f4c3ffe60a4f [xemacs-hg @ 2007-12-01 14:24:46 by aidan]
aidan
parents: 4295
diff changeset
825 documentation "The most used encoding of Western Europe and the Americas."
f4c3ffe60a4f [xemacs-hg @ 2007-12-01 14:24:46 by aidan]
aidan
parents: 4295
diff changeset
826 aliases (iso-latin-1 latin-1)))