From c853ee34a2d2d047cc456a9fc78b2904b22dad9c Mon Sep 17 00:00:00 2001 From: Magnus Ahltorp Date: Mon, 17 Aug 2015 16:02:42 +0200 Subject: Wrap entries in plop wrapper --- src/tlv.erl | 37 +++++++++++++++++++++++++++++++------ 1 file changed, 31 insertions(+), 6 deletions(-) (limited to 'src/tlv.erl') 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, - <>. + <>. -spec decode(binary()) -> {binary(), binary(), binary()}. decode(Data) -> <> = Data, Length = TotalLength - 8, - <> = Rest1, - <> = Rest2, + <> = Rest1, + <> = 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). -- cgit v1.1