summaryrefslogtreecommitdiff
path: root/src/tlv.erl
diff options
context:
space:
mode:
authorMagnus Ahltorp <map@kth.se>2015-08-17 16:02:42 +0200
committerLinus Nordberg <linus@nordu.net>2015-08-19 16:28:35 +0200
commitc853ee34a2d2d047cc456a9fc78b2904b22dad9c (patch)
tree03e892ffd4ad25ebe23e69275dd725421654b26a /src/tlv.erl
parent85411c74332775b6b2dbc06f40074a26e7f6ba3e (diff)
Wrap entries in plop wrapper
Diffstat (limited to 'src/tlv.erl')
-rw-r--r--src/tlv.erl37
1 files changed, 31 insertions, 6 deletions
diff --git a/src/tlv.erl b/src/tlv.erl
index b1d3428..fec016b 100644
--- a/src/tlv.erl
+++ b/src/tlv.erl
@@ -3,22 +3,37 @@
-module(tlv).
--export([encode/2, decode/1]).
+-export([encode/2, decode/1, encodelist/1, decodelist/1]).
-spec encode(binary(), binary()) -> binary().
-encode(Type, Value) ->
- 4 = byte_size(Type), % FIXME: make Type a 4 octet binary
+encode(Type, Value) when byte_size(Type) == 4 ->
Len = byte_size(Value) + 8,
- <<Len:32, Type/binary, Value/binary>>.
+ <<Len:32, Type:4/binary, Value/binary>>.
-spec decode(binary()) -> {binary(), binary(), binary()}.
decode(Data) ->
<<TotalLength:32, Rest1/binary>> = Data,
Length = TotalLength - 8,
- <<Type:4/binary-unit:8, Rest2/binary>> = Rest1,
- <<Value:Length/binary-unit:8, Rest3/binary>> = Rest2,
+ <<Type:4/binary, Rest2/binary>> = Rest1,
+ <<Value:Length/binary, Rest3/binary>> = Rest2,
{Type, Value, Rest3}.
+%% Convenience functions
+
+-spec encodelist([{binary(), binary()}]) -> binary().
+encodelist(List) ->
+ list_to_binary([encode(Type, Value) || {Type, Value} <- List]).
+
+-spec decodelist(binary()) -> [{binary(), binary()}].
+decodelist(Data) ->
+ decodelist(Data, []).
+
+decodelist(<<>>, Acc) ->
+ lists:reverse(Acc);
+decodelist(Data, Acc) ->
+ {Type, Value, Rest} = decode(Data),
+ decodelist(Rest, [{Type, Value} | Acc]).
+
%%%%%%%%%%%%%%%%%%%%
-include_lib("eunit/include/eunit.hrl").
@@ -32,3 +47,13 @@ the_test_() ->
fun(TestVectors) ->
[?_assertEqual({T, V, <<>>}, decode(encode(T, V))) ||
{T, V} <- TestVectors] end}.
+
+
+-define(LISTTESTDATA, [?TESTDATA1, ?TESTDATA2]).
+list_test() ->
+ Encoded = encodelist(?LISTTESTDATA),
+ ?assertEqual(decodelist(Encoded), ?LISTTESTDATA),
+ {T1, V1, Rest} = decode(Encoded),
+ ?assertEqual({T1, V1}, ?TESTDATA1),
+ {T2, V2, <<>>} = decode(Rest),
+ ?assertEqual({T2, V2}, ?TESTDATA2).