summaryrefslogtreecommitdiff
path: root/packages/fcl-xml/src/xmlutils.pp
diff options
context:
space:
mode:
Diffstat (limited to 'packages/fcl-xml/src/xmlutils.pp')
-rw-r--r--packages/fcl-xml/src/xmlutils.pp37
1 files changed, 37 insertions, 0 deletions
diff --git a/packages/fcl-xml/src/xmlutils.pp b/packages/fcl-xml/src/xmlutils.pp
index 65205ec410..863c0ad5b2 100644
--- a/packages/fcl-xml/src/xmlutils.pp
+++ b/packages/fcl-xml/src/xmlutils.pp
@@ -159,6 +159,7 @@ procedure BufAllocate(var ABuffer: TWideCharBuf; ALength: Integer);
procedure BufAppend(var ABuffer: TWideCharBuf; wc: WideChar);
procedure BufAppendChunk(var ABuf: TWideCharBuf; pstart, pend: PWideChar);
function BufEquals(const ABuf: TWideCharBuf; const Arg: WideString): Boolean;
+procedure BufNormalize(var Buf: TWideCharBuf; out Modified: Boolean);
{ Built-in decoder functions for UTF-8, UTF-16 and ISO-8859-1 }
@@ -912,6 +913,42 @@ begin
CompareMem(ABuf.Buffer, Pointer(Arg), ABuf.Length*sizeof(WideChar));
end;
+procedure BufNormalize(var Buf: TWideCharBuf; out Modified: Boolean);
+var
+ Dst, Src: Integer;
+begin
+ Dst := 0;
+ Src := 0;
+ // skip leading space if any
+ while (Src < Buf.Length) and (Buf.Buffer[Src] = ' ') do
+ Inc(Src);
+
+ while Src < Buf.Length do
+ begin
+ if Buf.Buffer[Src] = ' ' then
+ begin
+ // Dst cannot be 0 here, because leading space is already skipped
+ if Buf.Buffer[Dst-1] <> ' ' then
+ begin
+ Buf.Buffer[Dst] := ' ';
+ Inc(Dst);
+ end;
+ end
+ else
+ begin
+ Buf.Buffer[Dst] := Buf.Buffer[Src];
+ Inc(Dst);
+ end;
+ Inc(Src);
+ end;
+ // trailing space (only one possible due to compression)
+ if (Dst > 0) and (Buf.Buffer[Dst-1] = ' ') then
+ Dec(Dst);
+
+ Modified := Dst <> Buf.Length;
+ Buf.Length := Dst;
+end;
+
{ standard decoders }
function Decode_UCS2(Context: Pointer; InBuf: PChar; var InCnt: Cardinal; OutBuf: PWideChar; var OutCnt: Cardinal): Integer; stdcall;