aboutsummaryrefslogtreecommitdiffstats
path: root/lisp
diff options
context:
space:
mode:
authorKenichi Handa1997-10-21 10:47:35 +0000
committerKenichi Handa1997-10-21 10:47:35 +0000
commit0269ddfb0d5e3d3a417819af6ae146dd504babb5 (patch)
tree32e830039fe63a9b701552938c4de8711d56f0bf /lisp
parentb9c4dcd8f194c1f47250a41339f7e07a5710b8f2 (diff)
downloademacs-0269ddfb0d5e3d3a417819af6ae146dd504babb5.tar.gz
emacs-0269ddfb0d5e3d3a417819af6ae146dd504babb5.zip
The summary of the following changes:
(1) Make all coding systems (including aliases and subsidiaries) directly have coding-spec vector in `coding-system' property. (2) Properties of a coding system (except for `coding-system' and `eol-type') is embeded in PLIST slot of coding-spec vector. (coding-spec-plist-idx): Initialize to 3. (coding-system-spec-ref): Deleted. (coding-system-spec): Moved from src/coding.c. (coding-system-type): Adjusted for the above change. (coding-system-mnemonic): Likewise. (coding-system-doc-string): Likewise. (coding-system-flags): Likewise. (coding-system-eol-type): Likewise. (coding-system-category): Likewise. (coding-system-get, coding-system-put, coding-system-category): New functions. (coding-system-base): Moved from mule-util.el and adjusted for the above change. (coding-system-parent): Make it obsolete alias of coding-system-base. (make-subsidiary-coding-system): Adjusted for the above change. Update coding-system-list and coding-system-alist. (make-coding-system): Likewise. (set-buffer-file-coding-system): Typo in doc-string fixed. (after-insert-file-set-buffer-file-coding-system): Change enable-multibyte-characters only when find-new-buffer-file-coding-system returns non-nil value. (find-new-buffer-file-coding-system): Adjusted for the abobe change.
Diffstat (limited to 'lisp')
-rw-r--r--lisp/international/mule.el288
1 files changed, 176 insertions, 112 deletions
diff --git a/lisp/international/mule.el b/lisp/international/mule.el
index c23879838f1..717a3494491 100644
--- a/lisp/international/mule.el
+++ b/lisp/international/mule.el
@@ -247,6 +247,7 @@ See also the documentation of make-char."
247 (and (or (= (nth 1 l) 0) (eq (nth 2 l) 0)) 247 (and (or (= (nth 1 l) 0) (eq (nth 2 l) 0))
248 (not (eq (car l) 'composition))))) 248 (not (eq (car l) 'composition)))))
249 249
250
250;; Coding system staffs 251;; Coding system staffs
251 252
252;; Coding system is a symbol that has the property `coding-system'. 253;; Coding system is a symbol that has the property `coding-system'.
@@ -260,92 +261,150 @@ See also the documentation of make-char."
260(defconst coding-spec-type-idx 0) 261(defconst coding-spec-type-idx 0)
261(defconst coding-spec-mnemonic-idx 1) 262(defconst coding-spec-mnemonic-idx 1)
262(defconst coding-spec-doc-string-idx 2) 263(defconst coding-spec-doc-string-idx 2)
263(defconst coding-spec-plist-idx 2) 264(defconst coding-spec-plist-idx 3)
264(defconst coding-spec-flags-idx 4) 265(defconst coding-spec-flags-idx 4)
265 266
266;; Coding system may have property `eol-type'. The value of the 267;; PLIST is a property list of a coding system. A coding system has
267;; property `eol-type' is integer 0..2 or a vector of three coding 268;; PLIST in coding-spec instead of having it in normal proper list of
268;; systems. The integer value 0, 1, and 2 indicate the format of 269;; Lisp symbol to share PLIST among alias coding systems. Here's a
269;; end-of-line LF, CRLF, and CR respectively. The vector value 270;; list of properties to be held in PLIST.
270;; indicates that the format of end-of-line should be detected 271;;
271;; automatically. Nth element of the vector is the subsidiary coding 272;; o coding-category
272;; system whose `eol-type' property is N. 273;;
274;; The value is a coding category the coding system belongs to. The
275;; function `make-coding-system' and `define-coding-system-alias' sets
276;; this value automatically.
273;; 277;;
274;; Coding system may also have properties `post-read-conversion' and 278;; o alias-coding-systems
275;; `pre-write-conversion. Values of these properties are functions.
276;; 279;;
277;; The function in `post-read-conversion' is called after some text is 280;; The value is a list of coding systems of the same alias group. The
278;; inserted and decoded along the coding system and before any 281;; first element is the coding system made at first, which we call as
279;; functions in `after-insert-functions' are called. The arguments to 282;; `base coding system'. The function `make-coding-system' and
280;; this function is the same as those of a function in 283;; `define-coding-system-alias' set this value automatically.
284;;
285;; o post-read-conversion
286;;
287;; The value is a function to call after some text is inserted and
288;; decoded by the coding system itself and before any functions in
289;; `after-insert-functions' are called. The arguments to this
290;; function is the same as those of a function in
281;; `after-insert-functions', i.e. LENGTH of a text while putting point 291;; `after-insert-functions', i.e. LENGTH of a text while putting point
282;; at the head of the text to be decoded 292;; at the head of the text to be decoded
283;; 293;;
284;; The function in `pre-write-conversion' is called after all 294;; o pre-write-conversion
285;; functions in `write-region-annotate-functions' and 295;;
286;; `buffer-file-format' are called, and before the text is encoded by 296;; The value is a function to call after all functions in
287;; the coding system. The arguments to this function is the same as 297;; `write-region-annotate-functions' and `buffer-file-format' are
288;; those of a function in `write-region-annotate-functions', i.e. FROM 298;; called, and before the text is encoded by the coding system itself.
289;; and TO specifying region of a text. 299;; The arguments to this function is the same as those of a function
290 300;; in `write-region-annotate-functions', i.e. FROM and TO specifying
291;; Return Nth element of coding-spec of CODING-SYSTEM. 301;; region of a text.
292(defun coding-system-spec-ref (coding-system n) 302;;
293 (check-coding-system coding-system) 303;; o character-unification-table-for-decode
294 (let ((vec (coding-system-spec coding-system))) 304;;
295 (and vec (aref vec n)))) 305;; The value is a unification table to be applied on decoding. See
306;; the function `make-unification-table' for the format of unification
307;; table.
308;;
309;; o character-unification-table-for-encode
310;;
311;; The value is a unification table to be applied on encoding.
312
313;; Return coding-spec of CODING-SYSTEM
314(defsubst coding-system-spec (coding-system)
315 (get (check-coding-system coding-system) 'coding-system))
296 316
297(defun coding-system-type (coding-system) 317(defun coding-system-type (coding-system)
298 "Return TYPE element in coding-spec of CODING-SYSTEM." 318 "Return the coding type of CODING-SYSTEM.
299 (coding-system-spec-ref coding-system coding-spec-type-idx)) 319A coding type is an integer value indicating the encoding method
320of CODING-SYSTEM. See the function `make-coding-system' for more detail."
321 (aref (coding-system-spec coding-system) coding-spec-type-idx))
300 322
301(defun coding-system-mnemonic (coding-system) 323(defun coding-system-mnemonic (coding-system)
302 "Return MNEMONIC element in coding-spec of CODING-SYSTEM." 324 "Return the mnemonic character of CODING-SYSTEM.
303 (or (coding-system-spec-ref coding-system coding-spec-mnemonic-idx) 325A mnemonic character of a coding system is used in mode line
326to indicate the coding system."
327 (or (aref (coding-system-spec coding-system) coding-spec-mnemonic-idx)
304 ?-)) 328 ?-))
305 329
306(defun coding-system-doc-string (coding-system) 330(defun coding-system-doc-string (coding-system)
307 "Return DOC-STRING element in coding-spec of CODING-SYSTEM." 331 "Return the documentation string for CODING-SYSTEM."
308 (coding-system-spec-ref coding-system coding-spec-doc-string-idx)) 332 (aref (coding-system-spec coding-system) coding-spec-doc-string-idx))
309 333
310(defun coding-system-plist (coding-system) 334(defun coding-system-plist (coding-system)
311 "Return PLIST element in coding-spec of CODING-SYSTEM." 335 "Return the property list of CODING-SYSTEM."
312 (coding-system-spec-ref coding-system coding-spec-plist-idx)) 336 (aref (coding-system-spec coding-system) coding-spec-plist-idx))
313 337
314(defun coding-system-flags (coding-system) 338(defun coding-system-flags (coding-system)
315 "Return FLAGS element in coding-spec of CODING-SYSTEM." 339 "Return `flags' of CODING-SYSTEM.
316 (coding-system-spec-ref coding-system coding-spec-flags-idx)) 340A `flags' of a coding system is a vector of length 32 indicating detailed
341information of a coding system. See the function `make-coding-system'
342for more detail."
343 (aref (coding-system-spec coding-system) coding-spec-flags-idx))
344
345(defun coding-system-get (coding-system prop)
346 "Extract a value from CODING-SYSTEM's property list for property PROP."
347 (plist-get (coding-system-plist coding-system) prop))
348
349(defun coding-system-put (coding-system prop val)
350 "Change value in CODING-SYSTEM's property list PROP to VAL."
351 (let ((plist (coding-system-plist coding-system)))
352 (if plist
353 (plist-put plist prop val)
354 (aset (coding-system-spec coding-system) coding-spec-plist-idx
355 (list prop val)))))
356
357(defun coding-system-category (coding-system)
358 "Return the coding category of CODING-SYSTEM."
359 (coding-system-get coding-system 'coding-category))
360
361(defun coding-system-base (coding-system)
362 "Return the base coding system of CODING-SYSTEM.
363A base coding system is what made by `make-coding-system',
364not what made by `define-coding-system-alias'."
365 (car (coding-system-get coding-system 'alias-coding-systems)))
366
367(defalias 'coding-system-parent 'coding-system-base)
368(make-obsolete 'coding-system-parent 'coding-system-base)
369
370;; Coding system also has a property `eol-type'.
371;;
372;; This property indicates how the coding system handles end-of-line
373;; format. The value is integer 0, 1, 2, or a vector of three coding
374;; systems. Each integer value 0, 1, and 2 indicates the format of
375;; end-of-line LF, CRLF, and CR respectively. A vector value
376;; indicates that the format of end-of-line should be detected
377;; automatically. Nth element of the vector is the subsidiary coding
378;; system whose `eol-type' property is N.
317 379
318(defun coding-system-eol-type (coding-system) 380(defun coding-system-eol-type (coding-system)
319 "Return eol-type property of CODING-SYSTEM." 381 "Return eol-type of CODING-SYSTEM.
320 (check-coding-system coding-system) 382An eol-type is integer 0, 1, 2, or a vector of coding systems.
321 (and coding-system
322 (or (get coding-system 'eol-type)
323 (coding-system-eol-type (get coding-system 'coding-system)))))
324 383
325(defun coding-system-category (coding-system) 384Integer values 0, 1, and 2 indicate a format of end-of-line; LF,
326 "Return coding category of CODING-SYSTEM." 385CRLF, and CR respectively.
327 (and coding-system 386
328 (symbolp coding-system) 387A vector value indicates that a format of end-of-line should be
329 (or (get coding-system 'coding-category) 388detected automatically. Nth element of the vector is the subsidiary
330 (coding-system-category (get coding-system 'coding-system))))) 389coding system whose eol-type is N."
331 390 (get coding-system 'eol-type))
332(defun coding-system-parent (coding-system)
333 "Return parent of CODING-SYSTEM."
334 (let ((parent (get coding-system 'parent-coding-system)))
335 (and parent
336 (or (coding-system-parent parent)
337 parent))))
338 391
339;; Make subsidiary coding systems (eol-type variants) of CODING-SYSTEM. 392;; Make subsidiary coding systems (eol-type variants) of CODING-SYSTEM.
340(defun make-subsidiary-coding-system (coding-system) 393(defun make-subsidiary-coding-system (coding-system)
341 (let ((subsidiaries (vector (intern (format "%s-unix" coding-system)) 394 (let ((coding-spec (coding-system-spec coding-system))
395 (subsidiaries (vector (intern (format "%s-unix" coding-system))
342 (intern (format "%s-dos" coding-system)) 396 (intern (format "%s-dos" coding-system))
343 (intern (format "%s-mac" coding-system)))) 397 (intern (format "%s-mac" coding-system))))
344 (i 0)) 398 (i 0)
399 temp)
345 (while (< i 3) 400 (while (< i 3)
346 (put (aref subsidiaries i) 'coding-system coding-system) 401 (put (aref subsidiaries i) 'coding-system coding-spec)
347 (put (aref subsidiaries i) 'eol-type i) 402 (put (aref subsidiaries i) 'eol-type i)
348 (put (aref subsidiaries i) 'eol-variant t) 403 (setq coding-system-list
404 (cons (aref subsidiaries i) coding-system-list))
405 (setq coding-system-alist
406 (cons (list (symbol-name (aref subsidiaries i)))
407 coding-system-alist))
349 (setq i (1+ i))) 408 (setq i (1+ i)))
350 subsidiaries)) 409 subsidiaries))
351 410
@@ -354,7 +413,7 @@ See also the documentation of make-char."
354 "Define a new CODING-SYSTEM (symbol). 413 "Define a new CODING-SYSTEM (symbol).
355Remaining arguments are TYPE, MNEMONIC, DOC-STRING, and FLAGS (optional) which 414Remaining arguments are TYPE, MNEMONIC, DOC-STRING, and FLAGS (optional) which
356construct a coding-spec of CODING-SYSTEM in the following format: 415construct a coding-spec of CODING-SYSTEM in the following format:
357 [TYPE MNEMONIC DOC-STRING nil FLAGS] 416 [TYPE MNEMONIC DOC-STRING PLIST FLAGS]
358TYPE is an integer value indicating the type of coding-system as follows: 417TYPE is an integer value indicating the type of coding-system as follows:
359 0: Emacs internal format, 418 0: Emacs internal format,
360 1: Shift-JIS (or MS-Kanji) used mainly on Japanese PC, 419 1: Shift-JIS (or MS-Kanji) used mainly on Japanese PC,
@@ -362,8 +421,14 @@ TYPE is an integer value indicating the type of coding-system as follows:
362 3: Big5 used mainly on Chinese PC, 421 3: Big5 used mainly on Chinese PC,
363 4: private, CCL programs provide encoding/decoding algorithm, 422 4: private, CCL programs provide encoding/decoding algorithm,
364 5: Raw-text, which means that text contains random 8-bit codes. 423 5: Raw-text, which means that text contains random 8-bit codes.
424
365MNEMONIC is a character to be displayed on mode line for the coding-system. 425MNEMONIC is a character to be displayed on mode line for the coding-system.
426
366DOC-STRING is a documentation string for the coding-system. 427DOC-STRING is a documentation string for the coding-system.
428
429PLIST is the propert list for CODING-SYSTEM. This function sets
430properties coding-category and alias-coding-systems.
431
367FLAGS specifies more precise information of each TYPE. 432FLAGS specifies more precise information of each TYPE.
368 433
369 If TYPE is 2 (ISO-2022), FLAGS should be a list of: 434 If TYPE is 2 (ISO-2022), FLAGS should be a list of:
@@ -399,17 +464,21 @@ FLAGS specifies more precise information of each TYPE.
399 If TYPE is 4 (private), FLAGS should be a cons of CCL programs, 464 If TYPE is 4 (private), FLAGS should be a cons of CCL programs,
400 for decoding and encoding. See the documentation of CCL for more detail." 465 for decoding and encoding. See the documentation of CCL for more detail."
401 466
402 ;; At first, set a value of `coding-system' property. 467 (if (memq coding-system coding-system-list)
468 (error "Coding system %s already exists"))
469
470 ;; Set a value of `coding-system' property.
403 (let ((coding-spec (make-vector 5 nil)) 471 (let ((coding-spec (make-vector 5 nil))
472 (no-initial-designation nil)
404 coding-category) 473 coding-category)
405 (if (or (not (integerp type)) (< type 0) (> type 5)) 474 (if (or (not (integerp type)) (< type 0) (> type 5))
406 (error "TYPE argument must be 0..4")) 475 (error "TYPE argument must be 0..5"))
407 (if (or (not (integerp mnemonic)) (<= mnemonic ? ) (> mnemonic 127)) 476 (if (or (not (integerp mnemonic)) (<= mnemonic ? ) (> mnemonic 127))
408 (error "MNEMONIC arguemnt must be a printable character.")) 477 (error "MNEMONIC arguemnt must be an ASCII printable character."))
409 (aset coding-spec 0 type) 478 (aset coding-spec coding-spec-type-idx type)
410 (aset coding-spec 1 mnemonic) 479 (aset coding-spec coding-spec-mnemonic-idx mnemonic)
411 (aset coding-spec 2 (if (stringp doc-string) doc-string "")) 480 (aset coding-spec coding-spec-doc-string-idx
412 (aset coding-spec 3 nil) ; obsolete element 481 (if (stringp doc-string) doc-string ""))
413 (cond ((= type 0) 482 (cond ((= type 0)
414 (setq coding-category 'coding-category-emacs-mule)) 483 (setq coding-category 'coding-category-emacs-mule))
415 ((= type 1) 484 ((= type 1)
@@ -417,8 +486,8 @@ FLAGS specifies more precise information of each TYPE.
417 ((= type 2) ; ISO2022 486 ((= type 2) ; ISO2022
418 (let ((i 0) 487 (let ((i 0)
419 (vec (make-vector 32 nil)) 488 (vec (make-vector 32 nil))
420 (no-initial-designation t)
421 (g1-designation nil)) 489 (g1-designation nil))
490 (setq no-initial-designation t)
422 (while (< i 4) 491 (while (< i 4)
423 (let ((charset (car flags))) 492 (let ((charset (car flags)))
424 (if (and no-initial-designation 493 (if (and no-initial-designation
@@ -446,8 +515,6 @@ FLAGS specifies more precise information of each TYPE.
446 (aset vec i (car flags)) 515 (aset vec i (car flags))
447 (setq flags (cdr flags) i (1+ i))) 516 (setq flags (cdr flags) i (1+ i)))
448 (aset coding-spec 4 vec) 517 (aset coding-spec 4 vec)
449 (if no-initial-designation
450 (put coding-system 'no-initial-designation t))
451 (setq coding-category 518 (setq coding-category
452 (if (aref vec 8) ; Use locking-shift. 519 (if (aref vec 8) ; Use locking-shift.
453 (or (and (aref vec 7) 'coding-category-iso-7-else) 520 (or (and (aref vec 7) 'coding-category-iso-7-else)
@@ -473,8 +540,14 @@ FLAGS specifies more precise information of each TYPE.
473 (error "Invalid FLAGS argument for TYPE 4 (CCL)"))) 540 (error "Invalid FLAGS argument for TYPE 4 (CCL)")))
474 (t ; i.e. (= type 5) 541 (t ; i.e. (= type 5)
475 (setq coding-category 'coding-category-raw-text))) 542 (setq coding-category 'coding-category-raw-text)))
543
544 (let ((plist (list 'coding-category coding-category
545 'alias-coding-systems (list coding-system))))
546 (if no-initial-designation
547 (setq plist (cons 'no-initial-designation
548 (cons no-initial-designation plist))))
549 (aset coding-spec coding-spec-plist-idx plist))
476 (put coding-system 'coding-system coding-spec) 550 (put coding-system 'coding-system coding-spec)
477 (put coding-system 'coding-category coding-category)
478 (put coding-category 'coding-systems 551 (put coding-category 'coding-systems
479 (cons coding-system (get coding-category 'coding-systems)))) 552 (cons coding-system (get coding-category 'coding-systems))))
480 553
@@ -484,30 +557,25 @@ FLAGS specifies more precise information of each TYPE.
484 (put coding-system 'eol-type 557 (put coding-system 'eol-type
485 (if (or (<= type 3) (= type 5)) 558 (if (or (<= type 3) (= type 5))
486 (make-subsidiary-coding-system coding-system) 559 (make-subsidiary-coding-system coding-system)
487 0))) 560 0))
561
562 ;; At last, register CODING-SYSTEM in `coding-system-list' and
563 ;; `coding-system-alist'.
564 (setq coding-system-list (cons coding-system coding-system-list))
565 (setq coding-system-alist (cons (list (symbol-name coding-system))
566 coding-system-alist)))
488 567
489(defun define-coding-system-alias (alias coding-system) 568(defun define-coding-system-alias (alias coding-system)
490 "Define ALIAS as an alias for coding system CODING-SYSTEM." 569 "Define ALIAS as an alias for coding system CODING-SYSTEM."
491 (check-coding-system coding-system) 570 (put alias 'coding-system (coding-system-spec coding-system))
492 (let ((parent (coding-system-parent coding-system))) 571 (nconc (coding-system-get alias 'alias-coding-systems) (list alias))
493 (if parent 572 (setq coding-system-list (cons alias coding-system-list))
494 (setq coding-system parent))) 573 (setq coding-system-alist (cons (list (symbol-name alias))
495 (put alias 'coding-system coding-system) 574 coding-system-alist))
496 (put alias 'parent-coding-system coding-system) 575 (let ((eol-type (coding-system-eol-type coding-system)))
497 (put coding-system 'alias-coding-systems 576 (if (vectorp eol-type)
498 (cons alias (get coding-system 'alias-coding-systems))) 577 (put alias 'eol-type (make-subsidiary-coding-system alias))
499 (let ((eol-variants (coding-system-eol-type coding-system)) 578 (put alias 'eol-type eol-type))))
500 subsidiaries)
501 (if (vectorp eol-variants)
502 (let ((i 0))
503 (setq subsidiaries (make-subsidiary-coding-system alias))
504 (while (< i 3)
505 (put (aref subsidiaries i) 'parent-coding-system
506 (aref eol-variants i))
507 (put (aref eol-variants i) 'alias-coding-systems
508 (cons (aref subsidiaries i) (get (aref eol-variants i)
509 'alias-coding-systems)))
510 (setq i (1+ i)))))))
511 579
512(defun set-buffer-file-coding-system (coding-system &optional force) 580(defun set-buffer-file-coding-system (coding-system &optional force)
513 "Set the file coding-system of the current buffer to CODING-SYSTEM. 581 "Set the file coding-system of the current buffer to CODING-SYSTEM.
@@ -519,7 +587,7 @@ If the buffer's previous file coding-system value specifies end-of-line
519conversion, and CODING-SYSTEM does not specify one, CODING-SYSTEM is 587conversion, and CODING-SYSTEM does not specify one, CODING-SYSTEM is
520merged with the already-specified end-of-line conversion. 588merged with the already-specified end-of-line conversion.
521However, if the optional prefix argument FORCE is non-nil, 589However, if the optional prefix argument FORCE is non-nil,
522them CODING-SYSTEM is used exactly as specified." 590then CODING-SYSTEM is used exactly as specified."
523 (interactive "zCoding system for visited file: \nP") 591 (interactive "zCoding system for visited file: \nP")
524 (check-coding-system coding-system) 592 (check-coding-system coding-system)
525 (if (null force) 593 (if (null force)
@@ -707,15 +775,15 @@ function by default."
707 (let ((coding-system 775 (let ((coding-system
708 (find-new-buffer-file-coding-system last-coding-system-used)) 776 (find-new-buffer-file-coding-system last-coding-system-used))
709 (modified-p (buffer-modified-p))) 777 (modified-p (buffer-modified-p)))
710 (if coding-system 778 (when coding-system
711 (set-buffer-file-coding-system coding-system)) 779 (set-buffer-file-coding-system coding-system)
712 (if (or (eq coding-system 'no-conversion) 780 (if (or (eq coding-system 'no-conversion)
713 (eq (coding-system-type coding-system) 5)) 781 (eq (coding-system-type coding-system) 5))
714 ;; It seems that random 8-bit codes are read. We had 782 ;; It seems that random 8-bit codes are read. We had
715 ;; better edit this buffer without multibyte character 783 ;; better edit this buffer without multibyte character
716 ;; facility. 784 ;; facility.
717 (setq enable-multibyte-characters nil)) 785 (setq enable-multibyte-characters nil))
718 (set-buffer-modified-p modified-p))) 786 (set-buffer-modified-p modified-p))))
719 nil) 787 nil)
720 788
721(setq after-insert-file-functions 789(setq after-insert-file-functions
@@ -745,12 +813,10 @@ Return nil if there's no need of setting new buffer-file-coding-system."
745 (if (null (numberp local-eol)) 813 (if (null (numberp local-eol))
746 ;; But eol-type is not yet set. 814 ;; But eol-type is not yet set.
747 (setq local-eol nil)) 815 (setq local-eol nil))
748 (when (and buffer-file-coding-system 816 (if (and buffer-file-coding-system
749 (not (eq (coding-system-type buffer-file-coding-system) t))) 817 (not (eq (coding-system-type buffer-file-coding-system) t)))
750 ;; This is not `undecided'. 818 ;; This is not `undecided'.
751 (setq local-coding buffer-file-coding-system) 819 (setq local-coding (coding-system-base buffer-file-coding-system)))
752 (while (symbolp (get local-coding 'coding-system))
753 (setq local-coding (get local-coding 'coding-system))))
754 820
755 (if (and (local-variable-p 'buffer-file-coding-system) 821 (if (and (local-variable-p 'buffer-file-coding-system)
756 local-eol local-coding) 822 local-eol local-coding)
@@ -762,11 +828,9 @@ Return nil if there's no need of setting new buffer-file-coding-system."
762 (if (null (numberp found-eol)) 828 (if (null (numberp found-eol))
763 ;; But eol-type is not found. 829 ;; But eol-type is not found.
764 (setq found-eol nil)) 830 (setq found-eol nil))
765 (unless (eq (coding-system-type coding) t) 831 (if (not (eq (coding-system-type coding) t))
766 ;; This is not `undecided'. 832 ;; This is not `undecided'.
767 (setq found-coding coding) 833 (setq found-coding (coding-system-base coding)))
768 (while (symbolp (get found-coding 'coding-system))
769 (setq found-coding (get found-coding 'coding-system))))
770 834
771 ;; The local setting takes precedence over the found one. 835 ;; The local setting takes precedence over the found one.
772 (setq new-coding (or (and (local-variable-p 'buffer-file-coding-system) 836 (setq new-coding (or (and (local-variable-p 'buffer-file-coding-system)