#ifndef _SPHO_ERR_H #define _SPHO_ERR_H #include #ifdef SPHO_DEBUG #include #endif #define SPHO_ERR_SYS 0x000001 #define SPHO_ERR_INTERNAL 0x010001 #define SPHO_ERR_TOOBIG 0x010002 #define SPHO_ERR_ARGINVAL 0x010003 #define SPHO_ERR_NAMEINUSE 0x010004 #define SPHO_ERR_IS_SYSERR(err) (SPHO_ERR_SYS == err) #ifdef SPHO_DEBUG #define SPHO_ERR(ctx, e) \ do { \ (ctx)->err = (e); \ if ((e) == SPHO_ERR_SYS) \ (ctx)->err_info = errno; \ snprintf((ctx)->filebuf, sizeof((ctx)->filebuf), \ __FILE__); \ (ctx)->errline = __LINE__; \ } while (0) #else /* SPHO_DEBUG */ #define SPHO_ERR(ctx, e) \ do { \ (ctx)->err = (e); \ if ((e) == SPHO_ERR_SYS) \ (ctx)->err_info = errno; \ } while (0) #endif /* SPHO_DEBUG */ /* debug stuff */ #ifdef SPHO_DEBUG #define SPHO_STRINGIFY(a) #a #define SPHO_MACRO_STR(b) SPHO_STRINGIFY(b) #define __LINE__S SPHO_MACRO_STR(__LINE__) #define SPHO_PRECOND(cond) \ do { \ if (! (cond) ) { \ fprintf(stderr, "SPHO_PRECOND(" #cond ")@" \ __FILE__ ":" __LINE__S \ " failed. Aborting.\n"); \ abort(); \ } \ } while (0) #define SPHO_ASSERT(cond) \ do { \ if (! (cond) ) { \ fprintf(stderr, "SPHO_ASSERT(" #cond ")@" \ __FILE__ ":" __LINE__S \ " failed. Aborting.\n"); \ abort(); \ } \ } while (0) #define SPHO_POSTCOND(cond) \ do { \ if (! (cond) ) { \ fprintf(stderr, "SPHO_POSTCOND(" #cond ")@" \ __FILE__ ":" __LINE__S \ " failed. Aborting.\n"); \ abort(); \ } \ } while (0) #else #define SPHO_PRECOND(cond) #define SPHO_ASSERT(cond) #define SPHO_POSTCOND(cond) #endif #endif