Empty matrices operation: added a warning to + and - operations 15/17515/9
Pierre-Aime Agnel [Mon, 30 Nov 2015 15:52:07 +0000 (16:52 +0100)]
Added a warning flag to stop execution and thus retrieve the lines where warning occurred

Change-Id: Ied0b82272758e756d842abca4834246f8a9e0495

42 files changed:
scilab/modules/arnoldi/src/c/eigs.c
scilab/modules/ast/includes/system_env/configvariable.hxx
scilab/modules/ast/includes/system_env/configvariable_interface.h
scilab/modules/ast/output_stream_Import.def
scilab/modules/ast/src/c/operations/matrix_power.c
scilab/modules/ast/src/cpp/operations/types_addition.cpp
scilab/modules/ast/src/cpp/operations/types_subtraction.cpp
scilab/modules/ast/src/cpp/system_env/configvariable.cpp
scilab/modules/ast/src/cpp/system_env/configvariable_interface.cpp
scilab/modules/cacsd/sci_gateway/c/sci_linmeq.c
scilab/modules/core/help/en_US/error_handling/warning.xml
scilab/modules/core/help/fr_FR/error_handling/warning.xml [new file with mode: 0644]
scilab/modules/core/sci_gateway/cpp/sci_warning.cpp
scilab/modules/core/tests/unit_tests/warning.dia.ref [new file with mode: 0644]
scilab/modules/core/tests/unit_tests/warning.tst [new file with mode: 0644]
scilab/modules/elementary_functions/sci_gateway/c/sci_log10.c
scilab/modules/fileio/src/c/findfiles.c
scilab/modules/fileio/src/c/removedir.c
scilab/modules/graphics/src/c/DrawObjects.c
scilab/modules/graphics/src/c/FeC.c
scilab/modules/graphics/src/c/Format.c
scilab/modules/graphics/src/c/Gray.c
scilab/modules/graphics/src/c/Plo2dn.c
scilab/modules/graphics/src/c/getHandleProperty/set_box_property.c
scilab/modules/graphics/src/c/getHandleProperty/set_color_range_property.c
scilab/modules/graphics/src/c/getHandleProperty/set_line_style_property.c
scilab/modules/graphics/src/c/getHandleProperty/set_log_flags_property.c
scilab/modules/graphics/src/c/getHandleProperty/set_outside_colors_property.c
scilab/modules/gui/sci_gateway/c/sci_mpopup.c
scilab/modules/optimization/sci_gateway/c/sci_qp_solve.c
scilab/modules/output_stream/Makefile.am
scilab/modules/output_stream/Makefile.in
scilab/modules/output_stream/includes/Sciwarning.h [new file with mode: 0644]
scilab/modules/output_stream/src/c/ast_Import.def
scilab/modules/output_stream/src/c/output_stream.vcxproj
scilab/modules/output_stream/src/c/output_stream.vcxproj.filters
scilab/modules/output_stream/src/cpp/Sciwarning.cpp [new file with mode: 0644]
scilab/modules/randlib/src/c/clcg4.c
scilab/modules/scicos/src/c/scicos.c
scilab/modules/spreadsheet/src/c/csvRead.c
scilab/modules/statistics/src/c/CdfBase.c
scilab/modules/umfpack/sci_gateway/c/sci_umf_lufact.c

index 4d5502d..00a6d95 100644 (file)
@@ -18,6 +18,7 @@
 #include "sci_malloc.h"
 #include "sciprint.h"
 #include "eigs_dependencies.h"
