better showcanvas fix
[mminer.git] / dpack / packer_lzw.js
blobc48a15aec984080475710a8d08022990f403a207
1 /*
2 * packer/unpacker code derived from JavaScript O Lait library (jsolait)
3 * JavaScript O Lait library(jsolait): Copyright (c) 2003-2006 Jan-Klaas Kollhof, GNU LGPL v2.1+
5 * modified by Ketmar // Avalon Group
6 */
7 function LZWPack (str) {
8 var dict = {};
9 var data = (str+"").split("");
10 var out = [];
11 var currChar;
12 var phrase = data[0];
13 var code = 256;
15 for (var i = 1; i < data.length; i++) {
16 currChar = data[i];
17 if (dict[phrase+currChar] != null) phrase += currChar;
18 else{
19 out.push(phrase.length>1?dict[phrase]:phrase.charCodeAt(0));
20 dict[phrase+currChar] = code;
21 code++;
22 phrase = currChar;
25 out.push(phrase.length>1?dict[phrase]:phrase.charCodeAt(0));
27 var res = "";
29 function AddCode (c) {
30 if (c >= 32 && c <= 126) {
31 if (c == 34 || c == 92) res += '\\';
32 res += String.fromCharCode(c);
33 } else {
34 var h = c.toString(16).toLowerCase();
35 while (h.length < 2) h = "0"+h;
36 if (h.length == 2) res += "\\x"+h;
37 else {
38 while (h.length < 4) h = "0"+h;
39 res += "\\u"+h;
44 for (var i = 0; i < out.length; i++) AddCode(out[i]);
45 return res;
49 function LZWUnpack (str) {
50 var dict = {};
51 var data = (str+"").split("");
52 var currChar = data[0];
53 var oldPhrase = currChar;
54 var out = [currChar];
55 var code = 256;
56 var phrase;
57 for (var i = 1; i < data.length; i++) {
58 var currCode = data[i].charCodeAt(0);
59 if (currCode < 256) phrase = data[i];
60 else phrase = dict[currCode]?dict[currCode]:(oldPhrase+currChar);
61 out.push(phrase);
62 currChar = phrase.charAt(0);
63 dict[code] = oldPhrase+currChar;
64 code++;
65 oldPhrase = phrase;
67 var s = out.join("");
68 var res = [];
69 for (var f = 0; f < s.length; f++) res.push(s.charCodeAt(f));
70 return res;
74 function PackArray (arr) {
75 var s = "";
76 for (var f = 0; f < arr.length; f++) s += String.fromCharCode(arr[f]);
77 return LZWPack(s);
81 function DUnpackStr (s) {
82 return LZWUnpack(s);