Componentes.Terceros.jvcl/official/3.32/devtools/JvclVclClx/VclClxCvtUtils.pas

348 lines
8.5 KiB
ObjectPascal

{-----------------------------------------------------------------------------
The contents of this file are subject to the Mozilla Public License
Version 1.1 (the "License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at
http://www.mozilla.org/MPL/MPL-1.1.html
Software distributed under the License is distributed on an "AS IS" basis,
WITHOUT WARRANTY OF ANY KIND, either expressed or implied. See the License for
the specific language governing rights and limitations under the License.
The Original Code is: VclClxCvtUtils.pas, released on 2004-05-19.
The Initial Developer of the Original Code is Andreas Hausladen
(Andreas dott Hausladen att gmx dott de)
Portions created by Andreas Hausladen are Copyright (C) 2004 Andreas Hausladen.
All Rights Reserved.
Contributor(s): -
You may retrieve the latest version of this file at the Project JEDI's JVCL
home page, located at http://jvcl.sourceforge.net
Known Issues:
-----------------------------------------------------------------------------}
// $Id: VclClxCvtUtils.pas 10610 2006-05-19 13:35:08Z elahn $
unit VclClxCvtUtils;
interface
uses
SysUtils, Classes, Contnrs;
type
TUnitReplaceItem = class(TObject)
UnitName: string;
ReplaceName: string;
end;
TUnitReplaceList = class(TObject)
private
FItems: TObjectList;
FNames: TStringList;
public
constructor Create;
destructor Destroy; override;
procedure Add(const AUnitName, AReplaceName: string);
function Find(const AUnitName: string): string;
procedure AddFromIni(const Filename: string);
end;
TConditionStackItem = class(TObject)
private
FCondition: string;
FNegative: Boolean;
FOpenStartIndex, FOpenEndIndex: Integer;
FElseStartIndex, FElseEndIndex: Integer;
FInElse: Boolean;
FOpenLine: Integer;
FElseLine: Integer;
function GetInFalse: Boolean;
function GetInTrue: Boolean;
function GetHasElse: Boolean;
public
constructor Create(const ACondition: string; ANegative: Boolean);
function IsIn: Boolean;
// True: InTrue; False: InFalse
property Condition: string read FCondition;
property Negative: Boolean read FNegative;
property InElse: Boolean read FInElse;
property HasElse: Boolean read GetHasElse;
property OpenStartIndex: Integer read FOpenStartIndex;
property OpenEndIndex: Integer read FOpenEndIndex;
property OpenLine: Integer read FOpenLine;
property ElseStartIndex: Integer read FElseStartIndex;
property ElseEndIndex: Integer read FElseEndIndex;
property ElseLine: Integer read FElseLine;
property InTrue: Boolean read GetInTrue;
property InFalse: Boolean read GetInFalse;
end;
TConditionStack = class(TObject)
private
FStack: TObjectList;
function GetCurrent: TConditionStackItem;
function GetOpenCount: Integer;
public
constructor Create;
destructor Destroy; override;
procedure Enter(const Condition: string; StartIndex, EndIndex, Line: Integer);
procedure EnterNot(const Condition: string; StartIndex, EndIndex, Line: Integer);
procedure GoElse(StartIndex, EndIndex, Line: Integer);
procedure Leave;
function IsIn(const Condition: string): Integer;
{ returns 0: not open; 1: inTrue; -1: inFalse }
property Current: TConditionStackItem read GetCurrent;
property OpenCount: Integer read GetOpenCount;
end;
TConverterStatistics = class(TObject)
private
FParsedFiles: Integer;
FWrittenFiles: Integer;
FUnitReplacements: Integer;
FErrors: TStrings;
public
constructor Create;
destructor Destroy; override;
procedure IncParsedFiles;
procedure IncWrittenFiles;
procedure IncUnitReplacements;
procedure AddError(const Msg: string);
property ParsedFiles: Integer read FParsedFiles;
property WrittenFiles: Integer read FWrittenFiles;
property UnitReplacements: Integer read FUnitReplacements;
property Errors: TStrings read FErrors;
end;
implementation
{ TUnitReplaceList }
constructor TUnitReplaceList.Create;
begin
inherited Create;
FItems := TObjectList.Create;
FNames := TStringList.Create;
FNames.Sorted := True;
FNames.Duplicates := dupError;
end;
destructor TUnitReplaceList.Destroy;
begin
FItems.Free;
FNames.Free;
inherited Destroy;
end;
procedure TUnitReplaceList.Add(const AUnitName, AReplaceName: string);
var
Item: TUnitReplaceItem;
begin
Item := TUnitReplaceItem.Create;
Item.UnitName := AUnitName;
Item.ReplaceName := AReplaceName;
FItems.Insert(FNames.Add(AUnitName), Item);
end;
function TUnitReplaceList.Find(const AUnitName: string): string;
var
Index: Integer;
begin
if FNames.Find(AUnitName, Index) then
Result := TUnitReplaceItem(FItems[Index]).ReplaceName
else
Result := AUnitName;
end;
procedure TUnitReplaceList.AddFromIni(const Filename: string);
var
List: TStrings;
i: Integer;
begin
List := TStringList.Create;
try
List.LoadFromFile(Filename);
for i := 0 to List.Count - 1 do
if Trim(List[i]) <> '' then
try
Add(List.Names[i], List.ValueFromIndex[i]);
except
raise Exception.CreateFmt('Duplicate items found in %s: %s',
[ExtractFileName(Filename), List[i]]);
end;
finally
List.Free;
end;
end;
{ TConditionStackItem }
constructor TConditionStackItem.Create(const ACondition: string;
ANegative: Boolean);
begin
inherited Create;
FCondition := ACondition;
FNegative := ANegative;
end;
function TConditionStackItem.GetHasElse: Boolean;
begin
Result := FElseStartIndex > 0;
end;
function TConditionStackItem.GetInFalse: Boolean;
begin
Result := not IsIn;
end;
function TConditionStackItem.GetInTrue: Boolean;
begin
Result := IsIn;
end;
function TConditionStackItem.IsIn: Boolean;
begin
Result := Negative xor not InElse;
end;
{ TConditionStack }
constructor TConditionStack.Create;
begin
inherited Create;
FStack := TObjectList.Create;
end;
destructor TConditionStack.Destroy;
begin
FStack.Free;
inherited Destroy;
end;
procedure TConditionStack.Enter(const Condition: string;
StartIndex, EndIndex, Line: Integer);
var
Item: TConditionStackItem;
begin
Item := TConditionStackItem.Create(Condition, False);
Item.FOpenStartIndex := StartIndex;
Item.FOpenEndIndex := EndIndex;
Item.FOpenLine := Line;
FStack.Add(Item);
end;
procedure TConditionStack.EnterNot(const Condition: string;
StartIndex, EndIndex, Line: Integer);
var
Item: TConditionStackItem;
begin
Item := TConditionStackItem.Create(Condition, True);
Item.FOpenStartIndex := StartIndex;
Item.FOpenEndIndex := EndIndex;
Item.FOpenLine := Line;
FStack.Add(Item);
end;
function TConditionStack.GetCurrent: TConditionStackItem;
begin
if FStack.Count > 0 then
Result := TConditionStackItem(FStack[FStack.Count - 1])
else
Result := nil;
end;
function TConditionStack.GetOpenCount: Integer;
begin
Result := FStack.Count;
end;
procedure TConditionStack.GoElse(StartIndex, EndIndex, Line: Integer);
begin
if FStack.Count > 0 then
begin
with Current do
begin
FInElse := True;
FElseStartIndex := StartIndex;
FElseEndIndex := EndIndex;
FElseLine := Line;
end;
end;
end;
function TConditionStack.IsIn(const Condition: string): Integer;
var
i: Integer;
Item: TConditionStackItem;
begin
Result := 0;
for i := FStack.Count - 1 downto 0 do
begin
Item := TConditionStackItem(FStack[i]);
if SameText(Item.Condition, Condition) then
begin
if Item.InTrue then
Result := 1
else
Result := -1;
Exit;
end;
end;
end;
procedure TConditionStack.Leave;
begin
if FStack.Count > 0 then
FStack.Delete(FStack.Count - 1);
end;
{ TConverterStatistics }
constructor TConverterStatistics.Create;
begin
inherited Create;
FErrors := TStringList.Create;
end;
destructor TConverterStatistics.Destroy;
begin
FErrors.Free;
inherited Destroy;
end;
procedure TConverterStatistics.AddError(const Msg: string);
begin
FErrors.Add(Msg);
end;
procedure TConverterStatistics.IncParsedFiles;
begin
Inc(FParsedFiles);
end;
procedure TConverterStatistics.IncWrittenFiles;
begin
Inc(FWrittenFiles);
end;
procedure TConverterStatistics.IncUnitReplacements;
begin
Inc(FUnitReplacements);
end;
end.