Вверх ↑
Ответов: 4629
Рейтинг: 749
#1: 2020-01-04 15:46:27 ЛС | профиль | цитата
Galkov, там в новом FPC поведение моей версии почему-то отличается от Delphi. Разбираюсь.

--- Добавлено в 2020-01-04 16:22:09

Откуда-то у меня взялся баг в реализации KOL.AnsiLowerCase()/KOL.AnsiUpperCase() - не инициализировался Result.
rav, для исправления:
- в файле HiAsm\compiler\FPC2\src\packages\KOLx64\kol.pas нужно поправить функции (в районе строки 21772)

function AnsiUpperCase(const S: AnsiString): AnsiString;
var
Len: Integer;
begin
Len := Length(S);
SetString(Result, PAnsiChar(S), Len);
if Len > 0 then CharUpperBuffA(Pointer(Result), Len);
end;

function AnsiUpperCase(const S: WideString): WideString; // Overloaded (NetSpirit)
var
Len: Integer;
begin
Len := Length(S);
SetString(Result, PWideChar(S), Len);
if Len > 0 then CharUpperBuffW(Pointer(Result), Len);
end;

function AnsiLowerCase(const S: AnsiString): AnsiString;
var
Len: Integer;
begin
Len := Length(S);
SetString(Result, PAnsiChar(S), Len);
if Len > 0 then CharLowerBuffA(Pointer(Result), Len);
end;

function AnsiLowerCase(const S: WideString): WideString; // Overloaded (NetSpirit)
var
Len: Integer;
begin
Len := Length(S);
SetString(Result, PWideChar(S), Len);
if Len > 0 then CharLowerBuffW(Pointer(Result), Len);
end;
- после исправления выполнить файл HiAsm\compiler\FPC2\src\_make_KOL.bat
- В файле hiStrMask.pas функция _StrCmp() должна выглядеть так:

function _StrCmp(Str, Msk: PChar): Boolean;
begin
while (Str^ <> #0) and (Msk^ <> #0) do
begin
if Msk^ = '*' then
begin
Result := _StrCmp(Str, Msk + 1);
if Result then Exit;
end
else
begin
if Msk^ = '#' then
Result := Str^ in ['0'..'9']
else
Result := (Msk^ = '?') or (Msk^ = Str^);

if Result then
Inc(Msk)
else
Exit;
end;

Inc(Str);
end;

while Msk^ = '*' do Inc(Msk);

Result := (Str^ = #0) and (Msk^ = #0);
end;
карма: 26

0
Редактировалось 3 раз(а), последний 2020-01-04 16:30:42