099f63125b34fcc83370efd40d4397533cc12580
[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     InternalType *pIT = NULL;
32     wstring stModule;
33
34     /* Check the number of input argument */
35     if (in.size() != 1)
36     {
37         Scierror(999, _("%s: Wrong number of input argument(s): %d expected.\n"), "whereis", 1);
38         return Function::Error;
39     }
40
41     /* Check the number of output argument */
42     if (_iRetCount != 1)
43     {
44         Scierror(999, _("%s: Wrong number of output argument(s): %d expected.\n"), "whereis", 1);
45         return Function::Error;
46     }
47
48     if (in[0]->isString())
49     {
50         types::String* pS = in[0]->getAs<types::String>();
51
52         if (pS->getSize() != 1)
53         {
54             Scierror(999, _("%s: Wrong type for input argument #%d: A String expected.\n"), "whereis", 1);
55             return Function::Error;
56         }
57
58         ;
59         pIT = symbol::Context::getInstance()->getFunction(symbol::Symbol(pS->get(0)));
60         if (pIT == NULL)
61         {
62             out.push_back(types::Double::Empty());
63             return Function::OK;
64         }
65     }
66     else
67     {
68         pIT = in[0];
69     }
70
71     switch (pIT->getType())
72     {
73         case InternalType::ScilabFunction :
74         case InternalType::ScilabMacro :
75         case InternalType::ScilabMacroFile :
76             stModule = pIT->getAs<Callable>()->getModule();
77             break;
78         default :
79             out.push_back(types::Double::Empty());
80             return Function::OK;
81     }
82
83     out.push_back(new types::String(stModule.c_str()));
84     return Function::OK;
85 }
86 /*--------------------------------------------------------------------------*/