grammar updates
[mono.git] / mono / io-layer / processes.c
index d5807ce95c23e8f30f83b78c3dc40b94261aaa48..79737275b72d7d44a645fff9ef469d82f1415eef 100644 (file)
 #include <unistd.h>
 
 #include <mono/io-layer/wapi.h>
-#include <mono/io-layer/unicode.h>
 #include <mono/io-layer/wapi-private.h>
 #include <mono/io-layer/handles-private.h>
 #include <mono/io-layer/misc-private.h>
 #include <mono/io-layer/mono-mutex.h>
 #include <mono/io-layer/process-private.h>
 #include <mono/io-layer/threads.h>
+#include <mono/utils/strenc.h>
 
 /* The process' environment strings */
 extern char **environ;
@@ -125,7 +125,7 @@ gboolean CreateProcess (const gunichar2 *appname, gunichar2 *cmdline,
         * so crap, with an API like this :-(
         */
        if(appname!=NULL) {
-               cmd=_wapi_unicode_to_utf8 (appname);
+               cmd=mono_unicode_to_external (appname);
                if(cmd==NULL) {
 #ifdef DEBUG
                        g_message (G_GNUC_PRETTY_FUNCTION
@@ -145,7 +145,7 @@ gboolean CreateProcess (const gunichar2 *appname, gunichar2 *cmdline,
        }
        
        if(cmdline!=NULL) {
-               args=_wapi_unicode_to_utf8 (cmdline);
+               args=mono_unicode_to_external (cmdline);
                if(args==NULL) {
 #ifdef DEBUG
                        g_message (G_GNUC_PRETTY_FUNCTION
@@ -155,17 +155,10 @@ gboolean CreateProcess (const gunichar2 *appname, gunichar2 *cmdline,
                        SetLastError(ERROR_PATH_NOT_FOUND);
                        goto cleanup;
                }
-
-               /* Turn all the slashes round the right way */
-               for(i=0; i<strlen (args); i++) {
-                       if(args[i]=='\\') {
-                               args[i]='/';
-                       }
-               }
        }
 
        if(cwd!=NULL) {
-               dir=_wapi_unicode_to_utf8 (cwd);
+               dir=mono_unicode_to_external (cwd);
                if(dir==NULL) {
 #ifdef DEBUG
                        g_message (G_GNUC_PRETTY_FUNCTION
@@ -198,7 +191,7 @@ gboolean CreateProcess (const gunichar2 *appname, gunichar2 *cmdline,
         */
        if(new_environ!=NULL) {
                gchar **strings;
-               guint32 count;
+               guint32 count=0;
                gunichar2 *new_environp;
 
                /* Count the number of strings */
@@ -212,13 +205,13 @@ gboolean CreateProcess (const gunichar2 *appname, gunichar2 *cmdline,
                strings=g_new0 (gchar *, count);
                
                /* Copy each environ string into 'strings' turning it
-                * into utf8 at the same time
+                * into utf8 (or the requested encoding) at the same
+                * time
                 */
                count=0;
                for(new_environp=(gunichar2 *)new_environ; *new_environp;
                    new_environp++) {
-                       strings[count]=g_utf16_to_utf8 (new_environp, -1, NULL,
-                                                       NULL, NULL);
+                       strings[count]=mono_unicode_to_external (new_environp);
                        count++;
                        while(*new_environp) {
                                new_environp++;
@@ -307,7 +300,7 @@ gboolean CreateProcess (const gunichar2 *appname, gunichar2 *cmdline,
                        for(i=0; args[i]!='\0'; i++) {
                                if(g_ascii_isspace (args[i])) {
                                        token=g_strndup (args, i);
-                                       args_after_prog=args+i;
+                                       args_after_prog=args+i+1;
                                        break;
                                }
                        }
@@ -330,6 +323,13 @@ gboolean CreateProcess (const gunichar2 *appname, gunichar2 *cmdline,
                        goto cleanup;
                }
                
+               /* Turn all the slashes round the right way. Only for the prg. name */
+               for(i=0; i < strlen (token); i++) {
+                       if (token[i]=='\\') {
+                               token[i]='/';
+                       }
+               }
+
                if(g_ascii_isalpha (token[0]) && (token[1]==':')) {
                        /* Strip off the drive letter.  I can't
                         * believe that CP/M holdover is still
@@ -455,22 +455,25 @@ cleanup:
                
 static void process_set_name (struct _WapiHandle_process *process_handle)
 {
-       gchar *progname, *slash;
+       gchar *progname, *utf8_progname, *slash;
        
        progname=g_get_prgname ();
+       utf8_progname=mono_utf8_from_external (progname);
 
 #ifdef DEBUG
        g_message (G_GNUC_PRETTY_FUNCTION ": using [%s] as prog name",
                   progname);
 #endif
 
-       if(progname!=NULL) {
-               slash=strrchr (progname, '/');
+       if(utf8_progname!=NULL) {
+               slash=strrchr (utf8_progname, '/');
                if(slash!=NULL) {
                        process_handle->proc_name=_wapi_handle_scratch_store (slash+1, strlen (slash+1));
                } else {
-                       process_handle->proc_name=_wapi_handle_scratch_store (progname, strlen (progname));
+                       process_handle->proc_name=_wapi_handle_scratch_store (utf8_progname, strlen (utf8_progname));
                }
+
+               g_free (utf8_progname);
        }
 }