0963c8bd79a6074e1f3461cd08f44e4aeb254055
[scilab.git] / scilab / modules / io / sci_gateway / cpp / sci_lib.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 "function.hxx"
15 #include "io_gw.hxx"
16 #include "string.hxx"
17 #include "library.hxx"
18 #include "loadlib.hxx"
19
20 extern "C"
21 {
22 #include "Scierror.h"
23 #include "sci_malloc.h"
24 #include "expandPathVariable.h"
25 }
26
27 using namespace types;
28
29 /*--------------------------------------------------------------------------*/
30 Function::ReturnValue sci_lib(types::typed_list &in, int _iRetCount, types::typed_list &out)
31 {
32     int iXMLFileLen = 0;
33     if (in.size() != 1)
34     {
35         Scierror(78, _("%s: Wrong number of input argument(s): %d expected.\n"), "lib", 1);
36         return Function::Error;
37     }
38
39     InternalType* pIT = in[0];
40
41     if (pIT->isString() == false)
42     {
43         Scierror(999, _("%s: Wrong type for input argument #%d: A string expected.\n"), "lib", 1);
44         return Function::Error;
45     }
46
47     String *pS = pIT->getAs<types::String>();
48
49     if (pS->isScalar() == false)
50     {
51         Scierror(999, _("%s: Wrong size for input argument #%d: A string expected.\n"), "lib", 1);
52         return Function::Error;
53     }
54
55     wchar_t* pstPath = pS->get(0);
56     wchar_t* pwstPath = expandPathVariableW(pstPath);
57     int err = 0;
58     Library* lib = loadlib(pwstPath, &err, false, false);
59     FREE(pwstPath);
60
61     switch (err)
62     {
63         case 0 :
64             //no error
65             break;
66         case 1:
67         {
68             char* pstPath = wide_string_to_UTF8(pwstPath);
69             Scierror(999, _("%s: %s is not a valid module file.\n"), "lib", pstPath);
70             FREE(pstPath);
71             return Function::Error;
72         }
73         case 2:
74         {
75             Scierror(999, "%s: %s", "lib", _("Redefining permanent variable.\n"));
76             return Function::Error;
77         }
78         default:
79         {
80             //nothing
81         }
82     }
83
84     out.push_back(lib);
85     return Function::OK;
86 }
87
88
89 /*--------------------------------------------------------------------------*/