3 import java.util.Hashtable;
\r
4 import java.util.Vector;
\r
5 import java.util.zip.GZIPInputStream;
\r
7 import java.io.FileWriter;
\r
8 import java.io.FileInputStream;
\r
9 import java.io.IOException;
\r
10 import java.io.PrintWriter;
\r
12 public class InputFileTranslator{
\r
13 public static String PREFIX="";
\r
15 public static void main(String args[]){
\r
17 //To Uncompress GZip File Contents we need to open the gzip file.....
\r
19 System.out.println("Please enter the valid file name");
\r
22 boolean isCompressed = false;
\r
24 if (args[offset].equals("-dir")) {
\r
25 PREFIX=args[++offset]+"/";
\r
28 if(args[offset].equals("-compress")) {
\r
29 isCompressed = true;
\r
34 System.out.println("Opening the output file............. : opened");
\r
36 //Create the .h file
\r
37 String outFilename = PREFIX+"InputFileArrays.h";
\r
38 PrintWriter out = new PrintWriter(new FileWriter(new File(outFilename)));
\r
39 out.println("#ifndef INPUT_FILE_ARRAYS_H");
\r
40 out.println("#define INPUT_FILE_ARRAYS_H");
\r
42 out.println("#ifndef bool");
\r
43 out.println("typedef int bool;");
\r
44 out.println("#define true 1");
\r
45 out.println("#define false 0");
\r
46 out.println("#endif");
\r
48 out.println("int filename2fd(char * filename, int length);");
\r
49 out.println("int nextInt(int fd, int * pos, int * isHighbits);");
\r
50 out.println("double nextDouble(int fd, int * pos, int * isHighbits);");
\r
51 out.println("#endif");
\r
54 //Create the .c file that contains the big two-dimension array and
\r
56 outFilename = PREFIX+"InputFileArrays.c";
\r
57 out = new PrintWriter(new FileWriter(new File(outFilename)));
\r
58 out.println("#include \"InputFileArrays.h\"");
\r
59 out.println("#include \"math.h\"");
\r
61 Vector<String> sourcefiles=new Vector<String>();
\r
62 Vector<Boolean> compressVec = new Vector<Boolean>();
\r
63 Hashtable<Byte, Integer> encodemapping = new Hashtable<Byte, Integer>();
\r
64 Vector<Byte> encodeVec = new Vector<Byte>();
\r
66 int returncount = 10;
\r
67 for(int i=0; i<args.length-offset; i++) {
\r
69 encodemapping.clear();
\r
72 encodemapping.put((byte)0, 0);
\r
73 encodeVec.add((byte)0);
\r
75 String inFilename = args[i+offset];
\r
76 String arrayname = inFilename.replaceAll("\\.", "_");
\r
77 sourcefiles.add(inFilename);
\r
78 out.println("#define " + arrayname.toUpperCase() + " " + i);
\r
79 System.out.println("Opening the gzip file.......................... : opened");
\r
80 GZIPInputStream gzipInputStream = null;
\r
81 FileInputStream fileInputStream = null;
\r
82 gzipInputStream = new GZIPInputStream(new FileInputStream(inFilename));
\r
83 //OutputStream out = new FileOutputStream(outFilename);
\r
84 System.out.println("Trsansferring bytes from the compressed file to the output file........: Transfer successful");
\r
86 out.println("unsigned char " + arrayname + "[] = {");
\r
88 boolean printComma = false;
\r
89 boolean printReturn = false;
\r
90 byte[] buf = new byte[1024]; //size can be changed according to programmer's need.
\r
92 int writenum = isCompressed?2:1;
\r
93 compressVec.add(isCompressed?true:false);
\r
94 int bitmask = 0x00FF;
\r
95 while ((len = gzipInputStream.read(buf)) > 0) {
\r
96 //out.write(buf, 0, len);
\r
97 for(int j = 0; j < len; ) {
\r
98 // read out 2 bytes at a time
\r
99 byte[] towrite = new byte[writenum];
\r
100 for(int k = 0; k<writenum&&j<len; k++) {
\r
101 if('#' == buf[j]) {
\r
102 // skip the comments
\r
103 while(j<len && buf[j++] != '\n') {
\r
106 towrite[k] = buf[j];
\r
110 int writevalue = towrite[0];
\r
112 // compress two value into one for compressed version
\r
113 if(!encodemapping.containsKey(towrite[0])) {
\r
114 encodemapping.put(towrite[0], encodenum++);
\r
115 encodeVec.add(towrite[0]);
\r
117 writevalue = encodemapping.get(towrite[0]);
\r
118 if(!encodemapping.containsKey(towrite[1])) {
\r
119 encodemapping.put(towrite[1], encodenum++);
\r
120 encodeVec.add(towrite[1]);
\r
122 if(encodeVec.size()>=16) {
\r
123 System.err.println("Error! The compressed file has more than 16 types of characters! It can not be compressed!");
\r
126 writevalue = ((writevalue<<4)|encodemapping.get(towrite[1]))&bitmask;
\r
135 printReturn = false;
\r
137 if(!isCompressed && ('\n' == writevalue)) {
\r
138 out.print("\'\\n\'");
\r
139 printReturn = true;
\r
141 out.print(writevalue);
\r
144 if(returncount==0) {
\r
154 gzipInputStream.close();
\r
156 // print out the decoding array
\r
157 String decodename = arrayname.concat("_decodeTbl");
\r
158 out.println("unsigned char " + decodename + "[] = {");
\r
159 printComma = false;
\r
160 for(int j = 0; j < encodeVec.size(); j++) {
\r
161 byte b = encodeVec.elementAt(j).byteValue();
\r
168 out.print("\'\\n\'");
\r
169 printReturn = true;
\r
180 out.println("unsigned char * inputFileArrays[]= {");
\r
181 for(int i = 0; i < sourcefiles.size(); i++) {
\r
182 String arrayname = sourcefiles.elementAt(i).replaceAll("\\.", "_");
\r
187 out.print("&"+arrayname+"[0]");
\r
193 out.println("unsigned char * inputFileArrays_decodeTbl[]= {");
\r
194 for(int i = 0; i < sourcefiles.size(); i++) {
\r
195 String arrayname = sourcefiles.elementAt(i).replaceAll("\\.", "_");
\r
200 if(compressVec.elementAt(i).booleanValue()) {
\r
201 out.print("&"+arrayname.concat("_decodeTbl")+"[0]");
\r
210 //Create the read functions
\r
211 out.println("int filename2fd(char * filename, int length) {");
\r
212 for(int i=0; i<sourcefiles.size(); i++) {
\r
213 String inFilename = sourcefiles.elementAt(i);
\r
214 String arrayname = inFilename.replaceAll("\\.", "_");
\r
215 out.print(" char " + arrayname + "[] = {");
\r
216 for(int j = 0; j < inFilename.length(); j++) {
\r
220 out.print("'"+inFilename.charAt(j)+"'");
\r
223 out.println(" if(length==" + inFilename.length() + ") {");
\r
224 out.println(" int i;");
\r
225 out.println(" for(i = 0; i < length; i++) {");
\r
226 out.println(" if(filename[i]!="+arrayname+"[i]) {");
\r
227 out.println(" break;");
\r
230 out.println(" if(i==length) {");
\r
231 out.println(" return "+arrayname.toUpperCase() + ";");
\r
236 out.println(" return -1;");
\r
240 out.println("unsigned char nextValue='\\0';");
\r
241 out.println("bool holdVal=false;");
\r
244 out.println("void initVal() {");
\r
245 out.println(" nextValue='\\0';");
\r
246 out.println(" holdVal=false;");
\r
250 out.println("unsigned char peek(unsigned char * filearray, unsigned char * decodearray, int * pos, int * isHighbits, bool isCompressed) {");
\r
251 out.println(" if(!isCompressed) {");
\r
252 out.println(" return filearray[*pos];");
\r
253 out.println(" } else {");
\r
254 out.println(" unsigned char value=0;");
\r
255 out.println(" if(!holdVal) {");
\r
256 out.println(" nextValue=filearray[*pos];");
\r
258 out.println(" if(1==*isHighbits) {");
\r
259 out.println(" value=((nextValue&0x00F0)>>4)&0x000F;");
\r
260 out.println(" holdVal=true;");
\r
261 out.println(" } else {");
\r
262 out.println(" value=nextValue&0x000F;");
\r
263 out.println(" holdVal=false;");
\r
265 out.println(" value=decodearray[value];");
\r
266 out.println(" return value;");
\r
271 out.println("void next(int * pos, int * isHighbits, bool isCompressed) {");
\r
272 out.println(" if(!isCompressed||!holdVal) {");
\r
273 out.println(" *pos = *pos+1;");
\r
275 out.println(" if(isCompressed) {");
\r
276 out.println(" if(*isHighbits) {");
\r
277 out.println(" *isHighbits=0;");
\r
278 out.println(" } else {");
\r
279 out.println(" *isHighbits=1;");
\r
285 out.println("int nextInt(int fd, int * pos, int * isHighbits) {");
\r
286 out.println(" int i = 0;");
\r
287 out.println(" unsigned char * filearray = inputFileArrays[fd];");
\r
288 out.println(" unsigned char * decodearray = inputFileArrays_decodeTbl[fd];");
\r
289 out.println(" bool isCompressed = false;");
\r
290 out.println(" if(decodearray!=0) {");
\r
291 out.println(" isCompressed = true;");
\r
293 out.println(" initVal();");
\r
295 out.println(" unsigned char b='\\0';");
\r
296 out.println(" while(true) {");
\r
297 out.println(" b=peek(filearray, decodearray, pos, isHighbits, isCompressed); ");
\r
298 out.println(" if((b==' ')||(b=='\\n')){");
\r
299 out.println(" next(pos, isHighbits, isCompressed);");
\r
300 out.println(" } else {");
\r
301 out.println(" break;");
\r
305 out.println(" unsigned int value = 0;");
\r
306 out.println(" bool isNeg=false;");
\r
307 out.println(" unsigned int radix = 10;");
\r
309 out.println(" if (b=='-') {");
\r
310 out.println(" isNeg=true;");
\r
311 out.println(" next(pos, isHighbits, isCompressed);");
\r
313 out.println(" bool cont=true;");
\r
314 out.println(" do {");
\r
315 out.println(" b=peek(filearray, decodearray, pos, isHighbits, isCompressed); ");
\r
316 out.println(" unsigned int val=0;");
\r
317 out.println(" if (b>='0'&&b<='9')");
\r
318 out.println(" val=b-'0';");
\r
319 out.println(" else if (b>='a'&&b<='z')");
\r
320 out.println(" val=10+b-'a';");
\r
321 out.println(" else if (b>='A'&&b<='Z')");
\r
322 out.println(" val=10+b-'A';");
\r
323 out.println(" else {");
\r
324 out.println(" cont=false;");
\r
326 out.println(" if (cont) {");
\r
327 out.println(" if (val>=radix)");
\r
328 out.println(" printf(\"Error in nextInt(): val >= radix\");");
\r
329 out.println(" value=value*radix+val;");
\r
330 out.println(" next(pos, isHighbits, isCompressed);");
\r
332 out.println(" }while(cont);");
\r
333 out.println(" if (isNeg)");
\r
334 out.println(" value=-value;");
\r
336 out.println(" return value;");
\r
340 out.println("double nextDouble(int fd, int * pos, int * isHighbits) {");
\r
341 out.println(" int i = 0;");
\r
342 out.println(" unsigned char * filearray = inputFileArrays[fd];");
\r
343 out.println(" unsigned char * decodearray = inputFileArrays_decodeTbl[fd];");
\r
344 out.println(" bool isCompressed = false;");
\r
345 out.println(" if(decodearray!=0) {");
\r
346 out.println(" isCompressed = true;");
\r
348 out.println(" initVal();");
\r
350 out.println(" unsigned char b='\\0';");
\r
351 out.println(" while(true) {");
\r
352 out.println(" b=peek(filearray, decodearray, pos, isHighbits, isCompressed); ");
\r
353 out.println(" if((b==' ')||(b=='\\n')){");
\r
354 out.println(" next(pos, isHighbits, isCompressed);");
\r
355 out.println(" } else {");
\r
356 out.println(" break;");
\r
360 out.println(" double result=0.0;");
\r
361 out.println(" unsigned int value=0;");
\r
362 out.println(" unsigned int maxvalue=((unsigned int)(1<<32)-1)/10;");
\r
363 out.println(" bool isNeg=false;");
\r
364 out.println(" bool isDiv=false;");
\r
365 out.println(" unsigned int radix = 10;");
\r
367 out.println(" if (b=='-') {");
\r
368 out.println(" isNeg=true;");
\r
369 out.println(" next(pos, isHighbits, isCompressed);");
\r
371 out.println(" bool cont=true;");
\r
372 out.println(" bool exp=false;");
\r
373 out.println(" bool decimal=false;");
\r
374 out.println(" bool compute=true;");
\r
375 out.println(" bool omit=false;");
\r
376 out.println(" unsigned int dcount=0;");
\r
377 out.println(" // compute the base");
\r
378 out.println(" do {");
\r
379 out.println(" b=peek(filearray, decodearray, pos, isHighbits, isCompressed); ");
\r
380 out.println(" unsigned int val=0;");
\r
381 out.println(" if (b>='0'&&b<='9') {");
\r
382 out.println(" if (!omit) {");
\r
383 out.println(" val=b-'0';");
\r
384 out.println(" if(decimal) {");
\r
385 out.println(" dcount++;");
\r
388 out.println(" } else if (b=='.') {");
\r
389 out.println(" decimal=true;");
\r
390 out.println(" compute=false;");
\r
391 out.println(" } else if (b=='E'||b=='e') {");
\r
392 out.println(" exp=true;");
\r
393 out.println(" cont=false;");
\r
394 out.println(" next(pos, isHighbits, isCompressed);");
\r
395 out.println(" } else {");
\r
396 out.println(" cont=false;");
\r
398 out.println(" if (cont) {");
\r
399 out.println(" if (val>=radix)");
\r
400 out.println(" printf(\"Error in nextDouble(): val >= radix\");");
\r
401 out.println(" if(compute) {");
\r
402 out.println(" if(value<maxvalue) {");
\r
403 out.println(" value=value*radix+val;");
\r
404 out.println(" } else {");
\r
405 out.println(" omit=true;");
\r
406 out.println(" compute=false;");
\r
407 out.println(" dcount--;");
\r
409 out.println(" } else if(!omit) {");
\r
410 out.println(" compute=true;");
\r
412 out.println(" next(pos, isHighbits, isCompressed);");
\r
414 out.println(" }while(cont);");
\r
415 out.println(" if(exp) {");
\r
416 out.println(" // compute the power index");
\r
417 out.println(" cont=true;");
\r
418 out.println(" unsigned int n=0;");
\r
419 out.println(" b=peek(filearray, decodearray, pos, isHighbits, isCompressed); ");
\r
420 out.println(" if (b=='-') {");
\r
421 out.println(" isDiv=true;");
\r
422 out.println(" next(pos, isHighbits, isCompressed);");
\r
423 out.println(" } else if (b=='+') {");
\r
424 out.println(" next(pos, isHighbits, isCompressed);");
\r
426 out.println(" do {");
\r
427 out.println(" b=peek(filearray, decodearray, pos, isHighbits, isCompressed); ");
\r
428 out.println(" unsigned int val;");
\r
429 out.println(" if (b>='0'&&b<='9') {");
\r
430 out.println(" val=b-'0';");
\r
431 out.println(" } else {");
\r
432 out.println(" cont=false;");
\r
434 out.println(" if (cont) {");
\r
435 out.println(" if (val>=radix)");
\r
436 out.println(" printf(\"Error in nextDouble(): val >= radix\");");
\r
437 out.println(" n=n*10+val;");
\r
438 out.println(" next(pos, isHighbits, isCompressed);");
\r
440 out.println(" }while(cont);");
\r
441 out.println(" if(isDiv) {");
\r
442 out.println(" result = (double)value/pow(radix, n+dcount);");
\r
443 out.println(" } else {");
\r
444 out.println(" if(n>dcount) {");
\r
445 out.println(" result = (double)value*pow(radix, n-dcount);");
\r
446 out.println(" } else if(n<dcount) {");
\r
447 out.println(" result = (double)value/pow(radix, dcount-n);");
\r
448 out.println(" } else {");
\r
449 out.println(" result = (double)value;");
\r
452 out.println(" } else {");
\r
453 out.println(" result = (double)value/pow(radix, dcount);");
\r
455 out.println(" if (isNeg)");
\r
456 out.println(" result=-result;");
\r
458 out.println("return result;");
\r
462 System.out.println("The file and stream is ......closing.......... : closed");
\r
466 catch(IOException e){
\r
467 System.out.println("Exception has been thrown" + e);
\r