diff options
Diffstat (limited to 'dateibeziehungen.pas')
-rw-r--r-- | dateibeziehungen.pas | 226 |
1 files changed, 181 insertions, 45 deletions
diff --git a/dateibeziehungen.pas b/dateibeziehungen.pas index 135264f..d951ff3 100644 --- a/dateibeziehungen.pas +++ b/dateibeziehungen.pas @@ -30,15 +30,22 @@ type tAbhaengigkeit = class(tObject) private - _erben,_eltern: tAbhaengigkeiten; + _erben,_eltern: tAbhaengigkeiten; + _quellens,_zieles: array of tDateienMitDaten; + function rQuellen(idx: longint): tDateienMitDaten; + function rZiele(idx: longint): tDateienMitDaten; public - quellenRE: tRegExpr; + quellenREs: array of tRegExpr; // regexes der Quellen + qrePack: array of boolean; // sind mehrere matches obiger regexes zu einem Paket zu bündeln? zieleFkt, befehle: tStringlist; - quellen, - ziele: tDateienMitDaten; + property quellen[idx: longint]: tDateienMitDaten + read rQuellen; + property ziele[idx: longint]: tDateienMitDaten + read rZiele; + function matchCount: longint; constructor create; overload; - constructor create(original: tAbhaengigkeit); overload; +// constructor create(original: tAbhaengigkeit); overload; destructor destroy; override; function hatQuelleVonAlsZiel(abh: tAbhaengigkeit): boolean; function hatErbenMitQuelle(name: string): boolean; @@ -47,6 +54,7 @@ type procedure entferneErben(i: longint); overload; procedure entferneErben(erb: tAbhaengigkeit); overload; procedure entferneElterReferenz(elt: tAbhaengigkeit); + function findeQuellen(dats: tDateienMitDaten): boolean; end; tMach = class @@ -200,43 +208,48 @@ end; constructor tAbhaengigkeit.create; begin inherited create; - quellenRE:=tRegExpr.create; - quellenRE.expression:=''; + setlength(quellenREs,0); + setlength(qrePack,0); zieleFkt:=tStringlist.create; - setlength(quellen,0); - setlength(ziele,0); befehle:=tStringlist.create; _erben:=tAbhaengigkeiten.create; _eltern:=tAbhaengigkeiten.create; + setlength(_quellens,0); + setlength(_zieles,0); end; - +(* constructor tAbhaengigkeit.create(original: tAbhaengigkeit); var i: longint; begin inherited create; - quellenRE:=tRegExpr.create; - quellenRE.expression:=original.quellenRE.expression; + setlength(quellenREs,0); + setlength(qrePack,0); zieleFkt:=tStringlist.create; zieleFkt.text:=original.zieleFkt.text; - setlength(quellen,length(original.quellen)); - for i:=0 to length(original.quellen)-1 do - quellen[i]:=original.quellen[i]; - setlength(ziele,length(original.ziele)); - for i:=0 to length(original.ziele)-1 do - ziele[i]:=original.ziele[i]; + setlength(_quellens,0); + setlength(_zieles,0); befehle:=tStringlist.create; befehle.text:=original.befehle.text; _erben:=tAbhaengigkeiten.create; _eltern:=tAbhaengigkeiten.create; original.neuerErbe(self); end; - +*) destructor tAbhaengigkeit.destroy; +var + i: longint; begin - quellenRE.free; - setLength(quellen,0); - setLength(ziele,0); + for i:=0 to length(quellenREs)-1 do + quellenREs[i].free; + setlength(quellenREs,0); + setlength(qrePack,0); + for i:=0 to length(_quellens)-1 do + setlength(_quellens[i],0); + setLength(_quellens,0); + for i:=0 to length(_zieles)-1 do + setlength(_zieles[i],0); + setLength(_zieles,0); zieleFkt.free; befehle.free; while _erben.count>0 do @@ -245,18 +258,41 @@ begin _eltern[0].entferneErben(self); _erben.free; _eltern.free; + for i:=0 to length(_quellens)-1 do + setlength(_quellens[i],0); + setlength(_quellens,0); inherited destroy; end; +function tAbhaengigkeit.rQuellen(idx: longint): tDateienMitDaten; +begin + result:=_quellens[idx]; +end; + +function tAbhaengigkeit.rZiele(idx: longint): tDateienMitDaten; +begin + result:=_zieles[idx]; +end; + +function tAbhaengigkeit.matchCount: longint; +begin + if length(_quellens)<>length(_zieles) then + fehler('unterschiedlich viele Sätze an Quellen ('+inttostr(length(_quellens))+') und Zielen ('+inttostr(length(_zieles))+').'); + result:=length(_quellens); +end; + function tAbhaengigkeit.hatQuelleVonAlsZiel(abh: tAbhaengigkeit): boolean; var i,j: longint; begin result:=true; - for i:=0 to length(ziele)-1 do - for j:=0 to length(abh.quellen)-1 do - if abh.quellen[j].name = ziele[i].name then - exit; + if (matchCount>1) or (abh.matchCount>1) then + fehler('hatQuelleVonAlsZiel geht nur für Abhängigkeiten mit einem Satz Quellen und Zielen.'); + if (matchCount=1) and (abh.matchCount=1) then + for i:=0 to length(ziele[0])-1 do + for j:=0 to length(abh.quellen[0])-1 do + if abh.quellen[0][j].name = ziele[0][i].name then + exit; result:=false; end; @@ -266,8 +302,15 @@ var begin result:=true; for i:=0 to _erben.count-1 do - for j:=0 to length(_erben[i].quellen)-1 do - if _erben[i].quellen[j].name=name then exit; + with _erben[i] do begin + if matchCount=0 then + continue; + if matchCount>1 then + fehler('hatErbenMitQuelle geht nur für Abhängigkeiten mit Erben mit je einem Satz Quellen.'); + for j:=0 to length(quellen[0])-1 do + if quellen[0][j].name=name then + exit; + end; result:=false; end; @@ -276,11 +319,16 @@ var i: longint; begin result:=nil; - for i:=0 to _erben.count-1 do - if gleicheDateinamen(_erben[i].ziele,zl) then begin + for i:=0 to _erben.count-1 do begin + if _erben[i].matchCount=0 then + continue; + if _erben[i].matchCount>1 then + fehler('erbeMitGleichenZielen geht nur für Abhängigkeiten mit Erben mit je einem Satz Ziele.'); + if gleicheDateinamen(_erben[i].ziele[0],zl) then begin result:=_erben[i]; exit; end; + end; end; procedure tAbhaengigkeit.neuerErbe(erb: tAbhaengigkeit); @@ -319,6 +367,89 @@ begin fehler('Fehler: Kann Elter nicht finden zum Entfernen der Referenz!'); end; +function tAbhaengigkeit.findeQuellen(dats: tDateienMitDaten): boolean; +var + i,j,k: longint; + treffer: array of tDateienMitDaten; + idx: array of longint; + tmpQs: tDateienMitDaten; + s: string; +begin + for i:=0 to length(_quellens)-1 do + setlength(_quellens[i],0); + setlength(_quellens,0); + + if length(quellenREs)=0 then exit; + + setlength(treffer,length(quellenREs)); + for i:=0 to length(treffer)-1 do + for j:=0 to length(dats)-1 do + if quellenREs[i].exec(dats[j].name) then begin + setlength(treffer[i],length(treffer[i])+1); + treffer[i,length(treffer[i])-1]:=dats[j]; + end; + + for i:=0 to length(treffer)-1 do + if length(treffer[i])=0 then + exit; + + setlength(idx,length(treffer)); + idx[0]:=-1; + for i:=1 to length(idx)-1 do + idx[i]:=length(treffer[i])-1; + + j:=0; + for i:=0 to length(idx)-1 do + if qrePack[i] then + j:=j+length(treffer[i]) + else + inc(j); + setlength(tmpQs,j); + + // feste Bestandteile von tmpQs initialisieren + j:=length(treffer); + for i:=0 to length(idx)-1 do + if qrePack[i] then begin + tmpQs[i]:=treffer[i][0]; + for k:=1 to length(treffer[i])-1 do begin + tmpQs[j]:=treffer[i][k]; + inc(j); + end; + end; + + repeat + i:=length(idx)-1; + while (i>=0) and qrePack[i] do + dec(i); + if i<0 then break; + repeat + inc(idx[i]); + if idx[i]>=length(treffer[i]) then begin + idx[i]:=0; + repeat + dec(i); + until (i<0) or not qrePack[i]; + continue; + end; + break; + until i<0; + if i<0 then break; + + // idx und qrePack codieren, welche "treffer" die aktuellen Quellen sind. + for i:=0 to length(idx)-1 do + if not qrePack[i] then + tmpQs[i]:=treffer[i][idx[i]]; + + for i:=0 to zieleFkt.count-1 do begin + s:=zieleFkt[i]; + if quellersetzung(s,tmpQs,machDatei) then begin + + end; + end; + until false; + setlength(tmpQs,0); +end; + // tMach *********************************************************************** constructor tMach.create; @@ -404,13 +535,17 @@ begin end; s:=''; while f.readln(s) do begin - if rightStr(s,1)=';' then // ein Befehl(steil) + if rightStr(s,1)=';' then + // ein Befehl(steil) wasIst:=ztBefehl - else if rightStr(s,1)=':' then // ein Ziel + else if rightStr(s,1)=':' then + // ein Ziel wasIst:=ztZiel - else if wasWar=ztZiel then // eine Quelle + else if (leftStr(s,1)='^') and (rightStr(s,1)='$') then + // eine Quelle wasIst:=ztQuelle - else // eine zu überwachende Datei + else + // eine zu überwachende Datei wasIst:=ztSuche; if wasIst in [ztZiel,ztBefehl] then @@ -465,7 +600,9 @@ begin aufraeumen; exit; end; - na.quellenRE.expression:=s; + setlength(na.quellenREs,length(na.quellenREs)+1); + na.quellenREs[length(na.quellenREs)-1]:=tRegExpr.create; + na.quellenREs[length(na.quellenREs)-1].expression:=s; end; end{of case}; wasWar:=wasIst; @@ -642,8 +779,10 @@ begin repeat neues:=false; - for i:=0 to _oriAbh.count-1 do - for j:=0 to length(_dats)-1 do + for i:=0 to _oriAbh.count-1 do begin + _oriAbh[i].findeQuellen(_dats); + + for j:=0 to _oriAbh[i].matchCount-1 do if _oriAbh[i].quellenRE.exec(_dats[j].name) then begin // Falls diese Quelle schon in eine Regel einfließt, brauchen // wir nichts mehr zu machen, da es für jede Quelle höchstens @@ -730,16 +869,13 @@ begin continue; end; - quA:=aAktuell; + quA:=aAktuell; // bis auf weiteres gehen wir davon aus, dass die Quellen aktuell sind for j:=0 to length(_mglAbh[i].quellen)-1 do - if _mglAbh[i].quellen[j].aktuell<>aAktuell then - quA:=aWirdErneuert; - ziA:=aWirdErneuert; + if _mglAbh[i].quellen[j].aktuell<>aAktuell then // nicht aktuelle Quellen + quA:=aWirdErneuert; // werden sicherlich erneuert werden + ziA:=aAktuell; // bis auf weiteres gehen wir davon aus, dass die Ziele aktuell sind for j:=0 to length(_mglAbh[i].ziele)-1 do - if _mglAbh[i].ziele[j].aktuell=aVeraltet then - ziA:=min(ziA,aAktuell) - else - ziA:=min(ziA,_mglAbh[i].ziele[j].aktuell); + ziA:=min(ziA,_mglAbh[i].ziele[j].aktuell); if ziA<quA then begin neues:=true; |