da0d4a5c530414ba17467e5c58419aa1372742a9
[scilab.git] / scilab / modules / overloading / macros / %st_p.sci
1 // Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
2 // Copyright (C) INRIA
3 // Copyright (C) 2010 - DIGITEO - Vincent COUVERT <vincent.couvert@scilab.org>
4 // Copyright (C) 2012 - 2016 - Scilab Enterprises
5 // Copyright (C) 2018 - St├ęphane MOTTELET
6 //
7 // This file is hereby licensed under the terms of the GNU GPL v2.0,
8 // pursuant to article 5.3.4 of the CeCILL v.2.1.
9 // This file was originally licensed under the terms of the CeCILL v2.1,
10 // and continues to be available under such terms.
11 // For more information, see the COPYING file which you should have received
12 // along with this program.
13
14 function %st_p(s)
15
16     //matlab-like struct display
17
18     ll    = lines()
19     t     = []
20     multi = size(s,"*")
21
22     // No fields
23     if isempty(fieldnames(s)) then
24         t = strcat(string(size(s)), "x") + " struct array with no fields.";
25         mprintf("%s", t);
26         return
27     end
28
29     // 0x0 struct with fields
30     if multi == 0 then
31         t = "0x0 struct array with fields:"
32         for field = fieldnames(s)'
33             t = [t; "   "+field]
34         end
35         mprintf("%s", t);
36         return
37     end
38     // axb struct where a<>0 & b<>0
39
40     if multi > 1 then
41         t = strcat(string(size(s)), "x") + " struct array with fields:";
42     end
43
44     for field = fieldnames(s)'
45         value = s(field)
46         tp = typeof(value)
47         if tp == "st" then
48             str = "[" + strcat(string(size(value)), "x") + " struct" + "]";
49         elseif type(value)> 10 then
50             str = tp
51         else
52             sz = size(value)
53             // If number of elements in value is greater than ll(1) (current page width)
54             // then we do not call sci2exp
55             // because the returned value will be ignored at line 64: size(str,"*")==1
56             // Note that ll(1)/2 elements could be the max because of colon, semi-colon and brackets added between elements by sci2exp
57             if sz(1) == 1 & type(value) <> 9 & prod(sz) < ll(1) then // This line can avoid some memory issues when field contains a big matrix
58                 str = sci2exp(value, ll(1))
59             else
60                 str = "[" + strcat(string(size(value)), "x") + " " + tp + "]"
61             end
62         end
63         txt = "   " + field
64         if multi <= 1 then
65             if size(str,"*") == 1 then
66                 txt = txt + ": " + str
67             else
68                 tp = typeof(value)
69                 txt = txt + ": " + "[" + strcat(string(size(value)), "x") + " " + tp + "]"
70             end
71         end
72         t = [t; txt]
73     end
74
75     mprintf("%s\n", t);
76
77 endfunction