/*
 * $Revision: 1.68 $  $Date: 1999/01/20 23:44:26 $
 * Copyright (c) 1984-1998 by The MathWorks, Inc.
 */

#ifndef matlab_h
#define matlab_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"


#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 */

/* builtin functions */
#include "libmatlb.h"

/* get Prototypes */
#include "libmmfile.h"

/* graphics library interface */
#include "libsgl.h"

/* graphics library m-file interface */
#include "libsglm.h"

#ifndef MLF_ENABLE_ND_ARRAYS
#define mlfOnes(A,B) mlfOnes(A, B, NULL)
#define mlfRand(A,B) mlfRand(A, B, NULL)
#define mlfRandn(A,B) mlfRandn(A, B, NULL)
#define mlfZeros(A,B) mlfZeros(A, B, NULL)
extern mxArray * mlfSize2d(mxArray **OO1, mxArray *RI1, mxArray *OI1);
#define mlfSize mlfSize2d
#endif

/* Backwards compatibility macros */
#if !defined(MLF_V2)
#if !defined(MATLAB_COMPILER_GENERATED_CODE)
#define mlfDel2(A,B,C) mlfDel2(A, B, C, NULL)
#define mlfDatevec(A,B,C,D,E,F) mlfDatevec(A,B,C,D,E,F,NULL)
#define mlfQr(A,B,C,D) mlfQr(A,B,C,D,NULL)
#define mlfLu(A,B,C) mlfLu(A,B,C,NULL)
#define mlfAutomesh(A,B,C) mlfAutomesh(A,B,C,NULL)
#define mlfCov(A,B,C) mlfCov(A,B,C,NULL)
#define mlfStrjust(A) mlfStrjust(A,NULL)
#define mlfNumjac(o2,o3,i1,i2,i3,i4,i5,i6,i7,i8,i9) \
        mlfNumjac(o2,o3,NULL,i1,i2,i3,i4,i5,i6,i7,i8,i9,NULL)
#define mlfFmin(A,B,C,D,E,F) mlfFmin(A,B,C,D,E,F,NULL)
#define mlfFmins(A,B,C,D,E,F) mlfFmins(A,B,C,D,E,F,NULL)
#define mlfFzero(A,B,C,D,E) mlfFzero(NULL, NULL, NULL, A, B, C, D, E, NULL)
#define mlfIcubic(A,B,C) mlfIcubic(A,B,C,NULL)
#define mlfInterp1(A,B,C,D) mlfInterp1(A,B,C,D,NULL)
#define mlfInterp2(A,B,C,D,E,F) mlfInterp2(A,B,C,D,E,F,NULL)
#define mlfInterp4(A,B,C,D,E) mlfInterp4(A,B,C,D,E,NULL)
#define mlfInterp5(A,B,C,D,E) mlfInterp5(A,B,C,D,E,NULL)
#define mlfInterp6(A,B,C,D,E) mlfInterp6(A,B,C,D,E,NULL)
#define mlfQuad(out,A,B,C,D,E,F) mlfQuad(out,A,B,C,D,E,F,NULL)
#define mlfQuad8(out,A,B,C,D,E,F) mlfQuad8(out,A,B,C,D,E,F,NULL)
#endif /*!defined(MATLAB_COMPILER_GENERATED_CODE) */
#define mlfOde113 mlfOde113_v4
#define mlfOde15s mlfOde15s_v4
#define mlfOde23 mlfOde23_v4
#define mlfOde23s mlfOde23s_v4
#define mlfOde45 mlfOde45_v4
#define mlfOdeget mlfOdeget_v4
#define mlfOdeset mlfOdeset_v4
#define mlfGradient mlfGrd_v4
#endif

/* Initialize the Handle Graphics system: was hgInitialize */
extern void mlfHGInitialize(int *argc, const char *argv[]);
/* Evaluate display events until all windows have been closed */
extern void mlfHGWaitForFiguresToDie();
/* Cleanup */
extern void mlfHGTerminate();

extern mxArray * mxColonop ( double, double, double );

typedef void (*mlfFuncp)( void );
typedef int (*mlfThunkp)( mlfFuncp pFunc, int nlhs, mxArray **plhs, int nrhs, mxArray **prhs );
typedef struct {
    char *name;
    mlfFuncp pFunc;
    mlfThunkp pThunk;
} mlfFuncTabEnt;
typedef mlfFuncTabEnt mlfFuncTab;  /* Table is just an array of entries */

typedef void (*mlxFunctionPtr)(int nlhs, mxArray * plhs[], int nrhs, mxArray * prhs[]);

typedef struct mlfFunctionTableEntry_tag {
    const char *name;
    mlxFunctionPtr mlxFcn;
    int nargin;
    int nargout;
} mlfFunctionTableEntry;

extern void mlfFunctionTableSetup(size_t size, mlfFunctionTableEntry *pTab);
extern void mlfFunctionTableTakedown(size_t size, mlfFunctionTableEntry *pTab);

extern mlxFunctionPtr mclFevalLookup(mxArray* fcn, size_t size, 
                                     mlfFunctionTableEntry *pTable);
extern mxArray *mclNargoutLookup(mxArray* fcn, size_t size, mlfFunctionTableEntry *pTable);
extern mxArray *mclNarginLookup(mxArray* fcn, size_t size, mlfFunctionTableEntry *pTable);

extern mlxFunctionPtr mlfFevalLookup(mxArray *fcn);

extern void mlfFeval ( int nlhs, mxArray **plhs, int nrhs, mxArray **prhs, char *name );
extern void mlfFevalTableSetup ( mlfFuncTab *mlfUfuncTable );


extern void mlxCellfun(int nlhs, mxArray * plhs[], int nrhs, mxArray * prhs[]);
extern mxArray *mlfCellfun(mxArray *fun, mxArray *c, mxArray *k);

extern void mlxEomday(int nlhs, mxArray * plhs[], int nrhs, mxArray * prhs[]);
extern mxArray * mlfEomday(mxArray * y, mxArray * m);

extern void mlxDatenum(int nlhs, mxArray * plhs[], int nrhs, mxArray * prhs[]);
extern mxArray * mlfDatenum(mxArray * y, 
                            mxArray * mo,
                            mxArray * d,
                            mxArray * h,
                            mxArray * mi,
                            mxArray * s);

extern mxArray * mlfDvcore(mxArray * t);
extern void mlxDvcore(int nlhs, mxArray * plhs[], int nrhs, mxArray * prhs[]);


extern mxArray * mlfSort(mxArray * * i, mxArray * x, mxArray * dim);
extern void mlxSort(int nlhs, mxArray * plhs[], int nrhs, mxArray * prhs[]);

extern mxArray * mlfExist(mxArray *in1, mxArray *in2);
extern void mlxExist(int nlhs, mxArray *plhs[], int nrhs, mxArray *prhs[]);

extern void mlxIsmembc(int nlhs, mxArray * plhs[], int nrhs, mxArray * prhs[]);

extern mxArray * mlfIsmembc(mxArray * x, mxArray * y);


        
#define mclCastToMxarray(x) (mxArray *)(x)

#ifdef MLF_USE_VARARGOUT
#define mlfFeval mlfVarargFeval
#endif

#ifdef __cplusplus
    }	/* extern "C" */
#endif

#endif /* matlab_h */
