mexlib.h File Reference

This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Functions

vraiptrst stkptr (long int ptr_lstk)
intHeader (const mxArray *ptr)
mxArrayheader2ptr (int *header)
intlistentry (int *header, int i)
int theMLIST (int *header)
intRawHeader (const mxArray *ptr)
int Is1x1 (const mxArray *ptr)
mxArraymxCreateData (int m)
void mxAssert (int expr, char *error_message)
void * mxRealloc (void *ptr, size_t nsize)
void mexMakeMemoryPersistent (void *ptr)
int IsstOrce (mxArray *ptr)
void numberandsize (const mxArray *ptr, int *number, int *size)
bool mexIsGlobal (const mxArray *ptr)
mxArrayUnrefStruct (mxArray *ptr)
mxArraymxCreateLogicalMatrix (int m, int n)
mxArraymxCreateLogicalScalar (mxLOGICAL *value)
bool mxIsLogicalScalarTrue (mxArray *pa)
bool mxIsLogicalScalar (mxArray *pa)
const char * mexFunctionName (void)
int mexPutArray (mxArray *array_ptr, char *workspace)
int mexPutVariable (const char *workspace, char *var_name, mxArray *array_ptr)
const char * mxGetClassName (const mxArray *ptr)
mxArray *C2F() mxcreatedoublematrix (int *m, int *n, int *it)
int C2F() mxcopycomplex16toptr (double *y, mxArray *ptr, mxArray *pti, integer *n)
int C2F() mxcopyptrtocomplex16 (mxArray *ptr, mxArray *pti, double *y, integer *n)


Function Documentation

int* Header ( const mxArray ptr  ) 

TODO : comment

Parameters:
ptr 
Returns:

Definition at line 104 of file mexlib.c.

References stk, and stkptr().

00105 {
00106   /* Retuns an integer pointer to the header of a mxArray */
00107   int *header = (int *) stkptr((long int)ptr);
00108   if (header[0] < 0) header = (int *) stk(header[1]);
00109   return header;
00110 }

Here is the call graph for this function:

mxArray* header2ptr ( int header  ) 

TODO : comment

Parameters:
header 
Returns:

Definition at line 113 of file mexlib.c.

References C2F, lstk, and stkptr().

00114 {
00115   mxArray ptr;
00116   ptr=(mxArray) ((double *)header-(double *)stkptr(C2F(vstk).lstk[0])+C2F(vstk).lstk[0]) ;
00117   return (mxArray *) ptr;
00118 }

Here is the call graph for this function:

int Is1x1 ( const mxArray ptr  ) 

TODO : comment

Parameters:
ptr 
Returns:

Definition at line 401 of file mexlib.c.

References listentry(), and RawHeader().

00402 {
00403   int proddims,k;
00404   int *header = RawHeader(ptr);
00405   int *headerdims = listentry(header,2);
00406   proddims=1;
00407   for (k=0; k<headerdims[1]*headerdims[2]; k++) {
00408     proddims=proddims*headerdims[4+k];
00409   }
00410   return (int) proddims==1;
00411 }

Here is the call graph for this function:

int IsstOrce ( mxArray ptr  ) 

TODO : comment

Parameters:
ptr 
Returns:

Definition at line 1511 of file mexlib.c.

References Header(), l, listentry(), MLIST, and STRINGMATRIX.

01512 {
01513   int *header1; int l; int nfplus2;
01514   int *header = Header(ptr);
01515   if (header[0]==MLIST) {
01516     header1 = (int *) listentry(header,1);
01517     nfplus2 = header1[1]*header1[2];
01518     l = 5 + nfplus2;
01519     if (header1[0]==STRINGMATRIX)
01520         if (header1[l]==12 && header1[l+1]==14) return 1;  /*  "ce"  */
01521         if (header1[l]==28 && header1[l+1]==29) return 1;  /*  "st"  */
01522     else return 0;
01523       }
01524   else return 0;
01525 }

Here is the call graph for this function:

int* listentry ( int header,
int  i 
)

TODO : comment

Parameters:
header 
i 
Returns:

Definition at line 120 of file mexlib.c.

00121 {
00122   /*Usage int *header = header(array_ptr)   
00123    *      int *headersub = listentry(header, k)
00124    *   then headersub[0] ... is the header of the kth object in the
00125    *   list array_ptr  */
00126   int n, *ptr; 
00127   n = header[1]; 
00128   if (i <= n) {
00129     if ( n%2 == 0 ) n++;
00130     /* n = n if n odd, n=n+1 if n even (=> n is odd and ptr even !) */
00131     ptr = (int *) header + 3 + n + 2*( header[2 + (i - 1) ] -1);
00132   return ptr;
00133   } else {
00134     return NULL;
00135   }
00136 }

const char* mexFunctionName ( void   ) 

generic mex interface

Definition at line 2121 of file mexlib.c.

References the_current_mex_name.

02121 { return the_current_mex_name;}

bool mexIsGlobal ( const mxArray ptr  ) 

TODO : comment

Parameters:
ptr 
Returns:

Definition at line 1669 of file mexlib.c.

References arr2numcst(), Header(), Infstk, and RawHeader().

01670 {
01671   int pointed;
01672   int ret_val;
01673   int *header;int *rheader;
01674   header=(int *) Header(ptr);
01675   rheader=(int *) RawHeader(ptr);
01676   pointed = arr2numcst(ptr);
01677   /*  A FINIR si interface par reference OK  
01678       printf("POINTED %i Infstk(pointed) %i\n", pointed, *Infstk(pointed));
01679       printf("header[2] %i Infstk(pointed) %i\n", header[2], *Infstk(header[2])); */
01680   pointed=header[2];
01681   if (*Infstk(pointed) == 2) 
01682    ret_val = 1;
01683   else
01684    ret_val = 0;
01685   return ret_val;
01686 }

Here is the call graph for this function:

void mexMakeMemoryPersistent ( void *  ptr  ) 

TODO : comment

Parameters:
ptr 

Definition at line 1419 of file mexlib.c.

References calloc_table, and rec_size.

01419                                         {
01420   int i;
01421   for ( i = 0 ; i < rec_size ; i++) {
01422     if (calloc_table[i].adr == ptr)
01423       {
01424         if  (calloc_table[i].keep == 1 ) 
01425           {
01426             calloc_table[i].keep = 2;
01427           }
01428       }
01429   }
01430 }

int mexPutArray ( mxArray array_ptr,
char *  workspace 
)

TODO : comment

Parameters:
array_ptr 
workspace 
Returns:

Definition at line 2293 of file mexlib.c.

References mexPrintf().

02294 {
02295   /* TO BE DONE obsolete ?  */
02296   mexPrintf( "Function mexPutArray is obsolete, use mexPutVariable! \n");
02297   return 1;
02298 }

Here is the call graph for this function:

int mexPutVariable ( const char *  workspace,
char *  var_name,
mxArray array_ptr 
)

TODO : comment

Parameters:
workspace 
var_name 
array_ptr 
Returns:

Definition at line 2300 of file mexlib.c.

References arr2num(), and PutVar.

02301 {
02302   /*  workspace ignored: to be done .... */
02303   PutVar( arr2num( array_ptr) , var_name);
02304   return 0;  /* CHECK THIS !!!!!! */
02305 }

Here is the call graph for this function:

void mxAssert ( int  expr,
char *  error_message 
)

TODO : comment

Parameters:
expr 
error_message 

Definition at line 919 of file mexlib.c.

References mexErrMsgTxt().

00920 {
00921   if (!expr) mexErrMsgTxt(error_message);
00922 }

Here is the call graph for this function:

int C2F() mxcopycomplex16toptr ( double *  y,
mxArray ptr,
mxArray pti,
integer n 
)

TODO : comment

Parameters:
y 
ptr 
pti 
n 
Returns:

Definition at line 2845 of file mexlib.c.

References C2F, dcopy(), and value.

02846 {
02847   int one=1; int two=2;
02848   double *value = ((double *) *ptr);  
02849   double *headerm = ((double *) *pti);
02850   C2F(dcopy)(n,y,&two,value,&one);
02851   C2F(dcopy)(n,++y,&two,headerm,&one);
02852   return 0;
02853 }

