079fa98ecf6de88fe3282f6e00f6a13b58f1246b
[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 int AddInterfaceToScilab(wchar_t* _pwstDynamicLibraryName, wchar_t* _pwstModuleName, wchar_t** _pwstEntryPointName, int _iEntryPointSize)
25 {
26     int iLibID = -1; /* Id of library */
27     int iErr = 0;
28
29     /** Try to unlink the interface if it was previously linked **/
30     ConfigVariable::EntryPointStr* pEP = ConfigVariable::getEntryPoint(_pwstModuleName);
31     if (pEP)
32     {
33         //entry point already linked, so remove it before add it
34         ConfigVariable::removeDynamicLibrary(pEP->iLibIndex);
35     }
36
37     /* link then search  */
38     /* Haven't been able to find the symbol. Try C symbol */
39     iLibID =  scilabLink(iLibID, _pwstDynamicLibraryName, &_pwstModuleName, 1, FALSE, &iErr);
40     if (iErr)
41     {
42         /* Trying with the fortran symbol */
43         iLibID =  scilabLink(iLibID, _pwstDynamicLibraryName, &_pwstModuleName, 1, TRUE, &iErr);
44         if (iErr)
45         {
46             return iErr;
47         }
48     }
49
50     pEP = ConfigVariable::getEntryPoint(_pwstModuleName);
51     if (pEP == NULL)
52     {
53         //
54         return -1;
55     }
56
57     for (int i = 0 ; i < _iEntryPointSize ; i++)
58     {
59         pEP->functionPtr(_pwstEntryPointName[i]);
60     }
61     return 0;
62 }