Advertisement
rg443

BiSON.js

Aug 20th, 2015
241
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. (function(Array, undefined) {
  2.   var chrTable = new Array(256), maskTable = new Array(9), powTable = new Array(9), reversePowTable = new Array(9);
  3.   for (var i = 0;i < 256;i++) {
  4.     chrTable[i] = String.fromCharCode(i);
  5.   }
  6.   for (var f = 0;f < 9;f++) {
  7.     maskTable[f] = ~((powTable[f] = Math.pow(2, f) - 1) ^ 255);
  8.     reversePowTable[f] = Math.pow(10, f);
  9.   }
  10.   var bitStream = "", bitValue = 0, bitsLeft = 8, streamIndex = 0;
  11.   function write(val, count) {
  12.     var overflow = count - bitsLeft, use = bitsLeft < count ? bitsLeft : count, shift = bitsLeft - use;
  13.     if (overflow > 0) {
  14.       bitValue += val >> overflow << shift;
  15.     } else {
  16.       bitValue += val << shift;
  17.     }
  18.     bitsLeft -= use;
  19.     if (bitsLeft === 0) {
  20.       bitStream += chrTable[bitValue];
  21.       bitsLeft = 8;
  22.       bitValue = 0;
  23.       if (overflow > 0) {
  24.         bitValue += (val & powTable[overflow]) << 8 - overflow;
  25.         bitsLeft -= overflow;
  26.       }
  27.     }
  28.   }
  29.   function read(count) {
  30.     var overflow = count - bitsLeft, use = bitsLeft < count ? bitsLeft : count, shift = bitsLeft - use;
  31.     var val = (bitValue & maskTable[bitsLeft]) >> shift;
  32.     bitsLeft -= use;
  33.     if (bitsLeft === 0) {
  34.       bitValue = bitStream.charCodeAt(++streamIndex);
  35.       bitsLeft = 8;
  36.       if (overflow > 0) {
  37.         val = val << overflow | (bitValue & maskTable[bitsLeft]) >> 8 - overflow;
  38.         bitsLeft -= overflow;
  39.       }
  40.     }
  41.     if (streamIndex > bitStream.length) {
  42.       return 7;
  43.     }
  44.     return val;
  45.   }
  46.   function _encode(value, top) {
  47.     if (typeof value === "number") {
  48.       var type = value !== (value | 0) ? 1 : 0, sign = 0;
  49.       if (value < 0) {
  50.         value = -value;
  51.         sign = 1;
  52.       }
  53.       write(1 + type, 3);
  54.       if (type) {
  55.         var shift = 0, step = 10, m = value, tmp = 0;
  56.         do {
  57.           m = value * step;
  58.           step *= 10;
  59.           shift++;
  60.           tmp = m | 0;
  61.         } while (m - tmp > 1 / step && shift < 8 && m < 214748364);
  62.         step = tmp / 10;
  63.         if (step === (step | 0)) {
  64.           tmp = step;
  65.           shift--;
  66.         }
  67.         value = tmp;
  68.       }
  69.       if (value < 2) {
  70.         write(value, 4);
  71.       } else {
  72.         if (value < 16) {
  73.           write(1, 3);
  74.           write(value, 4);
  75.         } else {
  76.           if (value < 256) {
  77.             write(2, 3);
  78.             write(value, 8);
  79.           } else {
  80.             if (value < 4096) {
  81.               write(3, 3);
  82.               write(value >> 8 & 255, 4);
  83.               write(value & 255, 8);
  84.             } else {
  85.               if (value < 65536) {
  86.                 write(4, 3);
  87.                 write(value >> 8 & 255, 8);
  88.                 write(value & 255, 8);
  89.               } else {
  90.                 if (value < 1048576) {
  91.                   write(5, 3);
  92.                   write(value >> 16 & 255, 4);
  93.                   write(value >> 8 & 255, 8);
  94.                   write(value & 255, 8);
  95.                 } else {
  96.                   if (value < 16777216) {
  97.                     write(6, 3);
  98.                     write(value >> 16 & 255, 8);
  99.                     write(value >> 8 & 255, 8);
  100.                     write(value & 255, 8);
  101.                   } else {
  102.                     write(7, 3);
  103.                     write(value >> 24 & 255, 8);
  104.                     write(value >> 16 & 255, 8);
  105.                     write(value >> 8 & 255, 8);
  106.                     write(value & 255, 8);
  107.                   }
  108.                 }
  109.               }
  110.             }
  111.           }
  112.         }
  113.       }
  114.       write(sign, 1);
  115.       if (type) {
  116.         write(shift, 4);
  117.       }
  118.     } else {
  119.       if (typeof value === "string") {
  120.         var len = value.length;
  121.         write(3, 3);
  122.         if (len > 65535) {
  123.           write(31, 5);
  124.           write(len >> 24 & 255, 8);
  125.           write(len >> 16 & 255, 8);
  126.           write(len >> 8 & 255, 8);
  127.           write(len & 255, 8);
  128.         } else {
  129.           if (len > 255) {
  130.             write(30, 5);
  131.             write(len >> 8 & 255, 8);
  132.             write(len & 255, 8);
  133.           } else {
  134.             if (len > 28) {
  135.               write(29, 5);
  136.               write(len, 8);
  137.             } else {
  138.               write(len, 5);
  139.             }
  140.           }
  141.         }
  142.         if (bitsLeft !== 8) {
  143.           bitStream += chrTable[bitValue];
  144.           bitValue = 0;
  145.           bitsLeft = 8;
  146.         }
  147.         bitStream += value;
  148.       } else {
  149.         if (typeof value === "boolean") {
  150.           write(+value, 4);
  151.         } else {
  152.           if (value === null) {
  153.             write(7, 3);
  154.             write(0, 1);
  155.           } else {
  156.             if (value instanceof Array) {
  157.               write(4, 3);
  158.               for (var i = 0, l = value.length;i < l;i++) {
  159.                 _encode(value[i]);
  160.               }
  161.               if (!top) {
  162.                 write(6, 3);
  163.               }
  164.             } else {
  165.               write(5, 3);
  166.               for (var e in value) {
  167.                 _encode(e);
  168.                 _encode(value[e]);
  169.               }
  170.               if (!top) {
  171.                 write(6, 3);
  172.               }
  173.             }
  174.           }
  175.         }
  176.       }
  177.     }
  178.   }
  179.   function encode(value) {
  180.     bitsLeft = 8;
  181.     bitValue = 0;
  182.     bitStream = "";
  183.     _encode(value, true);
  184.     write(7, 3);
  185.     write(1, 1);
  186.     if (bitValue > 0) {
  187.       bitStream += chrTable[bitValue];
  188.     }
  189.     return bitStream;
  190.   }
  191.   function decode(string) {
  192.     var stack = [], i = -1, decoded, type, top, value, getKey = false, key, isObj;
  193.     bitsLeft = 8;
  194.     streamIndex = 0;
  195.     bitStream = string;
  196.     bitValue = bitStream.charCodeAt(streamIndex);
  197.     while (true) {
  198.       type = read(3);
  199.       switch(type) {
  200.         case 0:
  201.           value = read(1) ? true : false;
  202.           break;
  203.         case 7:
  204.           switch(read(1)) {
  205.             case 1:
  206.               return decoded;
  207.             case 7:
  208.               return undefined;
  209.             default:
  210.               value = null;
  211.           }
  212.           break;
  213.         case 1:
  214.         ;
  215.         case 2:
  216.           switch(read(3)) {
  217.             case 0:
  218.               value = read(1);
  219.               break;
  220.             case 1:
  221.               value = read(4);
  222.               break;
  223.             case 2:
  224.               value = read(8);
  225.               break;
  226.             case 3:
  227.               value = (read(4) << 8) + read(8);
  228.               break;
  229.             case 4:
  230.               value = (read(8) << 8) + read(8);
  231.               break;
  232.             case 5:
  233.               value = (read(4) << 16) + (read(8) << 8) + read(8);
  234.               break;
  235.             case 6:
  236.               value = (read(8) << 16) + (read(8) << 8) + read(8);
  237.               break;
  238.             case 7:
  239.               value = (read(8) << 24) + (read(8) << 16) + (read(8) << 8) + read(8);
  240.               break;
  241.           }
  242.           if (read(1)) {
  243.             value = -value;
  244.           }
  245.           if (type === 2) {
  246.             value /= reversePowTable[read(4)];
  247.           }
  248.           break;
  249.         case 3:
  250.           var size = read(5);
  251.           switch(size) {
  252.             case 31:
  253.               size = (read(8) << 24) + (read(8) << 16) + (read(8) << 8) + read(8);
  254.               break;
  255.             case 30:
  256.               size = (read(8) << 8) + read(8);
  257.               break;
  258.             case 29:
  259.               size = read(8);
  260.               break;
  261.           }
  262.           if (bitsLeft !== 8) {
  263.             streamIndex++;
  264.             bitValue = 0;
  265.             bitsLeft = 8;
  266.           }
  267.           value = bitStream.substr(streamIndex, size);
  268.           streamIndex += size;
  269.           bitValue = bitStream.charCodeAt(streamIndex);
  270.           if (getKey) {
  271.             key = value;
  272.             getKey = false;
  273.             continue;
  274.           }
  275.           break;
  276.         case 4:
  277.         ;
  278.         case 5:
  279.           getKey = type === 5;
  280.           value = getKey ? {} : [];
  281.           if (decoded === undefined) {
  282.             decoded = value;
  283.           } else {
  284.             if (isObj) {
  285.               top[key] = value;
  286.             } else {
  287.               top.push(value);
  288.             }
  289.           }
  290.           top = stack[++i] = value;
  291.           isObj = !(top instanceof Array);
  292.           continue;
  293.         case 6:
  294.           top = stack[--i];
  295.           getKey = isObj = !(top instanceof Array);
  296.           continue;
  297.       }
  298.       if (isObj) {
  299.         top[key] = value;
  300.         getKey = true;
  301.       } else {
  302.         if (top !== undefined) {
  303.           top.push(value);
  304.         } else {
  305.           return value;
  306.         }
  307.       }
  308.     }
  309.   }
  310.   if (typeof exports !== "undefined") {
  311.     exports.encode = encode;
  312.     exports.decode = decode;
  313.   } else {
  314.     window.BISON = {encode:encode, decode:decode};
  315.   }
  316. })(Array);
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement