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