5dbbe9e70c314c23fa40aeb9a02e444c2dd778ad
[scilab.git] / scilab / modules / api_scilab / src / cpp / api_stack_optional.cpp
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) 2012 - 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.1-en.txt
10  */
11
12 #include "function.hxx"
13 #include "gatewaystruct.hxx"
14 #include "alltypes.hxx"
15
16 extern "C"
17 {
18 #include <string.h>
19 #include "api_scilab.h"
20 #include "localization.h"
21 #include "Scierror.h"
22 #include "call_scilab.h"
23 #include "sciprint.h"
24 #include "sci_malloc.h"
25 }
26
27
28 static int findOptional(void* _pvCtx, const char *fname, rhs_opts opts[]);
29 static void printOptionalNames(void* _pvCtx, rhs_opts opts[]);
30
31 /**************************/
32 /*   optional functions   */
33 /**************************/
34 int getOptionals(void* _pvCtx, char* pstFuncName, rhs_opts opts[])
35 {
36     types::GatewayStruct* pStr = (types::GatewayStruct*)_pvCtx;
37     types::optional_list opt = *pStr->m_pOpt;
38     int i = 0;
39
40     /* reset first field since opts is declared static in calling function */
41
42     while (opts[i].pstName != NULL)
43     {
44         opts[i].iPos = -1;
45         i++;
46     }
47
48     
49     for (const auto& o : opt)
50     {
51         int typeOfOpt = -1;
52         int index = findOptional(_pvCtx, o.first.c_str(), opts);
53
54         if (index < 0)
55         {
56             sciprint(_("%ls: Unrecognized optional arguments %ls.\n"), pStr->m_pstName, o.first.c_str());
57             printOptionalNames(_pvCtx, opts);
58             return 0;
59         }
60
61         opts[index].iPos = i + 1;
62         types::GenericType* pGT = (types::GenericType*)o.second;
63         getVarType(_pvCtx, (int*)pGT, &typeOfOpt);
64         opts[index].iType = typeOfOpt;
65
66         if (typeOfOpt == sci_implicit_poly)
67         {
68             types::InternalType* pIT = NULL;
69             types::ImplicitList* pIL = pGT->getAs<types::ImplicitList>();
70             pIT = pIL->extractFullMatrix();
71             types::Double* impResult = (types::Double*)pIT;
72             opts[index].iRows = impResult->getRows();
73             opts[index].iCols = impResult->getCols();
74             opts[index].piAddr = (int*)impResult;
75             opts[index].iType = sci_matrix;
76         }
77         else
78         {
79             opts[index].iRows = pGT->getRows();
80             opts[index].iCols = pGT->getCols();
81             opts[index].piAddr = (int*)pGT;
82         }
83     }
84     //   int index = -1;
85     //GatewayStruct* pStr = (GatewayStruct*)_pvCtx;
86
87     //   wchar_t* pwstProperty = to_wide_string(pstProperty);
88
89     //   for(int i = 0 ; i < pStr->m_pOpt->size() ; i++)
90     //   {
91     //       std::pair<std::wstring, InternalType*> current = (*pStr->m_pOpt)[i];
92     //       if(wcscmp(current.first.c_str(), pwstProperty) == 0)
93     //       {
94     //           index = i;
95     //           break;
96     //       }
97     //   }
98
99     //   FREE(pwstProperty);
100
101     return 1;
102 }
103
104 int FirstOpt(void* _pvCtx)
105 {
106     types::GatewayStruct* pStr = (types::GatewayStruct*)_pvCtx;
107     return (int)pStr->m_pIn->size() + 1;
108 }
109
110 int NumOpt(void* _pvCtx)
111 {
112     types::GatewayStruct* pStr = (types::GatewayStruct*)_pvCtx;
113     return (int)pStr->m_pOpt->size();
114 }
115
116 int FindOpt(void* _pvCtx, char* pstProperty, rhs_opts opts[])
117 {
118     int i = findOptional(_pvCtx, pstProperty, opts);
119     if (i >= 0 && opts[i].iPos > 0)
120     {
121         return i;
122     }
123
124     return -1;
125 }
126
127 static int findOptional(void* _pvCtx, const char *pstProperty, rhs_opts opts[])
128 {
129     int rep = -1, i = 0;
130
131     while (opts[i].pstName != NULL)
132     {
133         int cmp;
134
135         /* name is terminated by white space and we want to ignore them */
136         if ((cmp = strcmp(pstProperty, opts[i].pstName)) == 0)
137         {
138             rep = i;
139             break;
140         }
141         else if (cmp < 0)
142         {
143             break;
144         }
145         else
146         {
147             i++;
148         }
149     }
150     return rep;
151 }
152
153 void printOptionalNames(void* _pvCtx, rhs_opts opts[])
154 /* array of optinal names (in alphabetical order)
155 * the array is null terminated */
156 {
157     int i = 0;
158
159     if (opts[i].pstName == NULL)
160     {
161         sciprint(_("Optional argument list is empty.\n"));
162         return;
163     }
164
165     sciprint(_("Optional arguments list: \n"));
166     while (opts[i + 1].pstName != NULL)
167     {
168         sciprint("%s, ", opts[i].pstName);
169         i++;
170     }
171     sciprint(_("and %s.\n"), opts[i].pstName);
172 }