summaryrefslogtreecommitdiffstats
path: root/src/simutil.c
diff options
context:
space:
mode:
authorDenis Kenzior <denkenz@gmail.com>2010-05-26 09:58:47 -0500
committerDenis Kenzior <denkenz@gmail.com>2010-05-26 09:59:14 -0500
commitb0cf35c32410015a870413d9c04a6842ac85a74f (patch)
tree48da5dd9eee15eb8eead61eeeedfefcb67c895d5 /src/simutil.c
parent75ce0a7b28725dd19feb5256619e740f02145c73 (diff)
downloadofono-b0cf35c32410015a870413d9c04a6842ac85a74f.tar.bz2
simutil: Add sim_encode_bcd_number
Diffstat (limited to 'src/simutil.c')
-rw-r--r--src/simutil.c53
1 files changed, 53 insertions, 0 deletions
diff --git a/src/simutil.c b/src/simutil.c
index 7fbf0b7b..035ca29b 100644
--- a/src/simutil.c
+++ b/src/simutil.c
@@ -1134,6 +1134,59 @@ void sim_extract_bcd_number(const unsigned char *buf, int len, char *out)
out[i*2] = '\0';
}
+static inline int to_semi_oct(char in)
+{
+ int digit;
+
+ switch (in) {
+ case '0':
+ case '1':
+ case '2':
+ case '3':
+ case '4':
+ case '5':
+ case '6':
+ case '7':
+ case '8':
+ case '9':
+ digit = in - '0';
+ break;
+ case '*':
+ digit = 10;
+ break;
+ case '#':
+ digit = 11;
+ break;
+ case 'C':
+ case 'c':
+ digit = 12;
+ break;
+ case '?':
+ digit = 13;
+ break;
+ case 'E':
+ case 'e':
+ digit = 14;
+ break;
+ default:
+ digit = -1;
+ break;
+ }
+
+ return digit;
+}
+
+void sim_encode_bcd_number(const char *number, unsigned char *out)
+{
+ while (number[0] != '\0' && number[1] != '\0') {
+ *out = to_semi_oct(*number++);
+ *out++ |= to_semi_oct(*number++) << 4;
+ }
+
+ if (*number)
+ *out = to_semi_oct(*number) | 0xf0;
+}
+
gboolean sim_adn_parse(const unsigned char *data, int length,
struct ofono_phone_number *ph, char **identifier)
{