add management of mode(7) 77/17377/5
Antoine ELIAS [Thu, 22 Oct 2015 13:40:04 +0000 (15:40 +0200)]
Change-Id: I5abfa67306e755522ed25a836cd603079ab5af03

scilab/modules/ast/console_Import.def
scilab/modules/ast/src/cpp/ast/runvisitor.cpp
scilab/modules/ast/src/cpp/system_env/configvariable.cpp
scilab/modules/core/sci_gateway/cpp/sci_mode.cpp
scilab/modules/functions/sci_gateway/cpp/sci_exec.cpp

index 28d3e9a..10c5791 100644 (file)
@@ -3,3 +3,6 @@ LIBRARY    sciconsole.dll
 
 EXPORTS
 linesmore
+scilabRead
+SetTemporaryPrompt
+ClearTemporaryPrompt
\ No newline at end of file
index 95ff406..e99c516 100644 (file)
@@ -51,6 +51,8 @@ extern "C"
 #include "os_string.h"
 #include "elem_common.h"
 #include "storeCommand.h"
+#include "prompt.h"
+#include "scilabRead.h"
 }
 
 namespace ast
@@ -1259,6 +1261,7 @@ template <class T>
 void RunVisitorT<T>::visitprivate(const SeqExp  &e)
 {
     CoverageInstance::invokeAndStartChrono((void*)&e);
+    int lastLine = 0;
     for (auto exp : e.getExps())
     {
         if (exp->isCommentExp())
@@ -1269,7 +1272,13 @@ void RunVisitorT<T>::visitprivate(const SeqExp  &e)
         if (ConfigVariable::isExecutionBreak())
         {
             ConfigVariable::resetExecutionBreak();
+            if (ConfigVariable::getPromptMode() == 7)
+            {
+                ClearTemporaryPrompt();
+            }
+
             StorePrioritaryCommand("pause");
+            ThreadManagement::WaitForRunMeSignal();
         }
 
         // interrupt me to execute a prioritary command
@@ -1382,6 +1391,35 @@ void RunVisitorT<T>::visitprivate(const SeqExp  &e)
                 pIT->killMe();
             }
 
+            if (ConfigVariable::getPromptMode() == 7)
+            {
+                Location loc = exp->getLocation();
+                if (lastLine < loc.first_line)
+                {
+                    //break execution
+                    SetTemporaryPrompt(SCIPROMPT_PAUSE);
+                    ConfigVariable::setScilabCommand(0);
+                    char* pcConsoleReadStr = ConfigVariable::getConsoleReadStr();
+                    if (pcConsoleReadStr) // exec is called from a callback
+                    {
+                        ThreadManagement::SendConsoleExecDoneSignal();
+                    }
+                    else // exec is called from the console
+                    {
+                        scilabRead();
+                        pcConsoleReadStr = ConfigVariable::getConsoleReadStr();
+                    }
+
+                    if (pcConsoleReadStr && pcConsoleReadStr[0] == 'p' && pcConsoleReadStr[1] == '\0')
+                    {
+                        //mode pause
+                        ConfigVariable::setExecutionBreak();
+                    }
+                }
+
+                lastLine = loc.last_line;
+            }
+
             if ((&e)->isBreakable() && exp->isBreak())
             {
                 const_cast<SeqExp *>(&e)->setBreak();
index f8f1cd5..bafad79 100644 (file)
@@ -431,9 +431,10 @@ int ConfigVariable::getPromptMode(void)
 
 bool ConfigVariable::isEmptyLineShow(void)
 {
-    if ( m_iPromptMode == 0     ||
-            m_iPromptMode == 2  ||
-            m_iPromptMode == 3)
+    if ( m_iPromptMode == 0    ||
+            m_iPromptMode == 2 ||
+            m_iPromptMode == 3 ||
+            m_iPromptMode == 7)
     {
         return true;
     }
@@ -445,10 +446,11 @@ bool ConfigVariable::isEmptyLineShow(void)
 
 bool ConfigVariable::isPromptShow(void)
 {
-    if ( m_iPromptMode == 0     ||
-            m_iPromptMode == 1  ||
-            m_iPromptMode == 2  ||
-            m_iPromptMode == 3)
+    if ( m_iPromptMode == 0    ||
+            m_iPromptMode == 1 ||
+            m_iPromptMode == 2 ||
+            m_iPromptMode == 3 ||
+            m_iPromptMode == 7)
     {
         return true;
     }
index 5b1c7c7..74c8275 100644 (file)
@@ -19,6 +19,7 @@
 extern "C"
 {
 #include "Scierror.h"
+#include "sciprint.h"
 #include "localization.h"
 }
 
@@ -69,6 +70,11 @@ types::Function::ReturnValue sci_mode(types::typed_list &in, int _iRetCount, typ
         }
 
         ConfigVariable::setPromptMode(iScilabMode);
+
+        if (iScilabMode == 4 || iScilabMode == 7)
+        {
+            sciprint(_("Pause mode: enter empty lines to continue.\n"));
+        }
     }
 
     return types::Function::OK;
index 89dd6de..684739e 100644 (file)
@@ -359,6 +359,10 @@ types::Function::ReturnValue sci_exec(types::typed_list &in, int _iRetCount, typ
 
         for (ast::exps_t::iterator j = LExp.begin(), itEnd = LExp.end() ; j != itEnd; ++j)
         {
+            if (ConfigVariable::getPromptMode() == 7)
+            {
+                stPrompt = SCIPROMPT_PAUSE;
+            }
             // printf some exp
             ast::exps_t::iterator k = j;
             int iLastLine = (*j)->getLocation().last_line;