19b2196f739738c8663f12a93cf258209b755aaf
[IRC.git] / Robust / src / Util / InputFileTranslator.java
1 package Util;\r
2 \r
3 import java.util.Hashtable;\r
4 import java.util.Vector;\r
5 import java.util.zip.GZIPInputStream;\r
6 import java.io.File;\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
11 \r
12 public class InputFileTranslator{\r
13     public static String PREFIX="";\r
14     \r
15     public static void main(String args[]){\r
16         try{\r
17             //To Uncompress GZip File Contents we need to open the gzip file.....\r
18             if(args.length<=0){\r
19                 System.out.println("Please enter the valid file name");\r
20             }else{\r
21                 int offset = 0;\r
22                 boolean isCompressed = false;\r
23                 \r
24                 if (args[offset].equals("-dir")) {\r
25                     PREFIX=args[++offset]+"/";\r
26                     offset++;\r
27                 } \r
28                 if(args[offset].equals("-compress")) {\r
29                     isCompressed = true;\r
30                     offset++;\r
31                 }\r
32                 \r
33 \r
34                 System.out.println("Opening the output file............. : opened");\r
35                 \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
41                 out.println();\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
47                 out.println();\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
52                 out.close();\r
53                 \r
54                 //Create the .c file that contains the big two-dimension array and \r
55                 //read functions\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
60                 out.println();\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
65                 int encodenum = 1;\r
66                 int returncount = 10;\r
67                 for(int i=0; i<args.length-offset; i++)  {\r
68                     if(isCompressed) {\r
69                         encodemapping.clear();\r
70                         encodeVec.clear();\r
71                         encodenum = 1;\r
72                         encodemapping.put((byte)0, 0);\r
73                         encodeVec.add((byte)0);\r
74                     }\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
85                     \r
86                     out.println("unsigned char " + arrayname + "[] = {");\r
87 \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
91                     int len;\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
104                                     }\r
105                                 } else {\r
106                                     towrite[k] = buf[j];\r
107                                 }\r
108                                 j++;\r
109                             }\r
110                             int writevalue = towrite[0];\r
111                             if(isCompressed) {\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
116                                 }\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
121                                 }\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
124                                     System.exit(-1);\r
125                                 }\r
126                                 writevalue = ((writevalue<<4)|encodemapping.get(towrite[1]))&bitmask;\r
127                             }\r
128                             if(!printComma) {\r
129                                 printComma = true;\r
130                             } else {\r
131                                 out.print(',');\r
132                             }\r
133                             if(printReturn) {\r
134                                 out.println();\r
135                                 printReturn = false;\r
136                             }\r
137                             if(!isCompressed && ('\n' == writevalue)) {\r
138                                 out.print("\'\\n\'");\r
139                                 printReturn = true;\r
140                             } else {\r
141                                 out.print(writevalue);\r
142                                 if(isCompressed) {\r
143                                     returncount--;\r
144                                     if(returncount==0) {\r
145                                         printReturn=true;\r
146                                         returncount = 10;\r
147                                     }\r
148                                 }\r
149                             }\r
150                         }\r
151                     }\r
152                     out.println("};");\r
153                     out.println();\r
154                     gzipInputStream.close();\r
155                     if(isCompressed) {\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
162                             if(!printComma) {\r
163                                 printComma = true;\r
164                             } else {\r
165                                 out.print(',');\r
166                             }\r
167                             if('\n' == b) {\r
168                                 out.print("\'\\n\'");\r
169                                 printReturn = true;\r
170                             } else {\r
171                                 out.print(b);\r
172                             }\r
173                         }\r
174                         out.println("};");\r
175                         out.println();\r
176                     }\r
177                 }\r
178                 \r
179                 out.println();\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
183                     \r
184                     if(i > 0) {\r
185                         out.println(',');\r
186                     }\r
187                     out.print("&"+arrayname+"[0]");\r
188                 }\r
189                 out.println();\r
190                 out.println("};");\r
191                 out.println();\r
192                 \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
196                     \r
197                     if(i > 0) {\r
198                         out.println(',');\r
199                     }\r
200                     if(compressVec.elementAt(i).booleanValue()) {\r
201                         out.print("&"+arrayname.concat("_decodeTbl")+"[0]");\r
202                     } else {\r
203                         out.print("0");\r
204                     }\r
205                 }\r
206                 out.println();\r
207                 out.println("};");\r
208                 out.println();\r
209                 \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
217                         if(j>0) {\r
218                             out.print(",");\r
219                         }\r
220                         out.print("'"+inFilename.charAt(j)+"'");\r
221                     }\r
222                     out.println("};");\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
228                     out.println("      }");\r
229                     out.println("    }");\r
230                     out.println("    if(i==length) {");\r
231                     out.println("      return "+arrayname.toUpperCase() + ";");\r
232                     out.println("    }");\r
233                     out.println("  }");\r
234                     out.println();\r
235                 }\r
236                 out.println("  return -1;");\r
237                 out.println("}");\r
238                 out.println();\r
239                 \r
240                 out.println("unsigned char nextValue='\\0';");\r
241                 out.println("bool holdVal=false;");\r
242                 out.println();\r
243 \r
244                 out.println("void initVal() {");\r
245                 out.println("  nextValue='\\0';");\r
246                 out.println("  holdVal=false;");\r
247                 out.println("}");\r
248                 out.println();\r
249 \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
257                 out.println("    }");\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
264                 out.println("    }");\r
265                 out.println("    value=decodearray[value];");\r
266                 out.println("    return value;");\r
267                 out.println("  }");\r
268                 out.println("}");\r
269                 out.println();\r
270 \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
274                 out.println("  }");\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
280                 out.println("    }");\r
281                 out.println("  }");\r
282                 out.println("}");\r
283                 out.println();\r
284                 \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
292                 out.println("  }");\r
293                 out.println("  initVal();");\r
294                 out.println();\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
302                 out.println("    }");\r
303                 out.println("  }");\r
304                 out.println();\r
305                 out.println("  unsigned int value = 0;");\r
306                 out.println("  bool isNeg=false;");\r
307                 out.println("  unsigned int radix = 10;");\r
308                 out.println();\r
309                 out.println("  if (b=='-') {");\r
310                 out.println("    isNeg=true;");\r
311                 out.println("    next(pos, isHighbits, isCompressed);");\r
312                 out.println("  }");\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
325                 out.println("    }");\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
331                 out.println("    }");\r
332                 out.println("  }while(cont);");\r
333                 out.println("  if (isNeg)");\r
334                 out.println("   value=-value;");\r
335                 out.println();\r
336                 out.println("  return value;");\r
337                 out.println("}");\r
338                 out.println();\r
339                 \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
347                 out.println("  }");\r
348                 out.println("  initVal();");\r
349                 out.println();\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
357                 out.println("    }");\r
358                 out.println("  }");\r
359                 out.println();\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
366                 out.println();\r
367                 out.println("  if (b=='-') {");\r
368                 out.println("    isNeg=true;");\r
369                 out.println("    next(pos, isHighbits, isCompressed);");\r
370                 out.println("  }");\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
386                 out.println("        }");\r
387                 out.println("      }");\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
397                 out.println("    }");\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
408                 out.println("        }");\r
409                 out.println("      } else if(!omit) {");\r
410                 out.println("        compute=true;");\r
411                 out.println("      }");\r
412                 out.println("      next(pos, isHighbits, isCompressed);");\r
413                 out.println("    }");\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
425                 out.println("    }");\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
433                 out.println("      }");\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
439                 out.println("      }");\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
450                 out.println("      }");\r
451                 out.println("    }");\r
452                 out.println("  } else {");\r
453                 out.println("    result = (double)value/pow(radix, dcount);");\r
454                 out.println("  }");\r
455                 out.println("  if (isNeg)");\r
456                 out.println("    result=-result;");\r
457                 out.println();\r
458                 out.println("return result;");\r
459                 out.println("  }");\r
460                 out.println();\r
461 \r
462                 System.out.println("The file and stream is ......closing.......... : closed");\r
463                 out.close();\r
464             }\r
465         }\r
466         catch(IOException e){\r
467             System.out.println("Exception has been thrown" + e);\r
468         }\r
469     }\r
470 }\r