from sys import argv g_of = 0 def readfile(name): fd = open(name, "rb") contents = fd.read() fd.close() return contents def writefile(name, contents): fd = open(name, "wb+") fd.write(contents) fd.close() class unapack: def __init__(self, src = ""): self.src = src def getbit(self): #print "getbit(src_idx)", self.src_idx if self.mask&1: self.byte = ord(self.src[self.src_idx]) self.src_idx += 1 self.mask = (self.mask>>1) | ((self.mask<<7) & (1<<7)) #print "getbit", self.byte, self.mask, self.byte&self.mask return self.byte&self.mask def getbitgamma(self): self.gamma <<= 1 if self.getbit(): self.gamma += 1 #print "getbitgamma", self.gamma def ap_getgamma(self): self.gamma = 1 self.getbitgamma() while self.getbit(): self.getbitgamma() def copyloop(self): while self.gamma: self.dest += self.dest[-self.recentoff] self.gamma -= 1 def ap_is_lwm(self): self.recentoff = ord(self.src[self.src_idx]) + (self.gamma<<8) temp_gamma = self.gamma + print_offset temp_ord = ord(self.src[self.src_idx]) self.src_idx += 1 self.ap_getgamma() if self.recentoff >= 32000: self.gamma += 1 if self.recentoff >= 1280: self.gamma += 1 if self.recentoff < 128: self.gamma += 2 #if g_of: # print "%d: dest[-((%d-%d)*256+%d)]*%d : %d" % (len(self.dest), temp_gamma, print_offset, temp_ord, self.gamma, self.src_idx) #else: # print "%d: dest[-((%d-%d)*256+%d)]*%d" % (len(self.dest), temp_gamma, print_offset, temp_ord, self.gamma) #print "ap_is_lwm", self.recentoff, self.src_idx, self.gamma self.copyloop() def depack(self): global print_offset done = 0 self.dest = self.src[0] self.src_idx = 1 self.mask = 1 lwm = 0 while not done: if self.getbit(): if not self.getbit(): self.ap_getgamma() self.gamma -= 2 #print "lwm", lwm, "gamma", self.gamma if lwm: print_offset = 2 #print "branch1" self.ap_is_lwm() else: lwm = 1 if self.gamma: #print "branch2" self.gamma -= 1 print_offset = 3 #print "ap_is_lwm is called" self.ap_is_lwm() #print "ap_is_lwm returned" else: #print "branch3" self.ap_getgamma() #if g_of: # print "%d: dest[-%d]*%d : %d" % (len(self.dest), self.recentoff, self.gamma, self.src_idx) #else: # print "%d: dest[-%d]*%d" % (len(self.dest), self.recentoff, self.gamma) self.copyloop() elif not self.getbit(): self.gamma = ord(self.src[self.src_idx]) self.src_idx += 1 self.recentoff = self.gamma>>1 if not self.recentoff: done = 1 else: self.dest += self.dest[-self.recentoff] self.dest += self.dest[-self.recentoff] if self.gamma&1: self.dest += self.dest[-self.recentoff] #print "%d: dest[-%d]*3 (%d, %d, %d)" % (len(self.dest)-3, self.recentoff, ord(self.dest[-self.recentoff-3]), ord(self.dest[-self.recentoff-2]), ord(self.dest[-self.recentoff-1])) #else: # print "%d: dest[-%d]*2 (%d, %d)" % (len(self.dest)-2, self.recentoff, ord(self.dest[-self.recentoff-2]), ord(self.dest[-self.recentoff-1])) lwm = 1 else: self.gamma = 0 self.getbitgamma() self.getbitgamma() self.getbitgamma() self.getbitgamma() if self.gamma: #print "gamma", self.gamma, len(self.dest) #print "%d: dest[-%d] (%d)" % (len(self.dest), self.gamma, ord(self.dest[-self.gamma])) self.gamma = ord(self.dest[-self.gamma]) #else: # print "%d: zero" % len(self.dest) self.dest += chr(self.gamma) lwm = 0 else: t = self.src[self.src_idx] #if g_of: # print "%d: raw: %d : %d" % (len(self.dest), ord(t), self.src_idx) #else: # print "%d: raw: %d" % (len(self.dest), ord(t)) self.dest += t self.src_idx += 1 lwm = 0 return self.dest if __name__ == "__main__": if len(argv) == 3: src = readfile(argv[1]) writefile(argv[2], unapack(src).depack()) elif len(argv) == 4: g_of = 1 src = readfile(argv[1]) writefile(argv[2], unapack(src).depack())