summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorErich Eckner <git@eckner.net>2017-12-20 12:01:46 +0100
committerErich Eckner <git@eckner.net>2017-12-20 12:01:46 +0100
commit2fb1e0b965e8ab4563dcbf9e59b020f72cc66f84 (patch)
treec065a4420bb6161744d2bf963bad44e2b0616ea9
parent177219f65a19cd16bf6222bd43a459c849df929f (diff)
downloadMake-2fb1e0b965e8ab4563dcbf9e59b020f72cc66f84.tar.xz
besseres und saubereres regex-handling
-rw-r--r--dateibeziehungen.pas60
-rw-r--r--tools.pas14
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 (i<length(idx)) do begin // alle Stellen von idx müssen gefüllt werden!
if i<>lastI 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