mirror of
				https://gitlab.com/freepascal.org/fpc/source.git
				synced 2025-10-31 07:31:49 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			110 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			ObjectPascal
		
	
	
	
	
	
			
		
		
	
	
			110 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			ObjectPascal
		
	
	
	
	
	
| {$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.
 | 
