Coverity: Core module errors fixed
[scilab.git] / scilab / modules / core / 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  * Copyright (C) 2012 - 2016 - Scilab Enterprises
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  */
15
16 #include "core_gw.hxx"
17 #include "function.hxx"
18 #include "struct.hxx"
19 #include "double.hxx"
20 #include "string.hxx"
21 #include "list.hxx"
22 #include "user.hxx"
23
24 extern "C"
25 {
26 #include "Scierror.h"
27 #include "localization.h"
28 #include "charEncoding.h"
29 }
30
31 types::Function::ReturnValue sci_fieldnames(types::typed_list &in, int _iRetCount, types::typed_list &out)
32 {
33     if (in.size() != 1)
34     {
35         Scierror(999, _("%s: Wrong number of input argument(s): %d expected.\n"), "fieldnames", 1);
36         return types::Function::Error;
37     }
38
39
40     // FIXME : iso-functionnal to Scilab < 6
41     // Works on other types except userType, {m,t}list and struct
42     if (in[0]->isStruct() == false && in[0]->isMList() == false && in[0]->isTList() == false && in[0]->isUserType() == false)
43     {
44         out.push_back(types::Double::Empty());
45         return types::Function::OK;
46     }
47
48     // STRUCT
49     if (in[0]->isStruct() == true)
50     {
51         types::String* pFields = in[0]->getAs<types::Struct>()->getFieldNames();
52         if (pFields)
53         {
54             out.push_back(pFields);
55             //delete pFields;
56         }
57         else
58         {
59             out.push_back(types::Double::Empty());
60         }
61         return types::Function::OK;
62     }
63
64     types::InternalType* pIT;
65
66     // TLIST or MLIST
67     if (in[0]->isList() == true)
68     {
69         // We only need list capabilities to retrieve first argument as List.
70         types::List *pInList = in[0]->getAs<types::List>();
71         pIT = pInList->get(0);
72
73         if (pIT == nullptr || pIT->isString() == false)
74         {
75             // FIXME : iso-functionnal to Scilab < 6
76             // Works on other types except userType, {m,t}list and struct
77             out.push_back(types::Double::Empty());
78             return types::Function::OK;
79         }
80     }
81
82     // USER-TYPE (typically an Xcos object)
83     if (in[0]->isUserType() == true)
84     {
85         // We only need userType capabilities to retrieve first argument as UserType.
86         types::UserType *pInUser = in[0]->getAs<types::UserType>();
87
88         // Extract the sub-type
89         std::wstring subType (pInUser->getShortTypeStr());
90
91         // Extract the properties
92         types::typed_list one(1, new types::Double(1));
93         types::InternalType* pProperties = pInUser->extract(&one);
94         if (pProperties == nullptr || pProperties->isString() == false)
95         {
96             // FIXME : iso-functionnal to Scilab < 6
97             // Works on other types except userType, {m,t}list and struct
98             out.push_back(types::Double::Empty());
99             return types::Function::OK;
100         }
101         int nProp = ((types::String*) pProperties)->getSize();
102
103         pIT = new types::String(nProp + 1, 1);
104         ((types::String*) pIT)->set(0, subType.data());
105         for (int i = 0; i < nProp; ++i)
106         {
107             ((types::String*) pIT)->set(i + 1, ((types::String*)pProperties)->get(i));
108         }
109     }
110
111     types::String *pAllFields;
112     if (pIT)
113     {
114         pAllFields = pIT->getAs<types::String>();
115     }
116     else
117     {
118         Scierror(999, _("Could not retrieve sub-type.\n"));
119         return types::Function::Error;
120     }
121     wchar_t **pwcsAllStrings =  pAllFields->get();
122     // shift to forget first value corresponding to type.
123     //    ++pwcsAllStrings;
124
125
126     types::String *pNewString = new types::String(pAllFields->getSize() - 1, 1, pwcsAllStrings + 1);
127
128     out.push_back(pNewString);
129
130     return types::Function::OK;
131 }