c4503b1f7c6cad91b658052bf6d9eded70e86baa
[scilab.git] / scilab / modules / mexlib / includes / mex.h
1
2 /*
3  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
4  * Copyright (C) INRIA 
5  * Copyright (C) ENPC
6  *
7  * This file must be used under the terms of the CeCILL.
8  * This source file is licensed as described in the file COPYING, which
9  * you should have received as part of this distribution.  The terms
10  * are also available at
11  * http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
12  *
13  */
14
15 #ifdef __cplusplus
16 extern "C" {
17 #endif
18
19 #ifndef SCI_MEX 
20 #define SCI_MEX 
21
22 #ifdef WIN32
23         #include <stddef.h> /*for LCC */
24 #endif
25
26 #include "stack-c.h"
27
28
29 typedef int Matrix;
30 typedef unsigned long int vraiptrst;
31 #ifndef __DEF_MXARRAY__
32 #define __DEF_MXARRAY__
33 typedef int mxArray;
34 typedef int Gatefunc (int nlhs,mxArray *plhs[],int nrhs,mxArray *prhs[]);
35 #endif
36
37 typedef int (*GatefuncH) (int nlhs,mxArray *plhs[],int nrhs,
38                                  mxArray *prhs[]);
39
40 typedef int (*FGatefuncH) (int *nlhs,mxArray *plhs[],int *nrhs,
41                                  mxArray *prhs[]);
42
43 typedef int (*Myinterfun) (char *, GatefuncH F);
44
45 typedef int (*GT) ();
46
47 #ifndef __DEF_TABLE_STRUCT__
48 #define __DEF_TABLE_STRUCT__
49 typedef struct table_struct {
50         Myinterfun f;    /** interface **/
51         GT F;     /** function **/
52         char *name;      /** its name **/
53 } GenericTable;
54 #endif
55
56 #define mxLOGICAL int
57 #define mxLogical int
58
59 #define REAL 0
60 #define COMPLEX 1
61
62 #ifndef NULL
63 #define NULL 0
64 #endif
65
66 #define mxCreateFull mxCreateDoubleMatrix
67 #define bool int
68
69 #define mexGetMatrixPtr(name) mexGetArrayPtr(name, "caller")
70
71 #define mexGetArrayPtr(name,type) mexGetArray(name,type) 
72
73
74 void mexPrintf (char *fmt,...);
75
76 /** Put a matrix in Scilab Workspace */ 
77 #define mexPutFull(name,m,n,ptrM,tag) \
78   if ( ! C2F(cwritemat)(name,(c_local=m,&c_local),(c1_local=n,&c1_local),ptrM,strlen(name))) {  \
79       mexErrMsgTxt(_("mexPutFull failed\n"));return; }
80
81 /* prototypes */
82
83 void mexInfo (char *); 
84 int mexCheck (char *,int ); 
85 mxArray *mxCreateCharMatrixFromStrings (int m, const char **str);
86 mxArray *mxCreateString (const char *string);
87 mxArray *C2F(mxcreatestring)  (char *string, long int l);
88 mxArray *C2F(mxcreatefull)  (int *m, int *n, int *it);
89 mxArray *mxCreateCharArray (int ND, const int *size);
90
91 mxArray *mxCreateCellArray (int ND, const int *size);
92 mxArray *mxCreateCellMatrix (int m, int n);
93
94 mxArray *mxCreateStructArray (int ndim, const int *dims, int nfields, const char **field_names);
95 mxArray *mxCreateStructMatrix (int m, int n, int nfields, const char **field_names);
96
97
98 mxArray *mxGetCell (const mxArray *ptr, int index);
99
100 double C2F(mxgetscalar)  (mxArray *ptr);
101 double * C2F(mxgetpi)  (mxArray *ptr);
102 double * C2F(mxgetpr)  (mxArray *ptr);
103 double *mxGetPi (const mxArray *ptr);
104 double *mxGetPr (const mxArray *ptr);
105 double mxGetScalar (const mxArray *ptr);
106 double mxGetInf (void);
107 double mxGetNaN (void);
108 double mxGetEps (void);
109 bool mxIsNaN (double x);
110 bool mxIsInf (double x);
111 bool mxIsFinite (double x);
112 int *mxGetDimensions (const mxArray *ptr);
113 int mxCalcSingleSubscript (const mxArray *ptr, int nsubs, const int *subs);
114 int mxGetNumberOfElements (const mxArray *ptr);
115 int mxGetNumberOfDimensions(const mxArray *ptr);
116 int mxGetNumberOfFields(const mxArray *ptr);
117 void *mxGetData(const mxArray *ptr);
118 void *mxGetImagData(const mxArray *ptr);
119
120 void clear_mex(int nlhs, mxArray **plhs, int nrhs, mxArray **prhs);
121
122 extern void errjump (int n);
123 int  C2F(mxgetm)  (mxArray *ptr);
124 int  C2F(mxgetn)  (mxArray *ptr);
125 int  C2F(mxgetstring)  (mxArray *ptr, char *str, int *strl);
126 int  C2F(mxiscomplex)  (mxArray *ptr);
127 int  C2F(mxisfull)  (mxArray *ptr);
128 int  C2F(mxisnumeric)  (mxArray *ptr);
129 int  C2F(mxissparse)  (mxArray *ptr);
130 int  C2F(mxisstring)  (mxArray *ptr);
131 int *mxGetIr (const mxArray *ptr);
132 int *mxGetJc (const mxArray *ptr);
133
134 /**
135  * TODO : comment
136  * @param type
137  * @param m
138  * @param n
139  * @param it
140  * @param lr
141  * @param ptr
142  * @param type_len
143  * @return
144 */
145 int C2F(createptr)  (char *type, int *m, int *n, int *it, int *lr, int *ptr, long int type_len);
146
147 /**
148  * TODO : comment
149  * @param m
150  * @param ptr
151  * @return
152 */
153 int C2F(createstkptr)  (int *m, vraiptrst *ptr);
154
155
156 /**
157  * TODO : comment
158  * @param nlhs
159  * @param plhs
160  * @param nrhs
161  * @param prhs
162  * @return
163 */
164 int C2F(endmex)  (int *nlhs, mxArray **plhs, int *nrhs, mxArray **prhs);
165
166
167 /**
168  * TODO : comment
169  * @param nlhs
170  * @param plhs
171  * @param nrhs
172  * @param prhs
173  * @return
174 */
175 int C2F(initmex)  (int *nlhs, mxArray **plhs, int *nrhs, mxArray **prhs);
176
177 int C2F(mexcallscilab)  (int *nlhs, mxArray **plhs, int *nrhs, mxArray **prhs, char *name, int namelen);
178 int C2F(mxcopyptrtoreal8)  (mxArray *ptr, double *y, int *n);
179 int C2F(mxcopyreal8toptr)  (double *y, mxArray *ptr, int *n);
180 int fortran_mex_gateway (char *fname, FGatefuncH F);
181 int mexAtExit (mxArray *ptr);
182 int mexCallSCILAB (int nlhs, mxArray **plhs, int nrhs, mxArray **prhs, const char *name);
183 int mexCallMATLAB (int nlhs, mxArray **plhs, int nrhs, mxArray **prhs, const char *name);
184 int mex_gateway (char *fname, GatefuncH F);
185 int mxGetElementSize (const mxArray *ptr);
186 int mxGetM (const mxArray *ptr);
187 int mxGetN (const mxArray *ptr);
188 int mxGetNzmax (const mxArray *ptr);
189 int mxGetString (const mxArray *ptr, char *str, int strl);
190 char *mxArrayToString (const mxArray *array_ptr);
191 bool mxIsComplex (const mxArray *ptr);
192 bool mxIsDouble (const mxArray *ptr);
193 bool mxIsSingle (const mxArray *ptr);
194 bool mxIsFull (const mxArray *ptr);
195 bool mxIsNumeric (const mxArray *ptr);
196 bool mxIsSparse (const mxArray *ptr);
197 bool mxIsLogical (const mxArray *ptr);
198 bool mexIsGloball (const mxArray *ptr);
199 void mxSetLogical (mxArray *ptr);
200 void mxClearLogical (mxArray *ptr);
201 bool mxIsString (const mxArray *ptr);
202 bool mxIsChar (const mxArray *ptr);
203 bool mxIsEmpty (const mxArray *ptr);
204 bool mxIsClass (const mxArray *ptr, const char *name);
205 bool mxIsCell (const mxArray *ptr);
206 bool mxIsStruct (const mxArray *ptr);
207
208 bool mxIsInt8(const mxArray *ptr);
209 bool mxIsInt16(const mxArray *ptr);
210 bool mxIsInt32(const mxArray *ptr);
211 bool mxIsUint8(const mxArray *ptr);
212 bool mxIsUint16(const mxArray *ptr);
213 bool mxIsUint32(const mxArray *ptr);
214
215 void mxSetM(mxArray *ptr, int m);
216 void mxSetN(mxArray *ptr, int n);
217 void mxSetJc(mxArray *array_ptr, int *jc_data);
218 void mxSetIr(mxArray *array_ptr, int *ir_data);
219 void mxSetNzmax(mxArray *array_ptr, int nzmax);
220 void mxSetCell(mxArray *pa, int i, mxArray *value);
221
222 mxArray *mexGetArray(char *name, char *workspace);
223
224 mxArray *mexGetVariable(const char *workspace, const char *name);
225 const mxArray *mexGetVariablePtr(const char *workspace, const char *name);
226
227 unsigned long int C2F(mxcalloc)(unsigned int *n, unsigned int *size);
228
229 void  C2F(mexprintf)(char *error_msg, int len);
230
231 void *mxCalloc(size_t n, size_t size);
232 void *mxMalloc(size_t nsize);
233
234 void *mxCalloc_m(unsigned int n, unsigned int size);
235 void *mxMalloc_m(unsigned int nsize);
236 void  mxFree_m(void *);
237
238 void C2F(mexerrmsgtxt)(char *error_msg, int len);
239 void C2F(mxfreematrix)(mxArray *ptr);
240 void mexErrMsgTxt(char *error_msg);
241 int  mexEvalString(char *name);
242 void mexWarnMsgTxt(char *error_msg);
243 void mexprint(char* fmt,...);
244 void mxFree(void *ptr);
245 void mxFreeMatrix(mxArray *ptr);
246 void mxDestroyArray(mxArray *ptr);
247 int mxGetFieldNumber(const mxArray *ptr, const char *string);
248 mxArray *mxGetField(const mxArray *pa, int i, const char *fieldname);
249 void  mxSetFieldByNumber(mxArray *array_ptr, int index, int field_number, mxArray *value);
250 void mxSetField (mxArray *pa, int i, const char *fieldname, mxArray *value);
251
252
253 mxArray *mxGetFieldByNumber(const mxArray *ptr, int index, int field_number);
254 const char *mxGetFieldNameByNumber(const mxArray *array_ptr, int field_number);
255 mxLOGICAL *mxGetLogicals (mxArray *array_ptr);
256
257
258 /**
259  * TODO : comment
260  * @param x
261  * @return
262 */
263 vraiptrst C2F(locptr)(void *x);
264
265 typedef enum {
266         mxCELL_CLASS = 1,
267         mxSTRUCT_CLASS,
268         mxOBJECT_CLASS,
269         mxCHAR_CLASS,
270         mxSPARSE_CLASS,
271         mxDOUBLE_CLASS,
272         mxSINGLE_CLASS,
273         mxINT8_CLASS,
274         mxUINT8_CLASS,
275         mxINT16_CLASS,
276         mxUINT16_CLASS,
277         mxINT32_CLASS,
278         mxUINT32_CLASS,
279         mxUNKNOWN_CLASS = 0
280 } mxClassID;
281
282 typedef enum { mxREAL, mxCOMPLEX } mxComplexity; 
283
284
285
286 mxClassID mxGetClassID(const mxArray *ptr);
287 const char *mxGetName(const mxArray *array_ptr);
288 void mxSetName( mxArray    *pa,    const char *s );
289 void mxSetPr(mxArray *array_ptr, double *pr);
290 void mxSetPi(mxArray *array_ptr, double *pi);
291 void mxSetData(mxArray *array_ptr, void *pr);
292 mxArray *mxCreateNumericArray(int ndim, const int *dims, mxClassID classid, mxComplexity flag);
293 mxArray *mxCreateNumericMatrix(int m, int n, mxClassID classid, int cmplx_flag);
294 int mxSetDimensions(mxArray *array_ptr, const int *dims, int ndim);
295 mxArray *mxCreateDoubleMatrix(int m, int n, mxComplexity it);
296 mxArray *mxCreateDoubleScalar(double value);
297 mxArray *mxCreateSparse(int m, int n, int nzmax, mxComplexity cmplx);
298 mxArray *mxDuplicateArray(const mxArray *ptr);
299
300 /* typedef uint16_T mxChar; */
301
302 /* typedef short int mxChar; */
303 typedef unsigned short mxChar;
304
305 #define INT8_T char
306 #define UINT8_T unsigned char
307 #define INT16_T short
308 #define UINT16_T unsigned short
309 #define INT32_T int
310 #define UINT32_T unsigned int
311 #define REAL32_T float
312
313
314 typedef INT8_T int8_T;
315 typedef UINT8_T uint8_T;
316 typedef INT16_T int16_T;
317 typedef UINT16_T uint16_T;
318 typedef INT32_T int32_T;
319 typedef UINT32_T uint32_T;
320 typedef REAL32_T real32_T;
321
322 #endif /* SCI_MEX  */
323
324 #ifdef __cplusplus
325 }
326 #endif
327
328 /* generic mexfunction name */
329 #ifdef __cplusplus
330 extern "C" {
331   void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]);
332 }
333 #endif