aboutsummaryrefslogtreecommitdiffstats
path: root/libqpdf/Pl_LZWDecoder.cc
diff options
context:
space:
mode:
Diffstat (limited to 'libqpdf/Pl_LZWDecoder.cc')
-rw-r--r--libqpdf/Pl_LZWDecoder.cc115
1 files changed, 36 insertions, 79 deletions
diff --git a/libqpdf/Pl_LZWDecoder.cc b/libqpdf/Pl_LZWDecoder.cc
index bace3854..34ed1bd7 100644
--- a/libqpdf/Pl_LZWDecoder.cc
+++ b/libqpdf/Pl_LZWDecoder.cc
@@ -1,14 +1,14 @@
#include <qpdf/Pl_LZWDecoder.hh>
+#include <qpdf/QIntC.hh>
#include <qpdf/QTC.hh>
#include <qpdf/QUtil.hh>
-#include <qpdf/QIntC.hh>
+#include <assert.h>
#include <stdexcept>
#include <string.h>
-#include <assert.h>
-Pl_LZWDecoder::Pl_LZWDecoder(char const* identifier, Pipeline* next,
- bool early_code_change) :
+Pl_LZWDecoder::Pl_LZWDecoder(
+ char const* identifier, Pipeline* next, bool early_code_change) :
Pipeline(identifier, next),
code_size(9),
next(0),
@@ -29,16 +29,13 @@ Pl_LZWDecoder::~Pl_LZWDecoder()
void
Pl_LZWDecoder::write(unsigned char* bytes, size_t len)
{
- for (size_t i = 0; i < len; ++i)
- {
+ for (size_t i = 0; i < len; ++i) {
this->buf[next++] = bytes[i];
- if (this->next == 3)
- {
+ if (this->next == 3) {
this->next = 0;
}
this->bits_available += 8;
- if (this->bits_available >= this->code_size)
- {
+ if (this->bits_available >= this->code_size) {
sendNextCode();
}
}
@@ -60,8 +57,7 @@ Pl_LZWDecoder::sendNextCode()
unsigned int bits_from_high = 8 - this->bit_pos;
unsigned int bits_from_med = this->code_size - bits_from_high;
unsigned int bits_from_low = 0;
- if (bits_from_med > 8)
- {
+ if (bits_from_med > 8) {
bits_from_low = bits_from_med - 8;
bits_from_med = 8;
}
@@ -71,20 +67,16 @@ Pl_LZWDecoder::sendNextCode()
unsigned int code = 0;
code += (this->buf[high] & high_mask) << bits_from_med;
code += ((this->buf[med] & med_mask) >> (8 - bits_from_med));
- if (bits_from_low)
- {
+ if (bits_from_low) {
code <<= bits_from_low;
code += ((this->buf[low] & low_mask) >> (8 - bits_from_low));
this->byte_pos = low;
this->bit_pos = bits_from_low;
- }
- else
- {
+ } else {
this->byte_pos = med;
this->bit_pos = bits_from_med;
}
- if (this->bit_pos == 8)
- {
+ if (this->bit_pos == 8) {
this->bit_pos = 0;
++this->byte_pos;
this->byte_pos %= 3;
@@ -98,23 +90,17 @@ unsigned char
Pl_LZWDecoder::getFirstChar(unsigned int code)
{
unsigned char result = '\0';
- if (code < 256)
- {
+ if (code < 256) {
result = static_cast<unsigned char>(code);
- }
- else if (code > 257)
- {
+ } else if (code > 257) {
unsigned int idx = code - 258;
- if (idx >= table.size())
- {
+ if (idx >= table.size()) {
throw std::runtime_error(
"Pl_LZWDecoder::getFirstChar: table overflow");
}
Buffer& b = table.at(idx);
result = b.getBuffer()[0];
- }
- else
- {
+ } else {
throw std::runtime_error(
"Pl_LZWDecoder::getFirstChar called with invalid code (" +
QUtil::int_to_string(code) + ")");
@@ -129,26 +115,20 @@ Pl_LZWDecoder::addToTable(unsigned char next)
unsigned char const* last_data = 0;
unsigned char tmp[1];
- if (this->last_code < 256)
- {
+ if (this->last_code < 256) {
tmp[0] = static_cast<unsigned char>(this->last_code);
last_data = tmp;
last_size = 1;
- }
- else if (this->last_code > 257)
- {
+ } else if (this->last_code > 257) {
unsigned int idx = this->last_code - 258;
- if (idx >= table.size())
- {
+ if (idx >= table.size()) {
throw std::runtime_error(
"Pl_LZWDecoder::addToTable: table overflow");
}
Buffer& b = table.at(idx);
last_data = b.getBuffer();
last_size = QIntC::to_uint(b.getSize());
- }
- else
- {
+ } else {
throw std::runtime_error(
"Pl_LZWDecoder::addToTable called with invalid code (" +
QUtil::int_to_string(this->last_code) + ")");
@@ -164,84 +144,61 @@ Pl_LZWDecoder::addToTable(unsigned char next)
void
Pl_LZWDecoder::handleCode(unsigned int code)
{
- if (this->eod)
- {
+ if (this->eod) {
return;
}
- if (code == 256)
- {
- if (! this->table.empty())
- {
+ if (code == 256) {
+ if (!this->table.empty()) {
QTC::TC("libtests", "Pl_LZWDecoder intermediate reset");
}
this->table.clear();
this->code_size = 9;
- }
- else if (code == 257)
- {
+ } else if (code == 257) {
this->eod = true;
- }
- else
- {
- if (this->last_code != 256)
- {
+ } else {
+ if (this->last_code != 256) {
// Add to the table from last time. New table entry would
// be what we read last plus the first character of what
// we're reading now.
unsigned char next = '\0';
unsigned int table_size = QIntC::to_uint(table.size());
- if (code < 256)
- {
+ if (code < 256) {
// just read < 256; last time's next was code
next = static_cast<unsigned char>(code);
- }
- else if (code > 257)
- {
+ } else if (code > 257) {
size_t idx = code - 258;
- if (idx > table_size)
- {
+ if (idx > table_size) {
throw std::runtime_error("LZWDecoder: bad code received");
- }
- else if (idx == table_size)
- {
+ } else if (idx == table_size) {
// The encoder would have just created this entry,
// so the first character of this entry would have
// been the same as the first character of the
// last entry.
QTC::TC("libtests", "Pl_LZWDecoder last was table size");
next = getFirstChar(this->last_code);
- }
- else
- {
+ } else {
next = getFirstChar(code);
}
}
unsigned int new_idx = 258 + table_size;
- if (new_idx == 4096)
- {
+ if (new_idx == 4096) {
throw std::runtime_error("LZWDecoder: table full");
}
addToTable(next);
unsigned int change_idx = new_idx + code_change_delta;
- if ((change_idx == 511) ||
- (change_idx == 1023) ||
- (change_idx == 2047))
- {
+ if ((change_idx == 511) || (change_idx == 1023) ||
+ (change_idx == 2047)) {
++this->code_size;
}
}
- if (code < 256)
- {
+ if (code < 256) {
unsigned char ch = static_cast<unsigned char>(code);
getNext()->write(&ch, 1);
- }
- else
- {
+ } else {
unsigned int idx = code - 258;
- if (idx >= table.size())
- {
+ if (idx >= table.size()) {
throw std::runtime_error(
"Pl_LZWDecoder::handleCode: table overflow");
}