* emu-e20.el (ccl-use-symbol-as-program): New constant.
[elisp/apel.git] / emu-e20.el
1 ;;; emu-e20.el --- emu API implementation for Emacs 20.1 and 20.2
2
3 ;; Copyright (C) 1996,1997,1998 Free Software Foundation, Inc.
4
5 ;; Author: MORIOKA Tomohiko <morioka@jaist.ac.jp>
6 ;; Keywords: emulation, compatibility, Mule
7
8 ;; This file is part of emu.
9
10 ;; This program is free software; you can redistribute it and/or
11 ;; modify it under the terms of the GNU General Public License as
12 ;; published by the Free Software Foundation; either version 2, or (at
13 ;; your option) any later version.
14
15 ;; This program is distributed in the hope that it will be useful, but
16 ;; WITHOUT ANY WARRANTY; without even the implied warranty of
17 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
18 ;; General Public License for more details.
19
20 ;; You should have received a copy of the GNU General Public License
21 ;; along with GNU Emacs; see the file COPYING.  If not, write to the
22 ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
23 ;; Boston, MA 02111-1307, USA.
24
25 ;;; Commentary:
26
27 ;;    This module requires Emacs 20.1 and 20.2.
28
29 ;;; Code:
30
31 (require 'emu-e19)
32
33 (defun fontset-pixel-size (fontset)
34   (let* ((info (fontset-info fontset))
35          (height (aref info 1))
36          )
37     (cond ((> height 0) height)
38           ((string-match "-\\([0-9]+\\)-" fontset)
39            (string-to-number
40             (substring fontset (match-beginning 1)(match-end 1))
41             )
42            )
43           (t 0)
44           )))
45
46
47 ;;; @ character set
48 ;;;
49
50 ;; (defalias 'charset-columns 'charset-width)
51
52 (defun find-non-ascii-charset-string (string)
53   "Return a list of charsets in the STRING except ascii."
54   (delq 'ascii (find-charset-string string))
55   )
56
57 (defun find-non-ascii-charset-region (start end)
58   "Return a list of charsets except ascii
59 in the region between START and END."
60   (delq 'ascii (find-charset-string (buffer-substring start end)))
61   )
62
63
64 ;;; @ coding system
65 ;;;
66
67 (defsubst-maybe find-coding-system (obj)
68   "Return OBJ if it is a coding-system."
69   (if (coding-system-p obj)
70       obj))
71
72 (defalias 'set-process-input-coding-system 'set-process-coding-system)
73
74
75 ;;; @ MIME charset
76 ;;;
77
78 (defsubst encode-mime-charset-region (start end charset)
79   "Encode the text between START and END as MIME CHARSET."
80   (let (cs)
81     (if (and enable-multibyte-characters
82              (setq cs (mime-charset-to-coding-system charset)))
83         (encode-coding-region start end cs)
84       )))
85
86 (defsubst decode-mime-charset-region (start end charset &optional lbt)
87   "Decode the text between START and END as MIME CHARSET."
88   (let (cs)
89     (if (and enable-multibyte-characters
90              (setq cs (mime-charset-to-coding-system charset lbt)))
91         (decode-coding-region start end cs)
92       )))
93
94 (defsubst encode-mime-charset-string (string charset)
95   "Encode the STRING as MIME CHARSET."
96   (let (cs)
97     (if (and enable-multibyte-characters
98              (setq cs (mime-charset-to-coding-system charset)))
99         (encode-coding-string string cs)
100       string)))
101
102 (defsubst decode-mime-charset-string (string charset &optional lbt)
103   "Decode the STRING as MIME CHARSET."
104   (let (cs)
105     (if (and enable-multibyte-characters
106              (setq cs (mime-charset-to-coding-system charset lbt)))
107         (decode-coding-string string cs)
108       string)))
109
110
111 (defvar charsets-mime-charset-alist
112   '(((ascii)                                            . us-ascii)
113     ((ascii latin-iso8859-1)                            . iso-8859-1)
114     ((ascii latin-iso8859-2)                            . iso-8859-2)
115     ((ascii latin-iso8859-3)                            . iso-8859-3)
116     ((ascii latin-iso8859-4)                            . iso-8859-4)
117 ;;; ((ascii cyrillic-iso8859-5)                         . iso-8859-5)
118     ((ascii cyrillic-iso8859-5)                         . koi8-r)
119     ((ascii arabic-iso8859-6)                           . iso-8859-6)
120     ((ascii greek-iso8859-7)                            . iso-8859-7)
121     ((ascii hebrew-iso8859-8)                           . iso-8859-8)
122     ((ascii latin-iso8859-9)                            . iso-8859-9)
123     ((ascii latin-jisx0201
124             japanese-jisx0208-1978 japanese-jisx0208)   . iso-2022-jp)
125     ((ascii latin-jisx0201
126             katakana-jisx0201 japanese-jisx0208)        . shift_jis)
127     ((ascii korean-ksc5601)                             . euc-kr)
128     ((ascii chinese-gb2312)                             . cn-gb-2312)
129     ((ascii chinese-big5-1 chinese-big5-2)              . cn-big5)
130     ((ascii latin-iso8859-1 greek-iso8859-7
131             latin-jisx0201 japanese-jisx0208-1978
132             chinese-gb2312 japanese-jisx0208
133             korean-ksc5601 japanese-jisx0212)           . iso-2022-jp-2)
134     ((ascii latin-iso8859-1 greek-iso8859-7
135             latin-jisx0201 japanese-jisx0208-1978
136             chinese-gb2312 japanese-jisx0208
137             korean-ksc5601 japanese-jisx0212
138             chinese-cns11643-1 chinese-cns11643-2)      . iso-2022-int-1)
139     ((ascii latin-iso8859-1 latin-iso8859-2
140             cyrillic-iso8859-5 greek-iso8859-7
141             latin-jisx0201 japanese-jisx0208-1978
142             chinese-gb2312 japanese-jisx0208
143             korean-ksc5601 japanese-jisx0212
144             chinese-cns11643-1 chinese-cns11643-2
145             chinese-cns11643-3 chinese-cns11643-4
146             chinese-cns11643-5 chinese-cns11643-6
147             chinese-cns11643-7)                         . iso-2022-int-1)
148     ))
149
150
151 ;;; @ character
152 ;;;
153
154 ;;; @@ Mule emulating aliases
155 ;;;
156 ;;; You should not use them.
157
158 (defun char-category (character)
159   "Return string of category mnemonics for CHAR in TABLE.
160 CHAR can be any multilingual character
161 TABLE defaults to the current buffer's category table."
162   (category-set-mnemonics (char-category-set character))
163   )
164
165
166 ;;; @ CCL
167 ;;;
168
169 (eval-and-compile
170 (defconst ccl-use-symbol-as-program
171   (eval-when-compile
172     (define-ccl-program ew-ccl-identity-program
173       '(1 ((read r0) (loop (write-read-repeat r0)))))
174     (condition-case nil
175         (progn
176           (make-coding-system
177            'ew-ccl-identity 4 ?I
178            "Identity coding system for byte-compile time checking"
179            '(ew-ccl-identity-program . ew-ccl-identity-program))
180           t)
181       (error nil)))
182   "t if CCL related builtins accept symbol as CCL
183 program. (20.2 with ExCCL, 20.3 or later)
184 Otherwise nil (20.2 without ExCCL or former).
185
186 Because emu provides functions accepting symbol as CCL program,
187 user programs should not refer this variable.")
188
189 (defun make-ccl-coding-system
190   (coding-system mnemonic doc-string decoder encoder)
191   "Define a new CODING-SYSTEM (symbol) by CCL programs
192 DECODER (symbol) and ENCODER (symbol)."
193   (unless ccl-use-symbol-as-program
194     (setq decoder (symbol-value decoder))
195     (setq encoder (symbol-value encoder)))
196   (make-coding-system coding-system 4 mnemonic doc-string
197     (cons decoder encoder)))
198 )
199
200 (eval-when-compile
201 (define-ccl-program test-ccl-eof-block
202   '(1
203     (read r0)
204     (write "[EOF]")))
205
206 (make-ccl-coding-system 'test-ccl-eof-block-cs ?T
207   "CCL_EOF_BLOCK tester"
208   'test-ccl-eof-block
209   'test-ccl-eof-block)
210 )
211
212 (defconst ccl-encoder-eof-block-is-broken
213   (eval-when-compile
214     (not (equal (encode-coding-string "" 'test-ccl-eof-block-cs)
215                 "[EOF]")))
216   "t if CCL_EOF_BLOCK is not executed when coding system encounts EOF on
217 encoding.")
218
219 (defconst ccl-decoder-eof-block-is-broken
220   (eval-when-compile
221     (not (equal (decode-coding-string "" 'test-ccl-eof-block-cs)
222                 "[EOF]")))
223   "t if CCL_EOF_BLOCK is not executed when coding system encounts EOF on
224 decoding.")
225
226 (defconst ccl-eof-block-is-broken
227   (or ccl-encoder-eof-block-is-broken
228       ccl-decoder-eof-block-is-broken))
229
230 (unless ccl-use-symbol-as-program
231
232 (when (subrp (symbol-function 'ccl-execute))
233   (fset 'ccl-vector-program-execute
234     (symbol-function 'ccl-execute))
235   (defun ccl-execute (ccl-prog reg)
236     "Execute CCL-PROG `ccl-vector-program-execute'.
237 If CCL-PROG is symbol, it is dereferenced.
238 \[Emacs 20.3 emulating function]"
239     (ccl-vector-program-execute
240       (if (symbolp ccl-prog) (symbol-value ccl-prog) ccl-prog)
241       reg)))
242
243 (when (subrp (symbol-function 'ccl-execute-on-string))
244   (fset 'ccl-vector-program-execute-on-string
245     (symbol-function 'ccl-execute-on-string))
246   (defun ccl-execute-on-string (ccl-prog status &optional contin)
247     "Execute CCL-PROG `ccl-vector-program-execute-on-string'.
248 If CCL-PROG is symbol, it is dereferenced.
249 \[Emacs 20.3 emulating function]"
250     (ccl-vector-program-execute-on-string
251       (if (symbolp ccl-prog) (symbol-value ccl-prog) ccl-prog)
252       status
253       contin)))
254
255 )
256
257
258 ;;; @ end
259 ;;;
260
261 (require 'emu-20)
262
263 (defalias 'insert-binary-file-contents 'insert-file-contents-as-binary)
264 (make-obsolete 'insert-binary-file-contents 'insert-file-contents-as-binary)
265
266 (defalias 'insert-binary-file-contents-literally
267   'insert-file-contents-literally)
268
269 (if (and (fboundp 'set-buffer-multibyte)
270          (subrp (symbol-function 'set-buffer-multibyte)))
271     (require 'emu-e20_3) ; for Emacs 20.3
272   (require 'emu-e20_2) ; for Emacs 20.1 and 20.2
273   )
274
275
276 (provide 'emu-e20)
277
278 ;;; emu-e20.el ends here