Created
April 7, 2017 20:23
-
-
Save xhjkl/e4a81639728dfb612a4baf9f57ee83ee to your computer and use it in GitHub Desktop.
Logical logging for C11
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// | |
// 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