* Bugs #14976 fixed: asciimat(colNum) and asciimat(asciimat("àeï")) failed
[scilab.git] / scilab / modules / string / macros / asciimat.sci
1 // Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
2 // Copyright (C) ???? - INRIA - Scilab
3 // Copyright (C) 2012 - Scilab Enterprises - Cedric Delamarre
4 // Copyright (C) 2017 - Samuel GOUGEON
5 //
6 // Copyright (C) 2012 - 2016 - Scilab Enterprises
7 //
8 // This file is hereby licensed under the terms of the GNU GPL v2.0,
9 // pursuant to article 5.3.4 of the CeCILL v.2.1.
10 // This file was originally licensed under the terms of the CeCILL v2.1,
11 // and continues to be available under such terms.
12 // For more information, see the COPYING file which you should have received
13 // along with this program.
14
15 function y = asciimat(x)
16     // This function converts a matrix of strings into a matrix of ascii codes
17     // using ascii() Scilab function,
18     // and converts an array of ascii codes into a array of string
19     // Returned value have same size as input value instead of second dims !
20     // Fonction created because ascii() Scilab function returns a row vector
21
22     if x==[] then
23         y=[]
24         return
25     end
26
27     dims = size(x);
28     if typeof(x) == "string" // convert string to ascii code
29         if size(dims,"*") > 2 // hypermatrix case
30             colref = 0;
31             lastDim = dims($);
32             dims($) = [];
33             l=list();
34             for i=1:size(dims,"*")
35                 l(i) = 1:$;
36             end
37             for i=1:lastDim
38                 res=asciimat(x(l(:), i));
39                 if colref == 0 then
40                     colref=size(res,"c");
41                 else
42                     if colref <> size(res,"c")
43                         msg = gettext("%s: Wrong input argument #%d: Inconsistent size.\n")
44                         error(msprintf(msg, "asciimat", 1));
45                         return
46                     end
47                 end
48                 y(l(:), i) = res;
49             end
50         else // 2D matrix case | ["a" "bc";"de" "f"] => [97 98 99;100 101 102]
51             x=x';
52             a = ascii(x(:));
53             aSize = size(a, "*");
54             dims(2) = 1;
55             p = prod(dims);
56             if modulo(aSize, p)
57                 msg = gettext("%s: Wrong input argument #%d: Inconsistent size.\n")
58                 error(msprintf(msg, "asciimat", 1));
59             end
60             dims(2) = dims(1);
61             dims(1) = aSize/p;
62             y = matrix(a, dims)';
63         end
64     else  // convert ascii codes to string
65         x = permute(x,[2 1 3:ndims(x)]);
66         y = ascii(x);
67         Ly = length(y)
68         rlength = Ly / (prod(dims)/dims(2))
69         if dims(1)>1
70             if modulo(Ly, rlength)
71                 msg = gettext("%s: Wrong input argument #%d: Inconsistent size.\n")
72                 error(msprintf(msg,"asciimat", 1))
73             end
74             y = strsplit(y, rlength:rlength:(Ly-1));
75         end
76         y = matrix(y, [dims(1) dims(3:$)]);
77     end
78 endfunction