From 7cd6c241503b544f85b3be23a77071eebf927119 Mon Sep 17 00:00:00 2001 From: Chris Dickinson Date: Wed, 13 Feb 2013 17:08:15 -0800 Subject: [PATCH] initial code commit --- index.js | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++++ package.json | 24 ++++++++++++++++++++++++ test.js | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 128 insertions(+) create mode 100644 index.js create mode 100644 package.json create mode 100644 test.js diff --git a/index.js b/index.js new file mode 100644 index 0000000..e37d8b6 --- /dev/null +++ b/index.js @@ -0,0 +1,52 @@ +module.exports = varint + +varint.encode = encode + +var EE = require('events').EventEmitter + , MSB = 0x80 + , REST = 0x7F + , MSBALL = ~REST + +function varint() { + var ee = new EE + + ee.write = write + ee.accum = [] + + return ee +} + +function encode(num, out, offset) { + out = out || [] + offset = offset || 0 + + while(num & MSBALL) { + out[offset++] = (num & 0xFF) | MSB + num >>>= 7 + } + out[offset] = num + return out +} + +function write(byte) { + var msb = byte & MSB + , accum = this.accum + , len + , out + + accum[accum.length] = byte & REST + if(msb) { + return + } + + len = accum.length + out = 0 + + for(var i = 0; i < len; ++i) { + out |= accum[i] << (7 * i) + } + + accum.length = 0 + this.emit('data', out) + return +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..63bf321 --- /dev/null +++ b/package.json @@ -0,0 +1,24 @@ +{ + "name": "varint", + "version": "0.0.0", + "description": "use msb to create integer values of varying sizes", + "main": "index.js", + "scripts": { + "test": "node test.js" + }, + "repository": { + "type": "git", + "url": "git://github.com/chrisdickinson/varint.git" + }, + "keywords": [ + "varint", + "protobuf", + "encode", + "decode" + ], + "author": "Chris Dickinson ", + "license": "MIT", + "devDependencies": { + "tape": "~0.2.2" + } +} diff --git a/test.js b/test.js new file mode 100644 index 0000000..5495ad8 --- /dev/null +++ b/test.js @@ -0,0 +1,52 @@ +var varint = require('./index') + , test = require('tape') + +test('fuzz test', function(assert) { + var vi = varint() + , expect + , encoded + + vi.on('data', function(data) { + assert.equal(expect, data, 'fuzz test: '+expect.toString(16)) + }) + + for(var i = 0, len = 100; i < len; ++i) { + expect = randint(0x7FFFFFFF) + encoded = varint.encode(expect) + + for(var x = 0; x < encoded.length; ++x) { + vi.write(encoded[x]) + } + } + + assert.end() +}) + +test('test single byte works as expected', function(assert) { + var num = [0xAC, 0x02] + var acc = varint() + + acc.on('data', function(data) { + assert.equal(data, 300, 'should equal 300 every time') + }) + + for(var i = 0, len = 10; i < len; ++i) { + acc.write(0xAC) + acc.write(0x02) + } + + assert.end() +}) + +test('test encode works as expected', function(assert) { + var out = [] + + assert.deepEqual(varint.encode(300), [0xAC, 0x02]) + + assert.end() +}) + + +function randint(range) { + return ~~(Math.random() * range) +}