OLD | NEW |
| (Empty) |
1 package SevenZip; | |
2 | |
3 public class LzmaAlone | |
4 { | |
5 static public class CommandLine | |
6 { | |
7 public static final int kEncode = 0; | |
8 public static final int kDecode = 1; | |
9 public static final int kBenchmak = 2; | |
10 | |
11 public int Command = -1; | |
12 public int NumBenchmarkPasses = 10; | |
13 | |
14 public int DictionarySize = 1 << 23; | |
15 public boolean DictionarySizeIsDefined = false; | |
16 | |
17 public int Lc = 3; | |
18 public int Lp = 0; | |
19 public int Pb = 2; | |
20 | |
21 public int Fb = 128; | |
22 public boolean FbIsDefined = false; | |
23 | |
24 public boolean Eos = false; | |
25 | |
26 public int Algorithm = 2; | |
27 public int MatchFinder = 1; | |
28 | |
29 public String InFile; | |
30 public String OutFile; | |
31 | |
32 boolean ParseSwitch(String s) | |
33 { | |
34 if (s.startsWith("d")) | |
35 { | |
36 DictionarySize = 1 << Integer.parseInt(s.substri
ng(1)); | |
37 DictionarySizeIsDefined = true; | |
38 } | |
39 else if (s.startsWith("fb")) | |
40 { | |
41 Fb = Integer.parseInt(s.substring(2)); | |
42 FbIsDefined = true; | |
43 } | |
44 else if (s.startsWith("a")) | |
45 Algorithm = Integer.parseInt(s.substring(1)); | |
46 else if (s.startsWith("lc")) | |
47 Lc = Integer.parseInt(s.substring(2)); | |
48 else if (s.startsWith("lp")) | |
49 Lp = Integer.parseInt(s.substring(2)); | |
50 else if (s.startsWith("pb")) | |
51 Pb = Integer.parseInt(s.substring(2)); | |
52 else if (s.startsWith("eos")) | |
53 Eos = true; | |
54 else if (s.startsWith("mf")) | |
55 { | |
56 String mfs = s.substring(2); | |
57 if (mfs.equals("bt2")) | |
58 MatchFinder = 0; | |
59 else if (mfs.equals("bt4")) | |
60 MatchFinder = 1; | |
61 else if (mfs.equals("bt4b")) | |
62 MatchFinder = 2; | |
63 else | |
64 return false; | |
65 } | |
66 else | |
67 return false; | |
68 return true; | |
69 } | |
70 | |
71 public boolean Parse(String[] args) throws Exception | |
72 { | |
73 int pos = 0; | |
74 boolean switchMode = true; | |
75 for (int i = 0; i < args.length; i++) | |
76 { | |
77 String s = args[i]; | |
78 if (s.length() == 0) | |
79 return false; | |
80 if (switchMode) | |
81 { | |
82 if (s.compareTo("--") == 0) | |
83 { | |
84 switchMode = false; | |
85 continue; | |
86 } | |
87 if (s.charAt(0) == '-') | |
88 { | |
89 String sw = s.substring(1).toLow
erCase(); | |
90 if (sw.length() == 0) | |
91 return false; | |
92 try | |
93 { | |
94 if (!ParseSwitch(sw)) | |
95 return false; | |
96 } | |
97 catch (NumberFormatException e) | |
98 { | |
99 return false; | |
100 } | |
101 continue; | |
102 } | |
103 } | |
104 if (pos == 0) | |
105 { | |
106 if (s.equalsIgnoreCase("e")) | |
107 Command = kEncode; | |
108 else if (s.equalsIgnoreCase("d")) | |
109 Command = kDecode; | |
110 else if (s.equalsIgnoreCase("b")) | |
111 Command = kBenchmak; | |
112 else | |
113 return false; | |
114 } | |
115 else if(pos == 1) | |
116 { | |
117 if (Command == kBenchmak) | |
118 { | |
119 try | |
120 { | |
121 NumBenchmarkPasses = Int
eger.parseInt(s); | |
122 if (NumBenchmarkPasses <
1) | |
123 return false; | |
124 } | |
125 catch (NumberFormatException e) | |
126 { | |
127 return false; | |
128 } | |
129 } | |
130 else | |
131 InFile = s; | |
132 } | |
133 else if(pos == 2) | |
134 OutFile = s; | |
135 else | |
136 return false; | |
137 pos++; | |
138 continue; | |
139 } | |
140 return true; | |
141 } | |
142 } | |
143 | |
144 | |
145 static void PrintHelp() | |
146 { | |
147 System.out.println( | |
148 "\nUsage: LZMA <e|d> [<switches>...] inputFile
outputFile\n" + | |
149 " e: encode file\n" + | |
150 " d: decode file\n" + | |
151 " b: Benchmark\n" + | |
152 "<Switches>\n" + | |
153 // " -a{N}: set compression mode - [0, 1], def
ault: 1 (max)\n" + | |
154 " -d{N}: set dictionary - [0,28], default: 23
(8MB)\n" + | |
155 " -fb{N}: set number of fast bytes - [5, 273],
default: 128\n" + | |
156 " -lc{N}: set number of literal context bits -
[0, 8], default: 3\n" + | |
157 " -lp{N}: set number of literal pos bits - [0,
4], default: 0\n" + | |
158 " -pb{N}: set number of pos bits - [0, 4], defa
ult: 2\n" + | |
159 " -mf{MF_ID}: set Match Finder: [bt2, bt4], def
ault: bt4\n" + | |
160 " -eos: write End Of Stream marker\n" | |
161 ); | |
162 } | |
163 | |
164 public static void main(String[] args) throws Exception | |
165 { | |
166 System.out.println("\nLZMA (Java) 4.61 2008-11-23\n"); | |
167 | |
168 if (args.length < 1) | |
169 { | |
170 PrintHelp(); | |
171 return; | |
172 } | |
173 | |
174 CommandLine params = new CommandLine(); | |
175 if (!params.Parse(args)) | |
176 { | |
177 System.out.println("\nIncorrect command"); | |
178 return; | |
179 } | |
180 | |
181 if (params.Command == CommandLine.kBenchmak) | |
182 { | |
183 int dictionary = (1 << 21); | |
184 if (params.DictionarySizeIsDefined) | |
185 dictionary = params.DictionarySize; | |
186 if (params.MatchFinder > 1) | |
187 throw new Exception("Unsupported match finder"); | |
188 SevenZip.LzmaBench.LzmaBenchmark(params.NumBenchmarkPass
es, dictionary); | |
189 } | |
190 else if (params.Command == CommandLine.kEncode || params.Command
== CommandLine.kDecode) | |
191 { | |
192 java.io.File inFile = new java.io.File(params.InFile); | |
193 java.io.File outFile = new java.io.File(params.OutFile); | |
194 | |
195 java.io.BufferedInputStream inStream = new java.io.Buff
eredInputStream(new java.io.FileInputStream(inFile)); | |
196 java.io.BufferedOutputStream outStream = new java.io.Buf
feredOutputStream(new java.io.FileOutputStream(outFile)); | |
197 | |
198 boolean eos = false; | |
199 if (params.Eos) | |
200 eos = true; | |
201 if (params.Command == CommandLine.kEncode) | |
202 { | |
203 SevenZip.Compression.LZMA.Encoder encoder = new
SevenZip.Compression.LZMA.Encoder(); | |
204 if (!encoder.SetAlgorithm(params.Algorithm)) | |
205 throw new Exception("Incorrect compressi
on mode"); | |
206 if (!encoder.SetDictionarySize(params.Dictionary
Size)) | |
207 throw new Exception("Incorrect dictionar
y size"); | |
208 if (!encoder.SetNumFastBytes(params.Fb)) | |
209 throw new Exception("Incorrect -fb value
"); | |
210 if (!encoder.SetMatchFinder(params.MatchFinder)) | |
211 throw new Exception("Incorrect -mf value
"); | |
212 if (!encoder.SetLcLpPb(params.Lc, params.Lp, par
ams.Pb)) | |
213 throw new Exception("Incorrect -lc or -l
p or -pb value"); | |
214 encoder.SetEndMarkerMode(eos); | |
215 encoder.WriteCoderProperties(outStream); | |
216 long fileSize; | |
217 if (eos) | |
218 fileSize = -1; | |
219 else | |
220 fileSize = inFile.length(); | |
221 for (int i = 0; i < 8; i++) | |
222 outStream.write((int)(fileSize >>> (8 *
i)) & 0xFF); | |
223 encoder.Code(inStream, outStream, -1, -1, null); | |
224 } | |
225 else | |
226 { | |
227 int propertiesSize = 5; | |
228 byte[] properties = new byte[propertiesSize]; | |
229 if (inStream.read(properties, 0, propertiesSize)
!= propertiesSize) | |
230 throw new Exception("input .lzma file is
too short"); | |
231 SevenZip.Compression.LZMA.Decoder decoder = new
SevenZip.Compression.LZMA.Decoder(); | |
232 if (!decoder.SetDecoderProperties(properties)) | |
233 throw new Exception("Incorrect stream pr
operties"); | |
234 long outSize = 0; | |
235 for (int i = 0; i < 8; i++) | |
236 { | |
237 int v = inStream.read(); | |
238 if (v < 0) | |
239 throw new Exception("Can't read
stream size"); | |
240 outSize |= ((long)v) << (8 * i); | |
241 } | |
242 if (!decoder.Code(inStream, outStream, outSize)) | |
243 throw new Exception("Error in data strea
m"); | |
244 } | |
245 outStream.flush(); | |
246 outStream.close(); | |
247 inStream.close(); | |
248 } | |
249 else | |
250 throw new Exception("Incorrect command"); | |
251 return; | |
252 } | |
253 } | |
OLD | NEW |