Linux build : fix undefined pragma
[scilab.git] / scilab / modules / startup / src / cpp / scilab.cpp
index b237bc8..e424c53 100644 (file)
@@ -3,19 +3,26 @@
  *  Copyright (C) 2006-2008 - DIGITEO - Bruno JOFRET
  *  Copyright (C) 2013 - Scilab Enterprises - Antoine ELIAS
  *
- *  This file must be used under the terms of the CeCILL.
- *  This source file is licensed as described in the file COPYING, which
- *  you should have received as part of this distribution.  The terms
- *  are also available at
- *  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
+ * Copyright (C) 2012 - 2016 - Scilab Enterprises
+ *
+ * This file is hereby licensed under the terms of the GNU GPL v2.0,
+ * pursuant to article 5.3.4 of the CeCILL v.2.1.
+ * This file was originally licensed under the terms of the CeCILL v2.1,
+ * and continues to be available under such terms.
+ * For more information, see the COPYING file which you should have received
+ * along with this program.
  *
  */
 
+
+#ifdef _MSC_VER
 #pragma comment(lib,"../../../../../bin/libintl.lib")
+#endif
 
 #include <cstdio>
 #include <iostream>
 #include <string.h>
+#include <setjmp.h>
 
 extern "C"
 {
@@ -23,12 +30,21 @@ extern "C"
 #include "initMacOSXEnv.h"
 #endif
 #include "InitScilab.h"
-#include "sci_mode.h"
+#include "configvariable_interface.h"
 #include "scilabRead.h"
 #include "ConsoleRead.h"
 #include "version.h"
+#include "sci_malloc.h"
+#include "lasterror.h"
 
     extern char *getCmdLine(void);
+#ifdef _MSC_VER
+#include "FilesAssociations.h"
+#include "PATH_MAX.h"
+    jmp_buf ScilabJmpEnv;
+#else
+    extern jmp_buf ScilabJmpEnv;
+#endif
 }
 
 #include "configvariable.hxx"
@@ -37,15 +53,27 @@ extern "C"
 
 #define INTERACTIVE     -1
 
+extern "C"
+{
+#ifdef ENABLE_MPI
+#include "initMPI.h"
+#endif
+}
+
 /*
 ** Usage
 **
-** Display usage : options available in YaSp
+** Display usage : options available
 */
 static void usage(void)
 {
     std::cerr << "Usage: Scilab <options>" << std::endl;
-    std::cerr << "      -f file          : Batch mode on the given file." << std::endl;
+    std::cerr << "      -e Instruction   : execute the scilab instruction given in Instruction argument.";
+    std::cerr << "                         -e and -f arguments are mutually exclusive.";
+    std::cerr << "      -f File          : execute the scilab script given in File argument.";
+    std::cerr << "                         -e and -f arguments are mutually exclusive.";
+    std::cerr << "      -quit            : force scilab exit after execution of script from -e or -f argument.";
+    std::cerr << "                         this flag is ignored if it is not used with -e or -f argument.";
     std::cerr << "      -l lang          : Change the language of scilab ( default : en_US )." << std::endl;
     std::cerr << "      -nw              : Enable console mode." << std::endl;
     std::cerr << "      -nwni            : Enable terminal mode." << std::endl;
@@ -108,6 +136,12 @@ static int get_option(const int argc, char *argv[], ScilabEngineInfo* _pSEI)
         else if (!strcmp("--timed", argv[i]))
         {
             _pSEI->iTimed = 1;
+            ConfigVariable::setTimed(true);
+        }
+        else if (!strcmp("--serialize", argv[i]))
+        {
+            _pSEI->iSerialize = 1;
+            ConfigVariable::setSerialize(true);
         }
         else if (!strcmp("--AST-timed", argv[i]))
         {
@@ -122,6 +156,10 @@ static int get_option(const int argc, char *argv[], ScilabEngineInfo* _pSEI)
                 _pSEI->pstParseFile = argv[i];
             }
         }
+        else if (!strcmp("-quit", argv[i]))
+        {
+            _pSEI->iForceQuit = 1;
+        }
         else if (!strcmp("-version", argv[i]))
         {
             i++;
@@ -146,6 +184,33 @@ static int get_option(const int argc, char *argv[], ScilabEngineInfo* _pSEI)
                 _pSEI->pstExec = argv[i];
             }
         }
