std::wstring as parameter must be const & when is possible
[scilab.git] / scilab / modules / core / sci_gateway / cpp / sci_clearfun.cpp
1 /*
2  *  Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  *  Copyright (C) 2014 - 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 #include "core_gw.hxx"
14 #include "function.hxx"
15 #include "callable.hxx"
16 #include "context.hxx"
17 #include "string.hxx"
18 #include "bool.hxx"
19
20 extern "C"
21 {
22 #include "Scierror.h"
23 #include "localization.h"
24 #include "charEncoding.h"
25 }
26
27 types::Function::ReturnValue sci_clearfun(types::typed_list &in, int _iRetCount, types::typed_list &out)
28 {
29     if (in.size() != 1)
30     {
31         Scierror(999, _("%s: Wrong number of input arguments: %d expected.\n"), "clearfun" , 1);
32         types::Function::Error;
33     }
34
35     types::InternalType* pIT1 = in[0];
36     if (pIT1->isString() == false)
37     {
38         Scierror(999, _("%s: Wrong type for input argument #%d: String expected.\n"), "clearfun", 1);
39         types::Function::Error;
40     }
41
42     types::String* pS1 = pIT1->getAs<types::String>();
43     if (pS1->isScalar() == false)
44     {
45         Scierror(999, _("%s: Wrong size for input argument #%d: A string expected.\n"), "clearfun", 1);
46         types::Function::Error;
47     }
48
49     wchar_t* pwcsName = pS1->get(0);
50
51     bool bDeleted = false;
52     symbol::Context* pCtx = symbol::Context::getInstance();
53
54     symbol::Variable* pVar = pCtx->getOrCreate(symbol::Symbol(pwcsName));
55     symbol::Variable::StackVar stack;
56
57     //unstack all elements and stack them in new stack ( reverse order )
58     while (pVar->empty() == false)
59     {
60         stack.push(pVar->top());
61         pVar->pop();
62     }
63
64     if (stack.empty() == false)
65     {
66         symbol::ScopedVariable* pSV = stack.top();
67         if (pSV->m_iLevel == 0 && pSV->m_pIT->isFunction())
68         {
69             //remove
70             pSV->m_pIT->DecreaseRef();
71             pSV->m_pIT->killMe();
72             stack.pop();
73             bDeleted = true;
74             delete pSV;
75         }
76
77         //move all elements at orginal place and order
78         while (stack.empty() == false)
79         {
80             pSV = stack.top();
81             stack.pop();
82             //pSV->m_pIT->DecreaseRef();
83             pVar->put(pSV);
84         }
85     }
86
87     out.push_back(new types::Bool(bDeleted ? 1 : 0));
88     types::Function::OK;
89 }