This new UNWHAP-like LZW decoder should be faster and smaller than LZMA of course.
Current draft source code:
Code:
PROCEDURE INSERTNODE(L: INTEGER); INLINE;
BEGIN
TAB[N].POS := P;
TAB[N].LEN := L;
INC(N);
IF N = $10000 THEN
N := 256;
END;
PROCEDURE COPYBLOCK(I, L: INTEGER); INLINE;
BEGIN
REPEAT
BUF[P] := BUF[I];
INC(P);
INC(I);
DEC(L);
UNTIL L = 0;
END;
PROCEDURE DECODE; INLINE;
VAR
I: INTEGER;
BEGIN
N := 256;
P := 1;
FOR I := 1 TO M DO
BEGIN
IF BIN[I] >= 256 THEN
BEGIN
INSERTNODE(TAB[BIN[I]].LEN + 1);
COPYBLOCK(TAB[BIN[I]].POS, TAB[BIN[I]].LEN);
END
ELSE
BEGIN
INSERTNODE(2);
BUF[P] := BIN[I];
INC(P);
END;
END;
DEC(P);
END;
By the way, does anyone know hot to execute a program in memory. For example, RASH decompresses data to BUF[].
Briefly tried simply JMP to BUF[ENTRYPOINT OF ACTUAL EXE] - not works program crashes.
Note that currently RASH dumps unpacked code to a tmp file...