diff options
-rw-r--r-- | lib/include/common.h | 16 | ||||
-rw-r--r-- | lib/include/io.h | 1 | ||||
-rw-r--r-- | lib/src/io.c | 28 |
3 files changed, 37 insertions, 8 deletions
diff --git a/lib/include/common.h b/lib/include/common.h new file mode 100644 index 0000000..5ea6050 --- /dev/null +++ b/lib/include/common.h @@ -0,0 +1,16 @@ +// Copyright (c) 2020 Johannes Stoelp + +#pragma once + +#include "io.h" +#include "syscall.h" + +#include <asm/unistd.h> + +#define ERROR_ON(cond, ...) \ + do { \ + if ((cond)) { \ + efmt(__VA_ARGS__); \ + syscall1(__NR_exit, 1); \ + } \ + } while (0) diff --git a/lib/include/io.h b/lib/include/io.h index 5ca78a3..0f8b900 100644 --- a/lib/include/io.h +++ b/lib/include/io.h @@ -3,3 +3,4 @@ #pragma once int pfmt(const char* fmt, ...); +int efmt(const char* fmt, ...); diff --git a/lib/src/io.c b/lib/src/io.c index efe938b..b5e0dc5 100644 --- a/lib/src/io.c +++ b/lib/src/io.c @@ -16,22 +16,34 @@ #define FD_STDOUT 1 #define FD_STDERR 2 -int pfmt(const char* fmt, ...) { +static int vdfmt(int fd, const char* fmt, va_list ap) { char buf[MAX_PRINTF_LEN]; - - va_list ap; - va_start(ap, fmt); int ret = vfmt(buf, sizeof(buf), fmt, ap); - va_end(ap); if (ret > MAX_PRINTF_LEN - 1) { - syscall3(__NR_write, FD_STDERR, buf, MAX_PRINTF_LEN - 1); + syscall3(__NR_write, fd, buf, MAX_PRINTF_LEN - 1); static const char warn[] = "\npfmt: Message truncated, max length can be configured by defining MAX_PRINTF_LEN\n"; - syscall3(__NR_write, FD_STDOUT, warn, sizeof(warn)); + syscall3(__NR_write, FD_STDERR, warn, sizeof(warn)); return MAX_PRINTF_LEN - 1; } - syscall3(__NR_write, FD_STDOUT, buf, ret); + syscall3(__NR_write, fd, buf, ret); + return ret; +} + +int pfmt(const char* fmt, ...) { + va_list ap; + va_start(ap, fmt); + int ret = vdfmt(FD_STDOUT, fmt, ap); + va_end(ap); + return ret; +} + +int efmt(const char* fmt, ...) { + va_list ap; + va_start(ap, fmt); + int ret = vdfmt(FD_STDERR, fmt, ap); + va_end(ap); return ret; } |