/* * Copyright (C) 2020-2021 Tomasz Kramkowski * SPDX-License-Identifier: MIT */ #ifndef PACK_H #define PACK_H #include enum pack_status { PACK_OK, PACK_FMTINVAL, PACK_TOOSMALL, }; extern enum pack_trace { PACK_TRACE_OFF, PACK_TRACE_CALL, PACK_TRACE_DEBUG, PACK_TRACE_ALL, } pack_trace; enum pack_type { PACK_TYPE_SCHAR = 'b', PACK_TYPE_UCHAR = 'B', PACK_TYPE_SHORT = 'h', PACK_TYPE_USHORT = 'H', PACK_TYPE_INT = 'i', PACK_TYPE_UINT = 'I', PACK_TYPE_LONG = 'l', PACK_TYPE_ULONG = 'L', PACK_TYPE_LLONG = 'q', PACK_TYPE_ULLONG = 'Q', PACK_TYPE_FLOAT = 'f', PACK_TYPE_DOUBLE = 'd', PACK_TYPE_PADDING = 'x', PACK_TYPE_COUNT = '*', }; enum pack_endian { PACK_ENDIAN_BIG, PACK_ENDIAN_LITTLE }; struct pack_field { enum pack_type type; size_t count; size_t offset; }; struct pack_args { enum pack_endian endian; struct pack_field *fields; size_t num_fields; }; enum pack_status pack(void *dest, size_t size, const char *fmt, ...); enum pack_status unpack(const void *src, size_t size, const char *fmt, ...); enum pack_status unpack_struct(const void *src, size_t size, const struct pack_args *args, void *dest); const char *pack_strerror(enum pack_status status); #endif // !PACK_H