+        else if (!strcmp("-O", argv[i]))
+        {
+            i++;
+            if (argc >= i)
+            {
+                _pSEI->pstExec = argv[i];
+                _pSEI->iCodeAction = 0;
+            }
+        }
+        else if (!strcmp("-X", argv[i]))
+        {
+            i++;
+            if (argc >= i)
+            {
+                _pSEI->pstExec = argv[i];
+                _pSEI->iCodeAction = 1;
+            }
+        }
+        else if (!strcmp("-P", argv[i]))
+        {
+            i++;
+            if (argc >= i)
+            {
+                _pSEI->pstExec = argv[i];
+                _pSEI->iCodeAction = 2;
+            }
+        }
         else if (!strcmp("-l", argv[i]))
         {
             i++;
@@ -167,10 +232,18 @@ static int get_option(const int argc, char *argv[], ScilabEngineInfo* _pSEI)
         {
             _pSEI->iNoStart = 1;
         }
+        else if (!strcmp("-nb", argv[i]))
+        {
+            _pSEI->iNoBanner = 0;
+        }
         else if (!strcmp("--exec-verbose", argv[i]))
         {
             _pSEI->iExecVerbose = 1;
         }
+        else if (!strcmp("-keepconsole", argv[i]))
+        {
+            _pSEI->iKeepConsole = 1;
+        }
     }
 
     ConfigVariable::setCommandLineArgs(argc, argv);
@@ -185,10 +258,10 @@ extern "C"
 #include <unistd.h>
 #endif
     extern char *getCmdLine(void);
-    extern void ConsolePrintf(char *);
+    extern void ConsolePrintf(const char *);
 }
 
-static void TermPrintf(char *text)
+static void TermPrintf(const char *text)
 {
     //std::cout << text;
     printf("%s", text);
@@ -204,6 +277,11 @@ int main(int argc, char *argv[])
 //#endif
 {
     int iRet = 0;
+
+#ifdef ENABLE_MPI
+    initScilabMPI();
+#endif
+
     ScilabEngineInfo* pSEI = InitScilabEngineInfo();
 #ifdef WITHOUT_GUI
     /* Building Scilab-cli-bin. We won't ever had the gui nor the jvm */
@@ -258,6 +336,26 @@ int main(int argc, char *argv[])
         setScilabMode(SCILAB_STD);
         setScilabInputMethod(&ConsoleRead);
         setScilabOutputMethod(&ConsolePrintf);
+
+#ifdef _MSC_VER
+        if (pSEI->iCodeAction != -1)
+        {
+            //manage calls from explorer ( double click on sce file , ... )
+            char* Cmd = (char*)MALLOC(((PATH_MAX * 2) + 1) * sizeof(char));
+            strcpy(Cmd, "");
+            int ret = CommandByFileExtension(pSEI->pstExec, pSEI->iCodeAction, Cmd);
+
+            if (ret && Cmd[0] != '\0')
+            {
+                pSEI->pstExec = Cmd; //Cmd must be freed in StartScilabEngine after process.
+            }
+            else
+            {
+                pSEI->iCodeAction = -1;
+            }
+        }
+#endif
+
 #if defined(__APPLE__)
         return initMacOSXEnv(pSEI);
 #endif // !defined(__APPLE__)
@@ -274,8 +372,24 @@ int main(int argc, char *argv[])
         exit(0);
     }
 
-    StartScilabEngine(pSEI);
-    iRet = RunScilabEngine(pSEI);
-    StopScilabEngine(pSEI);
-    return iRet;
+    int val = setjmp(ScilabJmpEnv);
+    if (!val)
+    {
+        iRet = StartScilabEngine(pSEI);
+        if (iRet == 0)
+        {
+            iRet = RunScilabEngine(pSEI);
+        }
+
+        StopScilabEngine(pSEI);
+        FREE(pSEI);
+        return iRet;
+    }
+    else
+    {
+        // We probably had a segfault so print error
+        std::wcerr << getLastErrorMessage() << std::endl;
+        return val;
+    }
 }
+