| @ -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 | |||||
| } | |||||
| } | |||||