diff options
Diffstat (limited to 'closures/compiler/utils/usubst.pp')
-rw-r--r-- | closures/compiler/utils/usubst.pp | 109 |
1 files changed, 109 insertions, 0 deletions
diff --git a/closures/compiler/utils/usubst.pp b/closures/compiler/utils/usubst.pp new file mode 100644 index 0000000000..cf553ae373 --- /dev/null +++ b/closures/compiler/utils/usubst.pp @@ -0,0 +1,109 @@ +{$mode objfpc} +{$H+} +{ + This file is part of Free Pascal build tools + Copyright (c) 2005 by Michael Van Canneyt + + Implements string substitutions + + See the file COPYING.FPC, included in this distribution, + for details about the copyright. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + + **********************************************************************} +unit usubst; + +interface + +uses SysUtils,Classes; + +// Add N=V pair to list. +Procedure AddToList(List : TStrings; Const N,V : String); +// Split NV to N/V and call AddToList +Function AddPair(List : TStrings; Const NV : String) : Boolean; +// Perform substitutions in S, from List. +Function DoSubStitutions(List : TStrings; Var S : String) : Integer; + +implementation + +Procedure AddToList(List : TStrings; Const N,V : String); + +var + I : Integer; + +begin + I:=List.IndexOfName(N); + If (V='') then + begin + If (I<>-1) then + List.Delete(I) + end + else + begin + If (I=-1) then + List.Add(N+'='+V) + else + List[I]:=N+'='+V; + end; +end; + +Function AddPair(List : TStrings; Const NV : String) : Boolean; + +Var + P : Integer; + N,V : string; + +begin + P:=Pos('=',NV); + Result:=(P<>0); + If Result then + begin + V:=NV; + N:=Copy(V,1,P-1); + Delete(V,1,P); + AddToList(List,N,V); + end; +end; + +Function DoSubstitutions(List : TStrings; Var S : String) : Integer; + +Var + N,T : String; + P : Integer; + +begin + Result:=0; + T:=S; + S:=''; + P:=Pos('%',T); + While (P>0) do + begin + S:=S+Copy(T,1,P-1); + Delete(T,1,P); + If (Length(T)>0) then + if (T[1]='%') then + begin + S:=S+'%'; + Delete(T,1,1); + end + else + begin + P:=Pos('%',T); + If (P=0) then + S:=S+'%' + else + begin + N:=Copy(T,1,P-1); + Delete(T,1,P); + S:=S+List.Values[N]; + end; + end; + P:=Pos('%',T); + end; + S:=S+T; +end; + +end. |