EFL 1.7 svn doobies
[profile/ivi/eina.git] / src / examples / eina_magic_01.c
1 //Compile with:
2 //gcc -g eina_magic_01.c -o eina_magic_01 `pkg-config --cflags --libs eina`
3
4 #include <Eina.h>
5
6 #define BASETYPE_MAGIC 0x12345
7 struct _person {
8    EINA_MAGIC;
9    char *name;
10 };
11 typedef struct _person person;
12
13 #define SUBTYPE_MAGIC 0x3333
14 struct _pilot {
15    person base;
16    EINA_MAGIC;
17    char *callsign;
18 };
19 typedef struct _pilot pilot;
20
21 person *
22 person_new(const char *name)
23 {
24    person *ptr = malloc(sizeof(person));
25    EINA_MAGIC_SET(ptr, BASETYPE_MAGIC);
26    ptr->name = strdup(name);
27 }
28
29 void
30 person_free(person *ptr) {
31    if (!EINA_MAGIC_CHECK(ptr, BASETYPE_MAGIC))
32    {
33       EINA_MAGIC_FAIL(ptr, BASETYPE_MAGIC);
34       return;
35    }
36    EINA_MAGIC_SET(ptr, EINA_MAGIC_NONE);
37    free(ptr->name);
38    free(ptr);
39 }
40
41 pilot *
42 pilot_new(const char *name, const char *callsign)
43 {
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);
49 }
50
51 void
52 pilot_free(pilot *ptr) {
53    if (!EINA_MAGIC_CHECK(ptr, SUBTYPE_MAGIC))
54    {
55       EINA_MAGIC_FAIL(ptr, SUBTYPE_MAGIC);
56       return;
57    }
58    EINA_MAGIC_SET(ptr, EINA_MAGIC_NONE);
59    EINA_MAGIC_SET(&ptr->base, EINA_MAGIC_NONE);
60    free(ptr->base.name);
61    free(ptr->callsign);
62    free(ptr);
63 }
64
65 void
66 print_person(person *ptr)
67 {
68    if (!EINA_MAGIC_CHECK(ptr, BASETYPE_MAGIC)){
69       EINA_MAGIC_FAIL(ptr, BASETYPE_MAGIC);
70       return;
71    }
72    printf("name: %s\n", ptr->name);
73 }
74
75 void
76 print_pilot(pilot *ptr)
77 {
78    if (!EINA_MAGIC_CHECK(ptr, SUBTYPE_MAGIC)) {
79       EINA_MAGIC_FAIL(ptr, SUBTYPE_MAGIC);
80       return;
81    }
82    print_person(&ptr->base);
83    printf("callsign: %s\n", ptr->callsign);
84 }
85
86 int
87 main(int argc, char **argv)
88 {
89    person *base;
90    pilot *sub;
91
92    eina_init();
93    eina_magic_string_set(BASETYPE_MAGIC, "person");
94    eina_magic_string_static_set(SUBTYPE_MAGIC, "pilot");
95
96    base = person_new("Tyrol");
97    sub = pilot_new("thrace", "starbuck");
98
99    print_person(base);
100    print_person((person *)sub);
101
102    print_pilot(base); //BAD
103    print_pilot(sub);
104
105    eina_shutdown();
106 }