mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-10-23 04:34:15 +02:00
* some fixes in compilerprocs for chararray to string conversions
* conversion from string to chararray is now also done via compilerprocs
This commit is contained in:
parent
cecfe5dd49
commit
06f9cd4c96
@ -265,19 +265,10 @@ implementation
|
|||||||
|
|
||||||
procedure ti386typeconvnode.second_string_to_chararray;
|
procedure ti386typeconvnode.second_string_to_chararray;
|
||||||
var
|
var
|
||||||
pushedregs: tpushed;
|
arrsize: longint;
|
||||||
//l1 : tasmlabel;
|
|
||||||
//hr : preference;
|
|
||||||
arrsize, strtype: longint;
|
|
||||||
regstopush: byte;
|
|
||||||
begin
|
begin
|
||||||
with tarraydef(resulttype.def) do
|
with tarraydef(resulttype.def) do
|
||||||
begin
|
arrsize := highrange-lowrange+1;
|
||||||
if highrange<lowrange then
|
|
||||||
internalerror(75432653);
|
|
||||||
arrsize := highrange-lowrange+1;
|
|
||||||
end;
|
|
||||||
|
|
||||||
if (left.nodetype = stringconstn) and
|
if (left.nodetype = stringconstn) and
|
||||||
{ left.length+1 since there's always a terminating #0 character (JM) }
|
{ left.length+1 since there's always a terminating #0 character (JM) }
|
||||||
(tstringconstnode(left).len+1 >= arrsize) and
|
(tstringconstnode(left).len+1 >= arrsize) and
|
||||||
@ -285,67 +276,10 @@ implementation
|
|||||||
begin
|
begin
|
||||||
inc(location.reference.offset);
|
inc(location.reference.offset);
|
||||||
exit;
|
exit;
|
||||||
end;
|
end
|
||||||
clear_location(location);
|
else
|
||||||
location.loc := LOC_REFERENCE;
|
{ should be handled already in resulttype pass (JM) }
|
||||||
gettempofsizereference(arrsize,location.reference);
|
internalerror(200108292);
|
||||||
|
|
||||||
regstopush := $ff;
|
|
||||||
remove_non_regvars_from_loc(left.location,regstopush);
|
|
||||||
pushusedregisters(pushedregs,regstopush);
|
|
||||||
|
|
||||||
emit_push_lea_loc(location,false);
|
|
||||||
|
|
||||||
case tstringdef(left.resulttype.def).string_typ of
|
|
||||||
st_shortstring :
|
|
||||||
begin
|
|
||||||
{ 0 means shortstring }
|
|
||||||
strtype := 0;
|
|
||||||
del_reference(left.location.reference);
|
|
||||||
emit_push_lea_loc(left.location,true);
|
|
||||||
ungetiftemp(left.location.reference);
|
|
||||||
end;
|
|
||||||
st_ansistring :
|
|
||||||
begin
|
|
||||||
{ 1 means ansistring }
|
|
||||||
strtype := 1;
|
|
||||||
case left.location.loc of
|
|
||||||
LOC_CREGISTER,LOC_REGISTER:
|
|
||||||
begin
|
|
||||||
ungetregister(left.location.register);
|
|
||||||
emit_push_loc(left.location);
|
|
||||||
end;
|
|
||||||
LOC_MEM,LOC_REFERENCE:
|
|
||||||
begin
|
|
||||||
del_reference(left.location.reference);
|
|
||||||
emit_push_loc(left.location);
|
|
||||||
ungetiftemp(left.location.reference);
|
|
||||||
end;
|
|
||||||
end;
|
|
||||||
end;
|
|
||||||
st_longstring:
|
|
||||||
begin
|
|
||||||
{!!!!!!!}
|
|
||||||
{ 2 means longstring, but still needs support in FPC_STR_TO_CHARARRAY,
|
|
||||||
which is in i386.inc and/or generic.inc (JM) }
|
|
||||||
strtype := 2;
|
|
||||||
|
|
||||||
internalerror(8888);
|
|
||||||
end;
|
|
||||||
st_widestring:
|
|
||||||
begin
|
|
||||||
{!!!!!!!}
|
|
||||||
{ 3 means widestring, but still needs support in FPC_STR_TO_CHARARRAY,
|
|
||||||
which is in i386.inc and/or generic.inc (JM) }
|
|
||||||
strtype := 3;
|
|
||||||
internalerror(8888);
|
|
||||||
end;
|
|
||||||
end;
|
|
||||||
push_int(arrsize);
|
|
||||||
push_int(strtype);
|
|
||||||
saveregvars(regstopush);
|
|
||||||
emitcall('FPC_STR_TO_CHARARRAY');
|
|
||||||
popusedregisters(pushedregs);
|
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
||||||
@ -1066,7 +1000,11 @@ begin
|
|||||||
end.
|
end.
|
||||||
{
|
{
|
||||||
$Log$
|
$Log$
|
||||||
Revision 1.21 2001-08-28 13:24:47 jonas
|
Revision 1.22 2001-08-29 19:49:03 jonas
|
||||||
|
* some fixes in compilerprocs for chararray to string conversions
|
||||||
|
* conversion from string to chararray is now also done via compilerprocs
|
||||||
|
|
||||||
|
Revision 1.21 2001/08/28 13:24:47 jonas
|
||||||
+ compilerproc implementation of most string-related type conversions
|
+ compilerproc implementation of most string-related type conversions
|
||||||
- removed all code from the compiler which has been replaced by
|
- removed all code from the compiler which has been replaced by
|
||||||
compilerproc implementations (using {$ifdef hascompilerproc} is not
|
compilerproc implementations (using {$ifdef hascompilerproc} is not
|
||||||
|
@ -43,6 +43,7 @@ interface
|
|||||||
private
|
private
|
||||||
function resulttype_cord_to_pointer : tnode;
|
function resulttype_cord_to_pointer : tnode;
|
||||||
function resulttype_chararray_to_string : tnode;
|
function resulttype_chararray_to_string : tnode;
|
||||||
|
function resulttype_string_to_chararray : tnode;
|
||||||
function resulttype_string_to_string : tnode;
|
function resulttype_string_to_string : tnode;
|
||||||
function resulttype_char_to_string : tnode;
|
function resulttype_char_to_string : tnode;
|
||||||
function resulttype_int_to_real : tnode;
|
function resulttype_int_to_real : tnode;
|
||||||
@ -57,7 +58,6 @@ interface
|
|||||||
function first_int_to_int : tnode;virtual;
|
function first_int_to_int : tnode;virtual;
|
||||||
function first_cstring_to_pchar : tnode;virtual;
|
function first_cstring_to_pchar : tnode;virtual;
|
||||||
function first_string_to_chararray : tnode;virtual;
|
function first_string_to_chararray : tnode;virtual;
|
||||||
function first_string_to_string : tnode;virtual;
|
|
||||||
function first_char_to_string : tnode;virtual;
|
function first_char_to_string : tnode;virtual;
|
||||||
function first_nothing : tnode;virtual;
|
function first_nothing : tnode;virtual;
|
||||||
function first_array_to_pointer : tnode;virtual;
|
function first_array_to_pointer : tnode;virtual;
|
||||||
@ -430,6 +430,32 @@ implementation
|
|||||||
resulttypepass(result);
|
resulttypepass(result);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
function ttypeconvnode.resulttype_string_to_chararray : tnode;
|
||||||
|
var
|
||||||
|
arrsize: longint;
|
||||||
|
begin
|
||||||
|
with tarraydef(resulttype.def) do
|
||||||
|
begin
|
||||||
|
if highrange<lowrange then
|
||||||
|
internalerror(75432653);
|
||||||
|
arrsize := highrange-lowrange+1;
|
||||||
|
end;
|
||||||
|
if (left.nodetype = stringconstn) and
|
||||||
|
{ left.length+1 since there's always a terminating #0 character (JM) }
|
||||||
|
(tstringconstnode(left).len+1 >= arrsize) and
|
||||||
|
(tstringdef(left.resulttype.def).string_typ=st_shortstring) then
|
||||||
|
begin
|
||||||
|
{ handled separately }
|
||||||
|
result := nil;
|
||||||
|
exit;
|
||||||
|
end;
|
||||||
|
result := ccallnode.createinternres(
|
||||||
|
'fpc_'+lower(tstringdef(left.resulttype.def).stringtypname)+
|
||||||
|
'_to_chararray',ccallparanode.create(left,ccallparanode.create(
|
||||||
|
cordconstnode.create(arrsize,s32bittype),nil)),resulttype);
|
||||||
|
left := nil;
|
||||||
|
resulttypepass(result);
|
||||||
|
end;
|
||||||
|
|
||||||
function ttypeconvnode.resulttype_string_to_string : tnode;
|
function ttypeconvnode.resulttype_string_to_string : tnode;
|
||||||
var
|
var
|
||||||
@ -653,7 +679,7 @@ implementation
|
|||||||
{ cchar_2_pchar } @ttypeconvnode.resulttype_cchar_to_pchar,
|
{ cchar_2_pchar } @ttypeconvnode.resulttype_cchar_to_pchar,
|
||||||
{ cstring_2_pchar } @ttypeconvnode.resulttype_cstring_to_pchar,
|
{ cstring_2_pchar } @ttypeconvnode.resulttype_cstring_to_pchar,
|
||||||
{ ansistring_2_pchar } nil,
|
{ ansistring_2_pchar } nil,
|
||||||
{ string_2_chararray } nil,
|
{ string_2_chararray } @ttypeconvnode.resulttype_string_to_chararray,
|
||||||
{ chararray_2_string } @ttypeconvnode.resulttype_chararray_to_string,
|
{ chararray_2_string } @ttypeconvnode.resulttype_chararray_to_string,
|
||||||
{ array_2_pointer } nil,
|
{ array_2_pointer } nil,
|
||||||
{ pointer_2_array } nil,
|
{ pointer_2_array } nil,
|
||||||
@ -1068,23 +1094,6 @@ implementation
|
|||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
||||||
function ttypeconvnode.first_string_to_string : tnode;
|
|
||||||
begin
|
|
||||||
first_string_to_string:=nil;
|
|
||||||
if tstringdef(resulttype.def).string_typ<>
|
|
||||||
tstringdef(left.resulttype.def).string_typ then
|
|
||||||
begin
|
|
||||||
procinfo^.flags:=procinfo^.flags or pi_do_call;
|
|
||||||
end;
|
|
||||||
{ for simplicity lets first keep all ansistrings
|
|
||||||
as LOC_MEM, could also become LOC_REGISTER }
|
|
||||||
if tstringdef(resulttype.def).string_typ in [st_ansistring,st_widestring] then
|
|
||||||
{ we may use ansistrings so no fast exit here }
|
|
||||||
procinfo^.no_fast_exit:=true;
|
|
||||||
location.loc:=LOC_MEM;
|
|
||||||
end;
|
|
||||||
|
|
||||||
|
|
||||||
function ttypeconvnode.first_char_to_string : tnode;
|
function ttypeconvnode.first_char_to_string : tnode;
|
||||||
begin
|
begin
|
||||||
first_char_to_string:=nil;
|
first_char_to_string:=nil;
|
||||||
@ -1262,14 +1271,14 @@ implementation
|
|||||||
firstconvert : array[tconverttype] of pointer = (
|
firstconvert : array[tconverttype] of pointer = (
|
||||||
@ttypeconvnode.first_nothing, {equal}
|
@ttypeconvnode.first_nothing, {equal}
|
||||||
@ttypeconvnode.first_nothing, {not_possible}
|
@ttypeconvnode.first_nothing, {not_possible}
|
||||||
@ttypeconvnode.first_string_to_string,
|
nil, { removed in resulttype_string_to_string }
|
||||||
@ttypeconvnode.first_char_to_string,
|
@ttypeconvnode.first_char_to_string,
|
||||||
@ttypeconvnode.first_nothing, { removed in resulttype_chararray_to_string }
|
nil, { removed in resulttype_chararray_to_string }
|
||||||
@ttypeconvnode.first_cchar_to_pchar,
|
@ttypeconvnode.first_cchar_to_pchar,
|
||||||
@ttypeconvnode.first_cstring_to_pchar,
|
@ttypeconvnode.first_cstring_to_pchar,
|
||||||
@ttypeconvnode.first_ansistring_to_pchar,
|
@ttypeconvnode.first_ansistring_to_pchar,
|
||||||
@ttypeconvnode.first_string_to_chararray,
|
@ttypeconvnode.first_string_to_chararray,
|
||||||
@ttypeconvnode.first_nothing, { removed in resulttype_chararray_to_string }
|
nil, { removed in resulttype_chararray_to_string }
|
||||||
@ttypeconvnode.first_array_to_pointer,
|
@ttypeconvnode.first_array_to_pointer,
|
||||||
@ttypeconvnode.first_pointer_to_array,
|
@ttypeconvnode.first_pointer_to_array,
|
||||||
@ttypeconvnode.first_int_to_int,
|
@ttypeconvnode.first_int_to_int,
|
||||||
@ -1477,7 +1486,11 @@ begin
|
|||||||
end.
|
end.
|
||||||
{
|
{
|
||||||
$Log$
|
$Log$
|
||||||
Revision 1.34 2001-08-29 12:18:07 jonas
|
Revision 1.35 2001-08-29 19:49:03 jonas
|
||||||
|
* some fixes in compilerprocs for chararray to string conversions
|
||||||
|
* conversion from string to chararray is now also done via compilerprocs
|
||||||
|
|
||||||
|
Revision 1.34 2001/08/29 12:18:07 jonas
|
||||||
+ new createinternres() constructor for tcallnode to support setting a
|
+ new createinternres() constructor for tcallnode to support setting a
|
||||||
custom resulttype
|
custom resulttype
|
||||||
* compilerproc typeconversions now set the resulttype from the type
|
* compilerproc typeconversions now set the resulttype from the type
|
||||||
|
@ -888,6 +888,11 @@ begin
|
|||||||
cld
|
cld
|
||||||
movl arr,%esi
|
movl arr,%esi
|
||||||
movl arr+4,%ecx
|
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
|
orl %esi,%esi
|
||||||
jnz .LStrCharArrayNotNil
|
jnz .LStrCharArrayNotNil
|
||||||
movl $0,%ecx
|
movl $0,%ecx
|
||||||
@ -1139,7 +1144,11 @@ procedure inclocked(var l : longint);assembler;
|
|||||||
|
|
||||||
{
|
{
|
||||||
$Log$
|
$Log$
|
||||||
Revision 1.15 2001-08-28 13:24:47 jonas
|
Revision 1.16 2001-08-29 19:49:04 jonas
|
||||||
|
* some fixes in compilerprocs for chararray to string conversions
|
||||||
|
* conversion from string to chararray is now also done via compilerprocs
|
||||||
|
|
||||||
|
Revision 1.15 2001/08/28 13:24:47 jonas
|
||||||
+ compilerproc implementation of most string-related type conversions
|
+ compilerproc implementation of most string-related type conversions
|
||||||
- removed all code from the compiler which has been replaced by
|
- removed all code from the compiler which has been replaced by
|
||||||
compilerproc implementations (using {$ifdef hascompilerproc} is not
|
compilerproc implementations (using {$ifdef hascompilerproc} is not
|
||||||
|
@ -314,6 +314,8 @@ begin
|
|||||||
{ result is automatically set to '' }
|
{ result is automatically set to '' }
|
||||||
exit;
|
exit;
|
||||||
i:=IndexChar(arr,high(arr)+1,#0);
|
i:=IndexChar(arr,high(arr)+1,#0);
|
||||||
|
if i = -1 then
|
||||||
|
i := high(arr)+1;
|
||||||
SetLength(fpc_CharArray_To_AnsiStr,i);
|
SetLength(fpc_CharArray_To_AnsiStr,i);
|
||||||
Move (arr[0],Pointer(fpc_CharArray_To_AnsiStr)^,i);
|
Move (arr[0],Pointer(fpc_CharArray_To_AnsiStr)^,i);
|
||||||
end;
|
end;
|
||||||
@ -321,13 +323,46 @@ end;
|
|||||||
{ old style helper }
|
{ old style helper }
|
||||||
{$ifndef hascompilerproc}
|
{$ifndef hascompilerproc}
|
||||||
{ the declaration below is the same as }
|
{ the declaration below is the same as }
|
||||||
{ Procedure fpc_CharArray_To_AnsiStr(var a : ansistring; p: pointer; len: longint); }
|
|
||||||
{ which is what the old helper was (we need the parameter as "array of char" type }
|
{ which is what the old helper was (we need the parameter as "array of char" type }
|
||||||
{ so we can pass it to the new style helper (JM) }
|
{ so we can pass it to the new style helper (JM) }
|
||||||
Procedure fpc_CharArray_To_AnsiStr(var a : ansistring; const arr: array of char);[Public,Alias : 'FPC_CHARARRAY_TO_ANSISTR']; {$ifdef hascompilerproc} compilerproc; {$endif}
|
Procedure fpc_CharArray_To_AnsiStr(var a : ansistring; p: pointer; len: longint);[Public,Alias : 'FPC_CHARARRAY_TO_ANSISTR']; {$ifdef hascompilerproc} compilerproc; {$endif}
|
||||||
|
var
|
||||||
|
src: pchar;
|
||||||
|
i: longint;
|
||||||
begin
|
begin
|
||||||
pointer(a) := pointer(fpc_CharArray_To_AnsiStr(arr));
|
src := pchar(p);
|
||||||
|
if src[0]=#0 Then
|
||||||
|
{ result is automatically set to '' }
|
||||||
|
begin
|
||||||
|
pointer(a) := nil;
|
||||||
|
exit;
|
||||||
|
end;
|
||||||
|
i:=IndexChar(src^,len,#0);
|
||||||
|
if i = -1 then
|
||||||
|
i := len;
|
||||||
|
pointer(a) := NewAnsiString(i);
|
||||||
|
Move (src^,a[1],i);
|
||||||
end;
|
end;
|
||||||
|
{$endif not hascompilerproc}
|
||||||
|
|
||||||
|
|
||||||
|
{$ifdef hascompilerproc}
|
||||||
|
|
||||||
|
{ note: inside the compiler, the resulttype is modified to be the length }
|
||||||
|
{ of the actual chararray to which we convert (JM) }
|
||||||
|
function fpc_ansistr_to_chararray(arraysize: longint; const src: ansistring): fpc_big_chararray; [public, alias: 'FPC_ANSISTR_TO_CHARARRAY']; compilerproc;
|
||||||
|
var
|
||||||
|
len: longint;
|
||||||
|
begin
|
||||||
|
len := length(src);
|
||||||
|
if len > arraysize then
|
||||||
|
len := arraysize;
|
||||||
|
{ make sure we don't try to access element 1 of the ansistring if it's nil }
|
||||||
|
if len > 0 then
|
||||||
|
move(src[1],fpc_ansistr_to_chararray[0],len);
|
||||||
|
fillchar(fpc_ansistr_to_chararray[len],arraysize-len,0);
|
||||||
|
end;
|
||||||
|
|
||||||
{$endif hascompilerproc}
|
{$endif hascompilerproc}
|
||||||
|
|
||||||
|
|
||||||
@ -759,7 +794,11 @@ end;
|
|||||||
|
|
||||||
{
|
{
|
||||||
$Log$
|
$Log$
|
||||||
Revision 1.19 2001-08-28 13:24:47 jonas
|
Revision 1.20 2001-08-29 19:49:04 jonas
|
||||||
|
* some fixes in compilerprocs for chararray to string conversions
|
||||||
|
* conversion from string to chararray is now also done via compilerprocs
|
||||||
|
|
||||||
|
Revision 1.19 2001/08/28 13:24:47 jonas
|
||||||
+ compilerproc implementation of most string-related type conversions
|
+ compilerproc implementation of most string-related type conversions
|
||||||
- removed all code from the compiler which has been replaced by
|
- removed all code from the compiler which has been replaced by
|
||||||
compilerproc implementations (using {$ifdef hascompilerproc} is not
|
compilerproc implementations (using {$ifdef hascompilerproc} is not
|
||||||
|
@ -24,6 +24,9 @@
|
|||||||
|
|
||||||
{$ifdef hascompilerproc}
|
{$ifdef hascompilerproc}
|
||||||
|
|
||||||
|
type
|
||||||
|
fpc_big_chararray = array[0..maxlongint] of char;
|
||||||
|
|
||||||
procedure fpc_Shortstr_SetLength(var s:shortstring;len:StrLenInt); compilerproc;
|
procedure fpc_Shortstr_SetLength(var s:shortstring;len:StrLenInt); compilerproc;
|
||||||
function fpc_shortstr_to_shortstr(len:longint; const sstr: shortstring): shortstring; compilerproc;
|
function fpc_shortstr_to_shortstr(len:longint; const sstr: shortstring): shortstring; compilerproc;
|
||||||
procedure fpc_shortstr_concat(const s1,s2:shortstring); compilerproc;
|
procedure fpc_shortstr_concat(const s1,s2:shortstring); compilerproc;
|
||||||
@ -31,7 +34,8 @@ function fpc_shortstr_compare(const dstr,sstr:shortstring) : longint; compilerpr
|
|||||||
function fpc_pchar_to_shortstr(p:pchar):shortstring; compilerproc;
|
function fpc_pchar_to_shortstr(p:pchar):shortstring; compilerproc;
|
||||||
|
|
||||||
function fpc_chararray_to_shortstr(const arr: array of char):shortstring; compilerproc;
|
function fpc_chararray_to_shortstr(const arr: array of char):shortstring; compilerproc;
|
||||||
procedure fpc_str_to_chararray(strtyp, arraysize: longint; src,dest: pchar);compilerproc;
|
function fpc_shortstr_to_chararray(arraysize: longint; const src: ShortString): fpc_big_chararray; compilerproc;
|
||||||
|
|
||||||
|
|
||||||
function fpc_dynarray_length(p : pointer) : tdynarrayindex; compilerproc;
|
function fpc_dynarray_length(p : pointer) : tdynarrayindex; compilerproc;
|
||||||
function fpc_dynarray_high(p : pointer) : tdynarrayindex; compilerproc;
|
function fpc_dynarray_high(p : pointer) : tdynarrayindex; compilerproc;
|
||||||
@ -61,6 +65,7 @@ Function fpc_ShortStr_To_AnsiStr (Const S2 : ShortString): ansistring; compilerp
|
|||||||
Function fpc_Char_To_AnsiStr(const c : Char): AnsiString; compilerproc;
|
Function fpc_Char_To_AnsiStr(const c : Char): AnsiString; compilerproc;
|
||||||
Function fpc_PChar_To_AnsiStr(const p : pchar): ansistring; compilerproc;
|
Function fpc_PChar_To_AnsiStr(const p : pchar): ansistring; compilerproc;
|
||||||
Function fpc_CharArray_To_AnsiStr(const arr: array of char): ansistring; compilerproc;
|
Function fpc_CharArray_To_AnsiStr(const arr: array of char): ansistring; compilerproc;
|
||||||
|
function fpc_ansistr_to_chararray(arraysize: longint; const src: ansistring): fpc_big_chararray; compilerproc;
|
||||||
Function fpc_AnsiStr_Compare(S1,S2 : Pointer): Longint; compilerproc;
|
Function fpc_AnsiStr_Compare(S1,S2 : Pointer): Longint; compilerproc;
|
||||||
Procedure fpc_AnsiStr_CheckZero(p : pointer); compilerproc;
|
Procedure fpc_AnsiStr_CheckZero(p : pointer); compilerproc;
|
||||||
Procedure fpc_AnsiStr_CheckRange(len,index : longint); compilerproc;
|
Procedure fpc_AnsiStr_CheckRange(len,index : longint); compilerproc;
|
||||||
@ -81,6 +86,7 @@ Procedure fpc_WideStr_Concat (S1,S2 : Pointer;var S3 : Pointer); compilerproc;
|
|||||||
Function fpc_Char_To_WideStr(const c : Char): WideString; compilerproc;
|
Function fpc_Char_To_WideStr(const c : Char): WideString; compilerproc;
|
||||||
Function fpc_PChar_To_WideStr(const p : pchar): WideString; compilerproc;
|
Function fpc_PChar_To_WideStr(const p : pchar): WideString; compilerproc;
|
||||||
Function fpc_CharArray_To_WideStr(const arr: array of char): WideString; compilerproc;
|
Function fpc_CharArray_To_WideStr(const arr: array of char): WideString; compilerproc;
|
||||||
|
function fpc_widestr_to_chararray(arraysize: longint; const src: WideString): fpc_big_chararray; compilerproc;
|
||||||
Function fpc_WideStr_Compare(S1,S2 : Pointer): Longint; compilerproc;
|
Function fpc_WideStr_Compare(S1,S2 : Pointer): Longint; compilerproc;
|
||||||
Procedure fpc_WideStr_CheckZero(p : pointer); compilerproc;
|
Procedure fpc_WideStr_CheckZero(p : pointer); compilerproc;
|
||||||
Procedure fpc_WideStr_CheckRange(len,index : longint); compilerproc;
|
Procedure fpc_WideStr_CheckRange(len,index : longint); compilerproc;
|
||||||
@ -231,7 +237,11 @@ Procedure fpc_typed_read(TypeSize : Longint;var f : TypedFile;var Buf); compiler
|
|||||||
|
|
||||||
{
|
{
|
||||||
$Log$
|
$Log$
|
||||||
Revision 1.5 2001-08-28 13:24:47 jonas
|
Revision 1.6 2001-08-29 19:49:04 jonas
|
||||||
|
* some fixes in compilerprocs for chararray to string conversions
|
||||||
|
* conversion from string to chararray is now also done via compilerprocs
|
||||||
|
|
||||||
|
Revision 1.5 2001/08/28 13:24:47 jonas
|
||||||
+ compilerproc implementation of most string-related type conversions
|
+ compilerproc implementation of most string-related type conversions
|
||||||
- removed all code from the compiler which has been replaced by
|
- removed all code from the compiler which has been replaced by
|
||||||
compilerproc implementations (using {$ifdef hascompilerproc} is not
|
compilerproc implementations (using {$ifdef hascompilerproc} is not
|
||||||
|
@ -614,21 +614,50 @@ function strpas(p:pchar):shortstring; [external name 'FPC_PCHAR_TO_SHORTSTR'];
|
|||||||
|
|
||||||
{$ifndef FPC_SYSTEM_HAS_FPC_CHARARRAY_TO_SHORTSTR}
|
{$ifndef FPC_SYSTEM_HAS_FPC_CHARARRAY_TO_SHORTSTR}
|
||||||
|
|
||||||
function fpc_chararray_to_shortstr(p:pchar; l : longint):shortstring;[public,alias:'FPC_CHARARRAY_TO_SHORTSTR']; {$ifdef hascompilerproc} compilerproc; {$endif}
|
{$ifdef hascompilerproc}
|
||||||
|
function fpc_chararray_to_shortstr(p:pchar; l : longint):shortstring;[public,alias:'FPC_CHARARRAY_TO_SHORTSTR'];
|
||||||
var
|
var
|
||||||
s: shortstring;
|
l: longint;
|
||||||
|
{$else hascompilerproc}
|
||||||
|
function fpc_chararray_to_shortstr(const arr: array of char):shortstring;[public,alias:'FPC_CHARARRAY_TO_SHORTSTR']; compilerproc;
|
||||||
|
{$endif hascompilerproc}
|
||||||
begin
|
begin
|
||||||
|
{$ifdef hascompilerproc}
|
||||||
|
l := high(arr)+1;
|
||||||
|
{$endif hascompilerproc}
|
||||||
if l>=256 then
|
if l>=256 then
|
||||||
l:=255
|
l:=255
|
||||||
else if l<0 then
|
else if l<0 then
|
||||||
l:=0;
|
l:=0;
|
||||||
move(p^,s[1],l);
|
move(arr[0],fpc_chararray_to_shortstr[1],l);
|
||||||
s[0]:=chr(l);
|
fpc_chararray_to_shortstr[0]:=chr(l);
|
||||||
strchararray := s;
|
|
||||||
end;
|
end;
|
||||||
|
|
||||||
{$endif ndef FPC_SYSTEM_HAS_FPC_CHARARRAY_TO_SHORTSTR}
|
{$endif ndef FPC_SYSTEM_HAS_FPC_CHARARRAY_TO_SHORTSTR}
|
||||||
|
|
||||||
|
{$ifdef hascompilerproc}
|
||||||
|
|
||||||
|
{$ifndef FPC_SYSTEM_HAS_FPC_SHORTSTR_TO_CHARARRAY}
|
||||||
|
|
||||||
|
{ inside the compiler, the resulttype is modified to that of the actual }
|
||||||
|
{ chararray we're converting to (JM) }
|
||||||
|
function fpc_shortstr_to_chararray(arraysize: longint; const src: ShortString): fpc_big_chararray;[public,alias: 'FPC_SHORTSTR_TO_CHARARRAY']; compilerproc;
|
||||||
|
var
|
||||||
|
len: longint;
|
||||||
|
begin
|
||||||
|
len := length(src);
|
||||||
|
if len > arraysize then
|
||||||
|
len := arraysize;
|
||||||
|
{ make sure we don't access char 1 if length is 0 (JM) }
|
||||||
|
if len > 0 then
|
||||||
|
move(src[1],fpc_shortstr_to_chararray[0],len);
|
||||||
|
fillchar(fpc_shortstr_to_chararray[len],arraysize-len,0);
|
||||||
|
end;
|
||||||
|
|
||||||
|
{$endif FPC_SYSTEM_HAS_FPC_SHORTSTR_TO_CHARARRAY}
|
||||||
|
|
||||||
|
{$else hascompilerproc}
|
||||||
|
|
||||||
{$ifopt r+}
|
{$ifopt r+}
|
||||||
{$define rangeon}
|
{$define rangeon}
|
||||||
{$r-}
|
{$r-}
|
||||||
@ -664,6 +693,7 @@ begin
|
|||||||
move(src^,dest^,len);
|
move(src^,dest^,len);
|
||||||
fillchar(dest[len],arraysize-len,0);
|
fillchar(dest[len],arraysize-len,0);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
{$endif FPC_SYSTEM_HAS_FPC_STR_TO_CHARARRAY}
|
{$endif FPC_SYSTEM_HAS_FPC_STR_TO_CHARARRAY}
|
||||||
|
|
||||||
{$ifdef rangeon}
|
{$ifdef rangeon}
|
||||||
@ -671,6 +701,8 @@ end;
|
|||||||
{undef rangeon}
|
{undef rangeon}
|
||||||
{$endif rangeon}
|
{$endif rangeon}
|
||||||
|
|
||||||
|
{$endif hascompilerproc}
|
||||||
|
|
||||||
{$ifndef FPC_SYSTEM_HAS_STRLEN}
|
{$ifndef FPC_SYSTEM_HAS_STRLEN}
|
||||||
|
|
||||||
function strlen(p:pchar):longint;
|
function strlen(p:pchar):longint;
|
||||||
@ -857,7 +889,11 @@ end;
|
|||||||
|
|
||||||
{
|
{
|
||||||
$Log$
|
$Log$
|
||||||
Revision 1.18 2001-08-28 13:24:47 jonas
|
Revision 1.19 2001-08-29 19:49:04 jonas
|
||||||
|
* some fixes in compilerprocs for chararray to string conversions
|
||||||
|
* conversion from string to chararray is now also done via compilerprocs
|
||||||
|
|
||||||
|
Revision 1.18 2001/08/28 13:24:47 jonas
|
||||||
+ compilerproc implementation of most string-related type conversions
|
+ compilerproc implementation of most string-related type conversions
|
||||||
- removed all code from the compiler which has been replaced by
|
- removed all code from the compiler which has been replaced by
|
||||||
compilerproc implementations (using {$ifdef hascompilerproc} is not
|
compilerproc implementations (using {$ifdef hascompilerproc} is not
|
||||||
|
@ -402,19 +402,47 @@ begin
|
|||||||
{ result is automatically set to '' }
|
{ result is automatically set to '' }
|
||||||
exit;
|
exit;
|
||||||
i:=IndexChar(arr,high(arr)+1,#0);
|
i:=IndexChar(arr,high(arr)+1,#0);
|
||||||
|
if i = -1 then
|
||||||
|
i := high(arr)+1;
|
||||||
SetLength(fpc_CharArray_To_WideStr,i);
|
SetLength(fpc_CharArray_To_WideStr,i);
|
||||||
Ansi2WideMoveProc (pchar(@arr),PWideChar(Pointer(fpc_CharArray_To_WideStr)),i);
|
Ansi2WideMoveProc (pchar(@arr),PWideChar(Pointer(fpc_CharArray_To_WideStr)),i);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
{ old style helper }
|
{ old style helper }
|
||||||
{$ifndef hascompilerproc}
|
{$ifndef hascompilerproc}
|
||||||
{ the declaration below is the same as }
|
Procedure fpc_CharArray_To_WideStr(var a : WideString; p: pointer; len: longint); [Public,Alias : 'FPC_CHARARRAY_TO_WIDESTR']; {$ifdef hascompilerproc} compilerproc; {$endif}
|
||||||
{ Procedure fpc_CharArray_To_WideStr(var a : WideString; p: pointer; len: longint); }
|
var
|
||||||
{ which is what the old helper was (we need the parameter as "array of char" type }
|
src: pchar;
|
||||||
{ so we can pass it to the new style helper (JM) }
|
i: longint;
|
||||||
Procedure fpc_CharArray_To_WideStr(var a : WideString; const arr: array of char);[Public,Alias : 'FPC_CHARARRAY_TO_WIDESTR']; {$ifdef hascompilerproc} compilerproc; {$endif}
|
|
||||||
begin
|
begin
|
||||||
pointer(a) := pointer(fpc_CharArray_To_WideStr(arr));
|
src := pchar(p);
|
||||||
|
if src[0]=#0 Then
|
||||||
|
begin
|
||||||
|
pointer(a) := nil;
|
||||||
|
exit;
|
||||||
|
end;
|
||||||
|
i:=IndexChar(src^,len,#0);
|
||||||
|
if i = -1 then
|
||||||
|
i := len;
|
||||||
|
pointer(a) := NewWideString(i);
|
||||||
|
Ansi2WideMoveProc (src,PWideChar(Pointer(@a[1])),i);
|
||||||
|
end;
|
||||||
|
{$endif not hascompilerproc}
|
||||||
|
|
||||||
|
{$ifdef hascompilerproc}
|
||||||
|
{ inside the compiler, the resulttype is modified to that of the actual }
|
||||||
|
{ chararray we're converting to (JM) }
|
||||||
|
function fpc_widestr_to_chararray(arraysize: longint; const src: WideString): fpc_big_chararray;[public,alias: 'FPC_WIDESTR_TO_CHARARRAY']; compilerproc;
|
||||||
|
var
|
||||||
|
len: longint;
|
||||||
|
begin
|
||||||
|
len := length(src);
|
||||||
|
if len > arraysize then
|
||||||
|
len := arraysize;
|
||||||
|
{ make sure we don't dereference src if it can be nil (JM) }
|
||||||
|
if len > 0 then
|
||||||
|
wide2ansimoveproc(pwidechar(@src[1]),pchar(@fpc_widestr_to_chararray[0]),len);
|
||||||
|
fillchar(fpc_widestr_to_chararray[len],arraysize-len,0);
|
||||||
end;
|
end;
|
||||||
{$endif hascompilerproc}
|
{$endif hascompilerproc}
|
||||||
|
|
||||||
@ -812,7 +840,11 @@ end;
|
|||||||
|
|
||||||
{
|
{
|
||||||
$Log$
|
$Log$
|
||||||
Revision 1.13 2001-08-28 13:24:47 jonas
|
Revision 1.14 2001-08-29 19:49:04 jonas
|
||||||
|
* some fixes in compilerprocs for chararray to string conversions
|
||||||
|
* conversion from string to chararray is now also done via compilerprocs
|
||||||
|
|
||||||
|
Revision 1.13 2001/08/28 13:24:47 jonas
|
||||||
+ compilerproc implementation of most string-related type conversions
|
+ compilerproc implementation of most string-related type conversions
|
||||||
- removed all code from the compiler which has been replaced by
|
- removed all code from the compiler which has been replaced by
|
||||||
compilerproc implementations (using {$ifdef hascompilerproc} is not
|
compilerproc implementations (using {$ifdef hascompilerproc} is not
|
||||||
|
Loading…
Reference in New Issue
Block a user