crap-libs/try/try.h

44 lines
1.4 KiB
C
Raw Normal View History

2017-03-09 15:24:52 +00:00
#ifndef TRY_H
#define TRY_H
#include <stdbool.h>
2017-03-10 17:43:56 +00:00
#include "../oop/oop.h"
#include "../misc/unused.h"
2017-03-09 15:24:52 +00:00
typedef int try_t;
2017-03-10 17:43:56 +00:00
#define throws(...) subtry();
#define try { bool _try_catch = false, _try_body = false; void* _try_data = NULL; try_t _try_id = try_new(); void _try_f(void)
#define pcatch(e) ; _try_f(); if (try_has_catch(_try_id)) { e = try_catch(_try_id); try_remove(_try_id); do
#define catch(c, ex) ; if (!_try_body) { _try_f(); _try_body = true; _try_data = try_catch(_try_id); _try_catch = try_has_catch(_try_id); try_remove(_try_id); } if (_try_catch && instanceof(_try_data, c)) { _try_catch = false; ex = _try_data; do
#define endtry while(false); } if (_try_catch) { UNUSED(_try_body); UNUSED(_try_data); }};
#define throw(e) { try_throw(_try_id, (void*) e); return; }
#define until(condition) ; do { try_reset(_try_id); _try_f(); } while(try_has_catch(_try_id) == condition); void* _try_result = try_catch(_try_id); try_remove(_try_id); if(true) { do
#define get_thrown() (_try_result)
#define failed false
#define succeeded true
2017-03-09 15:24:52 +00:00
#define subtry() try_t _try_id = try_pop();
2017-03-10 22:15:35 +00:00
#define s_(f) try_push(_try_id); f; if(_try_has_catch(_try_id)) return;
2017-03-10 17:43:56 +00:00
2017-03-09 15:24:52 +00:00
#define tpush() try_push(_try_id)
#define cthrow(e) _try_id = try_pop(); throw(e);
2017-03-10 17:43:56 +00:00
#define NO_TRY_BODY -1
2017-03-09 15:24:52 +00:00
try_t try_new(void);
bool try_has_catch(try_t);
void* try_catch(try_t);
void try_remove(try_t);
void try_throw(try_t, void*);
try_t try_pop(void);
void try_push(try_t);
2017-03-10 17:43:56 +00:00
void try_reset(try_t);
2017-03-09 15:24:52 +00:00
#endif