annotate src/mlk-run/main.c @ 337:68b9d010e081

js: add minimal Javascript binding
author David Demelier <markand@malikania.fr>
date Thu, 14 Oct 2021 12:52:41 +0200
parents
children 94828af916bb
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
337
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
1 /*
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
2 * main.c -- main mlk-run file
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
3 *
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
4 * Copyright (c) 2020-2021 David Demelier <markand@malikania.fr>
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
5 *
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
6 * Permission to use, copy, modify, and/or distribute this software for any
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
7 * purpose with or without fee is hereby granted, provided that the above
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
8 * copyright notice and this permission notice appear in all copies.
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
9 *
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
17 */
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
18
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
19 #include <stdio.h>
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
20 #include <stdlib.h>
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
21
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
22 #include <duktape.h>
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
23
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
24 #include <core/panic.h>
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
25 #include <core/vfs-directory.h>
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
26 #include <core/vfs-zip.h>
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
27 #include <core/vfs.h>
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
28
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
29 #include <core/js-window.h>
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
30
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
31 /* VFS loader to support zip and directories when loading game. */
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
32 static struct vfs vfs;
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
33
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
34 /* Javascript context. */
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
35 static duk_context *ctx;
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
36
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
37 static void
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
38 core_bind(duk_context *ctx)
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
39 {
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
40 js_window_bind(ctx);
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
41 }
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
42
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
43 static void
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
44 init(void)
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
45 {
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
46 /* TODO: this is temporary. */
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
47 if (core_init("fr.malikania", "mlk-run") < 0)
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
48 panic();
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
49
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
50 /* Fireup Javascript. */
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
51 ctx = duk_create_heap_default();
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
52 core_bind(ctx);
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
53 }
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
54
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
55 static char *
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
56 extract(struct vfs_file *file)
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
57 {
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
58 FILE *fp;
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
59 char *out, buf[BUFSIZ];
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
60 size_t len, nr;
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
61
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
62 if (!(fp = open_memstream(&out, &len)))
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
63 panic();
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
64
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
65 while ((nr = vfs_file_read(file, buf, sizeof (buf))) > 0)
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
66 if (fwrite(buf, 1, nr, fp) <= 0)
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
67 panic();
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
68
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
69 fclose(fp);
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
70
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
71 return out;
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
72 }
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
73
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
74 static void
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
75 startup(void)
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
76 {
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
77 struct vfs_file main;
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
78 char *code;
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
79
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
80 if (vfs_open(&vfs, &main, "main.js", "r") < 0)
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
81 panic();
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
82
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
83 code = extract(&main);
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
84 vfs_file_finish(&main);
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
85
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
86 if (duk_peval_string(ctx, code))
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
87 panicf("%s", duk_safe_to_string(ctx, -1));
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
88
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
89 free(code);
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
90 }
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
91
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
92 static void
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
93 finish(void)
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
94 {
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
95 vfs_finish(&vfs);
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
96 duk_destroy_heap(ctx);
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
97 }
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
98
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
99 static void
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
100 loadzip(const char *path)
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
101 {
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
102 if (vfs_zip(&vfs, path, "r") < 0)
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
103 panic();
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
104 }
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
105
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
106 static void
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
107 loaddirectory(const char *path)
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
108 {
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
109 vfs_directory(&vfs, path);
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
110 }
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
111
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
112 static void
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
113 load(const char *path)
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
114 {
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
115 /* TODO: improve this. */
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
116 if (strstr(path, ".mlk"))
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
117 loadzip(path);
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
118 else
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
119 loaddirectory(path);
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
120
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
121 startup();
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
122 }
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
123
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
124 static void
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
125 run(int argc, char **argv)
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
126 {
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
127 if (argc < 0) {
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
128 fprintf(stderr, "usage: mlk-run game\n");
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
129 exit(1);
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
130 }
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
131
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
132 load(argv[0]);
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
133 }
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
134
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
135 int
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
136 main(int argc, char **argv)
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
137 {
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
138 --argc;
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
139 ++argv;
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
140
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
141 init();
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
142 run(argc, argv);
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
143 finish();
68b9d010e081 js: add minimal Javascript binding
David Demelier <markand@malikania.fr>
parents:
diff changeset
144 }