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