diff options
| author | sergei <sergei@3ad0048d-3df7-0310-abae-a5850022a9f2> | 2010-10-27 22:42:01 +0000 |
|---|---|---|
| committer | sergei <sergei@3ad0048d-3df7-0310-abae-a5850022a9f2> | 2010-10-27 22:42:01 +0000 |
| commit | db8ee31eaf6e8e086a194b5b67b8a9ec14262cdc (patch) | |
| tree | aa29a4d0d3b0a8bf512c544aae5b7c8d0728ead0 /packages/fcl-xml/src | |
| parent | dc253646806b8f0defde053854e26b5f9c007a8e (diff) | |
| download | fpc-db8ee31eaf6e8e086a194b5b67b8a9ec14262cdc.tar.gz | |
* xmlread.pp, added location information to TNodeData and got namespace-related errors reported at correct locations.
git-svn-id: http://svn.freepascal.org/svn/fpc/trunk@16234 3ad0048d-3df7-0310-abae-a5850022a9f2
Diffstat (limited to 'packages/fcl-xml/src')
| -rw-r--r-- | packages/fcl-xml/src/xmlread.pp | 23 | ||||
| -rw-r--r-- | packages/fcl-xml/src/xmlutils.pp | 8 |
2 files changed, 23 insertions, 8 deletions
diff --git a/packages/fcl-xml/src/xmlread.pp b/packages/fcl-xml/src/xmlread.pp index 23af0614b7..01b5a5ec4f 100644 --- a/packages/fcl-xml/src/xmlread.pp +++ b/packages/fcl-xml/src/xmlread.pp @@ -157,11 +157,7 @@ type TDTDSubsetType = (dsNone, dsInternal, dsExternal); - // This may be augmented with ByteOffset, UTF8Offset, etc. - TLocation = record - Line: Integer; - LinePos: Integer; - end; + TLocation = xmlutils.TLocation; TDOMEntityEx = class(TDOMEntity) protected @@ -2981,6 +2977,9 @@ begin FCurrNode^.FQName := ElName; FCurrNode^.FNodeType := ntElement; FCurrNode^.FColonPos := FColonPos; + FCurrNode^.FLoc := FTokenStart; + Dec(FCurrNode^.FLoc.LinePos, FName.Length); + if FNamespaces then begin FNSHelper.StartElement; @@ -3018,7 +3017,10 @@ begin begin b := TBinding(FCurrNode^.FPrefix^.Data); if not (Assigned(b) and (b.uri <> '')) then - FatalError('Unbound prefix "%s"', [FCurrNode^.FPrefix^.Key]); + begin + FTokenStart := FCurrNode^.FLoc; + FatalError('Unbound element name prefix "%s"', [FCurrNode^.FPrefix^.Key],-1); + end; FCurrNode^.FNsUri := doc.Names.FindOrAdd(PWideChar(b.uri), Length(b.uri)); NewElem.SetNSI(b.uri, FCurrNode^.FColonPos+1); end @@ -3108,6 +3110,8 @@ begin attrName := doc.Names.FindOrAdd(FName.Buffer, FName.Length); attrData := AllocAttributeData(attrName); attrData^.FColonPos := FColonPos; + StoreLocation(attrData^.FLoc); + Dec(attrData^.FLoc.LinePos, FName.Length); if Assigned(ElDef) then begin @@ -3279,14 +3283,17 @@ begin Pfx := attrData^.FPrefix; b := TBinding(Pfx^.Data); if not (Assigned(b) and (b.uri <> '')) then - FatalError('Unbound prefix "%s"', [Pfx^.Key]); + begin + FTokenStart := attrData^.FLoc; + FatalError('Unbound attribute name prefix "%s"', [Pfx^.Key], -1); + end; { detect duplicates } J := attrData^.FColonPos+1; AttrName := attrData^.FQName; if FNsAttHash.Locate(@b.uri, @AttrName^.Key[J], Length(AttrName^.Key) - J+1) then - FatalError('Duplicate prefixed attribute'); + DoErrorPos(esFatal, 'Duplicate prefixed attribute', attrData^.FLoc); attrData^.FNsUri := doc.Names.FindOrAdd(PWideChar(b.uri), Length(b.uri)); end; diff --git a/packages/fcl-xml/src/xmlutils.pp b/packages/fcl-xml/src/xmlutils.pp index b2bb8f5fa9..4ebea2f6fa 100644 --- a/packages/fcl-xml/src/xmlutils.pp +++ b/packages/fcl-xml/src/xmlutils.pp @@ -133,6 +133,12 @@ type destructor Destroy; override; end; +{ Source location. This may be augmented with ByteOffset, UTF8Offset, etc. } + TLocation = record + Line: Integer; + LinePos: Integer; + end; + { generic node info record, shared between DOM and reader } PNodeData = ^TNodeData; @@ -143,6 +149,8 @@ type FNsUri: PHashItem; FColonPos: Integer; FTypeInfo: TObject; + FLoc: TLocation; + FLoc2: TLocation; // for attributes: start of value FNodeType: TXMLNodeType; FValueStr: WideString; |
