diff libcommon/plmncodes.c @ 99:d2e800abd257

fc-simtool plmnsel-write command implemented
author Mychaela Falconia <falcon@freecalypso.org>
date Wed, 17 Feb 2021 22:43:18 +0000
parents 4eb447be01c0
children
line wrap: on
line diff
--- a/libcommon/plmncodes.c	Wed Feb 17 21:31:32 2021 +0000
+++ b/libcommon/plmncodes.c	Wed Feb 17 22:43:18 2021 +0000
@@ -3,6 +3,8 @@
  */
 
 #include <sys/types.h>
+#include <ctype.h>
+#include <stdio.h>
 
 decode_plmn_3bytes(bin, asc, space_pad)
 	u_char *bin;
@@ -23,3 +25,36 @@
 			asc[6] = '\0';
 	}
 }
+
+encode_plmn_3bytes(asc, bin)
+	char *asc;
+	u_char *bin;
+{
+	u_char mcc[3], mnc[3];
+
+	if (!isxdigit(asc[0]) || !isxdigit(asc[1]) || !isxdigit(asc[2])) {
+inv:		fprintf(stderr, "error: invalid MCC-MNC argument\n");
+		return(-1);
+	}
+	mcc[0] = decode_hex_digit(asc[0]);
+	mcc[1] = decode_hex_digit(asc[1]);
+	mcc[2] = decode_hex_digit(asc[2]);
+	asc += 3;
+	if (*asc == '-')
+		asc++;
+	if (!isxdigit(asc[0]) || !isxdigit(asc[1]))
+		goto inv;
+	mnc[0] = decode_hex_digit(asc[0]);
+	mnc[1] = decode_hex_digit(asc[1]);
+	asc += 2;
+	if (*asc == '\0')
+		mnc[2] = 0xF;
+	else if (isxdigit(asc[0]) && asc[1] == '\0')
+		mnc[2] = decode_hex_digit(*asc);
+	else
+		goto inv;
+	bin[0] = (mcc[1] << 4) | mcc[0];
+	bin[1] = (mnc[2] << 4) | mcc[2];
+	bin[2] = (mnc[1] << 4) | mnc[0];
+	return(0);
+}