summaryrefslogtreecommitdiff
path: root/dateibeziehungen.pas
diff options
context:
space:
mode:
Diffstat (limited to 'dateibeziehungen.pas')
-rw-r--r--dateibeziehungen.pas111
1 files changed, 60 insertions, 51 deletions
diff --git a/dateibeziehungen.pas b/dateibeziehungen.pas
index 5aa60dd..d9b30dd 100644
--- a/dateibeziehungen.pas
+++ b/dateibeziehungen.pas
@@ -498,11 +498,37 @@ end;
function tGenerischeAbhaengigkeit.findeQuellen(dats: tDateienMitDaten): boolean;
var
- i,lastI: longint;
- idx: array of longint;
+ i: longint;
+ idxs: array of tLongintArray;
tmpQs: tDateienMitDaten; // hierin wird die momentan betrachte Kombination von Quellen gespeichert
+
+procedure fuelleStelle(ii: longint);
+var
s: string;
- tmpRE: tRegExpr;
+begin
+ if ii>0 then begin // vorherige Stelle "verbrauchen"
+ tmpQs.add(dats[idxs[ii-1][length(idxs[ii-1])-1]]);
+ setLength(idxs[ii-1],length(idxs[ii-1])-1);
+ end;
+ s:=quellenREs[ii];
+ if (leftStr(s,1)='^') and (rightStr(s,1)='$') then begin // es handelt sich um einen regex
+ if not quellErsetzung(s,rtFpc,tmpQs,ii) then // regex-Substitution nicht erfolgreich -
+ tmpQs.delete(tmpQs.count-1) // wird behandelt wie nie passender regex
+ else
+ dats.matchAll(s,idxs[ii],true);
+ end
+ else if (leftStr(s,1)='"') and (rightStr(s,1)='"') then begin // es handelt sich um einen regulären String
+ delete(s,1,1);
+ delete(s,length(s),1);
+ if not quellErsetzung(s,rtKein,tmpQs,ii) then // Substitution nicht erfolgreich -
+ tmpQs.delete(tmpQs.count-1) // wird behandelt wie nicht existente Datei
+ else
+ dats.matchAll(s,idxs[ii],false);
+ end
+ else
+ fehler('Unbekannte Quell-Syntax: '''+s+''' - weder ''"/pfad/zur/Quelle"'' noch ''^/regex/der/auf/Quelle\.passt$''!');
+end;
+
begin
result:=false;
for i:=0 to length(_quellens)-1 do
@@ -514,61 +540,44 @@ begin
if length(quellenREs)=0 then exit;
- tmpRE:=tRegExpr.create;
tmpQs:=tDateienMitDaten.create;
- tmpQs.count:=length(quellenREs);
- setLength(idx,tmpQs.count);
- for i:=0 to length(idx)-1 do begin
- idx[i]:=-1;
- tmpQs[i]:=nil;
- end;
+ setLength(idxs,length(quellenREs));
+ for i:=0 to length(idxs)-1 do
+ setLength(idxs[i],0);
- lastI:=-1;
+ fuelleStelle(0);
repeat
- if assigned(tmpQs[0]) then
- i:=length(idx)-1
- else
- i:=0;
- while (i>=0) and (i<length(idx)) do begin // alle Stellen von idx müssen gefüllt werden!
- if i<>lastI then begin // wir betrachten eine neue Stelle,
- s:=quellenREs[i]; // daher ist der RegEx nicht mehr aktuell
- if not quellErsetzung(s,rtFpc,tmpQs,i) then begin // regex-substitution nicht erfolgreich -
- idx[i]:=-1; // wird behandelt wie nie passender regex
- tmpQs[i]:=nil;
- dec(i);
- continue;
- end;
- tmpRE.expression:=s;
- lastI:=i;
- end;
- repeat
- inc(idx[i]);
- until (idx[i]>=dats.count) or (tmpRE.exec(dats[idx[i]].name));
-
- if idx[i]>=dats.count then begin // Überlauf
- idx[i]:=-1;
- tmpQs[i]:=nil;
- dec(i);
- continue;
- end;
+ while (tmpQs.count>0) and (length(idxs[tmpQs.count])=0) do
+ tmpQs.delete(tmpQs.count-1);
+ // jetzt gibt es genau so viele tmpQs bis eins vor der letzten idxs-Position
+ // mit einem Wert <> 0
- tmpQs[i]:=dats[idx[i]];
- inc(i); // nächste Stelle
- if i>=length(idx) then // zu weit?
- break; // dann fertig
- idx[i]:=-1; // sonst initialisieren
+ if length(idxs[tmpQs.count])=0 then // das bedeutet einen Übertrag von der 0.
+ break; // auf die -1. Stelle
+
+ for i:=tmpQs.count+1 to length(idxs)-1 do begin // um die Stelle i zu füllen, benötigen wir
+ fuelleStelle(i); // i-1 tmpQs, denn die i-te wird gewählt
+ if i>tmpQs.count then // die neue Stelle wurde nicht befüllt
+ break;
end;
- if i<0 then break; // Überlauf auf -1 => fertig
- setLength(_quellens,length(_quellens)+1);
- _quellens[length(_quellens)-1]:=tDateienMitDaten.create;
- for i:=0 to tmpQs.count-1 do
- _quellens[length(_quellens)-1].add(tmpQs[i]);
+ if tmpQs.count<length(idxs)-1 then // eine Quellersetzung ist fehlgeschlagen -
+ continue; // wir starten die Runde neu
+
+ for i:=0 to length(idxs[length(idxs)-1])-1 do begin
+ tmpQs.add(dats[idxs[length(idxs)-1][i]]);
+ setLength(_quellens,length(_quellens)+1);
+ _quellens[length(_quellens)-1]:=tDateienMitDaten.create;
+ _quellens[length(_quellens)-1].append(tmpQs);
+ tmpQs.delete(tmpQs.count-1);
+ end;
+ setLength(idxs[length(idxs)-1],0);
until false;
- tmpRE.free;
tmpQs.free;
- setLength(idx,0);
+ for i:=0 to length(idxs)-1 do
+ setLength(idxs[i],0);
+ setLength(idxs,0);
setLength(_zieles,length(_quellens));
for i:=0 to length(_zieles)-1 do begin
@@ -825,8 +834,8 @@ begin
else if rightStr(s,1)=':' then
// ein Ziel
wasIst:=ztZiel
- else if (leftStr(s,1)='^') and (rightStr(s,1)='$') then
- // eine Quelle
+ else if ((leftStr(s,1)='^') and (rightStr(s,1)='$')) or // ein Quell-Regex
+ ((leftStr(s,1)='"') and (rightStr(s,1)='"')) then // ein Quell-String
wasIst:=ztQuelle
else
// eine zu überwachende Datei