Commit | Line | Data |
---|---|---|
a07d8d00 MW |
1 | /* -*-sod-*- |
2 | * | |
3 | * A simple SOD module for testing. | |
4 | */ | |
5 | ||
6 | code c : includes { | |
7 | #include <stdio.h> | |
8 | #include "chimaera.h" | |
9 | } | |
10 | ||
11 | code h : includes { | |
12 | #include "sod.h" | |
13 | } | |
14 | ||
a07d8d00 MW |
15 | [nick = nml, link = SodObject] |
16 | class Animal : SodObject { | |
17 | int tickles = 0; | |
18 | ||
19 | void tickle(void) { } | |
20 | ||
21 | [role = before] | |
22 | void nml.tickle(void) { me->nml.tickles++; } | |
23 | } | |
24 | ||
25 | class Lion : Animal { | |
26 | void bite(void) { puts("Munch!"); } | |
0bc67e51 | 27 | void nml.tickle(void) { me->_vt->lion.bite(me); } |
a07d8d00 MW |
28 | } |
29 | ||
30 | class Goat : Animal { | |
31 | void butt(void) { puts("Bonk!"); } | |
0bc67e51 | 32 | void nml.tickle(void) { me->_vt->goat.butt(me); } |
a07d8d00 MW |
33 | } |
34 | ||
35 | class Serpent : Animal { | |
36 | void hiss(void) { puts("Sssss!"); } | |
37 | void bite(void) { puts("Nom!"); } | |
38 | void nml.tickle(void) { | |
0bc67e51 MW |
39 | if (SERPENT__CONV_NML(me)->nml.tickles > 2) me->_vt->serpent.bite(me); |
40 | else me->_vt->serpent.hiss(me); | |
a07d8d00 MW |
41 | } |
42 | } | |
43 | ||
44 | [nick = sir, link = Animal] | |
45 | class Chimaera : Lion, Goat, Serpent { | |
46 | } | |
47 | ||
9ccbddd6 MW |
48 | code c : user [classes end, user, epilogue] { |
49 | /*----- Main driver code --------------------------------------------------*/ | |
50 | ||
51 | static void tickle_animal(Animal *a) | |
52 | { | |
53 | int i; | |
54 | ||
55 | for (i = 0; i < 3; i++) { | |
56 | printf("tickle %s #%d...\n", a->_vt->_class->cls.name, i); | |
57 | a->_vt->nml.tickle(a); | |
58 | } | |
59 | } | |
60 | ||
61 | static void provoke_lion(Lion *l) | |
62 | { | |
63 | printf("provoking %s as a lion\n", l->_vt->_class->cls.name); | |
64 | l->_vt->lion.bite(l); | |
65 | } | |
66 | ||
67 | static void provoke_goat(Goat *g) | |
68 | { | |
69 | printf("provoking %s as a goat\n", g->_vt->_class->cls.name); | |
70 | g->_vt->goat.butt(g); | |
71 | } | |
72 | ||
73 | static void provoke_serpent(Serpent *s) | |
74 | { | |
75 | printf("provoking %s as a serpent\n", s->_vt->_class->cls.name); | |
76 | s->_vt->serpent.bite(s); | |
77 | } | |
78 | ||
0f1af3cc MW |
79 | #define SOD_DECL(cls_, var_) \ |
80 | struct cls_##__ilayout var_##__layout; \ | |
81 | cls_ *var_ = cls_##__class->cls.init(&var_##__layout) | |
82 | ||
9ccbddd6 MW |
83 | int main(void) |
84 | { | |
85 | { | |
0f1af3cc | 86 | SOD_DECL(Lion, l); |
9ccbddd6 MW |
87 | provoke_lion(l); |
88 | tickle_animal(LION__CONV_NML(l)); | |
89 | } | |
90 | ||
91 | { | |
0f1af3cc | 92 | SOD_DECL(Goat, g); |
9ccbddd6 MW |
93 | provoke_goat(g); |
94 | tickle_animal(GOAT__CONV_NML(g)); | |
95 | } | |
96 | ||
97 | { | |
0f1af3cc | 98 | SOD_DECL(Serpent, s); |
9ccbddd6 MW |
99 | provoke_serpent(s); |
100 | tickle_animal(SERPENT__CONV_NML(s)); | |
101 | } | |
102 | ||
103 | { | |
0f1af3cc | 104 | SOD_DECL(Chimaera, c); |
9ccbddd6 MW |
105 | provoke_lion(CHIMAERA__CONV_LION(c)); |
106 | provoke_goat(CHIMAERA__CONV_GOAT(c)); | |
107 | provoke_serpent(CHIMAERA__CONV_SERPENT(c)); | |
108 | tickle_animal(CHIMAERA__CONV_NML(c)); | |
109 | } | |
110 | ||
111 | return (0); | |
112 | } | |
113 | ||
114 | } |