summaryrefslogtreecommitdiff
path: root/dateibeziehungen.pas
diff options
context:
space:
mode:
authorErich Eckner <git@eckner.net>2016-05-11 08:46:14 +0200
committerErich Eckner <git@eckner.net>2016-05-11 08:46:14 +0200
commit2ac4f98eeccfa92177bcd419206ce621e0ae4535 (patch)
tree28c3be92df61b7eeaf97041f6d7b2b5ae6f1afc5 /dateibeziehungen.pas
parent98672cefe5f4033655de8d626969c5a9eb0b6ef8 (diff)
downloadMake-2ac4f98eeccfa92177bcd419206ce621e0ae4535.tar.xz
aufgeräumt, Fehler bei nicht passendem Überwachungsmuster
Diffstat (limited to 'dateibeziehungen.pas')
-rw-r--r--dateibeziehungen.pas241
1 files changed, 122 insertions, 119 deletions
diff --git a/dateibeziehungen.pas b/dateibeziehungen.pas
index 7900913..3f690bf 100644
--- a/dateibeziehungen.pas
+++ b/dateibeziehungen.pas
@@ -54,10 +54,14 @@ type
_machDatei,_pruefsummenDatei: string;
_oriAbh,_mglAbh,_ztAbh: tAbhaengigkeiten;
_dats: tDateienMitDaten;
+ _ign: array of tRegExpr;
procedure wMachDatei(md: string);
procedure wPruefsummenDatei(pd: string);
function liesMachDatei: boolean;
function liesPruefsummenfile: boolean;
+ function sammleDateien(wo: string; rekursiv: boolean): longint;
+ procedure zieleHinzufuegen(var ziele: tDateienMitDaten; ziel,quelle: string);
+ procedure findeMehrZiele(var ziele: tDateienMitDaten; zieleFkt: tStringList; quelle: string);
public
property machDatei: string
read _machDatei
@@ -78,9 +82,6 @@ type
end;
function quellersetzung(var worin: string; quelle, inputfile: string): boolean;
-procedure sammleDateien(wo: string; rekursiv: boolean; ignoriere: array of tRegExpr; var dats: tDateienMitDaten);
-procedure zieleHinzufuegen(var ziele: tDateienMitDaten; ziel,quelle,inputfile: string; var dats: tDateienMitDaten);
-procedure findeMehrZiele(var ziele: tDateienMitDaten; zieleFkt: tStringList; quelle,inputfile: string; var dats: tDateienMitDaten);
implementation
@@ -343,6 +344,9 @@ begin
for i:=0 to length(_dats)-1 do
_dats[i].free;
setlength(_dats,0);
+ for i:=0 to length(_ign)-1 do
+ _ign[i].free;
+ setlength(_ign,0);
inherited destroy;
end;
@@ -367,27 +371,20 @@ var
f: tMyStringList;
s: string;
na: tAbhaengigkeit;
- ignoriere: array of tRegExpr;
rek: boolean;
posi: longint;
wasWar,wasIst: tZeilenTyp;
procedure aufraeumen;
-var
- ii: longint;
begin
f.free;
na.free;
- for ii:=0 to length(ignoriere)-1 do
- ignoriere[ii].free;
- setlength(ignoriere,0);
end;
begin
result:=false;
na:=tAbhaengigkeit.create;
- setlength(ignoriere,0);
wasWar:=ztSuche;
f:=tMyStringList.create;
f.loadFromFile(machDatei);
@@ -420,21 +417,25 @@ begin
case wasIst of
ztSuche: begin
if not quellersetzung(s,'',machDatei) then begin
- writeln('Fehler: Quellersetzung in '''+s+''' fehlgeschlagen!');
+ gibAus('Fehler: Quellersetzung in '''+s+''' fehlgeschlagen!',3);
aufraeumen;
exit;
end;
- if pos('!',s)=1 then begin
- delete(s,1,1);
- s:=trim(s);
- setlength(ignoriere,length(ignoriere)+1);
- ignoriere[length(ignoriere)-1]:=tRegExpr.create;
- ignoriere[length(ignoriere)-1].expression:=s;
+ if startetMit('!',s) then begin
+ setlength(_ign,length(_ign)+1);
+ _ign[length(_ign)-1]:=tRegExpr.create;
+ _ign[length(_ign)-1].expression:=s;
end
else begin
rek:=startetMit('-r',s);
while s<>'' do
- sammleDateien(erstesArgument(s),rek,ignoriere,_dats);
+ if sammleDateien(erstesArgument(s),rek)=0 then begin
+ f.stepBack;
+ f.readln(s);
+ gibAus('Fehler: Ich habe etwas zu überwachendes nicht gefudnen ('''+s+''').',3);
+ aufraeumen;
+ exit;
+ end;
end;
end;
ztBefehl: begin
@@ -451,7 +452,7 @@ begin
na.zieleFkt.add(erstesArgument(s));
ztQuelle: begin
if not quellersetzung(s,'',machDatei) then begin
- writeln('Fehler: Quellersetzung in '''+s+''' fehlgeschlagen!');
+ gibAus('Fehler: Quellersetzung in '''+s+''' fehlgeschlagen!',3);
aufraeumen;
exit;
end;
@@ -462,7 +463,7 @@ begin
end;
if s<>'%%DATEIENDE%%' then
- writeln('Interner Fehler! Die letzte Regel wird vsl. nicht beachtet!');
+ gibAus('Interner Fehler! Die letzte Regel wird vsl. nicht beachtet!',3);
aufraeumen;
result:=true;
@@ -477,7 +478,7 @@ var
begin
result:=false;
if pruefsummenDatei='' then begin
- writeln('Leerer Name als Summendatei angegeben!');
+ gibAus('Fehler: Leerer Name als Summendatei angegeben!',3);
exit;
end;
@@ -487,7 +488,7 @@ begin
closefile(f);
end;
if not fileexists(pruefsummenDatei) then begin
- writeln('Ich bin nicht in der Lage, die bisher nicht existierende Datei '''+pruefsummenDatei+''' anzulegen!');
+ gibAus('Fehler: Ich bin nicht in der Lage, die bisher nicht existierende Datei '''+pruefsummenDatei+''' anzulegen!',3);
exit;
end;
@@ -513,7 +514,7 @@ begin
_dats[length(_dats)-1].aktuell:=aNichtVorhanden;
continue;
end;
- writeln('In der Summendatei gibt es eine Datei mit gültiger Prüfsumme, die ich nicht finden kann: '''+gutschlecht[gut][i]+'''!');
+ gibAus('Fehler: In der Summendatei gibt es eine Datei mit gültiger Prüfsumme, die ich nicht finden kann: '''+gutschlecht[gut][i]+'''!',3);
for gefunden:=false to true do
gutschlecht[gefunden].free;
exit;
@@ -525,6 +526,102 @@ begin
result:=true;
end;
+function tMach.sammleDateien(wo: string; rekursiv: boolean): longint;
+var
+ sr: tSearchRec;
+ err,i: longint;
+ weglassen: boolean;
+begin
+ result:=0;
+ err:=FindFirst(wo,fareadOnly or faHidden or faSysFile or (byte(rekursiv)*faDirectory),sr);
+ while err=0 do begin
+ weglassen:=false;
+ for i:=0 to length(_ign)-1 do
+ weglassen:=weglassen or _ign[i].exec(extractfilepath(wo)+sr.name);
+ if not weglassen then begin
+ if sr.attr and faDirectory <> 0 then begin
+ if rekursiv and
+ (sr.name<>'.') and
+ (sr.name<>'..') then
+ result:=result+sammleDateien(extractfilepath(wo)+sr.name+'/*',rekursiv);
+ end
+ else begin
+ inc(result);
+ setlength(_dats,length(_dats)+1);
+ _dats[length(_dats)-1]:=tDateiMitDatum.create;
+ _dats[length(_dats)-1].name:=extractfilepath(wo)+sr.name;
+ _dats[length(_dats)-1].aktuell:=aVeraltet;
+ end;
+ end;
+ err:=FindNext(sr);
+ end;
+ findClose(sr);
+end;
+
+procedure tMach.zieleHinzufuegen(var ziele: tDateienMitDaten; ziel,quelle: string);
+var
+ i,ebene,ende: longint;
+ s,t,u: string;
+ wasda: boolean;
+begin
+ if pos('{',ziel)=0 then begin
+ if not quellersetzung(ziel,quelle,machDatei) then exit;
+ ziel:=unescape(ziel);
+ i:=0;
+ wasda:=false;
+ while i<length(_dats) do begin
+ if bashMatch(ziel,_dats[i].name) then begin
+ wasda:=true;
+ setlength(ziele,length(ziele)+1);
+ ziele[length(ziele)-1]:=_dats[i];
+ end;
+ inc(i);
+ end;
+ if not wasda then begin
+ setlength(_dats,length(_dats)+1);
+ _dats[i]:=tDateiMitDatum.create;
+ if pos('*',ziel)=0 then _dats[i].name:=ziel
+ else _dats[i].name:='.uralt.'; // unpassende *-Muster erzeugen formal keine echte Datei
+ _dats[i].aktuell:=aNichtVorhanden;
+ setlength(ziele,length(ziele)+1);
+ ziele[length(ziele)-1]:=_dats[i];
+ end;
+ end
+ else begin
+ ende:=pos('{',ziel);
+ ebene:=1;
+ while (ebene>0) or (ziel[ende]<>'}') do begin
+ inc(ende);
+ case ziel[ende] of
+ '{': inc(ebene);
+ '}': dec(ebene);
+ end{of case};
+ end;
+ s:=copy(ziel,1,pos('{',ziel)-1);
+ t:=copy(ziel,pos('{',ziel)+1,ende-pos('{',ziel)-1);
+ u:=copy(ziel,ende+1,length(ziel));
+ if unescapedpos('..',t)>0 then begin
+ for i:=strtoint(copy(t,1,unescapedpos('..',t)-1)) to strtoint(copy(t,unescapedpos('..',t)+2,length(t))) do
+ zieleHinzufuegen(ziele,s+inttostr(i)+u,quelle);
+ end
+ else begin
+ t:=t+',';
+ while unescapedpos(',',t)>0 do begin
+ zieleHinzufuegen(ziele,s+copy(t,1,unescapedpos(',',t)-1)+u,quelle);
+ delete(t,1,unescapedpos(',',t));
+ end;
+ end;
+ end;
+end;
+
+procedure tMach.findeMehrZiele(var ziele: tDateienMitDaten; zieleFkt: tStringList; quelle: string);
+var
+ i: longint;
+begin
+ for i:=0 to zieleFkt.count-1 do
+ zieleHinzufuegen(ziele,zieleFkt[i],quelle);
+end;
+
procedure tMach.erzeugeRegeln;
var
i,j,k,l: longint;
@@ -547,7 +644,7 @@ begin
// Andernfalls müssen wir schauen, ob es zu dem Ziel / den Zielen
// der Quelle schon eine Regel gibt.
setlength(tmpZiele,0);
- findeMehrZiele(tmpZiele,_oriAbh[i].zieleFkt,_dats[j].name,machDatei,_dats);
+ findeMehrZiele(tmpZiele,_oriAbh[i].zieleFkt,_dats[j].name);
if length(tmpZiele)=0 then begin
gibAus('Fehler: Keine Ziele für Abhängigkeit!',3);
@@ -609,7 +706,7 @@ begin
neues:=false;
for i:=_mglAbh.count-1 downto 0 do begin
for j:=0 to length(_mglAbh[i].quellen)-1 do
- findeMehrZiele(_mglAbh[i].ziele,_mglAbh[i].zieleFkt,_mglAbh[i].quellen[j].name,machDatei,_dats);
+ findeMehrZiele(_mglAbh[i].ziele,_mglAbh[i].zieleFkt,_mglAbh[i].quellen[j].name);
if length(_mglAbh[i].ziele)=0 then begin // immer noch keine ziele
gibAus('Warnung: Keine Ziele für diese Abhängigkeit!',3);
gibAus('quellen:',3);
@@ -860,99 +957,5 @@ begin
end;
end;
-procedure sammleDateien(wo: string; rekursiv: boolean; ignoriere: array of tRegExpr; var dats: tDateienMitDaten);
-var
- sr: tSearchRec;
- err,i: longint;
- weglassen: boolean;
-begin
- err:=FindFirst(wo,fareadOnly or faHidden or faSysFile or (byte(rekursiv)*faDirectory),sr);
- while err=0 do begin
- weglassen:=false;
- for i:=0 to length(ignoriere)-1 do
- weglassen:=weglassen or ignoriere[i].exec(extractfilepath(wo)+sr.name);
- if not weglassen then begin
- if sr.attr and faDirectory <> 0 then begin
- if rekursiv and
- (sr.name<>'.') and
- (sr.name<>'..') then
- sammleDateien(extractfilepath(wo)+sr.name+'/*',rekursiv,ignoriere,dats);
- end
- else begin
- setlength(dats,length(dats)+1);
- dats[length(dats)-1]:=tDateiMitDatum.create;
- dats[length(dats)-1].name:=extractfilepath(wo)+sr.name;
- dats[length(dats)-1].aktuell:=aVeraltet;
- end;
- end;
- err:=FindNext(sr);
- end;
- findClose(sr);
-end;
-
-procedure zieleHinzufuegen(var ziele: tDateienMitDaten; ziel,quelle,inputfile: string; var dats: tDateienMitDaten);
-var
- i,ebene,ende: longint;
- s,t,u: string;
- wasda: boolean;
-begin
- if pos('{',ziel)=0 then begin
- if not quellersetzung(ziel,quelle,inputfile) then exit;
- ziel:=unescape(ziel);
- i:=0;
- wasda:=false;
- while i<length(dats) do begin
- if bashMatch(ziel,dats[i].name) then begin
- wasda:=true;
- setlength(ziele,length(ziele)+1);
- ziele[length(ziele)-1]:=dats[i];
- end;
- inc(i);
- end;
- if not wasda then begin
- setlength(dats,length(dats)+1);
- dats[i]:=tDateiMitDatum.create;
- if pos('*',ziel)=0 then dats[i].name:=ziel
- else dats[i].name:='.uralt.'; // unpassende *-Muster erzeugen formal keine echte Datei
- dats[i].aktuell:=aNichtVorhanden;
- setlength(ziele,length(ziele)+1);
- ziele[length(ziele)-1]:=dats[i];
- end;
- end
- else begin
- ende:=pos('{',ziel);
- ebene:=1;
- while (ebene>0) or (ziel[ende]<>'}') do begin
- inc(ende);
- case ziel[ende] of
- '{': inc(ebene);
- '}': dec(ebene);
- end{of case};
- end;
- s:=copy(ziel,1,pos('{',ziel)-1);
- t:=copy(ziel,pos('{',ziel)+1,ende-pos('{',ziel)-1);
- u:=copy(ziel,ende+1,length(ziel));
- if unescapedpos('..',t)>0 then begin
- for i:=strtoint(copy(t,1,unescapedpos('..',t)-1)) to strtoint(copy(t,unescapedpos('..',t)+2,length(t))) do
- zieleHinzufuegen(ziele,s+inttostr(i)+u,quelle,inputfile,dats);
- end
- else begin
- t:=t+',';
- while unescapedpos(',',t)>0 do begin
- zieleHinzufuegen(ziele,s+copy(t,1,unescapedpos(',',t)-1)+u,quelle,inputfile,dats);
- delete(t,1,unescapedpos(',',t));
- end;
- end;
- end;
-end;
-
-procedure findeMehrZiele(var ziele: tDateienMitDaten; zieleFkt: tStringList; quelle,inputfile: string; var dats: tDateienMitDaten);
-var
- i: longint;
-begin
- for i:=0 to zieleFkt.count-1 do
- zieleHinzufuegen(ziele,zieleFkt[i],quelle,inputfile,dats);
-end;
-
end.