summaryrefslogtreecommitdiff
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
parenta551481da0598e22e5d6bf2289059ecf6da77462 (diff)
downloadMake-3513fe55b2d1b2a2bd3e12f72fb2ed0bd81abeb0.tar.xz
große Veränderungen begonnen :-/
-rw-r--r--Make.lps143
-rw-r--r--dateibeziehungen.pas226
2 files changed, 273 insertions, 96 deletions
diff --git a/Make.lps b/Make.lps
index 739c319..bc74b0c 100644
--- a/Make.lps
+++ b/Make.lps
@@ -7,25 +7,23 @@
<Unit0>
<Filename Value="Make.lpr"/>
<IsPartOfProject Value="True"/>
- <IsVisibleTab Value="True"/>
<TopLine Value="19"/>
<CursorPos Y="41"/>
- <UsageCount Value="71"/>
+ <UsageCount Value="76"/>
<Loaded Value="True"/>
</Unit0>
<Unit1>
<Filename Value="Machdatei.txt"/>
<IsPartOfProject Value="True"/>
- <UsageCount Value="71"/>
+ <UsageCount Value="76"/>
<DefaultSyntaxHighlighter Value="None"/>
</Unit1>
<Unit2>
<Filename Value="tools.pas"/>
<IsPartOfProject Value="True"/>
<EditorIndex Value="3"/>
- <TopLine Value="35"/>
- <CursorPos X="19" Y="198"/>
- <UsageCount Value="50"/>
+ <CursorPos X="3" Y="21"/>
+ <UsageCount Value="55"/>
<Loaded Value="True"/>
</Unit2>
<Unit3>
@@ -35,77 +33,78 @@
<TopLine Value="83"/>
<CursorPos Y="221"/>
<FoldState Value=" T3i803718 pialE0E116I"/>
- <UsageCount Value="47"/>
+ <UsageCount Value="52"/>
</Unit3>
<Unit4>
<Filename Value="dateibeziehungen.pas"/>
<IsPartOfProject Value="True"/>
<UnitName Value="dateiBeziehungen"/>
+ <IsVisibleTab Value="True"/>
<EditorIndex Value="1"/>
- <TopLine Value="212"/>
- <CursorPos Y="77"/>
- <FoldState Value=" T3j5036 pj3jM0B8 picjO0A512]Bgn20s[94Yk80o1]c4kF034M"/>
- <UsageCount Value="39"/>
+ <TopLine Value="267"/>
+ <CursorPos X="19" Y="376"/>
+ <FoldState Value=" T3jD036 pj3jM0B7 picje0431512]DgpT0s1[B4k8nM034e"/>
+ <UsageCount Value="44"/>
<Loaded Value="True"/>
</Unit4>
<Unit5>
<Filename Value="Machdatei"/>
<CursorPos X="45" Y="17"/>
- <UsageCount Value="9"/>
+ <UsageCount Value="8"/>
<DefaultSyntaxHighlighter Value="None"/>
</Unit5>
<Unit6>
<Filename Value="../Stabile/lowlevelunit.pas"/>
<EditorIndex Value="-1"/>
<CursorPos X="26" Y="23"/>
- <UsageCount Value="8"/>
+ <UsageCount Value="7"/>
</Unit6>
<Unit7>
<Filename Value="../units/lowlevelunit.pas"/>
<EditorIndex Value="-1"/>
<TopLine Value="644"/>
<CursorPos X="17" Y="671"/>
- <UsageCount Value="10"/>
+ <UsageCount Value="9"/>
</Unit7>
<Unit8>
<Filename Value="/usr/lib/fpc/src/rtl/objpas/sysutils/datih.inc"/>
<EditorIndex Value="-1"/>
<TopLine Value="140"/>
<CursorPos X="10" Y="160"/>
- <UsageCount Value="9"/>
+ <UsageCount Value="8"/>
</Unit8>
<Unit9>
<Filename Value="/usr/lib/fpc/src/rtl/objpas/math.pp"/>
<EditorIndex Value="-1"/>
<TopLine Value="162"/>
<CursorPos X="10" Y="167"/>
- <UsageCount Value="9"/>
+ <UsageCount Value="8"/>
</Unit9>
<Unit10>
<Filename Value="../units/matheunit.pas"/>
<EditorIndex Value="-1"/>
- <UsageCount Value="9"/>
+ <UsageCount Value="8"/>
</Unit10>
<Unit11>
<Filename Value="/usr/lib/fpc/src/rtl/objpas/sysutils/finah.inc"/>
<EditorIndex Value="-1"/>
<TopLine Value="4"/>
<CursorPos X="10" Y="23"/>
- <UsageCount Value="9"/>
+ <UsageCount Value="8"/>
</Unit11>
<Unit12>
<Filename Value="/usr/lib/fpc/src/rtl/objpas/classes/classesh.inc"/>
<EditorIndex Value="-1"/>
<TopLine Value="225"/>
<CursorPos X="15" Y="244"/>
- <UsageCount Value="10"/>
+ <UsageCount Value="9"/>
</Unit12>
<Unit13>
<Filename Value="../units/systemunit.pas"/>
<EditorIndex Value="2"/>
<TopLine Value="228"/>
<CursorPos Y="252"/>
- <UsageCount Value="10"/>
+ <UsageCount Value="13"/>
<Loaded Value="True"/>
</Unit13>
<Unit14>
@@ -114,86 +113,128 @@
<EditorIndex Value="-1"/>
<TopLine Value="516"/>
<CursorPos X="61" Y="411"/>
- <UsageCount Value="10"/>
+ <UsageCount Value="9"/>
</Unit14>
</Units>
- <JumpHistory Count="19" HistoryIndex="18">
+ <JumpHistory Count="30" HistoryIndex="29">
<Position1>
<Filename Value="dateibeziehungen.pas"/>
- <Caret Line="827" Column="12" TopLine="795"/>
+ <Caret Line="212" Column="20" TopLine="86"/>
</Position1>
<Position2>
<Filename Value="dateibeziehungen.pas"/>
- <Caret Line="829" Column="14" TopLine="797"/>
+ <Caret Line="402" Column="45" TopLine="383"/>
</Position2>
<Position3>
<Filename Value="dateibeziehungen.pas"/>
- <Caret Line="835" Column="14" TopLine="803"/>
</Position3>
<Position4>
<Filename Value="dateibeziehungen.pas"/>
- <Caret Line="827" Column="12" TopLine="803"/>
+ <Caret Line="38" Column="15" TopLine="5"/>
</Position4>
<Position5>
<Filename Value="dateibeziehungen.pas"/>
- <Caret Line="829" Column="14" TopLine="803"/>
+ <Caret Line="212" Column="4" TopLine="89"/>
</Position5>
<Position6>
<Filename Value="dateibeziehungen.pas"/>
- <Caret Line="835" Column="14" TopLine="803"/>
+ <Caret Line="238" Column="2" TopLine="95"/>
</Position6>
<Position7>
- <Filename Value="tools.pas"/>
- <Caret Line="11" Column="44"/>
+ <Filename Value="dateibeziehungen.pas"/>
+ <Caret Line="48" Column="3" TopLine="27"/>
</Position7>
<Position8>
- <Filename Value="tools.pas"/>
- <Caret Line="166" Column="96" TopLine="134"/>
+ <Filename Value="dateibeziehungen.pas"/>
+ <Caret Line="401" Column="45" TopLine="339"/>
</Position8>
<Position9>
- <Filename Value="tools.pas"/>
- <Caret Line="43" Column="16" TopLine="21"/>
+ <Filename Value="dateibeziehungen.pas"/>
</Position9>
<Position10>
- <Filename Value="tools.pas"/>
- <Caret Line="184" Column="144" TopLine="152"/>
+ <Filename Value="dateibeziehungen.pas"/>
+ <Caret Line="38" Column="15" TopLine="5"/>
</Position10>
<Position11>
- <Filename Value="Make.lpr"/>
- <Caret Line="41" Column="92" TopLine="19"/>
+ <Filename Value="dateibeziehungen.pas"/>
+ <Caret Line="237" Column="15" TopLine="127"/>
</Position11>
<Position12>
<Filename Value="dateibeziehungen.pas"/>
- <Caret Line="359" Column="24" TopLine="252"/>
+ <Caret Line="246" Column="20" TopLine="205"/>
</Position12>
<Position13>
<Filename Value="dateibeziehungen.pas"/>
- <Caret Line="89" Column="45" TopLine="70"/>
+ <Caret Line="266" Column="24" TopLine="223"/>
</Position13>
<Position14>
- <Filename Value="../units/systemunit.pas"/>
- <Caret Line="21"/>
+ <Filename Value="dateibeziehungen.pas"/>
+ <Caret Line="400" Column="13" TopLine="376"/>
</Position14>
<Position15>
<Filename Value="dateibeziehungen.pas"/>
- <Caret Line="374" TopLine="324"/>
+ <Caret Line="404" Column="45" TopLine="381"/>
</Position15>
<Position16>
- <Filename Value="Make.lpr"/>
- <Caret Line="48" Column="30" TopLine="19"/>
+ <Filename Value="dateibeziehungen.pas"/>
+ <Caret Line="37" Column="29" TopLine="28"/>
</Position16>
<Position17>
- <Filename Value="Make.lpr"/>
- <Caret Line="48" Column="30" TopLine="19"/>
+ <Filename Value="dateibeziehungen.pas"/>
+ <Caret Line="1067" TopLine="238"/>
</Position17>
<Position18>
- <Filename Value="Make.lpr"/>
- <Caret Line="32" Column="23" TopLine="19"/>
+ <Filename Value="dateibeziehungen.pas"/>
+ <Caret Line="403" Column="66" TopLine="384"/>
</Position18>
<Position19>
- <Filename Value="Make.lpr"/>
- <Caret Line="31" Column="26" TopLine="19"/>
+ <Filename Value="dateibeziehungen.pas"/>
+ <Caret Line="37" Column="29" TopLine="16"/>
</Position19>
+ <Position20>
+ <Filename Value="dateibeziehungen.pas"/>
+ <Caret Line="1067" TopLine="789"/>
+ </Position20>
+ <Position21>
+ <Filename Value="dateibeziehungen.pas"/>
+ <Caret Line="403" Column="66" TopLine="375"/>
+ </Position21>
+ <Position22>
+ <Filename Value="dateibeziehungen.pas"/>
+ <Caret Line="1067" TopLine="789"/>
+ </Position22>
+ <Position23>
+ <Filename Value="dateibeziehungen.pas"/>
+ <Caret Line="91" TopLine="51"/>
+ </Position23>
+ <Position24>
+ <Filename Value="dateibeziehungen.pas"/>
+ <Caret Line="399" TopLine="376"/>
+ </Position24>
+ <Position25>
+ <Filename Value="dateibeziehungen.pas"/>
+ <Caret Line="1066" TopLine="788"/>
+ </Position25>
+ <Position26>
+ <Filename Value="dateibeziehungen.pas"/>
+ <Caret Line="420" Column="9" TopLine="397"/>
+ </Position26>
+ <Position27>
+ <Filename Value="dateibeziehungen.pas"/>
+ <Caret Line="398" Column="11" TopLine="378"/>
+ </Position27>
+ <Position28>
+ <Filename Value="dateibeziehungen.pas"/>
+ <Caret Line="441" Column="38" TopLine="410"/>
+ </Position28>
+ <Position29>
+ <Filename Value="dateibeziehungen.pas"/>
+ <Caret Line="375" Column="17" TopLine="333"/>
+ </Position29>
+ <Position30>
+ <Filename Value="dateibeziehungen.pas"/>
+ <Caret Line="21" TopLine="21"/>
+ </Position30>
</JumpHistory>
</ProjectSession>
</CONFIG>
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;