diff --git a/gisi/iter.c b/gisi/iter.c index d0e534b3..53e4c3b3 100644 --- a/gisi/iter.c +++ b/gisi/iter.c @@ -76,6 +76,37 @@ void g_isi_sb_iter_init(GIsiSubBlockIter *iter, const GIsiMessage *msg, iter->sub_blocks = len > used ? iter->start[-1] : 0; } +void g_isi_sb_subiter_init(GIsiSubBlockIter *outer, GIsiSubBlockIter *inner, + size_t used) +{ + size_t len = g_isi_sb_iter_get_len(outer); + + if (outer->start + len > outer->end || + outer->start + used > outer->end) + len = used = 0; + + inner->start = outer->start + used; + inner->end = inner->start + len; + inner->longhdr = FALSE; + inner->sub_blocks = len > used ? inner->start[-1] : 0; +} + +void g_isi_sb_subiter_init_full(GIsiSubBlockIter *outer, GIsiSubBlockIter *inner, + size_t used, gboolean longhdr, + uint16_t sub_blocks) +{ + size_t len = g_isi_sb_iter_get_len(outer); + + if (outer->start + len > outer->end || + outer->start + used > outer->end) + len = used = 0; + + inner->start = outer->start + used; + inner->end = inner->start + len; + inner->longhdr = longhdr; + inner->sub_blocks = len > used ? sub_blocks : 0; +} + gboolean g_isi_sb_iter_is_valid(const GIsiSubBlockIter *iter) { if (iter == NULL) diff --git a/gisi/iter.h b/gisi/iter.h index 43814a0b..b6de8cff 100644 --- a/gisi/iter.h +++ b/gisi/iter.h @@ -43,6 +43,11 @@ void g_isi_sb_iter_init(GIsiSubBlockIter *iter, const GIsiMessage *msg, void g_isi_sb_iter_init_full(GIsiSubBlockIter *iter, const GIsiMessage *msg, size_t used, gboolean longhdr, uint16_t sub_blocks); +void g_isi_sb_subiter_init(GIsiSubBlockIter *outer, GIsiSubBlockIter *inner, + size_t used); +void g_isi_sb_subiter_init_full(GIsiSubBlockIter *outer, GIsiSubBlockIter *inner, + size_t used, gboolean longhdr, + uint16_t sub_blocks); gboolean g_isi_sb_iter_is_valid(const GIsiSubBlockIter *iter); gboolean g_isi_sb_iter_next(GIsiSubBlockIter *iter);