Esempio n. 1
0
        // ushort* lens -> ushort[] lens + int lens_ind
        // code** table -> code[] table + ref int table_ind
        private static int inflate_table(codetype type, ushort[] lens, int lens_ind, uint codes, code[] table, ref int table_ind, ref uint bits, ushort[] work)
        {
            uint len;                                   // a code's length in bits
            uint sym;                                   // index of code symbols
            uint min, max;                              // minimum and maximum code lengths
            uint root;                                  // number of index bits for root table
            uint curr;                                  // number of index bits for current table
            uint drop;                                  // code bits to drop for sub-table
            int  left;                                  // number of prefix codes available
            uint used;                                  // code entries in table used
            uint huff;                                  // Huffman code
            uint incr;                                  // for incrementing code, index
            uint fill;                                  // index for replicating entries
            uint low;                                   // low bits for current root entry
            uint mask;                                  // mask for low root bits
            code here;                                  // table entry for duplication
            int  next;                                  // next available space in table

            ushort[] _base;                             // base value table to use
            int      base_ind;                          // index in _base

            ushort[] extra;                             // extra bits table to use
            int      extra_ind;                         // index in extra
            int      end;                               // use base and extra for symbol > end

            ushort[] count = new ushort[MAXBITS + 1];   // number of codes of each length
            ushort[] offs  = new ushort[MAXBITS + 1];   // offsets in table for each length

            // Process a set of code lengths to create a canonical Huffman code.  The
            // code lengths are lens[0..codes-1].  Each length corresponds to the
            // symbols 0..codes-1.  The Huffman code is generated by first sorting the
            // symbols by length from short to long, and retaining the symbol order
            // for codes with equal lengths.  Then the code starts with all zero bits
            // for the first code of the shortest length, and the codes are integer
            // increments for the same length, and zeros are appended as the length
            // increases.  For the deflate format, these bits are stored backwards
            // from their more natural integer increment ordering, and so when the
            // decoding tables are built in the large loop below, the integer codes
            // are incremented backwards.

            // This routine assumes, but does not check, that all of the entries in
            // lens[] are in the range 0..MAXBITS.  The caller must assure this.
            // 1..MAXBITS is interpreted as that code length.  zero means that that
            // symbol does not occur in this code.

            // The codes are sorted by computing a count of codes for each length,
            // creating from that a table of starting indices for each length in the
            // sorted table, and then entering the symbols in order in the sorted
            // table.  The sorted table is work[], with that space being provided by
            // the caller.

            // The length counts are used for other purposes as well, i.e. finding
            // the minimum and maximum length codes, determining if there are any
            // codes at all, checking for a valid set of lengths, and looking ahead
            // at length counts to determine sub-table sizes when building the
            // decoding tables.

            // accumulate lengths for codes (assumes lens[] all in 0..MAXBITS)
            for (len = 0; len <= MAXBITS; len++)
            {
                count[len] = 0;
            }
            for (sym = 0; sym < codes; sym++)
            {
                count[lens[lens_ind + sym]]++;
            }

            // bound code lengths, force root to be within code lengths
            root = bits;
            for (max = MAXBITS; max >= 1; max--)
            {
                if (count[max] != 0)
                {
                    break;
                }
            }
            if (root > max)
            {
                root = max;
            }

            if (max == 0)
            {                                                   // no symbols to code at all
                here = new code(64, 1, 0);                      // invalid code marker
                table[table_ind++] = here.Clone();              // make a table to force an error
                table[table_ind++] = here.Clone();
                bits = 1;
                return(0);                                                      // no symbols, but wait for decoding to report error
            }

            for (min = 1; min < max; min++)
            {
                if (count[min] != 0)
                {
                    break;
                }
            }
            if (root < min)
            {
                root = min;
            }

            // check for an over-subscribed or incomplete set of lengths
            left = 1;
            for (len = 1; len <= MAXBITS; len++)
            {
                left <<= 1;
                left  -= count[len];
                if (left < 0)
                {
                    return(-1);                       // over-subscribed
                }
            }
            if (left > 0 && (type == codetype.CODES || max != 1))
            {
                return(-1);                                                   // incomplete set
            }
            // generate offsets into symbol table for each length for sorting
            offs[1] = 0;
            for (len = 1; len < MAXBITS; len++)
            {
                offs[len + 1] = (ushort)(offs[len] + count[len]);
            }

            // sort symbols by length, by symbol order within each length
            for (sym = 0; sym < codes; sym++)
            {
                if (lens[lens_ind + sym] != 0)
                {
                    work[offs[lens[lens_ind + sym]]++] = (ushort)sym;
                }
            }

            // Create and fill in decoding tables. In this loop, the table being
            // filled is at next and has curr index bits. The code being used is huff
            // with length len. That code is converted to an index by dropping drop
            // bits off of the bottom. For codes where len is less than drop + curr,
            // those top drop + curr - len bits are incremented through all values to
            // fill the table with replicated entries.

            // root is the number of index bits for the root table. When len exceeds
            // root, sub-tables are created pointed to by the root entry with an index
            // of the low root bits of huff. This is saved in low to check for when a
            // new sub-table should be started. drop is zero when the root table is
            // being filled, and drop is root when sub-tables are being filled.

            // When a new sub-table is needed, it is necessary to look ahead in the
            // code lengths to determine what size sub-table is needed.  The length
            // counts are used for this, and so count[] is decremented as codes are
            // entered in the tables.

            // used keeps track of how many table entries have been allocated from the
            // provided *table space.  It is checked for LENS and DIST tables against
            // the constants ENOUGH_LENS and ENOUGH_DISTS to guard against changes in
            // the initial root table size constants. See the comments in inftrees.h
            // for more information.

            // sym increments through all symbols, and the loop terminates when
            // all codes of length max, i.e. all codes, have been processed. This
            // routine permits incomplete codes, so another loop after this one fills
            // in the rest of the decoding tables with invalid code markers.

            // set up for code type
            switch (type)
            {
            case codetype.CODES:
                base_ind = extra_ind = 0;
                _base    = extra = work;                        // dummy value--not used
                end      = 19;
                break;

            case codetype.LENS:
                _base     = lbase;
                base_ind  = -257;
                extra     = lext;
                extra_ind = -257;
                end       = 256;
                break;

            default:                                                    // DISTS
                base_ind = extra_ind = 0;
                _base    = dbase;
                extra    = dext;
                end      = -1;
                break;
            }

            // initialize state for loop
            huff = 0;                           // starting code
            sym  = 0;                           // starting code symbol
            len  = min;                         // starting code length
            next = table_ind;                   // current table to fill in
            curr = root;                        // current table index bits
            drop = 0;                           // current bits to drop from code for index
            low  = uint.MaxValue;               // trigger new sub-table when len > root
            used = 1U << (int)root;             // use root table entries
            mask = used - 1;                    // mask for comparing low

            // check available table space
            if ((type == codetype.LENS && used >= ENOUGH_LENS) || (type == codetype.DISTS && used >= ENOUGH_DISTS))
            {
                return(1);
            }

            // process all codes and make table entries
            for (; ;)
            {
                // create table entry
                here = new code(0, (byte)(len - drop), 0);
                if ((int)(work[sym]) < end)
                {
                    here.op  = 0;
                    here.val = work[sym];
                }
                else if ((int)(work[sym]) > end)
                {
                    here.op  = (byte)(extra[extra_ind + work[sym]]);
                    here.val = _base[base_ind + work[sym]];
                }
                else
                {
                    here.op  = 32 + 64;                         // end of block
                    here.val = 0;
                }

                // replicate for those indices with low len bits equal to huff
                incr = 1U << (int)(len - drop);
                fill = 1U << (int)curr;
                min  = fill;                                            // save offset to next table
                do
                {
                    fill -= incr;
                    table[next + (huff >> (int)drop) + fill] = here.Clone();
                } while(fill != 0);

                // backwards increment the len-bit code huff
                incr = 1U << (int)(len - 1);
                while ((huff & incr) != 0)
                {
                    incr >>= 1;
                }

                if (incr != 0)
                {
                    huff &= incr - 1;
                    huff += incr;
                }
                else
                {
                    huff = 0;
                }

                // go to next symbol, update count, len
                sym++;
                if (--(count[len]) == 0)
                {
                    if (len == max)
                    {
                        break;
                    }
                    len = lens[lens_ind + work[sym]];
                }

                // create new sub-table if needed
                if (len > root && (huff & mask) != low)
                {
                    // if first time, transition to sub-tables
                    if (drop == 0)
                    {
                        drop = root;
                    }

                    // increment past last table
                    next += (int)min;                                   // here min is 1 << curr

                    // determine length of next table
                    curr = len - drop;
                    left = 1 << (int)curr;
                    while (curr + drop < max)
                    {
                        left -= count[curr + drop];
                        if (left <= 0)
                        {
                            break;
                        }
                        curr++;
                        left <<= 1;
                    }

                    // check for enough space
                    used += 1U << (int)curr;
                    if ((type == codetype.LENS && used >= ENOUGH_LENS) || (type == codetype.DISTS && used >= ENOUGH_DISTS))
                    {
                        return(1);
                    }

                    // point entry in root table to sub-table
                    low = huff & mask;
                    table[table_ind + low] = new code((byte)curr, (byte)root, (ushort)(next - table_ind));
                }
            }

            // Fill in rest of table for incomplete codes.  This loop is similar to the
            // loop above in incrementing huff for table indices.  It is assumed that
            // len is equal to curr + drop, so there is no loop needed to increment
            // through high index bits.  When the current sub-table is filled, the loop
            // drops back to the root table to fill in any remaining entries there.

            here = new code(64, (byte)(len - drop), 0);         // invalid code marker
            while (huff != 0)
            {
                // when done with sub-table, drop back to root table
                if (drop != 0 && (huff & mask) != low)
                {
                    drop      = 0;
                    len       = root;
                    next      = table_ind;
                    here.bits = (byte)len;
                }

                // put invalid code marker in table
                table[next + huff >> (int)drop] = here.Clone();

                // backwards increment the len-bit code huff
                incr = 1U << (int)(len - 1);
                while ((huff & incr) != 0)
                {
                    incr >>= 1;
                }
                if (incr != 0)
                {
                    huff &= incr - 1;
                    huff += incr;
                }
                else
                {
                    huff = 0;
                }
            }

            // set return parameters
            table_ind += (int)used;
            bits       = root;
            return(0);
        }
