diff libutil/imsi_entry.c @ 19:40e5097437fa

libutil: add grok_imsi_user_arg()
author Mychaela Falconia <falcon@freecalypso.org>
date Sun, 26 Jun 2022 22:38:42 -0800
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libutil/imsi_entry.c	Sun Jun 26 22:38:42 2022 -0800
@@ -0,0 +1,54 @@
+/*
+ * The library function implemented in this module supports IMSI entry
+ * at UI level, either in the standard form (long string of digits)
+ * or in the shorthand notation introduced in fc-sim-tools.
+ */
+
+#include <ctype.h>
+#include <string.h>
+#include <strings.h>
+
+grok_imsi_user_arg(arg, dest)
+	char *arg, *dest;
+{
+	char *cp, *dp;
+	int n, tail_len, remain;
+
+	if (!isdigit(*arg))
+		return(-1);
+	cp = arg;
+	dp = dest;
+	n = 0;
+	while (isdigit(*cp)) {
+		if (n >= 15)
+			return(-1);
+		*dp++ = *cp++;
+		n++;
+	}
+	if (!*cp) {
+		if (n < 6)
+			return(-1);
+		*dp = '\0';
+		return(0);
+	}
+	if (*cp != '-')
+		return(-1);
+	cp++;
+	tail_len = strlen(cp);
+	if (!tail_len)
+		return(-1);
+	remain = 15 - n;
+	if (remain < tail_len + 1)
+		return(-1);
+	while (remain > tail_len) {
+		*dp++ = '0';
+		remain--;
+	}
+	while (*cp) {
+		if (!isdigit(*cp))
+			return(-1);
+		*dp++ = *cp++;
+	}
+	*dp = '\0';
+	return(0);
+}