summaryrefslogtreecommitdiff
path: root/packages/fcl-xml
diff options
context:
space:
mode:
authorsergei <sergei@3ad0048d-3df7-0310-abae-a5850022a9f2>2011-02-23 15:55:18 +0000
committersergei <sergei@3ad0048d-3df7-0310-abae-a5850022a9f2>2011-02-23 15:55:18 +0000
commitd86e43daafd27b5638ad869844721a4b67d2560c (patch)
tree16af39af577ca36df587acee485536a278bdf8c4 /packages/fcl-xml
parentf9361972571811b4628c82ea3d9258f077355a43 (diff)
downloadfpc-d86e43daafd27b5638ad869844721a4b67d2560c.tar.gz
* Cleanup ParseContent()
- XMLVersion property has been made available in TDOMDocument, removed inheritance check. * Improved parsing the content model a bit * Cleanup comments git-svn-id: http://svn.freepascal.org/svn/fpc/trunk@16987 3ad0048d-3df7-0310-abae-a5850022a9f2
Diffstat (limited to 'packages/fcl-xml')
-rw-r--r--packages/fcl-xml/src/xmlread.pp51
1 files changed, 17 insertions, 34 deletions
diff --git a/packages/fcl-xml/src/xmlread.pp b/packages/fcl-xml/src/xmlread.pp
index b3a225a48b..d98040c734 100644
--- a/packages/fcl-xml/src/xmlread.pp
+++ b/packages/fcl-xml/src/xmlread.pp
@@ -281,7 +281,7 @@ type
FEntityValue: TWideCharBuf;
FName: TWideCharBuf;
FTokenStart: TLocation;
- FStandalone: Boolean; // property of Doc ?
+ FStandalone: Boolean;
FNamePages: PByteArray;
FDocType: TDTDModel;
FPEMap: THashTable;
@@ -404,7 +404,7 @@ type
procedure BadPENesting(S: TErrorSeverity = esError);
procedure ParseEntityDecl;
procedure ParseAttlistDecl;
- procedure ExpectChoiceOrSeq(CP: TContentParticle);
+ procedure ExpectChoiceOrSeq(CP: TContentParticle; MustEndIn: TObject);
procedure ParseElementDecl;
procedure ParseNotationDecl;
function ResolveResource(const ASystemID, APublicID, ABaseURI: WideString; out Source: TXMLCharSource): Boolean;
@@ -1348,10 +1348,11 @@ begin
FValidatorNesting := 0;
FCurrNode := @FNodeStack[0];
FFragmentMode := True;
- FXML11 := doc.InheritsFrom(TXMLDocument) and (TXMLDocument(doc).XMLVersion = '1.1');
+ FXML11 := doc.XMLVersion = '1.1';
NSPrepare;
Initialize(ASource);
- // See comment in EntityCheck()
+ { Get doctype from the owner's document, but only if it is not already assigned
+ (It is set directly when parsing children of an Entity, see LoadEntity procedure) }
if FDocType = nil then
begin
DoctypeNode := TDOMDocumentTypeEx(doc.DocType);
@@ -1734,14 +1735,8 @@ begin
FatalError('External entity reference is not allowed in attribute value', cnt);
if not Result.FResolved then
- begin
- // To build children of the entity itself, we must parse it "out of context"
- // However, care must be taken to properly pass the DTD to InnerReader.
- // We now have doc.DocumentType=nil while DTD is being parsed,
- // which can break parsing 2+ level entities in default attribute values.
-
LoadEntity(Result);
- end;
+
// at this point we know the charcount of the entity being included
if Result.FCharCount >= cnt then
CheckMaxChars(Result.FCharCount - cnt);
@@ -2148,10 +2143,9 @@ begin
end;
end;
-procedure TXMLReader.ExpectChoiceOrSeq(CP: TContentParticle); // [49], [50]
+procedure TXMLReader.ExpectChoiceOrSeq(CP: TContentParticle; MustEndIn: TObject); // [49], [50]
var
Delim: WideChar;
- CurrentEntity: TObject;
CurrentCP: TContentParticle;
begin
Delim := #0;
@@ -2159,13 +2153,7 @@ begin
CurrentCP := CP.Add;
SkipWhitespace;
if CheckForChar('(') then
- begin
- CurrentEntity := FSource.FEntity;
- ExpectChoiceOrSeq(CurrentCP);
- if CurrentEntity <> FSource.FEntity then
- BadPENesting;
- FSource.NextChar;
- end
+ ExpectChoiceOrSeq(CurrentCP, FSource.FEntity)
else
CurrentCP.Def := FindOrCreateElDef;
@@ -2185,6 +2173,10 @@ begin
FatalError(Delim);
FSource.NextChar; // skip delimiter
until False;
+ if MustEndIn <> FSource.FEntity then
+ BadPENesting;
+ FSource.NextChar;
+
if Delim = '|' then
CP.CPType := ctChoice
else
@@ -2249,10 +2241,7 @@ begin
else // Children section [47]
begin
Typ := ctChildren;
- ExpectChoiceOrSeq(CP);
- if CurrentEntity <> FSource.FEntity then
- BadPENesting;
- FSource.NextChar;
+ ExpectChoiceOrSeq(CP, CurrentEntity);
CP.CPQuant := ParseQuantity;
end;
except
@@ -2899,9 +2888,7 @@ begin
ntWhitespace, ntSignificantWhitespace:
if FPreserveWhitespace then
- cursor.InternalAppend(doc.CreateTextNodeBuf(FValue.Buffer, FValue.Length, FCurrNode^.FNodeType = ntWhitespace))
- else
- Continue;
+ cursor.InternalAppend(doc.CreateTextNodeBuf(FValue.Buffer, FValue.Length, FCurrNode^.FNodeType = ntWhitespace));
ntCDATA:
cursor.InternalAppend(DoCDSect(FValue.Buffer, FValue.Length));
@@ -2910,25 +2897,21 @@ begin
cursor.InternalAppend(CreatePINode);
ntComment:
- if FIgnoreComments then
- Continue
- else
+ if not FIgnoreComments then
cursor.InternalAppend(doc.CreateCommentBuf(FCurrNode^.FValueStart, FCurrNode^.FValueLength));
+
ntElement:
begin
element := DoStartElement;
cursor.InternalAppend(element);
cursor := element;
- Continue;
end;
ntEndElement:
cursor := TDOMNode_WithChildren(cursor.ParentNode);
ntDocumentType:
- if FCanonical then
- Continue
- else
+ if not FCanonical then
cursor.InternalAppend(TDOMDocumentType.Create(doc, FDocType));
ntEntityReference: