Hi.
sysstr.inc r10846 does not include my patch, which solves problem when both strings are empty and differs after null character. Then I'am sending it again merged against trunk.
Here is testcase:
program comp;
uses
SysUtils;
var
a, b: array[0..1] of char;
begin
a[0] := #0; a[1] := #1; //Empty string
b[0] := #0; b[1] := #0; //Empty string with different char after end
writeln(AnsiStrComp(a, b)); //should be zero because a=b
writeln(AnsiStrIComp(a, b)); /should be zero because a=b
end.And here is patch. Construction with "repeat" overflows strings boundary in the first cycle, "while" solves this problem. The same construction is used in GenericAnsiCompareText.
Index: rtl/objpas/sysutils/sysstr.inc
===================================================================
--- rtl/objpas/sysutils/sysstr.inc (revision 10891)
+++ rtl/objpas/sysutils/sysstr.inc (working copy)
@@ -307,11 +307,11 @@
Result:=1;
exit;
end;
- Repeat
+ 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);
- Until (Result0) or (S1^=#0) or (S2^=#0);
+ 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
@@ -335,11 +335,11 @@
Result:=1;
exit;
end;
- Repeat
+ While (Result=0) and (S1^#0) and (S2^#0) do begin
Result:=Ord(LowerCaseTable[Ord(S1[0])])-Ord(LowerCaseTable[Ord(S2[0])]); //!! Must be replaced by ansi characters !!
Inc(S1);
Inc(S2);
- Until (Result0) or ((S1[0]=#0) or (S2[0]=#0));
+ end;
if (Result=0) and (s1[0]s2[0]) then //length(s1)length(s2)
if s1[0]=#0 then
Result:=-1 //s1 shorter than s2