summaryrefslogtreecommitdiff
path: root/closures/compiler/utils/usubst.pp
diff options
context:
space:
mode:
Diffstat (limited to 'closures/compiler/utils/usubst.pp')
-rw-r--r--closures/compiler/utils/usubst.pp109
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.