AGS: Don't call quit() from lzw functions

From upstream e5d8375df05b90e1ef51bae054da840071175aa3
This commit is contained in:
Paul Gilbert 2022-03-30 20:30:19 -07:00
parent dc7609a79c
commit eecd211bb6
2 changed files with 13 additions and 8 deletions

View File

@ -25,6 +25,7 @@
//
//=============================================================================
#include "ags/shared/util/lzw.h"
#include "ags/shared/ac/common.h" // quit
#include "ags/shared/util/stream.h"
#include "ags/globals.h"
@ -122,13 +123,13 @@ void _delete(int z) {
}
}
void lzwcompress(Stream *lzw_in, Stream *out) {
bool lzwcompress(Stream *lzw_in, Stream *out) {
int ch, i, run, len, match, size, mask;
char buf[17];
_G(lzbuffer) = (char *)malloc(N + F + (N + 1 + N + N + 256) * sizeof(int)); // 28.5 k !
if (_G(lzbuffer) == nullptr) {
quit("unable to compress: out of memory");
return false;
}
_G(node) = (int *)(_G(lzbuffer) + N + F);
@ -193,6 +194,7 @@ void lzwcompress(Stream *lzw_in, Stream *out) {
}
free(_G(lzbuffer));
return true;
}
void myputc(int ccc, Stream *out) {
@ -206,7 +208,7 @@ void myputc(int ccc, Stream *out) {
out->WriteInt8(ccc);
}
void lzwexpand(Stream *lzw_in, Stream *out, size_t out_size) {
bool lzwexpand(Stream *lzw_in, Stream *out, size_t out_size) {
int bits, ch, i, j, len, mask;
char *lzbuffer;
_G(outbytes) = 0; _G(putbytes) = 0;
@ -214,7 +216,7 @@ void lzwexpand(Stream *lzw_in, Stream *out, size_t out_size) {
lzbuffer = (char *)malloc(N);
if (lzbuffer == nullptr) {
quit("compress.cpp: unable to decompress: insufficient memory");
return false;
}
i = N - F;
@ -244,8 +246,10 @@ void lzwexpand(Stream *lzw_in, Stream *out, size_t out_size) {
if ((_G(putbytes) >= _G(maxsize)) && (_G(maxsize) > 0))
break;
if ((lzw_in->EOS()) && (_G(maxsize) > 0))
quit("Read error decompressing image - file is corrupt");
if ((lzw_in->EOS()) && (_G(maxsize) > 0)) {
free(lzbuffer);
return false;
}
} // end for mask
if ((_G(putbytes) >= _G(maxsize)) && (_G(maxsize) > 0))
@ -253,6 +257,7 @@ void lzwexpand(Stream *lzw_in, Stream *out, size_t out_size) {
}
free(lzbuffer);
return true;
}
} // namespace AGS3

View File

@ -32,8 +32,8 @@ class Stream;
using namespace AGS; // FIXME later
void lzwcompress(Shared::Stream *lzw_in, Shared::Stream *out);
void lzwexpand(Shared::Stream *lzw_in, Shared::Stream *out, size_t out_size);
bool lzwcompress(Shared::Stream *lzw_in, Shared::Stream *out);
bool lzwexpand(Shared::Stream *lzw_in, Shared::Stream *out, size_t out_size);
} // namespace AGS3