Add c interface to manage dyn link function via index
[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  * This file must be used under the terms of the CeCILL.
7  * This source file is licensed as described in the file COPYING, which
8  * you should have received as part of this distribution.  The terms
9  * are also available at
10  * http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
11  *
12  */
13
14 /*-----------------------------------------------------------------------------------*/
15 #include "configvariable.hxx"
16
17 extern "C"
18 {
19 #include <stdlib.h>
20 #include "dynamic_link.h"
21 #include "addinter.h"
22 }
23
24 typedef void(*function)(wchar_t*);
25
26 int AddInterfaceToScilab(wchar_t* _pwstDynamicLibraryName, wchar_t* _pwstModuleName, wchar_t** _pwstEntryPointName, int _iEntryPointSize)
27 {
28     int iLibID = -1; /* Id of library */
29     int iErr = 0;
30
31     /** Try to unlink the interface if it was previously linked **/
32     ConfigVariable::EntryPointStr* pEP = ConfigVariable::getEntryPoint(_pwstModuleName);
33     if (pEP)
34     {
35         //entry point already linked, so remove it before add it
36         ConfigVariable::removeDynamicLibrary(pEP->iLibIndex);
37     }
38
39     /* link then search  */
40     /* Haven't been able to find the symbol. Try C symbol */
41     iLibID =  scilabLink(iLibID, _pwstDynamicLibraryName, &_pwstModuleName, 1, FALSE, &iErr);
42     if (iErr)
43     {
44         /* Trying with the fortran symbol */
45         iLibID =  scilabLink(iLibID, _pwstDynamicLibraryName, &_pwstModuleName, 1, TRUE, &iErr);
46         if (iErr)
47         {
48             return iErr;
49         }
50     }
51
52     pEP = ConfigVariable::getEntryPoint(_pwstModuleName);
53     if (pEP == NULL)
54     {
55         //
56         return -1;
57     }
58
59     for (int i = 0 ; i < _iEntryPointSize ; i++)
60     {
61         ((function)pEP->functionPtr)(_pwstEntryPointName[i]);
62     }
63     return 0;
64 }