memory leak fixed in library management.
[scilab.git] / scilab / modules / io / sci_gateway / cpp / sci_load.cpp
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) 2014 - Scilab Enterprises - Antoine ELIAS
4  *
5  * This file must be used under the terms of the CeCILL.
6  * This source file is licensed as described in the file COPYING, which
7  * you should have received as part of this distribution.  The terms
8  * are also available at
9  * http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
10  *
11  */
12
13 #include <string.h>
14 #include "io_gw.hxx"
15 #include "function.hxx"
16 #include "string.hxx"
17 #include "overload.hxx"
18 #include "execvisitor.hxx"
19 #include "library.hxx"
20 #include "loadlib.hxx"
21
22
23 extern "C"
24 {
25 #include "sci_malloc.h"
26 #include "expandPathVariable.h"
27 #include "h5_fileManagement.h"
28 #include "FileExist.h"
29 #include "Scierror.h"
30 }
31
32 using namespace types;
33
34 /*--------------------------------------------------------------------------*/
35 Function::ReturnValue sci_load(types::typed_list &in, int _iRetCount, types::typed_list &out)
36 {
37     InternalType* pIT = in[0];
38
39     if (pIT->isString() == false)
40     {
41         Scierror(999, _("%s: Wrong type for input argument #%d: String expected.\n"), "load", 1);
42         return Function::Error;
43     }
44
45     String *pS = pIT->getAs<types::String>();
46
47     if (pS->isScalar() == false)
48     {
49         Scierror(999, _("%s: Wrong type for input argument #%d: Scalar string expected.\n"), "load", 1);
50         return Function::Error;
51     }
52
53     wchar_t* pwstPathLib = expandPathVariableW(pS->get(0));
54     char* pstPath = wide_string_to_UTF8(pwstPathLib);
55     if (FileExist(pstPath))
56     {
57         if (isHDF5File(pstPath))
58         {
59             FREE(pstPath);
60             FREE(pwstPathLib);
61
62             //call overload
63             std::wstring wstFuncName = L"%_sodload";
64             ast::ExecVisitor exec;
65             Callable::ReturnValue Ret = Callable::Error;
66             Ret = Overload::call(wstFuncName, in, _iRetCount, out, &exec);
67             return Ret;
68         }
69         else
70         {
71             Library* lib = loadlib(pS->get(0));
72             FREE(pstPath);
73
74             if (lib == NULL)
75             {
76                 Scierror(999, _("%s: Wrong file type \"%ls\".\n"), "load", pwstPathLib);
77                 FREE(pwstPathLib);
78                 return Function::Error;
79             }
80             FREE(pwstPathLib);
81             lib->killMe();
82         }
83     }
84     else
85     {
86         Scierror(999, _("%s: Unable to open file: \"%ls\".\n"), "load", pwstPathLib);
87         FREE(pstPath);
88         FREE(pwstPathLib);
89         return Function::Error;
90     }
91
92     return Function::OK;
93 }
94
95
96 /*--------------------------------------------------------------------------*/