Function: nxml-scan-element-forward
nxml-scan-element-forward is a byte-compiled function defined in
nxml-rap.el.gz.
Signature
(nxml-scan-element-forward FROM &optional UP)
Documentation
Scan forward from FROM over a single balanced element.
Point must be between tokens. Return the position of the end of
the tag that ends the element. xmltok-start will contain the
position of the start of the tag. If UP is non-nil, then scan
past end-tag of element containing point. If no element is
found, return nil. If a well-formedness error prevents scanning,
signal an nxml-scan-error. Point is not moved.
Source Code
;; Defined in /usr/src/emacs/lisp/nxml/nxml-rap.el.gz
;;; Element scanning
(defun nxml-scan-element-forward (from &optional up)
"Scan forward from FROM over a single balanced element.
Point must be between tokens. Return the position of the end of
the tag that ends the element. `xmltok-start' will contain the
position of the start of the tag. If UP is non-nil, then scan
past end-tag of element containing point. If no element is
found, return nil. If a well-formedness error prevents scanning,
signal an `nxml-scan-error'. Point is not moved."
(let ((open-tags (and up t))
found)
(save-excursion
(goto-char from)
(while (cond ((not (nxml-tokenize-forward))
(when (consp open-tags)
(nxml-scan-error (cadr open-tags)
"Start-tag has no end-tag"))
nil)
((eq xmltok-type 'start-tag)
(setq open-tags
(cons (xmltok-start-tag-qname)
(cons xmltok-start
open-tags)))
t)
((eq xmltok-type 'end-tag)
(cond ((not open-tags) nil)
((not (consp open-tags)) (setq found (point)) nil)
((not (string= (car open-tags)
(xmltok-end-tag-qname)))
(nxml-scan-error (+ 2 xmltok-start)
"Mismatched end-tag; \
expected `%s'"
(car open-tags)))
((setq open-tags (cddr open-tags)) t)
(t (setq found (point)) nil)))
((memq xmltok-type '(empty-element
partial-empty-element))
(if open-tags
t
(setq found (point))
nil))
((eq xmltok-type 'partial-end-tag)
(cond ((not open-tags) nil)
((not (consp open-tags)) (setq found (point)) nil)
((setq open-tags (cddr open-tags)) t)
(t (setq found (point)) nil)))
((eq xmltok-type 'partial-start-tag)
(nxml-scan-error xmltok-start
"Missing `>'"))
(t t))))
found))