|
@@ -116,21 +116,17 @@ Function NewAnsiString(Len : SizeInt) : Pointer;
|
|
|
Allocate a new AnsiString on the heap.
|
|
|
initialize it to zero length and reference count 1.
|
|
|
}
|
|
|
-Var
|
|
|
- P : Pointer;
|
|
|
begin
|
|
|
{ request a multiple of 16 because the heap manager alloctes anyways chunks of 16 bytes }
|
|
|
- GetMem(P,Len+(AnsiFirstOff+sizeof(AnsiChar)));
|
|
|
- If P<>Nil then
|
|
|
- begin
|
|
|
- PAnsiRec(P)^.Ref:=1; { Set reference count }
|
|
|
- PAnsiRec(P)^.Len:=0; { Initial length }
|
|
|
- PAnsiRec(P)^.CodePage:=DefaultSystemCodePage;
|
|
|
- PAnsiRec(P)^.ElementSize:=SizeOf(AnsiChar);
|
|
|
- inc(p,AnsiFirstOff); { Points to string now }
|
|
|
- PAnsiChar(P)^:=#0; { Terminating #0 }
|
|
|
- end;
|
|
|
- NewAnsiString:=P;
|
|
|
+ Result:=GetMem(Len+(AnsiFirstOff+sizeof(AnsiChar)));
|
|
|
+ If Result=Nil then
|
|
|
+ Exit;
|
|
|
+ PAnsiRec(Result)^.Ref:=1; { Set reference count }
|
|
|
+ PAnsiRec(Result)^.Len:=0; { Initial length }
|
|
|
+ PAnsiRec(Result)^.CodePage:=DefaultSystemCodePage;
|
|
|
+ PAnsiRec(Result)^.ElementSize:=SizeOf(AnsiChar);
|
|
|
+ inc(Result,AnsiFirstOff); { Points to string now }
|
|
|
+ PAnsiChar(Result)^:=#0; { Terminating #0 }
|
|
|
end;
|
|
|
{$endif FPC_HAS_NEWANSISTR}
|
|
|
|
|
@@ -650,44 +646,20 @@ Function fpc_AnsiStr_Compare(const S1,S2 : RawByteString): SizeInt;[Public,Alias
|
|
|
>0 if S1>S2
|
|
|
}
|
|
|
Var
|
|
|
- MaxI,Temp : SizeInt;
|
|
|
- cp1,cp2 : TSystemCodePage;
|
|
|
- r1,r2 : RawByteString;
|
|
|
-begin
|
|
|
- if pointer(S1)=pointer(S2) then
|
|
|
- begin
|
|
|
- result:=0;
|
|
|
- exit;
|
|
|
- end;
|
|
|
- if (pointer(S1)=nil) then
|
|
|
- begin
|
|
|
- result:=-Length(S2);
|
|
|
- exit;
|
|
|
- end;
|
|
|
- if (pointer(S2)=nil) then
|
|
|
- begin
|
|
|
- result:=Length(S1);
|
|
|
- exit;
|
|
|
- end;
|
|
|
- cp1:=TranslatePlaceholderCP(StringCodePage(S1));
|
|
|
- cp2:=TranslatePlaceholderCP(StringCodePage(S2));
|
|
|
- if cp1=cp2 then
|
|
|
- begin
|
|
|
- Maxi:=Length(S1);
|
|
|
- temp:=Length(S2);
|
|
|
- If MaxI>Temp then
|
|
|
- MaxI:=Temp;
|
|
|
- if MaxI>0 then
|
|
|
- begin
|
|
|
- result:=CompareByte(S1[1],S2[1],MaxI);
|
|
|
- if result=0 then
|
|
|
- result:=Length(S1)-Length(S2);
|
|
|
- end
|
|
|
- else
|
|
|
- result:=Length(S1)-Length(S2);
|
|
|
- end
|
|
|
- else
|
|
|
- Result:=fpc_utf8_compare(s1,s2);
|
|
|
+ Len1,Len2,CmpLen : SizeInt;
|
|
|
+begin
|
|
|
+ if (pointer(S1)=pointer(S2)) or (pointer(S1)=nil) or (pointer(S2)=nil) then
|
|
|
+ exit(ord(pointer(S1)<>nil)-ord(pointer(S2)<>nil));
|
|
|
+ if TranslatePlaceholderCP(PAnsiRec(Pointer(S1)-AnsiFirstOff)^.CodePage)<>TranslatePlaceholderCP(PAnsiRec(Pointer(S2)-AnsiFirstOff)^.CodePage) then
|
|
|
+ exit(fpc_utf8_compare(s1,s2));
|
|
|
+ Len1:=PAnsiRec(Pointer(S1)-AnsiFirstOff)^.Len;
|
|
|
+ Len2:=PAnsiRec(Pointer(S2)-AnsiFirstOff)^.Len;
|
|
|
+ CmpLen:=Len1;
|
|
|
+ If Len1>Len2 then
|
|
|
+ CmpLen:=Len2;
|
|
|
+ result:=CompareByte(S1[1],S2[1],CmpLen);
|
|
|
+ if result=0 then
|
|
|
+ result:=Len1-Len2;
|
|
|
end;
|
|
|
{$endif FPC_HAS_ANSISTR_COMPARE}
|
|
|
|
|
@@ -722,29 +694,17 @@ Function fpc_AnsiStr_Compare_equal(const S1,S2 : RawByteString): SizeInt;[Public
|
|
|
<>0 if S1<>S2
|
|
|
}
|
|
|
Var
|
|
|
- MaxI,Temp : SizeInt;
|
|
|
- cp1,cp2 : TSystemCodePage;
|
|
|
+ MaxI : SizeInt;
|
|
|
begin
|
|
|
- if pointer(S1)=pointer(S2) then
|
|
|
- Exit(0);
|
|
|
{ don't compare strings if one of them is empty }
|
|
|
- if (pointer(S1)=nil) or (pointer(S2)=Nil) then
|
|
|
- Exit(-1);
|
|
|
- cp1:=TranslatePlaceholderCP(StringCodePage(S1));
|
|
|
- cp2:=TranslatePlaceholderCP(StringCodePage(S2));
|
|
|
- if cp1=cp2 then
|
|
|
- begin
|
|
|
- Maxi:=Length(S1);
|
|
|
- temp:=Length(S2);
|
|
|
- Result := Maxi - temp;
|
|
|
- if Result = 0 then
|
|
|
- if MaxI>0 then
|
|
|
- result:=CompareByte(S1[1],S2[1],MaxI);
|
|
|
- end
|
|
|
- else
|
|
|
- begin
|
|
|
- Result:=fpc_utf8_Compare_equal(S1,S2);
|
|
|
- end;
|
|
|
+ if (pointer(S1)=pointer(S2)) or (pointer(S1)=nil) or (pointer(S2)=nil) then
|
|
|
+ Exit(ord(pointer(S1)<>pointer(S2)));
|
|
|
+ if TranslatePlaceholderCP(PAnsiRec(Pointer(S1)-AnsiFirstOff)^.CodePage)<>TranslatePlaceholderCP(PAnsiRec(Pointer(S2)-AnsiFirstOff)^.CodePage) then
|
|
|
+ Exit(fpc_utf8_Compare_equal(S1,S2));
|
|
|
+ Maxi:=PAnsiRec(Pointer(S1)-AnsiFirstOff)^.Len;
|
|
|
+ Result:=Maxi-PAnsiRec(Pointer(S2)-AnsiFirstOff)^.Len;
|
|
|
+ if Result=0 then
|
|
|
+ result:=CompareByte(S1[1],S2[1],MaxI);
|
|
|
end;
|
|
|
{$endif FPC_HAS_ANSISTR_COMPARE_EQUAL}
|
|
|
|