Move our stuff to our own namespace

This commit is contained in:
Juhani Krekelä 2018-08-11 20:57:45 +03:00
parent a13a5a75b2
commit 8a8a1b7ad7
1 changed files with 36 additions and 36 deletions

View File

@ -5,65 +5,65 @@
#define MAYBE(name) struct maybe_##name #define MAYBE(name) struct maybe_##name
#define ENABLE_RETURN(name) MAYBE(name) _return_value #define ENABLE_RETURN(name) MAYBE(name) _return_value
#define RETURN_VALUE(x) {\ #define RETURN_VALUE(x) do {\
_return_value.is_value = 1;\ _return_value.is_value = 1;\
_return_value.value = x;\ _return_value.value = x;\
return _return_value;\ return _return_value;\
} } while(0)
#define RETURN_NOTHING() {\ #define RETURN_NOTHING() do {\
_return_value.is_value = 0;\ _return_value.is_value = 0;\
return _return_value;\ return _return_value;\
} } while(0)
#define IS_VALUE(x) if ((x).is_value) #define IS_VALUE(x) if ((x).is_value)
#define IS_NOT_VALUE(x) if (!(x).is_value) #define IS_NOT_VALUE(x) if (!(x).is_value)
#define VALUE(x) (x).value #define VALUE(x) (x).value
struct _free_list { struct cmaybe_free_list {
struct _free_list *next; struct cmaybe_free_list *next;
void *ptr; void *ptr;
void (*freer)(void*); void (*freer)(void*);
}; };
#define ENABLE_TRY() \ #define ENABLE_TRY() \
struct _free_list *_allocations = NULL, *_free_list_node;\ struct cmaybe_free_list *cmaybe_allocations = NULL, *cmaybe_free_list_node;\
void *_allocation;\ void *cmaybe_allocation;\
jmp_buf _try_fail_jmp_buf;\ jmp_buf cmaybe_try_fail_jmp_buf;\
if (setjmp(_try_fail_jmp_buf)) {\ if (setjmp(cmaybe_try_fail_jmp_buf)) do {\
TRY_FAIL_HANDLE();\ TRY_FAIL_HANDLE();\
RETURN_NOTHING();\ RETURN_NOTHING();\
} } while(0)
#define TRY_TYPE(name) MAYBE(name) _try_tmp_##name #define TRY_TYPE(name) MAYBE(name) cmaybe_try_tmp_##name
#define TRY(name, maybe_value) (\ #define TRY(name, maybe_value) (\
_try_tmp_##name = maybe_value,\ cmaybe_try_tmp_##name = maybe_value,\
(_try_tmp_##name.is_value ? 0 :\ (cmaybe_try_tmp_##name.is_value ? 0 :\
longjmp(_try_fail_jmp_buf, 1)\ longjmp(cmaybe_try_fail_jmp_buf, 1)\
),\ ),\
_try_tmp_##name.value\ cmaybe_try_tmp_##name.value\
) )
#define TRY_HOF_HANDLE(freer_func, pointer) (\ #define TRY_HOF_HANDLE(freer_func, pointer) (\
_allocation = pointer,\ cmaybe_allocation = pointer,\
_free_list_node = malloc(sizeof(struct _free_list)),\ cmaybe_free_list_node = malloc(sizeof(struct cmaybe_free_list)),\
(_free_list_node == NULL ? (\ (cmaybe_free_list_node == NULL ? (\
free(_allocation),\ free(cmaybe_allocation),\
longjmp(_try_fail_jmp_buf, 1)\ longjmp(cmaybe_try_fail_jmp_buf, 1)\
) : (\ ) : (\
_free_list_node->next = _allocations,\ cmaybe_free_list_node->next = cmaybe_allocations,\
_free_list_node->ptr = _allocation,\ cmaybe_free_list_node->ptr = cmaybe_allocation,\
_free_list_node->freer = freer_func,\ cmaybe_free_list_node->freer = freer_func,\
_allocations = _free_list_node\ cmaybe_allocations = cmaybe_free_list_node\
)),\ )),\
_allocation\ cmaybe_allocation\
) )
#define FREE_ON_TRY_FAIL(pointer) TRY_HOF_HANDLE(free, pointer) #define FREE_ON_TRY_FAIL(pointer) TRY_HOF_HANDLE(free, pointer)
// free() is passed as an argument to avoid errors in case the program uses // free() is passed as an argument to avoid errors in case the program uses
// no TRY functionality and doesn't include stdlib.h // no TRY functionality and doesn't include stdlib.h
static void _remove_free_list(struct _free_list **head, void *ptr, void (*free)(void*)) { static void cmaybe_remove_free_list(struct cmaybe_free_list **head, void *ptr, void (*free)(void*)) {
struct _free_list **current = head; struct cmaybe_free_list **current = head;
while (*current != NULL) { while (*current != NULL) {
if (current[0]->ptr == ptr) { if (current[0]->ptr == ptr) {
struct _free_list *deleted = *current; struct cmaybe_free_list *deleted = *current;
*current = deleted->next; *current = deleted->next;
free(deleted); free(deleted);
break; break;
@ -72,18 +72,18 @@ static void _remove_free_list(struct _free_list **head, void *ptr, void (*free)(
} }
} }
#define TRY_HOF_REMOVE(allocation) _remove_free_list(&_allocations, allocation, free) #define TRY_HOF_REMOVE(allocation) cmaybe_remove_free_list(&cmaybe_allocations, allocation, free)
#define TRY_FAIL_HANDLE() \ #define TRY_FAIL_HANDLE() \
while (_allocations != NULL) {\ while (cmaybe_allocations != NULL) {\
struct _free_list *current = _allocations;\ struct cmaybe_free_list *current = cmaybe_allocations;\
void (*freer)(void*) = current->freer;\ void (*freer)(void*) = current->freer;\
freer(current->ptr);\ freer(current->ptr);\
_allocations = current->next;\ cmaybe_allocations = current->next;\
free(current);\ free(current);\
} }
static void _replace_free_list(struct _free_list **head, void *from, void *to) { static void cmaybe_replace_free_list(struct cmaybe_free_list **head, void *from, void *to) {
struct _free_list **current = head; struct cmaybe_free_list **current = head;
while (*current != NULL) { while (*current != NULL) {
if (current[0]->ptr == from) { if (current[0]->ptr == from) {
current[0]->ptr = to; current[0]->ptr = to;
@ -92,6 +92,6 @@ static void _replace_free_list(struct _free_list **head, void *from, void *to) {
current = &current[0]->next; current = &current[0]->next;
} }
} }
#define TRY_HOF_REPLACE(old_ptr, new_ptr) _replace_free_list(&_allocations, old_ptr, new_ptr) #define TRY_HOF_REPLACE(old_ptr, new_ptr) cmaybe_replace_free_list(&cmaybe_allocations, old_ptr, new_ptr)
#endif #endif