* Bug 13303 fixed: mprintf msprintf mfprintf now accept input booleans 15/21615/4
Samuel GOUGEON [Wed, 28 Oct 2020 15:55:01 +0000 (16:55 +0100)]
  http://bugzilla.scilab.org/13303

  test_run output_stream mprintf
  test_run output_stream msprintf

  The documentation will be updated after merging this commit
  (as well to document numbered fields in format, introduced in 6.1.0).
  Pages of mprintf, msprintf, mfprintf, printf_conversion, gettext
  to be considered. A lot of work..)

Change-Id: I49af3f4f3989de3a0da697a770b141a05c8cb534

scilab/CHANGES.md
scilab/modules/output_stream/macros/%b_mfprintf.sci [new file with mode: 0644]
scilab/modules/output_stream/macros/%b_mprintf.sci [new file with mode: 0644]
scilab/modules/output_stream/macros/%b_msprintf.sci [new file with mode: 0644]
scilab/modules/output_stream/macros/%printf_boolean.sci [new file with mode: 0644]
scilab/modules/output_stream/tests/unit_tests/mprintf.dia.ref
scilab/modules/output_stream/tests/unit_tests/mprintf.tst
scilab/modules/output_stream/tests/unit_tests/msprintf.tst

index 72d4a41..39f03d8 100644 (file)
@@ -216,7 +216,7 @@ Feature changes and additions on 6.1.1
 * `sgolay` and the companion `sgolayfilter` and `sgolaydiff` functions have been added to implement Savitsky-Golay filters.
 * `clock` now returns the milliseconds, the time zone, and the daylight saving time.
 * `mapsound` upgraded to have a colormap argument
-
+* `mprintf`, `msprintf` and `mfprintf` can now print input booleans, as `0`|`1` or as `T`|`F`.
 
 Help pages:
 -----------
