File tree Expand file tree Collapse file tree 2 files changed +101
-0
lines changed
Expand file tree Collapse file tree 2 files changed +101
-0
lines changed Original file line number Diff line number Diff line change 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+ }
Original file line number Diff line number Diff line change 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+ }
You can’t perform that action at this time.
0 commit comments