1 // Copyright 2017 The Chromium OS Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #ifndef SRC_PUFF_DATA_H_ 6 #define SRC_PUFF_DATA_H_ 7 8 #include <cstddef> 9 #include <cstdint> 10 #include <functional> 11 12 namespace puffin { 13 14 // Data structure that is exchanged between the |PuffWriterInterface|, 15 // |PuffReaderInterface|, |Puffer|, and |Huffer|. 16 struct PuffData { 17 enum class Type { 18 // Used for reading/writing only one literal. 19 kLiteral, 20 21 // Used for reading/writing literals. 22 kLiterals, 23 24 // Used for reading/writing length/distance pairs. 25 kLenDist, 26 27 // Used for reading/writing a buffer as the Huffman table. The 28 // implementations should copy the data (located in |metadata|) into puff 29 // buffer. 30 kBlockMetadata, 31 32 // Used for reading/writing an end of block symbol. End of block can 33 // contain the unused bits of data at the end of a deflate stream. 34 kEndOfBlock, 35 } type; 36 37 // A function that once set, can read raw bytes from whatever its parameters 38 // are set. This function reads |count| bytes from |buffer| and advances its 39 // read offset forward. The next call to this function will start reading 40 // after the last read byte. It returns false if it cannot read or the |count| 41 // is larger than what is availabe in the buffer. 42 // Used by: 43 // PuffData::Type::kLiterals 44 std::function<bool(uint8_t* buffer, size_t count)> read_fn; 45 46 // Used by: 47 // PuffData::Type::kBlockMetadata 48 // PuffData::Type::kEndOfBlock 49 // PuffData::Type::kLiterals 50 // PuffData::Type::kLenDist 51 size_t length; 52 53 // Used by: 54 // PuffData::Type::kEndOfBlock 55 // PuffData::Type::kLenDist 56 size_t distance; 57 58 // Used by: 59 // PuffData::Type::kEndOfBlock 60 // PuffData::Type::kLiteral 61 uint8_t byte; 62 63 // 1: Header size. 64 // 3: Lengths of next three arrays. 65 // 286: Maximum number of literals/lengths codes lengths. 66 // 30: Maximum number of distance codes lengths. 67 // 19: Maximum number of header code lengths. 68 // Used by: 69 // PuffData::Type::kBlockMetadata 70 uint8_t block_metadata[1 + 3 + 286 + 30 + 19]; 71 }; 72 73 // The headers for differentiating literals from length/distance pairs. 74 constexpr uint8_t kLiteralsHeader = 0x00; 75 constexpr uint8_t kLenDistHeader = 0x80; 76 77 } // namespace puffin 78 79 #endif // SRC_PUFF_DATA_H_ 80