aboutsummaryrefslogtreecommitdiffstats
path: root/unpack.c
diff options
context:
space:
mode:
authorTomasz Kramkowski <tk@the-tk.com>2021-08-06 20:14:04 +0100
committerTomasz Kramkowski <tk@the-tk.com>2021-08-06 20:14:04 +0100
commit5edfaf66958a7ea7ae6fb7b58c037b86465340ad (patch)
tree0dfd146c999d9b6dae9a1d21fa450677a956fad4 /unpack.c
parent63aa341af24ac7e4d33b817997ab7f2c6f258a40 (diff)
downloadpack-5edfaf66958a7ea7ae6fb7b58c037b86465340ad.tar.gz
pack-5edfaf66958a7ea7ae6fb7b58c037b86465340ad.tar.xz
pack-5edfaf66958a7ea7ae6fb7b58c037b86465340ad.zip
add pack_type and pack_endian and use them
Diffstat (limited to 'unpack.c')
-rw-r--r--unpack.c36
1 files changed, 18 insertions, 18 deletions
diff --git a/unpack.c b/unpack.c
index 7d2b08a..467b6bf 100644
--- a/unpack.c
+++ b/unpack.c
@@ -15,12 +15,12 @@
#include "pack.h"
#include "trace.h"
-static uintmax_t read_val(const unsigned char *buf, size_t size, enum endian e)
+static uintmax_t read_val(const unsigned char *buf, size_t size, enum pack_endian e)
{
uintmax_t val = 0;
for (size_t i = 0; i < size; i++) {
- val |= (uintmax_t)(buf[i] & 0xff) << (e == LITTLE ? i : size - i - 1) * 8;
+ val |= (uintmax_t)(buf[i] & 0xff) << (e == PACK_ENDIAN_LITTLE ? i : size - i - 1) * 8;
}
return val;
@@ -38,7 +38,7 @@ static intmax_t minval(size_t s)
enum pack_status unpack(const void *buf_, size_t size, const char *fmt, ...)
{
- enum endian endianness = BIG;
+ enum pack_endian endianness = PACK_ENDIAN_BIG;
const unsigned char *buf = buf_;
size_t offset = 0;
va_list ap;
@@ -84,21 +84,21 @@ enum pack_status unpack(const void *buf_, size_t size, const char *fmt, ...)
tr_debug("count: %" PRIuSIZE ", i: %d, fmt[i]: %c, sign: %ssigned",
count, i, fmt[i], sign ? "" : "un");
switch (fmt[i]) {
- case '>': endianness = BIG; continue;
- case '<': endianness = LITTLE; continue;
- case 'b': arg.b = va_arg(ap, signed char *); break;
- case 'B': arg.B = va_arg(ap, unsigned char *); break;
- case 'h': arg.h = va_arg(ap, short *); break;
- case 'H': arg.H = va_arg(ap, unsigned short *); break;
- case 'i': arg.i = va_arg(ap, int *); break;
- case 'I': arg.I = va_arg(ap, unsigned *); break;
- case 'l': arg.l = va_arg(ap, long *); break;
- case 'L': arg.L = va_arg(ap, unsigned long *); break;
- case 'q': arg.q = va_arg(ap, long long *); break;
- case 'Q': arg.Q = va_arg(ap, unsigned long long *); break;
- case 'f': arg.f = va_arg(ap, float *); break;
- case 'd': arg.d = va_arg(ap, double *); break;
- case 'x': break;
+ case '>': endianness = PACK_ENDIAN_BIG; continue;
+ case '<': endianness = PACK_ENDIAN_LITTLE; continue;
+ case PACK_TYPE_UCHAR: arg.b = va_arg(ap, signed char *); break;
+ case PACK_TYPE_SCHAR: arg.B = va_arg(ap, unsigned char *); break;
+ case PACK_TYPE_SHORT: arg.h = va_arg(ap, short *); break;
+ case PACK_TYPE_USHORT: arg.H = va_arg(ap, unsigned short *); break;
+ case PACK_TYPE_INT: arg.i = va_arg(ap, int *); break;
+ case PACK_TYPE_UINT: arg.I = va_arg(ap, unsigned *); break;
+ case PACK_TYPE_LONG: arg.l = va_arg(ap, long *); break;
+ case PACK_TYPE_ULONG: arg.L = va_arg(ap, unsigned long *); break;
+ case PACK_TYPE_LLONG: arg.q = va_arg(ap, long long *); break;
+ case PACK_TYPE_ULLONG: arg.Q = va_arg(ap, unsigned long long *); break;
+ case PACK_TYPE_FLOAT: arg.f = va_arg(ap, float *); break;
+ case PACK_TYPE_DOUBLE: arg.d = va_arg(ap, double *); break;
+ case PACK_TYPE_PADDING: break;
default: return PACK_FMTINVAL;
}