@ -0,0 +1,63 @@ | |||
############################################################################### | |||
# Set default behavior to automatically normalize line endings. | |||
############################################################################### | |||
* text=auto | |||
############################################################################### | |||
# Set default behavior for command prompt diff. | |||
# | |||
# This is need for earlier builds of msysgit that does not have it on by | |||
# default for csharp files. | |||
# Note: This is only used by command line | |||
############################################################################### | |||
#*.cs diff=csharp | |||
############################################################################### | |||
# Set the merge driver for project and solution files | |||
# | |||
# Merging from the command prompt will add diff markers to the files if there | |||
# are conflicts (Merging from VS is not affected by the settings below, in VS | |||
# the diff markers are never inserted). Diff markers may cause the following | |||
# file extensions to fail to load in VS. An alternative would be to treat | |||
# these files as binary and thus will always conflict and require user | |||
# intervention with every merge. To do so, just uncomment the entries below | |||
############################################################################### | |||
#*.sln merge=binary | |||
#*.csproj merge=binary | |||
#*.vbproj merge=binary | |||
#*.vcxproj merge=binary | |||
#*.vcproj merge=binary | |||
#*.dbproj merge=binary | |||
#*.fsproj merge=binary | |||
#*.lsproj merge=binary | |||
#*.wixproj merge=binary | |||
#*.modelproj merge=binary | |||
#*.sqlproj merge=binary | |||
#*.wwaproj merge=binary | |||
############################################################################### | |||
# behavior for image files | |||
# | |||
# image files are treated as binary by default. | |||
############################################################################### | |||
#*.jpg binary | |||
#*.png binary | |||
#*.gif binary | |||
############################################################################### | |||
# diff behavior for common document formats | |||
# | |||
# Convert binary document formats to text before diffing them. This feature | |||
# is only available from the command line. Turn it on by uncommenting the | |||
# entries below. | |||
############################################################################### | |||
#*.doc diff=astextplain | |||
#*.DOC diff=astextplain | |||
#*.docx diff=astextplain | |||
#*.DOCX diff=astextplain | |||
#*.dot diff=astextplain | |||
#*.DOT diff=astextplain | |||
#*.pdf diff=astextplain | |||
#*.PDF diff=astextplain | |||
#*.rtf diff=astextplain | |||
#*.RTF diff=astextplain |
@ -0,0 +1,189 @@ | |||
## Ignore Visual Studio temporary files, build results, and | |||
## files generated by popular Visual Studio add-ons. | |||
# User-specific files | |||
*.suo | |||
*.user | |||
*.sln.docstates | |||
# Build results | |||
[Dd]ebug/ | |||
[Dd]ebugPublic/ | |||
[Rr]elease/ | |||
x64/ | |||
build/ | |||
bld/ | |||
[Bb]in/ | |||
[Oo]bj/ | |||
# Roslyn cache directories | |||
*.ide/ | |||
# MSTest test Results | |||
[Tt]est[Rr]esult*/ | |||
[Bb]uild[Ll]og.* | |||
#NUNIT | |||
*.VisualState.xml | |||
TestResult.xml | |||
# Build Results of an ATL Project | |||
[Dd]ebugPS/ | |||
[Rr]eleasePS/ | |||
dlldata.c | |||
*_i.c | |||
*_p.c | |||
*_i.h | |||
*.ilk | |||
*.meta | |||
*.obj | |||
*.pch | |||
*.pdb | |||
*.pgc | |||
*.pgd | |||
*.rsp | |||
*.sbr | |||
*.tlb | |||
*.tli | |||
*.tlh | |||
*.tmp | |||
*.tmp_proj | |||
*.log | |||
*.vspscc | |||
*.vssscc | |||
.builds | |||
*.pidb | |||
*.svclog | |||
*.scc | |||
# Chutzpah Test files | |||
_Chutzpah* | |||
# Visual C++ cache files | |||
ipch/ | |||
*.aps | |||
*.ncb | |||
*.opensdf | |||
*.sdf | |||
*.cachefile | |||
# Visual Studio profiler | |||
*.psess | |||
*.vsp | |||
*.vspx | |||
# TFS 2012 Local Workspace | |||
$tf/ | |||
# Guidance Automation Toolkit | |||
*.gpState | |||
# ReSharper is a .NET coding add-in | |||
_ReSharper*/ | |||
*.[Rr]e[Ss]harper | |||
*.DotSettings.user | |||
# JustCode is a .NET coding addin-in | |||
.JustCode | |||
# TeamCity is a build add-in | |||
_TeamCity* | |||
# DotCover is a Code Coverage Tool | |||
*.dotCover | |||
# NCrunch | |||
_NCrunch_* | |||
.*crunch*.local.xml | |||
# MightyMoose | |||
*.mm.* | |||
AutoTest.Net/ | |||
# Web workbench (sass) | |||
.sass-cache/ | |||
# Installshield output folder | |||
[Ee]xpress/ | |||
# DocProject is a documentation generator add-in | |||
DocProject/buildhelp/ | |||
DocProject/Help/*.HxT | |||
DocProject/Help/*.HxC | |||
DocProject/Help/*.hhc | |||
DocProject/Help/*.hhk | |||
DocProject/Help/*.hhp | |||
DocProject/Help/Html2 | |||
DocProject/Help/html | |||
# Click-Once directory | |||
publish/ | |||
# Publish Web Output | |||
*.[Pp]ublish.xml | |||
*.azurePubxml | |||
## TODO: Comment the next line if you want to checkin your | |||
## web deploy settings but do note that will include unencrypted | |||
## passwords | |||
#*.pubxml | |||
# NuGet Packages Directory | |||
packages/* | |||
## TODO: If the tool you use requires repositories.config | |||
## uncomment the next line | |||
#!packages/repositories.config | |||
# Enable "build/" folder in the NuGet Packages folder since | |||
# NuGet packages use it for MSBuild targets. | |||
# This line needs to be after the ignore of the build folder | |||
# (and the packages folder if the line above has been uncommented) | |||
!packages/build/ | |||
# Windows Azure Build Output | |||
csx/ | |||
*.build.csdef | |||
# Windows Store app package directory | |||
AppPackages/ | |||
# Others | |||
sql/ | |||
*.Cache | |||
ClientBin/ | |||
[Ss]tyle[Cc]op.* | |||
~$* | |||
*~ | |||
*.dbmdl | |||
*.dbproj.schemaview | |||
*.pfx | |||
*.publishsettings | |||
node_modules/ | |||
# RIA/Silverlight projects | |||
Generated_Code/ | |||
# Backup & report files from converting an old project file | |||
# to a newer Visual Studio version. Backup files are not needed, | |||
# because we have git ;-) | |||
_UpgradeReport_Files/ | |||
Backup*/ | |||
UpgradeLog*.XML | |||
UpgradeLog*.htm | |||
# SQL Server files | |||
*.mdf | |||
*.ldf | |||
# Business Intelligence projects | |||
*.rdl.data | |||
*.bim.layout | |||
*.bim_*.settings | |||
# Microsoft Fakes | |||
FakesAssemblies/ | |||
# LightSwitch generated files | |||
GeneratedArtifacts/ | |||
_Pvt_Extensions/ | |||
ModelManifest.xml |
@ -0,0 +1,22 @@ | |||
| |||
Microsoft Visual Studio Solution File, Format Version 12.00 | |||
# Visual Studio 2013 | |||
VisualStudioVersion = 12.0.40629.0 | |||
MinimumVisualStudioVersion = 10.0.40219.1 | |||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Fr.BahaBulle.Compression", "Fr.BahaBulle.Compression\Fr.BahaBulle.Compression.csproj", "{611D58ED-62D2-4B2F-8DBD-B9172AD37A52}" | |||
EndProject | |||
Global | |||
GlobalSection(SolutionConfigurationPlatforms) = preSolution | |||
Debug|Any CPU = Debug|Any CPU | |||
Release|Any CPU = Release|Any CPU | |||
EndGlobalSection | |||
GlobalSection(ProjectConfigurationPlatforms) = postSolution | |||
{611D58ED-62D2-4B2F-8DBD-B9172AD37A52}.Debug|Any CPU.ActiveCfg = Debug|Any CPU | |||
{611D58ED-62D2-4B2F-8DBD-B9172AD37A52}.Debug|Any CPU.Build.0 = Debug|Any CPU | |||
{611D58ED-62D2-4B2F-8DBD-B9172AD37A52}.Release|Any CPU.ActiveCfg = Release|Any CPU | |||
{611D58ED-62D2-4B2F-8DBD-B9172AD37A52}.Release|Any CPU.Build.0 = Release|Any CPU | |||
EndGlobalSection | |||
GlobalSection(SolutionProperties) = preSolution | |||
HideSolutionNode = FALSE | |||
EndGlobalSection | |||
EndGlobal |
@ -0,0 +1,17 @@ | |||
using Fr.BahaBulle.Compression.Valis; | |||
using Fr.BahaBulle.Tools.Parser; | |||
namespace Fr.BahaBulle.Compression | |||
{ | |||
public class Compression | |||
{ | |||
public static void InitModule() | |||
{ | |||
Parser parser = Parser.INSTANCE; | |||
parser.AddMethod("decomp-valis", new Parser.ProcessMethod(cValis.ValisDecompression)); | |||
parser.AddMethod("comp-valis", new Parser.ProcessMethod(cValis.ValisCompression)); | |||
} | |||
} | |||
} |
@ -0,0 +1,70 @@ | |||
<?xml version="1.0" encoding="utf-8"?> | |||
<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> | |||
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" /> | |||
<PropertyGroup> | |||
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration> | |||
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform> | |||
<ProjectGuid>{611D58ED-62D2-4B2F-8DBD-B9172AD37A52}</ProjectGuid> | |||
<OutputType>Library</OutputType> | |||
<AppDesignerFolder>Properties</AppDesignerFolder> | |||
<RootNamespace>Fr.BahaBulle.Compression</RootNamespace> | |||
<AssemblyName>Fr.BahaBulle.Compression</AssemblyName> | |||
<TargetFrameworkVersion>v4.5.2</TargetFrameworkVersion> | |||
<FileAlignment>512</FileAlignment> | |||
<TargetFrameworkProfile /> | |||
</PropertyGroup> | |||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' "> | |||
<DebugSymbols>true</DebugSymbols> | |||
<DebugType>full</DebugType> | |||
<Optimize>false</Optimize> | |||
<OutputPath>..\Build\bin\Debug\</OutputPath> | |||
<DefineConstants>DEBUG;TRACE</DefineConstants> | |||
<ErrorReport>prompt</ErrorReport> | |||
<WarningLevel>4</WarningLevel> | |||
<BaseIntermediateOutputPath>..\Build\obj</BaseIntermediateOutputPath> | |||
</PropertyGroup> | |||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' "> | |||
<DebugType>pdbonly</DebugType> | |||
<Optimize>true</Optimize> | |||
<OutputPath>..\Build\bin\Release\</OutputPath> | |||
<DefineConstants>TRACE</DefineConstants> | |||
<ErrorReport>prompt</ErrorReport> | |||
<WarningLevel>4</WarningLevel> | |||
<BaseIntermediateOutputPath>..\Build\obj</BaseIntermediateOutputPath> | |||
</PropertyGroup> | |||
<PropertyGroup> | |||
<SignAssembly>true</SignAssembly> | |||
</PropertyGroup> | |||
<PropertyGroup> | |||
<AssemblyOriginatorKeyFile>Fr.BahaBulle.Key.pfx</AssemblyOriginatorKeyFile> | |||
</PropertyGroup> | |||
<ItemGroup> | |||
<Reference Include="Fr.BahaBulle.Tools, Version=1.0.0.0, Culture=neutral, PublicKeyToken=ee7bc49d31bfd871, processorArchitecture=MSIL"> | |||
<SpecificVersion>False</SpecificVersion> | |||
<HintPath>..\..\Fr.BahaBulle.Tools\Build\bin\Release\Fr.BahaBulle.Tools.dll</HintPath> | |||
</Reference> | |||
<Reference Include="System" /> | |||
<Reference Include="System.Core" /> | |||
<Reference Include="System.Xml.Linq" /> | |||
<Reference Include="System.Data.DataSetExtensions" /> | |||
<Reference Include="Microsoft.CSharp" /> | |||
<Reference Include="System.Data" /> | |||
<Reference Include="System.Xml" /> | |||
</ItemGroup> | |||
<ItemGroup> | |||
<Compile Include="Compression.cs" /> | |||
<Compile Include="Properties\AssemblyInfo.cs" /> | |||
<Compile Include="Valis\Valis.cs" /> | |||
</ItemGroup> | |||
<ItemGroup> | |||
<None Include="Fr.BahaBulle.Key.pfx" /> | |||
</ItemGroup> | |||
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> | |||
<!-- To modify your build process, add your task inside one of the targets below and uncomment it. | |||
Other similar extension points exist, see Microsoft.Common.targets. | |||
<Target Name="BeforeBuild"> | |||
</Target> | |||
<Target Name="AfterBuild"> | |||
</Target> | |||
--> | |||
</Project> |
@ -0,0 +1,36 @@ | |||
using System.Reflection; | |||
using System.Runtime.CompilerServices; | |||
using System.Runtime.InteropServices; | |||
// Les informations générales relatives à un assembly dépendent de | |||
// l'ensemble d'attributs suivant. Changez les valeurs de ces attributs pour modifier les informations | |||
// associées à un assembly. | |||
[assembly: AssemblyTitle("Fr.BahaBulle.Compression")] | |||
[assembly: AssemblyDescription("")] | |||
[assembly: AssemblyConfiguration("")] | |||
[assembly: AssemblyCompany("BahaBulle")] | |||
[assembly: AssemblyProduct("Fr.BahaBulle.Compression")] | |||
[assembly: AssemblyCopyright("Copyright © 2017")] | |||
[assembly: AssemblyTrademark("")] | |||
[assembly: AssemblyCulture("")] | |||
// L'affectation de la valeur false à ComVisible rend les types invisibles dans cet assembly | |||
// aux composants COM. Si vous devez accéder à un type dans cet assembly à partir de | |||
// COM, affectez la valeur true à l'attribut ComVisible sur ce type. | |||
[assembly: ComVisible(false)] | |||
// Le GUID suivant est pour l'ID de la typelib si ce projet est exposé à COM | |||
[assembly: Guid("f93fea32-332e-485b-ad8b-2e4126a35a47")] | |||
// Les informations de version pour un assembly se composent des quatre valeurs suivantes : | |||
// | |||
// Version principale | |||
// Version secondaire | |||
// Numéro de build | |||
// Révision | |||
// | |||
// Vous pouvez spécifier toutes les valeurs ou indiquer les numéros de build et de révision par défaut | |||
// en utilisant '*', comme indiqué ci-dessous : | |||
// [assembly: AssemblyVersion("1.0.*")] | |||
[assembly: AssemblyVersion("1.0.0.0")] | |||
[assembly: AssemblyFileVersion("1.0.0.0")] |
@ -0,0 +1,404 @@ | |||
using Fr.BahaBulle.Tools.Common; | |||
using Fr.BahaBulle.Tools.Parser; | |||
using Fr.BahaBulle.Tools.TraceLog; | |||
using System; | |||
using System.Collections.Generic; | |||
using System.Diagnostics; | |||
using System.IO; | |||
using System.Text; | |||
namespace Fr.BahaBulle.Compression.Valis | |||
{ | |||
internal static class cValis | |||
{ | |||
private struct st_param | |||
{ | |||
public int length; | |||
public int offset; | |||
} | |||
public static bool ValisDecompression(List<Parser.stParam> param) | |||
{ | |||
Parser parser = Parser.INSTANCE; | |||
if (param.Count != 2) | |||
{ | |||
Trace.WriteLine(string.Format("Number of parameters incorrect - 2 waited ; got {0}", param.Count)); | |||
return false; | |||
} | |||
Parser.stStream source = default(Parser.stStream); | |||
long source_adress = 0; | |||
Parser.stStream destination = default(Parser.stStream); | |||
object obj; | |||
foreach (Parser.stParam arg in param) | |||
{ | |||
if (arg.name == "source") | |||
{ | |||
obj = parser.GetParam(arg.param, "file"); | |||
if (obj == null) | |||
{ | |||
Trace.WriteLine("Parameter file not found"); | |||
return false; | |||
} | |||
else | |||
source = (Parser.stStream)obj; | |||
obj = parser.GetParam(arg.param, "adress", "long"); | |||
if (obj != null) | |||
source_adress = (long)obj; | |||
else | |||
source_adress = 0; | |||
} | |||
else if (arg.name == "dest") | |||
{ | |||
obj = parser.GetParam(arg.param, "file", null, true); | |||
if (obj == null) | |||
destination = parser.NewStream(arg.param["file"], true); | |||
else | |||
destination = (Parser.stStream)obj; | |||
} | |||
else | |||
{ | |||
Trace.WriteLine(string.Format("Incorrect option - source, dest, pointer ; get {0}", arg.name)); | |||
return false; | |||
} | |||
} | |||
source.file.Position = source_adress; | |||
if (!Decomp(source, destination)) | |||
return false; | |||
if (!string.IsNullOrEmpty(destination.filename)) | |||
parser.WriteStream(destination); | |||
return true; | |||
} | |||
public static bool ValisCompression(List<Parser.stParam> param) | |||
{ | |||
Parser parser = Parser.INSTANCE; | |||
if (param.Count != 2) | |||
{ | |||
Trace.WriteLine(string.Format("Number of parameters incorrect - 2 waited ; got {0}", param.Count)); | |||
return false; | |||
} | |||
Parser.stStream source = default(Parser.stStream); | |||
Parser.stStream destination = default(Parser.stStream); | |||
object obj; | |||
foreach (Parser.stParam arg in param) | |||
{ | |||
if (arg.name == "source") | |||
{ | |||
obj = parser.GetParam(arg.param, "file"); | |||
if (obj == null) | |||
{ | |||
Trace.WriteLine("Parameter file not found"); | |||
return false; | |||
} | |||
else | |||
source = (Parser.stStream)obj; | |||
} | |||
else if (arg.name == "dest") | |||
{ | |||
obj = parser.GetParam(arg.param, "file", null, true); | |||
if (obj == null) | |||
destination = parser.NewStream(arg.param["file"], true); | |||
else | |||
destination = (Parser.stStream)obj; | |||
} | |||
else | |||
{ | |||
Trace.WriteLine(string.Format("Incorrect option - source, dest, pointer ; get {0}", arg.name)); | |||
return false; | |||
} | |||
} | |||
if (!Comp(source, destination)) | |||
return false; | |||
return true; | |||
} | |||
#region Private methods | |||
/// <summary> | |||
/// Initialise the buffer | |||
/// </summary> | |||
/// <returns></returns> | |||
private static byte[] InitBuffer(int size = 0x1000) | |||
{ | |||
byte[] buffer = new byte[size]; | |||
int pos = 0; | |||
byte value = 0x00; | |||
for (int i = 0; i < 0x100; i++) | |||
{ | |||
for (int j = 0; j < 13; j++) | |||
{ | |||
buffer[pos++] = value; | |||
} | |||
value++; | |||
} | |||
value = 0x00; | |||
for (int i = 0; i < 0x100; i++) | |||
{ | |||
buffer[pos++] = value++; | |||
} | |||
value = 0xFF; | |||
for (int i = 0; i < 0x100; i++) | |||
{ | |||
buffer[pos++] = value--; | |||
} | |||
for (int i = 0; i < 0x80; i++) | |||
{ | |||
buffer[pos++] = 0x00; | |||
} | |||
for (int i = 0; i < 0x80; i++) | |||
{ | |||
buffer[pos++] = 0x20; | |||
} | |||
return buffer; | |||
} | |||
/// <summary> | |||
/// Find the greater LZ compression from a position | |||
/// </summary> | |||
/// <param name="a_bytes">Array of bytes where look for RLE compression</param> | |||
/// <param name="pos">Current position in the array</param> | |||
/// <returns></returns> | |||
private static st_param FindLZInBuffer(byte[] a_bytes, int pos, int size_buffer, int len_max) | |||
{ | |||
st_param param; | |||
int dict = 0; | |||
int pos_result = 0; | |||
int len_result = 0; | |||
if (pos > 0x1000) | |||
dict = pos - 0xFFF; | |||
while (dict < pos) | |||
{ | |||
int len = 0; | |||
while (pos + len < a_bytes.Length && a_bytes[dict + len] == a_bytes[pos + len] && (len < len_max)) | |||
len++; | |||
if (len >= len_result) | |||
{ | |||
pos_result = dict; | |||
len_result = len; | |||
} | |||
dict++; | |||
} | |||
param.length = len_result; | |||
param.offset = pos_result; | |||
return param; | |||
} | |||
/// <summary> | |||
/// Decompress a stream | |||
/// </summary> | |||
/// <param name="Source">Stream to decompress</param> | |||
/// <param name="Destination">Destination stream</param> | |||
/// <returns></returns> | |||
private static bool Decomp(Parser.stStream Source, Parser.stStream Destination) | |||
{ | |||
int pos = 0xFEE; | |||
int curr_pos = 0; | |||
byte[] bytes = new byte[0x1000]; | |||
byte one_byte; | |||
UInt16 two_bytes; | |||
LogTrace trace = LogTrace.INSTANCE; | |||
try | |||
{ | |||
using (BinaryReader br = new BinaryReader(Source.file, Encoding.Default, true)) | |||
{ | |||
UInt32 size_in = br.ReadUInt32().ToBigEndian32(); | |||
UInt32 size_out = br.ReadUInt32().ToBigEndian32(); | |||
bytes = InitBuffer(); | |||
if (trace.TSwitch.TraceVerbose) | |||
{ | |||
using (BinaryWriter bw = new BinaryWriter(File.Open("buffer.bin", FileMode.Create))) | |||
{ | |||
bw.Write(bytes); | |||
} | |||
} | |||
Trace.WriteLineIf(trace.TSwitch.TraceVerbose, string.Format("Size IN {0}\nSize OUT {1}", size_in, size_out)); | |||
while (curr_pos < size_out) | |||
{ | |||
byte header = br.ReadByte(); | |||
Trace.WriteLineIf(trace.TSwitch.TraceVerbose, string.Format("header {0:X08} : {1:X02}", br.BaseStream.Position - 1, header)); | |||
for (int i = 0; i < 8; i++) | |||
{ | |||
if ((header & 1) == 1) | |||
{ | |||
one_byte = br.ReadByte(); | |||
Trace.WriteLineIf(trace.TSwitch.TraceVerbose, string.Format(" {0} - Ecrit {1:X08} : {2:X02}", i, Destination.file.Position, one_byte)); | |||
Destination.file.WriteByte(one_byte); | |||
curr_pos++; | |||
bytes[pos] = one_byte; | |||
pos = (pos + 1) & 0xFFF; | |||
} | |||
else | |||
{ | |||
two_bytes = br.ReadUInt16(); | |||
int nb = ((two_bytes >> 8) & 0x0F) + 3; | |||
int pos_lz = ((two_bytes & 0xF000) >> 4) | (two_bytes & 0xFF); | |||
Trace.WriteLineIf(trace.TSwitch.TraceVerbose, string.Format(" {0} - LZ : {1:X04}", i, two_bytes)); | |||
Trace.WriteLineIf(trace.TSwitch.TraceVerbose, string.Format(" nb : 0x{0:X02} ({1})", nb, nb)); | |||
Trace.WriteLineIf(trace.TSwitch.TraceVerbose, string.Format(" Pos : 0x{0:X04} ({1})", pos_lz, pos_lz)); | |||
Trace.WriteIf(trace.TSwitch.TraceVerbose, string.Format(" Ecrit {0:X08} : ", Destination.file.Position)); | |||
for (int j = 0; j < nb; j++) | |||
{ | |||
Destination.file.WriteByte(bytes[pos_lz]); | |||
curr_pos++; | |||
bytes[pos] = bytes[pos_lz]; | |||
Trace.WriteIf(trace.TSwitch.TraceVerbose, string.Format("{0:X02} ", bytes[pos_lz])); | |||
pos = (pos + 1) & 0xFFF; | |||
pos_lz = (pos_lz + 1) & 0xFFF; | |||
} | |||
Trace.WriteLineIf(trace.TSwitch.TraceVerbose, ""); | |||
} | |||
header >>= 1; | |||
if (curr_pos >= size_out) | |||
break; | |||
} | |||
Trace.WriteLineIf(trace.TSwitch.TraceVerbose, ""); | |||
} | |||
} | |||
return true; | |||
} | |||
catch (Exception ex) | |||
{ | |||
Trace.WriteLine(string.Format("(EE) {0}", ex.Message)); | |||
return false; | |||
} | |||
} | |||
/// <summary> | |||
/// Compress a stream | |||
/// </summary> | |||
/// <param name="Source">Stream to compress</param> | |||
/// <param name="Destination">Destination stream</param> | |||
/// <returns></returns> | |||
private static bool Comp(Parser.stStream Source, Parser.stStream Destination) | |||
{ | |||
st_param param_lz; | |||
int size_out = (int)Source.file.Length; | |||
int pos_temp = 0; | |||
int pos = 0xFEE; | |||
int curr_pos = pos; | |||
byte[] b_size_out = BitConverter.GetBytes(size_out.ToBigEndian32()); | |||
byte[] temp = new byte[24]; | |||
int buffer_size = 0x1000; | |||
LogTrace trace = LogTrace.INSTANCE; | |||
try | |||
{ | |||
Source.file.Position = 0; | |||
Destination.file.Position = 0; | |||
Destination.file.Write(b_size_out, 0, 4); | |||
Destination.file.Write(b_size_out, 0, 4); | |||
byte[] bytes = InitBuffer(pos + size_out); | |||
Source.file.Read(bytes, pos, size_out); | |||
while (curr_pos < size_out + pos) | |||
{ | |||
byte header = 0; | |||
for (int i = 0; i < 8; i++) | |||
{ | |||
if (curr_pos >= size_out + pos) | |||
break; | |||
Trace.WriteLineIf(trace.TSwitch.TraceVerbose, string.Format("{0} - Pos : {1:X}", i, curr_pos - pos)); | |||
param_lz = FindLZInBuffer(bytes, curr_pos, buffer_size, 0x12); | |||
Trace.WriteLineIf(trace.TSwitch.TraceVerbose, string.Format(" nb LZ : {0:000}", param_lz.length)); | |||
if (param_lz.length < 3) | |||
{ | |||
Trace.WriteLineIf(trace.TSwitch.TraceVerbose, string.Format(" -> Byte : {0:X02}", bytes[curr_pos])); | |||
temp[pos_temp++] = bytes[curr_pos]; | |||
header |= (byte)(1 << i); | |||
curr_pos++; | |||
} | |||
else | |||
{ | |||
Trace.WriteLineIf(trace.TSwitch.TraceVerbose, string.Format(" POS_LZ : {0:X04}", param_lz.offset)); | |||
Trace.WriteLineIf(trace.TSwitch.TraceVerbose, string.Format(" -> LZ : {0:X02}{1:X02}", (byte)(((param_lz.offset & 0xF00) >> 4) | ((param_lz.length - 3) & 0x0F)), (byte)(param_lz.offset & 0xFF))); | |||
temp[pos_temp++] = (byte)(param_lz.offset & 0xFF); | |||
temp[pos_temp++] = (byte)(((param_lz.offset & 0xF00) >> 4) | ((param_lz.length - 3) & 0x0F)); | |||
curr_pos += param_lz.length; | |||
} | |||
} | |||
Trace.WriteLineIf(trace.TSwitch.TraceVerbose, string.Format("Header : {0:X02}\n", header)); | |||
Destination.file.WriteByte(header); | |||
Destination.file.Write(temp, 0, pos_temp); | |||
pos_temp = 0; | |||
} | |||
byte[] b_size_in = BitConverter.GetBytes((int)((Destination.file.Length - 8).ToBigEndian32())); | |||
Destination.file.Position = 0; | |||
Destination.file.Write(b_size_in, 0, 4); | |||
return true; | |||
} | |||
catch (Exception ex) | |||
{ | |||
Trace.WriteLine(string.Format("(EE) {0}", ex.Message)); | |||
return false; | |||
} | |||
} | |||
#endregion | |||
} | |||
} |