72 lines
2.0 KiB
Python
72 lines
2.0 KiB
Python
"""
|
|
/**************************************************************
|
|
LZSS.C -- A Data Compression Program
|
|
***************************************************************
|
|
4/6/1989 Haruhiko Okumura
|
|
Use, distribute, and modify this program freely.
|
|
Please send me your improved versions.
|
|
PC-VAN SCIENCE
|
|
NIFTY-Serve PAF01022
|
|
CompuServe 74050,1022
|
|
|
|
**************************************************************/
|
|
/*
|
|
* lzss.c - Package for decompressing lzss compressed objects
|
|
*
|
|
* Copyright (c) 2003 Apple Computer, Inc.
|
|
*
|
|
* DRI: Josh de Cesare
|
|
*/
|
|
"""
|
|
from array import array
|
|
import struct
|
|
|
|
N = 4096
|
|
F = 18
|
|
THRESHOLD = 2
|
|
NIL = N
|
|
|
|
def decompress_lzss(str):
|
|
if str[:8] !="complzss":
|
|
print "decompress_lzss: complzss magic missing"
|
|
return
|
|
decompsize = struct.unpack(">L", str[12:16])[0]
|
|
text_buf = array("B", " "*(N + F - 1))
|
|
src = array("B", str[0x180:])
|
|
srclen = len(src)
|
|
dst = array("B", " "*decompsize)
|
|
r = N - F
|
|
srcidx, dstidx, flags, c = 0, 0, 0, 0
|
|
|
|
while True:
|
|
flags >>= 1
|
|
if ((flags & 0x100) == 0):
|
|
if (srcidx >= srclen):
|
|
break
|
|
c = src[srcidx]; srcidx += 1
|
|
flags = c | 0xFF00;
|
|
|
|
if (flags & 1):
|
|
if (srcidx >= srclen):
|
|
break
|
|
c = src[srcidx]; srcidx += 1
|
|
dst[dstidx] = c; dstidx += 1
|
|
text_buf[r] = c; r += 1
|
|
r &= (N - 1);
|
|
else:
|
|
if (srcidx >= srclen):
|
|
break
|
|
i = src[srcidx]; srcidx += 1
|
|
if (srcidx >= srclen):
|
|
break
|
|
j = src[srcidx]; srcidx += 1
|
|
i |= ((j & 0xF0) << 4)
|
|
j = (j & 0x0F) + THRESHOLD
|
|
for k in xrange(j+1):
|
|
c = text_buf[(i + k) & (N - 1)]
|
|
dst[dstidx] = c; dstidx += 1
|
|
text_buf[r] = c; r += 1
|
|
r &= (N - 1)
|
|
return dst.tostring()
|
|
|