diff options
Diffstat (limited to 'pack.c')
-rw-r--r-- | pack.c | 10 |
1 files changed, 6 insertions, 4 deletions
@@ -22,6 +22,7 @@ enum pack_status pack(void *buf_, size_t size, const char *fmt, ...) { enum pack_endian endianness = PACK_ENDIAN_BIG; unsigned char *buf = buf_; + enum pack_status ret = PACK_OK; size_t offset = 0; va_list ap; @@ -45,15 +46,15 @@ enum pack_status pack(void *buf_, size_t size, const char *fmt, ...) ITYPE_MACROS #undef T case PACK_TYPE_PADDING: v.unsigned_ = 0; sign = false; break; - default: return PACK_FMTINVAL; + default: SET_AND_GOTO(ret, PACK_FMTINVAL, stop); } tr_debug("i: %d, fmt[i]: %c, sign: %ssigned", i, fmt[i], sign ? "" : "un"); s = getsize(fmt[i]); tr_debug("s: %" PRIuSIZE, s); - if (s == (size_t)-1) return PACK_FMTINVAL; + if (s == (size_t)-1) SET_AND_GOTO(ret, PACK_FMTINVAL, stop); - if (size - offset < s) return PACK_TOOSMALL; + if (size - offset < s) SET_AND_GOTO(ret, PACK_TOOSMALL, stop); if (sign) { intmax_t n = v.signed_; @@ -71,7 +72,8 @@ enum pack_status pack(void *buf_, size_t size, const char *fmt, ...) offset += s; } +stop: va_end(ap); - return PACK_OK; + return ret; } |