LCL: fixed TUTF8Parser reading at end of buffer

git-svn-id: trunk@31362 -
This commit is contained in:
mattias 2011-06-24 18:37:23 +00:00
parent 006639bf2a
commit d13ac6fe8a
23 changed files with 82 additions and 45 deletions

View File

@ -1431,7 +1431,7 @@ msgid "Invalid integer number: %s"
msgstr ""
#: lclstrconsts.sparlocinfo
msgid " (at %d,%d, stream offset %.8x)"
msgid " (at %d,%d, stream offset %d)"
msgstr ""
#: lclstrconsts.sparunterminatedbinvalue

View File

@ -1429,7 +1429,9 @@ msgid "Invalid integer number: %s"
msgstr "Neplatné celé číslo: %s"
#: lclstrconsts.sparlocinfo
msgid " (at %d,%d, stream offset %.8x)"
#, fuzzy
#| msgid " (at %d,%d, stream offset %.8x)"
msgid " (at %d,%d, stream offset %d)"
msgstr " (u %d,%d, posun proudu %.8x)"
#: lclstrconsts.sparunterminatedbinvalue

View File

@ -1435,7 +1435,9 @@ msgid "Invalid integer number: %s"
msgstr "Ungültiger Integerzahl: %s"
#: lclstrconsts.sparlocinfo
msgid " (at %d,%d, stream offset %.8x)"
#, fuzzy
#| msgid " (at %d,%d, stream offset %.8x)"
msgid " (at %d,%d, stream offset %d)"
msgstr " (bei %d,%d, Stream-Offset %.8x)"
#: lclstrconsts.sparunterminatedbinvalue

View File

@ -1429,7 +1429,9 @@ msgid "Invalid integer number: %s"
msgstr "Número entero no válido: %s"
#: lclstrconsts.sparlocinfo
msgid " (at %d,%d, stream offset %.8x)"
#, fuzzy
#| msgid " (at %d,%d, stream offset %.8x)"
msgid " (at %d,%d, stream offset %d)"
msgstr " (en %d,%d, flujo de desplazamiento %.8x)"
#: lclstrconsts.sparunterminatedbinvalue

View File

@ -1412,7 +1412,7 @@ msgid "Invalid integer number: %s"
msgstr ""
#: lclstrconsts.sparlocinfo
msgid " (at %d,%d, stream offset %.8x)"
msgid " (at %d,%d, stream offset %d)"
msgstr ""
#: lclstrconsts.sparunterminatedbinvalue

View File

@ -1435,7 +1435,7 @@ msgid "Invalid integer number: %s"
msgstr "Nombre entier non valide : %s"
#: lclstrconsts.sparlocinfo
msgid " (at %d,%d, stream offset %.8x)"
msgid " (at %d,%d, stream offset %d)"
msgstr ""
#: lclstrconsts.sparunterminatedbinvalue

View File

@ -1426,7 +1426,7 @@ msgid "Invalid integer number: %s"
msgstr "מספר שלם לא חוקי %s"
#: lclstrconsts.sparlocinfo
msgid " (at %d,%d, stream offset %.8x)"
msgid " (at %d,%d, stream offset %d)"
msgstr ""
#: lclstrconsts.sparunterminatedbinvalue

View File

@ -1432,7 +1432,7 @@ msgid "Invalid integer number: %s"
msgstr ""
#: lclstrconsts.sparlocinfo
msgid " (at %d,%d, stream offset %.8x)"
msgid " (at %d,%d, stream offset %d)"
msgstr ""
#: lclstrconsts.sparunterminatedbinvalue

View File

@ -1434,7 +1434,9 @@ msgid "Invalid integer number: %s"
msgstr "Numero intero non valido: %s"
#: lclstrconsts.sparlocinfo
msgid " (at %d,%d, stream offset %.8x)"
#, fuzzy
#| msgid " (at %d,%d, stream offset %.8x)"
msgid " (at %d,%d, stream offset %d)"
msgstr " (a %s %d, offset nello stream %.8x)"
#: lclstrconsts.sparunterminatedbinvalue

View File

@ -1433,7 +1433,9 @@ msgid "Invalid integer number: %s"
msgstr "Netinkamas sveikasis skaičius: %s"
#: lclstrconsts.sparlocinfo
msgid " (at %d,%d, stream offset %.8x)"
#, fuzzy
#| msgid " (at %d,%d, stream offset %.8x)"
msgid " (at %d,%d, stream offset %d)"
msgstr " (ties %d,%d, srauto poslinkis %.8x)"
#: lclstrconsts.sparunterminatedbinvalue

View File

@ -1431,7 +1431,7 @@ msgid "Invalid integer number: %s"
msgstr ""
#: lclstrconsts.sparlocinfo
msgid " (at %d,%d, stream offset %.8x)"
msgid " (at %d,%d, stream offset %d)"
msgstr ""
#: lclstrconsts.sparunterminatedbinvalue

View File

