Linux build : fix undefined pragma
[scilab.git] / scilab / modules / startup / src / cpp / scilab.cpp
index 7635ea3..e424c53 100644 (file)
@@ -3,24 +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.
  *
  */
 
-//#define DEBUG_VLD
-#if defined(DEBUG_VLD)
-#include <vld.h>
-#endif
 
+#ifdef _MSC_VER
 #pragma comment(lib,"../../../../../bin/libintl.lib")
+#endif
 
 #include <cstdio>
 #include <iostream>
 #include <string.h>
+#include <setjmp.h>
 
 extern "C"
 {
@@ -33,8 +35,16 @@ extern "C"
 #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"
@@ -53,12 +63,17 @@ extern "C"
 /*
 ** 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;
@@ -141,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++;
@@ -165,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++;
@@ -290,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__)
@@ -306,9 +372,24 @@ int main(int argc, char *argv[])
         exit(0);
     }
 
-    StartScilabEngine(pSEI);
-    iRet = RunScilabEngine(pSEI);
-    StopScilabEngine(pSEI);
-    FREE(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;
+    }
 }
+