* Bug #14159 fixed - Matplot crashed Scilab on boolean input.
[scilab.git] / scilab / modules / graphics / sci_gateway / cpp / sci_matplot.cpp
index ef3d815..19964ef 100644 (file)
@@ -23,7 +23,7 @@
 #include "string.hxx"
 #include "graphichandle.hxx"
 #include "overload.hxx"
-#include "execvisitor.hxx"
+#include "int.hxx"
 
 extern "C"
 {
@@ -65,10 +65,10 @@ types::Function::ReturnValue sci_matplot(types::typed_list &in, types::optional_
 
     if (in.size() < 1)
     {
-        return Overload::call(L"%_Matplot", in, _iRetCount, out, new ast::ExecVisitor());
-
+        return Overload::call(L"%_Matplot", in, _iRetCount, out);
     }
-    else if (in.size() > 5)
+
+    if (in.size() > 5)
     {
         Scierror(999, _("%s: Wrong number of input argument(s): %d to %d expected.\n"), "Matplot", 1, 5);
         return types::Function::Error;
@@ -80,7 +80,6 @@ types::Function::ReturnValue sci_matplot(types::typed_list &in, types::optional_
         l1 = (void*) pIn->get();
         if (pIn->getDims() > 2)
         {
-
             dims = pIn->getDimsArray();
             if (pIn->getDims() > 3 || (dims[2] != 1 && dims[2] != 3 && dims[2] != 4))
             {
@@ -116,7 +115,6 @@ types::Function::ReturnValue sci_matplot(types::typed_list &in, types::optional_
         l1 = (void*) pIn->get();
         if (pIn->getDims() > 2)
         {
-
             dims = pIn->getDimsArray();
             if (pIn->getDims() > 3 || (dims[2] != 1 && dims[2] != 3 && dims[2] != 4))
             {
@@ -132,18 +130,18 @@ types::Function::ReturnValue sci_matplot(types::typed_list &in, types::optional_
             }
             else if (dims[2] == 3)
             {
-                plottype = buildMatplotType(MATPLOT_HM1_Char, MATPLOT_FORTRAN, MATPLOT_RGB);
+                plottype = buildMatplotType(MATPLOT_HM3_Char, MATPLOT_FORTRAN, MATPLOT_RGB);
             }
             else
             {
-                plottype = buildMatplotType(MATPLOT_HM1_Char, MATPLOT_FORTRAN, MATPLOT_RGBA);
+                plottype = buildMatplotType(MATPLOT_HM4_Char, MATPLOT_FORTRAN, MATPLOT_RGBA);
             }
         }
         else
         {
             m1 = pIn->getRows();
             n1 = pIn->getCols();
-            plottype = buildMatplotType(MATPLOT_Char, MATPLOT_FORTRAN, MATPLOT_INDEX);
+            plottype = buildMatplotType(MATPLOT_Char, MATPLOT_FORTRAN, MATPLOT_RGB_332);
         }
     }
     else if (in[0]->isUInt8())
@@ -152,7 +150,6 @@ types::Function::ReturnValue sci_matplot(types::typed_list &in, types::optional_
         l1 = (void*) pIn->get();
         if (pIn->getDims() > 2)
         {
-
             dims = pIn->getDimsArray();
             if (pIn->getDims() > 3 || (dims[2] != 1 && dims[2] != 3 && dims[2] != 4))
             {
@@ -168,18 +165,18 @@ types::Function::ReturnValue sci_matplot(types::typed_list &in, types::optional_
             }
             else if (dims[2] == 3)
             {
-                plottype = buildMatplotType(MATPLOT_HM1_UChar, MATPLOT_FORTRAN, MATPLOT_RGB);
+                plottype = buildMatplotType(MATPLOT_HM3_UChar, MATPLOT_FORTRAN, MATPLOT_RGB);
             }
             else
             {
-                plottype = buildMatplotType(MATPLOT_HM1_UChar, MATPLOT_FORTRAN, MATPLOT_RGBA);
+                plottype = buildMatplotType(MATPLOT_HM4_UChar, MATPLOT_FORTRAN, MATPLOT_RGBA);
             }
         }
         else
         {
             m1 = pIn->getRows();
             n1 = pIn->getCols();
-            plottype = buildMatplotType(MATPLOT_UChar, MATPLOT_FORTRAN, MATPLOT_INDEX);
+            plottype = buildMatplotType(MATPLOT_UChar, MATPLOT_FORTRAN, MATPLOT_GRAY);
         }
     }
     else if (in[0]->isInt16())
@@ -188,7 +185,7 @@ types::Function::ReturnValue sci_matplot(types::typed_list &in, types::optional_
         l1 = (void*) pIn->get();
         m1 = pIn->getRows();
         n1 = pIn->getCols();
-        plottype = buildMatplotType(MATPLOT_Short, MATPLOT_FORTRAN, MATPLOT_INDEX);
+        plottype = buildMatplotType(MATPLOT_Short, MATPLOT_FORTRAN, MATPLOT_RGB_444);
     }
     else if (in[0]->isUInt16())
     {
@@ -196,7 +193,7 @@ types::Function::ReturnValue sci_matplot(types::typed_list &in, types::optional_
         l1 = (void*) pIn->get();
         m1 = pIn->getRows();
         n1 = pIn->getCols();
-        plottype = buildMatplotType(MATPLOT_UShort, MATPLOT_FORTRAN, MATPLOT_INDEX);
+        plottype = buildMatplotType(MATPLOT_UShort, MATPLOT_FORTRAN, MATPLOT_RGBA_4444);
     }
     else if ((in[0]->isInt32()) || (in[0]->isInt64()))
     {
@@ -204,7 +201,7 @@ types::Function::ReturnValue sci_matplot(types::typed_list &in, types::optional_
         l1 = (void*) pIn->get();
         m1 = pIn->getRows();
         n1 = pIn->getCols();
-        plottype = buildMatplotType(MATPLOT_Int, MATPLOT_FORTRAN, MATPLOT_INDEX);
+        plottype = buildMatplotType(MATPLOT_Int, MATPLOT_FORTRAN, MATPLOT_RGB);
     }
     else if ((in[0]->isUInt32()) || (in[0]->isUInt64()))
     {
@@ -212,7 +209,12 @@ types::Function::ReturnValue sci_matplot(types::typed_list &in, types::optional_
         l1 = (void*) pIn->get();
         m1 = pIn->getRows();
         n1 = pIn->getCols();
-        plottype = buildMatplotType(MATPLOT_UInt, MATPLOT_FORTRAN, MATPLOT_INDEX);
+        plottype = buildMatplotType(MATPLOT_UInt, MATPLOT_FORTRAN, MATPLOT_RGBA);
+    }
+    else
+    {
+        Scierror(999, _("%s: Wrong type for input argument #%d: A real or integer expected.\n"), "Matplot", 1);
+        return types::Function::Error;
     }
 
     if (in.size() > 1)
@@ -221,17 +223,20 @@ types::Function::ReturnValue sci_matplot(types::typed_list &in, types::optional_
         {
             Scierror(999, _("%s: Wrong type for input argument #%d: A string expected.\n"), "Matplot1", 2);
             return types::Function::Error;
-
         }
+
         strf =  wide_string_to_UTF8(in[1]->getAs<types::String>()->get(0));
         bFREE = true;
         if (in.size() > 2)
         {
             if (in[2]->isDouble() == false)
             {
+                if (bFREE)
+                {
+                    FREE(strf);
+                }
                 Scierror(999, _("%s: Wrong type for input argument #%d: A real expected.\n"), "Matplot1", 3);
                 return types::Function::Error;
-
             }
 
             rect =  in[2]->getAs<types::Double>()->get();
@@ -239,9 +244,12 @@ types::Function::ReturnValue sci_matplot(types::typed_list &in, types::optional_
             {
                 if (in[3]->isDouble() == false)
                 {
+                    if (bFREE)
+                    {
+                        FREE(strf);
+                    }
                     Scierror(999, _("%s: Wrong type for input argument #%d: A real expected.\n"), "Matplot1", 4);
                     return types::Function::Error;
-
                 }
 
                 types::Double* pDbl = in[3]->getAs<types::Double>();
@@ -260,6 +268,11 @@ types::Function::ReturnValue sci_matplot(types::typed_list &in, types::optional_
 
     if (opt.size() > 4)
     {
+        if (bFREE)
+        {
+            FREE(strf);
+        }
+
         Scierror(999, _("%s: Wrong number of input argument(s): %d to %d expected.\n"), "Matplot", 1, 5);
         return types::Function::Error;
     }
@@ -271,6 +284,25 @@ types::Function::ReturnValue sci_matplot(types::typed_list &in, types::optional_
         {
             if (opt[i].second->isString() == false)
             {
+                if (bFREE)
+                {
+                    FREE(strf);
+                }
+
+                if (nax)
+                {
+                    delete[] nax;
+                }
+
+                if (frameflag)
+                {
+                    delete[] frameflag;
+                }
+
+                if (axesflag)
+                {
+                    delete[] axesflag;
+                }
                 Scierror(999, _("%s: Wrong type for input argument #%ls: A string expected.\n"), "Matplot1", opt[i].first.c_str());
                 return types::Function::Error;
             }
@@ -287,6 +319,25 @@ types::Function::ReturnValue sci_matplot(types::typed_list &in, types::optional_
         {
             if (opt[i].second->isDouble() == false)
             {
+                if (bFREE)
+                {
+                    FREE(strf);
+                }
+
+                if (nax)
+                {
+                    delete[] nax;
+                }
+
+                if (frameflag)
+                {
+                    delete[] frameflag;
+                }
+
+                if (axesflag)
+                {
+                    delete[] axesflag;
+                }
                 Scierror(999, _("%s: Wrong type for input argument #%ls: A matrix expected.\n"), "Matplot1", opt[i].first.c_str());
                 return types::Function::Error;
             }