123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254 |
- package SevenZip;
- public class LzmaAlone
- {
- static public class CommandLine
- {
- public static final int kEncode = 0;
- public static final int kDecode = 1;
- public static final int kBenchmak = 2;
-
- public int Command = -1;
- public int NumBenchmarkPasses = 10;
-
- public int DictionarySize = 1 << 23;
- public boolean DictionarySizeIsDefined = false;
-
- public int Lc = 3;
- public int Lp = 0;
- public int Pb = 2;
-
- public int Fb = 128;
- public boolean FbIsDefined = false;
-
- public boolean Eos = false;
-
- public int Algorithm = 2;
- public int MatchFinder = 1;
-
- public String InFile;
- public String OutFile;
-
- boolean ParseSwitch(String s)
- {
- if (s.startsWith("d"))
- {
- DictionarySize = 1 << Integer.parseInt(s.substring(1));
- DictionarySizeIsDefined = true;
- }
- else if (s.startsWith("fb"))
- {
- Fb = Integer.parseInt(s.substring(2));
- FbIsDefined = true;
- }
- else if (s.startsWith("a"))
- Algorithm = Integer.parseInt(s.substring(1));
- else if (s.startsWith("lc"))
- Lc = Integer.parseInt(s.substring(2));
- else if (s.startsWith("lp"))
- Lp = Integer.parseInt(s.substring(2));
- else if (s.startsWith("pb"))
- Pb = Integer.parseInt(s.substring(2));
- else if (s.startsWith("eos"))
- Eos = true;
- else if (s.startsWith("mf"))
- {
- String mfs = s.substring(2);
- if (mfs.equals("bt2"))
- MatchFinder = 0;
- else if (mfs.equals("bt4"))
- MatchFinder = 1;
- else if (mfs.equals("bt4b"))
- MatchFinder = 2;
- else
- return false;
- }
- else
- return false;
- return true;
- }
-
- public boolean Parse(String[] args) throws Exception
- {
- int pos = 0;
- boolean switchMode = true;
- for (int i = 0; i < args.length; i++)
- {
- String s = args[i];
- if (s.length() == 0)
- return false;
- if (switchMode)
- {
- if (s.compareTo("--") == 0)
- {
- switchMode = false;
- continue;
- }
- if (s.charAt(0) == '-')
- {
- String sw = s.substring(1).toLowerCase();
- if (sw.length() == 0)
- return false;
- try
- {
- if (!ParseSwitch(sw))
- return false;
- }
- catch (NumberFormatException e)
- {
- return false;
- }
- continue;
- }
- }
- if (pos == 0)
- {
- if (s.equalsIgnoreCase("e"))
- Command = kEncode;
- else if (s.equalsIgnoreCase("d"))
- Command = kDecode;
- else if (s.equalsIgnoreCase("b"))
- Command = kBenchmak;
- else
- return false;
- }
- else if(pos == 1)
- {
- if (Command == kBenchmak)
- {
- try
- {
- NumBenchmarkPasses = Integer.parseInt(s);
- if (NumBenchmarkPasses < 1)
- return false;
- }
- catch (NumberFormatException e)
- {
- return false;
- }
- }
- else
- InFile = s;
- }
- else if(pos == 2)
- OutFile = s;
- else
- return false;
- pos++;
- continue;
- }
- return true;
- }
- }
-
-
- static void PrintHelp()
- {
- System.out.println(
- "\nUsage: LZMA <e|d> [<switches>...] inputFile outputFile\n" +
- " e: encode file\n" +
- " d: decode file\n" +
- " b: Benchmark\n" +
- "<Switches>\n" +
- // " -a{N}: set compression mode - [0, 1], default: 1 (max)\n" +
- " -d{N}: set dictionary - [0,28], default: 23 (8MB)\n" +
- " -fb{N}: set number of fast bytes - [5, 273], default: 128\n" +
- " -lc{N}: set number of literal context bits - [0, 8], default: 3\n" +
- " -lp{N}: set number of literal pos bits - [0, 4], default: 0\n" +
- " -pb{N}: set number of pos bits - [0, 4], default: 2\n" +
- " -mf{MF_ID}: set Match Finder: [bt2, bt4], default: bt4\n" +
- " -eos: write End Of Stream marker\n"
- );
- }
-
- public static void main(String[] args) throws Exception
- {
- System.out.println("\nLZMA (Java) 4.42 Copyright (c) 1999-2006 Igor Pavlov 2006-05-15\n");
-
- if (args.length < 1)
- {
- PrintHelp();
- return;
- }
-
- CommandLine params = new CommandLine();
- if (!params.Parse(args))
- {
- System.out.println("\nIncorrect command");
- return;
- }
-
- if (params.Command == CommandLine.kBenchmak)
- {
- int dictionary = (1 << 21);
- if (params.DictionarySizeIsDefined)
- dictionary = params.DictionarySize;
- if (params.MatchFinder > 1)
- throw new Exception("Unsupported match finder");
- SevenZip.LzmaBench.LzmaBenchmark(params.NumBenchmarkPasses, dictionary);
- }
- else if (params.Command == CommandLine.kEncode || params.Command == CommandLine.kDecode)
- {
- java.io.File inFile = new java.io.File(params.InFile);
- java.io.File outFile = new java.io.File(params.OutFile);
-
- java.io.BufferedInputStream inStream = new java.io.BufferedInputStream(new java.io.FileInputStream(inFile));
- java.io.BufferedOutputStream outStream = new java.io.BufferedOutputStream(new java.io.FileOutputStream(outFile));
-
- boolean eos = false;
- if (params.Eos)
- eos = true;
- if (params.Command == CommandLine.kEncode)
- {
- SevenZip.Compression.LZMA.Encoder encoder = new SevenZip.Compression.LZMA.Encoder();
- if (!encoder.SetAlgorithm(params.Algorithm))
- throw new Exception("Incorrect compression mode");
- if (!encoder.SetDictionarySize(params.DictionarySize))
- throw new Exception("Incorrect dictionary size");
- if (!encoder.SeNumFastBytes(params.Fb))
- throw new Exception("Incorrect -fb value");
- if (!encoder.SetMatchFinder(params.MatchFinder))
- throw new Exception("Incorrect -mf value");
- if (!encoder.SetLcLpPb(params.Lc, params.Lp, params.Pb))
- throw new Exception("Incorrect -lc or -lp or -pb value");
- encoder.SetEndMarkerMode(eos);
- encoder.WriteCoderProperties(outStream);
- long fileSize;
- if (eos)
- fileSize = -1;
- else
- fileSize = inFile.length();
- for (int i = 0; i < 8; i++)
- outStream.write((int)(fileSize >>> (8 * i)) & 0xFF);
- encoder.Code(inStream, outStream, -1, -1, null);
- }
- else
- {
- int propertiesSize = 5;
- byte[] properties = new byte[propertiesSize];
- if (inStream.read(properties, 0, propertiesSize) != propertiesSize)
- throw new Exception("input .lzma file is too short");
- SevenZip.Compression.LZMA.Decoder decoder = new SevenZip.Compression.LZMA.Decoder();
- if (!decoder.SetDecoderProperties(properties))
- throw new Exception("Incorrect stream properties");
- long outSize = 0;
- for (int i = 0; i < 8; i++)
- {
- int v = inStream.read();
- if (v < 0)
- throw new Exception("Can't read stream size");
- outSize |= ((long)v) << (8 * i);
- }
- if (!decoder.Code(inStream, outStream, outSize))
- throw new Exception("Error in data stream");
- }
- outStream.flush();
- outStream.close();
- inStream.close();
- }
- else
- throw new Exception("Incorrect command");
- return;
- }
- }
|