...

Source file src/compress/bzip2/bzip2.go

Documentation: compress/bzip2

		 1  // Copyright 2011 The Go Authors. All rights reserved.
		 2  // Use of this source code is governed by a BSD-style
		 3  // license that can be found in the LICENSE file.
		 4  
		 5  // Package bzip2 implements bzip2 decompression.
		 6  package bzip2
		 7  
		 8  import "io"
		 9  
		10  // There's no RFC for bzip2. I used the Wikipedia page for reference and a lot
		11  // of guessing: https://en.wikipedia.org/wiki/Bzip2
		12  // The source code to pyflate was useful for debugging:
		13  // http://www.paul.sladen.org/projects/pyflate
		14  
		15  // A StructuralError is returned when the bzip2 data is found to be
		16  // syntactically invalid.
		17  type StructuralError string
		18  
		19  func (s StructuralError) Error() string {
		20  	return "bzip2 data invalid: " + string(s)
		21  }
		22  
		23  // A reader decompresses bzip2 compressed data.
		24  type reader struct {
		25  	br					 bitReader
		26  	fileCRC			uint32
		27  	blockCRC		 uint32
		28  	wantBlockCRC uint32
		29  	setupDone		bool // true if we have parsed the bzip2 header.
		30  	blockSize		int	// blockSize in bytes, i.e. 900 * 1000.
		31  	eof					bool
		32  	c						[256]uint // the ``C'' array for the inverse BWT.
		33  	tt					 []uint32	// mirrors the ``tt'' array in the bzip2 source and contains the P array in the upper 24 bits.
		34  	tPos				 uint32		// Index of the next output byte in tt.
		35  
		36  	preRLE			[]uint32 // contains the RLE data still to be processed.
		37  	preRLEUsed	int			// number of entries of preRLE used.
		38  	lastByte		int			// the last byte value seen.
		39  	byteRepeats uint		 // the number of repeats of lastByte seen.
		40  	repeats		 uint		 // the number of copies of lastByte to output.
		41  }
		42  
		43  // NewReader returns an io.Reader which decompresses bzip2 data from r.
		44  // If r does not also implement io.ByteReader,
		45  // the decompressor may read more data than necessary from r.
		46  func NewReader(r io.Reader) io.Reader {
		47  	bz2 := new(reader)
		48  	bz2.br = newBitReader(r)
		49  	return bz2
		50  }
		51  
		52  const bzip2FileMagic = 0x425a // "BZ"
		53  const bzip2BlockMagic = 0x314159265359
		54  const bzip2FinalMagic = 0x177245385090
		55  
		56  // setup parses the bzip2 header.
		57  func (bz2 *reader) setup(needMagic bool) error {
		58  	br := &bz2.br
		59  
		60  	if needMagic {
		61  		magic := br.ReadBits(16)
		62  		if magic != bzip2FileMagic {
		63  			return StructuralError("bad magic value")
		64  		}
		65  	}
		66  
		67  	t := br.ReadBits(8)
		68  	if t != 'h' {
		69  		return StructuralError("non-Huffman entropy encoding")
		70  	}
		71  
		72  	level := br.ReadBits(8)
		73  	if level < '1' || level > '9' {
		74  		return StructuralError("invalid compression level")
		75  	}
		76  
		77  	bz2.fileCRC = 0
		78  	bz2.blockSize = 100 * 1000 * (level - '0')
		79  	if bz2.blockSize > len(bz2.tt) {
		80  		bz2.tt = make([]uint32, bz2.blockSize)
		81  	}
		82  	return nil
		83  }
		84  
		85  func (bz2 *reader) Read(buf []byte) (n int, err error) {
		86  	if bz2.eof {
		87  		return 0, io.EOF
		88  	}
		89  
		90  	if !bz2.setupDone {
		91  		err = bz2.setup(true)
		92  		brErr := bz2.br.Err()
		93  		if brErr != nil {
		94  			err = brErr
		95  		}
		96  		if err != nil {
		97  			return 0, err
		98  		}
		99  		bz2.setupDone = true
	 100  	}
	 101  
	 102  	n, err = bz2.read(buf)
	 103  	brErr := bz2.br.Err()
	 104  	if brErr != nil {
	 105  		err = brErr
	 106  	}
	 107  	return
	 108  }
	 109  
	 110  func (bz2 *reader) readFromBlock(buf []byte) int {
	 111  	// bzip2 is a block based compressor, except that it has a run-length
	 112  	// preprocessing step. The block based nature means that we can
	 113  	// preallocate fixed-size buffers and reuse them. However, the RLE
	 114  	// preprocessing would require allocating huge buffers to store the
	 115  	// maximum expansion. Thus we process blocks all at once, except for
	 116  	// the RLE which we decompress as required.
	 117  	n := 0
	 118  	for (bz2.repeats > 0 || bz2.preRLEUsed < len(bz2.preRLE)) && n < len(buf) {
	 119  		// We have RLE data pending.
	 120  
	 121  		// The run-length encoding works like this:
	 122  		// Any sequence of four equal bytes is followed by a length
	 123  		// byte which contains the number of repeats of that byte to
	 124  		// include. (The number of repeats can be zero.) Because we are
	 125  		// decompressing on-demand our state is kept in the reader
	 126  		// object.
	 127  
	 128  		if bz2.repeats > 0 {
	 129  			buf[n] = byte(bz2.lastByte)
	 130  			n++
	 131  			bz2.repeats--
	 132  			if bz2.repeats == 0 {
	 133  				bz2.lastByte = -1
	 134  			}
	 135  			continue
	 136  		}
	 137  
	 138  		bz2.tPos = bz2.preRLE[bz2.tPos]
	 139  		b := byte(bz2.tPos)
	 140  		bz2.tPos >>= 8
	 141  		bz2.preRLEUsed++
	 142  
	 143  		if bz2.byteRepeats == 3 {
	 144  			bz2.repeats = uint(b)
	 145  			bz2.byteRepeats = 0
	 146  			continue
	 147  		}
	 148  
	 149  		if bz2.lastByte == int(b) {
	 150  			bz2.byteRepeats++
	 151  		} else {
	 152  			bz2.byteRepeats = 0
	 153  		}
	 154  		bz2.lastByte = int(b)
	 155  
	 156  		buf[n] = b
	 157  		n++
	 158  	}
	 159  
	 160  	return n
	 161  }
	 162  
	 163  func (bz2 *reader) read(buf []byte) (int, error) {
	 164  	for {
	 165  		n := bz2.readFromBlock(buf)
	 166  		if n > 0 || len(buf) == 0 {
	 167  			bz2.blockCRC = updateCRC(bz2.blockCRC, buf[:n])
	 168  			return n, nil
	 169  		}
	 170  
	 171  		// End of block. Check CRC.
	 172  		if bz2.blockCRC != bz2.wantBlockCRC {
	 173  			bz2.br.err = StructuralError("block checksum mismatch")
	 174  			return 0, bz2.br.err
	 175  		}
	 176  
	 177  		// Find next block.
	 178  		br := &bz2.br
	 179  		switch br.ReadBits64(48) {
	 180  		default:
	 181  			return 0, StructuralError("bad magic value found")
	 182  
	 183  		case bzip2BlockMagic:
	 184  			// Start of block.
	 185  			err := bz2.readBlock()
	 186  			if err != nil {
	 187  				return 0, err
	 188  			}
	 189  
	 190  		case bzip2FinalMagic:
	 191  			// Check end-of-file CRC.
	 192  			wantFileCRC := uint32(br.ReadBits64(32))
	 193  			if br.err != nil {
	 194  				return 0, br.err
	 195  			}
	 196  			if bz2.fileCRC != wantFileCRC {
	 197  				br.err = StructuralError("file checksum mismatch")
	 198  				return 0, br.err
	 199  			}
	 200  
	 201  			// Skip ahead to byte boundary.
	 202  			// Is there a file concatenated to this one?
	 203  			// It would start with BZ.
	 204  			if br.bits%8 != 0 {
	 205  				br.ReadBits(br.bits % 8)
	 206  			}
	 207  			b, err := br.r.ReadByte()
	 208  			if err == io.EOF {
	 209  				br.err = io.EOF
	 210  				bz2.eof = true
	 211  				return 0, io.EOF
	 212  			}
	 213  			if err != nil {
	 214  				br.err = err
	 215  				return 0, err
	 216  			}
	 217  			z, err := br.r.ReadByte()
	 218  			if err != nil {
	 219  				if err == io.EOF {
	 220  					err = io.ErrUnexpectedEOF
	 221  				}
	 222  				br.err = err
	 223  				return 0, err
	 224  			}
	 225  			if b != 'B' || z != 'Z' {
	 226  				return 0, StructuralError("bad magic value in continuation file")
	 227  			}
	 228  			if err := bz2.setup(false); err != nil {
	 229  				return 0, err
	 230  			}
	 231  		}
	 232  	}
	 233  }
	 234  
	 235  // readBlock reads a bzip2 block. The magic number should already have been consumed.
	 236  func (bz2 *reader) readBlock() (err error) {
	 237  	br := &bz2.br
	 238  	bz2.wantBlockCRC = uint32(br.ReadBits64(32)) // skip checksum. TODO: check it if we can figure out what it is.
	 239  	bz2.blockCRC = 0
	 240  	bz2.fileCRC = (bz2.fileCRC<<1 | bz2.fileCRC>>31) ^ bz2.wantBlockCRC
	 241  	randomized := br.ReadBits(1)
	 242  	if randomized != 0 {
	 243  		return StructuralError("deprecated randomized files")
	 244  	}
	 245  	origPtr := uint(br.ReadBits(24))
	 246  
	 247  	// If not every byte value is used in the block (i.e., it's text) then
	 248  	// the symbol set is reduced. The symbols used are stored as a
	 249  	// two-level, 16x16 bitmap.
	 250  	symbolRangeUsedBitmap := br.ReadBits(16)
	 251  	symbolPresent := make([]bool, 256)
	 252  	numSymbols := 0
	 253  	for symRange := uint(0); symRange < 16; symRange++ {
	 254  		if symbolRangeUsedBitmap&(1<<(15-symRange)) != 0 {
	 255  			bits := br.ReadBits(16)
	 256  			for symbol := uint(0); symbol < 16; symbol++ {
	 257  				if bits&(1<<(15-symbol)) != 0 {
	 258  					symbolPresent[16*symRange+symbol] = true
	 259  					numSymbols++
	 260  				}
	 261  			}
	 262  		}
	 263  	}
	 264  
	 265  	if numSymbols == 0 {
	 266  		// There must be an EOF symbol.
	 267  		return StructuralError("no symbols in input")
	 268  	}
	 269  
	 270  	// A block uses between two and six different Huffman trees.
	 271  	numHuffmanTrees := br.ReadBits(3)
	 272  	if numHuffmanTrees < 2 || numHuffmanTrees > 6 {
	 273  		return StructuralError("invalid number of Huffman trees")
	 274  	}
	 275  
	 276  	// The Huffman tree can switch every 50 symbols so there's a list of
	 277  	// tree indexes telling us which tree to use for each 50 symbol block.
	 278  	numSelectors := br.ReadBits(15)
	 279  	treeIndexes := make([]uint8, numSelectors)
	 280  
	 281  	// The tree indexes are move-to-front transformed and stored as unary
	 282  	// numbers.
	 283  	mtfTreeDecoder := newMTFDecoderWithRange(numHuffmanTrees)
	 284  	for i := range treeIndexes {
	 285  		c := 0
	 286  		for {
	 287  			inc := br.ReadBits(1)
	 288  			if inc == 0 {
	 289  				break
	 290  			}
	 291  			c++
	 292  		}
	 293  		if c >= numHuffmanTrees {
	 294  			return StructuralError("tree index too large")
	 295  		}
	 296  		treeIndexes[i] = mtfTreeDecoder.Decode(c)
	 297  	}
	 298  
	 299  	// The list of symbols for the move-to-front transform is taken from
	 300  	// the previously decoded symbol bitmap.
	 301  	symbols := make([]byte, numSymbols)
	 302  	nextSymbol := 0
	 303  	for i := 0; i < 256; i++ {
	 304  		if symbolPresent[i] {
	 305  			symbols[nextSymbol] = byte(i)
	 306  			nextSymbol++
	 307  		}
	 308  	}
	 309  	mtf := newMTFDecoder(symbols)
	 310  
	 311  	numSymbols += 2 // to account for RUNA and RUNB symbols
	 312  	huffmanTrees := make([]huffmanTree, numHuffmanTrees)
	 313  
	 314  	// Now we decode the arrays of code-lengths for each tree.
	 315  	lengths := make([]uint8, numSymbols)
	 316  	for i := range huffmanTrees {
	 317  		// The code lengths are delta encoded from a 5-bit base value.
	 318  		length := br.ReadBits(5)
	 319  		for j := range lengths {
	 320  			for {
	 321  				if length < 1 || length > 20 {
	 322  					return StructuralError("Huffman length out of range")
	 323  				}
	 324  				if !br.ReadBit() {
	 325  					break
	 326  				}
	 327  				if br.ReadBit() {
	 328  					length--
	 329  				} else {
	 330  					length++
	 331  				}
	 332  			}
	 333  			lengths[j] = uint8(length)
	 334  		}
	 335  		huffmanTrees[i], err = newHuffmanTree(lengths)
	 336  		if err != nil {
	 337  			return err
	 338  		}
	 339  	}
	 340  
	 341  	selectorIndex := 1 // the next tree index to use
	 342  	if len(treeIndexes) == 0 {
	 343  		return StructuralError("no tree selectors given")
	 344  	}
	 345  	if int(treeIndexes[0]) >= len(huffmanTrees) {
	 346  		return StructuralError("tree selector out of range")
	 347  	}
	 348  	currentHuffmanTree := huffmanTrees[treeIndexes[0]]
	 349  	bufIndex := 0 // indexes bz2.buf, the output buffer.
	 350  	// The output of the move-to-front transform is run-length encoded and
	 351  	// we merge the decoding into the Huffman parsing loop. These two
	 352  	// variables accumulate the repeat count. See the Wikipedia page for
	 353  	// details.
	 354  	repeat := 0
	 355  	repeatPower := 0
	 356  
	 357  	// The `C' array (used by the inverse BWT) needs to be zero initialized.
	 358  	for i := range bz2.c {
	 359  		bz2.c[i] = 0
	 360  	}
	 361  
	 362  	decoded := 0 // counts the number of symbols decoded by the current tree.
	 363  	for {
	 364  		if decoded == 50 {
	 365  			if selectorIndex >= numSelectors {
	 366  				return StructuralError("insufficient selector indices for number of symbols")
	 367  			}
	 368  			if int(treeIndexes[selectorIndex]) >= len(huffmanTrees) {
	 369  				return StructuralError("tree selector out of range")
	 370  			}
	 371  			currentHuffmanTree = huffmanTrees[treeIndexes[selectorIndex]]
	 372  			selectorIndex++
	 373  			decoded = 0
	 374  		}
	 375  
	 376  		v := currentHuffmanTree.Decode(br)
	 377  		decoded++
	 378  
	 379  		if v < 2 {
	 380  			// This is either the RUNA or RUNB symbol.
	 381  			if repeat == 0 {
	 382  				repeatPower = 1
	 383  			}
	 384  			repeat += repeatPower << v
	 385  			repeatPower <<= 1
	 386  
	 387  			// This limit of 2 million comes from the bzip2 source
	 388  			// code. It prevents repeat from overflowing.
	 389  			if repeat > 2*1024*1024 {
	 390  				return StructuralError("repeat count too large")
	 391  			}
	 392  			continue
	 393  		}
	 394  
	 395  		if repeat > 0 {
	 396  			// We have decoded a complete run-length so we need to
	 397  			// replicate the last output symbol.
	 398  			if repeat > bz2.blockSize-bufIndex {
	 399  				return StructuralError("repeats past end of block")
	 400  			}
	 401  			for i := 0; i < repeat; i++ {
	 402  				b := mtf.First()
	 403  				bz2.tt[bufIndex] = uint32(b)
	 404  				bz2.c[b]++
	 405  				bufIndex++
	 406  			}
	 407  			repeat = 0
	 408  		}
	 409  
	 410  		if int(v) == numSymbols-1 {
	 411  			// This is the EOF symbol. Because it's always at the
	 412  			// end of the move-to-front list, and never gets moved
	 413  			// to the front, it has this unique value.
	 414  			break
	 415  		}
	 416  
	 417  		// Since two metasymbols (RUNA and RUNB) have values 0 and 1,
	 418  		// one would expect |v-2| to be passed to the MTF decoder.
	 419  		// However, the front of the MTF list is never referenced as 0,
	 420  		// it's always referenced with a run-length of 1. Thus 0
	 421  		// doesn't need to be encoded and we have |v-1| in the next
	 422  		// line.
	 423  		b := mtf.Decode(int(v - 1))
	 424  		if bufIndex >= bz2.blockSize {
	 425  			return StructuralError("data exceeds block size")
	 426  		}
	 427  		bz2.tt[bufIndex] = uint32(b)
	 428  		bz2.c[b]++
	 429  		bufIndex++
	 430  	}
	 431  
	 432  	if origPtr >= uint(bufIndex) {
	 433  		return StructuralError("origPtr out of bounds")
	 434  	}
	 435  
	 436  	// We have completed the entropy decoding. Now we can perform the
	 437  	// inverse BWT and setup the RLE buffer.
	 438  	bz2.preRLE = bz2.tt[:bufIndex]
	 439  	bz2.preRLEUsed = 0
	 440  	bz2.tPos = inverseBWT(bz2.preRLE, origPtr, bz2.c[:])
	 441  	bz2.lastByte = -1
	 442  	bz2.byteRepeats = 0
	 443  	bz2.repeats = 0
	 444  
	 445  	return nil
	 446  }
	 447  
	 448  // inverseBWT implements the inverse Burrows-Wheeler transform as described in
	 449  // http://www.hpl.hp.com/techreports/Compaq-DEC/SRC-RR-124.pdf, section 4.2.
	 450  // In that document, origPtr is called ``I'' and c is the ``C'' array after the
	 451  // first pass over the data. It's an argument here because we merge the first
	 452  // pass with the Huffman decoding.
	 453  //
	 454  // This also implements the ``single array'' method from the bzip2 source code
	 455  // which leaves the output, still shuffled, in the bottom 8 bits of tt with the
	 456  // index of the next byte in the top 24-bits. The index of the first byte is
	 457  // returned.
	 458  func inverseBWT(tt []uint32, origPtr uint, c []uint) uint32 {
	 459  	sum := uint(0)
	 460  	for i := 0; i < 256; i++ {
	 461  		sum += c[i]
	 462  		c[i] = sum - c[i]
	 463  	}
	 464  
	 465  	for i := range tt {
	 466  		b := tt[i] & 0xff
	 467  		tt[c[b]] |= uint32(i) << 8
	 468  		c[b]++
	 469  	}
	 470  
	 471  	return tt[origPtr] >> 8
	 472  }
	 473  
	 474  // This is a standard CRC32 like in hash/crc32 except that all the shifts are reversed,
	 475  // causing the bits in the input to be processed in the reverse of the usual order.
	 476  
	 477  var crctab [256]uint32
	 478  
	 479  func init() {
	 480  	const poly = 0x04C11DB7
	 481  	for i := range crctab {
	 482  		crc := uint32(i) << 24
	 483  		for j := 0; j < 8; j++ {
	 484  			if crc&0x80000000 != 0 {
	 485  				crc = (crc << 1) ^ poly
	 486  			} else {
	 487  				crc <<= 1
	 488  			}
	 489  		}
	 490  		crctab[i] = crc
	 491  	}
	 492  }
	 493  
	 494  // updateCRC updates the crc value to incorporate the data in b.
	 495  // The initial value is 0.
	 496  func updateCRC(val uint32, b []byte) uint32 {
	 497  	crc := ^val
	 498  	for _, v := range b {
	 499  		crc = crctab[byte(crc>>24)^v] ^ (crc << 8)
	 500  	}
	 501  	return ^crc
	 502  }
	 503  

View as plain text