Merged unpackDCL_hdyn() and unpackDCL() and removed some unused code

svn-id: r39093
This commit is contained in:
Filippos Karapetis 2009-03-03 17:50:30 +00:00
parent a4e4de9ecd
commit 0c37876830
2 changed files with 24 additions and 32 deletions

View File

@ -137,23 +137,29 @@ static int huffman_lookup(struct bit_read_struct *inp, int *tree) {
#define DCL_ASCII_MODE 1
static int unpackDCL_hdyn(byte *dest, int length, struct bit_read_struct *reader) {
int unpackDCL(uint8* dest, uint8* src, int length, int complength) {
int mode, length_param, value, val_length, val_distance;
int write_pos = 0;
struct bit_read_struct reader;
CALLC(mode = getbits(reader, 8));
CALLC(length_param = getbits(reader, 8));
reader.length = complength;
reader.bitpos = 0;
reader.bytepos = 0;
reader.data = src;
CALLC(mode = getbits(&reader, 8));
CALLC(length_param = getbits(&reader, 8));
if (mode == DCL_ASCII_MODE) {
warning("DCL-INFLATE: Decompressing ASCII mode (untested)");
} else if (mode) {
warning("DCL-INFLATE: Error: Encountered mode %02x, expected 00 or 01\n", mode);
return 1;
return -1;
}
if (Common::isDebugChannelEnabled(kDebugLevelDclInflate)) {
for (int i = 0; i < reader->length; i++) {
debugC(kDebugLevelDclInflate, "%02x ", reader->data[i]);
for (int i = 0; i < reader.length; i++) {
debugC(kDebugLevelDclInflate, "%02x ", reader.data[i]);
if (!((i + 1) & 0x1f))
debugC(kDebugLevelDclInflate, "\n");
}
@ -167,10 +173,10 @@ static int unpackDCL_hdyn(byte *dest, int length, struct bit_read_struct *reader
warning("Unexpected length_param value %d (expected in [3,6])\n", length_param);
while (write_pos < length) {
CALLC(value = getbits(reader, 1));
CALLC(value = getbits(&reader, 1));
if (value) { // (length,distance) pair
CALLC(value = huffman_lookup(reader, length_tree));
CALLC(value = huffman_lookup(&reader, length_tree));
if (value < 8)
val_length = value + 2;
@ -178,23 +184,23 @@ static int unpackDCL_hdyn(byte *dest, int length, struct bit_read_struct *reader
int length_bonus;
val_length = (1 << (value - 7)) + 8;
CALLC(length_bonus = getbits(reader, value - 7));
CALLC(length_bonus = getbits(&reader, value - 7));
val_length += length_bonus;
}
debugC(kDebugLevelDclInflate, " | ");
CALLC(value = huffman_lookup(reader, distance_tree));
CALLC(value = huffman_lookup(&reader, distance_tree));
if (val_length == 2) {
val_distance = value << 2;
CALLC(value = getbits(reader, 2));
CALLC(value = getbits(&reader, 2));
val_distance |= value;
} else {
val_distance = value << length_param;
CALLC(value = getbits(reader, length_param));
CALLC(value = getbits(&reader, length_param));
val_distance |= value;
}
++val_distance;
@ -203,12 +209,12 @@ static int unpackDCL_hdyn(byte *dest, int length, struct bit_read_struct *reader
if (val_length + write_pos > length) {
warning("DCL-INFLATE Error: Write out of bounds while copying %d bytes", val_length);
return -SCI_ERROR_DECOMPRESSION_OVERFLOW;
return SCI_ERROR_DECOMPRESSION_OVERFLOW;
}
if (write_pos < val_distance) {
warning("DCL-INFLATE Error: Attempt to copy from before beginning of input stream");
return -SCI_ERROR_DECOMPRESSION_INSANE;
return SCI_ERROR_DECOMPRESSION_INSANE;
}
while (val_length) {
@ -229,9 +235,9 @@ static int unpackDCL_hdyn(byte *dest, int length, struct bit_read_struct *reader
} else { // Copy byte verbatim
if (mode == DCL_ASCII_MODE) {
CALLC(value = huffman_lookup(reader, ascii_tree));
CALLC(value = huffman_lookup(&reader, ascii_tree));
} else {
CALLC(value = getbits(reader, 8));
CALLC(value = getbits(&reader, 8));
}
dest[write_pos++] = value;
@ -243,17 +249,6 @@ static int unpackDCL_hdyn(byte *dest, int length, struct bit_read_struct *reader
return 0;
}
int unpackDCL(uint8* dest, uint8* src, int length, int complength) {
struct bit_read_struct reader;
reader.length = complength;
reader.bitpos = 0;
reader.bytepos = 0;
reader.data = src;
return -unpackDCL_hdyn(dest, length, &reader);
}
void decryptinit3();
int decrypt3(uint8* dest, uint8* src, int length, int complength);

View File

@ -38,12 +38,13 @@ int decompress11(Resource *result, Common::ReadStream &stream, int sci_version)
uint16 compressedLength;
uint16 compressionMethod;
uint8 *buffer;
uint16 type;
result->id = stream.readByte();
if (stream.err())
return SCI_ERROR_IO_ERROR;
uint16 type = result->id & 0x7f;
type = result->id & 0x7f;
if (type > kResourceTypeInvalid)
return SCI_ERROR_DECOMPRESSION_INSANE;
@ -56,10 +57,6 @@ int decompress11(Resource *result, Common::ReadStream &stream, int sci_version)
if (stream.err())
return SCI_ERROR_IO_ERROR;
//if ((result->size < 0) || (compressedLength < 0))
// return SCI_ERROR_DECOMPRESSION_INSANE;
// This return will never happen in SCI0 or SCI1 (does it have any use?)
if (result->size > SCI_MAX_RESOURCE_SIZE)
return SCI_ERROR_RESOURCE_TOO_BIG;