Coverity: ast module uninitialized members fixed
[scilab.git] / scilab / modules / ast / includes / types / function.hxx
1 /*
2  *  Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  *  Copyright (C) 2008-2008 - DIGITEO - Antoine ELIAS
4  *  Copyright (C) 2010-2010 - DIGITEO - Bruno JOFRET
5  *
6  * Copyright (C) 2012 - 2016 - Scilab Enterprises
7  *
8  * This file is hereby licensed under the terms of the GNU GPL v2.0,
9  * pursuant to article 5.3.4 of the CeCILL v.2.1.
10  * This file was originally licensed under the terms of the CeCILL v2.1,
11  * and continues to be available under such terms.
12  * For more information, see the COPYING file which you should have received
13  * along with this program.
14  *
15  */
16
17 #ifndef __FUNCTION_HXX__
18 #define __FUNCTION_HXX__
19
20
21 #ifdef _MSC_VER
22 #pragma warning(disable: 4251)
23 #endif
24
25 #include <string>
26 #include "types.hxx"
27 #include "callable.hxx"
28
29 extern "C"
30 {
31 #include "c_gateway_prototype.h"
32 #include "dynamiclibrary.h"
33 }
34
35 #define MAX_OUTPUT_VARIABLE             64
36
37 namespace types
38 {
39 class EXTERN_AST Function : public Callable
40 {
41 public :
42     enum FunctionType
43     {
44         EntryPointOldC = 0,
45         EntryPointCPP = 1,
46         EntryPointMex = 2,
47         EntryPointCPPOpt = 3,
48         EntryPointC = 4
49     };
50
51     typedef int(*LOAD_DEPS)(const std::wstring&);
52     typedef int (*INIT_MODULE)(void);
53     typedef ReturnValue (*GW_FUNC)(typed_list &in, int _iRetCount, typed_list &out);
54     typedef ReturnValue (*GW_FUNC_OPT)(typed_list &in, optional_list &opt, int _iRetCount, typed_list &out);
55
56     Function() : Callable() 
57     {
58         m_pFunc = nullptr;
59         m_pLoadDeps = nullptr;
60     };
61     Function(const std::wstring& _wstName, GW_FUNC _pFunc, LOAD_DEPS _pLoadDeps, const std::wstring& _wstModule);
62     ~Function();
63
64     //FIXME : Should not return NULL
65     virtual Function*       clone();
66
67     static Function*        createFunction(const std::wstring& _wstName, GW_FUNC _pFunc, const std::wstring& _wstModule);
68     static Function*        createFunction(const std::wstring& _wstName, GW_FUNC_OPT _pFunc, const std::wstring& _wstModule);
69     static Function*        createFunction(const std::wstring& _wstName, OLDGW_FUNC _pFunc, const std::wstring& _wstModule);
70     static Function*        createFunction(const std::wstring& _wstName, MEXGW_FUNC _pFunc, const std::wstring& _wstModule);
71     static Function*        createFunction(const std::wstring& _wstName, GW_FUNC _pFunc, LOAD_DEPS _pLoadDeps, const std::wstring& _wstModule);
72     static Function*        createFunction(const std::wstring& _wstName, GW_FUNC_OPT _pFunc, LOAD_DEPS _pLoadDeps, const std::wstring& _wstModule);
73     static Function*        createFunction(const std::wstring& _wstName, OLDGW_FUNC _pFunc, LOAD_DEPS _pLoadDeps, const std::wstring& _wstModule);
74     static Function*        createFunction(const std::wstring& _wstName, MEXGW_FUNC _pFunc, LOAD_DEPS _pLoadDeps, const std::wstring& _wstModule);
75     static Function*        createFunction(const std::wstring& _wstName, GW_C_FUNC _pFunc, const std::wstring& _wstModule);
76     static Function*        createFunction(const std::wstring& _wstName, GW_C_FUNC _pFunc, LOAD_DEPS _pLoadDeps, const std::wstring& _wstModule);
77
78     /*dynamic gateways*/
79     static Function*        createFunction(const std::wstring& _wstFunctionName, const std::wstring& _wstEntryPointName, const std::wstring& _wstLibName, FunctionType _iType, LOAD_DEPS _pLoadDeps, const std::wstring& _wstModule, bool _bCloseLibAfterCall = false);
80     static Function*        createFunction(const std::wstring& _wstFunctionName, const std::wstring& _wstEntryPointName, const std::wstring& _wstLibName, FunctionType _iType, const std::wstring& _wstLoadDepsName, const std::wstring& _wstModule, bool _bCloseLibAfterCall = false);
81
82     inline ScilabType       getType(void)
83     {
84         return ScilabFunction;
85     }
86     inline ScilabId         getId(void)
87     {
88         return IdFunction;
89     }
90
91     bool                    isFunction()
92     {
93         return true;
94     }
95
96     void                    whoAmI();
97
98     bool                    toString(std::wostringstream& ostr);
99
100     virtual ReturnValue     call(typed_list &in, optional_list &opt, int _iRetCount, typed_list &out) override;
101
102     /* return type as string ( double, int, cell, list, ... )*/
103     virtual std::wstring    getTypeStr()
104     {
105         return L"fptr";
106     }
107     /* return type as short string ( s, i, ce, l, ... )*/
108     virtual std::wstring    getShortTypeStr()
109     {
110         return L"fptr";
111     }
112
113     GW_FUNC                 getFunc()
114     {
115         return m_pFunc;
116     }
117     LOAD_DEPS               getDeps()
118     {
119         return m_pLoadDeps;
120     }
121
122 private :
123     GW_FUNC                 m_pFunc;
124
125 protected:
126     LOAD_DEPS               m_pLoadDeps;
127
128 };
129
130 class OptFunction : public Function
131 {
132 private :
133     OptFunction(OptFunction* _Function);
134 public :
135     OptFunction(const std::wstring& _wstName, GW_FUNC_OPT _pFunc, LOAD_DEPS _pLoadDeps, const std::wstring& _wstModule);
136
137     Callable::ReturnValue   call(typed_list &in, optional_list &opt, int _iRetCount, typed_list &out) override;
138     OptFunction*            clone();
139
140     GW_FUNC_OPT             getFunc()
141     {
142         return m_pFunc;
143     }
144
145 private:
146     GW_FUNC_OPT             m_pFunc;
147 };
148
149
150 class WrapFunction : public Function
151 {
152 private:
153     WrapFunction(WrapFunction* _pWrapFunction);
154 public:
155     WrapFunction(const std::wstring& _wstName, OLDGW_FUNC _pFunc, LOAD_DEPS _pLoadDeps, const std::wstring& _wstModule);
156
157     Callable::ReturnValue   call(typed_list &in, optional_list &opt, int _iRetCount, typed_list &out) override;
158     WrapFunction*           clone();
159
160     OLDGW_FUNC              getFunc()
161     {
162         return m_pOldFunc;
163     }
164
165 private:
166     OLDGW_FUNC              m_pOldFunc;
167 };
168
169 class WrapCFunction : public Function
170 {
171 private:
172     WrapCFunction(WrapCFunction* _pWrapFunction);
173 public:
174     WrapCFunction(const std::wstring& _wstName, GW_C_FUNC _pFunc, LOAD_DEPS _pLoadDeps, const std::wstring& _wstModule);
175
176     Callable::ReturnValue   call(typed_list &in, optional_list &opt, int _iRetCount, typed_list &out) override;
177     WrapCFunction*          clone();
178
179     GW_C_FUNC               getFunc()
180     {
181         return m_pCFunc;
182     }
183
184 private:
185     GW_C_FUNC               m_pCFunc;
186 };
187
188 class WrapMexFunction : public Function
189 {
190 private :
191     WrapMexFunction(WrapMexFunction* _pWrapFunction);
192 public :
193     WrapMexFunction(const std::wstring& _wstName, MEXGW_FUNC _pFunc, LOAD_DEPS _pLoadDeps, const std::wstring& _wstModule);
194
195     Callable::ReturnValue call(typed_list &in, optional_list &opt, int _iRetCount, typed_list &out) override;
196     WrapMexFunction*        clone();
197
198     MEXGW_FUNC              getFunc()
199     {
200         return m_pOldFunc;
201     }
202
203 private :
204     MEXGW_FUNC              m_pOldFunc;
205 };
206
207 class DynamicFunction : public Function
208 {
209 private :
210     DynamicFunction(DynamicFunction* _pDynamicFunction);
211 public :
212     DynamicFunction(const std::wstring& _wstName, const std::wstring& _wstEntryPointName, const std::wstring& _wstLibName, FunctionType _iType, LOAD_DEPS _pLoadDeps, const std::wstring& _wstModule, bool _bCloseLibAfterCall = false);
213
214     virtual ~DynamicFunction();
215
216     DynamicFunction(const std::wstring& _wstName, const std::wstring& _wstEntryPointName, const std::wstring& _wstLibName, FunctionType _iType, const std::wstring& _wstLoadDepsName, const std::wstring& _wstModule, bool _bCloseLibAfterCall = false);
217     Callable::ReturnValue   call(typed_list &in, optional_list &opt, int _iRetCount, typed_list &out) override;
218
219 private :
220     Callable::ReturnValue   Init();
221     void                    Clear();
222
223     std::wstring            m_wstLibName;
224     std::wstring            m_wstEntryPoint;
225     std::wstring            m_wstLoadDepsName;
226     bool                    m_bCloseLibAfterCall;
227     FunctionType            m_iType;
228     GW_FUNC                 m_pFunc;
229     GW_FUNC_OPT             m_pOptFunc;
230     OLDGW_FUNC              m_pOldFunc;
231     GW_C_FUNC               m_pCFunc;
232     MEXGW_FUNC              m_pMexFunc;
233     Function*               m_pFunction;
234 };
235
236 }
237
238
239 #endif /* !__FUNCTION_HXX__ */