summaryrefslogtreecommitdiffstats
path: root/gisi
diff options
context:
space:
mode:
Diffstat (limited to 'gisi')
-rw-r--r--gisi/iter.c31
-rw-r--r--gisi/iter.h5
2 files changed, 36 insertions, 0 deletions
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);