Cobra_Tomtrein-temp-

Untitled

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