home *** CD-ROM | disk | FTP | other *** search
- # Source Generated with Decompyle++
- # File: in.pyc (Python 2.6)
-
- __license__ = 'GPL 3'
- __copyright__ = '2009, John Schember <john@nachtimwald.com>'
- __docformat__ = 'restructuredtext en'
- import re
-
- def decompress(stream):
- txt = []
- stream.seek(0)
- if stream.read(9) != '!!8-Bit!!':
- raise ValueError('File %s contaions an invalid TCR header.' % stream.name)
- stream.read(9) != '!!8-Bit!!'
- entries = []
- for i in xrange(256):
- entry_len = ord(stream.read(1))
- entries.append(stream.read(entry_len))
-
- entry_loc = stream.read(1)
- while entry_loc != '':
- txt.append(entries[ord(entry_loc)])
- entry_loc = stream.read(1)
- return ''.join(txt)
-
-
- def compress(txt, level = 5):
- codes = list(set(re.findall('(?msu).', txt)))
- for i in range(len(codes), 256):
- codes.append('')
-
- if level <= 1:
- new_length = 256
-
- if level >= 10:
- new_length = 1
- else:
- new_length = int(256 * (10 - level) * 0.1)
- new_length = None if new_length < 1 else new_length
- coded_txt = ''
- for c in txt:
- coded_txt += chr(codes.index(c))
-
- txt = coded_txt
- new = True
- merged = True
- while new or merged:
- merge = []
- merged = False
- for i in xrange(256):
- if codes[i] != '':
- fall = list(set(re.findall('(?msu)%s.' % re.escape(chr(i)), txt)))
- if len(fall) == 1:
- j = ord(fall[0][1:2])
- if len(codes[i]) + len(codes[j]) < 256:
- merge.append((i, j))
-
-
- len(fall) == 1
-
- if merge:
- merged = True
- for i, j in merge:
- if i == j:
- codes[i] = codes[i] + codes[i]
- else:
- codes[i] = codes[i] + codes[j]
- txt = txt.replace(chr(i) + chr(j), chr(i))
- if chr(j) not in txt:
- codes[j] = ''
- continue
-
-
- new = False
- if '' in codes:
- new_codes = []
- for c in list(set(re.findall('(?msu)..', txt))):
- i = ord(c[0:1])
- j = ord(c[1:2])
- if codes[i] + codes[j] in codes:
- continue
-
- savings = txt.count(chr(i) + chr(j)) - len(codes[i]) - len(codes[j])
- if savings > 2 and len(codes[i]) + len(codes[j]) < 256:
- new_codes.append((savings, i, j, codes[i], codes[j]))
- continue
-
- if new_codes:
- new = True
- new_codes.sort((lambda x, y: if x[0] > y[0]:
- -1if x[0] < y[0]:
- 10))
- new_codes = new_codes[:new_length]
- for code in new_codes:
- if '' not in codes:
- break
-
- c = codes.index('')
- codes[c] = code[3] + code[4]
- txt = txt.replace(chr(code[1]) + chr(code[2]), chr(c))
-
-
- new_codes
- header = []
- for code in codes:
- header.append(chr(len(code)) + code)
-
- for i in xrange(len(header), 256):
- header.append(chr(0))
-
- return '!!8-Bit!!' + ''.join(header) + txt
-
-