annotate src/core/script.c @ 65:80a913d25aa9

core: implement script, closes #2465 @2h
author David Demelier <markand@malikania.fr>
date Mon, 27 Jan 2020 12:24:20 +0100
parents
children 5da49274e5fb
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
65
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
1 /*
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
2 * script.c -- convenient sequence of actions
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
3 *
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
4 * Copyright (c) 2020 David Demelier <markand@malikania.fr>
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
5 *
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
6 * Permission to use, copy, modify, and/or distribute this software for any
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
7 * purpose with or without fee is hereby granted, provided that the above
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
8 * copyright notice and this permission notice appear in all copies.
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
9 *
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
17 */
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
18
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
19 #include <assert.h>
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
20 #include <stdlib.h>
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
21 #include <string.h>
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
22
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
23 #include "script.h"
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
24 #include "util.h"
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
25
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
26 static void
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
27 script_action_finish(struct action *a)
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
28 {
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
29 assert(a);
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
30
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
31 script_finish(a->data);
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
32 free(a->data);
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
33 }
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
34
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
35 static void
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
36 script_action_handle(struct action *a, const union event *ev)
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
37 {
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
38 assert(a);
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
39 assert(ev);
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
40
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
41 script_handle(a->data, ev);
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
42 }
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
43
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
44 static bool
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
45 script_action_update(struct action *a, unsigned int ticks)
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
46 {
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
47 assert(a);
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
48
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
49 return script_update(a->data, ticks);
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
50 }
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
51
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
52 static void
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
53 script_action_draw(struct action *a)
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
54 {
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
55 assert(a);
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
56
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
57 script_draw(a->data);
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
58 }
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
59
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
60 void
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
61 script_init(struct script *s)
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
62 {
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
63 assert(s);
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
64
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
65 memset(s, 0, sizeof (struct script));
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
66 s->tail = &s->head;
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
67 }
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
68
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
69 void
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
70 script_start(struct script *s)
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
71 {
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
72 assert(s);
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
73
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
74 s->iter = s->head;
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
75 }
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
76
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
77 void
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
78 script_append(struct script *s, const struct action *a)
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
79 {
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
80 assert(s);
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
81 assert(a);
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
82 assert(a->update);
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
83
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
84 struct script_action *iter = ecalloc(1, sizeof (struct script_action));
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
85
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
86 memcpy(&iter->action, a, sizeof (struct action));
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
87 *s->tail = iter;
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
88 s->tail = &iter->next;
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
89 }
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
90
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
91 void
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
92 script_handle(struct script *s, const union event *ev)
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
93 {
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
94 assert(s);
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
95 assert(ev);
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
96
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
97 if (s->iter)
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
98 s->iter->action.handle(&s->iter->action, ev);
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
99 }
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
100
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
101 bool
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
102 script_update(struct script *s, unsigned int ticks)
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
103 {
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
104 assert(s);
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
105
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
106 if (s->iter && s->iter->action.update(&s->iter->action, ticks)) {
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
107 if (s->iter->action.finish)
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
108 s->iter->action.finish(&s->iter->action);
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
109
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
110 s->iter = s->iter->next;
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
111 }
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
112
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
113 return s->iter == NULL;
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
114 }
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
115
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
116 void
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
117 script_draw(struct script *s)
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
118 {
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
119 assert(s);
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
120
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
121 if (s->iter && s->iter->action.draw)
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
122 s->iter->action.draw(&s->iter->action);
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
123 }
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
124
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
125 void
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
126 script_action(const struct script *s, struct action *action)
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
127 {
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
128 assert(s);
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
129 assert(action);
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
130
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
131 memset(action, 0, sizeof (struct action));
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
132 action->data = ememdup(s, sizeof (struct script));
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
133 action->handle = script_action_handle;
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
134 action->update = script_action_update;
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
135 action->draw = script_action_draw;
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
136 action->finish = script_action_finish;
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
137 }
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
138
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
139 void
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
140 script_finish(struct script *s)
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
141 {
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
142 assert(s);
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
143
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
144 struct script_action *iter, *next;
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
145
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
146 for (iter = s->head; iter; iter = next) {
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
147 next = iter->next;
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
148 free(iter);
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
149 }
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
150
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
151 memset(s, 0, sizeof (struct script));
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
152 }