Here is the call graph for this function:

int C2F() mxcopyptrtocomplex16 ( mxArray ptr,
mxArray pti,
double *  y,
integer n 
)

TODO : comment

Parameters:
ptr 
pti 
y 
n 
Returns:

Definition at line 2863 of file mexlib.c.

References C2F, dcopy(), and value.

02864 {
02865   int one=1; int two=2;
02866   double *value = ((double *) *ptr);
02867   double *headerm = ((double *) *pti);
02868   C2F(dcopy)(n,value,&one,y,&two);
02869   C2F(dcopy)(n,headerm,&one,++y,&two);
02870   return 0;
02871 }

Here is the call graph for this function:

mxArray* mxCreateData ( int  m  ) 

TODO : comment

Parameters:
m 
Returns:

Definition at line 414 of file mexlib.c.

References AsIs, C2F, createvar(), L, lr, mexErrMsgTxt(), Nbvars, and size.

00415                      : create a no-header, unpopulated  *
00416       * mxArray of size=m*sizeof(double)               */
00417 {
00418   static int lw, lr;
00419   int n; int size;
00420   lw = Nbvars + 1;
00421   size=m-2;
00422   if (! C2F(createvar)(&lw, "d", &size, (n=1,&n), &lr, 1L)) {
00423     mexErrMsgTxt("No more memory available: increase stacksize");
00424   }
00425   C2F(intersci).ntypes[lw-1]=AsIs;
00426   return (mxArray *) C2F(intersci).iwhere[lw-1];
00427 }

Here is the call graph for this function:

mxArray* C2F() mxcreatedoublematrix ( int m,
int n,
int it 
)

TODO : comment

Parameters:
m 
n 
it 
Returns:

Definition at line 2784 of file mexlib.c.

02785 {
02786   return (mxArray *) mxCreateDoubleMatrix(*m, *n, (mxComplexity)*it);
02787 } 

mxArray* mxCreateLogicalMatrix ( int  m,
int  n 
)

TODO : comment

Parameters:
m 
n 
Returns:

Definition at line 1910 of file mexlib.c.

References C2F, CreateData, GetData(), iwhere, LOGICAL, and Nbvars.

01911 {
01912   int new, k; int *header;
01913   Nbvars++;
01914   new=Nbvars;
01915   CreateData(new, (3+m*n)*sizeof(int));
01916   header =  (int *) GetData(new);
01917   header[0]=LOGICAL;
01918   header[1]= m; 
01919   header[2]= n; 
01920   for (k=0; k<m*n; k++) 
01921     header[3+k]= 0;
01922   return (mxArray *) C2F(intersci).iwhere[new-1]; 
01923 }

Here is the call graph for this function:

mxArray* mxCreateLogicalScalar ( mxLOGICAL *  value  ) 

TODO : comment

Parameters:
value 
Returns:

Definition at line 1925 of file mexlib.c.

References mxCreateLogicalMatrix(), and stkptr().

01926 {
01927   mxArray *pa; int *header;
01928   pa = mxCreateLogicalMatrix(1, 1);
01929   header = (int *) stkptr((long int) pa);
01930   header[3]=(int) value;
01931   return (mxArray *) pa;
01932 }

Here is the call graph for this function:

const char* mxGetClassName ( const mxArray ptr  ) 

TODO : comment

Parameters:
ptr 
Returns:

Definition at line 2403 of file mexlib.c.

References CELL, DOUBLEMATRIX, Header(), INTMATRIX, MLIST, NDARRAY, SPARSEMATRIX, STRINGMATRIX, STRUCT, and theMLIST().

