Mercurial > molko
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 |
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 } |