85 lines
2.6 KiB
C
85 lines
2.6 KiB
C
#ifndef EHAN_H_
|
|
#define EHAN_H_
|
|
|
|
#include <stdbool.h>
|
|
#include <stddef.h>
|
|
#include <stdio.h>
|
|
#include <string.h>
|
|
|
|
typedef struct GenericReturn {
|
|
long double fp;
|
|
void * val;
|
|
const char * err;
|
|
} GenericReturn;
|
|
|
|
GenericReturn ehanError(const char * error);
|
|
GenericReturn _ehanValue(void * value);
|
|
GenericReturn _ehanValueFP(long double value);
|
|
#define ehanValue(v) _ehanValue((void *) v)
|
|
#define ehanValueFP(fp) _ehanValueFP((long double) fp)
|
|
|
|
#define resultGeneric(type, ret) (*(type *) &(ret.val))
|
|
#define resultFP(type, ret) ((type) (ret.fp))
|
|
#define resultError(ret) (ret.err)
|
|
|
|
#define ehanCheck(ret) strlen(ret.err)
|
|
|
|
#define ILog(format, ...) \
|
|
do { \
|
|
fprintf(stderr, "\x1b[34m""info""\x1b[0m"":%s:%d: " format, __FILE__, __LINE__, ##__VA_ARGS__); \
|
|
} while (0)
|
|
|
|
#define WLog(format, ...) \
|
|
do { \
|
|
fprintf(stderr, "\x1b[33m""warn""\x1b[0m"":%s:%d: " format, __FILE__, __LINE__, ##__VA_ARGS__); \
|
|
} while (0)
|
|
|
|
#define ELog(format, ...) \
|
|
do { \
|
|
fprintf(stderr, "\x1b[31m""error""\x1b[0m"":%s:%d: " format, __FILE__, __LINE__, ##__VA_ARGS__); \
|
|
} while (0)
|
|
|
|
#ifdef NDEBUG
|
|
|
|
#define DLog(format, ...)
|
|
|
|
#else
|
|
|
|
#define DLog(format, ...) \
|
|
do { \
|
|
fprintf(stderr, "\x1b[32m""debug""\x1b[0m"":%s:%d: " format, __FILE__, __LINE__, ##__VA_ARGS__); \
|
|
} while (0)
|
|
|
|
#endif
|
|
|
|
#ifdef EHAN_IMPLEMENTATION
|
|
|
|
GenericReturn _ehanValue(void * value)
|
|
{
|
|
return (GenericReturn) {
|
|
.val = value,
|
|
.err = "",
|
|
};
|
|
}
|
|
|
|
GenericReturn _ehanValueFP(long double value)
|
|
{
|
|
return (GenericReturn) {
|
|
.fp = value,
|
|
.val = 0,
|
|
.err = "",
|
|
};
|
|
}
|
|
|
|
GenericReturn ehanError(const char * error)
|
|
{
|
|
return (GenericReturn) {
|
|
.val = 0,
|
|
.err = error,
|
|
};
|
|
}
|
|
|
|
#endif // EHAN_IMPLEMENTATION
|
|
|
|
#endif // EHAN_H_
|