ossp-pkg/ex/ex_test.c
1.1
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include "ex.h"
/* === foo.h === */
typedef enum {
FOO_OK = 0,
FOO_ERR_1,
FOO_ERR_2,
FOO_ERR_3
} foo_rc_t;
#define FOO_TEXAS
#ifdef FOO_TEXAS
#include "ex.h"
#define FOO_ERR(err) \
(ex_throw(FOO_CLASS, NULL, FOO_ERR_##err), FOO_ERR_##err)
#else
#define FOO_ERR(err) \
(FOO_ERR_##err)
#endif
#define FOO_EX2RC(e) \
((foo_rc_t)((e)->ex_value))
#define FOO_CLASS (&foo_class)
extern int foo_class;
foo_rc_t foo_func(void);
/* === foo.c === */
int foo_class;
static int foo_sub(void)
{
fprintf(stderr, "mark4\n");
if (random() % 2)
return FOO_OK;
return FOO_ERR(1);
}
foo_rc_t foo_func(void)
{
fprintf(stderr, "mark3\n");
foo_sub();
if (random() % 2)
return FOO_OK;
return FOO_ERR(2);
}
/* === test.c === */
int main(int argc, char *argv[])
{
srandom((unsigned int)time(NULL));
ex_t e;
fprintf(stderr, "main-0\n");
for (;;) {
fprintf(stderr, "main-1\n");
try {
fprintf(stderr, "main-2\n");
foo_func();
fprintf(stderr, "main-3\n");
for (;;) {
fprintf(stderr, "main-4\n");
try {
fprintf(stderr, "main-5\n");
foo_func();
fprintf(stderr, "main-6\n");
}
catch (e) {
fprintf(stderr, "main-7\n");
fprintf(stderr, " %s@%s:%d class=0x%lx object=0x%lx value=0x%lx\n",
e.ex_func, e.ex_file, e.ex_line, (long)e.ex_class, (long)e.ex_object, (long)e.ex_value);
if (e.ex_class == FOO_CLASS && (foo_rc_t)(e.ex_value) == FOO_ERR_1)
fprintf(stderr, " exception handling\n");
else {
fprintf(stderr, " exception rethrowing\n");
ex_rethrow;
}
fprintf(stderr, "main-8\n");
}
fprintf(stderr, "main-9\n");
}
fprintf(stderr, "main-10\n");
}
catch (e) {
fprintf(stderr, "main-11\n");
fprintf(stderr, " %s@%s:%d class=0x%lx object=0x%lx value=0x%lx\n",
e.ex_func, e.ex_file, e.ex_line, (long)e.ex_class, (long)e.ex_object, (long)e.ex_value);
fprintf(stderr, "main-12\n");
}
}
fprintf(stderr, "main-0\n");
return 0;
}