diff options
author | Max Bolingbroke <batterseapower@hotmail.com> | 2011-05-14 22:34:41 +0100 |
---|---|---|
committer | Max Bolingbroke <batterseapower@hotmail.com> | 2011-05-14 22:34:41 +0100 |
commit | 1a410093862a85b51aa59605af80868eaecd25c4 (patch) | |
tree | 5f94c74e34b0160452e80464d4d6e3de3ccac0ad /rts | |
parent | cfbf0eb134efd1c5d9a589f6ae2139d7fad60581 (diff) | |
download | haskell-1a410093862a85b51aa59605af80868eaecd25c4.tar.gz |
Unicode fixes, taking into account PEP383 support
Diffstat (limited to 'rts')
-rw-r--r-- | rts/Linker.c | 2 | ||||
-rw-r--r-- | rts/RtsFlags.c | 58 |
2 files changed, 60 insertions, 0 deletions
diff --git a/rts/Linker.c b/rts/Linker.c index 2c084ba662..28ba9a0aa9 100644 --- a/rts/Linker.c +++ b/rts/Linker.c @@ -387,6 +387,8 @@ typedef struct _RtsSymbolVal { SymI_HasProto(stg_asyncReadzh) \ SymI_HasProto(stg_asyncWritezh) \ SymI_HasProto(stg_asyncDoProczh) \ + SymI_HasProto(getWin32ProgArgv) \ + SymI_HasProto(setWin32ProgArgv) \ SymI_HasProto(memset) \ SymI_HasProto(inet_ntoa) \ SymI_HasProto(inet_addr) \ diff --git a/rts/RtsFlags.c b/rts/RtsFlags.c index 408e1c7043..14080702bf 100644 --- a/rts/RtsFlags.c +++ b/rts/RtsFlags.c @@ -34,6 +34,14 @@ char **full_prog_argv = NULL; char *prog_name = NULL; /* 'basename' of prog_argv[0] */ int rts_argc = 0; /* ditto */ char *rts_argv[MAX_RTS_ARGS]; +#if defined(mingw32_HOST_OS) +// On Windows, we want to use GetCommandLineW rather than argc/argv, +// but we need to mutate the command line arguments for withProgName and +// friends. The System.Environment module achieves that using this bit of +// shared state: +int win32_prog_argc = 0; +wchar_t **win32_prog_argv = NULL; +#endif /* * constants, used later @@ -1536,3 +1544,53 @@ freeFullProgArgv (void) full_prog_argc = 0; full_prog_argv = NULL; } + +#if defined(mingw32_HOST_OS) +void freeWin32ProgArgv (void); + +void +freeWin32ProgArgv (void) +{ + int i; + + if (win32_prog_argv != NULL) { + for (i = 0; i < win32_prog_argc; i++) { + stgFree(win32_prog_argv[i]); + } + stgFree(win32_prog_argv); + } + + win32_prog_argc = 0; + win32_prog_argv = NULL; +} + +void +getWin32ProgArgv(int *argc, wchar_t **argv[]) +{ + *argc = win32_prog_argc; + *argv = win32_prog_argv; +} + +void +setWin32ProgArgv(int argc, wchar_t *argv[]) +{ + int i; + + freeWin32ProgArgv(); + + win32_prog_argc = argc; + if (argv == NULL) { + win32_prog_argv = NULL; + return; + } + + win32_prog_argv = stgCallocBytes(argc + 1, sizeof (wchar_t *), + "setWin32ProgArgv 1"); + for (i = 0; i < argc; i++) { + win32_prog_argv[i] = stgMallocBytes((wcslen(argv[i]) + 1) * sizeof(wchar_t), + "setWin32ProgArgv 2"); + wcscpy(win32_prog_argv[i], argv[i]); + } + win32_prog_argv[argc] = NULL; +} +#endif |