update to 0.6.9
This commit is contained in:
parent
5c4cd7a5b0
commit
722279aad5
|
@ -0,0 +1,221 @@
|
|||
unit Unit1;
|
||||
|
||||
interface
|
||||
|
||||
uses
|
||||
System.SysUtils, System.Types, System.UITypes, System.Classes,
|
||||
System.Variants, System.Math, System.StrUtils,
|
||||
FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.TabControl,
|
||||
FMX.Layouts, FMX.ListBox, FMX.Controls.Presentation, FMX.StdCtrls, FMX.Edit,
|
||||
FMX.EditBox, FMX.SpinBox, FMX.Menus;
|
||||
|
||||
type
|
||||
TForm1 = class(TForm)
|
||||
StyleBook1: TStyleBook;
|
||||
SaveDialog1: TSaveDialog;
|
||||
OpenDialog1: TOpenDialog;
|
||||
Layout4: TLayout;
|
||||
Button1: TButton;
|
||||
GroupBox1: TGroupBox;
|
||||
ComboBox2: TComboBox;
|
||||
Edit1: TEdit;
|
||||
SearchEditButton1: TSearchEditButton;
|
||||
Layout1: TLayout;
|
||||
GroupBox2: TGroupBox;
|
||||
Layout3: TLayout;
|
||||
VertScrollBox1: TVertScrollBox;
|
||||
GroupBox3: TGroupBox;
|
||||
Layout7: TLayout;
|
||||
Edit3: TEdit;
|
||||
SearchEditButton3: TSearchEditButton;
|
||||
ComboBox3: TComboBox;
|
||||
Label1: TLabel;
|
||||
SpinBox1: TSpinBox;
|
||||
Label2: TLabel;
|
||||
SpinBox2: TSpinBox;
|
||||
CheckBox1: TCheckBox;
|
||||
Layout2: TLayout;
|
||||
Label3: TLabel;
|
||||
SpinBox3: TSpinBox;
|
||||
GroupBox4: TGroupBox;
|
||||
Layout6: TLayout;
|
||||
GroupBox5: TGroupBox;
|
||||
Layout8: TLayout;
|
||||
Label7: TLabel;
|
||||
SpinBox7: TSpinBox;
|
||||
CheckBox5: TCheckBox;
|
||||
CheckBox3: TCheckBox;
|
||||
Label4: TLabel;
|
||||
SpinBox4: TSpinBox;
|
||||
CheckBox4: TCheckBox;
|
||||
PopupMenu1: TPopupMenu;
|
||||
MenuItem1: TMenuItem;
|
||||
GroupBox6: TGroupBox;
|
||||
Layout5: TLayout;
|
||||
Edit2: TEdit;
|
||||
Button2: TButton;
|
||||
GroupBox7: TGroupBox;
|
||||
Layout9: TLayout;
|
||||
Edit4: TEdit;
|
||||
SearchEditButton2: TSearchEditButton;
|
||||
ComboBox1: TComboBox;
|
||||
CheckBox2: TCheckBox;
|
||||
CheckBox6: TCheckBox;
|
||||
GroupBox8: TGroupBox;
|
||||
Layout10: TLayout;
|
||||
Edit5: TEdit;
|
||||
SearchEditButton4: TSearchEditButton;
|
||||
ComboBox4: TComboBox;
|
||||
procedure FormShow(Sender: TObject);
|
||||
procedure SearchEditButton1Click(Sender: TObject);
|
||||
procedure SearchEditButton3Click(Sender: TObject);
|
||||
procedure ComboBox3Change(Sender: TObject);
|
||||
procedure Button2Click(Sender: TObject);
|
||||
procedure ComboBox2Change(Sender: TObject);
|
||||
procedure Button1Click(Sender: TObject);
|
||||
procedure ComboBox1Change(Sender: TObject);
|
||||
procedure SearchEditButton2Click(Sender: TObject);
|
||||
procedure ComboBox4Change(Sender: TObject);
|
||||
procedure SearchEditButton4Click(Sender: TObject);
|
||||
private
|
||||
{ Private declarations }
|
||||
public
|
||||
{ Public declarations }
|
||||
end;
|
||||
|
||||
var
|
||||
Form1: TForm1;
|
||||
CmdStr: TArray<String>;
|
||||
|
||||
implementation
|
||||
|
||||
{$R *.fmx}
|
||||
|
||||
uses
|
||||
Unit2;
|
||||
|
||||
procedure TForm1.Button1Click(Sender: TObject);
|
||||
begin
|
||||
SetLength(CmdStr, 0);
|
||||
Insert(ParamStr(0), CmdStr, Length(CmdStr));
|
||||
Insert('precomp', CmdStr, Length(CmdStr));
|
||||
Insert('-c' + SpinBox1.Text + 'mb', CmdStr, Length(CmdStr));
|
||||
Insert('-t' + SpinBox2.Text, CmdStr, Length(CmdStr));
|
||||
if CheckBox1.IsChecked then
|
||||
Insert('-lm', CmdStr, Length(CmdStr));
|
||||
Insert('-d' + SpinBox3.Text, CmdStr, Length(CmdStr));
|
||||
if CheckBox2.IsChecked then
|
||||
Insert('-s', CmdStr, Length(CmdStr));
|
||||
if CheckBox6.IsChecked then
|
||||
Insert('-v', CmdStr, Length(CmdStr));
|
||||
Insert('-m' + Edit2.Text, CmdStr, Length(CmdStr));
|
||||
if ComboBox1.ItemIndex = 1 then
|
||||
Insert('-db', CmdStr, Length(CmdStr))
|
||||
else if ComboBox1.ItemIndex > 1 then
|
||||
Insert('-db' + Edit4.Text, CmdStr, Length(CmdStr));
|
||||
if CheckBox3.IsChecked then
|
||||
Insert('-dd' + IfThen(SpinBox4.Enabled, SpinBox4.Text, ''), CmdStr,
|
||||
Length(CmdStr));
|
||||
if CheckBox4.IsChecked then
|
||||
Insert('--compress=' + 't' + SpinBox2.Text + ':l' + SpinBox7.Text + ':hi' +
|
||||
IfThen(CheckBox5.IsChecked, '1', '0'), CmdStr, Length(CmdStr));
|
||||
Insert(Edit1.Text, CmdStr, Length(CmdStr));
|
||||
if ComboBox3.ItemIndex = 0 then
|
||||
Insert(Edit3.Text, CmdStr, Length(CmdStr));
|
||||
end;
|
||||
|
||||
procedure TForm1.Button2Click(Sender: TObject);
|
||||
begin
|
||||
Form2.Left := Form1.Left + (Form1.Width div 2) - (Form2.Width div 2);
|
||||
Form2.Top := Form1.Top + (Form1.Height div 2) - (Form2.Height div 2);
|
||||
Form2.ShowModal;
|
||||
Form2.Close;
|
||||
end;
|
||||
|
||||
procedure TForm1.ComboBox1Change(Sender: TObject);
|
||||
begin
|
||||
Edit4.Enabled := ComboBox1.ItemIndex in [2, 3];
|
||||
Edit4.Text := '';
|
||||
end;
|
||||
|
||||
procedure TForm1.ComboBox2Change(Sender: TObject);
|
||||
begin
|
||||
SearchEditButton1.Enabled := ComboBox2.ItemIndex <> 2;
|
||||
Edit1.ReadOnly := ComboBox2.ItemIndex <> 2;
|
||||
if ComboBox2.ItemIndex = 2 then
|
||||
Edit1.Text := 'http://mattmahoney.net/dc/silesia.zip'
|
||||
else
|
||||
Edit1.Text := '';
|
||||
end;
|
||||
|
||||
procedure TForm1.ComboBox3Change(Sender: TObject);
|
||||
begin
|
||||
Edit3.Enabled := ComboBox3.ItemIndex <> 1;
|
||||
end;
|
||||
|
||||
procedure TForm1.ComboBox4Change(Sender: TObject);
|
||||
begin
|
||||
Edit5.Enabled := ComboBox4.ItemIndex > 0;
|
||||
Edit5.Text := '';
|
||||
end;
|
||||
|
||||
procedure TForm1.FormShow(Sender: TObject);
|
||||
var
|
||||
I: Integer;
|
||||
begin
|
||||
for I := 0 to ComponentCount - 1 do
|
||||
if Components[I] is TSpinBox then
|
||||
TSpinBox(Components[I]).Cursor := crDefault;
|
||||
SpinBox2.Max := CPUCount * 2;
|
||||
SpinBox2.Value := Max(1, CPUCount div 2);
|
||||
end;
|
||||
|
||||
procedure TForm1.SearchEditButton1Click(Sender: TObject);
|
||||
var
|
||||
Dir: string;
|
||||
begin
|
||||
case ComboBox2.ItemIndex of
|
||||
0:
|
||||
begin
|
||||
OpenDialog1.FileName := '';
|
||||
if OpenDialog1.Execute then
|
||||
Edit1.Text := OpenDialog1.FileName;
|
||||
end;
|
||||
1:
|
||||
if SelectDirectory('', '', Dir) then
|
||||
Edit1.Text := Dir;
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TForm1.SearchEditButton2Click(Sender: TObject);
|
||||
begin
|
||||
if ComboBox1.ItemIndex = 2 then
|
||||
begin
|
||||
SaveDialog1.FileName := '';
|
||||
if SaveDialog1.Execute then
|
||||
Edit4.Text := SaveDialog1.FileName;
|
||||
end
|
||||
else if ComboBox1.ItemIndex = 3 then
|
||||
begin
|
||||
OpenDialog1.FileName := '';
|
||||
if OpenDialog1.Execute then
|
||||
Edit4.Text := OpenDialog1.FileName;
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TForm1.SearchEditButton3Click(Sender: TObject);
|
||||
begin
|
||||
SaveDialog1.FileName := '';
|
||||
if SaveDialog1.Execute then
|
||||
Edit3.Text := SaveDialog1.FileName;
|
||||
end;
|
||||
|
||||
procedure TForm1.SearchEditButton4Click(Sender: TObject);
|
||||
var
|
||||
Dir: string;
|
||||
begin
|
||||
if SelectDirectory('', '', Dir) then
|
||||
Edit5.Text := Dir;
|
||||
end;
|
||||
|
||||
end.
|
|
@ -0,0 +1,562 @@
|
|||
unit Unit2;
|
||||
|
||||
interface
|
||||
|
||||
uses
|
||||
System.SysUtils, System.Types, System.UITypes, System.Classes,
|
||||
System.Variants, System.Math, System.StrUtils,
|
||||
FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.TabControl,
|
||||
FMX.StdCtrls, FMX.Edit, FMX.EditBox, FMX.SpinBox, FMX.Controls.Presentation,
|
||||
FMX.Layouts, FMX.ListBox;
|
||||
|
||||
type
|
||||
TForm2 = class(TForm)
|
||||
TabControl1: TTabControl;
|
||||
TabItem1: TTabItem;
|
||||
TabItem2: TTabItem;
|
||||
Expander1: TExpander;
|
||||
Layout6: TLayout;
|
||||
CheckBox3: TCheckBox;
|
||||
Layout1: TLayout;
|
||||
Label4: TLabel;
|
||||
SpinBox4: TSpinBox;
|
||||
Layout2: TLayout;
|
||||
CheckBox1: TCheckBox;
|
||||
Layout3: TLayout;
|
||||
Label1: TLabel;
|
||||
SpinBox1: TSpinBox;
|
||||
Layout4: TLayout;
|
||||
CheckBox2: TCheckBox;
|
||||
Expander2: TExpander;
|
||||
Layout5: TLayout;
|
||||
CheckBox4: TCheckBox;
|
||||
Layout7: TLayout;
|
||||
Label2: TLabel;
|
||||
SpinBox2: TSpinBox;
|
||||
Layout8: TLayout;
|
||||
CheckBox5: TCheckBox;
|
||||
Layout9: TLayout;
|
||||
SpinBox3: TSpinBox;
|
||||
Layout10: TLayout;
|
||||
CheckBox6: TCheckBox;
|
||||
VertScrollBox1: TVertScrollBox;
|
||||
Layout11: TLayout;
|
||||
SpinBox5: TSpinBox;
|
||||
Layout12: TLayout;
|
||||
Label6: TLabel;
|
||||
SpinBox6: TSpinBox;
|
||||
Expander3: TExpander;
|
||||
Layout13: TLayout;
|
||||
CheckBox7: TCheckBox;
|
||||
Layout14: TLayout;
|
||||
Label7: TLabel;
|
||||
Layout15: TLayout;
|
||||
SpinBox8: TSpinBox;
|
||||
ComboBox1: TComboBox;
|
||||
Expander4: TExpander;
|
||||
Layout16: TLayout;
|
||||
CheckBox8: TCheckBox;
|
||||
Layout18: TLayout;
|
||||
SpinBox7: TSpinBox;
|
||||
CheckBox9: TCheckBox;
|
||||
Expander5: TExpander;
|
||||
Layout17: TLayout;
|
||||
CheckBox10: TCheckBox;
|
||||
Layout19: TLayout;
|
||||
SpinBox9: TSpinBox;
|
||||
CheckBox11: TCheckBox;
|
||||
Layout20: TLayout;
|
||||
CheckBox12: TCheckBox;
|
||||
Layout21: TLayout;
|
||||
SpinBox10: TSpinBox;
|
||||
CheckBox13: TCheckBox;
|
||||
Layout22: TLayout;
|
||||
CheckBox14: TCheckBox;
|
||||
Layout23: TLayout;
|
||||
SpinBox11: TSpinBox;
|
||||
CheckBox15: TCheckBox;
|
||||
Layout24: TLayout;
|
||||
CheckBox16: TCheckBox;
|
||||
Layout25: TLayout;
|
||||
SpinBox12: TSpinBox;
|
||||
CheckBox17: TCheckBox;
|
||||
Layout26: TLayout;
|
||||
CheckBox18: TCheckBox;
|
||||
Layout27: TLayout;
|
||||
SpinBox13: TSpinBox;
|
||||
CheckBox19: TCheckBox;
|
||||
Layout28: TLayout;
|
||||
CheckBox20: TCheckBox;
|
||||
Expander6: TExpander;
|
||||
Layout29: TLayout;
|
||||
CheckBox21: TCheckBox;
|
||||
Layout30: TLayout;
|
||||
SpinBox14: TSpinBox;
|
||||
CheckBox23: TCheckBox;
|
||||
CheckBox24: TCheckBox;
|
||||
CheckBox25: TCheckBox;
|
||||
Layout31: TLayout;
|
||||
Label3: TLabel;
|
||||
SpinBox15: TSpinBox;
|
||||
Layout32: TLayout;
|
||||
CheckBox26: TCheckBox;
|
||||
Layout33: TLayout;
|
||||
RadioButton1: TRadioButton;
|
||||
Layout34: TLayout;
|
||||
RadioButton2: TRadioButton;
|
||||
Layout35: TLayout;
|
||||
RadioButton3: TRadioButton;
|
||||
Layout36: TLayout;
|
||||
Label5: TLabel;
|
||||
SpinBox16: TSpinBox;
|
||||
Layout37: TLayout;
|
||||
Button1: TButton;
|
||||
RadioButton4: TRadioButton;
|
||||
VertScrollBox3: TVertScrollBox;
|
||||
Expander10: TExpander;
|
||||
ListBox2: TListBox;
|
||||
procedure FormShow(Sender: TObject);
|
||||
procedure CheckBox3Change(Sender: TObject);
|
||||
procedure CheckBox1Change(Sender: TObject);
|
||||
procedure CheckBox4Change(Sender: TObject);
|
||||
procedure CheckBox5Change(Sender: TObject);
|
||||
procedure CheckBox6Change(Sender: TObject);
|
||||
procedure CheckBox7Change(Sender: TObject);
|
||||
procedure CheckBox10Change(Sender: TObject);
|
||||
procedure CheckBox8Change(Sender: TObject);
|
||||
procedure CheckBox12Change(Sender: TObject);
|
||||
procedure CheckBox14Change(Sender: TObject);
|
||||
procedure CheckBox16Change(Sender: TObject);
|
||||
procedure CheckBox18Change(Sender: TObject);
|
||||
procedure CheckBox21Change(Sender: TObject);
|
||||
procedure CheckBox26Change(Sender: TObject);
|
||||
procedure CheckBox24Change(Sender: TObject);
|
||||
procedure CheckBox23Change(Sender: TObject);
|
||||
procedure CheckBox25Change(Sender: TObject);
|
||||
procedure CheckBox9Change(Sender: TObject);
|
||||
procedure CheckBox11Change(Sender: TObject);
|
||||
procedure CheckBox13Change(Sender: TObject);
|
||||
procedure CheckBox15Change(Sender: TObject);
|
||||
procedure CheckBox17Change(Sender: TObject);
|
||||
procedure CheckBox19Change(Sender: TObject);
|
||||
procedure Button1Click(Sender: TObject);
|
||||
procedure RadioButton4Change(Sender: TObject);
|
||||
private
|
||||
{ Private declarations }
|
||||
public
|
||||
{ Public declarations }
|
||||
end;
|
||||
|
||||
TMethod = record
|
||||
FName: String;
|
||||
FType: Integer;
|
||||
Codecs: TArray<String>;
|
||||
end;
|
||||
|
||||
TConfigCtrl = class(TObject)
|
||||
private
|
||||
FOwner, FParent: TFmxObject;
|
||||
FExpander: TExpander;
|
||||
FListBox: TListBox;
|
||||
public
|
||||
constructor Create(AOwner, AParent: TFmxObject);
|
||||
destructor Destroy; override;
|
||||
procedure SetText(AText: String);
|
||||
procedure AddCodec(ACodec: String);
|
||||
function GetCodec(out Codec: String): Boolean;
|
||||
end;
|
||||
|
||||
TLibraryCtrl = class(TObject)
|
||||
private
|
||||
FOwner, FParent: TFmxObject;
|
||||
FExpander: TExpander;
|
||||
FCheckBox: TArray<TCheckBox>;
|
||||
FLayout1, FLayout2: TArray<TLayout>;
|
||||
FLabel: TArray<TLabel>;
|
||||
FEdit: TArray<TEdit>;
|
||||
procedure OnCheckBoxChange(Sender: TObject);
|
||||
public
|
||||
constructor Create(AOwner, AParent: TFmxObject);
|
||||
destructor Destroy; override;
|
||||
procedure SetText(AText: String);
|
||||
procedure AddCodec(ACodec: String);
|
||||
function GetCodec(out Codec: String): Boolean;
|
||||
end;
|
||||
|
||||
var
|
||||
Form2: TForm2;
|
||||
Methods: TArray<TMethod>;
|
||||
CfgCtrls: TArray<TConfigCtrl>;
|
||||
LibCtrls: TArray<TLibraryCtrl>;
|
||||
|
||||
implementation
|
||||
|
||||
{$R *.fmx}
|
||||
|
||||
uses Unit1;
|
||||
|
||||
procedure AddMethod(const SubStr: String; var ResStr: String;
|
||||
ParamStr: TArray<String>; ParamBool: TArray<Boolean>);
|
||||
var
|
||||
I: Integer;
|
||||
S: String;
|
||||
begin
|
||||
if ResStr = '' then
|
||||
ResStr := SubStr
|
||||
else
|
||||
ResStr := ResStr + '+' + SubStr;
|
||||
S := '';
|
||||
for I := Low(ParamStr) to High(ParamStr) do
|
||||
if ParamBool[I] then
|
||||
S := S + ':' + ParamStr[I];
|
||||
ResStr := ResStr + S;
|
||||
end;
|
||||
|
||||
constructor TConfigCtrl.Create(AOwner, AParent: TFmxObject);
|
||||
begin
|
||||
inherited Create;
|
||||
FOwner := AOwner;
|
||||
FParent := AParent;
|
||||
FExpander := TExpander.Create(FOwner);
|
||||
FExpander.Parent := FParent;
|
||||
FExpander.Height := 130;
|
||||
FExpander.Margins.Top := 8;
|
||||
FExpander.Margins.Left := 8;
|
||||
FExpander.Margins.Right := 8;
|
||||
FExpander.Align := TAlignLayout.Top;
|
||||
FListBox := TListBox.Create(FExpander);
|
||||
FListBox.Parent := FExpander;
|
||||
FListBox.Margins.Bottom := 8;
|
||||
FListBox.Margins.Left := 8;
|
||||
FListBox.Margins.Right := 8;
|
||||
FListBox.Align := TAlignLayout.Client;
|
||||
FListBox.ShowCheckboxes := True;
|
||||
end;
|
||||
|
||||
destructor TConfigCtrl.Destroy;
|
||||
begin
|
||||
FListBox.Free;
|
||||
FExpander.Free;
|
||||
inherited Destroy;
|
||||
end;
|
||||
|
||||
procedure TConfigCtrl.SetText(AText: String);
|
||||
begin
|
||||
FExpander.Text := AText;
|
||||
end;
|
||||
|
||||
procedure TConfigCtrl.AddCodec(ACodec: String);
|
||||
begin
|
||||
FListBox.Items.Add(ACodec);
|
||||
end;
|
||||
|
||||
function TConfigCtrl.GetCodec(out Codec: String): Boolean;
|
||||
var
|
||||
I: Integer;
|
||||
S: String;
|
||||
begin
|
||||
Result := False;
|
||||
S := '';
|
||||
for I := 0 to FListBox.Items.Count - 1 do
|
||||
if FListBox.ItemByIndex(I).IsChecked then
|
||||
begin
|
||||
S := S + ':' + FListBox.Items[I];
|
||||
Result := True;
|
||||
end;
|
||||
if Result then
|
||||
Codec := FExpander.Text + S;
|
||||
end;
|
||||
|
||||
constructor TLibraryCtrl.Create(AOwner, AParent: TFmxObject);
|
||||
begin
|
||||
inherited Create;
|
||||
FOwner := AOwner;
|
||||
FParent := AParent;
|
||||
FExpander := TExpander.Create(FOwner);
|
||||
FExpander.Parent := FParent;
|
||||
FExpander.Height := 25;
|
||||
FExpander.Margins.Top := 8;
|
||||
FExpander.Margins.Left := 8;
|
||||
FExpander.Margins.Right := 8;
|
||||
FExpander.Align := TAlignLayout.Top;
|
||||
end;
|
||||
|
||||
destructor TLibraryCtrl.Destroy;
|
||||
begin
|
||||
FExpander.Free;
|
||||
inherited Destroy;
|
||||
end;
|
||||
|
||||
procedure TLibraryCtrl.OnCheckBoxChange(Sender: TObject);
|
||||
var
|
||||
I: Integer;
|
||||
begin
|
||||
for I := Low(FCheckBox) to High(FCheckBox) do
|
||||
if Sender = FCheckBox[I] then
|
||||
FEdit[I].Enabled := FCheckBox[I].IsChecked;
|
||||
end;
|
||||
|
||||
procedure TLibraryCtrl.SetText(AText: String);
|
||||
begin
|
||||
FExpander.Text := AText;
|
||||
end;
|
||||
|
||||
procedure TLibraryCtrl.AddCodec(ACodec: String);
|
||||
var
|
||||
I: Integer;
|
||||
begin
|
||||
I := Length(FLayout1);
|
||||
Insert(TLayout.Create(FExpander), FLayout1, Length(FLayout1));
|
||||
FLayout1[I].Parent := FExpander;
|
||||
FLayout1[I].Height := 64;
|
||||
FLayout1[I].Align := TAlignLayout.Top;
|
||||
Insert(TCheckBox.Create(FLayout1[I]), FCheckBox, Length(FCheckBox));
|
||||
FCheckBox[I].Parent := FLayout1[I];
|
||||
FCheckBox[I].Height := 20;
|
||||
FCheckBox[I].Margins.Top := 8;
|
||||
FCheckBox[I].Margins.Left := 8;
|
||||
FCheckBox[I].Margins.Right := 8;
|
||||
FCheckBox[I].Align := TAlignLayout.Top;
|
||||
FCheckBox[I].Text := ACodec;
|
||||
FCheckBox[I].OnChange := OnCheckBoxChange;
|
||||
Insert(TLayout.Create(FLayout1[I]), FLayout2, Length(FLayout2));
|
||||
FLayout2[I].Parent := FLayout1[I];
|
||||
FLayout2[I].Align := TAlignLayout.Client;
|
||||
Insert(TLabel.Create(FLayout2[I]), FLabel, Length(FLabel));
|
||||
FLabel[I].Parent := FLayout2[I];
|
||||
FLabel[I].Width := 40;
|
||||
FLabel[I].Margins.Top := 8;
|
||||
FLabel[I].Margins.Bottom := 8;
|
||||
FLabel[I].Margins.Left := 8;
|
||||
FLabel[I].Align := TAlignLayout.Left;
|
||||
FLabel[I].Text := 'Param';
|
||||
Insert(TEdit.Create(FLayout2[I]), FEdit, Length(FEdit));
|
||||
FEdit[I].Parent := FLayout2[I];
|
||||
FEdit[I].Enabled := False;
|
||||
FEdit[I].Margins.Top := 8;
|
||||
FEdit[I].Margins.Bottom := 8;
|
||||
FEdit[I].Margins.Left := 8;
|
||||
FEdit[I].Margins.Right := 8;
|
||||
FEdit[I].Align := TAlignLayout.Client;
|
||||
FExpander.Height := FExpander.Height + 64;
|
||||
end;
|
||||
|
||||
function TLibraryCtrl.GetCodec(out Codec: String): Boolean;
|
||||
var
|
||||
I: Integer;
|
||||
S: String;
|
||||
begin
|
||||
Result := False;
|
||||
S := '';
|
||||
for I := Low(FCheckBox) to High(FCheckBox) do
|
||||
if FCheckBox[I].IsChecked then
|
||||
begin
|
||||
AddMethod(FCheckBox[I].Text, S, [FEdit[I].Text], [FEdit[I].Text <> '']);
|
||||
Result := True;
|
||||
end;
|
||||
if Result then
|
||||
Codec := S;
|
||||
end;
|
||||
|
||||
procedure TForm2.Button1Click(Sender: TObject);
|
||||
var
|
||||
I: Integer;
|
||||
S, Res: String;
|
||||
begin
|
||||
Res := '';
|
||||
if CheckBox3.IsChecked then
|
||||
AddMethod('zlib', Res, ['w' + SpinBox4.Text], [True]);
|
||||
if CheckBox1.IsChecked then
|
||||
AddMethod('reflate', Res, ['l' + SpinBox1.Text], [True]);
|
||||
if CheckBox2.IsChecked then
|
||||
AddMethod('preflate', Res, [], []);
|
||||
if CheckBox20.IsChecked then
|
||||
AddMethod('png', Res, [], []);
|
||||
if CheckBox4.IsChecked then
|
||||
AddMethod('lz4', Res, ['a' + SpinBox2.Text], [True]);
|
||||
if CheckBox5.IsChecked then
|
||||
AddMethod('lz4hc', Res, ['l' + SpinBox3.Text], [CheckBox24.IsChecked]);
|
||||
if CheckBox6.IsChecked then
|
||||
AddMethod('lz4f', Res, ['l' + SpinBox5.Text, 'd' + SpinBox6.Text],
|
||||
[CheckBox23.IsChecked, True]);
|
||||
if CheckBox7.IsChecked then
|
||||
AddMethod('lzo1x', Res, ['l' + SpinBox8.Text], [CheckBox25.IsChecked]);
|
||||
if CheckBox8.IsChecked then
|
||||
AddMethod('zstd', Res, ['l' + SpinBox7.Text], [CheckBox9.IsChecked]);
|
||||
if CheckBox10.IsChecked then
|
||||
AddMethod('kraken', Res, ['l' + SpinBox9.Text, 'n' + SpinBox15.Text,
|
||||
't' + SpinBox16.Text], [CheckBox11.IsChecked, True, True]);
|
||||
if CheckBox12.IsChecked then
|
||||
AddMethod('mermaid', Res, ['l' + SpinBox10.Text, 'n' + SpinBox15.Text,
|
||||
't' + SpinBox16.Text], [CheckBox13.IsChecked, True, True]);
|
||||
if CheckBox14.IsChecked then
|
||||
AddMethod('selkie', Res, ['l' + SpinBox11.Text, 'n' + SpinBox15.Text,
|
||||
't' + SpinBox16.Text], [CheckBox15.IsChecked, True, True]);
|
||||
if CheckBox16.IsChecked then
|
||||
AddMethod('hydra', Res, ['l' + SpinBox12.Text, 'n' + SpinBox15.Text,
|
||||
't' + SpinBox16.Text], [CheckBox17.IsChecked, True, True]);
|
||||
if CheckBox18.IsChecked then
|
||||
AddMethod('leviathan', Res, ['l' + SpinBox13.Text, 'n' + SpinBox15.Text,
|
||||
't' + SpinBox16.Text], [CheckBox19.IsChecked, True, True]);
|
||||
if CheckBox21.IsChecked then
|
||||
AddMethod('flac', Res, ['l' + SpinBox14.Text], [RadioButton4.IsChecked]);
|
||||
if CheckBox26.IsChecked and RadioButton1.IsChecked then
|
||||
AddMethod('brunsli', Res, [], []);
|
||||
if CheckBox26.IsChecked and RadioButton2.IsChecked then
|
||||
AddMethod('packjpg', Res, [], []);
|
||||
if CheckBox26.IsChecked and RadioButton3.IsChecked then
|
||||
AddMethod('jojpeg', Res, [], []);
|
||||
for I := 0 to ListBox2.Items.Count - 1 do
|
||||
if ListBox2.ItemByIndex(I).IsChecked then
|
||||
AddMethod(ListBox2.Items[I], Res, [], []);
|
||||
for I := Low(CfgCtrls) to High(CfgCtrls) do
|
||||
if CfgCtrls[I].GetCodec(S) then
|
||||
AddMethod(S, Res, [], []);
|
||||
for I := Low(LibCtrls) to High(LibCtrls) do
|
||||
if LibCtrls[I].GetCodec(S) then
|
||||
AddMethod(S, Res, [], []);
|
||||
Form1.Edit2.Text := Res;
|
||||
end;
|
||||
|
||||
procedure TForm2.CheckBox10Change(Sender: TObject);
|
||||
begin
|
||||
Layout19.Enabled := CheckBox10.IsChecked;
|
||||
end;
|
||||
|
||||
procedure TForm2.CheckBox11Change(Sender: TObject);
|
||||
begin
|
||||
SpinBox9.Enabled := CheckBox11.IsChecked;
|
||||
end;
|
||||
|
||||
procedure TForm2.CheckBox12Change(Sender: TObject);
|
||||
begin
|
||||
Layout21.Enabled := CheckBox12.IsChecked;
|
||||
end;
|
||||
|
||||
procedure TForm2.CheckBox13Change(Sender: TObject);
|
||||
begin
|
||||
SpinBox10.Enabled := CheckBox13.IsChecked;
|
||||
end;
|
||||
|
||||
procedure TForm2.CheckBox14Change(Sender: TObject);
|
||||
begin
|
||||
Layout23.Enabled := CheckBox14.IsChecked;
|
||||
end;
|
||||
|
||||
procedure TForm2.CheckBox15Change(Sender: TObject);
|
||||
begin
|
||||
SpinBox11.Enabled := CheckBox15.IsChecked;
|
||||
end;
|
||||
|
||||
procedure TForm2.CheckBox16Change(Sender: TObject);
|
||||
begin
|
||||
Layout25.Enabled := CheckBox16.IsChecked;
|
||||
end;
|
||||
|
||||
procedure TForm2.CheckBox17Change(Sender: TObject);
|
||||
begin
|
||||
SpinBox12.Enabled := CheckBox17.IsChecked;
|
||||
end;
|
||||
|
||||
procedure TForm2.CheckBox18Change(Sender: TObject);
|
||||
begin
|
||||
Layout27.Enabled := CheckBox18.IsChecked;
|
||||
end;
|
||||
|
||||
procedure TForm2.CheckBox19Change(Sender: TObject);
|
||||
begin
|
||||
SpinBox13.Enabled := CheckBox19.IsChecked;
|
||||
end;
|
||||
|
||||
procedure TForm2.CheckBox1Change(Sender: TObject);
|
||||
begin
|
||||
Layout3.Enabled := CheckBox1.IsChecked;
|
||||
end;
|
||||
|
||||
procedure TForm2.CheckBox21Change(Sender: TObject);
|
||||
begin
|
||||
Layout30.Enabled := CheckBox21.IsChecked;
|
||||
end;
|
||||
|
||||
procedure TForm2.CheckBox23Change(Sender: TObject);
|
||||
begin
|
||||
SpinBox5.Enabled := CheckBox23.IsChecked;
|
||||
end;
|
||||
|
||||
procedure TForm2.CheckBox24Change(Sender: TObject);
|
||||
begin
|
||||
SpinBox3.Enabled := CheckBox24.IsChecked;
|
||||
end;
|
||||
|
||||
procedure TForm2.CheckBox25Change(Sender: TObject);
|
||||
begin
|
||||
SpinBox8.Enabled := CheckBox25.IsChecked;
|
||||
end;
|
||||
|
||||
procedure TForm2.CheckBox26Change(Sender: TObject);
|
||||
begin
|
||||
Layout33.Enabled := CheckBox26.IsChecked;
|
||||
Layout34.Enabled := CheckBox26.IsChecked;
|
||||
Layout35.Enabled := CheckBox26.IsChecked;
|
||||
end;
|
||||
|
||||
procedure TForm2.CheckBox3Change(Sender: TObject);
|
||||
begin
|
||||
Layout1.Enabled := CheckBox3.IsChecked;
|
||||
end;
|
||||
|
||||
procedure TForm2.CheckBox4Change(Sender: TObject);
|
||||
begin
|
||||
Layout7.Enabled := CheckBox4.IsChecked;
|
||||
end;
|
||||
|
||||
procedure TForm2.CheckBox5Change(Sender: TObject);
|
||||
begin
|
||||
Layout9.Enabled := CheckBox5.IsChecked;
|
||||
end;
|
||||
|
||||
procedure TForm2.CheckBox6Change(Sender: TObject);
|
||||
begin
|
||||
Layout11.Enabled := CheckBox6.IsChecked;
|
||||
Layout12.Enabled := CheckBox6.IsChecked;
|
||||
end;
|
||||
|
||||
procedure TForm2.CheckBox7Change(Sender: TObject);
|
||||
begin
|
||||
Layout14.Enabled := CheckBox7.IsChecked;
|
||||
Layout15.Enabled := CheckBox7.IsChecked;
|
||||
end;
|
||||
|
||||
procedure TForm2.CheckBox8Change(Sender: TObject);
|
||||
begin
|
||||
Layout18.Enabled := CheckBox8.IsChecked;
|
||||
end;
|
||||
|
||||
procedure TForm2.CheckBox9Change(Sender: TObject);
|
||||
begin
|
||||
SpinBox7.Enabled := CheckBox9.IsChecked;
|
||||
end;
|
||||
|
||||
procedure TForm2.FormShow(Sender: TObject);
|
||||
var
|
||||
I: Integer;
|
||||
begin
|
||||
for I := 0 to ComponentCount - 1 do
|
||||
begin
|
||||
if Components[I] is TSpinBox then
|
||||
TSpinBox(Components[I]).Cursor := crDefault;
|
||||
if Components[I] is TCheckBox then
|
||||
if Assigned(TCheckBox(Components[I]).OnChange) then
|
||||
TCheckBox(Components[I]).OnChange(nil);
|
||||
if Components[I] is TRadioButton then
|
||||
if Assigned(TRadioButton(Components[I]).OnChange) then
|
||||
TRadioButton(Components[I]).OnChange(nil);
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TForm2.RadioButton4Change(Sender: TObject);
|
||||
begin
|
||||
SpinBox14.Enabled := RadioButton4.IsChecked;
|
||||
end;
|
||||
|
||||
end.
|
21
changes.txt
21
changes.txt
|
@ -1,3 +1,22 @@
|
|||
ES_R44 (0.6.9)
|
||||
- added library checker (trial and error)
|
||||
- improved user interface
|
||||
- fixed bugs related to oodle scanner
|
||||
- skip verification no longer applies to encryption codecs
|
||||
|
||||
ES_R43 (0.6.8)
|
||||
- added advanced configuration based plugin support
|
||||
- added UI mode when xtool.exe is launched with xtoolui.dll present
|
||||
- added skip verification mode
|
||||
- xtool now enforces w15 deflate stream detection by default
|
||||
- fixed oodle scanner exceptions when incomplete stream is detected
|
||||
- fixed issue with zlib codec not accepting streams from database plugins
|
||||
- updated command line syntax
|
||||
|
||||
ES_R42 (0.6.7)
|
||||
- fixed oodle scanner exceptions when incorrect library is used
|
||||
- fixed issues with deduplication feature
|
||||
|
||||
ES_R41 (0.6.6)
|
||||
- fixed issues with exporting precompression database
|
||||
- fixed issues with deduplication feature consuming a lot of system memory
|
||||
|
@ -6,7 +25,7 @@
|
|||
|
||||
ES_R40 (0.6.5)
|
||||
- updated oodle scanner
|
||||
- remove xdelta support from oodle and lzo codecs (crc mismatch often generates large diff files)
|
||||
- removed xdelta support from oodle and lzo codecs (crc mismatch often generates large diff files)
|
||||
|
||||
ES_R39 (0.6.4)
|
||||
- fixed issues with lzo2a and lzo1c codecs
|
||||
|
|
172
common/Utils.pas
172
common/Utils.pas
|
@ -96,10 +96,13 @@ type
|
|||
end;
|
||||
|
||||
TNullStream = class(TStream)
|
||||
private
|
||||
FPosition, FSize: Int64;
|
||||
public
|
||||
constructor Create;
|
||||
destructor Destroy; override;
|
||||
function Read(var Buffer; Count: LongInt): LongInt; override;
|
||||
function Write(const Buffer; Count: LongInt): LongInt; override;
|
||||
function Seek(const Offset: Int64; Origin: TSeekOrigin): Int64; override;
|
||||
end;
|
||||
|
||||
TArrayStream = class(TStream)
|
||||
|
@ -136,33 +139,6 @@ type
|
|||
procedure Update(Index: Integer; MaxSize: Int64);
|
||||
end;
|
||||
|
||||
TPointersStream = class(TStream)
|
||||
protected
|
||||
function GetSize: Int64; override;
|
||||
procedure SetSize(NewSize: LongInt); override;
|
||||
procedure SetSize(const NewSize: Int64); override;
|
||||
private
|
||||
FPointers: TArray<Pointer>;
|
||||
FSizes: TArray<NativeInt>;
|
||||
FPosition, FSize: NativeInt;
|
||||
FMaxSize: NativeInt;
|
||||
FIndex, FCount: Integer;
|
||||
FIndexPos: NativeInt;
|
||||
procedure Recalculate;
|
||||
public
|
||||
constructor Create;
|
||||
destructor Destroy; override;
|
||||
function Read(var Buffer; Count: LongInt): LongInt; override;
|
||||
function Write(const Buffer; Count: LongInt): LongInt; override;
|
||||
function Seek(const Offset: Int64; Origin: TSeekOrigin): Int64; override;
|
||||
function Add(Ptr: Pointer; Size: NativeInt): Integer;
|
||||
procedure Delete(Index: Integer);
|
||||
procedure Insert(Index: Integer; Ptr: Pointer; Size: NativeInt);
|
||||
procedure Clear;
|
||||
property Count: Integer read FCount;
|
||||
property Capacity: NativeInt read FMaxSize;
|
||||
end;
|
||||
|
||||
TMemoryStreamEx = class(TMemoryStream)
|
||||
private
|
||||
FOwnMemory: Boolean;
|
||||
|
@ -255,7 +231,10 @@ type
|
|||
end;
|
||||
|
||||
TBufferedStream = class(TStream)
|
||||
protected
|
||||
function GetSize: Int64; override;
|
||||
private
|
||||
FSize: Int64;
|
||||
FReadMode: Boolean;
|
||||
FMemory: PByte;
|
||||
FBufferSize: Integer;
|
||||
|
@ -487,6 +466,7 @@ function GetFileList(const APath: TArray<string>; SubDir: Boolean = True)
|
|||
procedure FileReadBuffer(Handle: THandle; var Buffer; Count: NativeInt);
|
||||
procedure FileWriteBuffer(Handle: THandle; const Buffer; Count: NativeInt);
|
||||
procedure CloseHandleEx(var Handle: THandle);
|
||||
function ExpandPath(const AFileName: string): String;
|
||||
|
||||
function Exec(Executable, CommandLine, WorkDir: string): Boolean;
|
||||
function ExecStdin(Executable, CommandLine, WorkDir: string; InBuff: Pointer;
|
||||
|
@ -745,18 +725,37 @@ end;
|
|||
constructor TNullStream.Create;
|
||||
begin
|
||||
inherited Create;
|
||||
FPosition := 0;
|
||||
FSize := 0;
|
||||
end;
|
||||
|
||||
destructor TNullStream.Destroy;
|
||||
function TNullStream.Read(var Buffer; Count: LongInt): LongInt;
|
||||
begin
|
||||
inherited Destroy;
|
||||
Inc(FPosition, Count);
|
||||
Result := Count;
|
||||
end;
|
||||
|
||||
function TNullStream.Write(const Buffer; Count: LongInt): LongInt;
|
||||
begin
|
||||
Inc(FPosition, Count);
|
||||
if FSize < FPosition then
|
||||
FSize := FPosition;
|
||||
Result := Count;
|
||||
end;
|
||||
|
||||
function TNullStream.Seek(const Offset: Int64; Origin: TSeekOrigin): Int64;
|
||||
begin
|
||||
case Origin of
|
||||
soBeginning:
|
||||
FPosition := Offset;
|
||||
soCurrent:
|
||||
Inc(FPosition, Offset);
|
||||
soEnd:
|
||||
FPosition := FSize + Offset;
|
||||
end;
|
||||
Result := Position;
|
||||
end;
|
||||
|
||||
constructor TArrayStream.Create;
|
||||
begin
|
||||
inherited Create;
|
||||
|
@ -948,102 +947,6 @@ begin
|
|||
FStreams[Index].MaxSize := MaxSize;
|
||||
end;
|
||||
|
||||
constructor TPointersStream.Create;
|
||||
begin
|
||||
inherited Create;
|
||||
Clear;
|
||||
Recalculate;
|
||||
end;
|
||||
|
||||
destructor TPointersStream.Destroy;
|
||||
begin
|
||||
Clear;
|
||||
inherited Destroy;
|
||||
end;
|
||||
|
||||
function TPointersStream.GetSize: Int64;
|
||||
begin
|
||||
Result := FSize;
|
||||
end;
|
||||
|
||||
procedure TPointersStream.SetSize(NewSize: LongInt);
|
||||
begin
|
||||
SetSize(Int64(NewSize));
|
||||
end;
|
||||
|
||||
procedure TPointersStream.SetSize(const NewSize: Int64);
|
||||
var
|
||||
OldPosition: NativeInt;
|
||||
begin
|
||||
OldPosition := FPosition;
|
||||
if NewSize <= FMaxSize then
|
||||
FSize := NewSize;
|
||||
if OldPosition > NewSize then
|
||||
Seek(0, soEnd);
|
||||
end;
|
||||
|
||||
procedure TPointersStream.Recalculate;
|
||||
var
|
||||
I: Integer;
|
||||
begin
|
||||
FMaxSize := 0;
|
||||
for I := 0 to FCount - 1 do
|
||||
Inc(FMaxSize, FSizes[I]);
|
||||
if FPosition > FMaxSize then
|
||||
FPosition := FMaxSize;
|
||||
if FSize > FMaxSize then
|
||||
FSize := FMaxSize;
|
||||
end;
|
||||
|
||||
function TPointersStream.Read(var Buffer; Count: LongInt): LongInt;
|
||||
begin
|
||||
// 2121212
|
||||
end;
|
||||
|
||||
function TPointersStream.Write(const Buffer; Count: LongInt): LongInt;
|
||||
begin
|
||||
|
||||
end;
|
||||
|
||||
function TPointersStream.Seek(const Offset: Int64; Origin: TSeekOrigin): Int64;
|
||||
begin
|
||||
|
||||
end;
|
||||
|
||||
function TPointersStream.Add(Ptr: Pointer; Size: NativeInt): Integer;
|
||||
begin
|
||||
System.Insert(Ptr, FPointers, FCount);
|
||||
System.Insert(Size, FSizes, FCount);
|
||||
Result := FCount;
|
||||
Inc(FCount);
|
||||
Recalculate;
|
||||
end;
|
||||
|
||||
procedure TPointersStream.Delete(Index: Integer);
|
||||
begin
|
||||
System.Delete(FPointers, Index, 1);
|
||||
Dec(FCount);
|
||||
Recalculate;
|
||||
end;
|
||||
|
||||
procedure TPointersStream.Insert(Index: Integer; Ptr: Pointer; Size: NativeInt);
|
||||
begin
|
||||
System.Insert(Ptr, FPointers, Index);
|
||||
System.Insert(Size, FSizes, Index);
|
||||
Inc(FCount);
|
||||
Recalculate;
|
||||
end;
|
||||
|
||||
procedure TPointersStream.Clear;
|
||||
begin
|
||||
SetLength(FPointers, 0);
|
||||
SetLength(FSizes, 0);
|
||||
FCount := 0;
|
||||
FPosition := 0;
|
||||
FSize := 0;
|
||||
FMaxSize := 0;
|
||||
end;
|
||||
|
||||
constructor TMemoryStreamEx.Create(AOwnMemory: Boolean; const AMemory: Pointer;
|
||||
AMaxSize: NativeInt);
|
||||
begin
|
||||
|
@ -1603,6 +1506,11 @@ begin
|
|||
inherited Destroy;
|
||||
end;
|
||||
|
||||
function TBufferedStream.GetSize: Int64;
|
||||
begin
|
||||
Result := FSize;
|
||||
end;
|
||||
|
||||
function TBufferedStream.Read(var Buffer; Count: Integer): Integer;
|
||||
var
|
||||
I, FCount: Integer;
|
||||
|
@ -1643,6 +1551,7 @@ begin
|
|||
end;
|
||||
end;
|
||||
Result := Count - FCount;
|
||||
Inc(FSize, Result);
|
||||
end;
|
||||
|
||||
function TBufferedStream.Write(const Buffer; Count: Integer): Integer;
|
||||
|
@ -1693,6 +1602,7 @@ begin
|
|||
end;
|
||||
end;
|
||||
Result := Count - FCount;
|
||||
Inc(FSize, Result);
|
||||
end;
|
||||
|
||||
procedure TBufferedStream.Flush;
|
||||
|
@ -3502,6 +3412,16 @@ begin
|
|||
end;
|
||||
end;
|
||||
|
||||
function ExpandPath(const AFileName: string): String;
|
||||
begin
|
||||
if AFileName = '' then
|
||||
Result := ''
|
||||
else if Pos(':', AFileName) > 0 then
|
||||
Result := AFileName
|
||||
else
|
||||
Result := ExtractFilePath(GetModuleName) + AFileName;
|
||||
end;
|
||||
|
||||
function Exec(Executable, CommandLine, WorkDir: string): Boolean;
|
||||
var
|
||||
StartupInfo: TStartupInfo;
|
||||
|
|
|
@ -3,7 +3,7 @@ unit LZ4DLL;
|
|||
interface
|
||||
|
||||
uses
|
||||
LibImport,
|
||||
Utils, LibImport,
|
||||
WinAPI.Windows,
|
||||
System.SysUtils, System.Math;
|
||||
|
||||
|
@ -271,7 +271,7 @@ var
|
|||
|
||||
procedure Init(Filename: String);
|
||||
begin
|
||||
Lib := TLibImport.Create(ExtractFilePath(ParamStr(0)) + Filename);
|
||||
Lib := TLibImport.Create(ExpandPath(Filename));
|
||||
if Lib.Loaded then
|
||||
begin
|
||||
@LZ4_decompress_safe := Lib.GetProcAddr('LZ4_decompress_safe');
|
||||
|
@ -311,7 +311,8 @@ begin
|
|||
end;
|
||||
|
||||
const
|
||||
DLLParam = '--lz4=';
|
||||
DLLParam1 = '--lz4=';
|
||||
DLLParam2 = '-l4';
|
||||
|
||||
var
|
||||
I: Integer;
|
||||
|
@ -321,11 +322,18 @@ initialization
|
|||
|
||||
DLLFile := 'liblz4.dll';
|
||||
for I := 1 to ParamCount do
|
||||
if ParamStr(I).StartsWith(DLLParam) then
|
||||
begin
|
||||
DLLFile := ParamStr(I).Substring(DLLParam.Length);
|
||||
if ParamStr(I).StartsWith(DLLParam1) then
|
||||
begin
|
||||
DLLFile := ParamStr(I).Substring(DLLParam1.Length);
|
||||
break;
|
||||
end;
|
||||
if ParamStr(I).StartsWith(DLLParam2) then
|
||||
begin
|
||||
DLLFile := ParamStr(I).Substring(DLLParam2.Length);
|
||||
break;
|
||||
end;
|
||||
end;
|
||||
|
||||
Init(DLLFile);
|
||||
|
||||
|
|
|
@ -3,7 +3,7 @@ unit LZODLL;
|
|||
interface
|
||||
|
||||
uses
|
||||
LibImport,
|
||||
Utils, LibImport,
|
||||
WinAPI.Windows,
|
||||
System.SysUtils;
|
||||
|
||||
|
@ -70,7 +70,7 @@ var
|
|||
|
||||
procedure Init(Filename: String);
|
||||
begin
|
||||
Lib := TLibImport.Create(ExtractFilePath(ParamStr(0)) + Filename);
|
||||
Lib := TLibImport.Create(ExpandPath(Filename));
|
||||
if Lib.Loaded then
|
||||
begin
|
||||
@lzo1x_1_compress := Lib.GetProcAddr('lzo1x_1_compress');
|
||||
|
@ -94,7 +94,8 @@ begin
|
|||
end;
|
||||
|
||||
const
|
||||
DLLParam = '--lzo=';
|
||||
DLLParam1 = '-lzo=';
|
||||
DLLParam2 = '-lo';
|
||||
|
||||
var
|
||||
I: integer;
|
||||
|
@ -104,11 +105,19 @@ initialization
|
|||
|
||||
DLLFile := 'lzo2.dll';
|
||||
for I := 1 to ParamCount do
|
||||
if ParamStr(I).StartsWith(DLLParam) then
|
||||
begin
|
||||
DLLFile := ParamStr(I).Substring(DLLParam.Length);
|
||||
if ParamStr(I).StartsWith(DLLParam1) then
|
||||
begin
|
||||
DLLFile := ParamStr(I).Substring(DLLParam1.Length);
|
||||
break;
|
||||
end;
|
||||
if ParamStr(I).StartsWith(DLLParam2) then
|
||||
begin
|
||||
DLLFile := ParamStr(I).Substring(DLLParam2.Length);
|
||||
break;
|
||||
end;
|
||||
end;
|
||||
|
||||
Init(DLLFile);
|
||||
|
||||
finalization
|
||||
|
|
|
@ -3,7 +3,7 @@ unit OodleDLL;
|
|||
interface
|
||||
|
||||
uses
|
||||
LibImport,
|
||||
Utils, LibImport,
|
||||
WinAPI.Windows,
|
||||
System.SysUtils, System.Types, System.IOUtils;
|
||||
|
||||
|
@ -82,13 +82,13 @@ var
|
|||
I: Integer;
|
||||
C: Cardinal;
|
||||
begin
|
||||
Lib := TLibImport.Create(ExtractFilePath(ParamStr(0)) + Filename);
|
||||
Lib := TLibImport.Create(ExpandPath(Filename));
|
||||
if not Lib.Loaded then
|
||||
for I := 3 to 9 do
|
||||
for I := 1 to 9 do
|
||||
begin
|
||||
Lib.Free;
|
||||
Lib := TLibImport.Create(ExtractFilePath(ParamStr(0)) + 'oo2core_' +
|
||||
I.ToString + '_win64.dll');
|
||||
Lib := TLibImport.Create(ExpandPath('oo2core_' + I.ToString +
|
||||
'_win64.dll'));
|
||||
if Lib.Loaded then
|
||||
break;
|
||||
end;
|
||||
|
@ -96,8 +96,8 @@ begin
|
|||
for I := 3 to 9 do
|
||||
begin
|
||||
Lib.Free;
|
||||
Lib := TLibImport.Create(ExtractFilePath(ParamStr(0)) + 'oo2ext_' +
|
||||
I.ToString + '_win64.dll');
|
||||
Lib := TLibImport.Create(ExpandPath('oo2ext_' + I.ToString +
|
||||
'_win64.dll'));
|
||||
if Lib.Loaded then
|
||||
break;
|
||||
end;
|
||||
|
@ -202,7 +202,8 @@ begin
|
|||
end;
|
||||
|
||||
const
|
||||
DLLParam = '--oodle=';
|
||||
DLLParam1 = '--oodle=';
|
||||
DLLParam2 = '-od';
|
||||
|
||||
var
|
||||
I: Integer;
|
||||
|
@ -212,11 +213,18 @@ initialization
|
|||
|
||||
DLLFile := 'oo2core_9_win64.dll';
|
||||
for I := 1 to ParamCount do
|
||||
if ParamStr(I).StartsWith(DLLParam) then
|
||||
begin
|
||||
DLLFile := ParamStr(I).Substring(DLLParam.Length);
|
||||
if ParamStr(I).StartsWith(DLLParam1) then
|
||||
begin
|
||||
DLLFile := ParamStr(I).Substring(DLLParam1.Length);
|
||||
break;
|
||||
end;
|
||||
if ParamStr(I).StartsWith(DLLParam2) then
|
||||
begin
|
||||
DLLFile := ParamStr(I).Substring(DLLParam2.Length);
|
||||
break;
|
||||
end;
|
||||
end;
|
||||
Init(DLLFile);
|
||||
|
||||
finalization
|
||||
|
|
|
@ -3,7 +3,7 @@ unit ZLibDLL;
|
|||
interface
|
||||
|
||||
uses
|
||||
LibImport,
|
||||
Utils, LibImport,
|
||||
WinAPI.Windows,
|
||||
System.SysUtils, System.Types, System.IOUtils, System.ZLib;
|
||||
|
||||
|
@ -148,16 +148,16 @@ end;
|
|||
|
||||
procedure Init(Filename: String);
|
||||
begin
|
||||
Lib := TLibImport.Create(ExtractFilePath(ParamStr(0)) + Filename);
|
||||
Lib := TLibImport.Create(ExpandPath(Filename));
|
||||
if not(Lib.Loaded and Assigned(Lib.GetProcAddr('zlibVersion'))) then
|
||||
begin
|
||||
Lib.Free;
|
||||
Lib := TLibImport.Create(ExtractFilePath(ParamStr(0)) + 'zlibwapi.dll');
|
||||
Lib := TLibImport.Create(ExpandPath('zlibwapi.dll'));
|
||||
end;
|
||||
if not(Lib.Loaded and Assigned(Lib.GetProcAddr('zlibVersion'))) then
|
||||
begin
|
||||
Lib.Free;
|
||||
Lib := TLibImport.Create(ExtractFilePath(ParamStr(0)) + 'zlib1.dll');
|
||||
Lib := TLibImport.Create(ExpandPath('zlib1.dll'));
|
||||
end;
|
||||
if Lib.Loaded and Assigned(Lib.GetProcAddr('zlibVersion')) then
|
||||
begin
|
||||
|
@ -192,7 +192,8 @@ begin
|
|||
end;
|
||||
|
||||
const
|
||||
DLLParam = '--zlib=';
|
||||
DLLParam1 = '--zlib=';
|
||||
DLLParam2 = '-zb';
|
||||
|
||||
var
|
||||
I: integer;
|
||||
|
@ -202,11 +203,18 @@ initialization
|
|||
|
||||
DLLFile := 'zlibwapi.dll';
|
||||
for I := 1 to ParamCount do
|
||||
if ParamStr(I).StartsWith(DLLParam) then
|
||||
begin
|
||||
DLLFile := ParamStr(I).Substring(DLLParam.Length);
|
||||
if ParamStr(I).StartsWith(DLLParam1) then
|
||||
begin
|
||||
DLLFile := ParamStr(I).Substring(DLLParam1.Length);
|
||||
break;
|
||||
end;
|
||||
if ParamStr(I).StartsWith(DLLParam2) then
|
||||
begin
|
||||
DLLFile := ParamStr(I).Substring(DLLParam2.Length);
|
||||
break;
|
||||
end;
|
||||
end;
|
||||
|
||||
Init(DLLFile);
|
||||
|
||||
|
|
|
@ -3,7 +3,7 @@ unit ZSTDDLL;
|
|||
interface
|
||||
|
||||
uses
|
||||
LibImport,
|
||||
Utils, LibImport,
|
||||
WinAPI.Windows,
|
||||
System.SysUtils;
|
||||
|
||||
|
@ -147,7 +147,7 @@ var
|
|||
|
||||
procedure Init(Filename: String);
|
||||
begin
|
||||
Lib := TLibImport.Create(ExtractFilePath(ParamStr(0)) + Filename);
|
||||
Lib := TLibImport.Create(ExpandPath(Filename));
|
||||
if Lib.Loaded then
|
||||
begin
|
||||
@ZSTD_compress := Lib.GetProcAddr('ZSTD_compress');
|
||||
|
@ -185,7 +185,8 @@ begin
|
|||
end;
|
||||
|
||||
const
|
||||
DLLParam = '--zstd=';
|
||||
DLLParam1 = '--zstd=';
|
||||
DLLParam2 = '-zs';
|
||||
|
||||
var
|
||||
I: Integer;
|
||||
|
@ -195,11 +196,19 @@ initialization
|
|||
|
||||
DLLFile := 'libzstd.dll';
|
||||
for I := 1 to ParamCount do
|
||||
if ParamStr(I).StartsWith(DLLParam) then
|
||||
begin
|
||||
DLLFile := ParamStr(I).Substring(DLLParam.Length);
|
||||
if ParamStr(I).StartsWith(DLLParam1) then
|
||||
begin
|
||||
DLLFile := ParamStr(I).Substring(DLLParam1.Length);
|
||||
break;
|
||||
end;
|
||||
if ParamStr(I).StartsWith(DLLParam2) then
|
||||
begin
|
||||
DLLFile := ParamStr(I).Substring(DLLParam2.Length);
|
||||
break;
|
||||
end;
|
||||
end;
|
||||
|
||||
Init(DLLFile);
|
||||
|
||||
finalization
|
||||
|
|
|
@ -4,6 +4,7 @@ interface
|
|||
|
||||
uses
|
||||
Utils,
|
||||
UIMain,
|
||||
PrecompUtils,
|
||||
WinAPI.Windows,
|
||||
System.SysUtils, System.Classes, System.StrUtils,
|
||||
|
@ -375,6 +376,9 @@ begin
|
|||
@DLLStruct^.Scan2 := GetProcAddress(DLLHandle, 'PrecompScan2');
|
||||
@DLLStruct^.Process := GetProcAddress(DLLHandle, 'PrecompProcess');
|
||||
@DLLStruct^.Restore := GetProcAddress(DLLHandle, 'PrecompRestore');
|
||||
if UIMain.DLLLoaded then
|
||||
XTLAddplugin(ChangeFileExt(ExtractFileName(DLLList[I]), ''),
|
||||
PLUGIN_LIBRARY);
|
||||
Insert(DLLStruct^, CodecDLL, Length(CodecDLL));
|
||||
J := 0;
|
||||
while Assigned(CodecDLL[Pred(Length(CodecDLL))].Codec(J)) do
|
||||
|
@ -383,6 +387,8 @@ begin
|
|||
Insert(S, CodecDLL[Pred(Length(CodecDLL))].Names,
|
||||
Length(CodecDLL[Pred(Length(CodecDLL))].Names));
|
||||
Insert(S, Codec.Names, Length(Codec.Names));
|
||||
if UIMain.DLLLoaded then
|
||||
XTLAddCodec(S);
|
||||
Inc(J);
|
||||
end;
|
||||
if J = 0 then
|
||||
|
@ -392,6 +398,8 @@ begin
|
|||
Length(CodecDLL[Pred(Length(CodecDLL))].Names));
|
||||
Insert(ChangeFileExt(ExtractFileName(DLLList[I]), ''), Codec.Names,
|
||||
Length(Codec.Names));
|
||||
if UIMain.DLLLoaded then
|
||||
XTLAddCodec(ChangeFileExt(ExtractFileName(DLLList[I]), ''));
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
|
|
|
@ -4,6 +4,7 @@ interface
|
|||
|
||||
uses
|
||||
Utils, ParseExpr,
|
||||
UIMain,
|
||||
PrecompUtils,
|
||||
WinAPI.Windows,
|
||||
System.SysUtils, System.Classes, System.StrUtils,
|
||||
|
@ -136,7 +137,7 @@ begin
|
|||
if CompareText(S, Codec.Names[Y]) = 0 then
|
||||
begin
|
||||
for I := Low(CodecEnabled[Y]) to High(CodecEnabled[Y]) do
|
||||
CodecEnabled[Y][I] := True;
|
||||
CodecEnabled[Y, I] := True;
|
||||
for Z := Low(CodecCfg[0, Y]) to High(CodecCfg[0, Y]) do
|
||||
if Funcs^.GetParam(Command, X, PChar(CodecCfg[0, Y, Z].Name)) <> ''
|
||||
then
|
||||
|
@ -144,7 +145,7 @@ begin
|
|||
if not ParamsSet then
|
||||
begin
|
||||
for I := Low(CodecEnabled[Y]) to High(CodecEnabled[Y]) do
|
||||
CodecEnabled[Y][I] := False;
|
||||
CodecEnabled[Y, I] := False;
|
||||
ParamsSet := True;
|
||||
end;
|
||||
CodecEnabled[Y, Z] := True;
|
||||
|
@ -292,11 +293,13 @@ begin
|
|||
continue;
|
||||
end;
|
||||
for Y := Low(Conditions) to High(Conditions) do
|
||||
begin
|
||||
if Round(Parser.Evaluate(Conditions[Y])) = 0 then
|
||||
begin
|
||||
Status := TScanStatus.Fail;
|
||||
break;
|
||||
end;
|
||||
end;
|
||||
if Status = TScanStatus.None then
|
||||
begin
|
||||
Output(Instance, nil, -1);
|
||||
|
@ -362,7 +365,7 @@ begin
|
|||
end;
|
||||
|
||||
var
|
||||
I, J, X, Y: Integer;
|
||||
I, J, K, X, Y: Integer;
|
||||
SL: TStringList;
|
||||
Bytes: TBytes;
|
||||
S1, S2: String;
|
||||
|
@ -373,8 +376,6 @@ var
|
|||
CfgRecArray: PCfgRecDynArray;
|
||||
CfgStruct: PCfgStruct;
|
||||
SList: TStringDynArray;
|
||||
PStr1: PAnsiChar;
|
||||
PStr2: PString;
|
||||
|
||||
initialization
|
||||
|
||||
|
@ -390,13 +391,20 @@ begin
|
|||
begin
|
||||
S1 := ChangeFileExt(ExtractFileName(CfgList[I]), '');
|
||||
Insert(S1, Codec.Names, Length(Codec.Names));
|
||||
New(CfgRecArray);
|
||||
if UIMain.DLLLoaded then
|
||||
XTLAddplugin(S1, PLUGIN_CONFIG);
|
||||
SetLength(CodecCfg[0], Succ(Length(CodecCfg[0])));
|
||||
CfgRecArray := @CodecCfg[0, Pred(Length(CodecCfg[0]))];
|
||||
X := 1;
|
||||
while ReadString('Stream' + X.ToString, 'Name', '') <> '' do
|
||||
begin
|
||||
New(CfgRec);
|
||||
J := Length(CodecCfg[0, Pred(Length(CodecCfg[0]))]);
|
||||
SetLength(CodecCfg[0, Pred(Length(CodecCfg[0]))], Succ(J));
|
||||
CfgRec := @CodecCfg[0, Pred(Length(CodecCfg[0])), J];
|
||||
CfgRec^.Parser := TExpressionParser.Create;
|
||||
CfgRec^.Name := ReadString('Stream' + X.ToString, 'Name', '');
|
||||
if UIMain.DLLLoaded then
|
||||
XTLAddCodec(CfgRec^.Name);
|
||||
CfgRec^.Codec := ReadString('Stream' + X.ToString, 'Codec', '');
|
||||
CfgRec^.BigEndian := ReadBool('Stream' + X.ToString,
|
||||
'BigEndian', False);
|
||||
|
@ -406,7 +414,11 @@ begin
|
|||
BStream := True;
|
||||
for Y := Low(SList) to High(SList) do
|
||||
begin
|
||||
New(CfgStruct);
|
||||
K := Length(CodecCfg[0, Pred(Length(CodecCfg[0])), J].Structure);
|
||||
SetLength(CodecCfg[0, Pred(Length(CodecCfg[0])),
|
||||
J].Structure, Succ(K));
|
||||
CfgStruct := @CodecCfg[0, Pred(Length(CodecCfg[0])), J]
|
||||
.Structure[K];
|
||||
DecodeHeader(SList[Y], S1, S2);
|
||||
ConvertHexChr(S2);
|
||||
CfgStruct^.Name := S1;
|
||||
|
@ -422,6 +434,8 @@ begin
|
|||
if HexValue then
|
||||
begin
|
||||
S1 := S1.Substring(1);
|
||||
while S1.Length < (CfgStruct^.Size * 2) do
|
||||
S1.Insert(0, '0');
|
||||
SetLength(Bytes, CfgStruct^.Size);
|
||||
SetLength(Bytes, HexToBin(BytesOf(S1), 0, Bytes, 0,
|
||||
Length(Bytes)));
|
||||
|
@ -437,8 +451,6 @@ begin
|
|||
CfgStruct^.Position := Pos;
|
||||
CfgStruct^.Value := 0;
|
||||
CfgStruct^.BeforeStream := BStream;
|
||||
if (CfgStruct^.Name = 'Stream') or (CfgStruct^.Size > 0) then
|
||||
Insert(CfgStruct^, CfgRec^.Structure, Length(CfgRec^.Structure));
|
||||
Inc(Pos, CfgStruct^.Size);
|
||||
if CfgStruct^.Name = 'Stream' then
|
||||
begin
|
||||
|
@ -462,11 +474,10 @@ begin
|
|||
while ReadString('Stream' + X.ToString, 'Condition' + Y.ToString,
|
||||
'') <> '' do
|
||||
begin
|
||||
New(PStr2);
|
||||
PStr2^ := ReadString('Stream' + X.ToString,
|
||||
S2 := ReadString('Stream' + X.ToString,
|
||||
'Condition' + Y.ToString, '');
|
||||
ConvertHexChr(PStr2^);
|
||||
Insert(PStr2^, CfgRec^.Conditions, Length(CfgRec^.Conditions));
|
||||
ConvertHexChr(S2);
|
||||
Insert(S2, CfgRec^.Conditions, Length(CfgRec^.Conditions));
|
||||
Inc(Y);
|
||||
end;
|
||||
ReadSectionValues('Stream' + X.ToString, SL);
|
||||
|
@ -489,10 +500,8 @@ begin
|
|||
CfgRec^.Exprs[J] := S2;
|
||||
CfgRec^.Values[J] := 0;
|
||||
end;
|
||||
Insert(CfgRec^, CfgRecArray^, Length(CfgRecArray^));
|
||||
Inc(X);
|
||||
end;
|
||||
Insert(CfgRecArray^, CodecCfg[0], Length(CodecCfg[0]));
|
||||
end;
|
||||
finally
|
||||
Free;
|
||||
|
@ -504,10 +513,10 @@ for J := Low(CodecCfg[0]) to High(CodecCfg[0]) do
|
|||
begin
|
||||
with CodecCfg[0, J, X] do
|
||||
begin
|
||||
for Y := Low(Names) to High(Names) do
|
||||
Parser.DefineVariable(Names[Y], @Values[Y]);
|
||||
for Y := Low(Structure) to High(Structure) do
|
||||
Parser.DefineVariable(Structure[Y].Name, @Structure[Y].Value);
|
||||
for Y := Low(Names) to High(Names) do
|
||||
Parser.DefineVariable(Names[Y], @Values[Y]);
|
||||
end;
|
||||
end;
|
||||
|
||||
|
|
|
@ -0,0 +1,707 @@
|
|||
unit PrecompINIEx;
|
||||
|
||||
interface
|
||||
|
||||
uses
|
||||
Utils, ParseExpr,
|
||||
UIMain,
|
||||
PrecompUtils,
|
||||
WinAPI.Windows,
|
||||
System.SysUtils, System.Classes, System.StrUtils,
|
||||
System.Types, System.Math, System.IOUtils, System.IniFiles;
|
||||
|
||||
var
|
||||
Codec: TPrecompressor;
|
||||
|
||||
implementation
|
||||
|
||||
type
|
||||
PCfgStruct = ^TCfgStruct;
|
||||
|
||||
TCfgStruct = record
|
||||
Name: String;
|
||||
Data: Pointer;
|
||||
Position, Size: NativeInt;
|
||||
Value: Double;
|
||||
BeforeStream: Boolean;
|
||||
end;
|
||||
|
||||
PCfgCounter = ^TCfgCounter;
|
||||
|
||||
TCfgCounter = record
|
||||
StartS, EndS, StepS: String;
|
||||
StartV, EndV, StepV: Double;
|
||||
Current, Min, Max: Double;
|
||||
end;
|
||||
|
||||
PConfigRec = ^TConfigRec;
|
||||
|
||||
TConfigRec = record
|
||||
Parser: TExpressionParser;
|
||||
Name, Codec: String;
|
||||
Resource: Integer;
|
||||
BigEndian: Boolean;
|
||||
Structure: array [0 .. 2] of TArray<TCfgStruct>;
|
||||
Counter: TArray<TCfgCounter>;
|
||||
StreamPosition, StreamOffset, OldSize, NewSize, DepthSize: String;
|
||||
Names, Exprs: TArray<String>;
|
||||
Values: TArray<Double>;
|
||||
Conditions: TArray<String>;
|
||||
end;
|
||||
|
||||
PCfgRecDynArray = ^TCfgRecDynArray;
|
||||
TCfgRecDynArray = TArray<TConfigRec>;
|
||||
|
||||
var
|
||||
CfgList: TStringDynArray;
|
||||
CodecCfg: TArray<TArray<TCfgRecDynArray>>;
|
||||
CodecAvailable, CodecEnabled: TArray<TArray<Boolean>>;
|
||||
|
||||
procedure EndianMove(Source, Dest: Pointer; Size: NativeInt;
|
||||
BigEndian: Boolean = False);
|
||||
begin
|
||||
if BigEndian then
|
||||
ReverseBytes(Source, Dest, Size)
|
||||
else
|
||||
Move(Source^, Dest^, Size);
|
||||
end;
|
||||
|
||||
function ConfigInit(Command: PChar; Count: Integer;
|
||||
Funcs: PPrecompFuncs): Boolean;
|
||||
var
|
||||
I, J: Integer;
|
||||
X, Y, Z: Integer;
|
||||
S: String;
|
||||
ParamsSet: Boolean;
|
||||
begin
|
||||
Result := True;
|
||||
ParamsSet := False;
|
||||
for X := Low(CodecAvailable) to High(CodecAvailable) do
|
||||
for Y := Low(CodecAvailable[X]) to High(CodecAvailable[X]) do
|
||||
begin
|
||||
CodecAvailable[X, Y] := True;
|
||||
CodecEnabled[X, Y] := False;
|
||||
end;
|
||||
SetLength(CodecCfg, Count);
|
||||
for I := 1 to High(CodecCfg) do
|
||||
begin
|
||||
SetLength(CodecCfg[I], Length(CodecCfg[0]));
|
||||
for J := Low(CodecCfg[I]) to High(CodecCfg[I]) do
|
||||
SetLength(CodecCfg[I, J], Length(CodecCfg[0, J]));
|
||||
end;
|
||||
for I := Low(CodecCfg) to High(CodecCfg) do
|
||||
for J := Low(CodecCfg[I]) to High(CodecCfg[I]) do
|
||||
for X := Low(CodecCfg[I, J]) to High(CodecCfg[I, J]) do
|
||||
with CodecCfg[I, J, X] do
|
||||
begin
|
||||
if I = 0 then
|
||||
Resource := RegisterResources(Codec);
|
||||
if I > 0 then
|
||||
begin
|
||||
Parser := TExpressionParser.Create;
|
||||
Name := CodecCfg[0, J, X].Name;
|
||||
Codec := CodecCfg[0, J, X].Codec;
|
||||
Resource := CodecCfg[0, J, X].Resource;
|
||||
BigEndian := CodecCfg[0, J, X].BigEndian;
|
||||
for Z := Low(Structure) to High(Structure) do
|
||||
begin
|
||||
SetLength(Structure[Z], Length(CodecCfg[0, J, X].Structure[Z]));
|
||||
for Y := Low(Structure[Z]) to High(Structure[Z]) do
|
||||
begin
|
||||
Structure[Z, Y].Name := CodecCfg[0, J, X].Structure[Z, Y].Name;
|
||||
Structure[Z, Y].Position := CodecCfg[0, J, X].Structure[Z]
|
||||
[Y].Position;
|
||||
Structure[Z, Y].Size := CodecCfg[0, J, X].Structure[Z, Y].Size;
|
||||
Structure[Z, Y].Value := CodecCfg[0, J, X].Structure
|
||||
[Z, Y].Value;
|
||||
Structure[Z, Y].BeforeStream := CodecCfg[0, J, X].Structure
|
||||
[Z, Y].BeforeStream;
|
||||
GetMem(Structure[Z, Y].Data, Structure[Z, Y].Size);
|
||||
Move(CodecCfg[0, J, X].Structure[Z, Y].Data^,
|
||||
Structure[Z, Y].Data^, Structure[Z, Y].Size);
|
||||
end;
|
||||
end;
|
||||
SetLength(Counter, Length(CodecCfg[0, J, X].Counter));
|
||||
for Y := Low(Counter) to High(Counter) do
|
||||
begin
|
||||
Counter[Y].StartS := CodecCfg[0, J, X].Counter[Y].StartS;
|
||||
Counter[Y].EndS := CodecCfg[0, J, X].Counter[Y].EndS;
|
||||
Counter[Y].StepS := CodecCfg[0, J, X].Counter[Y].StepS;
|
||||
Counter[Y].StartV := CodecCfg[0, J, X].Counter[Y].StartV;
|
||||
Counter[Y].EndV := CodecCfg[0, J, X].Counter[Y].EndV;
|
||||
Counter[Y].StepV := CodecCfg[0, J, X].Counter[Y].StepV;
|
||||
Counter[Y].Current := CodecCfg[0, J, X].Counter[Y].Current;
|
||||
Counter[Y].Min := CodecCfg[0, J, X].Counter[Y].Min;
|
||||
Counter[Y].Max := CodecCfg[0, J, X].Counter[Y].Max;
|
||||
end;
|
||||
StreamPosition := CodecCfg[0, J, X].StreamPosition;
|
||||
StreamOffset := CodecCfg[0, J, X].StreamOffset;
|
||||
OldSize := CodecCfg[0, J, X].OldSize;
|
||||
NewSize := CodecCfg[0, J, X].NewSize;
|
||||
DepthSize := CodecCfg[0, J, X].DepthSize;
|
||||
SetLength(Names, Length(CodecCfg[0, J, X].Names));
|
||||
SetLength(Exprs, Length(CodecCfg[0, J, X].Exprs));
|
||||
SetLength(Values, Length(CodecCfg[0, J, X].Values));
|
||||
for Y := Low(Names) to High(Names) do
|
||||
begin
|
||||
Names[Y] := CodecCfg[0, J, X].Names[Y];
|
||||
Exprs[Y] := CodecCfg[0, J, X].Exprs[Y];
|
||||
Values[Y] := CodecCfg[0, J, X].Values[Y];
|
||||
end;
|
||||
SetLength(Conditions, Length(CodecCfg[0, J, X].Conditions));
|
||||
for Y := Low(Conditions) to High(Conditions) do
|
||||
Conditions[Y] := CodecCfg[0, J, X].Conditions[Y];
|
||||
for Z := Low(Structure) to High(Structure) do
|
||||
for Y := Low(Structure[Z]) to High(Structure[Z]) do
|
||||
Parser.DefineVariable(Structure[Z, Y].Name,
|
||||
@Structure[Z, Y].Value);
|
||||
for Y := Low(Counter) to High(Counter) do
|
||||
begin
|
||||
Parser.DefineVariable('Counter' + Succ(Y).ToString,
|
||||
@Counter[Y].Current);
|
||||
Parser.DefineVariable('CounterMin' + Succ(Y).ToString,
|
||||
@Counter[Y].Min);
|
||||
Parser.DefineVariable('CounterMax' + Succ(Y).ToString,
|
||||
@Counter[Y].Max);
|
||||
end;
|
||||
for Y := Low(Names) to High(Names) do
|
||||
Parser.DefineVariable(Names[Y], @Values[Y]);
|
||||
end;
|
||||
end;
|
||||
X := 0;
|
||||
while Funcs^.GetCodec(Command, X, False) <> '' do
|
||||
begin
|
||||
S := Funcs^.GetCodec(Command, X, False);
|
||||
for Y := Low(Codec.Names) to High(Codec.Names) do
|
||||
if CompareText(S, Codec.Names[Y]) = 0 then
|
||||
begin
|
||||
for I := Low(CodecEnabled[Y]) to High(CodecEnabled[Y]) do
|
||||
CodecEnabled[Y, I] := True;
|
||||
for Z := Low(CodecCfg[0, Y]) to High(CodecCfg[0, Y]) do
|
||||
if Funcs^.GetParam(Command, X, PChar(CodecCfg[0, Y, Z].Name)) <> ''
|
||||
then
|
||||
begin
|
||||
if not ParamsSet then
|
||||
begin
|
||||
for I := Low(CodecEnabled[Y]) to High(CodecEnabled[Y]) do
|
||||
CodecEnabled[Y, I] := False;
|
||||
ParamsSet := True;
|
||||
end;
|
||||
CodecEnabled[Y, Z] := True;
|
||||
end;
|
||||
break;
|
||||
end;
|
||||
Inc(X);
|
||||
end;
|
||||
for X := Low(CodecEnabled) to High(CodecEnabled) do
|
||||
for Y := Low(CodecEnabled[X]) to High(CodecEnabled[X]) do
|
||||
if CodecEnabled[X, Y] then
|
||||
AddMethod(PrecompGetCodec(PChar(CodecCfg[0, X, Y].Codec), 0, False));
|
||||
end;
|
||||
|
||||
procedure ConfigFree(Funcs: PPrecompFuncs);
|
||||
var
|
||||
I, J: Integer;
|
||||
X, Y, Z: Integer;
|
||||
begin
|
||||
for I := Low(CodecCfg) to High(CodecCfg) do
|
||||
for J := Low(CodecCfg[I]) to High(CodecCfg[I]) do
|
||||
for X := Low(CodecCfg[I, J]) to High(CodecCfg[I, J]) do
|
||||
with CodecCfg[I, J, X] do
|
||||
begin
|
||||
if I > 0 then
|
||||
begin
|
||||
for Z := Low(Structure) to High(Structure) do
|
||||
for Y := Low(Structure[Z]) to High(Structure[Z]) do
|
||||
FreeMem(Structure[Z, Y].Data);
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
|
||||
function ConfigParse(Command: String; Option: PInteger;
|
||||
Funcs: PPrecompFuncs): Boolean;
|
||||
begin
|
||||
Result := False;
|
||||
end;
|
||||
|
||||
procedure ConfigScan1(Instance, Depth: Integer; Input: PByte;
|
||||
Size, SizeEx: NativeInt; Output: _PrecompOutput; Add: _PrecompAdd;
|
||||
Funcs: PPrecompFuncs);
|
||||
type
|
||||
TScanStatus = (None, Success, Fail);
|
||||
var
|
||||
Status: TScanStatus;
|
||||
A, B: Integer;
|
||||
I, J: Integer;
|
||||
X, Y: Integer;
|
||||
Pos: NativeInt;
|
||||
NI: NativeInt;
|
||||
I64: Int64;
|
||||
LoopPosInt, StreamPosInt1, StreamPosInt2, StreamOffsetInt, OldSizeInt,
|
||||
NewSizeInt, DepthSizeInt: NativeInt;
|
||||
LoopContinue: Boolean;
|
||||
SI: _StrInfo1;
|
||||
DI: TDepthInfo;
|
||||
DS: TPrecompStr;
|
||||
|
||||
procedure UpdateCounters(var C: TConfigRec);
|
||||
var
|
||||
Z: Integer;
|
||||
begin
|
||||
with C do
|
||||
for Z := Low(Counter) to High(Counter) do
|
||||
begin
|
||||
Counter[Z].StartV := Parser.Evaluate(Counter[Z].StartS);
|
||||
Counter[Z].EndV := Parser.Evaluate(Counter[Z].EndS);
|
||||
Counter[Z].StepV := Parser.Evaluate(Counter[Z].StepS);
|
||||
end;
|
||||
end;
|
||||
|
||||
function CheckCounters(C: TConfigRec): Boolean;
|
||||
var
|
||||
Z: Integer;
|
||||
begin
|
||||
Result := True;
|
||||
with C do
|
||||
for Z := Low(Counter) to High(Counter) do
|
||||
if not InRange(Round(Counter[Z].Current), Min(Round(Counter[Z].StartV),
|
||||
Round(Counter[Z].EndV)), Max(Round(Counter[Z].StartV),
|
||||
Round(Counter[Z].EndV))) then
|
||||
Exit(False);
|
||||
end;
|
||||
|
||||
procedure DoAddStream(C: TConfigRec);
|
||||
begin
|
||||
with C do
|
||||
begin
|
||||
Output(Instance, nil, -1);
|
||||
SI.Position := StreamPosInt1 + StreamOffsetInt;
|
||||
SI.OldSize := OldSizeInt;
|
||||
SI.NewSize := NewSizeInt;
|
||||
SI.Resource := Resource;
|
||||
SI.Option := 0;
|
||||
if System.Pos(SPrecompSep2, Codec) > 0 then
|
||||
SI.Status := TStreamStatus.Predicted
|
||||
else
|
||||
SI.Status := TStreamStatus.None;
|
||||
DS := Funcs^.GetDepthCodec(PChar(Codec));
|
||||
Move(DS[0], DI.Codec, SizeOf(DI.Codec));
|
||||
DI.OldSize := NewSizeInt;
|
||||
DI.NewSize := DepthSizeInt;
|
||||
Add(Instance, @SI, PChar(Codec), @DI);
|
||||
Status := TScanStatus.Success;
|
||||
end;
|
||||
end;
|
||||
|
||||
begin
|
||||
if Depth > 0 then
|
||||
Exit;
|
||||
for I := Low(CodecCfg[Instance]) to High(CodecCfg[Instance]) do
|
||||
for J := Low(CodecCfg[Instance, I]) to High(CodecCfg[Instance, I]) do
|
||||
if CodecEnabled[I, J] then
|
||||
with CodecCfg[Instance, I, J] do
|
||||
for X := Low(Structure[0]) to High(Structure[0]) do
|
||||
if Structure[0, X].Name = 'Signature' then
|
||||
begin
|
||||
Pos := 0;
|
||||
while BinarySearch(Input, Pos, Size, Structure[0, X].Data,
|
||||
Structure[0, X].Size, Pos) do
|
||||
begin
|
||||
Status := TScanStatus.None;
|
||||
LoopPosInt := Pos + Structure[0, X].Size;
|
||||
for Y := Low(Structure[0]) to High(Structure[0]) do
|
||||
begin
|
||||
if (X <> Y) then
|
||||
begin
|
||||
NI := Structure[0, Y].Position - Structure[0, X].Position;
|
||||
LoopPosInt := Pos + Structure[0, Y].Size + NI;
|
||||
if InRange(Pos + NI, 0, SizeEx - Structure[0, Y].Size) then
|
||||
begin
|
||||
Move((Input + Pos + NI)^, Structure[0, Y].Data^,
|
||||
Structure[0, Y].Size);
|
||||
I64 := 0;
|
||||
EndianMove(Structure[0, Y].Data, @I64,
|
||||
Min(Structure[0, Y].Size, I64.Size), BigEndian);
|
||||
Structure[0, Y].Value := I64.ToDouble;
|
||||
end
|
||||
else
|
||||
Status := TScanStatus.Fail;
|
||||
end;
|
||||
if Status = TScanStatus.Fail then
|
||||
break;
|
||||
end;
|
||||
if Status = TScanStatus.Fail then
|
||||
begin
|
||||
Inc(Pos);
|
||||
continue;
|
||||
end;
|
||||
UpdateCounters(CodecCfg[Instance, I, J]);
|
||||
for Y := Low(Counter) to High(Counter) do
|
||||
begin
|
||||
Counter[Y].Current := Counter[Y].StartV;
|
||||
Counter[Y].Min := Min(Counter[Y].StepV,
|
||||
Counter[Y].EndV - Counter[Y].Current);
|
||||
Counter[Y].Max := Max(Counter[Y].StepV,
|
||||
Counter[Y].EndV - Counter[Y].Current);
|
||||
end;
|
||||
while CheckCounters(CodecCfg[Instance, I, J]) do
|
||||
begin
|
||||
Status := TScanStatus.None;
|
||||
for Y := Low(Structure[1]) to High(Structure[1]) do
|
||||
begin
|
||||
if InRange(LoopPosInt, 0, SizeEx - Structure[1, Y].Size)
|
||||
then
|
||||
begin
|
||||
Move((Input + LoopPosInt)^, Structure[1, Y].Data^,
|
||||
Structure[1, Y].Size);
|
||||
I64 := 0;
|
||||
EndianMove(Structure[1, Y].Data, @I64,
|
||||
Min(Structure[1, Y].Size, I64.Size), BigEndian);
|
||||
Structure[1, Y].Value := I64.ToDouble;
|
||||
end
|
||||
else
|
||||
begin
|
||||
Status := TScanStatus.Fail;
|
||||
break;
|
||||
end;
|
||||
Inc(LoopPosInt, Structure[1, Y].Size);
|
||||
end;
|
||||
if Status = TScanStatus.Fail then
|
||||
break;
|
||||
StreamPosInt1 := Pos + Round(Parser.Evaluate(StreamPosition));
|
||||
StreamPosInt2 := StreamPosInt1;
|
||||
for Y := Low(Structure[2]) to High(Structure[2]) do
|
||||
begin
|
||||
if (Structure[2, Y].BeforeStream = True) then
|
||||
begin
|
||||
if Structure[2, Y].Name = 'Stream' then
|
||||
begin
|
||||
StreamPosInt1 := StreamPosInt2;
|
||||
continue;
|
||||
end;
|
||||
Funcs^.ReadFuture(Instance, StreamPosInt2,
|
||||
Structure[2, Y].Data, Structure[2, Y].Size);
|
||||
I64 := 0;
|
||||
EndianMove(Structure[2, Y].Data, @I64,
|
||||
Min(Structure[2, Y].Size, I64.Size), BigEndian);
|
||||
Structure[2, Y].Value := I64.ToDouble;
|
||||
Inc(StreamPosInt2, Structure[2, Y].Size);
|
||||
end;
|
||||
end;
|
||||
for A := Low(Exprs) to High(Exprs) do
|
||||
begin
|
||||
for B := Low(Exprs) to High(Exprs) do
|
||||
try
|
||||
if A = B then
|
||||
continue;
|
||||
Values[B] := Parser.Evaluate(Exprs[B]);
|
||||
except
|
||||
end;
|
||||
try
|
||||
Values[A] := Parser.Evaluate(Exprs[A]);
|
||||
except
|
||||
end;
|
||||
end;
|
||||
StreamOffsetInt := Round(Parser.Evaluate(StreamOffset));
|
||||
OldSizeInt := Round(Parser.Evaluate(OldSize));
|
||||
NewSizeInt := Round(Parser.Evaluate(NewSize));
|
||||
DepthSizeInt := Round(Parser.Evaluate(DepthSize));
|
||||
for Y := Low(Structure[2]) to High(Structure[2]) do
|
||||
begin
|
||||
if (Structure[2, Y].BeforeStream = False) then
|
||||
begin
|
||||
Funcs^.ReadFuture(Instance, StreamPosInt2 + OldSizeInt,
|
||||
Structure[2, Y].Data, Structure[2, Y].Size);
|
||||
I64 := 0;
|
||||
EndianMove(Structure[2, Y].Data, @I64,
|
||||
Min(Structure[2, Y].Size, I64.Size), BigEndian);
|
||||
Structure[2, Y].Value := I64.ToDouble;
|
||||
Inc(StreamPosInt2, Structure[2, Y].Size);
|
||||
end;
|
||||
end;
|
||||
if Length(Conditions) = 0 then
|
||||
DoAddStream(CodecCfg[Instance, I, J])
|
||||
else
|
||||
for Y := Low(Conditions) to High(Conditions) do
|
||||
begin
|
||||
if (Round(Parser.Evaluate(Conditions[Y])) <> 0) and
|
||||
(Y = High(Conditions)) then
|
||||
DoAddStream(CodecCfg[Instance, I, J])
|
||||
else
|
||||
break;
|
||||
end;
|
||||
UpdateCounters(CodecCfg[Instance, I, J]);
|
||||
for Y := Low(Counter) to High(Counter) do
|
||||
begin
|
||||
Counter[Y].Current := Counter[Y].Current + Counter[Y].StepV;
|
||||
Counter[Y].Min :=
|
||||
Min(Counter[Y].StepV,
|
||||
Counter[Y].EndV - Counter[Y].Current);
|
||||
Counter[Y].Max :=
|
||||
Max(Counter[Y].StepV,
|
||||
Counter[Y].EndV - Counter[Y].Current);
|
||||
end;
|
||||
end;
|
||||
Inc(Pos);
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
|
||||
function ConfigScan2(Instance, Depth: Integer; Input: Pointer; Size: NativeInt;
|
||||
StreamInfo: PStrInfo2; Offset: PInteger; Output: _PrecompOutput;
|
||||
Funcs: PPrecompFuncs): Boolean;
|
||||
begin
|
||||
Result := False;
|
||||
end;
|
||||
|
||||
function ConfigProcess(Instance, Depth: Integer; OldInput, NewInput: Pointer;
|
||||
StreamInfo: PStrInfo2; Output: _PrecompOutput; Funcs: PPrecompFuncs): Boolean;
|
||||
begin
|
||||
Result := False;
|
||||
end;
|
||||
|
||||
function ConfigRestore(Instance, Depth: Integer; Input, InputExt: Pointer;
|
||||
StreamInfo: _StrInfo3; Output: _PrecompOutput; Funcs: PPrecompFuncs): Boolean;
|
||||
begin
|
||||
Result := False;
|
||||
end;
|
||||
|
||||
procedure DecodeHeader(const Header: String; out Name, Value: String);
|
||||
begin
|
||||
if (Pos('(', Header) > 0) and (Pos(')', Header) > 0) then
|
||||
begin
|
||||
Name := ReplaceStr(Header.Substring(0, Header.IndexOf('(')), ' ', '');
|
||||
Value := Header.Substring(Succ(Header.IndexOf('(')),
|
||||
Header.IndexOf(')') - Succ(Header.IndexOf('(')));
|
||||
end
|
||||
else
|
||||
Name := Header;
|
||||
end;
|
||||
|
||||
procedure ConvertHexChr(var S: String);
|
||||
begin
|
||||
S := ReplaceStr(S, '0x', '$');
|
||||
S := ReplaceStr(S, '#', '$');
|
||||
end;
|
||||
|
||||
var
|
||||
I, J, K, X, Y, Z: Integer;
|
||||
SL: TStringList;
|
||||
Bytes: TBytes;
|
||||
S1, S2, S3: String;
|
||||
Pos: Integer;
|
||||
BStream: Boolean;
|
||||
HexValue: Boolean;
|
||||
CfgRec: PConfigRec;
|
||||
CfgRecArray: PCfgRecDynArray;
|
||||
CfgStruct: PCfgStruct;
|
||||
CfgCounter: PCfgCounter;
|
||||
SList: TStringDynArray;
|
||||
|
||||
initialization
|
||||
|
||||
CfgList := TDirectory.GetFiles(ExtractFilePath(Utils.GetModuleName), '*.ini',
|
||||
TSearchOption.soTopDirectoryOnly);
|
||||
SL := TStringList.Create;
|
||||
SetLength(CodecCfg, 1);
|
||||
for I := Low(CfgList) to High(CfgList) do
|
||||
begin
|
||||
with TIniFile.Create(CfgList[I]) do
|
||||
try
|
||||
if ReadString('StreamList1', 'Name', '') <> '' then
|
||||
begin
|
||||
S1 := ChangeFileExt(ExtractFileName(CfgList[I]), '');
|
||||
Insert(S1, Codec.Names, Length(Codec.Names));
|
||||
if UIMain.DLLLoaded then
|
||||
XTLAddplugin(S1, PLUGIN_CONFIG);
|
||||
SetLength(CodecCfg[0], Succ(Length(CodecCfg[0])));
|
||||
CfgRecArray := @CodecCfg[0, Pred(Length(CodecCfg[0]))];
|
||||
X := 1;
|
||||
while ReadString('StreamList' + X.ToString, 'Name', '') <> '' do
|
||||
begin
|
||||
J := Length(CodecCfg[0, Pred(Length(CodecCfg[0]))]);
|
||||
SetLength(CodecCfg[0, Pred(Length(CodecCfg[0]))], Succ(J));
|
||||
CfgRec := @CodecCfg[0, Pred(Length(CodecCfg[0])), J];
|
||||
CfgRec^.Parser := TExpressionParser.Create;
|
||||
CfgRec^.Name := ReadString('StreamList' + X.ToString, 'Name', '');
|
||||
if UIMain.DLLLoaded then
|
||||
XTLAddCodec(CfgRec^.Name);
|
||||
CfgRec^.Codec := ReadString('StreamList' + X.ToString, 'Codec', '');
|
||||
CfgRec^.BigEndian := ReadBool('StreamList' + X.ToString,
|
||||
'BigEndian', False);
|
||||
for Z := Low(CfgRec^.Structure) to High(CfgRec^.Structure) do
|
||||
begin
|
||||
case Z of
|
||||
0:
|
||||
S3 := 'Structure1';
|
||||
1:
|
||||
S3 := 'StructureN';
|
||||
2:
|
||||
S3 := 'StructureS';
|
||||
end;
|
||||
SList := DecodeStr(ReadString('StreamList' + X.ToString, S3,
|
||||
''), ',');
|
||||
Pos := 0;
|
||||
BStream := True;
|
||||
for Y := Low(SList) to High(SList) do
|
||||
begin
|
||||
K := Length(CodecCfg[0, Pred(Length(CodecCfg[0])),
|
||||
J].Structure[Z]);
|
||||
SetLength(CodecCfg[0, Pred(Length(CodecCfg[0])), J].Structure
|
||||
[Z], Succ(K));
|
||||
CfgStruct := @CodecCfg[0, Pred(Length(CodecCfg[0])), J]
|
||||
.Structure[Z, K];
|
||||
DecodeHeader(SList[Y], S1, S2);
|
||||
ConvertHexChr(S2);
|
||||
CfgStruct^.Name := S1;
|
||||
CfgStruct^.Size :=
|
||||
Round(IfThen(S2 <> '', CfgRec^.Parser.Evaluate(S2), 0));
|
||||
GetMem(CfgStruct^.Data, CfgStruct^.Size);
|
||||
if (Z = 0) and (CfgStruct^.Name = 'Signature') then
|
||||
begin
|
||||
S1 := ReplaceStr(ReadString('StreamList' + X.ToString,
|
||||
'Signature', '0'), ' ', '');
|
||||
ConvertHexChr(S1);
|
||||
HexValue := S1[1] = '$';
|
||||
if HexValue then
|
||||
begin
|
||||
S1 := S1.Substring(1);
|
||||
while S1.Length < (CfgStruct^.Size * 2) do
|
||||
S1.Insert(0, '0');
|
||||
SetLength(Bytes, CfgStruct^.Size);
|
||||
SetLength(Bytes, HexToBin(BytesOf(S1), 0, Bytes, 0,
|
||||
Length(Bytes)));
|
||||
ReverseBytes(@Bytes[0], CfgStruct^.Data, CfgStruct^.Size);
|
||||
end
|
||||
else
|
||||
begin
|
||||
Bytes := BytesOf(S1);
|
||||
SetLength(Bytes, CfgStruct^.Size);
|
||||
Move(Bytes[0], CfgStruct^.Data^, CfgStruct^.Size);
|
||||
end;
|
||||
end;
|
||||
CfgStruct^.Position := Pos;
|
||||
CfgStruct^.Value := 0;
|
||||
CfgStruct^.BeforeStream := BStream;
|
||||
Inc(Pos, CfgStruct^.Size);
|
||||
if (Z = 2) and (CfgStruct^.Name = 'Stream') then
|
||||
begin
|
||||
Pos := 0;
|
||||
BStream := False;
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
Y := 1;
|
||||
while ReadString('StreamList' + X.ToString,
|
||||
'CounterStart' + Y.ToString, '') <> '' do
|
||||
begin
|
||||
K := Length(CodecCfg[0, Pred(Length(CodecCfg[0])), J].Counter);
|
||||
SetLength(CodecCfg[0, Pred(Length(CodecCfg[0])),
|
||||
J].Counter, Succ(K));
|
||||
CfgCounter := @CodecCfg[0, Pred(Length(CodecCfg[0])), J].Counter[K];
|
||||
CfgCounter^.StartS := ReadString('StreamList' + X.ToString,
|
||||
'CounterStart' + Y.ToString, '');
|
||||
CfgCounter^.EndS := ReadString('StreamList' + X.ToString,
|
||||
'CounterEnd' + Y.ToString, '');
|
||||
CfgCounter^.StepS := ReadString('StreamList' + X.ToString,
|
||||
'CounterStep' + Y.ToString, '');
|
||||
CfgCounter^.StartV := 0;
|
||||
CfgCounter^.EndV := 0;
|
||||
CfgCounter^.StepV := 0;
|
||||
CfgCounter^.Current := 0;
|
||||
CfgCounter^.Min := 0;
|
||||
CfgCounter^.Max := 0;
|
||||
Inc(Y);
|
||||
end;
|
||||
CfgRec^.StreamPosition := ReadString('StreamList' + X.ToString,
|
||||
'StreamPosition', '');
|
||||
CfgRec^.StreamOffset := ReadString('StreamList' + X.ToString,
|
||||
'StreamOffset', '0');
|
||||
ConvertHexChr(CfgRec^.StreamOffset);
|
||||
CfgRec^.OldSize := ReadString('StreamList' + X.ToString,
|
||||
'CompressedSize', '0');
|
||||
ConvertHexChr(CfgRec^.OldSize);
|
||||
CfgRec^.NewSize := ReadString('StreamList' + X.ToString,
|
||||
'DecompressedSize', '0');
|
||||
ConvertHexChr(CfgRec^.NewSize);
|
||||
CfgRec^.DepthSize := ReadString('StreamList' + X.ToString,
|
||||
'DepthSize', '0');
|
||||
ConvertHexChr(CfgRec^.DepthSize);
|
||||
Y := 1;
|
||||
while ReadString('StreamList' + X.ToString, 'Condition' + Y.ToString,
|
||||
'') <> '' do
|
||||
begin
|
||||
S2 := ReadString('StreamList' + X.ToString,
|
||||
'Condition' + Y.ToString, '');
|
||||
ConvertHexChr(S2);
|
||||
Insert(S2, CfgRec^.Conditions, Length(CfgRec^.Conditions));
|
||||
Inc(Y);
|
||||
end;
|
||||
ReadSectionValues('StreamList' + X.ToString, SL);
|
||||
for J := SL.Count - 1 downto 0 do
|
||||
begin
|
||||
S1 := SL[J].Substring(0, SL[J].IndexOf('=')).TrimRight;
|
||||
S2 := SL[J].Substring(Succ(SL[J].IndexOf('='))).TrimLeft;
|
||||
if (IndexText(S1, ['Name', 'Codec', 'BigEndian', 'Signature',
|
||||
'Structure1', 'StructureN', 'StructureS']) >= 0) or
|
||||
S1.StartsWith('Condition', True) or S1.StartsWith('CounterStart',
|
||||
True) or S1.StartsWith('CounterEnd', True) or
|
||||
S1.StartsWith('CounterStep', True) then
|
||||
SL.Delete(J);
|
||||
end;
|
||||
SetLength(CfgRec^.Names, SL.Count);
|
||||
SetLength(CfgRec^.Exprs, SL.Count);
|
||||
SetLength(CfgRec^.Values, SL.Count);
|
||||
for J := 0 to SL.Count - 1 do
|
||||
begin
|
||||
S1 := SL[J].Substring(0, SL[J].IndexOf('=')).TrimRight;
|
||||
S2 := SL[J].Substring(Succ(SL[J].IndexOf('='))).TrimLeft;
|
||||
CfgRec^.Names[J] := S1;
|
||||
CfgRec^.Exprs[J] := S2;
|
||||
CfgRec^.Values[J] := 0;
|
||||
end;
|
||||
Inc(X);
|
||||
end;
|
||||
end;
|
||||
finally
|
||||
Free;
|
||||
end;
|
||||
end;
|
||||
|
||||
for J := Low(CodecCfg[0]) to High(CodecCfg[0]) do
|
||||
for X := Low(CodecCfg[0, J]) to High(CodecCfg[0, J]) do
|
||||
begin
|
||||
with CodecCfg[0, J, X] do
|
||||
begin
|
||||
for Z := Low(Structure) to High(Structure) do
|
||||
for Y := Low(Structure[Z]) to High(Structure[Z]) do
|
||||
Parser.DefineVariable(Structure[Z, Y].Name, @Structure[Z, Y].Value);
|
||||
for Y := Low(Counter) to High(Counter) do
|
||||
begin
|
||||
Parser.DefineVariable('Counter' + Succ(Y).ToString,
|
||||
@Counter[Y].Current);
|
||||
Parser.DefineVariable('CounterMin' + Succ(Y).ToString, @Counter[Y].Min);
|
||||
Parser.DefineVariable('CounterMax' + Succ(Y).ToString, @Counter[Y].Max);
|
||||
end;
|
||||
for Y := Low(Names) to High(Names) do
|
||||
Parser.DefineVariable(Names[Y], @Values[Y]);
|
||||
end;
|
||||
end;
|
||||
|
||||
Codec.Initialised := False;
|
||||
Codec.Init := @ConfigInit;
|
||||
Codec.Free := @ConfigFree;
|
||||
Codec.Parse := @ConfigParse;
|
||||
Codec.Scan1 := @ConfigScan1;
|
||||
Codec.Scan2 := @ConfigScan2;
|
||||
Codec.Process := @ConfigProcess;
|
||||
Codec.Restore := @ConfigRestore;
|
||||
SetLength(CodecAvailable, Length(CodecCfg[0]));
|
||||
SetLength(CodecEnabled, Length(CodecCfg[0]));
|
||||
for I := Low(CodecCfg[0]) to High(CodecCfg[0]) do
|
||||
begin
|
||||
SetLength(CodecAvailable[I], Length(CodecCfg[0, I]));
|
||||
SetLength(CodecEnabled[I], Length(CodecCfg[0, I]));
|
||||
end;
|
||||
|
||||
end.
|
|
@ -7,7 +7,8 @@ interface
|
|||
uses
|
||||
Threading, Utils, SynCommons, ParseClass, ParseExpr, FLZMA2DLL,
|
||||
PrecompUtils, PrecompCrypto, PrecompZLib, PrecompLZ4, PrecompLZO, PrecompZSTD,
|
||||
PrecompOodle, PrecompMedia, PrecompINI, PrecompSearch, PrecompDLL, PrecompEXE,
|
||||
PrecompOodle, PrecompMedia, PrecompINI, PrecompINIEx, PrecompSearch,
|
||||
PrecompDLL, PrecompEXE,
|
||||
WinAPI.Windows, WinAPI.ShlObj,
|
||||
System.SysUtils, System.Classes, System.SyncObjs, System.Math, System.Types,
|
||||
System.StrUtils, System.RTLConsts, System.TimeSpan, System.Diagnostics,
|
||||
|
@ -103,12 +104,15 @@ var
|
|||
Codecs: array of TPrecompressor;
|
||||
DBFile: String = '';
|
||||
ExtDir: String = '';
|
||||
SrepMemCfg: String;
|
||||
UseDB: Boolean = False;
|
||||
StoreDD: Integer = -2;
|
||||
VERBOSE: Boolean = False;
|
||||
EXTRACT: Boolean = False;
|
||||
NOVERIFY: Boolean = False;
|
||||
DupSysMem: Int64 = 0;
|
||||
EncInfo: TEncInfo;
|
||||
EncFreed: Boolean = False;
|
||||
ConTask: TTask;
|
||||
Stopwatch: TStopwatch;
|
||||
|
||||
|
@ -186,18 +190,24 @@ begin
|
|||
Options.Depth := EnsureRange(Succ(ArgParse.AsInteger('-d', 0, 0)), 1, 10);
|
||||
Options.LowMem := ArgParse.AsBoolean('-lm');
|
||||
UseDB := ArgParse.AsBoolean('-db') or ArgParse.AsBoolean('--dbase');
|
||||
Options.DBaseFile := ArgParse.AsString('--dbase=');
|
||||
Options.DBaseFile := ArgParse.AsString('--dbase=', 0, '');
|
||||
Options.DBaseFile := ArgParse.AsString('-db', 0, Options.DBaseFile);
|
||||
if Options.DBaseFile <> '' then
|
||||
UseDB := True;
|
||||
StoreDD := -2;
|
||||
if ArgParse.AsBoolean('-dd') or ArgParse.AsBoolean('--dedup') then
|
||||
StoreDD := -1;
|
||||
if FileExists(ExtractFilePath(Utils.GetModuleName) + 'srep.exe') then
|
||||
begin
|
||||
StoreDD := ArgParse.AsInteger('--dedup=', 0, StoreDD);
|
||||
StoreDD := ArgParse.AsInteger('-dd', 0, StoreDD);
|
||||
end;
|
||||
S := ArgParse.AsString('--diff=', 0, '5p');
|
||||
S := ArgParse.AsString('-df', 0, S);
|
||||
S := ReplaceText(S, 'p', '%');
|
||||
DIFF_TOLERANCE := Max(0.00, ExpParse.Evaluate(S));
|
||||
VERBOSE := ArgParse.AsBoolean('-v') or ArgParse.AsBoolean('--verbose');
|
||||
NOVERIFY := ArgParse.AsBoolean('-s') or ArgParse.AsBoolean('--skip');
|
||||
Options.ExtractDir := ArgParse.AsString('--extract=');
|
||||
if Options.ExtractDir <> '' then
|
||||
EXTRACT := DirectoryExists(Options.ExtractDir);
|
||||
|
@ -244,10 +254,11 @@ begin
|
|||
Options.DedupSysMem := Max(0, Round(ExpParse.Evaluate(S)));
|
||||
if B then
|
||||
Options.DedupSysMem := -Options.DedupSysMem;
|
||||
VERBOSE := ArgParse.AsBoolean('--verbose');
|
||||
S := ArgParse.AsString('--compress=', 0, 't50p');
|
||||
VERBOSE := ArgParse.AsBoolean('-v') or ArgParse.AsBoolean('--verbose');
|
||||
S := ArgParse.AsString('--compress=', 0, 't25p');
|
||||
S := ReplaceText(S, SPrecompSep3, SPrecompSep2);
|
||||
Options.CompressCfg := S;
|
||||
SrepMemCfg := ArgParse.AsString('--srepmem=', 0, '75p');
|
||||
finally
|
||||
ArgParse.Free;
|
||||
ExpParse.Free;
|
||||
|
@ -317,6 +328,7 @@ var
|
|||
begin
|
||||
SetLength(Codecs, 0);
|
||||
Insert(PrecompINI.Codec, Codecs, Length(Codecs));
|
||||
Insert(PrecompINIEx.Codec, Codecs, Length(Codecs));
|
||||
Insert(PrecompSearch.Codec, Codecs, Length(Codecs));
|
||||
Insert(PrecompDLL.Codec, Codecs, Length(Codecs));
|
||||
Insert(PrecompEXE.Codec, Codecs, Length(Codecs));
|
||||
|
@ -992,6 +1004,9 @@ begin
|
|||
CurCodec[Index] := SI2.Codec;
|
||||
CurDepth[Index] := Depth;
|
||||
try
|
||||
if NOVERIFY and not(SI2.Codec in [5]) then
|
||||
Result := True
|
||||
else
|
||||
Result := Codecs[SI2.Codec].Process(Index, Depth,
|
||||
PByte(DataStore.Slot(ThreadIndex).Memory) + SI2.ActualPosition,
|
||||
PByte(MemOutput1[ThreadIndex].Memory) + SI2.StorePosition, @SI1,
|
||||
|
@ -1274,11 +1289,10 @@ begin
|
|||
DataStore := TDataStore2.Create(Length(InfoStore1));
|
||||
end;
|
||||
CodecInit(Options^.Threads, Options^.Method);
|
||||
DBFile := Options^.DBaseFile;
|
||||
if FileExists(ExtractFilePath(Utils.GetModuleName) + DBFile) then
|
||||
DBFile := ExpandPath(Options^.DBaseFile);
|
||||
if FileExists(DBFile) then
|
||||
begin
|
||||
with TFileStream.Create(ExtractFilePath(Utils.GetModuleName) + DBFile,
|
||||
fmShareDenyNone) do
|
||||
with TFileStream.Create(DBFile, fmShareDenyNone) do
|
||||
begin
|
||||
Position := 0;
|
||||
if WorkStream[0].Size < Size then
|
||||
|
@ -1309,6 +1323,8 @@ begin
|
|||
if (IndexText(PrecompGetCodec(PChar(Options^.Method), I, False),
|
||||
PrecompINI.Codec.Names) < 0) and
|
||||
(IndexText(PrecompGetCodec(PChar(Options^.Method), I, False),
|
||||
PrecompINIEx.Codec.Names) < 0) and
|
||||
(IndexText(PrecompGetCodec(PChar(Options^.Method), I, False),
|
||||
PrecompSearch.Codec.Names) < 0) then
|
||||
begin
|
||||
if S = '' then
|
||||
|
@ -1359,6 +1375,7 @@ var
|
|||
UI32: UInt32;
|
||||
I, J, K: Integer;
|
||||
begin
|
||||
EncFreed := True;
|
||||
if Length(Tasks) > 1 then
|
||||
WaitForAll(Tasks);
|
||||
CodecFree(Length(Tasks));
|
||||
|
@ -1684,8 +1701,7 @@ begin
|
|||
end;
|
||||
end;
|
||||
end;
|
||||
with TFileStream.Create(ExtractFilePath(Utils.GetModuleName) + DBFile,
|
||||
fmCreate) do
|
||||
with TFileStream.Create(DBFile, fmCreate) do
|
||||
begin
|
||||
WriteBuffer(WorkStream[0].Memory^, WorkStream[0].Position);
|
||||
Free;
|
||||
|
@ -1734,7 +1750,7 @@ begin
|
|||
end;
|
||||
end
|
||||
else
|
||||
Output.CopyFrom(TempOutput, 0);
|
||||
Output.CopyFrom(TBufferedStream(TempOutput).Instance, 0);
|
||||
TempOutput.Free;
|
||||
DeleteFile(S);
|
||||
end
|
||||
|
@ -2098,7 +2114,8 @@ begin
|
|||
if (Depth = 0) and (StoreDD >= 0) then
|
||||
begin
|
||||
LStream := TProcessStream.Create(ExtractFilePath(Utils.GetModuleName) +
|
||||
'srep.exe', '-d -s - -', GetCurrentDir, Input, nil);
|
||||
'srep.exe', '-d -s -mem' + SrepMemCfg + ' - -', GetCurrentDir,
|
||||
Input, nil);
|
||||
if not LStream.Execute then
|
||||
raise EReadError.CreateRes(@SReadError);
|
||||
DecInput[Index] := TBufferedStream.Create(LStream, True, 4194304);
|
||||
|
@ -2350,7 +2367,8 @@ begin
|
|||
if Options.DoCompress then
|
||||
LOutput.Free;
|
||||
try
|
||||
// EncFree;
|
||||
if not EncFreed then
|
||||
EncFree;
|
||||
finally
|
||||
Stopwatch.Stop;
|
||||
end;
|
||||
|
|
|
@ -511,19 +511,30 @@ begin
|
|||
if BoolArray(CodecEnabled, False) then
|
||||
exit;
|
||||
Pos := 0;
|
||||
while Pos < Size do
|
||||
begin
|
||||
try
|
||||
while Pos < Size do
|
||||
begin
|
||||
GetOodleSI(Input + Pos, SizeEx - Pos, @OodleSI);
|
||||
if (OodleSI.CSize > 0) then
|
||||
begin
|
||||
if GetOodleUS(Instance, Input, Pos, @OodleSI, Output, Add, Funcs) > 0 then
|
||||
try
|
||||
if GetOodleUS(Instance, Input, Pos, @OodleSI, Output, Add, Funcs) > 0
|
||||
then
|
||||
begin
|
||||
Inc(Pos, OodleSI.CSize);
|
||||
continue;
|
||||
end;
|
||||
except
|
||||
end;
|
||||
end;
|
||||
Inc(Pos);
|
||||
end;
|
||||
except
|
||||
Inc(Pos);
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
|
||||
function OodleScan2(Instance, Depth: Integer; Input: Pointer; Size: cardinal;
|
||||
|
|
|
@ -4,6 +4,7 @@ interface
|
|||
|
||||
uses
|
||||
Utils, SynCommons, SynCrypto,
|
||||
UIMain,
|
||||
PrecompUtils,
|
||||
WinAPI.Windows,
|
||||
System.SysUtils, System.Classes, System.StrUtils,
|
||||
|
@ -281,6 +282,8 @@ begin
|
|||
SetLength(CodecSearch, Succ(J));
|
||||
S := ChangeFileExt(ExtractFileName(SearchList[I]), '');
|
||||
Insert(S, Codec.Names, Length(Codec.Names));
|
||||
if UIMain.DLLLoaded then
|
||||
XTLAddplugin(S, PLUGIN_DATABASE);
|
||||
end;
|
||||
while FStream.Position < FStream.Size do
|
||||
begin
|
||||
|
|
|
@ -444,6 +444,7 @@ begin
|
|||
exit;
|
||||
end
|
||||
else if BoolArray(CodecEnabled, False) then
|
||||
if Assigned(Add) then
|
||||
exit;
|
||||
Pos := 0;
|
||||
Buffer := Funcs^.Allocator(Instance, Z_WORKMEM);
|
||||
|
@ -487,7 +488,7 @@ begin
|
|||
(EndianSwap(PWord(Input + Pos - 2)^) mod $1F = 0) then
|
||||
begin
|
||||
WinBits := (Input + Pos - 2)^ shr 4;
|
||||
if WinBits in [0 .. 7] then
|
||||
if WinBits = ZWinBits then
|
||||
begin
|
||||
ZStream := @ZStream2[Instance, WinBits];
|
||||
Level := (Input + Pos - 1)^ shr $6;
|
||||
|
@ -569,7 +570,8 @@ begin
|
|||
if (I = ZLIB_CODEC) and (WinBits = 0) then
|
||||
SetBits(SI.Option, 1, 12, 3);
|
||||
SetBits(SI.Option, I, 0, 5);
|
||||
if CodecEnabled[I] or (I = X) then
|
||||
if CodecEnabled[I] or (I = X) or
|
||||
(CodecAvailable[I] and not Assigned(Add)) then
|
||||
begin
|
||||
DS := Funcs^.GetDepthCodec(DI1.Codec);
|
||||
Move(DS[0], DI2.Codec, SizeOf(DI2.Codec));
|
||||
|
@ -751,8 +753,7 @@ begin
|
|||
L := EnsureRange(L, 1, 9);
|
||||
M := 0;
|
||||
I := 0;
|
||||
Params := 'l' + L.ToString + ':' + 'w' +
|
||||
(GetBits(StreamInfo^.Option, 12, 3) + 8).ToString;
|
||||
Params := 'l' + L.ToString;
|
||||
raw2hif_Init(HR, L);
|
||||
while True do
|
||||
begin
|
||||
|
@ -793,7 +794,7 @@ begin
|
|||
Res1 := StreamInfo^.NewSize;
|
||||
Res2 := P_HIFSIZE;
|
||||
Buffer := Funcs^.Allocator(Instance, Res2);
|
||||
Params := 'w' + (GetBits(StreamInfo^.Option, 12, 3) + 8).ToString;
|
||||
Params := '';
|
||||
if preflate_decode(OldInput, StreamInfo^.OldSize, NewInput, @Res1,
|
||||
Buffer, @Res2) then
|
||||
begin
|
||||
|
@ -868,8 +869,7 @@ begin
|
|||
I := 0;
|
||||
J := 0;
|
||||
M := 0;
|
||||
Params := 'l' + GetBits(StreamInfo.Option, 5, 7).ToString + ':' + 'w' +
|
||||
(GetBits(StreamInfo.Option, 12, 3) + 8).ToString;
|
||||
Params := 'l' + GetBits(StreamInfo.Option, 5, 7).ToString;
|
||||
hif2raw_Init(HR, GetBits(StreamInfo.Option, 5, 7));
|
||||
while True do
|
||||
begin
|
||||
|
@ -904,7 +904,7 @@ begin
|
|||
begin
|
||||
Res1 := StreamInfo.OldSize;
|
||||
Buffer := Funcs^.Allocator(Instance, Res1);
|
||||
Params := 'w' + (GetBits(StreamInfo.Option, 12, 3) + 8).ToString;
|
||||
Params := '';
|
||||
if preflate_reencode(Input, StreamInfo.NewSize, InputExt,
|
||||
StreamInfo.ExtSize, Buffer, @Res1) then
|
||||
begin
|
||||
|
|
|
@ -320,8 +320,6 @@ begin
|
|||
if Result or (StreamInfo^.Status >= TStreamStatus.Predicted) then
|
||||
break;
|
||||
end;
|
||||
if Res1 < 0 then
|
||||
exit;
|
||||
if (Result = False) and ((StreamInfo^.Status >= TStreamStatus.Predicted) or
|
||||
(SOList[Instance][X].Count = 1)) and (DIFF_TOLERANCE > 0) then
|
||||
begin
|
||||
|
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
@ -0,0 +1,95 @@
|
|||
unit UIMain;
|
||||
|
||||
interface
|
||||
|
||||
uses
|
||||
LibImport,
|
||||
WinAPI.Windows,
|
||||
System.SysUtils, System.Classes, System.Types;
|
||||
|
||||
type
|
||||
PUIFuncs = ^TUIFuncs;
|
||||
|
||||
TUIFuncs = record
|
||||
IsZlibLoaded: Boolean;
|
||||
IsReflateLoaded: Boolean;
|
||||
IsPreflateLoaded: Boolean;
|
||||
IsLZ4Loaded: Boolean;
|
||||
IsLZOLoaded: Boolean;
|
||||
IsZSTDLoaded: Boolean;
|
||||
IsOodleLoaded: Boolean;
|
||||
IsFLACLoaded: Boolean;
|
||||
IsBrunsliLoaded: Boolean;
|
||||
IsPackJPGLoaded: Boolean;
|
||||
IsJoJpegLoaded: Boolean;
|
||||
IsXDeltaLoaded: Boolean;
|
||||
IsLZMALoaded: Boolean;
|
||||
IsSrepAvailable: Boolean;
|
||||
end;
|
||||
|
||||
const
|
||||
PLUGIN_DATABASE = 0;
|
||||
PLUGIN_CONFIG = 1;
|
||||
PLUGIN_LIBRARY = 2;
|
||||
|
||||
var
|
||||
UIFuncs: TUIFuncs;
|
||||
XTLUI1: procedure;
|
||||
XTLUI2: function(Funcs: PUIFuncs; var Params: TArray<String>;
|
||||
out LibType: Integer; out LibPath: String): Boolean;
|
||||
XTLAddPlugin: procedure(S: String; I: Integer);
|
||||
XTLAddCodec: procedure(S: String);
|
||||
DLLLoaded: Boolean = False;
|
||||
|
||||
implementation
|
||||
|
||||
uses
|
||||
BrunsliDLL, FLACDLL, FLZMA2DLL, JoJpegDLL, LZ4DLL, LZODLL, OodleDLL,
|
||||
PackJPGDLL, PreflateDLL, ReflateDLL, XDeltaDLL, ZLibDLL, ZSTDDLL,
|
||||
Utils;
|
||||
|
||||
var
|
||||
Lib: TLibImport;
|
||||
|
||||
procedure Init;
|
||||
begin
|
||||
Lib := TLibImport.Create(ChangeFileExt(Utils.GetModuleName, 'ui.dll'));
|
||||
if Lib.Loaded then
|
||||
begin
|
||||
@XTLUI1 := Lib.GetProcAddr('XTLUI1');
|
||||
@XTLUI2 := Lib.GetProcAddr('XTLUI2');
|
||||
@XTLAddPlugin := Lib.GetProcAddr('XTLAddPlugin');
|
||||
@XTLAddCodec := Lib.GetProcAddr('XTLAddCodec');
|
||||
DLLLoaded := Assigned(XTLUI1);
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure Deinit;
|
||||
begin
|
||||
Lib.Free;
|
||||
end;
|
||||
|
||||
initialization
|
||||
|
||||
UIFuncs.IsZlibLoaded := ZLibDLL.DLLLoaded;
|
||||
UIFuncs.IsReflateLoaded := ReflateDLL.DLLLoaded;
|
||||
UIFuncs.IsPreflateLoaded := PreflateDLL.DLLLoaded;
|
||||
UIFuncs.IsLZ4Loaded := LZ4DLL.DLLLoaded;
|
||||
UIFuncs.IsLZOLoaded := LZODLL.DLLLoaded;
|
||||
UIFuncs.IsZSTDLoaded := ZSTDDLL.DLLLoaded;
|
||||
UIFuncs.IsOodleLoaded := OodleDLL.DLLLoaded;
|
||||
UIFuncs.IsFLACLoaded := FLACDLL.DLLLoaded;
|
||||
UIFuncs.IsBrunsliLoaded := BrunsliDLL.DLLLoaded;
|
||||
UIFuncs.IsPackJPGLoaded := PackJPGDLL.DLLLoaded;
|
||||
UIFuncs.IsJoJpegLoaded := JoJpegDLL.DLLLoaded;
|
||||
UIFuncs.IsXDeltaLoaded := XDeltaDLL.DLLLoaded;
|
||||
UIFuncs.IsLZMALoaded := FLZMA2DLL.DLLLoaded;
|
||||
UIFuncs.IsSrepAvailable := FileExists(ExtractFilePath(Utils.GetModuleName) +
|
||||
'srep.exe');
|
||||
Init;
|
||||
|
||||
finalization
|
||||
|
||||
Deinit;
|
||||
|
||||
end.
|
103
xtool.dpr
103
xtool.dpr
|
@ -62,6 +62,7 @@ uses
|
|||
ZLibDLL in 'imports\ZLibDLL.pas',
|
||||
ZSTDDLL in 'imports\ZSTDDLL.pas',
|
||||
lz4 in 'sources\lz4.pas',
|
||||
UIMain in 'ui\UIMain.pas',
|
||||
PrecompMain in 'precompressor\PrecompMain.pas',
|
||||
PrecompUtils in 'precompressor\PrecompUtils.pas',
|
||||
PrecompCrypto in 'precompressor\PrecompCrypto.pas',
|
||||
|
@ -72,6 +73,7 @@ uses
|
|||
PrecompMedia in 'precompressor\PrecompMedia.pas',
|
||||
PrecompOodle in 'precompressor\PrecompOodle.pas',
|
||||
PrecompINI in 'precompressor\PrecompINI.pas',
|
||||
PrecompINIEx in 'precompressor\PrecompINIEx.pas',
|
||||
PrecompSearch in 'precompressor\PrecompSearch.pas',
|
||||
PrecompDLL in 'precompressor\PrecompDLL.pas',
|
||||
PrecompEXE in 'precompressor\PrecompEXE.pas',
|
||||
|
@ -172,15 +174,59 @@ begin
|
|||
Result := TFileStream.Create(Output, fmCreate);
|
||||
end;
|
||||
|
||||
function CheckInstance(const InstanceName: string): boolean;
|
||||
var
|
||||
Sem: THandle;
|
||||
begin
|
||||
Result := False;
|
||||
Sem := CreateSemaphore(nil, 0, 1, PChar(InstanceName));
|
||||
if ((Sem <> 0) and (GetLastError = ERROR_ALREADY_EXISTS)) then
|
||||
begin
|
||||
CloseHandle(Sem);
|
||||
exit(True);
|
||||
end;
|
||||
end;
|
||||
|
||||
function Exec_(Executable, CommandLine, WorkDir: string): boolean;
|
||||
var
|
||||
StartupInfo: TStartupInfo;
|
||||
ProcessInfo: TProcessInformation;
|
||||
dwExitCode: DWORD;
|
||||
LWorkDir: PChar;
|
||||
begin
|
||||
Result := False;
|
||||
FillChar(StartupInfo, sizeof(StartupInfo), #0);
|
||||
StartupInfo.cb := sizeof(StartupInfo);
|
||||
if WorkDir <> '' then
|
||||
LWorkDir := Pointer(WorkDir)
|
||||
else
|
||||
LWorkDir := Pointer(GetCurrentDir);
|
||||
if CreateProcess(nil, PChar('"' + Executable + '" ' + CommandLine), nil, nil,
|
||||
False, 0, nil, LWorkDir, StartupInfo, ProcessInfo) then
|
||||
begin
|
||||
CloseHandleEx(ProcessInfo.hThread);
|
||||
WaitForSingleObject(ProcessInfo.hProcess, INFINITE);
|
||||
GetExitCodeProcess(ProcessInfo.hProcess, dwExitCode);
|
||||
CloseHandleEx(ProcessInfo.hProcess);
|
||||
Result := dwExitCode = 0;
|
||||
end
|
||||
else
|
||||
RaiseLastOSError;
|
||||
end;
|
||||
|
||||
const
|
||||
BufferSize = 1048576;
|
||||
|
||||
var
|
||||
I, J: Integer;
|
||||
S: String;
|
||||
LibType: Integer;
|
||||
LibPath: String;
|
||||
LibList: System.Types.TStringDynArray;
|
||||
ParamStr_: TArray<String>;
|
||||
ParamArg: array [0 .. 1] of TArray<String>;
|
||||
StrArray: TArray<String>;
|
||||
IsParam: Boolean;
|
||||
IsParam: boolean;
|
||||
Input, Output: TStream;
|
||||
PrecompEnc: PrecompMain.TEncodeOptions;
|
||||
PrecompDec: PrecompMain.TDecodeOptions;
|
||||
|
@ -207,7 +253,56 @@ end;
|
|||
|
||||
begin
|
||||
FormatSettings := TFormatSettings.Invariant;
|
||||
if not CheckInstance('XToolUI_Check') then
|
||||
ProgramInfo;
|
||||
if UIMain.DLLLoaded and (ParamCount = 0) then
|
||||
begin
|
||||
XTLUI1;
|
||||
while XTLUI2(@UIFuncs, ParamStr_, LibType, LibPath) do
|
||||
begin
|
||||
S := '';
|
||||
for I := 1 to High(ParamStr_) do
|
||||
S := S + IfThen(ParamStr_[I].Contains(' '), '"' + ParamStr_[I] + '"',
|
||||
ParamStr_[I]) + ' ';
|
||||
PrecompMain.Parse(ParamStr_, PrecompEnc);
|
||||
if LibType = 0 then
|
||||
begin
|
||||
WriteLine('Chunk size: ' + ConvertKB2TB(PrecompEnc.ChunkSize div 1024) +
|
||||
', ' + 'Threads: ' + PrecompEnc.Threads.ToString + ', ' + 'Depth: ' +
|
||||
(PrecompEnc.Depth - 1).ToString);
|
||||
WriteLine('');
|
||||
Exec_(ParamStr(0), S, '');
|
||||
end
|
||||
else
|
||||
begin
|
||||
LibList := TDirectory.GetFiles(LibPath, '*.dll',
|
||||
TSearchOption.soAllDirectories);
|
||||
for J := Low(LibList) to High(LibList) do
|
||||
begin
|
||||
S := '';
|
||||
for I := 1 to High(ParamStr_) do
|
||||
begin
|
||||
S := S + IfThen(ParamStr_[I].Contains(' '),
|
||||
'"' + ParamStr_[I] + '"', ParamStr_[I]) + ' ';
|
||||
if I = 1 then
|
||||
case LibType of
|
||||
1:
|
||||
S := S + '"' + '-l4' + LibList[J] + '"' + ' ';
|
||||
2:
|
||||
S := S + '"' + '-zs' + LibList[J] + '"' + ' ';
|
||||
3:
|
||||
S := S + '"' + '-od' + LibList[J] + '"' + ' ';
|
||||
end;
|
||||
end;
|
||||
WriteLine('Library loaded: ' + ReplaceText(LibList[J],
|
||||
IncludeTrailingBackSlash(LibPath), ''));
|
||||
WriteLine('');
|
||||
Exec_(ParamStr(0), S, '');
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
exit;
|
||||
end;
|
||||
try
|
||||
if ParamCount = 0 then
|
||||
begin
|
||||
|
@ -240,6 +335,12 @@ begin
|
|||
try
|
||||
PrecompMain.Parse(ParamArg[0], PrecompEnc);
|
||||
PrecompMain.Encode(Input, Output, PrecompEnc);
|
||||
if TBufferedStream(Output).Instance is TNullStream then
|
||||
begin
|
||||
WriteLine('Results: ' + ConvertKB2TB(Input.Size div 1024) + ' >> ' +
|
||||
ConvertKB2TB(Output.Size div 1024));
|
||||
WriteLine('');
|
||||
end;
|
||||
finally
|
||||
Input.Free;
|
||||
Output.Free;
|
||||
|
|
19
xtool.dproj
19
xtool.dproj
|
@ -48,6 +48,12 @@
|
|||
<CfgParent>Base</CfgParent>
|
||||
<Base>true</Base>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="('$(Platform)'=='Linux64' and '$(Cfg_2)'=='true') or '$(Cfg_2_Linux64)'!=''">
|
||||
<Cfg_2_Linux64>true</Cfg_2_Linux64>
|
||||
<CfgParent>Cfg_2</CfgParent>
|
||||
<Cfg_2>true</Cfg_2>
|
||||
<Base>true</Base>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="('$(Platform)'=='Win32' and '$(Cfg_2)'=='true') or '$(Cfg_2_Win32)'!=''">
|
||||
<Cfg_2_Win32>true</Cfg_2_Win32>
|
||||
<CfgParent>Cfg_2</CfgParent>
|
||||
|
@ -119,6 +125,12 @@
|
|||
<DCC_SymbolReferenceInfo>0</DCC_SymbolReferenceInfo>
|
||||
<DCC_DebugInformation>0</DCC_DebugInformation>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Cfg_2_Linux64)'!=''">
|
||||
<DCC_DcuOutput>.\$(Platform)\DCUs</DCC_DcuOutput>
|
||||
<Debugger_Launcher>/usr/bin/gnome-terminal -- "%debuggee%"</Debugger_Launcher>
|
||||
<Manifest_File>(None)</Manifest_File>
|
||||
<AppDPIAwarenessMode>none</AppDPIAwarenessMode>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Cfg_2_Win32)'!=''">
|
||||
<DCC_DcuOutput>.\$(Platform)\DCUs</DCC_DcuOutput>
|
||||
<VerInfo_Locale>7177</VerInfo_Locale>
|
||||
|
@ -134,6 +146,7 @@
|
|||
<VerInfo_IncludeVerInfo>true</VerInfo_IncludeVerInfo>
|
||||
<VerInfo_MajorVer>0</VerInfo_MajorVer>
|
||||
<VerInfo_Keys>CompanyName=;FileDescription=;FileVersion=0.0.0.0;InternalName=;LegalCopyright=Razor12911;LegalTrademarks=;OriginalFilename=xtool.exe;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=0.0.0.0;Comments=Created by Razor12911</VerInfo_Keys>
|
||||
<AppDPIAwarenessMode>none</AppDPIAwarenessMode>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<DelphiCompile Include="$(MainSource)">
|
||||
|
@ -166,6 +179,7 @@
|
|||
<DCCReference Include="imports\ZLibDLL.pas"/>
|
||||
<DCCReference Include="imports\ZSTDDLL.pas"/>
|
||||
<DCCReference Include="sources\lz4.pas"/>
|
||||
<DCCReference Include="ui\UIMain.pas"/>
|
||||
<DCCReference Include="precompressor\PrecompMain.pas"/>
|
||||
<DCCReference Include="precompressor\PrecompUtils.pas"/>
|
||||
<DCCReference Include="precompressor\PrecompCrypto.pas"/>
|
||||
|
@ -176,6 +190,7 @@
|
|||
<DCCReference Include="precompressor\PrecompMedia.pas"/>
|
||||
<DCCReference Include="precompressor\PrecompOodle.pas"/>
|
||||
<DCCReference Include="precompressor\PrecompINI.pas"/>
|
||||
<DCCReference Include="precompressor\PrecompINIEx.pas"/>
|
||||
<DCCReference Include="precompressor\PrecompSearch.pas"/>
|
||||
<DCCReference Include="precompressor\PrecompDLL.pas"/>
|
||||
<DCCReference Include="precompressor\PrecompEXE.pas"/>
|
||||
|
@ -207,8 +222,8 @@
|
|||
<Source Name="MainSource">xtool.dpr</Source>
|
||||
</Source>
|
||||
<Excluded_Packages>
|
||||
<Excluded_Packages Name="$(BDSBIN)\dcloffice2k270.bpl">Microsoft Office 2000 Sample Automation Server Wrapper Components</Excluded_Packages>
|
||||
<Excluded_Packages Name="$(BDSBIN)\dclofficexp270.bpl">Microsoft Office XP Sample Automation Server Wrapper Components</Excluded_Packages>
|
||||
<Excluded_Packages Name="$(BDSBIN)\dcloffice2k280.bpl">Microsoft Office 2000 Sample Automation Server Wrapper Components</Excluded_Packages>
|
||||
<Excluded_Packages Name="$(BDSBIN)\dclofficexp280.bpl">Microsoft Office XP Sample Automation Server Wrapper Components</Excluded_Packages>
|
||||
</Excluded_Packages>
|
||||
</Delphi.Personality>
|
||||
<Deployment Version="4">
|
||||
|
|
BIN
xtool.dres
BIN
xtool.dres
Binary file not shown.
|
@ -1 +0,0 @@
|
|||
XTOOL RCDATA "cpp\\xtool\\x64\\Release\\xtool.dll"
|
|
@ -0,0 +1,151 @@
|
|||
library xtoolui;
|
||||
|
||||
{$R *.res}
|
||||
|
||||
uses
|
||||
System.StartUpCopy,
|
||||
FMX.Forms,
|
||||
FMX.Types,
|
||||
FMX.Controls,
|
||||
FMX.StdCtrls,
|
||||
WinAPI.Windows,
|
||||
System.SysUtils,
|
||||
System.Types,
|
||||
System.UITypes,
|
||||
System.Classes,
|
||||
Unit1 in 'Unit1.pas' {Form1} ,
|
||||
Unit2 in 'Unit2.pas' {Form2};
|
||||
|
||||
const
|
||||
PLUGIN_DATABASE = 0;
|
||||
PLUGIN_CONFIG = 1;
|
||||
PLUGIN_LIBRARY = 2;
|
||||
|
||||
type
|
||||
PUIFuncs = ^TUIFuncs;
|
||||
|
||||
TUIFuncs = record
|
||||
IsZlibLoaded: Boolean;
|
||||
IsReflateLoaded: Boolean;
|
||||
IsPreflateLoaded: Boolean;
|
||||
IsLZ4Loaded: Boolean;
|
||||
IsLZOLoaded: Boolean;
|
||||
IsZSTDLoaded: Boolean;
|
||||
IsOodleLoaded: Boolean;
|
||||
IsFLACLoaded: Boolean;
|
||||
IsBrunsliLoaded: Boolean;
|
||||
IsPackJPGLoaded: Boolean;
|
||||
IsJoJpegLoaded: Boolean;
|
||||
IsXDeltaLoaded: Boolean;
|
||||
IsLZMALoaded: Boolean;
|
||||
IsSrepAvailable: Boolean;
|
||||
end;
|
||||
|
||||
var
|
||||
UIInitialised: Boolean = False;
|
||||
|
||||
procedure XTLUI1;
|
||||
begin
|
||||
Form1 := TForm1.Create(nil);
|
||||
Form2 := TForm2.Create(Form1);
|
||||
end;
|
||||
|
||||
function XTLUI2(Funcs: PUIFuncs; var Params: TArray<String>;
|
||||
out LibType: Integer; out LibPath: String): Boolean;
|
||||
var
|
||||
I, J, X: Integer;
|
||||
Expander: TExpander;
|
||||
begin
|
||||
if not UIInitialised then
|
||||
begin
|
||||
UIInitialised := True;
|
||||
{ Form2.CheckBox3.Enabled := Funcs^.IsZlibLoaded;
|
||||
Form2.CheckBox1.Enabled := Funcs^.IsReflateLoaded;
|
||||
Form2.CheckBox2.Enabled := Funcs^.IsPreflateLoaded;
|
||||
Form2.CheckBox4.Enabled := Funcs^.IsLZ4Loaded;
|
||||
Form2.CheckBox5.Enabled := Funcs^.IsLZ4Loaded;
|
||||
Form2.CheckBox6.Enabled := Funcs^.IsLZ4Loaded;
|
||||
Form2.CheckBox7.Enabled := Funcs^.IsLZOLoaded;
|
||||
Form2.CheckBox8.Enabled := Funcs^.IsZSTDLoaded;
|
||||
Form2.CheckBox10.Enabled := Funcs^.IsOodleLoaded;
|
||||
Form2.CheckBox12.Enabled := Funcs^.IsOodleLoaded;
|
||||
Form2.CheckBox14.Enabled := Funcs^.IsOodleLoaded;
|
||||
Form2.CheckBox16.Enabled := Funcs^.IsOodleLoaded;
|
||||
Form2.CheckBox18.Enabled := Funcs^.IsOodleLoaded;
|
||||
Form2.CheckBox21.Enabled := Funcs^.IsFLACLoaded;
|
||||
Form2.RadioButton4.Enabled := Funcs^.IsFLACLoaded;
|
||||
Form2.CheckBox26.Enabled := Funcs^.IsBrunsliLoaded or
|
||||
Funcs^.IsPackJPGLoaded or Funcs^.IsJoJpegLoaded;
|
||||
Form2.RadioButton1.Enabled := Funcs^.IsBrunsliLoaded;
|
||||
Form2.RadioButton2.Enabled := Funcs^.IsPackJPGLoaded;
|
||||
Form2.RadioButton3.Enabled := Funcs^.IsJoJpegLoaded;
|
||||
Form1.GroupBox5.Enabled := Funcs^.IsLZMALoaded; }
|
||||
Form1.SpinBox4.Enabled := Funcs^.IsSrepAvailable;
|
||||
for I := Low(Methods) to High(Methods) do
|
||||
begin
|
||||
case Methods[I].FType of
|
||||
PLUGIN_DATABASE:
|
||||
Form2.ListBox2.Items.Add(Methods[I].FName);
|
||||
PLUGIN_CONFIG:
|
||||
begin
|
||||
J := Length(CfgCtrls);
|
||||
Insert(TConfigCtrl.Create(Form2, Form2.VertScrollBox3), CfgCtrls,
|
||||
Length(CfgCtrls));
|
||||
CfgCtrls[J].SetText(Methods[I].FName);
|
||||
for X := Low(Methods[I].Codecs) to High(Methods[I].Codecs) do
|
||||
CfgCtrls[J].AddCodec(Methods[I].Codecs[X]);
|
||||
end;
|
||||
PLUGIN_LIBRARY:
|
||||
begin
|
||||
J := Length(LibCtrls);
|
||||
Insert(TLibraryCtrl.Create(Form2, Form2.VertScrollBox3), LibCtrls,
|
||||
Length(LibCtrls));
|
||||
LibCtrls[J].SetText(Methods[I].FName);
|
||||
for X := Low(Methods[I].Codecs) to High(Methods[I].Codecs) do
|
||||
LibCtrls[J].AddCodec(Methods[I].Codecs[X]);
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
for I := 0 to Form2.ComponentCount - 1 do
|
||||
begin
|
||||
if Form2.Components[I] is TExpander then
|
||||
TExpander(Form2.Components[I]).IsExpanded := False;
|
||||
end;
|
||||
if Form2.ListBox2.Items.Count = 0 then
|
||||
Form2.Expander10.Visible := False;
|
||||
end;
|
||||
Result := Form1.ShowModal = mrOk;
|
||||
LibType := Form1.ComboBox4.ItemIndex;
|
||||
LibPath := Form1.Edit5.Text;
|
||||
if Result then
|
||||
begin
|
||||
SetLength(Params, Length(CmdStr));
|
||||
for I := Low(CmdStr) to High(CmdStr) do
|
||||
Params[I] := CmdStr[I];
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure XTLAddPlugin(S: String; I: Integer);
|
||||
var
|
||||
J: Integer;
|
||||
begin
|
||||
J := Length(Methods);
|
||||
SetLength(Methods, Succ(J));
|
||||
Methods[J].FName := S;
|
||||
Methods[J].FType := I;
|
||||
SetLength(Methods[J].Codecs, 0);
|
||||
end;
|
||||
|
||||
procedure XTLAddCodec(S: String);
|
||||
var
|
||||
J: Integer;
|
||||
begin
|
||||
J := Pred(Length(Methods));
|
||||
Insert(S, Methods[J].Codecs, Length(Methods[J].Codecs));
|
||||
end;
|
||||
|
||||
exports XTLUI1, XTLUI2, XTLAddPlugin, XTLAddCodec;
|
||||
|
||||
begin
|
||||
|
||||
end.
|
File diff suppressed because it is too large
Load Diff
Binary file not shown.
Loading…
Reference in New Issue