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 | ||
01b1aacd MW |
19 | [combination = progn] void tickle(); |
20 | [role = before] void nml.tickle() { me->nml.tickles++; } | |
a07d8d00 MW |
21 | } |
22 | ||
23 | class Lion : Animal { | |
94ffe796 | 24 | void bite() { puts("Munch!"); } |
61d083c6 | 25 | void nml.tickle() { Lion_bite(me); } |
a07d8d00 MW |
26 | } |
27 | ||
28 | class Goat : Animal { | |
94ffe796 | 29 | void butt() { puts("Bonk!"); } |
61d083c6 | 30 | void nml.tickle() { Goat_butt(me); } |
a07d8d00 MW |
31 | } |
32 | ||
33 | class Serpent : Animal { | |
94ffe796 MW |
34 | void hiss() { puts("Sssss!"); } |
35 | void bite() { puts("Nom!"); } | |
36 | void nml.tickle() { | |
7d5b141f MW |
37 | if (SERPENT__CONV_NML(me)->nml.tickles <= 2) Serpent_hiss(me); |
38 | else Serpent_bite(me); | |
a07d8d00 MW |
39 | } |
40 | } | |
41 | ||
42 | [nick = sir, link = Animal] | |
43 | class Chimaera : Lion, Goat, Serpent { | |
44 | } | |
45 | ||
d437292a | 46 | code c : user { |
9ccbddd6 MW |
47 | /*----- Main driver code --------------------------------------------------*/ |
48 | ||
49 | static void tickle_animal(Animal *a) | |
50 | { | |
51 | int i; | |
52 | ||
53 | for (i = 0; i < 3; i++) { | |
54 | printf("tickle %s #%d...\n", a->_vt->_class->cls.name, i); | |
61d083c6 | 55 | Animal_tickle(a); |
9ccbddd6 MW |
56 | } |
57 | } | |
58 | ||
59 | static void provoke_lion(Lion *l) | |
60 | { | |
61 | printf("provoking %s as a lion\n", l->_vt->_class->cls.name); | |
61d083c6 | 62 | Lion_bite(l); |
9ccbddd6 MW |
63 | } |
64 | ||
65 | static void provoke_goat(Goat *g) | |
66 | { | |
67 | printf("provoking %s as a goat\n", g->_vt->_class->cls.name); | |
61d083c6 | 68 | Goat_butt(g); |
9ccbddd6 MW |
69 | } |
70 | ||
71 | static void provoke_serpent(Serpent *s) | |
72 | { | |
73 | printf("provoking %s as a serpent\n", s->_vt->_class->cls.name); | |
61d083c6 | 74 | Serpent_bite(s); |
9ccbddd6 MW |
75 | } |
76 | ||
77 | int main(void) | |
78 | { | |
79 | { | |
0f1af3cc | 80 | SOD_DECL(Lion, l); |
9ccbddd6 MW |
81 | provoke_lion(l); |
82 | tickle_animal(LION__CONV_NML(l)); | |
83 | } | |
84 | ||
85 | { | |
0f1af3cc | 86 | SOD_DECL(Goat, g); |
9ccbddd6 MW |
87 | provoke_goat(g); |
88 | tickle_animal(GOAT__CONV_NML(g)); | |
89 | } | |
90 | ||
91 | { | |
0f1af3cc | 92 | SOD_DECL(Serpent, s); |
9ccbddd6 MW |
93 | provoke_serpent(s); |
94 | tickle_animal(SERPENT__CONV_NML(s)); | |
95 | } | |
96 | ||
97 | { | |
0f1af3cc | 98 | SOD_DECL(Chimaera, c); |
9ccbddd6 MW |
99 | provoke_lion(CHIMAERA__CONV_LION(c)); |
100 | provoke_goat(CHIMAERA__CONV_GOAT(c)); | |
101 | provoke_serpent(CHIMAERA__CONV_SERPENT(c)); | |
102 | tickle_animal(CHIMAERA__CONV_NML(c)); | |
103 | } | |
104 | ||
105 | return (0); | |
106 | } | |
107 | ||
108 | } |