29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
|
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
|
-
+
-
-
+
+
-
+
-
+
-
+
-
-
-
+
+
+
-
-
+
+
|
@interface OFInflateStream: OFStream
{
#ifdef OF_INFLATE_STREAM_M
@public
#endif
OFStream *_stream;
uint8_t _buffer[OF_INFLATE_STREAM_BUFFER_SIZE];
uint_fast16_t _bufferIndex, _bufferLength;
uint16_t _bufferIndex, _bufferLength;
uint8_t _byte;
uint_fast8_t _bitIndex, _savedBitsLength;
uint_fast16_t _savedBits;
uint8_t _bitIndex, _savedBitsLength;
uint16_t _savedBits;
@protected
uint8_t *_slidingWindow;
uint_fast16_t _slidingWindowIndex, _slidingWindowMask;
uint16_t _slidingWindowIndex, _slidingWindowMask;
enum {
OF_INFLATE_STREAM_BLOCK_HEADER,
OF_INFLATE_STREAM_UNCOMPRESSED_BLOCK_HEADER,
OF_INFLATE_STREAM_UNCOMPRESSED_BLOCK,
OF_INFLATE_STREAM_HUFFMAN_TREE,
OF_INFLATE_STREAM_HUFFMAN_BLOCK
} _state;
union {
struct {
uint_fast8_t position;
uint8_t position;
uint8_t length[4];
} uncompressedHeader;
struct {
uint_fast16_t position, length;
uint16_t position, length;
} uncompressed;
struct {
struct huffman_tree *litLenTree, *distTree;
struct huffman_tree *codeLenTree, *treeIter;
uint8_t *lengths;
uint_fast16_t receivedCount;
uint_fast8_t value, litLenCodesCount, distCodesCount;
uint_fast8_t codeLenCodesCount;
uint16_t receivedCount;
uint8_t value, litLenCodesCount, distCodesCount;
uint8_t codeLenCodesCount;
} huffmanTree;
struct {
struct huffman_tree *litLenTree, *distTree, *treeIter;
enum {
OF_INFLATE_STREAM_WRITE_VALUE,
OF_INFLATE_STREAM_AWAIT_CODE,
OF_INFLATE_STREAM_AWAIT_LENGTH_EXTRA_BITS,
OF_INFLATE_STREAM_AWAIT_DISTANCE,
OF_INFLATE_STREAM_AWAIT_DISTANCE_EXTRA_BITS,
OF_INFLATE_STREAM_PROCESS_PAIR
} state;
uint_fast16_t value, length, distance;
uint_fast16_t extraBits;
uint16_t value, length, distance;
uint16_t extraBits;
} huffman;
} _context;
bool _inLastBlock, _atEndOfStream;
}
/*!
* @brief Creates a new OFInflateStream with the specified underlying stream.
|