While I'm busy converting macro functions to C functions, others (unnamed,
but Jed knows how to find them using the revision control system) are adding
new ones like there is no tomorrow.
For example below.
Yes CPP is unfairly useful and some of the uses below do pass types that cannot
trivially be handled with pure C code, please try to restrict your love of CPP
to only when absolutely necessary; for example the first one below doesn't need
to be a macro I think.
Barry
/*
Allocates enough space to store Fortran function pointers in PETSc object
that are needed by the Fortran interface.
*/
#define PetscObjectAllocateFortranPointers(obj,N) do { \
if (!((PetscObject)(obj))->fortran_func_pointers) { \
*ierr =
PetscMalloc((N)*sizeof(void(*)(void)),&((PetscObject)(obj))->fortran_func_pointers);if
(*ierr) return; \
*ierr =
PetscMemzero(((PetscObject)(obj))->fortran_func_pointers,(N)*sizeof(void(*)(void)));if
(*ierr) return; \
((PetscObject)obj)->num_fortran_func_pointers = (N); \
} \
} while (0)
/* Entire function body, _ctx is a "special" variable that can be passed along
*/
#define PetscObjectUseFortranCallback_Private(obj,cid,types,args,cbclass) { \
PetscErrorCode ierr; \
void (PETSC_STDCALL *func) types,*_ctx; \
PetscFunctionBegin; \
ierr =
PetscObjectGetFortranCallback((PetscObject)(obj),(cbclass),(cid),(PetscVoidFunction*)&func,&_ctx);CHKERRQ(ierr);
\
(*func)args;CHKERRQ(ierr); \
PetscFunctionReturn(0); \
}
#define PetscObjectUseFortranCallback(obj,cid,types,args)
PetscObjectUseFortranCallback_Private(obj,cid,types,args,PETSC_FORTRAN_CALLBACK_CLASS)
#define PetscObjectUseFortranCallbackSubType(obj,cid,types,args)
PetscObjectUseFortranCallback_Private(obj,cid,types,args,PETSC_FORTRAN_CALLBACK_SUBTYPE)