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;