comparison lisp/international/mule-util.el @ 18299:c6f35cac24b4

(coding-system-parent): New function. (coding-system-lessp): New function. (coding-system-list): Sort coding systems by coding-system-lessp. An element of returned list is always coing system, never be a cons. (modify-coding-system-alist): Renamed from set-coding-system-alist. (prefer-coding-system): New function. (compose-chars-component): But fix for handling a composite character of no compositon rule.
author Kenichi Handa <handa@m17n.org>
date Wed, 18 Jun 1997 12:55:11 +0000
parents c913160e34a7
children 083d035f7932
comparison
equal deleted inserted replaced
18298:3d036a21fc93 18299:c6f35cac24b4
194 (throw 'lookup-nested-alist-tag t)))) 194 (throw 'lookup-nested-alist-tag t))))
195 ;; KEYSEQ is too long. 195 ;; KEYSEQ is too long.
196 (if nil-for-too-long nil i) 196 (if nil-for-too-long nil i)
197 alist))) 197 alist)))
198 198
199
199 ;; Coding system related functions. 200 ;; Coding system related functions.
200
201 ;;;###autoload
202 (defun coding-system-list (&optional base-only)
203 "Return a list of all existing coding systems.
204 If optional arg BASE-ONLY is non-nil, each element of the list
205 is a base coding system or a list of coding systems.
206 In the latter case, the first element is a base coding system,
207 and the remainings are aliases of it."
208 (let (l)
209 (mapatoms (lambda (x) (if (get x 'coding-system) (setq l (cons x 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 201
243 ;;;###autoload 202 ;;;###autoload
244 (defun coding-system-base (coding-system) 203 (defun coding-system-base (coding-system)
245 "Return a base of CODING-SYSTEM. 204 "Return a base of CODING-SYSTEM.
246 The base is a coding system of which coding-system property is a 205 The base is a coding system of which coding-system property is a
247 coding-spec (see the function `make-coding-system')." 206 coding-spec (see the function `make-coding-system')."
248 (let ((coding-spec (get coding-system 'coding-system))) 207 (let ((coding-spec (get coding-system 'coding-system)))
249 (if (vectorp coding-spec) 208 (if (vectorp coding-spec)
250 coding-system 209 coding-system
251 (coding-system-base coding-spec)))) 210 (coding-system-base coding-spec))))
211
212 ;;;###autoload
213 (defun coding-system-eol-type-mnemonic (coding-system)
214 "Return mnemonic letter of eol-type of CODING-SYSTEM."
215 (let ((eol-type (coding-system-eol-type coding-system)))
216 (cond ((vectorp eol-type) eol-mnemonic-undecided)
217 ((eq eol-type 0) eol-mnemonic-unix)
218 ((eq eol-type 1) eol-mnemonic-unix)
219 ((eq eol-type 2) eol-mnemonic-unix)
220 (t ?-))))
221
222 ;;;###autoload
223 (defun coding-system-post-read-conversion (coding-system)
224 "Return post-read-conversion property of CODING-SYSTEM."
225 (and coding-system
226 (symbolp coding-system)
227 (or (get coding-system 'post-read-conversion)
228 (coding-system-post-read-conversion
229 (get coding-system 'coding-system)))))
230
231 ;;;###autoload
232 (defun coding-system-pre-write-conversion (coding-system)
233 "Return pre-write-conversion property of CODING-SYSTEM."
234 (and coding-system
235 (symbolp coding-system)
236 (or (get coding-system 'pre-write-conversion)
237 (coding-system-pre-write-conversion
238 (get coding-system 'coding-system)))))
239
240 ;;;###autoload
241 (defun coding-system-unification-table (coding-system)
242 "Return unification-table property of CODING-SYSTEM."
243 (and coding-system
244 (symbolp coding-system)
245 (or (get coding-system 'unification-table)
246 (coding-system-unification-table
247 (get coding-system 'coding-system)))))
248
249 ;;;###autoload
250 (defun coding-system-parent (coding-system)
251 "Return parent of CODING-SYSTEM."
252 (let ((parent (get coding-system 'parent-coding-system)))
253 (and parent
254 (or (coding-system-parent parent)
255 parent))))
256
257 (defun coding-system-lessp (x y)
258 (cond ((eq x 'no-conversion) t)
259 ((eq y 'no-conversion) nil)
260 ((eq x 'emacs-mule) t)
261 ((eq y 'emacs-mule) nil)
262 ((eq x 'undecided) t)
263 ((eq y 'undecided) nil)
264 (t (let ((c1 (coding-system-mnemonic x))
265 (c2 (coding-system-mnemonic y)))
266 (or (< (downcase c1) (downcase c2))
267 (and (not (> (downcase c1) (downcase c2)))
268 (< c1 c2)))))))
269
270 ;;;###autoload
271 (defun coding-system-list (&optional base-only)
272 "Return a list of all existing coding systems.
273 If optional arg BASE-ONLY is non-nil, only base coding systems are listed."
274 (let (l)
275 (mapatoms (lambda (x) (if (get x 'coding-system) (setq l (cons x l)))))
276 (let* ((codings (sort l 'coding-system-lessp))
277 (tail (cons nil codings))
278 coding)
279 ;; At first, remove subsidiary coding systems (eol variants) and
280 ;; alias coding systems (if necessary).
281 (while (cdr tail)
282 (setq coding (car (cdr tail)))
283 (if (or (get coding 'eol-variant)
284 (and base-only (coding-system-parent coding)))
285 (setcdr tail (cdr (cdr tail)))
286 (setq tail (cdr tail))))
287 codings)))
288
289 ;;;###autoload
290 (defun modify-coding-system-alist (target-type regexp coding-system)
291 "Modify one of look up tables for finding a coding system on I/O operation.
292 There are three of such tables, file-coding-system-alist,
293 process-coding-system-alist, and network-coding-system-alist.
294
295 TARGET-TYPE specifies which of them to modify.
296 If it is `file', it affects file-coding-system-alist (which see).
297 If it is `process', it affects process-coding-system-alist (which see).
298 If it is `network', it affects network-codign-system-alist (which see).
299
300 REGEXP is a regular expression matching a target of I/O operation.
301 The target is a file name if TARGET-TYPE is `file', a program name if
302 TARGET-TYPE is `process', or a network service name or a port number
303 to connect to if TARGET-TYPE is `network'.
304
305 CODING-SYSTEM is a coding system to perform code conversion on the I/O
306 operation, or a cons of coding systems for decoding and encoding
307 respectively, or a function symbol which returns the cons."
308 (or (memq target-type '(file process network))
309 (error "Invalid target type: %s" target-type))
310 (or (stringp regexp)
311 (and (eq target-type 'network) (integerp regexp))
312 (error "Invalid regular expression: %s" regexp))
313 (if (symbolp coding-system)
314 (if (not (fboundp coding-system))
315 (progn
316 (check-coding-system coding-system)
317 (setq coding-system (cons coding-system coding-system))))
318 (check-coding-system (car coding-system))
319 (check-coding-system (cdr coding-system)))
320 (cond ((eq target-type 'file)
321 (let ((slot (assoc regexp file-coding-system-alist)))
322 (if slot
323 (setcdr slot coding-system)
324 (setq file-coding-system-alist
325 (cons (cons regexp coding-system)
326 file-coding-system-alist)))))
327 ((eq target-type 'process)
328 (let ((slot (assoc regexp process-coding-system-alist)))
329 (if slot
330 (setcdr slot coding-system)
331 (setq process-coding-system-alist
332 (cons (cons regexp coding-system)
333 process-coding-system-alist)))))
334 (t
335 (let ((slot (assoc regexp network-coding-system-alist)))
336 (if slot
337 (setcdr slot coding-system)
338 (setq network-coding-system-alist
339 (cons (cons regexp coding-system)
340 network-coding-system-alist)))))))
252 341
253 ;;;###autoload 342 ;;;###autoload
254 (defun coding-system-plist (coding-system) 343 (defun coding-system-plist (coding-system)
255 "Return property list of CODING-SYSTEM." 344 "Return property list of CODING-SYSTEM."
256 (let ((found nil) 345 (let ((found nil)
281 'pre-write-conversion pre-write-conversion 370 'pre-write-conversion pre-write-conversion
282 'unification-table unification-table))) 371 'unification-table unification-table)))
283 372
284 ;;;###autoload 373 ;;;###autoload
285 (defun coding-system-equal (coding-system-1 coding-system-2) 374 (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. 375 "Return t if and only if CODING-SYSTEM-1 and CODING-SYSTEM-2 are identical.
287 Two coding systems are identical if two symbols are equal 376 Two coding systems are identical if two symbols are equal
288 or one is an alias of the other." 377 or one is an alias of the other."
289 (equal (coding-system-plist coding-system-1) 378 (or (eq coding-system-1 coding-system-2)
290 (coding-system-plist coding-system-2))) 379 (equal (coding-system-plist coding-system-1)
291 380 (coding-system-plist coding-system-2))))
292 ;;;###autoload 381
293 (defun coding-system-eol-type-mnemonic (coding-system) 382 ;;;###autoload
294 "Return mnemonic letter of eol-type of CODING-SYSTEM." 383 (defun prefer-coding-system (coding-system)
295 (let ((eol-type (coding-system-eol-type coding-system))) 384 (interactive "zPrefered coding system: ")
296 (cond ((vectorp eol-type) eol-mnemonic-undecided) 385 (if (not (and coding-system (coding-system-p coding-system)))
297 ((eq eol-type 0) eol-mnemonic-unix) 386 (error "Invalid coding system `%s'" coding-system))
298 ((eq eol-type 1) eol-mnemonic-unix) 387 (let ((coding-category (coding-system-category coding-system))
299 ((eq eol-type 2) eol-mnemonic-unix) 388 (parent (coding-system-parent coding-system)))
300 (t ?-)))) 389 (if (not coding-category)
301 390 ;; CODING-SYSTEM is no-conversion or undecided.
302 ;;;###autoload 391 (error "Can't prefer the coding system `%s'" coding-system))
303 (defun coding-system-post-read-conversion (coding-system) 392 (set coding-category (or parent coding-system))
304 "Return post-read-conversion property of CODING-SYSTEM." 393 (if (not (eq coding-category (car coding-category-list)))
305 (and coding-system 394 ;; We must change the order.
306 (symbolp coding-system) 395 (setq coding-category-list
307 (or (get coding-system 'post-read-conversion) 396 (cons coding-category
308 (coding-system-post-read-conversion 397 (delq coding-category coding-category-list))))
309 (get coding-system 'coding-system))))) 398 (if (and parent (interactive-p))
310 399 (message "Highest priority is set to %s (parent of %s)"
311 ;;;###autoload 400 parent coding-system))
312 (defun coding-system-pre-write-conversion (coding-system) 401 ))
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)))))
328 402
329 403
330 ;;; Composite charcater manipulations. 404 ;;; Composite charcater manipulations.
331 405
332 ;;;###autoload 406 ;;;###autoload
408 (defun compose-chars-component (ch) 482 (defun compose-chars-component (ch)
409 (if (< ch 128) 483 (if (< ch 128)
410 (format "\240%c" (+ ch 128)) 484 (format "\240%c" (+ ch 128))
411 (let ((str (char-to-string ch))) 485 (let ((str (char-to-string ch)))
412 (if (cmpcharp ch) 486 (if (cmpcharp ch)
413 (if (/= (aref str 1) ?\xFF) 487 (substring str (if (= (aref str 1) ?\xFF) 2 1))
414 (error "Char %c can't be composed" ch)
415 (substring str 2))
416 (aset str 0 (+ (aref str 0) ?\x20)) 488 (aset str 0 (+ (aref str 0) ?\x20))
417 str)))) 489 str))))
418 490
419 ;; Return a string for composition rule RULE to be embedded in 491 ;; Return a string for composition rule RULE to be embedded in
420 ;; multibyte form of composite character. 492 ;; multibyte form of composite character.