diff options
-rw-r--r-- | Make.lps | 143 | ||||
-rw-r--r-- | dateibeziehungen.pas | 226 |
2 files changed, 273 insertions, 96 deletions
@@ -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; |