mirror of
https://github.com/remko/waforth
synced 2024-12-27 09:59:29 +01:00
Revert "thurtle: Add lzw & ulz compression"
This reverts commit 49f0b8f6e6315ede5df42e70de04bb508d7aa10c.
This commit is contained in:
parent
95243c368c
commit
e03c21238f
2 changed files with 0 additions and 150 deletions
|
@ -1,46 +0,0 @@
|
||||||
export function lzwEncode(data: Uint8Array) {
|
|
||||||
const dict = new Map<string, number>();
|
|
||||||
const out: Array<number> = [];
|
|
||||||
let phrase = String.fromCharCode(data[0]);
|
|
||||||
let code = 256;
|
|
||||||
for (let i = 1; i < data.length; i++) {
|
|
||||||
const chr = String.fromCharCode(data[i]);
|
|
||||||
const nphrase = phrase + chr;
|
|
||||||
if (dict.has(nphrase)) {
|
|
||||||
phrase = nphrase;
|
|
||||||
} else {
|
|
||||||
out.push(phrase.length > 1 ? dict.get(phrase)! : phrase.charCodeAt(0));
|
|
||||||
dict.set(nphrase, code);
|
|
||||||
code++;
|
|
||||||
phrase = chr;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
out.push(phrase.length > 1 ? dict.get(phrase)! : phrase.charCodeAt(0));
|
|
||||||
return new TextEncoder().encode(
|
|
||||||
out.map((c) => String.fromCharCode(c)).join("")
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
export function lzwDecode(rdata: Uint8Array) {
|
|
||||||
const data = [...new TextDecoder().decode(rdata)].map((c) => c.charCodeAt(0));
|
|
||||||
let dict = new Map<number, number[]>();
|
|
||||||
var curChar = data[0];
|
|
||||||
var curPhrase = [curChar];
|
|
||||||
var out = [curChar];
|
|
||||||
var code = 256;
|
|
||||||
for (var i = 1; i < data.length; i++) {
|
|
||||||
const c = data[i];
|
|
||||||
const phrase =
|
|
||||||
c < 256
|
|
||||||
? [data[i]]
|
|
||||||
: dict.has(c)
|
|
||||||
? dict.get(c)!
|
|
||||||
: curPhrase.concat(curChar);
|
|
||||||
out.push(...phrase);
|
|
||||||
curChar = phrase[0];
|
|
||||||
dict.set(code, curPhrase.concat(curChar));
|
|
||||||
code++;
|
|
||||||
curPhrase = phrase;
|
|
||||||
}
|
|
||||||
return new Uint8Array(out);
|
|
||||||
}
|
|
|
@ -1,104 +0,0 @@
|
||||||
export function ulzDecode(src: Uint8Array) {
|
|
||||||
const dst: Array<number> = [];
|
|
||||||
let sp = 0;
|
|
||||||
while (sp < src.length) {
|
|
||||||
const c = src[sp++];
|
|
||||||
if (c & 0x80) {
|
|
||||||
// CPY
|
|
||||||
let length;
|
|
||||||
if (c & 0x40) {
|
|
||||||
if (sp >= src.length) {
|
|
||||||
throw new Error(`incomplete CPY2`);
|
|
||||||
}
|
|
||||||
length = ((c & 0x3f) << 8) | src[sp++];
|
|
||||||
} else {
|
|
||||||
length = c & 0x3f;
|
|
||||||
}
|
|
||||||
if (sp >= src.length) {
|
|
||||||
throw new Error(`incomplete CPY`);
|
|
||||||
}
|
|
||||||
let cp = dst.length - (src[sp++] + 1);
|
|
||||||
if (cp < 0) {
|
|
||||||
throw new Error(`CPY underflow`);
|
|
||||||
}
|
|
||||||
for (let i = 0; i < length + 4; i++) {
|
|
||||||
dst.push(dst[cp++]);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
// LIT
|
|
||||||
if (sp + c >= src.length) {
|
|
||||||
throw new Error(`LIT out of bounds: ${sp} + ${c} >= ${src.length}`);
|
|
||||||
}
|
|
||||||
for (let i = 0; i < c + 1; i++) {
|
|
||||||
dst.push(src[sp++]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return new Uint8Array(dst);
|
|
||||||
}
|
|
||||||
|
|
||||||
const MIN_MAX_LENGTH = 4;
|
|
||||||
|
|
||||||
function findBestMatch(
|
|
||||||
src: Uint8Array,
|
|
||||||
sp: number,
|
|
||||||
dlen: number,
|
|
||||||
slen: number
|
|
||||||
) {
|
|
||||||
let bmlen = 0;
|
|
||||||
let bmp = 0;
|
|
||||||
let dp = sp - dlen;
|
|
||||||
for (; dlen; dp++, dlen--) {
|
|
||||||
let i = 0;
|
|
||||||
for (; ; i++) {
|
|
||||||
if (i == slen) {
|
|
||||||
return [dp, i];
|
|
||||||
}
|
|
||||||
if (src[sp + i] != src[dp + (i % dlen)]) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (i > bmlen) {
|
|
||||||
bmlen = i;
|
|
||||||
bmp = dp;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return [bmp, bmlen];
|
|
||||||
}
|
|
||||||
|
|
||||||
export function ulzEncode(src: Uint8Array) {
|
|
||||||
let dst: Array<number> = [];
|
|
||||||
let sp = 0;
|
|
||||||
let litp = -1;
|
|
||||||
while (sp < src.length) {
|
|
||||||
const dlen = Math.min(sp, 256);
|
|
||||||
const slen = Math.min(src.length - sp, 0x3fff + MIN_MAX_LENGTH);
|
|
||||||
const [bmp, bmlen] = findBestMatch(src, sp, dlen, slen);
|
|
||||||
if (bmlen >= MIN_MAX_LENGTH) {
|
|
||||||
// CPY
|
|
||||||
const bmctl = bmlen - MIN_MAX_LENGTH;
|
|
||||||
if (bmctl > 0x3f) {
|
|
||||||
// CPY2
|
|
||||||
dst.push((bmctl >> 8) | 0xc0);
|
|
||||||
dst.push(bmctl & 0xff);
|
|
||||||
} else {
|
|
||||||
dst.push(bmctl | 0x80);
|
|
||||||
}
|
|
||||||
dst.push(sp - bmp - 1);
|
|
||||||
sp += bmlen;
|
|
||||||
litp = -1;
|
|
||||||
} else {
|
|
||||||
// LIT
|
|
||||||
if (litp >= 0) {
|
|
||||||
if ((dst[litp] += 1) == 127) {
|
|
||||||
litp = -1;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
dst.push(0);
|
|
||||||
litp = dst.length - 1;
|
|
||||||
}
|
|
||||||
dst.push(src[sp++]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return new Uint8Array(dst);
|
|
||||||
}
|
|
Loading…
Reference in a new issue