Alexander Couzens | 7c912ff | 2023-04-26 17:58:00 +0000 | [diff] [blame] | 1 | |
| 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 | |
| 8 | decode_apn(ApnEnc) -> |
| 9 | decode_apn("", ApnEnc, 0). |
| 10 | |
| 11 | decode_apn(Result, [], 0) -> |
| 12 | Result; |
| 13 | |
| 14 | decode_apn(Result, << >>, 0) -> |
| 15 | Result; |
| 16 | |
| 17 | decode_apn("", ApnEnc, 0) -> |
| 18 | << NewElemLen:8, RemainEnc/bytes >> = ApnEnc, |
| 19 | case NewElemLen of |
| 20 | 0 -> ""; |
| 21 | _ -> decode_apn("", RemainEnc, NewElemLen) |
| 22 | end; |
| 23 | |
| 24 | decode_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 | |
| 31 | decode_apn(Result, ApnEnc, RemainLen) when RemainLen > 0 -> |
| 32 | << Char:8, RemainEnc/bytes >> = ApnEnc, |
| 33 | decode_apn(Result ++ [Char], RemainEnc, RemainLen - 1). |
| 34 | |
| 35 | encode_apn(ApnStr) -> |
| 36 | encode_apn(<<>>, ApnStr, "", 0). |
| 37 | |
| 38 | encode_apn(ApnEnc, "", "", 0) -> |
| 39 | ApnEnc; |
| 40 | |
| 41 | encode_apn(ApnEnc, "", CurStr, Len) -> |
| 42 | CurBin = binary:list_to_bin(CurStr), |
| 43 | Result = << ApnEnc/binary, Len, CurBin/binary >>, |
| 44 | Result; |
| 45 | |
| 46 | encode_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. |