on master help sign in
Merge pull request #3644 from be5invis/be5invis-patch-win32-encoding
d08fc3bNiklas Larsson
rts/idris_main.c+35−3
@@ -1,7 +1,32 @@
1+#include "idris_gmp.h"
1#include "idris_opts.h"
2#include "idris_opts.h"
2−#include "idris_stats.h"
3#include "idris_rts.h"
3#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+
5// The default options should give satisfactory results under many circumstances.
30// The default options should give satisfactory results under many circumstances.
6RTSOpts opts = {
31RTSOpts opts = {
7 .init_heap_size = 16384000,
32 .init_heap_size = 16384000,
@@ -9,7 +34,14 @@ RTSOpts opts = {
9 .show_summary = 0
34 .show_summary = 0
10};
35};
11
36
37+#if defined(WIN32) || defined(__WIN32) || defined(__WIN32__)
12−int main(int argc, char* argv[]) {
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
13 parse_shift_args(&opts, &argc, &argv);
45 parse_shift_args(&opts, &argc, &argv);
14
46
15 __idris_argc = argc;
47 __idris_argc = argc;
rts/idris_opts.c+1−1
@@ -99,7 +99,7 @@ int parse_args(RTSOpts * opts, int argc, char *argv[])
99 return argc;
99 return argc;
100}
100}
101
101
102−void parse_shift_args(RTSOpts * opts, int * argc, char ** argv[]) {
102+void parse_shift_args(RTSOpts * opts, int * argc, char *** argv) {
103 size_t shift = parse_args(opts, (*argc) - 1, (*argv) + 1);
103 size_t shift = parse_args(opts, (*argc) - 1, (*argv) + 1);
104
104
105 char *prg = (*argv)[0];
105 char *prg = (*argv)[0];
rts/idris_opts.h+1−1
@@ -14,6 +14,6 @@ void print_usage(FILE * s);
14
14
15// Parse rts options and shift arguments such that rts options becomes invisible
15// Parse rts options and shift arguments such that rts options becomes invisible
16// for main program.
16// for main program.
17−void parse_shift_args(RTSOpts * opts, int * argc, char ** argv[]);
17+void parse_shift_args(RTSOpts * opts, int * argc, char *** argv);
18
18
19#endif
19#endif
rts/idris_stdfgn.c+17−7
@@ -11,6 +11,8 @@
11
11
12#if defined(WIN32) || defined(__WIN32) || defined(__WIN32__)
12#if defined(WIN32) || defined(__WIN32) || defined(__WIN32__)
13int win_fpoll(void* h);
13int win_fpoll(void* h);
14+FILE *win32_u8fopen(const char *path, const char *mode);
15+FILE *win32_u8popen(const char *path, const char *mode);
14#else
16#else
15#include <sys/select.h>
17#include <sys/select.h>
16#endif
18#endif
@@ -21,9 +23,13 @@ void putStr(char* str) {
21 printf("%s", str);
23 printf("%s", str);
22}
24}
23
25
24−void* fileOpen(char* name, char* mode) {
26+void *fileOpen(char *name, char *mode) {
27+#if defined(WIN32) || defined(__WIN32) || defined(__WIN32__)
28+ FILE *f = win32_u8fopen(name, mode);
29+#else
25− FILE* f = fopen(name, mode);
30+ FILE *f = fopen(name, mode);
31+#endif
26− return (void*)f;
32+ return (void *)f;
27}
33}
28
34
29void fileClose(void* h) {
35void fileClose(void* h) {
@@ -82,10 +88,14 @@ int fpoll(void* h)
82#endif
88#endif
83}
89}
84
90
85−void* do_popen(const char* cmd, const char* mode) {
91+void *do_popen(const char *cmd, const char *mode) {
92+#if defined(WIN32) || defined(__WIN32) || defined(__WIN32__)
93+ FILE *f = win32_u8popen(cmd, mode);
94+#else
86− FILE* f = popen(cmd, mode);
95+ FILE *f = popen(cmd, mode);
87−// int d = fileno(f);
96+ // int d = fileno(f);
88−// fcntl(d, F_SETFL, O_NONBLOCK);
97+ // fcntl(d, F_SETFL, O_NONBLOCK);
98+#endif
89 return f;
99 return f;
90}
100}
91
101
rts/windows/win_utils.c+33−3
@@ -1,13 +1,13 @@
1−#include <windows.h>
2#include <io.h>
1#include <io.h>
3#include <stdio.h>
2#include <stdio.h>
3+#include <windows.h>
4
4
5// THis file exists to avoid clashes between windows.h and idris_rts.h
5// THis file exists to avoid clashes between windows.h and idris_rts.h
6//
6//
7
7
8−int win_fpoll(void* h)
8+int win_fpoll(void *h)
9{
9{
10− HANDLE wh =(HANDLE) _get_osfhandle(_fileno((FILE*)h));
10+ HANDLE wh =(HANDLE) _get_osfhandle(_fileno((FILE *)h));
11 if (wh == INVALID_HANDLE_VALUE) {
11 if (wh == INVALID_HANDLE_VALUE) {
12 return -1;
12 return -1;
13 }
13 }
@@ -19,3 +19,33 @@ int win_fpoll(void* h)
19 return 0;
19 return 0;
20 return -1;
20 return -1;
21}
21}
22+
23+int widen_utf8(const char *filename_utf8, LPWSTR *filename_w)
24+{
25+ int num_chars = MultiByteToWideChar(CP_UTF8, 0, filename_utf8, -1, 0, 0);
26+ int size = sizeof(WCHAR);
27+ *filename_w = (LPWSTR)malloc(size * num_chars);
28+ MultiByteToWideChar(CP_UTF8, 0, filename_utf8, -1, *filename_w, num_chars);
29+ return num_chars;
30+}
31+FILE *win32_u8fopen(const char *path, const char *mode)
32+{
33+ LPWSTR wpath, wmode;
34+ widen_utf8(path, &wpath);
35+ widen_utf8(mode, &wmode);
36+ FILE *f = _wfopen(wpath, wmode);
37+ free(wpath);
38+ free(wmode);
39+ return f;
40+}
41+
42+FILE *win32_u8popen(const char *path, const char *mode)
43+{
44+ LPWSTR wpath, wmode;
45+ widen_utf8(path, &wpath);
46+ widen_utf8(mode, &wmode);
47+ FILE *f = _wpopen(wpath, wmode);
48+ free(wpath);
49+ free(wmode);
50+ return f;
51+}