@@ -1,7 +1,32 @@
1+#include "idris_gmp.h"
12#include "idris_opts.h"
2−#include "idris_stats.h"
33#include "idris_rts.h"
4−#include "idris_gmp.h"
4+#include "idris_stats.h"
5+
6+#if defined(WIN32) || defined(__WIN32) || defined(__WIN32__)
7+#include <Windows.h>
8+int win32_get_argv_utf8(int *argc_ptr, char ***argv_ptr)
9+{
10+ int argc;
11+ char **argv;
12+ wchar_t **argv_utf16 = CommandLineToArgvW(GetCommandLineW(), &argc);
13+ int i;
14+ int offset = (argc + 1) * sizeof(char *);
15+ int size = offset;
16+ for (i = 0; i < argc; i++) {
17+ size += WideCharToMultiByte(CP_UTF8, 0, argv_utf16[i], -1, 0, 0, 0, 0);
18+ }
19+ argv = (char **)malloc(size);
20+ for (i = 0; i < argc; i++) {
21+ argv[i] = (char *)argv + offset;
22+ offset += WideCharToMultiByte(CP_UTF8, 0, argv_utf16[i], -1, argv[i], size - offset, 0, 0);
23+ }
24+ *argc_ptr = argc;
25+ *argv_ptr = argv;
26+ return 0;
27+}
28+#endif
29+
530// The default options should give satisfactory results under many circumstances.
631RTSOpts opts = {
732 .init_heap_size = 16384000,
@@ -9,7 +34,14 @@ RTSOpts opts = {
934 .show_summary = 0
1035};
1136
12−int main(int argc, char* argv[]) {
37+#if defined(WIN32) || defined(__WIN32) || defined(__WIN32__)
38+int main() {
39+ int argc;
40+ char **argv;
41+ win32_get_argv_utf8(&argc, &argv);
42+#else
43+int main(int argc, char **argv) {
44+#endif
1345 parse_shift_args(&opts, &argc, &argv);
1446
1547 __idris_argc = argc;