Revert "* Bugs #9838,9839,10196 fixed: evstr(strarray) 2.3 x faster + more robust...
[scilab.git] / scilab / modules / string / macros / evstr.sci
index 7395445..5f801af 100644 (file)
@@ -1,7 +1,6 @@
 // Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
 // Copyright (C) INRIA
 // Copyright (C) DIGITEO - 2010 - Allan CORNET
-// Copyright (C) 2017 - Samuel GOUGEON
 //
 // Copyright (C) 2012 - 2016 - Scilab Enterprises
 //
 // For more information, see the COPYING file which you should have received
 // along with this program.
 
+
 function [%val, %ierr] = evstr(%str)
-// HELP:
-// * assignment forbidden
-// * If a vector or matrix of strings is provided:
-//   A single instruction per cell: no "," or ";" instruction separator
 
     [lhs, rhs] = argn(0);
     %val = [];
-    %ierr =  0;
-
     select type(%str)
+
     case 10 then
         // matrix of character strings
         if isempty(%str) then
-            return
+            %val = [];
+            %ierr =  0;
+            return;
         end
 
         // bug 7003
-        vars = ["Nan"  "NaN"  "Inf"  "INF"]
-        vals = ["%nan" "%nan" "%inf" "%inf"]
-        tmp = ~isdef(vars)
-        if tmp~=[]
-            execstr(vars(tmp)+"="+vals(tmp))
+        if ~isdef("Nan") then
+            Nan = %nan;
         end
-
-        // Bug 9839: support to included ascii(10) or ascii(13) characters:
-        //  If the input is scalar: we replace them with ";"
-        //  Otherwise:
-        //    For every component including some ascii(10) or ascii(13),
-        //    we replace the component with only its head up to the first ascii(10)
-        //    or ascii(13) met (excluded).
-        if size(%str,"*")==1
-            %str = strsubst(%str, ascii(10), ";");
-            %str = strsubst(%str, ascii(13), ";");
-        else
-            tmp = grep(%str, [ascii(10) ascii(13)]);
-            if tmp~=[]
-                tmp2 = strcspn(%str(tmp), ascii(10)+ascii(13));
-                %str(tmp) = strncpy(%str(tmp), tmp2);
-            end
+        if ~isdef("NaN") then
+            NaN = %nan;
         end
 
-        // Bug 10196.b: only one component with an instruction returning nothing => [] returned
-        serialized_input = %f
-        if size(%str,"*")==1
-            %ierr = execstr("%val=["+%str(1)+"]", "errcatch");
-            if %ierr~=0
-                %val = []
-                return
-            end
-            if or(type(%val)==[11 13])
-                return
-            end
-            serialized_input = size(%val,"*")>1
+        if ~isdef("Inf") then
+            Inf = %inf;
         end
 
-        // input strings with possible "," and ";" separators
-        // or column of strings with possible "," and ending ";"
-        // -----------------------------------------------------
-        if serialized_input | ..
-           grep(%str(1),"/^\s*\[/","r")~=[] & grep(%str($),"/\]\s*/","r")~=[]
-            %t1 = strcat(%str, ",", "c") + ";"
-            %t1(1) = "%val=[" + %t1(1);
-            %t1($) = part(%t1($), 1:length(%t1($)) - 1)+";";
-            %t1($+1)="]";
-            if lhs == 2 then
-                %ierr = execstr(%t1, "errcatch");
-            else
-                execstr(%t1)
-            end
+        if ~isdef("INF") then
+            INF = %inf;
+        end
 
-        // We assume: one %str component = only one instruction
-        // ----------------------------------------------------
+        %t1 = strcat(%str, ",", "c")+";"
+        %t1(1) = "%val=[" + %t1(1);
+        %t1($) = part(%t1($), 1:length(%t1($)) - 1)+";";
+        %t1($+1)="]";
+        if lhs == 2 then
+            %ierr = execstr(%t1, "errcatch");
         else
-            // Bugs 9838 & 10196.a:
-            // Are considered as empty instructions
-            //  - a blank or empty string
-            //  - a string containing only "[ ]" and blanks
-            //  - a string starting with possible spaces + "//" being a comment
-            //  - a string like "  [ ]  // bla bla "
-            // If at least one component is detected to be so, then
-            //  * its evaluation returning nothing will be replaced with the "neutral" default,
-            //    that depends on the overall result type.
-            //  * So we search this type: it is the type returend by the evaluation of first
-            //    non-empty component
-            //  * We set the default: "" for texts, %nan for decimal and complex numbers, etc
-            void = grep(%str, "/^(\s*\[\s*\]\s*|\s*|\s*\/\/.*|\s*\[\s*\]\s*\/\/.*)$/", "r")
-
-            if void~=[]
-                // The default replacement depends on the type of the output
-                // It is set by the first expected valid output:
-                tmp = setdiff(1:size(%str,"*"), void) // indices of valid expressions
-                if tmp~=[]
-                    execstr("tmp = "+%str(tmp(1))) // We get the result of the first one
-                else  // none not-empty valid output is expected
-                    return
-                end
-            else
-                execstr("tmp = "+%str(1)) // result of the first component
-            end
-            // We test its type to set the default result according to its type:
-            if or(type(tmp)==[1 2 5])
-                default = "%nan"
-            elseif type(tmp)==4
-                default = "%F"
-            elseif type(tmp)==10
-                default = """"""
-            elseif type(tmp)==8
-                default = typeof(tmp)+"(0)"
-            elseif type(tmp)==9
-                default = "gdf()"
-            elseif or(type(tmp)==[11 13])
-                deff("voidF()","")  // Does not survive when leaving evstr(). Never mind
-                default = "voidF"
-            end
-            // Substitution void => default
-            if void~=[] then
-                %str(void) = default
-            end
-
-            if or(type(tmp)==[1 2 4 8 9 10])    // matrix() supported
-                // We optimize the matrix size:
-                // The closer to a square matrix the faster is execstr()
-                S = size(%str)
-                s = size(%str,"*")
-                n = ceil(sqrt(s))
-                %str = [%str(:) ; repmat(default, n*n-s,1)]
-                %str = matrix(%str, n, n);
-            end
-            %t1 = strcat(%str, ",", "c") + ";"
-            %t1(1) = "%val=[" + %t1(1);
-            %t1($) = part(%t1($), 1:length(%t1($)) - 1)+";";
-            %t1($+1)="]";
-            if lhs == 2 then
-                %ierr = execstr(%t1, "errcatch");
-            else
-                execstr(%t1)
-            end
-            if or(type(tmp)==[1 2 4 8 9 10])    // Reshaping the result
-                %val = matrix(%val(1:s), S)
-            end
+            execstr(%t1)
         end
 
     case 15 then
@@ -182,12 +79,9 @@ function [%val, %ierr] = evstr(%str)
         %val = %str;
         %ierr = 0;
     else
-        msg = _("%s: Wrong type for input argument #%d: Real or Complex matrix, Matrix of character strings or list expected.\n")
-        error(msprintf(msg, "evstr", 1));
+        error(msprintf(gettext("%s: Wrong type for input argument #%d: Real or Complex matrix, Matrix of character strings or list expected.\n"), "evstr", 1));
     end
     if exists("%val", "local") == 0 then
-        msg = _("%s: Given expression has no value.\n")
-        error(msprintf(msg, "evstr"));
+        error(msprintf(gettext("%s: Given expression has no value.\n"), "evstr"));
     end
 endfunction
-