view lisp/nxml/nxml-enc.el @ 105652:51bc239bdc37

* cedet/srecode/srt.el: * cedet/srecode/compile.el: * cedet/semantic/mru-bookmark.el: * cedet/semantic/debug.el: * cedet/semantic/complete.el: * cedet/semantic/analyze.el: Require CL when compiling. * cedet/semantic/scope.el (semantic-analyze-scoped-inherited-tag-map): Wrap calculation of tmpscope so that the regular scope will continue to work. * cedet/semantic/idle.el (semantic-idle-tag-highlight): Use semantic-idle-summary-highlight-face as the highlighting. * emacs-lisp/eieio-base.el (eieio-persistent-save): If buffer contains multibyte characters, choose first applicable coding system automatically. * cedet/ede/project-am.el (project-run-target): New method. (project-run-target): New method. * cedet/ede.el (ede-target): Add run target menu item. (ede-project, ede-minor-keymap): Add ede-run-target binding. (ede-run-target): New function. (ede-target::project-run-target): New method. * cedet/ede/proj.el (project-run-target): New method. * cedet/ede/proj-shared.el (ede-gcc-libtool-shared-compiler) (ede-g++-libtool-shared-compiler): Remove SHELL. Remove COMMANDS. Add :rules. (ede-proj-target-makefile-shared-object): Only libtool compilers now available. Add linkers for libtool. (ede-cc-linker-libtool, ede-g++-linker-libtool): New. (ede-proj-makefile-target-name): Always use .la extension. * cedet/ede/proj-prog.el (project-run-target): New method. * cedet/ede/proj-obj.el (ede-cc-linker): Rename from ede-gcc-linker. (ede-g++-linker): Change Change link lines. * cedet/ede/pmake.el (ede-pmake-insert-variable-shared): When searching for old variables, go to the end of the buffer and search backward from there. (ede-proj-makefile-automake-insert-subdirs) (ede-proj-makefile-automake-insert-extradist): New methods. (ede-proj-makefile-create): Use them. * cedet/ede/pconf.el (ede-proj-configure-test-required-file): Force FILE to expand to the current target. Use file-exists-p to check that it exists. * cedet/ede/linux.el (ede-linux-version): Don't call "head". (ede-linux-load): Wrap dir in file-name-as-directory. Set :version slot. * cedet/ede/files.el (ede-get-locator-object): When enabling locate, do so on "top". * cedet/ede/emacs.el (ede-emacs-file-existing): Wrap "dir" in file-name-as-directory during compare. (ede-emacs-version): Return Emacs/XEmacs differentiator. Get version number from different places. Don't call egrep. (ede-emacs-load): Set :version slot. Call file-name-as-directory to set the directory. * cedet/ede/shell.el: New file. * cedet/inversion.el (inversion-decoders): Allow for stray . in alpha/beta variants.
author Chong Yidong <cyd@stupidchicken.com>
date Sat, 17 Oct 2009 04:18:31 +0000
parents a9dc0e7c3f2b
children 1d1d5d9bd884
line wrap: on
line source

;;; nxml-enc.el --- XML encoding auto-detection

;; Copyright (C) 2003, 2007, 2008, 2009 Free Software Foundation, Inc.

;; Author: James Clark
;; Keywords: XML

;; This file is part of GNU Emacs.

;; GNU Emacs is free software: you can redistribute it and/or modify
;; it under the terms of the GNU General Public License as published by
;; the Free Software Foundation, either version 3 of the License, or
;; (at your option) any later version.

;; GNU Emacs is distributed in the hope that it will be useful,
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
;; GNU General Public License for more details.

;; You should have received a copy of the GNU General Public License
;; along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.

;;; Commentary:

;; User entry points are nxml-start-auto-coding and
;; nxml-stop-auto-coding.  This is separate from nxml-mode, because
;; this cannot be autoloaded.  It may use
;; `xmltok-get-declared-encoding-position' which can be autoloaded.
;; It's separate from rng-auto.el so it can be byte-compiled, and
;; because it provides independent, useful functionality.

;;; Code:

(defvar nxml-file-name-ignore-case
  (memq system-type '(windows-nt)))

(defvar nxml-cached-file-name-auto-coding-regexp nil)
(defvar nxml-cached-auto-mode-alist nil)

(defun nxml-file-name-auto-coding-regexp ()
  "Return regexp for filenames for which XML auto-coding should be done."
  (if (eq auto-mode-alist nxml-cached-auto-mode-alist)
      nxml-cached-file-name-auto-coding-regexp
    (let ((alist auto-mode-alist)
	  (case-fold-search nxml-file-name-ignore-case)
	  regexps)
      (setq nxml-cached-auto-mode-alist alist)
      (while alist
	(when (eq (cdar alist) 'nxml-mode)
	  (setq regexps (cons (caar alist) regexps)))
	(setq alist (cdr alist)))
      (setq nxml-cached-file-name-auto-coding-regexp
	    (if (null (cdr regexps))
		(car regexps)
	      (mapconcat (lambda (r)
			   (concat "\\(?:" r "\\)"))
			 regexps
			 "\\|"))))))

(defvar nxml-non-xml-set-auto-coding-function nil
  "The function that `set-auto-coding-function' should call for non-XML files.")
