X-Git-Url: https://git.stderr.nl/gitweb?a=blobdiff_plain;f=libchimara%2Fmagic.c;fp=libchimara%2Fmagic.c;h=a385b9636bc185655c1dad10b6cee7061ddd7546;hb=0b85f1dd5993e2ed111ec2ba13bbbb4ebda06ada;hp=0000000000000000000000000000000000000000;hpb=08f8444e2ae5480eea1cf7e2c1e2eb57f46152db;p=rodin%2Fchimara.git diff --git a/libchimara/magic.c b/libchimara/magic.c new file mode 100644 index 0000000..a385b96 --- /dev/null +++ b/libchimara/magic.c @@ -0,0 +1,56 @@ +#include +#include "glk.h" +#include "magic.h" + +/* The "magic" mechanism was stolen from Evin Robertson's GtkGlk. */ + +static gchar * +magic_to_string(glui32 magic) +{ + switch(magic) + { + case MAGIC_WINDOW: + return "winid_t"; + case MAGIC_STREAM: + return "strid_t"; + case MAGIC_FILEREF: + return "frefid_t"; + case MAGIC_SCHANNEL: + return "schanid_t"; + default: + g_return_val_if_reached("unknown"); + } +} + +/* Internal function: check the object's magic number to make sure it is the + right type, and not freed. */ +gboolean +magic_is_valid_or_null(const glui32 goodmagic, const glui32 realmagic, const gchar *function) +{ + if(realmagic != MAGIC_NULL) + { + if(realmagic != goodmagic) + { + if(realmagic == MAGIC_FREE) + g_critical("%s: Using a freed object", function); + else + g_critical( "%s: %s object not a %s", function, magic_to_string(realmagic), magic_to_string(goodmagic) ); + return FALSE; + } + } + return TRUE; +} + + +/* Internal function: check the object's magic number to make sure it is + not NULL, the right type, and not freed. */ +gboolean +magic_is_valid(const void *obj, const glui32 goodmagic, const glui32 realmagic, const gchar *function) +{ + if(obj == NULL) + { + g_critical( "%s: NULL %s pointer", function, magic_to_string(goodmagic) ); + return FALSE; + } + return magic_is_valid_or_null(goodmagic, realmagic, function); +}