Модератор: Модераторы
завершающие #0 у строковых констант обеспечиваются компилятором (пример из fpc 2.6.0)
shortstring.
# s2 := 's2';
    movl    $U_P$PROGRAM$S2,%eax
    movl    $_$PROGRAM$_Ld3,%ecx
    movl    $255,%edx
    call    fpc_shortstr_to_shortstr
...
.section .data
.globl   _PROGRAM$_Ld3
_PROGRAM$_Ld3:
   .ascii  \002"s2\000"
Я специально этот момент перепроверил - 0 присутсвует.
А валидный PChar вообще может быть nil'ом
я уже писал выше - этот код находится в ZEOS.
function AnsiStrComp(S1, S2: PChar): integer;{$ifdef SYSUTILSINLINE}inline;{$endif}
  begin
    result:=widestringmanager.StrCompAnsiStringProc(s1,s2);
  end;
function StrCompAnsi(s1,s2 : PChar): PtrInt;
  begin
    result:=strcoll(s1,s2);
  end;
...
      StrCompAnsiStringProc:=@StrCompAnsi;
function Win32AnsiStrComp(S1, S2: PChar): PtrInt;
  begin
    result:=CompareString(LOCALE_USER_DEFAULT,0,s1,-1,s2,-1)-2;
  end;
...
    widestringmanager.StrCompAnsiStringProc:=@Win32AnsiStrComp;
function GenericAnsiStrComp(S1, S2: PChar): PtrInt;
begin
  Result:=0;
  If S1=Nil then
    begin
      If S2=Nil Then Exit;
      result:=-1;
      exit;
    end;
  If S2=Nil then
    begin
      Result:=1;
      exit;
    end;
  While (Result=0) and (S1^<>#0) and (S2^<>#0) do begin
    Result:=Ord(S1^)-Ord(S2^); //!! Must be replaced by ansi characters !!
    Inc(S1);
    Inc(S2);
  end;
  if (Result=0) and (S1^<>S2^) then // loop ended because exactly one has #0
    if S1^=#0 then // shorter string is smaller
      result:=-1
    else
      result:=1;
end;
{$ifndef FPC_NOGENERICANSIROUTINES}
    if not assigned(widestringmanager.StrCompAnsiStringProc) then
      widestringmanager.StrCompAnsiStringProc:=@GenericAnsiStrComp;
Вернуться в Free Pascal Compiler
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1