summaryrefslogtreecommitdiff
path: root/filterunit.pas
diff options
context:
space:
mode:
Diffstat (limited to 'filterunit.pas')
-rw-r--r--filterunit.pas352
1 files changed, 175 insertions, 177 deletions
diff --git a/filterunit.pas b/filterunit.pas
index e030bcb..fb1e54f 100644
--- a/filterunit.pas
+++ b/filterunit.pas
@@ -8,209 +8,207 @@ uses
Classes, SysUtils;
type
+
tAbfahrt = record
- haltestellenId: integer;
- Linie,Ziel,Richtung: String;
- sAn,sAb,iAn,iAb: TDatetime;
- end;
+ haltestellenId: integer;
+ linie,ziel,richtung: string;
+ sAn,sAb,iAn,iAb: tDateTime;
+ end;
+
tFilterKriterium = (fkZeit,fkLinie,fkHaltestelle);
- tBoolOperation = (boPush1,boPop1,boPush2,boPop2,
- boNot,boAnd,boOr,
- boSet,boPropablySet,boClr,
- boTrust,boMistrust,
- boDrop,boCopy);
+
+ tBoolOperation =
+ (boPush1,boPop1,boPush2,boPop2,
+ boNot,boAnd,boOr,
+ boSet,boPropablySet,boClr,
+ boTrust,boMistrust,
+ boDrop,boCopy);
+
tFilter = class
- Kriterien: array of TFilterKriterium;
- Vergleiche: array of string;
- Verknuepfung: array of TBoolOperation;
- function Regel_erfuellt(Abf: TAbfahrt; Genuegsamkeit: byte): boolean;
- constructor create(var f: textfile);
- destructor destroy;
- end;
-
-function extract_time(source: string): tdatetime;
-function extract_advtime(source: string): tdatetime;
+ kriterien: array of tFilterKriterium;
+ vergleiche: array of string;
+ verknuepfung: array of tBoolOperation;
+ function regelErfuellt(abf: tAbfahrt; genuegsamkeit: byte): boolean;
+ constructor create(var f: textfile);
+ destructor destroy; override;
+ end;
+
+function extractTime(source: string): tDateTime;
function extract(verifyer,source: string): string; overload;
-function extract(verifyer,source: string; var Tag: string): string; overload;
+function extract(verifyer,source: string; out tag: string): string; overload;
implementation
-uses math;
+uses math, lowlevelUnit;
-function tFilter.Regel_erfuellt(abf: TAbfahrt; genuegsamkeit: Byte): boolean;
-var i: longint;
- stack1,stack2,reg: array of byte;
+function tFilter.regelErfuellt(abf: tAbfahrt; genuegsamkeit: byte): boolean;
+var
+ i: longint;
+ stack1,stack2,reg: array of byte;
begin
- setlength(stack1,0);
- setlength(stack2,0);
- setlength(reg,min(length(Kriterien),length(Vergleiche)));
- for I:=0 to length(Reg)-1 do begin
- case Kriterien[I] of
- fkZeit: Reg[I]:=max(Byte(Abf.sAb - now < strtotime(Vergleiche[I])),
- 2*Byte(Abf.iAb - now < strtotime(Vergleiche[I])));
- fkLinie: Reg[I]:=2*Byte(strtoint(Abf.Linie) = strtoint(Vergleiche[I]));
- fkHaltestelle: Reg[I]:=2*Byte(Abf.haltestellenId = strtoint(Vergleiche[I]));
- end{of Case};
- end;
- for I:=0 to length(Verknuepfung)-1 do
- case Verknuepfung[I] of
- boNot: Reg[length(Reg)-1]:=2-Reg[length(Reg)-1];
- boPush1: begin
- setlength(Stack1,length(Stack1)+1);
- Stack1[length(Stack1)-1]:=Reg[length(Reg)-1];
- setlength(Reg,length(Reg)-1);
- end;
- boPop1: begin
- setlength(Reg,length(Reg)+1);
- Reg[length(Reg)-1]:=Stack1[length(Stack1)-1];
- setlength(Stack1,length(Stack1)-1);
- end;
- boPush2: begin
- setlength(Stack2,length(Stack2)+1);
- Stack2[length(Stack2)-1]:=Reg[length(Reg)-1];
- setlength(Reg,length(Reg)-1);
- end;
- boPop2: begin
- setlength(Reg,length(Reg)+1);
- Reg[length(Reg)-1]:=Stack1[length(Stack2)-1];
- setlength(Stack2,length(Stack2)-1);
- end;
- boAnd: begin
- Reg[length(Reg)-2]:=min(Reg[length(Reg)-1],Reg[length(Reg)-2]);
- setlength(Reg,length(Reg)-1);
- end;
- boOr: begin
- Reg[length(Reg)-2]:=max(Reg[length(Reg)-1],Reg[length(Reg)-2]);
- setlength(Reg,length(Reg)-1);
- end;
- boSet: Reg[length(Reg)-1]:=2;
- boPropablySet: Reg[length(Reg)-1]:=1;
- boClr: Reg[length(Reg)-1]:=0;
- boDrop: setlength(Reg,length(Reg)-1);
- boTrust: Reg[length(Reg)-1]:=2*Byte(Reg[length(Reg)-1]<>0);
- boMistrust: Reg[length(Reg)-1]:=2*Byte(Reg[length(Reg)-1]=2);
- boCopy: begin
- setlength(Reg,length(Reg)+1);
- Reg[length(Reg)-1]:=Reg[length(Reg)-2];
- end;
- end{of case};
- Result:=Reg[0]>=Genuegsamkeit;
- setlength(Reg,0);
- setlength(Stack1,0);
- setlength(Stack2,0);
+ setlength(stack1,0);
+ setlength(stack2,0);
+ setlength(reg,min(length(kriterien),length(vergleiche)));
+ for i:=0 to length(reg)-1 do
+ case kriterien[i] of
+ fkZeit: reg[i]:=max(byte(abf.sAb - now < strtotime(vergleiche[i])),
+ 2*byte(abf.iAb - now < strtotime(vergleiche[i])));
+ fkLinie: reg[i]:=2*byte(strtoint(abf.Linie) = strtoint(vergleiche[i]));
+ fkHaltestelle: reg[i]:=2*byte(abf.haltestellenId = strtoint(vergleiche[i]));
+ end{of Case};
+ for i:=0 to length(verknuepfung)-1 do
+ case verknuepfung[i] of
+ boNot: reg[length(reg)-1]:=2-reg[length(reg)-1];
+ boPush1: begin
+ setlength(stack1,length(stack1)+1);
+ stack1[length(stack1)-1]:=reg[length(reg)-1];
+ setlength(reg,length(reg)-1);
+ end;
+ boPop1: begin
+ setlength(reg,length(reg)+1);
+ reg[length(reg)-1]:=stack1[length(stack1)-1];
+ setlength(stack1,length(stack1)-1);
+ end;
+ boPush2: begin
+ setlength(stack2,length(stack2)+1);
+ stack2[length(stack2)-1]:=reg[length(reg)-1];
+ setlength(reg,length(reg)-1);
+ end;
+ boPop2: begin
+ setlength(reg,length(reg)+1);
+ reg[length(reg)-1]:=stack1[length(stack2)-1];
+ setlength(stack2,length(stack2)-1);
+ end;
+ boAnd: begin
+ reg[length(reg)-2]:=min(reg[length(reg)-1],reg[length(reg)-2]);
+ setlength(reg,length(reg)-1);
+ end;
+ boOr: begin
+ reg[length(reg)-2]:=max(reg[length(reg)-1],reg[length(reg)-2]);
+ setlength(reg,length(reg)-1);
+ end;
+ boSet: reg[length(reg)-1]:=2;
+ boPropablySet: reg[length(reg)-1]:=1;
+ boClr: reg[length(reg)-1]:=0;
+ boDrop: setlength(reg,length(reg)-1);
+ boTrust: reg[length(reg)-1]:=2*byte(reg[length(reg)-1]<>0);
+ boMistrust: reg[length(reg)-1]:=2*byte(reg[length(reg)-1]=2);
+ boCopy: begin
+ setlength(reg,length(reg)+1);
+ reg[length(reg)-1]:=reg[length(reg)-2];
+ end;
+ end{of case};
+ result:=reg[0]>=genuegsamkeit;
+ setlength(reg,0);
+ setlength(stack1,0);
+ setlength(stack2,0);
end;
-constructor TFilter.create(var f: textfile);
-var s: string;
- i: byte;
+constructor tFilter.create(var f: textfile);
+var
+ s: string;
+ i: byte;
begin
- inherited create;
- setlength(Kriterien,0);
- setlength(Vergleiche,0);
- setlength(Verknuepfung,0);
- i:=0;
-
- while not eof(f) do begin
- readln(f,s);
- if s=':filter' then exit;
- if (length(s)=0) or (s[1]='#') then continue;
- if s=':filter:' then begin
- if i<>0 then
- raise Exception.create('Ich habe zu häufig '':filter:''!');
- inc(i);
- continue;
- end;
- case i of
- 0: begin
- setlength(Kriterien,length(Kriterien)+1);
- case s[1] of
- 't': Kriterien[length(Kriterien)-1]:=fkZeit;
- 'l': Kriterien[length(Kriterien)-1]:=fkLinie;
- 'h': Kriterien[length(Kriterien)-1]:=fkHaltestelle;
- else raise Exception.create('Ich kenne Kriterium '''+s[1]+''' nicht!');
- end{of Case};
- delete(s,1,1);
- setlength(Vergleiche,length(Vergleiche)+1);
- Vergleiche[length(Vergleiche)-1]:=s;
- end;
- 1: begin
- setlength(Verknuepfung,length(Verknuepfung)+1);
- case s[1] of
- '-': Verknuepfung[length(Verknuepfung)-1]:=boNot;
- '&': Verknuepfung[length(Verknuepfung)-1]:=boAnd;
- '|': Verknuepfung[length(Verknuepfung)-1]:=boOr;
- '0': Verknuepfung[length(Verknuepfung)-1]:=boClr;
- '1': Verknuepfung[length(Verknuepfung)-1]:=boPropablySet;
- '2': Verknuepfung[length(Verknuepfung)-1]:=boSet;
- 'v': Verknuepfung[length(Verknuepfung)-1]:=boPush1;
- '^': Verknuepfung[length(Verknuepfung)-1]:=boPop1;
- '<': Verknuepfung[length(Verknuepfung)-1]:=boPush2;
- '>': Verknuepfung[length(Verknuepfung)-1]:=boPop2;
- '*': Verknuepfung[length(Verknuepfung)-1]:=boDrop;
- '~': Verknuepfung[length(Verknuepfung)-1]:=boCopy;
- 'T': Verknuepfung[length(Verknuepfung)-1]:=boTrust;
- 'M': Verknuepfung[length(Verknuepfung)-1]:=boMistrust;
- else raise Exception.create('Ich kenne Verknüpfung '''+s[1]+''' nicht!');
- end{of Case};
- end;
- end{of Case};
- end;
- raise Exception.create('Unerwartetes Dateiende!');
-end;
-
-destructor TFilter.destroy;
-var i: longint;
-begin
- for i:=0 to length(Vergleiche)-1 do
- Vergleiche[i]:='';
- setlength(Kriterien,0);
- setlength(Vergleiche,0);
- setlength(Verknuepfung,0);
- inherited destroy;
+ inherited create;
+ setlength(kriterien,0);
+ setlength(vergleiche,0);
+ setlength(verknuepfung,0);
+ i:=0;
+
+ while not eof(f) do begin
+ readln(f,s);
+ if s=':filter' then exit;
+ if (length(s)=0) or (s[1]='#') then continue;
+ if s=':filter:' then begin
+ if i<>0 then
+ raise exception.create('Ich habe zu häufig '':filter:''!');
+ inc(i);
+ continue;
+ end;
+ case i of
+ 0: begin
+ setlength(kriterien,length(kriterien)+1);
+ case s[1] of
+ 't': kriterien[length(kriterien)-1]:=fkZeit;
+ 'l': kriterien[length(kriterien)-1]:=fkLinie;
+ 'h': kriterien[length(kriterien)-1]:=fkHaltestelle;
+ else raise Exception.create('Ich kenne Kriterium '''+s[1]+''' nicht!');
+ end{of Case};
+ delete(s,1,1);
+ setlength(vergleiche,length(vergleiche)+1);
+ vergleiche[length(vergleiche)-1]:=s;
+ end;
+ 1: begin
+ setlength(verknuepfung,length(verknuepfung)+1);
+ case s[1] of
+ '-': verknuepfung[length(verknuepfung)-1]:=boNot;
+ '&': verknuepfung[length(verknuepfung)-1]:=boAnd;
+ '|': verknuepfung[length(verknuepfung)-1]:=boOr;
+ '0': verknuepfung[length(verknuepfung)-1]:=boClr;
+ '1': verknuepfung[length(verknuepfung)-1]:=boPropablySet;
+ '2': verknuepfung[length(verknuepfung)-1]:=boSet;
+ 'v': verknuepfung[length(verknuepfung)-1]:=boPush1;
+ '^': verknuepfung[length(verknuepfung)-1]:=boPop1;
+ '<': verknuepfung[length(verknuepfung)-1]:=boPush2;
+ '>': verknuepfung[length(verknuepfung)-1]:=boPop2;
+ '*': verknuepfung[length(verknuepfung)-1]:=boDrop;
+ '~': verknuepfung[length(verknuepfung)-1]:=boCopy;
+ 'T': verknuepfung[length(verknuepfung)-1]:=boTrust;
+ 'M': verknuepfung[length(verknuepfung)-1]:=boMistrust;
+ else raise exception.create('Ich kenne Verknüpfung '''+s[1]+''' nicht!');
+ end{of Case};
+ end;
+ end{of Case};
+ end;
+ raise exception.create('Unerwartetes Dateiende!');
end;
-function extract_time(source: string): tdatetime;
-var s: string;
+destructor tFilter.destroy;
+var
+ i: longint;
begin
- s:=copy(source,1,pos('-',source)-1);
- delete(source,1,pos('-',source));
- s:=copy(source,1,pos('-',source)-1)+'.'+s;
- delete(source,1,pos('-',source));
- s:=copy(source,1,pos('T',source)-1)+'.'+s;
- delete(source,1,pos('T',source));
- s:=s+' '+source;
- result:=strtodatetime(s);
+ for i:=0 to length(vergleiche)-1 do
+ vergleiche[i]:='';
+ setlength(kriterien,0);
+ setlength(vergleiche,0);
+ setlength(verknuepfung,0);
+ inherited destroy;
end;
-function extract_advtime(source: string): tdatetime;
+function extractTime(source: string): tDateTime;
+var
+ ja,mo,ta,st,mi,se: word;
begin
- delete(source,1,pos('"',source));
- source:=copy(source,1,pos('"',source)-1);
- result:=extract_time(source);
+ ja:=strtoint(erstesArgument(source,'-'));
+ mo:=strtoint(erstesArgument(source,'-'));
+ ta:=strtoint(erstesArgument(source,'T'));
+ st:=strtoint(erstesArgument(source,':'));
+ mi:=strtoint(erstesArgument(source,':'));
+ se:=strtoint(source);
+ result:=encodeDate(ja,mo,ta)+encodeTime(st,mi,se,0);
end;
function extract(verifyer,source: string): string; overload;
begin
- result:='';
- if (pos('<'+verifyer+'>',source)>0) or
- (pos('<'+verifyer+' ',source)>0) then
- begin
- delete(source,1,pos('<'+verifyer,source)+length('<'+verifyer)-1);
- delete(source,1,pos('>',source));
- result:=copy(source,1,pos('</'+verifyer+'>',source)-1);
+ result:='';
+ if (pos('<'+verifyer+'>',source)>0) or
+ (pos('<'+verifyer+' ',source)>0) then begin
+ delete(source,1,pos('<'+verifyer,source)+length('<'+verifyer)-1);
+ delete(source,1,pos('>',source));
+ result:=copy(source,1,pos('</'+verifyer+'>',source)-1);
end;
end;
-function extract(verifyer,source: string; var Tag: string): string; overload;
+function extract(verifyer,source: string; out tag: string): string; overload;
begin
- result:='';
- if (pos('<'+verifyer+'>',source)>0) or
- (pos('<'+verifyer+' ',source)>0) then
- begin
- delete(source,1,pos('<'+verifyer,source)+length('<'+verifyer)-1);
- Tag:=copy(source,2,pos('>',source)-2);
- delete(source,1,pos('>',source));
- result:=copy(source,1,pos('</'+verifyer+'>',source)-1);
+ result:='';
+ tag:='';
+ if (pos('<'+verifyer+'>',source)>0) or
+ (pos('<'+verifyer+' ',source)>0) then begin
+ delete(source,1,pos('<'+verifyer,source)+length('<'+verifyer)-1);
+ tag:=copy(source,2,pos('>',source)-2);
+ delete(source,1,pos('>',source));
+ result:=copy(source,1,pos('</'+verifyer+'>',source)-1);
end;
end;