summaryrefslogtreecommitdiffstats
path: root/gisi/iter.c
diff options
context:
space:
mode:
authorAki Niemi <aki.niemi@nokia.com>2009-09-14 16:21:06 +0300
committerAki Niemi <aki.niemi@nokia.com>2009-09-14 16:21:06 +0300
commita1ca8a9afa7d09285f4f430099abada5b858dc29 (patch)
tree8fa32c2687da21939114dfc535cd47314765232b /gisi/iter.c
parentd7459f45fcc05189e9638e122dc410a5d682490f (diff)
downloadofono-a1ca8a9afa7d09285f4f430099abada5b858dc29.tar.bz2
Add and modify string getters
Add a getter for latin ASCII only tags, and change the alpha tag getter. Turns out not all alpha tags in ISI are of the length-value variety.
Diffstat (limited to 'gisi/iter.c')
-rw-r--r--gisi/iter.c30
1 files changed, 25 insertions, 5 deletions
diff --git a/gisi/iter.c b/gisi/iter.c
index dfc6dfa8..dc555a73 100644
--- a/gisi/iter.c
+++ b/gisi/iter.c
@@ -113,25 +113,45 @@ bool g_isi_sb_iter_get_oper_code(GIsiSubBlockIter *iter, char *mcc,
}
bool g_isi_sb_iter_get_alpha_tag(GIsiSubBlockIter *iter, char **utf8,
- int pos)
+ size_t len, int pos)
{
uint8_t *ucs2 = NULL;
- int len = 0;
if (pos > iter->start[1])
return false;
- len = iter->start[pos] * 2; /* Alpha tags are UCS-2 */
+ if (!utf8 || len == 0 || pos + len > iter->start[1])
+ return false;
- if (!utf8 || len == 0 || pos + 1 + len > iter->start[1])
+ ucs2 = iter->start + pos;
+ if (ucs2 + len > iter->end)
return false;
- ucs2 = iter->start + pos + 1;
*utf8 = g_convert((const char *)ucs2, len, "UTF-8//TRANSLIT", "UCS-2BE",
NULL, NULL, NULL);
return utf8 != NULL;
}
+bool g_isi_sb_iter_get_latin_tag(GIsiSubBlockIter *iter, char **latin,
+ size_t len, int pos)
+{
+ uint8_t *str = NULL;
+
+ if (pos > iter->start[1])
+ return false;
+
+ if (!latin || len == 0 || pos + len > iter->start[1])
+ return false;
+
+ str = iter->start + pos;
+ if (str + len > iter->end)
+ return false;
+
+ *latin = g_strndup((char *)str, len);
+
+ return latin != NULL;
+}
+
bool g_isi_sb_iter_init(const void restrict *data, size_t len, GIsiSubBlockIter *iter)
{
if (!iter || !data || len == 0)