Use a stack to manage "where" location
[scilab.git] / scilab / modules / core / sci_gateway / cpp / sci_where.cpp
1 /*
2  *  Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  *  Copyright (C) 2013 - scilab Enterprises - Cedric Delamarre
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 #include <vector>
14
15 #include "core_gw.hxx"
16 #include "function.hxx"
17 #include "configvariable.hxx"
18 #include "double.hxx"
19 #include "string.hxx"
20
21 extern "C"
22 {
23 #include "localization.h"
24 #include "Scierror.h"
25 }
26
27 types::Function::ReturnValue sci_where(types::typed_list &in, int _iRetCount, types::typed_list &out)
28 {
29     if (in.size() != 0)
30     {
31         Scierror(77, _("%s: Wrong number of input argument(s): %d expected."), "where", 0);
32         return types::Function::Error;
33     }
34
35     if (_iRetCount != 2)
36     {
37         Scierror(78, _("%s: Wrong number of output argument(s): %d expected."), "where", 2);
38         return types::Function::Error;
39     }
40
41     const std::vector<ConfigVariable::WhereEntry>& lWhereAmI = ConfigVariable::getWhere();
42     if (lWhereAmI.size() <= 1)
43     {
44         out.push_back(types::Double::Empty());
45         out.push_back(types::Double::Empty());
46         return types::Function::OK;
47     }
48
49     types::Double* pDblLines = new types::Double((int)lWhereAmI.size() - 1, 1);
50     types::String* pStrNames = new types::String((int)lWhereAmI.size() - 1, 1);
51
52     auto it = lWhereAmI.rbegin();
53     pDblLines->set(0, it->m_line);
54     it++;
55     for (int i = 0; it != lWhereAmI.rend(); it++, i++)
56     {
57         pDblLines->set(i + 1, it->m_line);
58         pStrNames->set(i, it->m_name.c_str());
59     }
60
61     pStrNames->set(static_cast<int>(lWhereAmI.size()) - 1, lWhereAmI.back().m_name.c_str());
62
63     out.push_back(pDblLines);
64     out.push_back(pStrNames);
65     return types::Function::OK;
66 }