Esempio n. 2
0
		// ushort* lens -> ushort[] lens + int lens_ind
		// code** table -> code[] table + ref int table_ind
		private static int inflate_table(codetype type, ushort[] lens, int lens_ind, uint codes, code[] table, ref int table_ind, ref uint bits, ushort[] work)
		{
			uint len;				// a code's length in bits
			uint sym;				// index of code symbols
			uint min, max;			// minimum and maximum code lengths
			uint root;				// number of index bits for root table
			uint curr;				// number of index bits for current table
			uint drop;				// code bits to drop for sub-table
			int left;				// number of prefix codes available
			uint used;				// code entries in table used
			uint huff;				// Huffman code
			uint incr;				// for incrementing code, index
			uint fill;				// index for replicating entries
			uint low;				// low bits for current root entry
			uint mask;				// mask for low root bits
			code here;				// table entry for duplication
			int next;				// next available space in table
			ushort[] _base;			// base value table to use
			int base_ind;			// index in _base
			ushort[] extra;			// extra bits table to use
			int extra_ind;			// index in extra
			int end;				// use base and extra for symbol > end
			ushort[] count=new ushort[MAXBITS+1];	// number of codes of each length
			ushort[] offs=new ushort[MAXBITS+1];	// offsets in table for each length

			// Process a set of code lengths to create a canonical Huffman code.  The
			// code lengths are lens[0..codes-1].  Each length corresponds to the
			// symbols 0..codes-1.  The Huffman code is generated by first sorting the
			// symbols by length from short to long, and retaining the symbol order
			// for codes with equal lengths.  Then the code starts with all zero bits
			// for the first code of the shortest length, and the codes are integer
			// increments for the same length, and zeros are appended as the length
			// increases.  For the deflate format, these bits are stored backwards
			// from their more natural integer increment ordering, and so when the
			// decoding tables are built in the large loop below, the integer codes
			// are incremented backwards.

			// This routine assumes, but does not check, that all of the entries in
			// lens[] are in the range 0..MAXBITS.  The caller must assure this.
			// 1..MAXBITS is interpreted as that code length.  zero means that that
			// symbol does not occur in this code.

			// The codes are sorted by computing a count of codes for each length,
			// creating from that a table of starting indices for each length in the
			// sorted table, and then entering the symbols in order in the sorted
			// table.  The sorted table is work[], with that space being provided by
			// the caller.

			// The length counts are used for other purposes as well, i.e. finding
			// the minimum and maximum length codes, determining if there are any
			// codes at all, checking for a valid set of lengths, and looking ahead
			// at length counts to determine sub-table sizes when building the
			// decoding tables.

			// accumulate lengths for codes (assumes lens[] all in 0..MAXBITS)
			for(len=0; len<=MAXBITS; len++) count[len]=0;
			for(sym=0; sym<codes; sym++) count[lens[lens_ind+sym]]++;

			// bound code lengths, force root to be within code lengths
			root=bits;
			for(max=MAXBITS; max>=1; max--) if(count[max]!=0) break;
			if(root>max) root=max;

			if(max==0)
			{								// no symbols to code at all
				here=new code(64, 1, 0);	// invalid code marker
				table[table_ind++]=here.Clone();	// make a table to force an error
				table[table_ind++]=here.Clone();
				bits=1;
				return 0;					// no symbols, but wait for decoding to report error
			}

			for(min=1; min<max; min++) if(count[min]!=0) break;
			if(root<min) root=min;

			// check for an over-subscribed or incomplete set of lengths
			left=1;
			for(len=1; len<=MAXBITS; len++)
			{
				left<<=1;
				left-=count[len];
				if(left<0) return -1; // over-subscribed
			}
			if(left>0&&(type==codetype.CODES||max!=1)) return -1; // incomplete set

			// generate offsets into symbol table for each length for sorting
			offs[1]=0;
			for(len=1; len<MAXBITS; len++) offs[len+1]=(ushort)(offs[len]+count[len]);

			// sort symbols by length, by symbol order within each length
			for(sym=0; sym<codes; sym++)
				if(lens[lens_ind+sym]!=0) work[offs[lens[lens_ind+sym]]++]=(ushort)sym;

			// Create and fill in decoding tables. In this loop, the table being
			// filled is at next and has curr index bits. The code being used is huff
			// with length len. That code is converted to an index by dropping drop
			// bits off of the bottom. For codes where len is less than drop + curr,
			// those top drop + curr - len bits are incremented through all values to
			// fill the table with replicated entries.

			// root is the number of index bits for the root table. When len exceeds
			// root, sub-tables are created pointed to by the root entry with an index
			// of the low root bits of huff. This is saved in low to check for when a
			// new sub-table should be started. drop is zero when the root table is
			// being filled, and drop is root when sub-tables are being filled.

			// When a new sub-table is needed, it is necessary to look ahead in the
			// code lengths to determine what size sub-table is needed.  The length
			// counts are used for this, and so count[] is decremented as codes are
			// entered in the tables.

			// used keeps track of how many table entries have been allocated from the
			// provided *table space.  It is checked for LENS and DIST tables against
			// the constants ENOUGH_LENS and ENOUGH_DISTS to guard against changes in
			// the initial root table size constants. See the comments in inftrees.h
			// for more information.

			// sym increments through all symbols, and the loop terminates when
			// all codes of length max, i.e. all codes, have been processed. This
			// routine permits incomplete codes, so another loop after this one fills
			// in the rest of the decoding tables with invalid code markers.

			// set up for code type
			switch(type)
			{
				case codetype.CODES:
					base_ind=extra_ind=0;
					_base=extra=work;	// dummy value--not used
					end=19;
					break;
				case codetype.LENS:
					_base=lbase;
					base_ind=-257;
					extra=lext;
					extra_ind=-257;
					end=256;
					break;
				default:				// DISTS
					base_ind=extra_ind=0;
					_base=dbase;
					extra=dext;
					end=-1;
					break;
			}

			// initialize state for loop
			huff=0;				// starting code
			sym=0;				// starting code symbol
			len=min;			// starting code length
			next=table_ind;		// current table to fill in
			curr=root;			// current table index bits
			drop=0;				// current bits to drop from code for index
			low=uint.MaxValue;	// trigger new sub-table when len > root
			used=1U<<(int)root;	// use root table entries
			mask=used-1;		// mask for comparing low

			// check available table space
			if((type==codetype.LENS&&used>=ENOUGH_LENS)||(type==codetype.DISTS&&used>=ENOUGH_DISTS)) return 1;

			// process all codes and make table entries
			for(; ; )
			{
				// create table entry
				here=new code(0, (byte)(len-drop), 0);
				if((int)(work[sym])<end)
				{
					here.op=0;
					here.val=work[sym];
				}
				else if((int)(work[sym])>end)
				{
					here.op=(byte)(extra[extra_ind+work[sym]]);
					here.val=_base[base_ind+work[sym]];
				}
				else
				{
					here.op=32+64;		// end of block
					here.val=0;
				}

				// replicate for those indices with low len bits equal to huff
				incr=1U<<(int)(len-drop);
				fill=1U<<(int)curr;
				min=fill;				// save offset to next table
				do
				{
					fill-=incr;
					table[next+(huff>>(int)drop)+fill]=here.Clone();
				} while(fill!=0);

				// backwards increment the len-bit code huff
				incr=1U<<(int)(len-1);
				while((huff&incr)!=0) incr>>=1;

				if(incr!=0)
				{
					huff&=incr-1;
					huff+=incr;
				}
				else huff=0;

				// go to next symbol, update count, len
				sym++;
				if(--(count[len])==0)
				{
					if(len==max) break;
					len=lens[lens_ind+work[sym]];
				}

				// create new sub-table if needed
				if(len>root&&(huff&mask)!=low)
				{
					// if first time, transition to sub-tables
					if(drop==0) drop=root;

					// increment past last table
					next+=(int)min;			// here min is 1 << curr

					// determine length of next table
					curr=len-drop;
					left=1<<(int)curr;
					while(curr+drop<max)
					{
						left-=count[curr+drop];
						if(left<=0) break;
						curr++;
						left<<=1;
					}

					// check for enough space
					used+=1U<<(int)curr;
					if((type==codetype.LENS&&used>=ENOUGH_LENS)||(type==codetype.DISTS&&used>=ENOUGH_DISTS)) return 1;

					// point entry in root table to sub-table
					low=huff&mask;
					table[table_ind+low]=new code((byte)curr, (byte)root, (ushort)(next-table_ind));
				}
			}

			// Fill in rest of table for incomplete codes.  This loop is similar to the
			// loop above in incrementing huff for table indices.  It is assumed that
			// len is equal to curr + drop, so there is no loop needed to increment
			// through high index bits.  When the current sub-table is filled, the loop
			// drops back to the root table to fill in any remaining entries there.

			here=new code(64, (byte)(len-drop), 0); // invalid code marker
			while(huff!=0)
			{
				// when done with sub-table, drop back to root table
				if(drop!=0&&(huff&mask)!=low)
				{
					drop=0;
					len=root;
					next=table_ind;
					here.bits=(byte)len;
				}

				// put invalid code marker in table
				table[next+huff>>(int)drop]=here.Clone();

				// backwards increment the len-bit code huff
				incr=1U<<(int)(len-1);
				while((huff&incr)!=0) incr>>=1;
				if(incr!=0)
				{
					huff&=incr-1;
					huff+=incr;
				}
				else huff=0;
			}

			// set return parameters
			table_ind+=(int)used;
			bits=root;
			return 0;
		}
