// require lst
Encoder = {}
Encoder.CELL_LEN = 14
char_set = []
char_set.push(range(48, 57)) // numbers
char_set.push(range(65, 90)) // capital_letters
char_set.push(range(97, 122)) // letters
char_set.push(range(128, 193)) // extended
char_set = char_set.flat // <- 7 bit char set
Encoder.CHAR_SET = char_set
// UTILS ------------------------------------------------------
Encoder.Utils = {}
Encoder.Utils.to_bin = function(n)
if n == 0 then return "0"
if n == 1 then return "1"
return self.to_bin(floor(n / 2)) + str(n % 2)
end function
Encoder.Utils.to_int = function(n)
n = n.values
n.reverse
r = 0
for i in n.indexes
if n[i] == "1" then
r = r + 2 ^ i
end if
end for
return r
end function
Encoder.Utils.divide = function(s, n)
if s.len == 0 then
return []
end if
if s.len < n then
//prepend = "0" * (n - s.len)
//s = prepend + s
return [s]
end if
return self.divide(s[n:], n).insert(0, s[0:n])
end function
// -------------------------------------------------------------
Encoder.encode = function(lzw)
l = lzw[0:]
CELL_SIZE = 0
for i in l.indexes
if l[i] isa string then l[i] = l[i].code
l[i] = self.Utils.to_bin(l[i])
if l[i].len > CELL_SIZE then CELL_SIZE = l[i].len
end for
for i in l.indexes
l[i] = "0" * (CELL_SIZE - l[i].len) + l[i]
end for
l = l.join("")
FAT_ADDED = l.len % 7
if FAT_ADDED > 0 then FAT_ADDED = 7 - FAT_ADDED
l = l + "0" * FAT_ADDED
fat_bin = self.Utils.to_bin(FAT_ADDED)
l = "0" * (7 - fat_bin.len) + fat_bin + l
cell_bin = self.Utils.to_bin(CELL_SIZE)
l = "0" * (7 - cell_bin.len) + cell_bin + l
l = self.Utils.divide(l, 7)
//for i in l.indexes
//l[i] = self.CHAR_SET[self.Utils.to_int(l[i])]
//end for
//print l
for i in l.indexes
l[i] = char(self.CHAR_SET[self.Utils.to_int(l[i])])
end for
return l.join("")
end function
Encoder.decode = function(string)
l = string.values
for i in l.indexes
l[i] = self.Utils.to_bin(self.CHAR_SET.indexOf(l[i].code))
l[i] = "0" * (7 - l[i].len) + l[i]
end for
//l[-1] = l[-1][2:]
l = l.join("")
CELL_SIZE = self.Utils.to_int(l[0:7])
FAT_ADDED = self.Utils.to_int(l[7: 14])
l = self.Utils.divide(l[14:], 7)
//print l
if FAT_ADDED > 0 then l[-1] = l[-1][0:FAT_ADDED * -1]
//print l
l = self.Utils.divide(l.join(""), CELL_SIZE)
for i in l.indexes
l[i] = self.Utils.to_int(l[i])
if l[i] < 256 then l[i] = char(l[i])
end for
return l
end function