changeset 8:4a9bf783491d

phone number decoding factored out
author Mychaela Falconia <falcon@freecalypso.org>
date Fri, 12 Feb 2021 00:07:24 +0000
parents 4360a7906f34
children dc565e91069d
files libcommon/Makefile libcommon/number_decode.c simtool/pbdump.c
diffstat 3 files changed, 40 insertions(+), 36 deletions(-) [+]
line wrap: on
line diff
--- a/libcommon/Makefile	Thu Feb 11 23:56:13 2021 +0000
+++ b/libcommon/Makefile	Fri Feb 12 00:07:24 2021 +0000
@@ -1,8 +1,8 @@
 CC=	gcc
 CFLAGS=	-O2 -I/usr/include/PCSC
 OBJS=	alpha_decode.o alpha_valid.o apdu.o atr.o cardconnect.o chkblank.o \
-	dumpdirfunc.o exit.o hexdump.o hexread.o hexstr.o names.o pinentry.o \
-	revnibbles.o
+	dumpdirfunc.o exit.o hexdump.o hexread.o hexstr.o names.o \
+	number_decode.o pinentry.o revnibbles.o
 LIB=	libcommon.a
 
 all:	${LIB}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libcommon/number_decode.c	Fri Feb 12 00:07:24 2021 +0000
@@ -0,0 +1,37 @@
+/*
+ * This module implements functions for decoding phone numbers.
+ */
+
+#include <sys/types.h>
+
+static char gsm_address_digits[16] =
+	{'0','1','2','3','4','5','6','7','8','9','*','#','a','b','c','?'};
+
+decode_phone_number(data, nbytes, out)
+	u_char *data;
+	unsigned nbytes;
+	char *out;
+{
+	u_char *dp, *endp;
+	int c;
+
+	dp = data;
+	endp = data + nbytes;
+	while (dp < endp) {
+		c = *dp & 0xF;
+		if (c == 0xF)
+			return(-1);
+		*out++ = gsm_address_digits[c];
+		c = *dp >> 4;
+		if (c == 0xF) {
+			if (dp + 1 == endp)
+				break;
+			else
+				return(-1);
+		}
+		*out++ = gsm_address_digits[c];
+		dp++;
+	}
+	*out = '\0';
+	return(0);
+}
--- a/simtool/pbdump.c	Thu Feb 11 23:56:13 2021 +0000
+++ b/simtool/pbdump.c	Fri Feb 12 00:07:24 2021 +0000
@@ -10,39 +10,6 @@
 #include "simresp.h"
 #include "curfile.h"
 
-static char gsm_address_digits[16] =
-	{'0','1','2','3','4','5','6','7','8','9','*','#','a','b','c','?'};
-
-static
-decode_number(data, nbytes, out)
-	u_char *data;
-	unsigned nbytes;
-	char *out;
-{
-	u_char *dp, *endp;
-	int c;
-
-	dp = data;
-	endp = data + nbytes;
-	while (dp < endp) {
-		c = *dp & 0xF;
-		if (c == 0xF)
-			return(-1);
-		*out++ = gsm_address_digits[c];
-		c = *dp >> 4;
-		if (c == 0xF) {
-			if (dp + 1 == endp)
-				break;
-			else
-				return(-1);
-		}
-		*out++ = gsm_address_digits[c];
-		dp++;
-	}
-	*out = '\0';
-	return(0);
-}
-
 static
 check_blank_area(dp, endp)
 	u_char *dp, *endp;
@@ -77,7 +44,7 @@
 	fixp = sim_resp_data + sim_resp_data_len - 14;
 	if (fixp[0] < 2 || fixp[0] > 11)
 		goto malformed;
-	rc = decode_number(fixp + 2, fixp[0] - 1, digits);
+	rc = decode_phone_number(fixp + 2, fixp[0] - 1, digits);
 	if (rc < 0)
 		goto malformed;
 	rc = check_blank_area(fixp + 1 + fixp[0], fixp + 12);