Mercurial > molko
annotate src/libmlk-core/core/action-stack.c @ 392:e6d7ebad33cc
core: don't use fixed arrays in action_stack
author | David Demelier <markand@malikania.fr> |
---|---|
date | Tue, 15 Feb 2022 20:47:47 +0100 |
parents | 460c78706989 |
children | b0579ae033ed |
rev | line source |
---|---|
369
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
1 /* |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
2 * action-stack.h -- convenient stack of actions |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
3 * |
378
460c78706989
misc: update copyright years
David Demelier <markand@malikania.fr>
parents:
369
diff
changeset
|
4 * Copyright (c) 2020-2022 David Demelier <markand@malikania.fr> |
369
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
5 * |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
6 * Permission to use, copy, modify, and/or distribute this software for any |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
7 * purpose with or without fee is hereby granted, provided that the above |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
8 * copyright notice and this permission notice appear in all copies. |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
9 * |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
17 */ |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
18 |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
19 #include <assert.h> |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
20 #include <string.h> |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
21 |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
22 #include "action.h" |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
23 #include "action-stack.h" |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
24 |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
25 #define ACTION_FOREACH(st, iter) \ |
392
e6d7ebad33cc
core: don't use fixed arrays in action_stack
David Demelier <markand@malikania.fr>
parents:
378
diff
changeset
|
26 for (size_t i = 0; i < (st)->actionsz && ((iter) = (st)->actions[i], 1); ++i) |
369
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
27 |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
28 void |
392
e6d7ebad33cc
core: don't use fixed arrays in action_stack
David Demelier <markand@malikania.fr>
parents:
378
diff
changeset
|
29 action_stack_init(struct action_stack *st, struct action **actions, size_t actionsz) |
369
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
30 { |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
31 assert(st); |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
32 |
392
e6d7ebad33cc
core: don't use fixed arrays in action_stack
David Demelier <markand@malikania.fr>
parents:
378
diff
changeset
|
33 st->actions = actions; |
e6d7ebad33cc
core: don't use fixed arrays in action_stack
David Demelier <markand@malikania.fr>
parents:
378
diff
changeset
|
34 st->actionsz = actionsz; |
e6d7ebad33cc
core: don't use fixed arrays in action_stack
David Demelier <markand@malikania.fr>
parents:
378
diff
changeset
|
35 |
e6d7ebad33cc
core: don't use fixed arrays in action_stack
David Demelier <markand@malikania.fr>
parents:
378
diff
changeset
|
36 for (size_t i = 0; i < st->actionsz; ++i) |
e6d7ebad33cc
core: don't use fixed arrays in action_stack
David Demelier <markand@malikania.fr>
parents:
378
diff
changeset
|
37 st->actions[i] = NULL; |
369
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
38 } |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
39 |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
40 int |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
41 action_stack_add(struct action_stack *st, struct action *act) |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
42 { |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
43 assert(st); |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
44 assert(act); |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
45 |
392
e6d7ebad33cc
core: don't use fixed arrays in action_stack
David Demelier <markand@malikania.fr>
parents:
378
diff
changeset
|
46 for (size_t i = 0; i < st->actionsz; ++i) { |
369
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
47 if (!st->actions[i]) { |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
48 st->actions[i] = act; |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
49 return 0; |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
50 } |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
51 } |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
52 |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
53 return -1; |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
54 } |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
55 |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
56 void |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
57 action_stack_handle(struct action_stack *st, const union event *ev) |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
58 { |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
59 assert(st); |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
60 assert(ev); |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
61 |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
62 struct action *act; |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
63 |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
64 ACTION_FOREACH(st, act) |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
65 if (act) |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
66 action_handle(act, ev); |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
67 } |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
68 |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
69 int |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
70 action_stack_update(struct action_stack *st, unsigned int ticks) |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
71 { |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
72 assert(st); |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
73 |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
74 struct action *act; |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
75 |
392
e6d7ebad33cc
core: don't use fixed arrays in action_stack
David Demelier <markand@malikania.fr>
parents:
378
diff
changeset
|
76 for (size_t i = 0; i < st->actionsz; ++i) { |
369
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
77 act = st->actions[i]; |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
78 |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
79 if (act && action_update(act, ticks)) { |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
80 action_end(act); |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
81 action_finish(act); |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
82 st->actions[i] = NULL; |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
83 } |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
84 } |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
85 |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
86 /* |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
87 * We process all actions again in case the user modified the stack |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
88 * within their update function. |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
89 */ |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
90 return action_stack_completed(st); |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
91 } |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
92 |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
93 void |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
94 action_stack_draw(const struct action_stack *st) |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
95 { |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
96 assert(st); |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
97 |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
98 struct action *act; |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
99 |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
100 ACTION_FOREACH(st, act) |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
101 if (act) |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
102 action_draw(act); |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
103 } |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
104 |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
105 int |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
106 action_stack_completed(const struct action_stack *st) |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
107 { |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
108 assert(st); |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
109 |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
110 struct action *act; |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
111 |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
112 ACTION_FOREACH(st, act) |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
113 if (act) |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
114 return 0; |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
115 |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
116 return 1; |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
117 } |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
118 |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
119 void |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
120 action_stack_finish(struct action_stack *st) |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
121 { |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
122 assert(st); |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
123 |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
124 struct action *act; |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
125 |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
126 ACTION_FOREACH(st, act) { |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
127 if (act) { |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
128 action_end(act); |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
129 action_finish(act); |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
130 } |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
131 } |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
132 |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
133 memset(st, 0, sizeof (*st)); |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
134 } |