Xcos tests: fix computational_functions, cumsum, error_reporting_nw, model2blk, bug_1...
[scilab.git] / scilab / modules / types / sci_gateway / cpp / sci_fieldnames.cpp
index b89beb0..68440be 100644 (file)
@@ -16,6 +16,7 @@
 #include "double.hxx"
 #include "string.hxx"
 #include "list.hxx"
+#include "user.hxx"
 
 extern "C"
 {
@@ -36,8 +37,8 @@ Function::ReturnValue sci_fieldnames(typed_list &in, int _iRetCount, typed_list
 
 
     // FIXME : iso-functionnal to Scilab < 6
-    // Works on other types excepts {m,t}list and struct
-    if (in[0]->isStruct() == false && in[0]->isMList() == false && in[0]->isTList() == false)
+    // Works on other types except userType, {m,t}list and struct
+    if (in[0]->isStruct() == false && in[0]->isMList() == false && in[0]->isTList() == false && in[0]->isUserType() == false)
     {
         out.push_back(Double::Empty());
         return Function::OK;
@@ -59,17 +60,43 @@ Function::ReturnValue sci_fieldnames(typed_list &in, int _iRetCount, typed_list
         return Function::OK;
     }
 
+    InternalType* pIT;
+
     // TLIST or MLIST
-    // We only need list capabilities so retrieve first argument as List.
-    List *pInList = in[0]->getAs<List>();
-    InternalType *pIT = pInList->get(0);
+    if (in[0]->isList() == true)
+    {
+        // We only need list capabilities to retrieve first argument as List.
+        List *pInList = in[0]->getAs<List>();
+        pIT = pInList->get(0);
+
+        if (pIT == nullptr || pIT->isString() == false)
+        {
+            // FIXME : iso-functionnal to Scilab < 6
+            // Works on other types except userType, {m,t}list and struct
+            out.push_back(Double::Empty());
+            return Function::OK;
+        }
+    }
 
-    if (pIT == NULL || pIT->isString() == false)
+    // USER-TYPE (typically a Xcos object)
+    if (in[0]->isUserType() == true)
     {
-        // FIXME : iso-functionnal to Scilab < 6
-        // Works on other types excepts {m,t}list and struct
-        out.push_back(Double::Empty());
-        return Function::OK;
+        // We only need userType capabilities to retrieve first argument as UserType.
+        UserType *pInUser = in[0]->getAs<UserType>();
+
+        // Extract "diagram" first then the properties, or all in one shot?? Should DiagramA implement such a routine or should fieldnames include DiagramA?
+        //std::cout<<"diag "<<pInUser->getSharedTypeStr()<<std::endl;
+
+        // Extract the properties
+        typed_list one (1, new types::Double(1));
+        InternalType* pProperties = pInUser->extract(&one);
+        if (pProperties == nullptr || pProperties->isString() == false)
+        {
+            // FIXME : iso-functionnal to Scilab < 6
+            // Works on other types except userType, {m,t}list and struct
+            out.push_back(Double::Empty());
+            return Function::OK;
+        }
     }
 
     String *pAllFields = pIT->getAs<String>();
@@ -78,7 +105,6 @@ Function::ReturnValue sci_fieldnames(typed_list &in, int _iRetCount, typed_list
     //    ++pwcsAllStrings;
 
 
-
     String *pNewString = new String(pAllFields->getSize() - 1, 1, pwcsAllStrings + 1);
 
     out.push_back(pNewString);