mirror of git://gcc.gnu.org/git/gcc.git
				
				
				
			
		
			
				
	
	
		
			204 lines
		
	
	
		
			6.3 KiB
		
	
	
	
		
			Java
		
	
	
	
			
		
		
	
	
			204 lines
		
	
	
		
			6.3 KiB
		
	
	
	
		
			Java
		
	
	
	
| /* java.util.zip.InflaterDynHeader
 | |
|    Copyright (C) 2001 Free Software Foundation, Inc.
 | |
| 
 | |
| This file is part of GNU Classpath.
 | |
| 
 | |
| GNU Classpath is free software; you can redistribute it and/or modify
 | |
| it under the terms of the GNU General Public License as published by
 | |
| the Free Software Foundation; either version 2, or (at your option)
 | |
| any later version.
 | |
| 
 | |
| GNU Classpath is distributed in the hope that it will be useful, but
 | |
| WITHOUT ANY WARRANTY; without even the implied warranty of
 | |
| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 | |
| General Public License for more details.
 | |
| 
 | |
| You should have received a copy of the GNU General Public License
 | |
| along with GNU Classpath; see the file COPYING.  If not, write to the
 | |
| Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
 | |
| 02110-1301 USA.
 | |
| 
 | |
| Linking this library statically or dynamically with other modules is
 | |
| making a combined work based on this library.  Thus, the terms and
 | |
| conditions of the GNU General Public License cover the whole
 | |
| combination.
 | |
| 
 | |
| As a special exception, the copyright holders of this library give you
 | |
| permission to link this library with independent modules to produce an
 | |
| executable, regardless of the license terms of these independent
 | |
| modules, and to copy and distribute the resulting executable under
 | |
| terms of your choice, provided that you also meet, for each linked
 | |
| independent module, the terms and conditions of the license of that
 | |
| module.  An independent module is a module which is not derived from
 | |
| or based on this library.  If you modify this library, you may extend
 | |
| this exception to your version of the library, but you are not
 | |
| obligated to do so.  If you do not wish to do so, delete this
 | |
| exception statement from your version. */
 | |
| 
 | |
| package java.util.zip;
 | |
| 
 | |
| class InflaterDynHeader
 | |
