allow UTF in dos command 24/13324/2
Antoine ELIAS [Thu, 5 Dec 2013 17:59:18 +0000 (18:59 +0100)]
Change-Id: I8acf949fe31ed7637fc94732e3c5ff692cd4c577

scilab/modules/windows_tools/sci_gateway/c/sci_dos.c
scilab/modules/windows_tools/src/c/scilab_windows/spawncommand.c
scilab/modules/windows_tools/src/c/scilab_windows/spawncommand.h

index 90ebd84..2f9bb78 100644 (file)
@@ -25,6 +25,7 @@
 #include "getshortpathname.h"
 #include "api_scilab.h"
 #include "stack-c.h"
+#include "charEncoding.h"
 /*--------------------------------------------------------------------------*/
 #define BUFSIZE 4096
 /*--------------------------------------------------------------------------*/
@@ -36,7 +37,7 @@ int sci_dos(char *fname, unsigned long l)
     int *piAddressVarOne = NULL;
     int iType1 = 0;
     int m1 = 0, n1 = 0;
-    char *pStVarOne = NULL;
+    wchar_t *pStVarOne = NULL;
     int lenStVarOne = 0;
 
     char **Output = NULL;
@@ -156,14 +157,14 @@ int sci_dos(char *fname, unsigned long l)
         return 0;
     }
 
