mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-20 07:19:27 +02:00
- removed buggy i386-specific FPC_CHARARRAY_TO_SHORTSTR
* fixed generic FPC_CHARARRAY_TO_SHORTSTR (web bug #2382) * fixed some potential range errors in indexchar/word/dword
This commit is contained in:
parent
b2eea6a1d8
commit
15419c49a6
@ -940,46 +940,6 @@ function fpc_pchar_to_shortstr(p:pchar):shortstring;[public,alias:'FPC_PCHAR_TO_
|
||||
function fpc_pchar_length(p:pchar):longint;assembler;[public,alias:'FPC_PCHAR_LENGTH']; {$ifdef hascompilerproc} compilerproc; {$endif}
|
||||
{$include strlen.inc}
|
||||
|
||||
{$define FPC_SYSTEM_HAS_FPC_CHARARRAY_TO_SHORTSTR}
|
||||
function fpc_chararray_to_shortstr(const arr: array of char):shortstring;[public,alias:'FPC_CHARARRAY_TO_SHORTSTR']; {$ifdef hascompilerproc} compilerproc; {$endif}
|
||||
begin
|
||||
asm
|
||||
cld
|
||||
movl arr,%esi
|
||||
movl arr+4,%ecx
|
||||
{$ifdef hascompilerproc}
|
||||
{ previous implementations passed length(arr), with compilerproc }
|
||||
{ we only have high(arr), so add one (JM) }
|
||||
incl %ecx
|
||||
{$endif hascompilerproc}
|
||||
orl %esi,%esi
|
||||
jnz .LStrCharArrayNotNil
|
||||
movl $0,%ecx
|
||||
.LStrCharArrayNotNil:
|
||||
andl $255,%ecx
|
||||
movl %ecx,%eax
|
||||
movl __RESULT,%edi
|
||||
stosb
|
||||
cmpl $7,%eax
|
||||
jl .LStrCharArray2
|
||||
movl %edi,%ecx { Align on 32bits }
|
||||
negl %ecx
|
||||
andl $3,%ecx
|
||||
subl %ecx,%eax
|
||||
rep
|
||||
movsb
|
||||
movl %eax,%ecx
|
||||
andl $3,%eax
|
||||
shrl $2,%ecx
|
||||
rep
|
||||
movsl
|
||||
.LStrCharArray2:
|
||||
movl %eax,%ecx
|
||||
rep
|
||||
movsb
|
||||
end ['ECX','EAX','ESI','EDI'];
|
||||
end;
|
||||
|
||||
|
||||
{$define FPC_SYSTEM_HAS_GET_FRAME}
|
||||
function get_frame:longint;assembler;{$ifdef SYSTEMINLINE}inline;{$endif}
|
||||
@ -1214,7 +1174,12 @@ end;
|
||||
|
||||
{
|
||||
$Log$
|
||||
Revision 1.38 2003-01-06 23:03:13 mazen
|
||||
Revision 1.39 2003-02-18 17:56:06 jonas
|
||||
- removed buggy i386-specific FPC_CHARARRAY_TO_SHORTSTR
|
||||
* fixed generic FPC_CHARARRAY_TO_SHORTSTR (web bug 2382)
|
||||
* fixed some potential range errors in indexchar/word/dword
|
||||
|
||||
Revision 1.38 2003/01/06 23:03:13 mazen
|
||||
+ defining FPC_SYSTEM_HAS_DECLOCKED and FPC_SYSTEM_HAS_INCLOCKED to avoid
|
||||
compilation error on generic.inc
|
||||
|
||||
|
@ -115,7 +115,7 @@ var
|
||||
I : longint;
|
||||
begin
|
||||
I:=0;
|
||||
while (bytearray(buf)[I]<>b) and (I<Len) do
|
||||
while (I<Len) and (bytearray(buf)[I]<>b) do
|
||||
inc(I);
|
||||
if (i=Len) then
|
||||
i:=-1; {Can't use 0, since it is a possible value}
|
||||
@ -132,7 +132,7 @@ var
|
||||
I : longint;
|
||||
begin
|
||||
I:=0;
|
||||
while (wordarray(buf)[I]<>b) and (I<Len) do
|
||||
while (I<Len) and (wordarray(buf)[I]<>b) do
|
||||
inc(I);
|
||||
if (i=Len) then
|
||||
i:=-1; {Can't use 0, since it is a possible value for index}
|
||||
@ -149,7 +149,7 @@ var
|
||||
I : longint;
|
||||
begin
|
||||
I:=0;
|
||||
while (longintarray(buf)[I]<>b) and (I<Len) do inc(I);
|
||||
while (I<Len) and (longintarray(buf)[I]<>b) do inc(I);
|
||||
if (i=Len) then
|
||||
i:=-1; {Can't use 0, since it is a possible value for index}
|
||||
IndexDWord:=I;
|
||||
@ -651,8 +651,11 @@ function fpc_chararray_to_shortstr(const arr: array of char):shortstring;[public
|
||||
var
|
||||
l: longint;
|
||||
{$else hascompilerproc}
|
||||
function fpc_chararray_to_shortstr(p:pchar; l : longint):shortstring;[public,alias:'FPC_CHARARRAY_TO_SHORTSTR'];
|
||||
function fpc_chararray_to_shortstr(arr:pchar; l : longint):shortstring;[public,alias:'FPC_CHARARRAY_TO_SHORTSTR'];
|
||||
var
|
||||
{$endif hascompilerproc}
|
||||
index: longint;
|
||||
len: byte;
|
||||
begin
|
||||
{$ifdef hascompilerproc}
|
||||
l := high(arr)+1;
|
||||
@ -661,8 +664,13 @@ begin
|
||||
l:=255
|
||||
else if l<0 then
|
||||
l:=0;
|
||||
move(arr[0],fpc_chararray_to_shortstr[1],l);
|
||||
fpc_chararray_to_shortstr[0]:=chr(l);
|
||||
index:=IndexByte(arr[0],l,0);
|
||||
if (index < 0) then
|
||||
len := l
|
||||
else
|
||||
len := index;
|
||||
move(arr[0],fpc_chararray_to_shortstr[1],len);
|
||||
fpc_chararray_to_shortstr[0]:=chr(len);
|
||||
end;
|
||||
|
||||
{$endif ndef FPC_SYSTEM_HAS_FPC_CHARARRAY_TO_SHORTSTR}
|
||||
@ -965,7 +973,12 @@ end;
|
||||
|
||||
{
|
||||
$Log$
|
||||
Revision 1.49 2003-01-20 22:21:36 mazen
|
||||
Revision 1.50 2003-02-18 17:56:06 jonas
|
||||
- removed buggy i386-specific FPC_CHARARRAY_TO_SHORTSTR
|
||||
* fixed generic FPC_CHARARRAY_TO_SHORTSTR (web bug 2382)
|
||||
* fixed some potential range errors in indexchar/word/dword
|
||||
|
||||
Revision 1.49 2003/01/20 22:21:36 mazen
|
||||
* many stuff related to RTL fixed
|
||||
|
||||
Revision 1.48 2003/01/09 20:14:20 florian
|
||||
|
Loading…
Reference in New Issue
Block a user