aboutsummaryrefslogtreecommitdiffstats
path: root/erts
diff options
context:
space:
mode:
Diffstat (limited to 'erts')
-rw-r--r--erts/etc/win32/start_erl.c337
1 files changed, 180 insertions, 157 deletions
diff --git a/erts/etc/win32/start_erl.c b/erts/etc/win32/start_erl.c
index facf79e5ff..0ca12f09c9 100644
--- a/erts/etc/win32/start_erl.c
+++ b/erts/etc/win32/start_erl.c
@@ -30,7 +30,7 @@
#include <windows.h>
#include <assert.h>
-char *progname;
+wchar_t *progname;
/*
* If CASE_SENSITIVE_OPTIONS is specified, options are case sensitive
@@ -43,26 +43,26 @@ char *progname;
#define strnicmp _strnicmp
#endif
-#define RELEASE_SUBDIR "\\releases"
-#define ERTS_SUBDIR_PREFIX "\\erts-"
-#define BIN_SUBDIR "\\bin"
-#define REGISTRY_BASE "Software\\Ericsson\\Erlang\\"
-#define DEFAULT_DATAFILE "start_erl.data"
+#define RELEASE_SUBDIR L"\\releases"
+#define ERTS_SUBDIR_PREFIX L"\\erts-"
+#define BIN_SUBDIR L"\\bin"
+#define REGISTRY_BASE L"Software\\Ericsson\\Erlang\\"
+#define DEFAULT_DATAFILE L"start_erl.data"
/* Global variables holding option values and command lines */
-char *CommandLineStart = NULL;
-char *ErlCommandLine = NULL;
-char *MyCommandLine = NULL;
-char *DataFileName = NULL;
-char *RelDir = NULL;
-char *BootFlagsFile = NULL;
-char *BootFlags = NULL;
-char *RegistryKey = NULL;
-char *BinDir = NULL;
-char *RootDir = NULL;
-char *VsnDir = NULL;
-char *Version = NULL;
-char *Release = NULL;
+wchar_t *CommandLineStart = NULL;
+wchar_t *ErlCommandLine = NULL;
+wchar_t *MyCommandLine = NULL;
+wchar_t *DataFileName = NULL;
+wchar_t *RelDir = NULL;
+wchar_t *BootFlagsFile = NULL;
+wchar_t *BootFlags = NULL;
+wchar_t *RegistryKey = NULL;
+wchar_t *BinDir = NULL;
+wchar_t *RootDir = NULL;
+wchar_t *VsnDir = NULL;
+wchar_t *Version = NULL;
+wchar_t *Release = NULL;
BOOL NoConfig=FALSE;
PROCESS_INFORMATION ErlProcessInfo;
@@ -100,7 +100,7 @@ void exit_help(char *err)
ShowLastError();
fprintf(stderr, "** Error: %s\n", err);
- printf("Usage:\n%s\n"
+ printf("Usage:\n%S\n"
" [<erlang options>] ++\n"
" [-data <datafile>]\n"
" {-rootdir <erlang root directory> | \n"
@@ -119,56 +119,56 @@ void exit_help(char *err)
*/
void split_commandline(void)
{
- char *cmdline = CommandLineStart;
+ wchar_t *cmdline = CommandLineStart;
progname=cmdline;
/* Remove the first (quoted) string (our program name) */
- if(*cmdline == '"') {
+ if(*cmdline == L'"') {
cmdline++; /* Skip " */
- while( (*cmdline != '\0') && (*cmdline++) != '"' )
+ while( (*cmdline != L'\0') && (*cmdline++) != L'"' )
;
} else {
- while( (*cmdline != '\0') && (*cmdline++) != ' ' )
+ while( (*cmdline != L'\0') && (*cmdline++) != L' ' )
;
}
- while( (*cmdline) == ' ' )
+ while( (*cmdline) == L' ' )
cmdline++;
- if( *cmdline == '\0') {
- ErlCommandLine = "";
- MyCommandLine = "";
+ if( *cmdline == L'\0') {
+ ErlCommandLine = L"";
+ MyCommandLine = L"";
return;
}
- cmdline[-1] = '\0';
+ cmdline[-1] = L'\0';
/* Start from the end of the string and search for "++ "
(PLUS PLUS SPACE) */
ErlCommandLine = cmdline;
- if(strncmp(cmdline,"++ ",3))
- cmdline = strstr(cmdline," ++ ");
+ if(wcsncmp(cmdline,L"++ ",3))
+ cmdline = wcsstr(cmdline,L" ++ ");
if( cmdline == NULL ) {
- MyCommandLine = "";
+ MyCommandLine = L"";
return;
}
/* Terminate the ErlCommandLine where MyCommandLine starts */
*cmdline++ = '\0';
/* Skip 'whitespace--whitespace' (WHITESPACE MINUS MINUS WHITESPACE) */
- while( (*cmdline) == ' ' )
+ while( (*cmdline) == L' ' )
cmdline++;
- while( (*cmdline) == '+' )
+ while( (*cmdline) == L'+' )
cmdline++;
- while( (*cmdline) == ' ' )
+ while( (*cmdline) == L' ' )
cmdline++;
MyCommandLine = cmdline;
#ifdef _DEBUG
- fprintf(stderr, "ErlCommandLine: '%s'\n", ErlCommandLine);
- fprintf(stderr, "MyCommandLine: '%s'\n", MyCommandLine);
+ fprintf(stderr, "ErlCommandLine: '%S'\n", ErlCommandLine);
+ fprintf(stderr, "MyCommandLine: '%S'\n", MyCommandLine);
#endif
}
@@ -178,30 +178,30 @@ void split_commandline(void)
* Skips any leading spaces and parses up to NULL or end of quoted string.
* Calls exit_help() if an unterminated quote is detected.
*/
-char * unquote_optionarg(char *str, char **strp)
+wchar_t * unquote_optionarg(wchar_t *str, wchar_t **strp)
{
- char *newstr = (char *)malloc(strlen(str)+1); /* This one is
- realloc:ed later */
+ /* This one is realloc:ed later */
+ wchar_t *newstr = (wchar_t *)malloc((wcslen(str)+1)*sizeof(wchar_t));
int i = 0, inquote = 0;
assert(newstr);
assert(str);
/* Skip leading spaces */
- while( *str == ' ' )
+ while( *str == L' ' )
str++;
/* Loop while in quote or until EOS or unquoted space
*/
- while( (inquote==1) || ( (*str!=0) && (*str!=' ') ) ) {
+ while( (inquote==1) || ( (*str!=0) && (*str!=L' ') ) ) {
switch( *str ) {
- case '\\':
+ case L'\\':
/* If we are inside a quoted string we should convert \c to c */
- if( inquote && str[1] == '"' )
+ if( inquote && str[1] == L'"' )
str++;
newstr[i++]=*str++;
break;
- case '"':
+ case L'"':
inquote = 1-inquote;
*str++;
break;
@@ -220,7 +220,7 @@ char * unquote_optionarg(char *str, char **strp)
*strp = str;
/* Adjust memblock of newstr */
- newstr = (char *)realloc(newstr, i);
+ newstr = (wchar_t *)realloc(newstr, i*sizeof(wchar_t));
assert(newstr);
return(newstr);
}
@@ -232,34 +232,34 @@ char * unquote_optionarg(char *str, char **strp)
*/
void parse_commandline(void)
{
- char *cmdline = MyCommandLine;
+ wchar_t *cmdline = MyCommandLine;
- while( *cmdline != '\0' ) {
+ while( *cmdline != L'\0' ) {
switch( *cmdline ) {
case '-': /* Handle both -arg and /arg */
case '/':
*cmdline++;
- if( strnicmp(cmdline, "data", 4) == 0) {
+ if( _wcsnicmp(cmdline, L"data", 4) == 0) {
DataFileName = unquote_optionarg(cmdline+4, &cmdline);
- } else if( strnicmp(cmdline, "rootdir", 7) == 0) {
+ } else if( _wcsnicmp(cmdline, L"rootdir", 7) == 0) {
RootDir = unquote_optionarg(cmdline+7, &cmdline);
#ifdef _DEBUG
- fprintf(stderr, "RootDir: '%s'\n", RootDir);
+ fprintf(stderr, "RootDir: '%S'\n", RootDir);
#endif
- } else if( strnicmp(cmdline, "reldir", 6) == 0) {
+ } else if( _wcsnicmp(cmdline, L"reldir", 6) == 0) {
RelDir = unquote_optionarg(cmdline+6, &cmdline);
#ifdef _DEBUG
- fprintf(stderr, "RelDir: '%s'\n", RelDir);
+ fprintf(stderr, "RelDir: '%S'\n", RelDir);
#endif
- } else if( strnicmp(cmdline, "bootflags", 9) == 0) {
+ } else if( _wcsnicmp(cmdline, L"bootflags", 9) == 0) {
BootFlagsFile = unquote_optionarg(cmdline+9, &cmdline);
- } else if( strnicmp(cmdline, "noconfig", 8) == 0) {
+ } else if( _wcsnicmp(cmdline, L"noconfig", 8) == 0) {
NoConfig=TRUE;
#ifdef _DEBUG
fprintf(stderr, "NoConfig=TRUE\n");
#endif
} else {
- fprintf(stderr, "Unkown option: '%s'\n", cmdline);
+ fprintf(stderr, "Unkown option: '%S'\n", cmdline);
exit_help("Unknown command line option");
}
break;
@@ -281,32 +281,35 @@ void parse_commandline(void)
void read_datafile(void)
{
FILE *fp;
- char *newname;
+ wchar_t *newname;
long size;
+ char *ver;
+ char *rel;
- if(!DataFileName){
- DataFileName = malloc(strlen(DEFAULT_DATAFILE) + 1);
- strcpy(DataFileName,DEFAULT_DATAFILE);
+ if(!DataFileName){
+ DataFileName = malloc((wcslen(DEFAULT_DATAFILE) + 1)*sizeof(wchar_t));
+ wcscpy(DataFileName,DEFAULT_DATAFILE);
}
/* Is DataFileName relative or absolute ? */
- if( (DataFileName[0] != '\\') && (strncmp(DataFileName+1, ":\\", 2)!=0) ) {
+ if( (DataFileName[0] != L'\\') && (wcsncmp(DataFileName+1, L":\\", 2)!=0) ) {
/* Relative name, we have to prepend RelDir to it. */
if( !RelDir ) {
exit_help("Need -reldir when -data filename has relative path.");
} else {
- newname = (char *)malloc(strlen(DataFileName)+strlen(RelDir)+2);
+ size = (wcslen(DataFileName)+wcslen(RelDir)+2);
+ newname = (wchar_t *)malloc(size*sizeof(wchar_t));
assert(newname);
- sprintf(newname, "%s\\%s", RelDir, DataFileName);
+ swprintf(newname, size, L"%s\\%s", RelDir, DataFileName);
free(DataFileName);
DataFileName=newname;
}
}
#ifdef _DEBUG
- fprintf(stderr, "DataFileName: '%s'\n", DataFileName);
+ fprintf(stderr, "DataFileName: '%S'\n", DataFileName);
#endif
- if( (fp=fopen(DataFileName, "rb")) == NULL) {
+ if( (fp=_wfopen(DataFileName, L"rb")) == NULL) {
exit_help("Cannot find the datafile.");
}
@@ -314,21 +317,33 @@ void read_datafile(void)
size=ftell(fp);
fseek(fp, 0, SEEK_SET);
- Version = (char *)malloc(size+1);
- Release = (char *)malloc(size+1);
- assert(Version);
- assert(Release);
+ ver = (char *)malloc(size+1);
+ rel = (char *)malloc(size+1);
+ assert(ver);
+ assert(rel);
- if( (fscanf(fp, "%s %s", Version, Release)) == 0) {
+ if( (fscanf(fp, "%s %s", ver, rel)) == 0) {
fclose(fp);
exit_help("Format error in datafile.");
}
fclose(fp);
+ size = MultiByteToWideChar(CP_UTF8, 0, ver, -1, NULL, 0);
+ Version = malloc(size*sizeof(wchar_t));
+ assert(Version);
+ MultiByteToWideChar(CP_UTF8, 0, ver, -1, Version, size);
+ free(ver);
+
+ size = MultiByteToWideChar(CP_UTF8, 0, rel, -1, NULL, 0);
+ Release = malloc(size*sizeof(wchar_t));
+ assert(Release);
+ MultiByteToWideChar(CP_UTF8, 0, rel, -1, Release, size);
+ free(rel);
+
#ifdef _DEBUG
- fprintf(stderr, "DataFile version: '%s'\n", Version);
- fprintf(stderr, "DataFile release: '%s'\n", Release);
+ fprintf(stderr, "DataFile version: '%S'\n", Version);
+ fprintf(stderr, "DataFile release: '%S'\n", Release);
#endif
}
@@ -340,31 +355,33 @@ void read_bootflags(void)
{
FILE *fp;
long fsize;
- char *newname;
-
+ wchar_t *newname;
+ char *bootf;
+
if(BootFlagsFile) {
/* Is BootFlagsFile relative or absolute ? */
- if( (BootFlagsFile[0] != '\\') &&
- (strncmp(BootFlagsFile+1, ":\\", 2)!=0) ) {
+ if( (BootFlagsFile[0] != L'\\') &&
+ (wcsncmp(BootFlagsFile+1, L":\\", 2)!=0) ) {
/* Relative name, we have to prepend RelDir\\Version to it. */
if( !RelDir ) {
exit_help("Need -reldir when -bootflags "
"filename has relative path.");
} else {
- newname = (char *)malloc(strlen(BootFlagsFile)+
- strlen(RelDir)+strlen(Release)+3);
+ int len = wcslen(BootFlagsFile)+
+ wcslen(RelDir)+wcslen(Release)+3;
+ newname = (wchar_t *)malloc(len*sizeof(wchar_t));
assert(newname);
- sprintf(newname, "%s\\%s\\%s", RelDir, Release, BootFlagsFile);
+ swprintf(newname, len, L"%s\\%s\\%s", RelDir, Release, BootFlagsFile);
free(BootFlagsFile);
BootFlagsFile=newname;
}
}
#ifdef _DEBUG
- fprintf(stderr, "BootFlagsFile: '%s'\n", BootFlagsFile);
+ fprintf(stderr, "BootFlagsFile: '%S'\n", BootFlagsFile);
#endif
- if( (fp=fopen(BootFlagsFile, "rb")) == NULL) {
+ if( (fp=_wfopen(BootFlagsFile, L"rb")) == NULL) {
exit_help("Could not open BootFlags file.");
}
@@ -372,80 +389,86 @@ void read_bootflags(void)
fsize=ftell(fp);
fseek(fp, 0, SEEK_SET);
- BootFlags = (char *)malloc(fsize+1);
- assert(BootFlags);
- if( (fgets(BootFlags, fsize+1, fp)) == NULL) {
+ bootf = (char *)malloc(fsize+1);
+ assert(bootf);
+ if( (fgets(bootf, fsize+1, fp)) == NULL) {
exit_help("Error while reading BootFlags file");
}
fclose(fp);
/* Adjust buffer size */
- BootFlags = (char *)realloc(BootFlags, strlen(BootFlags)+1);
- assert(BootFlags);
+ bootf = (char *)realloc(bootf, strlen(bootf)+1);
+ assert(bootf);
/* Strip \r\n from BootFlags */
- fsize = strlen(BootFlags);
+ fsize = strlen(bootf);
while( fsize > 0 &&
- ( (BootFlags[fsize-1] == '\r') ||
- (BootFlags[fsize-1] == '\n') ) ) {
- BootFlags[--fsize]=0;
+ ( (bootf[fsize-1] == '\r') ||
+ (bootf[fsize-1] == '\n') ) ) {
+ bootf[--fsize]=0;
}
-
+ fsize = MultiByteToWideChar(CP_UTF8, 0, bootf, -1, NULL, 0);
+ BootFlags = malloc(fsize*sizeof(wchar_t));
+ assert(BootFlags);
+ MultiByteToWideChar(CP_UTF8, 0, bootf, -1, BootFlags, fsize);
+ free(bootf);
} else {
/* Set empty BootFlags */
- BootFlags = "";
+ BootFlags = L"";
}
#ifdef _DEBUG
- fprintf(stderr, "BootFlags: '%s'\n", BootFlags);
+ fprintf(stderr, "BootFlags: '%S'\n", BootFlags);
#endif
}
long start_new_node(void)
{
- char *CommandLine;
+ wchar_t *CommandLine;
unsigned long i;
- STARTUPINFO si;
- DWORD dwExitCode;
+ STARTUPINFOW si;
+ DWORD dwExitCode;
- i = strlen(RelDir) + strlen(Release) + 4;
- VsnDir = (char *)malloc(i);
+ i = wcslen(RelDir) + wcslen(Release) + 4;
+ VsnDir = (wchar_t *)malloc(i*sizeof(wchar_t));
assert(VsnDir);
- sprintf(VsnDir, "%s\\%s", RelDir, Release);
+ swprintf(VsnDir, i, L"%s\\%s", RelDir, Release);
if( NoConfig ) {
- i = strlen(BinDir) + strlen(ErlCommandLine) +
- strlen(BootFlags) + 64;
- CommandLine = (char *)malloc(i);
+ i = wcslen(BinDir) + wcslen(ErlCommandLine) +
+ wcslen(BootFlags) + 64;
+ CommandLine = (wchar_t *)malloc(i*sizeof(wchar_t));
assert(CommandLine);
- sprintf(CommandLine,
- "\"%s\\erl.exe\" -boot \"%s\\start\" %s %s",
- BinDir,
- VsnDir,
- ErlCommandLine,
- BootFlags);
+ swprintf(CommandLine,
+ i,
+ L"\"%s\\erl.exe\" -boot \"%s\\start\" %s %s",
+ BinDir,
+ VsnDir,
+ ErlCommandLine,
+ BootFlags);
} else {
- i = strlen(BinDir) + strlen(ErlCommandLine)
- + strlen(BootFlags) + strlen(VsnDir)*2 + 64;
- CommandLine = (char *)malloc(i);
+ i = wcslen(BinDir) + wcslen(ErlCommandLine)
+ + wcslen(BootFlags) + wcslen(VsnDir)*2 + 64;
+ CommandLine = (wchar_t *)malloc(i*sizeof(wchar_t));
assert(CommandLine);
- sprintf(CommandLine,
- "\"%s\\erl.exe\" -boot \"%s\\start\" -config \"%s\\sys\" %s %s",
- BinDir,
- VsnDir,
- VsnDir,
- ErlCommandLine,
- BootFlags);
+ swprintf(CommandLine,
+ i,
+ L"\"%s\\erl.exe\" -boot \"%s\\start\" -config \"%s\\sys\" %s %s",
+ BinDir,
+ VsnDir,
+ VsnDir,
+ ErlCommandLine,
+ BootFlags);
}
#ifdef _DEBUG
- fprintf(stderr, "CommandLine: '%s'\n", CommandLine);
+ fprintf(stderr, "CommandLine: '%S'\n", CommandLine);
#endif
/* Initialize the STARTUPINFO structure. */
- memset(&si, 0, sizeof(STARTUPINFO));
- si.cb = sizeof(STARTUPINFO);
+ memset(&si, 0, sizeof(STARTUPINFOW));
+ si.cb = sizeof(STARTUPINFOW);
si.lpTitle = NULL;
si.dwFlags = STARTF_USESTDHANDLES;
si.hStdInput = GetStdHandle(STD_INPUT_HANDLE);
@@ -453,19 +476,19 @@ long start_new_node(void)
si.hStdError = GetStdHandle(STD_ERROR_HANDLE);
/* Create the new Erlang process */
- if( (CreateProcess(
- NULL, /* pointer to name of executable module */
- CommandLine, /* pointer to command line string */
- NULL, /* pointer to process security attributes */
- NULL, /* pointer to thread security attributes */
- TRUE, /* handle inheritance flag */
- GetPriorityClass(GetCurrentProcess()),
- /* creation flags */
- NULL, /* pointer to new environment block */
- BinDir,/* pointer to current directory name */
- &si, /* pointer to STARTUPINFO */
- &ErlProcessInfo /* pointer to PROCESS_INFORMATION */
- )) == FALSE) {
+ if( (CreateProcessW(
+ NULL, /* pointer to name of executable module */
+ CommandLine, /* pointer to command line string */
+ NULL, /* pointer to process security attributes */
+ NULL, /* pointer to thread security attributes */
+ TRUE, /* handle inheritance flag */
+ GetPriorityClass(GetCurrentProcess()),
+ /* creation flags */
+ NULL, /* pointer to new environment block */
+ BinDir,/* pointer to current directory name */
+ &si, /* pointer to STARTUPINFO */
+ &ErlProcessInfo /* pointer to PROCESS_INFORMATION */
+ )) == FALSE) {
ShowLastError();
exit_help("Failed to start new node");
}
@@ -504,6 +527,7 @@ long start_new_node(void)
*/
void complete_options(void)
{
+ int len;
/* Try to find a descent RelDir */
if( !RelDir ) {
DWORD sz = 32;
@@ -511,15 +535,13 @@ void complete_options(void)
DWORD nsz;
if (RelDir)
free(RelDir);
- RelDir = malloc(sz);
+ RelDir = malloc(sz*sizeof(wchar_t));
if (!RelDir) {
fprintf(stderr, "** Error : failed to allocate memory\n");
exit(1);
}
SetLastError(0);
- nsz = GetEnvironmentVariable((LPCTSTR) "RELDIR",
- (LPTSTR) RelDir,
- sz);
+ nsz = GetEnvironmentVariableW(L"RELDIR", RelDir, sz);
if (nsz == 0 && GetLastError() == ERROR_ENVVAR_NOT_FOUND) {
free(RelDir);
RelDir = NULL;
@@ -536,9 +558,10 @@ void complete_options(void)
exit_help("Need either Root directory nor Release directory.");
}
/* Ok, construct our own RelDir from RootDir */
- RelDir = (char *) malloc(strlen(RootDir)+strlen(RELEASE_SUBDIR)+1);
+ sz = wcslen(RootDir)+wcslen(RELEASE_SUBDIR)+1;
+ RelDir = (wchar_t *) malloc(sz * sizeof(wchar_t));
assert(RelDir);
- sprintf(RelDir, "%s" RELEASE_SUBDIR, RootDir);
+ swprintf(RelDir, sz, L"%s" RELEASE_SUBDIR, RootDir);
read_datafile();
} else {
read_datafile();
@@ -548,32 +571,32 @@ void complete_options(void)
}
if( !RootDir ) {
/* Try to construct RootDir from RelDir */
- char *p;
- RootDir = malloc(strlen(RelDir)+1);
- strcpy(RootDir,RelDir);
- p = RootDir+strlen(RootDir)-1;
- if (p >= RootDir && (*p == '/' || *p == '\\'))
+ wchar_t *p;
+ RootDir = malloc((wcslen(RelDir)+1)*sizeof(wchar_t));
+ wcscpy(RootDir,RelDir);
+ p = RootDir+wcslen(RootDir)-1;
+ if (p >= RootDir && (*p == L'/' || *p == L'\\'))
--p;
- while (p >= RootDir && *p != '/' && *p != '\\')
+ while (p >= RootDir && *p != L'/' && *p != L'\\')
--p;
if (p <= RootDir) { /* Empty RootDir is also an error */
exit_help("Cannot determine Root directory from "
"Release directory.");
}
- *p = '\0';
+ *p = L'\0';
}
-
- BinDir = (char *) malloc(strlen(RootDir)+strlen(ERTS_SUBDIR_PREFIX)+
- strlen(Version)+strlen(BIN_SUBDIR)+1);
+ len = wcslen(RootDir)+wcslen(ERTS_SUBDIR_PREFIX)+
+ wcslen(Version)+wcslen(BIN_SUBDIR)+1;
+ BinDir = (wchar_t *) malloc(len * sizeof(wchar_t));
assert(BinDir);
- sprintf(BinDir, "%s" ERTS_SUBDIR_PREFIX "%s" BIN_SUBDIR, RootDir, Version);
+ swprintf(BinDir, len, L"%s" ERTS_SUBDIR_PREFIX L"%s" BIN_SUBDIR, RootDir, Version);
read_bootflags();
#ifdef _DEBUG
- fprintf(stderr, "RelDir: '%s'\n", RelDir);
- fprintf(stderr, "BinDir: '%s'\n", BinDir);
+ fprintf(stderr, "RelDir: '%S'\n", RelDir);
+ fprintf(stderr, "BinDir: '%S'\n", BinDir);
#endif
}
@@ -598,17 +621,17 @@ BOOL WINAPI LogoffHandlerRoutine( DWORD dwCtrlType )
int main(void)
{
DWORD dwExitCode;
- char *cmdline;
+ wchar_t *cmdline;
/* Make sure a logoff does not distrurb us. */
SetConsoleCtrlHandler(LogoffHandlerRoutine, TRUE);
- cmdline = GetCommandLine();
+ cmdline = GetCommandLineW();
assert(cmdline);
- CommandLineStart = (char *) malloc(strlen(cmdline) + 1);
+ CommandLineStart = (wchar_t *) malloc((wcslen(cmdline) + 1)*sizeof(wchar_t));
assert(CommandLineStart);
- strcpy(CommandLineStart,cmdline);
+ wcscpy(CommandLineStart,cmdline);
split_commandline();
parse_commandline();