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