+#include "Sciwarning.h"
 
 /*--------------------------------------------------------------------------*/
 extern int C2F(dsaupd)(int *ido, char *bmat, int *n, char *which, int *nev,
@@ -323,7 +324,7 @@ int eigs(double *AR, doublecomplex *AC, int N, int Acomplex, int Asym,
 
             if (INFO[0] == -1) //non critical error
             {
-                sciprint("%s: WARNING: Maximum number of iterations reached. Only %d eigenvalues converged.\n", "eigs", IPARAM[4]);
+                Sciwarning("%s: WARNING: Maximum number of iterations reached. Only %d eigenvalues converged.\n", "eigs", IPARAM[4]);
                 break;
             }
             else
@@ -616,7 +617,7 @@ int eigs(double *AR, doublecomplex *AC, int N, int Acomplex, int Asym,
 
             if (INFO[0] == -1) //non critical error
             {
-                sciprint("%s: WARNING: Maximum number of iterations reached. Only %d eigenvalues converged.\n", "eigs", IPARAM[4]);
+                Sciwarning("%s: WARNING: Maximum number of iterations reached. Only %d eigenvalues converged.\n", "eigs", IPARAM[4]);
                 break;
             }
             else
index 567935d..dcecc23 100644 (file)
@@ -144,6 +144,14 @@ public :
     static void setWarningMode(bool _bWarningMode);
     static bool getWarningMode(void);
 
+    // WarningStop
+private :
+    static bool m_bWarningStop;
+
+public :
+    static void setWarningStop(bool _bWarningStop);
+    static bool getWarningStop(void);
+
     //HOME
 private :
     static std::wstring m_HOME;
index 33f87d1..3bce55c 100644 (file)
@@ -65,6 +65,8 @@ EXTERN_AST const char * getScilabModeString(void);
 
 EXTERN_AST int getWarningMode(void);
 EXTERN_AST void setWarningMode(int _iMode);
+EXTERN_AST int getWarningStop(void);
+EXTERN_AST void setWarningStop(int _iMode);
 
 EXTERN_AST int checkReferenceModule(const wchar_t* _module);
 EXTERN_AST void addReferenceModule(const wchar_t* _module);
index c0c5168..fc35a68 100644 (file)
@@ -23,6 +23,7 @@
 #include "sciprint.h"
 #include "localization.h"
 #include "configvariable_interface.h"
+#include "Sciwarning.h"
 
 /*
 r : real part
@@ -539,7 +540,7 @@ int iPowerRealSquareMatrixByRealScalar(
             {
                 sciprint(_("Warning :\n"));
                 sciprint(_("matrix is close to singular or badly scaled. rcond = %1.4E\n"), dblRcond);
-                sciprint(_("computing least squares solution. (see lsq).\n"));
+                Sciwarning(_("computing least squares solution. (see lsq).\n"));
             }
         }
     }
@@ -679,7 +680,7 @@ int iPowerComplexSquareMatrixByRealScalar(
             {
                 sciprint(_("Warning :\n"));
                 sciprint(_("matrix is close to singular or badly scaled. rcond = %1.4E\n"), dblRcond);
-                sciprint(_("computing least squares solution. (see lsq).\n"));
+                Sciwarning(_("computing least squares solution. (see lsq).\n"));
             }
         }
 
index fb736e3..668eb38 100644 (file)
@@ -21,6 +21,7 @@ extern "C"
 {
 #include "matrix_addition.h"
 #include "elem_common.h" //dset
+#include "Sciwarning.h"
 }
 
 using namespace types;
@@ -1131,6 +1132,7 @@ InternalType* add_M_SC(T *_pL, U *_pR)
 template<class T, class U, class O>
 InternalType* add_M_E(T *_pL, U * /*_pR*/)
 {
+    Sciwarning(_("operation +: Warning adding a matrix with the empty matrix will give an empty matrix result.\n")); 
     Double* pOut = Double::Empty();
     add();
     return pOut;
@@ -1190,6 +1192,7 @@ InternalType* add_MC_SC(T *_pL, U *_pR)
 template<class T, class U, class O>
 InternalType* add_MC_E(T *_pL, U * /*_pR*/)
 {
+    Sciwarning(_("operation +: Warning adding a matrix with the empty matrix will give an empty matrix result.\n")); 
     Double* pOut = Double::Empty();
     add();
     return pOut;
@@ -1227,6 +1230,7 @@ InternalType* add_S_SC(T *_pL, U *_pR)
 template<class T, class U, class O>
 InternalType* add_S_E(T *_pL, U * /*_pR*/)
 {
+    Sciwarning(_("operation +: Warning adding a matrix with the empty matrix will give an empty matrix result.\n")); 
     Double* pOut = Double::Empty();
     add();
     return pOut;
@@ -1262,6 +1266,7 @@ InternalType* add_SC_SC(T *_pL, U *_pR)
 template<class T, class U, class O>
 InternalType* add_SC_E(T *_pL, U * /*_pR*/)
 {
+    Sciwarning(_("operation +: Warning adding a matrix with the empty matrix will give an empty matrix result.\n")); 
     Double* pOut = Double::Empty();
     add();
     return pOut;
@@ -1271,6 +1276,7 @@ InternalType* add_SC_E(T *_pL, U * /*_pR*/)
 template<class T, class U, class O>
 InternalType* add_E_M(T *_pL, U *_pR)
 {
+    Sciwarning(_("operation +: Warning adding a matrix with the empty matrix will give an empty matrix result.\n")); 
     Double* pOut = Double::Empty();
     add();
     return pOut;
@@ -1279,6 +1285,7 @@ InternalType* add_E_M(T *_pL, U *_pR)
 template<class T, class U, class O>
 InternalType* add_E_MC(T *_pL, U *_pR)
 {
+    Sciwarning(_("operation +: Warning adding a matrix with the empty matrix will give an empty matrix result.\n")); 
     Double* pOut = Double::Empty();
     add();
     return pOut;
@@ -1287,6 +1294,7 @@ InternalType* add_E_MC(T *_pL, U *_pR)
 template<class T, class U, class O>
 InternalType* add_E_S(T *_pL, U *_pR)
 {
+    Sciwarning(_("operation +: Warning adding a matrix with the empty matrix will give an empty matrix result.\n")); 
     Double* pOut = Double::Empty();
     add();
     return pOut;
@@ -1295,6 +1303,7 @@ InternalType* add_E_S(T *_pL, U *_pR)
 template<class T, class U, class O>
 InternalType* add_E_SC(T *_pL, U *_pR)
 {
+    Sciwarning(_("operation +: Warning adding a matrix with the empty matrix will give an empty matrix result.\n")); 
     Double* pOut = Double::Empty();
     add();
     return pOut;
@@ -1303,6 +1312,7 @@ InternalType* add_E_SC(T *_pL, U *_pR)
 template<class T, class U, class O>
 InternalType* add_E_E(T * /*_pL*/, U * /*_pR*/)
 {
+    Sciwarning(_("operation +: Warning adding a matrix with the empty matrix will give an empty matrix result.\n")); 
     Double* pOut = Double::Empty();
     add();
     return pOut;
@@ -1528,6 +1538,7 @@ template<class T, class U, class O> InternalType* add_IC_IC(T *_pL, U *_pR)
 
 template<class T, class U, class O> types::InternalType* add_I_E(T *_pL, U * /*_pR*/)
 {
+    Sciwarning(_("operation +: Warning adding a matrix with the empty matrix will give an empty matrix result.\n")); 
     Double* pOut = Double::Empty();
     add();
     return pOut;
@@ -1535,6 +1546,7 @@ template<class T, class U, class O> types::InternalType* add_I_E(T *_pL, U * /*_
 
 template<class T, class U, class O> types::InternalType* add_IC_E(T *_pL, U * /*_pR*/)
 {
+    Sciwarning(_("operation +: Warning adding a matrix with the empty matrix will give an empty matrix result.\n")); 
     Double* pOut = Double::Empty();
     add();
     return pOut;
@@ -1542,6 +1554,7 @@ template<class T, class U, class O> types::InternalType* add_IC_E(T *_pL, U * /*
 
 template<class T, class U, class O> types::InternalType* add_E_I(T * /*_pL*/, U *_pR)
 {
+    Sciwarning(_("operation +: Warning adding a matrix with the empty matrix will give an empty matrix result.\n")); 
     Double* pOut = Double::Empty();
     add();
     return pOut;
@@ -1549,6 +1562,7 @@ template<class T, class U, class O> types::InternalType* add_E_I(T * /*_pL*/, U
 
 template<class T, class U, class O> types::InternalType* add_E_IC(T * /*_pL*/, U *_pR)
 {
+    Sciwarning(_("operation +: Warning adding a matrix with the empty matrix will give an empty matrix result.\n")); 
     Double* pOut = Double::Empty();
     add();
     return pOut;
@@ -1671,6 +1685,7 @@ InternalType* add_S_S<String, String, String>(String* _pL, String* _pR)
 template<>
 InternalType* add_M_E<String, Double, String>(String* _pL, Double* /*_pR*/)
 {
+    Sciwarning(_("operation +: Warning adding a matrix with the empty matrix will give an empty matrix result.\n")); 
     Double* pOut = Double::Empty();
     add();
     return pOut;
@@ -1679,6 +1694,7 @@ InternalType* add_M_E<String, Double, String>(String* _pL, Double* /*_pR*/)
 template<>
 InternalType* add_S_E<String, Double, String>(String* _pL, Double* /*_pR*/)
 {
+    Sciwarning(_("operation +: Warning adding a matrix with the empty matrix will give an empty matrix result.\n")); 
     Double* pOut = Double::Empty();
     add();
     return pOut;
@@ -1687,6 +1703,7 @@ InternalType* add_S_E<String, Double, String>(String* _pL, Double* /*_pR*/)
 template<>
 InternalType* add_E_M<Double, String, String>(Double* /*_pL*/, String* _pR)
 {
+    Sciwarning(_("operation +: Warning adding a matrix with the empty matrix will give an empty matrix result.\n")); 
     Double* pOut = Double::Empty();
     add();
     return pOut;
@@ -1695,6 +1712,7 @@ InternalType* add_E_M<Double, String, String>(Double* /*_pL*/, String* _pR)
 template<>
 InternalType* add_E_S<Double, String, String>(Double* /*_pL*/, String* _pR)
 {
+    Sciwarning(_("operation +: Warning adding a matrix with the empty matrix will give an empty matrix result.\n")); 
     Double* pOut = Double::Empty();
     add();
     return pOut;
index 7fde377..015d4fa 100644 (file)
@@ -24,6 +24,7 @@
 extern "C"
 {
 #include "elem_common.h" //dset
+#include "Sciwarning.h" //Sciwarning
 }
 
 using namespace types;
@@ -895,6 +896,7 @@ InternalType* sub_M_SC(T *_pL, U *_pR)
 template<class T, class U, class O>
 InternalType* sub_M_E(T *_pL, U * /*_pR*/)
 {
+    Sciwarning(_("operation -: Warning adding a matrix with the empty matrix will give an empty matrix result.\n")); 
     Double* pOut = Double::Empty();
     sub();
     return pOut;
@@ -976,6 +978,7 @@ InternalType* sub_MC_SC(T *_pL, U *_pR)
 template<class T, class U, class O>
 InternalType* sub_MC_E(T *_pL, U * /*_pR*/)
 {
+    Sciwarning(_("operation -: Warning adding a matrix with the empty matrix will give an empty matrix result.\n")); 
     Double* pOut = Double::Empty();
     sub();
     return pOut;
@@ -1017,6 +1020,7 @@ InternalType* sub_S_SC(T *_pL, U *_pR)
 template<class T, class U, class O>
 InternalType* sub_S_E(T *_pL, U * /*_pR*/)
 {
+    Sciwarning(_("operation -: Warning adding a matrix with the empty matrix will give an empty matrix result.\n")); 
     Double* pOut = Double::Empty();
     sub();
     return pOut;
@@ -1058,6 +1062,7 @@ InternalType* sub_SC_SC(T *_pL, U *_pR)
 template<class T, class U, class O>
 InternalType* sub_SC_E(T *_pL, U * /*_pR*/)
 {
+    Sciwarning(_("operation -: Warning adding a matrix with the empty matrix will give an empty matrix result.\n")); 
     Double* pOut = Double::Empty();
     sub();
     return pOut;
@@ -1067,6 +1072,7 @@ InternalType* sub_SC_E(T *_pL, U * /*_pR*/)
 template<class T, class U, class O>
 InternalType* sub_E_M(T * /*_pL*/, U *_pR)
 {
+    Sciwarning(_("operation -: Warning adding a matrix with the empty matrix will give an empty matrix result.\n")); 
     Double* pOut = Double::Empty();
     sub();
     return pOut;
@@ -1075,6 +1081,7 @@ InternalType* sub_E_M(T * /*_pL*/, U *_pR)
 template<class T, class U, class O>
 InternalType* sub_E_MC(T * /*_pL*/, U *_pR)
 {
+    Sciwarning(_("operation -: Warning adding a matrix with the empty matrix will give an empty matrix result.\n")); 
     Double* pOut = Double::Empty();
     sub();
     return pOut;
@@ -1083,6 +1090,7 @@ InternalType* sub_E_MC(T * /*_pL*/, U *_pR)
 template<class T, class U, class O>
 InternalType* sub_E_E(T * /*_pL*/, U * /*_pR*/)
 {
+    Sciwarning(_("operation -: Warning adding a matrix with the empty matrix will give an empty matrix result.\n")); 
     Double* pOut = Double::Empty();
     sub();
     return pOut;
@@ -1457,6 +1465,7 @@ template<class T, class U, class O> InternalType* sub_IC_IC(T *_pL, U *_pR)
 
 template<class T, class U, class O> types::InternalType* sub_I_E(T *_pL, U * /*_pR*/)
 {
+    Sciwarning(_("operation -: Warning adding a matrix with the empty matrix will give an empty matrix result.\n")); 
     Double* pOut = Double::Empty();
     sub();
     return pOut;
@@ -1464,6 +1473,7 @@ template<class T, class U, class O> types::InternalType* sub_I_E(T *_pL, U * /*_
 
 template<class T, class U, class O> types::InternalType* sub_IC_E(T *_pL, U * /*_pR*/)
 {
+    Sciwarning(_("operation -: Warning adding a matrix with the empty matrix will give an empty matrix result.\n")); 
     Double* pOut = Double::Empty();
     sub();
     return pOut;
@@ -1471,6 +1481,7 @@ template<class T, class U, class O> types::InternalType* sub_IC_E(T *_pL, U * /*
 
 template<class T, class U, class O> types::InternalType* sub_E_I(T * /*_pL*/, U *_pR)
 {
+    Sciwarning(_("operation -: Warning adding a matrix with the empty matrix will give an empty matrix result.\n")); 
     Double* pOut = Double::Empty();
     sub();
     return pOut;
@@ -1478,6 +1489,7 @@ template<class T, class U, class O> types::InternalType* sub_E_I(T * /*_pL*/, U
 
 template<class T, class U, class O> types::InternalType* sub_E_IC(T * /*_pL*/, U *_pR)
 {
+    Sciwarning(_("operation -: Warning adding a matrix with the empty matrix will give an empty matrix result.\n")); 
     Double* pOut = Double::Empty();
     sub();
     return pOut;
index 1f8bd6e..db52213 100644 (file)
@@ -259,6 +259,29 @@ bool ConfigVariable::getWarningMode(void)
 /*
 ** \}
 */
+/*
+** \}
+*/
+
+/*
+** Warning Stop
+** \{
+*/
+bool ConfigVariable::m_bWarningStop = false;
+
+void ConfigVariable::setWarningStop(bool _bWarningStop)
+{
+    m_bWarningStop = _bWarningStop;
+}
+
+bool ConfigVariable::getWarningStop(void)
+{
+    return m_bWarningStop;
+}
+/*
+** \}
+*/
+
 
 /*
 ** HOME
index 8e9fc06..be4e7be 100644 (file)
@@ -157,6 +157,17 @@ void setWarningMode(int _iMode)
     ConfigVariable::setWarningMode(_iMode != 0);
 }
 
+int getWarningStop(void)
+{
+    return ConfigVariable::getWarningStop() ? 1 : 0;
+}
+
+void setWarningStop(int _iStop)
+{
+    ConfigVariable::setWarningStop(_iStop != 0);
+}
+
+
 int checkReferenceModule(const wchar_t* _module)
 {
     return ConfigVariable::checkReferenceModule(_module) ? 1 : 0;
index 0185444..51e32d3 100644 (file)
 #include "localization.h"
 #include "sciprint.h"
 #include "elem_common.h"
+#include "Sciwarning.h"
 
 extern int C2F(lsame)();
 extern int C2F(dlacpy)();
@@ -1220,12 +1221,12 @@ int sci_linmeq(char *fname, void* pvApiCtx)
     }
     else if (SCALE != ONE)
     {
-        sciprint(_("%s: Warning: input arguments were scaled by %lf to avoid overflow.\n"), fname, TEMP);
+        Sciwarning(_("%s: Warning: input arguments were scaled by %lf to avoid overflow.\n"), fname, TEMP);
     }
 
     if (PERTRB)
     {
-        sciprint(_("%s: Warning: the equation is (almost) singular. Perturbed values have been used.\n"), fname);
+        Sciwarning(_("%s: Warning: the equation is (almost) singular. Perturbed values have been used.\n"), fname);
     }
 
     ReturnArguments(pvApiCtx);
index 2b80cc0..a4c0d36 100644 (file)
@@ -7,8 +7,10 @@
     <refsynopsisdiv>
         <title>Calling Sequence</title>
         <synopsis>warning('string')
+            warning(string_matrix)
             warning('off')
             warning('on')
+            warning('stop')
             mode = warning('query')
         </synopsis>
     </refsynopsisdiv>
             <literal>'string'</literal> in a warning message.
         </para>
         <para>
-            <literal>'on'</literal> enables warning messages.
+            <literal>warning(string_matrix)</literal> prints each element of the matrix <literal>string_matrix</literal>
+            in a warning message.
         </para>
         <para>
-            <literal>'off'</literal> disables warning messages.
+            <literal>'on'</literal> enables warning messages, warning messages do not interrupt script execution.
         </para>
         <para>
-            <literal>'query'</literal> gets state <literal>'on'</literal> or <literal>'off'</literal>.
+            <literal>'off'</literal> disables warning messages, warning messages are ignored (neither displayed nor interrupting script execution).
+        </para>
+        <para>
+            <literal>'stop'</literal> enables warning messages and stops execution when a warning is encountered.
+        </para>
+        <para>
+            <literal>'query'</literal> gets state <literal>'on'</literal>, <literal>'off'</literal> or <literal>'stop'</literal>.
+        </para>
+        <para>
+            <literal>warning("on")</literal>, <literal>warning("off")</literal> and <literal>warning("stop")</literal> also affect hard-coded functions issuing warnings.
         </para>
     </refsection>
     <refsection>
         <title>Examples</title>
         <programlisting role="example"><![CDATA[ 
+w_flag = warning("query"); // remembering the warning flag
+
 warning('on') 
 warning('this is a warning')
 warning('off')
@@ -39,6 +53,17 @@ warning('query')
 warning('on')
 // Example with a localized message
 warning(msprintf(gettext("%s: Wrong number of input argument: %d expected.\n"),"myFunction",2));
+
+// Setting warning stop
+warning("stop")
+
+try
+    warning("this is a warning");
+catch
+    lasterror() // Warning message is considered an error
+end
+
+warning(w_flag); // resetting the warning flag
  ]]></programlisting>
     </refsection>
     <refsection role="see also">
diff --git a/scilab/modules/core/help/fr_FR/error_handling/warning.xml b/scilab/modules/core/help/fr_FR/error_handling/warning.xml
new file mode 100644 (file)
index 0000000..50174e2
--- /dev/null
@@ -0,0 +1,86 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<refentry xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:svg="http://www.w3.org/2000/svg" xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:db="http://docbook.org/ns/docbook" xmlns:scilab="http://www.scilab.org" xml:lang="fr" xml:id="warning">
+    <refnamediv>
+        <refname>warning</refname>
+        <refpurpose>Messages d'avertissement à l'attention des utilisateurs</refpurpose>
+    </refnamediv>
+    <refsynopsisdiv>
+        <title>Séquence d'appel</title>
+        <synopsis>warning('string')
+            warning('off')
+            warning('on')
+            warning('stop')
+            mode = warning('query')
+        </synopsis>
+    </refsynopsisdiv>
+    <refsection>
+        <title>Description</title>
+        <para>
+            <literal>warning('string')</literal> affiche le message 
+            <literal>'string'</literal> comme avertissement à l'utilisateur.
+        </para>
+        <para>
+            <literal>warning(string_matrix)</literal> affiche chaque élément de <literal>string_matrix</literal> 
+            comme avertissement à l'utilisateur.
+        </para>
+        <para>
+            <literal>'on'</literal> active les messages d'avertissement, l'exécution des scripts n'est pas interrompue après affichage d'un message d'avertissement.
+        </para>
+        <para>
+            <literal>'off'</literal> désactive les messages d'avertissement, les messages d'avertissements sont ignorés (ni affichés ni bloquant l'exécution des scripts).
+        </para>
+        <para>
+            <literal>'stop'</literal> active les messages d'avertissement et interrompt l'exécution d'un script dès qu'un message d'avertissement est rencontré.
+        </para>
+        <para>
+            <literal>'query'</literal> récupère l'état actuel des messages d'avertissement <literal>'on'</literal>, <literal>'off'</literal> ou <literal>'stop'</literal>.
+        </para>
+<para>
+            <literal>warning("on")</literal>, <literal>warning("off")</literal> et <literal>warning("stop")</literal> affectent aussi l'affichage des messages d'avertissement pour les fonctions programmées en dur en plus des messages d'avertissement pour les scripts.
+        </para>
+    </refsection>
+    <refsection>
+        <title>Exemples</title>
+        <programlisting role="example"><![CDATA[ 
+w_flag = warning("query"); // enregistre l'état des messages d'avertissement
+
+warning('on') 
+warning('ceci est un avertissement')
+warning('off')
+warning('ceci est un avertissement')
+warning('query')
+warning('on')
+// Exemple avec un message sujet à localisation
+warning(msprintf(gettext("%s: Wrong number of input argument: %d expected.\n"),"myFunction",2));
+
+// Activation de l'arrêt sur avertissement
+warning("stop")
+
+try
+    warning("ceci est un avertissement");
+catch
+    lasterror() // L'avertissement est considéré comme une erreur
+end
+
+warning(w_flag); // Repositionnement de l'état des messages d'avertissement
+ ]]></programlisting>
+    </refsection>
+    <refsection role="see also">
+        <title>Voir aussi</title>
+        <simplelist type="inline">
+            <member>
+                <link linkend="error">error</link>
+            </member>
+            <member>
+                <link linkend="gettext">gettext</link>
+            </member>
+            <member>
+                <link linkend="msprintf">msprintf</link>
+            </member>
+            <member>
+                <link linkend="messagebox">messagebox</link>
+            </member>
+        </simplelist>
+    </refsection>
+</refentry>
+
index 3f08c78..bd6a267 100644 (file)
@@ -25,10 +25,13 @@ extern "C"
 #include "Scierror.h"
 #include "sci_malloc.h"
 #include "os_string.h"
+#include "Sciwarning.h"
 }
 /*--------------------------------------------------------------------------*/
 types::Function::ReturnValue sci_warning(types::typed_list &in, int _iRetCount, types::typed_list &out)
 {
+    types::String *psInput = NULL;
+
     if (in.size() != 1)
     {
         Scierror(77, _("%s: Wrong number of input argument(s): %d expected.\n"), "warning", 1);
@@ -47,20 +50,29 @@ types::Function::ReturnValue sci_warning(types::typed_list &in, int _iRetCount,
         return types::Function::Error;
     }
 
-    types::String *psInput = in[0]->getAs<types::String>();
+    psInput = in[0]->getAs<types::String>();
 
     if (psInput->getSize() == 1)
     {
-        /* "on" "off" "query" */
+        /* "on" "off" "query" "stop" */
         if (wcscmp(psInput->get(0), L"on") == 0)
         {
             setWarningMode(TRUE);
+            setWarningStop(FALSE);
             return types::Function::OK;
         }
 
         if (wcscmp(psInput->get(0), L"off") == 0)
         {
             setWarningMode(FALSE);
+            setWarningStop(FALSE);
+            return types::Function::OK;
+        }
+
+        if (wcscmp(psInput->get(0), L"stop") == 0)
+        {
+            setWarningMode(TRUE);
+            setWarningStop(TRUE);
             return types::Function::OK;
         }
 
@@ -68,7 +80,16 @@ types::Function::ReturnValue sci_warning(types::typed_list &in, int _iRetCount,
         {
             if (getWarningMode())
             {
-                out.push_back(new types::String(L"on"));
+                if (getWarningStop())
+                {
+                    // WarningMode and WarningStop => warning stop mode active
+                    out.push_back(new types::String(L"stop"));
+                }
+                else
+                {
+                    // WarningMode and !WarningStop => warning on  mode active
+                    out.push_back(new types::String(L"on"));
+                }
             }
             else
             {
@@ -89,6 +110,11 @@ types::Function::ReturnValue sci_warning(types::typed_list &in, int _iRetCount,
             scilabForcedWriteW(pwstToPrint);
             FREE(pwstToPrint);
         }
+
+        if (getWarningStop())
+        {
+            Sciwarning("");
+        }
     }
 
 
diff --git a/scilab/modules/core/tests/unit_tests/warning.dia.ref b/scilab/modules/core/tests/unit_tests/warning.dia.ref
new file mode 100644 (file)
index 0000000..2d3f510
--- /dev/null
@@ -0,0 +1,57 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2015 - Scilab Enterprises - Pierre-Aime Agnel
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+// <-- CLI SHELL MODE -->
+//
+// <-- ENGLISH ONLY -->
+// Testing warning modes
+warning("on");
+assert_checkequal(warning("query"), "on");
+warning("off");
+assert_checkequal(warning("query"), "off");
+warning("stop");
+assert_checkequal(warning("query"), "stop");
+// Testing warning stop mode
+warning("stop");
+str = "";
+try
+    warning("this is a warning");
+catch
+    str = lasterror();
+end
+WARNING: this is a warning
+str //display str
+str  = 
+!*** Execution stopped after a warning. ***                !
+!                                                          !
+!Set warning("on") to continue execution after a warning.  !
+assert_checktrue(str <> "");
+//Testing waring on mode
+warning("on");
+str = "";
+try
+    warning("this is a warning");
+catch
+    str = lasterror();
+end
+WARNING: this is a warning
+str //display str
+str  = 
+assert_checktrue(str == "");
+//Testing waring off mode
+warning("on");
+str = "";
+try
+    warning("this is a warning");
+catch
+    str = lasterror();
+end
+WARNING: this is a warning
+str //display str
+str  = 
+assert_checktrue(str == "");
diff --git a/scilab/modules/core/tests/unit_tests/warning.tst b/scilab/modules/core/tests/unit_tests/warning.tst
new file mode 100644 (file)
index 0000000..f7a8933
--- /dev/null
@@ -0,0 +1,51 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2015 - Scilab Enterprises - Pierre-Aime Agnel
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+// <-- CLI SHELL MODE -->
+//
+// <-- ENGLISH ONLY -->
+
+// Testing warning modes
+warning("on");
+assert_checkequal(warning("query"), "on");
+warning("off");
+assert_checkequal(warning("query"), "off");
+warning("stop");
+assert_checkequal(warning("query"), "stop");
+
+// Testing warning stop mode
+warning("stop");
+str = "";
+try
+    warning("this is a warning");
+catch
+    str = lasterror();
+end
+str //display str
+assert_checktrue(str <> "");
+
+
+//Testing waring on mode
+warning("on");
+str = "";
+try
+    warning("this is a warning");
+catch
+    str = lasterror();
+end
+str //display str
+assert_checktrue(str == "");
+
+//Testing waring off mode
+warning("on");
+str = "";
+try
+    warning("this is a warning");
+catch
+    str = lasterror();
+end
+str //display str
+assert_checktrue(str == "");
index 8537b85..71f9a59 100644 (file)
@@ -21,6 +21,7 @@
 #include "localization.h"
 #include "sciprint.h"
 #include "configvariable_interface.h"
+#include "Sciwarning.h"
 
 /*--------------------------------------------------------------------------*/
 int sci_log10(char *fname, void* pvApiCtx)
@@ -99,7 +100,7 @@ int sci_log10(char *fname, void* pvApiCtx)
 
         if (getieee() == 1)
         {
-            sciprint(_("Warning : singularity of 'log' or 'tan' function.\n"));
+            Sciwarning(_("Warning : singularity of 'log' or 'tan' function.\n"));
         }
     }
 
index 38034fe..1397280 100644 (file)
@@ -25,6 +25,7 @@
 #include "sciprint.h"
 #include "os_string.h"
 #include "charEncoding.h"
+#include "Sciwarning.h"
 /*--------------------------------------------------------------------------*/
 #ifndef _MSC_VER
 static BOOL find_spec( char *filename , char *filespec);
@@ -77,7 +78,7 @@ wchar_t** findfilesW(const wchar_t *path, const wchar_t *filespec, int *sizeList
         {
             char* pstPath = wide_string_to_UTF8(path);
             char* pstError = wide_string_to_UTF8(_wcserror(errno));
-            sciprint(_("Warning: Could not open directory %s: %s\n"), pstPath, pstError);
+            Sciwarning(_("Warning: Could not open directory %s: %s\n"), pstPath, pstError);
             FREE(pstPath);
             FREE(pstError);
         }
@@ -151,7 +152,7 @@ char **findfiles(const char *path, const char *filespec, int *sizeListReturned,
     {
         if (warning)
         {
-            sciprint(_("Warning: Could not open directory %s: %s\n"), path, strerror(errno));
+            Sciwarning(_("Warning: Could not open directory %s: %s\n"), path, strerror(errno));
         }
     }
 
index a481286..12ebe3e 100644 (file)
@@ -32,6 +32,7 @@
 #include "sci_malloc.h"
 #include "charEncoding.h"
 #include "os_string.h"
+#include "Sciwarning.h"
 /*--------------------------------------------------------------------------*/
 #ifdef _MSC_VER
 static int DeleteDirectory(wchar_t *refcstrRootDirectory);
@@ -262,7 +263,7 @@ static int DeleteDirectory(char *refcstrRootDirectory)
 
     if (dir == NULL)
     {
-        sciprint(_("Warning: Error while opening %s: %s\n"), refcstrRootDirectory, strerror(errno));
+        Sciwarning(_("Warning: Error while opening %s: %s\n"), refcstrRootDirectory, strerror(errno));
         return -1;
     }
 
@@ -287,7 +288,7 @@ static int DeleteDirectory(char *refcstrRootDirectory)
             /* Not a directory... It must be a file (at least, I hope it is a file */
             if (remove(filename) != 0)
             {
-                sciprint(_("Warning: Could not remove file %s: %s\n"), filename, strerror(errno));
+                Sciwarning(_("Warning: Could not remove file %s: %s\n"), filename, strerror(errno));
             }
 
             FREE(filename);
@@ -295,7 +296,7 @@ static int DeleteDirectory(char *refcstrRootDirectory)
     }
     if (rmdir(refcstrRootDirectory) != 0)
     {
-        sciprint(_("Warning: Could not remove directory %s: %s\n"), refcstrRootDirectory, strerror(errno));
+        Sciwarning(_("Warning: Could not remove directory %s: %s\n"), refcstrRootDirectory, strerror(errno));
     }
 
     if (dir)
index d05008f..9243859 100644 (file)
@@ -46,6 +46,7 @@
 #include "getGraphicObjectProperty.h"
 #include "setGraphicObjectProperty.h"
 #include "graphicObjectProperties.h"
+#include "Sciwarning.h"
 
 //#include "../../../tclsci/includes/GedManagement.h"
 
@@ -94,7 +95,7 @@ void sciGetDisplayedBounds(int iSubWinUID,
     {
         if (sciGetLogExponent(*xmin, *xmax, xmin, xmax) != 0)
         {
-            sciprint(_("Warning: Can't use Log on X-axis xmin is negative.\n"));
+            Sciwarning(_("Warning: Can't use Log on X-axis xmin is negative.\n"));
         }
     }
 
@@ -107,7 +108,7 @@ void sciGetDisplayedBounds(int iSubWinUID,
     {
         if (sciGetLogExponent(*ymin, *ymax, ymin, ymax) != 0)
         {
-            sciprint(_("Warning: Can't use Log on Y-axis ymin is negative.\n"));
+            Sciwarning(_("Warning: Can't use Log on Y-axis ymin is negative.\n"));
         }
     }
 
@@ -120,7 +121,7 @@ void sciGetDisplayedBounds(int iSubWinUID,
     {
         if (sciGetLogExponent(*zmin, *zmax, zmin, zmax) != 0)
         {
-            sciprint(_("Warning: Can't use Log on Z-axis zmin is negative.\n"));
+            Sciwarning(_("Warning: Can't use Log on Z-axis zmin is negative.\n"));
         }
     }
 }
index 8ae4d5e..cd2bab9 100644 (file)
@@ -39,6 +39,7 @@
 #include "graphicObjectProperties.h"
 #include "CurrentSubwin.h"
 #include "CurrentObject.h"
+#include "Sciwarning.h"
 
 /**
  * Before Scilab 5.1, default colout was [-1, -1].
@@ -213,7 +214,7 @@ int C2F(fec)(double *x, double *y, double *triangles, double *func, int *Nnode,
         }
         else
         {
-            sciprint(_("Warning: Nax does not work with logarithmic scaling.\n"));
+            Sciwarning(_("Warning: Nax does not work with logarithmic scaling.\n"));
         }
     }
 
index 39d6825..19fdb1c 100644 (file)
@@ -48,6 +48,7 @@
 
 #include "getGraphicObjectProperty.h"
 #include "graphicObjectProperties.h"
+#include "Sciwarning.h"
 
 #define MAX(A,B) ((A<B)?B:A)
 
@@ -1105,7 +1106,7 @@ int ComputeXIntervals(int iObjUID, char xy_type, double ** vector, int * N, int
         {
             if (nval != 3)
             {
-                sciprint(_("Warning: %s must be changed, %s is '%s' and %s dimension is not %d.\n"), "tics_coord", "xy_type", "r", "tics_coord", 3);
+                Sciwarning(_("Warning: %s must be changed, %s is '%s' and %s dimension is not %d.\n"), "tics_coord", "xy_type", "r", "tics_coord", 3);
             }
 
             if (nval < 3)
@@ -1142,7 +1143,7 @@ int ComputeXIntervals(int iObjUID, char xy_type, double ** vector, int * N, int
         {
             if (nval != 4)
             {
-                sciprint(_("Warning: %s must be changed, %s is '%s' and %s dimension is not %d.\n"), "tics_coord", "xy_type", "i", "tics_coord", 4);
+                Sciwarning(_("Warning: %s must be changed, %s is '%s' and %s dimension is not %d.\n"), "tics_coord", "xy_type", "i", "tics_coord", 4);
             }
 
             if (nval < 4)
index e7c2ae7..c738ead 100644 (file)
@@ -39,6 +39,7 @@
 #include "graphicObjectProperties.h"
 #include "CurrentSubwin.h"
 #include "CurrentObject.h"
+#include "Sciwarning.h"
 
 int C2F(xgray)(double *x, double *y, double *z, int *n1, int *n2, char *strflag, double *brect, int *aaint, BOOL flagNax, char *logflags, long int l1)
 {
@@ -192,7 +193,7 @@ int C2F(xgray)(double *x, double *y, double *z, int *n1, int *n2, char *strflag,
         }
         else
         {
-            sciprint(_("Warning: Nax does not work with logarithmic scaling.\n"));
+            Sciwarning(_("Warning: Nax does not work with logarithmic scaling.\n"));
         }
     }
 
@@ -343,7 +344,7 @@ int C2F(implot)(unsigned char *z, int *n1, int *n2, char *strflag, double *brect
         }
         else
         {
-            sciprint(_("Warning: Nax does not work with logarithmic scaling.\n"));
+            Sciwarning(_("Warning: Nax does not work with logarithmic scaling.\n"));
         }
     }
 
@@ -496,7 +497,7 @@ int C2F(xgray1)(double *z, int *n1, int *n2, char *strflag, double *brect, int *
         }
         else
         {
-            sciprint(_("Warning: Nax does not work with logarithmic scaling.\n"));
+            Sciwarning(_("Warning: Nax does not work with logarithmic scaling.\n"));
         }
     }
 
index b474e79..b1d54aa 100644 (file)
@@ -49,6 +49,7 @@
 #include "CurrentFigure.h"
 #include "CurrentSubwin.h"
 #include "CurrentObject.h"
+#include "Sciwarning.h"
 
 /*--------------------------------------------------------------------
  *  plot2dn(ptype,Logflags,x,y,n1,n2,style,strflag,legend,brect,aaint,lstr1,lstr2)
@@ -388,7 +389,7 @@ int plot2dn(int ptype, char *logflags, double *x, double *y, int *n1, int *n2, i
         }
         else
         {
-            sciprint(_("Warning: Nax does not work with logarithmic scaling.\n"));
+            Sciwarning(_("Warning: Nax does not work with logarithmic scaling.\n"));
         }
 
     }
index d857e17..7d07381 100644 (file)
@@ -34,6 +34,7 @@
 #include "setGraphicObjectProperty.h"
 #include "getGraphicObjectProperty.h"
 #include "graphicObjectProperties.h"
+#include "Sciwarning.h"
 
 /*------------------------------------------------------------------------*/
 int set_box_property(void* _pvCtx, int iObjUID, void* _pvData, int valueType, int nbRow, int nbCol)
@@ -77,7 +78,7 @@ int set_box_property(void* _pvCtx, int iObjUID, void* _pvData, int valueType, in
         }
         else if (stricmp((char*)_pvData, "hidden_axis") == 0)
         {
-            sciprint(_("WARNING !!!\nIn '%s' property: '%s' is deprecated use '%s' instead.\n"), "box", "hidden_axis", "hidden_axes");
+            Sciwarning(_("WARNING !!!\nIn '%s' property: '%s' is deprecated use '%s' instead.\n"), "box", "hidden_axis", "hidden_axes");
             boxType = 2;
         }
         else
index f02e7bb..bfb82ef 100644 (file)
@@ -29,6 +29,7 @@
 
 #include "setGraphicObjectProperty.h"
 #include "graphicObjectProperties.h"
+#include "Sciwarning.h"
 
 /*------------------------------------------------------------------------*/
 int set_color_range_property(void* _pvCtx, int iObjUID, void* _pvData, int valueType, int nbRow, int nbCol)
@@ -57,7 +58,7 @@ int set_color_range_property(void* _pvCtx, int iObjUID, void* _pvData, int value
             || values[1] > nbColors || values[1] < 0)
     {
         /* It is possible to set color_range outside the colormap, however it won't be used.*/
-        sciprint(_("WARNING: Wrong value for '%s' property: indices outside the colormap will be clamped.\n"), "color_range");
+        Sciwarning(_("WARNING: Wrong value for '%s' property: indices outside the colormap will be clamped.\n"), "color_range");
     }
 
     status = setGraphicObjectProperty(iObjUID, __GO_COLOR_RANGE__, values, jni_int_vector, 2);
index 9ef0ea0..9ab4aef 100644 (file)
@@ -27,6 +27,7 @@
 #include "SetPropertyStatus.h"
 #include "sciprint.h"
 #include "configvariable_interface.h"
+#include "Sciwarning.h"
 
 /*------------------------------------------------------------------------*/
 int set_line_style_property(void* _pvCtx, int iObjUID, void* _pvData, int valueType, int nbRow, int nbCol)
@@ -45,7 +46,7 @@ int set_line_style_property(void* _pvCtx, int iObjUID, void* _pvData, int valueT
     {
         sciprint(_("WARNING: %s\n"), _("{0,1} values are equivalent for line_style property."));
         sciprint(_("WARNING: %s\n"), _("0 will be removed after Scilab 5.4.0."));
-        sciprint(_("WARNING: %s\n"), _("Please use 1 instead."));
+        Sciwarning(_("WARNING: %s\n"), _("Please use 1 instead."));
     }
 
     return sciSetLineStyle(iObjUID, iLineStyle);
index 9af2dd2..b2ee6ab 100644 (file)
@@ -37,6 +37,7 @@
 #include "getGraphicObjectProperty.h"
 #include "setGraphicObjectProperty.h"
 #include "graphicObjectProperties.h"
+#include "Sciwarning.h"
 
 /*--------------------------------------------------------------------------*/
 char ** ReBuildUserTicks(char old_logflag, char new_logflag, double* u_xgrads, int *u_nxgrads, char ** u_xlabels);
@@ -56,7 +57,7 @@ char ** CaseLogflagN2L(int * u_nxgrads, double *u_xgrads, char ** u_xlabels)
     {
         if (u_xgrads[i] <= 0)
         {
-            sciprint("Warning: graduation number %d is ignored : when switching to logarithmic scale, we must have strictly positive graduations!\n", i);
+            Sciwarning("Warning: graduation number %d is ignored : when switching to logarithmic scale, we must have strictly positive graduations!\n", i);
         }
         else
         {
index d19ccbb..770a21b 100644 (file)
@@ -28,6 +28,7 @@
 
 #include "setGraphicObjectProperty.h"
 #include "graphicObjectProperties.h"
+#include "Sciwarning.h"
 
 /*------------------------------------------------------------------------*/
 int set_outside_colors_property(void* _pvCtx, int iObjUID, void* _pvData, int valueType, int nbRow, int nbCol)
@@ -57,7 +58,7 @@ int set_outside_colors_property(void* _pvCtx, int iObjUID, void* _pvData, int va
             || values[1] > nbColors || values[1] < -1)
     {
         /* It is possible to set color_range outside the colormap, however it won't be used.*/
-        sciprint(_("WARNING: Wrong value for '%s' property: indices outside the colormap will be clamped.\n"), "outside_colors");
+        Sciwarning(_("WARNING: Wrong value for '%s' property: indices outside the colormap will be clamped.\n"), "outside_colors");
     }
 
     status = setGraphicObjectProperty(iObjUID, __GO_OUTSIDE_COLOR__, values, jni_int_vector, 2);
index 5786726..7f651dc 100644 (file)
@@ -26,6 +26,7 @@
 #include "setGraphicObjectProperty.h"
 #include "configvariable_interface.h"
 #include "sciprint.h"
+#include "Sciwarning.h"
 /*--------------------------------------------------------------------------*/
 int sci_mpopup(char *fname, void* pvApiCtx)
 {
@@ -48,7 +49,7 @@ int sci_mpopup(char *fname, void* pvApiCtx)
     {
         sciprint(_("%s: Feature %s is obsolete.\n"), _("Warning"), fname);
         sciprint(_("%s: Please use %s instead.\n"), _("Warning"), "uicontextmenu");
-        sciprint(_("%s: This feature will be permanently removed in Scilab %s\n\n"), _("Warning"), "5.4.1");
+        Sciwarning(_("%s: This feature will be permanently removed in Scilab %s\n\n"), _("Warning"), "5.4.1");
     }
 
     sciErr = getVarAddressFromPosition(pvApiCtx, 1, &piAddr);
index 3a2aa60..fe7a8a9 100644 (file)
@@ -21,6 +21,7 @@
 #include "configvariable_interface.h"
 #include "localization.h"
 #include "scisparse.h"
+#include "Sciwarning.h"
 /*--------------------------------------------------------------------------*/
 /* fortran subroutines */
 extern int C2F(qpgen2)(double *dmat, double *dvec, int *fddmat, int *n,
@@ -375,14 +376,14 @@ int sci_qp_solve(char *fname,  void* pvApiCtx)
         {
             if (getWarningMode())
             {
-                sciprint(_("\n%s: Warning: The minimization problem has no solution. The results may be inaccurate.\n\n"), fname);
+                Sciwarning(_("\n%s: Warning: The minimization problem has no solution. The results may be inaccurate.\n\n"), fname);
             }
         }
         else if (*ierr == 2)
         {
             if (getWarningMode())
             {
-                sciprint(_("\n%s: Warning: Q is not symmetric positive definite. The results may be inaccurate.\n\n"), fname);
+                Sciwarning(_("\n%s: Warning: Q is not symmetric positive definite. The results may be inaccurate.\n\n"), fname);
             }
         }
         ReturnArguments(pvApiCtx);
index bb32c23..948a7b6 100644 (file)
@@ -17,7 +17,8 @@ OUTPUT_STREAM_CPP_SOURCES = \
        src/cpp/getDiaryDate.cpp \
        src/cpp/getUniqueFilename.cpp \
        src/cpp/scilab_sprintf.cpp \
-       src/cpp/basout.cpp
+       src/cpp/basout.cpp \
+       src/cpp/Sciwarning.cpp
 
 
 GATEWAY_CPP_SOURCES = \
index 00a0fee..e176aaa 100644 (file)
@@ -198,7 +198,8 @@ am__objects_2 = src/cpp/libscioutput_stream_algo_la-Diary.lo \
        src/cpp/libscioutput_stream_algo_la-getDiaryDate.lo \
        src/cpp/libscioutput_stream_algo_la-getUniqueFilename.lo \
        src/cpp/libscioutput_stream_algo_la-scilab_sprintf.lo \
-       src/cpp/libscioutput_stream_algo_la-basout.lo
+       src/cpp/libscioutput_stream_algo_la-basout.lo \
+       src/cpp/libscioutput_stream_algo_la-Sciwarning.lo
 am__objects_3 = src/fortran/wspdsp.lo src/fortran/wmdsp.lo \
        src/fortran/strdsp.lo src/fortran/lspdsp.lo \
        src/fortran/fmttyp.lo src/fortran/fmt.lo src/fortran/dspdsp.lo \
@@ -626,7 +627,8 @@ OUTPUT_STREAM_CPP_SOURCES = \
        src/cpp/getDiaryDate.cpp \
        src/cpp/getUniqueFilename.cpp \
        src/cpp/scilab_sprintf.cpp \
-       src/cpp/basout.cpp
+       src/cpp/basout.cpp \
+       src/cpp/Sciwarning.cpp
 
 GATEWAY_CPP_SOURCES = \
        sci_gateway/cpp/sci_diary.cpp \
@@ -926,6 +928,8 @@ src/cpp/libscioutput_stream_algo_la-scilab_sprintf.lo:  \
        src/cpp/$(am__dirstamp) src/cpp/$(DEPDIR)/$(am__dirstamp)
 src/cpp/libscioutput_stream_algo_la-basout.lo:  \
        src/cpp/$(am__dirstamp) src/cpp/$(DEPDIR)/$(am__dirstamp)
+src/cpp/libscioutput_stream_algo_la-Sciwarning.lo:  \
+       src/cpp/$(am__dirstamp) src/cpp/$(DEPDIR)/$(am__dirstamp)
 src/fortran/$(am__dirstamp):
        @$(MKDIR_P) src/fortran
        @: > src/fortran/$(am__dirstamp)
@@ -1019,6 +1023,7 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote@src/c/$(DEPDIR)/libscioutput_stream_algo_la-sciprint_full.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@src/cpp/$(DEPDIR)/libscioutput_stream_algo_la-Diary.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@src/cpp/$(DEPDIR)/libscioutput_stream_algo_la-DiaryList.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/cpp/$(DEPDIR)/libscioutput_stream_algo_la-Sciwarning.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@src/cpp/$(DEPDIR)/libscioutput_stream_algo_la-basout.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@src/cpp/$(DEPDIR)/libscioutput_stream_algo_la-diary_manager.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@src/cpp/$(DEPDIR)/libscioutput_stream_algo_la-getDiaryDate.Plo@am__quote@
@@ -1200,6 +1205,13 @@ src/cpp/libscioutput_stream_algo_la-basout.lo: src/cpp/basout.cpp
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libscioutput_stream_algo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/cpp/libscioutput_stream_algo_la-basout.lo `test -f 'src/cpp/basout.cpp' || echo '$(srcdir)/'`src/cpp/basout.cpp
 
+src/cpp/libscioutput_stream_algo_la-Sciwarning.lo: src/cpp/Sciwarning.cpp
+@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libscioutput_stream_algo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/cpp/libscioutput_stream_algo_la-Sciwarning.lo -MD -MP -MF src/cpp/$(DEPDIR)/libscioutput_stream_algo_la-Sciwarning.Tpo -c -o src/cpp/libscioutput_stream_algo_la-Sciwarning.lo `test -f 'src/cpp/Sciwarning.cpp' || echo '$(srcdir)/'`src/cpp/Sciwarning.cpp
+@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) src/cpp/$(DEPDIR)/libscioutput_stream_algo_la-Sciwarning.Tpo src/cpp/$(DEPDIR)/libscioutput_stream_algo_la-Sciwarning.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='src/cpp/Sciwarning.cpp' object='src/cpp/libscioutput_stream_algo_la-Sciwarning.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libscioutput_stream_algo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/cpp/libscioutput_stream_algo_la-Sciwarning.lo `test -f 'src/cpp/Sciwarning.cpp' || echo '$(srcdir)/'`src/cpp/Sciwarning.cpp
+
 sci_gateway/cpp/libscioutput_stream_la-sci_diary.lo: sci_gateway/cpp/sci_diary.cpp
 @am__fastdepCXX_TRUE@  $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libscioutput_stream_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT sci_gateway/cpp/libscioutput_stream_la-sci_diary.lo -MD -MP -MF sci_gateway/cpp/$(DEPDIR)/libscioutput_stream_la-sci_diary.Tpo -c -o sci_gateway/cpp/libscioutput_stream_la-sci_diary.lo `test -f 'sci_gateway/cpp/sci_diary.cpp' || echo '$(srcdir)/'`sci_gateway/cpp/sci_diary.cpp
 @am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) sci_gateway/cpp/$(DEPDIR)/libscioutput_stream_la-sci_diary.Tpo sci_gateway/cpp/$(DEPDIR)/libscioutput_stream_la-sci_diary.Plo
diff --git a/scilab/modules/output_stream/includes/Sciwarning.h b/scilab/modules/output_stream/includes/Sciwarning.h
new file mode 100644 (file)
index 0000000..376da9b
--- /dev/null
@@ -0,0 +1,20 @@
+/*
+ * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+ * Copyright (C) Scilab Enterprises - 2015 - Pierre-Aime Agnel
+ *
+ * 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.1-en.txt
+ *
+ */
+
+#ifndef SCIWARNING_H
+#define SCIWARNING_H
+
+#include "dynlib_output_stream.h"
+
+OUTPUT_STREAM_IMPEXP int Sciwarning(const char *msg, ...);
+
+#endif // SCIWARNING_H
index cdbbc6b..8bd8118 100644 (file)
@@ -6,3 +6,5 @@ setLastError
 isPromptShow
 getSilentError
 getConsoleWidth
+getWarningMode
+getWarningStop
\ No newline at end of file
index 1dac924..913b2ed 100644 (file)
@@ -212,6 +212,7 @@ lib /DEF:"$(ProjectDir)Fileio_Import.def" /SUBSYSTEM:WINDOWS /MACHINE:$(Platform
   <ItemGroup>
     <ClCompile Include="..\cpp\basout.cpp" />
     <ClCompile Include="..\cpp\getUniqueFilename.cpp" />
+    <ClCompile Include="..\cpp\Sciwarning.cpp" />
     <ClCompile Include="cerro.c" />
     <ClCompile Include="..\cpp\Diary.cpp" />
     <ClCompile Include="..\cpp\diary_manager.cpp" />
@@ -265,6 +266,7 @@ lib /DEF:"$(ProjectDir)Fileio_Import.def" /SUBSYSTEM:WINDOWS /MACHINE:$(Platform
     <ClInclude Include="..\..\includes\scilab_sprintf.hxx" />
     <ClInclude Include="..\..\includes\sciprint.h" />
     <ClInclude Include="..\..\includes\sciprint_full.h" />
+    <ClInclude Include="..\..\includes\Sciwarning.h" />
     <ClInclude Include="..\cpp\Diary.hxx" />
     <ClInclude Include="..\cpp\DiaryList.hxx" />
     <ClInclude Include="..\cpp\DiaryModesEnum.hxx" />
index 4c477eb..ecda6fd 100644 (file)
@@ -80,6 +80,9 @@
     <ClCompile Include="..\cpp\getUniqueFilename.cpp">
       <Filter>Source Files</Filter>
     </ClCompile>
+    <ClCompile Include="..\cpp\Sciwarning.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
   </ItemGroup>
   <ItemGroup>
     <None Include="output_stream_export.def">
     <ClInclude Include="..\cpp\getUniqueFilename.hxx">
       <Filter>Header Files</Filter>
     </ClInclude>
+    <ClInclude Include="..\..\includes\Sciwarning.h">
+      <Filter>Header Files</Filter>
+    </ClInclude>
   </ItemGroup>
   <ItemGroup>
-    <None Include="Console_Import.def">
-      <Filter>Libraries Dependencies\Imports</Filter>
-    </None>
     <None Include="core_import.def">
       <Filter>Libraries Dependencies\Imports</Filter>
     </None>
-    <None Include="Localization_Import.def">
-      <Filter>Libraries Dependencies\Imports</Filter>
-    </None>
-    <None Include="output_stream_f_Import.def">
-      <Filter>Libraries Dependencies\Imports</Filter>
-    </None>
-    <None Include="String_Import.def">
-      <Filter>Libraries Dependencies\Imports</Filter>
-    </None>
     <None Include="output_stream_export.def">
       <Filter>Libraries Dependencies\Export</Filter>
     </None>
diff --git a/scilab/modules/output_stream/src/cpp/Sciwarning.cpp b/scilab/modules/output_stream/src/cpp/Sciwarning.cpp
new file mode 100644 (file)
index 0000000..f39ce6e
--- /dev/null
@@ -0,0 +1,43 @@
+/*
+ * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+ * Copyright (C) Scilab Enterprises - 2015 - Pierre-Aime Agnel
+ *
+ * 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.1-en.txt
+ *
+ */
+
+#include "scilabexception.hxx"
+
+extern "C"
+{
+#include "sciprint.h"
+#include "Sciwarning.h"
+#include "configvariable_interface.h"
+}
+
+
+int Sciwarning(const char *msg, ...)
+{
+    int retval = 0;
+    if (getWarningMode())
+    {
+        //print warning message
+        va_list ap;
+        va_start(ap, msg);
+        scivprint(msg, ap);
+        va_end(ap);
+
+        if (getWarningStop())
+        {
+            // Configuration variable WarningStop is set to true
+            // Warning becomes an error and throws the ast exception
+            // to retrieve the line the error was generated at
+            throw ast::InternalError(_("*** Execution stopped after a warning. ***\nSet warning(\"on\") to continue execution after a warning.\n"));
+        }
+    }
+    return retval;
+}
index 286c9f8..de22b40 100644 (file)
@@ -62,6 +62,7 @@
 #include "others_generators.h"
 #include "localization.h"
 #include "configvariable_interface.h"
+#include "Sciwarning.h"
 
 /***********************************************************************/
 /* Private part.                                                       */
@@ -239,7 +240,7 @@ int set_seed_clcg4(int g, double s0, double s1, double s2, double s3)
         init_generator_clcg4(g, InitialSeed);
         if (getWarningMode())
         {
-            sciprint(_("WARNING: %s\n"), _("be aware that you may have lost synchronization\n    between the virtual generator %d and the others.\n    use grand(\"setall\", s1, s2, s3, s4) if you want to recover it."), g);
+            Sciwarning(_("WARNING: %s\n"), _("be aware that you may have lost synchronization\n    between the virtual generator %d and the others.\n    use grand(\"setall\", s1, s2, s3, s4) if you want to recover it."), g);
         }
         return ( 1 );
     }
index ece4852..db64e8b 100644 (file)
@@ -87,6 +87,7 @@
 #include "localization.h"
 #include "charEncoding.h"
 #include "common_structure.h"
+#include "Sciwarning.h"
 
 /*--------------------------------------------------------------------------*/
 typedef struct
@@ -4122,7 +4123,7 @@ static int simblk(realtype t, N_Vector yy, N_Vector yp, void *f_data)
         {
             if ((xd[i] - xd[i] != 0))
             {
-                sciprint(_("\nWarning: The computing function #%d returns a NaN/Inf"), i);
+                Sciwarning(_("\nWarning: The computing function #%d returns a NaN/Inf"), i);
                 nantest = 1;
                 break;
             }
@@ -4157,7 +4158,7 @@ static int grblk(realtype t, N_Vector yy, realtype *gout, void *g_data)
         for (jj = 0; jj < ng; jj++)
             if (gout[jj] - gout[jj] != 0)
             {
-                sciprint(_("\nWarning: The zero_crossing function #%d returns a NaN/Inf"), jj);
+                Sciwarning(_("\nWarning: The zero_crossing function #%d returns a NaN/Inf"), jj);
                 nantest = 1;
                 break;
             } /* NaN checking */
@@ -4194,7 +4195,7 @@ static void simblklsodar(int * nequations, realtype * tOld, realtype * actual, r
         {
             if ((res[i] - res[i] != 0))
             {
-                sciprint(_("\nWarning: The computing function #%d returns a NaN/Inf"), i);
+                Sciwarning(_("\nWarning: The computing function #%d returns a NaN/Inf"), i);
             }
         }
     }
@@ -4219,7 +4220,7 @@ static void grblklsodar(int * nequations, realtype * tOld, realtype * actual, in
         {
             if (res[jj] - res[jj] != 0)
             {
-                sciprint(_("\nWarning: The zero_crossing function #%d returns a NaN/Inf"), jj);
+                Sciwarning(_("\nWarning: The zero_crossing function #%d returns a NaN/Inf"), jj);
             } /* NaN checking */
         }
     }
@@ -4328,7 +4329,7 @@ static int grblkdaskr(realtype t, N_Vector yy, N_Vector yp, realtype *gout, void
         {
             if (gout[jj] - gout[jj] != 0)
             {
-                sciprint(_("\nWarning: The zero-crossing function #%d returns a NaN"), jj);
+                Sciwarning(_("\nWarning: The zero-crossing function #%d returns a NaN"), jj);
                 nantest = 1;
                 break;
             }
@@ -4373,7 +4374,7 @@ static void simblkddaskr(realtype *tOld, realtype *actual, realtype *actualP, re
         for (jj = 0; jj < *neq; jj++)
             if (res[jj] - res[jj] != 0) /* NaN checking */
             {
-                sciprint(_("\nWarning: The residual function #%d returns a NaN"), jj);
+                Sciwarning(_("\nWarning: The residual function #%d returns a NaN"), jj);
                 *flag = -1; /* recoverable error; */
                 return;
             }
@@ -4407,7 +4408,7 @@ static void grblkddaskr(int *nequations, realtype *tOld, realtype *actual, int *
         {
             if (res[jj] - res[jj] != 0)
             {
-                sciprint(_("\nWarning: The zero-crossing function #%d returns a NaN"), jj);
+                Sciwarning(_("\nWarning: The zero-crossing function #%d returns a NaN"), jj);
                 return;
             }
         }
@@ -4459,7 +4460,7 @@ static void jacpsol(realtype *res, int *ires, int *neq, realtype *tOld, realtype
                 /* NaN test */
                 if (wp[nrow + j] - wp[nrow + j] != 0)
                 {
-                    sciprint(_("\nWarning: The preconditioner evaluation function returns a NaN at index #%d."), nrow + j);
+                    Sciwarning(_("\nWarning: The preconditioner evaluation function returns a NaN at index #%d."), nrow + j);
                     *ier = -1;
                 }
             }
@@ -4503,7 +4504,7 @@ static void psol(int *neq, realtype *tOld, realtype *actual, realtype *actualP,
     {
         if (b[i] - b[i] != 0)
         {
-            sciprint(_("\nWarning: The preconditioner application function returns a NaN at index #%d."), i);
+            Sciwarning(_("\nWarning: The preconditioner application function returns a NaN at index #%d."), i);
             /* Indicate a recoverable error, meaning that the step will be retried with the same step size
                but with a call to 'jacpsol' to update necessary data, unless the Jacobian data is current,
                in which case the step will be retried with a smaller step size. */
@@ -4544,7 +4545,7 @@ static void addevs(double t, int *evtnb, int *ierr1)
                 {
                     sciprint(_("\n Warning: an event is reprogrammed at t=%g by removing another"), t );
                     sciprint(_("\n         (already programmed) event. There may be an error in"));
-                    sciprint(_("\n         your model. Please check your model\n"));
+                    Sciwarning(_("\n         your model. Please check your model\n"));
                     TCritWarning = 1;
                 }
                 do_cold_restart(); /* the erased event could be a critical
@@ -6943,7 +6944,7 @@ int simblkKinsol(N_Vector yy, N_Vector resval, void *rdata)
         {
             if (residual[jj] - residual[jj] != 0)
             {
-                sciprint(_("\nWarning: The initialization system #%d returns a NaN/Inf"), jj);
+                Sciwarning(_("\nWarning: The initialization system #%d returns a NaN/Inf"), jj);
                 nantest = 1;
                 break;
             }
index e325541..1daf728 100644 (file)
@@ -27,6 +27,7 @@
 #include "os_string.h"
 #include "csvDefault.h"
 #include "strsubst.h"
+#include "Sciwarning.h"
 // =============================================================================
 #if _MSC_VER
 #define READ_ONLY_TEXT_MODE "rt"
@@ -376,11 +377,7 @@ static int getNumbersOfColumnsInLines(const char **lines, int sizelines,
             {
                 if (previousNbColumns != NbColumns)
                 {
-                    if (getWarningMode())
-                    {
-                        sciprint(_("%s: Inconsistency found in the columns. At line %d, found %d columns while the previous had %d.\n"), _("Warning"), i + 1, NbColumns, previousNbColumns);
-                    }
-
+                    Sciwarning(_("%s: Inconsistency found in the columns. At line %d, found %d columns while the previous had %d.\n"), _("Warning"), i + 1, NbColumns, previousNbColumns);
                     return 0;
                 }
             }
index e1a29d5..cdd2ce0 100644 (file)
@@ -23,6 +23,7 @@
 #include <string.h>
 
 #include "api_scilab.h"
+#include "Sciwarning.h"
 
 int mod(int a, int b);
 int rotate(int i, int step, int length);
@@ -378,7 +379,7 @@ int CdfBase(char const * const fname, void* pvApiCtx, int inarg, int oarg, int s
         resc = checkInteger(row, col, datas, pos, fname);
         if (resc == 1)
         {
-            sciprint(_("%s: Warning: using non integer values for argument #%d may lead to incorrect results.\n"), fname, pos);
+            Sciwarning(_("%s: Warning: using non integer values for argument #%d may lead to incorrect results.\n"), fname, pos);
         }
     }
     if (pos1 != 0)
@@ -388,7 +389,7 @@ int CdfBase(char const * const fname, void* pvApiCtx, int inarg, int oarg, int s
         resc = checkInteger(row, col, datas, pos1, fname);
         if (resc == 1)
         {
-            sciprint(_("%s: Warning: using non integer values for argument #%d may lead to incorrect results.\n"), fname, pos1);
+            Sciwarning(_("%s: Warning: using non integer values for argument #%d may lead to incorrect results.\n"), fname, pos1);
         }
     }
 #define callpos(i) rotate(i, shift, inarg + oarg)
index e55f603..f935c3c 100644 (file)
@@ -65,6 +65,7 @@
 #include "common_umfpack.h"
 #include "localization.h"
 #include "configvariable_interface.h"
+#include "Sciwarning.h"
 
 CellAdr *ListNumeric = NULL;
 CellAdr *ListCholFactors = NULL;
@@ -220,7 +221,7 @@ int sci_umf_lufact(char* fname, void* pvApiCtx)
     {
         if (getWarningMode())
         {
-            sciprint("\n%s:%s\n", _("Warning"), _("The (square) matrix appears to be singular."));
+            Sciwarning("\n%s:%s\n", _("Warning"), _("The (square) matrix appears to be singular."));
         }
     }