* Bug 15728 fixed: evstr(s) was wrong for s='k' 'tmp' 'vals'..
[scilab.git] / scilab / modules / string / macros / evstr.sci
index 3ddcd1e..c9a505f 100644 (file)
 // Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
 // Copyright (C) INRIA
 // Copyright (C) DIGITEO - 2010 - Allan CORNET
+// Copyright (C) 2016, 2017, 2018 - Samuel GOUGEON
 //
-// 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-en.txt
+// 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 [%val, %ierr] = evstr(%str)
 
-  [lhs, rhs] = argn(0);
-  %val = [];
-  select type(%str)
+    %lhs = argn(1);
+    %val = [];
+    %ierr =  0;
 
-  case 10 then
-    // matrix of character strings
+    select type(%str)
 
-    // bug 7003
-    if ~isdef('Nan') then
-      Nan = %nan;
-    end
-    if ~isdef('NaN') then
-      NaN = %nan;
-    end
+    case 10 then
+        // matrix of character strings
+        if isempty(%str) then
+            %val = [];
+            return;
+        end
 
-    if ~isdef('Inf') then
-      Inf = %inf;
-    end
+        // bug 7003
+        vars = ["Nan"  "NaN"  "Inf"  "INF"]
+        vals = ["%nan" "%nan" "%inf" "%inf"]
+        tmp = ~isdef(vars)
+        if or(tmp)
+            execstr(vars(tmp)+"="+vals(tmp))
+        end
 
-    if ~isdef('INF') then
-      INF = %inf;
-    end
+        // Removing comments:
+        regExp = "_(?<!\:)//[^\""\'']*$_";
+        %str = strsubst(%str, regExp , "", "r");
+        k = grep(%str, "_^[^""'']*?//.*?(\""|\'')_", "r");
+        if k~=[]
+            %str(k) = strsubst(%str(k), "_(?<!\:|"")?//.*$_" , "", "r");
+        end
 
-    for %l = 1:size(%str, 'r')
-      %t1(%l) = strcat(%str(%l, :), ',') + ';'
-    end
-    %t1(1) = '%val=[' + %t1(1);
-    %t1($) = part(%t1($), 1:length(%t1($)) - 1) + ']';
-    if lhs == 2 then
-      %ierr = execstr(%t1, 'errcatch');
-    else
-      execstr(%t1)
-    end
-    
-  case 15 then
-    // list
-    %sexp = %str(2),
-    %nstr = prod(size(%sexp));
-    % = list();
-    if lhs == 2 then
-      for %k_ = 1:%nstr,
-        [%w, %ierr] = evstr(%sexp(%k_));
-        %(%k_) = %w;
-        if %ierr <>0  then
-         %val = [];
-         return;
+        // Bracketing expressions: http://bugzilla.scilab.org/15308
+        comm = grep(%str, "_(^|[^:])//_", "r");
+        tmp = 1:size(%str,"*");
+        if comm~=[]
+            tmp = setdiff(tmp, comm) // indices of expressions without remaining comments
         end
-      end
-      [%val, %ierr] = evstr(%str(1));
+        if tmp~=[]
+            %str(tmp) = "[" + %str(tmp) + "]";
+        end
+        //
+        %t1 = strcat(%str, ",", "c")+";"
+        %t1(1) = "%val=[" + %t1(1);
+        %t1($) = part(%t1($), 1:length(%t1($)) - 1)+";";
+        %t1($+1) = "]";
+        clear k tmp vars vals regExp comm %str
+
+        %ierr = execstr(%t1, "errcatch");
+        if %lhs == 1 & %ierr~=0 then
+            msg = _("%s: Argument #%d: Some expression can''t be evaluated (%s).\n")
+            error(msprintf(msg, "evstr", 1, strcat(lasterror())))
+        end
+
+    case 15 then
+        // list
+        if size(%str)~=2
+            msg = _("%s: Argument #%d: %d-element list expected.\n")
+            error(msprintf(msg, "evstr", 1, 2));
+        end
+        if type(%str(1))~=10 | type(%str(2))~=10
+            msg = _("%s: Argument #%d: Both list components must be of text type.\n")
+            error(msprintf(msg, "evstr", 1));
+        end
+        %sexp = %str(2),
+        % = list();
+        for %k_ = 1:prod(size(%sexp))
+            [%w, %ierr] = evstr(%sexp(%k_));
+            %(%k_) = %w;
+            if %ierr <>0  then
+                if %lhs == 2
+                    %val = [];
+                    return;
+                else
+                    msg = _("%s: Argument #1(2): The expression #%d = ""%s"" can''t be evaluated (%s).\n")
+                    error(msprintf(msg, "evstr", %k_, %sexp(%k_), strcat(lasterror())))
+                end
+            end
+        end
+        if %lhs == 2
+            [%val, %ierr] = evstr(%str(1));
+        else
+            %val = evstr(%str(1));
+        end
+
+    case 1 then
+        // real or complex constant matrix
+        %val = %str;
     else
-      for %k_ = 1:%nstr,
-        %(%k_) = evstr(%sexp(%k_));
-      end
-      %val = evstr(%str(1))
+        error(msprintf(gettext("%s: Wrong type for input argument #%d: Matrix of character strings or list expected.\n"), "evstr", 1));
+    end
+    if exists("%val", "local") == 0 then
+        error(msprintf(gettext("%s: Given expression has no value.\n"), "evstr"));
     end
-    
-  case 1 then
-    // real or complex constant matrix
-    %val = %str;
-    %ierr = 0;
-  else
-    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
-    error(msprintf(gettext("%s: Given expression has no value.\n"), "evstr"));
-  end
 endfunction