Mercurial > molko
annotate src/libmlk-core/core/action-stack.c @ 430:1645433e008d
core: rename ERR_INTERNAL to ERR_SDL
author | David Demelier <markand@malikania.fr> |
---|---|
date | Sat, 15 Oct 2022 17:18:45 +0200 |
parents | b0579ae033ed |
children |
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 |
422
b0579ae033ed
core: use err.h in (action|drawable)-stack
David Demelier <markand@malikania.fr>
parents:
392
diff
changeset
|
22 #include "action-stack.h" |
369
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
23 #include "action.h" |
422
b0579ae033ed
core: use err.h in (action|drawable)-stack
David Demelier <markand@malikania.fr>
parents:
392
diff
changeset
|
24 #include "err.h" |
369
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
25 |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
26 #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
|
27 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
|
28 |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
29 void |
392
e6d7ebad33cc
core: don't use fixed arrays in action_stack
David Demelier <markand@malikania.fr>
parents:
378
diff
changeset
|
30 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
|
31 { |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
32 assert(st); |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
33 |
392
e6d7ebad33cc
core: don't use fixed arrays in action_stack
David Demelier <markand@malikania.fr>
parents:
378
diff
changeset
|
34 st->actions = actions; |
e6d7ebad33cc
core: don't use fixed arrays in action_stack
David Demelier <markand@malikania.fr>
parents:
378
diff
changeset
|
35 st->actionsz = actionsz; |
e6d7ebad33cc
core: don't use fixed arrays in action_stack
David Demelier <markand@malikania.fr>
parents:
378
diff
changeset
|
36 |
e6d7ebad33cc
core: don't use fixed arrays in action_stack
David Demelier <markand@malikania.fr>
parents:
378
diff
changeset
|
37 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
|
38 st->actions[i] = NULL; |
369
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 |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
41 int |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
42 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
|
43 { |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
44 assert(st); |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
45 assert(act); |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
46 |
392
e6d7ebad33cc
core: don't use fixed arrays in action_stack
David Demelier <markand@malikania.fr>
parents:
378
diff
changeset
|
47 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
|
48 if (!st->actions[i]) { |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
49 st->actions[i] = act; |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
50 return 0; |
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 |
422
b0579ae033ed
core: use err.h in (action|drawable)-stack
David Demelier <markand@malikania.fr>
parents:
392
diff
changeset
|
54 return ERR_NO_MEM; |
369
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 |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
57 void |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
58 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
|
59 { |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
60 assert(st); |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
61 assert(ev); |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
62 |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
63 struct action *act; |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
64 |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
65 ACTION_FOREACH(st, act) |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
66 if (act) |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
67 action_handle(act, ev); |
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 |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
70 int |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
71 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
|
72 { |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
73 assert(st); |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
74 |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
75 struct action *act; |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
76 |
392
e6d7ebad33cc
core: don't use fixed arrays in action_stack
David Demelier <markand@malikania.fr>
parents:
378
diff
changeset
|
77 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
|
78 act = st->actions[i]; |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
79 |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
80 if (act && action_update(act, ticks)) { |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
81 action_end(act); |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
82 action_finish(act); |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
83 st->actions[i] = NULL; |
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 /* |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
88 * 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
|
89 * within their update function. |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
90 */ |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
91 return action_stack_completed(st); |
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 |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
94 void |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
95 action_stack_draw(const struct action_stack *st) |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
96 { |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
97 assert(st); |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
98 |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
99 struct action *act; |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
100 |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
101 ACTION_FOREACH(st, act) |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
102 if (act) |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
103 action_draw(act); |
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 |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
106 int |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
107 action_stack_completed(const struct action_stack *st) |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
108 { |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
109 assert(st); |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
110 |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
111 struct action *act; |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
112 |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
113 ACTION_FOREACH(st, act) |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
114 if (act) |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
115 return 0; |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
116 |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
117 return 1; |
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 |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
120 void |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
121 action_stack_finish(struct action_stack *st) |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
122 { |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
123 assert(st); |
422
b0579ae033ed
core: use err.h in (action|drawable)-stack
David Demelier <markand@malikania.fr>
parents:
392
diff
changeset
|
124 |
369
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
125 struct action *act; |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
126 |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
127 ACTION_FOREACH(st, act) { |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
128 if (act) { |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
129 action_end(act); |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
130 action_finish(act); |
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 |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
134 memset(st, 0, sizeof (*st)); |
1e06f871dc63
core: split action and action_stack
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
135 } |