cosmetic, rename functions
[scilab.git] / scilab / modules / functions_manager / src / cpp / dynamic_modules.cpp
1 /*
2 * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3 * Copyright (C) 2011 - DIGITEO - Antoine ELIAS
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 "dynamic_modules.hxx"
14 #include "context.hxx"
15 #include "callDynamicGateway.hxx"
16 #include "funcmanager.hxx"
17 #include "configvariable.hxx"
18
19 extern "C"
20 {
21 #include "loadOnUseClassPath.h"
22     //XML API
23 #include <libxml/xpath.h>
24 #include <libxml/xmlreader.h>
25 #include "MALLOC.h"
26 }
27
28 using namespace types;
29 using namespace std;
30
31 vectGateway loadGatewaysName(wstring _wstModuleName)
32 {
33     vectGateway vect;
34     wstring wstPath = ConfigVariable::getSCIPath();
35     wstring wstModuleName = wstPath + L"/modules/" + _wstModuleName + L"/sci_gateway/" + _wstModuleName + L"_gateway.xml";
36
37     char* pstModuleName = wide_string_to_UTF8(wstModuleName.c_str());
38
39     /* Don't care about line return / empty line */
40     xmlKeepBlanksDefault(0);
41     // parse file
42     xmlDocPtr doc;
43     xmlXPathContextPtr xpathCtxt = NULL;
44     xmlXPathObjectPtr xpathObj = NULL;
45
46     doc = xmlParseFile(pstModuleName);
47     if (doc == NULL)
48     {
49         std::cout << "Error: Could not parse file " << pstModuleName << std::endl;
50         FREE(pstModuleName);
51         return vect;
52     }
53
54     xpathCtxt = xmlXPathNewContext(doc);
55     xpathObj = xmlXPathEval((const xmlChar*)"//module/gateway", xpathCtxt);
56     if (xpathObj && xpathObj->nodesetval->nodeMax)
57     {
58         /* the Xpath has been understood and there are node */
59         for (int        i = 0 ; i < xpathObj->nodesetval->nodeNr ; i++)
60         {
61             GatewayStr str;
62
63             xmlAttrPtr attrib = xpathObj->nodesetval->nodeTab[i]->properties;
64             /* Get the properties of <module>  */
65             while (attrib != NULL)
66             {
67                 /* loop until when have read all the attributes */
68                 if (xmlStrEqual(attrib->name, (const xmlChar*)"name"))
69                 {
70                     str.wstName = to_wide_string((const char*)attrib->children->content);
71                 }
72                 else if (xmlStrEqual(attrib->name, (const xmlChar*)"function"))
73                 {
74                     str.wstFunction = to_wide_string((const char*)attrib->children->content);
75                 }
76                 else if (xmlStrEqual(attrib->name, (const xmlChar*)"type"))
77                 {
78                     str.iType = (types::Function::FunctionType)atoi((const char*)attrib->children->content);
79                 }
80                 attrib = attrib->next;
81             }
82             vect.push_back(str);
83         }
84     }
85
86     if (xpathObj)
87     {
88         xmlXPathFreeObject(xpathObj);
89     }
90
91     if (xpathCtxt)
92     {
93         xmlXPathFreeContext(xpathCtxt);
94     }
95
96     xmlFreeDoc(doc);
97
98     return vect;
99 }
100
101 //Scinotes module
102
103 bool ScinotesModule::loadedDep = false;
104 void ScinotesModule::LoadDeps(void)
105 {
106     if (loadedDep == false)
107     {
108         loadOnUseClassPath("SciNotes");
109         loadedDep = true;
110     }
111 }
112
113 int ScinotesModule::Load()
114 {
115     wstring wstModuleName = L"scinotes";
116 #ifdef _MSC_VER
117     wchar_t* pwstLibName = buildModuleDynLibraryNameW(wstModuleName.c_str(), DYNLIB_NAME_FORMAT_2);
118 #else
119     wchar_t* pwstLibName = buildModuleDynLibraryNameW(wstModuleName.c_str(), DYNLIB_NAME_FORMAT_3);
120 #endif
121     vectGateway vect = loadGatewaysName(wstModuleName);
122
123     for (int i = 0 ; i < (int)vect.size() ; i++)
124     {
125         symbol::Context::getInstance()->addFunction(types::Function::createFunction(vect[i].wstFunction, vect[i].wstName, pwstLibName, vect[i].iType, &ScinotesModule::LoadDeps, wstModuleName));
126     }
127
128     return 1;
129 }
130
131 //Functions module
132 int FunctionsModule::Load()
133 {
134     wstring wstPath = L"functions";
135 #ifdef _MSC_VER
136     wstring wstModuleName = L"functions_gw";
137     wchar_t* pwstLibName = buildModuleDynLibraryNameW(wstModuleName.c_str(), DYNLIB_NAME_FORMAT_1);
138 #else
139     wstring wstModuleName = L"functions";
140     wchar_t* pwstLibName = buildModuleDynLibraryNameW(wstModuleName.c_str(), DYNLIB_NAME_FORMAT_3);
141 #endif
142     vectGateway vect = loadGatewaysName(wstPath);
143
144     for (int i = 0 ; i < (int)vect.size() ; i++)
145     {
146         symbol::Context::getInstance()->addFunction(types::Function::createFunction(vect[i].wstFunction, vect[i].wstName, pwstLibName, vect[i].iType, NULL, wstModuleName));
147     }
148
149     return 1;
150 }
151
152 int StatisticsModule::Load()
153 {
154     wstring wstPath = L"statistics";
155 #ifdef _MSC_VER
156     wstring wstModuleName = L"statistics_gw";
157     wchar_t* pwstLibName = buildModuleDynLibraryNameW(wstModuleName.c_str(), DYNLIB_NAME_FORMAT_1);
158 #else
159     wstring wstModuleName = L"statistics";
160     wchar_t* pwstLibName = buildModuleDynLibraryNameW(wstModuleName.c_str(), DYNLIB_NAME_FORMAT_3);
161 #endif
162     vectGateway vect = loadGatewaysName(wstPath);
163
164     for (int i = 0 ; i < (int)vect.size() ; i++)
165     {
166         symbol::Context::getInstance()->addFunction(types::Function::createFunction(vect[i].wstFunction, vect[i].wstName, pwstLibName, vect[i].iType, NULL, wstModuleName));
167     }
168
169     return 1;
170 }
171
172 int SignalProcessingModule::Load()
173 {
174     wstring wstPath = L"signal_processing";
175 #ifdef _MSC_VER
176     wstring wstModuleName = L"signal_processing_gw";
177     wchar_t* pwstLibName = buildModuleDynLibraryNameW(wstModuleName.c_str(), DYNLIB_NAME_FORMAT_1);
178 #else
179     wstring wstModuleName = L"signal_processing";
180     wchar_t* pwstLibName = buildModuleDynLibraryNameW(wstModuleName.c_str(), DYNLIB_NAME_FORMAT_3);
181 #endif
182     vectGateway vect = loadGatewaysName(wstPath);
183
184     for (int i = 0 ; i < (int)vect.size() ; i++)
185     {
186         symbol::Context::getInstance()->addFunction(types::Function::createFunction(vect[i].wstFunction, vect[i].wstName, pwstLibName, vect[i].iType, NULL, wstModuleName));
187     }
188
189     return 1;
190 }
191
192 void HelptoolsModule::LoadDeps(void)
193 {
194     if (loadedDep == false)
195     {
196         loadOnUseClassPath("documentationGeneration");
197         loadedDep = true;
198     }
199 }
200
201 bool HelptoolsModule::loadedDep = false;
202 int HelptoolsModule::Load()
203 {
204     wstring wstModuleName = L"helptools";
205 #ifdef _MSC_VER
206     wchar_t* pwstLibName = buildModuleDynLibraryNameW(wstModuleName.c_str(), DYNLIB_NAME_FORMAT_1);
207 #else
208     wchar_t* pwstLibName = buildModuleDynLibraryNameW(wstModuleName.c_str(), DYNLIB_NAME_FORMAT_3);
209 #endif
210
211     vectGateway vect = loadGatewaysName(wstModuleName);
212
213     for (int i = 0 ; i < (int)vect.size() ; i++)
214     {
215         symbol::Context::getInstance()->addFunction(types::Function::createFunction(vect[i].wstFunction, vect[i].wstName, pwstLibName, vect[i].iType, &HelptoolsModule::LoadDeps, wstModuleName));
216     }
217
218     return 1;
219 }
220
221 int MatioModule::Load()
222 {
223     wstring wstPath = L"matio";
224 #ifdef _MSC_VER
225     wstring wstModuleName = L"matio_gw";
226     wchar_t* pwstLibName = buildModuleDynLibraryNameW(wstModuleName.c_str(), DYNLIB_NAME_FORMAT_1);
227 #else
228     wstring wstModuleName = L"matio";
229     wchar_t* pwstLibName = buildModuleDynLibraryNameW(wstModuleName.c_str(), DYNLIB_NAME_FORMAT_3);
230 #endif
231     vectGateway vect = loadGatewaysName(wstPath);
232
233     for (int i = 0 ; i < (int)vect.size() ; i++)
234     {
235         symbol::Context::getInstance()->addFunction(types::Function::createFunction(vect[i].wstFunction, vect[i].wstName, pwstLibName, vect[i].iType, NULL, wstModuleName));
236     }
237
238     return 1;
239 }
240
241 int Hdf5Module::Load()
242 {
243     wstring wstModuleName = L"hdf5";
244 #ifdef _MSC_VER
245     wchar_t* pwstLibName = buildModuleDynLibraryNameW(wstModuleName.c_str(), DYNLIB_NAME_FORMAT_1);
246 #else
247     wchar_t* pwstLibName = buildModuleDynLibraryNameW(wstModuleName.c_str(), DYNLIB_NAME_FORMAT_3);
248 #endif
249     vectGateway vect = loadGatewaysName(wstModuleName);
250
251     for (int i = 0 ; i < (int)vect.size() ; i++)
252     {
253         symbol::Context::getInstance()->addFunction(types::Function::createFunction(vect[i].wstFunction, vect[i].wstName, pwstLibName, vect[i].iType, NULL, wstModuleName));
254     }
255
256     return 1;
257 }
258
259 int ActionBindingModule::Load()
260 {
261     wstring wstPath = L"action_binding";
262 #ifdef _MSC_VER
263     wstring wstModuleName = L"action_binding_gw";
264     wchar_t* pwstLibName = buildModuleDynLibraryNameW(wstModuleName.c_str(), DYNLIB_NAME_FORMAT_2);
265 #else
266     wstring wstModuleName = L"action_binding";
267     wchar_t* pwstLibName = buildModuleDynLibraryNameW(wstModuleName.c_str(), DYNLIB_NAME_FORMAT_3);
268 #endif
269     vectGateway vect = loadGatewaysName(wstPath);
270
271     for (int i = 0 ; i < (int)vect.size() ; i++)
272     {
273         symbol::Context::getInstance()->addFunction(types::Function::createFunction(vect[i].wstFunction, vect[i].wstName, pwstLibName, vect[i].iType, NULL, wstModuleName));
274     }
275
276     return 1;
277 }
278
279 int DifferentialEquationsModule::Load()
280 {
281     wstring wstPath = L"differential_equations";
282 #ifdef _MSC_VER
283     wstring wstModuleName = L"differential_equations_gw";
284     wchar_t* pwstLibName = buildModuleDynLibraryNameW(wstModuleName.c_str(), DYNLIB_NAME_FORMAT_1);
285 #else
286     wstring wstModuleName = L"differential_equations";
287     wchar_t* pwstLibName = buildModuleDynLibraryNameW(wstModuleName.c_str(), DYNLIB_NAME_FORMAT_3);
288 #endif
289     vectGateway vect = loadGatewaysName(wstPath);
290
291     for (int i = 0 ; i < (int)vect.size() ; i++)
292     {
293         symbol::Context::getInstance()->addFunction(types::Function::createFunction(vect[i].wstFunction, vect[i].wstName, pwstLibName, vect[i].iType, NULL, wstModuleName));
294     }
295
296     return 1;
297 }
298
299 int SpreadsheetModule::Load()
300 {
301     wstring wstModuleName = L"spreadsheet";
302 #ifdef _MSC_VER
303     wchar_t* pwstLibName = buildModuleDynLibraryNameW(wstModuleName.c_str(), DYNLIB_NAME_FORMAT_1);
304 #else
305     wchar_t* pwstLibName = buildModuleDynLibraryNameW(wstModuleName.c_str(), DYNLIB_NAME_FORMAT_3);
306 #endif
307     vectGateway vect = loadGatewaysName(wstModuleName);
308
309     for (int i = 0 ; i < (int)vect.size() ; i++)
310     {
311         symbol::Context::getInstance()->addFunction(types::Function::createFunction(vect[i].wstFunction, vect[i].wstName, pwstLibName, vect[i].iType, NULL, wstModuleName));
312     }
313
314     return 1;
315 }
316
317 int InterpolationModule::Load()
318 {
319     wstring wstPath = L"interpolation";
320 #ifdef _MSC_VER
321     wstring wstModuleName = L"interpolation";
322     wchar_t* pwstLibName = buildModuleDynLibraryNameW(wstModuleName.c_str(), DYNLIB_NAME_FORMAT_1);
323 #else
324     wstring wstModuleName = L"interpolation";
325     wchar_t* pwstLibName = buildModuleDynLibraryNameW(wstModuleName.c_str(), DYNLIB_NAME_FORMAT_3);
326 #endif
327     vectGateway vect = loadGatewaysName(wstPath);
328
329     for (int i = 0 ; i < (int)vect.size() ; i++)
330     {
331         symbol::Context::getInstance()->addFunction(types::Function::createFunction(vect[i].wstFunction, vect[i].wstName, pwstLibName, vect[i].iType, NULL, wstModuleName));
332     }
333
334     return 1;
335 }
336
337 int SoundModule::Load()
338 {
339     wstring wstPath = L"sound";
340 #ifdef _MSC_VER
341     wstring wstModuleName = L"sound";
342     wchar_t* pwstLibName = buildModuleDynLibraryNameW(wstModuleName.c_str(), DYNLIB_NAME_FORMAT_1);
343 #else
344     wstring wstModuleName = L"sound";
345     wchar_t* pwstLibName = buildModuleDynLibraryNameW(wstModuleName.c_str(), DYNLIB_NAME_FORMAT_3);
346 #endif
347     vectGateway vect = loadGatewaysName(wstPath);
348
349     for (int i = 0 ; i < (int)vect.size() ; i++)
350     {
351         symbol::Context::getInstance()->addFunction(types::Function::createFunction(vect[i].wstFunction, vect[i].wstName, pwstLibName, vect[i].iType, NULL, wstModuleName));
352     }
353
354     return 1;
355 }
356
357 int RandlibModule::Load()
358 {
359     wstring wstModuleName = L"randlib";
360 #ifdef _MSC_VER
361     wchar_t* pwstLibName = buildModuleDynLibraryNameW(wstModuleName.c_str(), DYNLIB_NAME_FORMAT_1);
362 #else
363     wchar_t* pwstLibName = buildModuleDynLibraryNameW(wstModuleName.c_str(), DYNLIB_NAME_FORMAT_3);
364 #endif
365     vectGateway vect = loadGatewaysName(wstModuleName);
366
367     for (int i = 0 ; i < (int)vect.size() ; i++)
368     {
369         symbol::Context::getInstance()->addFunction(types::Function::createFunction(vect[i].wstFunction, vect[i].wstName, pwstLibName, vect[i].iType, NULL, wstModuleName));
370     }
371
372     return 1;
373 }
374
375 int CacsdModule::Load()
376 {
377     wstring wstModuleName = L"cacsd";
378 #ifdef _MSC_VER
379     wchar_t* pwstLibName = buildModuleDynLibraryNameW(wstModuleName.c_str(), DYNLIB_NAME_FORMAT_1);
380 #else
381     wchar_t* pwstLibName = buildModuleDynLibraryNameW(wstModuleName.c_str(), DYNLIB_NAME_FORMAT_3);
382 #endif
383     vectGateway vect = loadGatewaysName(wstModuleName);
384
385     for (int i = 0 ; i < (int)vect.size() ; i++)
386     {
387         symbol::Context::getInstance()->addFunction(types::Function::createFunction(vect[i].wstFunction, vect[i].wstName, pwstLibName, vect[i].iType, NULL, wstModuleName));
388     }
389
390     return 1;
391 }
392
393 int UmfpackModule::Load()
394 {
395     wstring wstModuleName = L"umfpack";
396 #ifdef _MSC_VER
397     wchar_t* pwstLibName = buildModuleDynLibraryNameW(wstModuleName.c_str(), DYNLIB_NAME_FORMAT_1);
398 #else
399     wchar_t* pwstLibName = buildModuleDynLibraryNameW(wstModuleName.c_str(), DYNLIB_NAME_FORMAT_3);
400 #endif
401     vectGateway vect = loadGatewaysName(wstModuleName);
402
403     for (int i = 0 ; i < (int)vect.size() ; i++)
404     {
405         symbol::Context::getInstance()->addFunction(types::Function::createFunction(vect[i].wstFunction, vect[i].wstName, pwstLibName, vect[i].iType, NULL, wstModuleName));
406     }
407
408     return 1;
409 }
410
411 int OptimizationModule::Load()
412 {
413     wstring wstModuleName = L"optimization";
414 #ifdef _MSC_VER
415     wchar_t* pwstLibName = buildModuleDynLibraryNameW(wstModuleName.c_str(), DYNLIB_NAME_FORMAT_1);
416 #else
417     wchar_t* pwstLibName = buildModuleDynLibraryNameW(wstModuleName.c_str(), DYNLIB_NAME_FORMAT_3);
418 #endif
419     vectGateway vect = loadGatewaysName(wstModuleName);
420
421     for (int i = 0 ; i < (int)vect.size() ; i++)
422     {
423         symbol::Context::getInstance()->addFunction(types::Function::createFunction(vect[i].wstFunction, vect[i].wstName, pwstLibName, vect[i].iType, NULL, wstModuleName));
424     }
425
426     return 1;
427 }
428
429 int SpecialFunctionModule::Load()
430 {
431     wstring wstModuleName = L"special_functions";
432 #ifdef _MSC_VER
433     wchar_t* pwstLibName = buildModuleDynLibraryNameW(wstModuleName.c_str(), DYNLIB_NAME_FORMAT_1);
434 #else
435     wchar_t* pwstLibName = buildModuleDynLibraryNameW(wstModuleName.c_str(), DYNLIB_NAME_FORMAT_3);
436 #endif
437     vectGateway vect = loadGatewaysName(wstModuleName);
438
439     for (int i = 0 ; i < (int)vect.size() ; i++)
440     {
441         symbol::Context::getInstance()->addFunction(types::Function::createFunction(vect[i].wstFunction, vect[i].wstName, pwstLibName, vect[i].iType, NULL, wstModuleName));
442     }
443
444     return 1;
445 }
446
447 int GraphicExportModule::Load()
448 {
449     wstring wstModuleName = L"graphic_export";
450 #ifdef _MSC_VER
451     wchar_t* pwstLibName = buildModuleDynLibraryNameW(wstModuleName.c_str(), DYNLIB_NAME_FORMAT_1);
452 #else
453     wchar_t* pwstLibName = buildModuleDynLibraryNameW(wstModuleName.c_str(), DYNLIB_NAME_FORMAT_3);
454 #endif
455     vectGateway vect = loadGatewaysName(wstModuleName);
456
457     for (int i = 0 ; i < (int)vect.size() ; i++)
458     {
459         symbol::Context::getInstance()->addFunction(types::Function::createFunction(vect[i].wstFunction, vect[i].wstName, pwstLibName, vect[i].iType, NULL, wstModuleName));
460     }
461
462     return 1;
463 }