/* * @(#)libmatlb.h generated by: makeheader Mon Sep 11 16:32:46 2000 * * built from: include/copyright.h * include/libmatlb_defs.h * mlm/memory.c * mlm/stubs.c * mlm/handler.c * mlm/mlm.c * mlm/varargs.c * mlm/mlmdispatch.c * mlm/index.c * mlm/mlmscalar.c * mlm/mlmsparse.c * mlm/mxapi.c * mlm/license.c * mlm/feval.c * mlm/meval.c * mlm/mlmpath.c * mlm/mclscalar.c * mlm/validate.c * mlm/mclmex.c * mlm/mclinit.c * mlm/forloop.c * mlm/operators.c * mlm/mlmpath.c * mlm/mbfunctions.c * mlm/wrappers.c * mlm/mex_interface.c * include/libmatlb_post.h */ #ifndef libmatlb_h #define libmatlb_h /* $Revision: 1.1 $ */ /* * Copyright (c) 1984-1998 by The MathWorks, Inc. * All Rights Reserved. */ /* * $Revision: 1.2 $ */ #ifndef libmatlb_defs_h #define libmatlb_defs_h #ifdef __cplusplus extern "C" { #endif #include <stddef.h> #if defined(_H_STANDARDS) && !defined(__cplusplus) #undef NULL /* * The definition of NULL on IBM_RS, SGI and SGI64 causes problems. * it is defined as 0L and it will not work in comma-lists: * (x,0L) is not compatible with a pointer type * Ultimately, we need to generate a different constant for error handling * so that this definition is no necessary here. * IBM_RS is detected by the H_STANDARDS header file that I believe only * exists there */ #define NULL ((void *) 0L) #endif #include "matrix.h" #include "mwutil.h" #if defined(MLF_V1_2) && defined(MLF_V2) #undef MLF_V2 #endif #if !defined(MATLAB_COMPILER_GENERATED_CODE) && !defined(MLF_V1_2) && !defined(MLF_V2) #define MLF_V2 #endif #ifdef MLF_V2 #define MLF_ENABLE_ND_ARRAYS 1 #define MLF_USE_VARARGOUT 1 #ifndef __cplusplus #define MLF_ENABLE_TRYCATCH 1 #endif /* __cplusplus */ #endif /* MLF_V2 */ #define mclCastToMxarray(x) (mxArray *)(x) #ifdef __cplusplus } /* extern "C" */ #endif #endif /* libmatlb_defs_h */ #ifdef __cplusplus extern "C" { #endif #include "matrix.h" extern void* mclSafeMalloc(size_t sz); extern void mclSafeFree(void *ptr); extern void mlfSetLibraryAllocFcns(calloc_proc calloc_fcn, free_proc free_fcn, realloc_proc realloc_fcn, malloc_proc malloc_fcn); extern void mclInitMemoryManager(void); #include "matrix.h" #include "mex.h" #undef mexPrintf typedef void (*ErrorHandlerFcn)(const char*, bool); extern void libmmfile_defsInitialize(void); extern void libmmfile_defsTerminate(void); extern void libmatlbmxInitialize(void); extern void libmatlbmxTerminate(void); extern mxArray *mclGetUninitializedArray(void); extern bool mclIsCommaList(mxArray *array); extern bool mclIsNewContext(void); extern void mclLibmmfileInitialize( void ); extern void mclDestroyArray(mxArray *a); /* For use only by the compiler. Do not call this function */ extern bool mclIsTempArray(mxArray *a); /* For use only by the compiler. Do not call this function */ extern void mclFixInternalMatrix(mxArray *a); extern mxArray *mclCreateGlobal(void); extern mxArray * mclCppOwnsArray(mxArray *pa); extern void mclMoveArraysToCurrentContext(int count, mxArray **ppa); /* This function is intended for use only by the MATLAB compiler. */ extern void mclAssignLastValue(mxArray **ans); /* This function is intended for use only by the MATLAB compiler. */ extern mxArray *mclAssignAns(mxArray * volatile *dest, mxArray *src); extern mxArray *mclPrintAns(mxArray * volatile *dest, mxArray *src); extern mxArray *mlfAssign(mxArray * volatile *dest, mxArray *src); extern void mlfClear(mxArray * volatile *var, ...); extern mxArray *mclInitialize(mxArray *pa); extern void mlfEnterNewContext(int nout, int nin, ...); extern void mlfRestorePreviousContext(int nout, int nin, ...); extern void mlfSetPrintHandler(void (* PH)(const char *)); extern ErrorHandlerFcn mlfSetErrorHandler(ErrorHandlerFcn EH); extern void mclSetCppErrorHandler(ErrorHandlerFcn EH); extern int mlfPrintf(const char* fmt, ...); extern void mclInitLibrary( const char * path, int is_mcc ); extern void mclLibmatlbInitialize(int argc, const char ** argv); extern void mclLibmatlbTerminate(void); extern void mclMemcheckInitLibrary( void ); extern void mlfInitFcn(void); extern void mlfCleanupFcn(void); extern void mlfCleanupOutputArray(mxArray* pa); #include <setjmp.h> typedef void (*mclExceptionFcn)(void*); typedef struct mclErrorContext_tag { int depth; int allocContext; int arrayContext; int libraryContext; } mclErrorContext; typedef struct mclTryCatchContext_tag { mclErrorContext err_ctx; int err_mode; jmp_buf *buffer; ErrorHandlerFcn err_handler; mclExceptionFcn except_fcn; mclExceptionFcn trycatch_exception_fcn; mexLocalFunctionTable lft; struct mclTryCatchContext_tag *prev; /* * This structure must go last because of a mismatch in the size of * a jmp_buf between microsoft and borland compilers on the PC. * placing any fields after this is a guaranteed seg-fault! * The correct solution long-term is to use a different structure * in the error context for the ut_prevent_further_cleanup() function * which does not contain a jmp_buf. */ _try_catch_list _link; } mclTryCatchContext; extern void mclNewErrorContext(mclErrorContext *errorCtx); extern void mclRestoreErrorContext(mclErrorContext *errorCtx); typedef struct mclCppContext_tag { mclErrorContext errorCtx; ErrorHandlerFcn errorHandler; } mclCppContext; extern void mclEnterCppContext(mclCppContext *cppCtx); extern void mclExitCppContext(mclCppContext *cppCtx); extern void mclCppError(mclCppContext *cppCtx); extern void mclMexError(void); extern jmp_buf *mclGetSetjmpData(void); extern void mclEnterTryCatchContext(mclTryCatchContext *ctx, jmp_buf *newbuf, mclExceptionFcn exception_fcn); extern void mclExitTryCatchContext(mclTryCatchContext *ctx, int err_flag); extern void mclCleanupProtectedItems( void ); extern void mclExitTryBlock(void); #ifdef MLF_ENABLE_TRYCATCH static void _mclExceptionFcn(void* msg) { mclExceptionFcn dummy; dummy = _mclExceptionFcn; msg = 0;/* Prevents compiler warning */ mclCleanupProtectedItems(); longjmp(*mclGetSetjmpData(), -1); } /* * Consider the following C source: * * typedef long jb[5]; * ... * jb b; * jb *x = &b * * This causes the alpha compiler (and maybe others) to issue two warnings: * * ... & before array "b" is ignored ... * * ... the referenced type of the pointer value "&b" is "long", * which is not compatible with "array [5] of long" * * Thus rather than &_mcl_tcbuf, which is what you might think is right, * the pointer needed in the second argument to mclEnterTryCatchContext is * obtained with a cast. */ #define mlfTry \ { \ jmp_buf _mcl_tcbuf; \ mclTryCatchContext _mcl_ctx; \ mclEnterTryCatchContext(&_mcl_ctx, \ (jmp_buf *)_mcl_tcbuf, \ _mclExceptionFcn); \ if (!setjmp(_mcl_tcbuf)) { #define mclExitTryBlock_() mclExitTryCatchContext(&_mcl_ctx, 0) #define mclCatchWithoutExit \ } else {{ \ mclExitTryCatchContext(&_mcl_ctx, 1); #define mlfCatch mclExitTryBlock_(); mclCatchWithoutExit #define mlfEndCatch }}} #endif #define mlfLasterror mlfLasterr extern void mclCallMexFunction( int nlhs, mxArray *plhs[], int nrhs, mxArray **prhs, void (*fcn)( int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[] ) ); extern bool mclIsOutOfMemoryError(void); extern mxArray * mclCExecMexFunction(const char * fcn_name, int nargout_, mxArray * varargin); extern mxArray * mlfScalar(double v); #define mclBoolToArray(b) mlfScalar((double)b) extern mxArray * mlfComplexScalar(double v, double i); extern mxArray *mclComplexMatrixFromVector( int m, int n, double *pr, double *pi ); #define mclMatrixFromVector( m, n, pr ) mclComplexMatrixFromVector( m, n, pr, NULL ) extern mxArray * mlfDoubleMatrix(int m, int n, const double *pr, const double *pi); extern double *mlfGetPr(mxArray *pa); extern void mlfSetPr(mxArray *pa, double *pr); extern double *mlfGetPi(mxArray *pa); extern void mlfSetPi(mxArray *pa, double *pi); extern bool mclSwitchCompare(mxArray *switchvar, mxArray *casevar); extern mxArray * mclCreateEmptyArray(void ); #define mclArrayToInt(x) ((int)(*mxGetPr(x))) extern mxArray * mclCreateCellFromStrings(int count, const char** strings); extern mxArray * mclCreateEmptyCell(void); extern bool mlfTobool(mxArray *pa); extern void mlfAddFlops(double f); extern void mlfSetLibraryCalloc(void *func); extern void mlfSetLibraryMalloc(void *func); extern void mlfSetLibraryFree(void *func); extern void mlfPrintMatrix(mxArray *RI1); extern void mclPrintArray(mxArray *RI1, const char *name); extern void mlfSave(mxArray *file, const char* mode, ... ); extern void mlfSave_v12(const char* file, const char* mode, ...); extern void mlfLoad(mxArray *file, ... ); extern void mclLoadConditional(mxArray *file, ... ); extern void mlfLoad_v12(const char* file, ...); extern mxArray *mclCreateStructFromMatFile(mxArray *matfile, int numfields, mxArray **names); extern mxArray *mlfLoadStruct(mxArray *matfile, mxArray* pa, ...); #ifndef MLF_ENABLE_ND_ARRAYS #define mlfSave mlfSave_v12 #define mlfLoad mlfLoad_v12 #endif extern void mclVoid(mxArray *pa); extern double mclGetInf(void); #define mclGetMinusInf() (-mclGetInf()) #include <limits.h> /* defines INT_MIN */ #define mclIntMin() INT_MIN extern double mclGetNaN(void); #include <stdarg.h> #include "matrix.h" /* Flopper and function_object types, other functions */ #define MLFMAXVAR 100 #define mlfVararginDecls \ int nrhs = 0, size = MLFMAXVAR; \ mxArray *prhslocal[MLFMAXVAR], **prhs = prhslocal; \ mxArray *patemp; #define mlfVararginBody(varargin, last, uselast, ap) \ if (uselast) { \ patemp = last; \ } else { \ patemp = va_arg(ap, mxArray *); \ } \ while(patemp != NULL) { \ prhs[nrhs++] = patemp; \ if (nrhs == size) { \ size = mclExpandVararginList(&prhs, size, prhslocal); \ } \ patemp = va_arg(ap, mxArray *); \ } \ mlfAssign(varargin, mclUnpackVararginToCell(nrhs, prhs)); \ if (prhs != prhslocal) mxFree(prhs); /* mlfVarargin assigns, via the varargin argument, a cell array which is temporary and * is in the caller's array list context. Any temporary inputs to the varargs function * will be owned by the cell array. The cell array will have a reference count of 1, * and must be explicitly destroyed. */ /* Can't pass a va_list to a library compiled with a non-default compiler. */ #if (defined(__WATCOMC__) || defined(__BORLANDC__) || (defined(__GNUC__) && !defined(__linux__))) #define mlfVarargin( varargin, last, uselast) \ { \ mlfVararginDecls \ va_list ap; \ va_start(ap, last); \ mlfVararginBody(varargin, (mxArray*)last, uselast, ap) \ va_end(ap); \ } #else #define mlfVarargin( varargin, last, uselast) \ { \ va_list ap; \ va_start(ap, last); \ mclVarargin(varargin, (mxArray*)(void*)last, uselast, ap); \ va_end(ap); \ } #endif /* For math library use only. Do not call this function.*/ extern int mclExpandVararginList(mxArray ***prhs, int size, mxArray **prhslocal); extern int mclUnpackCommaList(mxArray **prhs, mxArray *m, bool to_cell, bool is_cpp_array); /* For math library use only. Do not call this function.*/ extern mxArray *mclUnpackVararginToCell(int nrhs, mxArray **prhs); extern void mclVarargin(mxArray ** varargin, mxArray * last, int uselast, va_list ap); extern int mlfCountVarargin(va_list ap, mxArray *first); /* For math library use only. Do not call this function.*/ extern void mlfUnpackVarargin(va_list ap, mxArray **prhs, mxArray *first); extern mxArray *mlfCellhcat(mxArray *pa, ...); extern void mlxCellhcat(int nlhs, mxArray **plhs, int nrhs, mxArray **prhs); extern int mclNargin(int nargs, ...); typedef struct mlfVarargoutList_tag mlfVarargoutList; extern int mclNargout(mlfVarargoutList *varargout); extern mlfVarargoutList *mlfIndexVarargout(mxArray **ppa, ...); extern mlfVarargoutList *mlfVarargout(mxArray **ppa, ...); extern mxArray *mlfGetVarargoutCell(mlfVarargoutList *v); extern mxArray **mlfGetVarargoutCellPtr(mlfVarargoutList *v); extern mlfVarargoutList *mclAnsVarargout(void); extern mlfVarargoutList *mclNVarargout(int nargout, int varargout_used, ...); extern mlfVarargoutList *mclValueVarargout(void); extern mxArray *mlfAssignOutputs(mlfVarargoutList *v); extern void mclCreateVarargoutCell(mlfVarargoutList *vout, int nvarargs, mxArray **ppa); extern void mclAssignVarargoutCell(int offset, int nlhs, mxArray *plhs[], mxArray *cell); extern mxArray *mclCreateVararginCell(int nrhs, mxArray *prhs[]); typedef void (*mlfFcnPtr)(int, mxArray**, int, mxArray**); typedef struct mlfDispatchTable_tag { mlfFcnPtr *vtab; const char** funcnames; int nfuncs; } mlfDispatchTable; /* For math library use only. Do not call this function */ extern void mlfDispatch(int nlhs, mxArray** plhs, int nrhs, mxArray** prhs, int code, mlfDispatchTable *dt); #define MLF_DEFAULT_INDEX_SIZE 4 typedef unsigned char mlfIndexType; struct mlfIndexDef_tag { int num_index_ops; mlfIndexType *type; int *idx; mxArray **subscripts; int *fieldptrs; char *fieldnames; mlfIndexType type_local[MLF_DEFAULT_INDEX_SIZE]; int idx_local[MLF_DEFAULT_INDEX_SIZE+1]; mxArray *subscripts_local[MLF_DEFAULT_INDEX_SIZE]; int fieldptrs_local[MLF_DEFAULT_INDEX_SIZE+1]; char fieldnames_local[MLF_DEFAULT_INDEX_SIZE]; mxArray **dest; int size; int max_size; mxArray *lastref; }; #define mlfCELL 0 #define mlfARRAY 1 #define mlfSTRUCT 2 typedef struct mlfIndexDef_tag mlfIndexDef; /* For use only by the C++ math library. Do not call this function. */ extern void mclInitIndex(mlfIndexDef *index_def); extern void mclDestroyIndexDef(mlfIndexDef *index_def, int free_flag); extern void mclCopyIndexDef(mlfIndexDef *dest, const mlfIndexDef *src); /* For use only by the C++ math library. Do not call this function. */ extern void mclAddIndex(mlfIndexDef *index_def, mlfIndexType type, int nsubscripts, mxArray **psubscripts); extern void mclAddFieldToLastIndex(mlfIndexDef *index_def, const char* fname_in); /* For use only by the C++ math library. Do not call this function. */ extern mxArray *mclComplexRef(mxArray *pa, mlfIndexDef *index_def); /* This function is intended for use only by the C++ math library */ extern void mclComplexAssign(mlfIndexDef *index_def, mxArray *src, bool packCell, bool do_scalar_assign); extern void mclPrintIndex(const char* index_string, ...); extern mxArray * mlfIndexRef(mxArray *pa, const char* index_string, ...); extern mxArray * mlfIndexAssign(mxArray * volatile *pa, const char* index, ...); extern mxArray * mlfIndexDelete(mxArray * volatile *pa, const char* index, ...); extern mxArray* mlfArrayRef(mxArray *array, ...); extern void mlfArrayAssign(mxArray *dest, mxArray *src, ...); extern void mlfArrayDelete(mxArray *dest, ...); extern mxArray * mlfCreateColonIndex( void ); extern bool mlfIsColonIndex(mxArray *a); extern int mclGetNumberOfIndexedElements(mlfIndexDef *index_def); /* For use only by the C++ math library */ extern int mclMultiAssign(mlfIndexDef *index_def, mxArray **prhs, int max_rhs_size); extern mxArray *mclArrayRef1( mxArray *pa, mxArray *sub ); extern mxArray *mclArrayRef2( mxArray *pa, mxArray *sub1, mxArray *sub2 ); extern mxArray *mclIntArrayRef1( mxArray *pa, int sub ); extern mxArray *mclIntArrayRef2( mxArray *pa, int sub1, int sub2 ); extern void mclArrayAssign1( mxArray **dest, mxArray *src, mxArray *sub ); extern void mclArrayAssign2( mxArray **dest, mxArray *src, mxArray *sub1, mxArray *sub2 ); extern void mclIntArrayAssign1( mxArray **dest, mxArray *src, int sub ); extern void mclIntArrayAssign2( mxArray **dest, mxArray *src, int sub1, int sub2 ); extern void *mclMalloc(size_t s); extern void *mclCalloc(size_t c, size_t s); extern void *mclRealloc(void *p, size_t s); #ifdef mxMalloc #undef mxMalloc #endif #define mxMalloc mclMalloc #ifdef mxCalloc #undef mxCalloc #endif #define mxCalloc mclCalloc #ifdef mxRealloc #undef mxRealloc #endif #define mxRealloc mclRealloc extern int mclUnshareArray(mxArray *pa, int level); #ifdef mxUnshareArray #undef mxUnshareArray #endif #define mxUnshareArray mclUnshareArray extern mxArray *mclCreateCellArray(int ndim, const int *dims); #ifdef mxCreateCellArray #undef mxCreateCellArray #endif #define mxCreateCellArray mclCreateCellArray extern mxArray *mclCreateCharMatrixFromStrings(int m, const char **str); #ifdef mxCreateCharMatrixFromStrings #undef mxCreateCharMatrixFromStrings #endif #define mxCreateCharMatrixFromStrings mclCreateCharMatrixFromStrings extern mxArray *mclCreateDoubleMatrix(int m, int n, mxComplexity ComplexFlag); #ifdef mxCreateDoubleMatrix #undef mxCreateDoubleMatrix #endif #define mxCreateDoubleMatrix mclCreateDoubleMatrix extern mxArray *mclCreateNumericArray(int ndim, const int *dims, mxClassID clsid, mxComplexity ComplexFlag); #ifdef mxCreateNumericArray #undef mxCreateNumericArray #endif #define mxCreateNumericArray mclCreateNumericArray extern mxArray *mclCreateSparse(int m, int n, int nzmax, mxComplexity ComplexFlag); #ifdef mxCreateSparse #undef mxCreateSparse #endif #define mxCreateSparse mclCreateSparse extern mxArray *mclCreateString(const char *str); #ifdef mxCreateString #undef mxCreateString #endif #define mxCreateString mclCreateString extern mxArray *mclCreateStructArray(int ndim, const int *dims, int nfields, const char **field_names); #ifdef mxCreateStructArray #undef mxCreateStructArray #endif #define mxCreateStructArray mclCreateStructArray extern mxArray *mclCreateStructMatrix(int m, int n, int nfields, const char **field_names); #ifdef mxCreateStructMatrix #undef mxCreateStructMatrix #endif #define mxCreateStructMatrix mclCreateStructMatrix extern mxArray *mclDuplicateArray(const mxArray *in); #ifdef mxDuplicateArray #undef mxDuplicateArray #endif #define mxDuplicateArray mclDuplicateArray extern mxArray *mclGetCell(const mxArray *array_ptr, int index); #ifdef mxGetCell #undef mxGetCell #endif #define mxGetCell mclGetCell extern void *mclGetData(const mxArray *array_ptr); #ifdef mxGetData #undef mxGetData #endif #define mxGetData mclGetData extern mxArray *mclGetField(const mxArray *array_ptr, int index, const char *field_name); #ifdef mxGetField #undef mxGetField #endif #define mxGetField mclGetField extern mxArray *mclGetFieldByNumber(const mxArray *array_ptr, int index, int field_number); #ifdef mxGetFieldByNumber #undef mxGetFieldByNumber #endif #define mxGetFieldByNumber mclGetFieldByNumber extern void *mclGetImagData(const mxArray *array_ptr); #ifdef mxGetImagData #undef mxGetImagData #endif #define mxGetImagData mclGetImagData extern int *mclGetIr(const mxArray *array_ptr); #ifdef mxGetIr #undef mxGetIr #endif #define mxGetIr mclGetIr extern int *mclGetJc(const mxArray *array_ptr); #ifdef mxGetJc #undef mxGetJc #endif #define mxGetJc mclGetJc extern double *mclGetPr(const mxArray *array_ptr); #ifdef mxGetPr #undef mxGetPr #endif #define mxGetPr mclGetPr extern double *mclGetPi(const mxArray *array_ptr); #ifdef mxGetPi #undef mxGetPi #endif #define mxGetPi mclGetPi extern void mclSetCell(mxArray *array_ptr, int index, mxArray *value); #ifdef mxSetCell #undef mxSetCell #endif #define mxSetCell mclSetCell extern void mclSetData(mxArray *array_ptr, void *data_ptr); #ifdef mxSetData #undef mxSetData #endif #define mxSetData mclSetData extern int mclSetDimensions(mxArray *array_ptr, const int *dims, int ndims); #ifdef mxSetDimensions #undef mxSetDimensions #endif #define mxSetDimensions mclSetDimensions extern void mclSetField(mxArray *array_ptr, int index, const char *field_name, mxArray *value); #ifdef mxSetField #undef mxSetField #endif #define mxSetField mclSetField extern void mclSetFieldByNumber(mxArray *array_ptr, int index, int field_number, mxArray *value); #ifdef mxSetFieldByNumber #undef mxSetFieldByNumber #endif #define mxSetFieldByNumber mclSetFieldByNumber extern void mclSetImagData(mxArray *array_ptr, void *pi); #ifdef mxSetImagData #undef mxSetImagData #endif #define mxSetImagData mclSetImagData extern void mclSetIr(mxArray *array_ptr, int *ir); #ifdef mxSetIr #undef mxSetIr #endif #define mxSetIr mclSetIr extern void mclSetJc(mxArray *array_ptr, int *jc); #ifdef mxSetJc #undef mxSetJc #endif #define mxSetJc mclSetJc extern void mclSetPi(mxArray *array_ptr, double *pi); #ifdef mxSetPi #undef mxSetPi #endif #define mxSetPi mclSetPi extern void mclSetPr(mxArray *array_ptr, double *pr); #ifdef mxSetPr #undef mxSetPr #endif #define mxSetPr mclSetPr extern mxArray *mclCreateSharedCopy(const mxArray *pa); #ifdef mxCreateSharedCopy #undef mxCreateSharedCopy #endif #define mxCreateSharedCopy mclCreateSharedCopy #include "mex.h" #undef printf typedef void (*mlfFuncp)( void ); typedef int (*mlfThunkp)( mlfFuncp pFunc, int nlhs, mxArray **plhs, int nrhs, mxArray **prhs ); typedef struct { const char *name; mlfFuncp pFunc; mlfThunkp pThunk; } mlfFuncTabEnt; typedef mlfFuncTabEnt mlfFuncTab; /* Table is just an array of entries */ extern mexLocalFunctionTable mclSetCurrentLocalFunctionTable(mexLocalFunctionTable lft); extern mxFunctionPtr mclFevalLookup( mxArray* fcn ); extern mxFunctionPtr mlfFevalLookup(mxArray *fcn); /* * General call to another mexfile for feval. * This function is identical to mlfCallMATLAB except * for the "real work" section where it calls * another mex file instead of mexCallMATLAB. */ extern void mlfFeval_12( int nlhs, mxArray **plhs, int nrhs, mxArray **prhs, const char *name ); extern void mlfFevalTableSetup( mlfFuncTab *mlfUfuncTable ); extern void mlfFunctionTableSetup(size_t size, mexFunctionTable pTab); extern void mlfFunctionTableTakedown(size_t size, mexFunctionTable pTab); /* * Used by C++ math library. */ extern void mclFevalArray( int nlhs, mxArray **plhs, int nrhs, mxArray **prhs ); extern mxArray * mclFeval(mlfVarargoutList *varargout, mxFunctionPtr mxfn, ...); extern mxArray * mlfFeval(mlfVarargoutList *varargout, ...); extern void mlxFeval( int nlhs, mxArray *plhs[], int nrhs, mxArray *prhs[] ); extern mxArray * mlfBuiltin(mlfVarargoutList *varargout, ...); extern void mlxBuiltin( int nlhs, mxArray *plhs[], int nrhs, mxArray *prhs[]); extern mxArray * mclCreateSimpleFunctionHandle(mxFunctionPtr f, const char *name); extern void mcl_eval_string_fcn( int nlhs, mxArray **plhs, const char *str, mxFunctionPtr (*lookup)(char* name, void *lookup_x), void *lookup_x ); extern void mclEvalString( int nlhs, mxArray **plhs, const char *str ); extern void mclAddPaths( size_t num_paths, const char **paths ); extern bool mclFindFirstFileName( const char *name, bool supply_matlab_exts, char *fullname ); extern void mclInitMatlabRoot( int *argc, const char **argv ); extern double mclDivideDouble(double x, double y); extern double mclLeftDivideDouble(double x, double y); extern mxArray *mclDivideDoublePair(double x1, double x2, double y1, double y2); extern mxArray *mclLeftDivideDoublePair(double x1, double x2, double y1, double y2); extern int mclLengthInt(mxArray *a); #define mclInitializeAns() mclGetUninitializedArray() #define mclInitializeNull() mclGetUninitializedArray() #define mclIsUninitialized(pa) (mxGetClassID(pa) == mxUNKNOWN_CLASS) #define mclIsInitialized(pa) (pa != NULL && !mclIsUninitialized(pa)) extern mxArray *mlfReturnValue(mxArray *a); extern bool mclUninitWarning( const char *vname ); typedef enum mclValidateErrorCode { mclINPUT_UNDEFINED=0, mclFCN_OR_VARIABLE_UNDEFINED } mclValidateErrorCode; #ifndef WARNING_FREE_CODE #define mclIsUninitializedWarn( in, vname ) ( mclIsUninitialized(in) ? mclUninitWarning(vname) : false ) /* * If "in" is Undefined, throw an error. * If "in" is Uninitialized, return []. Otherwise return "in". */ #define mclVva_uninitialized( in, vname) \ !mclIsUninitializedWarn(in,vname) ? in : mclCreateEmptyArray() #define mclVs_uninitialized( in, vname) (mclIsUninitializedWarn(in,vname), in) #define mclVve( in, vname ) \ ( mclIsUninitializedWarn( in, vname ) ? mclCreateEmptyArray() : in ) #else #define mclVva_uninitialized( in, vname) in #define mclVs_uninitialized( in, vname) in #define mclVve( in, vname ) in #endif #define mclVva( in, errcode, vname ) \ ( in != NULL ? mclVva_uninitialized(in, vname) : mclValidateError( errcode, vname ) ) #define mclVs_(in, errcode, vname ) \ ( (in) != NULL ? mclVs_uninitialized(in, vname) : mclValidateError(errcode, vname ) ) #define mclVa(in, vname) mclVva(in, mclINPUT_UNDEFINED, vname) #define mclVv(in, vname) mclVva(in, mclFCN_OR_VARIABLE_UNDEFINED, vname) #define mclVsv(in, vname) mclVs_(in, mclFCN_OR_VARIABLE_UNDEFINED, vname) #define mclVsa(in, vname) mclVs_(in, mclINPUT_UNDEFINED, vname) #define mclVo( output ) { if ( *output == NULL ) *output = mclGetUninitializedArray(); } extern mxArray *mclValidateError( mclValidateErrorCode code, const char *vname ); extern mxArray *mclVe( mxArray *in ); #ifdef WARNING_FREE_CODE #define mclVe(in) in #endif extern void mclCopyInputArg( mxArray * volatile *dest, mxArray *src ); extern void mclCopyArray( mxArray **pa ); extern void mclCopyOutputArg(mxArray * volatile *dest, mxArray *src); extern void mclValidateOutputWarning( const char *vname, const char *fname ); #ifndef WARNING_FREE_CODE #define mclValidateOutput( output, pos, nargout, vname, fname ) \ { \ if ((output) == NULL) { \ mlfAssign( &(output), mclGetUninitializedArray() ); \ } \ else \ if ( pos <= nargout && mclIsUninitialized(output) ) { \ mclValidateOutputWarning( vname, fname ); \ } \ } (void)0 #else #define mclValidateOutput( output, pos, nargout, vname, fname ) \ { \ if ((output) == NULL) \ mlfAssign( &(output), mclGetUninitializedArray() ); \ } (void)0 #endif extern mxArray ** mclInitGlobal( mxArray **g ); #define mclPrepareGlobal(g) ((*g != NULL) ? g : mclInitGlobal(g)) extern mxArray *mclVg( mxArray **pg, const char *name ); /* Common definitions */ #define mclAppendMlineCommon() \ mclAppendMlineToError( (const char *) __M_file_name, \ (const char *) __M_function_name, \ (size_t) __M_line_number ); #define mclMlineEnterFunctionCommon(file_name, function_name ) \ { const char * volatile __M_file_name = file_name; \ const char * volatile __M_function_name = function_name; \ volatile size_t __M_line_number = 0; #ifdef __cplusplus #ifdef EXCEPTIONS_WORK #define mclMlineEnterFunction( file_name, function_name ) \ mclMlineEnterFunctionCommon( file_name, function_name) \ try{ #define mclMlineExitFunction() \ } catch (mwException &) { \ mclAppendMlineCommon() \ error( lasterror() ); \ } } return #else /* if !EXCEPTIONS_WORK */ #define mclMlineEnterFunction mclMlineEnterFunctionCommon #define mclMlineExitFunction() } return #endif /* EXCEPTIONS_WORK */ #define mclMlineFunctionReturn() #define mclMlineExitFunctionReturn() mclMlineExitFunction() mwArray() #else /* if !__cplusplus */ #define mclMlineEnterFunction( file_name, function_name ) \ mclMlineEnterFunctionCommon( file_name, function_name ) \ mlfTry { #define mclMlineExitFunctionCommon() \ mclAppendMlineCommon() \ mlfError( mlfLasterror(NULL) ); \ } mlfEndCatch } return #define mclMlineExitFunction() \ } mlfCatch { \ mclMlineExitFunctionCommon() #define mclMlineFunctionReturn() mclExitTryBlock_(); #define mclMlineExitFunctionReturn() \ } mclCatchWithoutExit { mclMlineExitFunctionCommon() NULL #endif /* !__cplusplus */ #define mclMline( line ) __M_line_number = line; extern void mclAppendMlineToError(const char *file_name, const char *function_name, size_t line_number ); extern int mclCallMexFile( int nlhs, /* number of expected outputs */ mxArray *plhs[], /* pointer array to outputs */ int nrhs, /* number of inputs */ mxArray *prhs[], /* pointer array to inputs */ const char *fcn_name /* name of function to execute */ ); extern mxArray * mclExecMexFile(mlfVarargoutList *varargout, const char *name, ...); extern mxArray *mclInitializeDouble( double d ); extern mxArray *mclInitializeComplex( double re, double im ); extern mxArray *mclInitializeComplexVector( int m, int n, double *pr, double *pi ); extern mxArray *mclInitializeDoubleVector( int m, int n, double *pr ); extern mxArray *mclInitializeString( int len, mxChar *string_pr ); extern mxArray *mclInitializeCharVector( int m, int n, mxChar *string_pr ); extern mxArray *mclInitializeCell( mxArray *cell ); extern mxArray *mclInitializeCellVector( int m, int n, mxArray **cell_pr ); extern mxArray *mclInitializeOther( unsigned char *buf, size_t size ); extern void mclInitializePersistent(mxArray* volatile * pv); extern mxArray *mclInitializeLogical( bool b ); extern mxArray *mclInitializeLogicalVector( int m, int n, double *pr ); typedef enum {mclFOR_COLON, mclFOR_NUMERIC, mclFOR_GENERIC} mclForLoopCategory; typedef struct _mclForLoopIterator mclForLoopIterator; typedef void (*fn_for_next)( mclForLoopIterator *iter, mxArray * index ); /* For use only by the Matlab compiler. */ struct _mclForLoopIterator { int curridx; /* Current index into loop array */ int maxidx; /* number of times to repeat the loop */ mclForLoopCategory category; fn_for_next start; fn_for_next next; union { struct { int m; unsigned char scalar; unsigned char logical; void *pr; void *pi; int nel; mxArray *loop_array; /* array over which we are iterating, (null if colon index) */ } num; struct { double start; /* start value (ignored if not colon) */ double delta; /* step value (ignored if not colon) */ } colon; struct { mxArray *loop_array; /* array over which we are iterating, (null if colon index) */ mxArray *row; /* row index (null if colon index) */ mxArray *col; /* column index (null if colon index)*/ } arr; } iter; }; #define mclForDone 0 /* For use only by the Matlab compiler. Do not call this function. */ extern void mclDestroyForLoopIterator_(mclForLoopIterator *iter); #define mclDestroyForLoopIterator(x) mclDestroyForLoopIterator_(&x) /* For use only by the Matlab compiler. Do not call this function. */ extern void mclForStart(mclForLoopIterator *iter, mxArray *pa, mxArray *pa2, mxArray *pa3); typedef mxArray * volatile *mclVolatileArrayPtr; /* For use only by the Matlab compiler. Do not call this function. */ extern int mclForNext(mclForLoopIterator *iter, mclVolatileArrayPtr ppa); /* For use only by the Matlab compiler. Do not call this function. */ /* * The purpose of this function is to ensure that a value of INT_MIN for * the upper bound of a loop always causes a null loop. This is true as * long as the start of the loop is not exactly INT_MIN. */ extern int mclForIntStart(int s); /* For use only by the Matlab compiler. Do not call this function. */ /* * The next two functions are based on mxColonop_size for integer values of * what are there called a and d. */ extern int mclForIntEnd(mxArray *e); /* The increment is implicitly 1 */ /* For use only by the Matlab compiler. Do not call this function. */ /* * When comparing to mxColonop_size, s corresponds to a, and i to d. * This returns the exact endpoint, so termination can be done by equality, * independently of the sign of i. */ extern int mclForIntIntEnd(int s, int i, mxArray *e); extern mxArray *mclPlus( mxArray *a, mxArray *b ); extern mxArray *mclMinus( mxArray *a, mxArray *b ); extern mxArray *mclTimes( mxArray *a, mxArray *b ); extern mxArray *mclMtimes( mxArray *a, mxArray *b ); extern mxArray *mclRdivide( mxArray *a, mxArray *b ); extern mxArray *mclMrdivide( mxArray *a, mxArray *b ); extern mxArray *mclMpower( mxArray *a, mxArray *b ); extern mxArray *mclEq( mxArray *a, mxArray *b ); extern mxArray *mclNe( mxArray *a, mxArray *b ); extern mxArray *mclLt( mxArray *a, mxArray *b ); extern mxArray *mclGt( mxArray *a, mxArray *b ); extern mxArray *mclLe( mxArray *a, mxArray *b ); extern mxArray *mclGe( mxArray *a, mxArray *b ); extern mxArray *mclAnd( mxArray *a, mxArray *b ); extern mxArray *mclOr( mxArray *a, mxArray *b ); extern mxArray *mclUplus( mxArray *a ); extern mxArray *mclUminus( mxArray *a ); extern mxArray *mclNot( mxArray *a ); extern bool mclEqBool( mxArray *a, mxArray *b ); extern bool mclNeBool( mxArray *a, mxArray *b ); extern bool mclLtBool( mxArray *a, mxArray *b ); extern bool mclGtBool( mxArray *a, mxArray *b ); extern bool mclLeBool( mxArray *a, mxArray *b ); extern bool mclGeBool( mxArray *a, mxArray *b ); extern bool mclNotBool( mxArray *a ); extern void mclAddPaths( size_t num_paths, const char **paths ); extern bool mclFindFirstFileName( const char *name, bool supply_matlab_exts, char *fullname ); extern void mclInitMatlabRoot( int *argc, const char **argv ); extern void mclLibInitGlobals(int length, mexGlobalTable globals); extern void mclLibTermGlobals(int length, mexGlobalTable globals); extern void mclLibInitInitTerms(int length, mexInitTermTableEntry inits); extern void mclLibTermInitTerms(int length, mexInitTermTableEntry terms); extern void mclLibInitCommon( mex_information info ); extern void mclLibInit(int * ref, mex_information info); extern void mclLibTermCommon( mex_information info ); extern void mclLibTerm(int * ref, mex_information info); extern int mclMain( int argc, const char **argv, mxFunctionPtr mlxfn, bool nout, mex_information info ); extern mex_information mclMex( mex_information mex_info ); extern void mclMextest( int nlhs, mxArray **plhs, int nrhs, const mxArray **prhs, mxFunctionPtr mlxF, mex_information info, const char *mfcn ); /* * These macros are for backward compatibility. */ #define mclGlobalTableEntry mexGlobalTableEntry #define mclExportGlobal mexExportGlobal #define mlfFunctionTableEntry mexFunctionTableEntry extern mxArray * mclFevalCallMATLAB(mlfVarargoutList *varargout, const char *name, ...); extern int mclSupportedDataTypes(int nrhs, const mxArray **prhs); /* * $Revision: 1.1 $ */ #include "libmatlbm.h" #include "libsgl.h" #ifdef __cplusplus } /* extern "C" */ #endif #endif /* libmatlb_h */