diff options
| author | Kenichi Handa | 1997-06-10 00:56:20 +0000 |
|---|---|---|
| committer | Kenichi Handa | 1997-06-10 00:56:20 +0000 |
| commit | 88d9cc1e14949e2eac70f9a1ed01dbc06f97fd26 (patch) | |
| tree | f008a936d0aa8672d425636728ea73379d8eb55b | |
| parent | 795a5f848eb63385af34f0fa55f48e25c8d86c5c (diff) | |
| download | emacs-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.el | 186 |
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. |
| 33 | TYPE should be `list' or `vector'. | 33 | TYPE should be `list' or `vector'." |
| 34 | Multibyte 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. | 204 | If optional arg BASE-ONLY is non-nil, each element of the list |
| 206 | TARGET-TYPE specifies a type of the target: `file', `process', or `network'. | 205 | is a base coding system or a list of coding systems. |
| 207 | TARGET-TYPE tells which slots of coding-system-alist should be affected. | 206 | In the latter case, the first element is a base coding system, |
| 208 | If `file', it affects slots for insert-file-contents and write-region. | 207 | and 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. | ||
| 212 | REGEXP is a regular expression matching a target of I/O operation. | ||
| 213 | CODING-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. | ||
| 216 | Optional 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. | ||
| 219 | If OPERATION is specified, TARGET-TYPE is ignored. | ||
| 220 | See 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. | ||
| 246 | The base is a coding system of which coding-system property is a | ||
| 247 | coding-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. | ||
| 287 | Two coding systems are identical if two symbols are equal | ||
| 288 | or 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. |