mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-09-13 05:29:08 +02:00
* NeedTarget, SkipTarget, SkipCPU added
* Retrieve compiler info in a single call for 1.1 compiler
This commit is contained in:
parent
f810873205
commit
0fc75d2dd6
@ -38,6 +38,7 @@ Type
|
|||||||
stSkippingKnownBug,
|
stSkippingKnownBug,
|
||||||
stSkippingCompilerVersionTooLow,
|
stSkippingCompilerVersionTooLow,
|
||||||
stSkippingOtherCpu,
|
stSkippingOtherCpu,
|
||||||
|
stSkippingOtherTarget,
|
||||||
stskippingRunUnit,
|
stskippingRunUnit,
|
||||||
stskippingRunTest
|
stskippingRunTest
|
||||||
);
|
);
|
||||||
@ -60,6 +61,7 @@ Const
|
|||||||
False, // stSkippingKnownBug,
|
False, // stSkippingKnownBug,
|
||||||
False, // stSkippingCompilerVersionTooLow,
|
False, // stSkippingCompilerVersionTooLow,
|
||||||
False, // stSkippingOtherCpu,
|
False, // stSkippingOtherCpu,
|
||||||
|
False, // stSkippingOtherTarget,
|
||||||
False, // stskippingRunUnit,
|
False, // stskippingRunUnit,
|
||||||
False // stskippingRunTest
|
False // stskippingRunTest
|
||||||
);
|
);
|
||||||
@ -77,6 +79,7 @@ Const
|
|||||||
True, // stSkippingKnownBug,
|
True, // stSkippingKnownBug,
|
||||||
True, // stSkippingCompilerVersionTooLow,
|
True, // stSkippingCompilerVersionTooLow,
|
||||||
True, // stSkippingOtherCpu,
|
True, // stSkippingOtherCpu,
|
||||||
|
True, // stSkippingOtherTarget,
|
||||||
True, // stskippingRunUnit,
|
True, // stskippingRunUnit,
|
||||||
True // stskippingRunTest
|
True // stskippingRunTest
|
||||||
);
|
);
|
||||||
@ -94,6 +97,7 @@ Const
|
|||||||
False, // stSkippingKnownBug,
|
False, // stSkippingKnownBug,
|
||||||
False, // stSkippingCompilerVersionTooLow,
|
False, // stSkippingCompilerVersionTooLow,
|
||||||
False, // stSkippingOtherCpu,
|
False, // stSkippingOtherCpu,
|
||||||
|
False, // stSkippingOtherTarget,
|
||||||
False, // stskippingRunUnit,
|
False, // stskippingRunUnit,
|
||||||
False // stskippingRunTest
|
False // stskippingRunTest
|
||||||
);
|
);
|
||||||
@ -111,6 +115,7 @@ Const
|
|||||||
skipping_known_bug ,
|
skipping_known_bug ,
|
||||||
skipping_compiler_version_too_low ,
|
skipping_compiler_version_too_low ,
|
||||||
skipping_other_cpu ,
|
skipping_other_cpu ,
|
||||||
|
skipping_other_target ,
|
||||||
skipping_run_unit ,
|
skipping_run_unit ,
|
||||||
skipping_run_test
|
skipping_run_test
|
||||||
);
|
);
|
||||||
@ -411,7 +416,11 @@ end.
|
|||||||
|
|
||||||
{
|
{
|
||||||
$Log$
|
$Log$
|
||||||
Revision 1.3 2002-12-21 15:39:11 michael
|
Revision 1.4 2002-12-24 21:47:49 peter
|
||||||
|
* NeedTarget, SkipTarget, SkipCPU added
|
||||||
|
* Retrieve compiler info in a single call for 1.1 compiler
|
||||||
|
|
||||||
|
Revision 1.3 2002/12/21 15:39:11 michael
|
||||||
* Some verbosity changes
|
* Some verbosity changes
|
||||||
|
|
||||||
Revision 1.2 2002/12/21 15:31:16 michael
|
Revision 1.2 2002/12/21 15:31:16 michael
|
||||||
|
@ -34,6 +34,7 @@ const
|
|||||||
skipping_known_bug_count : longint = 0;
|
skipping_known_bug_count : longint = 0;
|
||||||
skipping_compiler_version_too_low_count : longint = 0;
|
skipping_compiler_version_too_low_count : longint = 0;
|
||||||
skipping_other_cpu_count : longint = 0;
|
skipping_other_cpu_count : longint = 0;
|
||||||
|
skipping_other_target_count : longint = 0;
|
||||||
skipping_run_unit_count : longint = 0;
|
skipping_run_unit_count : longint = 0;
|
||||||
skipping_run_test_count : longint = 0;
|
skipping_run_test_count : longint = 0;
|
||||||
unknown_lines : longint = 0;
|
unknown_lines : longint = 0;
|
||||||
@ -111,6 +112,10 @@ begin
|
|||||||
begin
|
begin
|
||||||
inc(skipping_other_cpu_count);
|
inc(skipping_other_cpu_count);
|
||||||
end
|
end
|
||||||
|
else if pos(skipping_other_target,st)=1 then
|
||||||
|
begin
|
||||||
|
inc(skipping_other_target_count);
|
||||||
|
end
|
||||||
else if pos(skipping_run_unit,st)=1 then
|
else if pos(skipping_run_unit,st)=1 then
|
||||||
begin
|
begin
|
||||||
inc(skipping_run_unit_count);
|
inc(skipping_run_unit_count);
|
||||||
@ -180,7 +185,8 @@ begin
|
|||||||
+skipping_interactive_test_count
|
+skipping_interactive_test_count
|
||||||
+skipping_known_bug_count
|
+skipping_known_bug_count
|
||||||
+skipping_compiler_version_too_low_count
|
+skipping_compiler_version_too_low_count
|
||||||
+skipping_other_cpu_count;
|
+skipping_other_cpu_count
|
||||||
|
+skipping_other_target_count;
|
||||||
{ don't count these ones ...
|
{ don't count these ones ...
|
||||||
skipping_run_unit_count
|
skipping_run_unit_count
|
||||||
skipping_run_test_count }
|
skipping_run_test_count }
|
||||||
@ -190,6 +196,7 @@ begin
|
|||||||
Writeln('Number of skipped known bug tests = ',skipping_known_bug_count);
|
Writeln('Number of skipped known bug tests = ',skipping_known_bug_count);
|
||||||
Writeln('Number of skipped compiler version too low tests = ',skipping_compiler_version_too_low_count);
|
Writeln('Number of skipped compiler version too low tests = ',skipping_compiler_version_too_low_count);
|
||||||
Writeln('Number of skipped tests for other cpus = ',skipping_other_cpu_count);
|
Writeln('Number of skipped tests for other cpus = ',skipping_other_cpu_count);
|
||||||
|
Writeln('Number of skipped tests for other targets = ',skipping_other_target_count);
|
||||||
if unknown_lines>0 then
|
if unknown_lines>0 then
|
||||||
Writeln('Number of unrecognized lines = ',unknown_lines);
|
Writeln('Number of unrecognized lines = ',unknown_lines);
|
||||||
|
|
||||||
@ -228,7 +235,11 @@ end.
|
|||||||
|
|
||||||
{
|
{
|
||||||
$Log$
|
$Log$
|
||||||
Revision 1.2 2002-11-18 16:42:43 pierre
|
Revision 1.3 2002-12-24 21:47:49 peter
|
||||||
|
* NeedTarget, SkipTarget, SkipCPU added
|
||||||
|
* Retrieve compiler info in a single call for 1.1 compiler
|
||||||
|
|
||||||
|
Revision 1.2 2002/11/18 16:42:43 pierre
|
||||||
+ KNOWNRUNERROR added
|
+ KNOWNRUNERROR added
|
||||||
|
|
||||||
Revision 1.1 2002/11/13 15:26:24 pierre
|
Revision 1.1 2002/11/13 15:26:24 pierre
|
||||||
|
@ -22,6 +22,9 @@ uses
|
|||||||
testu,
|
testu,
|
||||||
redir;
|
redir;
|
||||||
|
|
||||||
|
type
|
||||||
|
tcompinfo = (compver,comptarget,compcpu);
|
||||||
|
|
||||||
const
|
const
|
||||||
{$ifdef UNIX}
|
{$ifdef UNIX}
|
||||||
ExeExt='';
|
ExeExt='';
|
||||||
@ -29,11 +32,11 @@ const
|
|||||||
ExeExt='exe';
|
ExeExt='exe';
|
||||||
{$endif UNIX}
|
{$endif UNIX}
|
||||||
|
|
||||||
|
|
||||||
var
|
var
|
||||||
Config : TConfig;
|
Config : TConfig;
|
||||||
CompilerBin : string;
|
CompilerBin : string;
|
||||||
CompilerCPU : string;
|
CompilerCPU : string;
|
||||||
|
CompilerTarget : string;
|
||||||
CompilerVersion : string;
|
CompilerVersion : string;
|
||||||
PPFile : string;
|
PPFile : string;
|
||||||
PPFileInfo : string;
|
PPFileInfo : string;
|
||||||
@ -71,6 +74,7 @@ begin
|
|||||||
ToStr:=s;
|
ToStr:=s;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
||||||
function ToStrZero(l:longint;nbzero : byte):string;
|
function ToStrZero(l:longint;nbzero : byte):string;
|
||||||
var
|
var
|
||||||
s : string;
|
s : string;
|
||||||
@ -82,6 +86,44 @@ begin
|
|||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
function trimspace(const s:string):string;
|
||||||
|
var
|
||||||
|
i,j : longint;
|
||||||
|
begin
|
||||||
|
i:=length(s);
|
||||||
|
while (i>0) and (s[i] in [#9,' ']) do
|
||||||
|
dec(i);
|
||||||
|
j:=1;
|
||||||
|
while (j<i) and (s[j] in [#9,' ']) do
|
||||||
|
inc(j);
|
||||||
|
trimspace:=Copy(s,j,i-j+1);
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
function IsInList(const entry,list:string):boolean;
|
||||||
|
var
|
||||||
|
i,istart : longint;
|
||||||
|
begin
|
||||||
|
IsInList:=false;
|
||||||
|
i:=0;
|
||||||
|
while (i<length(list)) do
|
||||||
|
begin
|
||||||
|
{ Find list item }
|
||||||
|
istart:=i+1;
|
||||||
|
while (i<length(list)) and
|
||||||
|
(list[i+1]<>',') do
|
||||||
|
inc(i);
|
||||||
|
if Upcase(entry)=Upcase(TrimSpace(Copy(list,istart,i-istart+1))) then
|
||||||
|
begin
|
||||||
|
IsInList:=true;
|
||||||
|
exit;
|
||||||
|
end;
|
||||||
|
{ skip , }
|
||||||
|
inc(i);
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
procedure SetPPFileInfo;
|
procedure SetPPFileInfo;
|
||||||
Var
|
Var
|
||||||
info : searchrec;
|
info : searchrec;
|
||||||
@ -100,9 +142,6 @@ begin
|
|||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
function SplitPath(const s:string):string;
|
function SplitPath(const s:string):string;
|
||||||
var
|
var
|
||||||
i : longint;
|
i : longint;
|
||||||
@ -267,9 +306,18 @@ begin
|
|||||||
delete(s,1,1);
|
delete(s,1,1);
|
||||||
if GetEntry('OPT') then
|
if GetEntry('OPT') then
|
||||||
r.NeedOptions:=res
|
r.NeedOptions:=res
|
||||||
|
else
|
||||||
|
if GetEntry('TARGET') then
|
||||||
|
r.NeedTarget:=res
|
||||||
|
else
|
||||||
|
if GetEntry('SKIPTARGET') then
|
||||||
|
r.SkipTarget:=res
|
||||||
else
|
else
|
||||||
if GetEntry('CPU') then
|
if GetEntry('CPU') then
|
||||||
r.NeedCPU:=res
|
r.NeedCPU:=res
|
||||||
|
else
|
||||||
|
if GetEntry('SKIPCPU') then
|
||||||
|
r.SkipCPU:=res
|
||||||
else
|
else
|
||||||
if GetEntry('VERSION') then
|
if GetEntry('VERSION') then
|
||||||
r.NeedVersion:=res
|
r.NeedVersion:=res
|
||||||
@ -334,49 +382,97 @@ begin
|
|||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
||||||
function GetCompilerVersion:boolean;
|
function GetCompilerInfo(c:tcompinfo):boolean;
|
||||||
|
|
||||||
|
function GetToken(var s:string):string;
|
||||||
|
var
|
||||||
|
i : longint;
|
||||||
|
begin
|
||||||
|
i:=pos(' ',s);
|
||||||
|
if i=0 then
|
||||||
|
i:=length(s)+1;
|
||||||
|
GetToken:=Copy(s,1,i-1);
|
||||||
|
Delete(s,1,i);
|
||||||
|
end;
|
||||||
|
|
||||||
var
|
var
|
||||||
t : text;
|
t : text;
|
||||||
|
hs : string;
|
||||||
begin
|
begin
|
||||||
GetCompilerVersion:=false;
|
GetCompilerInfo:=false;
|
||||||
ExecuteRedir(CompilerBin,'-iV','','out','');
|
{ Try to get all information in one call, this is
|
||||||
|
supported in 1.1. Older compilers 1.0.x will only
|
||||||
|
return the first info }
|
||||||
|
case c of
|
||||||
|
compver :
|
||||||
|
hs:='-iVTPTO';
|
||||||
|
compcpu :
|
||||||
|
hs:='-iTPTOV';
|
||||||
|
comptarget :
|
||||||
|
hs:='-iTOTPV';
|
||||||
|
end;
|
||||||
|
ExecuteRedir(CompilerBin,hs,'','out','');
|
||||||
assign(t,'out');
|
assign(t,'out');
|
||||||
{$I-}
|
{$I-}
|
||||||
reset(t);
|
reset(t);
|
||||||
readln(t,CompilerVersion);
|
readln(t,hs);
|
||||||
close(t);
|
close(t);
|
||||||
erase(t);
|
erase(t);
|
||||||
{$I+}
|
{$I+}
|
||||||
if ioresult<>0 then
|
if ioresult<>0 then
|
||||||
Verbose(V_Error,'Can''t get Compiler Version')
|
Verbose(V_Error,'Can''t get Compiler Info')
|
||||||
else
|
else
|
||||||
begin
|
begin
|
||||||
Verbose(V_Debug,'Current Compiler Version: '+CompilerVersion);
|
Verbose(V_Debug,'Current Compiler Info: "'+hs+'"');
|
||||||
GetCompilerVersion:=true;
|
case c of
|
||||||
|
compver :
|
||||||
|
begin
|
||||||
|
CompilerVersion:=GetToken(hs);
|
||||||
|
CompilerCPU:=GetToken(hs);
|
||||||
|
CompilerTarget:=GetToken(hs);
|
||||||
|
end;
|
||||||
|
compcpu :
|
||||||
|
begin
|
||||||
|
CompilerCPU:=GetToken(hs);
|
||||||
|
CompilerTarget:=GetToken(hs);
|
||||||
|
CompilerVersion:=GetToken(hs);
|
||||||
|
end;
|
||||||
|
comptarget :
|
||||||
|
begin
|
||||||
|
CompilerTarget:=GetToken(hs);
|
||||||
|
CompilerCPU:=GetToken(hs);
|
||||||
|
CompilerVersion:=GetToken(hs);
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
GetCompilerInfo:=true;
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
||||||
function GetCompilerCPU:boolean;
|
function GetCompilerVersion:boolean;
|
||||||
var
|
|
||||||
t : text;
|
|
||||||
begin
|
begin
|
||||||
GetCompilerCPU:=false;
|
if CompilerVersion='' then
|
||||||
ExecuteRedir(CompilerBin,'-iTP','','out','');
|
GetCompilerVersion:=GetCompilerInfo(compver)
|
||||||
assign(t,'out');
|
|
||||||
{$I-}
|
|
||||||
reset(t);
|
|
||||||
readln(t,CompilerCPU);
|
|
||||||
close(t);
|
|
||||||
erase(t);
|
|
||||||
{$I+}
|
|
||||||
if ioresult<>0 then
|
|
||||||
Verbose(V_Error,'Can''t get Compiler CPU Target')
|
|
||||||
else
|
else
|
||||||
begin
|
GetCompilerVersion:=true;
|
||||||
Verbose(V_Debug,'Current Compiler CPU Target: '+CompilerCPU);
|
end;
|
||||||
GetCompilerCPU:=true;
|
|
||||||
end;
|
|
||||||
|
function GetCompilerCPU:boolean;
|
||||||
|
begin
|
||||||
|
if CompilerCPU='' then
|
||||||
|
GetCompilerCPU:=GetCompilerInfo(compcpu)
|
||||||
|
else
|
||||||
|
GetCompilerCPU:=true;
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
function GetCompilerTarget:boolean;
|
||||||
|
begin
|
||||||
|
if CompilerTarget='' then
|
||||||
|
GetCompilerTarget:=GetCompilerInfo(comptarget)
|
||||||
|
else
|
||||||
|
GetCompilerTarget:=true;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
||||||
@ -693,7 +789,7 @@ begin
|
|||||||
begin
|
begin
|
||||||
Verbose(V_Debug,'Required compiler cpu: '+Config.NeedCPU);
|
Verbose(V_Debug,'Required compiler cpu: '+Config.NeedCPU);
|
||||||
Res:=GetCompilerCPU;
|
Res:=GetCompilerCPU;
|
||||||
if Upper(Config.NeedCPU)<>Upper(CompilerCPU) then
|
if not IsInList(CompilerCPU,Config.NeedCPU) then
|
||||||
begin
|
begin
|
||||||
{ avoid a second attempt by writing to elg file }
|
{ avoid a second attempt by writing to elg file }
|
||||||
AddLog(OutName,skipping_other_cpu+PPFileInfo);
|
AddLog(OutName,skipping_other_cpu+PPFileInfo);
|
||||||
@ -704,6 +800,57 @@ begin
|
|||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
if Res then
|
||||||
|
begin
|
||||||
|
if Config.SkipCPU<>'' then
|
||||||
|
begin
|
||||||
|
Verbose(V_Debug,'Skip compiler cpu: '+Config.NeedCPU);
|
||||||
|
Res:=GetCompilerCPU;
|
||||||
|
if IsInList(CompilerCPU,Config.SkipCPU) then
|
||||||
|
begin
|
||||||
|
{ avoid a second attempt by writing to elg file }
|
||||||
|
AddLog(OutName,skipping_other_cpu+PPFileInfo);
|
||||||
|
AddLog(ResLogFile,skipping_other_cpu+PPFileInfo);
|
||||||
|
Verbose(V_Abort,'Compiler cpu in skipcpu '+CompilerCPU+' = '+Config.SkipCPU);
|
||||||
|
Res:=false;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
if Res then
|
||||||
|
begin
|
||||||
|
if Config.NeedTarget<>'' then
|
||||||
|
begin
|
||||||
|
Verbose(V_Debug,'Required compiler target: '+Config.NeedTarget);
|
||||||
|
Res:=GetCompilerTarget;
|
||||||
|
if not IsInList(CompilerTarget,Config.NeedTarget) then
|
||||||
|
begin
|
||||||
|
{ avoid a second attempt by writing to elg file }
|
||||||
|
AddLog(OutName,skipping_other_target+PPFileInfo);
|
||||||
|
AddLog(ResLogFile,skipping_other_target+PPFileInfo);
|
||||||
|
Verbose(V_Abort,'Compiler target wrong '+CompilerTarget+' <> '+Config.NeedTarget);
|
||||||
|
Res:=false;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
if Res then
|
||||||
|
begin
|
||||||
|
if Config.SkipTarget<>'' then
|
||||||
|
begin
|
||||||
|
Verbose(V_Debug,'Skip compiler target: '+Config.NeedTarget);
|
||||||
|
Res:=GetCompilerTarget;
|
||||||
|
if IsInList(CompilerTarget,Config.SkipTarget) then
|
||||||
|
begin
|
||||||
|
{ avoid a second attempt by writing to elg file }
|
||||||
|
AddLog(OutName,skipping_other_target+PPFileInfo);
|
||||||
|
AddLog(ResLogFile,skipping_other_target+PPFileInfo);
|
||||||
|
Verbose(V_Abort,'Compiler target in skiptarget '+CompilerTarget+' = '+Config.SkipTarget);
|
||||||
|
Res:=false;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
if Res then
|
if Res then
|
||||||
begin
|
begin
|
||||||
Res:=RunCompiler;
|
Res:=RunCompiler;
|
||||||
@ -746,7 +893,11 @@ begin
|
|||||||
end.
|
end.
|
||||||
{
|
{
|
||||||
$Log$
|
$Log$
|
||||||
Revision 1.23 2002-12-17 15:04:32 michael
|
Revision 1.24 2002-12-24 21:47:49 peter
|
||||||
|
* NeedTarget, SkipTarget, SkipCPU added
|
||||||
|
* Retrieve compiler info in a single call for 1.1 compiler
|
||||||
|
|
||||||
|
Revision 1.23 2002/12/17 15:04:32 michael
|
||||||
+ Added dbdigest to store results in a database
|
+ Added dbdigest to store results in a database
|
||||||
|
|
||||||
Revision 1.22 2002/12/15 13:30:46 peter
|
Revision 1.22 2002/12/15 13:30:46 peter
|
||||||
|
@ -32,6 +32,7 @@ const
|
|||||||
skipping_known_bug = 'Skipping test because it is a known bug ';
|
skipping_known_bug = 'Skipping test because it is a known bug ';
|
||||||
skipping_compiler_version_too_low = 'Skipping test because compiler version too low ';
|
skipping_compiler_version_too_low = 'Skipping test because compiler version too low ';
|
||||||
skipping_other_cpu = 'Skipping test because for other cpu ';
|
skipping_other_cpu = 'Skipping test because for other cpu ';
|
||||||
|
skipping_other_target = 'Skipping test because for other target ';
|
||||||
skipping_run_unit = 'Skipping test run because it is a unit ';
|
skipping_run_unit = 'Skipping test run because it is a unit ';
|
||||||
skipping_run_test = 'Skipping run test ';
|
skipping_run_test = 'Skipping run test ';
|
||||||
known_problem = ' known problem: ';
|
known_problem = ' known problem: ';
|
||||||
@ -45,7 +46,11 @@ end.
|
|||||||
|
|
||||||
{
|
{
|
||||||
$Log$
|
$Log$
|
||||||
Revision 1.3 2002-11-18 16:42:43 pierre
|
Revision 1.4 2002-12-24 21:47:49 peter
|
||||||
|
* NeedTarget, SkipTarget, SkipCPU added
|
||||||
|
* Retrieve compiler info in a single call for 1.1 compiler
|
||||||
|
|
||||||
|
Revision 1.3 2002/11/18 16:42:43 pierre
|
||||||
+ KNOWNRUNERROR added
|
+ KNOWNRUNERROR added
|
||||||
|
|
||||||
Revision 1.2 2002/11/13 15:26:24 pierre
|
Revision 1.2 2002/11/13 15:26:24 pierre
|
||||||
|
@ -15,6 +15,9 @@ type
|
|||||||
TConfig = record
|
TConfig = record
|
||||||
NeedOptions,
|
NeedOptions,
|
||||||
NeedCPU,
|
NeedCPU,
|
||||||
|
SkipCPU,
|
||||||
|
NeedTarget,
|
||||||
|
SkipTarget,
|
||||||
NeedVersion,
|
NeedVersion,
|
||||||
KnownRunNote : string;
|
KnownRunNote : string;
|
||||||
ResultCode : longint;
|
ResultCode : longint;
|
||||||
|
Loading…
Reference in New Issue
Block a user