git: Line endings of README.txt
[projects/chimara/chimara.git] / libchimara / magic.c
1 #include <gtk/gtk.h>
2 #include "glk.h"
3 #include "magic.h"
4
5 /* The "magic" mechanism was stolen from Evin Robertson's GtkGlk. */
6
7 static gchar *
8 magic_to_string(glui32 magic)
9 {
10         switch(magic)
11         {
12                 case MAGIC_WINDOW:
13                         return "winid_t";
14                 case MAGIC_STREAM:
15                         return "strid_t";
16                 case MAGIC_FILEREF:
17                         return "frefid_t";
18                 case MAGIC_SCHANNEL:
19                         return "schanid_t";
20                 default:
21                         g_return_val_if_reached("unknown");
22         }
23 }
24
25 /* Internal function: check the object's magic number to make sure it is the
26  right type, and not freed. */
27 gboolean
28 magic_is_valid_or_null(const glui32 goodmagic, const glui32 realmagic, const gchar *function)
29 {
30         if(realmagic != MAGIC_NULL)
31         {
32                 if(realmagic != goodmagic)
33                 {
34                         if(realmagic == MAGIC_FREE)
35                                 g_critical("%s: Using a freed object", function);
36                         else
37                                 g_critical( "%s: %s object not a %s", function, magic_to_string(realmagic), magic_to_string(goodmagic) );
38                         return FALSE;
39                 }
40         }
41         return TRUE;
42 }
43  
44
45 /* Internal function: check the object's magic number to make sure it is
46  not NULL, the right type, and not freed. */
47 gboolean 
48 magic_is_valid(const void *obj, const glui32 goodmagic, const glui32 realmagic, const gchar *function)
49 {
50         if(obj == NULL)
51         {
52                 g_critical( "%s: NULL %s pointer", function, magic_to_string(goodmagic) );
53                 return FALSE;
54         }
55         return magic_is_valid_or_null(goodmagic, realmagic, function);
56 }