GPL + CeCILL Header change
[scilab.git] / scilab / modules / dynamic_link / src / cpp / addinter.cpp
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) INRIA/ENPC
4  * Copyright (C) 2008 - INRIA - Allan CORNET
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  * === LICENSE_END ===
15  *
16  */
17
18 /*-----------------------------------------------------------------------------------*/
19 #include "configvariable.hxx"
20
21 extern "C"
22 {
23 #include <stdlib.h>
24 #include "dynamic_link.h"
25 #include "addinter.h"
26 }
27
28 typedef void(*function)(wchar_t*);
29
30 int AddInterfaceToScilab(wchar_t* _pwstDynamicLibraryName, wchar_t* _pwstModuleName, wchar_t** _pwstEntryPointName, int _iEntryPointSize)
31 {
32     int iLibID = -1; /* Id of library */
33     int iErr = 0;
34
35     /** Try to unlink the interface if it was previously linked **/
36     ConfigVariable::EntryPointStr* pEP = ConfigVariable::getEntryPoint(_pwstModuleName);
37     if (pEP)
38     {
39         //entry point already linked, so remove it before add it
40         ConfigVariable::removeDynamicLibrary(pEP->iLibIndex);
41     }
42
43     /* link then search  */
44     /* Haven't been able to find the symbol. Try C symbol */
45     iLibID =  scilabLink(iLibID, _pwstDynamicLibraryName, &_pwstModuleName, 1, FALSE, &iErr);
46     if (iErr)
47     {
48         /* Trying with the fortran symbol */
49         iLibID =  scilabLink(iLibID, _pwstDynamicLibraryName, &_pwstModuleName, 1, TRUE, &iErr);
50         if (iErr)
51         {
52             return iErr;
53         }
54     }
55
56     pEP = ConfigVariable::getEntryPoint(_pwstModuleName);
57     if (pEP == NULL)
58     {
59         //
60         return -1;
61     }
62
63     for (int i = 0 ; i < _iEntryPointSize ; i++)
64     {
65         ((function)pEP->functionPtr)(_pwstEntryPointName[i]);
66     }
67     return 0;
68 }