35b6e880769d9a168b5d60842bfb2130402c85dc
[scilab.git] / scilab / modules / types / src / cpp / function.cpp
1 /*
2  *  Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  *  Copyright (C) 2008-2008 - DIGITEO - Antoine ELIAS
4  *  Copyright (C) 2010-2010 - DIGITEO - Bruno JOFRET
5  *
6  *  This file must be used under the terms of the CeCILL.
7  *  This source file is licensed as described in the file COPYING, which
8  *  you should have received as part of this distribution.  The terms
9  *  are also available at
10  *  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
11  *
12  */
13
14 #include <sstream>
15 #include "function.hxx"
16 #include "core_math.h"
17
18 namespace types
19 {
20   Function *Function::createFunction(std::string _stName, GW_FUNC _pFunc, std::string _stModule)
21   {
22     return new Function(_stName, _pFunc, _stModule);
23   }
24
25   Function *Function::createFunction(std::string _stName, OLDGW_FUNC _pFunc, std::string _stModule)
26   {
27     return new WrapFunction(_stName, _pFunc, _stModule);
28   }
29
30   Function::Function(std::string _stName, GW_FUNC _pFunc, std::string _stModule):
31     Callable(),
32     m_pFunc(_pFunc)
33   {
34     setName(_stName);
35     setModule(_stModule);
36   }
37
38   Function::~Function()
39   {
40     if(isDeletable() == true)
41       {
42       }
43   }
44
45   Function* Function::getAsFunction(void)               
46   {
47     return this; 
48   }
49
50         Function::ReturnValue Function::call(typed_list &in, int _iRetCount, typed_list &out, RunVisitor* execFunc)
51   {
52     return this->m_pFunc(in, _iRetCount, out);
53   }
54
55   /*--------------*/
56   /*            whoIAm          */
57   /*--------------*/
58   void Function::whoAmI() 
59   { 
60     std::cout << "types::Function"; 
61   }
62
63   WrapFunction::WrapFunction(std::string _stName, OLDGW_FUNC _pFunc, std::string _stModule)
64   {
65     m_stName = _stName;
66     m_pOldFunc = _pFunc;
67     m_stModule = _stModule;
68   }
69
70         Function::ReturnValue WrapFunction::call(typed_list &in, int _iRetCount, typed_list &out, ast::RunVisitor* execFunc) 
71   {
72     ReturnValue retVal = Callable::OK;
73     GatewayStruct* pStr = new GatewayStruct();
74
75                 _iRetCount = Max(1, _iRetCount);
76     pStr->m_pIn = &in;
77     pStr->m_pOut = m_pTempOut;
78                 pStr->m_piRetCount = &_iRetCount;
79                 pStr->m_pstName = (char*)m_stName.c_str();
80                 pStr->m_pOutOrder = new int[_iRetCount < 1 ? 1 : _iRetCount];
81                 memset(pStr->m_pOutOrder, 0xFF, (_iRetCount < 1 ? 1 : _iRetCount) * sizeof(int));
82                 memset(pStr->m_pOut, 0x00, MAX_OUTPUT_VARIABLE * sizeof(InternalType*));
83
84                 //call gateway
85                 int iRet = m_pOldFunc((char*)m_stName.c_str(), (int*)pStr);
86
87                 if(iRet != 0)
88                 {
89                         retVal = Callable::Error;
90                 }
91                 else
92                 {
93                         //replace output argument in good order following m_pOutOrder
94                         for(int i = 0 ; i < _iRetCount ; i++)
95                         {
96                                 //take care about return value count
97                                 if(pStr->m_pOutOrder[i] == -1)
98                                 {
99                                         break;
100                                 }
101
102                                 int iPos = (int)(pStr->m_pOutOrder[i] - in.size() - 1);
103                                 out.push_back(m_pTempOut[iPos]);
104                                 m_pTempOut[iPos] = NULL;
105                         }
106                 }
107
108                 //clean temp output variable array
109                 for(int i = 0 ; i < MAX_OUTPUT_VARIABLE ; i++)
110                 {
111                         if(m_pTempOut[i] != NULL)
112                         {
113                                 delete m_pTempOut[i];
114                         }
115                 }
116
117                 delete[] pStr->m_pOutOrder;
118                 delete pStr;
119                 return retVal;
120   }
121
122   std::string Function::toString(int _iPrecision, int _iLineLen)
123   {
124     std::ostringstream ostr;
125
126     // FIXME : Implement me.
127     ostr << "FIXME : Implement Function::toString" << std::endl;
128
129     return ostr.str();
130   }
131
132 }