package Util;\r
\r
+import java.util.Hashtable;\r
import java.util.Vector;\r
import java.util.zip.GZIPInputStream;\r
import java.io.File;\r
import java.io.FileWriter;\r
-import java.io.OutputStream;\r
-import java.io.FileOutputStream;\r
import java.io.FileInputStream;\r
-import java.io.FileNotFoundException;\r
import java.io.IOException;\r
import java.io.PrintWriter;\r
\r
PREFIX=args[++offset]+"/";\r
offset++;\r
}\r
+ boolean isCompressed = true;\r
\r
System.out.println("Opening the output file............. : opened");\r
\r
out.println("#endif");\r
out.println();\r
out.println("int filename2fd(char * filename, int length);");\r
- out.println("int nextInt(int fd, int * pos);");\r
- out.println("double nextDouble(int fd, int * pos);");\r
+ out.println("int nextInt(int fd, int * pos, int * isHighbits);");\r
+ out.println("double nextDouble(int fd, int * pos, int * isHighbits);");\r
out.println("#endif");\r
out.close();\r
\r
out.println("#include \"math.h\"");\r
out.println();\r
Vector<String> sourcefiles=new Vector<String>();\r
+ Vector<Boolean> compressVec = new Vector<Boolean>();\r
+ Hashtable<Byte, Integer> encodemapping = new Hashtable<Byte, Integer>();\r
+ Vector<Byte> encodeVec = new Vector<Byte>();\r
+ int encodenum = 1;\r
+ int returncount = 10;\r
for(int i=0; i<args.length-offset; i++) {\r
+ if(isCompressed) {\r
+ encodemapping.clear();\r
+ encodeVec.clear();\r
+ encodenum = 0;\r
+ encodemapping.put((byte)0, 0);\r
+ encodeVec.add((byte)0);\r
+ }\r
String inFilename = args[i+offset];\r
String arrayname = inFilename.replaceAll("\\.", "_");\r
sourcefiles.add(inFilename);\r
boolean printReturn = false;\r
byte[] buf = new byte[1024]; //size can be changed according to programmer's need.\r
int len;\r
+ int writenum = isCompressed?2:1;\r
+ compressVec.add(isCompressed?true:false);\r
+ int bitmask = 0x00FF;\r
while ((len = gzipInputStream.read(buf)) > 0) {\r
//out.write(buf, 0, len);\r
- for(int j = 0; j < len; j++) {\r
- if('#' == buf[j]) {\r
- // skip the comments\r
- while(j<len && buf[j++] != '\n') {\r
- }\r
- } else {\r
- if(!printComma) {\r
- printComma = true;\r
+ for(int j = 0; j < len; ) {\r
+ // read out 2 bytes at a time\r
+ byte[] towrite = new byte[writenum];\r
+ for(int k = 0; k<writenum&&j<len; k++) {\r
+ if('#' == buf[j]) {\r
+ // skip the comments\r
+ while(j<len && buf[j++] != '\n') {\r
+ }\r
} else {\r
- out.print(',');\r
+ towrite[k] = buf[j];\r
}\r
- if(printReturn) {\r
- out.println();\r
- printReturn = false;\r
+ j++;\r
+ }\r
+ int writevalue = towrite[0];\r
+ if(isCompressed) {\r
+ // compress two value into one for compressed version\r
+ if(!encodemapping.containsKey(towrite[0])) {\r
+ encodemapping.put(towrite[0], encodenum++);\r
+ encodeVec.add(towrite[0]);\r
}\r
- if('\n' == buf[j]) {\r
- out.print("\'\\n\'");\r
- printReturn = true;\r
- } else {\r
- out.print(buf[j]);\r
+ writevalue = encodemapping.get(towrite[0]);\r
+ if(!encodemapping.containsKey(towrite[1])) {\r
+ encodemapping.put(towrite[1], encodenum++);\r
+ encodeVec.add(towrite[1]);\r
+ }\r
+ if(encodeVec.size()>=16) {\r
+ System.err.println("Error! The compressed file has more than 16 types of characters! It can not be compressed!");\r
+ System.exit(-1);\r
+ }\r
+ writevalue = ((writevalue<<4)|encodemapping.get(towrite[1]))&bitmask;\r
+ }\r
+ if(!printComma) {\r
+ printComma = true;\r
+ } else {\r
+ out.print(',');\r
+ }\r
+ if(printReturn) {\r
+ out.println();\r
+ printReturn = false;\r
+ }\r
+ if(!isCompressed && ('\n' == buf[j])) {\r
+ out.print("\'\\n\'");\r
+ printReturn = true;\r
+ } else {\r
+ out.print(writevalue);\r
+ if(isCompressed) {\r
+ returncount--;\r
+ if(returncount==0) {\r
+ printReturn=true;\r
+ returncount = 10;\r
+ }\r
}\r
}\r
}\r
out.println("};");\r
out.println();\r
gzipInputStream.close();\r
+ if(isCompressed) {\r
+ // print out the decoding array\r
+ String decodename = arrayname.concat("_decodeTbl");\r
+ out.println("unsigned char " + decodename + "[] = {");\r
+ printComma = false;\r
+ for(int j = 0; j < encodeVec.size(); j++) {\r
+ byte b = encodeVec.elementAt(j).byteValue();\r
+ if(!printComma) {\r
+ printComma = true;\r
+ } else {\r
+ out.print(',');\r
+ }\r
+ if('\n' == b) {\r
+ out.print("\'\\n\'");\r
+ printReturn = true;\r
+ } else {\r
+ out.print(b);\r
+ }\r
+ }\r
+ out.println("};");\r
+ out.println();\r
+ }\r
}\r
\r
out.println();\r
out.println("};");\r
out.println();\r
\r
+ out.println("unsigned char * inputFileArrays_decodeTbl[]= {");\r
+ for(int i = 0; i < sourcefiles.size(); i++) {\r
+ String arrayname = sourcefiles.elementAt(i).replaceAll("\\.", "_");\r
+ \r
+ if(i > 0) {\r
+ out.println(',');\r
+ }\r
+ if(compressVec.elementAt(i).booleanValue()) {\r
+ out.print("&"+arrayname.concat("_decodeTbl")+"[0]");\r
+ } else {\r
+ out.print("0");\r
+ }\r
+ }\r
+ out.println();\r
+ out.println("};");\r
+ out.println();\r
+ \r
//Create the read functions\r
out.println("int filename2fd(char * filename, int length) {");\r
for(int i=0; i<sourcefiles.size(); i++) {\r
}\r
out.println(" return -1;");\r
out.println("}");\r
+ out.println();\r
\r
+ out.println("unsigned char nextValue='\\0';");\r
+ out.println("bool holdVal=false;");\r
+ out.println();\r
+\r
+ out.println("void initVal() {");\r
+ out.println(" nextValue='\\0';");\r
+ out.println(" holdVal=false;");\r
+ out.println("}");\r
+ out.println();\r
+\r
+ out.println("unsigned char peek(unsigned char * filearray, int * pos, int * isHighbits, bool isCompressed) {");\r
+ out.println(" if(!isCompressed) {");\r
+ out.println(" return filearray[*pos];");\r
+ out.println(" } else {");\r
+ out.println(" unsigned char value=0;");\r
+ out.println(" if(!holdVal) {");\r
+ out.println(" nextValue=filearray[*pos];");\r
+ out.println(" }");\r
+ out.println(" if(1==*isHighbits) {");\r
+ out.println(" value=((nextValue&0x00F0)>>4)&0x000F;");\r
+ out.println(" holdVal=true;");\r
+ out.println(" *isHighbits=0;");\r
+ out.println(" } else {");\r
+ out.println(" value=nextValue&0x000F;");\r
+ out.println(" holdVal=false;");\r
+ out.println(" *isHighbits=1;");\r
+ out.println(" }");\r
+ out.println(" return value;");\r
+ out.println(" }");\r
+ out.println("}");\r
+ out.println();\r
+\r
+ out.println("void next(int * pos, bool isCompressed) {");\r
+ out.println(" if(!isCompressed||!holdVal) {");\r
+ out.println(" *pos = *pos+1;");\r
+ out.println(" }");\r
+ out.println("}");\r
+ out.println();\r
+ \r
+ out.println("int nextInt(int fd, int * pos, int * isHighbits) {");\r
+ out.println(" int i = 0;");\r
+ out.println(" unsigned char * filearray = inputFileArrays[fd];");\r
+ out.println(" bool isCompressed = false;");\r
+ out.println(" if(inputFileArrays_decodeTbl[fd]!=0) {");\r
+ out.println(" isCompressed = true;");\r
+ out.println(" }");\r
+ out.println(" initVal();");\r
out.println();\r
- out.println("int nextInt(int fd, int * pos) {");\r
- out.println(" int i = 0;");\r
- out.println(" unsigned char * filearray = inputFileArrays[fd];");\r
- out.println(" while((filearray[*pos]==\' \')||(filearray[*pos]==\'\\n\')){");\r
- out.println(" *pos=*pos+1;");\r
+ out.println(" unsigned char b='\\0';");\r
+ out.println(" while(true) {");\r
+ out.println(" b=peek(filearray, pos, isHighbits, isCompressed); ");\r
+ out.println(" if((b==' ')||(b=='\\n')){");\r
+ out.println(" next(pos, isCompressed);");\r
+ out.println(" } else {");\r
+ out.println(" break;");\r
out.println(" }");\r
- out.println(" unsigned int value = 0;");\r
- out.println(" bool isNeg=false;");\r
- out.println(" unsigned int radix = 10;");\r
+ out.println(" }");\r
+ out.println();\r
+ out.println(" unsigned int value = 0;");\r
+ out.println(" bool isNeg=false;");\r
+ out.println(" unsigned int radix = 10;");\r
out.println();\r
- out.println(" if (filearray[*pos]==\'-\') {");\r
- out.println(" isNeg=true;");\r
- out.println(" *pos=*pos+1;");\r
+ out.println(" if (b=='-') {");\r
+ out.println(" isNeg=true;");\r
+ out.println(" next(pos, isCompressed);");\r
+ out.println(" b=peek(filearray, pos, isHighbits, isCompressed);");\r
+ out.println(" }");\r
+ out.println(" bool cont=true;");\r
+ out.println(" do {");\r
+ out.println(" unsigned int val;");\r
+ out.println(" if (b>='0'&&b<='9')");\r
+ out.println(" val=b-'0';");\r
+ out.println(" else if (b>='a'&&b<='z')");\r
+ out.println(" val=10+b-'a';");\r
+ out.println(" else if (b>='A'&&b<='Z')");\r
+ out.println(" val=10+b-'A';");\r
+ out.println(" else {");\r
+ out.println(" cont=false;");\r
out.println(" }");\r
- out.println(" bool cont=true;");\r
- out.println(" do {");\r
- out.println(" unsigned char b=filearray[*pos];");\r
- out.println(" unsigned int val;");\r
- out.println(" if (b>=\'0\'&&b<=\'9\')");\r
- out.println(" val=b-\'0\';");\r
- out.println(" else if (b>=\'a\'&&b<=\'z\')");\r
- out.println(" val=10+b-\'a\';");\r
- out.println(" else if (b>=\'A\'&&b<=\'Z\')");\r
- out.println(" val=10+b-\'A\';");\r
- out.println(" else {");\r
- out.println(" cont=false;");\r
- out.println(" }");\r
- out.println(" if (cont) {");\r
- out.println(" if (val>=radix)");\r
- out.println(" printf(\"Error in nextInt(): val >= radix\");");\r
- out.println(" value=value*radix+val;");\r
- out.println(" *pos=*pos+1;");\r
- out.println(" }");\r
- out.println(" }while(cont);");\r
- out.println(" if (isNeg)");\r
- out.println(" value=-value;");\r
+ out.println(" if (cont) {");\r
+ out.println(" if (val>=radix)");\r
+ out.println(" printf(\"Error in nextInt(): val >= radix\");");\r
+ out.println(" value=value*radix+val;");\r
+ out.println(" next(pos, isCompressed);");\r
+ out.println(" b=peek(filearray, pos, isHighbits, isCompressed);");\r
+ out.println(" }");\r
+ out.println(" }while(cont);");\r
+ out.println(" if (isNeg)");\r
+ out.println(" value=-value;");\r
out.println();\r
- out.println(" return value;");\r
- out.println(" }");\r
+ out.println(" return value;");\r
+ out.println("}");\r
out.println();\r
\r
- out.println("double nextDouble(int fd, int * pos) {");\r
- out.println(" int i = 0;");\r
- out.println(" unsigned char * filearray = inputFileArrays[fd];");\r
- out.println(" while((filearray[*pos]==\' \')||(filearray[*pos]==\'\\n\')){");\r
- out.println(" *pos=*pos+1;");\r
- out.println(" }");\r
- out.println(" double result=0.0;");\r
- out.println(" unsigned int value=0;");\r
- out.println(" unsigned int maxvalue=((unsigned int)(1<<32)-1)/10;");\r
- out.println(" bool isNeg=false;");\r
- out.println(" bool isDiv=false;");\r
- out.println(" unsigned int radix = 10;");\r
+ out.println("double nextDouble(int fd, int * pos, int * isHighbits) {");\r
+ out.println(" int i = 0;");\r
+ out.println(" unsigned char * filearray = inputFileArrays[fd];");\r
+ out.println(" bool isCompressed = false;");\r
+ out.println(" if(inputFileArrays_decodeTbl[fd]!=0) {");\r
+ out.println(" isCompressed = true;");\r
+ out.println(" }");\r
+ out.println(" initVal();");\r
+ out.println();\r
+ out.println(" unsigned char b='\\0';");\r
+ out.println(" while(true) {");\r
+ out.println(" b=peek(filearray, pos, isHighbits, isCompressed); ");\r
+ out.println(" if((b==' ')||(b=='\\n')){");\r
+ out.println(" next(pos, isCompressed);");\r
+ out.println(" } else {");\r
+ out.println(" break;");\r
+ out.println(" }");\r
+ out.println(" }");\r
+ out.println();\r
+ out.println(" double result=0.0;");\r
+ out.println(" unsigned int value=0;");\r
+ out.println(" unsigned int maxvalue=((unsigned int)(1<<32)-1)/10;");\r
+ out.println(" bool isNeg=false;");\r
+ out.println(" bool isDiv=false;");\r
+ out.println(" unsigned int radix = 10;");\r
out.println();\r
- out.println(" if (filearray[*pos]=='-') {");\r
- out.println(" isNeg=true;");\r
- out.println(" *pos=*pos+1;");\r
+ out.println(" if (b=='-') {");\r
+ out.println(" isNeg=true;");\r
+ out.println(" next(pos, isCompressed);");\r
+ out.println(" b=peek(filearray, pos, isHighbits, isCompressed); ");\r
+ out.println(" }");\r
+ out.println(" bool cont=true;");\r
+ out.println(" bool exp=false;");\r
+ out.println(" bool decimal=false;");\r
+ out.println(" bool compute=true;");\r
+ out.println(" bool omit=false;");\r
+ out.println(" unsigned int dcount=0;");\r
+ out.println(" // compute the base");\r
+ out.println(" do {");\r
+ out.println(" unsigned int val;");\r
+ out.println(" if (b>='0'&&b<='9') {");\r
+ out.println(" if (!omit) {");\r
+ out.println(" val=b-'0';");\r
+ out.println(" if(decimal) {");\r
+ out.println(" dcount++;");\r
+ out.println(" }");\r
+ out.println(" }");\r
+ out.println(" } else if (b=='.') {");\r
+ out.println(" decimal=true;");\r
+ out.println(" compute=false;");\r
+ out.println(" } else if (b=='E'||b=='e') {");\r
+ out.println(" exp=true;");\r
+ out.println(" cont=false;");\r
+ out.println(" next(pos, isCompressed);");\r
+ out.println(" } else {");\r
+ out.println(" cont=false;");\r
+ out.println(" }");\r
+ out.println(" if (cont) {");\r
+ out.println(" if (val>=radix)");\r
+ out.println(" printf(\"Error in nextDouble(): val >= radix\");");\r
+ out.println(" if(compute) {");\r
+ out.println(" if(value<maxvalue) {");\r
+ out.println(" value=value*radix+val;");\r
+ out.println(" } else {");\r
+ out.println(" omit=true;");\r
+ out.println(" compute=false;");\r
+ out.println(" dcount--;");\r
+ out.println(" }");\r
+ out.println(" } else if(!omit) {");\r
+ out.println(" compute=true;");\r
+ out.println(" }");\r
+ out.println(" next(pos, isCompressed);");\r
+ out.println(" b=peek(filearray, pos, isHighbits, isCompressed); ");\r
+ out.println(" }");\r
+ out.println(" }while(cont);");\r
+ out.println(" if(exp) {");\r
+ out.println(" // compute the power index");\r
+ out.println(" cont=true;");\r
+ out.println(" unsigned int n=0;");\r
+ out.println(" b=peek(filearray, pos, isHighbits, isCompressed); ");\r
+ out.println(" if (b=='-') {");\r
+ out.println(" isDiv=true;");\r
+ out.println(" next(pos, isCompressed);");\r
+ out.println(" } else if (b=='+') {");\r
+ out.println(" next(pos, isCompressed);");\r
+ out.println(" b=peek(filearray, pos, isHighbits, isCompressed); ");\r
out.println(" }");\r
- out.println(" bool cont=true;");\r
- out.println(" bool exp=false;");\r
- out.println(" bool decimal=false;");\r
- out.println(" bool compute=true;");\r
- out.println(" bool omit=false;");\r
- out.println(" unsigned int dcount=0;");\r
- out.println(" // compute the base");\r
out.println(" do {");\r
- out.println(" unsigned char b=filearray[*pos];");\r
out.println(" unsigned int val;");\r
out.println(" if (b>='0'&&b<='9') {");\r
- out.println(" if (!omit) {");\r
- out.println(" val=b-'0';");\r
- out.println(" if(decimal) {");\r
- out.println(" dcount++;");\r
- out.println(" }");\r
- out.println(" }");\r
- out.println(" } else if (b=='.') {");\r
- out.println(" decimal=true;");\r
- out.println(" compute=false;");\r
- out.println(" } else if (b=='E'||b=='e') {");\r
- out.println(" exp=true;");\r
- out.println(" cont=false;");\r
- out.println(" *pos=*pos+1;");\r
+ out.println(" val=b-'0';");\r
out.println(" } else {");\r
out.println(" cont=false;");\r
out.println(" }");\r
out.println(" if (cont) {");\r
out.println(" if (val>=radix)");\r
out.println(" printf(\"Error in nextDouble(): val >= radix\");");\r
- out.println(" if(compute) {");\r
- out.println(" if(value<maxvalue) {");\r
- out.println(" value=value*radix+val;");\r
- out.println(" } else {");\r
- out.println(" omit=true;");\r
- out.println(" compute=false;");\r
- out.println(" dcount--;");\r
- out.println(" }");\r
- out.println(" } else if(!omit) {");\r
- out.println(" compute=true;");\r
- out.println(" }");\r
- out.println(" *pos=*pos+1;");\r
+ out.println(" n=n*10+val;");\r
+ out.println(" next(pos, isCompressed);");\r
+ out.println(" b=peek(filearray, pos, isHighbits, isCompressed); ");\r
out.println(" }");\r
out.println(" }while(cont);");\r
- out.println(" if(exp) {");\r
- out.println(" // compute the power index");\r
- out.println(" cont=true;");\r
- out.println(" unsigned int n=0;");\r
- out.println(" if (filearray[*pos]=='-') {");\r
- out.println(" isDiv=true;");\r
- out.println(" *pos=*pos+1;");\r
- out.println(" } else if (filearray[*pos]=='+') {");\r
- out.println(" *pos=*pos+1;");\r
- out.println(" }");\r
- out.println(" do {");\r
- out.println(" unsigned char b=filearray[*pos];");\r
- out.println(" unsigned int val;");\r
- out.println(" if (b>='0'&&b<='9') {");\r
- out.println(" val=b-'0';");\r
- out.println(" } else {");\r
- out.println(" cont=false;");\r
- out.println(" }");\r
- out.println(" if (cont) {");\r
- out.println(" if (val>=radix)");\r
- out.println(" printf(\"Error in nextDouble(): val >= radix\");");\r
- out.println(" n=n*10+val;");\r
- out.println(" *pos=*pos+1;");\r
- out.println(" }");\r
- out.println(" }while(cont);");\r
- out.println(" if(isDiv) {");\r
- out.println(" result = (double)value/pow(radix, n+dcount);");\r
+ out.println(" if(isDiv) {");\r
+ out.println(" result = (double)value/pow(radix, n+dcount);");\r
+ out.println(" } else {");\r
+ out.println(" if(n>dcount) {");\r
+ out.println(" result = (double)value*pow(radix, n-dcount);");\r
+ out.println(" } else if(n<dcount) {");\r
+ out.println(" result = (double)value/pow(radix, dcount-n);");\r
out.println(" } else {");\r
- out.println(" if(n>dcount) {");\r
- out.println(" result = (double)value*pow(radix, n-dcount);");\r
- out.println(" } else if(n<dcount) {");\r
- out.println(" result = (double)value/pow(radix, dcount-n);");\r
- out.println(" } else {");\r
- out.println(" result = (double)value;");\r
- out.println(" }");\r
+ out.println(" result = (double)value;");\r
out.println(" }");\r
- out.println(" } else {");\r
- out.println(" result = (double)value/pow(radix, dcount);");\r
out.println(" }");\r
- out.println(" if (isNeg)");\r
- out.println(" result=-result;");\r
+ out.println(" } else {");\r
+ out.println(" result = (double)value/pow(radix, dcount);");\r
+ out.println(" }");\r
+ out.println(" if (isNeg)");\r
+ out.println(" result=-result;");\r
out.println();\r
out.println("return result;");\r
out.println(" }");\r