Would be nice to know which one is the fastest

I got 2 functions, text parser with free separation character or string, and another function you can use to put any contained values to variables too:

[pascal]function ReadStrings(const s,separator: string; var strings: array of string): integer;
var i,p,l,c2: integer; c,cs,cur: string;
begin
c2:=high(strings);
if c2<1 then begin
result:=0; exit;
end;
if c2>10 then c2:=10;
for i:=0 to c2 do strings[i]:='';
p:=0; l:=length(separator); i:=1; cur:='';
while i<=length(s) do begin
c:=copy(s,i,1); cs:=copy(s,i,l);
if cs=separator then begin
if cur<>'' then begin
strings[p]:=cur; cur:='';
inc(p);
if p>high(strings) then break;
strings[p]:='';
end;
i:=i+l-1;
end else cur:=cur+c;
inc(i);
end;
if cur<>'' then begin
strings[p]:=cur; inc(p);
end;
result:=p;
end;[/pascal]

[pascal]type
TCustomRead = (crString,crInt,crSingle,crDouble,crByte,crWord,
crShortInt,crSmallInt,crCardinal,crBool,crInt64);

function ReadCustom(const s,separator: string; const arr: array of pointer;
const arrt: array of TCustomRead): integer;
var p,arrtl: integer; cur: string; defaultStr: boolean;
procedure SetValue;
begin
if arr[p]=nil then exit;
if defaultStr then string(arr[p]^):=cur
else case arrt[p mod arrtl] of
crString: string(arr[p]^):=cur;
crInt: integer(arr[p]^):=strtointdef(cur,0);
crSingle: single(arr[p]^):=strtofloat(cur);
crDouble: double(arr[p]^):=strtofloat(cur);
crByte: byte(arr[p]^):=strtointdef(cur,0);
crWord: word(arr[p]^):=strtointdef(cur,0);
crShortInt: shortint(arr[p]^):=strtointdef(cur,0);
crSmallInt: smallint(arr[p]^):=strtointdef(cur,0);
crCardinal: cardinal(arr[p]^):=strtointdef(cur,0);
crBool: boolean(arr[p]^):=(cur<>'0') and (lowercase(cur)<>'false');
crInt64: int64(arr[p]^):=strtoint(cur);
end;
end;
var ha,i,l: integer; c,cs: string;
begin
ha:=high(arr);
if ha<1 then begin
result:=0; exit;
end;
defaultStr:=high(arrt)<1; arrtl:=length(arrt);
p:=0; l:=length(separator); i:=1; cur:='';
while i<=length(s) do begin
c:=copy(s,i,1); cs:=copy(s,i,l);
if cs=separator then begin
if cur<>'' then begin
SetValue; cur:=''; inc(p);
if p>ha then break;
end;
inc(i,l-1);
end else cur:=cur+c;
inc(i);
end;
if cur<>'' then begin
SetValue; inc(p);
end;
result:=p;
end;[/pascal]

Edit: There's no button for pascal tags...