Esempio n. 3
0
        /*
         * Build a set of tables to decode the provided canonical Huffman code.
         * The code lengths are lens[0..codes-1].  The result starts at *table,
         * whose indices are 0..2^bits-1.  work is a writable array of at least
         * lens shorts, which is used as a work area.  type is the type of code
         * to be generated, CODES, LENS, or DISTS.  On return, zero is success,
         * -1 is an invalid code, and +1 means that ENOUGH isn't enough.  table
         * on return points to the next available entry's address.  bits is the
         * requested root table index bits, and on return it is the actual root
         * table index bits.  It will differ if the request is greater than the
         * longest code or if it is less than the shortest code.
         */
        internal static int inflate_table(
            codetype type,
            ushort[] lens_array,
            long lens_index,
            uint codes,
            code[] table_array,
            ref long table_index,
            ref uint bits,
            ushort[] work
            )
        {
            uint len;                      /* a code's length in bits */
            uint sym;                      /* index of code symbols */
            uint min, max;                 /* minimum and maximum code lengths */
            uint root;                     /* number of index bits for root table */
            uint curr;                     /* number of index bits for current table */
            uint drop;                     /* code bits to drop for sub-table */
            int  left;                     /* number of prefix codes available */
            uint used;                     /* code entries in table used */
            uint huff;                     /* Huffman code */
            uint incr;                     /* for incrementing code, index */
            uint fill;                     /* index for replicating entries */
            uint low;                      /* low bits for current root entry */
            uint mask;                     /* mask for low root bits */
            code here = new code();        /* table entry for duplication */
            long next;                     /* next available space in table */

            ushort[] @base;                /* base value table to use */
            ushort[] extra;                /* extra bits table to use */
            uint     match;                /* use base and extra for symbol >= match */
            int      MAXBITS = inftrees.MAXBITS;

            ushort[] count = new ushort[MAXBITS + 1];     /* number of codes of each length */
            ushort[] offs  = new ushort[MAXBITS + 1];     /* offsets in table for each length */
            /*static const*/
            ushort[] lbase = new ushort[31] {             /* Length codes 257..285 base */
                3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31,
                35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0
            };
            /*static const*/
            ushort[] lext = new ushort[31] {             /* Length codes 257..285 extra */
                16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18,
                19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 77, 202
            };
            /*static const*/
            ushort[] dbase = new ushort[32] {             /* Distance codes 0..29 base */
                1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193,
                257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145,
                8193, 12289, 16385, 24577, 0, 0
            };
            /*static const*/
            ushort[] dext = new ushort[32] {             /* Distance codes 0..29 extra */
                16, 16, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22,
                23, 23, 24, 24, 25, 25, 26, 26, 27, 27,
                28, 28, 29, 29, 64, 64
            };

            /*
             * Process a set of code lengths to create a canonical Huffman code.  The
             * code lengths are lens[0..codes-1].  Each length corresponds to the
             * symbols 0..codes-1.  The Huffman code is generated by first sorting the
             * symbols by length from short to long, and retaining the symbol order
             * for codes with equal lengths.  Then the code starts with all zero bits
             * for the first code of the shortest length, and the codes are integer
             * increments for the same length, and zeros are appended as the length
             * increases.  For the deflate format, these bits are stored backwards
             * from their more natural integer increment ordering, and so when the
             * decoding tables are built in the large loop below, the integer codes
             * are incremented backwards.
             *
             * This routine assumes, but does not check, that all of the entries in
             * lens[] are in the range 0..MAXBITS.  The caller must assure this.
             * 1..MAXBITS is interpreted as that code length.  zero means that that
             * symbol does not occur in this code.
             *
             * The codes are sorted by computing a count of codes for each length,
             * creating from that a table of starting indices for each length in the
             * sorted table, and then entering the symbols in order in the sorted
             * table.  The sorted table is work[], with that space being provided by
             * the caller.
             *
             * The length counts are used for other purposes as well, i.e. finding
             * the minimum and maximum length codes, determining if there are any
             * codes at all, checking for a valid set of lengths, and looking ahead
             * at length counts to determine sub-table sizes when building the
             * decoding tables.
             */

            /* accumulate lengths for codes (assumes lens[] all in 0..MAXBITS) */
            for (len = 0; len <= MAXBITS; len++)
            {
                count[len] = 0;
            }
            for (sym = 0; sym < codes; sym++)
            {
                count[lens_array[lens_index + sym]]++;
            }

            /* bound code lengths, force root to be within code lengths */
            root = bits;
            for (max = (uint)MAXBITS; max >= 1; max--)
            {
                if (count[max] != 0)
                {
                    break;
                }
            }
            if (root > max)
            {
                root = max;
            }
            if (max == 0)                                   /* no symbols to code at all */
            {
                here = new code(64, 1, 0);                  /* invalid code marker */
                table_array[table_index++] = here;          /* make a table to force an error */
                table_array[table_index++] = here;
                bits = 1;
                return(0);                    /* no symbols, but wait for decoding to report error */
            }
            for (min = 1; min < max; min++)
            {
                if (count[min] != 0)
                {
                    break;
                }
            }
            if (root < min)
            {
                root = min;
            }

            /* check for an over-subscribed or incomplete set of lengths */
            left = 1;
            for (len = 1; len <= MAXBITS; len++)
            {
                left <<= 1;
                left  -= count[len];
                if (left < 0)
                {
                    return(-1);                                 /* over-subscribed */
                }
            }
            codetype CODES = codetype.CODES;

            if (left > 0 && (type == CODES || max != 1))
            {
                return(-1);                                     /* incomplete set */
            }
            /* generate offsets into symbol table for each length for sorting */
            offs[1] = 0;
            for (len = 1; len < MAXBITS; len++)
            {
                offs[len + 1] = (ushort)(offs[len] + count[len]);
            }

            /* sort symbols by length, by symbol order within each length */
            for (sym = 0; sym < codes; sym++)
            {
                if (lens_array[lens_index + sym] != 0)
                {
                    work[offs[lens_array[lens_index + sym]]++] = (ushort)sym;
                }
            }

            /*
             * Create and fill in decoding tables.  In this loop, the table being
             * filled is at next and has curr index bits.  The code being used is huff
             * with length len.  That code is converted to an index by dropping drop
             * bits off of the bottom.  For codes where len is less than drop + curr,
             * those top drop + curr - len bits are incremented through all values to
             * fill the table with replicated entries.
             *
             * root is the number of index bits for the root table.  When len exceeds
             * root, sub-tables are created pointed to by the root entry with an index
             * of the low root bits of huff.  This is saved in low to check for when a
             * new sub-table should be started.  drop is zero when the root table is
             * being filled, and drop is root when sub-tables are being filled.
             *
             * When a new sub-table is needed, it is necessary to look ahead in the
             * code lengths to determine what size sub-table is needed.  The length
             * counts are used for this, and so count[] is decremented as codes are
             * entered in the tables.
             *
             * used keeps track of how many table entries have been allocated from the
             * provided *table space.  It is checked for LENS and DIST tables against
             * the constants ENOUGH_LENS and ENOUGH_DISTS to guard against changes in
             * the initial root table size constants.  See the comments in inftrees.h
             * for more information.
             *
             * sym increments through all symbols, and the loop terminates when
             * all codes of length max, i.e. all codes, have been processed.  This
             * routine permits incomplete codes, so another loop after this one fills
             * in the rest of the decoding tables with invalid code markers.
             */

            /* set up for code type */
            switch (type)
            {
            case codetype.CODES:
                @base = extra = work;                            /* dummy value--not used */
                match = 20;
                break;

            case codetype.LENS:
                @base = lbase;
                extra = lext;
                match = 257;
                break;

            default:                        /* DISTS */
                @base = dbase;
                extra = dext;
                match = 0;
                break;
            }

            /* initialize state for loop */
            huff = 0;                              /* starting code */
            sym  = 0;                              /* starting code symbol */
            len  = min;                            /* starting code length */
            next = table_index;                    /* current table to fill in */
            curr = root;                           /* current table index bits */
            drop = 0;                              /* current bits to drop from code for index */
            low  = uint.MaxValue;                  /* trigger new sub-table when len > root */
            used = 1U << ((int)root);              /* use root table entries */
            mask = used - 1;                       /* mask for comparing low */

            /* check available table space */
            if ((type == codetype.LENS && used > inftrees.ENOUGH_LENS) ||
                (type == codetype.DISTS && used > inftrees.ENOUGH_DISTS))
            {
                return(1);
            }

            /* process all codes and make table entries */
            for (; ;)
            {
                /* create table entry */
                byte   here_bits = (byte)(len - drop);
                byte   here_op;
                ushort here_val;
                if (work[sym] + 1U < match)
                {
                    here_op  = (byte)0;
                    here_val = work[sym];
                }
                else if (work[sym] >= match)
                {
                    here_op  = (byte)(extra[work[sym] - match]);
                    here_val = @base[work[sym] - match];
                }
                else
                {
                    here_op  = (byte)(32 + 64);                            /* end of block */
                    here_val = 0;
                }
                here = new code(here_op, here_bits, here_val);

                /* replicate for those indices with low len bits equal to huff */
                incr = 1U << (int)(len - drop);
                fill = 1U << (int)(curr);
                min  = fill;                                /* save offset to next table */
                do
                {
                    fill -= incr;
                    table_array[next + ((huff >> (int)drop) + fill)] = here;
                } while (fill != 0);

                /* backwards increment the len-bit code huff */
                incr = 1U << (int)(len - 1);
                while ((huff & incr) != 0)
                {
                    incr >>= 1;
                }
                if (incr != 0)
                {
                    huff &= incr - 1;
                    huff += incr;
                }
                else
                {
                    huff = 0;
                }

                /* go to next symbol, update count, len */
                sym++;
                if (--(count[len]) == 0)
                {
                    if (len == max)
                    {
                        break;
                    }
                    len = lens_array[lens_index + work[sym]];
                }

                /* create new sub-table if needed */
                if (len > root && (huff & mask) != low)
                {
                    /* if first time, transition to sub-tables */
                    if (drop == 0)
                    {
                        drop = root;
                    }

                    /* increment past last table */
                    next += min;                                /* here min is 1 << curr */

                    /* determine length of next table */
                    curr = len - drop;
                    left = (int)(1 << (int)curr);
                    while (curr + drop < max)
                    {
                        left -= count[curr + drop];
                        if (left <= 0)
                        {
                            break;
                        }
                        curr++;
                        left <<= 1;
                    }

                    /* check for enough space */
                    used += 1U << (int)curr;
                    if ((type == codetype.LENS && used > ENOUGH_LENS) ||
                        (type == codetype.DISTS && used > ENOUGH_DISTS))
                    {
                        return(1);
                    }

                    /* point entry in root table to sub-table */
                    low = huff & mask;
                    table_array[table_index + low] = new code((byte)curr, (byte)root, (ushort)(next - table_index));
                }
            }

            /* fill in remaining table entry if code is incomplete (guaranteed to have
             * at most one remaining entry, since if the code is incomplete, the
             * maximum code length that was allowed to get this far is one bit) */
            if (huff != 0)
            {
                here = new code(64, (byte)(len - drop), 0);                 /* invalid code marker */
                table_array[next + huff] = here;
            }

            /* set return parameters */
            table_index += used;
            bits         = root;
            return(0);
        }