mirror of git://git.sysmocom.de/ofono
gisi: Add getter for sub-block data
Also fix indentation and change int->unsigned in the API.
This commit is contained in:
parent
a781e3b1d9
commit
876943e2b4
59
gisi/iter.c
59
gisi/iter.c
|
@ -33,7 +33,8 @@
|
||||||
|
|
||||||
#include "iter.h"
|
#include "iter.h"
|
||||||
|
|
||||||
static inline void bcd_to_mccmnc(const uint8_t *restrict bcd, char *mcc, char *mnc)
|
static inline void bcd_to_mccmnc(const uint8_t *restrict bcd,
|
||||||
|
char *mcc, char *mnc)
|
||||||
{
|
{
|
||||||
mcc[0] = '0' + (bcd[0] & 0x0F);
|
mcc[0] = '0' + (bcd[0] & 0x0F);
|
||||||
mcc[1] = '0' + ((bcd[0] & 0xF0) >> 4);
|
mcc[1] = '0' + ((bcd[0] & 0xF0) >> 4);
|
||||||
|
@ -47,29 +48,25 @@ static inline void bcd_to_mccmnc(const uint8_t *restrict bcd, char *mcc, char *m
|
||||||
mnc[3] = '\0';
|
mnc[3] = '\0';
|
||||||
}
|
}
|
||||||
|
|
||||||
void g_isi_sb_iter_init_full(GIsiSubBlockIter *iter,
|
void g_isi_sb_iter_init_full(GIsiSubBlockIter *iter, const void *restrict data,
|
||||||
const void *restrict data,
|
size_t len, size_t used, bool longhdr,
|
||||||
size_t len,
|
uint16_t sub_blocks)
|
||||||
size_t used,
|
|
||||||
bool longhdr,
|
|
||||||
uint16_t sub_blocks)
|
|
||||||
{
|
{
|
||||||
if (!data)
|
if (!data)
|
||||||
len = used = 0;
|
len = used = 0;
|
||||||
|
|
||||||
iter->start = (uint8_t *)data + used;
|
iter->start = (uint8_t *)data + used;
|
||||||
iter->end = iter->start + len;
|
iter->end = iter->start + len;
|
||||||
iter->longhdr = longhdr;
|
iter->longhdr = longhdr;
|
||||||
iter->sub_blocks = len > used ? sub_blocks : 0;
|
iter->sub_blocks = len > used ? sub_blocks : 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void g_isi_sb_iter_init(GIsiSubBlockIter *iter,
|
void g_isi_sb_iter_init(GIsiSubBlockIter *iter, const void *restrict data,
|
||||||
const void *restrict data,
|
size_t len, size_t used)
|
||||||
size_t len,
|
|
||||||
size_t used)
|
|
||||||
{
|
{
|
||||||
|
|
||||||
if (!data)
|
if (!data)
|
||||||
len = used = 0;
|
len = used = 0;
|
||||||
|
|
||||||
iter->start = (uint8_t *)data + used;
|
iter->start = (uint8_t *)data + used;
|
||||||
iter->end = iter->start + len;
|
iter->end = iter->start + len;
|
||||||
iter->longhdr = false;
|
iter->longhdr = false;
|
||||||
|
@ -104,25 +101,35 @@ size_t g_isi_sb_iter_get_len(const GIsiSubBlockIter *iter)
|
||||||
{
|
{
|
||||||
if (iter->longhdr)
|
if (iter->longhdr)
|
||||||
return (iter->start[2] << 8) | (iter->start[3]);
|
return (iter->start[2] << 8) | (iter->start[3]);
|
||||||
|
|
||||||
return iter->start[1];
|
return iter->start[1];
|
||||||
}
|
}
|
||||||
|
|
||||||
bool g_isi_sb_iter_get_byte(const GIsiSubBlockIter *restrict iter, uint8_t *byte, int pos)
|
bool g_isi_sb_iter_get_data(const GIsiSubBlockIter *restrict iter,
|
||||||
|
void **data, unsigned pos)
|
||||||
{
|
{
|
||||||
if ((size_t)(unsigned)pos > g_isi_sb_iter_get_len(iter) ||
|
if ((size_t)pos > g_isi_sb_iter_get_len(iter)
|
||||||
iter->start + (unsigned)pos > iter->end)
|
|| iter->start + pos > iter->end)
|
||||||
|
return false;
|
||||||
|
*data = (void *)iter->start + pos;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool g_isi_sb_iter_get_byte(const GIsiSubBlockIter *restrict iter,
|
||||||
|
uint8_t *byte, unsigned pos)
|
||||||
|
{
|
||||||
|
if ((size_t)pos > g_isi_sb_iter_get_len(iter)
|
||||||
|
|| iter->start + pos > iter->end)
|
||||||
return false;
|
return false;
|
||||||
*byte = iter->start[pos];
|
*byte = iter->start[pos];
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool g_isi_sb_iter_get_word(const GIsiSubBlockIter *restrict iter,
|
bool g_isi_sb_iter_get_word(const GIsiSubBlockIter *restrict iter,
|
||||||
uint16_t *word, int pos)
|
uint16_t *word, unsigned pos)
|
||||||
{
|
{
|
||||||
uint16_t val;
|
uint16_t val;
|
||||||
|
|
||||||
if (pos + 1 > (int)g_isi_sb_iter_get_len(iter))
|
if (pos + 1 > g_isi_sb_iter_get_len(iter))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
memcpy(&val, iter->start + pos, sizeof(uint16_t));
|
memcpy(&val, iter->start + pos, sizeof(uint16_t));
|
||||||
|
@ -131,11 +138,11 @@ bool g_isi_sb_iter_get_word(const GIsiSubBlockIter *restrict iter,
|
||||||
}
|
}
|
||||||
|
|
||||||
bool g_isi_sb_iter_get_dword(const GIsiSubBlockIter *restrict iter,
|
bool g_isi_sb_iter_get_dword(const GIsiSubBlockIter *restrict iter,
|
||||||
uint32_t *dword, int pos)
|
uint32_t *dword, unsigned pos)
|
||||||
{
|
{
|
||||||
uint32_t val;
|
uint32_t val;
|
||||||
|
|
||||||
if (pos + 3 > (int)g_isi_sb_iter_get_len(iter))
|
if (pos + 3 > g_isi_sb_iter_get_len(iter))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
memcpy(&val, iter->start + pos, sizeof(uint32_t));
|
memcpy(&val, iter->start + pos, sizeof(uint32_t));
|
||||||
|
@ -144,9 +151,9 @@ bool g_isi_sb_iter_get_dword(const GIsiSubBlockIter *restrict iter,
|
||||||
}
|
}
|
||||||
|
|
||||||
bool g_isi_sb_iter_get_oper_code(const GIsiSubBlockIter *restrict iter,
|
bool g_isi_sb_iter_get_oper_code(const GIsiSubBlockIter *restrict iter,
|
||||||
char *mcc, char *mnc, int pos)
|
char *mcc, char *mnc, unsigned pos)
|
||||||
{
|
{
|
||||||
if (pos + 2 > (int)g_isi_sb_iter_get_len(iter))
|
if (pos + 2 > g_isi_sb_iter_get_len(iter))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
bcd_to_mccmnc(iter->start + pos, mcc, mnc);
|
bcd_to_mccmnc(iter->start + pos, mcc, mnc);
|
||||||
|
@ -154,11 +161,11 @@ bool g_isi_sb_iter_get_oper_code(const GIsiSubBlockIter *restrict iter,
|
||||||
}
|
}
|
||||||
|
|
||||||
bool g_isi_sb_iter_get_alpha_tag(const GIsiSubBlockIter *restrict iter,
|
bool g_isi_sb_iter_get_alpha_tag(const GIsiSubBlockIter *restrict iter,
|
||||||
char **utf8, size_t len, int pos)
|
char **utf8, size_t len, unsigned pos)
|
||||||
{
|
{
|
||||||
uint8_t *ucs2 = NULL;
|
uint8_t *ucs2 = NULL;
|
||||||
|
|
||||||
if (pos > (int)g_isi_sb_iter_get_len(iter))
|
if (pos > g_isi_sb_iter_get_len(iter))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if (!utf8 || len == 0 || pos + len > g_isi_sb_iter_get_len(iter))
|
if (!utf8 || len == 0 || pos + len > g_isi_sb_iter_get_len(iter))
|
||||||
|
@ -174,11 +181,11 @@ bool g_isi_sb_iter_get_alpha_tag(const GIsiSubBlockIter *restrict iter,
|
||||||
}
|
}
|
||||||
|
|
||||||
bool g_isi_sb_iter_get_latin_tag(const GIsiSubBlockIter *restrict iter,
|
bool g_isi_sb_iter_get_latin_tag(const GIsiSubBlockIter *restrict iter,
|
||||||
char **latin, size_t len, int pos)
|
char **latin, size_t len, unsigned pos)
|
||||||
{
|
{
|
||||||
uint8_t *str = NULL;
|
uint8_t *str = NULL;
|
||||||
|
|
||||||
if (pos > (int)g_isi_sb_iter_get_len(iter))
|
if (pos > g_isi_sb_iter_get_len(iter))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if (!latin || len == 0 || pos + len > g_isi_sb_iter_get_len(iter))
|
if (!latin || len == 0 || pos + len > g_isi_sb_iter_get_len(iter))
|
||||||
|
|
24
gisi/iter.h
24
gisi/iter.h
|
@ -44,29 +44,31 @@ void g_isi_sb_iter_init(GIsiSubBlockIter *iter,
|
||||||
const void *restrict data,
|
const void *restrict data,
|
||||||
size_t len, size_t used);
|
size_t len, size_t used);
|
||||||
void g_isi_sb_iter_init_full(GIsiSubBlockIter *iter,
|
void g_isi_sb_iter_init_full(GIsiSubBlockIter *iter,
|
||||||
const void *restrict data,
|
const void *restrict data,
|
||||||
size_t len, size_t used,
|
size_t len, size_t used,
|
||||||
bool longhdr,
|
bool longhdr,
|
||||||
uint16_t sub_blocks);
|
uint16_t sub_blocks);
|
||||||
bool g_isi_sb_iter_is_valid(GIsiSubBlockIter const *iter);
|
bool g_isi_sb_iter_is_valid(const GIsiSubBlockIter *iter);
|
||||||
|
|
||||||
bool g_isi_sb_iter_next(GIsiSubBlockIter *iter);
|
bool g_isi_sb_iter_next(GIsiSubBlockIter *iter);
|
||||||
|
|
||||||
int g_isi_sb_iter_get_id(const GIsiSubBlockIter *iter);
|
int g_isi_sb_iter_get_id(const GIsiSubBlockIter *iter);
|
||||||
size_t g_isi_sb_iter_get_len(const GIsiSubBlockIter *iter);
|
size_t g_isi_sb_iter_get_len(const GIsiSubBlockIter *iter);
|
||||||
|
|
||||||
|
bool g_isi_sb_iter_get_data(const GIsiSubBlockIter *restrict iter,
|
||||||
|
void **data, unsigned pos);
|
||||||
bool g_isi_sb_iter_get_byte(const GIsiSubBlockIter *restrict iter,
|
bool g_isi_sb_iter_get_byte(const GIsiSubBlockIter *restrict iter,
|
||||||
uint8_t *byte, int pos);
|
uint8_t *byte, unsigned pos);
|
||||||
bool g_isi_sb_iter_get_word(const GIsiSubBlockIter *restrict iter,
|
bool g_isi_sb_iter_get_word(const GIsiSubBlockIter *restrict iter,
|
||||||
uint16_t *word, int pos);
|
uint16_t *word, unsigned pos);
|
||||||
bool g_isi_sb_iter_get_dword(const GIsiSubBlockIter *restrict iter,
|
bool g_isi_sb_iter_get_dword(const GIsiSubBlockIter *restrict iter,
|
||||||
uint32_t *dword, int pos);
|
uint32_t *dword, unsigned pos);
|
||||||
bool g_isi_sb_iter_get_oper_code(const GIsiSubBlockIter *restrict iter,
|
bool g_isi_sb_iter_get_oper_code(const GIsiSubBlockIter *restrict iter,
|
||||||
char *mcc, char *mnc, int pos);
|
char *mcc, char *mnc, unsigned pos);
|
||||||
bool g_isi_sb_iter_get_alpha_tag(const GIsiSubBlockIter *restrict iter,
|
bool g_isi_sb_iter_get_alpha_tag(const GIsiSubBlockIter *restrict iter,
|
||||||
char **utf8, size_t len, int pos);
|
char **utf8, size_t len, unsigned pos);
|
||||||
bool g_isi_sb_iter_get_latin_tag(const GIsiSubBlockIter *restrict iter,
|
bool g_isi_sb_iter_get_latin_tag(const GIsiSubBlockIter *restrict iter,
|
||||||
char **ascii, size_t len, int pos);
|
char **ascii, size_t len, unsigned pos);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue