Skip to content

Instantly share code, notes, and snippets.

@xhjkl
Created April 7, 2017 20:23
Show Gist options
  • Save xhjkl/e4a81639728dfb612a4baf9f57ee83ee to your computer and use it in GitHub Desktop.
Save xhjkl/e4a81639728dfb612a4baf9f57ee83ee to your computer and use it in GitHub Desktop.
Logical logging for C11
//
// Logging facility
//
// Expecting to be included:
// <stdio.h>
// <inttypes.h>
#define _overload7(one, two, three, four, five, six, seven, x, ...) x
#define _log7(arg0, arg1, arg2, arg3, arg4, arg5, arg6) \
do { \
_log_(arg0); _log_(arg1); _log_(arg2); _log_(arg3); \
_log_(arg4); _log_(arg5); \
_log(arg6); \
} while(0)
#define _log6(arg0, arg1, arg2, arg3, arg4, arg5) \
do { \
_log_(arg0); _log_(arg1); _log_(arg2); _log_(arg3); \
_log_(arg4); _log(arg5); \
} while(0)
#define _log5(arg0, arg1, arg2, arg3, arg4) \
do { \
_log_(arg0); _log_(arg1); _log_(arg2); _log_(arg3); \
_log(arg4); \
} while(0)
#define _log4(arg0, arg1, arg2, arg3) \
do { \
_log_(arg0); _log_(arg1); _log_(arg2); _log(arg3); \
} while(0)
#define _log3(arg0, arg1, arg2) \
do { \
_log_(arg0); _log_(arg1); _log(arg2); \
} while(0)
#define _log2(arg0, arg1) \
do { \
_log_(arg0); _log(arg1); \
} while(0)
#define _log(x) fprintf(stderr, _log_format(x), x)
#define _log_(x) _log(x), fputc(0x20, stderr)
#ifndef _log_prologue
# define _log_prologue
#endif
#ifndef _log_epilogue
# define _log_epilogue fputc(0xa, stderr)
#endif
#ifndef _panic_prologue
# define _panic_prologue
#endif
#ifndef _panic_epilogue
# define _panic_epilogue fputc(0xa, stderr)
#endif
#define _force_pointer_decay(x) ((void)0,x)
#define _log_format(x) \
_Generic(_force_pointer_decay(x), \
uint8_t: "%" PRIu8, \
uint16_t: "%" PRIu16, \
uint32_t: "%" PRIu32, \
uint64_t: "%" PRIu64, \
int8_t: "%" PRId8, \
int16_t: "%" PRId16, \
int32_t: "%" PRId32, \
int64_t: "%" PRId64, \
size_t: "%zu", \
ssize_t: "%zd", \
char: "%c", \
const char: "%c", \
char *: "%s", \
const char *: "%s", \
float: "%f", \
double: "%lf", \
void *: "%p", \
default: "%p" \
)
#define log(...) \
do { \
_log_prologue; \
_overload7(__VA_ARGS__, \
_log7, _log6, _log5, _log4, \
_log3, _log2, _log \
)(__VA_ARGS__); \
_log_epilogue; \
} while(0)
#define panic(...) \
do { \
_panic_prologue; \
_overload7(__VA_ARGS__, \
_log7, _log6, _log5, _log4, \
_log3, _log2, _log \
)(__VA_ARGS__); \
_panic_epilogue; \
} while(0)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment