From 3bf20290a3d87f44d56a14c8c42496d4f44abd89 Mon Sep 17 00:00:00 2001 From: barubary Date: Sun, 15 May 2011 15:16:04 +0000 Subject: [PATCH] C#: Disabled LZ-Overlay from 'decompressing' files that have four 0-bytes at the end. Also implemented the command-line input, and added a new release build to the bin/ folder. --- CSharp/DSDecmp/Formats/LZOvl.cs | 2 +- CSharp/DSDecmp/NewProgram.cs | 499 +++++++++++++++++++++++++++++++- CSharp/bin/DSDecmp.exe | Bin 22016 -> 55808 bytes 3 files changed, 494 insertions(+), 7 deletions(-) diff --git a/CSharp/DSDecmp/Formats/LZOvl.cs b/CSharp/DSDecmp/Formats/LZOvl.cs index 3f4decb..957db32 100644 --- a/CSharp/DSDecmp/Formats/LZOvl.cs +++ b/CSharp/DSDecmp/Formats/LZOvl.cs @@ -59,7 +59,7 @@ namespace DSDecmp.Formats uint extraSize = IOUtils.ToNDSu32(header, header.Length - 4); if (extraSize == 0) - return true; + return false; // do not decompress whenevr the last 4 bytes are 0; too many files have that. // if the extrasize is nonzero, the minimum header length is 8 bytes if (header.Length < 8) return false; diff --git a/CSharp/DSDecmp/NewProgram.cs b/CSharp/DSDecmp/NewProgram.cs index 8b28317..5c162ee 100644 --- a/CSharp/DSDecmp/NewProgram.cs +++ b/CSharp/DSDecmp/NewProgram.cs @@ -1,12 +1,31 @@ using System; using System.Collections.Generic; using System.Text; +using DSDecmp.Formats.Nitro; +using DSDecmp.Formats; +using System.IO; namespace DSDecmp { public static class NewProgram { - public static void Main3(string[] args) + /// + /// The formats allowed when compressing a file. + /// + public enum Formats + { + LZOVL, // keep this as the first one, as only the end of a file may be LZ-ovl-compressed (and overlay files are oftenly double-compressed) + LZ10, + LZ11, + HUFF4, + HUFF8, + RLE, + HUFF, + NDS, + GBA, + } + + public static void Main(string[] args) { if (args.Length == 0) { @@ -16,7 +35,102 @@ namespace DSDecmp #endif return; } - + + int argIndex = 0; + bool compress = false; + Formats compressFormat = Formats.NDS; + + #region check for the -c option and its parameter(s) + if (args[argIndex].Equals("-c")) + { + argIndex++; + compress = true; + + if (args.Length < argIndex + 2) + { + Console.WriteLine("A compression format and input file is required in order to compress."); + Console.WriteLine(); + PrintUsage(); + return; + } + switch (args[argIndex].ToLower()) + { + case "lz10": compressFormat = Formats.LZ10; break; + case "lz11": compressFormat = Formats.LZ11; break; + case "lzovl": compressFormat = Formats.LZOVL; break; + case "rle": compressFormat = Formats.RLE; break; + case "huff4": compressFormat = Formats.HUFF4; break; + case "huff8": compressFormat = Formats.HUFF8; break; + case "huff": compressFormat = Formats.HUFF; break; + case "gba*": compressFormat = Formats.GBA; break; + case "nds*": compressFormat = Formats.NDS; break; + default: + Console.WriteLine("Unknown compression format " + args[argIndex]); + Console.WriteLine(); + PrintUsage(); + return; + } + argIndex++; + // handle the format options + switch (compressFormat) + { + case Formats.LZ10: + case Formats.GBA: + if (args[argIndex].Equals("-opt")) + { + LZ10.LookAhead = true; + argIndex++; + } + break; + case Formats.LZ11: + if (args[argIndex].Equals("-opt")) + { + LZ11.LookAhead = true; + argIndex++; + } + break; + case Formats.LZOVL: + if (args[argIndex].Equals("-opt")) + { + LZOvl.LookAhead = true; + argIndex++; + } + break; + case Formats.NDS: + if (args[argIndex].Equals("-opt")) + { + LZ10.LookAhead = true; + LZ11.LookAhead = true; + LZOvl.LookAhead = true; + argIndex++; + } + break; + } + } + #endregion + + if (args.Length < argIndex + 1) + throw new ArgumentException("No input file given."); + + bool guessExtension = false; + if (args[argIndex].Equals("-ge")) + { + guessExtension = true; + argIndex++; + } + + if (args.Length < argIndex + 1) + throw new ArgumentException("No input file given."); + + string input = args[argIndex++]; + string output = null; + if (args.Length > argIndex) + output = args[argIndex++]; + + if (compress) + Compress(input, output, compressFormat, guessExtension); + else + Decompress(input, output, guessExtension); #if DEBUG Console.ReadLine(); @@ -27,12 +141,14 @@ namespace DSDecmp { Console.WriteLine("DSDecmp - Decompressor for compression formats used on the NDS - by Barubary"); Console.WriteLine(); - Console.WriteLine("Usage:\tDSDecmp (-c FORMAT (FORMATOPTS)) (-ge) input (output)"); + Console.WriteLine("Usage:\tDSDecmp (-c FORMAT FORMATOPT*) (-ge) input (output)"); Console.WriteLine(); Console.WriteLine("Without the -c modifier, DSDecmp will decompress the input file to the output"); Console.WriteLine("file. If the output file is a directory, the output file will be placed in that"); Console.WriteLine("directory with the same filename as the original file. The extension will be"); Console.WriteLine("appended with a format-specific extension."); + Console.WriteLine("If the output is a nonexistent file or directory, it is assumed to be a"); + Console.WriteLine("directory iff there is no '.' in the name."); Console.WriteLine("The input can also be a directory. In that case, it would be the same as"); Console.WriteLine("calling DSDecmp for every non-directory in the given directory with the same"); Console.WriteLine("options, with one exception; the output is by default the input folder, but"); @@ -56,15 +172,20 @@ namespace DSDecmp Console.WriteLine(" --- utility 'formats' ---"); Console.WriteLine(" huff - The Huffman compression that gives the bext compression ratio."); Console.WriteLine(" nds* - The built-in compression format that gives the best compression"); - Console.WriteLine(" ratio."); + Console.WriteLine(" ratio. Will never compress using lzovl."); Console.WriteLine(" gba* - The built-in compression format that gives the best compression"); Console.WriteLine(" ratio, and is also supported by the GBA."); Console.WriteLine(); - Console.WriteLine("The following format options are available:"); - Console.WriteLine(" lz10, lz11 and lzovl:"); + Console.WriteLine("The following format options (FORMATOPT) are available:"); + Console.WriteLine(" lz10, lz11, lzovl, gba* and nds*:"); Console.WriteLine(" -opt : employs a better compression algorithm to boost the compression"); Console.WriteLine(" ratio. Not using this option will result in using the algorithm"); Console.WriteLine(" originally used to compress the game files."); + Console.WriteLine(" Using this option for the gba* and nds* will only have effect on"); + Console.WriteLine(" the lz10, lz11 and lzovl algorithms."); + Console.WriteLine(); + Console.WriteLine("If the input is a directory when the -c option, the default output directory"); + Console.WriteLine("is the input directory appended with '_cmp'."); Console.WriteLine(); Console.WriteLine("Supplying the -ge modifier together with the -c modifier, the extension of the"); Console.WriteLine("compressed files will be extended with the 'FORMAT' value that always results"); @@ -73,5 +194,371 @@ namespace DSDecmp Console.WriteLine("extended with .cdat"); } + + #region compression methods + + private static void Compress(string input, string output, Formats format, bool guessExtension) + { + if (!File.Exists(input) && !Directory.Exists(input)) + { + Console.WriteLine("Cannot compress a file or directory that does not exist (" + input + ")"); + return; + } + + // set the default value of the output + if (string.IsNullOrEmpty(output)) + { + if (Directory.Exists(input)) + { + if (!Directory.Exists(input + "_cmp")) + Directory.CreateDirectory(input + "_cmp"); + foreach (string file in Directory.GetFiles(input)) + { + Compress(file, input + "_cmp", format, guessExtension); + } + return; + } + else + { + if (!guessExtension) + output = input; // the .cdat extension is added automatically + else + output = Path.GetDirectoryName(input); + } + } + + if (Directory.Exists(input)) + { + if (!Directory.Exists(output)) + Directory.CreateDirectory(output); + foreach (string file in Directory.GetFiles(input)) + { + Compress(file, output, format, guessExtension); + } + return; + } + + + // compress the input + MemoryStream compressedData = new MemoryStream(); + Formats compressedFormat; + int outsize = DoCompress(input, compressedData, format, out compressedFormat); + if (outsize < 0) + return; + + if (Directory.Exists(output)) + { + output = CombinePaths(output, Path.GetFileName(input)); + } + if (Path.GetExtension(output) == ".dat") + output = RemoveExtension(output); + if (guessExtension) + output += "." + compressedFormat.ToString().ToLower(); + else + output += ".cdat"; + + using (FileStream outStream = File.Create(output)) + { + compressedData.WriteTo(outStream); + Console.WriteLine(compressedFormat.ToString() + "-compressed " + input + " to " + output); + } + } + + private static int DoCompress(string infile, MemoryStream output, Formats format, out Formats actualFormat) + { + CompressionFormat fmt = null; + switch (format) + { + case Formats.LZ10: fmt = new LZ10(); break; + case Formats.LZ11: fmt = new LZ11(); break; + case Formats.LZOVL: fmt = new LZOvl(); break; + case Formats.RLE: fmt = new RLE(); break; + case Formats.HUFF4: Huffman.CompressBlockSize = Huffman.BlockSize.FOURBIT; fmt = new Huffman(); break; + case Formats.HUFF8: Huffman.CompressBlockSize = Huffman.BlockSize.EIGHTBIT; fmt = new Huffman(); break; + case Formats.HUFF: + return CompressHuff(infile, output, out actualFormat); + case Formats.GBA: + return CompressGBA(infile, output, out actualFormat); + case Formats.NDS: + return CompressNDS(infile, output, out actualFormat); + default: + throw new Exception("Unhandled compression format " + format); + } + actualFormat = format; + + using (FileStream inStream = File.OpenRead(infile)) + { + try + { + return fmt.Compress(inStream, inStream.Length, output); + } + catch (Exception s) + { + // any exception generated by compression is a fatal exception + Console.WriteLine(s.Message); + return -1; + } + } + } + + private static int CompressHuff(string infile, MemoryStream output, out Formats actualFormat) + { + return CompressBest(infile, output, out actualFormat, Formats.HUFF4, Formats.HUFF8); + } + + private static int CompressGBA(string infile, MemoryStream output, out Formats actualFormat) + { + return CompressBest(infile, output, out actualFormat, Formats.HUFF4, Formats.HUFF8, Formats.LZ10, Formats.RLE); + } + + private static int CompressNDS(string infile, MemoryStream output, out Formats actualFormat) + { + return CompressBest(infile, output, out actualFormat, Formats.HUFF4, Formats.HUFF8, Formats.LZ10, Formats.LZ11, Formats.RLE); + } + + private static int CompressBest(string infile, MemoryStream output, out Formats actualFormat, params Formats[] formats) + { + // only read the input data once from the file. + byte[] inputData; + using (FileStream inStream = File.OpenRead(infile)) + { + inputData = new byte[inStream.Length]; + inStream.Read(inputData, 0, inputData.Length); + } + + MemoryStream bestOutput = null; + int minCompSize = int.MaxValue; + actualFormat = Formats.GBA; + foreach (Formats format in formats) + { + #region compress the file in each format, and save the best one + + MemoryStream currentOutput = new MemoryStream(); + CompressionFormat realFormat = null; + switch (format) + { + case Formats.HUFF4: Huffman.CompressBlockSize = Huffman.BlockSize.FOURBIT; realFormat = new Huffman(); break; + case Formats.HUFF8: Huffman.CompressBlockSize = Huffman.BlockSize.EIGHTBIT; realFormat = new Huffman(); break; + case Formats.LZ10: realFormat = new LZ10(); break; + case Formats.LZ11: realFormat = new LZ11(); break; + case Formats.LZOVL: realFormat = new LZOvl(); break; + case Formats.RLE: realFormat = new RLE(); break; + } + + int currentOutSize; + try + { + using (MemoryStream inStream = new MemoryStream(inputData)) + { + currentOutSize = realFormat.Compress(inStream, inStream.Length, currentOutput); + } + } + catch (InputTooLargeException i) + { + Console.WriteLine(i.Message); + actualFormat = format; + return -1; + } + catch (Exception) + { + continue; + } + if (currentOutSize < minCompSize) + { + bestOutput = currentOutput; + minCompSize = currentOutSize; + actualFormat = format; + } + + #endregion + } + + if (bestOutput == null) + { + Console.WriteLine("The file could not be compressed in any format."); + return -1; + } + bestOutput.WriteTo(output); + return minCompSize; + } + + #endregion + + #region decompression methods + + private static void Decompress(string input, string output, bool guessExtension) + { + if (!File.Exists(input) && !Directory.Exists(input)) + { + Console.WriteLine("Cannot decompress a file or directory that does not exist (" + input + ")"); + return; + } + + // set the default value of the output + if (string.IsNullOrEmpty(output)) + { + if (Directory.Exists(input)) + { + if (!Directory.Exists(input + "_dec")) + Directory.CreateDirectory(input + "_dec"); + foreach (string file in Directory.GetFiles(input)) + { + Decompress(file, input + "_dec", guessExtension); + } + return; + } + else + { + if (!guessExtension) + output = input; // '.dat' gets added automatically if -ge is not given + else + output = Path.GetDirectoryName(input); + } + } + + if (Directory.Exists(input)) + { + if (File.Exists(output)) + { + Console.WriteLine("Cannot decompress a folder to a single file."); + return; + } + if (!Directory.Exists(output)) + Directory.CreateDirectory(output); + foreach (string file in Directory.GetFiles(input)) + { + Decompress(file, output, guessExtension); + } + return; + } + + + byte[] inData; + using (FileStream inStream = File.OpenRead(input)) + { + inData = new byte[inStream.Length]; + inStream.Read(inData, 0, inData.Length); + } + + MemoryStream decompressedData = new MemoryStream(); + long decSize = -1; + Formats usedFormat = Formats.NDS; + // just try all formats, and stop once one has been found that can decompress it. + foreach (Formats f in Enum.GetValues(typeof(Formats))) + { + using (MemoryStream inStream = new MemoryStream(inData)) + { + decSize = Decompress(inStream, decompressedData, f); + if (decSize >= 0) + { + usedFormat = f; + break; + } + } + } + if (decSize < 0) + { + Console.WriteLine("Could not decompress " + input + "; no matching compression method found."); + return; + } + + if (Directory.Exists(output)) + { + output = CombinePaths(output, Path.GetFileName(input)); + } + + switch (Path.GetExtension(output)) + { + case ".cdat": + case ".lz10": + case ".lz11": + case ".lzovl": + case ".rle": + case ".huff4": + case ".huff8": + output = RemoveExtension(output); + break; + } + byte[] outData = decompressedData.ToArray(); + if (guessExtension) + { + string ext = ""; + for (int i = 0; i < 4; i++) + { + if ((outData[i] >= 'a' && outData[i] <= 'z') + || (outData[i] >= 'A' && outData[i] <= 'Z') + || char.IsDigit((char)outData[i])) + ext += (char)outData[i]; + else + break; + } + if (ext.Length > 0) + output += "." + ext; + else + output += ".dat"; + } + else + output += ".dat"; + + using (FileStream outStream = File.Create(output)) + { + outStream.Write(outData, 0, outData.Length); + Console.WriteLine(usedFormat.ToString() + "-decompressed " + input); + } + + } + + private static long Decompress(MemoryStream inputStream, MemoryStream output, Formats format) + { + CompressionFormat realFormat = null; + switch (format) + { + case Formats.HUFF: + realFormat = new Huffman(); break; + case Formats.LZ10: + realFormat = new LZ10(); break; + case Formats.LZ11: + realFormat = new LZ11(); break; + case Formats.LZOVL: + realFormat = new LZOvl(); break; + case Formats.RLE: + realFormat = new RLE(); break; + default: + return -1; + } + if (!realFormat.Supports(inputStream, inputStream.Length)) + return -1; + try + { + return realFormat.Decompress(inputStream, inputStream.Length, output); + } + catch (TooMuchInputException e) + { + Console.WriteLine(e.Message); + return output.Length; + } + catch (Exception e) + { + Console.WriteLine("Could not decompress using the " + format.ToString() + " format; " + e.Message); + return -1; + } + } + + #endregion + + private static string CombinePaths(string dir, string file) + { + if (Path.IsPathRooted(file)) + return file; + if (!dir.EndsWith(Path.DirectorySeparatorChar + "") + && !dir.EndsWith(Path.AltDirectorySeparatorChar + "")) + return dir + Path.DirectorySeparatorChar + file; + else + return dir + file; + } + private static string RemoveExtension(string path) + { + return Path.GetDirectoryName(path) + Path.DirectorySeparatorChar + Path.GetFileNameWithoutExtension(path); + } } } diff --git a/CSharp/bin/DSDecmp.exe b/CSharp/bin/DSDecmp.exe index 257337eb9ec3a4b82124f412b72293719fb12da3..ff7341789a7d86fec9681186198a55dce2b01d10 100644 GIT binary patch literal 55808 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%0Ae|&bcJEgB2|GnD?E>OUzqz|Sc_5h~HkiL9 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 literal 22016 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 Q^Y9bgv;6