Actual source code: zinheritf.c
1: #include "petscsys.h"
2: #include "petscfix.h"
3: #include "petsc/private/ftnimpl.h"
4: #include <petscsys.h>
5: #include <petscoptions.h>
6: #if defined(PETSC_HAVE_FORTRAN_CAPS)
7: #define petscobjectaddoptionshandler_ PETSCOBJECTADDOPTIONSHANDLER
8: #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE)
9: #define petscobjectaddoptionshandler_ petscobjectaddoptionshandler
10: #endif
12: static struct {
13: PetscFortranCallbackId handler;
14: PetscFortranCallbackId destroy;
15: #if defined(PETSC_HAVE_F90_2PTR_ARG)
16: PetscFortranCallbackId handler_pgiptr;
17: PetscFortranCallbackId destroy_pgiptr;
18: #endif
19: } _cb;
21: static PetscErrorCode ourhandler(PetscObject obj, PetscOptionItems items, PetscCtx ctx)
22: {
23: #if defined(PETSC_HAVE_F90_2PTR_ARG)
24: void *ptr;
25: PetscCall(PetscObjectGetFortranCallback((PetscObject)obj, PETSC_FORTRAN_CALLBACK_CLASS, _cb.handler_pgiptr, NULL, &ptr));
26: #endif
27: PetscObjectUseFortranCallback(obj, _cb.handler, (PetscObject *, PetscOptionItems *, PetscCtx, PetscErrorCode *PETSC_F90_2PTR_PROTO_NOVAR), (&obj, &items, _ctx, &ierr PETSC_F90_2PTR_PARAM(ptr)));
28: }
30: static PetscErrorCode ourdestroy(PetscObject obj, PetscCtx ctx)
31: {
32: #if defined(PETSC_HAVE_F90_2PTR_ARG)
33: void *ptr;
34: PetscCall(PetscObjectGetFortranCallback((PetscObject)obj, PETSC_FORTRAN_CALLBACK_CLASS, _cb.destroy_pgiptr, NULL, &ptr));
35: #endif
36: PetscObjectUseFortranCallback(obj, _cb.destroy, (PetscObject *, PetscCtx, PetscErrorCode *PETSC_F90_2PTR_PROTO_NOVAR), (&obj, _ctx, &ierr PETSC_F90_2PTR_PARAM(ptr)));
37: }
39: PETSC_EXTERN void petscobjectaddoptionshandler_(PetscObject *obj, void (*handle)(PetscObject *, PetscOptionItems *, PetscCtx, PetscErrorCode), void (*destroy)(PetscObject *, PetscCtx, PetscErrorCode *), PetscCtx ctx, PetscErrorCode *ierr PETSC_F90_2PTR_PROTO(ptr1) PETSC_F90_2PTR_PROTO(ptr2))
40: {
41: *ierr = PetscObjectSetFortranCallback((PetscObject)*obj, PETSC_FORTRAN_CALLBACK_CLASS, &_cb.handler, (PetscFortranCallbackFn *)handle, ctx);
42: if (*ierr) return;
43: #if defined(PETSC_HAVE_F90_2PTR_ARG)
44: *ierr = PetscObjectSetFortranCallback((PetscObject)*obj, PETSC_FORTRAN_CALLBACK_CLASS, &_cb.handler_pgiptr, NULL, ptr1);
45: if (*ierr) return;
46: #endif
47: *ierr = PetscObjectSetFortranCallback((PetscObject)*obj, PETSC_FORTRAN_CALLBACK_CLASS, &_cb.destroy, (PetscFortranCallbackFn *)destroy, ctx);
48: if (*ierr) return;
49: #if defined(PETSC_HAVE_F90_2PTR_ARG)
50: *ierr = PetscObjectSetFortranCallback((PetscObject)*obj, PETSC_FORTRAN_CALLBACK_CLASS, &_cb.destroy_pgiptr, NULL, ptr2);
51: if (*ierr) return;
52: #endif
53: *ierr = PetscObjectAddOptionsHandler(*obj, ourhandler, ourdestroy, NULL);
54: }