This is an automated email from the git hooks/post-receive script. guillem pushed a commit to branch main in repository dpkg.
View the commit online: https://git.dpkg.org/cgit/dpkg/dpkg.git/commit/?id=b630e2495d18e14f9e7e40026f5dd4a2f2605f9c commit b630e2495d18e14f9e7e40026f5dd4a2f2605f9c Author: Guillem Jover <[email protected]> AuthorDate: Fri Oct 21 03:27:15 2022 +0200 libdpkg: Add new varbuf_rollback_len() and varbuf_rollback_start() functions This make using the rollback points easier. --- lib/dpkg/libdpkg.map | 2 ++ lib/dpkg/t/t-varbuf.c | 21 ++++++++++++++++++++- lib/dpkg/varbuf.c | 21 +++++++++++++++++++++ lib/dpkg/varbuf.h | 2 ++ 4 files changed, 45 insertions(+), 1 deletion(-) diff --git a/lib/dpkg/libdpkg.map b/lib/dpkg/libdpkg.map index 6f07fd682..65257bb0e 100644 --- a/lib/dpkg/libdpkg.map +++ b/lib/dpkg/libdpkg.map @@ -124,6 +124,8 @@ LIBDPKG_PRIVATE { varbuf_detach; varbuf_snapshot; varbuf_rollback; + varbuf_rollback_len; + varbuf_rollback_start; varbuf_destroy; varbuf_free; diff --git a/lib/dpkg/t/t-varbuf.c b/lib/dpkg/t/t-varbuf.c index a1c386d4f..ee1fdbced 100644 --- a/lib/dpkg/t/t-varbuf.c +++ b/lib/dpkg/t/t-varbuf.c @@ -392,21 +392,40 @@ test_varbuf_snapshot(void) varbuf_snapshot(&vb, &vbs); test_pass(vb.used == 0); test_pass(vb.used == vbs.used); + test_pass(varbuf_rollback_len(&vbs) == 0); + test_str(varbuf_rollback_start(&vbs), ==, ""); varbuf_add_buf(&vb, "1234567890", 10); + varbuf_end_str(&vb); test_pass(vb.used == 10); + test_pass(varbuf_rollback_len(&vbs) == 10); + test_str(varbuf_rollback_start(&vbs), ==, "1234567890"); varbuf_rollback(&vbs); + varbuf_end_str(&vb); test_pass(vb.used == 0); + test_pass(varbuf_rollback_len(&vbs) == 0); + test_str(varbuf_rollback_start(&vbs), ==, ""); varbuf_add_buf(&vb, "1234567890", 10); + varbuf_end_str(&vb); test_pass(vb.used == 10); + test_pass(varbuf_rollback_len(&vbs) == 10); + test_str(varbuf_rollback_start(&vbs), ==, "1234567890"); varbuf_snapshot(&vb, &vbs); test_pass(vb.used == 10); + test_pass(varbuf_rollback_len(&vbs) == 0); + test_str(varbuf_rollback_start(&vbs), ==, ""); varbuf_add_buf(&vb, "1234567890", 10); + varbuf_end_str(&vb); test_pass(vb.used == 20); + test_pass(varbuf_rollback_len(&vbs) == 10); + test_str(varbuf_rollback_start(&vbs), ==, "1234567890"); varbuf_rollback(&vbs); + varbuf_end_str(&vb); test_pass(vb.used == 10); + test_pass(varbuf_rollback_len(&vbs) == 0); + test_str(varbuf_rollback_start(&vbs), ==, ""); varbuf_destroy(&vb); } @@ -433,7 +452,7 @@ test_varbuf_detach(void) TEST_ENTRY(test) { - test_plan(138); + test_plan(152); test_varbuf_init(); test_varbuf_prealloc(); diff --git a/lib/dpkg/varbuf.c b/lib/dpkg/varbuf.c index a752ece64..c4e61e244 100644 --- a/lib/dpkg/varbuf.c +++ b/lib/dpkg/varbuf.c @@ -200,6 +200,27 @@ varbuf_rollback(struct varbuf_state *vs) varbuf_trunc(vs->v, vs->used); } +size_t +varbuf_rollback_len(struct varbuf_state *vs) +{ + if (vs->used > vs->v->used) + internerr("varbuf state_used(%zu) > used(%zu)", vs->used, vs->v->used); + return vs->v->used - vs->used; +} + +const char * +varbuf_rollback_start(struct varbuf_state *vs) +{ + if (vs->v->buf == NULL) { + if (vs->used) + internerr("varbuf buf(NULL) state_used(%zu) > 0", vs->used); + /* XXX: Ideally this would be handled by varbuf always having a valid + * buf or switching all users to the getter, but for now this will do. */ + return ""; + } + return vs->v->buf + vs->used; +} + char * varbuf_detach(struct varbuf *v) { diff --git a/lib/dpkg/varbuf.h b/lib/dpkg/varbuf.h index 2ffb3622f..c5c9458e8 100644 --- a/lib/dpkg/varbuf.h +++ b/lib/dpkg/varbuf.h @@ -103,6 +103,8 @@ struct varbuf_state { void varbuf_snapshot(struct varbuf *v, struct varbuf_state *vs); void varbuf_rollback(struct varbuf_state *vs); +size_t varbuf_rollback_len(struct varbuf_state *vs); +const char *varbuf_rollback_start(struct varbuf_state *vs); /** @} */ -- Dpkg.Org's dpkg

