Mercurial > hg > beaglert
comparison resources/osc/node_modules/binpack/index.js @ 278:3c3d042dad12 prerelease
merge
| author | Giulio Moro <giuliomoro@yahoo.it> | 
|---|---|
| date | Tue, 17 May 2016 16:07:45 +0100 | 
| parents | fb9c28a4676b | 
| children | 
   comparison
  equal
  deleted
  inserted
  replaced
| 277:4b3ae93ab102 | 278:3c3d042dad12 | 
|---|---|
| 1 // t is a binpack typename | |
| 2 var sizeOfType = function(t) { | |
| 3 // unsigned are the same length as signed | |
| 4 if(t[0] === 'U') { | |
| 5 t = t.slice(1); | |
| 6 } | |
| 7 | |
| 8 return { | |
| 9 'Float32' : 4, | |
| 10 'Float64' : 8, | |
| 11 'Int8' : 1, | |
| 12 'Int16' : 2, | |
| 13 'Int32' : 4, | |
| 14 'Int64' : 8 | |
| 15 }[t]; | |
| 16 }; | |
| 17 | |
| 18 var endianConv = function(e, t) { | |
| 19 // node doesn't define 8 bit endianness | |
| 20 if(t[t.length - 1] === '8') | |
| 21 return ''; | |
| 22 | |
| 23 if(e === 'big') { | |
| 24 return 'BE'; | |
| 25 } | |
| 26 return 'LE'; | |
| 27 }; | |
| 28 | |
| 29 var addBindings = function(binpackTypename, nodeTypename){ | |
| 30 if(!(typeof nodeTypename !== "undefined" && nodeTypename !== null)) { | |
| 31 nodeTypename = binpackTypename; | |
| 32 } | |
| 33 module.exports['pack' + binpackTypename] = function(num, endian){ | |
| 34 b = new Buffer(sizeOfType(binpackTypename)); | |
| 35 b['write' + nodeTypename + endianConv(endian, binpackTypename)](num, 0, true); | |
| 36 return b; | |
| 37 } | |
| 38 | |
| 39 module.exports['unpack' + binpackTypename] = function(buff, endian){ | |
| 40 return buff['read' + nodeTypename + endianConv(endian, binpackTypename)](0); | |
| 41 } | |
| 42 } | |
| 43 | |
| 44 var addIntBindings = function(n) { | |
| 45 addBindings("Int" + n); | |
| 46 addBindings("UInt" + n); | |
| 47 } | |
| 48 | |
| 49 addIntBindings(8); | |
| 50 addIntBindings(16); | |
| 51 addIntBindings(32); | |
| 52 | |
| 53 twoToThe32 = Math.pow(2, 32); | |
| 54 | |
| 55 // 64 bit bindings require special care | |
| 56 var read64 = function(unsigned){return function(buff, endian){ | |
| 57 var e = endianConv(endian, ''); | |
| 58 var u = unsigned ? 'U' : ''; | |
| 59 var low, high; | |
| 60 if(e === 'LE') { | |
| 61 low = buff.readUInt32LE(0); | |
| 62 high = buff['read' + u + 'Int32LE'](4); | |
| 63 } else { | |
| 64 low = buff.readUInt32BE(4); | |
| 65 high = buff['read' + u + 'Int32BE'](0); | |
| 66 } | |
| 67 return high * twoToThe32 + low; | |
| 68 };}; | |
| 69 | |
| 70 var write64 = function(unsigned){return function(num, endian){ | |
| 71 var e = endianConv(endian, ''); | |
| 72 var u = unsigned ? 'U' : ''; | |
| 73 var b = new Buffer(8); | |
| 74 var high = Math.floor(num / twoToThe32); | |
| 75 var low = Math.floor(num - high * twoToThe32); | |
| 76 if(e == 'LE') { | |
| 77 b.writeUInt32LE(low, 0, true); | |
| 78 b['write' + u + 'Int32LE'](high, 4, true); | |
| 79 } else { | |
| 80 b.writeUInt32BE(low, 4, true); | |
| 81 b['write' + u + 'Int32BE'](high, 0, true); | |
| 82 } | |
| 83 return b; | |
| 84 };}; | |
| 85 | |
| 86 module.exports.unpackInt64 = read64(false); | |
| 87 module.exports.unpackUInt64 = read64(true); | |
| 88 module.exports.packInt64 = write64(false); | |
| 89 module.exports.packUInt64 = write64(true); | |
| 90 | |
| 91 addBindings("Float32", "Float"); | |
| 92 addBindings("Float64", "Double"); | 
