#8 StrScanLen - не соответствие pas и asm

closed-fixed
nobody
None
5
2007-10-02
2007-10-02
mdw
No

Наткнулся на на баг в TStrList.SetText. Происходит зацикливание при разборе текста. Собственно ошибка не здесь, а в
function StrScanLen(Str: PChar; Chr: Char; Len: Integer): PChar;
Посмотрел аsm версию, алгоритм должен быть такой. Сканируется Len символов, и не зависимо находит что-то или нет и независимо от #0, возвращается указатель на следующий символ после найденого символа или после Len символов. А сейчас, возвращается указатель на найденый символ, а не на следующий за ним.

Поэтому прелагаю такой вариант:
function StrScanLen(Str: PChar; Chr: Char; Len: Integer): PChar;
var i: Integer;
Begin
Result:= Str+Len;
for i:= 0 to Len-1 do
if (Str+i)^ = Chr then
begin;
Result:= Str+i+1;
Exit;
end;
end;

Ну, а если оставлять так, как сейчас есть, нужно везде где используется StrScanLen править.

Discussion

  • jura
    jura
    2007-10-02

    • status: open --> closed-fixed
     
  • jura
    jura
    2007-10-02

    Logged In: YES
    user_id=1226674
    Originator: NO

    Исправил. Когда делал пас версию не почитал описание функции, а сделал по аналогии с StrScan.