* Bug 16181 fixed [m2sci]: converting a(end) yielded an error 87/21087/4
Samuel GOUGEON [Sun, 15 Sep 2019 18:34:53 +0000 (20:34 +0200)]
  http://bugzilla.scilab.org/16181

  m2sci_syntax() is called in mfile2sci() on line #148|150
  to make the m-file compilable with Scilab.
  In Scilab 6, a(end) is no longer compilable.

Change-Id: I9d354ca98d3da47faf29f9db46517055331d9547

scilab/CHANGES.md
scilab/modules/m2sci/macros/kernel/m2sci.sci
scilab/modules/m2sci/macros/kernel/m2sci_syntax.sci
scilab/modules/m2sci/macros/kernel/replace_end_dollar.sci [new file with mode: 0644]
scilab/modules/m2sci/tests/nonreg_tests/bug_16181.dia.ref [new file with mode: 0644]
scilab/modules/m2sci/tests/nonreg_tests/bug_16181.m [new file with mode: 0644]
scilab/modules/m2sci/tests/nonreg_tests/bug_16181.tst [new file with mode: 0644]

index 620a28b..9621e47 100644 (file)
@@ -300,6 +300,7 @@ Bug Fixes
 * [#16174](http://bugzilla.scilab.org/show_bug.cgi?id=16174): `libraryinfo` yielded 0x0 matrix of strings for libs without macro
 * [#16177](http://bugzilla.scilab.org/show_bug.cgi?id=16177): In the uicontrol help page, the first example was bugged.
 * [#16178](http://bugzilla.scilab.org/show_bug.cgi?id=16178): `sci2exp` yielded an error for any input macro without output argument.
+* [#16181](http://bugzilla.scilab.org/show_bug.cgi?id=16181): `mfile2sci` yielded an error on `a(end)` standing for `a($)` (Scilab 6 regression).
 * [#16190](http://bugzilla.scilab.org/show_bug.cgi?id=16190): console width was fixed at 75 in nw and nwni mode regardless of terminal width.
 * [#16197](http://bugzilla.scilab.org/show_bug.cgi?id=16197): result of extraction was not decomplexified when applicable.
 * [#16199](http://bugzilla.scilab.org/show_bug.cgi?id=16199): In the documentation, `zpk2tf` and `zpk2ss` examples yielded an error.
index 81899fe..8fd3b28 100644 (file)
@@ -86,7 +86,6 @@ function [scitree,trad,txt,crp]=m2sci(mtlbtree,nam,Recmode,prettyprintoutput)
     varslist($+1)=M2scivar("%nan","nan",Infer(list(1,1),Type(Double,Real)))
     varslist($+1)=M2scivar("%inf","Inf",Infer(list(1,1),Type(Double,Real)))
     varslist($+1)=M2scivar("%inf","inf",Infer(list(1,1),Type(Double,Real)))
-    varslist($+1)=M2scivar("$","end",Infer(list(1,1),Type(Double,Real)))
     varslist($+1)=M2scivar("%pi","pi",Infer(list(1,1),Type(Double,Real)))
     varslist($+1)=M2scivar("%eps","eps",Infer(list(1,1),Type(Double,Real)))
     varslist($+1)=M2scivar("varargout","%varargout",Infer(list(Unknown,Unknown),Type(Cell,Unknown)))
index e949b00..96f1db3 100644 (file)
@@ -24,6 +24,7 @@ function [helppart,txt,batch]=m2sci_syntax(txt)
     //  - isacomment
     //  - isinstring
     //  - replace_brackets
+    //  - replace_end_dollar
 
     sciparam();
     quote="''"
@@ -411,6 +412,9 @@ function [helppart,txt,batch]=m2sci_syntax(txt)
     // Replace {..} by (..) or [..] : useful for cells translation
     txt=replace_brackets(txt)
 
+    // Replace end with $ where it is relevant
+    txt = replace_end_dollar(txt)
+
     // Place function definition line at first line
     kc=strindex(txt(first_ncl),"function")
     if kc==[] then
diff --git a/scilab/modules/m2sci/macros/kernel/replace_end_dollar.sci b/scilab/modules/m2sci/macros/kernel/replace_end_dollar.sci
new file mode 100644 (file)
index 0000000..897b06f
--- /dev/null
@@ -0,0 +1,28 @@
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2019 - Samuel GOUGEON
+//
+// 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 txt = replace_end_dollar(txt)
+
+    patterns = ["/(?:\(|\-|\+|\*|\:|\,)\s*end\s*(\)|(\-|\+|\*|\/|\:|\,).*?\))/"
+                "/(?:\{|\-|\+|\*|\:|\,)\s*end\s*(\}|(\-|\+|\*|\/|\:|\,).*?\})/"
+               ]'
+    for pattern = patterns
+        rows = grep(txt, pattern, "r");
+        for i = rows
+            t = txt(i);
+            [d, f, M] = regexp(t, pattern);
+            Mr = strsubst(M, "end", "$");
+            for j = 1:size(M,1)
+                t = strsubst(t, M(j), Mr(j));
+            end
+            txt(i) = t;
+        end
+    end
+endfunction
diff --git a/scilab/modules/m2sci/tests/nonreg_tests/bug_16181.dia.ref b/scilab/modules/m2sci/tests/nonreg_tests/bug_16181.dia.ref
new file mode 100644 (file)
index 0000000..1ebfe78
--- /dev/null
@@ -0,0 +1,93 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2019 - Samuel GOUGEON
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+//
+// <-- CLI SHELL MODE -->
+// <-- ENGLISH IMPOSED -->
+//
+// <-- Non-regression test for bug 16181 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/16181
+//
+if ~isdef("m2scikernellib") then
+    load("SCI/modules/m2sci/macros/kernel/lib")
+end
+txt = mgetl("SCI/modules/m2sci/tests/nonreg_tests/bug_16181.m");
+printf("%s\n", replace_end_dollar(txt));
+% end in comments
+% a($:-1:2) in comments
+a = [1 2 3 4 5 6 7];
+k = 3
+endy = 4;
+b.end = 3
+if true, a=1, end, b=3
+if true then
+    % With matrices
+    % -------------
+    a(b.end:$) = 1
+    a(append) = 8
+    a(endy:$) = 8
+    a(1:endy:$) = 3
+    a($) = 7
+    a(6:$) = [3 4]
+    a(1,2:$) = [3 4]
+    a($,2:$) = [3 4]
+    a($,2:$-1) = 3
+    a($+1) = 8
+    a($-k) = 7
+    a(6:$) = [3 4], a($) = 5
+    endy(3) = 4
+    endy($/2) = 7
+    append($:-1:2) = 1:endy
+    a (b.end : $) = 1
+    a (append ) = 8
+    a (endy: $ ) = 8
+    a (1: endy: $) = 3
+    a ( $ ) = 7
+    a (6 : $ ) = [3 4]
+    a (1, 2 : $ ) = [3 4]
+    a ( $ , 2 : $ ) = [3 4]
+    a ( $ , 2 : $ - 1) = 3
+    a ( $ + 1) = 8
+    a ( $ - k) = 7
+    a ( 6 : $ ) = [3 4], a( $ ) = 5
+    endy (3) = 4
+    endy ( $ / 2) = 7
+    append ( $ : -1 : 2 ) = 1:endy
+    % With cells
+    % ----------
+    a{b.end:$} = 1
+    a{append} = 8
+    a{endy:$} = 8
+    a{1:endy:$} = 3
+    a{$} = 7
+    a{6:$} = [3 4]
+    a{1,2:$} = [3 4]
+    a{$,2:$} = [3 4]
+    a{$,2:$-1} = 3
+    a{$+1} = 8
+    a{$-k} = 7
+    a{6:$} = [3 4], a{$} = 5
+    endy{3} = 4
+    endy{$/2} = 7
+    append{$:-1:2} = 1:endy
+    a {b.end : $} = 1
+    a {append } = 8
+    a {endy: $ } = 8
+    a {1: endy: $} = 3
+    a { $ } = 7
+    a {6 : $ } = [3 4]
+    a {1, 2 : $ } = [3 4]
+    a { $ , 2 : $ } = [3 4]
+    a { $ , 2 : $ - 1} = 3
+    a { $ + 1} = 8
+    a { $ - k} = 7
+    a { 6 : $ } = [3 4], a{ $ } = 5
+    endy {3} = 4
+    endy { $ / 2} = 7
+    append { $ : -1 : 2 } = 1:endy
+ end
diff --git a/scilab/modules/m2sci/tests/nonreg_tests/bug_16181.m b/scilab/modules/m2sci/tests/nonreg_tests/bug_16181.m
new file mode 100644 (file)
index 0000000..5be5523
--- /dev/null
@@ -0,0 +1,81 @@
+% end in comments
+% a(end:-1:2) in comments
+a = [1 2 3 4 5 6 7];
+k = 3
+endy = 4;
+b.end = 3
+if true, a=1, end, b=3
+if true then
+    % With matrices
+    % -------------
+    a(b.end:end) = 1
+    a(append) = 8
+    a(endy:end) = 8
+    a(1:endy:end) = 3
+
+    a(end) = 7
+    a(6:end) = [3 4]
+    a(1,2:end) = [3 4]
+    a(end,2:end) = [3 4]
+    a(end,2:end-1) = 3
+    a(end+1) = 8
+    a(end-k) = 7
+    a(6:end) = [3 4], a(end) = 5
+    endy(3) = 4
+    endy(end/2) = 7
+    append(end:-1:2) = 1:endy
+
+    a (b.end : end) = 1
+    a (append ) = 8
+    a (endy: end ) = 8
+    a (1: endy: end) = 3
+
+    a ( end ) = 7
+    a (6 : end ) = [3 4]
+    a (1, 2 : end ) = [3 4]
+    a ( end , 2 : end ) = [3 4]
+    a ( end , 2 : end - 1) = 3
+    a ( end + 1) = 8
+    a ( end - k) = 7
+    a ( 6 : end ) = [3 4], a( end ) = 5
+    endy (3) = 4
+    endy ( end / 2) = 7
+    append ( end : -1 : 2 ) = 1:endy
+
+    % With cells
+    % ----------
+    a{b.end:end} = 1
+    a{append} = 8
+    a{endy:end} = 8
+    a{1:endy:end} = 3
+
+    a{end} = 7
+    a{6:end} = [3 4]
+    a{1,2:end} = [3 4]
+    a{end,2:end} = [3 4]
+    a{end,2:end-1} = 3
+    a{end+1} = 8
+    a{end-k} = 7
+    a{6:end} = [3 4], a{end} = 5
+    endy{3} = 4
+    endy{end/2} = 7
+    append{end:-1:2} = 1:endy
+
+    a {b.end : end} = 1
+    a {append } = 8
+    a {endy: end } = 8
+    a {1: endy: end} = 3
+
+    a { end } = 7
+    a {6 : end } = [3 4]
+    a {1, 2 : end } = [3 4]
+    a { end , 2 : end } = [3 4]
+    a { end , 2 : end - 1} = 3
+    a { end + 1} = 8
+    a { end - k} = 7
+    a { 6 : end } = [3 4], a{ end } = 5
+    endy {3} = 4
+    endy { end / 2} = 7
+    append { end : -1 : 2 } = 1:endy
+
+ end
diff --git a/scilab/modules/m2sci/tests/nonreg_tests/bug_16181.tst b/scilab/modules/m2sci/tests/nonreg_tests/bug_16181.tst
new file mode 100644 (file)
index 0000000..5eb0038
--- /dev/null
@@ -0,0 +1,21 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2019 - Samuel GOUGEON
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+//
+// <-- CLI SHELL MODE -->
+// <-- ENGLISH IMPOSED -->
+//
+// <-- Non-regression test for bug 16181 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/16181
+//
+if ~isdef("m2scikernellib") then
+    load("SCI/modules/m2sci/macros/kernel/lib")
+end
+
+txt = mgetl("SCI/modules/m2sci/tests/nonreg_tests/bug_16181.m");
+printf("%s\n", replace_end_dollar(txt));