diff options
author | Erich Eckner <git@eckner.net> | 2015-07-24 13:26:25 +0200 |
---|---|---|
committer | Erich Eckner <git@eckner.net> | 2015-07-24 13:26:25 +0200 |
commit | 7aeaad30b709b6776ccfc3206333dbb3eff14f61 (patch) | |
tree | eff8e17a80b7beaa9b73e52a9d919c48bc1ba6a5 | |
parent | 823e217670098264099da7efa91d87695884ac18 (diff) | |
download | units-7aeaad30b709b6776ccfc3206333dbb3eff14f61.tar.xz |
mystringlistunit.pas expandMacros aufgeraeumt und um shellSubst-Beachtung erweitert
-rw-r--r-- | mystringlistunit.pas | 255 |
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); |