diff options
Diffstat (limited to 'dateibeziehungen.pas')
-rw-r--r-- | dateibeziehungen.pas | 111 |
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 |