aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKenichi Handa1997-06-10 00:56:20 +0000
committerKenichi Handa1997-06-10 00:56:20 +0000
commit88d9cc1e14949e2eac70f9a1ed01dbc06f97fd26 (patch)
treef008a936d0aa8672d425636728ea73379d8eb55b
parent795a5f848eb63385af34f0fa55f48e25c8d86c5c (diff)
downloademacs-88d9cc1e14949e2eac70f9a1ed01dbc06f97fd26.tar.gz
emacs-88d9cc1e14949e2eac70f9a1ed01dbc06f97fd26.zip
(set-coding-system-alist): Deleted.
(string-to-sequence): Doc string modified. (coding-system-list): Add optional arg BASE-ONLY. (coding-system-base): New function. (coding-system-plist): New function. (coding-system-equal): New function. (coding-system-unification-table): New function.
-rw-r--r--lisp/international/mule-util.el186
1 files changed, 125 insertions, 61 deletions
diff --git a/lisp/international/mule-util.el b/lisp/international/mule-util.el
index 2cd442c47b6..97404446c69 100644
--- a/lisp/international/mule-util.el
+++ b/lisp/international/mule-util.el
@@ -30,8 +30,7 @@
30;;;###autoload 30;;;###autoload
31(defun string-to-sequence (string type) 31(defun string-to-sequence (string type)
32 "Convert STRING to a sequence of TYPE which contains characters in STRING. 32 "Convert STRING to a sequence of TYPE which contains characters in STRING.
33TYPE should be `list' or `vector'. 33TYPE should be `list' or `vector'."
34Multibyte characters are conserned."
35 (or (eq type 'list) (eq type 'vector) 34 (or (eq type 'list) (eq type 'vector)
36 (error "Invalid type: %s" type)) 35 (error "Invalid type: %s" type))
37 (let* ((len (length string)) 36 (let* ((len (length string))
@@ -200,67 +199,132 @@ Optional 3rd argument NIL-FOR-TOO-LONG non-nil means return nil
200;; Coding system related functions. 199;; Coding system related functions.
201 200
202;;;###autoload 201;;;###autoload
203(defun set-coding-system-alist (target-type regexp coding-system 202(defun coding-system-list (&optional base-only)
204 &optional operation) 203 "Return a list of all existing coding systems.
205 "Update `coding-system-alist' according to the arguments. 204If optional arg BASE-ONLY is non-nil, each element of the list
206TARGET-TYPE specifies a type of the target: `file', `process', or `network'. 205is a base coding system or a list of coding systems.
207 TARGET-TYPE tells which slots of coding-system-alist should be affected. 206In the latter case, the first element is a base coding system,
208 If `file', it affects slots for insert-file-contents and write-region. 207and the remainings are aliases of it."
209 If `process', it affects slots for call-process, call-process-region, and
210 start-process.
211 If `network', it affects a slot for open-network-process.
212REGEXP is a regular expression matching a target of I/O operation.
213CODING-SYSTEM is a coding system to perform code conversion
214 on the I/O operation, or a cons of coding systems for decoding and
215 encoding respectively, or a function symbol which returns the cons.
216Optional arg OPERATION if non-nil specifies directly one of slots above.
217 The valid value is: insert-file-contents, write-region,
218 call-process, call-process-region, start-process, or open-network-stream.
219If OPERATION is specified, TARGET-TYPE is ignored.
220See the documentation of `coding-system-alist' for more detail."
221 (or (stringp regexp)
222 (error "Invalid regular expression: %s" regexp))
223 (or (memq target-type '(file process network))
224 (error "Invalid target type: %s" target-type))
225 (if (symbolp coding-system)
226 (if (not (fboundp coding-system))
227 (progn
228 (check-coding-system coding-system)
229 (setq coding-system (cons coding-system coding-system))))
230 (check-coding-system (car coding-system))
231 (check-coding-system (cdr coding-system)))
232 (let ((op-list (if operation (list operation)
233 (cond ((eq target-type 'file)
234 '(insert-file-contents write-region))
235 ((eq target-type 'process)
236 '(call-process call-process-region start-process))
237 (t ; i.e. (eq target-type network)
238 '(open-network-stream)))))
239 slot)
240 (while op-list
241 (setq slot (assq (car op-list) coding-system-alist))
242 (if slot
243 (let ((chain (cdr slot)))
244 (if (catch 'tag
245 (while chain
246 (if (string= regexp (car (car chain)))
247 (progn
248 (setcdr (car chain) coding-system)
249 (throw 'tag nil)))
250 (setq chain (cdr chain)))
251 t)
252 (setcdr slot (cons (cons regexp coding-system) (cdr slot)))))
253 (setq coding-system-alist
254 (cons (cons (car op-list) (list (cons regexp coding-system)))
255 coding-system-alist)))
256 (setq op-list (cdr op-list)))))
257
258;;;###autoload
259(defun coding-system-list ()
260 "Return a list of all existing coding systems."
261 (let (l) 208 (let (l)
262 (mapatoms (lambda (x) (if (get x 'coding-system) (setq l (cons x l))))) 209 (mapatoms (lambda (x) (if (get x 'coding-system) (setq l (cons x l)))))
263 l)) 210 (if (not base-only)
211 l
212 (let* ((codings (sort l (function
213 (lambda (x y)
214 (<= (coding-system-mnemonic x)
215 (coding-system-mnemonic y))))))
216 (tail (cons nil codings))
217 (aliases nil) ; ((BASE ALIAS ...) ...)
218 base coding)
219 ;; At first, remove subsidiary coding systems (eol variants) and
220 ;; move alias coding systems to ALIASES.
221 (while (cdr tail)
222 (setq coding (car (cdr tail)))
223 (if (get coding 'eol-variant)
224 (setcdr tail (cdr (cdr tail)))
225 (setq base (coding-system-base coding))
226 (if (and (not (eq coding base))
227 (coding-system-equal coding base))
228 (let ((slot (memq base aliases)))
229 (setcdr tail (cdr (cdr tail)))
230 (if slot
231 (setcdr slot (cons coding (cdr slot)))
232 (setq aliases (cons (list base coding) aliases))))
233 (setq tail (cdr tail)))))
234 ;; Then, replace a coding system who has aliases with a list.
235 (setq tail codings)
236 (while tail
237 (let ((alias (assq (car tail) aliases)))
238 (if alias
239 (setcar tail alias)))
240 (setq tail (cdr tail)))
241 codings))))
242
243;;;###autoload
244(defun coding-system-base (coding-system)
245 "Return a base of CODING-SYSTEM.
246The base is a coding system of which coding-system property is a
247coding-spec (see the function `make-coding-system')."
248 (let ((coding-spec (get coding-system 'coding-system)))
249 (if (vectorp coding-spec)
250 coding-system
251 (coding-system-base coding-spec))))
252
253;;;###autoload
254(defun coding-system-plist (coding-system)
255 "Return property list of CODING-SYSTEM."
256 (let ((found nil)
257 coding-spec eol-type
258 post-read-conversion pre-write-conversion
259 unification-table)
260 (while (not found)
261 (or eol-type
262 (setq eol-type (get coding-system 'eol-type)))
263 (or post-read-conversion
264 (setq post-read-conversion
265 (get coding-system 'post-read-conversion)))
266 (or pre-write-conversion
267 (setq pre-write-conversion
268 (get coding-system 'pre-write-conversion)))
269 (or unification-table
270 (setq unification-table
271 (get coding-system 'unification-table)))
272 (setq coding-spec (get coding-system 'coding-system))
273 (if (and coding-spec (symbolp coding-spec))
274 (setq coding-system coding-spec)
275 (setq found t)))
276 (if (not coding-spec)
277 (error "Invalid coding system: %s" coding-system))
278 (list 'coding-spec coding-spec
279 'eol-type eol-type
280 'post-read-conversion post-read-conversion
281 'pre-write-conversion pre-write-conversion
282 'unification-table unification-table)))
283
284;;;###autoload
285(defun coding-system-equal (coding-system-1 coding-system-2)
286 "Return t if and only of CODING-SYSTEM-1 and CODING-SYSTEM-2 are identical.
287Two coding systems are identical if two symbols are equal
288or one is an alias of the other."
289 (equal (coding-system-plist coding-system-1)
290 (coding-system-plist coding-system-2)))
291
292;;;###autoload
293(defun coding-system-eol-type-mnemonic (coding-system)
294 "Return mnemonic letter of eol-type of CODING-SYSTEM."
295 (let ((eol-type (coding-system-eol-type coding-system)))
296 (cond ((vectorp eol-type) eol-mnemonic-undecided)
297 ((eq eol-type 0) eol-mnemonic-unix)
298 ((eq eol-type 1) eol-mnemonic-unix)
299 ((eq eol-type 2) eol-mnemonic-unix)
300 (t ?-))))
301
302;;;###autoload
303(defun coding-system-post-read-conversion (coding-system)
304 "Return post-read-conversion property of CODING-SYSTEM."
305 (and coding-system
306 (symbolp coding-system)
307 (or (get coding-system 'post-read-conversion)
308 (coding-system-post-read-conversion
309 (get coding-system 'coding-system)))))
310
311;;;###autoload
312(defun coding-system-pre-write-conversion (coding-system)
313 "Return pre-write-conversion property of CODING-SYSTEM."
314 (and coding-system
315 (symbolp coding-system)
316 (or (get coding-system 'pre-write-conversion)
317 (coding-system-pre-write-conversion
318 (get coding-system 'coding-system)))))
319
320;;;###autoload
321(defun coding-system-unification-table (coding-system)
322 "Return unification-table property of CODING-SYSTEM."
323 (and coding-system
324 (symbolp coding-system)
325 (or (get coding-system 'unification-table)
326 (coding-system-unification-table
327 (get coding-system 'coding-system)))))
264 328
265 329
266;;; Composite charcater manipulations. 330;;; Composite charcater manipulations.