* Bug 15032 fixed: regression of structure fields display fixed 48/20648/11
St├ęphane Mottelet [Fri, 30 Nov 2018 08:39:22 +0000 (09:39 +0100)]
http://bugzilla.scilab.org/show_bug.cgi?id=15032

Change-Id: Ieb4c1b1f50765aa05c4004c24b2a2c30171ead1d

scilab/modules/ast/src/cpp/types/types_tools.cpp
scilab/modules/overloading/macros/%st_p.sci

index b10a1e4..7511931 100644 (file)
@@ -929,7 +929,7 @@ int getIndexWithDims(int* _piIndexes, const int* _piDims, int _iDims)
 
 types::Function::ReturnValue VariableToString(types::InternalType* pIT, const wchar_t* wcsVarName)
 {
-    if (pIT->hasToString() == false)
+    if (pIT->hasToString() == false || pIT->isStruct())
     {
         types::Function::ReturnValue ret = types::Function::Error;
         //call overload %type_p
index 1eb5d63..9e02827 100644 (file)
@@ -1,8 +1,8 @@
 // Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
 // Copyright (C) INRIA
 // Copyright (C) 2010 - DIGITEO - Vincent COUVERT <vincent.couvert@scilab.org>
-//
 // Copyright (C) 2012 - 2016 - Scilab Enterprises
+// Copyright (C) 2018 - St├ęphane MOTTELET
 //
 // 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.
@@ -15,66 +15,63 @@ function %st_p(s)
 
     //matlab-like struct display
 
-    f     = getfield(1,s)
     ll    = lines()
     t     = []
-    multi = prod(double(s.dims));
+    multi = size(s,"*")
 
     // No fields
-    if size(f, "*")==2 then
-        t = strcat(string(double(s.dims)), "x") + " struct array with no fields.";
-        write(%io(2),t,"(a)");
+    if isempty(fieldnames(s)) then
+        t = strcat(string(size(s)), "x") + " struct array with no fields.";
+        mprintf("%s", t);
         return
     end
 
     // 0x0 struct with fields
-    if multi==0 then
-        t="0x0 struct array with fields:"
-        for k=3:size(f,"*")
-            t=[t;"   "+f(k)]
+    if multi == 0 then
+        t = "0x0 struct array with fields:"
+        for field = fieldnames(s)'
+            t = [t; "   "+field]
         end
-        write(%io(2),t,"(a)")
+        mprintf("%s", t);
         return
     end
-
     // axb struct where a<>0 & b<>0
 
-    if multi>1 then
-        t=strcat(string(double(s.dims)),"x") + " struct array with fields:";
+    if multi > 1 then
+        t = strcat(string(size(s)), "x") + " struct array with fields:";
     end
 
-    for k=3:size(f,"*")
-        var=f(k)
-        value=s(var)
-        tp=typeof(value)
-        if tp=="st" then
-            str="[" + strcat(string(size(value)),"x")+" struct" + "]";
+    for field = fieldnames(s)'
+        value = s(field)
+        tp = typeof(value)
+        if tp == "st" then
+            str = "[" + strcat(string(size(value)), "x") + " struct" + "]";
         elseif type(value)> 10 then
-            str=tp
+            str = tp
         else
-            sz=size(value)
+            sz = size(value)
             // If number of elements in value is greater than ll(1) (current page width)
             // then we do not call sci2exp
             // because the returned value will be ignored at line 64: size(str,"*")==1
             // Note that ll(1)/2 elements could be the max because of colon, semi-colon and brackets added between elements by sci2exp
-            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
-                str=sci2exp(value,ll(1))
+            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
+                str = sci2exp(value, ll(1))
             else
-                str="["+strcat(string(size(value)),"x")+" "+tp+"]"
+                str = "[" + strcat(string(size(value)), "x") + " " + tp + "]"
             end
         end
-        txt="   "+var
-        if multi<=1 then
-            if size(str,"*")==1 then
-                txt=txt+": "+str
+        txt = "   " + field
+        if multi <= 1 then
+            if size(str,"*") == 1 then
+                txt = txt + ": " + str
             else
-                tp=typeof(value)
-                txt=txt+": "+"["+strcat(string(size(value)),"x")+" "+tp+"]"
+                tp = typeof(value)
+                txt = txt + ": " + "[" + strcat(string(size(value)), "x") + " " + tp + "]"
             end
         end
-        t=[t;txt]
+        t = [t; txt]
     end
 
-    write(%io(2),t,"(a)")
+    mprintf("%s", t);
 
 endfunction