summaryrefslogtreecommitdiff
path: root/src/lib/deflate.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/deflate.cc')
-rw-r--r--src/lib/deflate.cc33
1 files changed, 21 insertions, 12 deletions
diff --git a/src/lib/deflate.cc b/src/lib/deflate.cc
index 078dcbc..308da7c 100644
--- a/src/lib/deflate.cc
+++ b/src/lib/deflate.cc
@@ -400,11 +400,12 @@ static int8_t deflate_dynamic_huffman()
deflate_lld_lengths + hlit, hdist);
}
-int8_t deflate(unsigned char *input_buf, uint16_t input_len,
+int16_t deflate(unsigned char *input_buf, uint16_t input_len,
unsigned char *output_buf, uint16_t output_len)
{
uint8_t is_final = input_buf[0] & 0x01;
uint8_t block_type = (input_buf[0] & 0x06) >> 1;
+ int8_t ret;
#ifdef DEFLATE_DEBUG
kout << "is_final=" << is_final << " block_type=" << block_type << endl;
#endif
@@ -416,20 +417,28 @@ int8_t deflate(unsigned char *input_buf, uint16_t input_len,
deflate_output_now = output_buf;
deflate_output_end = output_buf + output_len;
- if (block_type == 0) {
- return deflate_uncompressed();
+ switch (block_type) {
+ case 0:
+ ret = deflate_uncompressed();
+ break;
+ case 1:
+ ret = deflate_static_huffman();
+ break;
+ case 2:
+ ret = deflate_dynamic_huffman();
+ break;
+ default:
+ return DEFLATE_ERR_BLOCK;
}
- if (block_type == 1) {
- return deflate_static_huffman();
- }
- if (block_type == 2) {
- return deflate_dynamic_huffman();
+
+ if (ret < 0) {
+ return ret;
}
- return DEFLATE_ERR_BLOCK;
+ return deflate_output_now - output_buf;
}
-int8_t deflate_zlib(unsigned char *input_buf, uint16_t input_len,
+int16_t deflate_zlib(unsigned char *input_buf, uint16_t input_len,
unsigned char *output_buf, uint16_t output_len)
{
if (input_len < 4) {
@@ -457,11 +466,11 @@ int8_t deflate_zlib(unsigned char *input_buf, uint16_t input_len,
return DEFLATE_ERR_FCHECK;
}
- uint8_t ret =
+ int16_t ret =
deflate(input_buf + 2, input_len - 2, output_buf, output_len);
#ifdef DEFLATE_CHECKSUM
- if (ret == 0) {
+ if (ret >= 0) {
uint16_t deflate_s1 = 1;
uint16_t deflate_s2 = 0;