02404 {
02405   int *header = Header(ptr);
02406   switch (header[0]) {
02407   case DOUBLEMATRIX: 
02408     return "double";
02409   case STRINGMATRIX:
02410     return "char";
02411   case SPARSEMATRIX:
02412     return "sparse";
02413   case INTMATRIX:
02414     /*[8,m,n,it] it=01    02   04    11     12    14
02415                    int8 int16 int32 uint8 uint16 uint32    */
02416     switch (header[3]){
02417     case 1:
02418       return "int8";
02419     case 2:
02420       return "int16";
02421     case 4:
02422       return "int32";
02423     case 11:
02424       return "uint8";
02425     case 12:
02426       return "uint16";
02427     case 14:
02428       return "uint32";
02429     default:
02430       return "unknown";
02431     }
02432   case MLIST:
02433     /* to be done return mxCELL_CLASS or mxCHAR_CLASS or mxSTRUCT_CLASS */
02434     /* header[6+2*(header[4]-1)]   ( = 1, 10, 8)  */
02435     switch (theMLIST(header)) {
02436     case CELL:
02437       return "cell";
02438     case STRUCT:
02439       return "struct";
02440     case NDARRAY:
02441     switch (header[6+2*(header[4]-1)]) {
02442       /* listentry(header,3) */
02443     case DOUBLEMATRIX:
02444       return "double";
02445     case STRINGMATRIX:
02446       return "char";
02447     case INTMATRIX:
02448       switch (header[6+2*(header[4]-1)+3]) {
02449       case 1:
02450         return "int8";
02451       case 2:
02452         return "int16";
02453       case 4:
02454         return "int32";
02455       case 11:
02456         return "uint8";
02457       case 12:
02458         return "uint16";
02459       case 14:
02460         return "uint32";
02461       default:
02462         return "unknown";
02463       }
02464     }
02465     default:
02466       return "unknown";
02467     }
02468   }
02469   return "unknown";
02470 }

Here is the call graph for this function:

bool mxIsLogicalScalar ( mxArray pa  ) 

TODO : comment

Parameters:
pa 
Returns:

Definition at line 1942 of file mexlib.c.

References mxGetNumberOfElements(), and mxIsLogical().

01943 {
01944   bool retval;
01945   retval = mxIsLogical(pa) && mxGetNumberOfElements(pa) == 1;
01946   return retval;
01947 }

Here is the call graph for this function:

bool mxIsLogicalScalarTrue ( mxArray pa  ) 

TODO : comment

Parameters:
pa 
Returns:

Definition at line 1934 of file mexlib.c.

References mxGetLogicals(), mxGetNumberOfElements(), and mxIsLogical().

01935 {
01936   bool retval;
01937   retval = mxIsLogical(pa) && mxGetNumberOfElements(pa) == 1 && *mxGetLogicals(pa) == 1;
01938   return retval;
01939 }

Here is the call graph for this function:

void* mxRealloc ( void *  ptr,
size_t  nsize 
)

TODO : comment

Parameters:
ptr 
nsize 

Definition at line 1321 of file mexlib.c.

References C2F, createstkptr(), m, memcpy(), mxFree(), and NULL.

01322 {
01323   int m;  vraiptrst lrd=(vraiptrst)NULL; 
01324   m = (nsize) /sizeof(double) + 1;
01325   mxFree((void *) lrd);
01326   if (! C2F(createstkptr)( &m, &lrd)) return 0;
01327   memcpy((void *) lrd, ptr, nsize);
01328   return (void *) lrd;
01329 }

Here is the call graph for this function:

void numberandsize ( const mxArray ptr,
int number,
int size 
)

TODO : comment

Parameters:
ptr 
number 
size 

Definition at line 1594 of file mexlib.c.

References bot, C2F, lstk, Lstk, Nbvars, Rhs, and Top.

01595                     : its number as scilab variable 
01596       * and its size in Scilab double stack */
01597 {
01598   int kk,lst_k;
01599   lst_k=(int) ptr;
01600   if (lst_k < *Lstk(C2F(vstk).bot)) {
01601     *number=0;*size=0;
01602   for (kk = 1; kk <= Nbvars; kk++)
01603     {
01604       *number=kk;
01605       if (lst_k == C2F(vstk).lstk[kk+ Top - Rhs -1]) break;
01606     }
01607   *size = C2F(vstk).lstk[*number+ Top - Rhs] - lst_k;
01608   } else
01609     {
01610     *number=0;
01611   for (kk = C2F(vstk).bot; kk <  C2F(vstk).isiz; kk++)
01612     {
01613       *number=kk;
01614       if (lst_k == C2F(vstk).lstk[kk-1]) break;
01615     }
01616   *size = C2F(vstk).lstk[*number] - lst_k;
01617     }
01618 }

