* Bug 16174 fixed: now libraryinfo() yields [] for lib without macro
[scilab.git] / scilab / modules / functions / sci_gateway / cpp / sci_libraryinfo.cpp
1 /*
2 * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3 * Copyright (C) 2015 - 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
17 #include "functions_gw.hxx"
18 #include "context.hxx"
19 #include "string.hxx"
20 #include "double.hxx"
21
22 extern "C" {
23 #include "Scierror.h"
24 #include "localization.h"
25 #include "sci_malloc.h"
26 #include "charEncoding.h"
27 }
28
29 /*--------------------------------------------------------------------------*/
30 types::Function::ReturnValue sci_libraryinfo(types::typed_list &in, int _iRetCount, types::typed_list &out)
31 {
32     /* Check the number of input argument */
33     if (in.size() != 1)
34     {
35         Scierror(999, _("%s: Wrong number of input argument(s): %d expected.\n"), "libraryinfo", 1);
36         return types::Function::Error;
37     }
38
39     /* Check the number of output argument */
40     if (_iRetCount > 2)
41     {
42         Scierror(999, _("%s: Wrong number of output argument(s): %d to %d expected.\n"), "libraryinfo", 1, 2);
43         return types::Function::Error;
44     }
45
46     if (in[0]->isString() == false)
47     {
48         Scierror(999, _("%s: Wrong type for input argument #%d: A String expected.\n"), "libraryinfo", 1);
49         return types::Function::Error;
50     }
51
52     types::String* pS = in[0]->getAs<types::String>();
53     if (pS->isScalar() == false)
54     {
55         Scierror(999, _("%s: Wrong size for input argument #%d: A String expected.\n"), "libraryinfo", 1);
56         return types::Function::Error;
57     }
58
59     types::InternalType* pIT = symbol::Context::getInstance()->get(symbol::Symbol(pS->get(0)));
60     if (pIT == nullptr || pIT->isLibrary() == false)
61     {
62         char* libname = wide_string_to_UTF8(pS->get()[0]);
63         Scierror(999, _("%s: Invalid library %s.\n"), "libraryinfo", libname);
64         FREE(libname);
65         return types::Function::Error;
66     }
67
68     types::Library* lib = pIT->getAs<types::Library>();
69
70     std::list<std::wstring> names;
71     int size = lib->getMacrosName(names);
72     if (size > 0)
73     {
74         types::String* pNames = new types::String(size, 1);
75         int i = 0;
76         for (auto name : names)
77         {
78             pNames->set(i++, name.c_str());
79         }
80         out.push_back(pNames);
81     }
82     else
83     {
84         out.push_back(types::Double::Empty());
85     }
86
87     if (_iRetCount == 2)
88     {
89         out.push_back(new types::String(lib->getPath().c_str()));
90     }
91     return types::Function::OK;
92 }
93 /*--------------------------------------------------------------------------*/