aboutsummaryrefslogtreecommitdiffstats
path: root/pack.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 /pack.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 'pack.c')
-rw-r--r--pack.c32
1 files changed, 16 insertions, 16 deletions
diff --git a/pack.c b/pack.c
index 3f25ab8..9d7046c 100644
--- a/pack.c
+++ b/pack.c
@@ -12,15 +12,15 @@
#include "pack.h"
#include "trace.h"
-static void write_val(unsigned char *buf, size_t size, enum endian e, uintmax_t val)
+static void write_val(unsigned char *buf, size_t size, enum pack_endian e, uintmax_t val)
{
for (size_t i = 0; i < size; i++)
- buf[i] = (val >> (e == LITTLE ? i : size - i - 1) * 8) & 0xff;
+ buf[i] = (val >> (e == PACK_ENDIAN_LITTLE ? i : size - i - 1) * 8) & 0xff;
}
enum pack_status pack(void *buf_, size_t size, const char *fmt, ...)
{
- enum endian endianness = BIG;
+ enum pack_endian endianness = PACK_ENDIAN_BIG;
unsigned char *buf = buf_;
size_t offset = 0;
va_list ap;
@@ -36,19 +36,19 @@ enum pack_status pack(void *buf_, size_t size, const char *fmt, ...)
tr_debug("i: %d, fmt[i]: %c", i, fmt[i]);
sign = islower(fmt[i]);
switch (fmt[i]) {
- case '>': endianness = BIG; continue;
- case '<': endianness = LITTLE; continue;
- case 'b': val.s = va_arg(ap, int ); break;
- case 'B': val.u = va_arg(ap, unsigned ); break;
- case 'h': val.s = va_arg(ap, int ); break;
- case 'H': val.u = va_arg(ap, unsigned ); break;
- case 'i': val.s = va_arg(ap, int ); break;
- case 'I': val.u = va_arg(ap, unsigned ); break;
- case 'l': val.s = va_arg(ap, long ); break;
- case 'L': val.u = va_arg(ap, unsigned long ); break;
- case 'q': val.s = va_arg(ap, long long); break;
- case 'Q': val.u = va_arg(ap, unsigned long long); break;
- case 'x': val.u = 0; sign = false; break;
+ case '>': endianness = PACK_ENDIAN_BIG; continue;
+ case '<': endianness = PACK_ENDIAN_LITTLE; continue;
+ case PACK_TYPE_SCHAR: val.s = va_arg(ap, int); break;
+ case PACK_TYPE_UCHAR: val.u = va_arg(ap, unsigned); break;
+ case PACK_TYPE_SHORT: val.s = va_arg(ap, int); break;
+ case PACK_TYPE_USHORT: val.u = va_arg(ap, unsigned); break;
+ case PACK_TYPE_INT: val.s = va_arg(ap, int); break;
+ case PACK_TYPE_UINT: val.u = va_arg(ap, unsigned); break;
+ case PACK_TYPE_LONG: val.s = va_arg(ap, long); break;
+ case PACK_TYPE_ULONG: val.u = va_arg(ap, unsigned long); break;
+ case PACK_TYPE_LLONG: val.s = va_arg(ap, long long); break;
+ case PACK_TYPE_ULLONG: val.u = va_arg(ap, unsigned long long); break;
+ case PACK_TYPE_PADDING: val.u = 0; sign = false; break;
default: return PACK_FMTINVAL;
}
tr_debug("i: %d, fmt[i]: %c, sign: %ssigned", i, fmt[i], sign ? "" : "un");