c4a7d19c95c6a9d02d276573f44efe84ada7dffa
[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                 if (args[offset].equals("-dir")) {\r
23                     PREFIX=args[++offset]+"/";\r
24                     offset++;\r
25                 }\r
26                 boolean isCompressed = true;\r
27 \r
28                 System.out.println("Opening the output file............. : opened");\r
29                 \r
30                 //Create the .h file \r
31                 String outFilename = PREFIX+"InputFileArrays.h";\r
32                 PrintWriter out = new PrintWriter(new FileWriter(new File(outFilename)));\r
33                 out.println("#ifndef INPUT_FILE_ARRAYS_H");\r
34                 out.println("#define INPUT_FILE_ARRAYS_H");\r
35                 out.println();\r
36                 out.println("#ifndef bool");\r
37                 out.println("typedef int bool;");\r
38                 out.println("#define true 1");\r
39                 out.println("#define false 0");\r
40                 out.println("#endif");\r
41                 out.println();\r
42                 out.println("int filename2fd(char * filename, int length);");\r
43                 out.println("int nextInt(int fd, int * pos, int * isHighbits);");\r
44                 out.println("double nextDouble(int fd, int * pos, int * isHighbits);");\r
45                 out.println("#endif");\r
46                 out.close();\r
47                 \r
48                 //Create the .c file that contains the big two-dimension array and \r
49                 //read functions\r
50                 outFilename = PREFIX+"InputFileArrays.c";\r
51                 out = new PrintWriter(new FileWriter(new File(outFilename)));\r
52                 out.println("#include \"InputFileArrays.h\"");\r
53                 out.println("#include \"math.h\"");\r
54                 out.println();\r
55                 Vector<String> sourcefiles=new Vector<String>();\r
56                 Vector<Boolean> compressVec = new Vector<Boolean>();\r
57                 Hashtable<Byte, Integer> encodemapping = new Hashtable<Byte, Integer>();\r
58                 Vector<Byte> encodeVec = new Vector<Byte>();\r
59                 int encodenum = 1;\r
60                 int returncount = 10;\r
61                 for(int i=0; i<args.length-offset; i++)  {\r
62                     if(isCompressed) {\r
63                         encodemapping.clear();\r
64                         encodeVec.clear();\r
65                         encodenum = 0;\r
66                         encodemapping.put((byte)0, 0);\r
67                         encodeVec.add((byte)0);\r
68                     }\r
69                     String inFilename = args[i+offset];\r
70                     String arrayname = inFilename.replaceAll("\\.", "_");\r
71                     sourcefiles.add(inFilename);\r
72                     out.println("#define " + arrayname.toUpperCase() + " " + i);\r
73                     System.out.println("Opening the gzip file.......................... :  opened");\r
74                     GZIPInputStream gzipInputStream = null;\r
75                     FileInputStream fileInputStream = null;\r
76                     gzipInputStream = new GZIPInputStream(new FileInputStream(inFilename));\r
77                     //OutputStream out = new FileOutputStream(outFilename);\r
78                     System.out.println("Trsansferring bytes from the compressed file to the output file........:  Transfer successful");\r
79                     \r
80                     out.println("unsigned char " + arrayname + "[] = {");\r
81 \r
82                     boolean printComma = false;\r
83                     boolean printReturn = false;\r
84                     byte[] buf = new byte[1024];  //size can be changed according to programmer's need.\r
85                     int len;\r
86                     int writenum = isCompressed?2:1;\r
87                     compressVec.add(isCompressed?true:false);\r
88                     int bitmask = 0x00FF;\r
89                     while ((len = gzipInputStream.read(buf)) > 0) {\r
90                         //out.write(buf, 0, len);\r
91                         for(int j = 0; j < len; ) {\r
92                             // read out 2 bytes at a time\r
93                             byte[] towrite = new byte[writenum];\r
94                             for(int k = 0; k<writenum&&j<len; k++) {\r
95                                 if('#' == buf[j]) {\r
96                                     // skip the comments\r
97                                     while(j<len && buf[j++] != '\n') {\r
98                                     }\r
99                                 } else {\r
100                                     towrite[k] = buf[j];\r
101                                 }\r
102                                 j++;\r
103                             }\r
104                             int writevalue = towrite[0];\r
105                             if(isCompressed) {\r
106                                 // compress two value into one for compressed version\r
107                                 if(!encodemapping.containsKey(towrite[0])) {\r
108                                     encodemapping.put(towrite[0], encodenum++);\r
109                                     encodeVec.add(towrite[0]);\r
110                                 }\r
111                                 writevalue = encodemapping.get(towrite[0]);\r
112                                 if(!encodemapping.containsKey(towrite[1])) {\r
113                                     encodemapping.put(towrite[1], encodenum++);\r
114                                     encodeVec.add(towrite[1]);\r
115                                 }\r
116                                 if(encodeVec.size()>=16) {\r
117                                     System.err.println("Error! The compressed file has more than 16 types of characters! It can not be compressed!");\r
118                                     System.exit(-1);\r
119                                 }\r
120                                 writevalue = ((writevalue<<4)|encodemapping.get(towrite[1]))&bitmask;\r
121                             }\r
122                             if(!printComma) {\r
123                                 printComma = true;\r
124                             } else {\r
125                                 out.print(',');\r
126                             }\r
127                             if(printReturn) {\r
128                                 out.println();\r
129                                 printReturn = false;\r
130                             }\r
131                             if(!isCompressed && ('\n' == buf[j])) {\r
132                                 out.print("\'\\n\'");\r
133                                 printReturn = true;\r
134                             } else {\r
135                                 out.print(writevalue);\r
136                                 if(isCompressed) {\r
137                                     returncount--;\r
138                                     if(returncount==0) {\r
139                                         printReturn=true;\r
140                                         returncount = 10;\r
141                                     }\r
142                                 }\r
143                             }\r
144                         }\r
145                     }\r
146                     out.println("};");\r
147                     out.println();\r
148                     gzipInputStream.close();\r
149                     if(isCompressed) {\r
150                         // print out the decoding array\r
151                         String decodename = arrayname.concat("_decodeTbl");\r
152                         out.println("unsigned char " + decodename + "[] = {");\r
153                         printComma = false;\r
154                         for(int j = 0; j < encodeVec.size(); j++) {\r
155                             byte b = encodeVec.elementAt(j).byteValue();\r
156                             if(!printComma) {\r
157                                 printComma = true;\r
158                             } else {\r
159                                 out.print(',');\r
160                             }\r
161                             if('\n' == b) {\r
162                                 out.print("\'\\n\'");\r
163                                 printReturn = true;\r
164                             } else {\r
165                                 out.print(b);\r
166                             }\r
167                         }\r
168                         out.println("};");\r
169                         out.println();\r
170                     }\r
171                 }\r
172                 \r
173                 out.println();\r
174                 out.println("unsigned char * inputFileArrays[]= {");\r
175                 for(int i = 0; i < sourcefiles.size(); i++) {\r
176                     String arrayname = sourcefiles.elementAt(i).replaceAll("\\.", "_");\r
177                     \r
178                     if(i > 0) {\r
179                         out.println(',');\r
180                     }\r
181                     out.print("&"+arrayname+"[0]");\r
182                 }\r
183                 out.println();\r
184                 out.println("};");\r
185                 out.println();\r
186                 \r
187                 out.println("unsigned char * inputFileArrays_decodeTbl[]= {");\r
188                 for(int i = 0; i < sourcefiles.size(); i++) {\r
189                     String arrayname = sourcefiles.elementAt(i).replaceAll("\\.", "_");\r
190                     \r
191                     if(i > 0) {\r
192                         out.println(',');\r
193                     }\r
194                     if(compressVec.elementAt(i).booleanValue()) {\r
195                         out.print("&"+arrayname.concat("_decodeTbl")+"[0]");\r
196                     } else {\r
197                         out.print("0");\r
198                     }\r
199                 }\r
200                 out.println();\r
201                 out.println("};");\r
202                 out.println();\r
203                 \r
204                 //Create the read functions\r
205                 out.println("int filename2fd(char * filename, int length) {");\r
206                 for(int i=0; i<sourcefiles.size(); i++)  {\r
207                     String inFilename = sourcefiles.elementAt(i);\r
208                     String arrayname = inFilename.replaceAll("\\.", "_");\r
209                     out.print("  char " + arrayname + "[] = {");\r
210                     for(int j = 0; j < inFilename.length(); j++) {\r
211                         if(j>0) {\r
212                             out.print(",");\r
213                         }\r
214                         out.print("'"+inFilename.charAt(j)+"'");\r
215                     }\r
216                     out.println("};");\r
217                     out.println("  if(length==" + inFilename.length() + ") {");\r
218                     out.println("    int i;");\r
219                     out.println("    for(i = 0; i < length; i++) {");\r
220                     out.println("      if(filename[i]!="+arrayname+"[i]) {");\r
221                     out.println("        break;");\r
222                     out.println("      }");\r
223                     out.println("    }");\r
224                     out.println("    if(i==length) {");\r
225                     out.println("      return "+arrayname.toUpperCase() + ";");\r
226                     out.println("    }");\r
227                     out.println("  }");\r
228                     out.println();\r
229                 }\r
230                 out.println("  return -1;");\r
231                 out.println("}");\r
232                 out.println();\r
233                 \r
234                 out.println("unsigned char nextValue='\\0';");\r
235                 out.println("bool holdVal=false;");\r
236                 out.println();\r
237 \r
238                 out.println("void initVal() {");\r
239                 out.println("  nextValue='\\0';");\r
240                 out.println("  holdVal=false;");\r
241                 out.println("}");\r
242                 out.println();\r
243 \r
244                 out.println("unsigned char peek(unsigned char * filearray, int * pos, int * isHighbits, bool isCompressed) {");\r
245                 out.println("  if(!isCompressed) {");\r
246                 out.println("    return filearray[*pos];");\r
247                 out.println("  } else {");\r
248                 out.println("    unsigned char value=0;");\r
249                 out.println("    if(!holdVal) {");\r
250                 out.println("      nextValue=filearray[*pos];");\r
251                 out.println("    }");\r
252                 out.println("    if(1==*isHighbits) {");\r
253                 out.println("      value=((nextValue&0x00F0)>>4)&0x000F;");\r
254                 out.println("      holdVal=true;");\r
255                 out.println("      *isHighbits=0;");\r
256                 out.println("    } else {");\r
257                 out.println("      value=nextValue&0x000F;");\r
258                 out.println("      holdVal=false;");\r
259                 out.println("      *isHighbits=1;");\r
260                 out.println("    }");\r
261                 out.println("    return value;");\r
262                 out.println("  }");\r
263                 out.println("}");\r
264                 out.println();\r
265 \r
266                 out.println("void next(int * pos, bool isCompressed) {");\r
267                 out.println("  if(!isCompressed||!holdVal) {");\r
268                 out.println("    *pos = *pos+1;");\r
269                 out.println(" }");\r
270                 out.println("}");\r
271                 out.println();\r
272                 \r
273                 out.println("int nextInt(int fd, int * pos, int * isHighbits) {");\r
274                 out.println("  int i = 0;");\r
275                 out.println("  unsigned char * filearray = inputFileArrays[fd];");\r
276                 out.println("  bool isCompressed = false;");\r
277                 out.println("  if(inputFileArrays_decodeTbl[fd]!=0) {");\r
278                 out.println("   isCompressed = true;");\r
279                 out.println("  }");\r
280                 out.println("  initVal();");\r
281                 out.println();\r
282                 out.println("  unsigned char b='\\0';");\r
283                 out.println("  while(true) {");\r
284                 out.println("    b=peek(filearray, pos, isHighbits, isCompressed); ");\r
285                 out.println("    if((b==' ')||(b=='\\n')){");\r
286                 out.println("      next(pos, isCompressed);");\r
287                 out.println("    } else {");\r
288                 out.println("      break;");\r
289                 out.println("    }");\r
290                 out.println("  }");\r
291                 out.println();\r
292                 out.println("  unsigned int value = 0;");\r
293                 out.println("  bool isNeg=false;");\r
294                 out.println("  unsigned int radix = 10;");\r
295                 out.println();\r
296                 out.println("  if (b=='-') {");\r
297                 out.println("    isNeg=true;");\r
298                 out.println("    next(pos, isCompressed);");\r
299                 out.println("    b=peek(filearray, pos, isHighbits, isCompressed);");\r
300                 out.println("  }");\r
301                 out.println("  bool cont=true;");\r
302                 out.println("  do {");\r
303                 out.println("    unsigned int val;");\r
304                 out.println("    if (b>='0'&&b<='9')");\r
305                 out.println("      val=b-'0';");\r
306                 out.println("    else if (b>='a'&&b<='z')");\r
307                 out.println("      val=10+b-'a';");\r
308                 out.println("    else if (b>='A'&&b<='Z')");\r
309                 out.println("      val=10+b-'A';");\r
310                 out.println("    else {");\r
311                 out.println("      cont=false;");\r
312                 out.println("    }");\r
313                 out.println("    if (cont) {");\r
314                 out.println("      if (val>=radix)");\r
315                 out.println("        printf(\"Error in nextInt(): val >= radix\");");\r
316                 out.println("      value=value*radix+val;");\r
317                 out.println("      next(pos, isCompressed);");\r
318                 out.println("      b=peek(filearray, pos, isHighbits, isCompressed);");\r
319                 out.println("    }");\r
320                 out.println("  }while(cont);");\r
321                 out.println("  if (isNeg)");\r
322                 out.println("   value=-value;");\r
323                 out.println();\r
324                 out.println("  return value;");\r
325                 out.println("}");\r
326                 out.println();\r
327                 \r
328                 out.println("double nextDouble(int fd, int * pos, int * isHighbits) {");\r
329                 out.println("  int i = 0;");\r
330                 out.println("  unsigned char * filearray = inputFileArrays[fd];");\r
331                 out.println("  bool isCompressed = false;");\r
332                 out.println("  if(inputFileArrays_decodeTbl[fd]!=0) {");\r
333                 out.println("   isCompressed = true;");\r
334                 out.println("  }");\r
335                 out.println("  initVal();");\r
336                 out.println();\r
337                 out.println("  unsigned char b='\\0';");\r
338                 out.println("  while(true) {");\r
339                 out.println("    b=peek(filearray, pos, isHighbits, isCompressed); ");\r
340                 out.println("    if((b==' ')||(b=='\\n')){");\r
341                 out.println("      next(pos, isCompressed);");\r
342                 out.println("    } else {");\r
343                 out.println("      break;");\r
344                 out.println("    }");\r
345                 out.println("  }");\r
346                 out.println();\r
347                 out.println("  double result=0.0;");\r
348                 out.println("  unsigned int value=0;");\r
349                 out.println("  unsigned int maxvalue=((unsigned int)(1<<32)-1)/10;");\r
350                 out.println("  bool isNeg=false;");\r
351                 out.println("  bool isDiv=false;");\r
352                 out.println("  unsigned int radix = 10;");\r
353                 out.println();\r
354                 out.println("  if (b=='-') {");\r
355                 out.println("    isNeg=true;");\r
356                 out.println("    next(pos, isCompressed);");\r
357                 out.println("    b=peek(filearray, pos, isHighbits, isCompressed); ");\r
358                 out.println("  }");\r
359                 out.println("  bool cont=true;");\r
360                 out.println("  bool exp=false;");\r
361                 out.println("  bool decimal=false;");\r
362                 out.println("  bool compute=true;");\r
363                 out.println("  bool omit=false;");\r
364                 out.println("  unsigned int dcount=0;");\r
365                 out.println("  // compute the base");\r
366                 out.println("  do {");\r
367                 out.println("    unsigned int val;");\r
368                 out.println("    if (b>='0'&&b<='9') {");\r
369                 out.println("      if (!omit) {");\r
370                 out.println("        val=b-'0';");\r
371                 out.println("        if(decimal) {");\r
372                 out.println("          dcount++;");\r
373                 out.println("        }");\r
374                 out.println("      }");\r
375                 out.println("    } else if (b=='.') {");\r
376                 out.println("      decimal=true;");\r
377                 out.println("      compute=false;");\r
378                 out.println("    } else if (b=='E'||b=='e') {");\r
379                 out.println("      exp=true;");\r
380                 out.println("      cont=false;");\r
381                 out.println("      next(pos, isCompressed);");\r
382                 out.println("    } else {");\r
383                 out.println("      cont=false;");\r
384                 out.println("    }");\r
385                 out.println("    if (cont) {");\r
386                 out.println("      if (val>=radix)");\r
387                 out.println("        printf(\"Error in nextDouble(): val >= radix\");");\r
388                 out.println("      if(compute) {");\r
389                 out.println("        if(value<maxvalue) {");\r
390                 out.println("          value=value*radix+val;");\r
391                 out.println("        } else {");\r
392                 out.println("          omit=true;");\r
393                 out.println("          compute=false;");\r
394                 out.println("          dcount--;");\r
395                 out.println("        }");\r
396                 out.println("      } else if(!omit) {");\r
397                 out.println("        compute=true;");\r
398                 out.println("      }");\r
399                 out.println("      next(pos, isCompressed);");\r
400                 out.println("      b=peek(filearray, pos, isHighbits, isCompressed); ");\r
401                 out.println("    }");\r
402                 out.println("  }while(cont);");\r
403                 out.println("  if(exp) {");\r
404                 out.println("    // compute the power index");\r
405                 out.println("    cont=true;");\r
406                 out.println("    unsigned int n=0;");\r
407                 out.println("    b=peek(filearray, pos, isHighbits, isCompressed); ");\r
408                 out.println("    if (b=='-') {");\r
409                 out.println("      isDiv=true;");\r
410                 out.println("      next(pos, isCompressed);");\r
411                 out.println("    } else if (b=='+') {");\r
412                 out.println("      next(pos, isCompressed);");\r
413                 out.println("      b=peek(filearray, pos, isHighbits, isCompressed); ");\r
414                 out.println("    }");\r
415                 out.println("    do {");\r
416                 out.println("      unsigned int val;");\r
417                 out.println("      if (b>='0'&&b<='9') {");\r
418                 out.println("        val=b-'0';");\r
419                 out.println("      } else {");\r
420                 out.println("        cont=false;");\r
421                 out.println("      }");\r
422                 out.println("      if (cont) {");\r
423                 out.println("        if (val>=radix)");\r
424                 out.println("          printf(\"Error in nextDouble(): val >= radix\");");\r
425                 out.println("        n=n*10+val;");\r
426                 out.println("        next(pos, isCompressed);");\r
427                 out.println("        b=peek(filearray, pos, isHighbits, isCompressed); ");\r
428                 out.println("      }");\r
429                 out.println("    }while(cont);");\r
430                 out.println("    if(isDiv) {");\r
431                 out.println("      result = (double)value/pow(radix, n+dcount);");\r
432                 out.println("    } else {");\r
433                 out.println("      if(n>dcount) {");\r
434                 out.println("        result = (double)value*pow(radix, n-dcount);");\r
435                 out.println("      } else if(n<dcount) {");\r
436                 out.println("        result = (double)value/pow(radix, dcount-n);");\r
437                 out.println("      } else {");\r
438                 out.println("        result = (double)value;");\r
439                 out.println("      }");\r
440                 out.println("    }");\r
441                 out.println("  } else {");\r
442                 out.println("    result = (double)value/pow(radix, dcount);");\r
443                 out.println("  }");\r
444                 out.println("  if (isNeg)");\r
445                 out.println("    result=-result;");\r
446                 out.println();\r
447                 out.println("return result;");\r
448                 out.println("  }");\r
449                 out.println();\r
450 \r
451                 System.out.println("The file and stream is ......closing.......... : closed");\r
452                 out.close();\r
453             }\r
454         }\r
455         catch(IOException e){\r
456             System.out.println("Exception has been thrown" + e);\r
457         }\r
458     }\r
459 }\r