summaryrefslogtreecommitdiff
path: root/analyzer.lpr
diff options
context:
space:
mode:
Diffstat (limited to 'analyzer.lpr')
-rw-r--r--analyzer.lpr252
1 files changed, 191 insertions, 61 deletions
diff --git a/analyzer.lpr b/analyzer.lpr
index 348518c..5b6d150 100644
--- a/analyzer.lpr
+++ b/analyzer.lpr
@@ -6,22 +6,33 @@ uses
{$IFDEF UNIX}{$IFDEF UseCThreads}
cthreads,
{$ENDIF}{$ENDIF}
- classes, sysUtils, custApp
- { you can add units after this };
+ classes, sysUtils, custApp, valuesunit, lowlevelunit, dateutils;
type
- tOption = (oHelp, oInput);
+ tOption = (oHelp, oAcceleration, oPosition, oOutput);
+
+ tOptionMeta = record
+ long: string;
+ short: char;
+ value: byte; // bit 0: kann Wert haben; bit 1: muss Wert haben
+ end;
+
+ tOptionContent = record
+ typ: tOption;
+ hasValue: boolean;
+ value: string;
+ end;
{ TAnalyzer }
tAnalyzer = class(tCustomApplication)
protected
- options: array of tOption;
- oValues: array of string;
+ options: array of tOptionContent;
+ oCnt: array[tOption] of longint;
procedure doRun; override;
procedure parseOptions;
- procedure illegalOption(i: longint);
+ function optionArgument(o: tOption; i: longint): string;
public
constructor create(theOwner: tComponent); override;
destructor destroy; override;
@@ -29,46 +40,70 @@ type
end;
const
- shortOptions: array[tOption] of char =
- ('h','i');
- longOptions: array[tOption] of string = (
- 'help',
- 'input'
- );
- optionValue: array[tOption] of byte = ( // bit 0: kann Wert haben; bit 1: muss Wert haben
- 0,
- 3
+ optionsMeta: array[tOption] of tOptionMeta = (
+ (long: 'help'; short: 'h'; value: $00),
+ (long: 'acceleration'; short: 'a'; value: $03),
+ (long: 'position'; short: 'p'; value: $03),
+ (long: 'output'; short: 'o'; value: $03)
);
{ TAnalyzer }
procedure tAnalyzer.doRun;
var
- errorMsg: string;
+ i: longint;
+ values: array of array[boolean] of tValues;
begin
- // quick check parameters
- errorMsg:=checkOptions('hi:', 'help input:');
- if errorMsg<>'' then begin
- showException(Exception.Create(ErrorMsg));
+ if oCnt[oHelp]>0 then begin
+ writeHelp;
+ terminate;
+ exit;
+ end;
+
+ if oCnt[oAcceleration]=0 then begin
+ writeln('error: required option ''-a'' not given');
+ writeHelp;
halt(1);
end;
- // parse parameters
- if hasOption('h', 'help') then begin
+ if oCnt[oAcceleration]<>oCnt[oPosition] then begin
+ writeln('error: option ''-p'' not given equally often as option ''-a''');
writeHelp;
- terminate;
- exit;
+ halt(1);
end;
- if not hasOption('i','input') then begin
- writeln('error: required option ''-i'' not given');
+ if oCnt[oOutput]<>1 then begin
+ writeln('error: required option ''-o'' not given exactly once');
writeHelp;
halt(1);
end;
+ for i:=0 to oCnt[oAcceleration]-1 do begin
+ if not fileexists(optionArgument(oAcceleration,i)) then begin
+ writeln('Acceleration file '''+optionArgument(oAcceleration,i)+''' does not exist');
+ halt(1);
+ end;
+ if not fileexists(optionArgument(oPosition,i)) then begin
+ writeln('Position file '''+optionArgument(oPosition,i)+''' does not exist');
+ halt(1);
+ end;
+ end;
+
{ add your program here }
+ setlength(values,oCnt[oAcceleration]);
+ for i:=0 to length(values)-1 do begin
+ values[i,false]:=tValues.create;
+ values[i,false].readFromFile(optionArgument(oAcceleration,i));
+ values[i,true]:=tValues.create;
+ values[i,true].readFromFile(values[i,false].timeInterval,optionArgument(oPosition,i));
+ values[i,false].intersect(values[i,true]);
+ end;
- writeln(''''+getOptionValue('i','input')+'''');
+ for i:=0 to length(values)-1 do begin
+ values[i,false].free;
+ values[i,true].free;
+ end;
+ setlength(values,0);
// stop program loop
terminate;
@@ -76,50 +111,144 @@ end;
procedure tAnalyzer.parseOptions;
var
- i: longint;
- s,t: string;
- o: tOption;
- v,gefunden: boolean;
+ i,j,incre,jncre: longint;
+ s: string;
+ oTypen: array of byte; // 0 = argument; 1 = short option(s); 2 = long option
+ o: tOption;
begin
+ for o:=low(tOption) to high(tOption) do
+ oCnt[o]:=0;
+
+ setlength(oTypen,paramcount);
+ for i:=0 to length(oTypen)-1 do
+ if copy(paramstr(i+1),1,2)='--' then
+ oTypen[i]:=2
+ else if copy(paramstr(i+1),1,1)='-' then
+ oTypen[i]:=1
+ else
+ oTypen[i]:=0;
+
setlength(options,0);
- setlength(oValues,0);
- i:=1;
- while i<=paramcount do begin
- s:=paramstr(i);
- if copy(s,1,1)<>'-' then
- illegalOption(i);
- delete(s,1,1);
- gefunden:=false;
- if copy(s,1,1)='-' then begin // long option
- delete(s,1,1);
- if pos('=',s)>0 then begin
- t:=copy(s,pos('=',s)+1,length(s));
- s:=copy(s,1,pos('=',s)-1);
- v:=true;
- end
- else begin
- t:='';
- v:=false;
+ i:=0;
+ while i<length(oTypen) do begin
+ incre:=1;
+ s:=paramstr(i+1);
+ case oTypen[i] of
+ 0: begin
+ writeln('Spurious argument '''+s+''' at position '+inttostr(i+1));
+ halt(1);
+ end;
+ 1: begin
+ delete(s,1,1);
+
+ j:=1;
+ while j<=length(s) do begin
+ jncre:=1;
+ setlength(options,length(options)+1);
+ options[length(options)-1].hasValue:=false;
+ options[length(options)-1].value:='';
+ options[length(options)-1].typ:=low(optionsMeta);
+ while options[length(options)-1].typ<high(optionsMeta) do begin
+ if (optionsMeta[options[length(options)-1].typ].short=s[j]) then
+ break;
+ inc(options[length(options)-1].typ);
+ end;
+ if (optionsMeta[options[length(options)-1].typ].short<>s[j]) then begin
+ writeln('Illegal option at position '+inttostr(i+1)+', character '+inttostr(j)+': '''+s[j]+'''');
+ writeHelp;
+ halt(1);
+ end;
+
+ if odd(optionsMeta[options[length(options)-1].typ].value) // may have value
+ and (((i<length(oTypen)-1) and (oTypen[i+1]=0)) or (j<length(s))) then begin // still arguments left
+ options[length(options)-1].hasValue:=true;
+ if j<length(s) then begin
+ options[length(options)-1].value:=copy(s,j+1,length(s));
+ jncre:=length(s);
+ end
+ else begin
+ options[length(options)-1].value:=paramstr(i+2);
+ inc(incre);
+ end;
+ end
+ else
+ options[length(options)-1].hasValue:=false;
+
+ if (not options[length(options)-1].hasValue) and odd(optionsMeta[options[length(options)-1].typ].value shr 1) then begin
+ writeln('Option '''+optionsMeta[options[length(options)-1].typ].short+''' at position '+inttostr(i+1)+', character '+inttostr(j)+' requires an argument!');
+ writeHelp;
+ halt(1);
+ end;
+ inc(oCnt[options[length(options)-1].typ]);
+ inc(j,jncre);
+ end;
end;
- for o:=low(longOptions) to high(longOptions) do
- if (longOptions[o]<>'') and (longOptions[o]=s) and ((not v) or odd(optionValue[o])) then begin
- gefunden:=true;
- break;
+ 2: begin
+ delete(s,1,2);
+
+ setlength(options,length(options)+1);
+
+ if pos('=',s)>0 then begin
+ options[length(options)-1].value:=copy(s,pos('=',s)+1,length(s));
+ s:=copy(s,1,pos('=',s)-1);
+ options[length(options)-1].hasValue:=true;
+ end
+ else begin
+ options[length(options)-1].value:='';
+ options[length(options)-1].hasValue:=false;
+ end;
+ options[length(options)-1].typ:=low(optionsMeta);
+ while options[length(options)-1].typ<high(optionsMeta) do begin
+ if (optionsMeta[options[length(options)-1].typ].long<>'') and (optionsMeta[options[length(options)-1].typ].long=s) then
+ break;
+ inc(options[length(options)-1].typ);
+ end;
+ if (optionsMeta[options[length(options)-1].typ].long='') or (optionsMeta[options[length(options)-1].typ].long<>s) then begin
+ writeln('Illegal option at position '+inttostr(i+1)+': '''+s+'''');
+ writeHelp;
+ halt(1);
end;
- end;
- if not gefunden then
- illegalOption(i);
+ if (not options[length(options)-1].hasValue) // no value yet
+ and odd(optionsMeta[options[length(options)-1].typ].value) // may have value
+ and (i<length(oTypen)-1) // still arguments left
+ and (oTypen[i+1]=0) then begin // next argument is no option
+ options[length(options)-1].hasValue:=true;
+ options[length(options)-1].value:=paramstr(i+2);
+ inc(incre);
+ end;
+
+ if options[length(options)-1].hasValue and not odd(optionsMeta[options[length(options)-1].typ].value) then begin
+ writeln('Option '''+optionsMeta[options[length(options)-1].typ].long+''' at position '+inttostr(i+1)+' does not take an argument!');
+ writeHelp;
+ halt(1);
+ end;
- inc(i);
+ if (not options[length(options)-1].hasValue) and odd(optionsMeta[options[length(options)-1].typ].value shr 1) then begin
+ writeln('Option '''+optionsMeta[options[length(options)-1].typ].long+''' at position '+inttostr(i+1)+' requires an argument!');
+ writeHelp;
+ halt(1);
+ end;
+ inc(oCnt[options[length(options)-1].typ]);
+ end;
+ end{of case};
+ inc(i,incre);
end;
end;
-procedure tAnalyzer.illegalOption(i: longint);
+function tAnalyzer.optionArgument(o: tOption; i: longint): string;
+var
+ j: longint;
begin
- writeln('Illegal option at position '+inttostr(i)+': '''+paramstr(i)+'''');
- writeHelp;
- halt(1);
+ for j:=0 to length(options)-1 do
+ if (options[j].typ=o) and options[j].hasValue then begin
+ dec(i);
+ if i<0 then begin
+ result:=options[j].value;
+ exit;
+ end;
+ end;
+ raise exception.create('Option '''+optionsMeta[o].long+''' not available '+inttostr(i+1)+' times');
end;
constructor tAnalyzer.create(theOwner: tComponent);
@@ -138,6 +267,7 @@ procedure tAnalyzer.writeHelp;
begin
{ add your help code here }
writeln('usage: ', exeName, ' -h');
+ writeln('usage: ', exeName, ' -i input1 -i input2 -o output');
end;
var