32823831dfa5bb736e69fa48450c081ba070bbcd
[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  * Copyright (C) 2012 - 2016 - Scilab Enterprises
6  *
7  * This file is hereby licensed under the terms of the GNU GPL v2.0,
8  * pursuant to article 5.3.4 of the CeCILL v.2.1.
9  * This file was originally licensed under the terms of the CeCILL v2.1,
10  * and continues to be available under such terms.
11  * For more information, see the COPYING file which you should have received
12  * along with this program.
13 *
14 */
15
16 #include <string.h>
17 #include "function.hxx"
18 #include "io_gw.hxx"
19 #include "string.hxx"
20 #include "library.hxx"
21 #include "loadlib.hxx"
22
23 extern "C"
24 {
25 #include "Scierror.h"
26 #include "sci_malloc.h"
27 #include "pathconvert.h"
28 }
29
30 /*--------------------------------------------------------------------------*/
31 types::Function::ReturnValue sci_lib(types::typed_list &in, int /*_iRetCount*/, types::typed_list &out)
32 {
33     if (in.size() != 1)
34     {
35         Scierror(78, _("%s: Wrong number of input argument(s): %d expected.\n"), "lib", 1);
36         return types::Function::Error;
37     }
38
39     types::InternalType* pIT = in[0];
40
41     if (pIT->isString() == false)
42     {
43         Scierror(999, _("%s: Wrong type for input argument #%d: string expected.\n"), "lib", 1);
44         return types::Function::Error;
45     }
46
47     types::String *pS = pIT->getAs<types::String>();
48
49     if (pS->isScalar() == false)
50     {
51         Scierror(999, _("%s: Wrong size for input argument #%d: string expected.\n"), "lib", 1);
52         return types::Function::Error;
53     }
54
55     wchar_t* pstPath = pS->get(0);
56     wchar_t* pwstPath = pathconvertW(pstPath, TRUE, TRUE, AUTO_STYLE);
57     int err = 0;
58     types::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* pst = wide_string_to_UTF8(pstPath);
69             Scierror(999, _("%s: %s is not a valid lib path.\n"), "lib", pst);
70             FREE(pst);
71             return types::Function::Error;
72         }
73         case 2:
74         {
75             Scierror(999, "%s: %s", "lib", _("Redefining permanent variable.\n"));
76             return types::Function::Error;
77         }
78         case 3:
79         {
80             Scierror(999, "%s: %s", "lib", _("Cannot read lib file: Not in proper XML format.\n"));
81             return types::Function::Error;
82         }
83         case 4:
84         {
85             Scierror(999, "%s: %s", "lib", _("Old binary lib detected. Please recompile it for Scilab 6.\n"));
86             return types::Function::Error;
87         }
88         default:
89         {
90             //nothing
91         }
92     }
93
94     out.push_back(lib);
95     return types::Function::OK;
96 }
97
98
99 /*--------------------------------------------------------------------------*/