Bug #14604 fixed: convert emptystr in builtin 32/19032/5
Antoine ELIAS [Thu, 2 Feb 2017 16:43:22 +0000 (17:43 +0100)]
Change-Id: Ifb2465b3f3e901f698158d6349d13c32b08d342c

12 files changed:
scilab/CHANGES.md
scilab/modules/string/Makefile.am
scilab/modules/string/Makefile.in
scilab/modules/string/includes/string_gw.hxx
scilab/modules/string/macros/emptystr.sci [deleted file]
scilab/modules/string/sci_gateway/cpp/sci_emptystr.cpp [new file with mode: 0644]
scilab/modules/string/sci_gateway/cpp/sci_stripblanks.cpp
scilab/modules/string/sci_gateway/cpp/string_gw.cpp
scilab/modules/string/sci_gateway/cpp/string_gw.vcxproj
scilab/modules/string/sci_gateway/cpp/string_gw.vcxproj.filters
scilab/modules/string/tests/unit_tests/emptystr.dia.ref [deleted file]
scilab/modules/string/tests/unit_tests/emptystr.tst

index 5a97db7..d6609b2 100644 (file)
@@ -424,6 +424,7 @@ Bug Fixes
 * [#14591](http://bugzilla.scilab.org/show_bug.cgi?id=14591): `<=` and `>=` elementwise operators comparing 2 hypermatrices of decimal numbers or encoded integers were inverted.
 * [#14593](http://bugzilla.scilab.org/show_bug.cgi?id=14593): Signs are no more drawn in BIGSOM and PRODUCT components.
 * [#14602](http://bugzilla.scilab.org/show_bug.cgi?id=14602): WRITEC_f block didn't work for x86 machines.
+* [#14604](http://bugzilla.scilab.org/show_bug.cgi?id=14604): `emptystr()` was 40x slower than Scilab 5
 * [#14609](http://bugzilla.scilab.org/show_bug.cgi?id=14609): "msscanf" crashes Scilab when 'niter' parameter is out of range.
 * [#14632](http://bugzilla.scilab.org/show_bug.cgi?id=14632): Zooming moves drawn axis offscreen
 * [#14640](http://bugzilla.scilab.org/show_bug.cgi?id=14640): `median(int8([10 60 80 100]))` returned -58 instead of 70 due to overflow when interpolating (60+80)>128
index 206db89..397c830 100644 (file)
@@ -65,7 +65,8 @@ GATEWAY_CPP_SOURCES = \
     sci_gateway/cpp/sci_isdigit.cpp \
     sci_gateway/cpp/sci_isascii.cpp \
     sci_gateway/cpp/sci_strsplit.cpp \
-    sci_gateway/cpp/sci_isnum.cpp
+    sci_gateway/cpp/sci_isnum.cpp \
+    sci_gateway/cpp/sci_emptystr.cpp
 
 libscistring_la_CFLAGS= \
     $(PCRE_CFLAGS) \
index bf7e3e6..475163b 100644 (file)
@@ -238,7 +238,8 @@ am__objects_3 = sci_gateway/cpp/libscistring_la-sci_stripblanks.lo \
        sci_gateway/cpp/libscistring_la-sci_isdigit.lo \
        sci_gateway/cpp/libscistring_la-sci_isascii.lo \
        sci_gateway/cpp/libscistring_la-sci_strsplit.lo \
-       sci_gateway/cpp/libscistring_la-sci_isnum.lo
+       sci_gateway/cpp/libscistring_la-sci_isnum.lo \
+       sci_gateway/cpp/libscistring_la-sci_emptystr.lo
 am_libscistring_la_OBJECTS = $(am__objects_3)
 libscistring_la_OBJECTS = $(am_libscistring_la_OBJECTS)
 libscistring_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
@@ -683,7 +684,8 @@ GATEWAY_CPP_SOURCES = \
     sci_gateway/cpp/sci_isdigit.cpp \
     sci_gateway/cpp/sci_isascii.cpp \
     sci_gateway/cpp/sci_strsplit.cpp \
-    sci_gateway/cpp/sci_isnum.cpp
+    sci_gateway/cpp/sci_isnum.cpp \
+    sci_gateway/cpp/sci_emptystr.cpp
 
 libscistring_la_CFLAGS = \
     $(PCRE_CFLAGS) \
@@ -1100,6 +1102,9 @@ sci_gateway/cpp/libscistring_la-sci_strsplit.lo:  \
 sci_gateway/cpp/libscistring_la-sci_isnum.lo:  \
        sci_gateway/cpp/$(am__dirstamp) \
        sci_gateway/cpp/$(DEPDIR)/$(am__dirstamp)
+sci_gateway/cpp/libscistring_la-sci_emptystr.lo:  \
+       sci_gateway/cpp/$(am__dirstamp) \
+       sci_gateway/cpp/$(DEPDIR)/$(am__dirstamp)
 
 libscistring.la: $(libscistring_la_OBJECTS) $(libscistring_la_DEPENDENCIES) $(EXTRA_libscistring_la_DEPENDENCIES) 
        $(AM_V_CXXLD)$(libscistring_la_LINK) $(am_libscistring_la_rpath) $(libscistring_la_OBJECTS) $(libscistring_la_LIBADD) $(LIBS)
@@ -1118,6 +1123,7 @@ distclean-compile:
 
 @AMDEP_TRUE@@am__include@ @am__quote@sci_gateway/cpp/$(DEPDIR)/libscistring_la-sci_ascii.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@sci_gateway/cpp/$(DEPDIR)/libscistring_la-sci_convstr.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@sci_gateway/cpp/$(DEPDIR)/libscistring_la-sci_emptystr.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@sci_gateway/cpp/$(DEPDIR)/libscistring_la-sci_grep.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@sci_gateway/cpp/$(DEPDIR)/libscistring_la-sci_isalphanum.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@sci_gateway/cpp/$(DEPDIR)/libscistring_la-sci_isascii.Plo@am__quote@
@@ -1629,6 +1635,13 @@ sci_gateway/cpp/libscistring_la-sci_isnum.lo: sci_gateway/cpp/sci_isnum.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) $(libscistring_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o sci_gateway/cpp/libscistring_la-sci_isnum.lo `test -f 'sci_gateway/cpp/sci_isnum.cpp' || echo '$(srcdir)/'`sci_gateway/cpp/sci_isnum.cpp
 
+sci_gateway/cpp/libscistring_la-sci_emptystr.lo: sci_gateway/cpp/sci_emptystr.cpp
+@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libscistring_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT sci_gateway/cpp/libscistring_la-sci_emptystr.lo -MD -MP -MF sci_gateway/cpp/$(DEPDIR)/libscistring_la-sci_emptystr.Tpo -c -o sci_gateway/cpp/libscistring_la-sci_emptystr.lo `test -f 'sci_gateway/cpp/sci_emptystr.cpp' || echo '$(srcdir)/'`sci_gateway/cpp/sci_emptystr.cpp
+@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) sci_gateway/cpp/$(DEPDIR)/libscistring_la-sci_emptystr.Tpo sci_gateway/cpp/$(DEPDIR)/libscistring_la-sci_emptystr.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='sci_gateway/cpp/sci_emptystr.cpp' object='sci_gateway/cpp/libscistring_la-sci_emptystr.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) $(libscistring_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o sci_gateway/cpp/libscistring_la-sci_emptystr.lo `test -f 'sci_gateway/cpp/sci_emptystr.cpp' || echo '$(srcdir)/'`sci_gateway/cpp/sci_emptystr.cpp
+
 mostlyclean-libtool:
        -rm -f *.lo
 
index f53a2a0..d3ec4f9 100644 (file)
@@ -68,4 +68,5 @@ CPP_GATEWAY_PROTOTYPE(sci_isdigit);
 CPP_GATEWAY_PROTOTYPE(sci_isascii);
 CPP_GATEWAY_PROTOTYPE(sci_strsplit);
 CPP_GATEWAY_PROTOTYPE(sci_isnum);
+CPP_GATEWAY_PROTOTYPE(sci_emptystr);
 #endif /* !__STRING_GW_HXX__ */
diff --git a/scilab/modules/string/macros/emptystr.sci b/scilab/modules/string/macros/emptystr.sci
deleted file mode 100644 (file)
index 88a945b..0000000
+++ /dev/null
@@ -1,50 +0,0 @@
-// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
-// Copyright (C) DIGITEO - 2010 - Antoine ELIAS
-//
-// 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.
-
-
-function result = emptystr(varargin)
-    [lhs, rhs] = argn(0);
-
-    if rhs == 1 then
-        //emptystr(x)
-        s = size(varargin(1));
-        p = prod(s);
-        if p == 0 then
-            //emptystr([])
-            result = [];
-        else
-            result(1:p) = "";
-            result = matrix(result, s);
-        end
-    elseif rhs == 2 then
-        //emptystr(x,y)
-        x = varargin(1);
-        y = varargin(2);
-
-        if type(x) <> 1 then
-            error(msprintf(_("%s: Wrong type for input argument #%d: Matrix of integers expected.\n"), "emptystr", 1));
-        end
-        if type(y) <> 1 then
-            error(msprintf(_("%s: Wrong type for input argument #%d: Matrix of integers expected.\n"), "emptystr", 2));
-        end
-
-        if x == 0 | y == 0 then
-            result = [];
-        else
-            result(x,y) = "";
-        end
-    else
-        //emptystr() or emptystr(x,y, ... )
-        result = "";
-    end
-endfunction
-
diff --git a/scilab/modules/string/sci_gateway/cpp/sci_emptystr.cpp b/scilab/modules/string/sci_gateway/cpp/sci_emptystr.cpp
new file mode 100644 (file)
index 0000000..f08d374
--- /dev/null
@@ -0,0 +1,113 @@
+/*
+* Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+*  Copyright (C) 2017 - Scilab Enterprises - Antoine ELIAS
+*
+* 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.
+*
+*/
+/*--------------------------------------------------------------------------*/
+#include <string>
+#include "string_gw.hxx"
+#include "function.hxx"
+#include "double.hxx"
+#include "string.hxx"
+#include "list.hxx"
+#include "overload.hxx"
+/*--------------------------------------------------------------------------*/
+extern "C"
+{
+#include "localization.h"
+#include "Scierror.h"
+}
+
+static const std::string fname("emptystr");
+/*--------------------------------------------------------------------------*/
+types::Function::ReturnValue sci_emptystr(types::typed_list &in, int _iRetCount, types::typed_list &out)
+{
+    types::String* ret = nullptr;
+    int iRhs = static_cast<int>(in.size());
+
+    // check output parameters
+    if (_iRetCount != 1 && _iRetCount != -1)
+    {
+        Scierror(999, _("%s: Wrong number of output arguments: %d expected.\n"), fname.data(), 1);
+        return types::Function::Error;
+    }
+
+    switch (iRhs)
+    {
+        case 1:
+        {
+            if (in[0]->isGenericType())
+            {
+                types::GenericType* pGT = in[0]->getAs<types::GenericType>();
+                if (pGT->getSize() == 0)
+                {
+                    out.push_back(types::Double::Empty());
+                    return types::Function::OK;
+                }
+
+                ret = new types::String(pGT->getDims(), pGT->getDimsArray());
+            }
+            else if (in[0]->isList())
+            {
+                types::List* pL = in[0]->getAs<types::List>();
+                ret = new types::String(pL->getSize(), 1);
+            }
+            else
+            {
+                return Overload::generateNameAndCall(L"emptystr", in, _iRetCount, out);
+            }
+
+            break;
+        }
+        case 2:
+        {
+            if (in[0]->isDouble() == false || in[0]->getAs<types::Double>()->isScalar() == false)
+            {
+                Scierror(999, _("%s: Wrong type for input argument #%d: Matrix of integers expected.\n"), fname.data(), 1);
+                return types::Function::Error;
+            }
+
+            if (in[1]->isDouble() == false || in[1]->getAs<types::Double>()->isScalar() == false)
+            {
+                Scierror(999, _("%s: Wrong type for input argument #%d: Matrix of integers expected.\n"), fname.data(), 2);
+                return types::Function::Error;
+            }
+
+            int row = static_cast<int>(in[0]->getAs<types::Double>()->get()[0]);
+            int col = static_cast<int>(in[1]->getAs<types::Double>()->get()[0]);
+
+            if (row == 0 || col == 0)
+            {
+                out.push_back(types::Double::Empty());
+                return types::Function::OK;
+            }
+
+            ret = new types::String(row, col);
+            break;
+        }
+        default:
+        {
+            ret = new types::String(1, 1);
+        }
+    }
+
+    int size = ret->getSize();
+    wchar_t** strs = ret->get();
+    for (int i = 0; i < size; ++i)
+    {
+        strs[i] = os_wcsdup(L"");
+    }
+
+    out.push_back(ret);
+    return types::Function::OK;
+
+}
index 46d76ad..7b89c05 100644 (file)
@@ -64,7 +64,7 @@ types::Function::ReturnValue sci_stripblanks(types::typed_list &in, int _iRetCou
 
     if (in.size() == 3)
     {
-        if (in[2]->isDouble() == false || in[2]->getAs<types::Double>()->isScalar() == false) 
+        if (in[2]->isDouble() == false || in[2]->getAs<types::Double>()->isScalar() == false)
         {
 
             Scierror(999, _("%s: Wrong type for input argument #%d: A scalar expected.\n"), FUNCNAME, 2);
@@ -74,7 +74,7 @@ types::Function::ReturnValue sci_stripblanks(types::typed_list &in, int _iRetCou
 
         flag = in[2]->getAs<types::Double>()->get()[0];
 
-        if (floor(flag) != flag || (flag != 0.0 && flag != 1.0 && flag != -1.0)) 
+        if (floor(flag) != flag || (flag != 0.0 && flag != 1.0 && flag != -1.0))
         {
 
             Scierror(999, _("%s: Wrong value for input argument #%d: Must be in the set {%s}.\n"), FUNCNAME, 3, "-1, 0, 1");
index 87b038e..c384974 100644 (file)
@@ -59,6 +59,7 @@ int StringModule::Load()
     symbol::Context::getInstance()->addFunction(types::Function::createFunction(L"isascii", &sci_isascii, MODULE_NAME));
     symbol::Context::getInstance()->addFunction(types::Function::createFunction(L"isnum", &sci_isnum, MODULE_NAME));
     symbol::Context::getInstance()->addFunction(types::Function::createFunction(L"csvIsnum", &sci_isnum, MODULE_NAME));
+    symbol::Context::getInstance()->addFunction(types::Function::createFunction(L"emptystr", &sci_emptystr, MODULE_NAME));
     return 1;
 }
 
index bccd57c..838b20c 100644 (file)
   <ItemGroup>
     <ClCompile Include="sci_ascii.cpp" />
     <ClCompile Include="sci_convstr.cpp" />
+    <ClCompile Include="sci_emptystr.cpp" />
     <ClCompile Include="sci_grep.cpp" />
     <ClCompile Include="sci_isalphanum.cpp" />
     <ClCompile Include="sci_isascii.cpp" />
index 85b467a..9534499 100644 (file)
     <ClCompile Include="sci_isnum.cpp">
       <Filter>Source Files</Filter>
     </ClCompile>
+    <ClCompile Include="sci_emptystr.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
   </ItemGroup>
   <ItemGroup>
     <ClInclude Include="..\..\includes\dynlib_string_gw.h">
diff --git a/scilab/modules/string/tests/unit_tests/emptystr.dia.ref b/scilab/modules/string/tests/unit_tests/emptystr.dia.ref
deleted file mode 100644 (file)
index ab81ff7..0000000
+++ /dev/null
@@ -1,57 +0,0 @@
-// =============================================================================
-// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
-// Copyright (C) 2007-2008 - INRIA - Allan CORNET <allan.cornet@inria.fr>
-//
-//  This file is distributed under the same license as the Scilab package.
-// =============================================================================
-// <-- CLI SHELL MODE -->
-//===============================
-// unit tests emptystr
-//===============================
-s = emptystr();
-if (s <> '') then bugmes();quit;end;
-//===============================
-s = emptystr([]);
-if (s <> []) then bugmes();quit;end;
-//===============================
-s = emptystr("Scilab");
-d = size(s);
-if (d <> [1 1]) then bugmes();quit;end;
-if (s <> '') then bugmes();quit;end;
-//===============================
-MS = ["Scilab";"String"];
-s = emptystr(MS);
-d = size(s);
-if (d <> size(MS)) then bugmes();quit;end;
-if or(s <> '') then bugmes();quit;end;
-//===============================
-M = 5;
-N = 3;
-s = emptystr(M,N);
-d = size(s);
-if (d <> [M N]) then bugmes();quit;end;
-if or(s <> '') then bugmes();quit;end;
-//===============================
-M = 200;
-N = 300;
-s = emptystr(M,N);
-d = size(s);
-if (d <> [M N]) then bugmes();quit;end;
-if or(s <> '') then bugmes();quit;end;
-//===============================
-s = emptystr(0,0);
-if (s <> []) then bugmes();quit;end;
-//===============================
-s = emptystr(0);
-d = size(s);
-if (d <> [1 1]) then bugmes();quit;end;
-if (s <> '') then bugmes();quit;end;
-//===============================
-M = 200;
-s = emptystr(M);
-d = size(s);
-if (d <> [1 1]) then bugmes();quit;end;
-if (s <> '') then bugmes();quit;end;
-//===============================
-if ( size(emptystr(0,1)) <> [ 0 0 ] ) then bugmes();quit;end
-//===============================
index 11f2745..04b8fd9 100644 (file)
@@ -6,54 +6,42 @@
 // =============================================================================
 
 // <-- CLI SHELL MODE -->
+// <-- NO CHECK REF -->
 
 //===============================
 // unit tests emptystr
 //===============================
-s = emptystr();
-if (s <> '') then pause,end;
+assert_checkequal(emptystr(), "");
 //===============================
-s = emptystr([]);
-if (s <> []) then pause,end;
+assert_checkequal(emptystr([]), []);
 //===============================
-s = emptystr("Scilab");
-d = size(s);
-if (d <> [1 1]) then pause,end;
-if (s <> '') then pause,end;
+assert_checkequal(size(emptystr("Scilab")), [1 1]);
+assert_checkequal(emptystr("Scilab"), "");
 //===============================
-MS = ["Scilab";"String"];
-s = emptystr(MS);
-d = size(s);
-if (d <> size(MS)) then pause,end;
-if or(s <> '') then pause,end;
+s = emptystr(["Scilab";"String"]);
+assert_checkequal(size(s), [2 1]);
+assert_checktrue(and(s == ""));
 //===============================
 M = 5;
 N = 3;
 s = emptystr(M,N);
-d = size(s);
-if (d <> [M N]) then pause,end;
-if or(s <> '') then pause,end;
+assert_checkequal(size(s), [M N]);
+assert_checktrue(and(s == ""));
 //===============================
 M = 200;
 N = 300;
 s = emptystr(M,N);
-d = size(s);
-if (d <> [M N]) then pause,end;
-if or(s <> '') then pause,end;
+assert_checkequal(size(s), [M N]);
+assert_checktrue(and(s == ""));
 //===============================
-s = emptystr(0,0);
-if (s <> []) then pause,end;
+assert_checkequal(emptystr(0,0), []);
 //===============================
-s = emptystr(0);
-d = size(s);
-if (d <> [1 1]) then pause,end;
-if (s <> '') then pause,end;
+assert_checkequal(emptystr(0), "");
 //===============================
 M = 200;
 s = emptystr(M);
-d = size(s);
-if (d <> [1 1]) then pause,end;
-if (s <> '') then pause,end;
+assert_checkequal(size(s), [1 1]);
+assert_checkequal(s, "");
 //===============================
-if ( size(emptystr(0,1)) <> [ 0 0 ] ) then pause,end
+assert_checkequal(size(emptystr(0,1)), [0 0]);
 //===============================