summaryrefslogtreecommitdiff
path: root/dateibeziehungen.pas
diff options
context:
space:
mode:
authorErich Eckner <git@eckner.net>2016-05-11 12:30:55 +0200
committerErich Eckner <git@eckner.net>2016-05-11 12:30:55 +0200
commit3513fe55b2d1b2a2bd3e12f72fb2ed0bd81abeb0 (patch)
treec1b6707f0f0e152fe11d4f762f9893d9d0ba25b0 /dateibeziehungen.pas
parenta551481da0598e22e5d6bf2289059ecf6da77462 (diff)
downloadMake-3513fe55b2d1b2a2bd3e12f72fb2ed0bd81abeb0.tar.xz
große Veränderungen begonnen :-/
Diffstat (limited to 'dateibeziehungen.pas')
-rw-r--r--dateibeziehungen.pas226
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;