From 177219f65a19cd16bf6222bd43a459c849df929f Mon Sep 17 00:00:00 2001 From: Erich Eckner Date: Mon, 18 Dec 2017 12:47:57 +0100 Subject: dateibeziehungen.pas: substituiere Regex-bewusst --- Make.lps | 105 +++++++++++++++++++++++++-------------------------- dateibeziehungen.pas | 49 ++++++++++++++++-------- 2 files changed, 86 insertions(+), 68 deletions(-) diff --git a/Make.lps b/Make.lps index 4541002..34f230b 100644 --- a/Make.lps +++ b/Make.lps @@ -9,23 +9,22 @@ - + - + - - - - + + + @@ -34,18 +33,19 @@ - + + - - - - + + + + @@ -65,7 +65,7 @@ - + @@ -134,122 +134,121 @@ - + - + - + - + - - + + - + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - + - + - + - + - + - + - + - + - + - - - + + - + - + - - + + - - + + diff --git a/dateibeziehungen.pas b/dateibeziehungen.pas index 67e11e6..e2a96b3 100644 --- a/dateibeziehungen.pas +++ b/dateibeziehungen.pas @@ -61,7 +61,7 @@ type _dats: tDateienMitDaten; function rQuellen(idx: longint): tDateienMitDaten; function rZiele(idx: longint): tDateienMitDaten; - function quellErsetzung(var worin: string; quellen: tDateienMitDaten; momentanePosition: longint): boolean; + function quellErsetzung(var worin: string; worinIstRegex: boolean; quellen: tDateienMitDaten; momentanePosition: longint): boolean; function zieleHinzufuegen(ziele, quellen: tDateienMitDaten; zielFkt: string): boolean; function findeMehrZiele(ziele, quellen: tDateienMitDaten): boolean; function matchCount: longint; @@ -111,7 +111,7 @@ type function anzDats: longint; inline; end; -procedure allgemeineErsetzungen(var worin: string; machDatei: string); +procedure allgemeineErsetzungen(var worin: string; worinIstRegex: boolean; machDatei: string); implementation @@ -317,7 +317,7 @@ begin result:=_zieles[idx]; end; -function tGenerischeAbhaengigkeit.quellErsetzung(var worin: string; quellen: tDateienMitDaten; momentanePosition: longint): boolean; +function tGenerischeAbhaengigkeit.quellErsetzung(var worin: string; worinIstRegex: boolean; quellen: tDateienMitDaten; momentanePosition: longint): boolean; var s,anfang,mitte,numStr: string; i,li,re,qNum: longint; @@ -330,18 +330,30 @@ begin else numStr:=intToStr(qNum); s:=quellen[qNum+byte(qNum<0)].name; - ersetzeAlleVorkommen(worin,'%in'+numStr+'%',s); // %in% + if worinIstRegex then // %in% + ersetzeAlleVorkommen(worin,'%in'+numStr+'%',escape(s,'\.','\')) + else + ersetzeAlleVorkommen(worin,'%in'+numStr+'%',s); s:=extractfilename(s); - ersetzeAlleVorkommen(worin,'%ifile'+numStr+'%',s); // %ifile% + if worinIstRegex then // %ifile% + ersetzeAlleVorkommen(worin,'%ifile'+numStr+'%',escape(s,'\.','\')) + else + ersetzeAlleVorkommen(worin,'%ifile'+numStr+'%',s); i:=0; while pos('.',s)>0 do begin while rightStr(s,1)<>'.' do delete(s,length(s),1); delete(s,length(s),1); inc(i); - ersetzeAlleVorkommen(worin,'%basename'+numStr+','+intToStr(i)+'%',s); // %basename% + if worinIstRegex then // %basename% + ersetzeAlleVorkommen(worin,'%basename'+numStr+','+intToStr(i)+'%',escape(s,'\.','\')) + else + ersetzeAlleVorkommen(worin,'%basename'+numStr+','+intToStr(i)+'%',s); end; - ersetzeAlleVorkommen(worin,'%basename'+numStr+'%',s); // %basename% + if worinIstRegex then // %basename% + ersetzeAlleVorkommen(worin,'%basename'+numStr+'%',escape(s,'\.','\')) + else + ersetzeAlleVorkommen(worin,'%basename'+numStr+'%',s); end; while pos('%dirname',worin)>0 do begin // %dirname% @@ -379,10 +391,12 @@ begin mitte:=mitte+'/'+erstesArgument(s,'/',false); end; delete(mitte,1,1); + if worinIstRegex then + mitte:=escape(mitte,'\.','\'); worin:=anfang+mitte+worin; end; - allgemeineErsetzungen(worin,_machDatei); // %DIRNAME% %num'...'% + allgemeineErsetzungen(worin,worinIstRegex,_machDatei); // %DIRNAME% %num'...'% result:=false; tmpRE:=tRegExpr.create; @@ -424,7 +438,7 @@ var begin result:=false; if pos('{',zielFkt)=0 then begin - if not quellErsetzung(zielFkt,quellen,quellen.count) then exit; + if not quellErsetzung(zielFkt,false,quellen,quellen.count) then exit; if pos('*',zielFkt)=0 then begin zielFkt:=unescape(zielFkt); wasda:=false; @@ -530,8 +544,8 @@ begin while (i>=0) and (ilastI then begin // wir betrachten eine neue Stelle, s:=quellenREs[i]; // daher ist der RegEx nicht mehr aktuell - if not quellErsetzung(s,tmpQs,i) then begin // regex-substitution nicht erfolgreich - - idx[i]:=-1; // wird behandelt wie nie passender regex + if not quellErsetzung(s,true,tmpQs,i) then begin // regex-substitution nicht erfolgreich - + idx[i]:=-1; // wird behandelt wie nie passender regex tmpQs[i]:=nil; dec(i); continue; @@ -591,7 +605,7 @@ begin es.last.ziele.add(ziele[i][j]); for j:=0 to befehleFkt.count-1 do begin s:=befehleFkt[j]; - if quellErsetzung(s,quellen[i],quellen[i].count) then + if quellErsetzung(s,false,quellen[i],quellen[i].count) then es.last.befehle.add(s); end; if es.last.befehle.count=0 then @@ -811,7 +825,7 @@ begin case wasIst of ztSuche: begin - allgemeineErsetzungen(s,_machDatei); + allgemeineErsetzungen(s,false,_machDatei); if startetMit('!',s) then begin setLength(_ign,length(_ign)+1); _ign[length(_ign)-1]:=tRegExpr.create; @@ -1073,7 +1087,7 @@ end; // allgemeine Funktionen -procedure allgemeineErsetzungen(var worin: string; machDatei: string); +procedure allgemeineErsetzungen(var worin: string; worinIstRegex: boolean; machDatei: string); var i: longint; s,anfang,mitte: string; @@ -1081,7 +1095,10 @@ begin s:=extractFilePath(machDatei); if rightStr(s,1)='/' then delete(s,length(s),1); - ersetzeAlleVorkommen(worin,'%DIRNAME%',s); + if worinIstRegex then + ersetzeAlleVorkommen(worin,'%DIRNAME%',escape(s,'\.','\')) + else + ersetzeAlleVorkommen(worin,'%DIRNAME%',s); while pos('%num''',worin)>0 do begin anfang:=erstesArgument(worin,'%num'''); mitte:=erstesArgument(worin,'''%'); @@ -1095,6 +1112,8 @@ begin delete(mitte,1,i); break; end; + if worinIstRegex then + mitte:=escape(s,'\.','\'); worin:=anfang+mitte+worin; end; end; -- cgit v1.2.3-54-g00ecf