@ -1437,7 +1437,7 @@ msgid "Invalid integer number: %s"
msgstr ""
#: lclstrconsts.sparlocinfo
msgid " (at %d,%d, stream offset %.8x)"
msgid " (at %d,%d, stream offset %d)"
msgstr ""
#: lclstrconsts.sparunterminatedbinvalue

View File

@ -1425,7 +1425,7 @@ msgid "Invalid integer number: %s"
msgstr ""
#: lclstrconsts.sparlocinfo
msgid " (at %d,%d, stream offset %.8x)"
msgid " (at %d,%d, stream offset %d)"
msgstr ""
#: lclstrconsts.sparunterminatedbinvalue

View File

@ -1410,7 +1410,7 @@ msgid "Invalid integer number: %s"
msgstr ""
#: lclstrconsts.sparlocinfo
msgid " (at %d,%d, stream offset %.8x)"
msgid " (at %d,%d, stream offset %d)"
msgstr ""
#: lclstrconsts.sparunterminatedbinvalue

View File

@ -1430,7 +1430,9 @@ msgid "Invalid integer number: %s"
msgstr "Número inteiro inválido: %s"
#: lclstrconsts.sparlocinfo
msgid " (at %d,%d, stream offset %.8x)"
#, fuzzy
#| msgid " (at %d,%d, stream offset %.8x)"
msgid " (at %d,%d, stream offset %d)"
msgstr "(em %s,%s, deslocamento fluxo %.8x)"
#: lclstrconsts.sparunterminatedbinvalue

View File

@ -1424,7 +1424,9 @@ msgid "Invalid integer number: %s"
msgstr "Número inteiro inválido: %s"
#: lclstrconsts.sparlocinfo
msgid " (at %d,%d, stream offset %.8x)"
#, fuzzy
#| msgid " (at %d,%d, stream offset %.8x)"
msgid " (at %d,%d, stream offset %d)"
msgstr "(em %s,%s, deslocamento fluxo %.8x)"
#: lclstrconsts.sparunterminatedbinvalue

View File

@ -1433,7 +1433,9 @@ msgid "Invalid integer number: %s"
msgstr "Неверное целое число: %s"
#: lclstrconsts.sparlocinfo
msgid " (at %d,%d, stream offset %.8x)"
#, fuzzy
#| msgid " (at %d,%d, stream offset %.8x)"
msgid " (at %d,%d, stream offset %d)"
msgstr " (на %d,%d, смещение потока %.8x)"
#: lclstrconsts.sparunterminatedbinvalue

View File

@ -1434,7 +1434,7 @@ msgid "Invalid integer number: %s"
msgstr "Neplatné celé číslo: %s"
#: lclstrconsts.sparlocinfo
msgid " (at %d,%d, stream offset %.8x)"
msgid " (at %d,%d, stream offset %d)"
msgstr ""
#: lclstrconsts.sparunterminatedbinvalue

View File

@ -1431,7 +1431,7 @@ msgid "Invalid integer number: %s"
msgstr ""
#: lclstrconsts.sparlocinfo
msgid " (at %d,%d, stream offset %.8x)"
msgid " (at %d,%d, stream offset %d)"
msgstr ""
#: lclstrconsts.sparunterminatedbinvalue

View File

@ -1423,7 +1423,9 @@ msgid "Invalid integer number: %s"
msgstr "Невірне ціле число: %s"
#: lclstrconsts.sparlocinfo
msgid " (at %d,%d, stream offset %.8x)"
#, fuzzy
#| msgid " (at %d,%d, stream offset %.8x)"
msgid " (at %d,%d, stream offset %d)"
msgstr " (на %d,%d, зміщення потоку %.8x)"
#: lclstrconsts.sparunterminatedbinvalue

View File

@ -1434,7 +1434,9 @@ msgid "Invalid integer number: %s"
msgstr "无效的整数:%s"
#: lclstrconsts.sparlocinfo
msgid " (at %d,%d, stream offset %.8x)"
#, fuzzy
#| msgid " (at %d,%d, stream offset %.8x)"
msgid " (at %d,%d, stream offset %d)"
msgstr "(在 %d,%d, 流偏移 %.8x)"
#: lclstrconsts.sparunterminatedbinvalue

View File

@ -429,7 +429,7 @@ resourceString
SParInvalidFloat = 'Invalid floating point number: %s';
SParWrongTokenSymbol = 'Wrong token symbol: %s expected but %s found';
SParUnterminatedString = 'Unterminated string';
SParLocInfo = ' (at %d,%d, stream offset %.8x)';
SParLocInfo = ' (at %d,%d, stream offset %d)';
SParUnterminatedBinValue = 'Unterminated byte value';
// colorbox

View File

