[SCCP] Add (untested) parser routines for SCCP addresses (GT/SSN/PC)

We re-use the phone number digit parsing code from ISUP
diff --git a/src/sccp_codec.erl b/src/sccp_codec.erl
index f5854e1..62e5bdc 100644
--- a/src/sccp_codec.erl
+++ b/src/sccp_codec.erl
@@ -25,6 +25,78 @@
 
 -compile(export_all).
 
+parse_point_code(BinPC, PCind, OptListIn) when is_binary(BinPC),
+						is_list(OptListIn) ->
+	case PCind of
+		1 ->
+			<<PointCode:16/big, Remain/binary>> = BinPC,
+			OptListOut = OptListIn ++ [{point_code, PointCode}];
+		_ ->
+			Remain = BinPC,
+			OptListOut = OptListIn
+	end,
+	{Remain, OptListOut}.
+
+parse_ssn(BinSSN, SSNind, OptListIn) ->
+	case SSNind of
+		1 ->
+			<<SSN:8, Remain/binary>> = BinSSN,
+			OptListOut = OptListIn ++ [{ssn, SSN}];
+		_ ->
+			Remain = BinSSN,
+			OptListOut = OptListIn
+	end,
+	{Remain, OptListOut}.
+
+enc_is_odd(Enc) ->
+	case Enc of
+		1 -> 1;
+		_ -> 0
+	end.
+
+parse_gt(BinGT, GTind, OptListIn) ->
+	case GTind of
+		?SCCP_GTI_NO_GT ->
+			NewOpts = [];
+		?SCCP_GTI_NAT_ONLY ->
+			% Figure 7/Q.713
+			<<Odd:1, Nature:7, Digits/binary>> = BinGT,
+			PhoneNum = isup_codec:parse_isup_party(Digits, Odd),
+			NewOpts = [{nature_of_addr_ind, Nature},
+				   {phone_number, PhoneNum}];
+		?SCCP_GTI_TT_ONLY ->
+			% Figure 9/Q.913
+			<<TransType:8, Digits/binary>> = BinGT,
+			% Used in national interfaces only, we cannot parse Digits
+			NewOpts = [{trans_type, TransType}, {address, Digits}];
+		?SCCP_GTI_TT_NP_ENC ->
+			% Figure 10/Q.713
+			<<TransType:8, NumPlan:4, Enc:4, Digits/binary>> = BinGT,
+			PhoneNum = isup_codec:parse_isup_party(Digits, enc_is_odd(Enc)),
+			NewOpts = [{trans_type, TransType}, {encoding, Enc},
+				   {numbering_plan, NumPlan},
+				   {phone_number, PhoneNum}];
+		?SCCP_GTI_TT_NP_ENC_NAT ->
+			% Figure 11/Q.713
+			<<TransType:8, NumPlan:4, Enc:4, 0:1, Nature:7, Digits/binary>> = BinGT,
+			PhoneNum = isup_codec:parse_isup_party(Digits, enc_is_odd(Enc)),
+			NewOpts = [{trans_type, TransType}, {encoding, Enc},
+				   {numbering_plan, NumPlan},
+				   {nature_of_addr_ind, Nature},
+				   {phone_number, PhoneNum}];
+		_ ->
+			NewOpts = [{unknown, BinGT}]
+	end,
+	OptListIn ++ [{global_title, GTind, NewOpts}].
+
+% parse SCCP Address
+parse_sccp_addr(BinAddr) when is_binary(BinAddr) ->
+	<<ResNatUse:1, RoutInd:1, GTind:4, SSNind:1, PCind:1, Remain/binary>> = BinAddr,
+	OptList = [{reserved_national_use, ResNatUse}, {route_on_ssn, RoutInd}],
+	{RemainPC, OptPC} = parse_point_code(Remain, PCind, OptList),
+	{RemainSSN, OptSSN} = parse_ssn(RemainPC, SSNind, OptPC),
+	OptGT = parse_gt(RemainSSN, GTind, OptSSN),
+	OptGT.
 
 % parse SCCP Optional Part
 parse_sccp_opt(OptType, OptLen, Content) ->