diff --git a/obj.h b/obj.h new file mode 100644 index 0000000..de2eca0 --- /dev/null +++ b/obj.h @@ -0,0 +1,74 @@ +#ifndef __OBJ_H__ +#define __OBJ_H__ + +#include +#include + +/* obj.h: objecty and exceptiony stuff + * + * Some macros to make C a bit more like C++, but without bringing in + * all of C++'s crapola. + */ + +/* Here's an example: + * + * int + * foo() + * { + * struct bar *b = NULL; + * FILE *f = NULL; + * + * attempt { + * b = new(struct bar); + * if (! b) fail; + * + * f = fopen("foo", "r"); + * if (! f) fail; + * + * (void)fgets(b->baz, 10, f); + * } + * + * if (f) { + * (void)fclose(f); + * } + * + * recover { + * if (b) { + * free(b); + * } + * return -1; + * } + * + * return 0; + * } + */ + +/** Exception-type things + * + * These allow you to have pseudo-exceptions. It looks kludgy and it + * is, but it's only that way so you can have nice pretty code. + */ +static int __obj_passed = 0; +#define attempt for (__obj_passed = 0; !__obj_passed; __obj_passed = 1) +#define fail break +#define succeed continue +#define recover if (__obj_passed ? (__obj_passed = 0) : 1) + +#define new(type) (type *)calloc(1, sizeof(type)) + + + +/* Some things I use for debugging */ +#ifdef NODUMP +# define DUMPf(fmt, args...) +#else +# define DUMPf(fmt, args...) fprintf(stderr, "%s:%s:%d " fmt "\n", __FILE__, __FUNCTION__, __LINE__, ##args) +#endif +#define DUMP() DUMPf("") +#define DUMP_d(v) DUMPf("%s = %d", #v, v) +#define DUMP_x(v) DUMPf("%s = 0x%x", #v, v) +#define DUMP_s(v) DUMPf("%s = %s", #v, v) +#define DUMP_c(v) DUMPf("%s = '%c' (0x%02x)", #v, v, v) +#define DUMP_p(v) DUMPf("%s = %p", #v, v) + +#endif