OSSP CVS Repository

ossp - ossp-pkg/ex/ex_test.c 1.1
Not logged in
[Honeypot]  [Browse]  [Directory]  [Home]  [Login
[Reports]  [Search]  [Ticket]  [Timeline
  [Raw

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;
}


CVSTrac 2.0.1