// Copyright 2017 The Chromium OS Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef SRC_PUFF_DATA_H_ #define SRC_PUFF_DATA_H_ #include <cstddef> #include <cstdint> #include <functional> namespace puffin { // Data structure that is exchanged between the |PuffWriterInterface|, // |PuffReaderInterface|, |Puffer|, and |Huffer|. struct PuffData { enum class Type { // Used for reading/writing only one literal. kLiteral, // Used for reading/writing literals. kLiterals, // Used for reading/writing length/distance pairs. kLenDist, // Used for reading/writing a buffer as the Huffman table. The // implementations should copy the data (located in |metadata|) into puff // buffer. kBlockMetadata, // Used for reading/writing an end of block symbol. End of block can // contain the unused bits of data at the end of a deflate stream. kEndOfBlock, } type; // A function that once set, can read raw bytes from whatever its parameters // are set. This function reads |count| bytes from |buffer| and advances its // read offset forward. The next call to this function will start reading // after the last read byte. It returns false if it cannot read or the |count| // is larger than what is availabe in the buffer. // Used by: // PuffData::Type::kLiterals std::function<bool(uint8_t* buffer, size_t count)> read_fn; // Used by: // PuffData::Type::kBlockMetadata // PuffData::Type::kEndOfBlock // PuffData::Type::kLiterals // PuffData::Type::kLenDist size_t length; // Used by: // PuffData::Type::kEndOfBlock // PuffData::Type::kLenDist size_t distance; // Used by: // PuffData::Type::kEndOfBlock // PuffData::Type::kLiteral uint8_t byte; // 1: Header size. // 3: Lengths of next three arrays. // 286: Maximum number of literals/lengths codes lengths. // 30: Maximum number of distance codes lengths. // 19: Maximum number of header code lengths. // Used by: // PuffData::Type::kBlockMetadata uint8_t block_metadata[1 + 3 + 286 + 30 + 19]; }; // The headers for differentiating literals from length/distance pairs. constexpr uint8_t kLiteralsHeader = 0x00; constexpr uint8_t kLenDistHeader = 0x80; } // namespace puffin #endif // SRC_PUFF_DATA_H_