/* MUST.H -- error checking worthy of C */ /* must be (non-zero) */ #define MUST(err, func, ...) \ if (!(func(__VA_ARGS__))) err(func) /* must be ZERO */ #define MUSTZ(err, func, ...) \ if ((func(__VA_ARGS__))) err(func) /* must be POSITIVE */ #define MUSTP(err, func, ...) \ if ((func(__VA_ARGS__)) < 0) err(func) /* must (equal specific) VALUE */ #define MUSTV(err, val, func, ...) \ if (val == (func(__VA_ARGS__))) err(func) /* must NOT (equal value) */ #define MUSTN(err, val, func, ...) \ if (val != (func(__VA_ARGS__))) err(func) /* must NOT (equal value) */ #define MUSTN(err, val, func, ...) \ if (val != (func(__VA_ARGS__))) err(func) /* must ASSIGN (non-zero) */ #define MUSTA(err, var, func, ...) \ if (!(var = (func(__VA_ARGS__)))) err(func) /* must ASSIGN POSITIVE (value) */ #define MUSTAP(err, var, func, ...) \ if ((var = (func(__VA_ARGS__))) < 0) err(func) /* must ASSIGN (value) NOT (equal) */ #define MUSTAN(err, var, val, func, ...) \ if (val != (var = (func(__VA_ARGS__)))) err(func) /* must DECLARE (non-zero) */ #define MUSTD(err, type, var, func, ...) \ type var; if (!(var = (func(__VA_ARGS__)))) err(func) /* must DECLARE POSITIVE (value) */ #define MUSTDP(err, type, var, func, ...) \ type var; if ((var = (func(__VA_ARGS__))) < 0) err(func) /* must DECLARE POSITIVE (value) */ #define MUSTDN(err, type, var, val, func, ...) \ type var; if (val != (var = (func(__VA_ARGS__))) < 0) err(func) /* HIGHER ORDER MACROS */ /* return negative */ #define RN(func) do { perror(#func); return -1; } while (0) /* quit fatally */ #define QF(func) do { perror(#func); abort(); } while (0) /* warn and continue */ #define WC(func) do { perror(#func); goto contin; } while (0) /* manual action */ #define MA(func) #define OTHERWISE() 0 #define ERREQ(no) errno == no