procedure TPreprocessor.ReplaceTokens(var Text:PChar; Define:Boolean);
var TokenStart, DefLastCopy:PChar;
TokenLen:Cardinal;
procedure DefCopy;
var Len, CopyLen:Integer;
begin
Len := Length(DefineText);
CopyLen := Cardinal(Text)-Cardinal(DefLastCopy);
Output := Output +'cpy:' + IntToStr(CopyLen);
if CopyLen = 0 then Exit;
SetLength(DefineText, Len+CopyLen);
StrLCopy(PChar(Integer(PChar(DefineText))+Len), DefLastCopy, CopyLen);
Inc(DefLastCopy, CopyLen);
end;
begin
DefLastCopy := Text;
while not (Text^ in [#0,#10,#13]) do
begin
TokenStart := Text;
TokenLen := 0;
while Text^ in ['A'..'Z', 'a'..'z', '0'..'9'] do
begin
Inc(TokenLen);
Inc(Text);
end;
if TokenLen > 0 then
begin
Text := TokenStart;
TokenStart := CheckToken(TokenLen, TokenStart);
if TokenStart <> nil then
begin
if Define then
begin
DefCopy;
DefineText := DefineText + TokenStart;
end
else
begin
StrCopy;
Output := Output + TokenStart;
end;
FreeMem(TokenStart);
end
else
Inc(Text, TokenLen);
end;
Inc(Text);
end;
Dec(Text);
if Define then
DefCopy
else
StrCopy;
Inc(Text);
end;