check input arguments in contr function
[scilab.git] / scilab / modules / core / includes / stack3.h
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) INRIA
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  * @file stack3.h
13  * What is stack3 ?
14  * This file contains most of the function to interface Scilab from
15  * thirdparty application but almost primitive to access Scilab data
16  * from the gateway
17  * In theory, stack2.h & stack1.h should not be called directly
18  */
19
20
21 #ifndef STACK3_H
22 #define STACK3_H
23
24 #if defined(__SCILAB_TOOLBOX__) && !defined(__INTERNAL_API_SCILAB__) && !defined(__USE_DEPRECATED_STACK_FUNCTIONS__) && !defined(__MEX_INCLUDE__)
25 #error Using stack3.h is deprecated. Please use api_scilab instead (try 'help api_scilab'). Note the stack3.h API will be removed after Scilab 6.0. You can define __USE_DEPRECATED_STACK_FUNCTIONS__ to bypass this error.
26 #endif
27
28 #include "machine.h"
29 #include "doublecomplex.h"
30
31 /*Constants*/
32 #define ROW_LETTER              'r'
33 #define COL_LETTER              'c'
34 #define STAR_LETTER             '*'
35 #define MTLB_LETTER             'm'
36
37 #define BY_ROWS                 1
38 #define BY_COLS                 2
39 #define BY_ALL                  0
40 #define BY_MTLB                 -1
41
42 int C2F(putvar) (int *number, char *namex, unsigned long name_len );
43
44 /**
45  * Returns if a variable is complex or not
46  *
47  * @param _iVar the matrix
48  * @return 1 if is complex 0 otherwise
49  */
50 int iIsComplex(int _iVar);
51 void GetRhsPolyVar(int _iVarNum, int** _piVarName, int* _piRows, int* _piCols, int* _piPow, int* _piReal);
52 void GetRhsCPolyVar(int _iVarNum, int** _piVarName, int* _piRows, int* _piCols, int* _piPow, int* _piReal, int *_piImg);
53 void GetRhsSparseVar(int _iVarNum, int* _piRows, int* _piCols, int* _piTotalElem, int* _piElemByRow, int* _piColByRow, int* _piReal);
54 void GetRhsCSparseVar(int _iVarNum, int* _piRows, int* _piCols, int* _piTotalElem, int* _piElemByRow, int* _piColByRow, int* _piReal, int* _piImg);
55 void GetRhsBooleanSparseVar(int _iVarNum, int* _piRows, int* _piCols, int* _piTotalElem, int* _piElemByRow, int* _piColByRow);
56 void GetRhsStringVar(int _iVarNum, int* _piRows, int* _piCols, int* _piLen, char* _pstData);
57
58 void CreatePolyVarFromPtr(int _iNewVal, int** _piVarName, int _iRows, int _iCols, int *_piPow, double* _pdblRealData);
59 void CreateCPolyVarFromPtr(int _iNewVal, int** _piVarName, int _iRows, int _iCols, int *_piPow, double* _pdblRealData, double* _pdblImgData);
60 void CreateSparseVarFromPtr(int _iNewVal, int _iRows, int _iCols, int _iTotalElem, int* _piElemByRow, int* _piColByRow, double* _pdblRealData);
61 void CreateCSparseVarFromPtr(int _iNewVal, int _iRows, int _iCols, int _iTotalElem, int* _piElemByRow, int* _piColByRow, double* _pdblRealData, double* _pdblImgData);
62 void CreateBooleanVarFromPtr(int _iNewVal, int _iRows, int _iCols, int* _piBoolData);
63 void CreateCBooleanSparseVarFromPtr(int _iNewVal, int _iRows, int _iCols, int _iTotalElem, int* _piElemByRow, int* _piColByRow);
64
65
66
67 int iArraySum(int *_piArray, int _iStart, int _iEnd);
68 int GetDimFromVar(int _iVarNum, int _iNum/*Oo*/, int* _piVal);
69 void CheckVarUsed(int _iVarNum);
70 void CheckAllVarUsed(int _iStart, int _iEnd);
71 void GetVarDimension(int _iVarNum, int* _piRows, int* _piCols);
72 int iGetOrient(int _iVal);
73
74 /* Reserve space in stack for a matrix of double. */
75 int iAllocMatrixOfDouble(int _iNewVal, int _iRows, int _iCols, double **_pdblRealData);
76 /* Reserve space in stack for a matrix of complex. */
77 int iAllocComplexMatrixOfDouble(int _iNewVal, int _iRows, int _iCols, double **_pdblRealData, double **_pdblImgData);
78
79 int iAllocComplexMatrixOfDoubleToAddress(int* _piAddr, int _iComplex, int _iRows, int _iCols, double **_pdblRealData, double **_pdblImgData);
80
81 int iAllocMatrixOfPoly(int _iNewVal, int** _piVarName, int _iRows, int _iCols, int *_piPow, double** _pdblRealData);
82 int iAllocComplexMatrixOfPoly(int _iNewVal, int _iComplex, int** _piVarName, int _iRows, int _iCols, int *_piPow, double** _pdblRealData, double** _pdblImgData);
83 int iAllocComplexMatrixOfPolyToAddress(int _iAddr, int _iComplex, int** _piVarName, int _iRows, int _iCols, int *_piPow, double** _pdblRealData, double** _pdblImgData);
84
85 int iAllocSparseMatrix(int _iNewVal, int _iRows, int _iCols, int _iTotalElem, int** _piElemByRow, int** _piColByRow, double** _pdblRealData);
86 int iAllocComplexSparseMatrix(int _iNewVal, int _iComplex, int _iRows, int _iCols, int _iTotalElem, int** _piElemByRow, int** _piColByRow, double** _pdblRealData, double** _pdblImgData);
87
88 int iAllocMatrixOfBoolean(int _iNewVal, int _iRows, int _iCols, int** _piBoolData);
89 int iAllocBooleanSparseMatrix(int _iNewVal, int _iRows, int _iCols, int _iTotalElem, int** _piElemByRow, int** _piColByRow);
90
91 int iAllocMatrixOfString(int _iNewVal, int _iRows, int _iCols, int *_piLen, char** _piStringData);
92 int iAllocMatrixOfStringToAddress(int _iAddr, int _iRows, int _iCols, int *_piLen, char **_piStringData);
93
94 /*Get List Information*/
95 /* Get Item Count and type of each item */
96 int iGetListItemType(int _iVar, int* _piParentList, int *_piItemNumber, int *_pElemType);
97 /* Get SubList reference */
98 int* iGetListItemList(int _iVar, int* _piParentList, int iItemPos);
99 /* Get Sparse Item */
100 int iGetListItemSparse(int _iVar, int _iItemNumber, int *_piRows, int *_piCols, int* _piTotalElem, int* _piElemByRow, double **_pdblReal, double **_pdblImg);
101 /* Get Poly Item */
102 int iGetListItemPoly(int _iVar, int _iItemNumber, int **_pVarName, int *_piRows, int *_piCols, int *_piPow, double **_pdblReal, double **_pdblImg);
103 /* Get Double Item */
104 int iGetListItemDouble(int _iVar, int _iItemNumber, int *_piRows, int *_piCols, double **_pdblReal, double **_pdblImg);
105 /* Does Item Complex */
106 int iIsComplexItemElem(int _iVar, int _iItemNumber);
107 /* Get Item String */
108 int iGetListItemString(int _iVar, int _iItemNumber, int *_piRows, int *_piCols, int *_piLen, char* _pszData);
109
110 /* Get SubItem String */
111 int iGetListSubItemString(int _iVar, int* _piParentList, int _iItemNumber, int *_piRows, int *_piCols, int *_piLen, char* _pszData);
112
113 /*Create List*/
114 /* Reserved VarNum for List */
115 int* iAllocList(int _iVar, int _iItemNumber);
116
117 /* Reserved VarNum for TList */
118 int* iAllocTList(int _iVar, int _iItemNumber);
119
120 /* Reserved VarNum for MList */
121 int* iAllocMList(int _iVar, int _iItemNumber);
122
123 /* Reserved VarNum for HyperMatrix */
124 int* iAllocHyperMatrix(int _iVar, int _iItemNumber);
125
126 /* Reserved VarNum for list */
127 int* iAllocListCommon(int _iVar, int _iItemNumber, int _iListType);
128
129 /* Child */
130 /* Add Common List to ParentList ( internal use only ) */
131 int* iListAllocListCommon(int _iVar, int* _piParentList, int _iItemPos, int _iItemNumber, int _iListType);
132
133 /* Add HyperMatrix to ParentList */
134 int* iListAllocHyperMatrix(int _iVar, int* _piParentList, int _iItemPos, int _iDims);
135
136 /* Add MList to ParentList */
137 int* iListAllocMList(int _iVar, int* _piParentList, int _iItemPos, int _iItemNumber);
138
139 /* Add TList to ParentList */
140 int* iListAllocTList(int _iVar, int* _piParentList, int _iItemPos, int _iItemNumber);
141
142 /* Add List to ParentList */
143 int* iListAllocList(int _iVar, int* _piParentList, int _iItemPos, int _iItemNumber);
144
145 /* Add real matrix in _iVar list */
146 int iListAllocMatrixOfDouble(int _iVar, int* _piParent, int _iItemPos, int _iRows, int _iCols, double **_pdblRealData);
147
148 /* Add complex matrix in _iVar list */
149 int iListAllocComplexMatrixOfDouble(int _iVar, int* _piParent, int _iItemPos, int _iComplex, int _iRows, int _iCols, double **_pdblRealData, double **_pdblImgData);
150
151 /* Add real polynomial in _iVar list */
152 int iListAllocMatrixOfPoly(int _iVar, int* _piParent, int _iItemPos, int** _piVarName, int _iRows, int _iCols, int *_piPow, double** _pdblRealData);
153
154 /* Add complex polynomial in _iVar list */
155 int iListAllocComplexMatrixOfPoly(int _iVar, int* _piParent, int _iItemPos, int _iComplex, int** _piVarName, int _iRows, int _iCols, int *_piPow, double** _pdblRealData, double** _pdblImgData);
156
157 /* Add string matrix in _iVar list */
158 int iListAllocString(int _iVar, int* _piParent, int _iItemPos, int _iRows, int _iCols, int *_piLen, char** _pszData);
159
160 /* Internal function automaticly call after the last insertion of data */
161 void vListClose(int _iVar);
162 int* piGetParentNode(int* _piStart, int* _piToFind, int *_piPos);
163 int IsKindOfList(int* _piNode);
164 void vCloseNode(int _iVar, int *_piCurrentNode, int _iItemPos, int *_piEnd);
165
166
167 /* Functions to retrieve variables information from pointer ( real memory address ) */
168 int iGetStringFromPointer(int* _piAddr, int *_piRows, int *_piCols, int *_piLen, int** _piString);
169
170 int* iGetAddressFromItemPos(int *_piParent, int _iItemPos);
171
172
173 /* Internal functions to retrieve varaibles information from Address ( old "il" ) */
174 int iGetDoubleFromAddress(int _iAddr, int *_piRows, int *_piCols, int *_piReal, int *_piImg);
175 int iGetPolyFromAddress(int _iAddr, int** _piVarName, int* _piRows, int* _piCols, int* _piPow, int* _piReal, int *_piImg);
176 int iGetSparseFromAddress(int _iAddr, int* _piRows, int* _piCols, int* _piTotalElem, int* _piElemByRow, int* _piColByRow, int* _piReal, int* _piImg);
177 int iGetBooleanSparseFromAddress(int _iAddr, int* _piRows, int* _piCols, int* _piTotalElem, int* _piElemByRow, int* _piColByRow);
178 int iGetBooleanFromAddress(int _iAddr, int *_piRows, int *_piCols, int* _piBool);
179 int iGetStringFromAddress(int _iAddr, int *_piRows, int *_piCols, int *_piLen, int* _piString);
180
181 /**
182 *  Set the target real and imaginary part of an array from a source doublecomplex array.
183 *  @param _poComplex the source array
184 *  @param _iSize the number of elements to set
185 *  @param _pdblReal, _pdblImg the target array (real and imaginary parts)
186 */
187 void vGetPointerFromDoubleComplex(const doublecomplex *_poComplex, int _iSize, double *_pdblReal, double *_pdblImg);
188
189 /**
190 *  Returns a target doublecomplex array constructed from the source real and imaginary parts.
191 *  The real and imaginary parts can be NULL or not NULL :
192 *  * if real part and imaginary part of source array are not NULL, the returned array is as expected,
193 *  * if real part of source array is NULL and imaginary part is not NULL, the real part of the returned array is filled with zeros,
194 *  * if real part of source array is not NULL and imaginary part is NULL, the imaginary part of the returned array is filled with zeros,
195 *  * if both real and imaginary parts of source array are NULL, the returned array is NULL.
196 *  @param _pdblReal the real part of the source array
197 *  @param _pdblImg the imaginary part of the source array
198 *  @param _iSize the size of the source array
199 *  @return a target doublecomplex array constructed from the source real and imaginary parts.
200 */
201 doublecomplex* oGetDoubleComplexFromPointer(double *_pdblReal, double *_pdblImg, int _iSize);
202 /**
203 *  Free the given pointer of double complex.
204 *  Note
205 *  The goal of this function is to allow the client
206 *  code to be independent of the particular allocation system used
207 *  in oGetDoubleComplexFromPointer.
208 *  @param _poComplex the array to free
209 */
210 void vFreeDoubleComplexFromPointer(doublecomplex *_poComplex);
211
212 /**
213 * Returns a pointer on the data of a matrix of double
214 *  @param number index of the Scilab variable
215 *  @param _iRows number of rows in the matrix
216 *  @param _iCols number of columns in the matrix
217 *  @param _pdblRealData pointer to the block of data for real values
218 *  @return a pointer on the data of a matrix of double
219 */
220 int GetRhsVarMatrixDouble(int number, int *_iRows, int *_iCols, double **_pdblRealData);
221
222 /**
223 *  Returns a pointer on the data of a matrix of double.
224 *  @param number index of the Scilab variable
225 *  @param _iRows number of rows in the matrix
226 *  @param _iCols number of columns in the matrix
227 *  @param _pdblRealData pointer to the block of data for real values
228 *  @param _pdblImgData pointer to the block of data for complex values
229 *  @return a pointer on the data of a matrix of double.
230 */
231 int GetRhsVarMatrixComplex(int number, int *_iRows, int *_iCols, double **_pdblRealData, double **_pdblImgData);
232
233 /* functions ONLY for compatibility and/or internal use */
234 int C2F(str2name)  (const char *name__, int *id, unsigned long name_len);
235 int C2F(objptr)(char *namex, int *lp, int *fin, unsigned long name_len);
236 int C2F(creadmat)(char *namex, int *m, int *n, double *scimat, unsigned long name_len);
237 int C2F(creadchain)(char *namex,  int *itslen,  char *chai,  unsigned long name_len,  unsigned long chai_len);
238 int C2F(cmatptr)(char *namex, int *m,int *n,int *lp, unsigned long name_len);
239
240
241 #endif