]> code.delx.au - gnu-emacs/blobdiff - lisp/nxml/nxml-ns.el
Update copyright year to 2014 by running admin/update-copyright.
[gnu-emacs] / lisp / nxml / nxml-ns.el
index f9f5656211de2417367fca08d423f66cad178c5f..8dee3e46340d5cab5409cc7b534b25f7f0ebc3de 100644 (file)
@@ -1,16 +1,16 @@
-;;; nxml-ns.el --- XML namespace processing
+;;; nxml-ns.el --- XML namespace processing  -*- lexical-binding:t -*-
 
-;; Copyright (C) 2003, 2007, 2008 Free Software Foundation, Inc.
+;; Copyright (C) 2003, 2007-2014 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
+;; 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, or (at your option)
-;; any later version.
+;; 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
@@ -18,9 +18,7 @@
 ;; GNU General Public License for more details.
 
 ;; You should have received a copy of the GNU General Public License
-;; along with GNU Emacs; see the file COPYING.  If not, write to the
-;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
-;; Boston, MA 02110-1301, USA.
+;; along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.
 
 ;;; Commentary:
 
 (require 'nxml-util)
 
 (defvar nxml-ns-state nil
-  "Contains the state of namespace processing.  The state
-is never modified destructively and so can be saved and restored
-without copying.
-
-The value is a stack represented by a list. The list has length N + 1
-where N is the number of open elements.  Each member of the list
-represents the bindings in effect for a particular element.  Each
-member is itself a list whose car is the default namespace
+  "Contains the state of namespace processing.
+The state is never modified destructively and so can be saved and
+restored without copying.
+
+The value is a stack represented by a list.  The list has length
+N + 1 where N is the number of open elements.  Each member of the
+list represents the bindings in effect for a particular element.
+Each member is itself a list whose car is the default namespace
 \(a symbol or nil) and whose cdr is an alist of (PREFIX . NS) pairs
 where PREFIX is a string (never nil) and NS is the namespace URI
 symbol.")
 
 (defconst nxml-ns-initial-state
   (list (list nil (cons "xml" nxml-xml-namespace-uri)))
-  "A list to be used as the initial value of nxml-ns-state.  This
-represents the state with no open elements and with the default
+  "A list to be used as the initial value of `nxml-ns-state'.
+This represents the state with no open elements and with the default
 namespace bindings (no default namespace and only the xml prefix bound).")
 
 (defsubst nxml-ns-state () nxml-ns-state)
@@ -58,35 +56,33 @@ namespace bindings (no default namespace and only the xml prefix bound).")
   (equal nxml-ns-state state))
 
 (defmacro nxml-ns-save (&rest body)
+  (declare (indent 0) (debug t))
   `(let ((nxml-ns-state nxml-ns-initial-state))
      ,@body))
 
-(put 'nxml-ns-save 'lisp-indent-function 0)
-(def-edebug-spec nxml-ns-save t)
-
 (defun nxml-ns-init ()
   (setq nxml-ns-state nxml-ns-initial-state))
 
 (defun nxml-ns-push-state ()
-  "Change the state by starting a new element. Namespace declarations
-are inherited from the parent state."
+  "Change the state by starting a new element.
+Namespace declarations are inherited from the parent state."
   (setq nxml-ns-state (cons (car nxml-ns-state) nxml-ns-state)))
 
 (defun nxml-ns-pop-state ()
-  "Change the state by ending an element.  The behaviour is undefined
-if there is no open element."
+  "Change the state by ending an element.
+The behavior is undefined if there is no open element."
   (setq nxml-ns-state (cdr nxml-ns-state)))
 
 (defun nxml-ns-get-prefix (prefix)
-  "Return the symbol for namespace bound to PREFIX, or nil if PREFIX
-is unbound. PREFIX is a string, never nil."
+  "Return the symbol for namespace bound to PREFIX.
+Return nil if PREFIX is unbound.  PREFIX is a string, never nil."
   (let ((binding (assoc prefix (cdar nxml-ns-state))))
     (and binding (cdr binding))))
 
 (defun nxml-ns-set-prefix (prefix ns)
-  "Change the binding of PREFIX. PREFIX is a string (never nil).  NS
-is a symbol (never nil). The change will be in effect until the end of
-the current element."
+  "Change the binding of PREFIX.
+PREFIX is a string (never nil).  NS is a symbol (never nil).
+The change will be in effect until the end of the current element."
   (setq nxml-ns-state
        (let ((bindings (car nxml-ns-state)))
          (cons (cons (car bindings)
@@ -94,13 +90,13 @@ the current element."
                (cdr nxml-ns-state)))))
 
 (defun nxml-ns-get-default ()
-  "Return the current default namespace as a symbol, or nil
-if there is no default namespace."
+  "Return the current default namespace as a symbol.
+Return nil if there is no default namespace."
   (caar nxml-ns-state))
 
 (defun nxml-ns-set-default (ns)
-  "Changes the current default namespace.  The change
-will be in effect until the end of the current element.
+  "Changes the current default namespace.
+The change will be in effect until the end of the current element.
 NS is a symbol or nil."
   (setq nxml-ns-state
        (cons (cons ns (cdar nxml-ns-state))
@@ -119,11 +115,12 @@ NS is a symbol or nil."
     (setq current (cdr current))
     (while (let ((binding (rassq ns current)))
             (when binding
-              (when (eq (nxml-ns-get-prefix (car binding)) ns)
-                (add-to-list 'prefixes
-                             (car binding)))
-              (setq current
-                    (cdr (member binding current))))))
+               (let ((prefix (car binding)))
+                 (when (eq (nxml-ns-get-prefix prefix) ns)
+                   (unless (member prefix prefixes)
+                     (push prefix prefixes))))
+               (setq current
+                     (cdr (member binding current))))))
     prefixes))
 
 (defun nxml-ns-prefix-for (ns)
@@ -144,8 +141,7 @@ NS is a symbol or nil."
              (cons (caar new) changed))
        (setq new (cdr new))))
     changed))
-    
+
 (provide 'nxml-ns)
 
-;; arch-tag: 5968e4b7-fb37-46ce-8621-c65db9793028
 ;;; nxml-ns.el ends here