replug funptr, newfun and clearfun
[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 using namespace types;
28
29 Function::ReturnValue sci_clearfun(types::typed_list &in, int _iRetCount, types::typed_list &out)
30 {
31     if (in.size() != 1)
32     {
33         Scierror(999, _("%s: Wrong number of input arguments: %d expected.\n"), "clearfun" , 1);
34         return Function::Error;
35     }
36
37     InternalType* pIT1 = in[0];
38     if (pIT1->isString() == false)
39     {
40         Scierror(999, _("%s: Wrong type for input argument #%d: String expected.\n"), "clearfun", 1);
41         return Function::Error;
42     }
43
44     String* pS1 = pIT1->getAs<String>();
45     if (pS1->isScalar() == false)
46     {
47         Scierror(999, _("%s: Wrong size for input argument #%d: A string expected.\n"), "clearfun", 1);
48         return Function::Error;
49     }
50
51     wchar_t* pwcsName = pS1->get(0);
52
53     bool bDeleted = false;
54     symbol::Context* pCtx = symbol::Context::getInstance();
55
56     symbol::Variable* pVar = pCtx->getOrCreate(symbol::Symbol(pwcsName));
57     symbol::Variable::StackVar stack;
58
59     //unstack all elements and stack them in new stack ( reverse order )
60     while (pVar->empty() == false)
61     {
62         stack.push(pVar->top());
63         pVar->pop();
64     }
65
66     if (stack.empty() == false)
67     {
68         symbol::ScopedVariable* pSV = stack.top();
69         if (pSV->m_iLevel == 0 && pSV->m_pIT->isFunction())
70         {
71             //remove
72             pSV->m_pIT->DecreaseRef();
73             pSV->m_pIT->killMe();
74             stack.pop();
75             bDeleted = true;
76         }
77
78         //move all elements at orginal place and order
79         while (stack.empty() == false)
80         {
81             pSV = stack.top();
82             stack.pop();
83             pSV->m_pIT->DecreaseRef();
84             pVar->put(pSV->m_pIT, pSV->m_iLevel);
85             delete pSV;
86         }
87     }
88
89     out.push_back(new Bool(bDeleted ? 1 : 0));
90     return Function::OK;
91 }