github.com/andybalholm/brotli@v1.0.6/decode.go (about)

     1  package brotli
     2  
     3  /* Copyright 2013 Google Inc. All Rights Reserved.
     4  
     5     Distributed under MIT license.
     6     See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
     7  */
     8  
     9  const (
    10  	decoderResultError           = 0
    11  	decoderResultSuccess         = 1
    12  	decoderResultNeedsMoreInput  = 2
    13  	decoderResultNeedsMoreOutput = 3
    14  )
    15  
    16  /**
    17   * Error code for detailed logging / production debugging.
    18   *
    19   * See ::BrotliDecoderGetErrorCode and ::BROTLI_LAST_ERROR_CODE.
    20   */
    21  const (
    22  	decoderNoError                          = 0
    23  	decoderSuccess                          = 1
    24  	decoderNeedsMoreInput                   = 2
    25  	decoderNeedsMoreOutput                  = 3
    26  	decoderErrorFormatExuberantNibble       = -1
    27  	decoderErrorFormatReserved              = -2
    28  	decoderErrorFormatExuberantMetaNibble   = -3
    29  	decoderErrorFormatSimpleHuffmanAlphabet = -4
    30  	decoderErrorFormatSimpleHuffmanSame     = -5
    31  	decoderErrorFormatClSpace               = -6
    32  	decoderErrorFormatHuffmanSpace          = -7
    33  	decoderErrorFormatContextMapRepeat      = -8
    34  	decoderErrorFormatBlockLength1          = -9
    35  	decoderErrorFormatBlockLength2          = -10
    36  	decoderErrorFormatTransform             = -11
    37  	decoderErrorFormatDictionary            = -12
    38  	decoderErrorFormatWindowBits            = -13
    39  	decoderErrorFormatPadding1              = -14
    40  	decoderErrorFormatPadding2              = -15
    41  	decoderErrorFormatDistance              = -16
    42  	decoderErrorDictionaryNotSet            = -19
    43  	decoderErrorInvalidArguments            = -20
    44  	decoderErrorAllocContextModes           = -21
    45  	decoderErrorAllocTreeGroups             = -22
    46  	decoderErrorAllocContextMap             = -25
    47  	decoderErrorAllocRingBuffer1            = -26
    48  	decoderErrorAllocRingBuffer2            = -27
    49  	decoderErrorAllocBlockTypeTrees         = -30
    50  	decoderErrorUnreachable                 = -31
    51  )
    52  
    53  const huffmanTableBits = 8
    54  
    55  const huffmanTableMask = 0xFF
    56  
    57  /* We need the slack region for the following reasons:
    58     - doing up to two 16-byte copies for fast backward copying
    59     - inserting transformed dictionary word (5 prefix + 24 base + 8 suffix) */
    60  const kRingBufferWriteAheadSlack uint32 = 42
    61  
    62  var kCodeLengthCodeOrder = [codeLengthCodes]byte{1, 2, 3, 4, 0, 5, 17, 6, 16, 7, 8, 9, 10, 11, 12, 13, 14, 15}
    63  
    64  /* Static prefix code for the complex code length code lengths. */
    65  var kCodeLengthPrefixLength = [16]byte{2, 2, 2, 3, 2, 2, 2, 4, 2, 2, 2, 3, 2, 2, 2, 4}
    66  
    67  var kCodeLengthPrefixValue = [16]byte{0, 4, 3, 2, 0, 4, 3, 1, 0, 4, 3, 2, 0, 4, 3, 5}
    68  
    69  /* Saves error code and converts it to BrotliDecoderResult. */
    70  func saveErrorCode(s *Reader, e int) int {
    71  	s.error_code = int(e)
    72  	switch e {
    73  	case decoderSuccess:
    74  		return decoderResultSuccess
    75  
    76  	case decoderNeedsMoreInput:
    77  		return decoderResultNeedsMoreInput
    78  
    79  	case decoderNeedsMoreOutput:
    80  		return decoderResultNeedsMoreOutput
    81  
    82  	default:
    83  		return decoderResultError
    84  	}
    85  }
    86  
    87  /* Decodes WBITS by reading 1 - 7 bits, or 0x11 for "Large Window Brotli".
    88     Precondition: bit-reader accumulator has at least 8 bits. */
    89  func decodeWindowBits(s *Reader, br *bitReader) int {
    90  	var n uint32
    91  	var large_window bool = s.large_window
    92  	s.large_window = false
    93  	takeBits(br, 1, &n)
    94  	if n == 0 {
    95  		s.window_bits = 16
    96  		return decoderSuccess
    97  	}
    98  
    99  	takeBits(br, 3, &n)
   100  	if n != 0 {
   101  		s.window_bits = 17 + n
   102  		return decoderSuccess
   103  	}
   104  
   105  	takeBits(br, 3, &n)
   106  	if n == 1 {
   107  		if large_window {
   108  			takeBits(br, 1, &n)
   109  			if n == 1 {
   110  				return decoderErrorFormatWindowBits
   111  			}
   112  
   113  			s.large_window = true
   114  			return decoderSuccess
   115  		} else {
   116  			return decoderErrorFormatWindowBits
   117  		}
   118  	}
   119  
   120  	if n != 0 {
   121  		s.window_bits = 8 + n
   122  		return decoderSuccess
   123  	}
   124  
   125  	s.window_bits = 17
   126  	return decoderSuccess
   127  }
   128  
   129  /* Decodes a number in the range [0..255], by reading 1 - 11 bits. */
   130  func decodeVarLenUint8(s *Reader, br *bitReader, value *uint32) int {
   131  	var bits uint32
   132  	switch s.substate_decode_uint8 {
   133  	case stateDecodeUint8None:
   134  		if !safeReadBits(br, 1, &bits) {
   135  			return decoderNeedsMoreInput
   136  		}
   137  
   138  		if bits == 0 {
   139  			*value = 0
   140  			return decoderSuccess
   141  		}
   142  		fallthrough
   143  
   144  		/* Fall through. */
   145  	case stateDecodeUint8Short:
   146  		if !safeReadBits(br, 3, &bits) {
   147  			s.substate_decode_uint8 = stateDecodeUint8Short
   148  			return decoderNeedsMoreInput
   149  		}
   150  
   151  		if bits == 0 {
   152  			*value = 1
   153  			s.substate_decode_uint8 = stateDecodeUint8None
   154  			return decoderSuccess
   155  		}
   156  
   157  		/* Use output value as a temporary storage. It MUST be persisted. */
   158  		*value = bits
   159  		fallthrough
   160  
   161  		/* Fall through. */
   162  	case stateDecodeUint8Long:
   163  		if !safeReadBits(br, *value, &bits) {
   164  			s.substate_decode_uint8 = stateDecodeUint8Long
   165  			return decoderNeedsMoreInput
   166  		}
   167  
   168  		*value = (1 << *value) + bits
   169  		s.substate_decode_uint8 = stateDecodeUint8None
   170  		return decoderSuccess
   171  
   172  	default:
   173  		return decoderErrorUnreachable
   174  	}
   175  }
   176  
   177  /* Decodes a metablock length and flags by reading 2 - 31 bits. */
   178  func decodeMetaBlockLength(s *Reader, br *bitReader) int {
   179  	var bits uint32
   180  	var i int
   181  	for {
   182  		switch s.substate_metablock_header {
   183  		case stateMetablockHeaderNone:
   184  			if !safeReadBits(br, 1, &bits) {
   185  				return decoderNeedsMoreInput
   186  			}
   187  
   188  			if bits != 0 {
   189  				s.is_last_metablock = 1
   190  			} else {
   191  				s.is_last_metablock = 0
   192  			}
   193  			s.meta_block_remaining_len = 0
   194  			s.is_uncompressed = 0
   195  			s.is_metadata = 0
   196  			if s.is_last_metablock == 0 {
   197  				s.substate_metablock_header = stateMetablockHeaderNibbles
   198  				break
   199  			}
   200  
   201  			s.substate_metablock_header = stateMetablockHeaderEmpty
   202  			fallthrough
   203  
   204  			/* Fall through. */
   205  		case stateMetablockHeaderEmpty:
   206  			if !safeReadBits(br, 1, &bits) {
   207  				return decoderNeedsMoreInput
   208  			}
   209  
   210  			if bits != 0 {
   211  				s.substate_metablock_header = stateMetablockHeaderNone
   212  				return decoderSuccess
   213  			}
   214  
   215  			s.substate_metablock_header = stateMetablockHeaderNibbles
   216  			fallthrough
   217  
   218  			/* Fall through. */
   219  		case stateMetablockHeaderNibbles:
   220  			if !safeReadBits(br, 2, &bits) {
   221  				return decoderNeedsMoreInput
   222  			}
   223  
   224  			s.size_nibbles = uint(byte(bits + 4))
   225  			s.loop_counter = 0
   226  			if bits == 3 {
   227  				s.is_metadata = 1
   228  				s.substate_metablock_header = stateMetablockHeaderReserved
   229  				break
   230  			}
   231  
   232  			s.substate_metablock_header = stateMetablockHeaderSize
   233  			fallthrough
   234  
   235  			/* Fall through. */
   236  		case stateMetablockHeaderSize:
   237  			i = s.loop_counter
   238  
   239  			for ; i < int(s.size_nibbles); i++ {
   240  				if !safeReadBits(br, 4, &bits) {
   241  					s.loop_counter = i
   242  					return decoderNeedsMoreInput
   243  				}
   244  
   245  				if uint(i+1) == s.size_nibbles && s.size_nibbles > 4 && bits == 0 {
   246  					return decoderErrorFormatExuberantNibble
   247  				}
   248  
   249  				s.meta_block_remaining_len |= int(bits << uint(i*4))
   250  			}
   251  
   252  			s.substate_metablock_header = stateMetablockHeaderUncompressed
   253  			fallthrough
   254  
   255  			/* Fall through. */
   256  		case stateMetablockHeaderUncompressed:
   257  			if s.is_last_metablock == 0 {
   258  				if !safeReadBits(br, 1, &bits) {
   259  					return decoderNeedsMoreInput
   260  				}
   261  
   262  				if bits != 0 {
   263  					s.is_uncompressed = 1
   264  				} else {
   265  					s.is_uncompressed = 0
   266  				}
   267  			}
   268  
   269  			s.meta_block_remaining_len++
   270  			s.substate_metablock_header = stateMetablockHeaderNone
   271  			return decoderSuccess
   272  
   273  		case stateMetablockHeaderReserved:
   274  			if !safeReadBits(br, 1, &bits) {
   275  				return decoderNeedsMoreInput
   276  			}
   277  
   278  			if bits != 0 {
   279  				return decoderErrorFormatReserved
   280  			}
   281  
   282  			s.substate_metablock_header = stateMetablockHeaderBytes
   283  			fallthrough
   284  
   285  			/* Fall through. */
   286  		case stateMetablockHeaderBytes:
   287  			if !safeReadBits(br, 2, &bits) {
   288  				return decoderNeedsMoreInput
   289  			}
   290  
   291  			if bits == 0 {
   292  				s.substate_metablock_header = stateMetablockHeaderNone
   293  				return decoderSuccess
   294  			}
   295  
   296  			s.size_nibbles = uint(byte(bits))
   297  			s.substate_metablock_header = stateMetablockHeaderMetadata
   298  			fallthrough
   299  
   300  			/* Fall through. */
   301  		case stateMetablockHeaderMetadata:
   302  			i = s.loop_counter
   303  
   304  			for ; i < int(s.size_nibbles); i++ {
   305  				if !safeReadBits(br, 8, &bits) {
   306  					s.loop_counter = i
   307  					return decoderNeedsMoreInput
   308  				}
   309  
   310  				if uint(i+1) == s.size_nibbles && s.size_nibbles > 1 && bits == 0 {
   311  					return decoderErrorFormatExuberantMetaNibble
   312  				}
   313  
   314  				s.meta_block_remaining_len |= int(bits << uint(i*8))
   315  			}
   316  
   317  			s.meta_block_remaining_len++
   318  			s.substate_metablock_header = stateMetablockHeaderNone
   319  			return decoderSuccess
   320  
   321  		default:
   322  			return decoderErrorUnreachable
   323  		}
   324  	}
   325  }
   326  
   327  /* Decodes the Huffman code.
   328     This method doesn't read data from the bit reader, BUT drops the amount of
   329     bits that correspond to the decoded symbol.
   330     bits MUST contain at least 15 (BROTLI_HUFFMAN_MAX_CODE_LENGTH) valid bits. */
   331  func decodeSymbol(bits uint32, table []huffmanCode, br *bitReader) uint32 {
   332  	table = table[bits&huffmanTableMask:]
   333  	if table[0].bits > huffmanTableBits {
   334  		var nbits uint32 = uint32(table[0].bits) - huffmanTableBits
   335  		dropBits(br, huffmanTableBits)
   336  		table = table[uint32(table[0].value)+((bits>>huffmanTableBits)&bitMask(nbits)):]
   337  	}
   338  
   339  	dropBits(br, uint32(table[0].bits))
   340  	return uint32(table[0].value)
   341  }
   342  
   343  /* Reads and decodes the next Huffman code from bit-stream.
   344     This method peeks 16 bits of input and drops 0 - 15 of them. */
   345  func readSymbol(table []huffmanCode, br *bitReader) uint32 {
   346  	return decodeSymbol(get16BitsUnmasked(br), table, br)
   347  }
   348  
   349  /* Same as DecodeSymbol, but it is known that there is less than 15 bits of
   350     input are currently available. */
   351  func safeDecodeSymbol(table []huffmanCode, br *bitReader, result *uint32) bool {
   352  	var val uint32
   353  	var available_bits uint32 = getAvailableBits(br)
   354  	if available_bits == 0 {
   355  		if table[0].bits == 0 {
   356  			*result = uint32(table[0].value)
   357  			return true
   358  		}
   359  
   360  		return false /* No valid bits at all. */
   361  	}
   362  
   363  	val = uint32(getBitsUnmasked(br))
   364  	table = table[val&huffmanTableMask:]
   365  	if table[0].bits <= huffmanTableBits {
   366  		if uint32(table[0].bits) <= available_bits {
   367  			dropBits(br, uint32(table[0].bits))
   368  			*result = uint32(table[0].value)
   369  			return true
   370  		} else {
   371  			return false /* Not enough bits for the first level. */
   372  		}
   373  	}
   374  
   375  	if available_bits <= huffmanTableBits {
   376  		return false /* Not enough bits to move to the second level. */
   377  	}
   378  
   379  	/* Speculatively drop HUFFMAN_TABLE_BITS. */
   380  	val = (val & bitMask(uint32(table[0].bits))) >> huffmanTableBits
   381  
   382  	available_bits -= huffmanTableBits
   383  	table = table[uint32(table[0].value)+val:]
   384  	if available_bits < uint32(table[0].bits) {
   385  		return false /* Not enough bits for the second level. */
   386  	}
   387  
   388  	dropBits(br, huffmanTableBits+uint32(table[0].bits))
   389  	*result = uint32(table[0].value)
   390  	return true
   391  }
   392  
   393  func safeReadSymbol(table []huffmanCode, br *bitReader, result *uint32) bool {
   394  	var val uint32
   395  	if safeGetBits(br, 15, &val) {
   396  		*result = decodeSymbol(val, table, br)
   397  		return true
   398  	}
   399  
   400  	return safeDecodeSymbol(table, br, result)
   401  }
   402  
   403  /* Makes a look-up in first level Huffman table. Peeks 8 bits. */
   404  func preloadSymbol(safe int, table []huffmanCode, br *bitReader, bits *uint32, value *uint32) {
   405  	if safe != 0 {
   406  		return
   407  	}
   408  
   409  	table = table[getBits(br, huffmanTableBits):]
   410  	*bits = uint32(table[0].bits)
   411  	*value = uint32(table[0].value)
   412  }
   413  
   414  /* Decodes the next Huffman code using data prepared by PreloadSymbol.
   415     Reads 0 - 15 bits. Also peeks 8 following bits. */
   416  func readPreloadedSymbol(table []huffmanCode, br *bitReader, bits *uint32, value *uint32) uint32 {
   417  	var result uint32 = *value
   418  	var ext []huffmanCode
   419  	if *bits > huffmanTableBits {
   420  		var val uint32 = get16BitsUnmasked(br)
   421  		ext = table[val&huffmanTableMask:][*value:]
   422  		var mask uint32 = bitMask((*bits - huffmanTableBits))
   423  		dropBits(br, huffmanTableBits)
   424  		ext = ext[(val>>huffmanTableBits)&mask:]
   425  		dropBits(br, uint32(ext[0].bits))
   426  		result = uint32(ext[0].value)
   427  	} else {
   428  		dropBits(br, *bits)
   429  	}
   430  
   431  	preloadSymbol(0, table, br, bits, value)
   432  	return result
   433  }
   434  
   435  func log2Floor(x uint32) uint32 {
   436  	var result uint32 = 0
   437  	for x != 0 {
   438  		x >>= 1
   439  		result++
   440  	}
   441  
   442  	return result
   443  }
   444  
   445  /* Reads (s->symbol + 1) symbols.
   446     Totally 1..4 symbols are read, 1..11 bits each.
   447     The list of symbols MUST NOT contain duplicates. */
   448  func readSimpleHuffmanSymbols(alphabet_size uint32, max_symbol uint32, s *Reader) int {
   449  	var br *bitReader = &s.br
   450  	var max_bits uint32 = log2Floor(alphabet_size - 1)
   451  	var i uint32 = s.sub_loop_counter
   452  	/* max_bits == 1..11; symbol == 0..3; 1..44 bits will be read. */
   453  
   454  	var num_symbols uint32 = s.symbol
   455  	for i <= num_symbols {
   456  		var v uint32
   457  		if !safeReadBits(br, max_bits, &v) {
   458  			s.sub_loop_counter = i
   459  			s.substate_huffman = stateHuffmanSimpleRead
   460  			return decoderNeedsMoreInput
   461  		}
   462  
   463  		if v >= max_symbol {
   464  			return decoderErrorFormatSimpleHuffmanAlphabet
   465  		}
   466  
   467  		s.symbols_lists_array[i] = uint16(v)
   468  		i++
   469  	}
   470  
   471  	for i = 0; i < num_symbols; i++ {
   472  		var k uint32 = i + 1
   473  		for ; k <= num_symbols; k++ {
   474  			if s.symbols_lists_array[i] == s.symbols_lists_array[k] {
   475  				return decoderErrorFormatSimpleHuffmanSame
   476  			}
   477  		}
   478  	}
   479  
   480  	return decoderSuccess
   481  }
   482  
   483  /* Process single decoded symbol code length:
   484     A) reset the repeat variable
   485     B) remember code length (if it is not 0)
   486     C) extend corresponding index-chain
   487     D) reduce the Huffman space
   488     E) update the histogram */
   489  func processSingleCodeLength(code_len uint32, symbol *uint32, repeat *uint32, space *uint32, prev_code_len *uint32, symbol_lists symbolList, code_length_histo []uint16, next_symbol []int) {
   490  	*repeat = 0
   491  	if code_len != 0 { /* code_len == 1..15 */
   492  		symbolListPut(symbol_lists, next_symbol[code_len], uint16(*symbol))
   493  		next_symbol[code_len] = int(*symbol)
   494  		*prev_code_len = code_len
   495  		*space -= 32768 >> code_len
   496  		code_length_histo[code_len]++
   497  	}
   498  
   499  	(*symbol)++
   500  }
   501  
   502  /* Process repeated symbol code length.
   503      A) Check if it is the extension of previous repeat sequence; if the decoded
   504         value is not BROTLI_REPEAT_PREVIOUS_CODE_LENGTH, then it is a new
   505         symbol-skip
   506      B) Update repeat variable
   507      C) Check if operation is feasible (fits alphabet)
   508      D) For each symbol do the same operations as in ProcessSingleCodeLength
   509  
   510     PRECONDITION: code_len == BROTLI_REPEAT_PREVIOUS_CODE_LENGTH or
   511                   code_len == BROTLI_REPEAT_ZERO_CODE_LENGTH */
   512  func processRepeatedCodeLength(code_len uint32, repeat_delta uint32, alphabet_size uint32, symbol *uint32, repeat *uint32, space *uint32, prev_code_len *uint32, repeat_code_len *uint32, symbol_lists symbolList, code_length_histo []uint16, next_symbol []int) {
   513  	var old_repeat uint32 /* for BROTLI_REPEAT_ZERO_CODE_LENGTH */ /* for BROTLI_REPEAT_ZERO_CODE_LENGTH */
   514  	var extra_bits uint32 = 3
   515  	var new_len uint32 = 0
   516  	if code_len == repeatPreviousCodeLength {
   517  		new_len = *prev_code_len
   518  		extra_bits = 2
   519  	}
   520  
   521  	if *repeat_code_len != new_len {
   522  		*repeat = 0
   523  		*repeat_code_len = new_len
   524  	}
   525  
   526  	old_repeat = *repeat
   527  	if *repeat > 0 {
   528  		*repeat -= 2
   529  		*repeat <<= extra_bits
   530  	}
   531  
   532  	*repeat += repeat_delta + 3
   533  	repeat_delta = *repeat - old_repeat
   534  	if *symbol+repeat_delta > alphabet_size {
   535  		*symbol = alphabet_size
   536  		*space = 0xFFFFF
   537  		return
   538  	}
   539  
   540  	if *repeat_code_len != 0 {
   541  		var last uint = uint(*symbol + repeat_delta)
   542  		var next int = next_symbol[*repeat_code_len]
   543  		for {
   544  			symbolListPut(symbol_lists, next, uint16(*symbol))
   545  			next = int(*symbol)
   546  			(*symbol)++
   547  			if (*symbol) == uint32(last) {
   548  				break
   549  			}
   550  		}
   551  
   552  		next_symbol[*repeat_code_len] = next
   553  		*space -= repeat_delta << (15 - *repeat_code_len)
   554  		code_length_histo[*repeat_code_len] = uint16(uint32(code_length_histo[*repeat_code_len]) + repeat_delta)
   555  	} else {
   556  		*symbol += repeat_delta
   557  	}
   558  }
   559  
   560  /* Reads and decodes symbol codelengths. */
   561  func readSymbolCodeLengths(alphabet_size uint32, s *Reader) int {
   562  	var br *bitReader = &s.br
   563  	var symbol uint32 = s.symbol
   564  	var repeat uint32 = s.repeat
   565  	var space uint32 = s.space
   566  	var prev_code_len uint32 = s.prev_code_len
   567  	var repeat_code_len uint32 = s.repeat_code_len
   568  	var symbol_lists symbolList = s.symbol_lists
   569  	var code_length_histo []uint16 = s.code_length_histo[:]
   570  	var next_symbol []int = s.next_symbol[:]
   571  	if !warmupBitReader(br) {
   572  		return decoderNeedsMoreInput
   573  	}
   574  	var p []huffmanCode
   575  	for symbol < alphabet_size && space > 0 {
   576  		p = s.table[:]
   577  		var code_len uint32
   578  		if !checkInputAmount(br, shortFillBitWindowRead) {
   579  			s.symbol = symbol
   580  			s.repeat = repeat
   581  			s.prev_code_len = prev_code_len
   582  			s.repeat_code_len = repeat_code_len
   583  			s.space = space
   584  			return decoderNeedsMoreInput
   585  		}
   586  
   587  		fillBitWindow16(br)
   588  		p = p[getBitsUnmasked(br)&uint64(bitMask(huffmanMaxCodeLengthCodeLength)):]
   589  		dropBits(br, uint32(p[0].bits)) /* Use 1..5 bits. */
   590  		code_len = uint32(p[0].value)   /* code_len == 0..17 */
   591  		if code_len < repeatPreviousCodeLength {
   592  			processSingleCodeLength(code_len, &symbol, &repeat, &space, &prev_code_len, symbol_lists, code_length_histo, next_symbol) /* code_len == 16..17, extra_bits == 2..3 */
   593  		} else {
   594  			var extra_bits uint32
   595  			if code_len == repeatPreviousCodeLength {
   596  				extra_bits = 2
   597  			} else {
   598  				extra_bits = 3
   599  			}
   600  			var repeat_delta uint32 = uint32(getBitsUnmasked(br)) & bitMask(extra_bits)
   601  			dropBits(br, extra_bits)
   602  			processRepeatedCodeLength(code_len, repeat_delta, alphabet_size, &symbol, &repeat, &space, &prev_code_len, &repeat_code_len, symbol_lists, code_length_histo, next_symbol)
   603  		}
   604  	}
   605  
   606  	s.space = space
   607  	return decoderSuccess
   608  }
   609  
   610  func safeReadSymbolCodeLengths(alphabet_size uint32, s *Reader) int {
   611  	var br *bitReader = &s.br
   612  	var get_byte bool = false
   613  	var p []huffmanCode
   614  	for s.symbol < alphabet_size && s.space > 0 {
   615  		p = s.table[:]
   616  		var code_len uint32
   617  		var available_bits uint32
   618  		var bits uint32 = 0
   619  		if get_byte && !pullByte(br) {
   620  			return decoderNeedsMoreInput
   621  		}
   622  		get_byte = false
   623  		available_bits = getAvailableBits(br)
   624  		if available_bits != 0 {
   625  			bits = uint32(getBitsUnmasked(br))
   626  		}
   627  
   628  		p = p[bits&bitMask(huffmanMaxCodeLengthCodeLength):]
   629  		if uint32(p[0].bits) > available_bits {
   630  			get_byte = true
   631  			continue
   632  		}
   633  
   634  		code_len = uint32(p[0].value) /* code_len == 0..17 */
   635  		if code_len < repeatPreviousCodeLength {
   636  			dropBits(br, uint32(p[0].bits))
   637  			processSingleCodeLength(code_len, &s.symbol, &s.repeat, &s.space, &s.prev_code_len, s.symbol_lists, s.code_length_histo[:], s.next_symbol[:]) /* code_len == 16..17, extra_bits == 2..3 */
   638  		} else {
   639  			var extra_bits uint32 = code_len - 14
   640  			var repeat_delta uint32 = (bits >> p[0].bits) & bitMask(extra_bits)
   641  			if available_bits < uint32(p[0].bits)+extra_bits {
   642  				get_byte = true
   643  				continue
   644  			}
   645  
   646  			dropBits(br, uint32(p[0].bits)+extra_bits)
   647  			processRepeatedCodeLength(code_len, repeat_delta, alphabet_size, &s.symbol, &s.repeat, &s.space, &s.prev_code_len, &s.repeat_code_len, s.symbol_lists, s.code_length_histo[:], s.next_symbol[:])
   648  		}
   649  	}
   650  
   651  	return decoderSuccess
   652  }
   653  
   654  /* Reads and decodes 15..18 codes using static prefix code.
   655     Each code is 2..4 bits long. In total 30..72 bits are used. */
   656  func readCodeLengthCodeLengths(s *Reader) int {
   657  	var br *bitReader = &s.br
   658  	var num_codes uint32 = s.repeat
   659  	var space uint32 = s.space
   660  	var i uint32 = s.sub_loop_counter
   661  	for ; i < codeLengthCodes; i++ {
   662  		var code_len_idx byte = kCodeLengthCodeOrder[i]
   663  		var ix uint32
   664  		var v uint32
   665  		if !safeGetBits(br, 4, &ix) {
   666  			var available_bits uint32 = getAvailableBits(br)
   667  			if available_bits != 0 {
   668  				ix = uint32(getBitsUnmasked(br) & 0xF)
   669  			} else {
   670  				ix = 0
   671  			}
   672  
   673  			if uint32(kCodeLengthPrefixLength[ix]) > available_bits {
   674  				s.sub_loop_counter = i
   675  				s.repeat = num_codes
   676  				s.space = space
   677  				s.substate_huffman = stateHuffmanComplex
   678  				return decoderNeedsMoreInput
   679  			}
   680  		}
   681  
   682  		v = uint32(kCodeLengthPrefixValue[ix])
   683  		dropBits(br, uint32(kCodeLengthPrefixLength[ix]))
   684  		s.code_length_code_lengths[code_len_idx] = byte(v)
   685  		if v != 0 {
   686  			space = space - (32 >> v)
   687  			num_codes++
   688  			s.code_length_histo[v]++
   689  			if space-1 >= 32 {
   690  				/* space is 0 or wrapped around. */
   691  				break
   692  			}
   693  		}
   694  	}
   695  
   696  	if num_codes != 1 && space != 0 {
   697  		return decoderErrorFormatClSpace
   698  	}
   699  
   700  	return decoderSuccess
   701  }
   702  
   703  /* Decodes the Huffman tables.
   704     There are 2 scenarios:
   705      A) Huffman code contains only few symbols (1..4). Those symbols are read
   706         directly; their code lengths are defined by the number of symbols.
   707         For this scenario 4 - 49 bits will be read.
   708  
   709      B) 2-phase decoding:
   710      B.1) Small Huffman table is decoded; it is specified with code lengths
   711           encoded with predefined entropy code. 32 - 74 bits are used.
   712      B.2) Decoded table is used to decode code lengths of symbols in resulting
   713           Huffman table. In worst case 3520 bits are read. */
   714  func readHuffmanCode(alphabet_size uint32, max_symbol uint32, table []huffmanCode, opt_table_size *uint32, s *Reader) int {
   715  	var br *bitReader = &s.br
   716  
   717  	/* Unnecessary masking, but might be good for safety. */
   718  	alphabet_size &= 0x7FF
   719  
   720  	/* State machine. */
   721  	for {
   722  		switch s.substate_huffman {
   723  		case stateHuffmanNone:
   724  			if !safeReadBits(br, 2, &s.sub_loop_counter) {
   725  				return decoderNeedsMoreInput
   726  			}
   727  
   728  			/* The value is used as follows:
   729  			   1 for simple code;
   730  			   0 for no skipping, 2 skips 2 code lengths, 3 skips 3 code lengths */
   731  			if s.sub_loop_counter != 1 {
   732  				s.space = 32
   733  				s.repeat = 0 /* num_codes */
   734  				var i int
   735  				for i = 0; i <= huffmanMaxCodeLengthCodeLength; i++ {
   736  					s.code_length_histo[i] = 0
   737  				}
   738  
   739  				for i = 0; i < codeLengthCodes; i++ {
   740  					s.code_length_code_lengths[i] = 0
   741  				}
   742  
   743  				s.substate_huffman = stateHuffmanComplex
   744  				continue
   745  			}
   746  			fallthrough
   747  
   748  			/* Read symbols, codes & code lengths directly. */
   749  		case stateHuffmanSimpleSize:
   750  			if !safeReadBits(br, 2, &s.symbol) { /* num_symbols */
   751  				s.substate_huffman = stateHuffmanSimpleSize
   752  				return decoderNeedsMoreInput
   753  			}
   754  
   755  			s.sub_loop_counter = 0
   756  			fallthrough
   757  
   758  		case stateHuffmanSimpleRead:
   759  			{
   760  				var result int = readSimpleHuffmanSymbols(alphabet_size, max_symbol, s)
   761  				if result != decoderSuccess {
   762  					return result
   763  				}
   764  			}
   765  			fallthrough
   766  
   767  		case stateHuffmanSimpleBuild:
   768  			var table_size uint32
   769  			if s.symbol == 3 {
   770  				var bits uint32
   771  				if !safeReadBits(br, 1, &bits) {
   772  					s.substate_huffman = stateHuffmanSimpleBuild
   773  					return decoderNeedsMoreInput
   774  				}
   775  
   776  				s.symbol += bits
   777  			}
   778  
   779  			table_size = buildSimpleHuffmanTable(table, huffmanTableBits, s.symbols_lists_array[:], s.symbol)
   780  			if opt_table_size != nil {
   781  				*opt_table_size = table_size
   782  			}
   783  
   784  			s.substate_huffman = stateHuffmanNone
   785  			return decoderSuccess
   786  
   787  			/* Decode Huffman-coded code lengths. */
   788  		case stateHuffmanComplex:
   789  			{
   790  				var i uint32
   791  				var result int = readCodeLengthCodeLengths(s)
   792  				if result != decoderSuccess {
   793  					return result
   794  				}
   795  
   796  				buildCodeLengthsHuffmanTable(s.table[:], s.code_length_code_lengths[:], s.code_length_histo[:])
   797  				for i = 0; i < 16; i++ {
   798  					s.code_length_histo[i] = 0
   799  				}
   800  
   801  				for i = 0; i <= huffmanMaxCodeLength; i++ {
   802  					s.next_symbol[i] = int(i) - (huffmanMaxCodeLength + 1)
   803  					symbolListPut(s.symbol_lists, s.next_symbol[i], 0xFFFF)
   804  				}
   805  
   806  				s.symbol = 0
   807  				s.prev_code_len = initialRepeatedCodeLength
   808  				s.repeat = 0
   809  				s.repeat_code_len = 0
   810  				s.space = 32768
   811  				s.substate_huffman = stateHuffmanLengthSymbols
   812  			}
   813  			fallthrough
   814  
   815  		case stateHuffmanLengthSymbols:
   816  			var table_size uint32
   817  			var result int = readSymbolCodeLengths(max_symbol, s)
   818  			if result == decoderNeedsMoreInput {
   819  				result = safeReadSymbolCodeLengths(max_symbol, s)
   820  			}
   821  
   822  			if result != decoderSuccess {
   823  				return result
   824  			}
   825  
   826  			if s.space != 0 {
   827  				return decoderErrorFormatHuffmanSpace
   828  			}
   829  
   830  			table_size = buildHuffmanTable(table, huffmanTableBits, s.symbol_lists, s.code_length_histo[:])
   831  			if opt_table_size != nil {
   832  				*opt_table_size = table_size
   833  			}
   834  
   835  			s.substate_huffman = stateHuffmanNone
   836  			return decoderSuccess
   837  
   838  		default:
   839  			return decoderErrorUnreachable
   840  		}
   841  	}
   842  }
   843  
   844  /* Decodes a block length by reading 3..39 bits. */
   845  func readBlockLength(table []huffmanCode, br *bitReader) uint32 {
   846  	var code uint32
   847  	var nbits uint32
   848  	code = readSymbol(table, br)
   849  	nbits = kBlockLengthPrefixCode[code].nbits /* nbits == 2..24 */
   850  	return kBlockLengthPrefixCode[code].offset + readBits(br, nbits)
   851  }
   852  
   853  /* WARNING: if state is not BROTLI_STATE_READ_BLOCK_LENGTH_NONE, then
   854     reading can't be continued with ReadBlockLength. */
   855  func safeReadBlockLength(s *Reader, result *uint32, table []huffmanCode, br *bitReader) bool {
   856  	var index uint32
   857  	if s.substate_read_block_length == stateReadBlockLengthNone {
   858  		if !safeReadSymbol(table, br, &index) {
   859  			return false
   860  		}
   861  	} else {
   862  		index = s.block_length_index
   863  	}
   864  	{
   865  		var bits uint32 /* nbits == 2..24 */
   866  		var nbits uint32 = kBlockLengthPrefixCode[index].nbits
   867  		if !safeReadBits(br, nbits, &bits) {
   868  			s.block_length_index = index
   869  			s.substate_read_block_length = stateReadBlockLengthSuffix
   870  			return false
   871  		}
   872  
   873  		*result = kBlockLengthPrefixCode[index].offset + bits
   874  		s.substate_read_block_length = stateReadBlockLengthNone
   875  		return true
   876  	}
   877  }
   878  
   879  /* Transform:
   880      1) initialize list L with values 0, 1,... 255
   881      2) For each input element X:
   882      2.1) let Y = L[X]
   883      2.2) remove X-th element from L
   884      2.3) prepend Y to L
   885      2.4) append Y to output
   886  
   887     In most cases max(Y) <= 7, so most of L remains intact.
   888     To reduce the cost of initialization, we reuse L, remember the upper bound
   889     of Y values, and reinitialize only first elements in L.
   890  
   891     Most of input values are 0 and 1. To reduce number of branches, we replace
   892     inner for loop with do-while. */
   893  func inverseMoveToFrontTransform(v []byte, v_len uint32, state *Reader) {
   894  	var mtf [256]byte
   895  	var i int
   896  	for i = 1; i < 256; i++ {
   897  		mtf[i] = byte(i)
   898  	}
   899  	var mtf_1 byte
   900  
   901  	/* Transform the input. */
   902  	for i = 0; uint32(i) < v_len; i++ {
   903  		var index int = int(v[i])
   904  		var value byte = mtf[index]
   905  		v[i] = value
   906  		mtf_1 = value
   907  		for index >= 1 {
   908  			index--
   909  			mtf[index+1] = mtf[index]
   910  		}
   911  
   912  		mtf[0] = mtf_1
   913  	}
   914  }
   915  
   916  /* Decodes a series of Huffman table using ReadHuffmanCode function. */
   917  func huffmanTreeGroupDecode(group *huffmanTreeGroup, s *Reader) int {
   918  	if s.substate_tree_group != stateTreeGroupLoop {
   919  		s.next = group.codes
   920  		s.htree_index = 0
   921  		s.substate_tree_group = stateTreeGroupLoop
   922  	}
   923  
   924  	for s.htree_index < int(group.num_htrees) {
   925  		var table_size uint32
   926  		var result int = readHuffmanCode(uint32(group.alphabet_size), uint32(group.max_symbol), s.next, &table_size, s)
   927  		if result != decoderSuccess {
   928  			return result
   929  		}
   930  		group.htrees[s.htree_index] = s.next
   931  		s.next = s.next[table_size:]
   932  		s.htree_index++
   933  	}
   934  
   935  	s.substate_tree_group = stateTreeGroupNone
   936  	return decoderSuccess
   937  }
   938  
   939  /* Decodes a context map.
   940     Decoding is done in 4 phases:
   941      1) Read auxiliary information (6..16 bits) and allocate memory.
   942         In case of trivial context map, decoding is finished at this phase.
   943      2) Decode Huffman table using ReadHuffmanCode function.
   944         This table will be used for reading context map items.
   945      3) Read context map items; "0" values could be run-length encoded.
   946      4) Optionally, apply InverseMoveToFront transform to the resulting map. */
   947  func decodeContextMap(context_map_size uint32, num_htrees *uint32, context_map_arg *[]byte, s *Reader) int {
   948  	var br *bitReader = &s.br
   949  	var result int = decoderSuccess
   950  
   951  	switch int(s.substate_context_map) {
   952  	case stateContextMapNone:
   953  		result = decodeVarLenUint8(s, br, num_htrees)
   954  		if result != decoderSuccess {
   955  			return result
   956  		}
   957  
   958  		(*num_htrees)++
   959  		s.context_index = 0
   960  		*context_map_arg = make([]byte, uint(context_map_size))
   961  		if *context_map_arg == nil {
   962  			return decoderErrorAllocContextMap
   963  		}
   964  
   965  		if *num_htrees <= 1 {
   966  			for i := 0; i < int(context_map_size); i++ {
   967  				(*context_map_arg)[i] = 0
   968  			}
   969  			return decoderSuccess
   970  		}
   971  
   972  		s.substate_context_map = stateContextMapReadPrefix
   973  		fallthrough
   974  	/* Fall through. */
   975  	case stateContextMapReadPrefix:
   976  		{
   977  			var bits uint32
   978  
   979  			/* In next stage ReadHuffmanCode uses at least 4 bits, so it is safe
   980  			   to peek 4 bits ahead. */
   981  			if !safeGetBits(br, 5, &bits) {
   982  				return decoderNeedsMoreInput
   983  			}
   984  
   985  			if bits&1 != 0 { /* Use RLE for zeros. */
   986  				s.max_run_length_prefix = (bits >> 1) + 1
   987  				dropBits(br, 5)
   988  			} else {
   989  				s.max_run_length_prefix = 0
   990  				dropBits(br, 1)
   991  			}
   992  
   993  			s.substate_context_map = stateContextMapHuffman
   994  		}
   995  		fallthrough
   996  
   997  		/* Fall through. */
   998  	case stateContextMapHuffman:
   999  		{
  1000  			var alphabet_size uint32 = *num_htrees + s.max_run_length_prefix
  1001  			result = readHuffmanCode(alphabet_size, alphabet_size, s.context_map_table[:], nil, s)
  1002  			if result != decoderSuccess {
  1003  				return result
  1004  			}
  1005  			s.code = 0xFFFF
  1006  			s.substate_context_map = stateContextMapDecode
  1007  		}
  1008  		fallthrough
  1009  
  1010  		/* Fall through. */
  1011  	case stateContextMapDecode:
  1012  		{
  1013  			var context_index uint32 = s.context_index
  1014  			var max_run_length_prefix uint32 = s.max_run_length_prefix
  1015  			var context_map []byte = *context_map_arg
  1016  			var code uint32 = s.code
  1017  			var skip_preamble bool = (code != 0xFFFF)
  1018  			for context_index < context_map_size || skip_preamble {
  1019  				if !skip_preamble {
  1020  					if !safeReadSymbol(s.context_map_table[:], br, &code) {
  1021  						s.code = 0xFFFF
  1022  						s.context_index = context_index
  1023  						return decoderNeedsMoreInput
  1024  					}
  1025  
  1026  					if code == 0 {
  1027  						context_map[context_index] = 0
  1028  						context_index++
  1029  						continue
  1030  					}
  1031  
  1032  					if code > max_run_length_prefix {
  1033  						context_map[context_index] = byte(code - max_run_length_prefix)
  1034  						context_index++
  1035  						continue
  1036  					}
  1037  				} else {
  1038  					skip_preamble = false
  1039  				}
  1040  
  1041  				/* RLE sub-stage. */
  1042  				{
  1043  					var reps uint32
  1044  					if !safeReadBits(br, code, &reps) {
  1045  						s.code = code
  1046  						s.context_index = context_index
  1047  						return decoderNeedsMoreInput
  1048  					}
  1049  
  1050  					reps += 1 << code
  1051  					if context_index+reps > context_map_size {
  1052  						return decoderErrorFormatContextMapRepeat
  1053  					}
  1054  
  1055  					for {
  1056  						context_map[context_index] = 0
  1057  						context_index++
  1058  						reps--
  1059  						if reps == 0 {
  1060  							break
  1061  						}
  1062  					}
  1063  				}
  1064  			}
  1065  		}
  1066  		fallthrough
  1067  
  1068  	case stateContextMapTransform:
  1069  		var bits uint32
  1070  		if !safeReadBits(br, 1, &bits) {
  1071  			s.substate_context_map = stateContextMapTransform
  1072  			return decoderNeedsMoreInput
  1073  		}
  1074  
  1075  		if bits != 0 {
  1076  			inverseMoveToFrontTransform(*context_map_arg, context_map_size, s)
  1077  		}
  1078  
  1079  		s.substate_context_map = stateContextMapNone
  1080  		return decoderSuccess
  1081  
  1082  	default:
  1083  		return decoderErrorUnreachable
  1084  	}
  1085  }
  1086  
  1087  /* Decodes a command or literal and updates block type ring-buffer.
  1088     Reads 3..54 bits. */
  1089  func decodeBlockTypeAndLength(safe int, s *Reader, tree_type int) bool {
  1090  	var max_block_type uint32 = s.num_block_types[tree_type]
  1091  	type_tree := s.block_type_trees[tree_type*huffmanMaxSize258:]
  1092  	len_tree := s.block_len_trees[tree_type*huffmanMaxSize26:]
  1093  	var br *bitReader = &s.br
  1094  	var ringbuffer []uint32 = s.block_type_rb[tree_type*2:]
  1095  	var block_type uint32
  1096  	if max_block_type <= 1 {
  1097  		return false
  1098  	}
  1099  
  1100  	/* Read 0..15 + 3..39 bits. */
  1101  	if safe == 0 {
  1102  		block_type = readSymbol(type_tree, br)
  1103  		s.block_length[tree_type] = readBlockLength(len_tree, br)
  1104  	} else {
  1105  		var memento bitReaderState
  1106  		bitReaderSaveState(br, &memento)
  1107  		if !safeReadSymbol(type_tree, br, &block_type) {
  1108  			return false
  1109  		}
  1110  		if !safeReadBlockLength(s, &s.block_length[tree_type], len_tree, br) {
  1111  			s.substate_read_block_length = stateReadBlockLengthNone
  1112  			bitReaderRestoreState(br, &memento)
  1113  			return false
  1114  		}
  1115  	}
  1116  
  1117  	if block_type == 1 {
  1118  		block_type = ringbuffer[1] + 1
  1119  	} else if block_type == 0 {
  1120  		block_type = ringbuffer[0]
  1121  	} else {
  1122  		block_type -= 2
  1123  	}
  1124  
  1125  	if block_type >= max_block_type {
  1126  		block_type -= max_block_type
  1127  	}
  1128  
  1129  	ringbuffer[0] = ringbuffer[1]
  1130  	ringbuffer[1] = block_type
  1131  	return true
  1132  }
  1133  
  1134  func detectTrivialLiteralBlockTypes(s *Reader) {
  1135  	var i uint
  1136  	for i = 0; i < 8; i++ {
  1137  		s.trivial_literal_contexts[i] = 0
  1138  	}
  1139  	for i = 0; uint32(i) < s.num_block_types[0]; i++ {
  1140  		var offset uint = i << literalContextBits
  1141  		var error uint = 0
  1142  		var sample uint = uint(s.context_map[offset])
  1143  		var j uint
  1144  		for j = 0; j < 1<<literalContextBits; {
  1145  			var k int
  1146  			for k = 0; k < 4; k++ {
  1147  				error |= uint(s.context_map[offset+j]) ^ sample
  1148  				j++
  1149  			}
  1150  		}
  1151  
  1152  		if error == 0 {
  1153  			s.trivial_literal_contexts[i>>5] |= 1 << (i & 31)
  1154  		}
  1155  	}
  1156  }
  1157  
  1158  func prepareLiteralDecoding(s *Reader) {
  1159  	var context_mode byte
  1160  	var trivial uint
  1161  	var block_type uint32 = s.block_type_rb[1]
  1162  	var context_offset uint32 = block_type << literalContextBits
  1163  	s.context_map_slice = s.context_map[context_offset:]
  1164  	trivial = uint(s.trivial_literal_contexts[block_type>>5])
  1165  	s.trivial_literal_context = int((trivial >> (block_type & 31)) & 1)
  1166  	s.literal_htree = []huffmanCode(s.literal_hgroup.htrees[s.context_map_slice[0]])
  1167  	context_mode = s.context_modes[block_type] & 3
  1168  	s.context_lookup = getContextLUT(int(context_mode))
  1169  }
  1170  
  1171  /* Decodes the block type and updates the state for literal context.
  1172     Reads 3..54 bits. */
  1173  func decodeLiteralBlockSwitchInternal(safe int, s *Reader) bool {
  1174  	if !decodeBlockTypeAndLength(safe, s, 0) {
  1175  		return false
  1176  	}
  1177  
  1178  	prepareLiteralDecoding(s)
  1179  	return true
  1180  }
  1181  
  1182  func decodeLiteralBlockSwitch(s *Reader) {
  1183  	decodeLiteralBlockSwitchInternal(0, s)
  1184  }
  1185  
  1186  func safeDecodeLiteralBlockSwitch(s *Reader) bool {
  1187  	return decodeLiteralBlockSwitchInternal(1, s)
  1188  }
  1189  
  1190  /* Block switch for insert/copy length.
  1191     Reads 3..54 bits. */
  1192  func decodeCommandBlockSwitchInternal(safe int, s *Reader) bool {
  1193  	if !decodeBlockTypeAndLength(safe, s, 1) {
  1194  		return false
  1195  	}
  1196  
  1197  	s.htree_command = []huffmanCode(s.insert_copy_hgroup.htrees[s.block_type_rb[3]])
  1198  	return true
  1199  }
  1200  
  1201  func decodeCommandBlockSwitch(s *Reader) {
  1202  	decodeCommandBlockSwitchInternal(0, s)
  1203  }
  1204  
  1205  func safeDecodeCommandBlockSwitch(s *Reader) bool {
  1206  	return decodeCommandBlockSwitchInternal(1, s)
  1207  }
  1208  
  1209  /* Block switch for distance codes.
  1210     Reads 3..54 bits. */
  1211  func decodeDistanceBlockSwitchInternal(safe int, s *Reader) bool {
  1212  	if !decodeBlockTypeAndLength(safe, s, 2) {
  1213  		return false
  1214  	}
  1215  
  1216  	s.dist_context_map_slice = s.dist_context_map[s.block_type_rb[5]<<distanceContextBits:]
  1217  	s.dist_htree_index = s.dist_context_map_slice[s.distance_context]
  1218  	return true
  1219  }
  1220  
  1221  func decodeDistanceBlockSwitch(s *Reader) {
  1222  	decodeDistanceBlockSwitchInternal(0, s)
  1223  }
  1224  
  1225  func safeDecodeDistanceBlockSwitch(s *Reader) bool {
  1226  	return decodeDistanceBlockSwitchInternal(1, s)
  1227  }
  1228  
  1229  func unwrittenBytes(s *Reader, wrap bool) uint {
  1230  	var pos uint
  1231  	if wrap && s.pos > s.ringbuffer_size {
  1232  		pos = uint(s.ringbuffer_size)
  1233  	} else {
  1234  		pos = uint(s.pos)
  1235  	}
  1236  	var partial_pos_rb uint = (s.rb_roundtrips * uint(s.ringbuffer_size)) + pos
  1237  	return partial_pos_rb - s.partial_pos_out
  1238  }
  1239  
  1240  /* Dumps output.
  1241     Returns BROTLI_DECODER_NEEDS_MORE_OUTPUT only if there is more output to push
  1242     and either ring-buffer is as big as window size, or |force| is true. */
  1243  func writeRingBuffer(s *Reader, available_out *uint, next_out *[]byte, total_out *uint, force bool) int {
  1244  	start := s.ringbuffer[s.partial_pos_out&uint(s.ringbuffer_mask):]
  1245  	var to_write uint = unwrittenBytes(s, true)
  1246  	var num_written uint = *available_out
  1247  	if num_written > to_write {
  1248  		num_written = to_write
  1249  	}
  1250  
  1251  	if s.meta_block_remaining_len < 0 {
  1252  		return decoderErrorFormatBlockLength1
  1253  	}
  1254  
  1255  	if next_out != nil && *next_out == nil {
  1256  		*next_out = start
  1257  	} else {
  1258  		if next_out != nil {
  1259  			copy(*next_out, start[:num_written])
  1260  			*next_out = (*next_out)[num_written:]
  1261  		}
  1262  	}
  1263  
  1264  	*available_out -= num_written
  1265  	s.partial_pos_out += num_written
  1266  	if total_out != nil {
  1267  		*total_out = s.partial_pos_out
  1268  	}
  1269  
  1270  	if num_written < to_write {
  1271  		if s.ringbuffer_size == 1<<s.window_bits || force {
  1272  			return decoderNeedsMoreOutput
  1273  		} else {
  1274  			return decoderSuccess
  1275  		}
  1276  	}
  1277  
  1278  	/* Wrap ring buffer only if it has reached its maximal size. */
  1279  	if s.ringbuffer_size == 1<<s.window_bits && s.pos >= s.ringbuffer_size {
  1280  		s.pos -= s.ringbuffer_size
  1281  		s.rb_roundtrips++
  1282  		if uint(s.pos) != 0 {
  1283  			s.should_wrap_ringbuffer = 1
  1284  		} else {
  1285  			s.should_wrap_ringbuffer = 0
  1286  		}
  1287  	}
  1288  
  1289  	return decoderSuccess
  1290  }
  1291  
  1292  func wrapRingBuffer(s *Reader) {
  1293  	if s.should_wrap_ringbuffer != 0 {
  1294  		copy(s.ringbuffer, s.ringbuffer_end[:uint(s.pos)])
  1295  		s.should_wrap_ringbuffer = 0
  1296  	}
  1297  }
  1298  
  1299  /* Allocates ring-buffer.
  1300  
  1301     s->ringbuffer_size MUST be updated by BrotliCalculateRingBufferSize before
  1302     this function is called.
  1303  
  1304     Last two bytes of ring-buffer are initialized to 0, so context calculation
  1305     could be done uniformly for the first two and all other positions. */
  1306  func ensureRingBuffer(s *Reader) bool {
  1307  	var old_ringbuffer []byte
  1308  	if s.ringbuffer_size == s.new_ringbuffer_size {
  1309  		return true
  1310  	}
  1311  	spaceNeeded := int(s.new_ringbuffer_size) + int(kRingBufferWriteAheadSlack)
  1312  	if len(s.ringbuffer) < spaceNeeded {
  1313  		old_ringbuffer = s.ringbuffer
  1314  		s.ringbuffer = make([]byte, spaceNeeded)
  1315  	}
  1316  
  1317  	s.ringbuffer[s.new_ringbuffer_size-2] = 0
  1318  	s.ringbuffer[s.new_ringbuffer_size-1] = 0
  1319  
  1320  	if old_ringbuffer != nil {
  1321  		copy(s.ringbuffer, old_ringbuffer[:uint(s.pos)])
  1322  	}
  1323  
  1324  	s.ringbuffer_size = s.new_ringbuffer_size
  1325  	s.ringbuffer_mask = s.new_ringbuffer_size - 1
  1326  	s.ringbuffer_end = s.ringbuffer[s.ringbuffer_size:]
  1327  
  1328  	return true
  1329  }
  1330  
  1331  func copyUncompressedBlockToOutput(available_out *uint, next_out *[]byte, total_out *uint, s *Reader) int {
  1332  	/* TODO: avoid allocation for single uncompressed block. */
  1333  	if !ensureRingBuffer(s) {
  1334  		return decoderErrorAllocRingBuffer1
  1335  	}
  1336  
  1337  	/* State machine */
  1338  	for {
  1339  		switch s.substate_uncompressed {
  1340  		case stateUncompressedNone:
  1341  			{
  1342  				var nbytes int = int(getRemainingBytes(&s.br))
  1343  				if nbytes > s.meta_block_remaining_len {
  1344  					nbytes = s.meta_block_remaining_len
  1345  				}
  1346  
  1347  				if s.pos+nbytes > s.ringbuffer_size {
  1348  					nbytes = s.ringbuffer_size - s.pos
  1349  				}
  1350  
  1351  				/* Copy remaining bytes from s->br.buf_ to ring-buffer. */
  1352  				copyBytes(s.ringbuffer[s.pos:], &s.br, uint(nbytes))
  1353  
  1354  				s.pos += nbytes
  1355  				s.meta_block_remaining_len -= nbytes
  1356  				if s.pos < 1<<s.window_bits {
  1357  					if s.meta_block_remaining_len == 0 {
  1358  						return decoderSuccess
  1359  					}
  1360  
  1361  					return decoderNeedsMoreInput
  1362  				}
  1363  
  1364  				s.substate_uncompressed = stateUncompressedWrite
  1365  			}
  1366  			fallthrough
  1367  
  1368  		case stateUncompressedWrite:
  1369  			{
  1370  				result := writeRingBuffer(s, available_out, next_out, total_out, false)
  1371  				if result != decoderSuccess {
  1372  					return result
  1373  				}
  1374  
  1375  				if s.ringbuffer_size == 1<<s.window_bits {
  1376  					s.max_distance = s.max_backward_distance
  1377  				}
  1378  
  1379  				s.substate_uncompressed = stateUncompressedNone
  1380  				break
  1381  			}
  1382  		}
  1383  	}
  1384  }
  1385  
  1386  /* Calculates the smallest feasible ring buffer.
  1387  
  1388     If we know the data size is small, do not allocate more ring buffer
  1389     size than needed to reduce memory usage.
  1390  
  1391     When this method is called, metablock size and flags MUST be decoded. */
  1392  func calculateRingBufferSize(s *Reader) {
  1393  	var window_size int = 1 << s.window_bits
  1394  	var new_ringbuffer_size int = window_size
  1395  	var min_size int
  1396  	/* We need at least 2 bytes of ring buffer size to get the last two
  1397  	   bytes for context from there */
  1398  	if s.ringbuffer_size != 0 {
  1399  		min_size = s.ringbuffer_size
  1400  	} else {
  1401  		min_size = 1024
  1402  	}
  1403  	var output_size int
  1404  
  1405  	/* If maximum is already reached, no further extension is retired. */
  1406  	if s.ringbuffer_size == window_size {
  1407  		return
  1408  	}
  1409  
  1410  	/* Metadata blocks does not touch ring buffer. */
  1411  	if s.is_metadata != 0 {
  1412  		return
  1413  	}
  1414  
  1415  	if s.ringbuffer == nil {
  1416  		output_size = 0
  1417  	} else {
  1418  		output_size = s.pos
  1419  	}
  1420  
  1421  	output_size += s.meta_block_remaining_len
  1422  	if min_size < output_size {
  1423  		min_size = output_size
  1424  	}
  1425  
  1426  	if !(s.canny_ringbuffer_allocation == 0) {
  1427  		/* Reduce ring buffer size to save memory when server is unscrupulous.
  1428  		   In worst case memory usage might be 1.5x bigger for a short period of
  1429  		   ring buffer reallocation. */
  1430  		for new_ringbuffer_size>>1 >= min_size {
  1431  			new_ringbuffer_size >>= 1
  1432  		}
  1433  	}
  1434  
  1435  	s.new_ringbuffer_size = new_ringbuffer_size
  1436  }
  1437  
  1438  /* Reads 1..256 2-bit context modes. */
  1439  func readContextModes(s *Reader) int {
  1440  	var br *bitReader = &s.br
  1441  	var i int = s.loop_counter
  1442  
  1443  	for i < int(s.num_block_types[0]) {
  1444  		var bits uint32
  1445  		if !safeReadBits(br, 2, &bits) {
  1446  			s.loop_counter = i
  1447  			return decoderNeedsMoreInput
  1448  		}
  1449  
  1450  		s.context_modes[i] = byte(bits)
  1451  		i++
  1452  	}
  1453  
  1454  	return decoderSuccess
  1455  }
  1456  
  1457  func takeDistanceFromRingBuffer(s *Reader) {
  1458  	if s.distance_code == 0 {
  1459  		s.dist_rb_idx--
  1460  		s.distance_code = s.dist_rb[s.dist_rb_idx&3]
  1461  
  1462  		/* Compensate double distance-ring-buffer roll for dictionary items. */
  1463  		s.distance_context = 1
  1464  	} else {
  1465  		var distance_code int = s.distance_code << 1
  1466  		const kDistanceShortCodeIndexOffset uint32 = 0xAAAFFF1B
  1467  		const kDistanceShortCodeValueOffset uint32 = 0xFA5FA500
  1468  		var v int = (s.dist_rb_idx + int(kDistanceShortCodeIndexOffset>>uint(distance_code))) & 0x3
  1469  		/* kDistanceShortCodeIndexOffset has 2-bit values from LSB:
  1470  		   3, 2, 1, 0, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2 */
  1471  
  1472  		/* kDistanceShortCodeValueOffset has 2-bit values from LSB:
  1473  		   -0, 0,-0, 0,-1, 1,-2, 2,-3, 3,-1, 1,-2, 2,-3, 3 */
  1474  		s.distance_code = s.dist_rb[v]
  1475  
  1476  		v = int(kDistanceShortCodeValueOffset>>uint(distance_code)) & 0x3
  1477  		if distance_code&0x3 != 0 {
  1478  			s.distance_code += v
  1479  		} else {
  1480  			s.distance_code -= v
  1481  			if s.distance_code <= 0 {
  1482  				/* A huge distance will cause a () soon.
  1483  				   This is a little faster than failing here. */
  1484  				s.distance_code = 0x7FFFFFFF
  1485  			}
  1486  		}
  1487  	}
  1488  }
  1489  
  1490  func safeReadBitsMaybeZero(br *bitReader, n_bits uint32, val *uint32) bool {
  1491  	if n_bits != 0 {
  1492  		return safeReadBits(br, n_bits, val)
  1493  	} else {
  1494  		*val = 0
  1495  		return true
  1496  	}
  1497  }
  1498  
  1499  /* Precondition: s->distance_code < 0. */
  1500  func readDistanceInternal(safe int, s *Reader, br *bitReader) bool {
  1501  	var distval int
  1502  	var memento bitReaderState
  1503  	var distance_tree []huffmanCode = []huffmanCode(s.distance_hgroup.htrees[s.dist_htree_index])
  1504  	if safe == 0 {
  1505  		s.distance_code = int(readSymbol(distance_tree, br))
  1506  	} else {
  1507  		var code uint32
  1508  		bitReaderSaveState(br, &memento)
  1509  		if !safeReadSymbol(distance_tree, br, &code) {
  1510  			return false
  1511  		}
  1512  
  1513  		s.distance_code = int(code)
  1514  	}
  1515  
  1516  	/* Convert the distance code to the actual distance by possibly
  1517  	   looking up past distances from the s->ringbuffer. */
  1518  	s.distance_context = 0
  1519  
  1520  	if s.distance_code&^0xF == 0 {
  1521  		takeDistanceFromRingBuffer(s)
  1522  		s.block_length[2]--
  1523  		return true
  1524  	}
  1525  
  1526  	distval = s.distance_code - int(s.num_direct_distance_codes)
  1527  	if distval >= 0 {
  1528  		var nbits uint32
  1529  		var postfix int
  1530  		var offset int
  1531  		if safe == 0 && (s.distance_postfix_bits == 0) {
  1532  			nbits = (uint32(distval) >> 1) + 1
  1533  			offset = ((2 + (distval & 1)) << nbits) - 4
  1534  			s.distance_code = int(s.num_direct_distance_codes) + offset + int(readBits(br, nbits))
  1535  		} else {
  1536  			/* This branch also works well when s->distance_postfix_bits == 0. */
  1537  			var bits uint32
  1538  			postfix = distval & s.distance_postfix_mask
  1539  			distval >>= s.distance_postfix_bits
  1540  			nbits = (uint32(distval) >> 1) + 1
  1541  			if safe != 0 {
  1542  				if !safeReadBitsMaybeZero(br, nbits, &bits) {
  1543  					s.distance_code = -1 /* Restore precondition. */
  1544  					bitReaderRestoreState(br, &memento)
  1545  					return false
  1546  				}
  1547  			} else {
  1548  				bits = readBits(br, nbits)
  1549  			}
  1550  
  1551  			offset = ((2 + (distval & 1)) << nbits) - 4
  1552  			s.distance_code = int(s.num_direct_distance_codes) + ((offset + int(bits)) << s.distance_postfix_bits) + postfix
  1553  		}
  1554  	}
  1555  
  1556  	s.distance_code = s.distance_code - numDistanceShortCodes + 1
  1557  	s.block_length[2]--
  1558  	return true
  1559  }
  1560  
  1561  func readDistance(s *Reader, br *bitReader) {
  1562  	readDistanceInternal(0, s, br)
  1563  }
  1564  
  1565  func safeReadDistance(s *Reader, br *bitReader) bool {
  1566  	return readDistanceInternal(1, s, br)
  1567  }
  1568  
  1569  func readCommandInternal(safe int, s *Reader, br *bitReader, insert_length *int) bool {
  1570  	var cmd_code uint32
  1571  	var insert_len_extra uint32 = 0
  1572  	var copy_length uint32
  1573  	var v cmdLutElement
  1574  	var memento bitReaderState
  1575  	if safe == 0 {
  1576  		cmd_code = readSymbol(s.htree_command, br)
  1577  	} else {
  1578  		bitReaderSaveState(br, &memento)
  1579  		if !safeReadSymbol(s.htree_command, br, &cmd_code) {
  1580  			return false
  1581  		}
  1582  	}
  1583  
  1584  	v = kCmdLut[cmd_code]
  1585  	s.distance_code = int(v.distance_code)
  1586  	s.distance_context = int(v.context)
  1587  	s.dist_htree_index = s.dist_context_map_slice[s.distance_context]
  1588  	*insert_length = int(v.insert_len_offset)
  1589  	if safe == 0 {
  1590  		if v.insert_len_extra_bits != 0 {
  1591  			insert_len_extra = readBits(br, uint32(v.insert_len_extra_bits))
  1592  		}
  1593  
  1594  		copy_length = readBits(br, uint32(v.copy_len_extra_bits))
  1595  	} else {
  1596  		if !safeReadBitsMaybeZero(br, uint32(v.insert_len_extra_bits), &insert_len_extra) || !safeReadBitsMaybeZero(br, uint32(v.copy_len_extra_bits), &copy_length) {
  1597  			bitReaderRestoreState(br, &memento)
  1598  			return false
  1599  		}
  1600  	}
  1601  
  1602  	s.copy_length = int(copy_length) + int(v.copy_len_offset)
  1603  	s.block_length[1]--
  1604  	*insert_length += int(insert_len_extra)
  1605  	return true
  1606  }
  1607  
  1608  func readCommand(s *Reader, br *bitReader, insert_length *int) {
  1609  	readCommandInternal(0, s, br, insert_length)
  1610  }
  1611  
  1612  func safeReadCommand(s *Reader, br *bitReader, insert_length *int) bool {
  1613  	return readCommandInternal(1, s, br, insert_length)
  1614  }
  1615  
  1616  func checkInputAmountMaybeSafe(safe int, br *bitReader, num uint) bool {
  1617  	if safe != 0 {
  1618  		return true
  1619  	}
  1620  
  1621  	return checkInputAmount(br, num)
  1622  }
  1623  
  1624  func processCommandsInternal(safe int, s *Reader) int {
  1625  	var pos int = s.pos
  1626  	var i int = s.loop_counter
  1627  	var result int = decoderSuccess
  1628  	var br *bitReader = &s.br
  1629  	var hc []huffmanCode
  1630  
  1631  	if !checkInputAmountMaybeSafe(safe, br, 28) {
  1632  		result = decoderNeedsMoreInput
  1633  		goto saveStateAndReturn
  1634  	}
  1635  
  1636  	if safe == 0 {
  1637  		warmupBitReader(br)
  1638  	}
  1639  
  1640  	/* Jump into state machine. */
  1641  	if s.state == stateCommandBegin {
  1642  		goto CommandBegin
  1643  	} else if s.state == stateCommandInner {
  1644  		goto CommandInner
  1645  	} else if s.state == stateCommandPostDecodeLiterals {
  1646  		goto CommandPostDecodeLiterals
  1647  	} else if s.state == stateCommandPostWrapCopy {
  1648  		goto CommandPostWrapCopy
  1649  	} else {
  1650  		return decoderErrorUnreachable
  1651  	}
  1652  
  1653  CommandBegin:
  1654  	if safe != 0 {
  1655  		s.state = stateCommandBegin
  1656  	}
  1657  
  1658  	if !checkInputAmountMaybeSafe(safe, br, 28) { /* 156 bits + 7 bytes */
  1659  		s.state = stateCommandBegin
  1660  		result = decoderNeedsMoreInput
  1661  		goto saveStateAndReturn
  1662  	}
  1663  
  1664  	if s.block_length[1] == 0 {
  1665  		if safe != 0 {
  1666  			if !safeDecodeCommandBlockSwitch(s) {
  1667  				result = decoderNeedsMoreInput
  1668  				goto saveStateAndReturn
  1669  			}
  1670  		} else {
  1671  			decodeCommandBlockSwitch(s)
  1672  		}
  1673  
  1674  		goto CommandBegin
  1675  	}
  1676  
  1677  	/* Read the insert/copy length in the command. */
  1678  	if safe != 0 {
  1679  		if !safeReadCommand(s, br, &i) {
  1680  			result = decoderNeedsMoreInput
  1681  			goto saveStateAndReturn
  1682  		}
  1683  	} else {
  1684  		readCommand(s, br, &i)
  1685  	}
  1686  
  1687  	if i == 0 {
  1688  		goto CommandPostDecodeLiterals
  1689  	}
  1690  
  1691  	s.meta_block_remaining_len -= i
  1692  
  1693  CommandInner:
  1694  	if safe != 0 {
  1695  		s.state = stateCommandInner
  1696  	}
  1697  
  1698  	/* Read the literals in the command. */
  1699  	if s.trivial_literal_context != 0 {
  1700  		var bits uint32
  1701  		var value uint32
  1702  		preloadSymbol(safe, s.literal_htree, br, &bits, &value)
  1703  		for {
  1704  			if !checkInputAmountMaybeSafe(safe, br, 28) { /* 162 bits + 7 bytes */
  1705  				s.state = stateCommandInner
  1706  				result = decoderNeedsMoreInput
  1707  				goto saveStateAndReturn
  1708  			}
  1709  
  1710  			if s.block_length[0] == 0 {
  1711  				if safe != 0 {
  1712  					if !safeDecodeLiteralBlockSwitch(s) {
  1713  						result = decoderNeedsMoreInput
  1714  						goto saveStateAndReturn
  1715  					}
  1716  				} else {
  1717  					decodeLiteralBlockSwitch(s)
  1718  				}
  1719  
  1720  				preloadSymbol(safe, s.literal_htree, br, &bits, &value)
  1721  				if s.trivial_literal_context == 0 {
  1722  					goto CommandInner
  1723  				}
  1724  			}
  1725  
  1726  			if safe == 0 {
  1727  				s.ringbuffer[pos] = byte(readPreloadedSymbol(s.literal_htree, br, &bits, &value))
  1728  			} else {
  1729  				var literal uint32
  1730  				if !safeReadSymbol(s.literal_htree, br, &literal) {
  1731  					result = decoderNeedsMoreInput
  1732  					goto saveStateAndReturn
  1733  				}
  1734  
  1735  				s.ringbuffer[pos] = byte(literal)
  1736  			}
  1737  
  1738  			s.block_length[0]--
  1739  			pos++
  1740  			if pos == s.ringbuffer_size {
  1741  				s.state = stateCommandInnerWrite
  1742  				i--
  1743  				goto saveStateAndReturn
  1744  			}
  1745  			i--
  1746  			if i == 0 {
  1747  				break
  1748  			}
  1749  		}
  1750  	} else {
  1751  		var p1 byte = s.ringbuffer[(pos-1)&s.ringbuffer_mask]
  1752  		var p2 byte = s.ringbuffer[(pos-2)&s.ringbuffer_mask]
  1753  		for {
  1754  			var context byte
  1755  			if !checkInputAmountMaybeSafe(safe, br, 28) { /* 162 bits + 7 bytes */
  1756  				s.state = stateCommandInner
  1757  				result = decoderNeedsMoreInput
  1758  				goto saveStateAndReturn
  1759  			}
  1760  
  1761  			if s.block_length[0] == 0 {
  1762  				if safe != 0 {
  1763  					if !safeDecodeLiteralBlockSwitch(s) {
  1764  						result = decoderNeedsMoreInput
  1765  						goto saveStateAndReturn
  1766  					}
  1767  				} else {
  1768  					decodeLiteralBlockSwitch(s)
  1769  				}
  1770  
  1771  				if s.trivial_literal_context != 0 {
  1772  					goto CommandInner
  1773  				}
  1774  			}
  1775  
  1776  			context = getContext(p1, p2, s.context_lookup)
  1777  			hc = []huffmanCode(s.literal_hgroup.htrees[s.context_map_slice[context]])
  1778  			p2 = p1
  1779  			if safe == 0 {
  1780  				p1 = byte(readSymbol(hc, br))
  1781  			} else {
  1782  				var literal uint32
  1783  				if !safeReadSymbol(hc, br, &literal) {
  1784  					result = decoderNeedsMoreInput
  1785  					goto saveStateAndReturn
  1786  				}
  1787  
  1788  				p1 = byte(literal)
  1789  			}
  1790  
  1791  			s.ringbuffer[pos] = p1
  1792  			s.block_length[0]--
  1793  			pos++
  1794  			if pos == s.ringbuffer_size {
  1795  				s.state = stateCommandInnerWrite
  1796  				i--
  1797  				goto saveStateAndReturn
  1798  			}
  1799  			i--
  1800  			if i == 0 {
  1801  				break
  1802  			}
  1803  		}
  1804  	}
  1805  
  1806  	if s.meta_block_remaining_len <= 0 {
  1807  		s.state = stateMetablockDone
  1808  		goto saveStateAndReturn
  1809  	}
  1810  
  1811  CommandPostDecodeLiterals:
  1812  	if safe != 0 {
  1813  		s.state = stateCommandPostDecodeLiterals
  1814  	}
  1815  
  1816  	if s.distance_code >= 0 {
  1817  		/* Implicit distance case. */
  1818  		if s.distance_code != 0 {
  1819  			s.distance_context = 0
  1820  		} else {
  1821  			s.distance_context = 1
  1822  		}
  1823  
  1824  		s.dist_rb_idx--
  1825  		s.distance_code = s.dist_rb[s.dist_rb_idx&3]
  1826  	} else {
  1827  		/* Read distance code in the command, unless it was implicitly zero. */
  1828  		if s.block_length[2] == 0 {
  1829  			if safe != 0 {
  1830  				if !safeDecodeDistanceBlockSwitch(s) {
  1831  					result = decoderNeedsMoreInput
  1832  					goto saveStateAndReturn
  1833  				}
  1834  			} else {
  1835  				decodeDistanceBlockSwitch(s)
  1836  			}
  1837  		}
  1838  
  1839  		if safe != 0 {
  1840  			if !safeReadDistance(s, br) {
  1841  				result = decoderNeedsMoreInput
  1842  				goto saveStateAndReturn
  1843  			}
  1844  		} else {
  1845  			readDistance(s, br)
  1846  		}
  1847  	}
  1848  
  1849  	if s.max_distance != s.max_backward_distance {
  1850  		if pos < s.max_backward_distance {
  1851  			s.max_distance = pos
  1852  		} else {
  1853  			s.max_distance = s.max_backward_distance
  1854  		}
  1855  	}
  1856  
  1857  	i = s.copy_length
  1858  
  1859  	/* Apply copy of LZ77 back-reference, or static dictionary reference if
  1860  	   the distance is larger than the max LZ77 distance */
  1861  	if s.distance_code > s.max_distance {
  1862  		/* The maximum allowed distance is BROTLI_MAX_ALLOWED_DISTANCE = 0x7FFFFFFC.
  1863  		   With this choice, no signed overflow can occur after decoding
  1864  		   a special distance code (e.g., after adding 3 to the last distance). */
  1865  		if s.distance_code > maxAllowedDistance {
  1866  			return decoderErrorFormatDistance
  1867  		}
  1868  
  1869  		if i >= minDictionaryWordLength && i <= maxDictionaryWordLength {
  1870  			var address int = s.distance_code - s.max_distance - 1
  1871  			var words *dictionary = s.dictionary
  1872  			var trans *transforms = s.transforms
  1873  			var offset int = int(s.dictionary.offsets_by_length[i])
  1874  			var shift uint32 = uint32(s.dictionary.size_bits_by_length[i])
  1875  			var mask int = int(bitMask(shift))
  1876  			var word_idx int = address & mask
  1877  			var transform_idx int = address >> shift
  1878  
  1879  			/* Compensate double distance-ring-buffer roll. */
  1880  			s.dist_rb_idx += s.distance_context
  1881  
  1882  			offset += word_idx * i
  1883  			if words.data == nil {
  1884  				return decoderErrorDictionaryNotSet
  1885  			}
  1886  
  1887  			if transform_idx < int(trans.num_transforms) {
  1888  				word := words.data[offset:]
  1889  				var len int = i
  1890  				if transform_idx == int(trans.cutOffTransforms[0]) {
  1891  					copy(s.ringbuffer[pos:], word[:uint(len)])
  1892  				} else {
  1893  					len = transformDictionaryWord(s.ringbuffer[pos:], word, int(len), trans, transform_idx)
  1894  				}
  1895  
  1896  				pos += int(len)
  1897  				s.meta_block_remaining_len -= int(len)
  1898  				if pos >= s.ringbuffer_size {
  1899  					s.state = stateCommandPostWrite1
  1900  					goto saveStateAndReturn
  1901  				}
  1902  			} else {
  1903  				return decoderErrorFormatTransform
  1904  			}
  1905  		} else {
  1906  			return decoderErrorFormatDictionary
  1907  		}
  1908  	} else {
  1909  		var src_start int = (pos - s.distance_code) & s.ringbuffer_mask
  1910  		copy_dst := s.ringbuffer[pos:]
  1911  		copy_src := s.ringbuffer[src_start:]
  1912  		var dst_end int = pos + i
  1913  		var src_end int = src_start + i
  1914  
  1915  		/* Update the recent distances cache. */
  1916  		s.dist_rb[s.dist_rb_idx&3] = s.distance_code
  1917  
  1918  		s.dist_rb_idx++
  1919  		s.meta_block_remaining_len -= i
  1920  
  1921  		/* There are 32+ bytes of slack in the ring-buffer allocation.
  1922  		   Also, we have 16 short codes, that make these 16 bytes irrelevant
  1923  		   in the ring-buffer. Let's copy over them as a first guess. */
  1924  		copy(copy_dst, copy_src[:16])
  1925  
  1926  		if src_end > pos && dst_end > src_start {
  1927  			/* Regions intersect. */
  1928  			goto CommandPostWrapCopy
  1929  		}
  1930  
  1931  		if dst_end >= s.ringbuffer_size || src_end >= s.ringbuffer_size {
  1932  			/* At least one region wraps. */
  1933  			goto CommandPostWrapCopy
  1934  		}
  1935  
  1936  		pos += i
  1937  		if i > 16 {
  1938  			if i > 32 {
  1939  				copy(copy_dst[16:], copy_src[16:][:uint(i-16)])
  1940  			} else {
  1941  				/* This branch covers about 45% cases.
  1942  				   Fixed size short copy allows more compiler optimizations. */
  1943  				copy(copy_dst[16:], copy_src[16:][:16])
  1944  			}
  1945  		}
  1946  	}
  1947  
  1948  	if s.meta_block_remaining_len <= 0 {
  1949  		/* Next metablock, if any. */
  1950  		s.state = stateMetablockDone
  1951  
  1952  		goto saveStateAndReturn
  1953  	} else {
  1954  		goto CommandBegin
  1955  	}
  1956  CommandPostWrapCopy:
  1957  	{
  1958  		var wrap_guard int = s.ringbuffer_size - pos
  1959  		for {
  1960  			i--
  1961  			if i < 0 {
  1962  				break
  1963  			}
  1964  			s.ringbuffer[pos] = s.ringbuffer[(pos-s.distance_code)&s.ringbuffer_mask]
  1965  			pos++
  1966  			wrap_guard--
  1967  			if wrap_guard == 0 {
  1968  				s.state = stateCommandPostWrite2
  1969  				goto saveStateAndReturn
  1970  			}
  1971  		}
  1972  	}
  1973  
  1974  	if s.meta_block_remaining_len <= 0 {
  1975  		/* Next metablock, if any. */
  1976  		s.state = stateMetablockDone
  1977  
  1978  		goto saveStateAndReturn
  1979  	} else {
  1980  		goto CommandBegin
  1981  	}
  1982  
  1983  saveStateAndReturn:
  1984  	s.pos = pos
  1985  	s.loop_counter = i
  1986  	return result
  1987  }
  1988  
  1989  func processCommands(s *Reader) int {
  1990  	return processCommandsInternal(0, s)
  1991  }
  1992  
  1993  func safeProcessCommands(s *Reader) int {
  1994  	return processCommandsInternal(1, s)
  1995  }
  1996  
  1997  /* Returns the maximum number of distance symbols which can only represent
  1998     distances not exceeding BROTLI_MAX_ALLOWED_DISTANCE. */
  1999  
  2000  var maxDistanceSymbol_bound = [maxNpostfix + 1]uint32{0, 4, 12, 28}
  2001  var maxDistanceSymbol_diff = [maxNpostfix + 1]uint32{73, 126, 228, 424}
  2002  
  2003  func maxDistanceSymbol(ndirect uint32, npostfix uint32) uint32 {
  2004  	var postfix uint32 = 1 << npostfix
  2005  	if ndirect < maxDistanceSymbol_bound[npostfix] {
  2006  		return ndirect + maxDistanceSymbol_diff[npostfix] + postfix
  2007  	} else if ndirect > maxDistanceSymbol_bound[npostfix]+postfix {
  2008  		return ndirect + maxDistanceSymbol_diff[npostfix]
  2009  	} else {
  2010  		return maxDistanceSymbol_bound[npostfix] + maxDistanceSymbol_diff[npostfix] + postfix
  2011  	}
  2012  }
  2013  
  2014  /* Invariant: input stream is never overconsumed:
  2015     - invalid input implies that the whole stream is invalid -> any amount of
  2016       input could be read and discarded
  2017     - when result is "needs more input", then at least one more byte is REQUIRED
  2018       to complete decoding; all input data MUST be consumed by decoder, so
  2019       client could swap the input buffer
  2020     - when result is "needs more output" decoder MUST ensure that it doesn't
  2021       hold more than 7 bits in bit reader; this saves client from swapping input
  2022       buffer ahead of time
  2023     - when result is "success" decoder MUST return all unused data back to input
  2024       buffer; this is possible because the invariant is held on enter */
  2025  func decoderDecompressStream(s *Reader, available_in *uint, next_in *[]byte, available_out *uint, next_out *[]byte) int {
  2026  	var result int = decoderSuccess
  2027  	var br *bitReader = &s.br
  2028  
  2029  	/* Do not try to process further in a case of unrecoverable error. */
  2030  	if int(s.error_code) < 0 {
  2031  		return decoderResultError
  2032  	}
  2033  
  2034  	if *available_out != 0 && (next_out == nil || *next_out == nil) {
  2035  		return saveErrorCode(s, decoderErrorInvalidArguments)
  2036  	}
  2037  
  2038  	if *available_out == 0 {
  2039  		next_out = nil
  2040  	}
  2041  	if s.buffer_length == 0 { /* Just connect bit reader to input stream. */
  2042  		br.input_len = *available_in
  2043  		br.input = *next_in
  2044  		br.byte_pos = 0
  2045  	} else {
  2046  		/* At least one byte of input is required. More than one byte of input may
  2047  		   be required to complete the transaction -> reading more data must be
  2048  		   done in a loop -> do it in a main loop. */
  2049  		result = decoderNeedsMoreInput
  2050  
  2051  		br.input = s.buffer.u8[:]
  2052  		br.byte_pos = 0
  2053  	}
  2054  
  2055  	/* State machine */
  2056  	for {
  2057  		if result != decoderSuccess {
  2058  			/* Error, needs more input/output. */
  2059  			if result == decoderNeedsMoreInput {
  2060  				if s.ringbuffer != nil { /* Pro-actively push output. */
  2061  					var intermediate_result int = writeRingBuffer(s, available_out, next_out, nil, true)
  2062  
  2063  					/* WriteRingBuffer checks s->meta_block_remaining_len validity. */
  2064  					if int(intermediate_result) < 0 {
  2065  						result = intermediate_result
  2066  						break
  2067  					}
  2068  				}
  2069  
  2070  				if s.buffer_length != 0 { /* Used with internal buffer. */
  2071  					if br.byte_pos == br.input_len {
  2072  						/* Successfully finished read transaction.
  2073  						   Accumulator contains less than 8 bits, because internal buffer
  2074  						   is expanded byte-by-byte until it is enough to complete read. */
  2075  						s.buffer_length = 0
  2076  
  2077  						/* Switch to input stream and restart. */
  2078  						result = decoderSuccess
  2079  
  2080  						br.input_len = *available_in
  2081  						br.input = *next_in
  2082  						br.byte_pos = 0
  2083  						continue
  2084  					} else if *available_in != 0 {
  2085  						/* Not enough data in buffer, but can take one more byte from
  2086  						   input stream. */
  2087  						result = decoderSuccess
  2088  
  2089  						s.buffer.u8[s.buffer_length] = (*next_in)[0]
  2090  						s.buffer_length++
  2091  						br.input_len = uint(s.buffer_length)
  2092  						*next_in = (*next_in)[1:]
  2093  						(*available_in)--
  2094  
  2095  						/* Retry with more data in buffer. */
  2096  						continue
  2097  					}
  2098  
  2099  					/* Can't finish reading and no more input. */
  2100  					break
  2101  					/* Input stream doesn't contain enough input. */
  2102  				} else {
  2103  					/* Copy tail to internal buffer and return. */
  2104  					*next_in = br.input[br.byte_pos:]
  2105  
  2106  					*available_in = br.input_len - br.byte_pos
  2107  					for *available_in != 0 {
  2108  						s.buffer.u8[s.buffer_length] = (*next_in)[0]
  2109  						s.buffer_length++
  2110  						*next_in = (*next_in)[1:]
  2111  						(*available_in)--
  2112  					}
  2113  
  2114  					break
  2115  				}
  2116  			}
  2117  
  2118  			/* Unreachable. */
  2119  
  2120  			/* Fail or needs more output. */
  2121  			if s.buffer_length != 0 {
  2122  				/* Just consumed the buffered input and produced some output. Otherwise
  2123  				   it would result in "needs more input". Reset internal buffer. */
  2124  				s.buffer_length = 0
  2125  			} else {
  2126  				/* Using input stream in last iteration. When decoder switches to input
  2127  				   stream it has less than 8 bits in accumulator, so it is safe to
  2128  				   return unused accumulator bits there. */
  2129  				bitReaderUnload(br)
  2130  
  2131  				*available_in = br.input_len - br.byte_pos
  2132  				*next_in = br.input[br.byte_pos:]
  2133  			}
  2134  
  2135  			break
  2136  		}
  2137  
  2138  		switch s.state {
  2139  		/* Prepare to the first read. */
  2140  		case stateUninited:
  2141  			if !warmupBitReader(br) {
  2142  				result = decoderNeedsMoreInput
  2143  				break
  2144  			}
  2145  
  2146  			/* Decode window size. */
  2147  			result = decodeWindowBits(s, br) /* Reads 1..8 bits. */
  2148  			if result != decoderSuccess {
  2149  				break
  2150  			}
  2151  
  2152  			if s.large_window {
  2153  				s.state = stateLargeWindowBits
  2154  				break
  2155  			}
  2156  
  2157  			s.state = stateInitialize
  2158  
  2159  		case stateLargeWindowBits:
  2160  			if !safeReadBits(br, 6, &s.window_bits) {
  2161  				result = decoderNeedsMoreInput
  2162  				break
  2163  			}
  2164  
  2165  			if s.window_bits < largeMinWbits || s.window_bits > largeMaxWbits {
  2166  				result = decoderErrorFormatWindowBits
  2167  				break
  2168  			}
  2169  
  2170  			s.state = stateInitialize
  2171  			fallthrough
  2172  
  2173  			/* Maximum distance, see section 9.1. of the spec. */
  2174  		/* Fall through. */
  2175  		case stateInitialize:
  2176  			s.max_backward_distance = (1 << s.window_bits) - windowGap
  2177  
  2178  			/* Allocate memory for both block_type_trees and block_len_trees. */
  2179  			s.block_type_trees = make([]huffmanCode, (3 * (huffmanMaxSize258 + huffmanMaxSize26)))
  2180  
  2181  			if s.block_type_trees == nil {
  2182  				result = decoderErrorAllocBlockTypeTrees
  2183  				break
  2184  			}
  2185  
  2186  			s.block_len_trees = s.block_type_trees[3*huffmanMaxSize258:]
  2187  
  2188  			s.state = stateMetablockBegin
  2189  			fallthrough
  2190  
  2191  			/* Fall through. */
  2192  		case stateMetablockBegin:
  2193  			decoderStateMetablockBegin(s)
  2194  
  2195  			s.state = stateMetablockHeader
  2196  			fallthrough
  2197  
  2198  			/* Fall through. */
  2199  		case stateMetablockHeader:
  2200  			result = decodeMetaBlockLength(s, br)
  2201  			/* Reads 2 - 31 bits. */
  2202  			if result != decoderSuccess {
  2203  				break
  2204  			}
  2205  
  2206  			if s.is_metadata != 0 || s.is_uncompressed != 0 {
  2207  				if !bitReaderJumpToByteBoundary(br) {
  2208  					result = decoderErrorFormatPadding1
  2209  					break
  2210  				}
  2211  			}
  2212  
  2213  			if s.is_metadata != 0 {
  2214  				s.state = stateMetadata
  2215  				break
  2216  			}
  2217  
  2218  			if s.meta_block_remaining_len == 0 {
  2219  				s.state = stateMetablockDone
  2220  				break
  2221  			}
  2222  
  2223  			calculateRingBufferSize(s)
  2224  			if s.is_uncompressed != 0 {
  2225  				s.state = stateUncompressed
  2226  				break
  2227  			}
  2228  
  2229  			s.loop_counter = 0
  2230  			s.state = stateHuffmanCode0
  2231  
  2232  		case stateUncompressed:
  2233  			result = copyUncompressedBlockToOutput(available_out, next_out, nil, s)
  2234  			if result == decoderSuccess {
  2235  				s.state = stateMetablockDone
  2236  			}
  2237  
  2238  		case stateMetadata:
  2239  			for ; s.meta_block_remaining_len > 0; s.meta_block_remaining_len-- {
  2240  				var bits uint32
  2241  
  2242  				/* Read one byte and ignore it. */
  2243  				if !safeReadBits(br, 8, &bits) {
  2244  					result = decoderNeedsMoreInput
  2245  					break
  2246  				}
  2247  			}
  2248  
  2249  			if result == decoderSuccess {
  2250  				s.state = stateMetablockDone
  2251  			}
  2252  
  2253  		case stateHuffmanCode0:
  2254  			if s.loop_counter >= 3 {
  2255  				s.state = stateMetablockHeader2
  2256  				break
  2257  			}
  2258  
  2259  			/* Reads 1..11 bits. */
  2260  			result = decodeVarLenUint8(s, br, &s.num_block_types[s.loop_counter])
  2261  
  2262  			if result != decoderSuccess {
  2263  				break
  2264  			}
  2265  
  2266  			s.num_block_types[s.loop_counter]++
  2267  			if s.num_block_types[s.loop_counter] < 2 {
  2268  				s.loop_counter++
  2269  				break
  2270  			}
  2271  
  2272  			s.state = stateHuffmanCode1
  2273  			fallthrough
  2274  
  2275  		case stateHuffmanCode1:
  2276  			{
  2277  				var alphabet_size uint32 = s.num_block_types[s.loop_counter] + 2
  2278  				var tree_offset int = s.loop_counter * huffmanMaxSize258
  2279  				result = readHuffmanCode(alphabet_size, alphabet_size, s.block_type_trees[tree_offset:], nil, s)
  2280  				if result != decoderSuccess {
  2281  					break
  2282  				}
  2283  				s.state = stateHuffmanCode2
  2284  			}
  2285  			fallthrough
  2286  
  2287  		case stateHuffmanCode2:
  2288  			{
  2289  				var alphabet_size uint32 = numBlockLenSymbols
  2290  				var tree_offset int = s.loop_counter * huffmanMaxSize26
  2291  				result = readHuffmanCode(alphabet_size, alphabet_size, s.block_len_trees[tree_offset:], nil, s)
  2292  				if result != decoderSuccess {
  2293  					break
  2294  				}
  2295  				s.state = stateHuffmanCode3
  2296  			}
  2297  			fallthrough
  2298  
  2299  		case stateHuffmanCode3:
  2300  			var tree_offset int = s.loop_counter * huffmanMaxSize26
  2301  			if !safeReadBlockLength(s, &s.block_length[s.loop_counter], s.block_len_trees[tree_offset:], br) {
  2302  				result = decoderNeedsMoreInput
  2303  				break
  2304  			}
  2305  
  2306  			s.loop_counter++
  2307  			s.state = stateHuffmanCode0
  2308  
  2309  		case stateMetablockHeader2:
  2310  			{
  2311  				var bits uint32
  2312  				if !safeReadBits(br, 6, &bits) {
  2313  					result = decoderNeedsMoreInput
  2314  					break
  2315  				}
  2316  
  2317  				s.distance_postfix_bits = bits & bitMask(2)
  2318  				bits >>= 2
  2319  				s.num_direct_distance_codes = numDistanceShortCodes + (bits << s.distance_postfix_bits)
  2320  				s.distance_postfix_mask = int(bitMask(s.distance_postfix_bits))
  2321  				s.context_modes = make([]byte, uint(s.num_block_types[0]))
  2322  				if s.context_modes == nil {
  2323  					result = decoderErrorAllocContextModes
  2324  					break
  2325  				}
  2326  
  2327  				s.loop_counter = 0
  2328  				s.state = stateContextModes
  2329  			}
  2330  			fallthrough
  2331  
  2332  		case stateContextModes:
  2333  			result = readContextModes(s)
  2334  
  2335  			if result != decoderSuccess {
  2336  				break
  2337  			}
  2338  
  2339  			s.state = stateContextMap1
  2340  			fallthrough
  2341  
  2342  		case stateContextMap1:
  2343  			result = decodeContextMap(s.num_block_types[0]<<literalContextBits, &s.num_literal_htrees, &s.context_map, s)
  2344  
  2345  			if result != decoderSuccess {
  2346  				break
  2347  			}
  2348  
  2349  			detectTrivialLiteralBlockTypes(s)
  2350  			s.state = stateContextMap2
  2351  			fallthrough
  2352  
  2353  		case stateContextMap2:
  2354  			{
  2355  				var num_direct_codes uint32 = s.num_direct_distance_codes - numDistanceShortCodes
  2356  				var num_distance_codes uint32
  2357  				var max_distance_symbol uint32
  2358  				if s.large_window {
  2359  					num_distance_codes = uint32(distanceAlphabetSize(uint(s.distance_postfix_bits), uint(num_direct_codes), largeMaxDistanceBits))
  2360  					max_distance_symbol = maxDistanceSymbol(num_direct_codes, s.distance_postfix_bits)
  2361  				} else {
  2362  					num_distance_codes = uint32(distanceAlphabetSize(uint(s.distance_postfix_bits), uint(num_direct_codes), maxDistanceBits))
  2363  					max_distance_symbol = num_distance_codes
  2364  				}
  2365  				var allocation_success bool = true
  2366  				result = decodeContextMap(s.num_block_types[2]<<distanceContextBits, &s.num_dist_htrees, &s.dist_context_map, s)
  2367  				if result != decoderSuccess {
  2368  					break
  2369  				}
  2370  
  2371  				if !decoderHuffmanTreeGroupInit(s, &s.literal_hgroup, numLiteralSymbols, numLiteralSymbols, s.num_literal_htrees) {
  2372  					allocation_success = false
  2373  				}
  2374  
  2375  				if !decoderHuffmanTreeGroupInit(s, &s.insert_copy_hgroup, numCommandSymbols, numCommandSymbols, s.num_block_types[1]) {
  2376  					allocation_success = false
  2377  				}
  2378  
  2379  				if !decoderHuffmanTreeGroupInit(s, &s.distance_hgroup, num_distance_codes, max_distance_symbol, s.num_dist_htrees) {
  2380  					allocation_success = false
  2381  				}
  2382  
  2383  				if !allocation_success {
  2384  					return saveErrorCode(s, decoderErrorAllocTreeGroups)
  2385  				}
  2386  
  2387  				s.loop_counter = 0
  2388  				s.state = stateTreeGroup
  2389  			}
  2390  			fallthrough
  2391  
  2392  		case stateTreeGroup:
  2393  			var hgroup *huffmanTreeGroup = nil
  2394  			switch s.loop_counter {
  2395  			case 0:
  2396  				hgroup = &s.literal_hgroup
  2397  			case 1:
  2398  				hgroup = &s.insert_copy_hgroup
  2399  			case 2:
  2400  				hgroup = &s.distance_hgroup
  2401  			default:
  2402  				return saveErrorCode(s, decoderErrorUnreachable)
  2403  			}
  2404  
  2405  			result = huffmanTreeGroupDecode(hgroup, s)
  2406  			if result != decoderSuccess {
  2407  				break
  2408  			}
  2409  			s.loop_counter++
  2410  			if s.loop_counter >= 3 {
  2411  				prepareLiteralDecoding(s)
  2412  				s.dist_context_map_slice = s.dist_context_map
  2413  				s.htree_command = []huffmanCode(s.insert_copy_hgroup.htrees[0])
  2414  				if !ensureRingBuffer(s) {
  2415  					result = decoderErrorAllocRingBuffer2
  2416  					break
  2417  				}
  2418  
  2419  				s.state = stateCommandBegin
  2420  			}
  2421  
  2422  		case stateCommandBegin, stateCommandInner, stateCommandPostDecodeLiterals, stateCommandPostWrapCopy:
  2423  			result = processCommands(s)
  2424  
  2425  			if result == decoderNeedsMoreInput {
  2426  				result = safeProcessCommands(s)
  2427  			}
  2428  
  2429  		case stateCommandInnerWrite, stateCommandPostWrite1, stateCommandPostWrite2:
  2430  			result = writeRingBuffer(s, available_out, next_out, nil, false)
  2431  
  2432  			if result != decoderSuccess {
  2433  				break
  2434  			}
  2435  
  2436  			wrapRingBuffer(s)
  2437  			if s.ringbuffer_size == 1<<s.window_bits {
  2438  				s.max_distance = s.max_backward_distance
  2439  			}
  2440  
  2441  			if s.state == stateCommandPostWrite1 {
  2442  				if s.meta_block_remaining_len == 0 {
  2443  					/* Next metablock, if any. */
  2444  					s.state = stateMetablockDone
  2445  				} else {
  2446  					s.state = stateCommandBegin
  2447  				}
  2448  			} else if s.state == stateCommandPostWrite2 {
  2449  				s.state = stateCommandPostWrapCopy /* BROTLI_STATE_COMMAND_INNER_WRITE */
  2450  			} else {
  2451  				if s.loop_counter == 0 {
  2452  					if s.meta_block_remaining_len == 0 {
  2453  						s.state = stateMetablockDone
  2454  					} else {
  2455  						s.state = stateCommandPostDecodeLiterals
  2456  					}
  2457  
  2458  					break
  2459  				}
  2460  
  2461  				s.state = stateCommandInner
  2462  			}
  2463  
  2464  		case stateMetablockDone:
  2465  			if s.meta_block_remaining_len < 0 {
  2466  				result = decoderErrorFormatBlockLength2
  2467  				break
  2468  			}
  2469  
  2470  			decoderStateCleanupAfterMetablock(s)
  2471  			if s.is_last_metablock == 0 {
  2472  				s.state = stateMetablockBegin
  2473  				break
  2474  			}
  2475  
  2476  			if !bitReaderJumpToByteBoundary(br) {
  2477  				result = decoderErrorFormatPadding2
  2478  				break
  2479  			}
  2480  
  2481  			if s.buffer_length == 0 {
  2482  				bitReaderUnload(br)
  2483  				*available_in = br.input_len - br.byte_pos
  2484  				*next_in = br.input[br.byte_pos:]
  2485  			}
  2486  
  2487  			s.state = stateDone
  2488  			fallthrough
  2489  
  2490  		case stateDone:
  2491  			if s.ringbuffer != nil {
  2492  				result = writeRingBuffer(s, available_out, next_out, nil, true)
  2493  				if result != decoderSuccess {
  2494  					break
  2495  				}
  2496  			}
  2497  
  2498  			return saveErrorCode(s, result)
  2499  		}
  2500  	}
  2501  
  2502  	return saveErrorCode(s, result)
  2503  }
  2504  
  2505  func decoderHasMoreOutput(s *Reader) bool {
  2506  	/* After unrecoverable error remaining output is considered nonsensical. */
  2507  	if int(s.error_code) < 0 {
  2508  		return false
  2509  	}
  2510  
  2511  	return s.ringbuffer != nil && unwrittenBytes(s, false) != 0
  2512  }
  2513  
  2514  func decoderGetErrorCode(s *Reader) int {
  2515  	return int(s.error_code)
  2516  }
  2517  
  2518  func decoderErrorString(c int) string {
  2519  	switch c {
  2520  	case decoderNoError:
  2521  		return "NO_ERROR"
  2522  	case decoderSuccess:
  2523  		return "SUCCESS"
  2524  	case decoderNeedsMoreInput:
  2525  		return "NEEDS_MORE_INPUT"
  2526  	case decoderNeedsMoreOutput:
  2527  		return "NEEDS_MORE_OUTPUT"
  2528  	case decoderErrorFormatExuberantNibble:
  2529  		return "EXUBERANT_NIBBLE"
  2530  	case decoderErrorFormatReserved:
  2531  		return "RESERVED"
  2532  	case decoderErrorFormatExuberantMetaNibble:
  2533  		return "EXUBERANT_META_NIBBLE"
  2534  	case decoderErrorFormatSimpleHuffmanAlphabet:
  2535  		return "SIMPLE_HUFFMAN_ALPHABET"
  2536  	case decoderErrorFormatSimpleHuffmanSame:
  2537  		return "SIMPLE_HUFFMAN_SAME"
  2538  	case decoderErrorFormatClSpace:
  2539  		return "CL_SPACE"
  2540  	case decoderErrorFormatHuffmanSpace:
  2541  		return "HUFFMAN_SPACE"
  2542  	case decoderErrorFormatContextMapRepeat:
  2543  		return "CONTEXT_MAP_REPEAT"
  2544  	case decoderErrorFormatBlockLength1:
  2545  		return "BLOCK_LENGTH_1"
  2546  	case decoderErrorFormatBlockLength2:
  2547  		return "BLOCK_LENGTH_2"
  2548  	case decoderErrorFormatTransform:
  2549  		return "TRANSFORM"
  2550  	case decoderErrorFormatDictionary:
  2551  		return "DICTIONARY"
  2552  	case decoderErrorFormatWindowBits:
  2553  		return "WINDOW_BITS"
  2554  	case decoderErrorFormatPadding1:
  2555  		return "PADDING_1"
  2556  	case decoderErrorFormatPadding2:
  2557  		return "PADDING_2"
  2558  	case decoderErrorFormatDistance:
  2559  		return "DISTANCE"
  2560  	case decoderErrorDictionaryNotSet:
  2561  		return "DICTIONARY_NOT_SET"
  2562  	case decoderErrorInvalidArguments:
  2563  		return "INVALID_ARGUMENTS"
  2564  	case decoderErrorAllocContextModes:
  2565  		return "CONTEXT_MODES"
  2566  	case decoderErrorAllocTreeGroups:
  2567  		return "TREE_GROUPS"
  2568  	case decoderErrorAllocContextMap:
  2569  		return "CONTEXT_MAP"
  2570  	case decoderErrorAllocRingBuffer1:
  2571  		return "RING_BUFFER_1"
  2572  	case decoderErrorAllocRingBuffer2:
  2573  		return "RING_BUFFER_2"
  2574  	case decoderErrorAllocBlockTypeTrees:
  2575  		return "BLOCK_TYPE_TREES"
  2576  	case decoderErrorUnreachable:
  2577  		return "UNREACHABLE"
  2578  	default:
  2579  		return "INVALID"
  2580  	}
  2581  }