mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-08-16 13:29:37 +02:00
lazutf8: some optimizations for UTF8LowerCaseMattias
git-svn-id: trunk@32756 -
This commit is contained in:
parent
493cba2f66
commit
1e24d21f65
@ -1113,40 +1113,56 @@ var
|
||||
OldCode: LongWord;
|
||||
NewCode: LongWord;
|
||||
NewCharLen: integer;
|
||||
Changed: Boolean;
|
||||
p: PChar;
|
||||
begin
|
||||
Result:=s;
|
||||
i:=1;
|
||||
while i<=length(Result) do begin
|
||||
case Result[i] of
|
||||
{ First ASCII chars }
|
||||
'A'..'Z':
|
||||
if Result='' then exit;
|
||||
Changed:=false;
|
||||
p:=PChar(Result);
|
||||
repeat
|
||||
case p^ of
|
||||
#0:
|
||||
if p-PChar(Result)=length(Result) then
|
||||
exit
|
||||
else
|
||||
inc(p);
|
||||
'A'..'Z': // First ASCII chars
|
||||
begin
|
||||
Result[i]:=chr(ord(Result[i])+32);
|
||||
inc(i);
|
||||
end;
|
||||
{ Now chars with multiple bytes }
|
||||
#192..#240:
|
||||
begin
|
||||
OldCode:=UTF8CharacterToUnicode(@Result[i],CharLen);
|
||||
NewCode:=UnicodeLowercase(OldCode);
|
||||
if NewCode=OldCode then begin
|
||||
inc(i,CharLen);
|
||||
end else begin
|
||||
if not Changed then begin
|
||||
i:=p-PChar(Result)+1;
|
||||
UniqueString(Result);
|
||||
NewCharLen:=UnicodeToUTF8(NewCode,@Result[i]);
|
||||
if CharLen=NewCharLen then begin
|
||||
inc(i,NewCharLen);
|
||||
end else begin
|
||||
Changed:=true;
|
||||
p:=@Result[i];
|
||||
end;
|
||||
p^:=chr(ord(p^)+32);
|
||||
inc(p);
|
||||
end;
|
||||
|
||||
#192..#240: // Now chars with multiple bytes
|
||||
begin
|
||||
OldCode:=UTF8CharacterToUnicode(p,CharLen);
|
||||
NewCode:=UnicodeLowercase(OldCode);
|
||||
if NewCode<>OldCode then begin
|
||||
if not Changed then begin
|
||||
i:=p-PChar(Result)+1;
|
||||
UniqueString(Result);
|
||||
Changed:=true;
|
||||
p:=@Result[i];
|
||||
end;
|
||||
NewCharLen:=UnicodeToUTF8(NewCode,p);
|
||||
if CharLen<>NewCharLen then begin
|
||||
// string size changed => use slower function
|
||||
Result:=UTF8LowercaseDynLength(s);
|
||||
exit;
|
||||
end;
|
||||
end;
|
||||
inc(p,CharLen);
|
||||
end;
|
||||
else
|
||||
inc(i);
|
||||
end;
|
||||
inc(p);
|
||||
end;
|
||||
until false;
|
||||
end;
|
||||
{$endif}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user