Advertisement
Cobra_Tomtrein-temp-

huffman2

Jul 23rd, 2017
60
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.77 KB | None | 0 0
  1. --BASE FUNCTIONS
  2. local huffman = _G.huffman or {}
  3.  
  4. function dequeue(buff)
  5. os.sleep(0)
  6. if buff.next then
  7. buff.next()
  8. end
  9. local val = buff[1]
  10. if #buff <= 1 then
  11. buff[1] = nil
  12. return val
  13. else
  14. for i=2,#buff do
  15. buff[i-1] = buff[i]
  16. buff[i] = nil
  17. end
  18. end
  19. return val
  20. end
  21.  
  22. function enqueue(tab,data,ind)
  23. if ind then
  24. for i=#tab,ind,-1 do
  25. tab[i+1] = tab[i]
  26. end
  27. else
  28. ind = #tab+1
  29. end
  30. tab[ind] = data
  31. end
  32.  
  33. function insertOrder(data,tab,valueFunc)
  34. local n_val = valueFunc(data)
  35. for i2=1,#tab do
  36. local val = valueFunc(tab[i2])
  37. if n_val <= val then
  38. enqueue(tab,data,i2)
  39. return
  40. end
  41. end
  42. enqueue(tab,data)
  43. end
  44.  
  45. function sort(tab,valueFunc)
  46. local tab2 = {}
  47. for i,v in pairs(tab) do
  48. tab2[i] = v
  49. end
  50. for i=1,#tab do
  51. tab[i] = nil
  52. end
  53. for i=1,#tab2 do
  54. local data = tab2[i]
  55. insertOrder(data,tab,valueFunc)
  56. end
  57. end
  58.  
  59.  
  60. function makeLeaf(freq,char)
  61. local leaf = {}
  62. leaf.freq = freq
  63. leaf.char = char
  64. return leaf
  65. end
  66.  
  67. function isLeaf(leaf)
  68. return leaf.char ~= nil
  69. end
  70.  
  71. function makeNode(n_l1,n_l2)
  72. local node = {}
  73. node.freq = n_l1.freq + n_l2.freq
  74. node.left = n_l1
  75. node.right = n_l2
  76. print("Node made")
  77. return node
  78. end
  79.  
  80. function getFreq(node)
  81. return node.freq
  82. end
  83.  
  84. function makeCharBitTable_node(node,tbl,base)
  85. if isLeaf(node) then
  86. tbl[node.char] = base
  87. return
  88. end
  89. local m_base1 = {}
  90. local m_base2 = {}
  91. for i=1,#base do
  92. m_base1[i] = base[i]
  93. m_base2[i] = base[i]
  94. end
  95. m_base1[#base+1] = 0
  96. m_base2[#base+1] = 1
  97.  
  98. makeCharBitTable_node(node.left,tbl,m_base1)
  99.  
  100. makeCharBitTable_node(node.right,tbl,m_base2)
  101. end
  102.  
  103. function makeCharBitTable(node_tree)
  104. print(node_tree)
  105. local tbl = {}
  106. makeCharBitTable_node(node_tree.left,tbl,{0})
  107. makeCharBitTable_node(node_tree.right,tbl,{1})
  108. return tbl
  109. end
  110.  
  111. huffman.checkNodeTable = makeCharBitTable
  112.  
  113.  
  114.  
  115. function make_table(txt)
  116. local tab = {}
  117. for chr in txt:gmatch(".") do
  118. tab[chr] = (tab[chr] or 0) + 1
  119. end
  120. return tab
  121. end
  122.  
  123. function sort_huffman_table(tab)
  124. while #tab > 1 do
  125. sort(tab,getFreq)
  126. --print(textutils.serialize(tab))
  127. local n1 = dequeue(tab)
  128. --print("node1: "..textutils.serialize(n1))
  129. local n2 = dequeue(tab)
  130. --print("node2: "..textutils.serialize(n2))
  131. --print(#tab)
  132. local n3 = makeNode(n1,n2)
  133. --print("Node3: "..textutils.serialise(n3))
  134. --print(textutils.serialise(tab))
  135. insertOrder(n3,tab,getFreq)
  136. end
  137. return tab
  138. end
  139.  
  140. function make_huffman_table(txt)
  141. local tab = make_table(txt)
  142. --print(#tab)
  143. local nodeTable = {}
  144. for chr,freq in pairs(tab) do
  145. nodeTable[#nodeTable+1] = makeLeaf(freq,chr)
  146. end
  147. --print(textutils.serialize(nodeTable))
  148. sort_huffman_table(nodeTable)
  149. return nodeTable[1]
  150. end
  151.  
  152. function decode_node(node_base,bits)
  153. --print("NodeBase: "..textutils.serialize(node_base or {}))
  154. local m_bit = dequeue(bits)
  155. --print("Bit: "..m_bit)
  156. local m_node = nil
  157. if m_bit == 0 then
  158. m_node = node_base.left
  159. --print("Node: "..textutils.serialize(m_node))
  160. else
  161. m_node = node_base.right
  162. end
  163. if isLeaf(m_node) then
  164. --print("IS a leaf")
  165. return m_node.char
  166. else
  167. return decode_node(m_node,bits)
  168. end
  169. end
  170.  
  171. function decode(node_tree,bits_str,has_table)
  172. local bits_appended = {}
  173. function bits_appended.next()
  174. if #bits_appended == 0 then
  175. local chr_bits = bit.table(string.byte(bits_str:sub(1,1)))
  176. bits_str = bits_str:sub(2)
  177. for i=1,8 do
  178. bits_appended[#bits_appended+1] = chr_bits[i]
  179. end
  180. end
  181. end
  182.  
  183. print("DEPEND")
  184. local bits = huffman.depend(bits_appended)
  185. print("DEPENDED")
  186. if has_table then
  187. node_tree = huffman.unserializeTree(bits)
  188. end
  189.  
  190. local txt = ""
  191. while #bits > 0 do
  192. txt = txt..decode_node(node_tree,bits)
  193. end
  194. return txt
  195. end
  196.  
  197. function encode(node_tree,txt,addTree)
  198. local chartbl = {}
  199. local nodeCharTable = makeCharBitTable(node_tree,chartbl)
  200. for i,v in pairs(nodeCharTable) do
  201. write(i)
  202. print(unpack(v))
  203. end
  204. for chr in string.gmatch(txt,".") do
  205. chartbl[#chartbl+1] = nodeCharTable[chr]
  206. end
  207. local end_table = {}
  208.  
  209. local function m_unpack(tbl)
  210. for i=1,#tbl do
  211. end_table[#end_table+1] = tbl[i]
  212. end
  213. end
  214. if addTree == true then
  215. huffman.serializeTree(node_tree,end_table)
  216. end
  217. for i=1,#chartbl do
  218. m_unpack(chartbl[i])
  219. end
  220.  
  221. local tbl = huffman.append(end_table)
  222.  
  223. local enc_str = ""
  224.  
  225. for i=1,(#tbl/8) do
  226. local byte_bits = {}
  227. for i2=1,8 do
  228. byte_bits[i2] = tbl[(8*(i-1))+i2]
  229. end
  230. enc_str = enc_str..string.char(bit.untable(byte_bits))
  231. end
  232.  
  233. print("Returned")
  234. return tbl,enc_str
  235. end
  236.  
  237.  
  238. huffman.decode = decode
  239. huffman.makeTable = make_huffman_table
  240. huffman.encode = encode
  241.  
  242.  
  243.  
  244. --FUNCTIONS For bit Resizing
  245.  
  246. function huffman.append(bit_tbl)
  247. local needed = 8 - (#bit_tbl%8)
  248. if needed == 8 then
  249. needed = 0
  250. else
  251. for i=1,needed do
  252. bit_tbl[#bit_tbl+1] = 0
  253. end
  254. end
  255. local num_tbl = bit.table(needed)
  256. for i=1,#num_tbl do
  257. bit_tbl[#bit_tbl+1] = num_tbl[i]
  258. end
  259. return bit_tbl
  260. end
  261.  
  262. function huffman.depend(bit_tbl)
  263. print("Bit table"..tostring(bit_tbl))
  264. local needed_bits = {}
  265. for i=0,7 do
  266. needed_bits[8-i] = bit_tbl[#bit_tbl]
  267. bit_tbl[#bit_tbl] = nil
  268. end
  269. local needed = bit.untable(needed_bits)
  270. if needed ~= 0 then
  271. for i=1,needed do
  272. bit_tbl[#bit_tbl] = nil
  273. end
  274. end
  275. return bit_tbl
  276. end
  277. function bitPrint(bitTbl)
  278. for i=1,#bitTbl do
  279. write(bitTbl[i].."\t")
  280. end
  281. print()
  282. end
  283.  
  284. huffman.printBit = bitPrint
  285.  
  286.  
  287.  
  288. --FUNCTIONS For bit manipulation
  289. function bit_table(num)
  290. local tab = {}
  291. for i=1,8 do
  292. if (num % 2) == 1 then
  293. tab[9-i] = 1
  294. num = num - 1
  295. else
  296. tab[9-i] = 0
  297. end
  298. num = num / 2
  299. end
  300. return tab
  301. end
  302.  
  303. function bit_untable(tab)
  304. local num = 0
  305. for i=1,8 do
  306. num = num * 2
  307. num = num + tab[i]
  308. end
  309. return num
  310. end
  311.  
  312.  
  313. _G.bit.table = bit_table
  314. _G.bit.untable = bit_untable
  315.  
  316. --FUNCTIONS For tree serialization
  317. function add(buff,val)
  318. buff[#buff+1] = val
  319. end
  320.  
  321. function addLeaf(leaf,buff)
  322. local chr = leaf.char
  323. add(buff,1)
  324. for i,v in pairs(bit.table(string.byte(chr))) do
  325. add(buff,v)
  326. end
  327. end
  328.  
  329.  
  330. function addNode(node,buff)
  331. add(buff,0)
  332. if isLeaf(node.left) then
  333. addLeaf(node.left,buff)
  334. else
  335. addNode(node.left,buff)
  336. end
  337. if isLeaf(node.right) then
  338. addLeaf(node.right,buff)
  339. else
  340. addNode(node.right,buff)
  341. end
  342. end
  343.  
  344. function huffman.serializeTree(tree,buff)
  345. buff = buff or {}
  346. addNode(tree,buff)
  347. return buff
  348. end
  349.  
  350.  
  351. function unserializeLeaf(buff)
  352. local leaf = {}
  353. local chr_bits = {}
  354. for i=1,8 do
  355. chr_bits[i] = dequeue(buff)
  356. end
  357. leaf.char = string.char(bit.untable(chr_bits))
  358. return leaf
  359. end
  360.  
  361. function unserializeNode(buff)
  362. local node = {}
  363. local n_bit = dequeue(buff)
  364. if n_bit == 1 then
  365. node.left = unserializeLeaf(buff)
  366. else
  367. node.left = unserializeNode(buff)
  368. end
  369. n_bit = dequeue(buff)
  370. if n_bit == 1 then
  371. node.right = unserializeLeaf(buff)
  372. else
  373. node.right = unserializeNode(buff)
  374. end
  375. return node
  376. end
  377.  
  378. function huffman.unserializeTree(buff)
  379. dequeue(buff)
  380. return unserializeNode(buff)
  381. end
  382.  
  383. _G.huffman = huffman
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement