+
+
+(defun find-start-tag (tag taglen xmlstr start-pos end-xmlstr)
+ "Searches for the start of a tag in an xmlstring. Returns (VALUES STARTPOS ATTRIBUTE-LIST)"
+ (declare (simple-string tag xmlstr)
+ (fixnum taglen start-pos end-xmlstr))
+ (do* ((search-str (concatenate 'string "<" tag))
+ (bracketpos (fast-string-search search-str xmlstr
+ (1+ taglen) start-pos end-xmlstr)
+ (fast-string-search search-str xmlstr
+ (1+ taglen) start-pos end-xmlstr)))
+ ((null bracketpos) nil)
+ (let* ((endtag (+ bracketpos 1 taglen))
+ (char-after-tag (schar xmlstr endtag)))
+ (when (or (char= #\> char-after-tag)
+ (char= #\space char-after-tag))
+ (if (char= #\> char-after-tag)
+ (return-from find-start-tag (values (1+ endtag) nil))
+ (let ((endbrack (position-char #\> xmlstr (1+ endtag) end-xmlstr)))
+ (if endbrack
+ (return-from find-start-tag
+ (values (1+ endbrack)
+ (string-to-list-skip-delimiter
+ (subseq xmlstr endtag endbrack))))
+ (values nil nil)))))
+ (setq start-pos endtag))))
+
+
+(defun find-end-tag (tag taglen xmlstr start-pos end-xmlstr)
+ (fast-string-search
+ (concatenate 'string "</" tag ">") xmlstr
+ (+ taglen 3) start-pos end-xmlstr))
+
+(defun positions-xml-tag-contents (tag xmlstr &optional (start-xmlstr 0)
+ (end-xmlstr (length xmlstr)))