Add compressed version of input files, still have bugs
authorjzhou <jzhou>
Fri, 18 May 2012 02:46:40 +0000 (02:46 +0000)
committerjzhou <jzhou>
Fri, 18 May 2012 02:46:40 +0000 (02:46 +0000)
Robust/src/ClassLibrary/MGC/Scanner.java
Robust/src/Runtime/bamboo/multicoreruntime.c
Robust/src/Util/InputFileTranslator.java

index 40796c9ae9878de74bec23ed462c6b0759d3a77b..2767e53f8c2a22c42672ef7fc543c4b3a90f58f0 100644 (file)
@@ -1,12 +1,14 @@
 public class Scanner implements Iterator {\r
   private FileInputStream source;\r
   private int currentpos;\r
 public class Scanner implements Iterator {\r
   private FileInputStream source;\r
   private int currentpos;\r
+  private int isHighbits;\r
   private int fd;\r
 \r
   public Scanner (final String source) {\r
     this.source = new FileInputStream(source);\r
     this.fd = this.source.getfd();\r
     this.currentpos = 0;\r
   private int fd;\r
 \r
   public Scanner (final String source) {\r
     this.source = new FileInputStream(source);\r
     this.fd = this.source.getfd();\r
     this.currentpos = 0;\r
+    this.isHighbits = 1;\r
   }\r
 \r
   public void close () {\r
   }\r
 \r
   public void close () {\r
index 0ebf81c96d2b39a4820a5bf701d4ec2e60dab44d..95d406c1e858f7455416304ebb0fffe86cb843a0 100644 (file)
@@ -437,8 +437,10 @@ void CALL01(___System______printString____L___String___, struct ___String___ * _
 #ifdef D___Scanner______nextInt____ 
 int CALL01(___Scanner______nextInt____, struct ___Scanner___ * ___this___) {
   int pos = VAR(___this___)->___currentpos___;
 #ifdef D___Scanner______nextInt____ 
 int CALL01(___Scanner______nextInt____, struct ___Scanner___ * ___this___) {
   int pos = VAR(___this___)->___currentpos___;
-  int value = nextInt(VAR(___this___)->___fd___, &pos);
+  int isHighbits = VAR(___this___)->___isHighbits___;
+  int value = nextInt(VAR(___this___)->___fd___, &pos, &isHighbits);
   VAR(___this___)->___currentpos___ = pos;
   VAR(___this___)->___currentpos___ = pos;
+  VAR(___this___)->___isHighbits___ = isHighbits;
   return value;
 }
 #endif
   return value;
 }
 #endif
@@ -446,8 +448,10 @@ int CALL01(___Scanner______nextInt____, struct ___Scanner___ * ___this___) {
 #ifdef D___Scanner______nextDouble____ 
 double CALL01(___Scanner______nextDouble____, struct ___Scanner___ * ___this___) {
   int pos = VAR(___this___)->___currentpos___;
 #ifdef D___Scanner______nextDouble____ 
 double CALL01(___Scanner______nextDouble____, struct ___Scanner___ * ___this___) {
   int pos = VAR(___this___)->___currentpos___;
-  double value = nextDouble(VAR(___this___)->___fd___, &pos);
+  int isHighbits = VAR(___this___)->___isHighbits___;
+  double value = nextDouble(VAR(___this___)->___fd___, &pos, &isHighbits);
   VAR(___this___)->___currentpos___ = pos;
   VAR(___this___)->___currentpos___ = pos;
+  VAR(___this___)->___isHighbits___ = isHighbits;
   return value;
 }
 #endif
   return value;
 }
 #endif
index 760b5b9244e7c536fe016cc5bbcce1e413846a03..c4a7d19c95c6a9d02d276573f44efe84ada7dffa 100644 (file)
@@ -1,13 +1,11 @@
 package Util;\r
 \r
 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.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.FileInputStream;\r
-import java.io.FileNotFoundException;\r
 import java.io.IOException;\r
 import java.io.PrintWriter;\r
 \r
 import java.io.IOException;\r
 import java.io.PrintWriter;\r
 \r
@@ -25,6 +23,7 @@ public class InputFileTranslator{
                    PREFIX=args[++offset]+"/";\r
                    offset++;\r
                }\r
                    PREFIX=args[++offset]+"/";\r
                    offset++;\r
                }\r
+               boolean isCompressed = true;\r
 \r
                System.out.println("Opening the output file............. : opened");\r
                \r
 \r
                System.out.println("Opening the output file............. : opened");\r
                \r
@@ -41,8 +40,8 @@ public class InputFileTranslator{
                out.println("#endif");\r
                out.println();\r
                out.println("int filename2fd(char * filename, int length);");\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("#endif");\r
                out.close();\r
                \r
@@ -54,7 +53,19 @@ public class InputFileTranslator{
                out.println("#include \"math.h\"");\r
                out.println();\r
                Vector<String> sourcefiles=new Vector<String>();\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
                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
                    String inFilename = args[i+offset];\r
                    String arrayname = inFilename.replaceAll("\\.", "_");\r
                    sourcefiles.add(inFilename);\r
@@ -72,28 +83,62 @@ public class InputFileTranslator{
                    boolean printReturn = false;\r
                    byte[] buf = new byte[1024];  //size can be changed according to programmer's need.\r
                    int len;\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
                    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
                                } else {\r
-                                   out.print(',');\r
+                                   towrite[k] = buf[j];\r
                                }\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
                                }\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
                                }\r
                            }\r
                        }\r
@@ -101,6 +146,28 @@ public class InputFileTranslator{
                    out.println("};");\r
                    out.println();\r
                    gzipInputStream.close();\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
                }\r
                \r
                out.println();\r
@@ -117,6 +184,23 @@ public class InputFileTranslator{
                out.println("};");\r
                out.println();\r
                \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
                //Create the read functions\r
                out.println("int filename2fd(char * filename, int length) {");\r
                for(int i=0; i<sourcefiles.size(); i++)  {\r
@@ -145,151 +229,220 @@ public class InputFileTranslator{
                }\r
                out.println("  return -1;");\r
                out.println("}");\r
                }\r
                out.println("  return -1;");\r
                out.println("}");\r
+               out.println();\r
                \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();\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("    }");\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();\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("    }");\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();\r
-               out.println("    return value;");\r
-               out.println("  }");\r
+               out.println("  return value;");\r
+               out.println("}");\r
                out.println();\r
                \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();\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("    }");\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("    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("      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("      } 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("      }");\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("      } 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("      }");\r
-               out.println("    } else {");\r
-               out.println("      result = (double)value/pow(radix, dcount);");\r
                out.println("    }");\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
                out.println();\r
                out.println("return result;");\r
                out.println("  }");\r