@ -342,13 +342,15 @@ type
property Count: integer read FCount write SetCount;
end;
{ TUTF8Parser }
TUTF8Parser = class(TObject)
private
fStream : TStream;
fBuf : pchar;
fBufLen : integer;
fBufLen : integer; // read
fPos : integer;
fDeltaPos : integer;
fLineStart : integer; // column = fPos - fLineStart + 1
fFloatType : char;
fSourceLine : integer;
fToken : char;
@ -394,6 +396,7 @@ type
function TokenSymbolIs(const S: string): Boolean;
property FloatType: Char read fFloatType;
property SourceLine: Integer read fSourceLine;
function SourceColumn: integer;
property Token: Char read fToken;
end;
@ -1397,8 +1400,7 @@ begin
try
LRSObjectTextToBinary(LFMStream,BinStream);
BinStream.Position:=0;
BinaryToLazarusResourceCode(BinStream,LRSStream,FormClassName
,'FORMDATA');
BinaryToLazarusResourceCode(BinStream,LRSStream,FormClassName,'FORMDATA');
finally
BinStream.Free;
end;
@ -5322,25 +5324,27 @@ begin
end;
procedure TUTF8Parser.LoadBuffer;
var toread : integer;
var newread : integer;
begin
toread:=fStream.Size-fStream.Position;
if toread>ParseBufSize then toread:=ParseBufSize;
if toread=0 then
begin
fEofReached:=true;
exit;
end;
fStream.ReadBuffer(fBuf[0],toread);
fBuf[toread]:=#0;
inc(fDeltaPos,fPos);
newread:=fStream.Read(fBuf[0],ParseBufSize);
fBuf[newread]:=#0;
fLineStart:=fPos-fLineStart;
fPos:=0;
fBufLen:=toread;
fBufLen:=newread;
fEofReached:=newread=0;
end;
procedure TUTF8Parser.CheckLoadBuffer; {$ifdef CLASSESINLINE} inline; {$endif CLASSESINLINE}
begin
if fBuf[fPos]=#0 then LoadBuffer;
if fBuf[fPos]<>#0 then exit;
if fPos<fBufLen then begin
// skip #0
repeat
inc(fPos);
if fBuf[fPos]<>#0 then exit;
until (fPos=fBufLen);
end;
LoadBuffer;
end;
procedure TUTF8Parser.ProcessChar; {$ifdef CLASSESINLINE} inline; {$endif CLASSESINLINE}
@ -5400,22 +5404,26 @@ begin
CheckLoadBuffer;
if fBuf[fPos]=#10 then inc(fPos); //CR LF
end
else inc(fPos); //LF
else begin
inc(fPos); //LF
CheckLoadBuffer;
end;
inc(fSourceLine);
fDeltaPos:=-(fPos-1);
fLineStart:=fPos;
end;
procedure TUTF8Parser.SkipSpaces;
begin
while fBuf[fPos] in [' ',#9] do
while fBuf[fPos] in [' ',#9] do begin
inc(fPos);
CheckLoadBuffer;
end;
end;
procedure TUTF8Parser.SkipWhitespace;
begin
while true do
begin
CheckLoadBuffer;
case fBuf[fPos] of
' ',#9 : SkipSpaces;
#10,#13 : HandleNewLine
@ -5472,6 +5480,7 @@ begin
begin
fFloatType:=fBuf[fPos];
inc(fPos);
CheckLoadBuffer;
fToken:=toFloat;
end
else fFloatType:=#0;
@ -5578,6 +5587,7 @@ begin
fToken:=fBuf[fPos];
fLastTokenStr:=fToken;
inc(fPos);
CheckLoadBuffer;
end;
constructor TUTF8Parser.Create(Stream: TStream);
@ -5586,7 +5596,7 @@ begin
fBuf:=GetMem(ParseBufSize+1);
fBufLen:=0;
fPos:=0;
fDeltaPos:=1;
fLineStart:=0;
fSourceLine:=1;
fEofReached:=false;
fLastTokenStr:='';
@ -5627,7 +5637,8 @@ end;
procedure TUTF8Parser.ErrorStr(const Message: string);
begin
raise EParserError.CreateFmt(Message+SParLocInfo,[SourceLine,fPos+fDeltaPos,SourcePos]);
debugln(['TUTF8Parser.ErrorStr Message="',Message,'" at y=',SourceLine,',x=',SourceColumn]);
raise EParserError.CreateFmt(Message+SParLocInfo,[SourceLine,SourceColumn,SourcePos]);
end;
procedure TUTF8Parser.HexToBinary(Stream: TStream);
@ -5646,6 +5657,7 @@ begin
Error(SParUnterminatedBinValue);
b:=b or GetHexValue(fBuf[fPos]);
inc(fPos);
CheckLoadBuffer;
outbuf[i]:=b;
inc(i);
if i>=ParseBufSize then
@ -5729,6 +5741,11 @@ begin
Result:=(fToken=toSymbol) and (CompareText(fLastTokenStr,S)=0);
end;
function TUTF8Parser.SourceColumn: integer;
begin
Result:=fPos-fLineStart+1;
end;
//------------------------------------------------------------------------------
procedure InternalInit;
begin