Модератор: Модераторы
завершающие #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
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 5