int* RawHeader ( const mxArray ptr  ) 

TODO : comment

Parameters:
ptr 
Returns:

Definition at line 392 of file mexlib.c.

References stkptr().

00393 {
00394   /* Utility function : return an integer pointer to   *
00395    * a Scilab variable. The variable can be            *
00396    * a reference (header[0] < 0)                       */
00397   int *header = (int *) stkptr((long int)ptr);
00398   return header;
00399 }

Here is the call graph for this function:

vraiptrst stkptr ( long int  ptr_lstk  ) 

TODO : comment

Parameters:
ptr_lstk 
Returns:

Referenced by Header(), header2ptr(), initmex(), mxCreateLogicalScalar(), mxgetm(), mxgetn(), mxgetpi(), mxgetpr(), mxgetscalar(), mxgetstring(), mxiscomplex(), mxisfull(), mxisnumeric(), mxissparse(), mxisstring(), mxSetM(), mxSetN(), mxSetNzmax(), and RawHeader().

Here is the caller graph for this function:

int theMLIST ( int header  ) 

TODO : comment

Parameters:
header 
Returns:

Definition at line 138 of file mexlib.c.

References l, listentry(), MLIST, and STRINGMATRIX.

00139 {
00140   /* Returns the type of the mlist  (CELL, STRUCT or HYPERMATRIX)  */
00141   int *header1; int nfplus2, l;
00142   if (header[0]==MLIST && header[1]==3 && header[6]==STRINGMATRIX) {
00143     if (header[14]==12 && header[15]==14) return 2;  /* CELL "c"=12 "e"=14  */
00144     if (header[14]==17 && header[15]==22) return 1;  /* NDARRAY "h"=17 "m"=22   */
00145   }
00146   if (header[0]==MLIST) {
00147     header1 = (int *) listentry(header,1);
00148     nfplus2 = header1[1]*header1[2];
00149     l = 5 + nfplus2;
00150   /*  "s"=28,  "t"=29   */
00151     if (header1[0]==STRINGMATRIX && header1[l]==28 && header1[l+1]==29) return 3;  /* STRUCT */
00152   }
00153   return 0;
00154 }

Here is the call graph for this function:

mxArray* UnrefStruct ( mxArray ptr  ) 

Unreference objects in a struct or cell

Parameters:
ptr 
Returns:

Definition at line 1712 of file mexlib.c.

References Bot, Error, Header(), listentry(), Lstk, mxDuplicateArray(), nb, numberandsize(), offset, Rhs, stk, and Top.

