* Bugs 16567 16586 fixed: mfile2sci() supports block %{..%}. Appended comments improved" 13/21613/6
Samuel GOUGEON [Tue, 27 Oct 2020 23:06:44 +0000 (00:06 +0100)]
  http://bugzilla.scilab.org/16567
  http://bugzilla.scilab.org/16586

  test_run m2sci bug_16586
  test_run m2sci COMMENTS_syntax enable_lt

Change-Id: Ia6df17cee2a2ec668b70f93ac1c78d3402ad0d9d

scilab/CHANGES.md
scilab/modules/functions/macros/format_txt.sci
scilab/modules/m2sci/macros/kernel/m2sci_syntax.sci
scilab/modules/m2sci/tests/nonreg_tests/bug_16586.tst [new file with mode: 0644]
scilab/modules/m2sci/tests/unit_tests/conversion/COMMENTS_syntax.dia.ref [new file with mode: 0644]
scilab/modules/m2sci/tests/unit_tests/conversion/COMMENTS_syntax.tst [new file with mode: 0644]
scilab/modules/m2sci/tests/unit_tests/mfilesnoexec/COMMENTS_syntax.m [new file with mode: 0644]

index d02148b..c424606 100644 (file)
@@ -391,7 +391,9 @@ Bug Fixes
 * [#16553](https://bugzilla.scilab.org/16553): `unique(["" ""])` returned `["" ""]`.
 * [#16557](https://bugzilla.scilab.org/16557): `macr2tree` + `tree2code` translated `e={2}` into `"e=1"` and `e={2,"ab"}` into `"e=[2,"ab"]"`.
 * [#16559](https://bugzilla.scilab.org/16553): `isempty(A)` was true for sparse matrix of dimension 2^16 or larger.
+* [#16567](https://bugzilla.scilab.org/16567): `mfile2sci` did not support Matlab block-comments %{ ..%}.
 * [#16571](https://bugzilla.scilab.org/16571): `mfile2sci` had several issues when converting the NOT ~ operator: 1) `~(1-1)` was converted into `~1-1` instead of `~(1-1)`  2) ~ applied to an integer expression yielded an error from `convert2double`  3) `~i` was converted into `~%i` instead of `~abs(%i)`.
+* [#16586](https://bugzilla.scilab.org/16586): `mfile2sci`: The `prettyprintoutput` flag badly managed appended comments.
 * [#16596](https://bugzilla.scilab.org/16596): Concatenating encoded integers with sparse numeric data was not possible. 
 * [#16609](https://bugzilla.scilab.org/16609): `bitcmp` needed to be upgraded for Scilab 6.
 * [#16622](https://bugzilla.scilab.org/16622): `inv` could no longer be overloaded for hypermatrices of decimal or complex numbers.
index 76d5605..4388cbb 100644 (file)
@@ -1,7 +1,7 @@
 // Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
 // Copyright (C) INRIA - Vincent COUVERT
-//
 // Copyright (C) 2012 - 2016 - Scilab Enterprises
+// Copyright (C) 2020 - 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.
 // For more information, see the COPYING file which you should have received
 // along with this program.
 
-function [txt,space]=format_txt(txt,instr,bprettyprintformat,nextinstr)
+function [txt, space] = format_txt(txt, instr, bprettyprintformat, nextinstr)
     // Add EOL and returns spaces to have good indentation (called by tree2code)
     // Inputs:
     // - txt: code to format
     // - instr: instruction to evaluate as a possible EOL
-    // - bprettyprintformat = %T -> code generated is formatted %F -> code generated has same format as original code
+    // - bprettyprintformat = %T -> code generated is formatted 
+    //                        %F -> code generated has same format as original code
     // - nextinstr: next instruction after instr (format EOL between instructions)
     // Outputs:
     // - txt: updated txt
     // - space: indentation margin for control instructions
 
-    rhs=argn(2)
+    rhs = argn(2)
 
     // Indentation and EOL in control clauses
     if rhs==3 then
         if instr<>list("EOL") & bprettyprintformat then
             txt = cat_code(txt,"")
-            space="  "
+            space = "  "
         elseif instr<>list("EOL") then
-            space=" "
+            space = " "
         else
-            space="  "
+            space = "  "
         end
         // EOL between instructions
     else
-        if bprettyprintformat & instr<>list("EOL") & nextinstr<>list("EOL") then
-            txt = cat_code(txt,"")
+        if instr <> list("EOL")
+            if bprettyprintformat & nextinstr<>list("EOL")
+                if nextinstr(1)(1) <> "comment"  // http://bugzilla.scilab.org/16586
+                    txt = cat_code(txt,"")
+                else
+                    txt($) = txt($) + "  "
+                end
+            elseif ~bprettyprintformat & nextinstr(1)(1)=="comment"
+                txt($) = txt($) + "  "
+            end
         end
     end
 endfunction
index 31d9c53..87b3ada 100644 (file)
@@ -11,7 +11,7 @@
 // For more information, see the COPYING file which you should have received
 // along with this program.
 
-function [helppart,txt,batch]=m2sci_syntax(txt)
+function [helppart,txt,batch] = m2sci_syntax(txt)
     // Make minor changes on M-file data syntax to have it readable by Scilab
     // Input arguments:
     //  - txt: the contents of an M-file
@@ -26,11 +26,32 @@ function [helppart,txt,batch]=m2sci_syntax(txt)
     //  - replace_brackets
     //  - replace_end_dollar
 
+    // Pre-process block-comments:
+    // --------------------------
+    // Converts block-comments tags
+    k = grep(txt, "/^\%\{\s*$/", "r"); if k <> [] then, txt(k) = "/*", end
+    k = grep(txt, "/^\%\}\s*$/", "r"); if k <> [] then, txt(k) = "*/", end
+    // Comments the block-comments
+    // (otherwise their content is cleared by the compiler)
+    ks = find(txt=="/*")
+    ke = find(txt=="*/")
+    for k = matrix(ks,1,-1)
+        i = find(ke>k,1)
+        if i==[]
+            j = size(txt,1)
+        else
+            j = ke(i)
+            ke(i) = []
+        end
+        txt(k:j) = ["///*" ; "// " + txt(k+1:j-1) ; "//*/"]
+    end
+    //
+
     sciparam();
-    quote="''"
-    dquote=""""
-    ctm="."+"."+"." // Continuation mark
-    batch=%t
+    quote = "''"
+    dquote = """"
+    ctm = "." + "." + "." // Continuation mark
+    batch = %t
 
     k=0
     first_ncl=[]
@@ -396,7 +417,9 @@ function [helppart,txt,batch]=m2sci_syntax(txt)
         return
     end
 
+    // ===================
     // Syntax modification
+    // ===================
 
     // Complex variable
     txt=i_notation(txt)
diff --git a/scilab/modules/m2sci/tests/nonreg_tests/bug_16586.tst b/scilab/modules/m2sci/tests/nonreg_tests/bug_16586.tst
new file mode 100644 (file)
index 0000000..b80b59d
--- /dev/null
@@ -0,0 +1,38 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2020 - Samuel GOUGEON
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+//
+// <-- CLI SHELL MODE -->
+// <-- NO CHECK REF -->
+//
+// <-- Non-regression test for bug 16586 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/16586
+//
+// <-- Short Description -->
+// mfile2sci: The prettyprintoutput flag badly managed appended comments
+
+code = ["% Comment #1"
+        "a = 2; b = 1;      % this is a test"
+        ];
+mfile = TMPDIR + "/bug_16586";
+mputl(code, mfile+".m");
+
+mfile2sci(mfile+".m", TMPDIR,,,,%t);    // prettyfied
+res = mgetl(mfile+".sci")
+ref = [""
+       "// Comment #1"
+       "a = 2;"
+       "b = 1;  // this is a test"];
+assert_checkequal(res, ref);
+
+mfile2sci(mfile+".m", TMPDIR,,,,%f);    // not prettyfied
+res = mgetl(mfile+".sci");
+ref = [""
+       "// Comment #1"
+       "a = 2;b = 1;  // this is a test"];
+assert_checkequal(res, ref);
diff --git a/scilab/modules/m2sci/tests/unit_tests/conversion/COMMENTS_syntax.dia.ref b/scilab/modules/m2sci/tests/unit_tests/conversion/COMMENTS_syntax.dia.ref
new file mode 100644 (file)
index 0000000..a4a5ed3
--- /dev/null
@@ -0,0 +1,56 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2020 - Samuel GOUGEON
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+// <-- CLI SHELL MODE -->
+// <-- ENGLISH IMPOSED -->
+// <-- LONG TIME EXECUTION -->
+// Unitary test for conversion of Matlab function: COMMENTS
+exec("SCI/modules/m2sci/tests/unit_tests/utils/m2sciTestConversionNoExe.sci", -1);
+mprintf("%s\n", m2sciTestConversionNoExe("COMMENTS_syntax"));
+  ****** Beginning of mfile2sci() session ******
+  File to convert: SCI/modules/m2sci/tests/unit_tests/mfilesnoexec/COMMENTS_syntax.m
+  Result file path: TMPDIR/
+  Recursive mode: OFF
+  Only double values used in M-file: NO
+  Verbose mode: -1
+  Generate formatted code: YES
+  M-file reading...
+  M-file reading: Done
+  Syntax modification...
+  Syntax modification: Done
+  Macro to tree conversion...
+  Conversion of M-tree...
+  L.14: No simple equivalent, so mtlb_fprintf() is called.
+  L.15: No simple equivalent, so mtlb_fprintf() is called.
+  L.16: No simple equivalent, so mtlb_fprintf() is called.
+  L.17: No simple equivalent, so mtlb_fprintf() is called.
+  L.18: No simple equivalent, so mtlb_fprintf() is called.
+  Conversion of M-tree: Done
+TESTING M2SCI: creating varslist file...
+  Macro to tree conversion: Done
+  ****** End of mfile2sci() session ******
+// Test file for COMMENTS
+///*
+//   Matlab block-comment
+//   Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+//   Copyright (c) 2020 - Samuel GOUGEON
+//
+// fprintf('%d %s\n', 2, 'percents in strings');  // A difficult case
+//*/
+a = 1;  // Appended comment
+// Percent symbol % in a comment
+A = a;
+B = 2*a  // Case 3: Symbol % in a comment
+mtlb_fprintf("%d\n",2);  // Case 4
+mtlb_fprintf("%d\n",2);  // Case 4 with % in comment
+mtlb_fprintf("%s\n","percents % in strings");  // Case 5
+mtlb_fprintf("%d %s\n",2,"percents in strings");  // Case 6
+mtlb_fprintf("%d %s\n",2,"percents in strings");  // Case 6 with % in comment
+select a
+  case 1 then
+    // Anything to do
+    disp("OK")
+end;
diff --git a/scilab/modules/m2sci/tests/unit_tests/conversion/COMMENTS_syntax.tst b/scilab/modules/m2sci/tests/unit_tests/conversion/COMMENTS_syntax.tst
new file mode 100644 (file)
index 0000000..b29d4de
--- /dev/null
@@ -0,0 +1,16 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2020 - Samuel GOUGEON
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+
+// <-- CLI SHELL MODE -->
+// <-- ENGLISH IMPOSED -->
+// <-- LONG TIME EXECUTION -->
+
+// Unitary test for conversion of Matlab function: COMMENTS
+
+exec("SCI/modules/m2sci/tests/unit_tests/utils/m2sciTestConversionNoExe.sci", -1);
+
+mprintf("%s\n", m2sciTestConversionNoExe("COMMENTS_syntax"));
diff --git a/scilab/modules/m2sci/tests/unit_tests/mfilesnoexec/COMMENTS_syntax.m b/scilab/modules/m2sci/tests/unit_tests/mfilesnoexec/COMMENTS_syntax.m
new file mode 100644 (file)
index 0000000..3ba9114
--- /dev/null
@@ -0,0 +1,24 @@
+% Test file for COMMENTS
+%{
+  Matlab block-comment
+  Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+  Copyright (c) 2020 - Samuel GOUGEON
+  
+fprintf('%d %s\n', 2, 'percents in strings'); % A difficult case
+%}
+
+a = 1;  % Appended comment
+
+% Percent symbol % in a comment
+A=a; B = 2*a        % Case 3: Symbol % in a comment
+fprintf('%d\n', 2);                           % Case 4
+fprintf('%d\n', 2);                           % Case 4 with % in comment
+fprintf('%s\n', 'percents % in strings');     % Case 5
+fprintf('%d %s\n', 2, 'percents in strings'); % Case 6
+fprintf('%d %s\n', 2, 'percents in strings'); % Case 6 with % in comment
+
+switch a % This comment disappears
+case 1
+    % Anything to do
+    disp('OK')
+end