PROGRAM runforp;
{$mode objfpc}{$H+}
USES
{$IFDEF UNIX}
cthreads,
{$ENDIF}
Classes, SysUtils, CustApp, Forms, extctrls, Interfaces
{ you can add units after this };
TYPE
{ TRunFor }
TRunFor = CLASS(TCustomApplication)
protected
RunTime : INTEGER;
ReportTime : INTEGER;
OutputFileName : STRING;
Ticks : LongInt;
Timer : TTimer;
Periods : INTEGER;
PROCEDURE DoRun; override;
FUNCTION GetTimeSeconds(FromString : STRING) : INTEGER;
FUNCTION GetTimeText(When : TDateTime) : STRING;
PROCEDURE TimerTick(Sender : TObject);
PROCEDURE StartTimer;
public
CONSTRUCTOR Create(TheOwner: TComponent); override;
DESTRUCTOR Destroy; override;
PROCEDURE WriteHelp; virtual;
END;
CONST
OptSHelp = 'h'; // Give some help
OptSRuntime = 'r'; // Time to run.
OptSReportTime = 'R'; // How often to report
OptSOutName = 'p'; // Output filename
OptLHelp = 'help'; // Give some help
OptLRuntime = 'runtime'; // Time to run.
OptLReportTime = 'reporttime'; // How often to report
OptLOutName = 'output'; // Output filename
ShortOpts : STRING = OptSHelp + '::' +
OptSRuntime + ':' +
OptSReportTime + ':' +
OptSOutName + ':';
LongOptsArray : ARRAY[1..4] OF STRING = (
OptLHelp + '::',
OptLRuntime + ':' ,
OptLReportTime + ':' ,
OptLOutName + ':');
DefaultRuntime = 60;
DefaultReportTime = 10;
BuffSize = 32;
DefaultOutFile = '/dev/null';
//TIMEBUFFSIZE = 80;
{ TRunFor }
PROCEDURE WriteFmt(FormatStr : STRING;
Params : ARRAY OF CONST);
BEGIN;
Write(Format(FormatStr,Params));
END;
PROCEDURE WriteLnFmt(FormatStr : STRING;
Params : ARRAY OF CONST);
BEGIN;
WriteLn(Format(FormatStr,Params));
END;
PROCEDURE TRunFor.StartTimer;
BEGIN;
Ticks:=0;
Periods:=0;
Timer.Enabled:=TRUE;
END;
PROCEDURE TRunFor.TimerTick(Sender : TObject);
BEGIN;
Ticks:=Ticks+1;
Writeln('Tick!');
END;
FUNCTION TRunFor.GetTimeText(When : TDateTime) : STRING;
BEGIN;
Result:=FormatDateTime('ddd d mmmm yyyy hh:nn:ss',When);
END;
FUNCTION TRunFor.GetTimeSeconds(FromString : STRING) : INTEGER;
VAR Scan : INTEGER;
Buff : STRING;
Total : INTEGER = 0;
BuffCh : CHAR;
BEGIN;
Buff:='';
FOR Scan:=1 TO Length(FromString) DO
BEGIN;
BuffCh:=UpCase(FromString[Scan]);
CASE BuffCh OF
'D' : Total:=Total+(StrToIntDef(Buff,0) * (3600*24));
'H' : Total:=Total+(StrToIntDef(Buff,0) * 3600);
'M' : Total:=Total+(StrToIntDef(Buff,0) * 60);
'S' : Total:=Total+StrToIntDef(Buff,0);
'0'..'9' : Buff:=Buff+BuffCh;
ELSE
WriteLn('Error, invalid character in input ',BuffCh,' exiting!');
END;
IF (BuffCh IN ['D','H','M','S']) THEN
Buff:='';
END;
Result:=0;
END;
PROCEDURE TRunFor.DoRun;
VAR
ErrorMsg: String;
BEGIN
// quick check parameters
ErrorMsg:=CheckOptions(ShortOpts, LongOptsArray);
IF HasOption(OptSRuntime,OptLRuntime) THEN
RunTime:=GetTimeSeconds(GetOptionValue(OptSRuntime,OptLRuntime));
IF HasOption(OptSReportTime,OptLReportTime) THEN
ReportTime:=GetTimeSeconds(GetOptionValue(OptSReportTime,OptLReportTime));
IF HasOption(OptSOutName,OptLOutName) THEN
OutputFileName:=GetOptionValue(OptSOutName,OptLOutName);
IF ErrorMsg<>'' THEN BEGIN
ShowException(Exception.Create(ErrorMsg));
Terminate;
Exit;
END;
WriteLnFmt('Start time : %s',[GetTimeText(Now)]);
WriteLnFmt('Requested runtime : %d seconds, Report interval %d seconds',[RunTime,ReportTime]);
WriteLnFmt('Output filename : %s',[OutputFileName]);
StartTimer;
WHILE (Ticks < RunTime) DO
BEGIN;
IF ((Ticks MOD ReportTime) = 0) THEN
BEGIN;
Periods:=Periods+1;
WriteLnFmt('%d periods of %d seconds elapsed : %d seconds',[Periods,ReportTime,Ticks]);
END;
Sleep(1000);
END;
WriteLnFmt('Complete, %d seconds elapsed',[Ticks]);
WriteLnFmt('End time : %s',[GetTimeText(Now)]);
// stop program loop
Terminate;
END;
CONSTRUCTOR TRunFor.Create(TheOwner: TComponent);
BEGIN
INHERITED Create(TheOwner);
StopOnException:=True;
RunTime:=DefaultRuntime;
ReportTime:=DefaultReportTime;
OutputFileName:=DefaultOutFile;
Timer:=TTimer.Create(NIL);
Timer.Enabled:=FALSE;
Timer.Interval:=1000;
Timer.OnTimer:=@TimerTick;
END;
DESTRUCTOR TRunFor.Destroy;
BEGIN
Timer.Free;
INHERITED Destroy;
END;
PROCEDURE TRunFor.WriteHelp;
BEGIN
{ add your help code here }
writeln('Usage: ', ExeName, ' <opts>');
WriteLn('Where options are : ');
WriteLn(' -h, --help : Display help');
WriteLn(' -r, --runtime= : Specify runtime');
WriteLn(' -R, --reporttime= : Specify time between reports');
WriteLn(' -p, --output= : Specify output file');
WriteLn;
WriteLn('Times are specified by giving one or 2 digits and then a unit specifier');
WriteLn(' d=days, h=hours, m=minutes, s=seconds. Multiple specifiers are valid');
WriteLn('e.g. 5h30m for 5 hours and 30 minutes');
END;
VAR
Application: TRunFor;
BEGIN
Application:=TRunFor.Create(NIL);
Application.Title:='RunFor';
Application.Run;
Application.Free;
END.