52 lines
1.2 KiB
Erlang
52 lines
1.2 KiB
Erlang
|
|
-module(decode_apn).
|
|
|
|
% decode APN Name Encoded Format
|
|
% TS 23.003 APN
|
|
-export([decode_apn/1, encode_apn/1]).
|
|
|
|
decode_apn(ApnEnc) ->
|
|
decode_apn("", ApnEnc, 0).
|
|
|
|
decode_apn(Result, [], 0) ->
|
|
Result;
|
|
|
|
decode_apn(Result, << >>, 0) ->
|
|
Result;
|
|
|
|
decode_apn("", ApnEnc, 0) ->
|
|
<< NewElemLen:8, RemainEnc/bytes >> = ApnEnc,
|
|
case NewElemLen of
|
|
0 -> "";
|
|
_ -> decode_apn("", RemainEnc, NewElemLen)
|
|
end;
|
|
|
|
decode_apn(Result, ApnEnc, 0) ->
|
|
<< NewElemLen:8, RemainEnc/bytes >> = ApnEnc,
|
|
case NewElemLen of
|
|
0 -> Result;
|
|
_ -> decode_apn(Result ++ ".", RemainEnc, NewElemLen)
|
|
end;
|
|
|
|
decode_apn(Result, ApnEnc, RemainLen) when RemainLen > 0 ->
|
|
<< Char:8, RemainEnc/bytes >> = ApnEnc,
|
|
decode_apn(Result ++ [Char], RemainEnc, RemainLen - 1).
|
|
|
|
encode_apn(ApnStr) ->
|
|
encode_apn(<<>>, ApnStr, "", 0).
|
|
|
|
encode_apn(ApnEnc, "", "", 0) ->
|
|
ApnEnc;
|
|
|
|
encode_apn(ApnEnc, "", CurStr, Len) ->
|
|
CurBin = binary:list_to_bin(CurStr),
|
|
Result = << ApnEnc/binary, Len, CurBin/binary >>,
|
|
Result;
|
|
|
|
encode_apn(ApnEnc, [ Char | RemainStr ], CurStr, Len) ->
|
|
case Char of
|
|
46 -> CurBin = binary:list_to_bin(CurStr),
|
|
encode_apn(<<ApnEnc/binary, Len, CurBin/binary >>, RemainStr, "", 0);
|
|
_ -> encode_apn(ApnEnc, RemainStr, CurStr ++ [Char], Len + 1)
|
|
end.
|