summaryrefslogtreecommitdiffhomepage
path: root/lib
diff options
context:
space:
mode:
authorJo-Philipp Wich <jo@mein.io>2022-06-08 10:57:14 +0200
committerGitHub <noreply@github.com>2022-06-08 10:57:14 +0200
commit86111edb87ce42e956c9abc3711c8309e7960501 (patch)
treea466ad089f3ff0bcbd143d5767c7b222881b4dd6 /lib
parentb211ca0e420d8086d3fa0358413a6f8b44df1115 (diff)
parent44b0a3b3938333a4f2b00d159fab258a9acd31c1 (diff)
Merge pull request #79 from jow-/struct-fix-packing-asterisk
struct: fix packing `*` format after other repeated formats
Diffstat (limited to 'lib')
-rw-r--r--lib/struct.c9
1 files changed, 6 insertions, 3 deletions
diff --git a/lib/struct.c b/lib/struct.c
index 5d301db..bd418b2 100644
--- a/lib/struct.c
+++ b/lib/struct.c
@@ -2182,17 +2182,17 @@ overflow:
static uc_value_t *
uc_pack_common(uc_vm_t *vm, size_t nargs, formatstate_t *state, size_t argoff)
{
+ size_t ncode, arg, off;
formatcode_t *code;
- size_t ncode, off;
uc_string_t *buf;
ssize_t size, n;
const void *p;
- for (ncode = 0, code = &state->codes[0], off = 0;
+ for (ncode = 0, code = &state->codes[0], arg = argoff, off = 0;
ncode < state->ncodes;
code = &state->codes[++ncode]) {
if (code->fmtdef->format == '*') {
- uc_value_t *v = uc_fn_arg(argoff + ncode);
+ uc_value_t *v = uc_fn_arg(arg++);
if (ucv_type(v) != UC_STRING)
continue;
@@ -2204,6 +2204,9 @@ uc_pack_common(uc_vm_t *vm, size_t nargs, formatstate_t *state, size_t argoff)
else
off += code->size;
}
+ else {
+ arg += code->repeat;
+ }
}
buf = xalloc(sizeof(*buf) + state->size + off + 1);