summaryrefslogtreecommitdiff
path: root/packages/fcl-xml/src
diff options
context:
space:
mode:
authorsergei <sergei@3ad0048d-3df7-0310-abae-a5850022a9f2>2010-10-27 22:42:01 +0000
committersergei <sergei@3ad0048d-3df7-0310-abae-a5850022a9f2>2010-10-27 22:42:01 +0000
commitdb8ee31eaf6e8e086a194b5b67b8a9ec14262cdc (patch)
treeaa29a4d0d3b0a8bf512c544aae5b7c8d0728ead0 /packages/fcl-xml/src
parentdc253646806b8f0defde053854e26b5f9c007a8e (diff)
downloadfpc-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.pp23
-rw-r--r--packages/fcl-xml/src/xmlutils.pp8
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;