update whereis to return several libraries names
[scilab.git] / scilab / modules / functions / sci_gateway / cpp / sci_whereis.cpp
1 /*
2 * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3 * Copyright (C) 2009 - DIGITEO - Allan CORNET
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 }
23
24 /*--------------------------------------------------------------------------*/
25
26 using namespace types;
27 using namespace std;
28
29 Function::ReturnValue sci_whereis(types::typed_list &in, int _iRetCount, types::typed_list &out)
30 {
31     /* Check the number of input argument */
32     if (in.size() != 1)
33     {
34         Scierror(999, _("%s: Wrong number of input argument(s): %d expected.\n"), "whereis", 1);
35         return Function::Error;
36     }
37
38     /* Check the number of output argument */
39     if (_iRetCount != 1)
40     {
41         Scierror(999, _("%s: Wrong number of output argument(s): %d expected.\n"), "whereis", 1);
42         return Function::Error;
43     }
44
45     if (in[0]->isString())
46     {
47         types::String* pS = in[0]->getAs<types::String>();
48
49         if (pS->isScalar() == false)
50         {
51             Scierror(999, _("%s: Wrong type for input argument #%d: A String expected.\n"), "whereis", 1);
52             return Function::Error;
53         }
54
55         std::list<std::wstring>* lst = symbol::Context::getInstance()->getWhereIs(pS->get(0));
56         if (lst == NULL || lst->empty())
57         {
58             out.push_back(types::Double::Empty());
59             if (lst)
60             {
61                 delete lst;
62             }
63             return Function::OK;
64         }
65
66         types::String* pOut = new types::String(static_cast<int>(lst->size()), 1);
67         int i = 0;
68         for (std::wstring l : *lst)
69         {
70             pOut->set(i++, l.c_str());
71         }
72
73         out.push_back(pOut);
74         delete lst;
75     }
76     else
77     {
78         wstring stModule;
79         switch (in[0]->getType())
80         {
81             case InternalType::ScilabFunction:
82             case InternalType::ScilabMacro:
83             case InternalType::ScilabMacroFile:
84                 out.push_back(new types::String(in[0]->getAs<Callable>()->getModule().c_str()));
85                 break;
86             default:
87                 out.push_back(types::Double::Empty());
88         }
89     }
90
91     return Function::OK;
92 }
93 /*--------------------------------------------------------------------------*/