#pragma once
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
#define STDERR(fmt, ...) fprintf(stderr, fmt "\n", ##__VA_ARGS__)
#define LOG(fmt, ...) STDERR(fmt, ##__VA_ARGS__)
#define LOG_ERR(e, fmt, ...) LOG(fmt " - %d: %s", ##__VA_ARGS__, e, strerror(e))
#define LOG_ERRNO(fmt, ...) LOG_ERR(errno, fmt, ##__VA_ARGS__)
#ifndef NDEBUG
#define LOG_DEBUG(fmt, ...) LOG("# " fmt, ##__VA_ARGS__)
#define LOG_DEBUG_ERR(e, fmt, ...) LOG_ERR(e, "# " fmt, ##__VA_ARGS__)
#define LOG_DEBUG_ERRNO(fmt, ...) LOG_ERRNO("# " fmt, ##__VA_ARGS__)
#else
#define LOG_DEBUG(fmt, ...) do {} while (0)
#define LOG_DEBUG_ERR(e, fmt, ...) do {} while (0)
#define LOG_DEBUG_ERRNO(fmt, ...) do {} while (0)
#endif