#ifndef _AFNI_AMALLOC_HEADER_
#define _AFNI_AMALLOC_HEADER_
/************************************************************************
Casting macros to fixup AFNI stuff for compiling with g++.
Original dealt with only malloc() casting stuff, but more
has been added since.
************************************************************************/
/*---------------------------------------------------------------------*/
/*! Replacement for malloc(). */
#define AFMALL(typ,siz) (typ*) calloc(1,siz)
/*---------------------------------------------------------------------*/
/*! Replacement for realloc(). */
#define AFREALL(v,typ,siz) (typ*) realloc((void*)v,sizeof(typ)*(siz))
/*---------------------------------------------------------------------*/
/*! Replacement for free(). */
#define AFFREE(v) free((void*)v)
/*---------------------------------------------------------------------*/
/*! Cast a function pointer to the right
prototype and call it, for 0D transformations. */
#define AFNI_CALL_0D_function(func,nar,far) \
do{ void (*fp)(int,float *) = (void (*)(int,float *))(func) ; \
if( fp != NULL ) \
fp( (nar) , (far) ) ; \
} while(0)
/*---------------------------------------------------------------------*/
/*! Cast a function pointer to the right
prototype and call it, for 1D transformations. */
#define AFNI_CALL_1D_function(func,nar,d1,d2,far) \
do{ void (*fp)(int,double,double,float *) = \
(void (*)(int,double,double,float *))(func) ; \
if( fp != NULL ) \
fp(nar,(double)d1,(double)d2,far) ; \
} while(0)
/*---------------------------------------------------------------------*/
/*! Cast a function pointer to the right
prototype and call it, for 1D transformations
that also return a pointer to a string. */
#define AFNI_CALL_1D_funcstr(func,nar,d1,d2,far,str) \
do{ void (*fp)(int,double,double,float *,char **) = \
(void (*)(int,double,double,float *,char**))(func) ; \
if( fp != NULL ) \
fp(nar,(double)d1,(double)d2,far,(char **)&(str)) ; \
} while(0)
/*---------------------------------------------------------------------*/
/*! Cast a function pointer to the right prototype
and call it, for 1D transformations of images. */
#define AFNI_CALL_1D_funcmrim(func,mage) \
do{ void (*fp)(MRI_IMAGE *) = (void (*)(MRI_IMAGE *))(func) ; \
if( fp != NULL ) \
fp(mage) ; \
} while(0)
/*---------------------------------------------------------------------*/
/*! Cast a function pointer to the right prototype
and call it, for 1D transformations of images
that also return a pointer to a string. */
#define AFNI_CALL_1D_funcmrimstr(func,mage,str) \
do{ void (*fp)(MRI_IMAGE *,char **) = \
(void (*)(MRI_IMAGE *,char **))(func) ; \
if( fp != NULL ) \
fp(mage,(char **)&(str)) ; \
} while(0)
/*---------------------------------------------------------------------*/
/*! Cast a function pointer to the right
prototype and call it, for 2D transformations. */
#define AFNI_CALL_2D_function(func,n1,n2,d1,d2,far) \
do{ void (*fp)(int,int,double,double,float *) = \
(void (*)(int,int,double,double,float *))(func) ; \
if( fp != NULL ) \
fp( (n1),(n2),(double)(d1),(double)(d2),far ) ; \
} while(0)
/*---------------------------------------------------------------------*/
/*! Cast a function pointer to the right
prototype and call it, for projections.
The output value is assigned to "val". */
#define AFNI_CALL_proj_function(func,n,far,val) \
do{ float (*fp)(int,float *) = (float (*)(int,float *))(func); \
if( fp != NULL ) (val) = fp(n,far) ; \
} while(0)
/*---------------------------------------------------------------------*/
/*! Cast a function pointer to the right
prototype and call it, for FIM functions. */
#define AFNI_CALL_fim_function(func,n,ts,ud,nb,vv) \
do{ void (*fp)(int,float *,void *,int,void *) = \
(void (*)(int,float *,void *,int,void *))(func) ; \
if( fp != NULL ) \
fp(n,ts,(void *)(ud),nb,(void *)(vv)) ; \
} while(0)
/************************************************************************
Macros to call functions with arguments of general types
specified in the macro call, with various numbers of arguments.
Functions returninothing (_VOID_) or return a value (_VALU_).
************************************************************************/
/*---------------------------------------------------------------------*/
#define AFNI_CALL_VOID_1ARG(func,typ1,arg1) \
do{ void (*fp)(typ1) = (void (*)(typ1))(func) ; \
if( fp != NULL ) \
fp((typ1)(arg1)) ; \
} while(0)
/*---------------------------------------------------------------------*/
#define AFNI_CALL_VALU_1ARG(func,vtyp,vval,typ1,arg1) \
do{ vtyp (*fp)(typ1) = (vtyp (*)(typ1))(func) ; \
if( fp != NULL ) \
(vval) = fp((typ1)(arg1)) ; \
} while(0)
/*---------------------------------------------------------------------*/
#define AFNI_CALL_VOID_2ARG(func,typ1,arg1,typ2,arg2) \
do{ void (*fp)(typ1,typ2) = (void (*)(typ1,typ2))(func) ; \
if( fp != NULL ) \
fp((typ1)(arg1),(typ2)(arg2)) ; \
} while(0)
/*---------------------------------------------------------------------*/
#define AFNI_CALL_VALU_2ARG(func,vtyp,vval,typ1,arg1,typ2,arg2) \
do{ vtyp (*fp)(typ1,typ2) = (vtyp (*)(typ1,typ2))(func) ; \
if( fp != NULL ) \
(vval) = fp((typ1)(arg1),(typ2)(arg2)) ; \
} while(0)
/*---------------------------------------------------------------------*/
#define AFNI_CALL_VOID_3ARG(func,typ1,arg1,typ2,arg2,typ3,arg3) \
do{ void (*fp)(typ1,typ2,typ3) = (void (*)(typ1,typ2,typ3))(func) ; \
if( fp != NULL ) \
fp((typ1)(arg1),(typ2)(arg2),(typ3)(arg3)) ; \
} while(0)
/*-------------------------------------------------------------------------*/
#define AFNI_CALL_VALU_3ARG(func,vtyp,vval,typ1,arg1,typ2,arg2,typ3,arg3) \
do{ vtyp (*fp)(typ1,typ2,typ3) = (vtyp (*)(typ1,typ2,typ3))(func) ; \
if( fp != NULL ) \
(vval) = fp((typ1)(arg1),(typ2)(arg2),(typ3)(arg3)) ; \
} while(0)
/*----------------------------------------------------------------------------*/
#define AFNI_CALL_VOID_4ARG(func,typ1,arg1,typ2,arg2,typ3,arg3,typ4,arg4) \
do{ void (*fp)(typ1,typ2,typ3,typ4) = (void (*)(typ1,typ2,typ3,typ4))(func); \
if( fp != NULL ) \
fp((typ1)(arg1),(typ2)(arg2),(typ3)(arg3),(typ4)(arg4)) ; \
} while(0)
/*----------------------------------------------------------------------------------*/
#define AFNI_CALL_VALU_4ARG(func,vtyp,vval,typ1,arg1,typ2,arg2,typ3,arg3,typ4,arg4) \
do{ vtyp (*fp)(typ1,typ2,typ3,typ4) = (vtyp (*)(typ1,typ2,typ3,typ4))(func) ; \
if( fp != NULL ) \
(vval) = fp((typ1)(arg1),(typ2)(arg2),(typ3)(arg3),(typ4)(arg4)) ; \
} while(0)
/*----------------------------------------------------------------------------------*/
#define AFNI_CALL_VOID_7ARG(func,typ1,arg1,typ2,arg2,typ3,arg3,typ4,arg4,typ5,arg5,typ6,arg6,typ7,arg7) \
do{ void (*fp)(typ1,typ2,typ3,typ4,typ5,typ6,typ7) = (void (*)(typ1,typ2,typ3,typ4,typ5,typ6,typ7))(func) ; \
if( fp != NULL ) \
fp((typ1)(arg1),(typ2)(arg2),(typ3)(arg3),(typ4)(arg4),(typ5)(arg5),(typ6)(arg6),(typ7)(arg7)) ; \
} while(0)
/******************************************************************************/
#endif /* _AFNI_AMALLOC_HEADER_ */
syntax highlighted by Code2HTML, v. 0.9.1