2 * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3 * Copyright (C) 2011 - DIGITEO - Antoine ELIAS
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
13 #include "dynamic_modules.hxx"
14 #include "context.hxx"
15 #include "configvariable.hxx"
19 #include "loadOnUseClassPath.h"
21 #include <libxml/xpath.h>
22 #include <libxml/xmlreader.h>
23 #include "sci_malloc.h"
24 #include "configvariable_interface.h"
27 using namespace types;
30 vectGateway loadGatewaysName(wstring _wstModuleName)
33 wstring wstPath = ConfigVariable::getSCIPath();
34 wstring wstModuleName = wstPath + L"/modules/" + _wstModuleName + L"/sci_gateway/" + _wstModuleName + L"_gateway.xml";
36 char* pstModuleName = wide_string_to_UTF8(wstModuleName.c_str());
38 /* Don't care about line return / empty line */
39 xmlKeepBlanksDefault(0);
42 xmlXPathContextPtr xpathCtxt = NULL;
43 xmlXPathObjectPtr xpathObj = NULL;
45 doc = xmlParseFile(pstModuleName);
48 std::cout << "Error: Could not parse file " << pstModuleName << std::endl;
54 xpathCtxt = xmlXPathNewContext(doc);
55 xpathObj = xmlXPathEval((const xmlChar*)"//module/gateway", xpathCtxt);
56 if (xpathObj && xpathObj->nodesetval->nodeMax)
58 /* the Xpath has been understood and there are node */
59 for (int i = 0 ; i < xpathObj->nodesetval->nodeNr ; i++)
63 xmlAttrPtr attrib = xpathObj->nodesetval->nodeTab[i]->properties;
64 /* Get the properties of <module> */
65 while (attrib != NULL)
67 /* loop until when have read all the attributes */
68 if (xmlStrEqual(attrib->name, (const xmlChar*)"name"))
70 wchar_t * ws = to_wide_string((const char*)attrib->children->content);
74 else if (xmlStrEqual(attrib->name, (const xmlChar*)"function"))
76 wchar_t * ws = to_wide_string((const char*)attrib->children->content);
80 else if (xmlStrEqual(attrib->name, (const xmlChar*)"type"))
82 str.iType = (types::Function::FunctionType)atoi((const char*)attrib->children->content);
84 attrib = attrib->next;
92 xmlXPathFreeObject(xpathObj);
97 xmlXPathFreeContext(xpathCtxt);
107 bool ScinotesModule::loadedDep = false;
108 void ScinotesModule::LoadDeps(std::wstring _functionName)
110 if (loadedDep == false)
112 loadOnUseClassPath("SciNotes");
117 int ScinotesModule::Load()
119 wstring wstModuleName = L"scinotes";
121 wchar_t* pwstLibName = buildModuleDynLibraryNameW(wstModuleName.c_str(), DYNLIB_NAME_FORMAT_2);
123 wchar_t* pwstLibName = buildModuleDynLibraryNameW(wstModuleName.c_str(), DYNLIB_NAME_FORMAT_3);
125 vectGateway vect = loadGatewaysName(wstModuleName);
127 for (int i = 0 ; i < (int)vect.size() ; i++)
129 symbol::Context::getInstance()->addFunction(types::Function::createFunction(vect[i].wstFunction, vect[i].wstName, pwstLibName, vect[i].iType, &ScinotesModule::LoadDeps, wstModuleName));
137 int FunctionsModule::Load()
139 wstring wstPath = L"functions";
141 wstring wstModuleName = L"functions_gw";
142 wchar_t* pwstLibName = buildModuleDynLibraryNameW(wstModuleName.c_str(), DYNLIB_NAME_FORMAT_1);
144 wstring wstModuleName = L"functions";
145 wchar_t* pwstLibName = buildModuleDynLibraryNameW(wstModuleName.c_str(), DYNLIB_NAME_FORMAT_3);
147 vectGateway vect = loadGatewaysName(wstPath);
149 for (int i = 0 ; i < (int)vect.size() ; i++)
151 symbol::Context::getInstance()->addFunction(types::Function::createFunction(vect[i].wstFunction, vect[i].wstName, pwstLibName, vect[i].iType, NULL, wstModuleName));
158 int StatisticsModule::Load()
160 wstring wstPath = L"statistics";
162 wstring wstModuleName = L"statistics_gw";
163 wchar_t* pwstLibName = buildModuleDynLibraryNameW(wstModuleName.c_str(), DYNLIB_NAME_FORMAT_1);
165 wstring wstModuleName = L"statistics";
166 wchar_t* pwstLibName = buildModuleDynLibraryNameW(wstModuleName.c_str(), DYNLIB_NAME_FORMAT_3);
168 vectGateway vect = loadGatewaysName(wstPath);
170 for (int i = 0 ; i < (int)vect.size() ; i++)
172 symbol::Context::getInstance()->addFunction(types::Function::createFunction(vect[i].wstFunction, vect[i].wstName, pwstLibName, vect[i].iType, NULL, wstModuleName));
179 int SignalProcessingModule::Load()
181 wstring wstPath = L"signal_processing";
183 wstring wstModuleName = L"signal_processing_gw";
184 wchar_t* pwstLibName = buildModuleDynLibraryNameW(wstModuleName.c_str(), DYNLIB_NAME_FORMAT_1);
186 wstring wstModuleName = L"signal_processing";
187 wchar_t* pwstLibName = buildModuleDynLibraryNameW(wstModuleName.c_str(), DYNLIB_NAME_FORMAT_3);
189 vectGateway vect = loadGatewaysName(wstPath);
191 for (int i = 0 ; i < (int)vect.size() ; i++)
193 symbol::Context::getInstance()->addFunction(types::Function::createFunction(vect[i].wstFunction, vect[i].wstName, pwstLibName, vect[i].iType, NULL, wstModuleName));
200 void HelptoolsModule::LoadDeps(std::wstring _functionName)
202 if (loadedDep == false)
204 loadOnUseClassPath("documentationGeneration");
209 bool HelptoolsModule::loadedDep = false;
210 int HelptoolsModule::Load()
212 wstring wstModuleName = L"helptools";
214 wchar_t* pwstLibName = buildModuleDynLibraryNameW(wstModuleName.c_str(), DYNLIB_NAME_FORMAT_1);
216 wchar_t* pwstLibName = buildModuleDynLibraryNameW(wstModuleName.c_str(), DYNLIB_NAME_FORMAT_3);
219 vectGateway vect = loadGatewaysName(wstModuleName);
221 for (int i = 0 ; i < (int)vect.size() ; i++)
223 symbol::Context::getInstance()->addFunction(types::Function::createFunction(vect[i].wstFunction, vect[i].wstName, pwstLibName, vect[i].iType, &HelptoolsModule::LoadDeps, wstModuleName));
230 int MatioModule::Load()
232 wstring wstPath = L"matio";
234 wstring wstModuleName = L"matio_gw";
235 wchar_t* pwstLibName = buildModuleDynLibraryNameW(wstModuleName.c_str(), DYNLIB_NAME_FORMAT_1);
237 wstring wstModuleName = L"matio";
238 wchar_t* pwstLibName = buildModuleDynLibraryNameW(wstModuleName.c_str(), DYNLIB_NAME_FORMAT_3);
240 vectGateway vect = loadGatewaysName(wstPath);
242 for (int i = 0 ; i < (int)vect.size() ; i++)
244 symbol::Context::getInstance()->addFunction(types::Function::createFunction(vect[i].wstFunction, vect[i].wstName, pwstLibName, vect[i].iType, NULL, wstModuleName));
251 int Hdf5Module::Load()
253 wstring wstModuleName = L"hdf5";
255 wchar_t* pwstLibName = buildModuleDynLibraryNameW(wstModuleName.c_str(), DYNLIB_NAME_FORMAT_1);
257 wchar_t* pwstLibName = buildModuleDynLibraryNameW(wstModuleName.c_str(), DYNLIB_NAME_FORMAT_3);
259 vectGateway vect = loadGatewaysName(wstModuleName);
261 for (int i = 0 ; i < (int)vect.size() ; i++)
263 symbol::Context::getInstance()->addFunction(types::Function::createFunction(vect[i].wstFunction, vect[i].wstName, pwstLibName, vect[i].iType, NULL, wstModuleName));
270 int ActionBindingModule::Load()
272 wstring wstPath = L"action_binding";
274 wstring wstModuleName = L"action_binding_gw";
275 wchar_t* pwstLibName = buildModuleDynLibraryNameW(wstModuleName.c_str(), DYNLIB_NAME_FORMAT_2);
277 wstring wstModuleName = L"action_binding";
278 wchar_t* pwstLibName = buildModuleDynLibraryNameW(wstModuleName.c_str(), DYNLIB_NAME_FORMAT_3);
280 vectGateway vect = loadGatewaysName(wstPath);
282 for (int i = 0 ; i < (int)vect.size() ; i++)
284 symbol::Context::getInstance()->addFunction(types::Function::createFunction(vect[i].wstFunction, vect[i].wstName, pwstLibName, vect[i].iType, NULL, wstModuleName));
291 int SpreadsheetModule::Load()
293 wstring wstModuleName = L"spreadsheet";
295 wchar_t* pwstLibName = buildModuleDynLibraryNameW(wstModuleName.c_str(), DYNLIB_NAME_FORMAT_1);
297 wchar_t* pwstLibName = buildModuleDynLibraryNameW(wstModuleName.c_str(), DYNLIB_NAME_FORMAT_3);
299 vectGateway vect = loadGatewaysName(wstModuleName);
301 for (int i = 0 ; i < (int)vect.size() ; i++)
303 symbol::Context::getInstance()->addFunction(types::Function::createFunction(vect[i].wstFunction, vect[i].wstName, pwstLibName, vect[i].iType, NULL, wstModuleName));
310 int InterpolationModule::Load()
312 wstring wstPath = L"interpolation";
314 wstring wstModuleName = L"interpolation";
315 wchar_t* pwstLibName = buildModuleDynLibraryNameW(wstModuleName.c_str(), DYNLIB_NAME_FORMAT_1);
317 wstring wstModuleName = L"interpolation";
318 wchar_t* pwstLibName = buildModuleDynLibraryNameW(wstModuleName.c_str(), DYNLIB_NAME_FORMAT_3);
320 vectGateway vect = loadGatewaysName(wstPath);
322 for (int i = 0 ; i < (int)vect.size() ; i++)
324 symbol::Context::getInstance()->addFunction(types::Function::createFunction(vect[i].wstFunction, vect[i].wstName, pwstLibName, vect[i].iType, NULL, wstModuleName));
331 int SoundModule::Load()
333 wstring wstPath = L"sound";
335 wstring wstModuleName = L"sound";
336 wchar_t* pwstLibName = buildModuleDynLibraryNameW(wstModuleName.c_str(), DYNLIB_NAME_FORMAT_1);
338 wstring wstModuleName = L"sound";
339 wchar_t* pwstLibName = buildModuleDynLibraryNameW(wstModuleName.c_str(), DYNLIB_NAME_FORMAT_3);
341 vectGateway vect = loadGatewaysName(wstPath);
343 for (int i = 0 ; i < (int)vect.size() ; i++)
345 symbol::Context::getInstance()->addFunction(types::Function::createFunction(vect[i].wstFunction, vect[i].wstName, pwstLibName, vect[i].iType, NULL, wstModuleName));
352 int RandlibModule::Load()
354 wstring wstModuleName = L"randlib";
356 wchar_t* pwstLibName = buildModuleDynLibraryNameW(wstModuleName.c_str(), DYNLIB_NAME_FORMAT_1);
358 wchar_t* pwstLibName = buildModuleDynLibraryNameW(wstModuleName.c_str(), DYNLIB_NAME_FORMAT_3);
360 vectGateway vect = loadGatewaysName(wstModuleName);
362 for (int i = 0 ; i < (int)vect.size() ; i++)
364 symbol::Context::getInstance()->addFunction(types::Function::createFunction(vect[i].wstFunction, vect[i].wstName, pwstLibName, vect[i].iType, NULL, wstModuleName));
371 int UmfpackModule::Load()
373 wstring wstModuleName = L"umfpack";
375 wchar_t* pwstLibName = buildModuleDynLibraryNameW(wstModuleName.c_str(), DYNLIB_NAME_FORMAT_1);
377 wchar_t* pwstLibName = buildModuleDynLibraryNameW(wstModuleName.c_str(), DYNLIB_NAME_FORMAT_3);
379 vectGateway vect = loadGatewaysName(wstModuleName);
381 for (int i = 0 ; i < (int)vect.size() ; i++)
383 symbol::Context::getInstance()->addFunction(types::Function::createFunction(vect[i].wstFunction, vect[i].wstName, pwstLibName, vect[i].iType, NULL, wstModuleName));
390 int OptimizationModule::Load()
392 wstring wstModuleName = L"optimization";
394 wchar_t* pwstLibName = buildModuleDynLibraryNameW(wstModuleName.c_str(), DYNLIB_NAME_FORMAT_1);
396 wchar_t* pwstLibName = buildModuleDynLibraryNameW(wstModuleName.c_str(), DYNLIB_NAME_FORMAT_3);
398 vectGateway vect = loadGatewaysName(wstModuleName);
400 for (int i = 0 ; i < (int)vect.size() ; i++)
402 symbol::Context::getInstance()->addFunction(types::Function::createFunction(vect[i].wstFunction, vect[i].wstName, pwstLibName, vect[i].iType, NULL, wstModuleName));
409 int SpecialFunctionsModule::Load()
411 wstring wstModuleName = L"special_functions";
413 wchar_t* pwstLibName = buildModuleDynLibraryNameW(wstModuleName.c_str(), DYNLIB_NAME_FORMAT_1);
415 wchar_t* pwstLibName = buildModuleDynLibraryNameW(wstModuleName.c_str(), DYNLIB_NAME_FORMAT_3);
417 vectGateway vect = loadGatewaysName(wstModuleName);
419 for (int i = 0 ; i < (int)vect.size() ; i++)
421 symbol::Context::getInstance()->addFunction(types::Function::createFunction(vect[i].wstFunction, vect[i].wstName, pwstLibName, vect[i].iType, NULL, wstModuleName));
428 int GraphicExportModule::Load()
430 wstring wstModuleName = L"graphic_export";
432 wchar_t* pwstLibName = buildModuleDynLibraryNameW(wstModuleName.c_str(), DYNLIB_NAME_FORMAT_2);
434 wchar_t* pwstLibName = buildModuleDynLibraryNameW(wstModuleName.c_str(), DYNLIB_NAME_FORMAT_3);
436 vectGateway vect = loadGatewaysName(wstModuleName);
438 for (int i = 0 ; i < (int)vect.size() ; i++)
440 symbol::Context::getInstance()->addFunction(types::Function::createFunction(vect[i].wstFunction, vect[i].wstName, pwstLibName, vect[i].iType, NULL, wstModuleName));
447 int ArnoldiModule::Load()
449 wstring wstModuleName = L"arnoldi";
451 wchar_t* pwstLibName = buildModuleDynLibraryNameW(wstModuleName.c_str(), DYNLIB_NAME_FORMAT_1);
453 wchar_t* pwstLibName = buildModuleDynLibraryNameW(wstModuleName.c_str(), DYNLIB_NAME_FORMAT_3);
455 vectGateway vect = loadGatewaysName(wstModuleName);
457 for (int i = 0 ; i < (int)vect.size() ; i++)
459 symbol::Context::getInstance()->addFunction(types::Function::createFunction(vect[i].wstFunction, vect[i].wstName, pwstLibName, vect[i].iType, NULL, wstModuleName));
466 int CallScilabModule::Load()
468 wstring wstModuleName = L"call_scilab";
470 wchar_t* pwstLibName = buildModuleDynLibraryNameW(wstModuleName.c_str(), DYNLIB_NAME_FORMAT_1);
472 wchar_t* pwstLibName = buildModuleDynLibraryNameW(wstModuleName.c_str(), DYNLIB_NAME_FORMAT_3);
474 vectGateway vect = loadGatewaysName(wstModuleName);
476 for (int i = 0 ; i < (int)vect.size() ; i++)
478 symbol::Context::getInstance()->addFunction(types::Function::createFunction(vect[i].wstFunction, vect[i].wstName, pwstLibName, vect[i].iType, NULL, wstModuleName));
485 int CompletionModule::Load()
487 wstring wstModuleName = L"completion";
489 wchar_t* pwstLibName = buildModuleDynLibraryNameW(wstModuleName.c_str(), DYNLIB_NAME_FORMAT_2);
491 wchar_t* pwstLibName = buildModuleDynLibraryNameW(wstModuleName.c_str(), DYNLIB_NAME_FORMAT_3);
493 vectGateway vect = loadGatewaysName(wstModuleName);
495 for (int i = 0 ; i < (int)vect.size() ; i++)
497 symbol::Context::getInstance()->addFunction(types::Function::createFunction(vect[i].wstFunction, vect[i].wstName, pwstLibName, vect[i].iType, NULL, wstModuleName));
504 int XmlModule::Load()
506 wstring wstModuleName = L"xml";
508 wchar_t* pwstLibName = buildModuleDynLibraryNameW(wstModuleName.c_str(), DYNLIB_NAME_FORMAT_1);
510 wchar_t* pwstLibName = buildModuleDynLibraryNameW(wstModuleName.c_str(), DYNLIB_NAME_FORMAT_3);
512 vectGateway vect = loadGatewaysName(wstModuleName);
514 for (int i = 0 ; i < (int)vect.size() ; i++)
516 symbol::Context::getInstance()->addFunction(types::Function::createFunction(vect[i].wstFunction, vect[i].wstName, pwstLibName, vect[i].iType, NULL, wstModuleName));
523 int ScicosModule::Load()
525 wstring wstModuleName = L"scicos";
526 const wchar_t* wstLibName = wstModuleName.c_str();
527 if (getScilabMode() == SCILAB_NWNI)
529 wstLibName = L"scicos-cli";
532 wchar_t* pwstLibName = buildModuleDynLibraryNameW(wstLibName, DYNLIB_NAME_FORMAT_1);
534 wchar_t* pwstLibName = buildModuleDynLibraryNameW(wstLibName, DYNLIB_NAME_FORMAT_3);
536 vectGateway vect = loadGatewaysName(wstModuleName);
538 for (int i = 0 ; i < (int)vect.size() ; i++)
540 symbol::Context::getInstance()->addFunction(types::Function::createFunction(vect[i].wstFunction, vect[i].wstName, pwstLibName, vect[i].iType, NULL, wstModuleName));
547 bool XcosModule::loadedDep = false;
548 void XcosModule::LoadDeps(std::wstring _functionName)
550 if (loadedDep == false && _functionName != L"closeXcos")
552 loadOnUseClassPath("Xcos");
557 int XcosModule::Load()
559 wstring wstModuleName = L"xcos";
561 wchar_t* pwstLibName = buildModuleDynLibraryNameW(wstModuleName.c_str(), DYNLIB_NAME_FORMAT_2);
563 wchar_t* pwstLibName = buildModuleDynLibraryNameW(wstModuleName.c_str(), DYNLIB_NAME_FORMAT_3);
565 vectGateway vect = loadGatewaysName(wstModuleName);
567 for (int i = 0 ; i < (int)vect.size() ; i++)
569 symbol::Context::getInstance()->addFunction(types::Function::createFunction(vect[i].wstFunction, vect[i].wstName, pwstLibName, vect[i].iType, &XcosModule::LoadDeps, wstModuleName));
576 int MPIModule::Load()
578 wstring wstModuleName = L"mpi";
580 wchar_t* pwstLibName = buildModuleDynLibraryNameW(wstModuleName.c_str(), DYNLIB_NAME_FORMAT_1);
582 wchar_t* pwstLibName = buildModuleDynLibraryNameW(wstModuleName.c_str(), DYNLIB_NAME_FORMAT_3);
584 vectGateway vect = loadGatewaysName(wstModuleName);
586 for (int i = 0 ; i < (int)vect.size() ; i++)
588 symbol::Context::getInstance()->addFunction(types::Function::createFunction(vect[i].wstFunction, vect[i].wstName, pwstLibName, vect[i].iType, NULL, wstModuleName));
595 int ExternalObjectsModule::Load()
597 wstring wstModuleName = L"external_objects";
599 wchar_t* pwstLibName = buildModuleDynLibraryNameW(wstModuleName.c_str(), DYNLIB_NAME_FORMAT_1);
601 wchar_t* pwstLibName = buildModuleDynLibraryNameW(wstModuleName.c_str(), DYNLIB_NAME_FORMAT_3);
603 vectGateway vect = loadGatewaysName(wstModuleName);
605 for (int i = 0 ; i < (int)vect.size() ; i++)
607 symbol::Context::getInstance()->addFunction(types::Function::createFunction(vect[i].wstFunction, vect[i].wstName, pwstLibName, vect[i].iType, NULL, wstModuleName));
614 int ExternalObjectsJavaModule::Load()
616 wstring wstModuleName = L"external_objects_java";
618 wchar_t* pwstLibName = buildModuleDynLibraryNameW(wstModuleName.c_str(), DYNLIB_NAME_FORMAT_1);
620 wchar_t* pwstLibName = buildModuleDynLibraryNameW(wstModuleName.c_str(), DYNLIB_NAME_FORMAT_3);
622 vectGateway vect = loadGatewaysName(wstModuleName);
624 for (int i = 0 ; i < (int)vect.size() ; i++)
626 symbol::Context::getInstance()->addFunction(types::Function::createFunction(vect[i].wstFunction, vect[i].wstName, pwstLibName, vect[i].iType, NULL, wstModuleName));