This commit is contained in:
Maciej Samborski 2024-03-03 16:24:16 +01:00
commit e64b9dd021
3 changed files with 165 additions and 0 deletions

1
README.md Normal file
View File

@ -0,0 +1 @@
# Error Handling Single Header File Library for C

87
ehan.h Normal file
View File

@ -0,0 +1,87 @@
#ifndef EHAN_H_
#define EHAN_H_
#include <stdbool.h>
#include <stddef.h>
#include <stdio.h>
typedef struct GenericReturn {
long double fp;
void * val;
size_t err;
} GenericReturn;
GenericReturn ehanError(size_t error);
#define ehanValue(v) _ehanValue((void *) v)
#define ehanValueFP(fp) _ehanValueFP((long double) fp)
GenericReturn _ehanValue(void * value);
GenericReturn _ehanValueFP(long double value);
#define resultGeneric(type, ret) (*(type *) (&ret.val))
#define resultFP(type, ret) ((type) (ret.fp))
const char * errorToString(const char * errorList[], size_t 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 = 0,
};
}
GenericReturn _ehanValueFP(long double value)
{
return (GenericReturn) {
.fp = value,
.val = 0,
.err = 0,
};
}
GenericReturn ehanError(size_t error)
{
return (GenericReturn) {
.val = 0,
.err = error,
};
}
const char * errorToString(const char * errorList[], size_t err)
{
return errorList[err - 1];
}
#endif // EHAN_IMPLEMENTATION
#endif // EHAN_H_

77
example.c Normal file
View File

@ -0,0 +1,77 @@
#include <stdio.h>
#include <stdlib.h>
#define EHAN_IMPLEMENTATION
#include "ehan.h"
typedef enum errorEnum {
DUMB,
UGLY,
GREEDY,
ABRASIVE,
GRUMPY,
MOROSE,
} errorEnum;
static const char * errorList[] = {
"dumb error",
"ugly error",
"greedy error",
"abrasive error",
"grumpy error",
"morose error",
};
GenericReturn f()
{
return ehanValueFP(42.42f);
}
GenericReturn g()
{
return ehanValue("YAY");
}
GenericReturn h()
{
return ehanError(ABRASIVE);
}
int main(void)
{
GenericReturn r = f();
if (r.err > 0)
{
ELog("FAILURE %s\n", errorToString(errorList, r.err));
/* HANDLE ERROR */
goto exit;
}
ILog("SUCCESS: %.2f\n", resultFP(float, r));
r = g();
if (r.err > 0)
{
ELog("FAILURE %s\n", errorToString(errorList, r.err));
/* HANDLE ERROR */
goto exit;
}
ILog("SUCCESS: %s\n", resultGeneric(char *, r));
r = h();
if (r.err > 0)
{
ELog("FAILURE %s\n", errorToString(errorList, r.err));
/* HANDLE ERROR */
goto exit;
}
ILog("SUCCESS: %s\n", resultGeneric(char *, r));
return 0;
exit:
/* DO CLEANUP */
return 1;
}