Xcos tests: fix computational_functions, cumsum, error_reporting_nw, model2blk, bug_1...
[scilab.git] / scilab / modules / types / sci_gateway / cpp / sci_fieldnames.cpp
1 /*
2  *  Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  *  Copyright (C) 2011-2011 - DIGITEO - Bruno JOFRET
4  *
5  *  This file must be used under the terms of the CeCILL.
6  *  This source file is licensed as described in the file COPYING, which
7  *  you should have received as part of this distribution.  The terms
8  *  are also available at
9  *  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
10  *
11  */
12
13 #include "types_gw.hxx"
14 #include "function.hxx"
15 #include "struct.hxx"
16 #include "double.hxx"
17 #include "string.hxx"
18 #include "list.hxx"
19 #include "user.hxx"
20
21 extern "C"
22 {
23 #include "Scierror.h"
24 #include "localization.h"
25 #include "charEncoding.h"
26 }
27
28 using namespace types;
29
30 Function::ReturnValue sci_fieldnames(typed_list &in, int _iRetCount, typed_list &out)
31 {
32     if (in.size() != 1)
33     {
34         Scierror(999, _("%s: Wrong number of input argument(s): %d expected.\n"), "fieldnames", 1);
35         return Function::Error;
36     }
37
38
39     // FIXME : iso-functionnal to Scilab < 6
40     // Works on other types except userType, {m,t}list and struct
41     if (in[0]->isStruct() == false && in[0]->isMList() == false && in[0]->isTList() == false && in[0]->isUserType() == false)
42     {
43         out.push_back(Double::Empty());
44         return Function::OK;
45     }
46
47     // STRUCT
48     if (in[0]->isStruct() == true)
49     {
50         String* pFields = in[0]->getAs<Struct>()->getFieldNames();
51         if (pFields)
52         {
53             out.push_back(pFields);
54             //delete pFields;
55         }
56         else
57         {
58             out.push_back(Double::Empty());
59         }
60         return Function::OK;
61     }
62
63     InternalType* pIT;
64
65     // TLIST or MLIST
66     if (in[0]->isList() == true)
67     {
68         // We only need list capabilities to retrieve first argument as List.
69         List *pInList = in[0]->getAs<List>();
70         pIT = pInList->get(0);
71
72         if (pIT == nullptr || pIT->isString() == false)
73         {
74             // FIXME : iso-functionnal to Scilab < 6
75             // Works on other types except userType, {m,t}list and struct
76             out.push_back(Double::Empty());
77             return Function::OK;
78         }
79     }
80
81     // USER-TYPE (typically a Xcos object)
82     if (in[0]->isUserType() == true)
83     {
84         // We only need userType capabilities to retrieve first argument as UserType.
85         UserType *pInUser = in[0]->getAs<UserType>();
86
87         // Extract "diagram" first then the properties, or all in one shot?? Should DiagramA implement such a routine or should fieldnames include DiagramA?
88         //std::cout<<"diag "<<pInUser->getSharedTypeStr()<<std::endl;
89
90         // Extract the properties
91         typed_list one (1, new types::Double(1));
92         InternalType* pProperties = pInUser->extract(&one);
93         if (pProperties == nullptr || pProperties->isString() == false)
94         {
95             // FIXME : iso-functionnal to Scilab < 6
96             // Works on other types except userType, {m,t}list and struct
97             out.push_back(Double::Empty());
98             return Function::OK;
99         }
100     }
101
102     String *pAllFields = pIT->getAs<String>();
103     wchar_t **pwcsAllStrings =  pAllFields->get();
104     // shift to forget first value corresponding to type.
105     //    ++pwcsAllStrings;
106
107
108     String *pNewString = new String(pAllFields->getSize() - 1, 1, pwcsAllStrings + 1);
109
110     out.push_back(pNewString);
111
112     return Function::OK;
113 }