Snap for 4620899 from ff3c39e8a6204096cf4e532b50bfc9bc6c290e3b to pi-release

Change-Id: I9a3db0c582e158a9baf4a5fb7f5bf8961cf549a2
diff --git a/emulator/mksdcard/src/source/mksdcard.c b/emulator/mksdcard/src/source/mksdcard.c
index d0b6d5c..ca23e63 100644
--- a/emulator/mksdcard/src/source/mksdcard.c
+++ b/emulator/mksdcard/src/source/mksdcard.c
@@ -62,6 +62,19 @@
 static Byte  s_fat_head      [ BYTES_PER_SECTOR ];   /* first FAT sector */
 // static Byte  s_zero_sector   [ BYTES_PER_SECTOR ];   /* empty sector */
 
+// For handling Unicode paths
+#ifdef _WIN32
+    #define WIDE_CHAR   wchar_t
+    #define ARGC        wargc
+    #define ARGV        wargv
+    #define STRINGPRINT "%S"
+#else
+    #define WIDE_CHAR   char
+    #define ARGC        argc
+    #define ARGV        argv
+    #define STRINGPRINT "%s"
+#endif
+
 /* this is the date and time when creating the disk */
 static int
 get_serial_id( void )
@@ -220,26 +233,35 @@
 
 int  main( int argc, char**  argv )
 {
-    Wide   disk_size;
-    int    sectors_per_fat;
-    int    sectors_per_disk;
-    char*  end;
-    const char*  label = NULL;
-    FILE*  f = NULL;
+    Wide              disk_size;
+    int               sectors_per_fat;
+    int               sectors_per_disk;
+    WIDE_CHAR*        end;
+    const WIDE_CHAR*  label = NULL;
+    FILE*             f = NULL;
 
-    for ( ; argc > 1 && argv[1][0] == '-'; argc--, argv++ )
+#ifdef _WIN32
+    int          wargc;
+    WIDE_CHAR**  wargv;
+    WIDE_CHAR**  unused_environment;
+    WIDE_CHAR**  unused_startupinfo;
+
+    __wgetmainargs(&wargc, &wargv, &unused_environment, 0, &unused_startupinfo);
+#endif
+
+    for ( ; ARGC > 1 && ARGV[1][0] == '-'; ARGC--, ARGV++ )
     {
-        char*  arg = argv[1] + 1;
+        WIDE_CHAR*  arg = ARGV[1] + 1;
         switch (arg[0]) {
             case 'l':
                 if (arg[1] != 0)
                     arg += 2;
                 else {
-                    argc--;
-                    argv++;
-                    if (argc <= 1)
+                    ARGC--;
+                    ARGV++;
+                    if (ARGC <= 1)
                         usage();
-                    arg = argv[1];
+                    arg = ARGV[1];
                 }
                 label = arg;
                 break;
@@ -249,12 +271,17 @@
         }
     }
 
-    if (argc != 3)
+    if (ARGC != 3)
         usage();
 
-    disk_size = strtoll( argv[1], &end, 10 );
+#ifdef _WIN32
+    disk_size = wcstoll( ARGV[1], &end, 10 );
+#else
+    disk_size = strtoll( ARGV[1], &end, 10 );
+#endif
+
     if (disk_size <= 0 || errno == EINVAL || errno == ERANGE) {
-        fprintf(stderr, "Invalid argument size '%s'\n\n", argv[1]);
+        fprintf(stderr, "Invalid argument size '" STRINGPRINT "'\n\n", ARGV[1]);
         usage();
     }
 
@@ -266,10 +293,10 @@
         disk_size *= 1024*1024*1024;
 
     if (disk_size < 9*1024*1024) {
-        fprintf(stderr, "Invalid argument: size '%s' is too small.\n\n", argv[1]);
+        fprintf(stderr, "Invalid argument: size '" STRINGPRINT "' is too small.\n\n", ARGV[1]);
         usage();
     } else if (disk_size > MAX_DISK_SIZE) {
-        fprintf(stderr, "Invalid argument: size '%s' is too large.\n\n", argv[1]);
+        fprintf(stderr, "Invalid argument: size '" STRINGPRINT "' is too large.\n\n", ARGV[1]);
         usage();
     }
 
@@ -279,9 +306,13 @@
     boot_sector_init( s_boot_sector, s_fsinfo_sector, disk_size, NULL );
     fat_init( s_fat_head );
 
-    f = fopen( argv[2], "wb" );
+#ifdef _WIN32
+    f = _wfopen( ARGV[2], L"wb" );
+#else
+    f = fopen( ARGV[2], "wb" );
+#endif
     if ( !f ) {
-      fprintf(stderr, "Could not create file '%s': %s\n", argv[2], strerror(errno));
+      fprintf(stderr, "Could not create file '" STRINGPRINT "': %s\n", ARGV[2], strerror(errno));
       goto FailWrite;
     }
 
@@ -322,8 +353,12 @@
 FailWrite:
     if (f != NULL) {
       fclose(f);
-      unlink( argv[2] );
-      fprintf(stderr, "File '%s' was not created.\n", argv[2]);
+#ifdef _WIN32
+      _wunlink( ARGV[2] );
+#else
+      unlink( ARGV[2] );
+#endif
+      fprintf(stderr, "File '" STRINGPRINT "' was not created.\n", ARGV[2]);
     }
     return 1;
 }
diff --git a/find_java/src/source/find_java_exe.cpp b/find_java/src/source/find_java_exe.cpp
index 50ca024..a8be377 100644
--- a/find_java/src/source/find_java_exe.cpp
+++ b/find_java/src/source/find_java_exe.cpp
@@ -63,9 +63,9 @@
 

 static void printError(const char *message) {

 

-    CString error;
-    error.setLastWin32Error(message);
-    printf(error.cstr());
+    CString error;

+    error.setLastWin32Error(message);

+    printf(error.cstr());

 }

 

 static void testFindJava(bool isJdk, int minVersion) {

@@ -182,9 +182,9 @@
     }

 

     if (version == 0) {

-        CString s;
-        s.setf("Failed to find Java %d.%d (or newer) on your system. ", JAVA_MAJOR(minVersion),
-            JAVA_MINOR(minVersion));
+        CString s;

+        s.setf("Failed to find Java %d.%d (or newer) on your system. ", JAVA_MAJOR(minVersion),

+            JAVA_MINOR(minVersion));

 

         if (gIsDebug) {

             fprintf(stderr, s.cstr());

@@ -200,8 +200,8 @@
 

     if (doShortPath) {

         if (!javaPath.toShortPath(&javaPath)) {

-            CString s;
-            s.setf("Failed to convert path (%s) to a short DOS path. ", javaPath.cstr());
+            CString s;

+            s.setf("Failed to convert path (%s) to a short DOS path. ", javaPath.cstr());

             fprintf(stderr, s.cstr());

 

             if (shouldPrintError) {