src/pkg/os/env_windows.go | 15 +++++++++++++++ src/pkg/runtime/runtime.c | 4 ++++ src/pkg/runtime/runtime.h | 2 -- src/pkg/runtime/string.goc | 30 ------------------------------ src/pkg/runtime/windows/os.h | 3 --- src/pkg/runtime/windows/thread.c | 56 ----------------------------------------------------- src/pkg/syscall/mksyscall_windows.sh | 18 +++++++++--------- src/pkg/syscall/syscall_windows.go | 49 ++++++++++++++++++++++++++----------------------- src/pkg/syscall/zsyscall_windows_386.go | 40 ++++++++++++++++++++++++++++++++++++++++ diff --git a/src/pkg/os/env_windows.go b/src/pkg/os/env_windows.go index 6908a9ca85b3f18d141e8d06cad6fed869f17961..ad50610ee622bab349a2065f94b8bf45ba86e331 100644 --- a/src/pkg/os/env_windows.go +++ b/src/pkg/os/env_windows.go @@ -111,3 +111,18 @@ n-- } return string(utf16.Decode(dirw[0:n])) } + +func init() { + var argc int32 + Envs = Environ() + cmd := syscall.GetCommandLine() + argv, e := syscall.CommandLineToArgv(cmd, &argc) + if e != 0 { + return + } + defer syscall.LocalFree(uint32(uintptr(unsafe.Pointer(argv)))) + Args = make([]string, argc) + for i, v := range (*argv)[:argc] { + Args[i] = string(syscall.UTF16ToString((*v)[:])) + } +} diff --git a/src/pkg/runtime/runtime.c b/src/pkg/runtime/runtime.c index ad5e97f497203248792744d7b893bf2d44259107..dbdc0f2ac6072d9b5246483280fb93f598361d69 100644 --- a/src/pkg/runtime/runtime.c +++ b/src/pkg/runtime/runtime.c @@ -156,6 +156,10 @@ String *gargv; String *genvv; int32 i, envc; + // for windows implementation see "os" package + if(Windows) + return; + if(runtime·isplan9) envc=0; else diff --git a/src/pkg/runtime/runtime.h b/src/pkg/runtime/runtime.h index a0b03545e6a1dee97db8aa52575e30ee05eccaa5..e53855e3ca415ae8f6d6326a869e9600b1a6972b 100644 --- a/src/pkg/runtime/runtime.h +++ b/src/pkg/runtime/runtime.h @@ -370,7 +370,6 @@ * common functions and data */ int32 runtime·strcmp(byte*, byte*); int32 runtime·findnull(byte*); -int32 runtime·findnullw(uint16*); void runtime·dump(byte*, int32); int32 runtime·runetochar(byte*, int32); int32 runtime·charntorune(int32*, uint8*, int32); @@ -400,7 +399,6 @@ String runtime·catstring(String, String); String runtime·gostring(byte*); String runtime·gostringn(byte*, int32); String runtime·gostringnocopy(byte*); -String runtime·gostringw(uint16*); void runtime·initsig(int32); int32 runtime·gotraceback(void); void runtime·traceback(uint8 *pc, uint8 *sp, uint8 *lr, G* gp); diff --git a/src/pkg/runtime/string.goc b/src/pkg/runtime/string.goc index 916559eb2d88c1148c110a6badc6b7e1b08b0b15..6752f31ccb811faf2b8200415c4d1e9d5f0f50b2 100644 --- a/src/pkg/runtime/string.goc +++ b/src/pkg/runtime/string.goc @@ -20,18 +20,6 @@ ; return l; } -int32 -runtime·findnullw(uint16 *s) -{ - int32 l; - - if(s == nil) - return 0; - for(l=0; s[l]!=0; l++) - ; - return l; -} - int32 runtime·maxstring = 256; String @@ -77,24 +65,6 @@ String s; s.str = str; s.len = runtime·findnull(str); - return s; -} - -String -runtime·gostringw(uint16 *str) -{ - int32 n, i; - byte buf[8]; - String s; - - n = 0; - for(i=0; str[i]; i++) - n += runtime·runetochar(buf, str[i]); - s = runtime·gostringsize(n+4); - n = 0; - for(i=0; str[i]; i++) - n += runtime·runetochar(s.str+n, str[i]); - s.len = n; return s; } diff --git a/src/pkg/runtime/windows/os.h b/src/pkg/runtime/windows/os.h index 3e071ea6b4222e72a7970b830844180b59a00fe8..77d0d32a0c8ffa7f8aee6d9fbed3ea1b250484fc 100644 --- a/src/pkg/runtime/windows/os.h +++ b/src/pkg/runtime/windows/os.h @@ -6,9 +6,6 @@ extern void *runtime·LoadLibraryEx; extern void *runtime·GetProcAddress; extern void *runtime·GetLastError; -#define runtime·goargs runtime·windows_goargs -void runtime·windows_goargs(void); - // Get start address of symbol data in memory. void *runtime·get_symdat_addr(void); diff --git a/src/pkg/runtime/windows/thread.c b/src/pkg/runtime/windows/thread.c index 5623efdae519628b72dcc4061f4d72267c719ad8..00cd0e8bdcf87080f64b0db6f1c9d1e76689c12d 100644 --- a/src/pkg/runtime/windows/thread.c +++ b/src/pkg/runtime/windows/thread.c @@ -28,71 +28,15 @@ extern void *runtime·SetLastError; #pragma dynimport runtime·CreateEvent CreateEventA "kernel32.dll" #pragma dynimport runtime·CreateThread CreateThread "kernel32.dll" -#pragma dynimport runtime·GetModuleHandle GetModuleHandleA "kernel32.dll" #pragma dynimport runtime·WaitForSingleObject WaitForSingleObject "kernel32.dll" extern void *runtime·CreateEvent; extern void *runtime·CreateThread; -extern void *runtime·GetModuleHandle; extern void *runtime·WaitForSingleObject; void runtime·osinit(void) { -} - -#pragma dynimport runtime·GetCommandLine GetCommandLineW "kernel32.dll" -#pragma dynimport runtime·CommandLineToArgv CommandLineToArgvW "shell32.dll" -#pragma dynimport runtime·GetEnvironmentStrings GetEnvironmentStringsW "kernel32.dll" -#pragma dynimport runtime·FreeEnvironmentStrings FreeEnvironmentStringsW "kernel32.dll" -#pragma dynimport runtime·LocalFree LocalFree "kernel32.dll" - -extern void *runtime·GetCommandLine; -extern void *runtime·CommandLineToArgv; -extern void *runtime·GetEnvironmentStrings; -extern void *runtime·FreeEnvironmentStrings; -extern void *runtime·LocalFree; - -void -runtime·windows_goargs(void) -{ - extern Slice os·Args; - extern Slice os·Envs; - - uint16 *cmd, *env, **argv; - String *gargv; - String *genvv; - int32 i, argc, envc; - uint16 *envp; - - cmd = runtime·stdcall(runtime·GetCommandLine, 0); - env = runtime·stdcall(runtime·GetEnvironmentStrings, 0); - argv = runtime·stdcall(runtime·CommandLineToArgv, 2, cmd, &argc); - - envc = 0; - for(envp=env; *envp; envc++) - envp += runtime·findnullw(envp)+1; - - gargv = runtime·malloc(argc*sizeof gargv[0]); - genvv = runtime·malloc(envc*sizeof genvv[0]); - - for(i=0; i