-    pStVarOne = (char*)MALLOC(sizeof(char) * (lenStVarOne + 1));
+    pStVarOne = (wchar_t*)MALLOC(sizeof(wchar_t) * (lenStVarOne + 1));
     if (pStVarOne)
     {
         double exitCode = 0.;
         BOOL DetachProcessOption = FALSE;
         BOOL *StatusExit = NULL;
 
-        sciErr = getMatrixOfString(pvApiCtx, piAddressVarOne, &m1, &n1, &lenStVarOne, &pStVarOne);
+        sciErr = getMatrixOfWideString(pvApiCtx, piAddressVarOne, &m1, &n1, &lenStVarOne, &pStVarOne);
         if (sciErr.iErr)
         {
             printError(&sciErr, 0);
@@ -174,7 +175,6 @@ int sci_dos(char *fname, unsigned long l)
         DetachProcessOption = DetectDetachProcessInCommandLine(pStVarOne);
         exitCode = (double)spawncommand(pStVarOne, DetachProcessOption);
         FREE(pStVarOne);
-        pStVarOne = NULL;
 
         StatusExit = (BOOL*)MALLOC(sizeof(BOOL));
 
index af6909e..c8b31b4 100644 (file)
 #define LF_STR "\n"
 #define CR '\r'
 #define LF '\n'
-#define BLANK ' '
+#define BLANK L' '
 #define NOTPRINTABLE -96
-#define EMPTY_CHAR 0
-#define CMDLINE_FORMAT_DETACHED "%s /A /C \"%s\""
-#define CMDLINE_FORMAT_NOTDETACHED "%s /A /C \"%s && echo DOS > %s\""
-#define OUTPUT_CHECK_FILENAME_FORMAT "%s\\DOS.OK"
+#define EMPTY_CHAR L'\0'
+#define CMDLINE_FORMAT_DETACHED L"%ls /A /C \"%ls\""
+#define CMDLINE_FORMAT_NOTDETACHED L"%ls /A /C \"%ls && echo DOS > %ls\""
+#define OUTPUT_CHECK_FILENAME_FORMAT L"%ls\\DOS.OK"
 /*--------------------------------------------------------------------------*/
 pipeinfo SCILAB_WINDOWS_IMPEXP pipeSpawnOut = {INVALID_HANDLE_VALUE, NULL, 0};
 pipeinfo SCILAB_WINDOWS_IMPEXP pipeSpawnErr = {INVALID_HANDLE_VALUE, NULL, 0};
@@ -43,12 +43,12 @@ static BOOL removeEOL(char *_string);
 static BOOL removeNotPrintableCharacters(char *_string);
 static char *convertLine(char *_string, BOOL DetachProcess);
 /*--------------------------------------------------------------------------*/
-int spawncommand(char *command, BOOL DetachProcess)
+int spawncommand(wchar_t *command, BOOL DetachProcess)
 {
-    char shellCmd[PATH_MAX];
-    char *CmdLine = NULL;
+    wchar_t shellCmd[PATH_MAX];
+    wchar_t *CmdLine = NULL;
 
-    STARTUPINFO si;
+    STARTUPINFOW si;
     PROCESS_INFORMATION pi;
     SECURITY_ATTRIBUTES sa;
     DWORD threadID;
@@ -57,7 +57,7 @@ int spawncommand(char *command, BOOL DetachProcess)
     HANDLE hProcess = NULL, h = NULL, pipeThreads[2];
     DWORD ExitCode = 0;
 
-    if (strcmp(command, "") == 0)
+    if (wcscmp(command, L"") == 0)
     {
         // do nothing
         pipeSpawnOut.NumberOfLines = 0;
@@ -68,10 +68,11 @@ int spawncommand(char *command, BOOL DetachProcess)
 
         return 1;
     }
+
     hProcess = GetCurrentProcess();
 
     ZeroMemory(&pi, sizeof(PROCESS_INFORMATION));
-    ZeroMemory(&si, sizeof(STARTUPINFO));
+    ZeroMemory(&si, sizeof(STARTUPINFOW));
     si.cb = sizeof(STARTUPINFO);
     si.dwFlags   = STARTF_USESTDHANDLES;
     si.hStdInput = INVALID_HANDLE_VALUE;
@@ -94,45 +95,41 @@ int spawncommand(char *command, BOOL DetachProcess)
                     0, TRUE, DUPLICATE_SAME_ACCESS | DUPLICATE_CLOSE_SOURCE);
 
     /* base command line */
-    GetEnvironmentVariable("ComSpec", shellCmd, PATH_MAX);
+    GetEnvironmentVariableW(L"ComSpec", shellCmd, PATH_MAX);
 
     if (DetachProcess)
     {
-        int lenCmdLine = (int)(strlen(shellCmd) + strlen(command) + strlen(CMDLINE_FORMAT_DETACHED));
-        CmdLine = (char*) MALLOC((lenCmdLine + 1) * sizeof(char));
-        sprintf(CmdLine, CMDLINE_FORMAT_DETACHED, shellCmd, command);
+        int lenCmdLine = (int)(wcslen(shellCmd) + wcslen(command) + wcslen(CMDLINE_FORMAT_DETACHED));
+        CmdLine = (wchar_t*) MALLOC((lenCmdLine + 1) * sizeof(wchar_t));
+        swprintf(CmdLine, lenCmdLine, CMDLINE_FORMAT_DETACHED, shellCmd, command);
 
         dwCreationFlags = DETACHED_PROCESS;
     }
     else
     {
         int lenCmdLine = 0;
-        char FileTMPDir[PATH_MAX + 16];
+        wchar_t FileTMPDir[PATH_MAX + 16];
         BOOL bConvert = FALSE;
 
-        char *TMPDirLong = getTMPDIR();
-        char *TMPDirShort = getshortpathname(TMPDirLong, &bConvert);
+        wchar_t *TMPDirLong = getTMPDIRW();
 
-        sprintf(FileTMPDir, OUTPUT_CHECK_FILENAME_FORMAT, TMPDirLong);
+        swprintf(FileTMPDir, PATH_MAX + 16, OUTPUT_CHECK_FILENAME_FORMAT, TMPDirLong);
         FREE(TMPDirLong);
-        TMPDirLong = NULL;
-        FREE(TMPDirShort);
-        TMPDirShort = NULL;
 
-        if (FileExist(FileTMPDir))
+        if (FileExistW(FileTMPDir))
         {
-            DeleteFile(FileTMPDir);
+            DeleteFileW(FileTMPDir);
         }
 
-        lenCmdLine = (int)(strlen(shellCmd) + strlen(command) + strlen(CMDLINE_FORMAT_NOTDETACHED) +
-                           strlen(FileTMPDir));
-        CmdLine = (char*)MALLOC((lenCmdLine + 1) * sizeof(char));
-        sprintf(CmdLine, CMDLINE_FORMAT_NOTDETACHED, shellCmd, command, FileTMPDir);
+        lenCmdLine = (int)(wcslen(shellCmd) + wcslen(command) + wcslen(CMDLINE_FORMAT_NOTDETACHED) +
+                           wcslen(FileTMPDir));
+        CmdLine = (wchar_t*)MALLOC((lenCmdLine + 1) * sizeof(wchar_t));
+        swprintf(CmdLine, lenCmdLine, CMDLINE_FORMAT_NOTDETACHED, shellCmd, command, FileTMPDir);
 
         dwCreationFlags = 0;
     }
 
-    ok = CreateProcess(
+    ok = CreateProcessW(
              NULL,         /* Module name. */
              CmdLine,      /* Command line. */
              NULL,         /* Process handle not inheritable. */
@@ -293,13 +290,13 @@ char **CreateOuput(pipeinfo *pipe, BOOL DetachProcess)
     return OuputStrings;
 }
 /*--------------------------------------------------------------------------*/
-BOOL DetectDetachProcessInCommandLine(char *command)
+BOOL DetectDetachProcessInCommandLine(wchar_t *command)
 {
     BOOL bOK = FALSE;
     if (command)
     {
-        int i = (int)strlen(command);
-        for (i = (int)strlen(command) - 1; i >= 0; i--)
+        int i = (int)wcslen(command);
+        for (i = (int)wcslen(command) - 1; i >= 0; i--)
         {
             if (command[i] == BLANK)
             {
@@ -310,8 +307,8 @@ BOOL DetectDetachProcessInCommandLine(char *command)
                 break;
             }
         }
-        i = (int)strlen(command);
-        if ( (i > 0) && (command[i - 1] == '&') )
+        i = (int)wcslen(command);
+        if ( (i > 0) && (command[i - 1] == L'&') )
         {
             bOK = TRUE;
         }
index 3041cd3..fbbfa14 100644 (file)
@@ -37,7 +37,7 @@ pipeinfo SCILAB_WINDOWS_IMPEXP pipeSpawnErr;
 * @param[in] DetachProcess (if we want detach to scilab process)
 * @return 0
 */
-SCILAB_WINDOWS_IMPEXP int spawncommand(char *command, BOOL DetachProcess);
+SCILAB_WINDOWS_IMPEXP int spawncommand(wchar_t *command, BOOL DetachProcess);
 
 /**
 * ReadFromPipe (in or out)
@@ -51,7 +51,7 @@ SCILAB_WINDOWS_IMPEXP DWORD WINAPI ReadFromPipe (LPVOID args);
 * @param[in] command
 * @return TRUE or FALSE
 */
-SCILAB_WINDOWS_IMPEXP BOOL DetectDetachProcessInCommandLine(char *command);
+SCILAB_WINDOWS_IMPEXP BOOL DetectDetachProcessInCommandLine(wchar_t *command);
 
 /**
 * CreateOuput