Fix C2M compression occasionally losing the last byte
This commit is contained in:
parent
fa18238e60
commit
89ae9aa4a3
@ -1117,10 +1117,18 @@ function compress(buf) {
|
|||||||
// If we found a match that's worth copying (i.e. shorter than just writing a data block),
|
// If we found a match that's worth copying (i.e. shorter than just writing a data block),
|
||||||
// then do so
|
// then do so
|
||||||
let do_copy = (best_length > 3);
|
let do_copy = (best_length > 3);
|
||||||
|
|
||||||
|
// If we're not copying, add this byte to a pending data block /now/, so the next block can
|
||||||
|
// catch it if it happens to be the last byte
|
||||||
|
if (! do_copy) {
|
||||||
|
pending_data_length += 1;
|
||||||
|
p++;
|
||||||
|
}
|
||||||
|
|
||||||
// Write out any pending data block if necessary -- i.e. if we're about to write a copy
|
// Write out any pending data block if necessary -- i.e. if we're about to write a copy
|
||||||
// block, if we're at the max size of a data block, or if this is the end of the data
|
// block, if we're at the max size of a data block, or if this is the end of the data
|
||||||
if (pending_data_length > 0 &&
|
if (pending_data_length > 0 &&
|
||||||
(do_copy || pending_data_length === 127 || p === buf.byteLength - 1))
|
(do_copy || pending_data_length === 127 || p >= buf.byteLength))
|
||||||
{
|
{
|
||||||
outbytes[q] = pending_data_length;
|
outbytes[q] = pending_data_length;
|
||||||
q++;
|
q++;
|
||||||
@ -1131,6 +1139,7 @@ function compress(buf) {
|
|||||||
pending_data_length = 0;
|
pending_data_length = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Finally, do a copy
|
||||||
if (do_copy) {
|
if (do_copy) {
|
||||||
outbytes[q] = 0x80 + best_length;
|
outbytes[q] = 0x80 + best_length;
|
||||||
outbytes[q + 1] = p - best_start;
|
outbytes[q + 1] = p - best_start;
|
||||||
@ -1138,11 +1147,6 @@ function compress(buf) {
|
|||||||
// Update p, noting that we might've done a copy into the future
|
// Update p, noting that we might've done a copy into the future
|
||||||
p += best_length;
|
p += best_length;
|
||||||
}
|
}
|
||||||
else {
|
|
||||||
// Otherwise, add this to a pending data block
|
|
||||||
pending_data_length += 1;
|
|
||||||
p++;
|
|
||||||
}
|
|
||||||
|
|
||||||
// If we ever exceed the uncompressed length, don't even bother
|
// If we ever exceed the uncompressed length, don't even bother
|
||||||
if (q > buf.byteLength) {
|
if (q > buf.byteLength) {
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user