commit e64b9dd0219b1715c611c7c0f8158879cb393f3c Author: Maciej Samborski Date: Sun Mar 3 16:24:16 2024 +0100 Let's go diff --git a/README.md b/README.md new file mode 100644 index 0000000..fe11c52 --- /dev/null +++ b/README.md @@ -0,0 +1 @@ +# Error Handling Single Header File Library for C diff --git a/ehan.h b/ehan.h new file mode 100644 index 0000000..ba1688f --- /dev/null +++ b/ehan.h @@ -0,0 +1,87 @@ +#ifndef EHAN_H_ +#define EHAN_H_ + +#include +#include +#include + +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_ diff --git a/example.c b/example.c new file mode 100644 index 0000000..4c3b03e --- /dev/null +++ b/example.c @@ -0,0 +1,77 @@ +#include +#include + +#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; +}