- (let ((done nil)
- (pos start-xmlstr)
- (taglen (length tag))
- (startpos nil)
- (endpos nil)
- (nextpos nil))
- (while (not done)
- (let ((bracketpos (position-char #\< xmlstr pos end-xmlstr)))
- (unless bracketpos
- (return-from positions-xml-tag-contents
- (values nil nil nil)))
- (let* ((starttag (1+ bracketpos))
- (endtag (+ starttag taglen)))
- (if (and (< endtag end-xmlstr)
- (string= tag xmlstr :start2 starttag :end2 endtag))
- (let* ((char-after-tag (char xmlstr endtag)))
- (declare (character char-after-tag))
- (if (or (char= #\> char-after-tag)
- (char= #\space char-after-tag))
- (progn
- (if (char= #\> char-after-tag)
- (setq startpos (1+ endtag))
- (setq startpos (1+ (position-char #\> xmlstr (1+ endtag) end-xmlstr))))
- (setq endpos (search (format nil "</~a>" tag) xmlstr
- :start2 startpos :end2 end-xmlstr))
- (if (and startpos endpos)
- (progn
- (setq nextpos (+ endpos taglen 3))
- (setq pos nextpos))
- (setf startpos nil
- endpos nil))
- (setq done t))
- (setq pos (1+ endtag))))
- (setq pos (1+ starttag)))
- (when (> pos end-xmlstr)
- (setq done t))))))
- (values startpos endpos nextpos)))
-
-
-(defun xml-tag-contents-old (tag xmlstr &optional (start-xmlstr 0) (end-xmlstr nil))
- "Returns two values: the string between XML start and end tag
-and position of character following end tag."
- (multiple-value-bind
- (startpos endpos nextpos)
- (positions-xml-tag-contents-old tag xmlstr start-xmlstr end-xmlstr)
- (if (and startpos endpos)
- (values (subseq xmlstr startpos endpos) nextpos)
- (values nil nil))))
+ (let* ((taglen (length tag)))
+ (multiple-value-bind (start attributes)
+ (find-start-tag tag taglen xmlstr start-xmlstr end-xmlstr)
+ (unless start
+ (return-from positions-xml-tag-contents (values nil nil nil nil)))
+ (let ((end (find-end-tag tag taglen xmlstr start end-xmlstr)))
+ (unless end
+ (return-from positions-xml-tag-contents (values nil nil nil nil)))
+ (values start end (+ end taglen 3) attributes)))))
+