From 2fb1e0b965e8ab4563dcbf9e59b020f72cc66f84 Mon Sep 17 00:00:00 2001 From: Erich Eckner Date: Wed, 20 Dec 2017 12:01:46 +0100 Subject: besseres und saubereres regex-handling --- dateibeziehungen.pas | 60 ++++++++++++++++++---------------------------------- tools.pas | 14 ++++++++++++ 2 files changed, 35 insertions(+), 39 deletions(-) diff --git a/dateibeziehungen.pas b/dateibeziehungen.pas index e2a96b3..403ca03 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; worinIstRegex: boolean; quellen: tDateienMitDaten; momentanePosition: longint): boolean; + function quellErsetzung(var worin: string; worinIstRegex: tRegexTyp; 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; worinIstRegex: boolean; machDatei: string); +procedure allgemeineErsetzungen(var worin: string; worinIstRegex: tRegexTyp; machDatei: string); implementation @@ -317,7 +317,7 @@ begin result:=_zieles[idx]; end; -function tGenerischeAbhaengigkeit.quellErsetzung(var worin: string; worinIstRegex: boolean; quellen: tDateienMitDaten; momentanePosition: longint): boolean; +function tGenerischeAbhaengigkeit.quellErsetzung(var worin: string; worinIstRegex: tRegexTyp; quellen: tDateienMitDaten; momentanePosition: longint): boolean; var s,anfang,mitte,numStr: string; i,li,re,qNum: longint; @@ -330,30 +330,18 @@ begin else numStr:=intToStr(qNum); s:=quellen[qNum+byte(qNum<0)].name; - if worinIstRegex then // %in% - ersetzeAlleVorkommen(worin,'%in'+numStr+'%',escape(s,'\.','\')) - else - ersetzeAlleVorkommen(worin,'%in'+numStr+'%',s); + ersetzeAlleVorkommen(worin,'%in'+numStr+'%',escapeStringToRegex(s,worinIstRegex)); // %in% s:=extractfilename(s); - if worinIstRegex then // %ifile% - ersetzeAlleVorkommen(worin,'%ifile'+numStr+'%',escape(s,'\.','\')) - else - ersetzeAlleVorkommen(worin,'%ifile'+numStr+'%',s); + ersetzeAlleVorkommen(worin,'%ifile'+numStr+'%',escapeStringToRegex(s,worinIstRegex)); // %ifile% 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); - if worinIstRegex then // %basename% - ersetzeAlleVorkommen(worin,'%basename'+numStr+','+intToStr(i)+'%',escape(s,'\.','\')) - else - ersetzeAlleVorkommen(worin,'%basename'+numStr+','+intToStr(i)+'%',s); + ersetzeAlleVorkommen(worin,'%basename'+numStr+','+intToStr(i)+'%',escapeStringToRegex(s,worinIstRegex)); // %basename% end; - if worinIstRegex then // %basename% - ersetzeAlleVorkommen(worin,'%basename'+numStr+'%',escape(s,'\.','\')) - else - ersetzeAlleVorkommen(worin,'%basename'+numStr+'%',s); + ersetzeAlleVorkommen(worin,'%basename'+numStr+'%',escapeStringToRegex(s,worinIstRegex)); // %basename% end; while pos('%dirname',worin)>0 do begin // %dirname% @@ -391,9 +379,7 @@ begin mitte:=mitte+'/'+erstesArgument(s,'/',false); end; delete(mitte,1,1); - if worinIstRegex then - mitte:=escape(mitte,'\.','\'); - worin:=anfang+mitte+worin; + worin:=anfang+escapeStringToRegex(mitte,worinIstRegex)+worin; end; allgemeineErsetzungen(worin,worinIstRegex,_machDatei); // %DIRNAME% %num'...'% @@ -438,7 +424,7 @@ var begin result:=false; if pos('{',zielFkt)=0 then begin - if not quellErsetzung(zielFkt,false,quellen,quellen.count) then exit; + if not quellErsetzung(zielFkt,rtKein,quellen,quellen.count) then exit; if pos('*',zielFkt)=0 then begin zielFkt:=unescape(zielFkt); wasda:=false; @@ -544,8 +530,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,true,tmpQs,i) then begin // regex-substitution nicht erfolgreich - - idx[i]:=-1; // wird behandelt wie nie passender regex + if not quellErsetzung(s,rtFpc,tmpQs,i) then begin // regex-substitution nicht erfolgreich - + idx[i]:=-1; // wird behandelt wie nie passender regex tmpQs[i]:=nil; dec(i); continue; @@ -605,7 +591,7 @@ begin es.last.ziele.add(ziele[i][j]); for j:=0 to befehleFkt.count-1 do begin s:=befehleFkt[j]; - if quellErsetzung(s,false,quellen[i],quellen[i].count) then + if quellErsetzung(s,rtKein,quellen[i],quellen[i].count) then es.last.befehle.add(s); end; if es.last.befehle.count=0 then @@ -620,12 +606,13 @@ begin // sha512summen erneuern s:='sed "'; for j:=0 to quellen[i].count-1 do - s:=s+'/\s'+escape(quellen[i][j].name,'./','\')+'\$/d; '; + s:=s+'/\s'+escapeStringToRegex(escape(quellen[i][j].name,'$','\'),rtShell,'"/')+'\$/d; '; for j:=0 to ziele[i].count-1 do - s:=s+'/\s'+escape(ziele[i][j].name,'./','\')+'\$/d; '; - s:=s+'" -i "'+_pruefSummenDatei+'"'; + s:=s+'/\s'+escapeStringToRegex(escape(ziele[i][j].name,'$','\'),rtShell,'"/')+'\$/d; '; + s:=s+'" -i "'+escape(_pruefSummenDatei,'"\','\')+'"'; es.last.befehle.add(s); s:='sha512sum'; + neuSums.clear; for j:=0 to quellen[i].count-1 do neuSums.add(quellen[i][j].name); for j:=0 to ziele[i].count-1 do @@ -634,7 +621,7 @@ begin neuSums.uniq('-'); for j:=0 to neuSums.count-1 do s:=s+' "'+escape(neuSums[j],'"\','\')+'"'; - s:=s+' >> '+_pruefSummenDatei; + s:=s+' >> "'+escape(_pruefSummenDatei,'"\','\')+'"'; es.last.befehle.add(s); end; end; @@ -825,7 +812,7 @@ begin case wasIst of ztSuche: begin - allgemeineErsetzungen(s,false,_machDatei); + allgemeineErsetzungen(s,rtKein,_machDatei); if startetMit('!',s) then begin setLength(_ign,length(_ign)+1); _ign[length(_ign)-1]:=tRegExpr.create; @@ -1087,7 +1074,7 @@ end; // allgemeine Funktionen -procedure allgemeineErsetzungen(var worin: string; worinIstRegex: boolean; machDatei: string); +procedure allgemeineErsetzungen(var worin: string; worinIstRegex: tRegexTyp; machDatei: string); var i: longint; s,anfang,mitte: string; @@ -1095,10 +1082,7 @@ begin s:=extractFilePath(machDatei); if rightStr(s,1)='/' then delete(s,length(s),1); - if worinIstRegex then - ersetzeAlleVorkommen(worin,'%DIRNAME%',escape(s,'\.','\')) - else - ersetzeAlleVorkommen(worin,'%DIRNAME%',s); + ersetzeAlleVorkommen(worin,'%DIRNAME%',escapeStringToRegex(s,worinIstRegex)); while pos('%num''',worin)>0 do begin anfang:=erstesArgument(worin,'%num'''); mitte:=erstesArgument(worin,'''%'); @@ -1112,9 +1096,7 @@ begin delete(mitte,1,i); break; end; - if worinIstRegex then - mitte:=escape(s,'\.','\'); - worin:=anfang+mitte+worin; + worin:=anfang+escapeStringToRegex(mitte,worinIstRegex)+worin; end; end; diff --git a/tools.pas b/tools.pas index 7a62703..7c7f96d 100644 --- a/tools.pas +++ b/tools.pas @@ -9,6 +9,7 @@ uses type tAktualitaet = (aNichtVorhanden,aVeraltet,aAktuell,aWirdErneuert); + tRegexTyp = (rtKein,rtFpc,rtShell); tMyStringListBArray = array[boolean] of tMyStringList; tSummenDatei = record name: string; @@ -43,6 +44,7 @@ procedure testeObBefehlLokal(bef, ordner: string; dateiListe: tMyStringList; lok function extrahiereAlleDateien(woraus: string; dateiListe: tMyStringList): tMyStringList; function unescape(s: string): string; function escape(s,toe: string; ec: char): string; +function escapeStringToRegex(s: string; typ: tRegexTyp; extras: string = ''): string; inline; procedure ersetzeAlleVorkommen(var worin: string; was,wodurch: string); // Routinen für sha512-Prüfsummen @@ -363,6 +365,18 @@ begin end; end; +function escapeStringToRegex(s: string; typ: tRegexTyp; extras: string = ''): string; +begin + case typ of + rtKein: + result:=s; + rtFpc: + result:=escape(s,'\.[+^$'+extras,'\'); + rtShell: + result:=escape(s,'\.[^$'+extras,'\'); + end{of case}; +end; + procedure ersetzeAlleVorkommen(var worin: string; was,wodurch: string); begin while pos(was,worin)>0 do begin -- cgit v1.2.3-54-g00ecf