* Bugs #14976 fixed: asciimat(colNum) and asciimat(asciimat("àeï")) failed 08/19008/3
Samuel GOUGEON [Tue, 31 Jan 2017 02:42:25 +0000 (03:42 +0100)]
 * http://bugzilla.scilab.org/14976
 * code simplified
 * asciimat() unit test extended
 * test_run string passes

Change-Id: I7c271a67db258c0d4b5748a937219f8fdb688e8a

scilab/CHANGES.md
scilab/modules/string/macros/asciimat.sci
scilab/modules/string/tests/nonreg_tests/bug_14976.tst [new file with mode: 0644]
scilab/modules/string/tests/unit_tests/asciimat.dia.ref [deleted file]
scilab/modules/string/tests/unit_tests/asciimat.tst

index 9501a1b..abb87bd 100644 (file)
@@ -430,7 +430,7 @@ Bug Fixes
 * [#14667](http://bugzilla.scilab.org/show_bug.cgi?id=14667): Multi line string without final quote generated a non terminal parser state.
 * [#14681](http://bugzilla.scilab.org/show_bug.cgi?id=14681): Short-circuited AND operation was not possible with double matrices in if and while clauses
 * [#14689](http://bugzilla.scilab.org/show_bug.cgi?id=14689): fixed - `resize_matrix(rand(2,3),[0 2])` did not return []. Usage of new sizes <0 to keep them unchanged was not documented.
-* [#14690](http://bugzilla.scilab.org/show_bug.cgi?id=14690): The user's startup files set in the working directory were not executed. When `SCIHOME` is not the working directory, `SCIHOME\scilab.ini` was executed twice.
+* [#14690](http://bugzilla.scilab.org/show_bug.cgi?id=14690): The user startup files set in the working directory were not executed. When `SCIHOME` is not the working directory, `SCIHOME\scilab.ini` was executed twice.
 * [#14692](http://bugzilla.scilab.org/show_bug.cgi?id=14692): isequal() was always returning true for builtin functions
 * [#14694](http://bugzilla.scilab.org/show_bug.cgi?id=14694): The list of named colors was misaligned and poorly rendered in `help color_list`
 * [#14710](http://bugzilla.scilab.org/show_bug.cgi?id=14710): fullpath(TMPDIR+...) was bugged on MacOS
@@ -454,6 +454,7 @@ Bug Fixes
 * [#14942](http://bugzilla.scilab.org/show_bug.cgi?id=14942): Keep the Tkscale block label if block already has label.
 * [#14956](http://bugzilla.scilab.org/show_bug.cgi?id=14956): `clf("reset")` forgot resetting the `immediate_drawing`, `resize`, `resizefcn`, `closerequestfcn`, `toolbar_visible`, `menubar_visible`, `infobar_visible`, `default_axes`, and `icon` figure properties.
 * [#14965](http://bugzilla.scilab.org/show_bug.cgi?id=14965): `getPreferencesValue` could not read a tag having multiple occurrences and did not accept the path to the preferences file.
+* [#14976](http://bugzilla.scilab.org/show_bug.cgi?id=14976): `asciimat(colNum)` concatenated rows when colNum has a single column of ascii codes. With UTF-8 chars, `asciimat(asciimat("àéïôù"))` yielded an error.
 
 ### Bugs fixed in 6.0.0 beta-2 and earlier 6.0.0 pre-releases:
 
index 849e41c..3ac4b9a 100644 (file)
@@ -1,6 +1,7 @@
 // Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
 // Copyright (C) ???? - INRIA - Scilab
-// Copyright (C) 2012 - SCilab Enterprises - Cedric Delamarre
+// Copyright (C) 2012 - Scilab Enterprises - Cedric Delamarre
+// Copyright (C) 2017 - Samuel GOUGEON
 //
 // Copyright (C) 2012 - 2016 - Scilab Enterprises
 //
@@ -11,8 +12,9 @@
 // For more information, see the COPYING file which you should have received
 // along with this program.
 
-function y=asciimat(x)
-    // This function converts a matrix of string into a matrix of ascii codes using ascii() Scilab function
+function y = asciimat(x)
+    // This function converts a matrix of strings into a matrix of ascii codes
+    // using ascii() Scilab function,
     // and converts an array of ascii codes into a array of string
     // Returned value have same size as input value instead of second dims !
     // Fonction created because ascii() Scilab function returns a row vector
@@ -38,7 +40,8 @@ function y=asciimat(x)
                     colref=size(res,"c");
                 else
                     if colref <> size(res,"c")
-                        error(msprintf(gettext("%s: Wrong input argument #%d: Inconsistent size.\n"),"asciimat", 1));
+                        msg = gettext("%s: Wrong input argument #%d: Inconsistent size.\n")
+                        error(msprintf(msg, "asciimat", 1));
                         return
                     end
                 end
@@ -51,32 +54,25 @@ function y=asciimat(x)
             dims(2) = 1;
             p = prod(dims);
             if modulo(aSize, p)
-                error(msprintf(gettext("%s: Wrong input argument #%d: Inconsistent size.\n"),"asciimat", 1));
+                msg = gettext("%s: Wrong input argument #%d: Inconsistent size.\n")
+                error(msprintf(msg, "asciimat", 1));
             end
             dims(2) = dims(1);
             dims(1) = aSize/p;
             y = matrix(a, dims)';
         end
-    else    // convert asciicode to string
-        if size(dims,"*") > 2 // hypermatrix case
-            lastDim = dims($);
-            dims($) = [];
-            l=list();
-            for i=1:size(dims,"*")
-                l(i) = 1:$;
-            end
-            for i=1:lastDim
-                y(l(1:$-1), i) = asciimat(x(l(:), i))
-            end
-        else // 2D matrix case | [97 98 99;100 101 102] => ["abc";"def"]
-            y = ascii(x');
-            // a is a scalar string
-            if modulo(length(y), dims(2))
-                error(msprintf(gettext("%s: Wrong input argument #%d: Inconsistent size.\n"),"asciimat", 1));
-            end
-            if dims(1) <> 1 && dims(2) <> 1 then
-                y=strsplit(y, cumsum(dims(2) * ones(1,dims(1)-1)));
+    else  // convert ascii codes to string
+        x = permute(x,[2 1 3:ndims(x)]);
+        y = ascii(x);
+        Ly = length(y)
+        rlength = Ly / (prod(dims)/dims(2))
+        if dims(1)>1
+            if modulo(Ly, rlength)
+                msg = gettext("%s: Wrong input argument #%d: Inconsistent size.\n")
+                error(msprintf(msg,"asciimat", 1))
             end
+            y = strsplit(y, rlength:rlength:(Ly-1));
         end
+        y = matrix(y, [dims(1) dims(3:$)]);
     end
 endfunction
diff --git a/scilab/modules/string/tests/nonreg_tests/bug_14976.tst b/scilab/modules/string/tests/nonreg_tests/bug_14976.tst
new file mode 100644 (file)
index 0000000..b86fb63
--- /dev/null
@@ -0,0 +1,30 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2017 - 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 14976 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/14976
+//
+// <-- Short Description -->
+// asciimat(asciiNums) concatenated rows when asciiNums has only one column.
+// asciimat(asciimat("àâãäéèêëìîïòôöùûü")) yielded an error.
+
+assert_checkequal(asciimat(97:122), "abcdefghijklmnopqrstuvwxyz");
+c = (97:122)';
+r = strsplit("a":"z",1:25);
+assert_checkequal(asciimat(c), r);
+assert_checkequal(asciimat(cat(3,c,c)), [r r]);
+assert_checkequal(asciimat(cat(7,c,c)), cat(6, r, r));
+
+// With UTF8 (limited application)
+t = "àâãäéèêëìîïòôöùûü";
+assert_checkequal(asciimat(asciimat(t)), t);
+assert_checkequal(asciimat(asciimat([t t])), t+t);
+assert_checkequal(asciimat(asciimat([t;t])), [t;t]);
diff --git a/scilab/modules/string/tests/unit_tests/asciimat.dia.ref b/scilab/modules/string/tests/unit_tests/asciimat.dia.ref
deleted file mode 100644 (file)
index 4458acb..0000000
+++ /dev/null
@@ -1,30 +0,0 @@
-// =============================================================================
-// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
-// Copyright (C) 2012 - Scilab Enterprises - Cedric Delamarre
-//
-//  This file is distributed under the same license as the Scilab package.
-// =============================================================================
-// <-- CLI SHELL MODE -->
-// ascii to string
-ref  = [97 98 99 ;100 101 102];
-code = asciimat(["a" "b" "c";"d" "e" "f"]);
-assert_checkequal(ref, code);
-ref  = [97 122 98 99 ;100 101 121 102];
-code = asciimat(["az" "b" "c";"d" "ey" "f"]);
-assert_checkequal(ref, code);
-// not managed in scilab 5
-scilabversion = getversion("scilab");
-if scilabversion(1) >= 6
-    ref  = matrix(97:120,2,3,4);
-    a    = matrix(strsplit(ascii(97:120),1:23),2,3,4);
-    code = asciimat(a);
-    assert_checkequal(ref, code);
-end
-// string to ascii
-ref = ["azerty";"ytreza"];
-str = asciimat([97 122 101 114 116 121; 121 116 114 101 122 97]);
-assert_checkequal(ref, str);
-ref = ["bdf" "hjl" "npr" "tvx";"ceg" "ikm" "oqs" "uwy"];
-a   = matrix(97+(1:2*3*4),2,3,4);
-str = asciimat(a);
-assert_checkequal(ref, str);
index 5be1ec7..47c2058 100644 (file)
@@ -1,13 +1,16 @@
 // =============================================================================
 // Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
 // Copyright (C) 2012 - Scilab Enterprises - Cedric Delamarre
+// Copyright (C) 2017 - Samuel GOUGEON
 //
 //  This file is distributed under the same license as the Scilab package.
 // =============================================================================
 
 // <-- CLI SHELL MODE -->
+// <-- NO CHECK REF -->
 
 // ascii to string
+// ---------------
 ref  = [97 98 99 ;100 101 102];
 code = asciimat(["a" "b" "c";"d" "e" "f"]);
 assert_checkequal(ref, code);
@@ -16,6 +19,23 @@ ref  = [97 122 98 99 ;100 101 121 102];
 code = asciimat(["az" "b" "c";"d" "ey" "f"]);
 assert_checkequal(ref, code);
 
+// 3D hypermat
+m = matrix(97:120,4,3,2);
+t = asciimat(m);
+ref = ["aei" "mqu"
+       "bfj" "nrv"
+       "cgk" "osw"
+       "dhl" "ptx"
+       ];
+assert_checkequal(t, ref);
+
+// 12D hypermat
+h = cat(12,m,m);
+t = asciimat(h);
+assert_checkequal(t, cat(11,ref,ref));
+
+// string to ascii
+// ---------------
 // not managed in scilab 5
 scilabversion = getversion("scilab");
 if scilabversion(1) >= 6
@@ -24,9 +44,7 @@ if scilabversion(1) >= 6
     code = asciimat(a);
     assert_checkequal(ref, code);
 end
-
-
-// string to ascii
+//
 ref = ["azerty";"ytreza"];
 str = asciimat([97 122 101 114 116 121; 121 116 114 101 122 97]);
 assert_checkequal(ref, str);
@@ -36,4 +54,10 @@ a   = matrix(97+(1:2*3*4),2,3,4);
 str = asciimat(a);
 assert_checkequal(ref, str);
 
+// With UTF8 (limited application)
+t = "àâãäéèêëìîïòôöùûü";
+assert_checkequal(asciimat(asciimat(t)), t);
+assert_checkequal(asciimat(asciimat([t t])), t+t);
+assert_checkequal(asciimat(asciimat([t;t])), [t;t]);
+