update toolbox skeleton to scilab 6 and allow link on c++ gateway
[scilab.git] / scilab / modules / dynamic_link / sci_gateway / cpp / sci_ulink.cpp
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) INRIA - Allan CORNET
4  * Copyright (C) DIGITEO - 2011 - Antoine ELIAS
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 "dynamic_link_gw.hxx"
16 #include "function.hxx"
17 #include "double.hxx"
18 #include "configvariable.hxx"
19
20 extern "C"
21 {
22 #include "localization.h"
23 #include "Scierror.h"
24 #include "dynamic_link.h"
25 }
26
27 void unLinkAll();
28 void unLink(int _iLib);
29 /*--------------------------------------------------------------------------*/
30 types::Function::ReturnValue sci_ulink(types::typed_list &in, int _iRetCount, types::typed_list &out)
31 {
32     /* environment variable used (linux) to detect a PROFILING tools */
33     /* in this case, we do not ulink external dynamic libraries */
34     if (getenv("PROFILE_SCILAB_DYNAMIC_LINK") != NULL)
35     {
36         return types::Function::OK;
37     }
38
39     if (in.size() > 1)
40     {
41         Scierror(77, _("%s: Wrong number of input argument(s): %d to %d expected.\n"), "ulink", 0, 1);
42         return types::Function::Error;
43     }
44
45     if (in.size() == 0)
46     {
47         unLinkAll();
48     }
49     else if (in.size() == 1 && in[0]->isDouble())
50     {
51         types::Double* pDIds = in[0]->getAs<types::Double>();
52
53         for (int i = 0 ; i < pDIds->getSize() ; i++)
54         {
55             unLink((int)pDIds->get(i));
56         }
57     }
58     else
59     {
60         Scierror(999, _("%s: Wrong type for input argument #%d: real scalar expected.\n"), "ulink", 1);
61         return types::Function::Error;
62     }
63
64     return types::Function::OK;
65 }
66 /*--------------------------------------------------------------------------*/
67 void unLinkAll()
68 {
69     std::vector<ConfigVariable::DynamicLibraryStr*>* pDLLIst =  ConfigVariable::getDynamicLibraryList();
70     for (int i = 0 ; i < pDLLIst->size() ; i++)
71     {
72         unLink(i);
73     }
74 }
75 /*--------------------------------------------------------------------------*/
76 void unLink(int _iLib)
77 {
78     ConfigVariable::DynamicLibraryStr* pStr = ConfigVariable::getDynamicLibrary(_iLib);
79     if (pStr)
80     {
81         unsigned long long iLib = ConfigVariable::getDynamicLibrary(_iLib)->hLib;
82         ConfigVariable::removeDynamicLibrary(_iLib);
83         Sci_dlclose(iLib);
84     }
85 }
86 /*--------------------------------------------------------------------------*/