2 //gcc -g eina_magic_01.c -o eina_magic_01 `pkg-config --cflags --libs eina`
6 #define BASETYPE_MAGIC 0x12345
11 typedef struct _person person;
13 #define SUBTYPE_MAGIC 0x3333
19 typedef struct _pilot pilot;
22 person_new(const char *name)
24 person *ptr = malloc(sizeof(person));
25 EINA_MAGIC_SET(ptr, BASETYPE_MAGIC);
26 ptr->name = strdup(name);
30 person_free(person *ptr) {
31 if (!EINA_MAGIC_CHECK(ptr, BASETYPE_MAGIC))
33 EINA_MAGIC_FAIL(ptr, BASETYPE_MAGIC);
36 EINA_MAGIC_SET(ptr, EINA_MAGIC_NONE);
42 pilot_new(const char *name, const char *callsign)
44 pilot *ptr = malloc(sizeof(pilot));
45 EINA_MAGIC_SET(ptr, SUBTYPE_MAGIC);
46 EINA_MAGIC_SET(&ptr->base, BASETYPE_MAGIC);
47 ptr->base.name = strdup(name);
48 ptr->callsign = strdup(callsign);
52 pilot_free(pilot *ptr) {
53 if (!EINA_MAGIC_CHECK(ptr, SUBTYPE_MAGIC))
55 EINA_MAGIC_FAIL(ptr, SUBTYPE_MAGIC);
58 EINA_MAGIC_SET(ptr, EINA_MAGIC_NONE);
59 EINA_MAGIC_SET(&ptr->base, EINA_MAGIC_NONE);
66 print_person(person *ptr)
68 if (!EINA_MAGIC_CHECK(ptr, BASETYPE_MAGIC)){
69 EINA_MAGIC_FAIL(ptr, BASETYPE_MAGIC);
72 printf("name: %s\n", ptr->name);
76 print_pilot(pilot *ptr)
78 if (!EINA_MAGIC_CHECK(ptr, SUBTYPE_MAGIC)) {
79 EINA_MAGIC_FAIL(ptr, SUBTYPE_MAGIC);
82 print_person(&ptr->base);
83 printf("callsign: %s\n", ptr->callsign);
87 main(int argc, char **argv)
93 eina_magic_string_set(BASETYPE_MAGIC, "person");
94 eina_magic_string_static_set(SUBTYPE_MAGIC, "pilot");
96 base = person_new("Tyrol");
97 sub = pilot_new("thrace", "starbuck");
100 print_person((person *)sub);
102 print_pilot(base); //BAD