@@ -317,6 +317,7 @@ Bug Fixes
 * [#12532](https://bugzilla.scilab.org/12532): From `browsevar`, clicking on any function did not edit it with `edit`. The content of libraries could not be displayed either.
 * [#12719](https://bugzilla.scilab.org/12719): `A(%s)` gave the same result as `A($)`.
 * [#12889](https://bugzilla.scilab.org/12889): In the help browser, add a menu allowing to select the language of help pages, regardless of the language of the session.
+* [#13303](https://bugzilla.scilab.org/13303): `mprintf`, `msprintf` and `mfprintf` could not print input booleans.
 * [#13417](https://bugzilla.scilab.org/13417): `csvRead` page did not document the way to use the `range` up to the last row/column.
 * [#13593](https://bugzilla.scilab.org/13593): `csvRead()` did not take the `range` into account when `header` is provided. `[]` could not be used as default `range`.
 * [#13762](https://bugzilla.scilab.org/13762): In the `fft` page, the formula for the inverse FFT missed the 1/n normalization factor.
diff --git a/scilab/modules/output_stream/macros/%b_mfprintf.sci b/scilab/modules/output_stream/macros/%b_mfprintf.sci
new file mode 100644 (file)
index 0000000..dc38f49
--- /dev/null
@@ -0,0 +1,15 @@
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2020 - Samuel GOUGEON - Le Mans Université
+//
+// 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 %b_mfprintf(fd, Format, varargin)
+    varargin = %printf_boolean(Format, varargin(:))
+    mfprintf(fd, Format, varargin(:))
+endfunction
diff --git a/scilab/modules/output_stream/macros/%b_mprintf.sci b/scilab/modules/output_stream/macros/%b_mprintf.sci
new file mode 100644 (file)
index 0000000..8882fca
--- /dev/null
@@ -0,0 +1,15 @@
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2020 - Samuel GOUGEON - Le Mans Université
+//
+// 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 %b_mprintf(Format, varargin)
+    varargin = %printf_boolean(Format, varargin(:))
+    mprintf(Format, varargin(:))
+endfunction
diff --git a/scilab/modules/output_stream/macros/%b_msprintf.sci b/scilab/modules/output_stream/macros/%b_msprintf.sci
new file mode 100644 (file)
index 0000000..1399464
--- /dev/null
@@ -0,0 +1,15 @@
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2020 - Samuel GOUGEON - Le Mans Université
+//
+// 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 r = %b_msprintf(Format, varargin)
+    varargin = %printf_boolean(Format, varargin(:))
+    r = msprintf(Format, varargin(:))
+endfunction
diff --git a/scilab/modules/output_stream/macros/%printf_boolean.sci b/scilab/modules/output_stream/macros/%printf_boolean.sci
new file mode 100644 (file)
index 0000000..86776a1
--- /dev/null
@@ -0,0 +1,34 @@
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2020 - Samuel GOUGEON - Le Mans Université
+//
+// 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 r = %printf_boolean(Format, varargin)
+    r = varargin
+    Format = strsubst(Format, "%%", "")
+    [s, e, Fields] = regexp(Format, "/%.*?[diuoxXfeEgGcs]/")
+    if grep(Fields, "$") <> [] then
+        // numbered formats: reordering fields in order to know
+        // the expected output format for each input argument.
+        for f = Fields'
+            [s,e,m,n] = regexp(f, "/%([0-9])\$/")
+            tmp(evstr(n)) = f
+        end
+        Fields = tmp
+    end
+    for i = 1:length(varargin)
+        if type(r(i)) == 4   // boolean
+            if or(part(Fields(i),$)==["s" "c"])
+                r(i) = string(r(i))
+            else
+                r(i) = bool2s(r(i))
+            end
+        end
+    end
+endfunction
index a45bb94..4f885e4 100644 (file)
@@ -1,6 +1,7 @@
 // =============================================================================
 // Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
 // Copyright (C) 2008 - INRIA
+// Copyright (C) 2020 - Samuel GOUGEON - Le Mans Université
 //
 //  This file is distributed under the same license as the Scilab package.
 // =============================================================================
@@ -211,3 +212,100 @@ mprintf("==>%10s : %08.4f %08.4f %08.4f<==\n\n",A,C,D);
 ==>     row 8 : 048.1851 069.7085 089.0622<==
 ==>     row 9 : 026.3956 084.1552 050.4221<==
 ==>    row 10 : 041.4810 040.6202 034.9362<==
+// Booleans
+// =============================================================================
+n = [%pi ; %e];
+b = [%T ; %F];
+for f = ["d" "i" "u" "o" "x" "X" "g" "G"]
+    mprintf("%"+f+"\n", b);
+    mprintf("%"+f+" %d\n", b, n);
+    if and(f <> ["u" "o" "x" "X"])  // http://bugzilla.scilab.org/16563
+        mprintf("%2$"+f+" %1$d\n", n, b);
+    end
+end
+1
+0
+1 3
+0 2
+1 3
+0 2
+1
+0
+1 3
+0 2
+1 3
+0 2
+1
+0
+1 3
+0 2
+1
+0
+1 3
+0 2
+1
+0
+1 3
+0 2
+1
+0
+1 3
+0 2
+1
+0
+1 3
+0 2
+1 3
+0 2
+1
+0
+1 3
+0 2
+1 3
+0 2
+// %f
+msprintf("%f\n", b);
+mprintf("%f %d\n", b, n);
+1.000000 3
+0.000000 2
+mprintf("%2$f %1$d\n", n, b);
+1.000000 3
+0.000000 2
+// %e
+mprintf("%e\n", b);
+1.000000e+00
+0.000000e+00
+mprintf("%e %d\n", b, n);
+1.000000e+00 3
+0.000000e+00 2
+mprintf("%2$e %1$d\n", n, b);
+1.000000e+00 3
+0.000000e+00 2
+// %E
+mprintf("%E\n", b);
+1.000000E+00
+0.000000E+00
+mprintf("%E %d\n", b, n);
+1.000000E+00 3
+0.000000E+00 2
+mprintf("%2$E %1$d\n", n, b);
+1.000000E+00 3
+0.000000E+00 2
+// %s, %c
+for f = ["s" "c"]
+    mprintf("%"+f+"\n", b);
+    mprintf("%"+f+" %d\n", b, n);
+    mprintf("%2$"+f+" %1$d\n", n, b);
+end
+T
+F
+T 3
+F 2
+T 3
+F 2
+T
+F
+T 3
+F 2
+T 3
+F 2
index 9b5f8ba..d8a0712 100644 (file)
@@ -1,6 +1,7 @@
 // =============================================================================
 // Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
 // Copyright (C) 2008 - INRIA
+// Copyright (C) 2020 - Samuel GOUGEON - Le Mans Université
 //
 //  This file is distributed under the same license as the Scilab package.
 // =============================================================================
@@ -155,3 +156,33 @@ D = [ ..
     34.936154 ];
 
 mprintf("==>%10s : %08.4f %08.4f %08.4f<==\n\n",A,C,D);
+
+// Booleans
+// =============================================================================
+n = [%pi ; %e];
+b = [%T ; %F];
+for f = ["d" "i" "u" "o" "x" "X" "g" "G"]
+    mprintf("%"+f+"\n", b);
+    mprintf("%"+f+" %d\n", b, n);
+    if and(f <> ["u" "o" "x" "X"])  // http://bugzilla.scilab.org/16563
+        mprintf("%2$"+f+" %1$d\n", n, b);
+    end
+end
+// %f
+msprintf("%f\n", b);
+mprintf("%f %d\n", b, n);
+mprintf("%2$f %1$d\n", n, b);
+// %e
+mprintf("%e\n", b);
+mprintf("%e %d\n", b, n);
+mprintf("%2$e %1$d\n", n, b);
+// %E
+mprintf("%E\n", b);
+mprintf("%E %d\n", b, n);
+mprintf("%2$E %1$d\n", n, b);
+// %s, %c
+for f = ["s" "c"]
+    mprintf("%"+f+"\n", b);
+    mprintf("%"+f+" %d\n", b, n);
+    mprintf("%2$"+f+" %1$d\n", n, b);
+end
index 9fddf26..a9b7a6a 100644 (file)
@@ -2,6 +2,7 @@
 // Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
 // Copyright (C) 2008 - INRIA
 // Copyright (C) 2013 - Scilab Enterprises - Adeline CARNIS
+// Copyright (C) 2020 - Samuel GOUGEON - Le Mans Université
 //
 //  This file is distributed under the same license as the Scilab package.
 // =============================================================================
@@ -123,6 +124,7 @@ assert_checkequal(msprintf("%10s","text"), "      text");
 assert_checkequal(msprintf("%10.3s","text"), "       tex");
 assert_checkequal(msprintf("%-10s","text"), "text      ");
 assert_checkequal(msprintf("%s","t"), "t");
+assert_checkequal(msprintf("%s","éàöαβδ"), "éàöαβδ");
 
 // format '%x'
 // =============================================================================
@@ -210,3 +212,33 @@ refMsg = msprintf(_("%s: Wrong number of input arguments: data doesn''t fit with
 assert_checkerror("msprintf(""%2$d"", 1);", refMsg);
 assert_checkerror("msprintf(""%d%1$d"", 1);", refMsg);
 assert_checkerror("msprintf(""%1$d%d"", 1);", refMsg);
+
+// Booleans
+// =============================================================================
+n = [%pi ; %e];
+b = [%T ; %F];
+for f = ["d" "i" "u" "o" "x" "X" "g" "G"]
+    assert_checkequal(msprintf("%"+f+"\n", b), ["1" ; "0"]);
+    assert_checkequal(msprintf("%"+f+" %d\n", b, n), ["1 3" ; "0 2"]);
+    if and(f <> ["u" "o" "x" "X"])  // http://bugzilla.scilab.org/16563
+        assert_checkequal(msprintf("%2$"+f+" %1$d\n", n, b), ["1 3" ; "0 2"]);
+    end
+end
+// %f
+assert_checkequal(msprintf("%f\n", b), ["1.000000" ; "0.000000"]);
+assert_checkequal(msprintf("%f %d\n", b, n), ["1.000000 3" ; "0.000000 2"]);
+assert_checkequal(msprintf("%2$f %1$d\n", n, b), ["1.000000 3" ; "0.000000 2"]);
+// %e
+assert_checkequal(msprintf("%e\n", b), ["1.000000e+00" ; "0.000000e+00"]);
+assert_checkequal(msprintf("%e %d\n", b, n), ["1.000000e+00 3" ; "0.000000e+00 2"]);
+assert_checkequal(msprintf("%2$e %1$d\n", n, b), ["1.000000e+00 3" ; "0.000000e+00 2"]);
+// %E
+assert_checkequal(msprintf("%E\n", b), ["1.000000E+00" ; "0.000000E+00"]);
+assert_checkequal(msprintf("%E %d\n", b, n), ["1.000000E+00 3" ; "0.000000E+00 2"]);
+assert_checkequal(msprintf("%2$E %1$d\n", n, b), ["1.000000E+00 3" ; "0.000000E+00 2"]);
+// %s, %c
+for f = ["s" "c"]
+    assert_checkequal(msprintf("%"+f+"\n", b), ["T" ; "F"]);
+    assert_checkequal(msprintf("%"+f+" %d\n", b, n), ["T 3" ; "F 2"]);
+    assert_checkequal(msprintf("%2$"+f+" %1$d\n", n, b), ["T 3" ; "F 2"]);
+end