summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorErich Eckner <git@eckner.net>2015-07-24 13:26:25 +0200
committerErich Eckner <git@eckner.net>2015-07-24 13:26:25 +0200
commit7aeaad30b709b6776ccfc3206333dbb3eff14f61 (patch)
treeeff8e17a80b7beaa9b73e52a9d919c48bc1ba6a5
parent823e217670098264099da7efa91d87695884ac18 (diff)
downloadunits-7aeaad30b709b6776ccfc3206333dbb3eff14f61.tar.xz
mystringlistunit.pas expandMacros aufgeraeumt und um shellSubst-Beachtung erweitert
-rw-r--r--mystringlistunit.pas255
1 files changed, 141 insertions, 114 deletions
diff --git a/mystringlistunit.pas b/mystringlistunit.pas
index 398e86d..fe6283c 100644
--- a/mystringlistunit.pas
+++ b/mystringlistunit.pas
@@ -5,7 +5,7 @@ unit mystringlistunit;
interface
uses
- Classes, SysUtils, RegExpr, Process, Math, lowlevelunit, protokollunit;
+ Classes, SysUtils, RegExpr, Process, Math, lowlevelunit, protokollunit, systemunit;
type
tMyStringlist = class;
@@ -226,10 +226,10 @@ begin
end;
function tMyStringlist.unfoldMacros: boolean;
-var i,j,k,l,Ebene: longint;
- s,t,u,v: string;
- SchleifenInhalt: tMyStringlist;
- istWahr,gefunden: boolean;
+var i,j,k,l,Ebene: longint;
+ s,t,u,v: string;
+ SchleifenInhalt: tMyStringlist;
+ istWahr,gefunden,wasGefunden: boolean;
const binops: array[0..8] of string =
('<=','>=','<>','≤','≥','=','≠','<','>');
begin
@@ -247,137 +247,164 @@ begin
inc(i);
end;
- i:=0;
- while i<count do begin // Übersprünge überspringen, alles nach 'Dateiende' löschen
- s:=self[i];
- if startetMit('!überspringe:',s) then begin
- for j:=0 to strtoint(s) do
- delete(i);
- continue;
- end;
+ repeat
+ wasGefunden:=false;
+
+ i:=0;
+ while i<count do begin // Übersprünge überspringen, alles nach 'Dateiende' löschen
+ s:=self[i];
+ if startetMit('!überspringe:',s) then begin
+ for j:=0 to strtoint(s) do
+ delete(i);
+ continue;
+ end;
- if s='Dateiende' then begin
+ if s='Dateiende' then begin
+ inc(i);
+ while i<count do
+ delete(i);
+ continue;
+ end;
inc(i);
- while i<count do
- delete(i);
- continue;
end;
- inc(i);
- end;
- i:=0;
- while i<count do begin // Schleifen ausrollen
- s:=self[i];
- if startetMit('!Schleife:',s) then begin
- l:=i;
- delete(i);
- t:=erstesArgument(s,':');
- if (length(t)=0) or (t[1]<>'$') then exit;
-
- SchleifenInhalt:=tMyStringlist.create; // Schleifenkörper merken
- Ebene:=0;
- while (i<Count) and ((Ebene<>0) or (self[i]<>'!Schleifenende')) do begin
- SchleifenInhalt.Add(self[i]);
- if self[i]='!Schleifenende' then dec(Ebene);
- if pos('!Schleife:',self[i])=1 then inc(Ebene);
+ i:=0;
+ while i<count do begin // Schleifen ausrollen
+ s:=self[i];
+ if startetMit('!Schleife:',s) then begin
+ wasGefunden:=true;
+ l:=i;
+ delete(i);
+ t:=erstesArgument(s,':');
+ if (length(t)=0) or (t[1]<>'$') then exit;
+
+ SchleifenInhalt:=tMyStringlist.create; // Schleifenkörper merken
+ Ebene:=0;
+ while (i<Count) and ((Ebene<>0) or (self[i]<>'!Schleifenende')) do begin
+ SchleifenInhalt.Add(self[i]);
+ if self[i]='!Schleifenende' then dec(Ebene);
+ if pos('!Schleife:',self[i])=1 then inc(Ebene);
+ delete(i);
+ end;
delete(i);
- end;
- delete(i);
- while length(s)>0 do begin // Schleifenzähler laufen lassen
- u:=erstesArgument(s);
- for j:=0 to SchleifenInhalt.Count-1 do begin // Schleifenkörper ...
- v:=SchleifenInhalt[j];
- k:=length(v);
- while (pos(t,v)>0) and (k>0) do begin // ... nach Ersetzung ...
- v:=copy(v,1,pos(t,v)-1)+u+copy(v,pos(t,v)+length(t),length(v));
- dec(k);
+ while length(s)>0 do begin // Schleifenzähler laufen lassen
+ u:=erstesArgument(s);
+ for j:=0 to SchleifenInhalt.Count-1 do begin // Schleifenkörper ...
+ v:=SchleifenInhalt[j];
+ k:=length(v);
+ while (pos(t,v)>0) and (k>0) do begin // ... nach Ersetzung ...
+ v:=copy(v,1,pos(t,v)-1)+u+copy(v,pos(t,v)+length(t),length(v));
+ dec(k);
+ end;
+ insert(i,v); // ... kopieren
+ inc(i);
end;
- insert(i,v); // ... kopieren
- inc(i);
end;
- end;
- SchleifenInhalt.free;
- i:=l;
- continue;
+ SchleifenInhalt.free;
+ i:=l;
+ continue;
+ end;
+ self[i]:=s;
+ inc(i);
end;
- self[i]:=s;
- inc(i);
- end;
-
- i:=0;
- while i<count do begin // Bedingungen auswerten
- s:=self[i];
- if startetMit('?',s) then begin
- t:=erstesArgument(s,':');
- gefunden:=false;
- for j:=0 to length(binops)-1 do
- if pos(binops[j],t)>0 then begin
- gefunden:=true;
- u:=trim(copy(t,1,pos(binops[j],t)-1));
- _del(t,1,pos(binops[j],t)+length(binops[j])-1);
- t:=trim(t);
- case binops[j] of
- '≤','<=': istWahr:=strtofloat(u)<=strtofloat(t);
- '≥','>=': istWahr:=strtofloat(u)>=strtofloat(t);
- '=':
- try
- istWahr:=strtofloat(u)=strtofloat(t);
- except
- istWahr:=u=t;
- end;
- '≠','<>':
- try
- istWahr:=strtofloat(u)<>strtofloat(t);
- except
- istWahr:=u<>t;
+ if wasGefunden then continue;
+
+ i:=0;
+ while i<count do begin // Bedingungen auswerten
+ s:=self[i];
+ if startetMit('?',s) then begin
+ wasGefunden:=true;
+ t:=erstesArgument(s,':');
+ gefunden:=false;
+ for j:=0 to length(binops)-1 do
+ if pos(binops[j],t)>0 then begin
+ gefunden:=true;
+ u:=trim(copy(t,1,pos(binops[j],t)-1));
+ _del(t,1,pos(binops[j],t)+length(binops[j])-1);
+ t:=trim(t);
+ case binops[j] of
+ '≤','<=': istWahr:=strtofloat(u)<=strtofloat(t);
+ '≥','>=': istWahr:=strtofloat(u)>=strtofloat(t);
+ '=':
+ try
+ istWahr:=strtofloat(u)=strtofloat(t);
+ except
+ istWahr:=u=t;
+ end;
+ '≠','<>':
+ try
+ istWahr:=strtofloat(u)<>strtofloat(t);
+ except
+ istWahr:=u<>t;
+ end;
+ '<': istWahr:=strtofloat(u)<strtofloat(t);
+ '>': istWahr:=strtofloat(u)>strtofloat(t);
+ else begin
+ if assigned(prot) then prot.schreibe('Operator '''+binops[j]+''' ist nicht implementiert!',true)
+ else gibAus('Operator '''+binops[j]+''' ist nicht implementiert!',3);
+ exit;
end;
- '<': istWahr:=strtofloat(u)<strtofloat(t);
- '>': istWahr:=strtofloat(u)>strtofloat(t);
- else begin
- if assigned(prot) then prot.schreibe('Operator '''+binops[j]+''' ist nicht implementiert!',true)
- else gibAus('Operator '''+binops[j]+''' ist nicht implementiert!',3);
- exit;
- end;
- end{of case};
- if not istWahr then
- delete(i);
- break;
+ end{of case};
+ if not istWahr then
+ delete(i);
+ break;
+ end;
+ if not gefunden then begin
+ if assigned(prot) then prot.schreibe('Ich kann keinen gültigen Operator in Bedingung '''+t+''' finden!',true)
+ else gibAus('Ich kann keinen gültigen Operator in Bedingung '''+t+''' finden!',3);
+ exit;
end;
- if not gefunden then begin
- if assigned(prot) then prot.schreibe('Ich kann keinen gültigen Operator in Bedingung '''+t+''' finden!',true)
- else gibAus('Ich kann keinen gültigen Operator in Bedingung '''+t+''' finden!',3);
- exit;
+ if not istWahr then
+ continue;
+ self[i]:=s;
end;
- if not istWahr then
- continue;
- self[i]:=s;
+ inc(i);
end;
- inc(i);
- end;
-
- i:=0;
- while i<count do begin // nochmals Übersprünge überspringen und alles nach 'Dateiende' ignorieren
- s:=self[i];
- if startetMit('!überspringe:',s) then begin
- for j:=0 to strtoint(s) do
+ if wasGefunden then continue;
+
+ i:=count-1;
+ while i>=0 do begin // Substitutionen auswerten
+ s:=self[i];
+ if startetMit('!setze',s) then begin
+ wasGefunden:=true;
+ t:=erstesArgument(s,':');
+ if pos('$',t)<>1 then begin
+ prot.schreibe('ungültiger Variablenname '''+t+''' für Ersetzung!',true);
+ exit;
+ end;
delete(i);
- continue;
+ for j:=i to count-1 do begin
+ u:=self[i];
+ k:=length(u);
+ while (pos(t,u)>0) and (k>0) do begin // ... nach Ersetzung ...
+ u:=copy(u,1,pos(t,u)-1)+s+copy(u,pos(t,u)+length(t),length(u));
+ dec(k);
+ end;
+ self[i]:=u;
+ end;
+ end
+ else
+ dec(i);
end;
+ if wasGefunden then continue;
- if s='Dateiende' then begin
- inc(i);
- while i<count do
- delete(i);
- continue;
+ for i:=0 to count-1 do begin // Shellvariablen auswerten
+ s:=shellSubst(self[i]);
+ if s<>self[i] then begin
+ wasGefunden:=true;
+ self[i]:=s;
+ end;
end;
- inc(i);
- end;
+
+ until not wasGefunden;
result:=true;
end;
+// allgemeine Funktionen *******************************************************
+
procedure _del(var s: string; p,c: longint);
begin
delete(s,p,c);