error displaying. 86/17186/4
Cedric Delamarre [Wed, 9 Sep 2015 16:00:36 +0000 (18:00 +0200)]
Change-Id: Ie78118ef40b4ad5767651ff83c37d8722ff00ccb

scilab/modules/ast/src/cpp/parse/printerror.cpp
scilab/modules/ast/src/cpp/system_env/configvariable.cpp
scilab/modules/core/src/cpp/runner.cpp
scilab/modules/functions/sci_gateway/cpp/sci_exec.cpp
scilab/modules/functions/sci_gateway/cpp/sci_execstr.cpp

index 91d8611..39aafd6 100644 (file)
@@ -13,6 +13,8 @@
 #include <fstream>
 #include <string>
 #include "parser_private.hxx"
+#include "configvariable.hxx"
+
 extern "C"
 {
 #include "charEncoding.h"
@@ -20,20 +22,10 @@ extern "C"
 
 void ParserSingleInstance::PrintError(const std::wstring& msg)
 {
-    int i = 0;
-
-    // FIXME : Should work under Windows
-    // Need to have getline !!!
     std::wostringstream ostr;
     char *codeLine = (char *) malloc(4096 * sizeof(char));
-    wchar_t * str;
 
-    /** First print where in the script the error is located */
-    ostr << L"[" << ParserSingleInstance::getProgName() << L"] ";
-
-    /*
-    ** If the error is a the very beginning of a line
-    */
+    //If the error is a the very beginning of a line
     if (yylloc.first_line == yylloc.last_line
             && yylloc.first_column == 1
             && yylloc.last_column == 1)
@@ -41,19 +33,28 @@ void ParserSingleInstance::PrintError(const std::wstring& msg)
         --yylloc.first_line;
     }
 
-    str = to_wide_string(ParserSingleInstance::getCodeLine(yylloc.first_line, &codeLine));
-    ostr << str << std::endl;
+    // fill call stack
+    ConfigVariable::fillWhereError(yylloc.first_line);
+
+    /** Print where in the script the error is located */
+    wchar_t* str = to_wide_string(ParserSingleInstance::getCodeLine(yylloc.first_line, &codeLine));
+    ostr << str;
+    // add EOL only if the code line doesn't already contains it.
+    if (wcscmp(str + wcslen(str) - 1, L"\n") != 0)
+    {
+        ostr << std::endl;
+    }
     free(codeLine);
     FREE(str);
 
-    /** Then underline what causes the trouble */
-    ostr << L"[" << ParserSingleInstance::getProgName() << L"] ";
-    for ( i = 1 ; i < yylloc.first_column ; ++i)
+    /** Underline what causes the trouble */
+    int i = 0;
+    for (i = 1 ; i < yylloc.first_column ; ++i)
     {
         ostr << L" ";
     }
     ostr << L"^";
-    for ( i = i + 1 ; i < yylloc.last_column ; ++i)
+    for (i = i + 1 ; i < yylloc.last_column ; ++i)
     {
         ostr << L"~";
     }
@@ -63,17 +64,9 @@ void ParserSingleInstance::PrintError(const std::wstring& msg)
     }
     ostr << std::endl;
 
-    /** Finally display the Lexer / Parser message */
-    ostr << L"[" << ParserSingleInstance::getProgName() << L"] ";
-    ostr << ParserSingleInstance::getFileName() << L" : " <<
-         yylloc.first_line << L"." << yylloc.first_column <<
-         L" - " <<
-         yylloc.last_line << L"." << yylloc.last_column <<
-         L" : " << msg << std::endl;
-
-    //yylloc.first_line -= yylloc.last_line;
-    //yylloc.last_line = yylloc.first_line;
-    //yylloc.last_column = yylloc.first_column;
+    /** Display Parser message  */
+    std::wstring wstrError(_W("Error: "));
+    ostr << wstrError << msg << std::endl;
 
     ParserSingleInstance::appendErrorMessage(ostr.str());
 }
index bd7f9c8..1f8bd6e 100644 (file)
@@ -1266,6 +1266,8 @@ void ConfigVariable::whereErrorToString(std::wostringstream &ostr)
 
         ostr << std::endl;
     }
+
+    ostr << std::endl;
 }
 
 void ConfigVariable::fillWhereError(int _iErrorLine)
index d2abf1e..6053a17 100644 (file)
@@ -111,11 +111,10 @@ int StaticRunner::launch()
             ConfigVariable::setPromptMode(iOldPromptMode);
         }
 
-        scilabErrorW(se.GetErrorMessage().c_str());
-        scilabErrorW(L"\n");
         std::wostringstream ostr;
         ConfigVariable::whereErrorToString(ostr);
         scilabErrorW(ostr.str().c_str());
+        scilabErrorW(se.GetErrorMessage().c_str());
         ConfigVariable::resetWhereError();
         iRet = 1;
     }
index 6ac50ff..ab1a439 100644 (file)
@@ -183,6 +183,9 @@ types::Function::ReturnValue sci_exec(types::typed_list &in, int _iRetCount, typ
             return types::Function::Error;
         }
 
+        // update where to set the name of the executed file.
+        ConfigVariable::setFileNameToLastWhere(wstFile.data());
+
         ThreadManagement::LockParser();
         parser.parseFile(pwstTemp, L"exec");
         FREE(pwstTemp);
@@ -230,8 +233,6 @@ types::Function::ReturnValue sci_exec(types::typed_list &in, int _iRetCount, typ
         }
 
         ThreadManagement::UnlockParser();
-        // update where to set the name of the executed file.
-        ConfigVariable::setFileNameToLastWhere(wstFile.data());
 
         ConfigVariable::setExecutedFileID(iID);
     }
index 3e66555..c8149bf 100644 (file)
@@ -132,6 +132,10 @@ types::Function::ReturnValue sci_execstr(types::typed_list &in, int _iRetCount,
         pstCommand[iPos] = 0;
     }
 
+    // add execstr in list of macro called
+    // to manage line displayed when error occured.
+    ConfigVariable::macroFirstLine_begin(1);
+
     ThreadManagement::LockParser();
     parser.parse(pstCommand);
     FREE(pstCommand);
@@ -145,6 +149,7 @@ types::Function::ReturnValue sci_execstr(types::typed_list &in, int _iRetCount,
             ConfigVariable::setLastErrorMessage(parser.getErrorMessage());
             ConfigVariable::setLastErrorNumber(999);
             ThreadManagement::UnlockParser();
+            ConfigVariable::macroFirstLine_end();
             return types::Function::OK;
         }
         else
@@ -153,7 +158,8 @@ types::Function::ReturnValue sci_execstr(types::typed_list &in, int _iRetCount,
             Scierror(999, "%s", pst);
             FREE(pst);
             ThreadManagement::UnlockParser();
-            return types::Function::Error;
+            ConfigVariable::macroFirstLine_end();
+            return types::Function::OK;
         }
     }
 
@@ -196,13 +202,7 @@ types::Function::ReturnValue sci_execstr(types::typed_list &in, int _iRetCount,
     }
 
     ast::SeqExp* pSeqExp = pExp->getAs<ast::SeqExp>();
-
-    // add execstr in list of macro called
-    // to manage line displayed when error occured.
-    ConfigVariable::macroFirstLine_begin(1);
-
     std::unique_ptr<ast::ConstVisitor> run(ConfigVariable::getDefaultVisitor());
-
     try
     {
         symbol::Context* pCtx = symbol::Context::getInstance();