From 153d7b4b6621bc291d24f1df5d5af68b3eebd0d9 Mon Sep 17 00:00:00 2001 From: bigfoot547 Date: Fri, 24 Nov 2023 05:20:01 -0600 Subject: make debug code worse-looking (but more verbose) also note that previous commit is WIP until a better solution to finding the focused UI window backed by a curses window --- src/ui/debug.c | 52 ++++++++++++++++++++++++++++++++++++---------------- src/ui/ui.internal.h | 29 ++++++++++++++++++++--------- 2 files changed, 56 insertions(+), 25 deletions(-) (limited to 'src/ui') diff --git a/src/ui/debug.c b/src/ui/debug.c index 6d3ea5d..6e404a3 100644 --- a/src/ui/debug.c +++ b/src/ui/debug.c @@ -3,37 +3,57 @@ #include "../macros.h" #include "ui.internal.h" -struct ui_window_base *ui__check_cast_to_base(void *obj) +#include + +const char *ui__debug_types[] = { +#define WT_DEF(_t) "UI__WINDOW_TYPE_" #_t + UI__FOREACH_WINDOW_TYPE(WT_DEF) +#undef WT_DEF +}; + +size_t ui__debug_type_count = sizeof(ui__debug_types) / sizeof(ui__debug_types[0]); + +const char *ui__debug_type_to_str(unsigned type) { + if (type >= ui__debug_type_count) return "???"; + return ui__debug_types[type]; +} + +struct ui_window_base *ui__check_cast_to_base(void *obj, const char *file, const char *func, int line) +{ + umps_unused(file); + umps_unused(func); + umps_unused(line); return obj; /* this cast always succeeds */ } -struct ui_window_leaf *ui__check_cast_to_leaf(void *obj) +#define UMPS__DEBUG_DO_ERROR(_o, _fi, _fn, _ln, _t) \ + struct ui_window_base *base = _o; \ + if (base->type != _t) { \ + fprintf(stderr, "!!!!!\n!!!!!\n!!!!! UMPS UI bad cast at %s:%d %s (expect %s got %s:%u) !!!!!\n!!!!!\n!!!!!\n", \ + _fi, _ln, _fn, #_t, ui__debug_type_to_str(base->type), base->type); \ + umps_trap; \ + } \ + return _o; + +struct ui_window_leaf *ui__check_cast_to_leaf(void *obj, const char *file, const char *func, int line) { - struct ui_window_base *base = obj; - umps_assert(base->type == UI__WINDOW_TYPE_LEAF); - return obj; + UMPS__DEBUG_DO_ERROR(obj, file, func, line, UI__WINDOW_TYPE_LEAF); } -struct ui_window_dock *ui__check_cast_to_dock(void *obj) +struct ui_window_dock *ui__check_cast_to_dock(void *obj, const char *file, const char *func, int line) { - struct ui_window_base *base = obj; - umps_assert(base->type == UI__WINDOW_TYPE_DOCK); - return obj; + UMPS__DEBUG_DO_ERROR(obj, file, func, line, UI__WINDOW_TYPE_DOCK); } -struct ui_window_root *ui__check_cast_to_root(void *obj) +struct ui_window_root *ui__check_cast_to_root(void *obj, const char *file, const char *func, int line) { - struct ui_window_base *base = obj; - umps_assert(base->type == UI__WINDOW_TYPE_ROOT); - return obj; + UMPS__DEBUG_DO_ERROR(obj, file, func, line, UI__WINDOW_TYPE_ROOT); } #else /* the file must have a declaration */ -void umps__debug_do_nothing(void) -{ -} +void umps__debug_do_nothing(void); #endif diff --git a/src/ui/ui.internal.h b/src/ui/ui.internal.h index 946d57a..201e61e 100644 --- a/src/ui/ui.internal.h +++ b/src/ui/ui.internal.h @@ -13,25 +13,36 @@ #define UI__WINDOW_DOCK_LEFT (2u) #define UI__WINDOW_DOCK_RIGHT (3u) #define UI__WINDOW_DOCK_CENTER (4u) +#define UI__WINDOW_DOCK_MAX UI__WINDOW_DOCK_CENTER+1 #define UI__WINDOW_FOCUS_NONE (999u) -#define UI__WINDOW_TYPE_BASE (0u) +#define UI__FOREACH_WINDOW_TYPE(O) \ + O(BASE), \ + O(LEAF), \ + O(DOCK), \ + O(ROOT) + +enum { +#define WT_DEF(_t) UI__WINDOW_TYPE_ ## _t + UI__FOREACH_WINDOW_TYPE(WT_DEF) +#undef WT_DEF +}; + +/*#define UI__WINDOW_TYPE_BASE (0u) #define UI__WINDOW_TYPE_LEAF (1u) #define UI__WINDOW_TYPE_DOCK (2u) -#define UI__WINDOW_TYPE_ROOT (3u) - -#define UI__WINDOW_DOCK_MAX UI__WINDOW_DOCK_CENTER+1 +#define UI__WINDOW_TYPE_ROOT (3u)*/ #ifdef NDEBUG #define ui__cast(_t, _v) ((struct ui_window_ ## _t *)(_v)) #else -#define ui__cast(_t, _v) (ui__check_cast_to_ ## _t(_v)) +#define ui__cast(_t, _v) (ui__check_cast_to_ ## _t(_v, __FILE__, __func__, __LINE__)) -struct ui_window_base *ui__check_cast_to_base(void *); -struct ui_window_leaf *ui__check_cast_to_leaf(void *); -struct ui_window_dock *ui__check_cast_to_dock(void *); -struct ui_window_root *ui__check_cast_to_root(void *); +struct ui_window_base *ui__check_cast_to_base(void *, const char *, const char *, int); +struct ui_window_leaf *ui__check_cast_to_leaf(void *, const char *, const char *, int); +struct ui_window_dock *ui__check_cast_to_dock(void *, const char *, const char *, int); +struct ui_window_root *ui__check_cast_to_root(void *, const char *, const char *, int); #endif /* concrete type definitions */ -- cgit v1.2.3-70-g09d2