summaryrefslogtreecommitdiff
path: root/bencode.erl
diff options
context:
space:
mode:
authorssmith2006-05-07 20:22:22 -0700
committerssmith2006-05-07 20:22:22 -0700
commitbe5e8817ca5570b66f57f2d56148c88ae73a8531 (patch)
tree52119c8c318044871e3063930d9bbdb84e87b415 /bencode.erl
Initial version of bencode module.
Diffstat (limited to 'bencode.erl')
-rw-r--r--bencode.erl55
1 files changed, 55 insertions, 0 deletions
diff --git a/bencode.erl b/bencode.erl
new file mode 100644
index 0000000..aaf737e
--- /dev/null
+++ b/bencode.erl
@@ -0,0 +1,55 @@
+
+-module(bencode).
+
+-export([bdecode/1]).
+
+-import(string, [substr/2, substr/3, to_integer/1, chr/2]).
+
+%% String
+bdecode([Char | _Rest] = Str) when Char >= $0, Char =< $9 ->
+ ColIdx = chr(Str, $:),
+ IntStr = substr(Str, 1, ColIdx-1),
+ {Len, _} = to_integer(IntStr),
+ Result = substr(Str, ColIdx+1, Len),
+ Rest = substr(Str, ColIdx+Len+1),
+ {{string, Result}, Rest};
+
+%% Int
+bdecode([Char | Rest]) when Char == $i ->
+ End = chr(Rest, $e),
+ {Result, _} = to_integer(substr(Rest, 1, End-1)),
+ {{int, Result}, substr(Rest, End+1)};
+
+%% List
+bdecode([Char | Rest]) when Char == $l ->
+ {List, Rem} = dolist(Rest),
+ {{list, List}, Rem};
+
+%% Dict
+bdecode([Char | Rest]) when Char == $d ->
+ {Dict, Rem} = dodict(Rest),
+ {{dict, Dict}, Rem}.
+
+
+dolist(Str) ->
+ dolist(Str, []).
+
+dolist([Char | Rest], List) when Char == $e ->
+ {List, Rest};
+
+dolist(Str, List) ->
+ {Result, Rest} = bdecode(Str),
+ dolist(Rest, lists:append(List, [Result])).
+
+
+dodict(Str) ->
+ dodict(Str, dict:new()).
+
+dodict([Char | Rest], Dict) when Char == $e ->
+ {Dict, Rest};
+
+dodict(Str, Dict) ->
+ {{string, Key}, Rest} = bdecode(Str),
+ {Val, Rest2} = bdecode(Rest),
+ dodict(Rest2, dict:store(Key, Val, Dict)).
+