Add the utf8_write function to decode ucs2 data
authorAlexander Tarasikov <alexander.tarasikov@gmail.com>
Fri, 13 Jul 2012 09:54:28 +0000 (13:54 +0400)
committerAlexander Tarasikov <alexander.tarasikov@gmail.com>
Fri, 13 Jul 2012 09:54:28 +0000 (13:54 +0400)
This function is copied from the XDANDROID ril.
It writes the USC2-BE data to the char buffer.

util.c
util.h

diff --git a/util.c b/util.c
index 03b3df7..798808d 100644 (file)
--- a/util.c
+++ b/util.c
@@ -223,3 +223,40 @@ void hex_dump(void *data, int size)
                LOGD("[%4.4s]   %-50.50s  %s\n", addrstr, hexstr, charstr);
        }
 }
+
+/* writes the utf8 character encoded in v
+ * to the buffer utf8 at the specified offset
+ */
+int utf8_write(char *utf8, int offset, int v)
+{
+
+       int result;
+
+       if (v < 0x80) {
+               result = 1;
+               if (utf8)
+                       utf8[offset] = (char)v;
+       } else if (v < 0x800) {
+               result = 2;
+               if (utf8) {
+                       utf8[offset + 0] = (char)(0xc0 | (v >> 6));
+                       utf8[offset + 1] = (char)(0x80 | (v & 0x3f));
+               }
+       } else if (v < 0x10000) {
+               result = 3;
+               if (utf8) {
+                       utf8[offset + 0] = (char)(0xe0 | (v >> 12));
+                       utf8[offset + 1] = (char)(0x80 | ((v >> 6) & 0x3f));
+                       utf8[offset + 2] = (char)(0x80 | (v & 0x3f));
+               }
+       } else {
+               result = 4;
+               if (utf8) {
+                       utf8[offset + 0] = (char)(0xf0 | ((v >> 18) & 0x7));
+                       utf8[offset + 1] = (char)(0x80 | ((v >> 12) & 0x3f));
+                       utf8[offset + 2] = (char)(0x80 | ((v >> 6) & 0x3f));
+                       utf8[offset + 3] = (char)(0x80 | (v & 0x3f));
+               }
+       }
+       return result;
+}
diff --git a/util.h b/util.h
index 6eedbbc..fc858d4 100644 (file)
--- a/util.h
+++ b/util.h
@@ -26,5 +26,6 @@ void hex2bin(const char *data, int length, unsigned char *buf);
 int gsm72ascii(unsigned char *data, char **data_dec, int length);
 int ascii2gsm7(char *data, unsigned char **data_enc, int length);
 void hex_dump(void *data, int size);
+int utf8_write(char *utf8, int offset, int v);
 
 #endif