01713 {
01714   /*   Unreference objects in a struct or cell */
01715   int number, k;
01716   int list, lindex, offset; int sizeobj;
01717   int nb, nbobj, suite, newbot;
01718 
01719   int oldsize, newsize;
01720 
01721   int *header, *headernew;
01722   int *headerlist, *headerlistnew; 
01723   int *headerobj, *headerobjnew;
01724   int *headerdims; int proddims;int obj;
01725 
01726   mxArray *mxNew;
01727   header = Header(ptr);   /* RawHeader ?  */
01728   mxNew = mxDuplicateArray(ptr);
01729   headernew = Header(mxNew);   /* RawHeader ?  */
01730   
01731   offset = Top - Rhs;
01732   newsize=header[4];   /* Initialize */
01733   nb=header[1]-2;      /* Number of fields  */
01734   headerdims = listentry(header,2);
01735   proddims=1;
01736   for (k=0; k<headerdims[1]*headerdims[2]; k++) {
01737     proddims=proddims*headerdims[4+k];
01738   }
01739   if (!(proddims==1)) {
01740     suite=0;
01741     for (list=0; list<nb; list++) {
01742       headerlist= listentry(header, list+3);  /* pointing to the field list */
01743       nbobj=headerlist[1];   /* number of objects in the field */
01744       for (lindex=0; lindex < nbobj; lindex++)
01745         {
01746           headerobj = listentry( headerlist,lindex+1);  
01747           /* pointing to the object in the field */
01748           if (headerobj[0] < 0)
01749             sizeobj=headerobj[3];
01750           else
01751             sizeobj=headerlist[lindex+3]-headerlist[lindex+2];
01752           newsize += sizeobj;   /* update size of the field */
01753         }
01754       suite++;
01755       newsize += (2+nbobj/2);   /* size of list = size of inside + ... */
01756       headernew[4+suite] = newsize;
01757     }
01758     numberandsize( mxNew, &number, &oldsize);
01759     newsize += 3;   /* taking account begining of list */
01760     newbot=*Lstk(number+offset)+newsize+1;
01761     if( (newbot - *Lstk(Bot)) > 0) 
01762       {Error(17); return 0;}
01763     *Lstk(number+offset+1)=newbot;
01764     for (list=0; list<nb; list++) {
01765       headerlist= listentry(header, list+3);
01766       headerlistnew=listentry(headernew, list+3);
01767       nbobj=headerlist[1]; 
01768       headerlistnew[0]= 15;
01769       headerlistnew[1]= nbobj;
01770       headerlistnew[2]= 1;
01771       for (lindex=0; lindex < nbobj; lindex++)
01772         {       headerobj = listentry( headerlist,lindex+1);
01773         if (headerobj[0] < 0)
01774           sizeobj=headerobj[3];  /* reference (size of ) */
01775         else
01776           sizeobj=headerlist[lindex+3]-headerlist[lindex+2];
01777         headerlistnew[3+lindex]=headerlistnew[2+lindex]+sizeobj;
01778         }
01779     }
01780     for (list=0; list<nb; list++) {
01781       headerlist= listentry(header, list+3);
01782       headerlistnew=listentry(headernew, list+3);
01783       nbobj=headerlist[1]; 
01784       for (lindex=0; lindex < nbobj; lindex++)
01785         {       
01786           headerobj = listentry( headerlist,lindex+1);
01787           headerobjnew = listentry( headerlistnew,lindex+1);    
01788           if (headerobj[0] < 0)   /* reference */
01789             {
01790               sizeobj=headerobj[3];
01791               headerobj = (int *) stk(headerobj[1]);   /* dereference */
01792             }
01793           else
01794             {
01795               sizeobj=headerlist[lindex+3]-headerlist[lindex+2];
01796             }
01797           for (k=0; k<2*sizeobj; k++)
01798             headerobjnew[k]=headerobj[k];  /* OUF! */
01799         }
01800     }
01801   }
01802   else {
01803     /*   1 x 1 x ... x 1 struct */
01804     suite=0;
01805     for (obj=0; obj<nb; obj++) {
01806       headerobj = listentry(header,3+obj);
01807       if (headerobj[0] < 0)
01808         sizeobj=headerobj[3];
01809       else
01810         sizeobj = header[5+obj] - header[4+obj];
01811       newsize += sizeobj;
01812     suite++;
01813     newsize += sizeobj;
01814     headernew[4+suite]=newsize;
01815     }
01816     numberandsize( mxNew, &number, &oldsize);
01817     newsize +=3;
01818     newbot = *Lstk(number+offset)+newsize+1;
01819     if ( (newbot - *Lstk(Bot)) > 0)
01820       {Error(17); return 0;}
01821     *Lstk(number+offset+1)=newbot;
01822     for (obj=0; obj<nb; obj++)
01823       {
01824         headerobj = listentry(header, 3+obj);
01825         headerobjnew = listentry(headernew, 3+obj);
01826         if (headerobj[0] < 0)
01827           {
01828             sizeobj=headerobj[3];
01829             headerobj = (int *) stk(headerobj[1]);
01830           }
01831         else
01832           {
01833             sizeobj=header[5+obj]-header[4+obj];
01834           }
01835         for (k=0; k<2*sizeobj; k++)
01836           headerobjnew[k]=headerobj[k];
01837       }
01838   }
01839   return mxNew;
01840 }

Here is the call graph for this function:


Generated on Sun Mar 4 16:10:35 2007 for Scilab [trunk] by  doxygen 1.5.1