| {
 | |
|   private static final int LNUM   = 0;
 | |
|   private static final int DNUM   = 1;
 | |
|   private static final int BLNUM  = 2;
 | |
|   private static final int BLLENS = 3;
 | |
|   private static final int LENS   = 4;
 | |
|   private static final int REPS   = 5;
 | |
| 
 | |
|   private static final int repMin[]  = { 3, 3, 11 };
 | |
|   private static final int repBits[] = { 2, 3,  7 };
 | |
| 
 | |
| 
 | |
|   private byte[] blLens;
 | |
|   private byte[] litdistLens;
 | |
| 
 | |
|   private InflaterHuffmanTree blTree;
 | |
| 
 | |
|   private int mode;
 | |
|   private int lnum, dnum, blnum, num;
 | |
|   private int repSymbol;
 | |
|   private byte lastLen;
 | |
|   private int ptr;
 | |
| 
 | |
|   private static final int[] BL_ORDER =
 | |
|   { 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15 };
 | |
| 
 | |
|   public InflaterDynHeader()
 | |
|   {
 | |
|   }
 | |
| 
 | |
|   public boolean decode(StreamManipulator input) throws DataFormatException
 | |
|   {
 | |
|   decode_loop:
 | |
|     for (;;)
 | |
|       {
 | |
|         switch (mode)
 | |
|           {
 | |
|           case LNUM:
 | |
|             lnum = input.peekBits(5);
 | |
|             if (lnum < 0)
 | |
|               return false;
 | |
|             lnum += 257;
 | |
|             input.dropBits(5);
 | |
| //          System.err.println("LNUM: "+lnum);
 | |
|             mode = DNUM;
 | |
|             /* fall through */
 | |
|           case DNUM:
 | |
|             dnum = input.peekBits(5);
 | |
|             if (dnum < 0)
 | |
|               return false;
 | |
|             dnum++;
 | |
|             input.dropBits(5);
 | |
| //          System.err.println("DNUM: "+dnum);
 | |
|             num = lnum+dnum;
 | |
|             litdistLens = new byte[num];
 | |
|             mode = BLNUM;
 | |
|             /* fall through */
 | |
|           case BLNUM:
 | |
|             blnum = input.peekBits(4);
 | |
|             if (blnum < 0)
 | |
|               return false;
 | |
|             blnum += 4;
 | |
|             input.dropBits(4);
 | |
|             blLens = new byte[19];
 | |
|             ptr = 0;
 | |
| //          System.err.println("BLNUM: "+blnum);
 | |
|             mode = BLLENS;
 | |
|             /* fall through */
 | |
|           case BLLENS:
 | |
|             while (ptr < blnum)
 | |
|               {
 | |
|                 int len = input.peekBits(3);
 | |
|                 if (len < 0)
 | |
|                   return false;
 | |
|                 input.dropBits(3);
 | |
| //              System.err.println("blLens["+BL_ORDER[ptr]+"]: "+len);
 | |
|                 blLens[BL_ORDER[ptr]] = (byte) len;
 | |
|                 ptr++;
 | |
|               }
 | |
|             blTree = new InflaterHuffmanTree(blLens);
 | |
|             blLens = null;
 | |
|             ptr = 0;
 | |
|             mode = LENS;
 | |
|             /* fall through */
 | |
|           case LENS:
 | |
|             {
 | |
|               int symbol;
 | |
|               while (((symbol = blTree.getSymbol(input)) & ~15) == 0)
 | |
|                 {
 | |
|                   /* Normal case: symbol in [0..15] */
 | |
| 
 | |
| //                System.err.println("litdistLens["+ptr+"]: "+symbol);
 | |
|                   litdistLens[ptr++] = lastLen = (byte) symbol;
 | |
| 
 | |
|                   if (ptr == num)
 | |
|                     {
 | |
|                       /* Finished */
 | |
|                       return true;
 | |
|                     }
 | |
|                 }
 | |
| 
 | |
|               /* need more input ? */
 | |
|               if (symbol < 0)
 | |
|                 return false;
 | |
| 
 | |
|               /* otherwise repeat code */
 | |
|               if (symbol >= 17)
 | |
|                 {
 | |
|                   /* repeat zero */
 | |
| //                System.err.println("repeating zero");
 | |
|                   lastLen = 0;
 | |
|                 }
 | |
|               else
 | |
|                 {
 | |
|                   if (ptr == 0)
 | |
|                     throw new DataFormatException();
 | |
|                 }
 | |
|               repSymbol = symbol-16;
 | |
|               mode = REPS;
 | |
|             }
 | |
|             /* fall through */
 | |
| 
 | |
|           case REPS:
 | |
|             {
 | |
|               int bits = repBits[repSymbol];
 | |
|               int count = input.peekBits(bits);
 | |
|               if (count < 0)
 | |
|                 return false;
 | |
|               input.dropBits(bits);
 | |
|               count += repMin[repSymbol];
 | |
| //            System.err.println("litdistLens repeated: "+count);
 | |
| 
 | |
|               if (ptr + count > num)
 | |
|                 throw new DataFormatException();
 | |
|               while (count-- > 0)
 | |
|                 litdistLens[ptr++] = lastLen;
 | |
| 
 | |
|               if (ptr == num)
 | |
|                 {
 | |
|                   /* Finished */
 | |
|                   return true;
 | |
|                 }
 | |
|             }
 | |
|             mode = LENS;
 | |
|             continue decode_loop;
 | |
|           }
 | |
|       }
 | |
|   }
 | |
| 
 | |
|   public InflaterHuffmanTree buildLitLenTree() throws DataFormatException
 | |
|   {
 | |
|     byte[] litlenLens = new byte[lnum];
 | |
|     System.arraycopy(litdistLens, 0, litlenLens, 0, lnum);
 | |
|     return new InflaterHuffmanTree(litlenLens);
 | |
|   }
 | |
| 
 | |
|   public InflaterHuffmanTree buildDistTree() throws DataFormatException
 | |
|   {
 | |
|     byte[] distLens = new byte[dnum];
 | |
|     System.arraycopy(litdistLens, lnum, distLens, 0, dnum);
 | |
|     return new InflaterHuffmanTree(distLens);
 | |
|   }
 | |
| }
 |