Skip to content

Commit 3b68f33

Browse files
author
Mark Schmale
committed
first commit - decode works
0 parents  commit 3b68f33

File tree

2 files changed

+101
-0
lines changed

2 files changed

+101
-0
lines changed

bencode.js

Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
var sys = require('sys');
2+
3+
exports.decode = function decode(str) {
4+
var arr = str.split('');
5+
6+
function integer(start) {
7+
var c = '', n = '', i = 0, mul = 1;
8+
var len = arr.length;
9+
if(arr[start] === '-') {
10+
mul = -1;
11+
start = start+1;
12+
}
13+
for(i=start;i<len;i++) {
14+
c = arr[i];
15+
if(c == parseInt(c)) {
16+
n = n + c;
17+
} else {
18+
break;
19+
}
20+
}
21+
return {next: i+1, ret: mul*parseInt(n)};
22+
}
23+
24+
function text(start) {
25+
var nfo = integer(start),
26+
start = nfo.next,
27+
len = nfo.ret
28+
i = 0
29+
full = '';
30+
31+
for(i=start;i<len+start;i++) {
32+
full = full + arr[i]
33+
}
34+
return {next: i, ret: full};
35+
}
36+
37+
function list(start) {
38+
var len = arr.length,
39+
i = start+1,
40+
list = [],
41+
tmp = {},
42+
lcnt = 0;
43+
while(i<len && arr[i] !== 'e') {
44+
tmp = next(i);
45+
i = tmp.next;
46+
list[lcnt] = tmp.ret;
47+
lcnt++;
48+
}
49+
return {next: i+1, ret: list};
50+
}
51+
52+
function dictionary(start) {
53+
var len = arr.length,
54+
i = start+1,
55+
list = {},
56+
tmp = {},
57+
isKey = true,
58+
key = '';
59+
while(i<len && arr[i] !== 'e') {
60+
tmp = next(i);
61+
i = tmp.next;
62+
if(isKey === true) {
63+
key = tmp.ret;
64+
} else {
65+
list[key] = tmp.ret;
66+
}
67+
isKey = !isKey;
68+
}
69+
return {next: i+1, ret: list};
70+
}
71+
72+
73+
function next(start) {
74+
var data = 0;
75+
start = start || 0;
76+
switch(arr[start]) {
77+
case 'i': // integer
78+
data = integer(start+1);
79+
break;
80+
case 'l': // liste
81+
data = list(start);
82+
break;
83+
case 'd': // dict
84+
data = dictionary(start);
85+
break;
86+
default: // string
87+
data = text(start);
88+
}
89+
return data;
90+
}
91+
92+
return next(0);
93+
}

package.json

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
{ "name": "bencode",
2+
"description": "a bencode de/encoder",
3+
"version": "0.0.1",
4+
"author": "Mark Schmale <[email protected]",
5+
"directories": { "/": "./" },
6+
"main": "./bencode",
7+
"engines": { "node": ">=0.1.94" }
8+
}

0 commit comments

Comments
 (0)