Update of /project/cxml/cvsroot/cxml/xml In directory common-lisp.net:/tmp/cvs-serv21467/xml
Modified Files: xml-name-rune-p.lisp xml-parse.lisp Log Message: -sun/not-wf/dtd07.xml [not-wf?] FAILED: - well-formedness violation not detected -[ - Text declarations (which optionally begin any external entity) - are required to have "encoding=...". ]
Date: Sun Nov 27 00:25:29 2005 Author: dlichteblau
Index: cxml/xml/xml-name-rune-p.lisp diff -u cxml/xml/xml-name-rune-p.lisp:1.4 cxml/xml/xml-name-rune-p.lisp:1.5 --- cxml/xml/xml-name-rune-p.lisp:1.4 Sat Nov 26 22:48:25 2005 +++ cxml/xml/xml-name-rune-p.lisp Sun Nov 27 00:25:29 2005 @@ -11,7 +11,7 @@ (compile nil '(lambda () - (let ((.max. #xD800)) + (let ((+max+ #xD800)) (labels ((name-start-rune-p (rune) (or (letter-rune-p rune) @@ -207,7 +207,7 @@
(predicate-to-bv (p) - (let ((r (make-array .max. :element-type 'bit :initial-element 0))) + (let ((r (make-array +max+ :element-type 'bit :initial-element 0))) (dotimes (i #x10000 r) (when (funcall p i) (setf (aref r i) 1))))) ) @@ -215,13 +215,13 @@ `(progn (DEFINLINE NAME-RUNE-P (RUNE) (SETF RUNE (RUNE-CODE RUNE)) - (AND (<= 0 RUNE ,.max.) + (AND (<= 0 RUNE ,+max+) (LOCALLY (DECLARE (OPTIMIZE (SAFETY 0) (SPEED 3))) (= 1 (SBIT ',(predicate-to-bv #'name-rune-p) (THE FIXNUM RUNE)))))) (DEFINLINE NAME-START-RUNE-P (RUNE) (SETF RUNE (RUNE-CODE RUNE)) - (AND (<= 0 RUNE ,.MAX.) + (AND (<= 0 RUNE ,+MAX+) (LOCALLY (DECLARE (OPTIMIZE (SAFETY 0) (SPEED 3))) (= 1 (SBIT ',(predicate-to-bv #'name-start-rune-p) (THE FIXNUM RUNE)))))))) ))))
Index: cxml/xml/xml-parse.lisp diff -u cxml/xml/xml-parse.lisp:1.10 cxml/xml/xml-parse.lisp:1.11 --- cxml/xml/xml-parse.lisp:1.10 Sun Nov 27 00:00:47 2005 +++ cxml/xml/xml-parse.lisp Sun Nov 27 00:25:29 2005 @@ -670,10 +670,10 @@ ;;;; DTD ;;;;
-(define-condition parse-error (simple-error) ()) -(define-condition well-formedness-violation (parse-error) ()) +(define-condition xml-parse-error (simple-error) ()) +(define-condition well-formedness-violation (xml-parse-error) ()) (define-condition end-of-xstream (well-formedness-violation) ()) -(define-condition validity-error (parse-error) ()) +(define-condition validity-error (xml-parse-error) ())
(defun validity-error (x &rest args) (error 'validity-error @@ -2420,7 +2420,7 @@
(defun p/ext-subset (input) (cond ((eq (peek-token input) :xml-pi) - (let ((hd (parse-xml-pi (cdr (nth-value 1 (peek-token input))) nil))) + (let ((hd (parse-text-decl (cdr (nth-value 1 (peek-token input)))))) (setup-encoding input hd)) (consume-token input))) (set-full-speed input) @@ -2569,7 +2569,7 @@ (let ((*data-behaviour* :DTD)) ;; optional XMLDecl? (cond ((eq (peek-token input) :xml-pi) - (let ((hd (parse-xml-pi (cdr (nth-value 1 (peek-token input))) t))) + (let ((hd (parse-xml-decl (cdr (nth-value 1 (peek-token input)))))) (setf (standalone-p *ctx*) (eq (xml-header-standalone-p hd) :yes)) (setup-encoding input hd)) (read-token input))) @@ -2743,41 +2743,37 @@ (defun p/ext-parsed-ent (input) ;; [78] extParsedEnt ::= '<?xml' VersionInfo? EncodingDecl S? '?>' content (when (eq (peek-token input) :xml-pi) - (let ((hd (parse-xml-pi (cdr (nth-value 1 (peek-token input))) nil))) + (let ((hd (parse-text-decl (cdr (nth-value 1 (peek-token input)))))) (setup-encoding input hd)) - (consume-token input) ) + (consume-token input)) (set-full-speed input) (p/content input))
-(defun parse-xml-pi (content sd-ok-p) - ;; --> xml-header - ;;(make-xml-header)) +(defun parse-xml-decl (content) (let* ((res (make-xml-header)) (i (make-rod-xstream content)) (atts (read-attribute-list 'foo i t))) ;xxx on 'foo (unless (eq (peek-rune i) :eof) - (error "Garbage at end of XML PI.")) + (error "Garbage at end of XMLDecl.")) ;; versioninfo muss da sein ;; dann ? encodingdecl ;; dann ? sddecl ;; dann ende - (when (and (not (eq (caar atts) (intern-name '#.(string-rod "version")))) - sd-ok-p) - (error "XML PI needs version.")) - (when (eq (caar atts) (intern-name '#.(string-rod "version"))) - (unless (and (>= (length (cdar atts)) 1) - (every (lambda (x) - (or (rune<= #/a x #/z) - (rune<= #/A x #/Z) - (rune<= #/0 x #/9) - (rune= x #/_) - (rune= x #/.) - (rune= x #/:) - (rune= x #/-))) - (cdar atts))) - (error "Bad XML version number: ~S." (rod-string (cdar atts)))) - (setf (xml-header-version res) (rod-string (cdar atts))) - (pop atts)) + (unless (eq (caar atts) (intern-name '#.(string-rod "version"))) + (wf-error "XMLDecl needs version.")) + (unless (and (>= (length (cdar atts)) 1) + (every (lambda (x) + (or (rune<= #/a x #/z) + (rune<= #/A x #/Z) + (rune<= #/0 x #/9) + (rune= x #/_) + (rune= x #/.) + (rune= x #/:) + (rune= x #/-))) + (cdar atts))) + (wf-error "Bad XML version number: ~S." (rod-string (cdar atts)))) + (setf (xml-header-version res) (rod-string (cdar atts))) + (pop atts) (when (eq (caar atts) (intern-name '#.(string-rod "encoding"))) (unless (and (>= (length (cdar atts)) 1) (every (lambda (x) @@ -2793,25 +2789,67 @@ (rune<= #/A x #/Z) (rune<= #/0 x #/9))) (aref (cdar atts) 0))) - (error "Bad XML encoding name: ~S." (rod-string (cdar atts)))) + (wf-error "Bad XML encoding name: ~S." (rod-string (cdar atts)))) (setf (xml-header-encoding res) (rod-string (cdar atts))) (pop atts)) - (when (and sd-ok-p (eq (caar atts) (intern-name '#.(string-rod "standalone")))) + (when (eq (caar atts) (intern-name '#.(string-rod "standalone"))) (unless (or (rod= (cdar atts) '#.(string-rod "yes")) (rod= (cdar atts) '#.(string-rod "no"))) - (error "Hypersensitivity pitfall: ~ - XML PI's 'standalone' attribute must be exactly "yes" or "no" and not ~S." + (wf-error "XMLDecl's 'standalone' attribute must be exactly "yes" or "no" and not ~S." (rod-string (cdar atts)))) (setf (xml-header-standalone-p res) - (if (rod-equal '#.(string-rod "yes") (cdar atts)) - :yes - :no)) + (if (rod-equal '#.(string-rod "yes") (cdar atts)) + :yes + :no)) (pop atts)) (when atts - (error "XML designers decided to disallow future extensions to the set ~ - of allowed XML PI's attributes -- you might have lost big on ~S (~S)" - (rod-string content) sd-ok-p - )) + (wf-error "Garbage in XMLDecl: ~A" (rod-string content))) + res)) + +(defun parse-text-decl (content) + (let* ((res (make-xml-header)) + (i (make-rod-xstream content)) + (atts (read-attribute-list 'foo i t))) ;xxx on 'foo + (unless (eq (peek-rune i) :eof) + (error "Garbage at end of TextDecl")) + ;; versioninfo optional + ;; encodingdecl muss da sein + ;; dann ende + (when (eq (caar atts) (intern-name '#.(string-rod "version"))) + (unless (and (>= (length (cdar atts)) 1) + (every (lambda (x) + (or (rune<= #/a x #/z) + (rune<= #/A x #/Z) + (rune<= #/0 x #/9) + (rune= x #/_) + (rune= x #/.) + (rune= x #/:) + (rune= x #/-))) + (cdar atts))) + (wf-error "Bad XML version number: ~S." (rod-string (cdar atts)))) + (setf (xml-header-version res) (rod-string (cdar atts))) + (pop atts)) + (unless (eq (caar atts) (intern-name '#.(string-rod "encoding"))) + (wf-error "TextDecl needs encoding.")) + (unless (and (>= (length (cdar atts)) 1) + (every (lambda (x) + (or (rune<= #/a x #/z) + (rune<= #/A x #/Z) + (rune<= #/0 x #/9) + (rune= x #/_) + (rune= x #/.) + (rune= x #/-))) + (cdar atts)) + ((lambda (x) + (or (rune<= #/a x #/z) + (rune<= #/A x #/Z) + (rune<= #/0 x #/9))) + (aref (cdar atts) 0))) + (wf-error "Bad XML encoding name: ~S." (rod-string (cdar atts)))) + (setf (xml-header-encoding res) (rod-string (cdar atts))) + (pop atts) + (when atts + (wf-error "Garbage in TextDecl: ~A" (rod-string content))) res))
;;;; ---------------------------------------------------------------------------