diff options
Diffstat (limited to 'analyzer.lpr')
-rw-r--r-- | analyzer.lpr | 252 |
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 |