00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #ifndef _mex_h_
00021 #define _mex_h_
00022
00023 #define USING_MEX2C
00024
00025
00026
00027
00028
00029 #ifdef USING_MEX2PY
00030 #define PY_ARRAY_UNIQUE_SYMBOL mex2py_ARRAY_API
00031 #include "Python.h"
00032 #include "arrayobject.h"
00033 #endif
00034
00035 #ifdef __cplusplus
00036 extern "C" {
00037 #ifdef NOT_DEFINED
00038 }
00039 #endif
00040 #endif
00041
00042
00043 #include <limits.h>
00044 #include <stddef.h>
00045 #include <stdlib.h>
00046 #include <stdio.h>
00047 #include <assert.h>
00048 #include <float.h>
00049 #include <math.h>
00050
00051
00052
00053
00054
00055
00056
00057
00058 #ifdef USING_MEX2PY
00059
00060 #define MEX2C_TAIL_HOOK
00061
00062
00063 #define StaticP static
00064 #else
00065
00066 #ifndef StaticP
00067 #define StaticP
00068 #endif
00069 #endif
00070
00071
00072
00073
00074
00075 #define mxMAXNAM 64
00076
00077
00078
00079
00080
00081
00082 #if defined(NO_BUILT_IN_SUPPORT_FOR_BOOL)
00083 typedef unsigned char bool;
00084 #ifndef false
00085 #define false (0)
00086 #endif
00087 #ifndef true
00088 #define true (1)
00089 #endif
00090 #else
00091 #include <stdbool.h>
00092 #endif
00093
00094 typedef bool mxLogical;
00095
00096
00097 #define MX_COMPAT_32
00098 #ifdef MX_COMPAT_32
00099 typedef int mwSize;
00100 typedef int mwIndex;
00101 typedef int mwSignedIndex;
00102 #else
00103 typedef size_t mwSize;
00104 typedef size_t mwIndex;
00105 typedef ptrdiff_t mwSignedIndex;
00106 #endif
00107
00108
00109 #ifdef USING_MEX2PY
00110
00111 typedef char mxChar;
00112 #else
00113 typedef unsigned short mxChar;
00114 #endif
00115
00116 typedef enum {
00117 mxUNKNOWN_CLASS = 0,
00118 mxCELL_CLASS = 1,
00119 mxSTRUCT_CLASS,
00120 mxLOGICAL_CLASS,
00121 mxCHAR_CLASS,
00122 mxSPARSE_CLASS,
00123 mxDOUBLE_CLASS,
00124 mxSINGLE_CLASS,
00125 mxINT8_CLASS,
00126 mxUINT8_CLASS,
00127 mxINT16_CLASS,
00128 mxUINT16_CLASS,
00129 mxINT32_CLASS,
00130 mxUINT32_CLASS,
00131 mxINT64_CLASS,
00132 mxUINT64_CLASS,
00133 mxFUNCTION_CLASS,
00134 mxOPAQUE_CLASS,
00135 mxOBJECT_CLASS
00136 } mxClassID;
00137
00138 typedef enum {
00139 mxREAL,
00140 mxCOMPLEX
00141 } mxComplexity;
00142
00143
00144
00145
00146 #ifdef USING_MEX2PY
00147
00148 #define mxArray PyArrayObject
00149
00150 #else
00151
00152
00153 struct _mxA {
00154
00155 mxClassID tag;
00156 bool sparse;
00157
00158 mwSize ndim;
00159 mwSize *dims;
00160 mwSize M;
00161 mwSize N;
00162 mwSize Nelem;
00163
00164 double datamin;
00165 double datamax;
00166
00167
00168
00169 union {
00170 struct {
00171 void *pr;
00172 void *pi;
00173 } numA;
00174 struct {
00175 mxChar *pc;
00176 } charA;
00177 struct {
00178 mxLogical *pl;
00179 } logA;
00180 struct {
00181 struct _mxA **ps;
00182 char **fname;
00183 int nfield;
00184 } structA;
00185 struct {
00186 struct _mxA **pc;
00187 } cellA;
00188 } data;
00189 };
00190
00191
00192 typedef struct _mxA mxArray;
00193
00194 #endif
00195
00196
00197 #ifdef USING_MEX2PY
00198
00199
00200
00201
00202 typedef void (mexfn_t_abbrev)(int, mxArray **, int , const mxArray **);
00203
00204 PyObject *mx_entry(mexfn_t_abbrev *, PyObject *, PyObject *,
00205 int, int, int, int,
00206 const char **, const char **, const char **);
00207 #endif
00208
00209
00210
00211
00212
00213
00214 #define mxIsFull() mxIsFull_is_obsolete
00215 #define mxCreateFull() mxCreateFull_is_obsolete
00216 #define mxIsString() mxIsString_is_obsolete
00217 #define mxFreeMatrix() mxFreeMatrix_is_obsolete
00218 #define mxSetLogical() mxSetLogical_is_obsolete
00219 #define mxClearLogical() mxClearLogical_is_obsolete
00220 #define mxSetName() mxSetName_is_obsolete
00221 #define mxGetName() mxGetName_is_obsolete
00222
00223
00224
00225
00226 #define mexPrintf printf
00227 #define mxAssert(expr,msg) assert(expr)
00228 #define mxAssertS(expr,msg) assert(expr)
00229
00230
00231
00232
00233
00234
00235
00236
00237 void mexErrMsgTxt( const char *error_msg);
00238 void mexWarnMsgTxt(const char *error_msg);
00239 int mexEvalString(const char *string);
00240 int mexCallMATLAB(int nlhs, mxArray *plhs[], int nrhs,
00241 mxArray *prhs[], const char *name);
00242 void mexLock(void);
00243 void mexUnlock(void);
00244 bool mexIsLocked(void);
00245 int mexAtExit(void (*exit_fcn)(void));
00246
00247 StaticP
00248 void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]);
00249 const char *mexFunctionName(void);
00250 int mexPutArray(mxArray *pa, const char *ws);
00251 int mexPutVariable(const char *workspace, const char *name, const mxArray *parray);
00252
00253
00254
00255 void *mxMalloc(size_t n);
00256 void *mxCalloc(size_t n, size_t size);
00257 void mxFree(void *ptr);
00258 void *mxRealloc(void *ptr, size_t size);
00259
00260 mxClassID mxGetClassID(const mxArray *pa);
00261 void *mxGetData(const mxArray *pa);
00262 void mxSetData(mxArray *pa, void *newdata);
00263 void *mxGetImagData(const mxArray *pa);
00264 void mxSetImagData(mxArray *pa, void *newdata);
00265 double *mxGetPi(const mxArray *pm);
00266 double *mxGetPr(const mxArray *pm);
00267 void mxSetPi(mxArray *pm, double *pi);
00268 void mxSetPr(mxArray *pm, double *pr);
00269
00270 double mxGetScalar(const mxArray *pm);
00271 int mxGetString(const mxArray *pa, char *buf, mwSize buflen);
00272 mxChar *mxGetChars(const mxArray *pa);
00273 mxLogical *mxGetLogicals(const mxArray *pa);
00274
00275 size_t mxGetM(const mxArray *pm);
00276 size_t mxGetN(const mxArray *pm);
00277 void mxSetM(mxArray *pm, mwSize m);
00278 void mxSetN(mxArray *pm, mwSize n);
00279 mwSize mxGetNumberOfDimensions(const mxArray *pa);
00280 const mwSize *mxGetDimensions(const mxArray *pa);
00281 int mxSetDimensions(mxArray *pa, const mwSize *size, mwSize ndims);
00282 size_t mxGetNumberOfElements(const mxArray *pa);
00283 size_t mxGetElementSize(const mxArray *pa);
00284 mwIndex mxCalcSingleSubscript(const mxArray *pa, mwSize nsubs, const mwIndex *subs);
00285
00286 mwIndex *mxGetIr(const mxArray *pa);
00287 void mxSetIr(mxArray *pa, mwIndex *newir);
00288 mwIndex *mxGetJc(const mxArray *pa);
00289 void mxSetJc(mxArray *pa, mwIndex *newjc);
00290 mwSize mxGetNzmax(const mxArray *pa);
00291 void mxSetNzmax(mxArray *pa, mwSize nzmax);
00292
00293 mxArray *mxGetCell(const mxArray *pa, mwIndex i);
00294 void mxSetCell(mxArray *pa, mwIndex i, mxArray *value);
00295 int mxGetNumberOfFields(const mxArray *pa);
00296 int mxGetFieldNumber(const mxArray *pa, const char *name);
00297 mxArray *mxGetFieldByNumber(const mxArray *pa, mwIndex i, int f);
00298 void mxSetFieldByNumber(mxArray *pa,mwIndex i,int f, mxArray *val);
00299 mxArray *mxGetField(const mxArray *pa, mwIndex i, const char *f);
00300 void mxSetField(mxArray *pa,mwIndex i,const char *f,mxArray *val);
00301 const char *mxGetFieldNameByNumber(const mxArray *pa, int f);
00302 const char *mxGetClassName(const mxArray *pa);
00303 int mxSetClassName(mxArray *pa, const char *classname);
00304 int mxAddField(mxArray *pa, const char *fieldname);
00305 void mxRemoveField(mxArray *pa, int fnum);
00306
00307 mxArray *mxGetProperty(const mxArray *pa, mwIndex i, const char *name);
00308 void mxSetProperty(mxArray *pa, mwIndex i, const char *name, const mxArray *val);
00309
00310 bool mxIsFromGlobalWS(const mxArray *pa);
00311 bool mxIsEmpty( const mxArray *pa);
00312 bool mxIsComplex(const mxArray *pa);
00313 bool mxIsDouble( const mxArray *pa);
00314 bool mxIsSparse( const mxArray *pa);
00315 bool mxIsNumeric(const mxArray *pa);
00316 bool mxIsChar( const mxArray *pa);
00317 bool mxIsCell( const mxArray *pa);
00318 bool mxIsStruct( const mxArray *pa);
00319 bool mxIsOpaque( const mxArray *pa);
00320 bool mxIsFunctionHandle(const mxArray *pa);
00321 bool mxIsObject( const mxArray *pa);
00322 bool mxIsClass(const mxArray *pa, const char *name);
00323 bool mxIsSingle( const mxArray *pa);
00324 bool mxIsLogical(const mxArray *pa);
00325 bool mxIsLogicalScalar(const mxArray *pa);
00326 bool mxIsLogicalScalarTrue(const mxArray *pa);
00327 bool mxIsInt8( const mxArray *pa);
00328 bool mxIsUint8( const mxArray *pa);
00329 bool mxIsInt16( const mxArray *pa);
00330 bool mxIsUint16( const mxArray *pa);
00331 bool mxIsInt32( const mxArray *pa);
00332 bool mxIsUint32( const mxArray *pa);
00333 bool mxIsInt64( const mxArray *pa);
00334 bool mxIsUint64( const mxArray *pa);
00335
00336
00337 mxArray *mxCreateNumericArray(mwSize n, const mwSize *dims, mxClassID id, mxComplexity f);
00338 mxArray *mxCreateNumericMatrix(mwSize m, mwSize n, mxClassID classid, mxComplexity f);
00339 mxArray *mxCreateDoubleMatrix (mwSize m, mwSize n, mxComplexity f);
00340 mxArray *mxCreateDoubleScalar(double value);
00341 #define mxCreateScalarDouble(d) mxCreateDoubleScalar(d)
00342 mxArray *mxCreateSparse(mwSize m, mwSize n, mwSize nzmax, mxComplexity f);
00343 mxArray *mxCreateSparseLogicalMatrix(mwSize m, mwSize n, mwSize nzmax);
00344 mxArray *mxCreateLogicalArray(mwSize ndim, const mwSize *dims);
00345 mxArray *mxCreateLogicalMatrix(mwSize m, mwSize n);
00346 mxArray *mxCreateLogicalScalar(mxLogical value);
00347 char *mxArrayToString(const mxArray *pa);
00348 mxArray *mxCreateString(const char *str);
00349 mxArray *mxCreateCharArray(mwSize ndim, const mwSize *dims);
00350 mxArray *mxCreateCharMatrixFromStrings(mwSize m, const char **str);
00351 mxArray *mxCreateCellMatrix(mwSize m, mwSize n);
00352 mxArray *mxCreateCellArray(mwSize ndim, const mwSize *dims);
00353 mxArray *mxCreateStructMatrix(mwSize m, mwSize n,int nf,const char **names);
00354 mxArray *mxCreateStructArray(mwSize nd, const mwSize *dims, int nf, const char **names);
00355 mxArray *mxDuplicateArray(const mxArray *in);
00356 void mxDestroyArray(mxArray *pa);
00357
00358
00359 #define mxGetEps() DBL_EPSILON
00360 #define mxGetInf getinfd
00361 #define mxGetNaN getnand
00362 #define mxIsFinite finite
00363 #define mxIsInf(x) (!finite(x))
00364 #define mxIsNaN isnan
00365 int finite(double dsrc);
00366
00367 #ifdef __cplusplus
00368 #ifdef NOT_DEFINED
00369 {
00370 #endif
00371 }
00372 #endif
00373
00374 #endif
00375