(defun nxml-set-auto-coding (file-name size)
  (if (let ((case-fold-search nxml-file-name-ignore-case)
	    (regexp (nxml-file-name-auto-coding-regexp)))
	(and regexp
	     (string-match regexp file-name)))
      (nxml-set-xml-coding file-name size)
    (and nxml-non-xml-set-auto-coding-function
	 (funcall nxml-non-xml-set-auto-coding-function file-name size))))

(defun nxml-set-xml-coding (file-name size)
  "Function to use as `set-auto-coding-function' when file is known to be XML."
  (nxml-detect-coding-system (+ (point) (min size 1024))))

(declare-function xmltok-get-declared-encoding-position "xmltok"
                  (&optional limit))    ; autoloaded

(defun nxml-detect-coding-system (limit)
  (if (< limit (+ (point) 2))
      (if (eq (char-after) 0) 'no-conversion 'utf-8)
    (let ((first-two-chars (list (char-after)
				 (char-after (1+ (point))))))
      (cond ((equal first-two-chars '(#xFE #xFF))
	     (and (coding-system-p 'utf-16-be) 'utf-16-be))
	    ((equal first-two-chars '(#xFF #xFE))
	     (and (coding-system-p 'utf-16-le) 'utf-16-le))
	    ((memq 0 first-two-chars)
	     ;; Certainly not well-formed XML;
	     ;; perhaps UTF-16 without BOM.
	     ;; In any case, we can't handle it.
	     ;; no-conversion gives the user a chance to fix it.
	     'no-conversion)
	    ;; There are other things we might try here in the future
	    ;; eg UTF-8 BOM, UTF-16 with no BOM 
	    ;; translate to EBCDIC
	    (t
	     (let ((enc-pos (xmltok-get-declared-encoding-position limit)))
	       (cond ((consp enc-pos)
		      (or (nxml-mime-charset-coding-system
			   (buffer-substring-no-properties (car enc-pos)
							   (cdr enc-pos)))
			  ;; We have an encoding whose name we don't recognize.
			  ;; What to do?
			  ;; raw-text seems the best bet: since we got
			  ;; the XML decl it must be a superset of ASCII,
			  ;; so we don't need to go to no-conversion
			  'raw-text))
		     (enc-pos 'utf-8)
		     ;; invalid XML declaration
		     (t nil))))))))

(defun nxml-mime-charset-coding-system (charset)
  (let ((charset-sym (intern (downcase charset)))
	(coding-systems (coding-system-list t))
	coding-system ret)
    (while (and coding-systems (not ret))
      (setq coding-system (car coding-systems))
      (if (eq (coding-system-get coding-system 'mime-charset)
	      charset-sym)
	  (setq ret coding-system)
	(setq coding-systems (cdr coding-systems))))
    ret))

(defun nxml-start-auto-coding ()
  "Do encoding auto-detection as specified in the XML standard.
Applied to any files that `auto-mode-alist' says should be handled by
`nxml-mode'."
  (interactive)
  (unless (eq set-auto-coding-function 'nxml-set-auto-coding)
    (let ((inhibit-quit t))
      (setq nxml-non-xml-set-auto-coding-function set-auto-coding-function)
      (setq set-auto-coding-function 'nxml-set-auto-coding))))

(defun nxml-stop-auto-coding ()
  "Stop doing encoding auto-detection as specified in the XML standard."
  (interactive)
  (when (eq set-auto-coding-function 'nxml-set-auto-coding)
    (let ((inhibit-quit t))
      (setq set-auto-coding-function nxml-non-xml-set-auto-coding-function)
      (setq nxml-non-xml-set-auto-coding-function nil))))

;; Emacs 22 makes us-ascii an alias for iso-safe without
;; giving it a mime-charset property.
(unless (coding-system-get 'us-ascii 'mime-charset)
  (coding-system-put 'us-ascii 'mime-charset 'us-ascii))

(provide 'nxml-enc)

;; arch-tag: c2436247-78f3-418c-8069-85dc5335d083
;;; nxml-enc.el ends here