blob: ea12bc6ecf411ba568e4a17ad1b726d57f0b6826 [file] [log] [blame]
Alexander Couzens7c912ff2023-04-26 17:58:00 +00001
2-module(decode_apn).
3
4% decode APN Name Encoded Format
5% TS 23.003 APN
6-export([decode_apn/1, encode_apn/1]).
7
8decode_apn(ApnEnc) ->
9 decode_apn("", ApnEnc, 0).
10
11decode_apn(Result, [], 0) ->
12 Result;
13
14decode_apn(Result, << >>, 0) ->
15 Result;
16
17decode_apn("", ApnEnc, 0) ->
18 << NewElemLen:8, RemainEnc/bytes >> = ApnEnc,
19 case NewElemLen of
20 0 -> "";
21 _ -> decode_apn("", RemainEnc, NewElemLen)
22 end;
23
24decode_apn(Result, ApnEnc, 0) ->
25 << NewElemLen:8, RemainEnc/bytes >> = ApnEnc,
26 case NewElemLen of
27 0 -> Result;
28 _ -> decode_apn(Result ++ ".", RemainEnc, NewElemLen)
29 end;
30
31decode_apn(Result, ApnEnc, RemainLen) when RemainLen > 0 ->
32 << Char:8, RemainEnc/bytes >> = ApnEnc,
33 decode_apn(Result ++ [Char], RemainEnc, RemainLen - 1).
34
35encode_apn(ApnStr) ->
36 encode_apn(<<>>, ApnStr, "", 0).
37
38encode_apn(ApnEnc, "", "", 0) ->
39 ApnEnc;
40
41encode_apn(ApnEnc, "", CurStr, Len) ->
42 CurBin = binary:list_to_bin(CurStr),
43 Result = << ApnEnc/binary, Len, CurBin/binary >>,
44 Result;
45
46encode_apn(ApnEnc, [ Char | RemainStr ], CurStr, Len) ->
47 case Char of
48 46 -> CurBin = binary:list_to_bin(CurStr),
49 encode_apn(<<ApnEnc/binary, Len, CurBin/binary >>, RemainStr, "", 0);
50 _ -> encode_apn(ApnEnc, RemainStr, CurStr ++ [Char], Len + 1)
51 end.