changeset 358:7154a231e4b5

uptools/libcoding: SMS dest address parsing and encoding implemented
author Mychaela Falconia <falcon@freecalypso.org>
date Wed, 07 Feb 2018 07:30:22 +0000
parents 15120d15cab5
children 061f8d75083d
files uptools/libcoding/Makefile uptools/libcoding/number_encode.c
diffstat 2 files changed, 82 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/uptools/libcoding/Makefile	Wed Feb 07 06:50:14 2018 +0000
+++ b/uptools/libcoding/Makefile	Wed Feb 07 07:30:22 2018 +0000
@@ -2,8 +2,8 @@
 CFLAGS=	-O2
 OBJS=	alpha_addr.o decode_helpers.o grokdcs.o gsm7_decode.o \
 	gsm7_decode_tables.o gsm7_encode.o gsm7_encode_table.o gsm7_pack.o \
-	gsm7_unpack.o gsmtime.o hexdecode.o hexdump.o number_decode.o scaddr.o \
-	ucs2_decode.o utf8_decode.o
+	gsm7_unpack.o gsmtime.o hexdecode.o hexdump.o number_decode.o \
+	number_encode.o scaddr.o ucs2_decode.o utf8_decode.o
 LIB=	libcoding.a
 
 all:	${LIB}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/uptools/libcoding/number_encode.c	Wed Feb 07 07:30:22 2018 +0000
@@ -0,0 +1,80 @@
+/*
+ * This library module implements the function that parses SMS destination
+ * addresses given by the user and encodes them into the GSM 03.40
+ * TP-Destination-Address structure.
+ */
+
+#include <sys/types.h>
+#include <ctype.h>
+#include <stdlib.h>
+
+digit_char_to_gsm(ch)
+{
+	switch (ch) {
+	case '0':
+	case '1':
+	case '2':
+	case '3':
+	case '4':
+	case '5':
+	case '6':
+	case '7':
+	case '8':
+	case '9':
+		return (ch - '0');
+	case '*':
+		return 0xA;
+	case '#':
+		return 0xB;
+	case 'a':
+	case 'b':
+	case 'c':
+		return (ch - 'a' + 0xC);
+	case 'A':
+	case 'B':
+	case 'C':
+		return (ch - 'A' + 0xC);
+	}
+	return (-1);
+}
+
+parse_and_encode_dest_addr(input, outbuf)
+	char *input;
+	u_char *outbuf;
+{
+	char *cp, *endp;
+	int d;
+	u_char digits[20];
+	unsigned n;
+
+	cp = input;
+	if (*cp == '+') {
+		outbuf[1] = 0x91;
+		cp++;
+	} else
+		outbuf[1] = 0x81;
+	if (digit_char_to_gsm(*cp) < 0)
+		return(-1);
+	n = 0;
+	while ((d = digit_char_to_gsm(*cp)) >= 0) {
+		cp++;
+		if (n >= 20)
+			return(-1);
+		digits[n++] = d;
+	}
+	outbuf[0] = n;
+	while (n < 20)
+		digits[n++] = 0xF;
+	if (*cp == ',') {
+		cp++;
+		if (!isdigit(*cp))
+			return(-1);
+		outbuf[1] = strtoul(cp, &endp, 0);
+		if (*endp)
+			return(-1);
+	} else if (*cp)
+		return(-1);
+	for (n = 0; n < 10; n++)
+		outbuf[2+n] = (digits[n*2+1] << 4) | digits[n*2];
+	return(0);
+}